Jste zde

ATMEL AVR AT90S2313

Pokračování seriálu o mikrokontrolérech AVR popisuje další z řady mikroprocesorů ATMEL AVR.

Tentokrát se věnuje typu AT90S2313, popisuje jeho základní vlastnosti a možnosti.

AT90S2313

Stejně jako měl mikroprocesor AT90S1200 svého předchůdce v AT90S1300, měl AT90S2313, jehož blokové schéma můžeme vidět na obr.1, svého předchůdce, a to ne jednoho, ale hned dva: AT90S2212 a AT90S2312. Rozdíl mezi na trh uvedenou verzí a předchůdci je opět v implementovaném nepřímém adresování, přidaných instrukcích pro obsluhu I/O portů a též ve zvětšených interních pamětích RAM a EEPROM. Ke změnám, a to k lepšímu, je nutné také připočítat i softwarovou implementaci zásobníku návratových adres, která odpovídá původnímu návrhu architektury AVR. Důvod, proč je tato implementace důležitá, je ten, že kromě návratových adres se tento zásobník hojně používá pro předávání parametrů do a z podprogramů a realizaci lokálních proměnných v těchto podprogramech. Změna v implementaci zásobníku návratových adres si následně vyžádala též plnou implementaci tří registrů pro nepřímé adresování X (registry R26 a R27), Y (R28 a R29) a Z (registr R30 a R31). Pokud někoho udivilo, že tyto registry jsou tvořeny vlastně dvěma 8bitovými registry, musí si uvědomit, že návrháři se snažili co nejvíce zachovat kompatibilitu s většími mikroprocesory rodiny AVR, které disponují větším adresovým prostorem. Pro adresování paměťového prostoru většího 256 byte, jak každý jistě ví, jsou potřebné minimálně 2 byte. Protože jsou v našem případě indexové registry 16bitové, je maximální velikost jednoho bloku datové paměti 64 kB. Implementace nových, plnohodnotných registrů pro nepřímé adresování, implementace klasického zásobníku návratových adres jsou hlavními důvody zvětšení počtu instrukcí z původních 89, jež byly k dispozici u AT90S1200 na 118. Novými způsoby adresování jsou: přímé adresování (16bitová adresa), nepřímé adresování s ofsetem, nepřímé adresování s predekrementací, nepřímé adresování s postinkrementací.
 

Obr.1 – Blokové schéma mikroprocesoru AT90S2313

Jelikož i úkoly kladené uživateli na tento mikroprocesor jsou složitější, přidali návrháři k perifériím, které měl AT90S1200, další periférie. Takže ve struktuře mikroprocesoru najdeme druhý, multifunkční 16bitový čítač/časovač s možností PWM modulace, režimů „compare“ a „captutre“ a dále pak plně duplexní sériový kanál s vlastním baud-rate generátorem (programovatelná dělička). Pojďme si jednotlivé periférie představit podrobněji.


Obr.2 - Blokové schéma obvodu RESET mikroprocesoru AT90S2313

Obvody RESET

Části, které v předchozí řadě mikroprocesorů řady 89C5x citelně chyběly, byly kvalitní obvody hlídající regulérní běh programu a zajišťující správný náběh mikroprocesoru při zapnutí napájecího napětí. Blokové schéma nového, komplexního obvodu RESET můžeme vidět na obr.2. Přesto, že je tento obvod poměrně dokonalý, citelně tu schází obvod „Brown-out“, který reaguje na krátkodobé poklesy napájecího napětí pod přípustnou mez. V případě, že je nutná ochrana před krátkodobými poklesy napájecího napětí (zvláště u bateriově napájených zařízení), nezbývá konstruktérovi nic jiného než použít externí obvod, jak ostatně k tomu nabádá i sám výrobce.
 

Obr.3 - Blokové schéma obvodu Watchdog

Další částí, která „hlídá“ regulérní běh programu, je obvod typu „Watchdog“.Jedná se o spojení RC oscilátoru s kmitočtem 1MHz a děličky s nastavitelným dělícím poměrem (obr.3). Díky nastavitelné děličce si můžeme vybrat pro danou aplikaci nejvhodnější dobu cyklu obvodu „Watchdog“. Při nastavování nejvhodnější periody je nutné si však dát pozor na to, že oscilátor je typu RC a je především citlivý na změnu napájecího napětí, což ostatně můžeme vidět na obr.4.


Obr.4 - Závislost kmitočtu interního RC oscilátoru na napájecím napětí

Obvody čítačů/časovačů

