Pateikiame VGA signalo modeliavimą kompiuterio ekrane, tam naudojant AVR mikrovaldiklį „Atmega 16“. Čia pateikiami programų kodai, leidžiantys suprasti, kaip vyksta VGA signalų formavimas.
Principinė elektrinė schema yra labai paprasta, tam tereikia kelių 1K varžų, poros kondensatorių, kvarcinio rezonatoriaus bei VGA jungties kompiuterio ekranui prijungti (1 pav.). Vietoj naudojamo „Atmega 16“ galima naudoti ir kitokio tipo mikrovaldiklį (pvz.: „Atiny2313“).
1 pav. Principinė VGA signalo modeliavimo schema
VGA signalas modeliuojamas 640 x 480 raiškai. Todėl būtina žinoti horizontalaus ir vertikalaus sinchronizavimo laikus bei kitus parametrus, kuriuos galite rasti www.epanorama.net/documents/pc/vga_timing.html puslapyje. Tačiau pagrindiniai yra šie:
Taktų dažnis: 25,175 MHz
Eilutės keitimo dažnis: 31469 Hz
Kadro keitimo dažnis: 59,94 Hz arba 525 eilutės
Vertikalus sinchronizavimas: 63 us
Horizontalus sinchronizavimas: 3,81 us
2 pav. „Piešimo“ ekrane pavyzdžiai
Programos kodas yra rašytas „AVR Studio“ programa, GCC kalba (paveiksliukas.c).
Kaip matome, taktų dažnis yra 25,175 MHz, tai yra apie 39,72 ns, tačiau naudojant 16 MHz, instrukcijos atlikimo trukmė 62,5 ns. Įrašant i PORTB reikšmę 0 arba didesnį skaičių, skiriasi asemblerio kodo ilgis, todėl norint suvienodinti, papildomai reikalingas kodo vykdymo vėlinimas. Tam naudojama „nop“ instrukcija, kurią mikrovaldiklis vykdo kaip tuščią komandą. Taigi norint nuspalvinti arba palikti juodą ekrano elementą (tašką), sugaištama 2 ciklus t. y. 125 ns. Taigi, nuspalviname ~3 vaizdo elementus.
Naudojant mažesnio ar didesnio dažnio kvarcinį rezonatorių teks pakeisti TCNT0 reikšmes, arba tiesiog #define laikas < taimerio pradinė reikšmė> taimerio pradinę reikšmę. Taipogi teks suderinti (pakeisti) sinchronizavimo laikus, kad jie išliktų tokie, kokie yra nurodyti 640 x 480 raiškai.
Norint suvienodinti laikus „spalvinant“ pikselius, naudojome papildomą „nop“ instrukciją:
PORTB=0
nop;
Asemblerio kalba būtų:
STS 0x0038,R1
NOP
Tuo tarpu:
PORTB=1
Asemblerio kalba būtų:
LDI R24,0x01
STS 0x0038,R24
Norint suformuoti ekrane norimą paveiksliuką, galima jį tiesiogiai formuoti rankiniu būdu aprašant kiekvieną vaizdo elementą. Kad to nereikėtų daryti kiekvienu metu keičiant paveiksliuką, galima pasinaudoti sudaryta programa (VGA.exe), kuri pagal nupieštą paveiksliuką sugeneruoja paveiksliuką atitinantį kodą
3 pav. Programos formuojančios piešinio kodą pagrindinis langas
Patalpinus programa gautą kodą tarp žymių „//paveiksliuko kodas“ ir „//paveiksliuko kodo pabaiga“ bei perkompiliavus programą ir įrašius į mikrovaldiklį, displėjaus ekrane pamatysite savo suformuotą vaizdą.
Žemiau pateikta kodo iškarpa su nurodyta automatiškai sugeneruoto kodo įterpimo vieta:
while (1) //begalinis ciklas, kuriame paišomas paveiksliukas
{
sleep_mode(); //laukiame taimerio pertraukties
if(linecount>45) //paliekame tuščias eilutes: top border, bottom border
{
sleep_mode(); //paliekame kelias tuščias eilutes
sleep_mode(); //
sleep_mode();
sleep_mode();
//paveiksliuko piešimas, čia parodyta 20-ties „taškų“,
//„taškas“ – tai keli įjungti vaizdo elementai
//PORTB=0 juoda
//PORTB=1 raudona
//PORTB=2 žalia
//PORTB=4 mėlyna
//PORTB=7 balta
//kitokie skaičiai iki 7, kitokia ir spalva
//paveiksliuko kodas
//paveiksliuko kodo pabaiga
while(linecount!=44){}; //laukiame tol kol nepasieksime 44 eilutės
}
}; //amžino ciklo pabaiga
} //pagrindinio ciklo (main) pabaiga
VGA signalas yra analoginis ir kinta nuo 0 iki 0,7 V (monitoriaus įėjimo varža 75 Ω). Taigi, norint gauti didesne spalvų gamą, galima daryti paprastą įtampos daliklį, pajungiant varžas į kitas mikrovaldiklio kojas.
4pav. Įtampos daliklis, naudojamas norint gauti didesnę spalvų gamą
Kitoje versijoje bus naudojamas masyvas, kurio turinį bus galima keisti mikrovaldiklio veikimo eigoje. Toks metodas yra daug racionalesnis nei aprašytasis.
Redagavo Darius Grigaitis