Programování MK od nuly. Programování AVR.

Já jsem jednou ani dva říkají, že studium MK by mělo být zahájeno s assemblerem. To bylo věnováno celý kurz na místě (ačkoli to není příliš konzistentní, ale postupně jsem ho česal s odpovídajícím typem). Ano, je to těžké, výsledek nebude první den, ale naučíte se pochopit, co se děje ve vašem regulátoru. Budete vědět, jak to funguje, a ne na opice kopírovat zdroje jiných lidí a snaží se pochopit, proč náhle přestal pracovat. Kromě toho je SI mnohem snazší předjíždět uprostřed lodi, která vyjde s vidličkou v nejvíce inopportune momentu.

Bohužel, každý chce tento výsledek okamžitě. Proto jsem se rozhodl jít na druhou stranu - aby školení na SI, ale s výstavou svého spodního prádla. Dobrý programátor-balder vždy drží jeho kus železa pro squall, aniž by jí dal krok k krokovi bez svolení. Tak to bude na začátku SO Code, pak to, co se narodilo kompilátor a jak to skutečně funguje :)

Na druhé straně, Si silná strana Toto je kód přenosnosti. Pokud samozřejmě vnímáte vše správně. Oddělení pracovních algoritmů a jejich implementace železa v různých částech projektu. Potom přenést algoritmus do jiného MK, stačí přepsat pouze vrstvu rozhraní, kde je zapsáno všechny odvolání na žlázu, a nechat celý pracovní kód, jak je. A samozřejmě čitelnost. Zdrojem Sash zdroj je snazší pochopit na první pohled (i když. S touto momenty budu také věnovat pozornost.

Jako vedení hardwaru, na kterém bude lví podíl všech příkladů můj poplatek ladění.

První program na C pro AVR

Výběr kompilátoru a instalace prostředí
Pro AVR existuje mnoho různých kompilátorů C:
Nejprve to IAR AVR C. - téměř jedinečně uznávaný jako nejlepší kompilátor pro AVR, protože Samotný regulátor byl vytvořen blízkým spolupracovníkem Atmel a specialistů z IAR. Ale pro všechno, co musíte zaplatit. A tento kompilátor nestačí k tomu, co je drahý komerční software, má také takovou snídani, která jen přijme a zkompiluje v něm by měla být spěchána. Opravdu jsem neměl přátelství s ním, projekt byl opilý na podivných chybách na fázi vazby (později zjistil, že to byla křivka trhliny).

Druhý přichází WinAVR GCC. - Výkonný optimalizační kompilátor. Otevře se, cross-platforma, obecně, všechny radosti života. On také dokonale integruje v avr studiu, který vám umožní ladění přímo tam, že peklo je pohodlné. Obecně jsem si to vybral.

Také tam je Codevision AVR C.- Velmi populární kompilátor. Stal se populárním v souvislosti s jeho jednoduchostí. Pracovní program Můžete se dostat do něj během několika minut - mistr startovního kódu je velmi povýšen, razítko inicializace všech druhů uší. Upřímně řečeno, je mi líto s podezřením na něj - nějak jsem musel rozebírat prog napsaný tímto kompilátorem, nějakým způsobem, ale ne kód byl získán. Hrozné množství zbytečných televizorů a operací, které se nalije do mírných kódů a pomalou rychlostí. Možná však byla chyba v DNA napsal původní firmware. Navíc chce peníze. Není moc jako IAR, ale patrné. A v Demozhim dává ne více než 2kb kód.
Crack Samozřejmě je, ale pokud ukradnete, tak milion, ve smyslu IAR :)

Tam je také Obrázek Craft AVR C a Microc. z mikroelektroniky. Ani používat žádné jiné použití, ale zde SWG. Velmi orba Micropascal.Melt je strašně pohodlné programovací prostředí a knihovna. Myslím, že Microck nebude horší, ale také zaplaceno.

Jak jsem řekl, vybrat si Winavr. Ze tří důvodů: Zdarma, je integrována do AVR Studio a je zapsána jednoduše rozpadem hotového kódu pro všechny příležitosti.

Takže si stáhněte nainstalovat Studio WinAVR C a AVR. Pak se studio nejprve dává, pak, shora, WinAVR se koná a lpí do studia ve formě pluginu. Důrazně doporučuji instalovat WinAVR na krátkou cestu, něco jako C: Winavr tím, čímž se vyhnout hromadám problémů se způsoby.

Vytvoření projektu
Takže studio je dodáno, SI je upevněn, je čas vyzkoušet něco k programu. Začněme s jednoduchým, nejjednodušším. Spusťte studio, vyberte si tam nový projekt, jako kompilátor AVR GCC a zadejte název projektu.

Otevře pracovní pole s prázdným souborem * .c.

Nyní nebrání konfiguraci zobrazení cest ve studiu záložek. Za tímto účelem na:
Nabídka Nástroje - Možnosti - Obecné - FiletaBs a vyberte v rozevíracím seznamu "pouze název souboru". V opačném případě nebude možné pracovat - na kartě bude úplná cesta souboru a nebude na obrazovce ne více než dvě karty.

Nastavení projektu
Obecně platí, že vytvoření provedeného souboru, ve kterém budou všechny závislosti popsáno. A to je pravděpodobně správné. Ale vyrostl jsem na plně integrovaném IDE uvision. nebo AVR studio. Tento přístup je hluboce cizinec. Proto budu dělat svým vlastním způsobem, všechna studia.

Hromadu do tlačítka s převodovkou.


Toto jsou nastavení projektu, nebo spíše nastavení automatické generace souboru. Na první stránce stačí zadat frekvenci, na kterou bude MK fungovat. Záleží na pojistkách bitů, takže věříme, že frekvence je 8000000GZ.
Také věnujte pozornost řetězci optimalizace. Teď je zde optimalizace velikosti. Zatímco odejde, jak je, pak se můžete pokusit hrát s tímto parametrem. -O0 je vůbec odnímatelná optimalizace.

Dalším krokem je konfigurace cest. První věc, kterou chcete přidat adresář vašeho projektu, je - vložíte zde knihovnu třetích stran. Seznam se zobrazí ". \\"

Proveďte generovaný soubor, můžete jej vidět ve výchozí složce ve vašem projektu, stačí běžet oči, podívejte se, co je tam.


To je vše. Jim všude OK a jděte na zdroj.

Formulace problému
Prázdný list je tak zamával, aby ztělesňoval nějaký složitý nápad, protože banální blikání diody nevkládá. Pojďme okamžitě vzít býk pro rohy a implementovat spojení s počítačem - to je první věc, kterou dělám.

Bude to fungovat takto:
Pod příjezdem COM portu se jednotka (kód 0x31) rozsvítí diodikum a když je příchod nuly (kód 0x30) zhasne. Kromě toho se vše bude provedeno na přerušení a úloha pozadí bude blikat další diodu. Jednoduše a smyslu.

Sbírejte schéma
Musíme připojit modul konvertoru USB-usart s měničem Microcontroller USART. Chcete-li to udělat, vezměte jumper dvou vedení a položte kříž do kolíků kříže. To znamená, že regulátor RX se připojuje k převodníku TX a konvertor TX s regulátorem RX.

To se ukázalo, že je to takový režim:


Spojení dalších závěrů, výživy, výboje, je to standard

Píšeme kód

Okamžitě proveďte rezervaci, kterou nebudu speciálně prohloubit v popisu samotného jazyka SI. Za tímto účelem je prostě obrovské množství materiálu, od klasicsu "programovací jazyk SI" od K & R a končící různými technikami.

Jeden taková metoda byla nalezena ve mně v plástev, jakmile jsem na něm studoval tento jazyk. Tam je vše stručné, srozumitelné a v případě. Postupně jsem to udělal a přeskupil se na mé stránky.

Není opravdu ne všechna kapitola odložena, ale myslím, že to není dlouho.

Je nepravděpodobné, že budu popsat lépe, tak z výcvikového kurzu, místo podrobné expozice modrých jemností, budu jednoduše přímé vazby na určité stránky této techniky.

Přidejte knihovny.
Za prvé, přidáme potřebné knihovny a tituly s definicemi. Konec konců, SI je univerzální jazyk a musí vysvětlit, že pracujeme s AVR, takže vstupte do zdrojové linie:

1 #Zahrnout.

#Zahrnout.

Tento soubor je ve složce Winavr. A obsahuje popis všech registrů a portů regulátoru. A tam všichni mazaní, s odkazem na konkrétní regulátor, který je přenést kompilátorem udělat Soubor v parametru Mcu. A na základě této proměnné ve vašem projektu je na tomto řadiči soubor záhlaví s popisem adres všech portů a registrů. V tom, jak! Bez ní je také možné, ale pak nebudete moci použít symbolické názvy registrů jako SREG nebo UDR a musí si pamatovat adresu každého jako "0xC1", a to je hlava.

Stejný tým sám #Zahrnout.<имя файла> Umožňuje přidat do svého projektu obsahu libovolného textového souboru, například soubor popisující funkce nebo kus jiného kódu. A tak, aby směrnice mohla najít tento soubor, uváděli jsme způsoby našeho projektu (adresář WinAVR je již napsán tam).

Hlavní funkce.
Program v jazyce SI se skládá z funkcí. Mohou být vloženy a přivedeny od sebe v libovolném pořadí a různými způsoby. Každá funkce má tři požadované parametry:

  • Návratová hodnota, například hřích (x) Vrátí hodnotu X sinusu. Jako v matematice, stručně.
  • Přenesené parametry, stejné X.
  • Funkce těla.

Všechny hodnoty a vrácené hodnoty musí být jakýkoliv typ, v závislosti na datech.

Jakýkoliv program na C musí obsahovat funkci hlavní. Jako bod vstupu do hlavního programu, jinak je nifiga ne Si :). Podle přítomnosti hlavního jiného zdroje někoho jiného z milionu souborů, lze zřejmé, že se jedná o hlavu programu, kde vše začíná. Tak pojďme se zeptat:

1 2 3 4 5 Int hlavní (neplatnost) (návrat 0;)

int hlavní (neplatnost) (návrat 0;)

Všechno, první nejjednodušší program je napsán, nezáleží na tom, že nic neudělá, právě jsme začali.

Budeme analyzovat, co jsme to udělali.
int. Tento typ dat, které hlavní funkce vrátí.

Samozřejmě v mikrokontroléru hlavní. V zásadě nemohu vrátit nic a teoreticky by mělo být void Main (neplatný)Ale GCC je zpočátku naostřena na PC a tam program může vrátit hodnotu operačního systému po dokončení. Proto GCC On. void Main (neplatný) Swearing varování.

To není chyba, bude to fungovat, ale nemám rád kola.

neplatný. Tento typ dat, které v tomto případě vysíláme do funkce hlavní. Také nemůže nic vzít z vnějšku, básník neplatný. - Dummy. Zástrčka je aplikována, pokud není nutné nic vysílat nebo vrátit.

Tyto jsou { } Foto držáky jsou softwarový blok, v tomto případě funkce těla hlavní.Bude kód.

vrátit se. - Jedná se o návratovou hodnotu, kterou hlavní funkcí dá po dokončení, protože jsme int, tj. Číslo, které musíme vrátit číslo. Ačkoli to ještě nedává smysl, protože Na mikrokontroléru z Main, my kromě nikam. Vrátím se nula. Pro nonfig. A kompilátor je obvykle chytrý a kód nevytváří kód.
I když, pokud jste zvrhlíte, pak od hlavní. Můžete jít do MC - například spadat do sekce bootloaderu a naplnit jej, ale je zde již nízkoúrovňová firmware, pro nastavení přechodových adres. Níže uvidíte a pochopíte, jak to udělat. Co? To je další otázka, v 99,999% případů, že tento NAFIG není nutný :)

Učinil, pokračoval dál. Přidejte proměnnou, není pro nás zvlášť nezbytné a není nutné zavést proměnné, ale učíme se. Pokud jsou proměnné přidány v rámci těla funkce - pak jsou lokální a existují pouze v této funkci. Když opustíte funkci, tyto proměnné jsou odstraněny a paměť RAM je dána důležitějším potřebám. .

1 2 3 4 5 6 Int hlavní (neplatný) (nepodepsaný char i; návrat 0;)

int hlavní (neplatný) (nepodepsaný char i; návrat 0;)

nepodepsaný Tak nevyužité. Skutečnost je, že v binárních reprezentaci máme seniorský kousek pro znamení, což znamená v jednom byte (Char) číslo + 127 / -128, ale pokud znaménko vyhodí, je to již od 0 do 255. Obvykle je znamení nepotřebný. Aby nepodepsaný.
i. I. - To je jen název proměnné. Už ne.

Nyní potřebujete inicializovat porty a Uart.. Samozřejmě můžete vzít a připojit knihovnu a zavolat nějaký druh Uartinit (9600); Ale pak nebudete vědět, co se stalo ve skutečnosti.