Protože aplikace kladou na mikroprocesory mnohdy náročné úkoly, není možno dělat vše programově. Proto najdeme na vlastních čipech periférie, které nám pomáhají při realizaci programového vybavení. Základními perifériemi jsou čítače/časovače. Mikroprocesor AT90S2313 má celkem dva čítače/časovače, z toho jeden je 8bitový, druhý 16bitový. Oběma těmto čítačům časovačům je předřazena samostatná předdělička, která umožňuje výběr vhodného kmitočtu pro daný účel. Blokové schéma obou předděliček můžeme vidět na obr.5.
 

Obr.5 - Blokové schéma předděliček čítačů/časovačů

Z něho můžeme vidět, že možnosti volby vstupního signálu pro vlastní čítače jsou poměrně bohaté, neboť si můžeme vybrat z celkem 8 různých zdrojů signálu. Prvních 5 možností se váže k internímu systémovému kmitočtu. Čítače mohou čítat buď přímo systémový kmitočet či kmitočet 8x, 64x, 256x či 1024x nižší. Další dvě možnosti zahrnují možnost čítat periody externího signálu přivedeného na piny T0 nebo T1. U těchto signálů si je možno vybrat vhodnou hranu signálu, která bude interní čítač inkrementovat. Toto je umožněno výběrem buď přímého externího signálu, nebo signálu invertovaného. Poslední možností je příslušný čítač zastavit tím, že na jeho vstup přivedeme signál log.0. Z hlediska možnosti volby signálů jsou si oba interní čítače/časovače rovnocenné. Ale jak už bylo řečeno, první z nich je 8bitový (counter/timer 0) a druhý (counter/timer 1) je 16bitový. Pojďme si představit nejdříve ten jednodušší, tj. 8bitový čítač/časovač 0. Blokové schéma tohoto čítače/časovače můžeme vidět na obr.6.


Obr.6 - Blokové schéma čítače/časovače 0

Z tohoto blokového schématu pozorný čtenář může na první pohled vidět, že tento čítač/časovač se hodí pouze pro jednoduché úkoly, neboť se v podstatě jedná o volně běžící čítač, který je schopen nanejvýše generovat přerušení při přetečení. Takovýto čítač/časovač je vhodný např. pro generování reálného systémového času. Na závěr bych rád upozornil, že pokud použijeme jako zdroj taktovacího kmitočtu externí zdroj, NESMÍ být jeho kmitočet vyšší než jedna polovina systémového kmitočtu. Výrobce sám doporučuje, aby systémový kmitočet byl nejméně 2,5x větší než čítaný externí kmitočet. Důvodem tohoto omezení je vnitřní synchronizace vnějšího signálu s vnitřním systémovým taktem. Jelikož se externí signál testuje 1x za jednu periodu kmitočtu systémového, přesněji jeho vzestupnou hranou, je maximální kmitočet externího signálu omezen na 1 kmitočtu systémového.

Na složitější úkoly musí být použit čítač/časovač 1. Jeho blokové schéma můžeme vidět na obr.7. Už z tohoto schématu je možné tušit, že možnosti budou bohaté. Je ho možno využít jako klasický 16bitový čítač/časovač, jednak jako 16bitovou jednotku compare/capture. Poslední funkcí, kterou je schopna tato jednotka plnit, je generování signálu pomocí pulzně-šířkové modulace (PWM). Pojďme si představit jednotlivé režimy trochu detailněji.


Obr.7 – Blokové schéma čítače/časovače 1

V režimu čítače/časovače je chování totožné s čítačem/časovačem 0 s tím rozdílem, že je čítač/časovač 1 16bitový. V případě, že je čítán externí signál, musí být doba mezi dvěma změnami tohoto signálu minimálně rovna nebo větší jedné periodě hodinového signálu mikroprocesoru. Jinými slovy to znamená, že maximální měřený kmitočet externího signálu může být maximálně 1/2 fCPU, a to v případě střídy přesně 1:1.

Druhou funkcí, kterou může zmiňovaný blok vykonávat, je porovnávání obsahu čítače s obsahem registru „Output Compare Register“. V momentu dosažení je generováno přerušení (pokud je povoleno). Volitelně lze nastavit, že v momentu shody se má registr čítače/časovače 1 vynulovat. (tzv. zkrácení cyklu čítače).

