martedì 4 dicembre 2007

Capaso Tiny OSD - Titolatrice video PAL


Questo articolo affronta il tema dello sviluppo di un progetto per la sovra impressione di informazioni su di un normale schermo televisivo a colori. Tali dispositivi sono noti con il nome di OSD (On Screen Display) o più semplicemente, lasciando perdere gli acronimi, Titolatrici Video. Come al solito il mercato offre infinite soluzioni a questo tipo di esigenze, a costi anche estremamente ridotti, ma lo scopo di queste righe non è fornire le informazioni per realizzare dispositivi paragonabili a quelli già confezionati che si trovano sugli scaffali dei negozi, bensì rappresentare un'occasione per conoscere o approfondire tutti quei temi legati alla generazione e alla gestione dei segnali video tramite micro controllore. Chi avrà voglia di arrivare alla fine di questa disamina si ritroverà (spero...) con l'aver appreso qualche nozione in più, e in possesso di tutte le informazioni per costruire un simpatico oggetto che potrà rivelarsi utile in più di una occasione.

Caratteristiche principali


- Matrice di 10 caratteri/riga per 5 righe [10x5]
- Dimensione caratteri modificabile
- Intensità dei caratteri regolabile
- Posizionamento del testo regolabile
- Possibilità di memorizzare fino a 10 messaggio predefiniti
- Attivazione/disattivazione modalità slide
- Possibilità di impostare l'intervallo di slide
- Gestibile da remoto tramite RS232
- Gestibile in modalità stand-alone con 2 pulsanti
- Tabella caratteri ASCII completa (maiuscoli e minuscoli, ecc.)
- Semplicità costruttiva
- Basso costo

Principio di funzionamento


Lo scopo di questo progetto è, come detto, di sovra imprimere delle scritte (possibilmente leggibili...) su di una immagine proveniente da una sorgente video come un lettore DVD, un video registratore o una telecamera. L'elettronica che realizza ciò dovrà quindi sincronizzarsi con tale sorgente e disegnare i caratteri (o i simboli) che costituiscono le frasi da far visualizzare, senza comportare degrado o alterazioni al segnale video posto in ingresso. A tale proposito lo schema prevede l'impiego di un componente integrato come LM1881 in grado di fornire alle sue uscite tutte le informazioni relative ai segnali di sincronismo della sorgente posta al suo ingresso. Per rendere più chiaro il ruolo di questo componente è forse utile fare riferimento alla figura seguente, che rappresenta l'andamento temporale di una riga video disegnata sullo schermo.

Nello standard PAL (Phase Alternating Lines) infatti una immagine (Frame - Quadro) viene rappresentata scandendo 625 linee dello schermo aventi andamenti simili a quello della figura precedente e i quadri si susseguono con una frequenza di 25 ogni secondo (in realtà nello standard PAL assume maggior significato il concetto di "semi-quadro", ma per il momento la cosa non interessa...).Ogni riga ha una durata di 64us e quindi ogni 40ms si ha l'inizio di un nuovo quadro (625x64us). Saranno quindi necessari due diversi tipi di segnali per sincronizzare il movimento del pennello elettronico del TV (cioè del fascio di elettroni accelerati che vanno fisicamente a disegnare sullo schermo) con le informazioni dell'immagine che si vuole rappresentare: uno che trasporta l'informazione di quando incomincia una riga e uno che informa quando inizia un nuovo quadro (cioè una nuova immagine).A questi due segnali sono legate altrettante operazioni che l'elettronica del TV deve compiere, che sono rispettivamente: far tornare il pennello elettronico all'inizio di ogni riga (lato sinistro dello schermo) e di posizionare il medesimo nell'angolo in alto a sinistra del TV per l'inizio della scansione di una nuova immagine.