Děláme to:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 Int hlavní (neplatný) (unsigned char i; #define xtal 8000000L #define baudrate 9600l #Define bauddivider (xtal / (16 * baudrate) -1) #Define Ahoj (x) ((x) \u003e\u003e 8) #define lo (x) ((x) & 0xff) ubrrl \u003d lo (bauddivider); UBRRH \u003d Ahoj (Bauddivider); Ucsra \u003d 0; UCSRB \u003d 1.<< RXEN| 1 << TXEN| 1 << RXCIE| 0 << TXCIE; UCSRC = 1 << URSEL| 1 << UCSZ0| 1 << UCSZ1; }

int hlavní (neplatný) (unsigned char i; #define xtal 8000000L #define baudrate 9600l #define bauddivider (xtal / (16 * baudrate) -1) #define hi (x) ((x) \u003e\u003e 8) #define lo (x) \u003e\u003e 8) #define lo (x)\u003e x) ((x) & 0xff) ubrrl \u003d lo (bauddivider); ubrrh \u003d hi (bauddivider); ucsra \u003d 0; ucsrb \u003d 1<

Děsivý? Ve skutečnosti je skutečný kód zde pouze pět posledních řádků. Všechno, to #Definovat Jedná se o makro-jazykové předprocesor. Téměř stejné vrcholy jako v assembleru, ale syntaxe je poněkud odlišná.

Budou usnadnit vaše rutinní operace pro výpočet nezbytných koeficientů. V prvním řádku to říkáme Xtal. Můžete bezpečně nahradit 80 000 000 a L.- Specifikace typu, Dlouhý nákupní centrum jsou frekvence hodin procesoru. Stejný přenosová rychlost. - Frekvence dat pomocí UART.

bauddivider. Již složitější, exprese vypočtená vzorcem dvou předchozích předchozích předchozích budou nahrazeny místo.
Dobře a HLE a AHOJ Z tohoto výsledku bude mít mladší a senior bajty, protože V jednom bajtu jasně nesmí fit. V AHOJ SHIFT ICSE se provádí (vstupní parametr makra) osmkrát vpravo, v důsledku toho zůstane pouze nejstarší bajt. A B. HLE Děláme dávku a s číslem 00FF, v důsledku toho zůstane jen nejmladší bajt.

Takže vše, co se děje jako #Definovat Můžete bezpečně vyhodit a požadovaná čísla počítat s kalkulačkou a okamžitě je zadejte do UBBRL \u003d řádky. a Ubbrh \u003d ... ..

Umět. Ale! Udělej tohle Je to kategoricky nemožné!

Bude také pracovat na práci, ale budete mít tzv. kouzelná čísla - hodnoty přijaté nepochopitelně od místa, kde není jasné, proč a pokud tento projekt darujete za pár let, je těžké pochopit, že to bude sakra. Ano, a teď, chcete změnit rychlost, nebo změnit frekvenci křemene a vše bude muset přepočítat, a tak změnil několik tsiferok v kódu a vše sám. Obecně platí, že pokud nechcete užívat Bydlokoder, pak proveďte kód tak, aby bylo snadné číst, bylo pochopitelné a snadno modifikované.

Pak je vše jednoduché:
Všechny tyto "UBRRL a CO" jsou registry konfigurace vysílače, s nimiž budeme komunikovat se světem. A teď jsme přidělili potřebné hodnoty konfigurací požadované rychlosti a správného režimu.

Zobrazení záznamu 1< Znamená následující: Take 1 a vložte jej Rxen. V létě. Rxen. Toto je 4. bit rejstříku UCSRB., aby 1< tvoří binární číslo 00010000, Txen. - to je 3. bit a 1< Dast 00001000. Single "| Je to rozbité NEBOSO 00010000 | 00001000 \u003d 00011000. Zbývající nezbytné konfigurační bity jsou vystaveny stejným způsobem a přidány do všeobecné partie. V důsledku toho je číslo sestavení napsáno v UCSRB. Podrobnosti jsou napsány v datovém datu na MC v části USArt. Takže se nedostávají rozptylovat technickými detaily.

Je čas vidět, co se stalo. Pipy na kompilaci a spuštění emulace (Ctrl + F7).

Ladění
Všechny druhy pokrokových pruhů běžely, studio se změnilo a v blízkosti hlavní funkce se objevila žlutá šipka. To je místo, kde je procesor aktuálně aktuální a simulace na pauzu.

Skutečnost je, že zpočátku, ve skutečnosti stála na řádku UBRRL \u003d LO (BAUDDIVIDER); Koneckonců, skutečnost, že máme definovat, není kód, ale jednoduše předběžné výpočty, pak simulátor trochu upevnil. Ale teď si uvědomil, první instrukce je dokončena a pokud vylezete na strom I / O pohled, V části USArt a vyhrát tam na Ubbrl byte, uvidíte, že už tam už tam je! 0x33.

Ještě jeden krok. Při pohledu na to, jak obsah jiného registru se změní. Takže je všechny pojistky, věnujte pozornost tomu, že všechny uvedené bity jsou vystaveny, jak jsem řekl, a je nastaven najednou pro celý bajt. Další návrat nefunguje, program je u konce.

Otevírací
Nyní resetujte simulaci v nulu. Klikněte tam Reset (Shift + F5). Otevřete seznam demontáží, nyní uvidíte, co se stane v regulátoru ve skutečnosti. Zobrazit -\u003e Disassembler. A ne Yyaaaa !!! Assembler !!! Uzhos !!! Ale musíš. Takže později, když se něco pokazí, neodvážilo se do kódu, a nepožádal se Lamer problémy na fórech, a okamžitě vyšplhal do ztráty a sledoval, kde máte stánek. Není tam nic strašného.

Za prvé, bude to vrchol seriálu:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 +00000000: 940C002A JMP 0x0000002A skok 00000002: 940C0034 JMP 0x00000034 skok 00000004: 940C0034 JMP 0x00000034 skok 00000006: 940C0034 JMP 0x00000034 skok 00000008: 940C0034 JMP 0x00000034 skok + 0000000A: 940C0034 JMP 0x00000034 skok + 0000000C: 940C0034 JMP 0x00000034 skok + 0000000E: 940C0034 JMP 0x00000034 skok 00000010: 940C0034 JMP 0x00000034 skok 00000012: 940C0034 JMP 0x00000034 skok 00000014: 940C0034 JMP 0x00000034 skok 00000016: 940C0034 JMP 0x00000034 skok 00000018: 940C0034 JMP 0x00000034 skok + 0000001A: 940C0034 JMP 0x00000034 skok + 0000001C : 940C0034 JMP 0x00000034 skok + 0000001E: 940C0034 JMP 0x00000034 skok 00000020: 940C0034 JMP 0x00000034 skok 00000022: 940C0034 JMP 0x00000034 skok 00000024: 940C0034 JMP 0x00000034 skok 00000026: 940C0034 JMP 0x00000034 skok 00000028: 940C0034 JMP 0x00000034 skok

00000000: 940C002A JMP 0x0000002A skok 00000002: 940C0034 JMP 0x00000034 skok 00000004: 940C0034 JMP 0x00000034 skok 00000006: 940C0034 JMP 0x00000034 skok 00000008: 940C0034 JMP 0x00000034 skok + 0000000A: 940C0034 JMP 0x00000034 skok + 0000000C: 940C0034 JMP 0x00000034 skok + 0000000E : 940C0034 JMP 0x00000034 skok 00000010: 940C0034 JMP 0x00000034 skok 00000012: 940C0034 JMP 0x00000034 skok 00000014: 940C0034 JMP 0x00000034 skok 00000016: 940C0034 JMP 0x00000034 skok 00000018: 940C0034 JMP 0x00000034 skok + 0000001A: 940C0034 JMP 0x00000034 skok + 0000001C: 940C0034 JMP 0x00000034 skok + 0000001E: 940C0034 JMP 0x00000034 skok 00000020: 940C0034 JMP 0x00000034 skok 00000022: 940C0034 JMP 0x00000034 skok 00000024: 940C0034 JMP 0x00000034 skok 00000026: 940C0034 JMP 0x00000034 skok 00000028: 940C0034 JMP 0x00000034 skok

Jedná se o tabulku vektorů přerušení. Vrátíme se k němu, zatímco vidím a pamatujeme, že je to. První sloupec je adresa flash blesku, ve které příkaz leží, druhý příkazový kód třetího mnoMonského týmu, stejné instrukce assembler, třetí operand týmu. Automatický komentář.
Takže, pokud se podíváte, pak existují pevné přechody. A příkazový kód JMP je čtyři bajt, obsahuje adresu přechodu zaznamenanou zpětným - mladší bajt pro mladší adresu a kód příkazu přechodu 940c

0000002B: BE1F OUT 0x3F, R1 na I / O Umístění

Záznam této nuly na adresu 0x3f Pokud vidíte sloupec I / O zobrazení, uvidíte, že adresa 0x3f je adresa registru SREG - flag registrovat registrovat. Ty. Resetujeme SREG ke spuštění programu při nulových podmínkách.

1 2 3 4 + 0000002c: E5CF LDI R28.0x5f Zatížení Okamžité + 0000002d: E0D4 LDI R29.0x04 Zatížení IMMAIGHT + 0000002E: BFDE OUT 0x3E, R29 OUT I / O Umístění + 0000002F: BFCD OUT 0x3D, R28 OUT I / O Umístění

0000002c: E5CF LDI R28.0x5f Zatížení Okamžité + 0000002d: E0D4 LDI R29.0x04 Zatížení Okamžité + 0000002E: BFDE OUT 0x3E, R29 OUT I / O Umístění + 0000002F: BFCD OUT 0x3D, R28 OUT I / O Umístění

Toto je zatížení ukazatele zásobníku. Přímo doprava v I / O registrech nemůže, pouze prostřednictvím mezilehlého rejstříku. Proto první LDI v meziproduktu a pak odtud v I / O. Také vám řeknu více o stohu. Mezitím je známo, že se jedná o takovou dynamickou paměťovou oblast, visí na konci RAM a udržuje adresy a proměnné. Nyní jsme poukázali tam, kde budeme mít zásobník.

00000032: 940C0041 JMP 0x00000041 Skok

Přejít na Saaaeeee End of programu, a tam máme zákaz přerušení a pevně smyčce samo o sobě:

1 2 +00000041: 94F8 CLI Globální přerušení Zakázat +00000042: CFFF RJMP PC-0x0000 Relativní skok

00000041: 94F8 CLI Globální přerušení Zakázat +00000042: CFFF RJMP PC-0x0000 Relativní skok

To je v případě nepředvídaných okolností, jako je výstup z hlavní funkce. Z takové smyčky lze regulátor zobrazit buď s resetem hardwaru, nebo to je pravděpodobné, vypouštění z hlídacího psa - hlídacího psa. No, nebo, jak jsem řekl výše, opravte tato místa v hexadecimálním editoru a směrování, kde máme duši. Také věnujte pozornost tomu, že existují dva typy přechodů JMP a RJMP, první je přímý přechod na adresu. Trvá čtyři bajty a může provést přímý přechod v celém paměťovém prostoru. Druhý typ přechodu - RJMP - relativní. Jeho tým trvá dva bajty, ale přechod, který dělá z aktuální polohy (adresy) o 1024 kroků vpřed nebo vzad. A ve svých parametrech je indikován posun z aktuálního bodu. Používán častěji, protože To trvá dvakrát méně místa v spláchnutí a dlouhé faktory jsou zřídka potřebné.

1 +000034: 940C0000 JMP 0x00000000 Skok

00000034: 940c0000 JMP 0x00000000 Skok

A to je skok na samém počátku kódu. Restartujte druh. Můžete zkontrolovat, všechny vektory skočí zde. Z tohoto výstupu - pokud vám umožní povolit přerušení (ve výchozím nastavení je zakázáno) a budete přerušeni, ale neexistuje žádný popisovač, pak bude resetován program - program bude program hodit na samém začátku.

Hlavní funkce. Všechno je podobné, můžete ani popsat. Hledáte jen do registrů již vypočítat číslo. Preprocessor kompilátor taxíky !!! Takže žádné "Magic" čísla!

1 2 3 4 5 6 7 8 9 10 11 12 <

00000036: E383 LDI R24.0x33 Zatížení okamžité +000037: B989 OUT 0x09, R24 OUT I / O Umístění 15: UBRRH \u003d Ahoj (BAUDDIVIDER); +000038: BC10 OUT 0x20, R1 na I / O Umístění 16: UCSRA \u003d 0; +000039: B81B OUT 0x0b, R1 na I / O Umístění 17: UCSRB \u003d 1<

A tady je JAMB:

1 2 3 + 0000003E: E080 LDI R24.0x00 Zatížení Okamžité + 0000003F: E090 LDI R25.0x00 Zatížení Okamžité +00000040: 9508 Ret Ret Subroutine Return

0000003E: E080 LDI R24.0x00 Zatížení Okamžité + 0000003F: E090 LDI R25.0x00 Zatížení Okamžité +00000040: 9508 Ret Ret Subroutine Return

Je to požádán, proč tento kompilátor přidává takový topmaster? A to není nic jiného než návrat 0, pak jsme identifikovali jako int hlavní (neplatný). Takže jsem vyhrál více než čtyři bajty nechápou, co :) A pokud děláte voidní hlavní (prázdný), bude to jen ret, ale Vrtění bude. Co říkají, že nevrátíme nic do hlavní funkce. Obecně to udělat jako vy :)