Třetí funkcí, kterou můžeme využít, je zachycení stavu čítače , resp. jeho hodnoty, v momentu, kdy se změní stav vstupního pinu ICP do aktivní úrovně. V tento moment je zapsán stav registru čítače/časovače do registru „Input Capture Register“. Zajímavou funkcí, kterou může uživatel použít v situaci, kdy vstupní signál je zarušen, je filtrování vstupního signálu tak, že za správný stav se považuje situace, kdy všechny čtyři vzorky stavu na vstupním pinu ICP mají shodnou hodnotu. Rychlost vzorkování stavu je ekvivalentní systémovému kmitočtu mikroprocesoru.

Čtvrtou funkcí, kterou může tento blok plnit, je generování signálu PWM. V tomto případě čítač/časovač 1 pracuje jako vzestupný/sestupný čítač, kdy nejdříve čítá vzestupně, po dosažení hodnoty TOP pak čítá sestupně. Hodnoty TOP nám podmiňují jednak rozlišení PWM, jednak frekvenci opakování. Vztah mezi těmito veličinami můžeme vidět v tab.1. Návrháři mysleli i na takové detaily jako možný výskyt nekorektních stavů při generování signálu PWM a vybavili mikroprocesor záchytným registrem, který drží novou hodnotu pro generování PWM do doby, než čítač dosáhne hodnoty TOP. Teprve při dosažení hodnoty TOP dochází k aktualizaci registru. Tímto jednoduchým způsobem je zabezpečeno generování signálu PWM bez chybových stavů. Další vlastností použitého způsobu generování signálu PWM je jeho „centrování“ okolo okamžiku dosažení hodnoty TOP. Signál PWM generovaný tímto blokem je vyveden na pin mikroprocesoru OC1 (PB3).

  PWM Resolution  
  Timer TOP Value  
  Frekvency  
8-bit
0x00FF
fTC1/510
9-bit
0x01FF
fTC1/1022
10-bit
0x03FF
fTC1/2046
Tab. 1 - Hodnoty TOP a frekvence PWM versus rozlišení PWM

Obsluha 16bitových registrů

V souvislosti s obsluhou 16bitových registrů si pozorný čtenář si jistě klade otázku jak zapsat či přečíst obsah tohoto 16bitového registru tak, aby nevznikla možnost chybného čtení, neboť, pokud např.běží čítač a přečtu jeho nižší byte, nemám zaručeno, že nedojde ke změně vyššího byte dříve, než dojde k jeho přečtení. Jinými slovy hodnota vyššího byte by již nepatřila k hodnotě nižšího byte. Na toto návrháři pamatovali a vybavili vyšší byte 16bitových registrů záchytným (pomocným) 8bitovým registrem TEMP. Pokud budu postupovat při čtení tak, jak bylo uvedeno výše, dojde při čtení nižšího byte čítače/časovače ve stejný okamžik k zachycení okamžitého stavu vyššího byte čítače/časovače do záchytného registru, takže následné čtení vyššího byte přečte hodnotu ne z registru čítače/časovače, ale z jeho záchytného registru. Postup při zápisu 16bitové hodnoty je přesně opačný. Nejdříve je nutné zapsat hodnotu vyššího byte, přičemž tato hodnota se nezapíše přímo do příslušného registru, ale do záchytného (pomocného) registru. Při následném zápisu hodnoty do nižšího byte 16bitového registru dojde ve shodný okamžik k zapsání zachycené hodnoty ze záchytného registru do vyššího byte registru. Při obsluze těchto 16bitových registrů nesmíme zapomenout na to, že záchytný registr nemá každý registr samostatný, ale registry sdílí společný registr. Proto výrobce upozorňuje na situace, kdy hlavní program manipuluje s obsahem tohoto registru a není zakázáno přerušení od periférie, která může vyžadovat manipulaci se 16bitovým registrem. Je samozřejmé, že když v hlavním programu naplníme pomocný registr nějakou hodnotou, bude tato původní hodnota znehodnocena při obsluze jiného 16bitového registru během přerušení. Po návratu do hlavního programu se tedy v pomocném registru bude nacházet nekorektní hodnota. Protože hledání takovéto chyby je vždy velmi obtížné, dovolil jsem si na tuto možnost takto upozornit.

Jen pro zajímavost uveďme, že stejný princip přístupu k registrům s šířkou větší než 8 bitů použila firma Microchip u svých mikrokontrolérů řady PIC.

Sériový port

