20110925

AVR Assembler-01: Ponor k 0.000000125 sekundové informaci

Ve škole jsme se konečně dostali k předmětu MIT (ne, to opravdu není zkratka pro Massachusetts Institute of Technology , ale pro cosi s mikrokontrolérama) a já měl tedy pořádný důvod začít s assemblerem. Tak se podíváme, co tu máme.

Trocha nudného kontextu

Před několika lety jsem si koupil hromadu čipů typu 74LS393 , což jsou dvě 4-bitová binární počítadla v jednom DIP-14 pouzdře a chtěl jsem si postavit legendární binární hodiny z ThinkGeek.com. Když mi po čase vzniklo klubko chaosu na breadboardu, které namísto původně očekávaného výstupu v BCD kódovaných hodin rozsvítilo psychedelicky pulzující LED diody připojené k drátkům, trčícím z toho klubka, rozhodl jsem se vydat se jiným směrem. Naštěstí jsem v té době četl server Soom.cz, kde mi článek Seznámení s jednočipy ukázal cestu, kterou jsem se následně vydal. Po pročtení prvních pár kapitol "seriálu" Microcontrollers in Automatic Control Classes jsem si připadal už natolik způsobilý, že jsem se rozhodl posunout o krok dál.
Přesvědčen, že vše bude fungovat tak jak má (neboť v článku Atmel AVR - Světelní hadi a Vzdušný displej ze serveru danyk.wz.cz vše fungovalo jak mělo), koupil jsem si ze serveru TME.cz hromadu ATmega16, pár ATtiny13 a ATtiny25 a jal se stavět programátor.
Když se mi podařilo dostat se k uživatelsky přívětivému LPT kabelu s plastovým krytem drátování, vyvedl jsem si z něj hezké drátky k přípojení čipu. Ale cosi se pokazilo a čip skončil zničený. Poté jsem si vypůjčil ještě speciální ParProg-R, se kterým jsem ale také kýženého výsledku nedobral. Buď jsem nešikovný, nebo je něco špatně.
Skončil jsem tedy s těmito "domácími" pokusy a rozhodl si koupit ATSTK500. To je deska od Atmelu, na které jsou připravené patice pro snad všechny jejich čipy, dále je tam 8 buttonů a 8 LED diod, piny přímo připojené k pinům připojeného čipu, několik dalších pomocných pinů a hlavně ještě jeden čip přímo na sobě, který se stará o převod RS232 rozhraní (tedy sériového portu, přes který se ATSTK500 připojuje) na programovací a debugovací instrukce, které mohou být posílány právě připojenému čipu - tedy čip může být deskou velmi pohodlně naprogramován. Než mi ale tahle magická deska přijde, pojďme rozebrat trochu teorii.

ATmega16

Představme si, že nám na stole leží tento čip. Je docela velký, má 40 nožiček a jenom tak sám o sobě není vlastně k ničemu. Existuje ale způsob, jak ho přimět dělat, co mu poručíme. Nejprve ale vlastně musíme pochopit, co se odehrává uvnitř této černé krabičky. Přímo na stránkách Atmelu jsou dostupné dva pro nás velmi důležité dokumenty, a to ATmega16 Datasheet (Summary - zkrácená verze) a AVR Instruction Set Manual - výpis všech instrukcí, které Atmel ve svých čipech používá - ze kterých budu čerpat většinu mouder a vědomostí.
Při pohledu z venku si čip můžeme představit asi takto:
ATmega16 Datasheet: Figure 1. Pinout ATmega16
Vidíme na první pohled jednoznačné piny, jako napájecí VCC a GND, dále třeba RESET, ale o významu ostatních pinů můžeme jen spekulovat. Nebo se můžeme podívat do datasheetu a zjistit zajímavé věci.
Piny na obrázku označené jako PA0-PA7,PB,PC a PD jsou vstupní/výstupní piny (to, jestli budou vstupní nebo výstupní můžeme určit přímo v našem programu, ale o tom později), skrze které může program uvnitř čipu komunikovat se světem. Kromě tohoto účelu mají ještě jiné, speciální významy (které jsou uvedeny v závorce), jako například připojení programátoru (obvodu starajícího se o nahrání programu do čipu), A/D převod, ... Hromada věcí, toho ještě bude.
XTAL piny jsou zde pro připojení externího oscilátoru, jako je třeba krystal, který čipu poskytuje přesnější časování, než jakého by dosáhl za použití svého vlastního vestavěného oscilátoru. Důležitý je ale fakt, že čip vnější krystal nepotřebuje, že může běžet čistě na svůj vlastní krystal.
Další piny jako AREF, AVCC a podobně slouží jako všerůzné referenční piny pro A/D převodník.