Složitý? Zdá se, že to není. Přeskočím krok za krokem v režimu Disassembler a Pokař jako procesor provádí individuální pokyny, které se děje s registrem. Jak se pohybovat na příkazech a konečné smyčce.

Pokračování následuje za pár dní ...

OFFTOP:
Alexei78. Gang fixační zástrčka pro Firefox usnadňující navigaci v mém místě a fóru.
Diskuse a ke stažení

Pro programování AVR mikrokontroléry existuje mnoho vývojových nástrojů, nicméně nejoblíbenější, nepochybně, balíček by měl být uznán AVR studio. . Existuje několik důvodů pro takovou popularitu - to je bezplatný balíček vyvinutý společností Atmel , Kombinuje textový editor, assembler a simulátor. Balíček AVR Studio se používá také ve spojení s pevným hardwarem. V navrhovaném článku uvažují příklady techniky pracovat s balíčkem, který pomůže začátečník programátoři pochopit interakci jednotlivých složek studia AVR.

V další části článku bude popsán o ladění v prostředí AVR studia programů napsaných v SI.

Balíček AVR Studio má historii solidní vývoje, která se odráží v počtu stávajících verzí. Na konci roku 2003 byla vydána verze 4.08, která má řadu užitečných dodatků a na začátku roku 2004 byla vydána aktualizace (Service Pack 1), přidání podpory pro AVR-regulátory třetí generace Atmega48 rodina. Výroba žetonů této rodiny je naplánována na druhé polovině roku 2004.

Distribuce balíčku a aktualizace Service Pack lze stáhnout z www.atmel.com nebo získat CD s touto distribucí od ruského distributora společnosti Atmel.

Práce v balíčku AVR Studio je vhodně přezkoumávána na jakýkoliv konkrétní program. Jako názor budeme zvažovat vytvoření projektu pro nejjednodušší program, který bude zase na světle dvou LED diodách. Pro definitost vezměte mikroobvodu Atmega128. A připojte dva LED diody v závěrech 31 a 32 (jedná se o bity 6 a 7 port D Chip Atmega128). AVR regulátory Mají výkonné výstupní kaskády, typický proud každého výstupu je 20 mA, maximální výstupní proud je 40 mA, a to se týká jak tekoucí, tak do tekoucího proudu. V našem příkladu jsou LED diody připojeny k anodům k závěrům regulátoru a katody přes kalící odpory jsou připojeny k zemi. To znamená, že LED dioda je zapálena podáváním "1" k odpovídajícímu výstupu pólu. Schematický diagram je znázorněn na obrázku. Diagram také zobrazuje dvě tlačítka, která mají být použita v jednom z programů.

Zde je vhodné udělat malou odbočku o výběru typu čipu pro nejjednodušší příklad. Vskutku, na první pohled, to se může zdát podivné, proč potřebujete tak mocný krystal v pouzdře 64-pin, kde je dostatek 8-pin čip Attiny12. ? V tomto přístupu je však logika. Je známo, že v srdci téměř každého AVR regulátoru leží stejné jádro. A velké, regulátory se liší v paměti, počet I / O portech a sadu periferních modulů. Vlastnosti každého specifického regulátoru - závazný logický název / výstupní registry na fyzické adresy, adresy přerušení vektorů, identifikace bitů portů atd. Popisuje v souborech s rozšířením.Inc, které jsou zahrnuty do balíčku AVR Studio. V důsledku toho, že pomocí specifického typu krystalů můžete program ladit jako samotný pro něj a pro mladší krystal. Dále, pokud používáte nejvíce seniorského krystalu jako ladění, dnes je to Atmega128, můžete ladit program pro téměř každý řadič AVR, stačí použít hardwarové prostředky, které chybí z cílového mikrokontroléru. Tak například můžete program vystupovat, který má být proveden na Atmega128 Attiny13. . V tomto případě zůstane zdrojový kód prakticky stejný, pouze název připojeného souboru s 128def.inc na TN13DEF. Tento přístup má také své výhody. Například "Extra" I / O porty lze použít pro připojení. LCD indikátor které můžete stáhnout informace o ladění. Nebo použijte emulátor intrahemum, který se připojuje k portu JTAG čipu ATMEGA128 (regulátor AttLiny13 nemá tento port). Je tedy možné použít jeden ladicí desku, na které je instalován "Senior" AVR regulátor, k ladění nově vyvinutých systémů přirozeně založených na mikrokontroléru AVR. Jeden z těchto desek se nazývá jako-megam. Bylo to použito k vytváření příkladů programů uvedených v článku. Jedná se o univerzální jednoúčelový regulátor založený na čipu Atmega128, který obsahuje externí paměť RAM, dva porty RS-232. , port pro připojení LCD indikátor, IntrahoNemoe programátor a emulátor V ledu JTAG . Deska má také místo pro rozdělení čipu série flash-rom At45. V pouzdrách TSOP32 / 40/48 a dvoukanálové řady DAC AD5302 / AD5312 / AD5322 . Nyní, po vysvětlení příčin použití AVR Monster zapálit pár sukých, můžete jít dále.

