Categoria: Hardware
Presentata nel 1988 come tesina tecnico-pratica all’esame di maturità viene qui riportate la relazione originale completa di schemi, alcune foto del prototipo (non quelle indicate nel testo) e dei brevi filmati (DiVX) che esplicano a colpo d’occhio le possibilità del sistema.
Nomenclatura: il segnale sottolineato si intende negato.
Introduzione
Il circuito che vengo a presentarvi è un sistema di acquisizione dati atto a riportare nella memoria del computer, e quindi volendo anche sul suo monitor, un fotogramma ricavato da un segnale video seriale tipo PAL composito, cioè quello attualmente usato in Italia per le trasmissioni televisive.
Interessandomi per hobby alle produzioni televisive amatoriali cercai di realizzare con il computer degli effetti video e delle titolazioni in sovraimpressione alle immagini, ma per realizzarle avevo bisogno di una periferica che permettesse un ottimo input grafico, come un digitalizzatore video, apparecchiatura normalmente limitata, per prezzi e prestazioni, al campo professionale.
Sul mercato è presente anche un modello a costo contenuto da affiancare al Commodore 64, ma con prestazioni inutilizzabili per i fini che mi ero preposto. Ho dunque affrontato lo studio di fattibilità di un circuito che potesse digitalizzare in tempo reale le immagini televisive, capace cioè di lavorare anche con un singolo fotogramma (1/50 di secondo per un campionamento completo).
L'esito è stato: "SI PUO' FARE".
Studio dei Flussi dei Dati
Vista l'altissima velocità di trasferimento dei dati (più di 3 Mbaud) l'unico metodo di interfacciamento che potrebbe ancora esser valido è il DMA (Direct Memory Access), che consiste nello scavalcare il microprocessore per accedere direttamente alle memorie che si vogliono riempire senza perdere tempo prezioso.
E' necessario dunque accedere al bus del computer e rispettarne le temporìzzazioni. Osservando lo schema elettrico sono riuscito a ricostruire le frequenze interne della macchina: tramite un PLL viene costruita una frequenza a circa 7,88 MHz detta DOT CLOCK che guida la cadenza con cui vengono presentati sull'uscita "monitor" i pixel dello schermo video.
Questo DOT CLOCK viene diviso per 8 dal VIC (Video Interface Chip) ottenendo la fase due (fi2), cioè il segnale di clock del microprocessore, un 6510 (una revisione del 6502).
A grandi linee il uP Può appropiarsi del bus solo quando fi2 è alto, visto che nel tempo rimanente il bus serve al VIC che si cura del refresh delle memorie dinamiche. Ogni 8 linee attive del video il VIC si appropria anche a fi2 alta del bus per leggere nella RAM carattere i dati per costruire la successiva riga di testo (un carattere ha formato 8 x 8 Pixel ).
Per appropriarsi del bus il VIC, se fi2 è bassa, si limita a portare in alta impedenza le uscite del processore tramite un segnale di AEC (controllo di abilitazione del bus del yP) sfruttando il fatto che durante questo tempo la CPU svolge solo lavori interni, ma quando il VIC vuole il BUS e fi2 è alta deve fornire anche un segnale di BA (Bus disponibile) che si mantiene basso per tutto il tempo richiesto dal caricamento di 40 BYTE (una linea testo), segnale che ha l'effetto di porre il yP in stato di attesa.
Sul connettore "cartuccia espansione", oltre ai BUS ed alla linea di R/W, ho presenti i segnali di DOT CLOCK, fi2, RST, BA e DMA (richiesta di accesso diretto in memoria), cioè il minimo indispensabile per poter gestire dall'esterno un DMA. Per quanto riguarda la grafica in alta risoluzione la schermata è contenuta in un segmento di memoria di 8 KByte in cui ogni parola contiene 4 pixel, dedicando ad ogni punto due bit, con una possibilità quindi di 4 colori con una risoluzione di 160x200 punti.
Ho scelto dunque di digitalizzare con 160 pixel con 4 colori la linea televisiva sincronizzandomi direttamente con il DOT CLOCK del VIC, il che mi assicura un perfetto rispetto della relazione altezza/larghezza del quadro ed un lavoro in tempo reale, in quanto la mia massima velocità di immissione dati è la stessa del VIC che opera il processo inverso.
Progetto
La periferica è così composta:
- 1) Alimentatore
- 2) Interfaccia temporizzazioni
- 3) Sezione analogica
- 4) Codifica del dato
- 5) Generatore di ritardo per linea e quadro
- 6) Generatore di indirizzi
- 7) Sincronizzatore di BUS
1) Alimentatore
Questo blocco non ha creato particolari problemi in quanto deve soltanto fornire una tensione duale a +/-12V con circa 100 mA di assorbimento ed una tensione stabilizzata a 5V con una corrente di circa 700 mA.
2) Interfaccia temporizzazioni
Questa parte del circuito esplica tre funzioni:
- A) Bufferizza i segnali fi2, DOT CLOCK e BA provenienti dal computer.
- B) Genera i segnali di "BUS libero" e di Write solo se è attivo il DMA e alto sia BA che fi2. La presenza di questi segnali indica che: la periferica chiede di scrivere in RAM gelando il yP, il VIC non richiede in via eccezionale il bus, e quest'ultimo non è impegnato in una operazione di refresh. Se tutte queste condizioni non sono verificate viene fermata la scrittura in memoria da parte della periferica che si porta in alta impedenza con relativa perdita di dati in caso di DMA attivo e BA basso (digitalizzazione in corso ma bus non disponibile).
- C) Invia al computer la richiesta di DMA quando fi2 è alta, richiesta che è attivata dal segnale di accensione della scheda (ON/OFF). Data la soluzione circuitale la linea DMA può variare solo sui fronti di discesa di fi2, cioè quando già il yP si appresta a lasciare liberi i bus che sono richiesti dal VIC in accordo con le sue temporizzazioni, ciò è necessario per non interrompere la CPU quando quest'ultima utilizza i bus.
3) Sezione Analogica
Il primo blocco che ho progettato è stato quello analogico che ha il compito di estrarre dal segnale video i sincronismi e di digitalizzare a due bit il segnale stesso. La tensione in ingresso viene filtrata per eliminare le componenti del segnale di crominanza (intorno ai 4,4 MHz) e viene quindi amplificato per portare il livello da 1 Vpp (tensione standard per i sistemi video), a circa 4Vpp, cioè una tensione sufficiente per eseguire una clamperizzazione riportando così l'intera scala dei grigi, (sincronismi compresi) ad un riferimento costante indispensabile per la digitalizzazione e l'estrazione dei sincronismi.
La conversione avviene comparando il segnale così ottenuto a tre soglie impostate da altrettanti potenziometri, mentre la separazione del sincronismo di riga avviene sul passaggi dell’onda a circa 0,7 V.
Il sincronismo di quadro viene estratto da quello di riga nel seguente modo: essendo espresso come un incremento della larghezza dell'impulso di linea, è sufficiente campionare lo stesso segnale dopo un tempo (tipicamente 20 yS) maggiore della larghezza del normale impulso di riga (4,7 yS), ma inferiore alla larghezza presente durante il sincronismo di quadro (circa 27 yS).
Se il sincronismo viene campionato attivo allora viene riconosciuta la presenza di un impulso di quadro.
4) Codifica del dato
Questa sezione serve a comporre una parola ad 8 bit da immettere nel computer.
Una coppia di FLIP-FLOP di tipo D campiona il valore a due bit del pixel in digitalizzazione che viene serialmente inviato ad uno shift register, pertanto dopo otto cicli del segnale di clock del registro (GATED CLOCK), lo stesso presenterà in uscita una parola ad 8 bit che contiene 4 pixel consecutivi.
La campionatura degli ingressi è tale che i 2 bit non cambino valore durante la codifica dei medesimi.
5) Generatore di ritardo per linea e quadro
Con questo nome ho chiamato il blocco che accetta la "richiesta digitalizzazione" e fornisce al resto del circuito il clock di digitalizzazione (GATED CLOCK, 2 impulsi per pixel), che potrà presentarsi in uscita solo se:
- A) E' alta la linea ON/OFF (digitalizzatone attivato).
- B) SQ+dSQ e SR+dSR sono attivi (quadro in zona utile).
Visto che il bordo dello schermo non è usato dal computer la zona attiva del video si riduce,formando una finestra rettangolare nella quale dovrò inquadrare il fotogramma digitalizzato.
Se si partisse a convertire l'immagine subito dopo i sincronismi di quadro e di linea si acquisirebbero i dati dell'angolo in alto a sinistra del quadro televisivo, infatti limitando il campionamento a 200 linee orizzontali (tanta è la definizione del VIC),perderei le ultima 112,5 righe video (più di un terzo delle 312,5 linee per semiquadro del PAL composito) inoltre un discorso analogo si può fare anche sulla definizione orizzontale.
Si è reso necessario allora un circuito che generasse i sincronismi di quadro (SQ) e quelli di riga (SR) con dei ritardi variabili a piacimento per poter interamente esplorare il fotogramma con la maschera creata dal VIC grazie alla sua bordatura video.
Questo sistema non estende la superficie attiva sul monitor del computer, ma permette di centrare al suo interno il soggetto del fotogramma tramite due potenziometri connessi ad altrettanti monostabili che determinano i ritardi di riga (dR) e di quadro (dQ), quindi le coordinate sul fotogramma del punto di inizio digitalizzato.
Il clock di campionamento, o GATED CLOCK, viene inibito dal segnale "fine linea" che si presenta ogni qualvolta il codificatore degli indirizzi ha contato 320 bit di dati in ingresso (160 pixel, 40 caratteri, una linea testo). In seguito si aspetta il segnale di SR+dR per far ripartire la digitalizzazione della linea successiva.
6) Generatore di indirizzi
Come il nome lascia intuire questa parte dello schema è finalizzata alla creazione degli indirizzi dei dati che vengono generati secondo il ritmo, opportunamente trattato, del GATED CLOCK, segnale che viene appunto diviso per 8 in modo da ottenere una linea "fine shift dati", che risulta attiva, infatti, ogni volta che lo shift register è pieno, ed è usata per indicare che i bus "interni" presentano i dati e gli indirizzi del byte in questione (BUS ADD./DATA OK).
Gli indirizzi vengono praticamente generati da una serie di divisori pilotati dal segnale "fine shift dati" che fa dunque avanzare il conteggio. Purtroppo anche attivando l'alta risoluzione il VIC divide lo schermo in una scacchiera da 40 colonne x 25 righe, cioè 1000 quadrati (ognuno è un'area carattere in modo testo) che vengono ulteriormente suddivisi in 8 linee orizzontali ciascuno.
Ognuna di queste linee rappresenta un byte di memoria il cui seguente non si trova graficamente alla sua destra ed alla sua stessa altezza, ma sotto di lui, o se si esce dal quadratino, in cima a quello successivo (in pratica un riporto).
Questo intricato metodo di mappatura mi porta ad esplorare il singolo quadrato in verticale, in orizzontale la linea di quadrati ed a comporre l'intero quadro con una successione verticale di queste linee. La trasmissione televisiva, invece, esplora il quadro direttamente con delle righe continue, per cui si è reso indispensabile un circuito che codificasse gli indirizzi in modo tale da adattare la loro generazione allo standard televisivo.
Questa codifica è stata ottenuta scambiando opportunamente alcune linee addres e con l'impiego di una memoria EPROM sulla quale erano stati scritti precedentemente i corretti codici di indirizzo di peso più elevato. L'intera schermata è contenuta in un segmento di memoria da 8 KByte (8 byte a quadrato, con 1000 quadrati quasi 8 Byte), un'area che viene coperta da 13 linee di indirizzo, avanzano quindi, dai 16 addres disponibili sul BUS, 3 linee che vengono collegate a degli interruttorini con i quali è possibile selezionare il banco di memoria in cui la periferica deve riversare i suoi dati.
Questo blocco fornisce in uscita anche il segnale di "fine linea" e di "fine quadro", quest'ultimo è usato per spegnere l'intera interfaccia quando tutti gli indirizzi del banco di memoria sono stati esplorati.
7) Sincronizzatore di bus
Visto che la fi2 è ottenuta nel computer dividendo per 8 il DOT CLOCK e che 8 DOT CLOCK campionano un byte, non c'è differenza di frequenza tra fi2 e la cadenza con cui l'interfaccia invia i byte al computer.
Non è detto però che vi sia sincronismo tra questi due ritmi uguali, allora bisogna interporre tra i bus della macchina e quelli della periferica, o "interni", un sincronizzatore che acquisisca i dati sull'attivazione del segnale BUS ADD./DATA OK e lo riporti in uscita nell’istante in cui il commodore 64 è in grado di riceverlo.
I bus del computer sono collegati alle uscite di una serie di buffer 3-state che si impossessano dei bus al momento opportuno, e durante questo tempo in cui la macchina acquisisce i dati questi non possono variare grazie a dei registri che possono cambiare stato solo quando i buffer 3-state sono in alta impedenza.
Sarebbe comunque utopico supporre che il codificatore degli indirizzi e dei dati presentino sulle loro uscite dei livelli validi solamente durante tutto il tempo in cui i buffer sono in alta impedenza, per cui è necessario memorizzare in altri registri anche i bus "interni".
Il tempo che intercorre tra la memorizzazione dei dati in questi ultimi registri ed il loro riversamento nei registri che abbiamo visto prima rappresenta, in tempo, la differenza di fase tra fi2 e ed il segnale ottenuto dividendo per 8 il DOT CLOCK.
Dunque nessun dato viene perso perchè in 1yS avviene uno scambio dati sia dai bus "interni" verso i registri che da questi ultimi verso il commodore 64.
Realizzazione
Tutta la parte analogica è stata montata su cinque circuiti stampati (alimentatore, amplificatore, separatore dei sincronismi, convertitore AD e DA), mentre il resto è stato montato su una scheda sperimentale con la tecnica della vrappatura, sistema che permette la modifica dello schema elettrico anche durante il collaudo, al contrario dei circuiti stampati che mi hanno costretto a provare preventivamente su BREAD-BOARD (un ulteriore tipo di basetta sperimentale) il corretto funzionamento dei cinque schemi analogici.
Programmatore di EPROM usato per la “2516” impiegata nel prototipo,
ma questo progetto è un’altra storia……
Il prototipo… 20 anni dopo
Collaudo e ricerca guasti
Ultimata la realizzazione il circuito è stato sottoposto al collaudo con un esito veramente deludente: blocco totale della macchina. Sicuro del principio di funzionamento ho ricercato il motivo di ciò nel mancato rispetto delle temporizzazioni dei bus.
Questa ricerca evidenziò due pecche, la prima consisteva nel mancato collegamento dei piedini di reset dei registri ad uno stato logico definito, la seconda era invece imputabile al computer che inviava un segnale di fi2 molto disturbato, ma soprattutto con un tempo di salita prossimo a quello della lunghezza dello stesso impulso.
Questo, ed il rumore sovrapposto al segnale (dovuto agli accoppiamenti presenti nella piattina di collegamento), non ha permesso il corretto funzionamento del circuito. Si è provato allora a ripulire il segnale con delle porte CMOS TTL compatibili (74HC04) che commutano quando il segnale raggiunge la metà tensione di alimentazione, ma questo ha provocato due inconvenienti: per arrivare a quel valore di soglia il segnale di fi2 impiega un tempo troppo lungo, inoltre data la bassa pendenza del fronte di salita risultava critica la commutazione che veniva ritardata ulteriormente, o anticipata, dal disturbo sovrapposto al segnale.
Prove anche giù deludenti sono state portate a termine sperimentando la reazione delle porte triggerate a questo segnale così mal ridotto.
Si è notato però che a differenza del fronte di salita quello di discesa è piuttosto deciso, si è quindi optato per una totale ricostruzione della fi2, infatti è bastato prendere il DOT CLOCK (frequenza DOT CLOCK = 8 x fi2) e dividerla per 8. Ricostruita la frequenza del segnale si è resa necessaria anche la ricostruzione della fase tramite il reset dei contatori sopra citati sul fronte di discesa del segnale di fi2 proveniente dal computer.
L'artificio si è dimostrato corretto e perfettamente funzionante.
Dopo tale modifica la scheda video riempiva effettivamente la memoria, ma la macchina continuava a fermarsi andando in tilt. Il motivo di questo comportamento era la presenza di alcuni disturbi nel segnale di BA proveniente dal commodore 64, ma erano di un'entità così contenuta da poterli agilmente eliminare con un filtro passa basso. Eliminato il blocco della macchina diviene evidente un errore nella codifica degli indirizzi, in quanto l'immagine sul computer risultava spezzata in segmenti multipli di 64 aree carattere.
Dopo laboriose ricerche casualmente è stato trovato il guasto: un falso contatto nel connettore stampato della piattina di collegamento. Con il quadro finalmente riordinato è saltato alla vista un altro difetto consistente in variazioni casuali del colore di intere linee di pixel.
Grazie ad alcune ricerche software e grafiche si è notato che il difetto era causato dallo shift di un bit dell’intera linea dei dati, e ciò era stato prodotto da una mancata sincronizzazione tra la linea "fine shift dati" e l'effettiva fine di questa codifica, il tutto dovuto alla non sincronizzazione della partenza degli impulsi di GATED CLOCK con il DOT CLOCK.
Rendendo dunque sincrona la partenza del treno di impulsi si è ovviato all'inconveniente.
L'ultima modifica apportata ha permesso, tramite la reinsersione del segnale croma all'uscita del DAC, di ottenere in uscita anche il segnale riconvertito a colori creando così un ulteriore effetto utilizzabile in sede di montaggio, ad esempio, per dei video-clip.
Esempio di schermata 1
Esempio di schermata 2
Conclusioni
Dopo un lungo tempo di incubazione dell'idea, durato circa un anno, e dopo i tre mesi che sono stati necessari per la sua realizzazione e messa a punto, finalmente posso vedere il mio circuito funzionare correttamente, e questo mi è sembrato più volte utopico sia durante la progettazione che, specialmente, durante la ricerca di quei guasti che mi avevano quasi persuaso a lasciar perdere.
Questa situazione, che io ho affrontato come una sfida, ha accresciuto in maniera non trascurabile le mie conoscenze in materia, tanto da permettermi di sorridere riguardando gli schizzi che avevo buttato giù un anno fa, per cui posso affermare che questo progetto ha avuto per me un grande significato didattico, ed inoltre mi ha dato la soddisfazione di aver realizzato una cosa mai vista prima che è nata come centralina di effetti video, che si può anche usare come titolatrice, e che potrebbe essere benissimo utilizzata, come realmente è, anche come "KOALA PAINTER" (tavoletta grafica) ad altissima risoluzione per ottenere un input grafico veramente superbo.
Allegate alla relazione ci sono delle fotografie che sono state scattate durante la messa a punto del circuito, infatti si notano alcune immagini in cui il colore grigio è ottenuto dall’alternanza di bit accesi e spenti che l'occhio vede, ad una certa distanza, come un grigio medio. Questa soluzione, se pur non utilizza tutti i livelli forniti dal convertitore, sembrava l'unica soluzione graficamente accettabile che mascherava, ma non risolveva, il problema del salto del bit da parte dello shift register all'inizio di alcune linee televisive digitalizzate.
Come testimoniano le altre fotografie il difetto è stato eliminato alla base con la metodologia esposta all'interno di questa relazione.
Video
Esempi digitalizzazione in formato .avi (scarica)
Schemi
1. Schema VIC-II C64 1-2 [fonte: funet.fi]
2. Schema VIC-II C64 2-2 [fonte: funet.fi]
0. Schema blocchi totale
1. Sezione alimentatrice
2. Interfaccia temporizzazioni
3. Sezione analogica
4. Codifica del dato
5. Generatore di ritardo per linea e quadro
6. Generatore indirizzi
7. Sincronizzatore bus