XMEGA RTC, DMA in projekt naprave za sprostitev. XMEGA ima vgrajen poseben notranji oscilator, ki je povezan z TOSC1 in TOSC2 priključkoma za priključitev 32.768 KHz kristala ure. Temu oscilatorju sledi delilnik frekvence, ki lahko zagotovi bodisi 32.768 kHz ali 1.024 kHz takt. Ta takt se potem lahko uporabi v modulu z uro realnega časa (RTC), ki ima pred 16-bitno uro realnega časa še 10-bitni delilnik.
Nekateri proizvajalci mikrokontrolerjev pogosto vgrajujejo »prave« RTC module, ki ima tudi celotno logiko z registri za leto, mesec, dan in uro, minute in sekunde, logiko za alarm in možnost baterijske podpore. XMEGA sicer nima tako dobre podpore, vendar pa je RTC modul poleg ostalih možnosti lahko nastavljen tako, da povzroči prekinitve mikrokontrolerja na več intervalih, vključno z enkrat na sekundo, enkrat na minuto, ali pa enkrat na uro.
V svojem projektu sem potreboval posodobitev prikaza časa le enkrat na minuto ter prikaz tega časa na 4 številčnem 7-segmentnem LED prikazovalniku. Med prekinitvijo RTC, ki nastane vsako minuto, se s programsko kodo izvede posodobitev spremenljivk Tenhour, Unithour, Tenminute in Unitminute. Te spremenljivke se uporabljajo za prikaz štirih številk na LED prikazovalniku, preko iskalne (lookup) tabele pa se decimalno število pretvori tudi v 7-segmentni vzorec za prikaz. Med prekinitvijo RTC se primerja tudi trenutni čas s časom alarma in postavlja zastavica, če sta se vrednosti ujemata. To zastavico uporabimo za ustavitev predvajanja *.WAV datoteke in proženje rutino, ki daje na izhod zvočni signal kvadratne oblike s frekvenco približno 800 Hz za nek določen čas, kar je shranjeno v konstanti alarmduration (privzeta vrednost je 30 sekund).
XMEGA DMA krmilnik
DMA krmilnik v XMEGA bi bil lahko tema celotnega članka, saj je izjemno vsestranski. XMEGA128A1 vsebuje štiri ločene DMA krmilnike. Vsak od njih je sposoben DMA prenosov med pomnilnikom-pomnilnikom, pomnilnikom-perifernimi enotami ali celo med samimi perifernimi enotami. Obstajajo različni načini delovanja in velikosti paketov (Burst velikost), ki jih lahko določimo. DMA krmilnik lahko deluje kot:
- »full-speed«, pri katerem prenese svoj paket podatkov v čim krajšem mogočem času, medtem pa ima glavna procesna enota (CPU) še vedno nemoten dostop do podatkov in naslovnega vodila, kadar je to potrebno,
- »sprožen« prenos, pri katerem se podatki prenesejo v paketih, s hitrostjo, ki je tudi določena z neko obliko proženja, običajno pa obe proženji izvirata iz neke naprave zunaj XMEGA, kot je na primer časovnik ali katera od komunikacijskih vrat.
DMA krmilnik je še posebej koristen pri prenosu vsebine znotraj pomnilnika, še posebej takrat, ko je vir ali cilj prenosa 8 megabajtov velik SDRAM. Ker SDRAM potrebuje 23-bitni podatek na naslovnem vodilu, Bascom-AVR prevajalnik pa je omejen na 16-bitni naslovni prostor, zahteva protokol branja in pisanja v SDRAM, da uporabnik uvede razširitev z RAMP naslovnimi registri (RAMPD, RAMPX , RAMPY, RAMPZ) za pravilno SDRAM »stran«, nato pa dostopa do SDRAM z ukazi v zbirniku kot so LDD, STD ali s posrednimi ukazi za premikanje, kot sta na primer LD r, Z ali ST Z, r. Pri uporabi teh ukazov v zbirniku moramo natančno vedeti, katere registre lahko varno uporabljamo in katere moramo prej shraniti na sklad, ker jih uporablja tudi Bascom AVR.
Če vzamemo primer, da želimo prenesti več kot le en bajt v/iz SDRAM pomnilnika, je bolj smiselno nastaviti DMA krmilnik za hiter prenos želenega števila bajtov na relaciji pomnilnik-pomnilnik, ki lahko nato opravi vse to delo namesto nas. V tem primeru tudi niso potrebne zapletene rutine v zbirniku za katere bi bilo potrebno skrbeti, niti ni potrebna skrb za shranjevanje na stek in obnovitev prvotnega stanja registrov, zato bo prenos podatkov veliko hitrejši (če premikamo večje število bajtov).
Primer kode 1 prikazuje del kode za DMA prenos znotraj pomnilnika. V tem primeru smo se prenašajo večje število 512-bytnih sektorjev iz SD kartice v SDRAM velikosti 8 Mbytov, ki se nahaja na ploščici Xplained. Potrebujemo dolgo celoštevilčno spremenljivo Dad, ki hrani ciljni naslov DMA. Ko vsak 512 bajtov velik sektor preberemo v Wave () polje spremenljivk (z Bascom dodatkom AVR-DOS), znova nastavimo DMA krmilnik s config dma stavkom. Za vsako ponovitev zanke, smo spremenljivki Dad, ki hrani ciljni naslov DMA prišteli 512 in za 512 povečali kazalec odmika od osnovnega naslova (celoštevilčna spremenljivka X, tipa long). Morda ste v tem primeru opazili, da ni potrebno preverjati, če je DMA prenos končan, preden začnemo v novi zanki branje naslednjega sektorja. To je mogoče zato, ker je prenos 512 bajtov prek DMA veliko hitrejše od hitrosti, pri kateri lahko AVR-DOS naloži enako število bajtov iz SD kartice.
Uvod v XMEGA AVR mikrokontrolerje (3)
2012_SE197_31