Scheda di Acquisizione Video per Commodore 64

Autore: mces - Pubblicato il 06-08-2007.
(© https://ready64.org - Versione Stampabile. Riproduzione Vietata.)

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 rica­vato da un segnale video seriale tipo PAL composito, cioè quello attualmente usato in Italia per le trasmissioni televisive.

Interessandomi per hobby alle produzioni televisive ama­toriali cercai di realizzare con il computer degli effetti video e delle titolazioni in sovraimpressione alle immagi­ni, ma per realizzarle avevo bisogno di una periferica che permettesse un ottimo input grafico, come un digitalizza­tore 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 cir­cuito che potesse digitalizzare in tempo reale le immagi­ni 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 ri­spettarne 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 pun­to 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 velo­cità di immissione dati è la stessa del VIC che opera il processo inverso.

Progetto

La periferica è così composta:

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:

3) Sezione Analogica

Il primo blocco che ho progettato è stato quello analo­gico 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 indis­pensabile per la digitalizzazione e l'estrazione dei sin­cronismi.

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 incre­mento 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 serial­mente 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:

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 con­nessi ad altrettanti monostabili che determinano i ritardi di riga (dR) e di quadro (dQ), quindi le coordi­nate 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 ripar­tire 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 esplo­rare 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 opportuna­mente 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 indi­rizzi 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 sin­cronizzatore 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 re­gistri 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.

048_box_esterno.jpg

Programmatore di EPROM usato per la “2516” impiegata nel prototipo,

ma questo progetto è un’altra storia……

 

048_digitalizzatore.jpg

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 impu­tabile 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'imma­gine 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 ot­tenere in uscita anche il segnale riconvertito a colori creando così un ulteriore effetto utilizzabile in sede di montaggio, ad esempio, per dei video-clip.

048_AUC_testa.jpg
Esempio di schermata 1

048_AUC_coda.jpg
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 proget­tazione 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 cono­scenze 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 risol­veva, 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'inter­no 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