7. Laboratoř: Seznámení s procesorem AVR
Ukázkové cvičení – průchod návrhovým systémem podle připravených příkladů až do realizace na vývojovém kitu Arduino Uno + LCD Keypad Shield.
1. Architektura mikropočítače AVR, vývojové prostředí MPLAB X IDE
Pokud na svém PC nemáte nainstalovaný MPLAB, nebo potřebné pluginy pro práci s Arduino Uno + LCD Keypad Shield (pluginy nejsou nainstalovány ani na školních PC), tak nejprve navštivte stránku Instalace a nastavení.
Přímý odkaz na návod na prostředí MPLAB: Vývojové prostředí MPLAB X IDE.
1.1. Základy procesorů (opakování)
(podrobněji - viz první přednáška)
Procesor je obvod, který vykonává instrukce a podle nich zpracovává data. Instrukce mají jména (mnemoniku), ale ta jsou jen pro nás, ve skutečnosti jsou to binární čísla - strojový kód. Instrukce je něco jako příkaz v programovacím jazyce. Program = posloupnost instrukcí.
Data, která se pomocí instrukcí zpracovávají, jsou taky binární čísla. Když chceme s daty něco provést, např. sečíst dvě čísla, musíme je mít někde uložena. K tomu slouží registry.
Registr je paměťové místo uvnitř procesoru. Registrů bývá konstantní počet, mívají konstantní délku (většinou všechny stejnou). U našeho procesoru AVR: 32 univerzálních registrů pojmenovaných r0 až r31. Můžeme s nimi provádět operace: např. instrukce add r0, r1 znamená r0 = r0 + r1.
Většinou nám na data nestačí registry, a používáme paměť. Instrukce jsou taky v paměti. Protože jsou to všechno binární čísla, tak instrukce od dat v paměti nepoznáme. Ani procesor je od sebe nepozná. (Von Neumannova architektura)
Přesněji řečeno, procesor se vždy řídí pouze binární podobou informací. Když vykonává nějakou instrukci, řídí se jednotlivými bity strojového kódu. Kdybyste mu místo strojového kódu „podstrčili“ data, stejně v nich „uvidí“ instrukci. Naopak když procesor např. sčítá dvě čísla, a vy místo nich „podstrčíte“ strojový kód instrukce, procesor je normálně sečte (a asi vznikne nesmysl).
Někdy se paměť pro strojový kód (program) odděluje od paměti pro data (Harvardská architektura). I náš procesor AVR je takto postaven. AVR má paměť programu a paměť dat. Toto dělení ale není absolutní, protože data mohou být umístěna v obou typech paměti. Paměť programu je ale určena pouze ke čtení (přesněji řečeno je to FLASH EEPROM), takže data, která tam uložíme, jsou vždy konstanty.
1.2. Mikropočítač AVR
AVR firmy Atmel je rodina procesorů, které mají na jednom čipu integrován procesor, paměť programu, paměť dat a poměrně rozsáhlou sadu periferií (vstupně-výstupní brány, čítače, časovače, převodníky, komunikační rozhraní apod.). Takovým součástkám říkáme jednočipové mikropočítače (protože na jednom čipu je skutečně plně funkční počítač, i když možná jednoduchý).
Konkrétní mikropočítač AVR, se kterým budeme pracovat, se jmenuje ATMega328P a je umístěn na vývojovém kitu Arduino Uno + LCD Keypad Shield. Více informací o mikropočítači i vývojovém kitu najdete zde.
2. Úkol 1: Úvod do aritmetických operací v procesoru
Napište program, který nahraje do dvou registrů různá čísla a pak provede aritmetickou operaci. Program krokujte v simulátoru a ověřte správnost výsledku včetně příznaků. Na konec programu je vhodné umístit nekonečnou smyčku, aby se program zastavil.
Vhodné instrukce jsou např. (více informací zde):
- ldi - nahraje číslo do registru. Pracuje pouze s registry r16 až r31. Příklady:
ldi r16, 123ldi r16, -34ldi r23, 'a'ldi r18, 0x3cldi r31, 0b10010010
- add - sčítání (
add r16, r17znamená r16 = r16+r17) - sub - odčítání
- inc - inkrementace (přičtení 1, např
inc r16znamená r16++) - dec - dekrementace (odečtení 1)
- mov - přesun (kopie) čísla z jednoho registru do druhého (např.
mov r0, r16znamená r0 = r16) - jmp, rjmp - skok, relativní skok (speciální případ:
jmp PC- nekonečná smyčka)
2.1. Hodnocení
Vzhledem k tomu, že se jedná pouze o samotný úvod, nebudou za tento úkol udělovány žádné body.
3. Úkol 2: Práce s displejem
Napište na displej přípravku své jméno.
- Stáhněte si knihovnu pro práci s displejem: printlib.inc.
Vytvořte nový projekt podle návodu výše, do adresáře s projektem nakopírujte soubor printlib.inc a do hlavního zdrojového souboru zkopírujte obsah následujícího bloku s kódem. Vysvětlení, co a jak tento blok dělá, najdete zde.
; podprogramy pro praci s displejem .org 0x1000 ; 1 .include "printlib.inc" ; Zacatek programu - po resetu .org 0 ; 2 jmp start ; Zacatek programu - hlavni program .org 0x100 ; 3 start: ; Inicializace displeje 4 call init_disp ; *** ZDE muzeme psat nase instrukce 5 ldi r16, '0' ; znak 6 ldi r17, 0 ; pozice (0x00-0x0f - prvni radek; 0x40-0x4f - druhy radek) call show_char ; zobraz znak z r16 na pozici z r17 end: jmp end ; Zastavime program - nekonecna smycka 7- .org cislo je tzv. direktiva pro překladač. Je to pokyn, aby následující kód ukládal do paměti od adresy cislo. Podprogramy pro práci se tak uloží tak daleko do paměti, abychom na ně při běžné práci nenarazili.
- Zpracování kódu po resetu zařízení začíná vždy na adrese 0, za kterou ale následuje oblast paměti, kde mohou být návratové adresy přerušení (v této ukázce přerušení nepoužíváme, ale jedná o jednu ze základních programovacích technik a proto je dobré na něj pamatovat již od začátku). Z tohoto důvodu se prvních 256 bajtů paměti přeskakuje.
- Tady je teprve faktický začátek kódu.
- Zavolá se inicializace displeje (důležité – jinak se na přípravku displej neaktivuje).
- Tady si můžeme napsat vlastní kód. V kódu je ukázka, jak se zapisuje znak na displej. Princip je podobný následujícímu volání z C show_char(r16, r17). V r16 je vždy znak v ASCII, v r17 pozice (vývojový kit má displej se dvěma řádky s pozicemi 0-15 (0x00-0x0f) pro první řádek a 64-79 (0x40-0x4f) pro druhý). V show_char se vytvoří kopie hodnot – nemusíte se tedy bát r16 a r17 přepsat. show_char bere jako parametry pouze tyto dva registry, nelze mu poslat parametry z jiných.
- Displej je schopen zobrazit malá, velká písmena, čísla a některé speciální znaky. Kompletní tabulka podporovaných znaků je k dispozici zde (zdroj). Nejjednodušší zadání znaku je přímo pomocí znaku v apostrofech, ale lze jej zadat i číselně.
- Konec programu (také důležité – jinak program běží dál a během chvíle potká kód importovaný z printlib.inc u poznámky <1>).
- Program přeložte a spusťte simulaci.
- Do MPLAB je k dispozici simulátor displeje, který lze zapnout pomocí Tools > Arduino > Arduino Display Kit. Pokud volbu Tools > Arduino > Arduino Display Kit nevidíte, pak jste nejspíše simulátor displeje a tlačítek nenainstalovali (viz Instalace a nastavení - Simulátor displeje a tlačítek + GUI pro nahrávací SW pro vývojový kit).
- Po odsimulování funkce programu můžete program nahrát do vývojového kitu a spustit přímo v hardwaru.
Displej je schopen zobrazit malá, velká písmena, čísla a některé speciální znaky. Kompletní tabulka podporovaných znaků je k dispozici zde (zdroj). Nejjednodušší zadání znaku je přímo pomocí znaku v apostrofech, ale lze jej zadat i číselně.
Varování:
Simulátor displeje nepodporuje Reset simulace - může dojít k tomu, že se přestanou vypisovat jakékoli znaky. V takovém případě simulaci ukončete a znovu spusťte.
Varování:
Simulátor displeje je připraven pouze pro zobrazování znaků z běžné ASCII sady na pozicích prvního a druhého řádku displeje. Zápis znaku mimo rozsah displeje (zejména záporné pozice) a/nebo mimo běžnou ASCII sadu (znaky 0x80 a výše) mohou způsobit rozdílné chování simulátoru a displeje na vývojovém kitu (na vývojovém kitu se vypíše znak na pozici, na které ho neočekáváte) a/nebo pád simulátoru (zaseknutí simulace uprostřed podprogramu show_char a vypsání výjimky do karty Output → Simulator).
Rozdílné chování je také se znaky 0-15, na simulátoru se nezobrazí nic, ale na vývojovém kitu se zobrazí znaky, které jsou nahrány přímo v paměti displeje.
3.1. Hodnocení
Vzhledem k tomu, že se jedná pouze o samotný úvod, nebudou za tento úkol udělovány žádné body.
4. Programování vývojového kitu Arduino Uno + LCD Keypad Shield
Nejprve přeložte zdrojový kód pomocí tlačítka Build Project, resp. Build Main Project. 
Varování:
Známé chyby prostředí MPLAB při překladu:
- Pokud MPLAB při překladu nevygeneruje soubor .hex, tak klikněte pravým tlačítkem na název projektu v levé části na kartě Projects a vyberte volbu Properties. V levé části pak vyberte řádek AVR Asm (Global Options) a v pravé části pak odškrtněte a znovu zaškrtněte volbu Generate HEX file. Poté okno potvrďte a znovu projekt přeložte.
- MPLAB může hlásit chyby při překladu ve chvíli, kdy z projektu odeberete soubor. V takovém případě vymažte soubor Makefile-default.mk, který je v adresáři <adresar_projektu>\nbproject. MPLAB si vymazaný soubor při dalším pokusu o překlad vygeneruje znovu.
- MPLAB může hlásit chyby při překladu v souvislosti s chybějícím souborem v adresáři <adresar_projektu>\dist\default\production. V takovém případě zkontrolujte, jestli se překlad podařil (ve spodní části - karta Output > karta s názvem projektu) a pokud ano, tak chybu ignorujte. Pokud chyba přetrvává, zkontrolujte, zda nemáte v cestě k projektu nějaké speciální znaky.
Nahrávací SW lze spouštět pomocí příkazové řádky
avrdude -P <nazev_portu> -p m328p -b 115200 -c arduino -U f:w:<hex_soubor_vcetne_cesty>:i
ale je i možnost využít GUI v panelu Tools > Arduino > ArduinoProgrammer.
Vyberte .hex soubor, zvolte port, na kterém je vývojový kit připojen (na školních PC typicky port s nejvyšším číslem) a stiskněte Program device. Výsledek programování lze vyčíst v části Log.
Varování:
V adresáři projektu jsou typicky dva .hex soubory.
- V kořenovém adresáři s názvem <jmeno_projektu>.hex. Ten vzniká během spouštění simulace.
- V adresáři <adresar_projektu>\dist\default\production s názvem <jmeno_projektu>.X.production.hex. Ten vzniká během překladu tlačítkem Build Project, resp. Build Main Project.
Důrazně doporučujeme, abyste si v okně výběru .hex souboru zobrazili detaily souborů a při výběru souboru důsledně kontrolovali, zda nevybíráte nějakou starší verzi.
Program ve vývojovém kitu běží bez jakékoli vazby na PC, tzn. nedá se v něm krokovat, a běží plnou rychlostí (tj. 16 MHz). To znamená, že když chcete, aby program čekal, musíte na příslušné místo v programu umístit čekací smyčku (např. jmp PC – nekonečnou smyčku).
5. Odevzdání úlohy na EET
Pokud cvičící neurčí jinak, odevzdejte řešení úloh na EET dle pokynů na hlavní stránce cvičení.

