VIDEO-DVM

by donpedro

Un DVM foarte ieftin care arată cum ieşirea unui semnal atât de complex ca cel videocomposite poate fi generată exclusiv prin sofware: tot hardwareul necesar sunt doi pini de I/O şi trei rezistoare. Conectat la orice TV, el afişează tensiuni, inclusiv punctele de maxim şi de minim, folosind digiţi foarte mari şi un bar-display analogic. Este de asemenea oferită o ieşire de date pentru data logging. Microcontrolerul este AT90S1200 de la Atmel, ideal pentru pasionaţi datorită memoriei sale flash de 512, protocoalelor publice de programare, unui ansamblor şi unui simulator oferite gratis la www.atmel.com. Circuitul nu este numai un proiect complet funcţional, dar arată cum se realizează o aplicaţie ce foloseşte un TV ca display: sunt gata oferite controlul întreruperilor şi software pentru stabilirea timpilor de display, ceea ce permite şi celor mai novici modificarea codului pentru realizarea unui multimetru, a unui frecvenţmetru, unei tabele de scor pentru un joc, etc.

Video-DVM afişează pe ecranul TV tensiuni folosind digiţi foarte mari sau bare analogice; înregistrează valorile maxime şi minime; trimite datele măsurate la un calculator personal prin intermediul unei interfeţe seriale.
Suportă:
O intrare analogică pentru măsurarea de tensiuni în domeniul 0…4V;
O ieşire video display care comandă direct un set TV obişnuit prin intrarea SCART (VCR);
O ieşire serială de date pentru logarea datelor la un computer personal;
Necesită o sursă de alimentare de +5V, 15 mA tipic.
Cu afişajul său foarte mare, Video-DVM este ideal pentru afişarea pentru o audienţă mare a orice poate fi convertit în volţi, de la temperatura rezultată dintr-un experiment fizic până la un love-meter pentru o petrecere.
Este ieftin şi uşor de modificat, permiţând oricui să experimenteze semnalele video şi afişarea de date. Programarea lui permite sinteza de semnale video în timp real, conversii digitale, temporizări pentru datele seriale şi micşorarea numărului de linii de cod. Convertorul analog digital poate fi uşor conectat la o varietate de traductoare sau poate fi înlocuit cu cod nou pentru afişarea timpului sau pentru numărarea unor impulsuri. Datorită fluxului serial de date, Video-DVM poate fi folosit ca logger simplu de date.
Toate sarcinile dificile de generare a rasterului prin întreruperi, rutinele pentru datele seriale, comanda convertorului ADC sunt încorporate, permiţând astfel oricui modificarea codului pentru a realiza orice sarcini.

Circuitul hardware
Circuitul este realizat în jurul microcontrolerului AVR 90S1200 de la Atmel şi al convertorului analog-digital MAX192 de la Maxim.
Cipul poate fi reprogramat de cel puţin 1000 de ori flash, folosind unul din multele programe disponibile. Detaliile protocoalelor programării flash sunt de asemenea disponibile pe situl de web.

