´ Ustav radioelektroniky Vysok´ e uˇ cen´ı technick´ e v Brnˇ e
Programov´ an´ı mikrokontrol´ er˚ u Mikroprocesorov´ a technika, pˇredn´ aˇska ˇ c. 4
Ing. Fr´yza Tom´aˇs, Ph.D. 14. ˇr´ıjna 2008
Obsah pˇredn´ aˇsky Typy adresov´ an´ı Registrov´e, pˇr´ım´e, nepˇr´ım´e, bezprostˇredn´ı Vˇ etven´ı programu Programov´y ˇc´ıtaˇc Vol´an´ı podprogramu, z´asobn´ık Obsluha pˇreruˇsen´ı Uk´azka programu v JSA a v jazyce C pro ATmega16 Programov´ an´ı mikrokontrol´ er˚ u pomoc´ı vyˇsˇs´ıch jazyk˚ u Pˇreklad aplikace z jazyka C Programov´an´ı v jazyce C Kombinace jazyka symbolick´ych adres a C Zdroje informac´ı
Obsah pˇredn´ aˇsky Typy adresov´ an´ı Registrov´e, pˇr´ım´e, nepˇr´ım´e, bezprostˇredn´ı Vˇ etven´ı programu Programov´y ˇc´ıtaˇc Vol´an´ı podprogramu, z´asobn´ık Obsluha pˇreruˇsen´ı Uk´azka programu v JSA a v jazyce C pro ATmega16 Programov´ an´ı mikrokontrol´ er˚ u pomoc´ı vyˇsˇs´ıch jazyk˚ u Pˇreklad aplikace z jazyka C Programov´an´ı v jazyce C Kombinace jazyka symbolick´ych adres a C Zdroje informac´ı
Typy adresov´ an´ı I
I
Adresov´an´ı zpˇr´ıstupˇ nuje programovou (Flash) a datovou pamˇet’ (registry, I/O registry, SRAM). Terminologie I
I
I
Pˇr´ım´e adresov´an´ı - adresa je souˇc´ast´ı instrukce. Pˇr´ımo lze adresovat pracovn´ı registry, ˇr´ıdic´ı (I/O) registry, datovou i programovou pamˇet’, Nepˇr´ım´e adresov´an´ı - adresa nen´ı souˇc´ast´ı instrukce. Adresa je uloˇzena v nˇekter´em z ukazatel˚ u (X, Y nebo Z). Vyuˇz´ıv´a se k opakovan´emu pˇr´ıstupu k jedn´e nebo k posloupnosti nˇekolika pamˇet’ov´ych bunˇek.
Mikroprocesorov´e syst´emy umoˇzn ˇuj´ı celou ˇradu zp˚ usob˚ u adresov´an´ı operand˚ u. Z´akladn´ı zp˚ usoby jsou 1) Registrov´e adresov´an´ı: zdrojem informace (operand) je registr(y). Napˇr.: mov Rd,Rr
Typy adresov´ an´ı, pokraˇ cov´ an´ı Obecné pracovní registry 15
10 9 8
OP kód
r
4 3
Rd
0
Rr
R0 R1
R25 R26 (XL) R27 (XH) R28 (YL) R29 (YH) R30 (ZL) R31 (ZH)
0x00
Obecné pracovní registry 15
9 8
OP kód
4 3
Rd
0
OP
0x1F
R0 R1
R25 R26 (XL) R27 (XH) R28 (YL) R29 (YH) R30 (ZL) R31 (ZH)
0x00
0x1F
Obr´ azek: Adresov´an´ı dvou (add Rd,Rr) a jednoho (dec Rd) registru I
Z´akladn´ı zp˚ usoby adresov´an´ı, pokraˇcov´an´ı 2) Pˇr´ım´e adresov´an´ı: operandy jsou pˇr´ımo urˇceny konkr´etn´ı adresou. Napˇr.: call k, 3) Nepˇr´ım´e adresov´an´ı: adresa operandu je uloˇzena v tzv. ukazateli, napˇr. registrov´y p´ar X, Y nebo Z (X - r26:r27; Y r28:r29; Z - r30:r31). Napˇr.: ijmp, st X,Rr.
Typy adresov´ an´ı, dokonˇ cen´ı Obecné pracovní registry 15
12 11
OP
8 7
K
4 3
Rd
0
K
R0 R1
R25 R26 (XL) R27 (XH) R28 (YL) R29 (YH) R30 (ZL) R31 (ZH)
0x00
0x1F
Obr´ azek: Bezprostˇredn´ı adresov´an´ı 8bitov´e konstanty (ldi Rd,K) I
Z´akladn´ı zp˚ usoby adresov´an´ı, dokonˇcen´ı 4) Bezprostˇredn´ı adresov´an´ı: hodnota operandu je pˇr´ımo obsaˇzena v instrukci. Napˇr.: ldi Rd,K
I
V´ıcebitov´e procesory (DSP, . . .) obsahuj´ı dalˇs´ı typick´e zp˚ usoby adresov´an´ı operand˚ u. R˚ uzn´e zp˚ usoby adresov´an´ı zvyˇsuj´ı moˇznosti mikroprocesor˚ u.
Obsah pˇredn´ aˇsky Typy adresov´ an´ı Registrov´e, pˇr´ım´e, nepˇr´ım´e, bezprostˇredn´ı Vˇ etven´ı programu Programov´y ˇc´ıtaˇc Vol´an´ı podprogramu, z´asobn´ık Obsluha pˇreruˇsen´ı Uk´azka programu v JSA a v jazyce C pro ATmega16 Programov´ an´ı mikrokontrol´ er˚ u pomoc´ı vyˇsˇs´ıch jazyk˚ u Pˇreklad aplikace z jazyka C Programov´an´ı v jazyce C Kombinace jazyka symbolick´ych adres a C Zdroje informac´ı
Vˇ etven´ı programu
Obr´ azek: Pozice programov´eho ˇc´ıtaˇce
I
Podle von Neumannovy koncepce procesoru jsou instrukce vykon´av´any sekvenˇcnˇe, tj. jak jsou uloˇzeny v pamˇeti.
I
Adresu instrukce, kter´a se bude vykon´avat specifikuje programov´y ˇc´ıtaˇc (PC – program counter).
I
Pˇri startu syst´emu je hodnota PC vynulov´ana. D´ale je zpravidla pouze inkrementov´ana.
I
Pˇri podm´ınk´ach, nepodm´ınˇen´ych skoc´ıch, vol´an´ı podprogramu, obsluze pˇreruˇsen´ı doch´az´ı ke skokov´e zmˇenˇe hodnoty PC, tj. k vˇetven´ı programu.
Programov´ yˇ c´ıtaˇ c u AVR
Obr´ azek: Struktura programov´eho ˇc´ıtaˇce I
Program Counter (PC) je u ATmega16 13bitov´y (PC12-PC0), tj. m˚ uˇze adresovat celkem 213 =8k slov (instrukc´ı).
I
PC je ukazatel na m´ısto v programov´e pamˇeti, tj. obsahuje adresu vykon´avan´e instrukce.
I
K hodnot´am PC nelze pˇr´ımo pˇristupovat (ˇc´ıst, zapisovat), protoˇze tento ˇc´ıtaˇc nelze adresovat!! Zmˇenu hodnoty prov´ad´ıme pouze nepˇr´ımo – vykonan´ymi instrukcemi.
Podm´ınˇ en´ e skoky v programu
podmínka
a != 0
ne
ano
Obr´ azek: Podm´ınka
I
Podm´ınˇen´y skok je reakc´ı na v´ysledek podm´ınky. V´ysledek podm´ınky je vˇzdy true nebo false.
I
JSA umoˇzn ˇuje vyuˇzit´ı jen jednoduch´ych podm´ınek. Dva typy instrukc´ı podm´ınˇen´ych skok˚ u
I
1) Pˇreskoˇc n´asleduj´ıc´ı instrukci (anglicky: Skip if . . .), cpse Rd,Rr – pˇreskoˇc, je-li Rd==Rr (compare, skip if equal), sbic P,b – pˇreskoˇc, je-li bit b v I/O registru P nulov´y (skip if bit is cleared), sbis P,b – pˇreskoˇc, je-li bit b v I/O registru P nastaven (skip if bit is set), ...
Podm´ınˇ en´ e skoky v programu, pokraˇ cov´ an´ı 2) Skoˇc na n´avˇeˇst´ı (anglicky: Branch if . . .); houfnˇe se k tomu vyuˇz´ıvaj´ı pˇr´ıznakov´e bity, BREQ k – skoˇc na n´avˇeˇst´ı k, je-li Z==1 (BRench if EQual), BRNE k – skoˇc na n´avˇeˇst´ı k, je-li Z==0 (BRench if Not Equal), BRVS k – skoˇc na n´avˇeˇst´ı k, je-li V==1 (BRench if V is Set), V-overflow, BRVC k – skoˇc na n´avˇeˇst´ı k, je-li V==0 (BRench if V is Cleared), BRIE k - skoˇc na n´avˇeˇst´ı k, je-li I==1 (BRench if I is Enable), I-interrupt, BRID k - skoˇc na n´avˇeˇst´ı k, je-li I==0 (BRench if I is Disable), ...
Nepodm´ınˇ en´ e skoky v programu I
I
Instrukce pro nepodm´ınˇen´e skoky pˇr´ımo zmˇen´ı hodnotu v programov´em ˇc´ıtaˇci (PC) a t´ım se realizuje skok v programu. (Nen´ı uvaˇzov´ana ˇz´adna podm´ınka). Troj´ı typ instrukc´ı pro nepodm´ınˇen´y skok u AVR I
I
I
I
RJMP k – relativn´ı skok na n´avˇeˇst´ı k (Relative JuMP). Pozn.: M˚ uˇze skoˇcit na adresu v rozsahu −2K ≤ k ≥ 2K, IJMP – nepˇr´ım´y skok na adresu v registrov´em p´aru Z (Indirect JuMP). Registrov´y p´ar Z, tj. r30:r31 funguje jako ukazatel (zdroj adresy), JMP k – pˇr´ım´y skok na n´avˇeˇst´ı k (direct JuMP). Pozn.: M˚ uˇze skoˇcit na adresu v rozsahu 0 ≤ k ≥ 4M .
Rozd´ıly mezi strojov´ym k´odem uveden´ych instrukc´ı I I I
RJMP: 1100 kkkk kkkk kkkk (12bitov´a adresa), IJMP: 1001 0100 0000 1001, JMP: 1001 010k kkkk 110k kkkk kkkk kkkk kkkk (22bitov´a adresa).
V´ yznam a vol´ an´ı podprogramu I
I
Podprogram je ˇc´ast k´odu, kter´a se ˇcasto opakuje; do strojov´eho jazyka se pˇreloˇz´ı jen jednou. Spouˇst´ı se zaps´an´ım adresy prvn´ı instrukce do programov´eho ˇc´ıtaˇce. Troj´ı typ instrukc´ı pro vol´an´ı podprogramu u AVR I
I
I
I
RCALL k – relativn´ı vol´an´ı podprogramu k (Relative subroutine CALL). Pozn.: M˚ uˇze skoˇcit na adresu v rozsahu −2K ≤ k ≥ 2K, ICALL – nepˇr´ım´e vol´an´ı podprogramu; adresa vˇzdy uloˇzena v ukazateli Z (Indirect CALL), CALL k – pˇr´ım´e vol´an´ı podprogramu k (direct subroutine CALL). Pozn.: M˚ uˇze skoˇcit na adresu v rozsahu 0 ≤ k ≥ 4M .
Na rozd´ıl od (ne)podm´ınˇen´eho skoku dojde po ukonˇcen´ı podprogramu k n´avrat na instrukci n´asleduj´ıc´ı po skoku do podprogramu.
Funkce z´ asobn´ıku k uloˇ zen´ı n´ avratov´ e adresy I
I
N´avratov´a adresa mus´ı b´yt uloˇzena pˇred skokem do podprogramu do tzv. z´asobn´ıku (anglicky: stack). N´avratov´a adresa je adresa instrukce n´asleduj´ıc´ı po instrukci volaj´ıc´ı podprogram. N´avrat z podprogramu (vyzvednut´ı n´avratov´e adresy ze z´asobn´ıku a jej´ı zaps´an´ı do PC) zajiˇst’uje instrukce I
Obr´ azek: Vnoˇren´e vol´an´ı podprogram˚ u
RET (subroutine RETurn).
Ukazatel na z´ asobn´ık I
I
Z´asobn´ık je ˇc´ast pamˇeti SRAM (m˚ uˇze t´eˇz slouˇzit k z´alohov´an´ı obsahu registr˚ u r0-r31). Mikrokontrol´ery, kter´e nemaj´ı intern´ı pamˇet’ RAM maj´ı hardwarov´y z´asobn´ık s omezenou velikost´ı. Zapisovat/ˇc´ıst lze ze z´asobn´ıku pouze z jedn´e pozice. Tu ud´av´a tzv. ukazatel na z´asobn´ık (anglicky: SP – stack pointer). I
Ukazatel je 16bitov´a hodnota uloˇzen´a v registrov´em p´aru SPH:SPL. (Patˇr´ı mezi I/O registry.)
Obr´ azek: Struktura ukazatele na z´asobn´ık
Ukazatel na z´ asobn´ık, pokraˇ cov´ an´ı I
I
Hodnota ukazatele na z´asobn´ık mus´ı b´yt inicializov´ana (tzv. definice z´asobn´ıku). Definice se prov´ad´ı jedenkr´at a to nejˇcastˇeji hned na zaˇc´atku programu. Ukazatel se napln´ı adresou posledn´ı pamˇet’ov´e buˇ nky pamˇet’ov´eho segmentu urˇcen´eho pro z´asobn´ık (z´asobn´ık se z d˚ uvodu eliminace nechtˇen´eho pˇreps´an´ı dat um´ıst’uje na konec pamˇeti RAM) I I I I
Obr´ azek: Pozice ukazatele na z´asobn´ık
I
ldi out ldi out
r16,low(ramend) spl,r16 r16,high(ramend) sph,r16
(Konstanta ramend obsahuje adresu posledn´ı buˇ nky pamˇeti SRAM.)
Proces z´ apisu do z´ asobn´ıku I
I
Z´asobn´ık funguje jako LIFO syst´em (Last In First Out – posledn´ı zaps´an, prvn´ı ˇcten). F´aze z´apisu 16bitov´e adresy do 8bitov´eho z´asobn´ıku 1) Uloˇzen´ı niˇzˇs´ıho bytu adresy na pozici adresovanou SP, 2) SP = SP - 1 (SP tak obsahuje adresu voln´eho bytu, kam je moˇzn´e d´ale zapisovat), 3) Uloˇzen´ı vyˇsˇs´ıho bytu adresy na pozici adresovanou SP, 4) SP = SP - 1 (po ukonˇcen´ı procesu tedy SP obsahuje adresu voln´eho bytu v z´asobn´ıku).
Pˇr´ıklad Jak´a data obsahuje z´asobn´ık po vol´an´ı dvou vnoˇren´ych podprogram˚ u? Necht’ byly vol´any z adres 0x0021 a 0x0028 instrukc´ı rcall.
Proces ˇ cten´ı ze z´ asobn´ıku I
F´aze ˇcten´ı adresy ze z´asobn´ıku 1) SP = SP + 1 (ukazatel obsahuje adresu posledn´ıho bytu uloˇzen´eho v z´asobn´ıku), 2) Adresovan´y vyˇsˇs´ı byte n´avratov´e adresy je pˇresunut do PC (nutnost maskov´an´ı 3 nejv´yznamnˇejˇs´ıch bit˚ u, protoˇze PC je pouze 13bitov´y), 3) SP = SP + 1 (ukazatel adresuje pˇredposledn´ı uloˇzen´e slovo), 4) Adresovan´y niˇzˇs´ı byte n´avratov´e adresy je pˇresunut do PC.
I
Uloˇzen´e adresy ve stacku z˚ ustanou, ale pˇri n´asledn´em vol´an´ı podprogramu se pˇrep´ıˇsou nov´ymi daty.
Pˇr´ıklad Jak´e data obsahuje ukazatel na z´asobn´ık a programov´y ˇc´ıtaˇc po n´avratu ze dvou vnoˇren´ych podprogram˚ u?
Z´ aloha registr˚ u do z´ asobn´ıku; instrukce PUSH, POP I
Kromˇe z´alohy n´avratov´e adresy pˇri vol´an´ı podprogramu, nebo pˇreruˇsen´ı, lze z´asobn´ık vyuˇz´ıt tak´e jako doˇcasn´e odkladiˇstˇe obsahu registr˚ u r0-r31.
I
Pouˇzit´ı napˇr. pˇri vol´an´ı podprogramu - z´aloha potˇrebn´ych reg.; na konci podprogramu hodnoty znovu naˇc´ıst ze z´asobn´ıku. F´aze uloˇzen´ı obsahu 8bitov´eho registru do z´asobn´ıku - push Rr, kde r = 0, 1, . . . , 31
I
1) Uloˇzen´ı obsahu registru Rr na adresu definovanou SP, 2) SP = SP - 1. I
F´aze naˇcten´ı 8bitov´e hodnoty ze z´asobn´ıku do registru - pop Rd, kde d = 0, 1, . . . , 31 1) SP = SP + 1, 2) Naˇcten´ı slova z adresy SP do registru Rd.
I
Instrukce pro z´alohu registr˚ u maj´ı vˇsechny mikrokontrol´ery (mohou m´ıt jinou syntaxi, ˇci omezen´y poˇcet vyuˇziteln´ych reg.).
Rozd´ıl mezi podprogramem a makrem Pˇr´ıklad Jak´e jsou z´akladn´ı rozd´ıly mezi podprogramem a makrem?
Obsah pˇredn´ aˇsky Typy adresov´ an´ı Registrov´e, pˇr´ım´e, nepˇr´ım´e, bezprostˇredn´ı Vˇ etven´ı programu Programov´y ˇc´ıtaˇc Vol´an´ı podprogramu, z´asobn´ık Obsluha pˇreruˇsen´ı Uk´azka programu v JSA a v jazyce C pro ATmega16 Programov´ an´ı mikrokontrol´ er˚ u pomoc´ı vyˇsˇs´ıch jazyk˚ u Pˇreklad aplikace z jazyka C Programov´an´ı v jazyce C Kombinace jazyka symbolick´ych adres a C Zdroje informac´ı
Obsluha pˇreruˇsen´ı I
Bˇeh programu (hodnota PC) je tak´e ovlivniteln´y pomoc´ı tzv. pˇreruˇsen´ı (anglicky: interrupt).
I
V pˇr´ıpadˇe, ˇze mikroprocesor obdrˇz´ı ˇz´adost o obsluhu povolen´eho pˇreruˇsen´ı, mus´ı pˇreruˇsit vykon´avanou ˇcinnost (hlavn´ı program) a spustit pˇr´ısluˇsn´y obsluˇzn´y program.
I
Kaˇzd´y procesor obsahuje sadu moˇzn´ych pˇreruˇsen´ı intern´ıch i extern´ıch; zdroje pˇreruˇsen´ı z´avis´ı na hardwarov´em vybaven´ı.
I
Obsluha kaˇzd´eho pˇreruˇsen´ı je ovl´ad´ana tzv. vektorem pˇreruˇsen´ı v programov´e pamˇeti; jedn´a se o adresu od kter´e se zaˇcne vykon´avat konkr´etn´ı obsluha.
I
Kaˇzd´e pˇreruˇsen´ı m´a sv˚ uj povolovac´ı bit; nav´ıc existuje jeden glob´aln´ı povolovac´ı bit (u AVR ve stavov´em registru SREG).
I
Jednotliv´e pˇreruˇsen´ı maj´ı r˚ uznou prioritu; niˇzˇs´ı adresa ⇔ vyˇsˇs´ı priorita (viz. dalˇs´ı slajd).
Vektory pˇreruˇsen´ı mikrokontrol´ eru ATmega16 ˇ C.
Adresa
Zdroj pˇreruˇsen´ı
Popis pˇreruˇsen´ı
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
0x0000 0x0002 0x0004 0x0006 0x0008 0x000A 0x000C 0x000E 0x0010 0x0012 0x0014 0x0016 0x0018 0x001A 0x001C 0x001E 0x0020 0x0022 0x0024 0x0026 0x0028
RESET INT0 INT1 TIMER2 COMP TIMER2 OVF TIMER1 CAPT TIMER1 COMPA TIMER1 COMPB TIMER1 OVF TIMER0 OVF SPI, STC USART, RXC USART, UDRE USART, TXC ADC EE RDY ANA COMP TWI INT2 TIMER0 COMP SPM RDY
Extern´ı reset, pˇripojen´ı nap´ ajen´ı Extern´ı poˇzadavek na pˇreruˇsen´ı 0 Extern´ı poˇzadavek na pˇreruˇsen´ı 1 ˇ ıtaˇ C´ c/ˇ casovaˇ c 2 - shoda komparace ˇ ıtaˇ C´ c/ˇ casovaˇ c 2 - pˇreteˇ cen´ı ˇ ıtaˇ C´ c/ˇ casovaˇ c 1 - zachycen´ı ˇ ıtaˇ C´ c/ˇ casovaˇ c 1 - shoda s kompar´ atorem A ˇ ıtaˇ C´ c/ˇ casovaˇ c 1 - shoda s kompar´ atorem B ˇ ıtaˇ C´ c/ˇ casovaˇ c 1 - pˇreteˇ cen´ı ˇ ıtaˇ C´ c/ˇ casovaˇ c 0 - pˇreteˇ cen´ı Dokonˇ cen´ı s´ eriov´ eho pˇrenosu SPI USART - kompletn´ı pˇr´ıjem dat USART - pr´ azdn´ y datov´ y registr USART - kompletn´ı vysl´ an´ı dat ADC - dokonˇ cen´ı A/D pˇrevodu EEPROM - komunikace pˇripravena Zmˇ ena v´ ystupu analogov´ eho kompar´ atoru Ud´ alost na I2C sbˇ ernici Extern´ı poˇzadavek na pˇreruˇsen´ı 2 ˇ ıtaˇ C´ c/ˇ casovaˇ c 0 - shoda komparace Uloˇzen´ı do programov´ e pamˇ eti pˇripraveno
Vektory pˇreruˇsen´ı mikrokontrol´ eru ATtiny11 ˇ C.
Adresa
Zdroj pˇreruˇsen´ı
Popis pˇreruˇsen´ı
1 2 3 4 5
0x000 0x001 0x002 0x003 0x004
RESET INT0 I/O piny TIMER0 OVF ANA COMP
Extern´ı reset, pˇripojen´ı nap´ ajen´ı Extern´ı poˇzadavek na pˇreruˇsen´ı 0 Zmˇ ena stavu I/O pinu ˇ ıtaˇ C´ c/ˇ casovaˇ c 0 - pˇreteˇ cen´ı Zmˇ ena v´ ystupu analogov´ eho kompar´ atoru
U ATmega16 je mezi jednotliv´ymi vektory pˇreruˇsen´ı voln´ych 32 bit˚ u. U ATtiny11 jen 16 bit˚ u ⇒ pro samotnou obsluhu to nestaˇc´ı. Pozn.: ATtiny11 neobsahuje datovou pamˇet’, proto nen´ı moˇzn´e definovat softwarov´y z´asobn´ık pro uloˇzen´ı n´avratov´ych adres. Obsahuje ale hardwarov´y z´asobn´ık, schopn´y uchov´an´ı 3 adres (ukazatel na z´asobn´ık je 9bitov´y @ 1kB Flash). I
Obsluha pˇreruˇsen´ı I
Jednotliv´e f´aze obsluhy pˇreruˇsen´ı 1) Dokonˇc´ı se v´ykon pr´avˇe vykon´avan´e instrukce, 2) Zak´aˇze se obsluha pˇr´ıpadn´ych n´asleduj´ıc´ıch pˇreruˇsen´ı, 3) Do z´asobn´ıku se uloˇz´ı adresa n´asleduj´ıc´ı instrukce v programov´e pamˇeti (z´asobn´ık mus´ı b´yt definov´an), 4) Podle zdroje pˇreruˇsen´ı se do PC naˇcte adresa obsluˇzn´eho programu pˇreruˇsen´ı (napˇr.: PC=0x0002 pro INT0), 5) Vykon´a se obsluha pˇreruˇsen´ı, tj. konkr´etn´ı posloupnost instrukc´ı; do oblasti vektor˚ u pˇreruˇsen´ı se bˇeˇznˇe um´ıst’uj´ı pouze skoky na obsluˇznou funkci (mezi vektory je jen 32 bit˚ u), 6) Obsluha pˇreruˇsen´ı se ukonˇc´ı instrukc´ı reti (return interrupt); analogie s ukonˇcen´ım podprogramu, 7) Povol´ı se obsluha dalˇs´ıch pˇreruˇsen´ı, 8) Do PC se naˇcte uloˇzen´a n´avratov´a adresa ze z´asobn´ıku, 9) Pokraˇcuje se ve v´ykonu hlavn´ıho programu.
Pˇr´ıklad obsluhy pˇreruˇsen´ı. Extern´ı pˇreruˇsen´ı I
Pˇreruˇsen´ı se vykon´a (obslouˇz´ı) v pˇr´ıpadˇe ˇze 1) Je povoleno konkr´etn´ı pˇreruˇsen´ı, 2) Je povoleno glob´aln´ı pˇreruˇsen´ı (bit I=1 v registru SREG).
I
Pˇr´ıklad povolen´ı extern´ıho pˇreruˇsen´ı u AVR I
I I
ˇ ıdic´ı registr GICR (General Interrupt Control Register) R´ obsahuje povolovac´ı bity INT1, INT0, INT2 pro extern´ı pˇreruˇsen´ı 1, 0 a 2, Pro povolen´ı je nutn´e nastavit pˇr´ısluˇsn´y(´e) bit(y) na 1, Povolit glob´aln´ı pˇreruˇsen´ı v registru SREG instrukc´ı sei (set interrupt).
I
Konkr´etn´ı nastaven´ı (n´abˇeˇzn´a hrana, sestupn´a, . . .) lze definovat v registru MCUCR (MCU Control Register).
I
Poˇzadavek na pˇreruˇsen´ı je pro CPU signalizov´an pˇr´ıznakov´ym bitem v registru GIFR (General Interrupt Flag Register).
Moˇ znosti nastaven´ı extern´ıho pˇreruˇsen´ı Tabulka: Generov´an´ı extern´ıho pˇreruˇsen´ı (MCUCR) ISCn1:ISCn0 0b00 0b01 0b10 0b11
Popis N´ızk´ au ´roveˇ n (log. 0) na pinu INTn generuje poˇzadavek Jak´ akoliv zmˇ ena logick´ eu ´rovnˇ e na pinu INTn generuje poˇzadavek Sestupn´ a hrana na pinu INTn generuje poˇzadavek Vzestupn´ a hrana na pinu INTn generuje poˇzadavek
Pˇreruˇsen´ı od ˇ c´ıtaˇ ce/ˇ casovaˇ ce I
Pˇreruˇsen´ı lze generovat tak´e pˇri pˇreteˇcen´ı intern´ıho ˇc´ıtaˇce/ˇcasovaˇce (napˇr. 8bitov´y ˇc´ıtaˇc/ˇcasovaˇc 0). (Funkce: Inkrementace stavu kaˇzdou periodu hodinov´eho sign´alu.)
I
Povolen´ı generov´an´ı pˇreruˇsen´ı pˇri pˇreteˇcen´ı ˇc/ˇc 0 lze nastavit v I/O registru TIMSK (Timer/Counter Interrupt Mask Register) bitem TOIE0.
I
Rychlost ˇc´ıt´an´ı ˇc´ıtaˇce lze nastavit pomoc´ı pˇreddˇeliˇcky hodinov´eho sign´alu (ˇc´ım vˇetˇs´ı hodnota pˇreddˇeliˇcky, t´ım pomalejˇs´ı ˇc´ıt´an´ı), ˇr´ızen´e bity CS02, CS01 a CS00 v I/O registru TCCR0 (Timer/Counter Control Register).
I
Glob´aln´ı povolen´ı vˇsech pˇreruˇsen´ı se zpravidla prov´ad´ı jako posledn´ı instrukce pˇri nastavov´an´ı funkce mikrokontrol´eru.
I
Pˇreteˇcen´ı ˇc/ˇc 0 je signalizov´an pˇr´ıznakov´ym bitem TOV0 v registru TIFR (Timer/Counter Interrupt Flag Register).
Moˇ znosti nastaven´ı pˇreruˇsen´ı ˇ c´ıtaˇ ce/ˇ casovaˇ ce Tabulka: Nastaven´ı pˇreddˇeliˇcky ˇc/ˇc 0 (TCCR0) CS02:CS00 0b000 0b001 0b010 0b011 0b100 0b101
Popis ˇ 0 nepracuje Hodinov´ y sign´ al odpojen. C/c fclk fclk /8 fclk /64 fclk /256 fclk /1024
Pˇr´ıklad Za jak dlouho dojde k pˇreteˇcen´ı 8bitov´eho ˇc/ˇc 0, je-li CS02:CS00=010 a fclk =1MHz?
Obsluha pˇreruˇsen´ı v JSA I
Pˇri pouˇzit´ı pˇreruˇsen´ı (i podprogram˚ u) je nutn´e definovat z´asobn´ık, tj. naplnit registrov´y p´ar SPH:SPL. Jedn´a se o I/O registry (viz. pˇredn´aˇska o Instrukˇcn´ı sadˇe), proto se pouˇzije kombinace instrukc´ı LDI a OUT.
I
Bˇeˇzn´a praxe u ˇc´ıslicov´ych syst´em˚ u: hlavn´ı ˇc´ast programu se zacykl´ı pomoc´ı nekoneˇcn´e smyˇcky. Z n´ı se sk´aˇce na obsluˇzn´e programu pouze pˇri pˇr´ıchodu poˇzadavku na pˇreruˇsen´ı. Vektory pˇreruˇsen´ı pouˇzit´e v uk´azce
I
I I I
0x0000 - reset, 0x0002 - extern´ı pˇreruˇsen´ı 0, 0x001c - byl dokonˇcen AD pˇrevod.
Obsluha pˇreruˇsen´ı v JSA ... .org 0x0000 rjmp start .org 0x0002 rjmp tlacitko .org 0x001c rjmp ad_prevod .org 0x002a start: ldi temp, high(ramend) ... sei loop: rjmp loop tlacitko: ... reti ad_prevod: ... reti
; ; ; ; ; ; ;
vektor pˇ reruˇ sen´ ı pro reset skok na n´ avˇ eˇ st´ ı start vektor pˇ reruˇ sen´ ı pro extern´ ıho zdroje INT0 skok na n´ avˇ eˇ st´ ı tlacitko vektor pˇ reruˇ sen´ ı pro AD pˇ revod skok na n´ avˇ eˇ st´ ı ad_prevod adresa zaˇ c´ atku hlavn´ ıho programu
; definice z´ asobn´ ıku ; k´ od hlavn´ ıho programu ; povolen´ ı glob´ aln´ ıho pˇ reruˇ sen´ ı ; nekoneˇ cn´ a smyˇ cka
; k´ od obsluhy extern´ ıho pˇ reruˇ sen´ ı ; n´ avrat z obsluhy pˇ reruˇ sen´ ı ; k´ od obsluhy pˇ reruˇ sen´ ı pro AD pˇ revod ; n´ avrat z obsluhy pˇ reruˇ sen´ ı
Obsluha pˇreruˇsen´ı v jazyce C I
Pro vyuˇzit´ı pˇreruˇsen´ı v jazyce C je nutn´e vloˇzit hlaviˇckov´y soubor interrupt.h.
I
Nen´ı nutn´e definovat z´asobn´ık - respektive udˇel´a to pˇrekladaˇc. Rovnˇeˇr nen´ı nutn´e zn´at konkr´etn´ı adresy vektor˚ u pˇreruˇsen´ı. Obsluha pˇreruˇsen´ı pˇredstavuje funkci ISR (anglicky: interrupt service routine) se vstupn´ım parametrem, kter´y identifikuje zdroj pˇreruˇsen´ı
I
I I
I
INT0 vect - extern´ı pˇreruˇsen´ı, ADC vect - pˇreruˇsen´ı od AD pˇrevodn´ıku.
(Vˇsechny informace a uk´azky vyuˇz´ıvaj´ı pˇrekladaˇce GCC s knihovnou avr-libc.)
Parametry funkce obsluhy pˇreruˇsen´ı ISR(.) ˇ C.
Adresa
Parametr v C (GCC)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
0x0000 0x0002 0x0004 0x0006 0x0008 0x000A 0x000C 0x000E 0x0010 0x0012 0x0014 0x0016 0x0018 0x001A 0x001C 0x001E 0x0020 0x0022 0x0024 0x0026 0x0028
INT0 vect INT1 vect TIMER2 COMP vect TIMER2 OVF vect TIMER1 CAPT vect TIMER0 COMPA vect TIMER0 COMPB vect TIMER1 OVF vect TIMER0 OVF vect SPI STC vect USART RXC vect USATRT UDRE vect USART TXC vect ADC vect EE RDY vect ANA COMP vect TWI vect INT2 vect TIMER0 COMP vect SPM RDY vect
Obsluha pˇreruˇsen´ı v jazyce C #include
#include
// hlaviˇ ckov´ y soubor pro pouˇ zit´ y mikrokontrol´ er // hlaviˇ ckov´ y soubor pro obsluhu pˇ reruˇ sen´ ı
ISR( INT0_vect ) { ... }
// obsluha extern´ ıho pˇ reruˇ seni INT0
ISR( ADC_vect ) { ... }
// obsluha pˇ reruˇ sen´ ı AD pˇ revodn´ ıku
int main( void ) { ... sei() ; while( 1 ) ; }
// k´ od obsluhy pˇ reruˇ sen´ ı
// k´ od obsluhy pˇ reruˇ sen´ ı
// k´ od hlavn´ ı funkce // povolen´ ı glob´ aln´ ıho pˇ reruˇ sen´ ı // nekoneˇ cn´ a smyˇ cka
Obsah pˇredn´ aˇsky Typy adresov´ an´ı Registrov´e, pˇr´ım´e, nepˇr´ım´e, bezprostˇredn´ı Vˇ etven´ı programu Programov´y ˇc´ıtaˇc Vol´an´ı podprogramu, z´asobn´ık Obsluha pˇreruˇsen´ı Uk´azka programu v JSA a v jazyce C pro ATmega16 Programov´ an´ı mikrokontrol´ er˚ u pomoc´ı vyˇsˇs´ıch jazyk˚ u Pˇreklad aplikace z jazyka C Programov´an´ı v jazyce C Kombinace jazyka symbolick´ych adres a C Zdroje informac´ı
Proces pˇrekladu do strojov´ eho jazyka Zdrojov´ y k´ od v C
DDRB = 0xff ; temp = 0x03 ; PORTB = temp ; while( 1 ) PORTB-- ;
Obr´ azek: Pˇreklad zdrojov´eho k´odu z jazyka C
Pˇreloˇzen´ y k´ od 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
Pozn.: sts k,Rr - Pˇr´ım´ e uloˇzen´ı hodnoty registru do datov´ e pamˇ eti SRAM (0 ≤ r ≤ 31, 0 ≤ k ≤ 65 535).
Proces pˇrekladu do strojov´ eho jazyka Adresa
Stroj. k´ od
Instrukce
Popis funkce
0x0047 0x0048 0x0049 0x004A 0x004B 0x004C 0x004D 0x004E 0x0050 0x0051 0x0052 0x0053
E5CF E0D4 BFDE BFCD EF8F BB87 E083 93800060 BB88 B388 5081 CFFC
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
Load immediate Load immediate Out to I/O location Out to I/O location Set Register Out to I/O location Load immediate Store direct to data space Out to I/O location In from I/O location Subtract immediate Relative jump
Tabulka: Z´apis ve form´atu Intel HEX ... :10009000D4E0DEBFCDBF8FEF87BB83E080936000ED :0800A00088BB88B38150FCCF3E
Form´ at Intel HEX Tabulka: Z´apis ve form´atu Intel HEX ... :10 :08
0090 00A0
00 00
D4E0 DEBF CDBF 8FEF 87BB 83E0 8093 6000 88BB 88B3 8150 FCCF 3E
ED
Tabulka: V´yznam jednotliv´ych byt˚ u form´atu HEX : 10 0090 00 ED
Zaˇ c´ atek ˇr´ adku Poˇ cet datov´ ych byt˚ u v jednom ˇr´ adku (0x10=16) Adresa prvn´ıho datov´ eho bytu (0x48·2=0x90) Typ k´ odu (u AVR odpov´ıd´ a indentifik´ atoru 64kB pamˇ et’. str.) Strojov´ y k´ od instrukc´ı (LSB byte uloˇzen dˇr´ıve) Kontroln´ı souˇ cet
Element´ arn´ı z´ asady jazyka C I
Pˇr´ıkaz konˇc´ı stˇredn´ıkem.
I
Tˇela funkc´ı, posloupnosti pˇr´ıkaz˚ u u podm´ınek, cykl˚ u, apod. se zdruˇzuj´ı do sloˇzen´ych z´avorek. ˇ ezce se uvozuj´ı uvozovkami. Retˇ
I I
Koment´aˇre se p´ıˇs´ı za dvojit´e lom´ıtko //, nebo do bloku uvozen´em /* . . . */.
I
Rezervovan´a slova nelze pouˇz´ıt k jin´emu u ´ˇcelu neˇz je urˇceno: for, return, switch, case, if, else, char, int, float, unsigned, void, . . . Deklarace funkce
I
hodnota n´ azev funkce( parametr, parametr, ... ) { ; }
Deklarace promˇ enn´ ych I
Promˇenn´a je identifikov´ana n´azvem a typem I
I
char temp, unsigned int ii
Pˇred pouˇzit´ım je nutn´e promˇennou deklarovat. Podle dostupnosti se jedn´a o I
I
Lok´aln´ı - alokov´ana ve stack (z´asobn´ık) nebo heap (hromada) pˇri spuˇstˇen´ı funkce, Glob´aln´ı - alokov´ana pˇri pˇrekladu, dostupn´a pro vˇsechny funkce. Tabulka: Nˇekter´e typy a velikosti promˇenn´ych Typ char unsigned char signed char int unsigned int float ...
Velikost [b]
Rozsah
8 8 8 16 16 32
-128 aˇz 127 0 aˇz 255 -128 aˇz 127 -32 768 aˇz 32 767 0 aˇz 65 535 ±1,175·10−38 aˇz ±3,402·1038
Aritmetick´ e a bitov´ e operandy Tabulka: Bitov´e operace
Tabulka: Aritmetick´e operace Operace
Operand
N´ asoben´ı Dˇ elen´ı Dˇ elen´ı modulo Sˇ c´ıt´ an´ı Odeˇ c´ıt´ an´ı Inkrementace Dekrementace I
* / % + ++ --
Zkr´acen´y z´apis I I I I
a+=3 b-=2 c*=5 d/=a
; ; ; ;
// // // //
Jednotkov´ y doplnˇ ek Bitov´ y posuv doleva Bitov´ y posuv doprava Logick´ y souˇ cin AND Exkluzivn´ı souˇ cet EX-OR Logick´ y souˇ cet OR
I
a=a+3 b=b-2 c=c*5 d=d/a
Operand
Operace
Zkr´acen´y z´apis I I I I
a|=3 ; b&=2 ; c∧=5 ; d=2 ;
∼ & ∧ |
Podm´ınka I
Syntaxe podm´ınky if if( podm´ ınka ) { ; } else { ; }
I
Syntaxe podm´ınky switch switch( promˇ enn´ a ) { case hodnota1: case hodnota2: ; default: ; }
Tabulka: Relaˇcn´ı operandy Operace Je roven Je r˚ uzn´ y od Menˇs´ı neˇz Menˇs´ı nebo roven Vˇ etˇs´ı neˇz Vˇ etˇs´ı nebo roven
Operand == != < <= > >=
Cyklus I I
Syntaxe cyklu while
while( 1 ) { ; ; }
while( podm´ ınka ) { ; ; } I
while( 1 ) ;
Syntaxe cyklu for for( par0; par1; par2 ) { ; ; }
Nekoneˇcn´a smyˇcka while
I
Nekoneˇcn´a smyˇcka for for( ;; ) { ; ; }
Specifika pˇrekladaˇ ce GCC a knihovny avr-libc I
Testov´an´ı hodnoty bitu v I/O registru if( bit is set( registr, bit )) { ; } if( bit is clear( registr, bit )) { ; }
I
Cyklus s testov´an´ım bitu v I/O registru loop until bit is set( registr, bit ) { ; } loop until bit is clear( registr, bit ) { ; }
Kombinace jazyka symbolick´ ych adres a C I
Programov´an´ı ve vyˇsˇs´ım jazyce je pohodlnˇejˇs´ı, rychlejˇs´ı, k´od je sn´aze pˇrenositeln´y mezi platformami; zab´ır´a v´ıce m´ısta v pamˇeti, jeho v´ykon je pomalejˇs´ı.
I
Bˇeˇzn´a praxe je tvorba aplikace v jazyce C, pouze exponovan´e ˇc´asti programu, kde chceme m´ıt pˇrehled o poˇctu instrukc´ı, rychlosti v´ykonu, ˇci konkr´etn´ı funkci se tvoˇr´ı v JSA. Proto lze zdrojov´e k´ody kombinovat
I
asm( "sei" ) ; asm( "ldi r16,0x20 \n inc r16 \n" ) ; Pˇreklad: sei ldi r16,0x20 inc r16 I I
Kombinace jazyka symbolick´ ych adres a C I
Pˇred´av´an´ı parametr˚ u mezi funkc´ı v JSA a hlavn´ı aplikac´ı v C pomoc´ı pˇredem urˇcen´ych registr˚ u I I I I I
Prvn´ı vstupn´ı parametr: r25:r24, Druh´y vstupn´ı parametr: r23:r22, ... Dev´at´y vstupn´ı parametr: r9:r8, N´avratov´a hodnota funkce: r25:r24.
Prototyp extern int add compl( int,int ) ; I c = add compl( a,b ) ; I I I
a @ r25:r24 b @ r23:r22 c @ r25:r24
Obsah pˇredn´ aˇsky Typy adresov´ an´ı Registrov´e, pˇr´ım´e, nepˇr´ım´e, bezprostˇredn´ı Vˇ etven´ı programu Programov´y ˇc´ıtaˇc Vol´an´ı podprogramu, z´asobn´ık Obsluha pˇreruˇsen´ı Uk´azka programu v JSA a v jazyce C pro ATmega16 Programov´ an´ı mikrokontrol´ er˚ u pomoc´ı vyˇsˇs´ıch jazyk˚ u Pˇreklad aplikace z jazyka C Programov´an´ı v jazyce C Kombinace jazyka symbolick´ych adres a C Zdroje informac´ı
Zdroje informac´ı V´an ˇa, V. Mikrokontrol´ery ATMEL AVR; popis procesor˚ u a instrukˇcn´ı soubor. Ben – technick´a literatura, Praha, 2003, ISBN 80-7300-083-0. Matouˇsek, D. Pr´aces mikrokontrol´ery ATMEL AVR; ATmega16. Ben – technick´a 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, (ˇr´ıjen 2007). http://www.atmel.com/dyn/resources/prod_documents/ DOC1022.PDF Atmel Corporation. ATmega16, (ˇr´ıjen 2007). http://www.atmel.com/dyn/products/product_card. asp?part_id=2010 Atmel Corporation. ATtiny11, (ˇr´ıjen 2007). http://www.atmel.com/dyn/products/product_card. asp?part_id=2031 Fleury, P. Peter Fleury’s Home Page, (ˇr´ıjen 2007). http://homepage.hispeed.ch/peterfleury/