Při programování v prostředí AVR Studio musíte provést standardní posloupnost akcí:

  • sestavení
  • Vytvoření projektu začíná výběrem projektového projektu. V okně "Vytvořit nový projekt", který se otevře, musíte zadat název projektu (v našem případě - Sample1) a název inicializačního souboru. Po stisknutí tlačítka "Další" se otevře volba ladicí platformy a okno zařízení, kde je vybrána platforma ladění (simulátor nebo emulátor) a typ mikrokontroléru.

    Můžete si vybrat jeden z nabízených emulátorů intrahemny, všimneme si, že každý emulátor má podporovaný svůj vlastní seznam mikroobvodů. Pro zvážení příkladu si vybereme jako ladicí platforma AVR simulátor a čip Atmega128. Po stisknutí tlačítka "Dokončit" se náš výstup zobrazí pracovní okna AVR Studio balíku, zatímco prázdný. Sleduje správné okno pro umístění zdrojového textu programu. To lze provést dvěma způsoby, nebo vytočit celý text přímo v okně Editor, nebo stáhnout existující soubor. Níže je plný text nejjednoduššího programu s komentáři.

    ; Příklad "LED ovládání"; Napsaný pro ladicí desku AS-MEGAM; Frekvence generátoru parametrů je 7,37 MHz; LED diody jsou připojeny k závěrům PD6 a PD7 a prostřednictvím rezistorů - na sdíleném drátu. ; Připojení ICEGA128 obvodu I / O detailů "M128DEF.Inc"; Začátek programu začíná:; první operace - inicializace zásobníku; Pokud to není hotovo, pak zavolejte podprogram nebo přerušení; nebude vrátit kontrolu zpět; Ukazatel na konci zásobníku je nastaven na poslední adresu interního RAM - Ramend LDI R16, nízký (Ramend) Out SPL, R16 LDI R16, vysoký (Ramend) OUT SPH, R16; Aby bylo možné kontrolovat LED připojené k závěrům PD6 a PD7; Je nutné deklarovat tyto závěry výstup. ; Chcete-li to provést, napište "1" na odpovídající bity registru DDRD (DataDirection) LDI R16 (1)<<6) | (1<<7) out DDRD,r16 ; основной цикл программы loop: ldi r16,(1<<6) ; светится один светодиод out PORTD,r16 rcall delay ; задержка ldi r16,(1<<7) ; светится второй светодиод out PORTD,r16 rcall delay ; задержка rjmp loop ; повторение цикла; процедура задержки; примерно полсекунды при частоте 7,37 МГц; три пустых вложенных цикла соответственно delay: ldi r16,30 ; 30 delay1: ldi r17,200 ; 200 delay2: ldi r18,200 ; и еще 200 итераций delay3: dec r18 brne delay3 dec r17 brne delay2 dec r16 brne delay1 ret ; возврат в главную программу

    Projekt se může skládat z několika souborů, zatímco jeden soubor je přiřazen hlavní. Všechny operace jsou vhodné pro výrobu tlačítka kontextu myši. Po připojení zdrojového souboru mají okna následující formulář.

    Kompilace projektu je provedena příkazem projektu nebo stisknutím tlačítka f7. Proces kompilace se zobrazí v okně "Výstup". Toto okno může být "tahat" příkaz Zobrazit výstup.

    V zásadě jsme již obdrželi výstupní soubor ve formátu.Hex, který již může být načten do mikroobvodu a pozorovat správce LED diod. Účelem článku je však ukázat celý cyklus práce v prostředí AVR studio, takže jdeme do stádia ladění. To se provádí tým ladění ladění.

    Nyní nastavte frekvenci Quartz frekvence 7,3728 MHz v okně "Možnosti simulátoru", abyste přesně změřili dobu provedení programu.

    Zbývající možnosti by měly být ponechány beze změny. Nyní můžete provádět program v režimu krok za krokem pomocí tlačítka myši nebo f11.

    Balíček AVR Studio obsahuje výkonné nástroje pro prohlížení a úpravu stavu interních registrů a I / O porty ladicího mikrokontroléru, stejně jako čas, provádění programu. Přístup k nim se provádí oknem "I / O".

    Ve skutečnosti je množství informací dostupných prostřednictvím aplikace AVR Studio Prohledování balíčků je tak velká, že je nutné použít počítač v konfiguraci dvou monitoru pro dosažení maximálního komfortu.

    Chcete-li ladit náš příklad, přístup k portům d bitů, musíte odhalit řetězec I / O Atmega128 a poté řádek portd. Nyní jsou viditelné všechny tři rejstříky tohoto přístavu, Portd, DDRD a PID. Chcete-li zobrazit pole hodnoty, bitů a adresy, budete muset rozšířit správné okraj okna, potu okno se zdrojovým textem programu.

    Projděte se programem v režimu krok za krokem, můžete vidět změnu současných stavů těchto registrů v poli bity. Je možné rychle změnit stav jakéhokoliv bitů přístavních registrů, a to lze provést buď zapisováním nového kódu v poli Hodnota nebo přímo kliknutím na požadovaný bit registru.

    Pro nezávislé cvičení se navrhuje následující program, který se liší od předchozího, který je zapálení LED diod řízeno dvěma tlačítky.

    ; Příklad "LED ovládání z tlačítek"; Napsaný pro ladicí desku AS-MEGAM; LED diody jsou připojeny k závěrům PD6 a PD7 a prostřednictvím rezistorů - na sdíleném drátu. ; Tlačítka - na PE4 a PE5.Include "M128def.Inc"; Začněte hlavní program:; Inicializace zásobníku LDI R16, nízká (Ramend) Out Spl, R16 LDI R16, vysoká (Ramend) OUT SPH, R16; Inicializace LED LED diod R16 (1)<<6) | (1<<7) out DDRD,r16 ; инициализация выводов, к которым подключены кнопки (на вход) ; внутренние подтягивающие резисторы подключены; для этого в PORTE нужно установить соответствующие биты в единицы ldi r16,(1<<4) | (1<<5) out PORTE,r16 ; а в DDRE - в нули ldi r16,0 out DDRE,r16 ; бесконечный цикл forever: in r16,PINE ; теперь в r16 находится текущее "состояние" кнопок com r16 ; кнопка "нажимается" нулем, поэтому инвертируем регистр lsl r16 ; переносим биты 4,5 в позиции 6,7 lsl r16 ; и обновляем "показания" светодиодов andi r16,(1<<6) | (1<<7) out PORTD,r16 rjmp forever ; цикл выполняется бесконечно

    Na příkladu nejjednodušších programů je tedy zobrazeny některé funkce balíčku AVR Studio. Je nutné pochopit, že se jedná pouze o první známost, která vám umožní rychle využít se základními příkazy balíčků. Mezitím jsou schopnosti balení zvažované mnohem širší. Například zde můžete ladit programy napsané v jazycích na vysoké úrovni. Konkrétně, C-kompilátor společnosti ImageCraft využívá ladicí program AVR Studio "jako nativní". Chcete-li to udělat, při kompilaci zdrojového kódu musíte nastavit možnost generování výstupního souboru ve formátu kompatibilním s AVR Studio. Současně je možné ladit ve zdrojových kódech.

    Další z mnoha charakteristik balíčku AVR Studio je schopnost připojit externí programy. Například, abyste zajistili, že programátor Inspekce AS2 je třeba provést několik jednoduchých operací.

    V nabídce Nástroje hlavního okna AVR Studio musíte vybrat možnost Vlastní;

    V okně Upravit vyberte položku Nástroje;

    Poklepáním na tlačítko myši nebo stisknutím tlačítka INSERT na klávesnici přidejte nový příkaz do seznamu a zavolejte jej "Programátor AS2";

    Zadejte cestu k spustitelnému souboru programátoru zadáním IT přímo do vstupního pole "Příkaz", nebo kliknutím na tlačítko "..." vpravo od tohoto pole;

    Nyní se zobrazí nabídka nástrojů "Programmer AS2".

    AVR Studio 4.08 Package znamená, že vám umožní připojit pomocné programy - pluginy. První plugin pro AVR Studio je program grafického editoru, který zjednodušuje inicializační proces indikátoru LCD, který může přímo spravovat ovladač AVR Atmega169. Maximální velikost logiky indikátoru LCD je 100 segmentů, každý prvek indikátoru je vyroben v souladu s bitem ve zvláštním registru regulátoru. Pro zjednodušení postupného vazebného postupu pro určité bity do každého segmentu můžete použít výše uvedený program.

    Při návštěvě "Motéka AVR" - Norská kancelář Atmel, jeden z autorů článku hovořil s Lars Quenerem, vedoucím skupiny programátorů, která vytvořila a podporuje balíček AVR Studio. Tato osoba, klasický programátor, s vousem, v svetr a tkané v sandálech ponožek, hovořil o vyhlídkách na vývoj balení. Na další verzi (4.09) bude rozhraní povoleno pro nový emulátor intrahuemnoe - Jtagice MKII (to je také voláno na Jtagice2), který v druhé polovině roku nahradí v Jtagice. Tento emulátor má dvě základní rozdíly. Na jedné straně podporovaná podpora pro nové jednovrstvé ladění rozhraní pro mladší řadiče AVR, Debugwire. Toto rozhraní je zajímavé, protože nezabírá další závěry mikrokontroléru pro jeho práci, protože používá k výměně výstupu výstupu resetového mikrokontroléru! Na druhou stranu (můžete pochopit tento výraz doslovně), na adrese Emulátoru JTAGICE2 se konečně objeví rozhraní USB pro komunikaci s počítačem.

    Literatura

    1. AVR Technické vzdělávání Technické seminární materiály. Atmel. Norsko. Deceptber 2003.
    2. Nikolay Korolev, Dmitry Korolev AVR-mikrokontroléry druhé generace: médium vývojáře. // komponenty a technologie, 2003 č. 7
    3. AVR-mikrokontroléry druhé generace: nové hardwarové schopnosti // komponenty a technologie. 2003. Č. 4.
    4. Nikolay Korolev, Dmitry Korolev. AVR Microcontrollers: Velký v malých. // schémata ", 2001, №5
    5. Nikolay Korolev, Dmitry Korolev. AVR Microcontrollers: Software // komponenty a technologie, 2000. č. 4.
    6. Nikolay Korolev. AVR: Developer Hardware // Komponenty a technologie, 1999 № 1
    7. Nikolay Korolev. Atmel RISC-Microcontrolers // Chip-News 1998, №2
    8. Nikolay Korolev, Dmitry Korolev AVR: Nové 8-bitové risc-mikrokontroléry společnosti Atmel // Microprocessor Review, 1998, №1 \\ t

    Nějaký okamžitě vytáhl, aby poskytl poradenství při výběru programovacího prostředí pro regulátory AVR. Prostě nehodíte do mě tenisky. Jsem trochu trochu

    Programování jazyků pro mikrokontroléry hodně. Programovací média také nestačí a ve srovnání s nimi nesprávně. Neexistují žádné lepší programovací jazyky. Takže musíte vybrat nejvhodnější jazyk pro vás a programovací prostředí.

    Pokud jste v tuto chvíli, postavte se před výběrem, na co začít pracovat, zde je několik doporučení.

    Bývalý programovací zkušenost. Nezanedbávejte dřívější zkušenosti v programování. I kdyby to byl baisik. I kdyby to bylo dlouho ve škole. Programování jako jízda na kole - musíte jen začít a rychle si pamatovat vše zapomenuté. Začněte s Beysika - nespokojen - později bude snazší vybrat si něco vhodnější pro vaše účely.

    Pomoci životnímu prostředí.Napište své přátele na Pascal? Pro vás je vyřešena otázka - psát na Pascal! Budete vždy pomoc s Radou, knihovny budou hozeny do knihoven, poskytne ready-made projekty. Obecně bude šťastný do své komunity. Pokud děláte naopak, získejte opačný výsledek. Přátelé Sishers bavit vás, kteří se rozhodli studovat assembler. Nečekejte na pomoc.

    Dobrý AVR programovací kniha Pomůže to velmi dobře. Bohužel existuje jen velmi málo z nich. Pokud jste ve svých rukou dostal knihu, a myslíte si, že je v něm velmi dostupné. - Zkuste to. Nedoporučuji se učit e-knihy, jako poslední možnost, tisk. Velmi nepříjemné přepínat mezi prostředím a textem souboru souborů. Mnohem příjemnější čtení knihy okamžitě zkuste, aniž byste byli rozptýlení přepínáním, můžete udělat značku na polích, napsat nápady, které vznikly.

    Programovací médium jednodušší. Pokud je na výběr z několika programů jazykového programování - nepochybujte, vyberte si ten, který je jednodušší. Být méně funkční. Nechte kompilovat děsivý nafouknutý kód. Hlavní věc je jen začít pracovat. Poté, co jste štíhlé v jednoduchém prostředí, budete snadno jít na pokročilejší a "správné" prostředí. A neposlouchejte těm, kteří říkají, že ztratíte více času - jsou špatní. Žáci juniorských tříd nejsou požádáni, aby si přečetli "válku a mír", dávají jim knihy jednodušší - s obrázky.

    Knihovny. Přítomnost knihoven je kontroverzní se naučit jazyk. Samozřejmě, později budou velmi usnadnit život, ale na prvních "černých boxech" jsou nepochopitelné a ne příliš pomáhají chápání jazyka. Na druhou stranu to usnadňuje čtení programu a umožnit nováčku, ne obzvláště namáhání, vybudovat komplexní programy. Jejich přítomnost není obzvláště nudit. Alespoň zpočátku.

    Efektivní kód. Výběr programovacího prostředí ke studiu programování pouze tím, jak efektivní kód kompilace je špatný nápad. Pohybatelně se začnete učit - že desátá věc je "na výjezdu". Samozřejmě můžete později pracovat.

    Hledí.Jakékoliv zařízení na palubě krystalu je třeba konfigurovat pomocí portů. Postup je docela energický a požadované datové listy. Kromě toho existují nuance, ve kterých nováček není jen dát. Proto je v médiu velmi žádoucí pro přítomnost vizuardů. Releasi jsou automatické SPI, I2C, USART atd. Automatické úpravy. Čím více zařízení jsou podporovány, tím lépe. Vystavujte potřebné periferní parametry a visí samotný generuje kód, který bude poskytovat zadané parametry. Velmi zjednodušuje život.


    Obecná doporučení Takové programování v počáteční fázi by mělo být co nejjednodušší (i když primitivní). Programovací prostředí by se mělo snadno naučit (jak potřebujete, spustit, naučit se programování a neztrácet čas na vychystávání v nastavení). Doporučuje se Russify. Také nebrání ruskému manuálu a příklady programů. Možnost firmwaru krystalu z média je žádoucí. Dále, při opuštění základů programování se můžete pohybovat na složitějších mušlech.


    Další doporučení, nakonec pracovat se skutečným krystalem. Nebojte se ho spálit. Zlepšit praktické zkušenosti. Práce s emulátory (například proteus), i když to bude osvobozeno od páječky, ale nikdy nebude schopen dát spokojenost, že obdržíte ze získaného programu, první hrnky podle LED! Porozumění tomu, co jste udělali s vlastními rukama, skutečný pracovní okruh bude vštípit důvěru a stimulu jít dál!

    (Navštívil 7 377 krát, 1 návštěvy dnes)

    Koncepce programátoru na portu LPT je zobrazen na obrázku. Jako bývalý pneumatik použijte čip 74AC 244 nebo 74HC244 (K1564AP5), 74LS244 (K5555AP5) nebo 74AS244 (K1533AP5).

    LED dioda VD1 označuje režim záznamu mikrokontroléru,

    vD2 LED - čtení,

    vD3 LED - přítomnost diagramu.

    Napětí potřebné pro napájení schéma trvá z konektoru ISP, tj. z programovatelného zařízení. Tento režim je recyklovaný programátor STK200 / 300 (přidané LED diody pro snadnou obsluhu), takže je kompatibilní se všemi programy programátorů PC pracujících se schématem STK200/300. Chcete-li pracovat s tímto programátorem, použijte program Cvavr.

    Programátor lze provést na desce s plošnými spoji a umístit jej do skříně konektoru LPT, jak je znázorněno na obrázcích:




    Chcete-li pracovat s programátorem, je vhodné použít příponu LPT port, který je snadno ovladatelný (například z kabelu CAbleronix pro tiskárnu), hlavní věc je "ne litovat" vodiče " Země (18-25 nohou konektoru) nebo koupit. Kabel mezi programátorem a programovatelným mikroobvodem by neměl překročit 20-30 cm.

    Dobrý den, milý habrarites!

    V tomto článku chci říct o tom, jak jeden den jsem se rozhodl začít programovat mikrokontroléry, které pro to bylo zapotřebí a to nakonec se ukázalo.

    Tématem mikrokontrolérů se zajímalo o dlouhou dobu, rok v roce 2001. Ale pak dostat programátora na místě bydliště byl problematický, a tam nebyl nákup na internetu a projevu. Tento případ jsem musel odložit až do nejlepších časů. A tak jsem jednoho dne zjistil, že nejlepší časy přišly, aniž by opustili dům, můžete si koupit všechno, co jsem potřeboval. Rozhodl jsem se zkusit. Co potřebujeme:

    1. Programmer
    Existuje mnoho možností na trhu - od nejlevnějších programátorů ISP (In-System Programming) pro několik dolarů, k výkonným programátorům Debugger na pár set. Bez většího zkušenosti v této věci jsem se rozhodl zkusit jeden z nejjednodušších a nejlevnějšího - USBASP. Koupil jsem si najednou na eBay za 12 dolarů, nyní najdete i za $ 3-4. Ve skutečnosti to je čínská verze programátoru z Thomas Fischl. Co o něm mohu říct? Jen jedna věc - to funguje. Kromě toho existuje spousta regulátorů AVR řady Atmega a Atomtiny. Pod Linuxem nevyžaduje řidič.

    Pro firmware musíte připojit VCC, GND, reset, SCK, MOSI, MISO programátory výstupy s odpovídajícím výstupem mikrokontroléru. Pro jednoduchost jsem shromáždil pomocné schéma přímo na muže:

    Vlevo na palubě - stejný mikrokontrolér, který budeme blikat.

    2. Microcontroller
    S výběrem mikrokontroléru jsem se neobvykle obtěžoval a vzal Atmega8 z Atmel - 23 I / O borovice, dva 8bitové časovače, jeden 16-bitový, frekvence - až 16 MHz, malá spotřeba (1-3,6 mA) , levné ($ 2). Obecně, pro start - více než dost.

    Pod Linuxem kompilovat a stahovat firmware na regulátoru, AVR-GCC + Avrdede Bundle funguje perfektně. Instalace triviální. V návaznosti na pokyny můžete nainstalovat vše, co potřebujete za pár minut. Jediné hýgy, které by měly být zaplaceny - Avrdude (software pro nahrávání na regulátoru), může vyžadovat správné uživatelské právo pro přístup k programátoru. Exit - Proveďte sudo (ne příliš dobrý nápad) nebo registrujte speciální práva UDEV. Syntaxe se může lišit v různých verzích OS, ale v mém případě byla provedena přidáním následujícího pravidla do souboru /etc/udev/rules.d/41-ATMEGA.RULES:

    # USBASPSPAYMER Subsystem \u003d\u003d "USB", attr (IDVendor) \u003d\u003d "16C0", attr (idproduct) \u003d\u003d "05dc", group \u003d "plugdev", režim \u003d "0666"

    Po tom je samozřejmě potřebný restart služby.
    SERVIS UDEV RESTART.
    Můžete kompilovat a flash bez jakýchkoliv problémů přímo z příkazového řádku (kdo by pochybný), ale pokud existuje mnoho projektů, je vhodnější dát plugin a dělat vše přímo z prostředí Eclipse.

    Pod Windows bude muset dodat ovladač. Ve zbytku nejsou žádné problémy. Pro vědecký zájem jsem vyzkoušel AVR Studio + extrémní balíček hořáků v oknech. Opět funguje vše s třeskem.

    Začneme programování

    Programování AVR regulátory mohou být jak na assembleru (AVR assembler) a na C. Zde si myslím, že každý musí učinit svou volbu v závislosti na konkrétním úkolu a jeho preferencích. Osobně jsem poprvé začal sbírat assembler. Při programování na assembleru se architektura zařízení stane jasnějším a pocit se zdá, že kopat přímo dovnitř regulátoru. Kromě toho se domnívám, že ve zvláště kritických programech mohou být poznání assembler velmi užitečné. Po seznámení s AVR assembler se posunu na Si.

    Po seznámení s architekturou a základními principy jsem se rozhodl sbírat něco užitečného a zajímavého. Moje dcera mi pomohla, dělají šachy a jeden krásný večer prohlásil, že chce mít časovač hodinky na chvíli. Batz! Zde je - myšlenka prvního projektu! Bylo možné objednat je na stejném eBay, ale chtěl jsem udělat své vlastní hodiny, s černým ... Uh ... s ukazateli a tlačítky. Neřekl dřív, než udělal!

    Jako displej bylo rozhodnuto použít dva 7-segmentové diodové indikátory. Pro ovládání bylo dost 5 tlačítek - "Player 1", "Player 2", "Reset", "Nastavení" a "Pauza". No, nezapomeňte na zvukovou označení hry. Vypadají to tak. Obrázek níže ukazuje obecný diagram připojení mikrokontroléru na indikátory a tlačítka. Bude potřebovat při analýze zdrojového kódu programu:

    Colcessing Flight.

    Začněme, protože by mělo být od vstupního bodu programu - hlavní funkce. Ve skutečnosti nic pozoruhodného v něm není - nastavení porty, inicializace dat a nekonečné tlačítko stisknutí tlačítek. SII () volání je řešení zpracování přerušení, o nich o něco později.

    Int hlavní (prázdno) (init_io (); init_data (); zvuk_off (); sei (); zatímco (1) (handed_buttons ();) návrat 0;)
    Zvažte každou funkci odděleně.

    VOID INIT_IO () (// Nastavit výstup DDRB \u003d 0xFF; DDRD \u003d 0xFF; // Nastavení vstupu DDRC \u003d 0B11100000; // Pull-up rezistory Portc | \u003d 0b000111111; // Časovač přerušení Timsk \u003d (1<

    Nastavení I / O porty je velmi jednoduchý - do registru DDRX (kde X je písmeno, označující port) číslo, z nichž každý znamená, zda bude odpovídající kolík vstupní zařízení (odpovídá 0) nebo výstupu (odpovídá 0) nebo výstupu do 1). Tak, moře v DDRB a DDRD číslo 0xFF, jsme provedli výstupní porty B a D. V souladu s tím příkaz DDRC \u003d 0B11100000; Otočí prvních 5 portů portu C do vstupních kolíků a zbývající o víkendu. Team Portc | \u003d 0b00011111; Zahrnuje vnitřní utahovací odpory na 5 vstupech regulátoru. Podle schématu jsou tlačítka připojena k těmto vstupům, které jsou při lisování zavřeny na Zemi. Regulátor tedy chápe, že tlačítko je stisknuto.

    Dále sledujete nastavení dvou časovačů, časovače a časovače1. Používáme první aktualizace indikátorů a druhý - pro odpočítávání času po nastavení na spouštění každou sekundu. Podrobný popis všech konstant a metoda nastavení časovače do určitého intervalu lze nalézt v dokumentaci pro Atmega8.

    Zpracování přerušení

    ISR (displej ();, pokud (_Buzzer\u003e 0) (_Buzzer--;, pokud (_Buzzer \u003d\u003d 0) Sound_Off ();)) ISR (Timer1_Compa_vect) (IF (ActiveTimer \u003d\u003d 1 && Timer1\u003e 0) (Timer1-- ; If (Timer1 \u003d\u003d 0) Process_timeoff ();), pokud (ActiveTimer \u003d\u003d 2 && Timer2\u003e 0) (Timer2--;, pokud (Timer2 \u003d\u003d 0) Process_timeOff ();))

    Když je časovač spuštěn, ovládací prvek je přenášen do příslušného obsluhu přerušení. V našem případě se jedná o procesor TIMER0_OVF_VECT, který způsobuje postup výstupu času na indikátory a časovače1_compa_vect, který zpracovává odpočítávání.

    Závěr ukazatelů

    Displej (Display_Number (Display_Number (Timer1 / 60) / 10, 0B00001000); _delay_ms (0.25); Display_Number ((TimeAr1 / 60)% 10, 0B00000100); _delay_ms (0.25); Display_Number ((((časovače) 10, 0B00000010); _delay_ms (0,25); Display_number ((Timer1% 60)% 10, 0B00000001); _delay_ms (0,25); Display_number (Timer2 / 60) / 10, 0B10000000); _delay_ms (Timer2); / 60)% 10, 0B01000000); _delay_ms (0,25); dispy_number ((Timer2% 60) / 10, 0B00100000); _delay_ms (0.25); display_number ((((((časovač)); _delay_ms (0.25) ; portd \u003d 0;) void display_number (int číslo, int maska) (portb \u003d number_mask (číslo); portdd \u003d maska;)

    Funkce zobrazení používá metodu dynamického indikace. Faktem je, že každý individuální indikátor má 9 kontaktů (7 pro řízení segmentů, 1 pro bod a 1 pro napájení). Chcete-li ovládat 4 číslice, bylo by to trvat 36 kontaktů. Příliš nehmotný. Proto je výkon výbuchu k vícemístnému indikátoru organizován podle následujícího principu:

    Napětí je střídavě přiváděno do každé ze sdílených kontaktů, což umožňuje zvýraznit požadovaný obrázek v odpovídajícím indikátoru pomocí stejného 8 řídicích kontaktů. S dostatečně vysokou výstupní frekvencí vypadá jako statický obraz. Proto jsou všechny 8 přídavných kontaktů obou ukazatelů na schématu připojeny k 8 portů portů D a 16 segmentů řízení kontaktů jsou připojeny ve dvojicích a připojených k 8 portů portů B. Takto, funkce zobrazení se zpožděním 0,25 MS střídavě zobrazuje požadované číslo každému z ukazatelů. Za konce jsou všechny výstupy, které napájí napětí na indikátoru vypnuty (příkazový portdd \u003d 0;). Pokud to není hotovo, pak poslední číslice zobrazení bude pokračovat v hoření, dokud se next volání nazývá funkce zobrazení, která povede k jeho jasnější luminiscenci ve srovnání s ostatními.

    Léčba lisů

    Void handadic_buttons () (handadic_button (key_setup); handle_button (key_reset); handle_button (key_pause); handle_button (key_player1); handle_player1); handle_button (key_player2);) void handlose_button (int bitů) (CASE_SE_SETUP: bit \u003d SETUP_BIT; BREAK; CASE_RESET: BIT \u003d RESET_BIT_BEAT_BEAT_BEATIONS; CASE KEY_PAUSE: BIT \u003d PAUZE_BAUSE_BITY; BITYSIONS_BAUSE_BAYER1: bit \u003d Player1_bit; přerušení; Case_player2: bit \u003d Player2_BIT; přerušení; Button_pin, bit)) (pokud (_Standard \u003d\u003d 0) (_delay_ms (debuune_time); pokud (bit_is_clear (bit_is_pin, bit)) (_Strosled | \u003d klíč; // klíčový akční přepínač (key_setup: Process_Setup (); přestávka; Case key_Set : Process_Reset (); Break; Case Key_Pause: Process_Pause (); Break; Case Key_player1: Process_player1 (); přerušení; Case Key_Player2: Process_player2 (); přerušení;) Sound_on (15);)) Else (_pressed & \u003d ~ Klíč) ;)))

    Tato funkce v zapnutí hlasování všech 5 tlačítek a procesů stiskněte, pokud se to stalo. Stisknutí je registrováno kontrolou bit_is_clear (button_pin, bit), tj. Tlačítko je stisknuto, pokud je vstup odpovídající, je připojen k zemi, který se stane podle schématu, když stisknete tlačítko. Zpožděné zpoždění doba trvání a pře-kontrola je nutná k tomu, aby se zabránilo více zbytečných odpovědích v důsledku chrastic kontaktů. Uložení stavového stavu v příslušných variabilních bitech _pressed se používá k odstranění opětovného spouštění s dlouhým stisknutím tlačítka.
    Lisovací funkce jsou poměrně triviální a věří, že v dodatečných připomínkách nepotřebují.

    Plný textový program

    #Define f_cpu 4000000L #include #Zahrnout. #Zahrnout. #define debuune_time 20 #define button_pin pinc #define setkání_bit_bit pc0 #define reset_bit pc1 #define pause_bit PC2 #define Player1_bit PC3 #define Player1_bit PC3 #define Player2_bit PC4 #define Key_Setup 0B00000001 #define Key_Set 0B00000010 #define Key_Pause 0B0000100 #define Key_player1 0b00001000 #define Key_player1 0b000010000 TEY_PLAYER1 0B000010000 TEY_PLAYER1 0B000010000 #define Key_player2 0b000010000 TEY_PLAYER1 0B0010000 #define Key_player2 0b000010000 Nikatilní Int Activetimer \u003d 0; Volatilní int Timer1 \u003d 0; Volatilní int Timer2 \u003d 0; volatilní int _buzzer \u003d 0; Volatilní int _pressed \u003d 0; // Prohlášení funkcí Void init_io (); void init_data (); Int number_mask (int num); Void handle_buttons (); void handland_button (int klíč); Neplatný proces_setup (); Neplatný proces_reset (); neplatný proces_pause (); neplatný proces_timeoff (); Neplatný proces_player1 (); Neplatný proces_player2 (); neplatný displej (); void display_number (int maska, int číslo); Void Sound_on (int interval); void Sound_Off (); // přerušení ISR (zobrazení ();, pokud (_Buzzer\u003e 0) (_Buzzer--;, pokud (_Buzzer \u003d\u003d 0) Sound_Off ();)) ISR (Timer1_compa_vect) (IF (ActiveTimer \u003d\u003d 1 && Timer1\u003e 0) Timer1--;, pokud (Timer1 \u003d\u003d 0) Process_Timeoff ();), pokud (ActiveTimer \u003d\u003d 2 && Timer2\u003e 0) (Timer2--;, pokud (Timer2 \u003d\u003d 0) proces_timayooff ()) (init_io (); init_data (); zvuk_off (); sei (); zatímco (1) (handle_buttons ();) návrat 0;) void_io () (// nastavit výstup ddrb \u003d 0xff; ddrd \u003d 0xff; // sada Vstup DDRC \u003d 0B11100000; // Pull-up rezistory Portc | \u003d 0b00011111; // Časovač přerušení Timsk \u003d (1< 5940 || Timer2\u003e 5940) (Timer1 \u003d 0; Timer2 \u003d 0;))) Processet void () (init_data ();) (init_data ();) neplatný proces_timeoff () (init_data (); zvuk_on (30);) neplatný proces_pause () (ActiveTimer \u003d 0;) Void Process_Player1 () (ActiveTimer \u003d 2;) Processe_player2 () (Active) _Player2 () (ActiveImer \u003d 1;) Void handlose_button (Int Key) (Key_Setup: Bit \u003d Setup_bit; Break, Case Key_Reset: bit \u003d reset_bit; přerušení; Case Key_Pause: Bit \u003d Pauza_bit; Break; Case Key_Player1: bit \u003d Player1_bit; Přerušení; Case Key_Player2: bit \u003d Player2_bit; přerušení; Výchozí: výchozí:) Pokud (bit_is_clear (button_pin, bit)) (pokud (_ISSED \u003d\u003d 0) (pokud (_IS) _delay_ms (debuune_time); pokud (bit_is_clear (button_is_clear (button_pin, bit)) (_pressed | \u003d klíč; // key_setup: Process_setup (); přerušení; Case key_reset: Process_reset (); přerušení; Case key_pause: Process_Pause (); Break; : Process_player1 (); Break; Case Key_Player2: Process_player2 (); přerušení;) Sound_ON (15);))) Jinak (_pre) SSED & \u003d ~ klíč; ))) Void handadic_buttons () (handadic_setup); handle_button (key_reset); handle_button (key_pause); handle_button (key_player1); handle_button (key_player2);) void display ((timer1 / 60) / 10, 0B00001000) ; _delay_ms (0,25); Display_Number ((Timer1 / 60)% 10, 0B00000100); _delay_ms (0,25); Display_number ((Timer1% 60) / 10, 0b00000010); _delay_ms ((Timer1% 60); % 10, 0B00000001); _delay_ms (0,25); Display_Number ((Timer2 / 60) / 10, 0B10000000); _delay_ms (0.25); Display_Number ((Timer2 / 60)% 10, 0B01000000); _delay_ms (0.25); Timer2% 60) / 10, 0B00100000); _delay_ms (0,25); Display_number (((časovače) (((časovače)); ((((časovač)); _delay_ms (0.25); portdd \u003d 0;) void display_mask (portb \u003d number_mask) (portb \u003d number_mask) Číslo); portd \u003d maska;) void zvuk_on (int interval) (_Buzzer \u003d interval) (_Buzzer \u003d interval; // dal bzučák pin vysoký portc | \u003d 0b00100000;) Void Sound_Off () (// dal bzučák pin nízký portc & \u003d 0b00100000;)

    Prototyp byl sestaven na dumpingové desce.