Cipul are 32 bytes de RAM, 64 byte de EEPROM, 512 words de memorie program şi un timer de 8 biţi. Setul de instrucţiuni este concis şi foarte bine echilibrat şi, datorită arhitecturii Harward RISC, chiar şi o sarcină complexă ca cea descrisă aici este realizată folosind doar circa 400 de instrucţiuni.
Ciclul unei instrucţiuni este foarte mic, ceea ce permite sinteza software a semnalului video.
Un DAC simplu, de doi biţi, realizat cu trei rezistoare realizează semnalul video complex la un nivel standard de 1Vpp folosit ca intrare pentru un set TV cu conector SCART sau intrare AV (VCR). Chiar şi fluxul de date seriale (date ASCII la 1200 baud, fără paritate, 8 biţi de date, 1 bit de stop) este generat prin software. Nivelul este TTL: majoritatea calculatoarelor personale lucrează cu nivele TTL şi cu nivele standard RS232, cu condiţia ca lungimea cablului să nu fie prea mare, aşa că un translator de tensiune ca MAX232 nu este necesar. Dacă doriţi, acesta poate fi adăugat extern; în acest caz trebuie inversată polaritatea prin inversarea în cod a instrucţiunilor de “set bit” şi “clear bit” (poziţia este marcată în cod).
Toţi pinii de intrare au “pullups intern” şi curent de sink mare, astfel că butonul “max-min clear” şi dipswitch-urile sau jumper-ele pentru selectarea punctului zecimal sunt conectate direct între pini şi masă. La un pin de ieşire este conectat un led care se aprinde ori de câte ori se face o măsurătoare.
Tensiunea este citită de un convertor ADC serial de 10 biţi. El are propria tensiune de referinţă de 4.096 V. Sunt necesare patru linii de I/O pentru transferul de date (Data input, Data output, Chip enable, Serial clock). Chiar dacă este specificat pentru 10 biţi, ADC mai are doi biţi “sub LSB”: acest lucru înseamnă că ADC citeşte efectiv 12 biţi, deşi precizia este garantată doar pentru 10 biţi. Am găsit totuşi aceşti doi biţi în plus foarte precişi. Toţi cei 12 biţi sunt arătaţi pe display, acoperind astfel un domeniu de la 0.000 la 4.095 volţi, cu citire directă a milivolţilor. Este folosită o singură intrare din cele opt disponibile pentru MAX192, dar driverul software poate citi orice intrare. Se poate seta, cu schimbări minore, Video-DVM pentru măsurarea a patru tensiuni, trei cu display digital şi una cu bară analogică.
Circuitul funcţionează cu o tensiune de 5 Volţi stabilizată; la pinul de reset este conectat un reset generator (MC34064-5V) pentru protejarea cipului la brown-out în timpul pornirii şi opririi alimentării.