Další pohled, kterým se můžeme na náš čip podívat, by byl asi "zevnitř":
ATmega16 Datasheet: Figure 2. Block Diagram
Toto je už trochu složitější, ale jednoho dne přijde okamžik, kdy tento diagram pochopíte i vy. Nejjednodušeji řečeno je to diagram, který ukazuje, jak jsou jednotlivé části ATmega16 uvnitř pospojovány a jak si mezi sebou mohou povídat. Jednotlivé části mají své specifické významy, funkce a principy. Například "General Purpose Registers" společně s X, Y a Z jsou místa v SRAM (ačkoliv na diagramu jsou nakresleny zvlášť), která jsou přímo "připojena" k ALU - jednotce pro výpočty, která může na náš popud (assemblerová instrukce) mezi dvěma registry provést matematickou či logickou operaci a výsledek do jednoho z těch registrů uložit. Tyto informace nám budou užitečné, až budeme navrhovat program, který bude ke všem těmto částem čipu přistupovat. Pro teď postačí, když budete vědět, že uvnitř ATmega16 jsou části, které si mezi sebou povídají přímo, dále části, které si povídají prostřednictvím něčeho, třeba jiné části a nakonec tu jsou mezi sebou zcela nesouvisející části, které budeme muset poslepovat vhodně navrženými algoritmy.

AVR Studio

Teď nás tohle všechno ale nemusí moc zajímat, neboť mým cílem pro tento díl není znovu sem přepisovat datasheety (které byste si tedy měli alespoň prolistovat, když už nic jiného), ale dovést vás k nainstalování prográmku AVR Studio 4 (AVR Studio 5 je podle mě už moc nové a nepřehledné, ale je to na vás. Já zde budu používat čtyřku) a ukázat vám moc.
AVR Studio 4 je vývojové prostředí s těmito funkcemi:

  • Spravuje projekty, čímž drží pohromadě související soubory
  • Přímo komunikuje s programátory a In-System-Debuggery, čímž usnadňuje nahrávání vyvinutého kódu do čipu
  • Simuluje - nejdůležitější vlastnost, protože umožňuje sledovat průběh programu po jednotlivých instrukcích
Běžící simulace: smyčka na ATmega16 s výstupem na PinA
Tady je příklad, co můžeme simulovat. Aby bylo jasno o co jde: V tom černém okénku je kód, který jsem napsal (byl to domácí úkol), ale stejně tak by tam mohl být i váš kód. Po levé straně je výpis procesorových proměnných a registrů a po pravé straně jsou rozbaleny detaily PORTA. V kódu jsou žluté instrukce, což jsou vlastně nejmenší příkazy procesoru. Zajímavé je, že při frekvenci procesoru 4MHz trvá vykonání jedné instrukce 0.25μs (= 1 [-] / 4E6 [Hz=s^-1])! To je něco úžasného, protože za 1s čip vykoná 4 milióny instrukcí. Ještě krásnější číslo pak získáme, když frekvenci zvýšíme na celých 8MHz, což by měl být pro ATmega16 horní limit.
Co se instrukcí týče, detailně je popisuje již jednou zmíněný AVR Instruction Set Manual, ve kterém je souhrn všech instrukcí se základním naznačením, co instrukce dělá a poté je každé jednotlivé instrukci věnována přinejmenším celá další stránka.

Závěr

A co se dneška týče, všimněte si, že v pravé části okna jaksi "přeblikávají" černé a bílé čtverečky. Každý čtvereček je jeden konkrétní bit s konkrétním významem. O významech vám povím v některém z příštích dílů, ale konkrétně o PORTA vám povím hned. Jeden bit v tomto registru odpovídá jedné nožičce (bit0 (LSB- Least Significant Bit - Nejméně významný bit - úplně vpravo) = PA0 = 40. nožička) a zapíšeme-li na tento bit 1, tak v dalším cyklu můžeme na nožičce měřit napětí označené jako logická 1. Kdyby například k nožičce byla nějak přes transistor připojena LEDka, tak by se rozsvítila, když by na bitu odpovídajícímu té nožičce byla nastavena 1. Místo černobílých kostiček si tedy můžete představit LEDky, přičemž černá=svítí a bílá=nesvítí.
Aby nedošlo k nedorozumění, tak tento program, který v AVR studiu simulujeme, bychom nejprve museli nahrát do reálného čipu, abychom k němu mohli připojovat nějaké diody. Dokud jsme ale jen v AVR studiu, naším jediným výstupem mohou být jen a pouze bílé/černé čtverečky (a ještě STIMULUS soubory, ale o nich zase někdy jindy), ze kterých si můžeme stav diod odvozovat

A když si celý tento díl přečtete znovu, uvidíte, jak to do sebe vše hezky zapadá. A pokud to nevidíte, zeptejte se v komentářích.

Do příště mi snad už dorazí ATSTK500, takže bych mohl ukázat vše, o čem jsem dnes mluvil, na reálných příkladech.

Žádné komentáře:

Okomentovat