Mikroprocesorová technika Laboratorní cvičení Ing. Tomáš Frýza, Ph.D. Ing. Zbyněk Fedra, Ph.D. Ing. Jiří Šebesta, Ph.D. ÚSTAV RADIOELEKTRONIKY
Fakulta elektrotechniky a komunikačních technologií VUT v Brně 1 Obsah 1 Vývojové prostředí AVR Studio, aritmetické operace 5 1.1 Zadání..................................... 5 1.2 Teoretické poznatky.............................. 5 1.3 Pokyny k zadání................................ 6 1.4 Shrnutí..................................... 10 1.5 Kontrolní otázky................................ 10 2 Ovládání LED diod, využití podprogramů 11 2.1 Zadání..................................... 11 2.2 Teoretické poznatky.............................. 11 2.3 Pokyny k zadání................................ 12 2.4 Shrnutí..................................... 16 2.5 Kontrolní otázky................................ 16 3 Obsluha přerušení 17 3.1 Zadání..................................... 17 3.2 Teoretické poznatky.............................. 17 3.2.1 Externí přerušení............................ 19 3.2.2 Přerušení od čítače/časovače..................... 19 3.3 Pokyny k zadání................................ 20 3.4 Shrnutí..................................... 21 3.5 Kontrolní otázky................................ 21 4 Pulzně šířková modulace PWM 22 4.1 Zadání..................................... 22 4.2 Teoretické poznatky.............................. 22 4.3 Pokyny k zadání................................ 24 4.4 Shrnutí..................................... 25 4.5 Kontrolní otázky................................ 25 5 Programování v jazyce C, obsluha přerušení 26 5.1 Zadání...................................... 26 5.2 Teoretické poznatky.............................. 26 5.2.1 Vyšší programovací jazyky....................... 26 5.2.2 Obsluha přerušení v jazyce C..................... 27 5.3 Pokyny k zadání................................ 27 5.4 Shrnutí...................................... 30 5.5 Kontrolní otázky................................ 30 6 Komunikace s LCD displejem 31 6.1 Zadání...................................... 31 6.2 Teoretické poznatky.............................. 31 6.3 Pokyny k zadání................................ 32
2 Mikroprocesorová technika 6.4 Shrnutí...................................... 34 6.5 Kontrolní otázky................................ 34 7 Zpracování analogových signálů 35 7.1 Zadání...................................... 35 7.2 Teoretické poznatky.............................. 35 7.3 Pokyny k zadání................................ 36 7.4 Shrnutí...................................... 38 7.5 Kontrolní otázky................................ 38 8 Sériový přenos dat 39 8.1 Zadání...................................... 39 8.2 Teoretické poznatky.............................. 39 8.3 Pokyny k zadání................................ 41 8.4 Shrnutí..................................... 42 8.5 Kontrolní otázky................................ 42 Literatura 43 A Vývojová deska ATmega16 45 B Základní popis jazyka C 46 B.1 Proměnné a operandy............................. 46 B.2 Syntaxe podmínky............................... 47 B.3 Syntaxe cyklu.................................. 48 B.4 Specifika překladače GCC a knihovny avr-libc................ 49 C Znaková sada LCD displeje 50
Fakulta elektrotechniky a komunikačních technologií VUT v Brně 3 Seznam obrázků 1.1 Vytvoření nového projektu a výběr programovacího jazyka......... 7 1.2 Výběr ladící platformy a cílového mikrokontroléru ATmega16........ 7 1.3 Vývojové prostředí AVR Studio s vytvořeným prázdným projektem.... 8 1.4 Úspěšný překlad aplikace a informace o velikosti výsledného kódu..... 8 1.5 Ladicí prostředí AVR Studia.......................... 9 2.1 Výběr AVR programátoru........................... 13 2.2 Dialogové okno pro programování mikrokontroléru ATmega16....... 14 2.3 Zobrazení obsahu registrů I/O portů A, B, C a D.............. 15 2.4 Ukázka použití direktiv pro řízení překladu zdrojového kódu........ 15 3.1 Ukázka zápisu přerušení v jazyce symbolických adres............ 19 4.1 Princip tvorby PWM signálu.......................... 23 4.2 Časový diagram generování PWM signálu.................. 23 5.1 Ukázka zápisu přerušení v programovacím jazyce C............. 28 5.2 Princip změny frekvence generovaného akustického signálu......... 29 5.3 Výběr programátoru AVRISP mkii...................... 29 6.1 Zapojení LCD displeje na vývojové desce ATmega16............ 32 6.2 Nově definovaný znak pro LCD displej................... 34 7.1 Zapojení odporového děliče v poli konektorů vývojové desky........ 37 8.1 Struktura asynchronního rámce........................ 40 8.2 Aplikace Terminal pro ovládání sériového portu počítače.......... 41 A.1 Zapojení vývojové desky Development Board ATmega16.......... 45 C.1 Znaková sada LCD displeje.......................... 50
4 Mikroprocesorová technika Seznam tabulek 3.1 Přehled vektorů přerušení pro mikrokontrolér ATmega16.......... 18 3.2 Způsob spouštění externích přerušení INTn (registr MCUCR)......... 19 3.3 Nastavení předděličky čítače/časovače 0 (TCCR0)............... 20 5.1 Přehled vektorů přerušení pro mikrokontrolér ATmega16.......... 28 6.1 Některé příkazy HD44780 pro komunikaci s LCD displejem......... 32 6.2 Soupis některých funkcí knihovny pro LCD.................. 33 B.1 Některé typy a rozsahy hodnot proměnných................. 47 B.2 Aritmetické operace............................... 47 B.3 Bitové a logické operace............................ 47 B.4 Relační operandy................................ 48 B.5 Speciální funkce pro mikrokontroléry AVR.................. 49
Fakulta elektrotechniky a komunikačních technologií VUT v Brně 5 1 Vývojové prostředí AVR Studio, aritmetické operace Test předchozích znalostí 1. Jaké číselné soustavy se nejčastěji využívají k reprezentaci hodnot v mikroprocesorové technice a jakým způsobem se graficky odlišují (přípony, prefixy,...)? 2. Jakým způsobem lze převádět hodnoty z binární podoby do hexadecimální, příp. do soustavy desítkové? 3. Jaké instrukce lze u mikrokontroléru AVR použít k výpočtu součtu a rozdílu dvou hodnot? Cíle laboratorní úlohy Cílem laboratorní úlohy je osvojení si práce s vývojovým prostředím AVR Studio, určené pro psaní a ladění aplikací, stejně jako programování mikrokontrolérů AVR. Současně má úloha za cíl umožnit studentům proniknout do způsobu vývoje a testování jednoduchých aplikací, určených pro mikrokontrolér ATmega16. 1.1 Zadání 1. Seznamte se s vývojovým prostředím AVR Studio pro programování a ladění aplikací s mikrokontroléry AVR. Vytvořte jednoduchou aplikaci pro výpočet vztahu y(n) = n i=0 {a + b i} v jazyce symbolických adres (JSA). 2. Pomocí integrovaného ladícího nástroje analyzujte správnou funkci vytvořené aplikace. 3. Proved te ruční překlad jedné instrukce z vašeho programu. Výsledek zkontrolujte se automatickým překladem. 4. Modifikujte vytvořenou aplikaci na výpočet hodnot 2 n, kde n = 1, 2,..., 7. 5. Vytvořte program pro realizaci součtu dvou komplexních čísel. 1.2 Teoretické poznatky V číslicových soustavách, tedy i v mikroprocesorové technice, jsou hodnoty reprezentovány vždy v binární soustavě, tj. rozlišují se jen dva stavy. Vzhledem k faktu, že zápis hodnot v binární podobě je rozsáhlý a tudíž nepříliš přehledný, používá se pro lepší kompaktnost zápisu soustava hexadecimální. V této soustavě je možné každou čtveřici bitů nahradit jediným symbolem z množiny {0, 1,..., 9, A,..., F }. Poslední číselnou soustavou, která se nejčastěji používá v mikroprocesorové technice je soustava desítková. V této soustavě jsou zpravidla vyžadovány vstupní a výstupní hodnoty systémů srozumitelné pro
6 Mikroprocesorová technika uživatele; např.: hodnoty operandů v kalkulačce, zobrazená velikost měřeného napětí, čas na digitálních hodinách a podobně. Historie mikrokontrolérů sahá do poloviny sedmdesátých let 20. století, od kdy se vývoj v mikroprocesorové technice rozdělil na dvě větve. První směr vede ke zvyšování početního výkonu procesorů, větších kapacit i rychlostí pamětí, apod. Do této kategorie patří např. mikroprocesory z oblasti PC techniky. Druhý proud směřoval k integraci všech potřebných obvodů do jediné součástky. O mikrokontrolérech tedy hovoříme jako o mikroprocesorech, doplněných o obvody pamětí a přídavných periferií, umístěných na jediném čipu. Takto vytvořený obvod je následně schopen řídit jednoduché aplikace z oblasti spotřební elektroniky, audio-video techniky, zabezpečovacích zařízení, obsluhy klávesnic a myší v PC technice, v automobilovém průmyslu (řídicí jednotky motorů, ABS) a v mnoha dalších technických oblastech [1]. V současné době existuje celá řada výrobců, kteří produkují mikrokontroléry s různou strukturou. Kromě nejstarší a patrně nejrozšířenější řady 51 firmy Intel, jsou běžné také produkty firmy Microchip (PIC), Freescale (HCS08, HC11,...), či Atmel (AVR). Mikrokontroléry AVR obsahují 32 identických 8bitových registrů pro běžné použití (označované r0 až r31), které mohou obsahovat jak data, tak i adresy. Pamět ový prostor mikrokontroléru dále obsahuje 64 adres vstupně/výstupních registrů, které slouží k periferním funkcím jako jsou řídicí registry, čítače/časovače, A/D převodníky a další (podrobněji o I/O registrech v následujících laboratorních cvičeních). 1.3 Pokyny k zadání Bod 1. Vývojové prostředí AVR Studio je volný nástroj, který je dostupný ke stažení na internetových stránkách firmy Atmel [2] a slouží k vývoji a testování aplikací pro mikrokontroléry AVR. Program lze spustit kliknutím na ikonu berušky na pracovní ploše, příp. přes Start/Programs/Atmel AVR Tools/AVR Studio 4. Pro každou aplikaci je nutné vytvořit tzv. projekt, který obsahuje informace o souborech se zdrojovým kódem i o konkrétním mikrokontroléru, pro který je aplikace určena. Nový projekt lze vytvořit v menu Project/New Project. V následujícím dialogovém okně je potřeba zvolit v jakém programovacím jazyce bude celá aplikace napsána. Možné jsou dvě varianty: v jazyce symbolických adres (tj. v tzv. asembleru) - Atmel AVR Assembler, nebo ve vyšším programovacím jazyce C (v laboratoři je dostupný volný překladač GCC) - AVR GCC. Toto laboratorní cvičení je určeno k osvojení si programování v JSA, proto zvolte volbu Atmel AVR Assembler. Dále je nutné napsat název celého projektu Project name a především uvést umístění na pevném disku Location, kam má být nově vytvořený projekt uložen. Všechny projekty dočasně ukládejte do adresáře D:\BMPT\vase jmeno\. Zatržením voleb Create initial file a Create folder zajistíte vytvoření podadresáře (jméno bude totožné s názvem projektu) a vytvoření prázdného zdrojového souboru s názvem např. prvni asm.asm (viz. obrázek 1.1). Volby potvrd te tlačítkem Next. Tvorba projektu pokračuje výběrem platformy pro ladění projektu a cílového mikrokontroléru. Vyberte ladění aplikace pomocí interního simulátoru AVR Simulator a mikrokontrolér ATmega16. (viz. obrázek 1.2). Po stisknutí tlačítka Finish se nový projekt vytvoří a otevře se v samotném vývojovém prostředí, jak lze vidět na obrázku 1.3.
Fakulta elektrotechniky a komunikačních technologií VUT v Brně 7 Obrázek 1.1: Vytvoření nového projektu s názvem prvni asm a výběr programovacího jazyka Obrázek 1.2: Výběr ladící platformy a cílového mikrokontroléru ATmega16 Prostředí je rozděleno do čtyř částí: 1) menu a ovládací prvky, 2) inspektor projektu (v programovacím módu) a vnitřní uspořádání mikrokontroléru (v ladicím módu), 3) editor pro psaní zdrojového kódu a 4) informační panel o průběhu překladu aplikace. Pomocí editoru vytvořte zdrojový kód v JSA pro mikrokontrolér ATmega16, který umožní naplnění dvou 8bitových registrů konstantami a a b, které následně využijte pro aritmetickou operaci y(n) = n i=0 {a + b i}. V podstatě se jedná o nekonečnou smyčku s jednou operací součtu a jednou dekrementací v každém cyklu. Pro hodnoty a a b uvažujte neznaménková čísla. Využijte instrukce mikrokontroléru ATmega16 pro aritmetické operace bez přenosu a z důvodu zjednodušení neuvažujte možnost překročení maximálního rozsahu hodnot pro 8bitový výsledek. Hodnotu prvního sčítance zadejte v hexadecimální a druhého v binární podobě! Ručně vypočtěte hodnoty y(n) pro n = 0, 1,..., 7. Zdrojový kód lze přeložit příkazem Build/Build, příp. stisknutím klávesy F7, nebo kliknutím na ikonu na liště 1). Tímto příkazem dojde nejprve ke syntaktické kontrole zdrojového kódu a následně k překladu do strojového kódu daného mikrokontroléru. Informace o průběhu a výsledcích překladu jsou zobrazeny v informačním panelu 4). Úspěšný překlad je indikován konstatováním Assembly complete, 0 errors.
8 Mikroprocesorová technika Obrázek 1.3: Vývojové prostředí AVR Studio s vytvořeným prázdným projektem 0 warnings. Eventuální chyby je potřeba odstranit. Úspěšný překlad je také doprovázen informací o velikosti výsledného kódu a jeho rozložení do programové paměti Flash (.cseg), datové paměti (.dseg) a do paměti EEPROM (.eseg) (viz. obrázek 1.4). Obrázek 1.4: Úspěšný překlad aplikace a informace o velikosti výsledného kódu Bod 2. Korektní funkci programu vyzkoušejte v integrovaném simulátoru. Do ladícího režimu se přepíná příkazem Debug/Start Debugging, stisknutím klávesové
Fakulta elektrotechniky a komunikačních technologií VUT v Brně 9 zkratky Ctrl+Shift+Alt+F5, nebo kliknutím na ikonu. V prostředí simulátoru jsou zpřístupněny tlačítka v příkazové liště ovládající běh a krokování programu, nastavování breakpointů, či zobrazující obsah paměti, registrů a zvolených proměnných. V inspektoru projektů na levé straně došlo automaticky k přepnutí na záložku I/O View, obsahující hodnoty veškerých registrů (řídicích i pro obecné použití r0 - r31) jak znázorňuje obrázek 1.5. Obrázek 1.5: Ladicí prostředí AVR Studia Krokováním programu (např. klávesou F11) ověřte správnou funkci vaší aplikace. Ukončení režimu ladění lze provést příkazem Debug/Stop Debugging, klávesovou zkratkou Ctrl+Shift+F5, nebo tlačítkem. Bod 3. Vyučující vám zadá jednu konkrétní instrukci z vašeho programu a pomocí manuálu instrukční sady mikrokontrolérů AVR [3] ji ručně přeložte do strojového kódu. Výsledek zkontrolujte s automatickým překladem programu AVR Studio. Zobrazit strojový kód lze v ladicím módu například příkazem View/Disassembler (tlačítko ). Z kolika bitů se skládá jedna instrukce mikrokontroléru AVR? Bod 4. Vytvořte nový projekt pro mikrokontrolér ATmega16 a v JSA realizujte program pro postupný výpočet hodnot 2 n, kde n = 1, 2,..., 7. Lze využít část programu vytvořeného v bodě 1. Ukončovací podmínkou se nezabývejte. Kolik bytů obsahuje vámi vytvořený program a kolik instrukcí jste použili? Jakým způsobem lze jednoduše realizovat násobení a dělení hodnotou 2 n v binární soustavě? Bod 5. Vytvořte nový projekt pro mikrokontrolér ATmega16 a v JSA naprogramujte aplikaci, která bude realizovat součet dvou komplexních čísel zadaných ve složkovém tvaru. Pro reálné i imaginární složky uvažujte celá neznaménková čísla, která si zvolíte. Je vhodné volit čísla menší, aby při dílčích aritmetických operacích nedošlo k přetečení
10 Mikroprocesorová technika a tím k obtížné kontrole správnosti výsledků. Pro každou z komplexních částí vstupních a výstupních hodnot vyčleňte jeden 8bitový registr. Celkem tedy vstupní a výstupní data zaberou šest registrů (reálná a imaginární část pro dvě vstupní čísla a jeden výsledek). Pro připomenutí je součet dvou komplexních čísel a a b definován rovnicí a + b = R{a} + R{b} + (I{a} + I{b}) j, (1.1) kde R{a} reprezentuje reálnou část a I{a} imaginární část komplexního čísla a a j je imaginární jednotka. Vypočtenou hodnotu zkontrolujte ručním výpočtem, příp. v programu Matlab. Kolik instrukcí obsahuje váš program pro výpočet součtu komplexních čísel? Jak velkou část paměti program zabírá? Kolik registrů využíváte celkem? 1.4 Shrnutí Laboratorní úloha byla koncipována jako úvod do vývoje aplikací pro mikrokontrolér ATmega16. Jejím úkolem bylo přiblížit studentům tvorbu programu v jazyce symbolických adres, správné použití základních instrukcí, překlad instrukcí do strojového kódu a ladění programu pomocí simulátoru. Hlavní důraz byl kladen na užití instrukcí aritmetických operací a operací pro přesun dat. 1.5 Kontrolní otázky Otázka 1.1 Kolik registrů obsahuje mikrokontrolér ATmega16 a jakým způsobem lze v programu AVR Studio zobrazit jejich obsah? Otázka 1.2 Je následující posloupnost instrukcí syntakticky a sémanticky správná? ldi r16,1f ldi r17,25 add r16,r15 sub r16,r17 Otázka 1.3 Obměňte aplikaci z bodu 5 pro výpočet komplexního součinu. a b = R{a} R{b} I{a} I{b} + (R{a} I{b} + I{a} R{b}) j. (1.2)
Fakulta elektrotechniky a komunikačních technologií VUT v Brně 11 2 Ovládání LED diod, využití podprogramů Test předchozích znalostí 1. Jakým způsobem může mikrokontrolér komunikovat s okolím? Jak lze u mikrokontroléru ATmega16 definovat směr komunikace jednotlivých pinů? 2. Jak je možné v mikroprocesorové technice snadno testovat, zda je výsledek aritmetické operace roven nule? Jak lze tento postup využít pro realizaci cyklu? 3. Jakou funkci má programový čítač (Program Counter), ukazatel na zásobník (Stack Pointer) a zásobník (Stack)? Cíle laboratorní úlohy Cílem laboratorní úlohy je využití mikrokontroléru k řízení jednoduchých procesů prostřednictvím I/O portů. Dále je cílem úlohy realizace podmíněných skoků a volání podprogramů. 2.1 Zadání 1. V jazyce symbolických adres AVR sestavte a ověřte jednoduchou aplikaci pro rozsvícení zvolených LED diod, které jsou připojeny k I/O bráně mikrokontroléru. Seznamte se s vývojovou deskou STK500 a s metodou programování reálných mikrokontrolérů prostřednictvím ISP (In System Programming). 2. Vytvořte 8bitový binární čítač, jehož hodnotu zobrazte pomocí LED diod. Realizujte zpoždění chodu čítače. 3. Modifikujte aplikaci z předchozího bodu a zpoždění realizujte pomocí podprogramu. 4. Ověřte funkci zásobníku při volání podprogramu. 2.2 Teoretické poznatky Všechny vstupně/výstupní porty (I/O brány) mikrokontroléru ATmega16 mohou být použity jako obecné číslicové vstupy/výstupy a současně mohou tvořit rozhraní k jednotlivým periferiím implementovaným na čipu procesoru. Alternativní periferie jsou ve schématickém znaku definovány popisem pinu v závorce; např. PA0(ADC0). Tímto způsobem jsou řešeny I/O obvody všech mikrokontrolérů (některé I/O piny nemusejí být připojeny k interní periferii a obvykle pak jsou pouze obecným číslicovým vstupem/výstupem). Jednotlivé I/O piny procesorů řady AVR jsou řešeny tzv. Read-Modify- Write architekturou, tj. směr toku dat a stav jednotlivých I/O pinů lze libovolně měnit nezávisle na ostatních pinech. Pro práci s I/O bránami, aplikovanými jako obecné číslicové vstupy/výstupy, slouží skupina konfiguračních registrů. U mikrokontroléru AVR jsou pro tyto účely k dispozici následující registry (symbol n definuje název portu A, B, C nebo D):
12 Mikroprocesorová technika DDRn (Data Direction Registr) určuje směr toku dat, zápisem hodnoty 0 na příslušný bit tohoto registru konfigurujeme I/O pin jako vstupní, zápisem hodnoty 1 jako výstupní, PORTn je datovým registrem portu a odpovídá hodnotě zapsané do vyrovnávacího registru portu, tedy hodnotě kterou zapisujeme na příslušný pin (vývod) brány, PINn (Pins Input) je určen pro čtení a odpovídá hodnotě přečtené (synchronizované) z příslušného pinu (log. úroveň signálu přivedená z vnějších obvodů na tento pin). V architektuře AVR jsou definovány další registry pro práci s I/O branami umožňující konfiguraci pull-up rezistorů, nastavení vysoké impedance, apod. Pro naši práci budou prozatím postačovat výše uvedené registry. Pro často se opakující úseky zdrojového kódu se využívají makra nebo podprogramy. Makra jsou realizována pomocí překladače, kdy se do zdrojového kódu vkládá požadovaná posloupnost instrukcí. Takto psané aplikace tedy zabírají větší část programové paměti. Jejich výkon je ale rychlejší. Podprogram se odlišuje tím, že je v paměti obsažen pouze jednou a při každém použití se tzv. volá, tj. skáče se na místo v paměti, kde je uložen. Skoky a návraty z podprogramu způsobují delší dobu výkonu oproti makru. Při volání podprogramu je také nutné uložit tzv. návratovou adresu, tj. pamět ovou pozici kde bude výkon programu pokračovat po návratu z podprogramu. Návratová adresa se ukládá do zásobníku, pro který je vyčleněna část paměti SRAM. 2.3 Pokyny k zadání Bod 1. Ve vývojovém prostředí vytvořte nový projekt v jazyce symbolických adres (v kolonce Project type je nutné vybrat volbu Atmel AVR Assembler). V zadané aplikaci je úkolem rozsvítit LED diody zapojené k I/O bráně. Postup je tedy zřejmý, nejprve zápisem do registru DDRn zapíšeme konfigurační hodnotu tak, aby příslušné piny dané I/O brány, k nimž jsou připojeny LED diody, byly nastaveny jako výstupní (hodnota 1). Zápisem do příslušného registru PORTn pak definujeme, která z těchto LED diod bude svítit. Pro zápis do registrů periferií (I/O registry) se využívá instrukce out, pro čtení pak instrukce in. Z hlediska hardwarového je tedy nutno vědět jak jsou LED diody k I/O vývodům mikrokontroléru připojeny. Další důležitou informací při připojování dalších obvodů k I/O pinům je proudová zatížitelnost jednotlivých pinů. Ta je uvedena v katalogovém listu mikrokontroléru a je specifikována jak pro logickou úroveň výstupu 0, tak i 1 a obvykle se tyto hodnoty liší. Současně je třeba kontrolovat také celkový odběr všech připojených obvodů k I/O portům mikrokontroléru, aby nebyla překročena celková dovolená výkonová ztráta na čipu (najdeme ji opět v katalogovém listu a obvykle je definována v závislosti na provozní teplotě okolí). Pro tuto laboratorní úlohu budeme využívat vývojovou desku STK500 firmy Atmel, připojenou k počítači prostřednictvím sériového rozhraní RS-232. Zapojení desky a její popis je uveden v [4]. Vývojová deska umožňuje programovat celou řadu mikrokontrolérů typu AVR. Pro naše potřeby byl vybrán mikrokontrolér ATmega16. K I/O branám procesoru lze pomocí propojek připojovat různé periferní obvody. S ohledem na zadání je port B připojen k sadě LED diod. Propojení neměňte.
Fakulta elektrotechniky a komunikačních technologií VUT v Brně 13 Nedílnou částí vývojové desky je programovací modul mikrokontroléru, tedy jednotka umožňující naprogramovat mikrokontrolér přímo z prostředí AVR Studio. Tato programovací jednotka umožňuje bezprostřední programování mikrokontroléru zapojeného v reálném systému. Není tedy třeba mikrokontrolér vytahovat či vypajovat z cílového hardwaru. Tento způsob programování je označován zkratkou ISP (In System Programming). V následujícím odstavci bude stručně ukázáno jak vaši sestavenou, přeloženou a případně odladěnou aplikaci v simulátoru AVR Studia naprogramovat do fyzického mikrokontroléru prostřednictvím ISP. Při zakládání projektu zadáte jeho jméno a v okně Select debug platform and device natavíte AVR Simulator a ATmega16. ISP systém neumožňuje ladění aplikace přímo v systému, k tomuto účelu slouží jiné, finančně nákladnější prostředky (využívající např. JTAG rozhraní), viz. přednášky. Ladění můžete provádět v simulátoru v AVR Studiu. Po sestavení a odladění aplikace lze přistoupit k fyzickému naprogramování mikrokontroléru ve vývojové desce. ISP programování v AVR Studiu aktivujeme v menu Tools/Program AVR, kde jsou k dispozici dva způsoby navázání komunikace AVR Studia s ISP programátorem: Connect a Auto Connect. V našem případě je výhodnější položka Auto Connect, po kliknutí na ni se vyhledá dostupný programátor připojený k počítači a otevře dialogové okno pro fyzické naprogramování mikrokontroléru. Auto Connect lze aktivovat také kliknutím na ikonku v horní liště nástrojů. Pro úplnost, položka Connect umožňuje ruční nastavení programátoru. Vyberte programátor STK500 or AVRISP. Obrázek 2.1: Výběr AVR programátoru Okno pro nastavení programování pomocí ISP programátoru je znázorněno na obrázku 2.2. Obsahuje několik záložek. Nejdůležitější je pro nás první záložka Program, kde nastavíme typ cílového mikrokontroléru. Následuje volba způsobu programování procesoru. Pro spolehlivé naprogramování mikrokontroléru je vhodné mít zaškrtnuty položky mazání paměti před programováním a verifikace obsahu po naprogramování. Pak bude pamět mazána vždy před novým naplněním a po naplnění bude zkontrolován její obsah. Následuje blok komponent v rámci programové paměti Flash. Pomocí malého tlačítka vedle editačního řádku otevřeme dialogové okno pro načtení souboru, kterým chceme mikrokontrolér naprogramovat. Příslušný soubor najdeme ve složce vytvořeného projektu, má jméno projektu s příponou hex. Jakmile soubor načteme, můžeme jej stiskem tlačítka Program naprogramovat do programové paměti mikrokontroléru. Tlačítkem Verify provádíme případnou kontrolu naprogramovaného obsahu paměti. Tlačítko Read je určeno pro načtení kódu z programové paměti mikrokontroléru (pokud je to umožněno) do souboru. Pokud je požadována práce s interní pamětí EEPROM mikrokontroléru,
14 Mikroprocesorová technika lze její obsah naplnit, verifikovat nebo číst pomocí bloku komponent v rámci EEPROM. Všechny operace, výsledky a chyby, které nastanou při programování mikrokontroléru, jsou přehledně zobrazovány ve spodním rámu. Obrázek 2.2: Dialogové okno pro programování mikrokontroléru ATmega16 Další záložky v okně rozšiřují možnosti pro konfiguraci vlastního mikrokontroléru i programátoru. Těmito záložkami se nebudeme zabývat. Nyní již víme, jak kód získaný úspěšným překladem zadané aplikace naprogramovat do fyzického mikrokontroléru, vrat me se tedy k zadanému úkolu. LED diody jsou propojeny s portem B. Všechny LED diody jsou nízkopříkonové (cca 2mA v propustném směru), což bezpečně vyhovuje parametrům zatížitelnosti mikokontroléru ATmega16. Zvolte si, které LED rozsvítíte. Ladění aplikace lze provést v AVR simulátoru, přičemž stav nastavení jednotlivých bitů I/O registrů lze sledovat v levém simulačním okně v rozbalovacím menu I/O ATMEGA16 (PORTA, PORTB, PORTC, PORTD) viz. obrázek 2.3. Pro rozšíření vašeho programátorského umění uved me část zdrojového kódu v JSA odpovídající řešené aplikaci pro rozsvěcování LED diod, který obsahuje nové užitečné direktivy pro překladač (viz. obrázek 2.4). Direktivy netvoří výsledný program, jen určitým způsobem řídí chod překladu celé aplikace do strojového kódu; vyznačují se tečkou na pozici prvního znaku. Direktivy.nolist a.list vypnou, resp. zapnou, generaci informačního výpisu. Lze je využít pro přehlednost, např. pro vyjmutí dlouhých výpisů definičních souborů. Direktiva.cseg informuje překladač, že následující kód je určen pro programovou pamět. Pokud je nutné část kódu uložit např. do paměti EEPROM (obvykle nějaké konstanty, nejčastěji kalibrační) použijeme před tímto kódem direktivu.eseg, apod. Další velmi důležitou direktivou pro práci s reálným mikrokontrolérem je.org, která definuje fyzickou adresu v paměti, od které má být přeložený kód uložen. Některé části programové paměti mají totiž speciální význam např. pro přerušení. Pro nás je v této chvíli důležitá adresa 0 (0x0000), od které se provádí vykonávání kódu (instrukcí) po resetu (také po připojení napájecího napětí). V předloženém výpisu zdrojového kódu je zde umístěna instrukce nepodmíněného skoku na adresu 0x002a, kde pokračuje další běh vykonávaného
Fakulta elektrotechniky a komunikačních technologií VUT v Brně 15 Obrázek 2.3: Zobrazení obsahu registrů I/O portů A, B, C a D.nolist ; vypnutí výpisu.include <m16def.inc> ; definiční soubor pro mikrokontrolér ATmega16.list ; povolení výpisu.cseg.org 0x0000 rjmp reset.org 0x002a reset:... ; přeložený kód bude uložen v prog. paměti ; následující kód bude uložen v paměti od adr. 0x0000 ; skok na návěští reset - inicializace po resetu ; následující kód bude uložen v paměti od adr. 0x002a Obrázek 2.4: Ukázka použití direktiv pro řízení překladu zdrojového kódu programu. Tato adresa není zvolena náhodně, ale je první adresou v programové paměti ATmega16, která není určená pro výše zmíněné speciální účely. U jiných typů mikrokontrolérů může být jiná. Tímto krokem zajistíme, že nedojde k žádným problémům při běhu programu a že speciální adresy zůstanou volné pro další rozšiřování programu [5]. Bod 2. Binární čítač vytvořte pomocí nekonečné smyčky, ve které budete inkrementovat obsah 8bitové proměnné, tu odesílat na výstupní port a zobrazovat pomocí LED diod. Ošetření přetečení maximální hodnoty dané 8 bity neuvažujte. Aby byly změny čítače patrné, je nutno do programu zařadit tzv. zpožd ovací smyčku, která zajistí prodloužení doby trvání jednoho stavu. Zpožd ovací smyčku vytvořte pomocí cyklu a instrukce NOP. Bod 3. V rámci tohoto úkolu budete sestavovat a využívat svůj první podprogram. Aby
16 Mikroprocesorová technika vše bylo jednoduché a srozumitelné, bude se jednat o úpravu aplikace z předešlého bodu. Podprogram bude realizovat zpožd ovací smyčku. Teorie volání a návratů z podprogramů byla probrána na přednášce. Připomeňme jen, že ke správné funkci podprogramu musí být část datové paměti vyhrazena pro zásobník. Definice zásobníku je možné naprogramovat následujícím způsobem. ldi r16,low(ramend) ; načtení nižšího bytu posledního slova adresy ram out spl,r16 ; naplnění nižšího bytu ukazatele na zásobník ldi r16,high(ramend); načtení vyššího bytu posledního slova adresy ram out sph,r16 ; naplnění vyššího bytu ukazatele na zásobník Bod 4. Vytvořte nový projekt v JSA. Aplikace bude obsahovat hlavní funkci a dva vnořené podprogramy. V hlavní části definujte zásobník a zavolejte první z podprogramů. Ten může obsahovat libovolné instrukce (např. NOP) a volání druhého podprogramu. Pro větší přehlednost je možné v kódu využít direktivy specifikující adresy, kde mají být podprogramy uloženy. Aplikaci spust te v simulátoru a při krokování si poznačte hodnoty ukazatele na zásobník (SP), programového čítače (PC) a návratovou adresu před voláním prvního a druhého podprogramu. Po skoku do podprogramu pak zjistěte změny PC a SP. Jaká data jsou uložena v zásobníku? Obsah paměti je možné zobrazit volbou View/Memory. 2.4 Shrnutí Laboratorní úloha umožňuje studentům osvojení si použití vstupně/výstupních portů pro obsluhu jednoduchých periferních zařízení. Rovněž představuje tvorbu a programování aplikací pro reálné mikrokontroléry, včetně použití podprogramů pro efektivnější zápis zdrojového kódu. 2.5 Kontrolní otázky Otázka 2.1 Co znamená zkratka ISP a jaké výhody tato metoda přináší? Otázka 2.2 Jaké znáte direktivy překladače a k čemu konkrétně slouží? Otázka 2.3 Nakreslete vývojový diagram aplikace z bodu 3.
Fakulta elektrotechniky a komunikačních technologií VUT v Brně 17 3 Obsluha přerušení Test předchozích znalostí 1. Jaké jsou rozdíly mezi podprogramem a obsluhou přerušení? 2. Jmenujte dvě nutné podmínky, které musí být splněny k zahájení obsluhy libovolného přerušení? 3. Na čem závisí rychlost přetečení interního čítače/časovače? Cíle laboratorní úlohy Cílem laboratorní úlohy je osvojení si práce s přerušením mikrokontroléru v jazyce symbolických adres. Konkrétně bude využito externí přerušení od tlačítka a přerušení od interního čítače/časovače. 3.1 Zadání 1. Seznamte se s hledáním informací v anglickém datasheetu k mikrokontroléru ATmega16. Vyhledejte potřebné informace k nastavení a povolení externího přerušení od tlačítka. 2. V JSA naprogramujte aplikaci 8bitového čítače řízeného externím přerušením. 3. V datasheetu vyhledejte informace pro nastavení interního čítače/časovače 0. 4. V JSA naprogramujte aplikaci 8bitového čítače řízeného přerušením od 8bitového čítače/časovače. Bonus. V JSA naprogramujte aplikaci sdružující již vytvořené programu. Binární čítač z předchozího bodu doplňte dvojici externích přerušení. Jedním tlačítkem resetujte stav čítače, druhým měňte směr čítání. 3.2 Teoretické poznatky Úvodní část programové paměti je u mikrokontrolérů vyhrazeno pro tzv. vektory přerušení. Tyto vektory popisují činnost systému v případě akutních událostí. Pokud dojde u mikroprocesoru k události, která vyvolává přerušení, mikrokontrolér se podívá na konkrétní místo v programové paměti (právě do oblasti vektorů přerušení) a hledá zde program obsluhy vzniklé situace. Z pochopitelných důvodů se do této oblasti nevkládá celý program obsluhy přerušení, ale jen skok na začátek tohoto programu. Počet vektorů přerušení se liší pro jednotlivé procesory (hlavně podle jejich hardwarové vybavenosti). Pro námi používaný mikrokontrolér ATmega16 firmy Atmel lze soupis všech vektorů přerušení nalézt v tabulce 3.1.
18 Mikroprocesorová technika Tabulka 3.1: Přehled vektorů přerušení pro mikrokontrolér ATmega16 Č. Adresa Zdroj přerušení Popis přerušení 1 0x0000 RESET Externí reset, připojení napájení 2 0x0002 INT0 Externí požadavek na přerušení 0 3 0x0004 INT1 Externí požadavek na přerušení 1 4 0x0006 TIMER2 COMP Čítač/časovač 2 - shoda komparace 5 0x0008 TIMER2 OVF Čítač/časovač 2 - přetečení 6 0x000A TIMER1 CAPT Čítač/časovač 1 - zachycení 7 0x000C TIMER1 COMPA Čítač/časovač 1 - shoda s komparátorem A 8 0x000E TIMER1 COMPB Čítač/časovač 1 - shoda s komparátorem B 9 0x0010 TIMER1 OVF Čítač/časovač 1 - přetečení 10 0x0012 TIMER0 OVF Čítač/časovač 0 - přetečení 11 0x0014 SPI, STC Dokončení sériového přenosu SPI 12 0x0016 USART, RXC USART - kompletní příjem dat 13 0x0018 USART, UDRE USART - prázdný datový registr 14 0x001A USART, TXC USART - kompletní vyslání dat 15 0x001C ADC ADC - dokončení A/D převodu 16 0x001E EE RDY EEPROM - komunikace připravena 17 0x0020 ANA COMP Změna výstupu analogového komparátoru 18 0x0022 TWI Událost na I2C sběrnici 19 0x0024 INT2 Externí požadavek na přerušení 2 20 0x0026 TIMER0 COMP Čítač/časovač 0 - shoda komparace 21 0x0028 SPM RDY Uložení do programové paměti připraveno Přerušení, které obsahují všechny systémy je tzv. reset. K němu dojde po připojení napájecího napětí nebo po zresetování systému. Jelikož po zapnutí systému začne mikroprocesor vykonávat instrukce od začátku programové paměti, je vektor přerušení pro reset umístěn právě na adrese 0x0000. Skoky na příslušné obslužné programu lze realizovat například instrukcí rjmp, jak naznačuje obrázek 3.1. Veškerá přerušení je nutné předem povolit v odpovídajících řídicích registrech a navíc povolit globální přerušení ve stavovém registru SREG (Status Register), což lze přímo provést instrukcí sei. Při aktivaci přerušení jsou po dobu vykonání obsluhy přerušení ostatní přerušení obecně zakázána. Obsluhu přerušení je nutné ukončit příkazem reti, který sám opět povolí ostatní přerušení (jedná se o obdobu instrukce ret u návratu z podprogramu). Stejně jako u volání podprogramu je i u obsluhy přerušení nutné předem uložit návratovou adresu. Opět se využije část paměti RAM, která představuje zásobník, tj. na začátku aplikace je nutné jej definovat! Řazení jednotlivých vektorů přerušení v programové paměti zároveň udává jejich prioritu: nejnižší adresa (reset) odpovídá nejvyšší prioritě, atd.
Fakulta elektrotechniky a komunikačních technologií VUT v Brně 19.include<m16def.inc>.org 0x0000 rjmp reset.org 0x0002 rjmp citac ; adresa přerušení při reset ; relativní skok na návěští reset ; adresa externího přerušení INT0 ; relativní skok na návěští citac.org 0x002a ; ulož následující kód od adresy 0x002a reset:... ; definice zásobníku... ; naplnění I/O registrů sei ; globální povolení přerušení loop: ; nekonečná smyčka rjmp loop citac:... ; program pro obsluhu externího přerušení reti ; ukončení obsluhy přerušení Obrázek 3.1: Ukázka zápisu přerušení v jazyce symbolických adres 3.2.1 Externí přerušení Externí přerušení jsou označována jako INT0, INT1 a INT2 a odpovídají trojici konkrétním pinům procesoru. Zajímavostí je, že přerušení funguje, i když jsou samotné piny nastaveny jako výstupní. Každé přerušení má odpovídající maskovací bit, který umožňuje povolení či zakázání daného přerušení. Pro všechny tři externí přerušení se tyto maskovací bity nachází v registru GICR (General Interrupt Control Register). Bit INT1 povoluje přerušení od zdroje INT1, apod. Pro povolení daného přerušení je tedy třeba nastavit odpovídající bit (na hodnotu 1). Dále je nutné nastavit za jakých podmínek se bude externí přerušení generovat. To lze nastavit pomocí bitů ISCn1 a ISCn0 v registru MCUCR (MCU Control Register). Chceme-li např. generovat externí přerušení INT1 s každou nástupnou hranou, je nutné nastavit bity ISC11 a ISC10 v tomto registru. Význam jednotlivých nastavení je znázorněn v tabulce 3.2. Tabulka 3.2: Způsob spouštění externích přerušení INTn (registr MCUCR) ISCn1:ISCn0 Popis 0b00 Nízká úroveň (log. 0) na pinu INTn generuje požadavek 0b01 Jakákoliv změna logické úrovně na pinu INTn generuje požadavek 0b10 Sestupná hrana na pinu INTn generuje požadavek 0b11 Vzestupná hrana na pinu INTn generuje požadavek 3.2.2 Přerušení od čítače/časovače Mikrokontrolér ATmega16 nabízí poměrně širokou škálu nastavení a módů dostupných pro čítače/časovače integrované na čipu. V této laboratorní úloze se budeme zabývat
20 Mikroprocesorová technika pouze základním čítačem/časovačem 0 (jedná se o 8bitový čítač/časovač) a pouze jeho základním použitím. Čítač/časovač můžeme použít bud ve spojení s externím hodinovým signálem, připojeným na pin označený T0 (PB0), nebo s hodinovým signálem mikrokontroléru. Pro větší variabilitu lze nastavit předděličku pro hodinový signál mikrokontroléru a tím zpomalit čítání. Hodnotu předděličky i přepínání zdroje hodin lze nastavit v registru TCCR0 (Timer/Counter Control Register), jehož složení lze nalézt v [5]. Pro nás jsou zajímavé tři bity pro nastavení předděličky (viz. tabulka 3.3). Tabulka 3.3: Nastavení předděličky čítače/časovače 0 (TCCR0) CS02:CS00 Popis 0b000 Hodinový signál odpojen, tj. čítač/časovač 0 nepracuje 0b001 f CP U 0b010 f CP U /8 0b011 f CP U /64 0b100 f CP U /256 0b101 f CP U /1 024 0b110 Externí zdroj řídicího signálu, reakce na sestupnou hranu 0b111 Externí zdroj řídicího signálu, reakce na náběžnou hranu S těmito znalostmi můžeme nechat běžet čítač a pomocí přerušení, které se automaticky generuje při přetečení tohoto čítače, odměřovat daný čas. V samotném programu pak funguje toto přerušení jako nejmenší časová jednotka a programově lze na něj navázat další čítač (např. zvolíme předděličku tak, aby celý cyklus čítače trval 10ms a programem pak ošetříme počítání do 100 a dosáhnout tak doby 1s). Stejně jako externí přerušení, má i přerušení od čítače/časovače vlastní registr maskování TIMSK (Timer/Counter Interrupt Mask Register). Pro nás je zajímavý pouze bit TOIE0, který povoluje přerušení od čítače/časovače 0. 3.3 Pokyny k zadání Bod 1. V datasheetu k mikrokontroléru ATmega16 [5] vyhledejte kapitolu týkající se přerušení (anglicky: Interrupts), případně externího přerušení (External Interrupts). K nastavení externího přerušení je nutné naplnit dva řídicí registry, konkrétně GICR a MCUCR. V datasheetu si vyhledejte význam jednotlivých bitů těchto registrů a připravte si bitová slova, kterými naplníte tyto registry. Vyučující vám zadá událost, která bude přerušení spouštět (náběžná hrana, sestupná,...). Využijte externí přerušení INT0 generované tlačítkem na pinu PD2. Bod 2. Ve vývojovém prostředí AVR Studio vytvořte nový projekt a v JSA naprogramujte aplikaci 8bitového binárního čítače, jehož stav zobrazujte pomocí LED diod. Změnu stavu čítače realizujte pomocí tlačítka PD2, které bude spouštět externí přerušení INT0. Využijte nastavení registrů GICR a MCUCR z předešlého bodu. Jedná se o I/O registry,
Fakulta elektrotechniky a komunikačních technologií VUT v Brně 21 proto využijte kombinaci instrukcí ldi a out pro jejich naplnění. Nezapomeňte definovat zásobník a povolit globální přerušení. Stisk mechanického tlačítka ošetřete krátkým zpožděním. Bod 3. Ze znalosti frekvence hodinového signálu f CP U (u STK500 je vybrán interní oscilátor s frekvencí f CP U =1MHz) vypočtěte dobu za kterou dojde k přetečení 8bitového čítače/časovače. Výpočet proved te pro všechny hodnoty předděličky. Podobně jako v bodě 1, vyhledejte v datasheetu k mikrokontroléru ATmega16 [5] kapitolu zabývající se 8bitovým čítačem/časovačem 0 (anglicky: 8-bit Timer/Counter0). K nastavení čítače/časovače 0 je opět nutné naplnit dva řídicí registry, konkrétně TCCR0 a TIMSK. V datasheetu si vyhledejte význam jednotlivých bitů těchto registrů a připravte si bitová slova, kterými naplníte tyto registry. Hodnotu předděličky si zvolte. Bod 4. Ve vývojovém prostředí AVR Studio vytvořte nový projekt a v JSA naprogramujte aplikaci 8bitového binárního čítače, jehož stav zobrazujte pomocí LED diod. Změnu stavu čítače realizujte pomocí přerušení od přetečení čítače/časovače 0. Využijte nastavení registrů TCCR0 a TIMSK z předešlého bodu. Bonus. V JSA vytvořte aplikaci automatického binárního čítače. Využijete zdrojové kódy z bodu 2 a 4. Přerušení od čítače/časovače využijte ke změně stavu binárního čítače. Externím přerušením INT0 resetujte stav čítače a přerušením INT1 (PD3) měňte směr čítání. Je tedy nutné nastavit a povolit generování externího přerušení také od tlačítka z pinu PD3. 3.4 Shrnutí Laboratorní úloha umožňuje studentům proniknout do problematiky obsluhy přerušení mikrokontrolérů. Konkrétně byly popsány vektory přerušení a využití externího přerušení od tlačítka. Druhý typ přerušení byl generován interním čítačem při jeho přetečení. Studenti měli možnost vyzkoušet si programování a otestování aplikací v jazyce symbolických adres. 3.5 Kontrolní otázky Otázka 3.1 Kde a jakým způsobem se ukládají návratové adresy při volání obsluhy přerušení? Otázka 3.2 Jak často bude docházek k přetečení 16bitového čítače, je-li frekvence hodinového signálu 16MHz snížena předděličkou o hodnotě 8? Otázka 3.3 Nakreslete vývojový diagram aplikace z bodu 4.
22 Mikroprocesorová technika 4 Pulzně šířková modulace PWM Test předchozích znalostí 1. K jakým jednoduchým aplikacím lze využít funkce čítání, časování a komparace interního čítače/časovače? 2. V jakém pamět ovém segmentu a od jaké adresy se nachází všechny řídicí (I/O) registry mikrokontroléru ATmega16? 3. Jaké hodnoty obsahují pravdivostní tabulky logických operátorů AND, OR, EX- OR? Cíle laboratorní úlohy Cílem laboratorní úlohy je procvičit si nastavování řídicích I/O registrů a hledání informací v anglické dokumentaci. Cíle budou využity v aplikaci generování PWM signálu pomocí interního 8bitového čítače/časovače. 4.1 Zadání 1. Procvičte si hledáním informací v anglickém datasheetu k mikrokontroléru ATmega16. Vyhledejte potřebné informace k nastavení čítače/časovače 0 pro generování PWM signálu. 2. V JSA naprogramujte aplikaci generující PWM signál se střídou 1 : 2. 3. V JSA naprogramujte aplikaci generující PWM signál s proměnnou střídou. Vizuálně ověřte správnou funkci aplikace pomocí LED diody. Bonus. Modifikujte aplikaci z předešlého bodu, aby se jas LED diody pozvolna snižoval i zvyšoval. 4.2 Teoretické poznatky Pulzně šířková modulace PWM (Pulse Width Modulation) představuje způsob modulování přenášených dat. Modulovaný signál má konstantní periodu, ale proměnnou střídu obdélníkového signálu. Střída (anglicky: duty cycle) udává poměr mezi dobou trvání vysoké a nízké úrovně. Tento poměr bývá vyjádřen v absolutní (např. 1 : 3), nebo procentuální míře (např. 25%). Ukázka vstupního a modulovaného signálu je zobrazena na obrázku 4.1. Jednoduchý modulátor lze realizovat pomocí komparátoru, kdy na jeden vstup přivedeme datový signál, a na druhý vstup signál nosný. Ten je tvořen pilovým průběhem. Komparátor pak překlápí výstupní úroveň v závislosti na poměru obou vstupních signálů.
Fakulta elektrotechniky a komunikačních technologií VUT v Brně 23 Obrázek 4.1: Princip tvorby PWM signálu Ke generování signálu lze velmi snadno využít interní čítač/časovač mikrokontroléru, nastavíme-li ho do funkce komparace. V tomto módu totiž čítač/časovač porovnává hodnotu z datového registru TCNT0 (Timer/Counter Register) s hodnotou uloženou v komparačním registru OCR0 (Output Compare Register). V případě rovnosti obou hodnot je možné měnit úroveň výstupního signálu. Mikrokontrolér ATmega16 umožňuje použití několika módů generování signálu. V této Figure laboratorní 32. Fast úloze PWM se zaměříme Mode, Timing pouze Diagram na mód s označením Fast PWM. Při tomto nastavení čítač načítá hodnoty od 0x00 do 0xff, poté nuluje svůj stav a pokračuje v opakovaném načítání. Neinvertující podoba výstupního signálu je nulována při shodě mezi OCRn Interrupt Flag Set TCNT0 a OCR0 a je nastavena při přetečení čítače TCNT0. Časový diagram popsané funkce je znázorněn na obrázku 4.2. Je zřejmé, že perioda takto generovaného signálu zůstává neměnná, a že závisí pouze na frekvenci hodinového signálu mikrokontroléru a na hodnotě OCRn Update and předděličky. TOVn Interrupt Flag Set TCNTn OCn (COMn1:0 = 2) OCn (COMn1:0 = 3) Period 1 2 3 4 5 6 7 The Obrázek Timer/Counter 4.2: Časový Overflow diagram Flag generování (TOV0) is PWM set each signálu time (obrázek the counter převzat reaches z [5]) MAX. If the interrupt is enabled, the interrupt handler routine can be used for updating the compare value. Aplikaci generování signálu lze obohatit celkem dvěma odlišnými zdroji přerušení. In fast Požadavek PWM mode, na přerušení the compare způsobuje unit jednak allows přetečení generation čítače/časovače of PWM waveforms a také událost on the shody OC0 pin. mezi Setting datovým the COM01:0 a komparačním bits to registrem 2 will produce čítače. a Obě non-inverted tyto přerušení PWM seand povolují an inverted v kon- PWM output can be generated by setting the COM01:0 to 3 (See Table 40 on page 84). The actual OC0 value will only be visible on the port pin if the data direction for the port pin is set as output. The PWM waveform is generated by setting (or clearing) the OC0
24 Mikroprocesorová technika trolním registru TIMSK (Timer/Counter Interrupt Mask Register). 4.3 Pokyny k zadání Bod 1. V datasheetu k mikrokontroléru ATmega16 [5] vyhledejte kapitolu zabývající se 8bitovým čítačem/časovačem 0 (anglicky: 8-bit Timer/Counter0), konkrétně části zabývající se generováním PWM signálu pomocí komparace. K nastavení čítače/časovače 0 je nutné naplnit řídicí registr TCCR0 (Timer/Counter Control Register). V datasheetu si vyhledejte význam jednotlivých bitů tohoto registru a připravte si bitové slovo, kterým tento registr naplníte. Pro generování PWM signálu je nutné nastavit Fast mód PWM, neinvertovanou formu výstupního signálu a hodnotu předděličky. Tuto hodnotu si sami zvolte. Bod 2. Ve vývojovém prostředí AVR Studio vytvořte nový projekt a v JSA naprogramujte aplikaci generující PWM signál se střídou 1 : 2. Definujte port B jako výstupní (na pinu PB3 je pomocí čítače/časovače 0 generován PWM signál). Využijte nastavení registru TCCR0 z předešlého bodu. Střída generovaného signálu je adekvátní hodnotě, kterou uložíte do komparačního registru OCR0 (Output Compare Register). Tato úloha nevyžaduje generování přerušení. Vstupně/výstupní registry lze naplnit s využitím posloupnosti instrukcí ldi a out. Zapsání 8bitového slova do registru způsobem ldi r16,0b00011010 však může být nepřehledné a často je také zdrojem programátorských chyb. Známkou zkušených programátorů je využití pozic jednotlivých bitů v I/O registru, bitového posuvu <<, příp. logického součtu. Jednotlivé bitové pozice (0,..., 7) jsou označovány konstantami, které lze nalézt v datasheetu u popisu každého registru. Jsou-li např. tři nejnižší bity registru TCCR0 pojmenovány CS02, CS01, CS00 a chceme-li uložit do tohoto registru hodnotu 0b00000110, je možné naprogramovat tuto operaci následujícím způsobem. ldi r16,(1<<cs02) (1<<CS01) out tccr0,r16 Zapsání hodnot do všech I/O registrů stačí provést jen jednou. Nezapomeňte váš program ukončit nekonečnou smyčkou, která tedy nebude obsahovat žádné další instrukce. Pomocí hodnoty vámi zvolené předděličky N a se znalostí frekvence hodinového signálu f CP U vypočtěte periodu generovaného signálu. Výpočet ověřte odečtením hodnoty na osciloskopu (jehož sonda je pochopitelně připojena na pin PB3). Rovněž ověřte požadovanou střídu signálu. Při psaní kódu se vyvarujte bezmyšlenkovitého opisování instrukcí, či částí kódu z předešlých laboratorních cvičení. Snažte se o optimalizaci vašeho programu z hlediska místa v programové paměti. Bod 3. V JSA vytvořte aplikaci, která bude lineárně měnit střídu generovaného PWM signálu. Využijte zdrojového kódu z předešlého bodu. Střídu, tj. komparační hodnotu v registru OCR0 inkrementujte v obsluze přerušení, která se spouští právě při komparaci. Z tabulky 3.1 zjistěte vektor tohoto přerušení. Nezapomeňte definovat zásobník, povolit přerušení pro komparaci a globální přerušení. Zvolíte-li hodnotu předděličky 8 nebo 64 budete schopni pozorovat vliv změny střídy na výstupní LED diodě.
Fakulta elektrotechniky a komunikačních technologií VUT v Brně 25 Bonus. Modifikujte zdrojový kód z předešlé úlohy tak, aby se jas LED diody na pinu PB3 pozvolna snižoval a následně zase pozvolna zvyšoval. Z obrázku 4.2 je možné nahlédnout, jakým způsobem toho lze docílit. 4.4 Shrnutí Laboratorní úloha umožňuje studentům hlouběji proniknout do problematiky obsluhy přerušení mikrokontrolérů. Konkrétně bylo generováno přerušení od interního čítače při komparaci. Této funkce lze snadno využít při generování výstupního signálu s proměnnou střídou. 4.5 Kontrolní otázky Otázka 4.1 Jakou hodnotu bude obsahovat komparační registr, má-li být generován obdélníkový signál se střídou 1 : 5? Otázka 4.2 Jaké slovo bude obsahovat řídicí registr TCCR0, má-li být čítač/časovač využit ke komparaci hodnot v normálním módu (non-pwm), při komparaci nulovat výstupní úroveň a inkrementace čítače bude zpomalena 8? Otázka 4.3 Jakou posloupností instrukcí naplníte registr TCCR0 řídicím slovem z předešlé otázky?
26 Mikroprocesorová technika 5 Programování v jazyce C, obsluha přerušení Test předchozích znalostí 1. V jakém typu paměti a od jakých adres se nachází vektory přerušení u AVR? 2. Jak probíhá výkon obsluhy libovolného přerušení? 3. Jak lze v jazyce C naprogramovat podmínku a cyklus? Cíle laboratorní úlohy Cílem laboratorní úlohy je osvojení si programování mikrokontrolérů ve vyšším programovacím jazyce C a práce s přerušením. 5.1 Zadání 1. Seznamte se s programováním mikrokontroléru ATmega16 v jazyce C. Vytvořte aplikaci, generující akustický signál pomocí reproduktoru. 2. Seznamte se s programováním obsluhy přerušení v jazyce C. Vytvořte aplikaci binárního čítače řízeného interním čítačem/časovačem. 3. K aplikaci z předešlého bodu přidejte obslužné tlačítko pro nulování stavu čítače. Bonus. Napište program v jazyce C, který pomocí reproduktoru generuje kolísavý tón (sirénu). 5.2 Teoretické poznatky 5.2.1 Vyšší programovací jazyky Pro vývoj aplikací se zpravidla používají vyšší programovací jazyky, u mikrokontrolérů je to nejčastěji jazyk C. Oproti zdrojovému kódu v jazyce symbolických adres, je kód v jazyce C přehlednější, snadno přenositelný mezi odlišnými architekturami a vývoj takové aplikace je rychlejší. Na druhou stranu zabírá výsledný kód více místa v paměti a jeho výkon je pomalejší. Tato vlastnost je dána mechanizmem překladu zdrojového kódu z C do JSA a následně do strojového kódu mikrokontroléru. Překladač, tj. program nahrazující úseky programu ve vyšším jazyce posloupnosti instrukcí, zpravidla nepracuje optimálně. Přeložený kód tak obsahuje také instrukce, které nejsou bezprostředně nutné k vykonání příslušné funkce. Přesto výhody vyšších jazyků výrazně převyšují tyto nedostatky. V případě, kdy je vyžadována absolutní kontrola nad funkcí a časováním programu, jsou exponované úseky zdrojového kódu psány v JSA, ostatní části jsou ponechány v jazyce C. Programovací jazyk C byl poprvé standardizován americkou společností ANSI (American National Standards Institute) v 80. letech 20. století. Přestože byl tento standard
Fakulta elektrotechniky a komunikačních technologií VUT v Brně 27 následně převzat také mezinárodní společností ISO (International Organization for Standardization), je stále používán název jazyka ANSI C. V současné době je platná verze z března 2000 s označením ISO/IEC 9899:1999 [6]. Krátké přiblížení struktury jazyka C je uvedeno v příloze B. Existuje celá řada překladačů tohoto jazyka do strojového kódu. Navzájem se liší mírou optimalizace výsledného kódu, rychlostí překladu a cenou. Jedním z rozšířených překladačů je GCC (GNU Compiler Collection) [7]. Jak název napovídá, jedná se o soubor překládacích nástrojů projektu GNU, který sdružuje tzv. svobodný software. Doplníme-li překladač GCC knihovnou, popisující strukturu a funkci mikrokontroléru AVR, můžeme tento volný nástroj využít také k vývoji aplikací pro AVR. Pro operační systém Windows je tato kombinace dostupná prostřednictvím open source projektu s názvem WinAVR [8]. Tento nástroj kromě překladače obsahuje také programátor, ladící nástroje a další funkce. Po nainstalování je vše dostupné přímo z vývojového prostředí AVR Studia. 5.2.2 Obsluha přerušení v jazyce C Význam a použití přerušení v jazyce symbolických adres popisuje laboratorní úloha č. 3. Připomeňme, že obsluhu libovolného přerušení je nutné vložit do pamět ového prostoru, který udává vektor přerušení. Je tedy nutné vědět, na kterou adresu vektor ukazuje. Při využití programovacího jazyka C a překladače GCC je situace mírně jednodušší. Stačí vytvořit obslužnou funkci (resp. makro) s názvem ISR (Interrupt Service Routine), jejiž jediným parametrem je identifikátor zdroje přerušení. Ty jsou pro mikrokontrolér ATmega16 vypsány v tabulce 5.1. Např. pro externí požadavek na přerušení č. 0 je to parametr INT0 vect, apod. Konkrétní adresu vektoru přerušení doplní až překladač. Ten také sám definuje zásobník, či zajišt uje návrat z obsluhy přerušení. Kostra zdrojového kódu, využívající externího přerušení č. 0 je zobrazena na obrázku obrázku 5.1. Tento kód je ekvivalentem zdrojového kódu v jazyce symbolických adres z obrázku 3.1. Specifika knihovny pro programování mikrokontrolérů AVR (avr-libc) je možné nalézt v kapitole B.4 a na internetové stránce [9]. 5.3 Pokyny k zadání Bod 1. Pro naši další práci v laboratorních cvičeních budeme využívat vývojovou desku DEVELOPMENT BOARD ATmega16 vyvinutou na Ústavu radioelektroniky cíleně pro předmět Mikroprocesorová technika. Zapojení desky a její popis je uveden v příloze A. Jádrem desky je mikrokontrolér ATmega16-16AU s externím krystalem o frekvenci 16MHz. K I/O branám procesoru lze propojením příslušných propojek připojovat různé periferní obvody, LED diody, tlačítka, klávesnici, LED displej, LCD znakový displej, reproduktor se zesilovačem, řadiče rozhraní RS-232 a USB, D/A převodník či hodinový obvod s kalendářem, řízený sběrnicí I2C. Práce s periferními zařízeními je podstatou mikroprocesorových aplikací a bude náplní dalších laboratorních úloh. Ve vývojovém prostředí AVR Studio vytvořte nový projekt v jazyce C (v kolonce Project type je nutné vybrat volbu AVR GCC) pro mikrokontrolér ATmega16. Do projektu vložte hlavičkový soubor avr/io.h, který obsahuje popis vybraného mikrokon-
28 Mikroprocesorová technika Tabulka 5.1: Přehled vektorů přerušení pro mikrokontrolér ATmega16 Č. Adresa Parametr v C (GCC) Popis přerušení 1 0x0000 Externí reset, připojení napájení 2 0x0002 INT0 vect Externí požadavek na přerušení 0 3 0x0004 INT1 vect Externí požadavek na přerušení 1 4 0x0006 TIMER2 COMP vect Čítač/časovač 2 - shoda komparace 5 0x0008 TIMER2 OVF vect Čítač/časovač 2 - přetečení 6 0x000A TIMER1 CAPT vect Čítač/časovač 1 - zachycení 7 0x000C TIMER1 COMPA vect Čítač/časovač 1 - shoda s komparátorem A 8 0x000E TIMER1 COMPB vect Čítač/časovač 1 - shoda s komparátorem B 9 0x0010 TIMER1 OVF vect Čítač/časovač 1 - přetečení 10 0x0012 TIMER0 OVF vect Čítač/časovač 0 - přetečení 11 0x0014 SPI STC vect Dokončení sériového přenosu SPI 12 0x0016 USART RXC vect USART - kompletní příjem dat 13 0x0018 USART UDRE vect USART - prázdný datový registr 14 0x001A USART TXC vect USART - kompletní vyslání dat 15 0x001C ADC vect ADC - dokončení A/D převodu 16 0x001E EE RDY vect EEPROM - komunikace připravena 17 0x0020 ANA COMP vect Změna výstupu analogového komparátoru 18 0x0022 TWI vect Událost na I2C sběrnici 19 0x0024 INT2 vect Externí požadavek na přerušení 2 20 0x0026 TIMER0 COMP vect Čítač/časovač 0 - shoda komparace 21 0x0028 SPM RDY vect Uložení do programové paměti připraveno #include <avr/io.h> #include <avr/interrupt.h>... // hlavičkový soubor popisující mikrokontrolér // knihovna potřebná pro přerušení int main( void ) {... // tělo hlavní funkce sei() ; // globální povolení přerušení while( 1 ) ; // nekonečná smyčka } ISR( INT0_vect ) {... // program pro obsluhu externího přerušení } Obrázek 5.1: Ukázka zápisu přerušení v programovacím jazyce C
Fakulta elektrotechniky a komunikačních technologií VUT v Brně 29 troléru. V tomto souboru jsou názvy všech řídicích registrů definovány velkými písmeny, proto mějte na paměti, že ve zdrojovém kódu musíte používat právě tento zápis. Vašim úkolem bude rozezvučet reproduktor. Reproduktor se zesilovačem je připojen k jednomu z vývodů I/O brány mikrokontroléru (viz. schéma). Reproduktor rozezvučíme generováním periodické změny tohoto pinu nastaveného jako výstupní. Aby byl generovaný tón v akustickém pásmu, je nutno do programu zařadit zpožd ovací smyčku, která zajistí prodloužení doby, kdy je hodnota signálu v úrovni log. 0 nebo log. 1, jak naznačuje obrázek 5.2. Tuto smyčku naprogramujte jako cyklus. Ve zdrojovém kódu si osvojte také syntaxi podmínky a deklarace proměnných. Obrázek 5.2: Princip změny frekvence generovaného akustického signálu Vytvořenou aplikaci naprogramujte do paměti mikrokontroléru pomocí programovacího modulu ISP. Tento modul je na desce DEVELOPMENT BOARD ATmega16 umístěn pod maticovou klávesnicí a jeho správná funkce je indikována zelenou signální SMD diodou. Jedná se o modul AVRISP mkii firmy Atmel [10], proto při navázání komunikace AVR Studia s programátorem je nutné vybrat právě tento produkt, jak naznačuje obrázek 5.3. Obrázek 5.3: Výběr programátoru AVRISP mkii Po ověření správné činnosti programu, smažte obsah paměti Flash mikrokontroléru - na důvod přijdete sami. To lze provést tlačítkem Erase Device, které se nachází v programovacím dialogu. Bod 2. Ve vývojovém prostředí AVR Studio vytvořte nový projekt v jazyce C a naprogramujte 4bitový binární čítač, který bude inkrementovat svou hodnotu každou sekundu a bude řízen přetečením 16bitového čítače/časovače 1. Stav čítače zobrazte pomocí LED diod, které jsou připojeny k horní polovině portu D. Pro správnou funkci stačí nastavit předděličku v řídicím registru TCCR1B (Timer/Counter1 Control Register B) a povolit přerušení při přetečení v registru TIMSK (Timer/Counter Interrupt Mask Register). Struktury registrů naleznete v datasheetu [5]. Vypočtěte doby přetečení čítače/časovače 1 pro všechny hodnoty předděličky v případě, že frekvence hodinového signálu mikrokontroléru
30 Mikroprocesorová technika na vývojové desce je f CP U =16MHz. Řídicí registry naplňujte způsobem kombinování bitového posuvu doleva << a logického součtu, ukázaným na přednáškách. Bod 3. K aplikaci z předchozího bodu přidejte obsluhu externího požadavku na přerušení INT0, řízené tlačítkem. Tato obsluha necht resetuje stav binárního čítače. Realizujte jednoduchou metodu ošetření stisku mechanického tlačítka. Jaké tlačítko je zdrojem přerušení INT0 na vývojové desce? Bonus. V jazyce C naprogramujte aplikaci, která generuje sirénu, tj. periodickou změnu dvou tónů. Nakreslete časový průběh generovaného signálu. Pro odměřování potřebných časových intervalů využijte přetečení interních čítačů/časovačů 0 a 1. Jeden z nich nastavte pomocí předděličky pro generování příslušných frekvencí výstupního signálu a druhý pro odměřování doby trvání obou tónů. 5.4 Shrnutí Laboratorní úloha umožňuje studentům proniknout do problematiky programování mikrokontrolérů v jazyce C. Konkrétně byl popsán způsob tvorby obsluhy přerušení od interního čítače/časovače a externí požadavek na přerušení od tlačítka. 5.5 Kontrolní otázky Otázka 5.1 Kolika bitové jsou proměnné typu char a signed int v jazyce C? Otázka 5.2 Nakreslete vývojový diagram aplikace z bonusového příkladu. Otázka 5.3 Jakým způsobem je možné přepsat následující příkazy v jazyce C do jazyka symbolických adres mikrokontroléru AVR? Kolik bytů přeložený program zabírá? DDRD = 0xf0 ; PORTD = 0 ; TCCR1B = (1<<2) (1<<1) ; sei() ;
Fakulta elektrotechniky a komunikačních technologií VUT v Brně 31 6 Komunikace s LCD displejem Test předchozích znalostí 1. Jaké řídicí signály v mikroprocesorové technice ovládají operaci čtení/zápis? Uved te dvě základní varianty, které využívají např. firmy Intel a Atmel. 2. Co je to ASCII tabulka a jaké údaje obsahuje? 3. Jakým způsobem lze v jazyce C kombinovat výpis textového řetězce s hodnotou proměnné určitého typu (např. typu char)? Cíle laboratorní úlohy Laboratorní úloha si klade za cíl seznámit studenty s možností připojení LCD displeje k I/O portu mikrokontroléru AVR. Využita bude 4bitová datová komunikace mezi mikrokontrolérem ATmega16 a LCD displejem s rozlišením 16 4 znaků. Programování řídicí aplikace bude probíhat ve vyšším programovacím jazyce C a bude využita knihovna pro LCD displej, jejíž autor je Peter Fleury [11]. 6.1 Zadání 1. Seznamte se s knihovnou pro využití LCD displeje v jazyce C. 2. Realizujte binární čítač, který bude ovládán přetečením 16bitového čítače/časovače a jeho stav zobrazte pomocí LED diod a na LCD displeji. 3. Vytvořte dvojici nových znaků, které bude možné zobrazit na LCD displeji. Bonus. Na LCD displeji realizujte jednoduché menu, ve kterém se budete pohybovat pomocí tlačítek. 6.2 Teoretické poznatky Účinný způsob zobrazení informací v celé řadě řídicích aplikací je pomocí LCD displeje. Tato laboratorní úloha je zaměřena na použití znakových LCD displejů. Většina vyráběných LCD displejů je ovládána pomocí řídicího obvodu HD44780 firmy Hitachi [12], příp. jeho ekvivalentů. Tento řadič je ve své podstatě normou pro komunikaci s LCD displeji. Zpravidla se vyrábějí displeje s rozlišením od 8 1 až po 40 4 znaků s podsvícením (žlutozelené, modré) i bez. Znakový LCD displej obsahuje osm datových pinů pro přenos instrukcí a dat, dále sadu tří řídicích signálů a konečně piny pro napájení, nastavení kontrastu a podsvícení. Přestože datové informace, které LCD displej přijímá/vysílá jsou 8bitové, často se komunikace realizuje pouze čtveřicí datových vodičů (označováno jako 4bitová komunikace). Bytová slova se tak posílají ve dvou krocích: nejprve vyšší nibl, následně nižší. Stejným způsobem je realizována komunikace mikrokontroléru ATmega16
32 Mikroprocesorová technika s LCD displejem na vývojové desce, jak naznačuje obrázek 6.1. Je zřejmé, že 4bitovou komunikací byl snížen počet nutných pinů mikrokontroléru z jedenácti na sedm. Konkrétně se jedná o piny PA7 až PA1 na portu A. Obrázek 6.1: Zapojení LCD displeje na vývojové desce ATmega16 Řídicí signál RS slouží k identifikaci, zda jsou mezi mikrokontrolérem a LCD displejem přenášeny instrukce nebo data (RS = 0: instrukce, RS = 1: data). Signál R/W identifikuje, zda dochází k zápisu nebo ke čtení z LCD displeje (R/W = 0: zápis, R/W = 1: čtení). Náběžná hrana signálu E (Enable) označuje okamžik, kdy jsou čtena data z datové a řídicí sběrnice. Proces komunikace mikrokontroléru ve směru k LCD displeji probíhá v několika krocích. Nejprve se nutné nastavit příslušné hodnoty dvou řídicích signálů RS a R/W. Následně se na datové piny D7 : 4 přivede vyšší nibl zapisovaných dat. Příjem těchto dat v LCD displeji je spuštěn kladným pulzem signálu E, který musí trvat několik hodinových cyklů. Následně se na datové piny přivede nižší polovina posílaného bytu a opět se potvrdí krátkým pulsem E. Struktura některých instrukcí pro komunikaci s displejem (resp. s řadičem HD44780) je zobrazena v tabulce 6.1. Formát instrukcí je pevně dán. Jedná se vždy o 1bytové slovo doplněné o řídicí signály RS a R/W. Podrobný soupis všech instrukcí je možné nalézt v literatuře, např. v [13]. Tabulka 6.1: Některé příkazy HD44780 pro komunikaci s LCD displejem RS R/W DB7 : DB0 Popis instrukce 0 0 0000 0001 Smazání displeje 0 0 0000 001x Návrat kurzoru na pozici (0,0) 0 0 0000 1DCB Zapnutí displeje/kurzoru. D: zapnutí displeje. C: zobrazení kurzoru. B: blikání kurzoru 0 0 01cgram adr Nastavení adresy CGRAM segmentu 1 0 8bitová data Zápis dat do paměti CGRAM nebo DDRAM 1 1 8bitová data Čtení dat z paměti CGRAM nebo DDRAM 6.3 Pokyny k zadání Bod 1. V programu AVR Studio vytvořte nový projekt v jazyce C pro mikrokontrolér ATmega16 a pomocí již hotové knihovny pro komunikaci s LCD displejem naprogramujte
Fakulta elektrotechniky a komunikačních technologií VUT v Brně 33 aplikaci, která vypíše textový řetězec na displeji. Knihovnu, jejíž původní autor byl Peter Fleury [11], si stáhněte ze stránek elearningu VUT v Brně. Jedná se o dva soubory s názvy lcd c.c a lcd h.h. Oba zkopírujte do adresáře, kde se nachází zdrojový soubor vaší aplikace. Soubor s koncovkou *.c je taky nutné vložit do vašeho projektu. Postup je snadný. Pravým tlačítkem klikněte na složku obsahující zdrojové soubory (Source Files) v levé části AVR Studia a vložte soubor lcd c.c. Hlavičkový soubor lcd h.h se již vloží do projektu automaticky při překladu. Knihovna pro komunikaci s LCD displejem, kterou jste vložili do projektu, obsahuje veškeré nastavení a funkce pro inicializaci a použití LCD displeje. Soupis pomocných funkcí, které budete potřebovat je uveden v tabulce 6.2. Všechny tyto funkce nevrací žádnou hodnotu. Tabulka 6.2: Soupis některých funkcí knihovny pro LCD Název funkce Popis funkce lcd init() ; Inicializace LCD displeje lcd clrscr() ; Smazání obsahu LCD displeje lcd gotoxy( 0,2 ) ; Přesun kurzoru na pozici (0,2) lcd putc( A ) ; Zobrazení znaku A lcd puts( "BMPT" ) ; Zobrazení řetězce znaků BMPT lcd command( 0b01000000 ) ; Zápis 1bytové instrukce do LCD displeje lcd data( 0b00001010 ) ; Zápis 1bytových dat do LCD displeje Naprogramujte aplikaci, která využije prvních pět funkcí z tabulky 6.2. Nezapomeňte vložit hlavičkový soubor knihovny LCD displeje. Knihovny, dostupné ve stejném adresáři jako celá aplikace se vkládají příkazem #include "nazev knihovny h". V hlavní funkci aplikace inicializujte LCD displej a následně na různé pozice vypište libovolné znaky a řetězce. Funkci ukončete prázdnou nekonečnou smyčkou. Bod 2. Již vytvořený projekt z předešlého bodu rozšiřte o obsluhu přerušení při přetečení 16bitového čítače/časovače. Toto přerušení bude inkrementovat stav 4bitového binárního čítače (viz. laboratorní úloha č. 5). Kromě zobrazení stavu čítače pomocí LED diod, zobrazte jeho stav také na LCD displeji. Hodnotu proměnné je možné zobrazit pomocí kombinace příkazů sprintf() z knihovny stdio.h a funkce lcd puts(). Konkrétní použití a syntaxi uvedených příkazů vám ukáže vyučující. Bod 3. Dostupná znaková sada LCD displeje je zobrazena v příloze C. Kromě těchto znaků je možné nadefinovat až osm nových znaků. Uživatelsky definované znaky jsou v LCD displeji uloženy od adresy 0x00 do 0x07. Tento úsek paměti se jmenuje CGRAM (Character Generator RAM). Znaky se definují v matici 5 8 bodů. Zobrazený pixel bude v této matici obsahovat hodnotu 1, body které mají být skryty, obsahují 0. Jeden znak je tedy reprezentován osmicí slov (jedno slovo na řádek). Příklad nově definovaného znaku je znázorněn na obrázku 6.2. Do podobné matice si postupně znázorněte dva znaky, které chcete nadefinovat.
34 Mikroprocesorová technika 4 3 2 1 0 data..... 0b00000 1... 1 0b10001. 1. 1. 0b01010.. 1.. 0b00100. 1. 1. 0b01010 1... 1 0b10001..... 0b00000..... 0b00000 Obrázek 6.2: Nově definovaný znak pro LCD displej Nový znak má smysl uložit do paměti CGRAM na samém začátku aplikace. K nastavení této adresy využijte příkaz lcd command(), jehož argument naleznete v tabulce 6.1. Bezprostředně po této instrukci, LCD displej očekává uložení osmi datových slov popisujících samotný znak, tj. osmkrát využijte funkci lcd data(). Pro správnou komunikaci je nutné po uložení nového znaku, zavolat funkci smazání obsahu displeje lcd clrscr(). Zobrazit znak, uložený na adrese 0x00 lze pomocí funkce lcd putc(0x00). Na LCD displeji současně zobrazte vaše dva nové znaky. Bonus. V programu AVR Studio vytvořte nový projekt v jazyce C pro mikrokontrolér ATmega16 a naprogramujte aplikaci pro LCD displej realizující listování v menu. K posunu v menu využijte dvojice tlačítek. Třetím tlačítkem potvrzujte výběr. Menu může např. ovládat stav LED diod na vývojové desce. 6.4 Shrnutí Laboratorní úloha představuje možnost propojení LCD displeje s mikrokontrolérem. Pro vzájemnou komunikaci byla použita 4bitová verze datové komunikace a knihovna funkcí pro LCD displej, dostupná na Internetu [11]. Studenti si osvojili volání těchto pomocných funkcí, společně s možností vytvoření nového znaku, který není obsažen ve znakové sadě LCD displeje. 6.5 Kontrolní otázky Otázka 6.1 Načrtněte časové průběhy všech datových i řídicích signálů při čtení 8bitového slova (např. 0x4c) z LCD displeje do mikrokontroléru. Datová komunikace je nastavena jako 4bitová. Otázka 6.2 V binární podobě zapište matici, reprezentující znak A ve znakové sadě LCD displeje. Otázka 6.3 Jakým způsobem je možné vkládat instrukce mikrokontroléru AVR do zdrojového kódu v jazyce C?
Fakulta elektrotechniky a komunikačních technologií VUT v Brně 35 7 Zpracování analogových signálů Test předchozích znalostí 1. Jaká je funkce A/D převodníku a na čem závisí kvantizační chyba? 2. Jak dlouho trvá mikrokontroléru ATmega16 jeden A/D převod? 3. Jak se vypočte napětí na odporovém děliči? 4. Liší se nějak následující způsoby vkládaní knihovny v jazyce C: #include <nazev knihovny.h> a #include "nazev knihovny.h"? Cíle laboratorní úlohy Cílem laboratorní úlohy je použití dvou běžných interních periférií mikrokontrolérů ke zpracování analogového signálu. Jedná se o A/D převodník a analogový komparátor. Studenti si osvojí ovládání těchto periférií pomocí příslušných kontrolních registrů. Dalším cílem úlohy je použití přerušení a zobrazení dat na LCD displeji. 7.1 Zadání 1. S pomocí datasheetu ATmega16 si připravte potřebný obsah řídicích registrů A/D převodníku. 2. Vytvořte aplikaci s jejíž pomocí budete schopni změřit hodnotu napětí na odporu. 3. S pomocí datasheetu si připravte potřebný obsah řídicího registru analogového komparátoru. 4. Naprogramujte aplikaci, která bude porovnávat napětí na tlačítku S4 s vnitřním referenčním napětím V BG. Stav signalizujte pomocí LED diody a pomocí LCD displeje. 7.2 Teoretické poznatky Všechna digitální zařízení jsou schopna zpracovávat data pouze v číslicové podobě. Vzhledem k situaci, že okolní svět je vždy analogový, je potřeba zpracovávaná data pro mikrokontrolér nejprve převést. K běžné výbavě mikrokontrolérů patří interní A/D převodník, či analogový komparátor. Přítomnost těchto periférií minimalizuje počet externích součástek v zapojení řídicí aplikace. Právě těmto perifériím je věnováno následující laboratorní cvičení. Vstupní analogový signál může reprezentovat celou řadu veličin: signál od teplotního, nebo tlakového čidla, úroveň akustického signálu, velikost napětí, apod. A/D převod (podobně jako D/A) je ve své podstatě otázkou proporcí, tj. jak velkou hodnotu má vstupní signál vzhledem k maximálnímu rozsahu převodníku. Například, pokud má vstupní analogový signál hodnotu 2V a maximální rozsah převodníku je 5V, reprezentuje výstupní
36 Mikroprocesorová technika digitální hodnota 40% plného rozsahu. Použijeme-li jiné maximální (referenční) napětí, bude výstupní hodnota také odlišná i přes konstantní napětí na analogovém vstupu! Výstupní signál A/D převodníku je reprezentován posloupností bitů. Počet těchto bitů specifikuje počet rozlišitelných úrovní převáděného signálu. U 8bitového A/D převodníku je to 256, u 10bitového 1 024 úrovní, apod. Obecně je tedy úlohou A/D převodníku převádět napětí vstupního analogového signálu na nbitovou digitální reprezentaci v závislosti na referenčním napětí. Z předchozí úvahy plyne rovnice pro vyjádření závislosti mezi hodnotou vstupního napětí a její digitální reprezentací ADCH : L = V IN V REF (2 n 1), (7.1) kde ADCH : L je digitální hodnota převedeného napětí V IN, V REF představuje maximální hodnotu vstupního napětí a n je počet bitů určených k A/D převodu. Doba A/D převodu u ATmega16 je odlišná pro první převáděnou hodnotu a pro všechny následující vzorky. U prvního převodu je nutné nastavit použité analogové obvody převodníku, takže převedená hodnota je k dispozici za 25 cyklů hodinového signálu pro A/D převodník a za 13 cyklů pro všechny následující vzorky. Za předpokladu, že frekvence hodinového signálu A/D převodníku musí být v rozmezí od 50kHz do 200kHz, je možné dosáhnout rychlosti převodu až 15,3kSPS (Samples Per Second). A/D převodník obsažený v ATmega16 je 10bitový. Druhou možností jak získat digitalizovanou podobu analogového signálu je použití analogového komparátoru. Analogový komparátor je periférie, která porovnává úrovně dvou analogových signálů. U mikrokontroléru ATmega16 je první z nich přiveden na neinvertující vstup komparátoru AIN0, druhý na invertující AIN1. Fyzicky se jedná o piny PB2 a PB3. Je-li splněna podmínka AIN0 > AIN1, pak výstup komparátoru vykazuje log. 1. Mikrokontrolér ATmega16 navíc umožňuje nahradit neinvertující vstup komparátoru AIN0 vnitřním referenčním napětím V BG, jehož typická hodnota je 1,23V. Výstupní hodnotu komparátoru, resp. její změnu, není nutné neustále kontrolovat. Zda došlo k překlopení výstupního stavu komparátoru je výhodnější indikovat pomocí přerušení. To lze generovat při změně komparátoru z log. 1 na log. 0 nebo obráceně, příp. při každé změně stavu komparátoru. Podrobný popis použití A/D převodníku a analogového komparátoru je možné nalézt v datasheetu [5]. 7.3 Pokyny k zadání Bod 1. Požadovanou funkci A/D převodníku (anglicky: Analog to Digital Converter) je nutné nastavit v řídicích registrech ADMUX (ADC Multiplexer Selection Register) a ADCSRA (ADC Control and Status Register A). S pomocí datasheetu [5] si připravte hodnoty obou řídicích registrů. V registru ADMUX nastavte napájecí napětí AVCC jako referenční a jako vstupní kanál převodníku vyberte ADC0. V kontrolním a stavovém registru ADCSRA povolte použití A/D převodníku, zahájení A/D převodu, generaci přerušení po jeho dokončení a rychlost s jakou bude A/D převod probíhat. Nastavte takovou předděličku, aby frekvence odvozeného hodinového signálu byla v rozmezí 50kHz až 200kHz. Vypočtěte frekvenci hodinového signálu pro A/D převodník pro všechny hodnoty předděličky za předpokladu, že frekvence MCU je 16MHz.
Fakulta elektrotechniky a komunikačních technologií VUT v Brně 37 Bod 2. Naprogramujte aplikaci pro mikrokontrolér ATmega16 v jazyce C, která změří hodnotu napětí na výstupu odporového děliče. Zapojení děliče je uvedeno na obrázku 7.1. Ke změření úrovně analogového napětí použijte vnitřní 10bitový A/D převodník mikrokontroléru. Převedenou hodnotu zobrazte na LCD displeji. Potřebné knihovny pro komunikaci s LCD displejem si stáhněte ze stránek elearningu VUT v Brně, nebo použijte z laboratorního cvičení č. 6. Po vytvoření nového projektu v programu AVR Studio do něj nezapomeňte vložit zdrojový soubor knihovny lcd c.c (postup je naznačen v uvedeném laboratorním cvičení). Obrázek 7.1: Zapojení odporového děliče v poli konektorů vývojové desky Vzhledem k situaci, že interní A/D převodník je 8kanálový a využívá I/O piny PA7(ADC7) až PA0(ADC0) umístěné na portu A (ke kterému je ovšem připojen také LCD displej, který budeme rovněž používat, viz. schéma zapojení na obrázku A.1), je nutné využít jediný volný kanál A/D převodníku umístěný na pinu PA0(ADC0). Propojení odporového děliče a tohoto vstupu A/D převodníku je realizováno v poli konektorů KA až KD na vývojové desce. Zkontrolujte správné zapojení děliče, ale neměňte jej! A/D převodník budeme využívat v tzv. jednoduchém převodu (režimu), kdy vstupní napětí jednoho kanálu je vztaženo k zemi. A/D převodník umožňuje také převod diferenční hodnoty napětí dvou vstupních signálů včetně řízení zesílení. Tento režim ovšem nebudeme využívat. Napište obsluhu přerušení, která se spustí, bude-li k dispozici 10bitová digitální hodnota převedeného napětí. Zobrazte tuto hodnotu na LCD displeji. Proved te ruční výpočet vstupního napětí ve voltech a vypočtěte hodnotu neznámého odporu R2. Hodnotu rezistoru R1 vám sdělí vyučující. Převedená hodnota je uložena ve dvou datových registrech ADCH:L (ADC Data Register). V jazyce C jsou oba registry sjednocené do jediné 16bitové proměnné ADCW, kterou můžete v aplikaci využít. Bod 3. V datasheetu [5] vyhledejte kapitolu týkající se analogového komparátoru (anglicky: Analog Comparator) a připravte si obsah kontrolního a stavového registru ACSR (Analog Comparator Control and Status Register). Pomocí tohoto registru vyberte referenční napětí (Bandgap reference) místo neinvertujícího vstupu AIN0 a povolte generování přerušení při každé změně výstupu komparátoru. Bod 4. V jazyce C naprogramujte aplikaci pro mikrokontrolér ATmega16, která porovnává napětí na tlačítku S4 s interní referenční hodnotou V BG = 1, 23V. Využijte k tomu analogový komparátor mikrokontroléru ATmega16. K invertujícímu vstupu komparátoru AIN1 je pomocí drátové propojky v poli konektorů připojen výstup tlačítka S4. Výstupní stav komparátoru indikujte pomocí LED diody a pomocí LCD displeje. In-
38 Mikroprocesorová technika dikování naprogramujte v rámci obsluhy přerušení, která bude generována při každé změně výstupní hodnoty komparátoru. Hodnota na výstupu komparátoru je rovněž uložena v registru ACSR. K testování příslušného bitu využijte některé z funkcí uvedených v tabulce B.5. 7.4 Shrnutí Laboratorní úloha umožnila studentům osvojení si práce s perifériemi mikrokontroléru ATmega16 pro zpracování analogového signálu. Jednalo se o 10bitový interní A/D převodník a analogový komparátor. Obě periférie jsou ovládány pomocí kontrolních registrů uložených v datové paměti SRAM v oblasti I/O registrů. Po absolvování laboratorního cvičení by studenti měli být schopni nastavit základní použití obou interních periférií a řídit tak A/D převod nebo komparaci dvou signálů, včetně generování příslušných přerušení a práce s LCD displejem. 7.5 Kontrolní otázky Otázka 7.1 Jaké minimální napět ové kroky je schopen rozlišit A/D převodník mikrokontroléru ATmega16 při použití vnitřního zdroje referenčního napětí nebo externího zdroje 5V? Otázka 7.2 Nakreslete typické převodní charakteristiky komparátoru pro zapojení se zpětnou vazbou a bez ni. Otázka 7.3 Jakou hodnotu obsahuje programový čítač při zahájení obsluhy přerušení od A/D převodníku a analogového komparátoru? Které z těchto přerušení se vykoná jako první za předpokladu, že oba požadavky přišly současně?
Fakulta elektrotechniky a komunikačních technologií VUT v Brně 39 8 Sériový přenos dat Test předchozích znalostí 1. Jaký je rozdíl mezi synchronní a asynchronní komunikací? Kam patří UART? 2. Jaká je struktura asynchronního rámce? Co je to paritní bit a jakým způsobem se vypočte? 3. Co to je symbolová rychlost a jak se liší od bitové rychlosti? 4. Jakým způsobem je možné v jazyce C naprogramovat cyklus typu: opakuj dokud i 0? Cíle laboratorní úlohy Cílem této laboratorní úlohy je seznámit studenty s řízením sériové asynchronní komunikace UART. V laboratořích používaný mikrokontrolér ATmega16 sice obsahuje jednotku, která umožňuje také synchronní komunikaci USART, ale zadání je kvůli jednoduchosti a snadnějšímu pochopení problematiky koncipováno pouze na využití UART. 8.1 Zadání 1. Připravte si nastavení řídicích registrů asynchronní jednotky USART mikrokontroléru ATmega16 a složení asynchronního rámce. 2. V jazyce C sestavte program pro mikrokontrolér ATmega16, který bude opakovaně vysílat jeden datový rámec pomocí jednotky USART. 3. V jazyce C sestavte program, který bude přeposílat přijatá data zpět do počítače. Pro ošetření přijetí dat využijte přerušení. Bonus. Doplňte řešení předchozího bodu o kód, který umožní pomocí předem definovaných znaků ovládat LED diody na vývojové desce a zobrazovat přijatá dat na LCD displeji. 8.2 Teoretické poznatky Pod označením UART (Universal Asynchronous Receiver and Transmitter) se skrývá integrovaný hardware realizující sériovou komunikaci s okolím. Pro zachování obecnosti pomineme, že mikrokontrolér ATmega16 je vybaven rozhraním USART (Universal Synchronous Asynchronous serial Receiver and Transmitter) podporující navíc i synchronní komunikaci. U asynchronní komunikace mohou být data po sériové lince vyslána v libovolném okamžiku. Na rozdíl od komunikace synchronní, není u asynchronního způsobu komunikace přenášena informace o synchronizaci. Přijímač takového signálu tedy musí být
40 Mikroprocesorová technika schopen data správně interpretovat jiným způsobem. Využívá se předem zvolená struktura datového rámce, pomoci něhož se data posílají. Datový asynchronní rámec obsahuje jeden stop bit (vždy log. 0), dále určitý počet datových bitů v pořadí od LSB k MSB (5 až 9 bitů), volitelný paritní bit pro jednoduché zabezpečení dat (lichá nebo sudá parita) a jeden nebo dva stop bit (log. 1). Znázornění takového rámce je uvedeno na obrázku 8.1. Obrázek 8.1: Struktura asynchronního rámce Aby byl zajištěn korektní příjem dat na přijímací straně je nutné, aby jak vysílač, tak i přijímač používali shodné nastavení rámce. Navíc je nutné, aby symbolová rychlost vysílače byla shodná se symbolovou rychlostí přijímače. Symbolové rychlosti se nastavují v pevně daných hodnotách, přičemž běžné jsou tyto hodnoty: 600, 1 200, 2 400, 4 800, 9 600, 14 400, 19 200, 28 800, 38 400,..., 256 000Bd. Konkrétní hodnotu symbolové rychlosti je potřeba přepočítat s ohledem na řídicí frekvenci f CP U a uložit do registru UBRRH:L (USART Baud Rate Registers). Jedná se o registrový pár, jehož hodnota je dána následujícím vztahem UBRRH : L = f CP U 1, (8.1) 16 SR kde SR je požadovaná hodnota symbolové rychlosti v Bd. V případě, že zvolená symbolová rychlost je větší než 2 400 a frekvence f CP U =16MHz, pak stačí naplnit pouze nižší registr UBRRL. Jednotka UART mikrokontroléru ATmega16 umožňuje pracovat v tzv. normálním režimu (Normal mode) a v režimu s dvojnásobnou přenosovou rychlostí (Double Speed mode). V této laboratorní úloze budeme používat pouze první z režimů. Kromě řídicího registru pro nastavení symbolové rychlosti, obsahuje asynchronní jednotka ještě tři odlišné řídicí registry a jeden datový. Datový registr UDR (USART I/O Data Register) slouží jak pro přijímač, tak i pro vysílač sériových dat. Data, která chceme vyslat, tak stačí pouze zapsat do tohoto registru a UART jednotka již vykoná vše potřebné. Na druhé straně, po dokončení příjmu je datové slovo uloženo právě v registru UDR. Informace o chybě během přenosu, příp. o tom že přenos byl dokončen je možné vyčíst z řídicího registru UCSRA (USART Control and Status Register A). Zajímavý je bit UDRE (USART Data Register Empty), který informuje, zda je datový registr vysílače již prázdný a je tak možné vyslat další data. Zapnutí vysílače a přijímače jednotky USART, povolení generování přerušení při ukončení vysílání a příjmu asynchronního rámce se nastavuje v registru UCSRB (USART Control and Status Register B). Poslední řídicí registr UCSRC (USART Control and Status Register C) obsahuje specifikaci struktury asynchronního rámce, tj. počet datových bitů,
Fakulta elektrotechniky a komunikačních technologií VUT v Brně 41 volbu parity i počtet stop bitů. Asynchronní přijímač RxD a vysílač TxD je u mikrokontroléru ATmega16 vyveden na pinech PD0 a PD1. Tyto vodiče jsou přes převodník úrovní a přes konektor na vývojové desce připojeny se sériovým rozhraním osobního počítače. 8.3 Pokyny k zadání Bod 1. Vypočtěte hodnoty UBRRH:L, které specifikují 3 vámi zvolené symbolové rychlosti jednotky USART. Pro jednoduchost uvažujte symbolové rychlosti větší než 2 400Bd. V datasheetu mikrokontroléru ATmega16 [5] vyhledejte popis řídicích registrů jednotky USART a připravte si potřebné hodnoty pro správnou funkci vysílače. V registru UCSRB proto zapněte vysílač USART a v registru UCSRC nastavte vámi zvolenou strukturu asynchronního rámce. Parametry vybírejte podle možností programu Terminal [14] (viz. obrázek 8.2), pomoci něhož budete komunikovat se sériovým portem počítače, resp. s mikrokontrolérem ATmega16. Podle počtu datových bitů v rámci si zvolte datové slovo, které budete chtít vyslat. Nakreslete časový průběh celého asynchronního rámce s těmito daty podle obrázku 8.1. Obrázek 8.2: Aplikace Terminal pro ovládání sériového portu počítače Bod 2. Vytvořte nový projekt v programu AVR Studio a pro mikrokontrolér ATmega16 naprogramujte v jazyce C aplikaci, která bude schopna opakovaně vysílat jeden asynchronní rámec pomocí jednotky USART. Využijte k tomu nastavení řídicích registrů z předchozího bodu. Nastavte požadovanou rychlost komunikace (vyberte si pouze jednu) a vysílač zapněte. V nekonečné smyčce pak vysílejte vámi zvolenou datovou posloupnost. K vyslání stačí zapsat posloupnost do datového registru UDR. Před samotným zápisem, ale čekejte na vyprázdnění vysílacího registru (viz. bit UDRE v registru UCSRA). Tím bude zajištěno, že nedojde ke ztrátě jediného rámce. K testování tohoto bitu využijte některé z funkcí v tabulce B.5.
42 Mikroprocesorová technika Na osciloskopu, který je připojen na vysílací pin jednotky USART, tj. na PD1 ověřte tvar celého asynchronního rámce a změřte skutečnou bitovou rychlost. Bod 3. Vytvořte nový projekt v prostředí AVR Studio a pro mikrokontrolér ATmega16 naprogramujte v jazyce C aplikaci, která bude přijímat sériová data z počítače pomocí jednotky USART a následně je bude přeposílat zpět. Příjem znaku realizujte jako obsluhu přerušení přijímače USART. Parametr funkce ISR, který identifikuje zdroj přerušení, naleznete v tabulce 5.1. Nezapomeňte přidat do zdrojového kódu veškeré náležitosti, které s přerušením souvisí. K nastavení řídicích registrů jednotky USART z předchozího bodu jen přidejte povolení přerušení při příjmu a zapnutí přijímače v registru UCSRB. Obsluha přerušení necht načte obsah přijatých dat z datového registru UDR, opětovným zapsáním dat do tohoto registru iniciujete následné vyslání. Při vysílání opět nejprve čekejte na uvolnění datového registru vysílače jako v předešlém bodě. Správnou funkci aplikace ověříte vysíláním dat z programu Terminal. Zde by se měly v přijímací části bezprostředně zobrazovat stejná data, která byla vyslána. Nezapomeňte v programu Terminal nastavit shodný formát asynchronního rámce, symbolovou rychlost a zahájit komunikaci tlačítkem Connect. Při sériové komunikaci neuvažujte žádné řízení toku, tj. Handshaking v programu Terminal nezapínejte. Bonus. Doplňte obsluhu přerušení z předešlého bodu o podmínky, pomocí nichž budete testovat hodnotu přijatého slova. Pomocí číslic 1 až 4 negujte stav LED diod D1 až D4. Do projektu také přidejte knihovnu pro práci s LCD displejem. Zobrazujte na něm přijatá data a v případě příjmu ASCII kódu klávesy Esc, vymažte jeho obsah. 8.4 Shrnutí Laboratorní úloha umožnila studentům otestovat obousměrnou asynchronní komunikaci mezi mikrokontrolérem ATmega16 a PC pomocí jednotky UART. Studenti si osvojili dovednosti potřebné k řízení jednotky UART pomocí kontrolních registrů, k odesílání i příjmu znaků přes UART a pomocí osciloskopu si ověřili strukturu asynchronního rámce. 8.5 Kontrolní otázky Otázka 8.1 Jakým způsobem vyhodnotí asynchronní přijímač vyslaná data 0b1 0100, byl-li zvolen přenos bez zabezpečení, 1 stop bit, ale symbolová rychlost přijímače byla nastavena oproti vysílači jako dvojnásobná? Otázka 8.2 Vypočtěte jakou nejvyšší přenosovou rychlost lze získat s mikrokontrolérem taktovaným na 1MHz. Otázka 8.3 Jaké napět ové úrovně využívá UART a RS-232?
Fakulta elektrotechniky a komunikačních technologií VUT v Brně 43 Literatura [1] Váňa, V. Mikrokontroléry Atmel AVR, popis procesorů a instrukční soubor. Ben, technická literatura, Praha, 2003. 335 stran. ISBN 80-7300-083-0. [2] Atmel Corporation. Oficiální stránka firmy Atmel. [online]. 2008 - [cit. 9. října 2008]. Dostupné na WWW: http://www.atmel.com/ [3] Atmel Corporation. 8-bit AVR Instruction Set. [online]. 2008 - [cit. 9. října 2008]. Dostupné na WWW: http://www.atmel.com/dyn/resources/prod_documents/ doc0856.pdf [4] Atmel Corporation. STK500. [online]. 2008 - [cit. 9. října 2008]. Dostupné na WWW: http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2735 [5] Atmel Corporation. 8-bit Microcontroller ATmega16. [online]. 2008 - [cit. 9. října 2008]. Dostupné na WWW: http://www.atmel.com/dyn/resources/prod_documents/ doc2466.pdf [6] Open Standards. International standard ISO/IEC 9899:1999. [online]. 2000 - [cit. 9. října 2008]. Dostupné na WWW: http://www.open-std.org/jtc1/sc22/wg14/ www/docs/n1124.pdf [7] GNU Project. GCC, the GNU Compiler Collection. [online]. 2008 - [cit. 9. října 2008]. Dostupné na WWW: http://gcc.gnu.org/ [8] WinAVR. WinAVR home page. [online]. 2008 - [cit. 9. října 2008]. Dostupné na WWW: http://winavr.sourceforge.net/ [9] C library for use with GCC on AVR. AVR Libc Home Page. [online]. 2007 - [cit. 9. října 2008]. Dostupné na WWW: http://www.nongnu.org/avr-libc/ [10] Atmel Corporation. AVRISP mkii In-System Programmer. [online]. 2008 - [cit. 9. října 2008]. Dostupné na WWW: http://www.atmel.com/dyn/products/tools_ card.asp?tool_id=3808 [11] Fleury, P. LCD Library for HD44870 based LCD s. [online]. 2006 - [cit. 9. října 2008]. Dostupné na WWW: http://homepage.hispeed.ch/peterfleury/avr-software. html [12] Hitachi, Ltd. Oficiální stránky firmy Hitachi. [online]. 2008 - [cit. 9. října 2008]. Dostupné na WWW: http://www.hitachi.com/ [13] Doveda Boys. Znakové LCD displeje - procesory PIC. [online]. 2007 - [cit. 9. října 2008]. Dostupné na WWW: http://www.cmail.cz/doveda/lcd/index.htm [14] HW server. Program Terminal pro komunikaci přes RS232. [online]. 2003 - [cit. 9. října 2008]. Dostupné na WWW: http://rs232.hw.cz/#terminal
44 Mikroprocesorová technika [15] Gadre, V. Programming and Customizing the AVR Microcontroller. McGraw-Hill, New York (USA), 2001. 339 stran. ISBN 0-07-134666-X.
Fakulta elektrotechniky a komunikačních technologií VUT v Brně 45 A Vývojová deska ATmega16 Obrázek A.1: Zapojení vývojové desky Development Board ATmega16
46 Mikroprocesorová technika B Základní popis jazyka C Jazyk C obsahuje několik tzv. rezervovaných slov, které nelze použít k jinému účelu, než k jakému byly určeny. Nelze je tedy použít jako názvy proměnných či funkcí. Nejpoužívanější rezervovaná slova jsou následující: for, return, switch, case, if, else, while, char, int, float, unsigned, void. Zdrojový kód v jazyce C se skládá výhradně z tzv. funkcí. Funkce je specifikována svým názvem, který se skládá ze znaků anglické abecedy, číslic a podtržítka. Funkce může obsahovat libovolné parametry (vstupní proměnné), a může také vracet hodnotu libovolného typu. Nemá-li funkce vstupní parametry, příp. výslednou hodnotu užívá se k tomu označení void. Tělo celé funkce je ohraničeno párem složených závorek. Každá aplikace musí obsahovat hlavní funkci s názvem main. Tato funkce vrací hodnotu typu int a zpravidla nemá žádný vstupní parametr. Jestliže příkaz, pomoci něhož funkce vrací hodnotu má název return, vypadá tělo funkce main následujícím způsobem. int main( void ) { ; // tělo hlavní funkce return 0 ; // funkce vrací hodnotu 0 } B.1 Proměnné a operandy Číselné hodnoty lze v jazyce C uchovávat pomocí proměnných. Proměnné se dělí na globální, které se definují vně jakékoliv funkce (zpravidla na začátku zdrojového kódu) a lze je použít v kterémkoliv místě programu a na lokální. Lokální proměnné se definují uvnitř funkce, pro kterou jsou určeny. Pro proměnnou je vyčleněn pamět ový prostor při volání funkce a po návratu z ní je opět uvolněn. Z toho plyne, že lokální proměnnou lze použít pouze uvnitř dané funkce. Každá proměnná je charakterizována svým názvem a vyjadřuje hodnotu podle zvoleného typu. Nejpoužívanější typy proměnných jsou znázorněny v tabulce B.1, společně s počtem bitů a odpovídajícím číselným rozsahem. Při deklaraci proměnné ji lze bezprostředně naplnit zvolenou hodnotou. Následující příklad ukazuje deklaraci proměnné i, která je typu neznaménkového 16bitového celého čísla unsigned int a je rovna hodnotě 10. unsigned int i = 10 ; Výčet aritmetických operací a jejich symbolický zápis v jazyce C obsahuje tabulka B.2. V jazyce C se často používá zkrácený zápis aritmetických operací. Lze ho využít v případě, kdy do proměnné, která figuruje v operaci jako první argument, je posléze uložen také výsledek celé operace. Zápis a += 3 tak např. zkracuje rovnici a = a + 3, nebo d /= a popisuje operaci d = d / a, apod. Za zkrácenou formu zápisu lze také považovat operace inkrementace a dekrementace, kdy např. b++ odpovídá zápisu b += 1, nebo b = b + 1. Tabulka B.3 obsahuje soupis bitových a logických operací v jazyce C. Také u bitových a logických operací lze využít zkráceného zápisu operace. Např. a = 3 představuje výraz a = a 3, tj. logickou součet hodnoty 3 s proměnnou a, nebo zápis ve tvaru d = 2 zkracuje formu zápisu bitového posuvu doleva d = d 2.
Fakulta elektrotechniky a komunikačních technologií VUT v Brně 47 Tabulka B.1: Některé typy a rozsahy hodnot proměnných Typ Velikost [b] Rozsah char 8 128 až 127 unsigned char 8 0 až 255 signed char 8 128 až 127 int 16 32 768 až 32 767 unsigned int 16 0 až 65 535 float 32 ±1, 175 10 38 až ±3, 402 10 38 Tabulka B.2: Aritmetické operace Operace Operand Násobení * Dělení / Dělení modulo % Sčítání + Odečítání - Inkrementace ++ Dekrementace -- Tabulka B.3: Bitové a logické operace Operace Operand Jednotkový doplněk Bitový posuv doleva Bitový posuv doprava Logický součin AND & Logický součet OR Exkluzivní součet EX-OR B.2 Syntaxe podmínky Podmínka slouží k větvení programu, tj. k situaci, kdy je část kódu vykonána pouze v případě pravdivé podmínky. Podmínky lze tvořit pomocí relačních operandů, které jsou uvedeny v tabulce B.4. Syntaxe jednoduché podmínky využívající příkazu if je znázorněna v následující ukázce. V tomto případě se část kódu uzavřená složenými závorkami vykoná pouze v případě, že hodnota proměnné a je rovna konstantě N. if( a == N ) { ; } Druhý častý způsob zápisu podmínky je pomocí kombinace rezervovaných slov switch a case. Využívá se v případě, že proměnná může nabývat několika málo hodnot.
48 Mikroprocesorová technika Tabulka B.4: Relační operandy Operace Operand Je roven == Je různý od!= Menší než < Menší nebo roven <= Větší než > Větší nebo roven >= V následujícím případě je testována hodnota proměnné b, která může být rovna 0, 1 nebo libovolnému jinému číslu. switch( b ) { case 0: ; case 1: ; default: ; } B.3 Syntaxe cyklu Jistým druhem podmínky je také každý cyklus. Cyklus se nejčastěji programuje příkazem for, který vykoná daný kód s určitým opakováním. Následující příklad ilustruje cyklus, který proběhne právě N. for( i=0; i<n; i++ ) { ; } Druhým častým způsobem opakovaného výkonu programu je smyčka řízena příkazem while, která opakuje kód, dokud je splněna podmínka. V našem případě je to podmínka dokud hodnota proměnné a je různá od nuly. while( a!=0 ) { ; } Každý kód pro číslicové systémy obsahuje nekonečnou smyčku, která neustále vykonává stejnou posloupnost operací. Zpravidla se jedná o periodické načítání data ze vstupních zařízení, jejich následné zpracování a případné vyslání na výstupní zařízení. Existují dva jednoduché postupy, jak naprogramovat nekonečnou smyčku v jazyce C. Oba jsou uvedeny v následujícím zdrojovém kódu.
Fakulta elektrotechniky a komunikačních technologií VUT v Brně 49 while( 1 ) { ; } for( ;; ) { ; } V případě, že aplikace využívá přerušení je běžné, že nekonečná smyčka neobsahuje žádné další příkazy. Veškeré zpracování je pak prováděno jen v rámci obslužných funkcí jednotlivých přerušení. Předešlý zdrojový kód se pak ještě zjednoduší. while( 1 ) ; for( ;; ) ; B.4 Specifika překladače GCC a knihovny avr-libc Překladač jazyka C, který je použit v laboratoři Mikroprocesorové techniky, tj. GCC využívá také speciální knihovnu s názvem avr-libc, která obsahuje některé funkce neobsažené ve standardu ANSI C. Nejčastěji používané funkce jsou uvedeny v tabulce B.5 a lze je využít pro zjednodušení programování mikrokontrolérů AVR. Podrobnější informace lze nalézt v popisu knihovny [9]. Tabulka B.5: Speciální funkce pro mikrokontroléry AVR Operace GCC, avr-libc Obsluha externího přerušení ISR( INT0 vect ) Testování bitu I/O registru if( bit is set( registr,bit )) if( bit is clear( registr,bit )) Cyklus s testováním bitu loop until bit is set( registr,bit ) loop until bit is clear( registr,bit ) Vložení instrukce do jazyka C asm( "sei" ) ;
50 Mikroprocesorová technika C Znaková sada LCD displeje Obrázek C.1: Znaková sada LCD displeje (obrázek převzat z [13])