Sinteza directă a semnalului video
Din punct de vedere hardware, sinteza semnalului video este foarte simplă: doi pini de ieşire şi trei rezistoare ce permit generarea a patru nivele de semnal (sync, black, white, light grey). Din punct de vedere software, sinteza semnalului video necesită un ciclu foarte scurt al instrucţiunilor (aici de 62.5ns) şi un cod cu o temporizare atentă, instrucţiuni echilibrate şi optimizat.
Pentru realizarea unui semnal video complex de bună calitate este necesar un sistem robust pentru realizarea temporizărilor. Pe display este vizibilă chiar şi o întârziere de 62.5ns (perioada unui ciclu pentru un tact de 16MHz), astfel că scrierea oricărei instrucţiuni trebuie făcută cu foarte mare atenţie.
Trebuie mai întâi aleasă o bază de timp potrivită: alegerea ca bază de timp a duratei unei linii a rasterului (64 uS) permite realizarea linie cu line a unui cadru (cadrul non-interlaced are 312 linii) şi poziţionarea uşoară a impulsurilor de sincronizare orizontală (la câteva microsecunde de începutul fiecărei linii video) şi verticală (la câteva linii de începutul fiecărui cadru).
Singurul temporizator disponibil al microcipului poate genera patru întreruperi la fiecare linie a rastrului.
La fiecare a patra întrerupere se crează o nouă linie video: pentru realizarea acestui lucru, de fiecare dată când este executată o rutină de întrerupere este incrementat un numărător, iar la fiecare patru întreruperi suntem (aproape) la începutul unei noi linii.
“Aproape” deoarece trebuie să ţinem cont de timpul necesar pentru servirea unei rutine de întrerupere datorate unei cereri de întrerupere. Acest timp nu este constant şi depinde de instrucţiunea executată la generarea întreruperii. Anumite instrucţiuni au un timp mai mare de execuţie decât altele, astfel că timpul de servire a întreruperii nu poate fi prezis, ceea de distorsionează afişajul.
Cea mai bună soluţie pe care am găsit-o pentru această problemă a fost intrarea în modul sleep chiar înainte de cea de a patra întrerupere: următoarea întrerupere va declanşa microcontrolerul cu o întârziere de timp constantă, cunoscută.
Am denumit cei doi pini de ieşire CsyncBit (composite sync) şi VideoBit.
Punerea la zero logic a celor doi pini Csync şi VideoBit va determina semnalul video să fie de 0 Volţi (nivelul de sincronizare); dacă doar CsyncBit este la 1 logic avem nivelul de negru; dacă CsyncBit şi VideoBit sunt la 1 logic avem un display alb.
Generarea semnalului video are loc în timpul rutinei de servire a întreruperii. La fiecare a patra întrerupere este începută o nouă linie cu impulsul de sincronizare; sunt apoi executate rutinele repetitive de întreţinere (numărarea liniilor, comunicaţiile seriale). Toate acestea sunt executate atât de repede încât nu trebuie adăugate bucle de întâtziere pentru a aştepta începutul porţiunii vizibile a liniei video.
În acest moment este executată o structură multiplă de salt pentru a determina tipul de linie la care suntem.
Salturile se bazează pe numărul liniei (poziţia verticală), astfel că putem afla dacă linia curentă va indica tensiunea (în acest caz avem rutina de display a caracterului), dacă este afişată bara analogică (rutina bar sau rutinele bar ruler) sau dacă sunt afişate numere ce indică valorile de vârf cu litere mici (rutine pentru afişarea de caractere ce au ca parametru o mărime mai mică). Există desigur şi o rutină “void” pentru liniile blank dintre caractere.
Pentru liniile blank rutina de întrerupere cedează controlul programului principal; pentru liniile de dispay controlul este cedat numai după desenarea întregii linii cu caracterele corespunzătoare; pentru liniile verticale afişajul este întrerupt şi polaritatea semnalului de sincronizare inversată. La sfârşitul liniei, sau imediat după a treia întrerupere, microcontrolerul este îngheţat folosind instrucţiunea sleep, aşteptându-se cea de a patra întrerupere.
În timpul intervalului de execuţie a rutinelor de întreţinere, la începutul fiecărei linii video, datele sunt serializate la ieşire; deoarece nu mai există temporizatoare disponibile hardware, portul serial este realizat software. La fiecare 13 linii orizontale este transmis un bit nou cu o rată de 1200 bps, adecvată pentru cantitatea mică de date pe care o avem de transmis.
Datele sunt transmise ca şir ASCII terminate cu un caracter CR (ASCII 13). Puteţi folosi un program QBasic sau orice program pentru terminale (cum ar fi Hyperterminal oferit de Windows 95 sau Terminal oferit de Windows 3.11) pentru a recepţiona datele.
Toate rutinele de generare a semnalului video sunt atent realizate. Nu înlăturaţi rutinele NOP din cod deoarece acestea echilibrează timpii de execuţie! Atunci când se execută ramuri, timpii de execuţie asociaţi cu orice cale posibilă trebuie calculaţi foarte atent. Din fericire pentru d-voastră, tot codul necesar pentru manipularea semnalului video este gata realizat.
Puteţi modifica sau adăuga cod la programul principal pentru a îndeplini orice sarcini doriţi. Chiar structura de salturi multiple care selectează conţinutul display-ului este uşor de înţeles, astfel că puteţi realiza sute de display-uri diferite, cu caractere de orice mărime şi cu bare analogice multiple.
Toate rutinele şi variabilele au nume lungi şi sunt uşor de înţeles. Codul este comentat pe larg. Ţineţi cont că este permis un singur apel de subrutină la un moment dat.

Fonturi particularizate
Puteţi redefini fonturile pentru orice forme; acest lucru este folositor mai ales pentru unitatea de măsură. În loc de volţi (V) puteţi afişa orice literă sau formă care se încadrează într-o matrice de 8×5 pixeli. Fonturile sunt stocate în EEPROM conform fişierului de definiţie FONTS.INC. Fişierul este inclus automat în timpul asamblării, iar rezultatele sunt compilate în VIDEODVM.EEP; nu uitaţi să programaţi separat EEPROM-ul dacă aţi programat FLASH.
Fonturile sunt stocate rotite cu 90 de grade în sensul acelor de ceasornic în 5 biţi adiacenţi.
Pentru a putea realiza forme de fonturi grafice este inclus fişierul VIS_BYTE.H: el redefineşte toate valorile în caractere underscore şi “o”: studiaţi fişierul FONTS.INC pentru a vedea ce folositor poate fi acest lucru.
Fişiere
Pentru programarea cipului aveţi nevoie de următoarele două fişiere (de la www.electronica-azi.ro)
VIDEODVM.EEP conţinutul EEPROM în format hex Intel
VIDEODVM.HEX conţinutul FLASH în format hex Intel
Dacă vreţi să vedeţi funcţionarea internă sau dacă doriţi să modificaţi codul, sunt disponibile următoarele fişiere sursă:
VIDEODVM.ASM fişierul sursă Main Assembly
1200DEF.INC definiţii Atmel pentru AT90S1200
VIS_BYTE.H redefiniri ale valorilor biţilor
FONTS.INC forme de fonturi (EEPROM)

