Video-signal iz mikrokontrolera (2006.)

avr-vga-pal

Slova lepo izgledaju, a one starije podsetiće na mladost, na ZX 81 i ZX Spectrum. Slika je crno-bela, 20 redova sa po 38 znakovnih mesta, a izgled svakog znaka definisan je matricom od 8×12 tačaka. Može se posmatrati na bilo kom televizoru koji ima (obični, kompozitni) video-ulaz. Tekst za prikazivanje mikrokontroler dobija preko svog asinhronog serijskog interfejsa, odnosno preko RXD linije na pinu 14.

Generisanje PAL i VGA signala u mikrokontroleru nije komplikovano u principu – ako se imaju precizne specifikacije formata i dovoljno otkucaja takta za svaku operaciju pri željenoj rezoluciji, ali pisanje te vrste softvera traži vreme, pažnju i preciznost u odbrojavanju svake šesnaestine mikrosekunde da nešto ne bi zakasnilo i dodavanju pojedinačnih NOP-ova da se ne nešto ne bi dogodilo prerano. Osim toga, treba pripremiti rasterizovana slova, ceo set karaktera, tačku po tačku, red po red. Mnogo gotovih rešenja, boljih i lošijih, već postoji, a meni se dopalo kako se koristi SPI shift registar u Atmelovom mikrokontroleru ATmega16, po šemi na http://www.serasidis.gr/circuits/AVR_VGA/avr_vga.htm, gde je za nekomercijalnu primenu ponuđen i izvorni kod programa u C-u. Valja napomenuti da ta šema sadrži važnu faktičku grešku, bar u odnosu na pripadajući softver – pinovi 22 i 23 su zamenjeni. Sam program je načelno dobar, osim što primenjuje neke konvencije specifične za stare verzije WinAVR/GCC kompajlera, pa je i tu trebalo istraživanja i dorade da bi se sve dovelo u radno stanje. Na ATmega16 mnogo pinova ostaje slobodno, ali baš ovaj model primenjen je pre svega zbog svojih memorijskih resursa. Šema koju ovde prikazujemo predstavlja jednu od varijanti izvedenih iz osnovnog projekta, za PAL.

 

avr-vga-pal 222

Nedostatak ovog eksperimentalnog koncepta jeste nepostojanje ugrađene mogućnosti pozicioniranja i skrolovanja: kada je i zadnje slovno mesto na ekranu ispunjeno, sadržaj ekrana briše se i ispisivanje ide dalje opet iz levog gornjeg ugla, s leva na desno, odozgo nadole, sekvencijalno. Zato u zadnjem (najnižem) redu par karaktera koji označavaju prelaz na početak sledećeg reda (CR+LF) nema uobičajeno dejstvo – da bi se uopšte moglo videti šta je ispisano. Postoji TAB od 5 mesta, kao i destruktivan BACKSPACE. Za prelazak u sledeći red dovoljan je CR (0x0D, decimalno 13).

U prvoj probnoj primeni ovaj nedostatak prevazišao sam veoma lako, time što se tekst (u intervalima od nekoliko sekundi) prema ATmega16 šalje uvek u “paketima” od po četiri reda, s tim da je četvrti red uvek dug 38 karaktera. Pošto se na ekranu može prikazati 20 redova (5×4), sve je uvek ispisano na pravi način: poruka najbliža dnu ekrana ispisana je uvek cela, a sledeća uredno kreće na praznom ekranu. Moguća su i razna druga rešenja ove nesavršenosti.

Za razliku od prikaza crnih slova na beloj pozadini (kako je ruski autor izveo), prikaz “u negativu” skoro da je imun na pojavu treptanja dok ATmega16 prima niz uzastopnih karaktera (prekidne rutine USART-a prekidaju ispisivanje slike). Ako se koriste crna slova na beloj pozadini, treptanje i nedostajuće linije jasno su vidljivi dok stiže tekst, a jedini lek protiv ovoga može biti slanje jednog po jednog znaka na serijski ulaz ATmega16 samo neposredno posle vertikalnog sinka, pre nego što krene ispisivanje prve linije u vidljivom delu nove poluslike. Zato su, i ne samo zato, bela slova na crnoj pozadini – pogodnija i praktičnija; manje zamorna za oko i hardver.  Ako neko kasnije poželi baš “crno na belo”, kao u originalu, samo će anodu D1 odspojiti od kolektora T1 i povezati je na pin 6.

