Ústav radioelektroniky Vysoké učení technické v Brně Programování mikrokontrolérů Mikroprocesorová technika, přednáška č. 4 Ing. Frýza Tomáš, Ph.D. 14. října 2008
Obsah přednášky Typy adresování Registrové, přímé, nepřímé, bezprostřední Větvení programu Programový čítač Volání podprogramu, zásobník Obsluha přerušení Ukázka programu v JSA a v jazyce C pro ATmega16 Programování mikrokontrolérů pomocí vyšších jazyků Překlad aplikace z jazyka C Programování v jazyce C Kombinace jazyka symbolických adres a C Zdroje informací
Obsah přednášky Typy adresování Registrové, přímé, nepřímé, bezprostřední Větvení programu Programový čítač Volání podprogramu, zásobník Obsluha přerušení Ukázka programu v JSA a v jazyce C pro ATmega16 Programování mikrokontrolérů pomocí vyšších jazyků Překlad aplikace z jazyka C Programování v jazyce C Kombinace jazyka symbolických adres a C Zdroje informací
Typy adresování Adresování zpřístupňuje programovou (Flash) a datovou pamět (registry, I/O registry, SRAM). Terminologie Přímé adresování - adresa je součástí instrukce. Přímo lze adresovat pracovní registry, řídicí (I/O) registry, datovou i programovou pamět, Nepřímé adresování - adresa není součástí instrukce. Adresa je uložena v některém z ukazatelů (X, Y nebo Z). Využívá se k opakovanému přístupu k jedné nebo k posloupnosti několika pamět ových buněk. Mikroprocesorové systémy umožňují celou řadu způsobů adresování operandů. Základní způsoby jsou 1) Registrové adresování: zdrojem informace (operand) je registr(y). Např.: mov Rd,Rr
Typy adresování, pokračování 15 10 9 8 4 3 0 OP kód r Rd Rr Obecné pracovní registry R0 R1 0x00 15 9 8 4 3 0 OP kód Rd OP Obecné pracovní registry R0 R1 0x00 R25 R26 (XL) R27 (XH) R28 (YL) R29 (YH) R30 (ZL) R31 (ZH) 0x1F R25 R26 (XL) R27 (XH) R28 (YL) R29 (YH) R30 (ZL) R31 (ZH) 0x1F Obrázek: Adresování dvou (add Rd,Rr) a jednoho (dec Rd) registru Základní způsoby adresování, pokračování 2) Přímé adresování: operandy jsou přímo určeny konkrétní adresou. Např.: call k, 3) Nepřímé adresování: adresa operandu je uložena v tzv. ukazateli, např. registrový pár X, Y nebo Z (X - r26:r27; Y - r28:r29; Z - r30:r31). Např.: ijmp, st X,Rr.
Typy adresování, dokončení 15 12 11 8 7 4 3 0 OP K Rd K Obecné pracovní registry R0 R1 0x00 R25 R26 (XL) R27 (XH) R28 (YL) R29 (YH) R30 (ZL) R31 (ZH) 0x1F Obrázek: Bezprostřední adresování 8bitové konstanty (ldi Rd,K) Základní způsoby adresování, dokončení 4) Bezprostřední adresování: hodnota operandu je přímo obsažena v instrukci. Např.: ldi Rd,K Vícebitové procesory (DSP,...) obsahují další typické způsoby adresování operandů. Různé způsoby adresování zvyšují možnosti mikroprocesorů.
Obsah přednášky Typy adresování Registrové, přímé, nepřímé, bezprostřední Větvení programu Programový čítač Volání podprogramu, zásobník Obsluha přerušení Ukázka programu v JSA a v jazyce C pro ATmega16 Programování mikrokontrolérů pomocí vyšších jazyků Překlad aplikace z jazyka C Programování v jazyce C Kombinace jazyka symbolických adres a C Zdroje informací
Větvení programu Obrázek: Pozice programového čítače Podle von Neumannovy koncepce procesoru jsou instrukce vykonávány sekvenčně, tj. jak jsou uloženy v paměti. Adresu instrukce, která se bude vykonávat specifikuje programový čítač (PC program counter). Při startu systému je hodnota PC vynulována. Dále je zpravidla pouze inkrementována. Při podmínkách, nepodmíněných skocích, volání podprogramu, obsluze přerušení dochází ke skokové změně hodnoty PC, tj. k větvení programu.
Programový čítač u AVR Obrázek: Struktura programového čítače Program Counter (PC) je u ATmega16 13bitový (PC12-PC0), tj. může adresovat celkem 2 13 =8k slov (instrukcí). PC je ukazatel na místo v programové paměti, tj. obsahuje adresu vykonávané instrukce. K hodnotám PC nelze přímo přistupovat (číst, zapisovat), protože tento čítač nelze adresovat!! Změnu hodnoty provádíme pouze nepřímo vykonanými instrukcemi.
Podmíněné skoky v programu a!=0 ano podmínka ne Obrázek: Podmínka Podmíněný skok je reakcí na výsledek podmínky. Výsledek podmínky je vždy true nebo false. JSA umožňuje využití jen jednoduchých podmínek. Dva typy instrukcí podmíněných skoků 1) Přeskoč následující instrukci (anglicky: Skip if...), cpse Rd,Rr přeskoč, je-li Rd==Rr (compare, skip if equal), sbic P,b přeskoč, je-li bit b v I/O registru P nulový (skip if bit is cleared), sbis P,b přeskoč, je-li bit b v I/O registru P nastaven (skip if bit is set),...
Podmíněné skoky v programu, pokračování 2) Skoč na návěští (anglicky: Branch if...); houfně se k tomu využívají příznakové bity, BREQ k skoč na návěští k, je-li Z==1 (BRench if EQual), BRNE k skoč na návěští k, je-li Z==0 (BRench if Not Equal), BRVS k skoč na návěští k, je-li V==1 (BRench if V is Set), V-overflow, BRVC k skoč na návěští k, je-li V==0 (BRench if V is Cleared), BRIE k - skoč na návěští k, je-li I==1 (BRench if I is Enable), I-interrupt, BRID k - skoč na návěští k, je-li I==0 (BRench if I is Disable),...
Nepodmíněné skoky v programu Instrukce pro nepodmíněné skoky přímo změní hodnotu v programovém čítači (PC) a tím se realizuje skok v programu. (Není uvažována žádna podmínka). Trojí typ instrukcí pro nepodmíněný skok u AVR RJMP k relativní skok na návěští k (Relative JuMP). Pozn.: Může skočit na adresu v rozsahu 2K k 2K, IJMP nepřímý skok na adresu v registrovém páru Z (Indirect JuMP). Registrový pár Z, tj. r30:r31 funguje jako ukazatel (zdroj adresy), JMP k přímý skok na návěští k (direct JuMP). Pozn.: Může skočit na adresu v rozsahu 0 k 4M. Rozdíly mezi strojovým kódem uvedených instrukcí RJMP: 1100 kkkk kkkk kkkk (12bitová adresa), IJMP: 1001 0100 0000 1001, JMP: 1001 010k kkkk 110k kkkk kkkk kkkk kkkk (22bitová adresa).
Význam a volání podprogramu Podprogram je část kódu, která se často opakuje; do strojového jazyka se přeloží jen jednou. Spouští se zapsáním adresy první instrukce do programového čítače. Trojí typ instrukcí pro volání podprogramu u AVR RCALL k relativní volání podprogramu k (Relative subroutine CALL). Pozn.: Může skočit na adresu v rozsahu 2K k 2K, ICALL nepřímé volání podprogramu; adresa vždy uložena v ukazateli Z (Indirect CALL), CALL k přímé volání podprogramu k (direct subroutine CALL). Pozn.: Může skočit na adresu v rozsahu 0 k 4M. Na rozdíl od (ne)podmíněného skoku dojde po ukončení podprogramu k návrat na instrukci následující po skoku do podprogramu.
Funkce zásobníku k uložení návratové adresy Obrázek: Vnořené volání podprogramů Návratová adresa musí být uložena před skokem do podprogramu do tzv. zásobníku (anglicky: stack). Návratová adresa je adresa instrukce následující po instrukci volající podprogram. Návrat z podprogramu (vyzvednutí návratové adresy ze zásobníku a její zapsání do PC) zajišt uje instrukce RET (subroutine RETurn).
Ukazatel na zásobník Zásobník je část paměti SRAM (může též sloužit k zálohování obsahu registrů r0-r31). Mikrokontroléry, které nemají interní pamět RAM mají hardwarový zásobník s omezenou velikostí. Zapisovat/číst lze ze zásobníku pouze z jedné pozice. Tu udává tzv. ukazatel na zásobník (anglicky: SP stack pointer). Ukazatel je 16bitová hodnota uložená v registrovém páru SPH:SPL. (Patří mezi I/O registry.) Obrázek: Struktura ukazatele na zásobník
Ukazatel na zásobník, pokračování Obrázek: Pozice ukazatele na zásobník Hodnota ukazatele na zásobník musí být inicializována (tzv. definice zásobníku). Definice se provádí jedenkrát a to nejčastěji hned na začátku programu. Ukazatel se naplní adresou poslední pamět ové buňky pamět ového segmentu určeného pro zásobník (zásobník se z důvodu eliminace nechtěného přepsání dat umíst uje na konec paměti RAM) ldi r16,low(ramend) out spl,r16 ldi r16,high(ramend) out sph,r16 (Konstanta ramend obsahuje adresu poslední buňky paměti SRAM.)
Proces zápisu do zásobníku Zásobník funguje jako LIFO systém (Last In First Out poslední zapsán, první čten). Fáze zápisu 16bitové adresy do 8bitového zásobníku 1) Uložení nižšího bytu adresy na pozici adresovanou SP, 2) SP = SP - 1 (SP tak obsahuje adresu volného bytu, kam je možné dále zapisovat), 3) Uložení vyššího bytu adresy na pozici adresovanou SP, 4) SP = SP - 1 (po ukončení procesu tedy SP obsahuje adresu volného bytu v zásobníku). Příklad Jaká data obsahuje zásobník po volání dvou vnořených podprogramů? Necht byly volány z adres 0x0021 a 0x0028 instrukcí rcall.
Proces čtení ze zásobníku Fáze čtení adresy ze zásobníku 1) SP = SP + 1 (ukazatel obsahuje adresu posledního bytu uloženého v zásobníku), 2) Adresovaný vyšší byte návratové adresy je přesunut do PC (nutnost maskování 3 nejvýznamnějších bitů, protože PC je pouze 13bitový), 3) SP = SP + 1 (ukazatel adresuje předposlední uložené slovo), 4) Adresovaný nižší byte návratové adresy je přesunut do PC. Uložené adresy ve stacku zůstanou, ale při následném volání podprogramu se přepíšou novými daty. Příklad Jaké data obsahuje ukazatel na zásobník a programový čítač po návratu ze dvou vnořených podprogramů?
Záloha registrů do zásobníku; instrukce PUSH, POP Kromě zálohy návratové adresy při volání podprogramu, nebo přerušení, lze zásobník využít také jako dočasné odkladiště obsahu registrů r0-r31. Použití např. při volání podprogramu - záloha potřebných reg.; na konci podprogramu hodnoty znovu načíst ze zásobníku. Fáze uložení obsahu 8bitového registru do zásobníku - push Rr, kde r = 0, 1,..., 31 1) Uložení obsahu registru Rr na adresu definovanou SP, 2) SP = SP - 1. Fáze načtení 8bitové hodnoty ze zásobníku do registru - pop Rd, kde d = 0, 1,..., 31 1) SP = SP + 1, 2) Načtení slova z adresy SP do registru Rd. Instrukce pro zálohu registrů mají všechny mikrokontroléry (mohou mít jinou syntaxi, či omezený počet využitelných reg.).
Rozdíl mezi podprogramem a makrem Příklad Jaké jsou základní rozdíly mezi podprogramem a makrem?
Obsah přednášky Typy adresování Registrové, přímé, nepřímé, bezprostřední Větvení programu Programový čítač Volání podprogramu, zásobník Obsluha přerušení Ukázka programu v JSA a v jazyce C pro ATmega16 Programování mikrokontrolérů pomocí vyšších jazyků Překlad aplikace z jazyka C Programování v jazyce C Kombinace jazyka symbolických adres a C Zdroje informací
Obsluha přerušení Běh programu (hodnota PC) je také ovlivnitelný pomocí tzv. přerušení (anglicky: interrupt). V případě, že mikroprocesor obdrží žádost o obsluhu povoleného přerušení, musí přerušit vykonávanou činnost (hlavní program) a spustit příslušný obslužný program. Každý procesor obsahuje sadu možných přerušení interních i externích; zdroje přerušení závisí na hardwarovém vybavení. Obsluha každého přerušení je ovládána tzv. vektorem přerušení v programové paměti; jedná se o adresu od které se začne vykonávat konkrétní obsluha. Každé přerušení má svůj povolovací bit; navíc existuje jeden globální povolovací bit (u AVR ve stavovém registru SREG). Jednotlivé přerušení mají různou prioritu; nižší adresa vyšší priorita (viz. další slajd).
Vektory přerušení mikrokontroléru 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
Vektory přerušení mikrokontroléru ATtiny11 Č. Adresa Zdroj přerušení Popis přerušení 1 0x000 RESET Externí reset, připojení napájení 2 0x001 INT0 Externí požadavek na přerušení 0 3 0x002 I/O piny Změna stavu I/O pinu 4 0x003 TIMER0 OVF Čítač/časovač 0 - přetečení 5 0x004 ANA COMP Změna výstupu analogového komparátoru U ATmega16 je mezi jednotlivými vektory přerušení volných 32 bitů. U ATtiny11 jen 16 bitů pro samotnou obsluhu to nestačí. Pozn.: ATtiny11 neobsahuje datovou pamět, proto není možné definovat softwarový zásobník pro uložení návratových adres. Obsahuje ale hardwarový zásobník, schopný uchování 3 adres (ukazatel na zásobník je 9bitový @ 1kB Flash).
Obsluha přerušení Jednotlivé fáze obsluhy přerušení 1) Dokončí se výkon právě vykonávané instrukce, 2) Zakáže se obsluha případných následujících přerušení, 3) Do zásobníku se uloží adresa následující instrukce v programové paměti (zásobník musí být definován), 4) Podle zdroje přerušení se do PC načte adresa obslužného programu přerušení (např.: PC=0x0002 pro INT0), 5) Vykoná se obsluha přerušení, tj. konkrétní posloupnost instrukcí; do oblasti vektorů přerušení se běžně umíst ují pouze skoky na obslužnou funkci (mezi vektory je jen 32 bitů), 6) Obsluha přerušení se ukončí instrukcí reti (return interrupt); analogie s ukončením podprogramu, 7) Povoĺı se obsluha dalších přerušení, 8) Do PC se načte uložená návratová adresa ze zásobníku, 9) Pokračuje se ve výkonu hlavního programu.
Příklad obsluhy přerušení. Externí přerušení Přerušení se vykoná (obslouží) v případě že 1) Je povoleno konkrétní přerušení, 2) Je povoleno globální přerušení (bit I=1 v registru SREG). Příklad povolení externího přerušení u AVR Řídicí registr GICR (General Interrupt Control Register) obsahuje povolovací bity INT1, INT0, INT2 pro externí přerušení 1, 0 a 2, Pro povolení je nutné nastavit příslušný(é) bit(y) na 1, Povolit globální přerušení v registru SREG instrukcí sei (set interrupt). Konkrétní nastavení (náběžná hrana, sestupná,...) lze definovat v registru MCUCR (MCU Control Register). Požadavek na přerušení je pro CPU signalizován příznakovým bitem v registru GIFR (General Interrupt Flag Register).
Možnosti nastavení externího přerušení Tabulka: Generování externího přerušení (MCUCR) ISCn1:ISCn0 0b00 0b01 0b10 0b11 Popis Nízká úroveň (log. 0) na pinu INTn generuje požadavek Jakákoliv změna logické úrovně na pinu INTn generuje požadavek Sestupná hrana na pinu INTn generuje požadavek Vzestupná hrana na pinu INTn generuje požadavek
Přerušení od čítače/časovače Přerušení lze generovat také při přetečení interního čítače/časovače (např. 8bitový čítač/časovač 0). (Funkce: Inkrementace stavu každou periodu hodinového signálu.) Povolení generování přerušení při přetečení č/č 0 lze nastavit v I/O registru TIMSK (Timer/Counter Interrupt Mask Register) bitem TOIE0. Rychlost čítání čítače lze nastavit pomocí předděličky hodinového signálu (čím větší hodnota předděličky, tím pomalejší čítání), řízené bity CS02, CS01 a CS00 v I/O registru TCCR0 (Timer/Counter Control Register). Globální povolení všech přerušení se zpravidla provádí jako poslední instrukce při nastavování funkce mikrokontroléru. Přetečení č/č 0 je signalizován příznakovým bitem TOV0 v registru TIFR (Timer/Counter Interrupt Flag Register).
Možnosti nastavení přerušení čítače/časovače Tabulka: Nastavení předděličky č/č 0 (TCCR0) CS02:CS00 Popis 0b000 Hodinový signál odpojen. Č/c 0 nepracuje 0b001 f clk 0b010 f clk /8 0b011 f clk /64 0b100 f clk /256 0b101 f clk /1024 Příklad Za jak dlouho dojde k přetečení 8bitového č/č 0, je-li CS02:CS00=010 a f clk =1MHz?
Obsluha přerušení v JSA Při použití přerušení (i podprogramů) je nutné definovat zásobník, tj. naplnit registrový pár SPH:SPL. Jedná se o I/O registry (viz. přednáška o Instrukční sadě), proto se použije kombinace instrukcí LDI a OUT. Běžná praxe u číslicových systémů: hlavní část programu se zacykĺı pomocí nekonečné smyčky. Z ní se skáče na obslužné programu pouze při příchodu požadavku na přerušení. Vektory přerušení použité v ukázce 0x0000 - reset, 0x0002 - externí přerušení 0, 0x001c - byl dokončen AD převod.
Obsluha přerušení v JSA....org 0x0000 ; vektor přerušení pro reset rjmp start ; skok na návěští start.org 0x0002 ; vektor přerušení pro externího zdroje INT0 rjmp tlacitko ; skok na návěští tlacitko.org 0x001c ; vektor přerušení pro AD převod rjmp ad_prevod ; skok na návěští ad_prevod.org 0x002a ; adresa začátku hlavního programu start: ldi temp, high(ramend) ; definice zásobníku... ; kód hlavního programu sei ; povolení globálního přerušení loop: rjmp loop ; nekonečná smyčka tlacitko:... ; kód obsluhy externího přerušení reti ; návrat z obsluhy přerušení ad_prevod:... ; kód obsluhy přerušení pro AD převod reti ; návrat z obsluhy přerušení
Obsluha přerušení v jazyce C Pro využití přerušení v jazyce C je nutné vložit hlavičkový soubor interrupt.h. Není nutné definovat zásobník - respektive udělá to překladač. Rovněř není nutné znát konkrétní adresy vektorů přerušení. Obsluha přerušení představuje funkci ISR (anglicky: interrupt service routine) se vstupním parametrem, který identifikuje zdroj přerušení INT0 vect - externí přerušení, ADC vect - přerušení od AD převodníku. (Všechny informace a ukázky využívají překladače GCC s knihovnou avr-libc.)
Parametry funkce obsluhy přerušení ISR(.) Č. Adresa Parametr v C (GCC) 1 0x0000 2 0x0002 INT0 vect 3 0x0004 INT1 vect 4 0x0006 TIMER2 COMP vect 5 0x0008 TIMER2 OVF vect 6 0x000A TIMER1 CAPT vect 7 0x000C TIMER0 COMPA vect 8 0x000E TIMER0 COMPB vect 9 0x0010 TIMER1 OVF vect 10 0x0012 TIMER0 OVF vect 11 0x0014 SPI STC vect 12 0x0016 USART RXC vect 13 0x0018 USATRT UDRE vect 14 0x001A USART TXC vect 15 0x001C ADC vect 16 0x001E EE RDY vect 17 0x0020 ANA COMP vect 18 0x0022 TWI vect 19 0x0024 INT2 vect 20 0x0026 TIMER0 COMP vect 21 0x0028 SPM RDY vect
Obsluha přerušení v jazyce C #include <avr\io.h> #include <avr\interrupt.h> // hlavičkový soubor pro použitý mikrokontrolér // hlavičkový soubor pro obsluhu přerušení ISR( INT0_vect ) // obsluha externího přerušeni INT0 {... // kód obsluhy přerušení } ISR( ADC_vect ) // obsluha přerušení AD převodníku {... // kód obsluhy přerušení } int main( void ) {... // kód hlavní funkce sei() ; // povolení globálního přerušení while( 1 ) ; // nekonečná smyčka }
Obsah přednášky Typy adresování Registrové, přímé, nepřímé, bezprostřední Větvení programu Programový čítač Volání podprogramu, zásobník Obsluha přerušení Ukázka programu v JSA a v jazyce C pro ATmega16 Programování mikrokontrolérů pomocí vyšších jazyků Překlad aplikace z jazyka C Programování v jazyce C Kombinace jazyka symbolických adres a C Zdroje informací
Proces překladu do strojového jazyka Zdrojový kód v C DDRB = 0xff ; temp = 0x03 ; PORTB = temp ; while( 1 ) PORTB-- ; Přeložený kód v JSA ldi r28,0x5f ldi r29,0x04 out 0x3e,r29 out 0x3d,r28 ser r24 out 0x17,r24 ldi r24,0x03 sts 0x0060,r24 out 0x18,r24 in r24,0x18 subi r24,0x01 rjmp pc-0x0003 Obrázek: Překlad zdrojového kódu z jazyka C Pozn.: sts k,rr - Přímé uložení hodnoty registru do datové paměti SRAM (0 r 31, 0 k 65 535).
Proces překladu do strojového jazyka Adresa Stroj. kód Instrukce Popis funkce 0x0047 E5CF ldi r28,0x5f Load immediate 0x0048 E0D4 ldi r29,0x04 Load immediate 0x0049 BFDE out 0x3e,r29 Out to I/O location 0x004A BFCD out 0x3d,r28 Out to I/O location 0x004B EF8F ser r24 Set Register 0x004C BB87 out 0x17,r24 Out to I/O location 0x004D E083 ldi r24,0x03 Load immediate 0x004E 93800060 sts 0x0060,r24 Store direct to data space 0x0050 BB88 out 0x18,r24 Out to I/O location 0x0051 B388 in r24,0x18 In from I/O location 0x0052 5081 subi r24,0x01 Subtract immediate 0x0053 CFFC rjmp PC-0x0003 Relative jump Tabulka: Zápis ve formátu Intel HEX... :10009000D4E0DEBFCDBF8FEF87BB83E080936000ED :0800A00088BB88B38150FCCF3E
Formát Intel HEX Tabulka: Zápis ve formátu Intel HEX... :10 0090 00 D4E0 DEBF CDBF 8FEF 87BB 83E0 8093 6000 ED :08 00A0 00 88BB 88B3 8150 FCCF 3E Tabulka: Význam jednotlivých bytů formátu HEX : Začátek řádku 10 Počet datových bytů v jednom řádku (0x10=16) 0090 Adresa prvního datového bytu (0x48 2=0x90) 00 Typ kódu (u AVR odpovídá indentifikátoru 64kB pamět. str.) Strojový kód instrukcí (LSB byte uložen dříve) ED Kontrolní součet
Elementární zásady jazyka C Příkaz končí středníkem. Těla funkcí, posloupnosti příkazů u podmínek, cyklů, apod. se združují do složených závorek. Řetězce se uvozují uvozovkami. Komentáře se píší za dvojité lomítko //, nebo do bloku uvozeném /*... */. Rezervovaná slova nelze použít k jinému účelu než je určeno: for, return, switch, case, if, else, char, int, float, unsigned, void,... Deklarace funkce hodnota název funkce( parametr, parametr,... ) { ; }
Deklarace proměnných Proměnná je identifikována názvem a typem char temp, unsigned int ii Před použitím je nutné proměnnou deklarovat. Podle dostupnosti se jedná o Lokální - alokována ve stack (zásobník) nebo heap (hromada) při spuštění funkce, Globální - alokována při překladu, dostupná pro všechny funkce. Tabulka: Některé typy a velikosti 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...
Aritmetické a bitové operandy Tabulka: Aritmetické operace Operace Operand Násobení * Dělení / Dělení modulo % Sčítání + Odečítání - Inkrementace ++ Dekrementace -- Zkrácený zápis a+=3 ; // a=a+3 b-=2 ; // b=b-2 c*=5 ; // c=c*5 d/=a ; // d=d/a Tabulka: Bitové operace Operace Operand Jednotkový doplněk Bitový posuv doleva Bitový posuv doprava Logický součin AND & Exkluzivní součet EX-OR Logický součet OR Zkrácený zápis a =3 ; b&=2 ; c =5 ; d =2 ;
Podmínka Syntaxe podmínky if if( podmínka ) { ; } else { ; } Syntaxe podmínky switch Tabulka: Relační operandy Operace Operand Je roven == Je různý od!= Menší než < Menší nebo roven <= Větší než > Větší nebo roven >= switch( proměnná ) { case hodnota1: case hodnota2: ; default: ; }
Cyklus Syntaxe cyklu while while( podmínka ) { ; ; } Syntaxe cyklu for for( par0; par1; par2 ) { ; ; } Nekonečná smyčka while while( 1 ) { ; ; } while( 1 ) ; Nekonečná smyčka for for( ;; ) { ; ; }
Specifika překladače GCC a knihovny avr-libc Testování hodnoty bitu v I/O registru if( bit is set( registr, bit )) { ; } if( bit is clear( registr, bit )) { ; } Cyklus s testováním bitu v I/O registru loop until bit is set( registr, bit ) { ; } loop until bit is clear( registr, bit ) { ; }
Kombinace jazyka symbolických adres a C Programování ve vyšším jazyce je pohodlnější, rychlejší, kód je snáze přenositelný mezi platformami; zabírá více místa v paměti, jeho výkon je pomalejší. Běžná praxe je tvorba aplikace v jazyce C, pouze exponované části programu, kde chceme mít přehled o počtu instrukcí, rychlosti výkonu, či konkrétní funkci se tvoří v JSA. Proto lze zdrojové kódy kombinovat asm( "sei" ) ; asm( "ldi r16,0x20 \n inc r16 \n" ) ; Překlad: sei ldi r16,0x20 inc r16
Kombinace jazyka symbolických adres a C Předávání parametrů mezi funkcí v JSA a hlavní aplikací v C pomocí předem určených registrů První vstupní parametr: r25:r24, Druhý vstupní parametr: r23:r22,... Devátý vstupní parametr: r9:r8, Návratová hodnota funkce: r25:r24. Prototyp extern int add compl( int,int ) ; c = add compl( a,b ) ; a @ r25:r24 b @ r23:r22 c @ r25:r24
Obsah přednášky Typy adresování Registrové, přímé, nepřímé, bezprostřední Větvení programu Programový čítač Volání podprogramu, zásobník Obsluha přerušení Ukázka programu v JSA a v jazyce C pro ATmega16 Programování mikrokontrolérů pomocí vyšších jazyků Překlad aplikace z jazyka C Programování v jazyce C Kombinace jazyka symbolických adres a C Zdroje informací
Zdroje informací Váňa, V. Mikrokontroléry ATMEL AVR; popis procesorů a instrukční soubor. Ben technická literatura, Praha, 2003, ISBN 80-7300-083-0. Matoušek, D. Práces mikrokontroléry ATMEL AVR; ATmega16. Ben technická literatura, Praha, 2006, ISBN 80-7300-174-8. Barnett, R., O Cull, L., Cox, S. Embedded C Programming and the Atmel AVR, 2e. Thomson Delmar Learning, New York, 2007, ISBN 1-4180-3959-4.
Zdroje informací Atmel Corporation. AVR Assembler User Guide, (říjen 2007). http://www.atmel.com/dyn/resources/prod_documents/ DOC1022.PDF Atmel Corporation. ATmega16, (říjen 2007). http://www.atmel.com/dyn/products/product_card. asp?part_id=2010 Atmel Corporation. ATtiny11, (říjen 2007). http://www.atmel.com/dyn/products/product_card. asp?part_id=2031 Fleury, P. Peter Fleury s Home Page, (říjen 2007). http://homepage.hispeed.ch/peterfleury/