Come accennato in precedenza, questi segnali di sincronizzazione vengono estratti e separati dal LM1881 che li rende disponibili, con livelli compatibili TTL, alla logica di controllo, che nel caso in oggetto è un micro AVR 8515. Questo uC risulta provvisto di un numero di linee di I/O molto più elevato di quelle che in realtà necessitano allo scopo, ma è stato scelto per le sue dotazioni di memoria (soprattutto SRAM) che, come si avrà modo di vedere, costituiscono la risorsa più critica dell'intero progetto.Questo dispositivo, opportunamente programmato, dovrà quindi prelevare le informazioni sul sincronismo del segnale in ingresso e generare la riga video da sommare a quest' ultimo a partire dalle informazioni sulle scritte da far comparire e sulle modalità di visualizzazione.Questo è, in estrema sintesi, il compito affidato al uC e sembra tutto sommato abbastanza semplice: le complicazioni però ci sono (come sempre...) e sono di natura computazionale, legate all'organizzazione e all'implementazione del firmware e alle tempistiche di esecuzione. Maggiori dettagli a riguardo saranno forniti nelle sezioni relative alla descrizione dello schema elettrico e dell'analisi del firmware.
Tutte le attività di impostazione sono, infine, gestite da un host collegato tramite UART, attraverso il quale vengono ricevuti tutti i comandi che il circuito è in grado di eseguire (come ad es. l'impostazione del tempo di slide, la dimensione dei caratteri, i testi precodificati, ecc), e stand-alone, mediante due pulsanti ai quali vengono associate particolari funzioni.

Architettura e Schema elettrico

Lo schema elettrico è riportato nella figura che segue e come si può vedere risulta molto semplice.

Nello schema sono rappresentate tutte le parti per ottenere un circuito funzionante e autonomo compresa la sezione di alimentazione e i transistor per interfacciare l'UART del uC direttamente alla seriale del PC (in luogo del più costoso MAX232).Nel circuito sono inoltre presenti il connettore SIL per la programmazione del uC e il transistor per l' aggiunta al segnale sorgente le informazioni dei caratteri da visualizzare a video (T3). Da notare inoltre i due trimmer RV1 e RV2 connessi rispettivamente alla base al collettore di T3 (è un PNP) che svolgono dei compiti di regolazione del segnale in uscita. In particolare RV1, agendo sullo stato della polarizzazione della base di T3, consente di regolare la definizione dei caratteri visualizzati, mentre RV2 permette di modificarne l'intensità.
Dal punto di vista elettrico la funzione di T3 è quella di effettuare un "pull-up" della tensione del segnale video in ingresso al fine di spostarne l'intensità verso il livello del bianco in modo da rendere ben visibili le linee che costituiscono i caratteri.Questa sezione, in ultima analisi, deve tradurre in un puntino luminoso i dati prodotti dal uC (bit) disponibili su un suo particolare pin di uscita, i quali andranno poi a costituire il corpo dei vari simboli grafici. Ed è proprio la generazione di una riga di "pixel" che costituisce il punto maggiormente critico del sistema, in quanto l'emissione dei puntini luminosi deve concludersi entro l'inizio della riga successiva e quindi, in virtù di quanto detto nei paragrafi precedenti, si deve concludere tutto entro 64us.Per generare i pattern di bit dei caratteri si è utilizzato un pin particolare, e precisamente l'uscita della periferica seriale SPI presente nel uC, denominato MOSI (Master Output Slave Input) la quale permette di inviare byte su una linea seriale in maniera sincrona ad elevata velocità. Infatti la velocità massima raggiungibile da questa periferica (che ricordo è un blocco hardware integrato nel chip) è pari ad un quarto della frequenza di clock del uC, che in questo caso risulta essere di ben 2.5Mbits (10MHz/4). Inoltre, essendo la trasmissione di tipo sincrono (ovvero è presente anche un pin di clock), non è necessario inviare i bit di start e di stop che altererebbero la riproduzione delle linee dei caratteri. Quindi per vedere inviati 8 bit ad altissima velocità senza preoccuparsi di nulla è sufficiente settare la periferica SPI e scrivere nel suo data register il byte che si vuole trasmettere. Le righe che costituiscono i caratteri saranno dunque degli sequenze di byte che, inviate tramite SPI al transistor T3, andranno a disegnare i pixel degli elementi grafici sullo schermo.
Numericamente: disponendo di un bitrate di 2.5Mbps è possibile disegnare fino a 10 caratteri larghi 8bit, in quanto: (8/2.5Mbps)x10 = 32us che stanno agevolmente all'interno dei 52us di riga visibile (infatti 64us è la durata totale di una riga video, ma in realtà il televisore fa vedere solo i 52us dove effettivamente è contenuta l'informazione dell'intensità luminosa), considerando in aggiunta anche qualche us per lasciare una spaziatura tra carattere e carattere al fine di migliorarne la leggibilità.Sempre per soddisfare il requisito di velocità tutte le informazione delle mappe di bit costituenti i caratteri da visualizzare dovranno essere disponibili in una porzione di memoria SRAM che verrà esplorata in maniera ciclica e sincronizzata con il segnale video di ingresso. Questa porzione di memoria viene detta Frame Buffer e rappresenta il vero limite alle prestazioni di questo progetto.

Numericamente: supponendo di rappresentare i caratteri con una matrice di 8x7 bit (7 righe da 8 bit) per disegnare una riga di 10 caratteri sono necessari 70 byte (10x7) e per visualizzare 5 righe servono dunque 350 byte.Questi valori di memoria sembrano ridicoli se paragonati ad un PC o ad altri sistemi per il calcolo, ma per un uC come AT90s8515, che dispone di 512 byte di SRAM, è un impiego di risorse notevole. La rimanente porzione di SRAM serve per le variabili impiegate dalla parte runtime del programma, ovvero il codice deputato a "riempire" il frame buffer con i dati provenienti dalle stringhe che si vogliono visualizzare e per la gestione delle altre varie funzioni previste. Per poter far ciò è necessario prevedere una tabella in flash ROM dove memorizzare le bitmap di ogni carattere.Quella implementata in questa versione permette di visualizzare i primi 126 caratteri della tabella ASCII standard, impiegando quindi 896 byte (7x126).In definitiva, una volta pervenuta la stringa di caratteri contenente la riga da visualizzare, una funzione provvederà ad estrarre ogni singolo carattere, leggere dalla tabella dei caratteri il relativo pattern di bit e collocare tali informazioni nel frame buffer alla posizione corrispondente; successivamente verrà fatta ripartire la scansione del frame buffer e la riga di caratteri sarà visibile a video.Tutte le informazioni che devono pervenire dall'esterno sono veicolate tramite l'UART hardware presente nel uC e impacchettate in accordo ad un semplice protocollo comandi descritto nel relativo paragrafo.


Per il firmware e il PCB per realizzare il progetto completo vedi:
http://www.webalice.it/capaso/PROGETTI/TINY_OSD/Tiny_OSD.htm

1 commento:

Anonimo ha detto...

come al solito ti credo sulla parola....