Deo softvera u ATmega16 čini tabela sa rasterizovanim karakterima-znakovima, svaki na matrici 8×12, poređani po svojim kodovima od 0 do 255. Preko ASCII-koda karaktera koji treba ispisati na ekranu, program može tačno da izračuna gde se u tabeli nalazi koji znak, odnosno slika od 12 redova po 8 tačaka/piksela (“nula” ili “jedinica”) koja opisuje njegov izgled. Program u memoriji mikrokontrolera drži kodove svih znakova koji su primljeni i trenutno su prikazani. Kada krene da osvežava sliku na ekranu, program iz tabele čita prvi red piksela matrice za svaki od najviše 38 karaktera i te prve redove piksela predaje kao niz bajtova SPI-interfejsu koji ih sam “gura” na pin broj 6, štedeći vreme procesora, a televizor ih ispisuje kao niz belih i crnih tačaka s leva na desno, odnosno kao prvu liniju. Kada program pošalje svih 38 bajtova tokom precizno određenog vremena, tajmer nezavisno inicira slanje signala za horizontalnu sinhronizaciju (preko pina 22), a potom se šalju bajtovi (tj. po 8 piksela) redova broj 2 iz slika istih 38 karaktera, koje televizor ispisuje od početka sledeće neparne linije na ekranu. Sa dvanaest linija ispisan je prvi red karaktera, pa se prelazi na sledeći. Kada stigne do dna ekrana (posle 312. linije), program šalje signal za vertikalnu sinhronizaciju, pa kreće ispisivanje sledeće poluslike koja će popuniti parne linije na ekranu. Ponovo se iz početka čita red po red tačaka iz matrice za prvi red karaktera od vrha ekrana; ako preko USART-a nije stigao nikakav novi tekst, obe poluslike biće iste, samo međusobno pomerene vertikalno za jednu ekransku liniju. Tajming je kritičan, odnosno – tačno se zna koliko mora da traje jedna linija za PAL-video (52uS+12uS), koliko će trajati ispisivanje pojedinačnih piksela u zavisnosti od vertikalne rezolucije, koliko sinkovi itd. U jednoj sekundi televizor ispiše 50 poluslika koje se naizmenično sastoje od parnih, odnosno neparnih linija, što znači da učestanost vertikalnih sinkova iznosi 50 Hz. Svaka puna slika sastoji se od 625 linija, pa je 15625 Hz učestanost horizontalnih sinkova. Ako je bafer u mikrokontroleru pun – već sadrži 20×38=760 primljenih karaktera, prijem prvog sledećeg karaktera izazvaće brisanje sadržaja i tog bafera i ekrana, pa se kreće iz početka.

Modul je ipak potpuno jednostavan za gradnju i upotrebu. Mogao bi biti pogodan za eksperimente ili primenu u nezahtevnim aplikacijama u vezi sa praćenjem toka jednostavnih tehnoloških procesa, na primer, gde je dobro imati informacije prikazane izražajnije nego sa malog LC-displeja, a ne zahteva se estetski efekat. Nije potrebno nikakvo podešavanje; čim se uključi napajanje i na pin 14 stignu prvi karakteri, isti će odmah biti prikazani na ekranu televizora.

Testirana je proširena aplikacija koja prati stanja pet mehaničkih alarmnih senzora, temperaturu preko jednog DS1820 i napon na dva ADC ulaza dodatnog mikrokontrolera ATmega8, a rezultati se na svake 3 sekunde šalju prema ATmega16 i prikazuju u na televizoru. Obzirom da tekst koji se prikazuje uvek sadrži dodate blankove na kraju i – ukupno – taman toliko karaktera koliko stane na ekran, prijemom prvog sledećeg karaktera ekran se briše i novi tekst ispisuje se uvek na praznom ekranu; sve prikazano uvek je na istom mestu. Drugi mikrokontroler – izvor tekstualnih podataka – naravno da može biti bilo koji model bilo kog proizvođača, ili eventualno – PC računar, preko konvertora nivoa. Pogodno je i to što na mikrokontroleru – izvoru teksta – komunikacija prema modulu za prikaz zauzima samo jedan pin.

Zanimljiva je mogućnost da se video-izlaz poveže sa odgovarajučim snimačem,  čime se stvara dokumentacija za kasniju proveru ili analizu.

2N3906 invertuje signal iz mikrokontrolera. Tri diskretna nivoa – sink (0 V), crno (0,3 V) i belo (1 V) – formiraju se deliteljem napona čiji gornji deo čine dve paralelne grane sa R1 i R2, a donji – R5. Ovo je već ranije viđeno u sličnim projektima. To što se van mikrokontrolera video-signal invertuje – nema uticaja na sinkove, jer program menja registar DDRB, bit DDB5, čim se završi ispisivanje vidljivog dela linije; pin 6 biće ulaz (visoka impedansa) dok prođe sink i do početka ispisivanja sledeće linije.

test-aplikacija-2006

Uređaj se napaja sa stabilisanih 5 V.

C1 može se postaviti direktno na činč (RCA) konektor.

Pošto je osnovni softver ruskog porekla, podržana je cela kodna stranica 1251, sa latinicom, ćirilicom i raznim specijalnim znacima.

 

Nacrt pločice za sam PAL generator, po prikazanoj šemi:

03

 

04

Program za ATmega16:

main_o_PAL.hex

 

 

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s