Realizarea circuitului
Toate componentele folosite sunt ieftine şi uşor de procurat. MC34064 poate fi înlocuit cu orice reset generator cu alimentare de la 5V, cu trei pini; chiar şi MAX192 are echivalenţi cu acelaşi protocol de date şi cu rezoluţii diferite.
Realizarea circuitului este uşoară; el este foarte simplu şi poate fi realizat chiar şi fără PCB dacă ţineţi cont că legăturile pentru masă ale ADC să fie cât mai scurte şi aveţi masa digitală (pinul 14 al MAX192) separată de masa analogică (pinii 9, 13 ai MAX192); cele două mase se vor uni aproape de sursa de alimentare.
Dacă aveţi un traductor legat la intrare asiguraţi-vă că tensiunea generată nu depăşeşte 4.096 V şi nu scade sub 0 V prin montarea unui rezistor serie (de aproximativ 1k) şi o diodă paralel.
Odată alimentat, led-ul care clipeşte vă spune că microcontrolerul funcţionează. Led-ul se aprinde odată pentru fiecare conversie.
Este acum timpul să conectăm Video-DVM la TV: pentru TV cu conector SCART, pinii pentru intrare video sunt 20 (video) şi 17 (ground). TV-ul trebuie deconectat de la sursa de alimentare atunci când se introduce mufa SCART.
Se pune TV-ul în modul de intrare AV folosind telecomanda: seturile mai vechi de TV pot să nu aibă această posibilitate; în acest caz intrarea AV poate fi realizată prin montarea unui rezistor de 1k între pinul 8 al conectorului SCART la +5 …12V.
Puteţi acum pune jumper-ele pentru selectarea punctului zecimal, încercaţi mai multe tensiuni la ADC, verificaţi efectul butonului max-mic sau puteţi doar să priviţi pentru un timp la noua jucărie electronică.
Ultimul pas este conectarea la calculatorul personal. Porniţi programul Terminal din directorul Accessories (Windows 3.11) sau programul Hyperterminal (Windows 95). Setaţi conexiunea la 1200 baud, no parity, 8 data bits, one stop bit (1200,n,8,1).
Conectaţi masa şi fluxul de date serial la pinul RX, după cum urmează:
9 pin connector: 2=RX 5=GND
25 pin connector: 3=RX 7=GND
Dacă folosiţi un alt program pentru terminale sau Basic s-ar putea să mai aveţi nevoie de câteva jumper-e pentru conectorul serial:
9 pin connector: 7=RTS cu 8=CTS;
1=DCD cu 6=DSR cu 4=DTR
25 pin connector: 4=RTS cu 5=CTS;
8=DCD cu 6=DSR cu 4=DTR
De fiecare dată când led-ul se aprinde trebuie să vedeţi un rând nou de date ASCII pe ecran.
Precizia este destul de bună pentru a realiza un multimetru complet folosind această aplicaţie; puteţi afişa un număr de până la opt tensiuni folosind un afişaj digital sau analogic; puteţi număra impulsuri, puteţi măsura intervale de timp, puteţi măsura frecvenţe, etc. Puteţi implementa un wattmetru sau pur şi simplu puteţi număra de câte ori a pornit astăzi frigiderul sau centrala de încălzire.
Folosind software-ul arătat puteţi chiar genera modele video simple pentru reparaţii TV; puteţi realiza un generator video simplu cu un logo personal. Puteţi folosi acest circuit chiar ca un numărător invers până la noul an; sau puteţi realiza un generator de numere aleatoare pentru un joc de bingo; sau puteţi adăuga câteva butoane şi aveţi o tabelă de scor electronică. Impulsurile de la începutul fiecărei linii permite generarea de tonuri. Prin adăugarea unui releu puteţi seta un prag pentru un termostat sau puteţi controla debitul unui lichid.

S-ar putea să vă placă și