Poslední periférií, kterou najdeme na čipu AT900S2313, je plně duplexní sériový kanál (port). Díky vlastnímu generátoru přenosových rychlostí (baud-rate generator) nepřijde uživatel o žádný čítač/časovač, jako tomu bylo např.v případě mikroprocesorů řady AT89C5x. Vstupním kmitočtem pro generátor je přímo hodinový takt oscilátoru, což je též velkou výhodou, a umožňuje to uživateli používat vysokých přenosových rychlostí i s relativně nízkým hodinovým kmitočtem. Pro ilustraci uveďme, že i s krystalem o kmitočtu pouhých 1,8432MHz zvládne mikroprocesor komunikaci v rozmezí 24000Bd až 115200Bd vyjma rychlosti 76800Bd, tedy v podstatě jako klasický obvod 82C50 známý z prvních PC. Že to se sériovou komunikací u této řady mikroprocesorů výrobce myslí vážně, můžeme poznat z toho, že schopnosti sériového portu byly rozšířeny o detekce chybových stavů „over-run“, „frame-error“ a „false start bit“. Na přijímací straně byl na vstupu přidán obvod zvyšující odolnost komunikace vůči rušení („noise filtering“). Pro snadnou a rychlou obsluhu tohoto sériového portu vybavili návrháři mikroprocesor celkem třemi samostatnými vektory přerušení (Rx Complete, Tx Complete, Tx data register empty). Bohužel není v možnostech tohoto článku detailně popsat toto rozhraní, neboť jeho detailní popis zabírá v originálním datasheetu cca 7 stran. Pro lepší představu si uveďme alespoň celková bloková schémata obou částí sériového portu (obr.9 a obr.10).
 

Obr. 9 - Celkové blokové schéma vysílače sériového kanálu
 

Obr. 10 - Celkové blokové schéma přijímače sériového kanálu

Ostatní vlastnosti

Z dalších vlastností či parametrů, které nebyly výše vzpomenuty, jmenujme paměť programu, která má velikost 2kB s organizací 1k x 16 bitů a dva vstupy externího přerušení. Jelikož je maximální hodinový kmitočet až 10 MHz , a to v rozmezí napájecího napětí 4 V až 6 V, je schopen mikroprocesor dosáhnout špičkového výkonu až 10MIPS. Pro aplikace vyžadující nízkou spotřebu může být mikroprocesor provozován s napájecím napětím pouze 2,7 V. Při napájecím napětí 3 V je mikroprocesor schopen pracovat na frekvenci 4 MHz při typické spotřebě 2,8 mA. V režimu „stand-by“, kdy jsou zachovány funkce periférií, odebírá mikroprocesor méně než 0,8 mA. V režimu „power-down“ (režim „spánku“), kdy je zachován obsah paměti dat, odebírá méně než 1 uA. Z obou úsporných režimů lze mikroprocesor „vzbudit“ mimo signálem Reset též dvěma signály externího přerušení (pokud jsou povoleny). Posledním, ale z hlediska konstruktéra též důležitým, parametrem je proudová zatížitelnost výstupních portů mikroprocesoru. Maximální proud jednotlivého bitu výstupního portu může být až 20 mA (sink), což umožňuje přímé buzení diod LED či LED displejů. Bohužel výstupy však nejsou schopny dodávat velký proud, typicky jen 3 mA, neboť výstup není typu push-pull.

Závěrem

Jak je z výše uvedeného vidět, je představený mikroprocesor AT90S2313 prvním zástupcem řady AVR, který má implementovány všechny instrukce podílející se na vysokém výkonu mikroprocesorů rodiny AVR, přičemž výsledný kód programu je velmi kompaktní, a to i při překladu z jazyka C. Vzhledem k vlastnostem najde uplatnění tento mikroprocesor svoje místo např. v aplikacích, kde AT89C2051 již nestačí svým výkonem či kde konstruktérovi schází u AT89C2051 modul PWM.

I když nemám srovnávání mikroprocesorů či mikrokontrolérů různých výrobců rád, neodpustím si upozornit na existenci poměrně rozsáhlého a dobře řešeného přerušovacího systému. Na rozdíl od mikrokontrolérů firmy Microchip, které disponují pouze jedním přerušovacím vektorem společným všem perifériím, jsou mikroprocesory firmy ATMEL vybaveny daleko lépe. Rozhodnutí, zda existence či neexistence bohatšího přerušovacího systému i u takto malých mikrokontrolérů/mikroprocesorů je opravdu výhoda či stojí za to ušetřit „pár centů“ a ponechat nutnost detekce periférie žádající o obsluhu na programu, nechávám na čtenáři.

Jiří KOPELENT
jiri.kopelent@ gme.cz

DOWNLOAD & Odkazy

Hodnocení článku: