Mikroprocesorov´ a technika a embedded syst´ emy Pˇredn´aˇsky (ver. 2011-12-16)
doc. Ing. Tom´ aˇ s Fr´ yza, Ph.D.
´ USTAV RADIOELEKTRONIKY
Fakulta elektrotechniky a komunikaˇcn´ıch technologi´ı VUT v Brnˇe
1
Obsah 1 Blokov´ a struktura mikrokontrol´ er˚ u 1.1 Popis a pouˇzit´ı mikrokontrol´eru, mikroprocesoru a mikropoˇc´ıtaˇce 1.2 Architektura mikropoˇc´ıtaˇc˚ u . . . . . . . . . . . . . . . . . . . . . 1.3 Procesory CISC a RISC . . . . . . . . . . . . . . . . . . . . . . . ˇ ıdic´ı jednotka mikrokontrol´eru . . . . . . . . . . . . . . . . . . . 1.4 R´
. . . .
7 7 9 12 13
. . . . . . .
15 15 17 17 18 21 22 23
. . . .
25 25 25 30 32
4 Vnitˇ rn´ı struktura z´ akladn´ıch perif´ eri´ı 4.1 Vstupnˇe/v´ ystupn´ı port . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ˇ 4.2 Casovaˇ c/ˇc´ıtaˇc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.3 Watchdog ˇcasovaˇc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
34 34 38 39
5 Komunikace zaˇ r´ızen´ı po sbˇ ernici 5.1 S´eriov´ y a paraleln´ı pˇrenos dat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.2 Obvody s tˇr´ı-stavov´ ym v´ ystupem . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.3 Pˇresun dat po sbˇernici . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
40 40 41 42
6 Programov´ an´ı mikrokontrol´ er˚ u pomoc´ı vyˇ sˇ s´ıch jazyk˚ u 6.1 Pˇreklad aplikace z jazyka C . . . . . . . . . . . . . . . . . 6.2 Programov´ an´ı v jazyce C . . . . . . . . . . . . . . . . . . 6.3 Specifika pˇrekladaˇce GCC-AVR a knihovny AVR Libc . . 6.4 Kombinace jazyka symbolick´ ych adres a C . . . . . . . . .
. . . .
45 45 47 48 51
7 Ovl´ ad´ an´ı zobrazovac´ıch zaˇ r´ızen´ı 7.1 Pˇr´ım´e propojen´ı s MCU . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7.2 Znakov´e LCD displeje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
53 53 53
8 Zpracov´ an´ı analogov´ ych sign´ al˚ u 8.1 A/D pˇrevodn´ık . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8.2 Analogov´ y kompar´ ator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
57 57 59
ˇ ızen´ı s´ 9 R´ eriov´ e komunikace 9.1 Synchronn´ı a asynchronn´ı komunikace . . . . . . 9.2 Jednotka UART . . . . . . . . . . . . . . . . . . 9.3 S´eriov´e rozhran´ı RS-232 . . . . . . . . . . . . . . 9.4 S´eriov´ a komunikace prostˇrednictv´ım sbˇernice I2C
61 61 62 64 65
2 Instrukˇ cn´ı soubor mikrokontrol´ er˚ u 2.1 Form´ aty instrukc´ı . . . . . . . . . . . . . 2.2 Program´ atorsk´ y model . . . . . . . . . . ’ 2.2.1 Pamˇet ov´ y prostor AVR . . . . . 2.2.2 Pˇr´ıznakov´e bity . . . . . . . . . . 2.2.3 Direktivy pˇrekladaˇce . . . . . . . 2.2.4 Typy instrukc´ı . . . . . . . . . . 2.3 Proces dek´ odov´ an´ı a vykon´ an´ı instrukc´ı 3 Programov´ an´ı mikrokontrol´ er˚ u 3.1 Typy adresov´ an´ı . . . . . . . . . . . . . 3.2 Vˇetven´ı programu . . . . . . . . . . . . 3.3 Obsluha pˇreruˇsen´ı . . . . . . . . . . . . 3.3.1 Extern´ı poˇzadavek na pˇreruˇsen´ı .
. . . . . . .
. . . .
. . . . . . .
. . . .
. . . . . . .
. . . .
. . . . . . .
. . . .
. . . . . . .
. . . .
. . . . . . .
. . . .
. . . .
. . . . . . .
. . . .
. . . .
. . . . . . .
. . . .
. . . .
. . . . . . .
. . . .
. . . .
. . . . . . .
. . . .
. . . .
. . . . . . .
. . . .
. . . .
. . . .
. . . . . . .
. . . .
. . . .
. . . .
. . . . . . .
. . . .
. . . .
. . . .
. . . . . . .
. . . .
. . . .
. . . .
. . . .
. . . . . . .
. . . .
. . . .
. . . .
. . . .
. . . . . . .
. . . .
. . . .
. . . .
. . . .
. . . . . . .
. . . .
. . . .
. . . .
. . . .
. . . . . . .
. . . .
. . . .
. . . .
. . . .
. . . . . . .
. . . .
. . . .
. . . .
. . . .
. . . . . . .
. . . .
. . . .
. . . .
. . . .
. . . . . . .
. . . .
. . . .
. . . .
. . . .
. . . . . . .
. . . .
. . . .
. . . .
. . . .
2
Mikroprocesorov´a technika a embedded syst´emy
´ 10 Uvod do sign´ alov´ ych procesor˚ u 10.1 Paraleln´ı zpracov´ an´ı instrukc´ı a dat . . . . . . . . . . . . . . . . . . . . . . . . . . 10.2 Architektura sign´ alov´ ych procesor˚ u typu VLIW . . . . . . . . . . . . . . . . . . . 10.3 Zp˚ usoby adresov´ an´ı operand˚ u u sign´alov´ ych procesor˚ u . . . . . . . . . . . . . . .
68 68 68 71
11 Programov´ an´ı sign´ alov´ ych procesor˚ u
73
Literatura
76
A Uk´ azky program˚ u pro AVR v jazyce A.1 Pr´ace s registry, aritmetick´e operace A.2 Ovl´ ad´ an´ı vstupnˇe/v´ ystupn´ıho portu A.3 Podm´ınˇen´e vˇetven´ı programu . . . . A.4 Vol´ an´ı podprogramu . . . . . . . . . A.5 Obsluha pˇreruˇsen´ı . . . . . . . . . . ˇ A.6 Casovaˇ c watchdog . . . . . . . . . .
symbolick´ ych . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
B Uk´ azky program˚ u pro AVR v jazyce C B.1 Ovl´ ad´ an´ı vstupnˇe/v´ ystupn´ıho portu . . . B.2 Podm´ınˇen´e vˇetven´ı programu . . . . . . . B.3 Vol´ an´ı funkce . . . . . . . . . . . . . . . . B.4 Obsluha pˇreruˇsen´ı . . . . . . . . . . . . . ˇ B.5 Casovaˇ c watchdog . . . . . . . . . . . . . B.6 Vol´ an´ı funkce v JSA z aplikace v jazyce C B.7 A/D pˇrevodn´ık . . . . . . . . . . . . . . . C Znakov´ a sada LCD displeje
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
adres . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
. . . . . .
80 80 80 81 82 82 83
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
86 86 86 87 87 89 89 90
. . . . . . .
. . . . . . .
. . . . . . .
93
Fakulta elektrotechniky a komunikaˇcn´ıch technologi´ı VUT v Brnˇe
3
Seznam obr´ azk˚ u 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 2.1 2.2 2.3 2.4 3.1 3.2 3.3 3.4 4.1 4.2 4.3 4.4 4.5 5.1 5.2 5.3 5.4 5.5 5.6 6.1 6.2 6.3 6.4 7.1 7.2 7.3 8.1 8.2 8.3 8.4 9.1 9.2 9.3 9.4 9.5 9.6 9.7 9.8 9.9 9.10 9.11
Prvn´ı mikroprocesor Intel 4004 z roku 1971 . . . . . . . . . . . . . . . . . Mikropoˇc´ıtaˇc Altair 8800 . . . . . . . . . . . . . . . . . . . . . . . . . . . Mikrokontrol´er TMS1000 firmy Texas Instruments . . . . . . . . . . . . . Uk´ azka embedded aplikac´ı . . . . . . . . . . . . . . . . . . . . . . . . . . . Principi´ aln´ı struktura mikropoˇc´ıtaˇce . . . . . . . . . . . . . . . . . . . . . Zjednoduˇsen´ a blokov´ a struktura AVR . . . . . . . . . . . . . . . . . . . . ˇ ızen´ı operac´ı ˇcten´ı/z´ R´ apis . . . . . . . . . . . . . . . . . . . . . . . . . . . Oddˇelen´e adresov´ an´ı pamˇeti a I/O jednotky . . . . . . . . . . . . . . . . . Pˇreklad zdrojov´eho k´ odu z jazyka symbolick´ ych adres do strojov´eho k´odu Symboly pouˇz´ıvan´e ve v´ yvojov´ ych diagramech . . . . . . . . . . . . . . . . Pamˇet’ov´ y prostor mikrokontrol´eru ATmega16 . . . . . . . . . . . . . . . . Struktura stavov´eho registru AVR . . . . . . . . . . . . . . . . . . . . . . Struktura programov´eho ˇc´ıtaˇce mikrokontrol´eru ATmega16 . . . . . . . . Struktura ukazatele na z´ asobn´ık mikrokontrol´eru ATmega16 . . . . . . . . Zdroje extern´ıho pˇreruˇsen´ı u mikrokontrol´eru ATmega16 . . . . . . . . . . Struktura kontroln´ıch registr˚ u pro extern´ı pˇreruˇsen´ı . . . . . . . . . . . . Struktura smˇerov´eho registru DDRC . . . . . . . . . . . . . . . . . . . . . Funkˇcn´ı sch´ema jednoho I/O pinu mikrokontrol´eru AVR . . . . . . . . . . Pˇripojen´ı z´ akladn´ıch extern´ıch perif´eri´ı k mikrokontrol´eru . . . . . . . . . Blokov´e sch´ema ˇcasovaˇce/ˇc´ıtaˇce mikrokontrol´eru ATmega16 . . . . . . . . Princip generov´ an´ı PWM sign´alu . . . . . . . . . . . . . . . . . . . . . . . Pˇrenos dat mezi registry . . . . . . . . . . . . . . . . . . . . . . . . . . . . Pˇripojen´ı tˇr´ı sign´ al˚ u na sbˇernici pomoc´ı tˇr´ı-stavov´eho bufferu 74HC125 . . Komunikace mezi zaˇr´ızen´ımi po datov´e sbˇernici . . . . . . . . . . . . . . . ˇ Casov´ e pr˚ ubˇehy ˇr´ıdic´ıch a datov´ ych sign´al˚ u . . . . . . . . . . . . . . . . . Zjednoduˇsen´e zn´ azornˇen´ı datov´e sbˇernice ve sch´ematu . . . . . . . . . . . Propojen´ı I/O pin˚ u uvnitˇr integrovan´eho obvodu . . . . . . . . . . . . . . Postup pˇrekladu aplikace v jazyce C . . . . . . . . . . . . . . . . . . . . . Zjednoduˇsen´ y pˇreklad zdrojov´eho k´odu z jazyka C pro MCU . . . . . . . Anatomie programu v jazyce C . . . . . . . . . . . . . . . . . . . . . . . . Pˇred´ av´ an´ı parametr˚ u/v´ ystupn´ı hodnoty mezi k´odem v jazyce C a JSA . . Pˇr´ıklad zapojen´ı 7segmentov´eho displeje . . . . . . . . . . . . . . . . . . . Datov´e a ˇr´ıdic´ı sign´ aly LCD displeje . . . . . . . . . . . . . . . . . . . . . Z´ apis instrukce do LCD displeje prostˇrednictv´ım 8 a 4bitov´e komunikace . Blokov´e sch´ema intern´ıho A/D pˇrevodn´ıku mikrokontrol´eru ATmega16 . . Doba pˇrevodu prvn´ıho vzorku A/D pˇrevodn´ıku . . . . . . . . . . . . . . . Doba pˇrevodu druh´eho a n´ asleduj´ıc´ıch vzork˚ u A/D pˇrevodn´ıku . . . . . . Blokov´e sch´ema analogov´eho kompar´atoru mikrokontrol´eru ATmega16 . . Struktura asynchronn´ıho r´ amce pro m´od 7E2 . . . . . . . . . . . . . . . . Princip paralelnˇe/s´eriov´eho pˇrevodn´ıku . . . . . . . . . . . . . . . . . . . . Vnitˇrn´ı struktura jednotky UART . . . . . . . . . . . . . . . . . . . . . . Proces vys´ıl´ an´ı dat pomoc´ı jednotky UART . . . . . . . . . . . . . . . . . Proces pˇr´ıjmu dat pomoc´ı jednotky UART . . . . . . . . . . . . . . . . . . Synchronizace pˇrij´ımaˇce UART . . . . . . . . . . . . . . . . . . . . . . . . Napˇet’ov´e u ´rovnˇe asynchronn´ıho r´amce u RS-232 a TTL . . . . . . . . . . Pouˇzit´ı obvodu MAX232 pro komunikaci mezi UART a RS-232 . . . . . . Pˇripojen´ı zaˇr´ızen´ı na sbˇernici I2C . . . . . . . . . . . . . . . . . . . . . . . ˇ Casov´ an´ı pˇrenosu bit˚ u na sbˇernici I2C . . . . . . . . . . . . . . . . . . . . Struktura adresn´ıho paketu na sbˇernici I2C . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
7 8 8 9 10 11 14 14 15 16 18 19 26 29 32 33 34 35 37 38 39 40 41 42 43 44 44 45 46 48 52 53 54 55 58 59 59 60 61 62 62 63 63 64 64 65 65 66 66
4
Mikroprocesorov´a technika a embedded syst´emy
9.12 9.13 10.1 10.2 B.1 B.2 C.1
Kombinace adresn´ıho a datov´eho paketu na sbˇernici I2C . . . . . . . . Komunikace po sbˇernici I2C s expand´erem portu PCF8574 . . . . . . S´eriov´e a paraleln´ı zpracov´ an´ı dat . . . . . . . . . . . . . . . . . . . . . J´adro sign´ alov´eho procesoru s plovouc´ı ˇr´adovou ˇc´arkou TMS320C6713 Pˇred´ av´ an´ı vstupn´ıch parametr˚ u z jazyka C pro AVR . . . . . . . . . . Obsluha pˇreruˇsen´ı po dokonˇcen´ı A/D pˇrevodu . . . . . . . . . . . . . . Znakov´ a sada LCD displeje . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
66 67 69 70 91 91 93
Fakulta elektrotechniky a komunikaˇcn´ıch technologi´ı VUT v Brnˇe
5
Seznam tabulek 1.1 1.2 1.3 2.1 2.2 2.3 2.4 2.5 3.1 3.2 4.1 6.1 7.1 7.2 10.1 10.2 10.3 10.4 10.5 11.1
Statistick´ a ˇcetnost typ˚ u instrukc´ı v programech . . . . . . . . Srovn´ an´ı testovac´ıch aplikac´ı mikrokontrol´er˚ u . . . . . . . . . ˇ R´ızen´ı oddˇelen´eho adresov´ an´ı pamˇeti a I/O jednotky . . . . . Pˇr´ıklady instrukc´ı mikrokontrol´eru typu RISC . . . . . . . . . Vybran´e kontroln´ı registry AVR . . . . . . . . . . . . . . . . . Direktivy pˇrekladaˇce AVR . . . . . . . . . . . . . . . . . . . . Vybran´e aritmetick´e a logick´e instrukce AVR . . . . . . . . . Vybran´e pseudoinstrukce AVR . . . . . . . . . . . . . . . . . Pˇrehled vektor˚ u pˇreruˇsen´ı pro mikrokontrol´er ATmega16 . . . Vektory pˇreruˇsen´ı mikrokontrol´eru ATmega11 . . . . . . . . . Nastaven´ı funkce I/O pinu mikrokontrol´eru . . . . . . . . . . Parametry makra obsluhy pˇreruˇsen´ı pro ATmega16 . . . . . . Vybran´e pˇr´ıkazy pro komunikaci s LCD displejem . . . . . . . Soupis vybran´ ych funkc´ı z knihovny pro LCD . . . . . . . . . Vybran´e algoritmy ˇc´ıslicov´eho zpracov´an´ı sign´al˚ u . . . . . . . Vyuˇzit´ı funkˇcn´ıch jednotek sign´alov´eho procesoru . . . . . . . Zmˇena hodnot ukazatel˚ u pˇri nepˇr´ım´em adresov´an´ı . . . . . . Pˇr´ıklad nepˇr´ım´eho adresov´ an´ı operand˚ u – instrukce LDW . . . Pˇr´ıklad nepˇr´ım´eho adresov´ an´ı operand˚ u – instrukce STB . . . Srovn´ an´ı poˇcetn´ı n´ aroˇcnosti 8bodov´eho souˇctu souˇcin˚ u (SoP)
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . .
12 13 14 17 18 21 23 23 31 31 34 51 54 55 68 70 71 71 72 74
6
Mikroprocesorov´a technika a embedded syst´emy
Seznam zdrojov´ ych k´ od˚ u 2.1 Funkce podporovan´e asemblerem AVR . . . . . . . . . . . . . . . . . . . . 2.2 Uk´azka pˇrekladu 1 a 2bytov´ ych instrukc´ı . . . . . . . . . . . . . . . . . . . 2.3 Uk´azka pˇrekladu 3bytov´e instrukce . . . . . . . . . . . . . . . . . . . . . . 2.4 Pˇr´ıznakov´e bity AVR – pˇrenos . . . . . . . . . . . . . . . . . . . . . . . . 2.5 Pˇr´ıznakov´e bity AVR – nula . . . . . . . . . . . . . . . . . . . . . . . . . . 2.6 Pˇr´ıznakov´e bity AVR – z´ aporn´a hodnota . . . . . . . . . . . . . . . . . . . 2.7 Pˇr´ıznakov´e bity AVR – pˇreteˇcen´ı . . . . . . . . . . . . . . . . . . . . . . . 2.8 Pˇr´ıznakov´e bity AVR – poloviˇcn´ı pˇrenos . . . . . . . . . . . . . . . . . . . 2.9 Pˇr´ıznakov´e bity AVR – u ´loˇzn´ y bit . . . . . . . . . . . . . . . . . . . . . . 2.10 Pˇr´ıznakov´e bity AVR – pˇreruˇsen´ı . . . . . . . . . . . . . . . . . . . . . . . 2.11 V´ ypoˇcet souˇctu komplexn´ıch ˇc´ısel – makro . . . . . . . . . . . . . . . . . . 2.12 V´ ypoˇcet souˇctu komplexn´ıch ˇc´ısel – pˇreloˇzen´e makro . . . . . . . . . . . . 3.1 Relativn´ı adresov´ an´ı nepodm´ınˇen´eho skoku . . . . . . . . . . . . . . . . . 3.2 Rekurzivn´ı vol´ an´ı dvou podprogram˚ u. . . . . . . . . . . . . . . . . . . . . 3.3 Definice z´ asobn´ıku . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4.1 Z´apis do kontroln´ıch registr˚ u pomoc´ı LDI a OUT v JSA . . . . . . . . . . . 4.2 Z´apis do kontroln´ıch registr˚ u pomoc´ı SBI a CBI v JSA . . . . . . . . . . . 4.3 Z´apis do kontroln´ıch registr˚ u v jazyce C . . . . . . . . . . . . . . . . . . . 6.1 Uk´azka zdrojov´eho k´ odu v jazyce C a JSA pro AVR . . . . . . . . . . . . 6.2 Pˇreklad uk´ azkov´e aplikace do strojov´eho k´odu . . . . . . . . . . . . . . . . 6.3 Z´apis testovan´e aplikace ve form´atu Intel HEX . . . . . . . . . . . . . . . 6.4 Aplikace pro obsluhu kl´ avesnice v jazyce C . . . . . . . . . . . . . . . . . 6.5 Plnˇen´ı kontroln´ıch registr˚ u. . . . . . . . . . . . . . . . . . . . . . . . . . . 6.6 Testov´ an´ı hodnoty jednoho bitu v kontroln´ıch registrech . . . . . . . . . . 6.7 Cyklus s testov´ an´ım hodnoty jednoho bitu v kontroln´ıch registrech . . . . 6.8 Aplikace s pˇreruˇsen´ım v jazyce C . . . . . . . . . . . . . . . . . . . . . . . 6.9 Vkl´ ad´ an´ı instrukc´ı do v´ ysledn´eho k´odu prostˇrednictv´ım funkce asm() . . . 7.1 Pouˇzit´ı knihovny pro znakov´ y LCD displej . . . . . . . . . . . . . . . . . . 10.1 Syntaxe zdrojov´eho k´ odu DSP v jazyce symbolick´ ych adres . . . . . . . . 11.1 Aplikace pro DSP v jazyce C . . . . . . . . . . . . . . . . . . . . . . . . . 11.2 Vybran´e speci´ aln´ı funkce pˇrekladaˇce intrinsic . . . . . . . . . . . . . . . . 11.3 Kombinace zdrojov´ ych k´ od˚ u – soubor f1.c . . . . . . . . . . . . . . . . . 11.4 Kombinace zdrojov´ ych k´ od˚ u – soubor f2.asm . . . . . . . . . . . . . . . . 11.5 Kombinace zdrojov´ ych k´ od˚ u – soubor f2.sa . . . . . . . . . . . . . . . . . A.1 Uk´azka zdrojov´eho k´ odu pro AVR . . . . . . . . . . . . . . . . . . . . . . A.2 Bin´ arn´ı ˇc´ıtaˇc v jazyce symbolick´ ych adres . . . . . . . . . . . . . . . . . . A.3 Podm´ınˇen´e vˇetven´ı programu v JSA . . . . . . . . . . . . . . . . . . . . . A.4 Vol´ an´ı podprogramu v JSA . . . . . . . . . . . . . . . . . . . . . . . . . . A.5 Obsluha pˇreruˇsen´ı v JSA . . . . . . . . . . . . . . . . . . . . . . . . . . . . A.6 Vyuˇzit´ı ochrann´eho ˇcasovaˇce watchdog v JSA . . . . . . . . . . . . . . . . B.1 Bin´ arn´ı ˇc´ıtaˇc v jazyce C . . . . . . . . . . . . . . . . . . . . . . . . . . . . B.2 Podm´ınˇen´e vˇetven´ı programu v jazyce C . . . . . . . . . . . . . . . . . . . B.3 Vol´ an´ı funkce v jazyce C . . . . . . . . . . . . . . . . . . . . . . . . . . . . B.4 Pˇreruˇsen´ı mikrokontrol´eru v jazyce C . . . . . . . . . . . . . . . . . . . . . B.5 Vyuˇzit´ı ochrann´eho ˇcasovaˇce watchdog v jazyce C . . . . . . . . . . . . . B.6 Kombinace zdrojov´ ych k´ od˚ u v jazyce C a v JSA pro AVR – soubor f1.c . B.7 Kombinace zdrojov´ ych k´ od˚ u v jazyce C a v JSA pro AVR – soubor f2.s . B.8 A/D pˇrevod pomoc´ı intern´ıho pˇrevodn´ıku AVR . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
15 16 16 19 19 20 20 20 20 21 22 22 27 28 28 36 36 36 46 47 47 49 50 50 50 51 52 56 70 73 73 74 74 75 80 81 82 83 84 85 86 87 88 88 89 90 90 92
Fakulta elektrotechniky a komunikaˇcn´ıch technologi´ı VUT v Brnˇe
1 1.1
7
Blokov´ a struktura mikrokontrol´ er˚ u Popis a pouˇ zit´ı mikrokontrol´ eru, mikroprocesoru a mikropoˇ c´ıtaˇ ce
Mikroprocesorov´ a technika se zab´ yv´ a n´avrhem, testov´an´ım a realizac´ı ˇc´ıslicov´ ych aplikac´ı, kter´e jsou ˇr´ızeny centr´ aln´ı ˇr´ıdic´ı jednotkou. Mikroprocesor (MPU – Microprocessor Unit) je centr´ aln´ı ˇr´ıdic´ı jednotka (CPU – Central Processing Unit) na samostatn´em ˇcipu. Prvn´ı mikroprocesor vyvinula firma Intel v roce 1971 (konkr´etnˇe 15. listopadu 1971) pod oznaˇcen´ım 4004 (viz obr´ azek 1.1) [Int71]. Tento mikroprocesor obsahoval 2 300 tranzistor˚ u, pouˇzita byla technologie 10 µm, byl 4bitov´ y s Harvardskou architekturou (tj. mˇel oddˇelen´ y pamˇet’ov´ y prostor pro program, kter´ y vykon´aval a data, kter´a zpracov´aval) v 16pinov´em pouzdˇre a byl ˇr´ızen hodinov´ ym sign´ alem s frekvenc´ı 740 kHz. Pro srovn´an´ı, procesor Intel Core i7 3960X (Sandy Bridge-E) je 64bitov´ y, obsahuje 6 jader (nav´ıc 2 j´adra jsou vypnut´a), obsahuje 2,27 miliardy tranzistor˚ u s technologi´ı 32 nm a ˇr´ıdic´ı frekvence j´adra je 3,3 GHz. Intel 4004 d´ ale obsahoval jedinou multiplexovanou 4bitovou sbˇernici pro pˇrenos 12bitov´e adresy (tj. maxim´ aln´ı adresn´ı prostor byl 4 kB) ve tˇrech kroc´ıch. Instrukˇcn´ı sada obsahovala pouze 46 instrukc´ı (z toho 41 bylo 8bitov´ ych a 5 bylo 16bitov´ ych). Pro rychl´ y pˇr´ıstup k dat˚ um sloˇzilo 16 4bitov´ ych registr˚ u. Tento mikroprocesor byl p˚ uvodnˇe urˇcen pro ˇr´ızen´ı kalkulaˇcek. (Pˇekn´ y emul´ ator tohoto mikroprocesoru lze nal´ezt na internetu [Int01].)
(a)
(b)
Obr´ azek 1.1: Prvn´ı mikroprocesor Intel 4004 z roku 1971: (a) pouzdro, (b) blokov´a struktura. Doplnˇen´ım mikroprocesoru o podp˚ urn´e obvody, tj. vstupnˇe/v´ ystupn´ı periferie a pamˇet’(i) (pro program i data) vznikne mikropoˇc´ıtaˇc. Mikropoˇc´ıtaˇc je obecnˇe urˇcen pro zpracov´an´ı dat a ˇr´ızen´ı jednoduch´ ych proces˚ u. Prvn´ı mikropoˇc´ıtaˇce vznikaly v polovinˇe 70t´ ych let (logicky bezprostˇrednˇe po vzniku mikroprocesor˚ u), zpravidla bez kl´avesnice a displeje. Velikost pamˇet’ov´eho prostoru byla typicky 4 aˇz 16 kB. Jedn´ım z prvn´ıch mikropoˇc´ıtaˇc˚ u byl Altair 8800 z roku 1975, obsahuj´ıc´ı 8bitov´ y mikroprocesor Intel 8080A, ˇr´ıdic´ı hodinov´ y sign´al mˇel frekvenci 2 MHz, velikost pamˇeti RAM byla v rozmez´ı 256 B aˇz 64 kB a instrukˇcn´ı soubor obsahoval 78 instrukc´ı. Obsah pamˇeti se zapisoval a ˇcetl pomoc´ı pˇrep´ınaˇc˚ u a LED diod. Pˇrep´ınaˇci se nastavila poˇzadovan´ a
8
Mikroprocesorov´a technika a embedded syst´emy
adresa a LED diody signalizovaly obsah vybran´e pamˇet’ov´e buˇ nky. Uk´azka mikropoˇc´ıtaˇce Altair 8800 je zobrazena na obr´ azku 1.2.
(a)
(b)
Obr´ azek 1.2: Jeden z prvn´ıch mikropoˇc´ıtaˇc˚ u: (a) Altair 8800, (b) Altair 8800 v seri´alu IT Crowd [Itc11]. Mikrokontrol´er (MCU – Microcomputer Unit) vznikne sdruˇzen´ım vˇsech ˇc´ast´ı mikropoˇc´ıtaˇce (ˇr´ıd´ıc´ı jednotka, pamˇeti RAM, ROM, vstupy/v´ ystupy, ˇcasovaˇc/ˇc´ıtaˇc, a jin´e perif´erie) na jedin´ y ˇcip (souˇc´ astku). Mikrokontrol´ery se vyznaˇcuj´ı n´ızk´ ymi poˇrizovac´ımi n´aklady a spotˇrebou, a pˇredevˇs´ım dostateˇcnou hardwarovou v´ ybavou pro ˇr´ızen´ı jednoduch´ ych aplikac´ı. Struktura a funkce mikrokontrol´er˚ u se do souˇcasnosti pˇr´ıliˇs nezmˇenila. Z´akladn´ı dˇelen´ı mikrokontrol´er˚ u je podle ˇs´ıˇrky registr˚ u a sbˇernice na 8bitov´e, 16bitov´e, pˇr´ıp. 32bitov´e. Prvn´ı mikrokontrol´ery vytvoˇrila v roce 1974 firma Texas Instruments pod oznaˇcen´ım TMS1000. Tento mikrokontrol´er obsahoval 28pinov´e pouzdro, hodinov´ y sign´al o frekvenci 400 kHz, 4bitovou sbˇernici, velikost pamˇeti typu RAM 32 B a ROM 1 kB. D´ale obsahoval intern´ı oscil´ator pro ˇr´ızen´ı sv´eho bˇehu, 4 vstupn´ı piny, 11 v´ ystupn´ıch pin˚ u a 8bitov´ y v´ ystupn´ı paraleln´ı port. Fotografie tohoto mikrokontrol´eru je zobrazena na obr´azku 1.3.
Obr´ azek 1.3: Prvn´ı mikrokontrol´er TMS1000 firmy Texas Instruments. V souˇcasn´e dobˇe existuje velk´e mnoˇzstv´ı v´ yrobc˚ u a dod´avan´ ych ˇrad mikrokontrol´er˚ u. Bˇeˇzn´e ˇrady 8bitov´ ych mikrokontrol´er˚ u jsou 8048, 8051 (firmy Intel), 68HCS08, (Freescale), Z8 (Zilog), PIC (Microchip), H8 (Hitachi), ˇci AVR (Atmel). Modern´ı mikrokontrol´ery mohou obsahovat velk´e mnoˇzstv´ı perif´eri´ı (GPIO – General Purpose Input/Output, ˇcasovaˇc/ˇc´ıtaˇc, A/D pˇrevodn´ık, analogov´ y kompar´ ator, s´eriov´e sbˇernice I2C, USB, CAN, . . .). Jejich prim´arn´ı urˇcen´ı je vˇsak totoˇzn´e: ˇr´ızen´ı proces˚ u, blok˚ u, a vz´ajemn´e komunikace v tzv. embedded zaˇr´ızen´ıch. Na obr´azku 1.4 jsou uvedeny nˇekter´e ze zaˇr´ızen´ı, kter´e vyvinuli studenti bakal´aˇrsk´eho a magistersk´eho studia v r´ amci ˇreˇsen´ı sv´ ych bakal´aˇrsk´ ych a diplomov´ ych prac´ı v akademick´em roce ´ 2010/11 na Ustavu radioelektroniky, FEKT VUT v Brnˇe. Inspiraci v dalˇs´ıch aplikac´ıch lze nal´ezt napˇr. v [Fed01] a [Fry01]. Libovolnou ˇr´ıdic´ı aplikaci lze zpravidla vyˇreˇsit nˇekolika zp˚ usoby. Vˇzdy z´aleˇz´ı na sloˇzitosti,
Fakulta elektrotechniky a komunikaˇcn´ıch technologi´ı VUT v Brnˇe
(a)
(b)
9
(c)
Obr´ azek 1.4: Uk´ azka embedded aplikac´ı: (a) Reklamn´ı LED RGB trubice s ovl´adac´ı jednotkou (Marek Frelich), (b) Realizace digit´ aln´ıho osciloskopu (Tom´aˇs Kulig), (c) Aplikace kapacitn´ıch sn´ımaˇc˚ u v technick´e praxi (Luk´ aˇs Michal´ık).
na dosaˇziteln´ ych parametrech (rychlost, pˇresnost, . . .), n´akladech (finance, ˇcas), rozmˇerech, poˇzadovan´e variabilitˇe, atd. Kromˇe v´ yvoje embedded zaˇr´ızen´ı obecnˇe existuj´ı tyto z´akladn´ı moˇznosti jak poˇzadovanou aplikaci vytvoˇrit: realizace pomoc´ı existuj´ıc´ı logick´e souˇc´astky s danou funkc´ı, d´ale pouˇzit´ı jednotliv´ ych logick´ ych ˇclen˚ u (AND, OR, XOR), realizace obvody PROM, multiplexorem, programovateln´ ymi logick´ ymi obvody (PAL, PLD, CPLD, FPGA), ˇci pomoc´ı specifick´ ych obvod˚ u ASIC (Application Specific Integrated Circuit). V tomto pˇredmˇetu je pozornost vˇenov´ana v´ yhradnˇe aplikac´ım s mikrokontrol´ery, pˇr´ıp. se sign´alov´ ymi procesory. Aplikace s mikrokontrol´ery maj´ı srovnateln´e rozmˇery s PLD, ale obecnˇe vykazuj´ı niˇzˇs´ı spotˇrebu i rychlost zpracov´an´ı. Niˇzˇs´ı rychlost je zp˚ usobena sekvenˇcn´ı podstatou vykon´avan´eho programu. Aplikace s mikrokontrol´ery obecnˇe obsahuje m´enˇe souˇc´astek v syst´emu, coˇz zp˚ usob´ı niˇzˇs´ı n´ aklady na v´ yrobu ploˇsn´ ych spoj˚ u, ale i vˇetˇs´ı spolehlivost v d˚ usledku menˇs´ıho poˇctu propojen´ı. Rovnˇeˇz v´ yvoj a testov´an´ı nov´ ych aplikac´ı je jednoduch´ y – obmˇenit funkci cel´eho zaˇr´ızen´ı lze pouh´ ym pˇreprogramov´ an´ım obsluˇzn´eho softwaru bez nutnosti z´asahu do hardwaru.
1.2
Architektura mikropoˇ c´ıtaˇ c˚ u
Mikropoˇc´ıtaˇce lze dˇelit podle cel´e ˇrady krit´eri´ı. Nejd˚ uleˇzitˇejˇs´ı je vˇsak jejich architektura. Prvn´ı dˇelen´ı mikropoˇc´ıtaˇc˚ u iniciovala americk´a vl´ada jiˇz v 70. letech, kdy poˇz´adala Princetonskou a Harvardskou univerzitu, aby navrhly architekturu vhodnou pro potˇreby arm´ady (konkr´etnˇe dˇelostˇrelectva). Vznikly tak dvˇe z´ akladn´ı koncepce: Von Neumannova a Harvardsk´a. Von Neumannova architektura (naz´ yvan´a podle vedouc´ıho v´ yzkumn´eho t´ ymu na Princetonsk´e univerzitˇe, John von Neumanna) popisuje, jak m´a jak´ ykoliv ˇc´ıslicov´ y syst´em pracovat a z jak´ ych hlavn´ıch ˇc´ ast´ı by se mˇel skl´adat. Z´asadn´ı myˇslenka Von Neumannovy architektury je pouˇzit´ı pouze jedin´eho typu pamˇeti a to pro kontroln´ı program (instrukce) i pro data (promˇenn´e, . . .) – oboj´ı je ”jedno a tot´eˇz”! Von Neumannovu architekturu vyuˇz´ıvaj´ı dneska napˇr. poˇc´ıtaˇce typu PC. John von Neumann pˇri popisu ˇc´ıslicov´ ych syst´em˚ u definoval n´asleduj´ıc´ı postul´ aty, pravidla: • libovoln´ y program je vykon´ av´ an sekvenˇcnˇe, tj. instrukce se prov´adˇej´ı tak, jak jdou za sebou – ”aˇz na nˇe dojde ˇrada”, • zmˇenu poˇrad´ı vykon´ av´ an´ı instrukc´ı lze prov´est jen podm´ınˇen´ ym skokem, nepodm´ınˇen´ ym skokem, ˇci vol´ an´ım podprogramu, pˇr´ıp. pˇreruˇsen´ım, • vnitˇrn´ı architektura je nez´ avisl´ a na ˇreˇsen´e u ´loze. Veˇsker´e zmˇeny maj´ı b´ yt ˇreˇseny softwarovˇe, tzn. poˇc´ıtaˇc je ˇr´ızen obsahem pamˇeti (p˚ uvodn´ı pˇrednost v univerz´alnosti architektury
10
Mikroprocesorov´a technika a embedded syst´emy
je ve sv´em d˚ usledku nev´ yhodn´ a – syst´em totiˇz dok´aˇze zpracovat libovoln´ y probl´em, ale neefektivnˇe), • neexistuje princip paralelismu, • pamˇet’ je rozdˇelena na stejnˇe velk´e buˇ nky, jejichˇz poˇradov´a ˇc´ısla se vyuˇz´ıvaj´ı jako identifikaˇcn´ı adresy. Dle von Neumanna kaˇzd´ y mikropoˇc´ıtaˇc obsahuje 3 z´akladn´ı ˇc´asti: centr´aln´ı ˇr´ıdic´ı jednotku CPU, d´ale pamˇeti pro obsluˇzn´ y program, pˇr´ıp. data a vstupnˇe/v´ ystupn´ı jednotku pro komunikaci s extern´ımi zaˇr´ızen´ımi (viz obr´ azek 1.5).
vst./v´ yst. jednotka
aritmeticko logick´ a jed.
pamˇet’ data/prog. ˇr´ıizen´ı
ˇr´ıdic´ı jednotka
data
centr´ aln´ı ˇr´ıdic´ı jednotka (a)
(b)
Obr´ azek 1.5: (a) Principi´ aln´ı struktura mikropoˇc´ıtaˇce dle von Neumanna, (b) John von Neumann (* 28. prosince 1903, † 8. u ´nora 1957). CPU pˇredstavuje ˇr´ıdic´ı mozek cel´eho syst´emu (je jeho nejd˚ uleˇzitˇejˇs´ı ˇc´ast´ı) a obsahuje aritmetricko/logickou jednotku a samotnou ˇr´ıdic´ı jednotku. CPU kombinuje ˇc´ıslicov´e obvody, generuj´ıc´ı vˇsechny potˇrebn´e ˇr´ıdic´ı sign´ aly pro v´ ykon instrukc´ı s bloky pro v´ ykon volan´ ych instrukc´ı (napˇr. pro instrukci ADD R16, R18 ˇr´ıd´ı volbu operand˚ u a typ operace – v tomto pˇr´ıpadˇe sˇc´ıt´an´ı dvou registr˚ u s oznaˇcen´ım R16 a R18). Aritmeticko/logick´a jednotka (ALU – Arithmetic/Logic Unit) prov´ad´ı aritmetick´e a logick´e operace s daty, kter´a jsou reprezentov´ana jedn´ım nebo dvˇema bin´arn´ımi ˇc´ısly. Tyto operace z´ avis´ı na sloˇzitosti mikropoˇc´ıtaˇc˚ u a na jejich instrukˇcn´ı sadˇe, proto vˇsechny ALU jednotky nejsou schopny vykon´avat stejn´e operace. Mezi z´akladn´ı operace, kter´e jsou implementov´ any do kaˇzd´e ALU patˇr´ı pochopitelnˇe sˇc´ıt´an´ı, odˇc´ıt´an´ı, bitov´ y posun (shift), logick´e operace (AND, OR, . . .). Mezi rozˇsiˇruj´ıc´ı operace lze zaˇradit napˇr. n´asoben´ı, dˇelen´ı, odmocninu, v´ ypoˇcet exponenci´ aln´ı funkce, atd. Poˇcetnˇe n´aroˇcnˇejˇs´ı instrukce lze ovˇsem ”poskl´adat” ze st´ avaj´ıc´ıch instrukc´ı (napˇr.: postupn´e n´asoben´ı bit po bitu). Nˇekter´e operace, jako jsou hodnoty goniometrick´ ych funkc´ı, se prov´ad´ı pouh´ ym v´ yˇctem z tabulky (LUT – Look up Table). Kaˇzd´a ALU jednotka vrac´ı dva typy v´ ysledk˚ u: jednak aritmetickou nebo logickou hodnotu, ale tak´e identifikuje charakter t´eto hodnoty pomoc´ı tzv. pˇr´ıznakov´ ych bit˚ u (Flag bits). Tak´e tyto bity jsou odliˇsn´e pro jednotliv´ a j´ adra procesor˚ u. Mezi bˇeˇzn´e vˇsak patˇr´ı: pˇrenos (Carry), poloviˇcn´ı pˇrenos (Half carry), pˇreteˇcen´ı (Overflow), nulov´ y v´ ysledek (Zero), z´aporn´ y v´ ysledek (Negative), paritn´ı bit (Parity), aj. Detailnˇe o pˇr´ıznakov´ ym bitech je pojedn´ano v kapitole 2. Harvardsk´ a architektura chronologicky navazuje na architekturu Von Neumannovu a dopln ˇuje nˇekter´e jej´ı funkce. Z´ asadn´ı rozd´ıl je v oddˇelen´e ˇc´asti pamˇeti pro program a data – program tak nem˚ uˇze pˇrepsat s´ am sebe. Nav´ıc lze pouˇz´ıt pamˇeti odliˇsn´ ych technologi´ı (EEPROM, Flash, . . .), pˇr´ıp. nˇekolik datov´ ych sbˇernic pro souˇcasn´ y pˇrenos instrukc´ı, ˇci dat. Nev´ yhodou ovˇsem je
Fakulta elektrotechniky a komunikaˇcn´ıch technologi´ı VUT v Brnˇe
11
program. pamˇet’
datov´ a pamˇet’
program. ˇc´ıtaˇc
kontroln´ı registry
ukazatel na z´ asobn´ık
R0
instrukˇcn´ı dekod´er
R1
adresn´ı sbˇernice, 16 bit˚ u
instrukˇcn´ı registr
ˇr´ıdic´ı sign´ aly
datov´ a sbˇernice, 8 bit˚ u
nemoˇznost vyuˇzit´ı neobsazen´e ˇc´ asti datov´e pamˇeti pro uloˇzen´ı programu a naopak. Sekvenˇcn´ı vykon´av´an´ı instrukc´ı bylo Harvardskou architekturou zachov´ano, tzn. paraleln´ı zpracov´an´ı lze prov´adˇet pouze na u ´rovni operaˇcn´ıho syst´emu. Z´astupcem Harvardsk´e architektury je napˇr. mikrokontrol´er AVR, jehoˇz zjednoduˇsen´a blokov´a struktura je zobrazena na obr´azku 1.6.
R31
ALU
stavov´ y registr
Obr´ azek 1.6: Zjednoduˇsen´ a blokov´ a struktura mikrokontrol´eru AVR s Harvardskou architekturou. J´adro tohoto mikrokontrol´eru obsahuje oddˇelen´ y pamˇet’ov´ y prostor pro program a data, d´ ale aritmeticko-logickou jednotku a stavov´ y registr, soubor pracovn´ıch a kontroln´ıch registr˚ u, vˇcetnˇe ukazatele na program (programov´ y ˇc´ıtaˇc) a na z´asobn´ık. Tyto ukazatele jsou nezbytn´e pro funkci jak´ehokoliv procesoru a budou pops´ any v n´asleduj´ıc´ıch kapitol´ach. Informace jsou v mikroprocesorov´ ych syst´emech ˇs´ıˇreny prostˇrednictv´ım 3 soustav. Jedn´ a se o adresn´ı sbˇernici (Address bus), po kter´e se nejˇcastˇeji pˇren´aˇs´ı pozice v pamˇeti odkud/kam se m´a ˇc´ıst/zapisovat. Sbˇernice je tvoˇrena paraleln´ı skupinou vodiˇc˚ u, jejichˇz poˇcet koresponduje ’ s celkovou pamˇet ovou kapacitou (v pˇr´ıpadˇe multiplexov´an´ı adresy toto neplat´ı). Obsahuje-li adresn´ı sbˇernice 16 bit˚ u, je moˇzn´e takto adresovat pamˇet’ov´ y prostor s maxim´alnˇe 216 buˇ nkami. D´ale je v kaˇzd´em syst´emu obsaˇzena tzv. datov´a sbˇernice (Data bus), pˇren´aˇsej´ıc´ı instrukce nebo ˇıˇrka sbˇernice data mezi d´ılˇc´ımi bloky syst´emu (typicky mezi j´adrem procesoru a pamˇet’mi). S´ (poˇcet vodiˇc˚ u) koresponduje se ˇs´ıˇrkou ALU jednotky a s oznaˇcen´ım procesoru (8bitov´ y, 16bitov´ y, . . .). Mikrokontrol´er z obr´ azku 1.6 je tedy 8bitov´ y. Veˇsker´e ˇr´ıdic´ı povely jsou pˇren´ aˇseny prostˇrednictv´ım vodiˇc˚ u, kter´e tvoˇr´ı ˇr´ıdic´ı sbˇernici (Conˇıˇrka t´eto sbˇernice nen´ı typick´a a liˇs´ı se pro kaˇzd´ ˇ ıdic´ı sign´aly mohou trol bus). S´ y procesor. R´ b´ yt z pohledu mikroprocesoru ch´ ap´ any jako vstupn´ı, jin´e jako v´ ystupn´ı, pˇr´ıp. obousmˇern´e. Mezi z´akladn´ı ˇr´ıdic´ı sign´ aly patˇr´ı napˇr. R/W (Read/Write – ˇcten´ı/z´apis), IRQ (Interrupt Request – poˇzadavek na pˇreruˇsen´ı chodu procesoru), OE (Output Enable – povolen´ı v´ ystupu/vysl´an´ı dat), a ˇrada dalˇs´ıch. Do souˇcasnosti bylo vyvinuty dalˇs´ı architektury. Zmiˇ nme vˇsak pouze jedinou: procesory s tzv. velmi dlouh´ ym instrukˇcn´ım slovem (VLIW – Very Long Instruction Word). J´adro tˇechto procesor˚ u obsahuje nˇekolik funkˇcn´ıch jednotek se specifick´ ymi funkcemi (n´asoben´ı, bin´arn´ı operace, pˇr´ıstup do pamˇeti, . . .), kter´e mohou pracovat nez´avisle na sobˇe a kaˇzd´a je ˇr´ızena jednou
12
Mikroprocesorov´a technika a embedded syst´emy
kr´atkou instrukc´ı. Dohromady pak tyto d´ılˇc´ı instrukce tvoˇr´ı dlouh´e instrukˇcn´ı slovo (paket). Program je tak vykon´ av´ an paralelnˇe, coˇz v´ yraznˇe zvyˇsuje poˇcetn´ı v´ ykon procesoru. Z´astupcem VLIW architektury je sign´ alov´ y procesor ˇrady TMS320C6000 (firmy Texas Instruments), kter´ y obsahuje osmici funkˇcn´ıch jednotek (napˇr. TMS320C6713, TMS320C6414, . . .), pˇr´ıp. sign´alov´e procesory s nˇekolika j´ adry: TMS320C6474-1200 (3 j´adra), kter´e dosahuj´ı extr´emn´ıho poˇcetn´ıho aˇz 28 800 mili´ on˚ u instrukc´ı za sekundu (MIPS – Milion Instructions Per Second). Detailn´ı struktura a funkce tˇechto procesor˚ u bude pops´ana pozdˇeji.
1.3
Procesory CISC a RISC
Dosavadn´ı dˇelen´ı procesor˚ u bylo v´ yluˇcnˇe podle hardwaru. Existuje i jin´e dˇelen´ı procesor˚ u a to z pohledu instrukˇcn´ı sady: (a) CISC (Complex Instruction Set Computer – poˇc´ıtaˇc s komplexn´ım souborem instrukc´ı) a (b) RISC (Reduced Instruction Set Computer – poˇc´ıtaˇc s redukovan´ ym souborem instrukc´ı). V praxi neexistuj´ı ”ryz´ı” procesory CISC nebo RICS, vˇzdy se jedn´a o kompromis. CICS procesory se vyznaˇcuj´ı velk´ ym mnoˇzstv´ım instrukc´ı, kter´e s mal´ ymi obmˇenami vykon´avaj´ı ty sam´e operace (napˇr. pomoc´ı pˇr´ım´eho adresov´an´ı, indexov´eho adresov´an´ı, apod.). Kaˇzd´a instrukce vˇsak rozˇsiˇruje ˇradiˇc procesoru – procesor totiˇz mus´ı ”rozpoznat” vˇsechny instrukce z instrukˇcn´ı sady a t´ım je ne´ umˇernˇe zvyˇsov´ana hardwarov´a sloˇzitost ˇr´ıdic´ı jednotky. V tabulce 1.1 je zobrazen v´ ysledek statistick´eho pr˚ uzkumu ˇcetnosti jednotliv´ ych typ˚ u operac´ı ve zdrojov´ ych k´ odech. Tabulka 1.1: Statistick´ a ˇcetnost jednotliv´ ych typ˚ u instrukc´ı v programech. Operace
ˇ Cetnost
Naˇc´ıt´an´ı z pamˇeti.
27,3 %
Podm´ınˇen´ y skok.
13,7 %
Z´apis do pamˇeti.
9,8 % P 50,8 %
Porovn´av´an´ı hodnot.
6,2 %
Naˇcten´ı adresy.
6,1 %
Odˇc´ıt´an´ı.
4,5 %
Vloˇzen´ı znaku.
4,1 %
Sˇc´ıt´an´ı.
3,7 % P 75,4 %
Z tabulky je patrn´e, ˇze polovina bˇeˇzn´ ych zdrojov´ ych k´od˚ u obsahuje pouze tˇri opakuj´ıc´ı se operace: naˇc´ıt´ an´ı a ukl´ ad´ an´ı dat z/do pamˇeti a podm´ınˇen´e vˇetven´ı programu. Neudrˇziteln´ y n´ar˚ ust sloˇzitosti CISC procesor˚ u vedl na konci 70t´ ych let k v´ yvoji zjednoduˇsen´e struktury RISC. Statistick´ y v´ yzkum mˇel za u ´kol nal´ezt optim´aln´ı instrukˇcn´ı soubor pro tyto procesory. Kromˇe mal´eho poˇctu instrukc´ı se procesory RISC vyznaˇcuj´ı tak´e niˇzˇs´ım poˇctem zp˚ usob˚ u adresov´an´ı, d´ale pouˇz´ıvaj´ı zˇretˇezen´e zpracov´ an´ı instrukc´ı, jejich instrukce maj´ı pevnou d´elku (u AVR je to 16 bit˚ u) a pˇredevˇs´ım jednotn´ y form´ at, coˇz urychluje jejich dek´odov´an´ı. Tak´e pouˇz´ıvaj´ı vˇetˇs´ı poˇcet rovnocenn´ ych registr˚ u (u AVR je to 32 registr˚ u, oznaˇcovan´ ych R0, R1, . . ., R31) na rozd´ıl od tzv. Akumul´ atoru (pˇr´ıp. stˇradaˇce) u CISC, kter´ y musel obsahovat jeden operand k vˇetˇsinˇe instrukc´ı. V´ ysledn´ y program pro procesory RISC je zpravidla delˇs´ı z d˚ uvodu vˇetˇs´ıho poˇctu instrukc´ı s konstantn´ım poˇctem bit˚ u, ale doba vykon´an´ı programu m˚ uˇze b´ yt kratˇs´ı, protoˇze vˇetˇsina instrukc´ı se vykon´ a v jedin´em hodinov´e taktu. D˚ usledek vlastnost´ı instrukc´ı procesor˚ u RISC je zobrazen v tabulce 1.2. Pro dva rozd´ıln´e mikrokontrol´ery Intel 8085 (70. l´eta, CISC) a ATmega16 (souˇcasnost, RISC) byly naprogramov´any
Fakulta elektrotechniky a komunikaˇcn´ıch technologi´ı VUT v Brnˇe
13
Tabulka 1.2: Srovn´ an´ı testovac´ıch aplikac´ı mikrokontrol´er˚ u Intel 8085 a ATmega16. Funkce/aplikace Zpoˇzdˇen´ı (delay) – velikost Zpoˇzdˇen´ı (delay) –
rychlost1
Stopky – velikost 1 Poˇ cet
Intel 8085
ATmega16
6B
8B
10,5 ms
2 ms
60 B
opakov´ an´ı funkce: 1 000×, fCP U
92 B (jazyk ASM) 3,5 kB (jazyk C) = 2 MHz.
rutiny realizuj´ıc´ı zpoˇzdˇen´ı. Je patrn´e, ˇze tato jednoduch´a funkce zab´ır´a v´ıce m´ısta v programov´e pamˇeti modern´ıho mikrokontrol´eru, nicm´enˇe jej´ı v´ ykon je na druhou stranu rychlejˇs´ı. Pro srovn´an´ı je tak´e uvedena velikost aplikace realizuj´ıc´ı stopky. Pˇredevˇs´ım pro zdrojov´ y k´od v ja’ zyce C (bez pouˇzit´ı optimalizaˇcn´ıch n´astroj˚ u) je vˇetˇs´ı pamˇet ov´a n´aroˇcnost programu ATmega16 zˇreteln´a [Fed08]. V n´asleduj´ıc´ım textu je naznaˇcen form´at vybran´ ych instrukc´ı mikrokontrol´eru AVR; z nˇej je patrn´a jednotn´ a struktura typick´ a pro vˇsechny procesory RISC. Uk´azka form´ atu instrukce ADD Rd, Rr (operace souˇctu: Rd = Rd + Rr) • 0000 11rd dddd rrrr kde d ∈ {0; 31} – identifik´ ator registru (1. operand a n´aslednˇe i v´ ysledek) a r ∈ {0; 31} – identifik´ ator 2. operandu Uk´azka form´ atu instrukce SUB Rd, Rr (operace rozd´ılu: Rd = Rd − Rr) • 0001 10rd dddd rrrr kde d ∈ {0; 31} – identifik´ ator registru (1. operand n´aslednˇe i v´ ysledek) a r ∈ {0; 31} – identifik´ ator 2. operandu
1.4
ˇ ıdic´ı jednotka mikrokontrol´ R´ eru
ˇ ıdic´ı jednotka mikrokontrol´eru obsahuje logick´e a ˇcasovac´ı obvody, generuj´ıc´ı sign´aly potˇrebn´e R´ pro v´ ykon kaˇzd´e instrukce v programu. V´ ykon libovoln´eho programu m´a n´asleduj´ıc´ı etapy: (a) ”vyzvednut´ı” instrukce, kter´ a se m´a vykonat z programov´e pamˇeti (anglicky: Fetch), zaps´an´ım adresy na adresn´ı sbˇernici a vygenerov´an´ı ˇr´ıdic´ıho sign´alu na ˇr´ıd´ıc´ı sbˇernici pro ˇcten´ı; instrukce z odpov´ıdaj´ıc´ı adresy se pomoc´ı datov´e sbˇernice poˇsle zpˇet do ˇr´ıdic´ı jednotky (konkr´etnˇe do instrukˇcn´ıho registru, viz obr´azek 1.6), (b) kde je instrukce (v bin´arn´ım k´ odu) dek´odov´ana (anglicky: Decode) a podle typu instrukce generuje ˇr´ıd´ıc´ı jednotka pˇr´ısluˇsn´e ˇr´ıdic´ı sign´aly pro vykon´ an´ı (anglicky: Execute) dan´e instrukce (c). Funkce ˇr´ıdic´ı jednotky pro v´ ykon programu tedy jsou: vyzvednut´ı, dek´ odov´an´ı a vykon´an´ı instrukc´ı. Mezi hlavn´ı operace ˇr´ıdic´ı jednotky patˇr´ı ˇr´ızen´ı operac´ı ˇcten´ı a z´apis. Tyto procesy jsou ˇr´ızeny vˇzdy dvˇema sign´ aly. Nicm´enˇe existuj´ı dvˇe typick´e koncepce: • Intel zavedl pouˇzit´ı sign´ al˚ u s oznaˇcen´ım RD – read, W R – write (vyuˇz´ıvaj´ı tak´e mikrokontrol´ery AVR), kdy vysok´ au ´roveˇ n definuje proces, jak ukazuje obr´azek 1.7. V horn´ı ˇc´ asti obr´azku doch´ az´ı k z´ apisu dat z datov´e pamˇeti na poˇzadovanou adresu a v doln´ı ˇc´asti pak doch´ az´ı ke ˇcten´ı datov´eho slova z pamˇeti a k jeho um´ıstˇen´ı na datovou sbˇernici. • Druh´ y zp˚ usob pouˇz´ıv´ a napˇr. Freescale, nebo ˇradiˇce LCD displeje: R/W – u ´roveˇ n definuje smˇer komunikace, E – aktivn´ı hrana ˇr´ıd´ı start komunikaˇcn´ıho procesu.
14
Mikroprocesorov´a technika a embedded syst´emy
ˇ Obr´ azek 1.7: Casov´ e pr˚ ubˇehy ˇr´ızen´ı operac´ı ˇcten´ı/z´apis z/do pamˇeti [Atm16].
Dalˇs´ı vybranou uk´ azkou pouˇzit´ı ˇr´ıdic´ı sbˇernice je pˇr´ıklad adresov´an´ı vstupnˇe/v´ ystupn´ı (I/O) jednotky. Mnoho mikrokontrol´er˚ u komunikuje jak s pamˇet´ı, tak i s I/O obvody shodn´ ym zp˚ usobem – tzv. pamˇet’ov´ ym mapov´ an´ım I/O, kdy jsou pouˇzity shodn´e sign´aly pro smˇer pˇrenosu (RD, W R). Tento zp˚ usob d´ ale obsahuje spoleˇcn´ y pamˇet’ov´ y prostor (moˇzn´e adresy jsou rozdˇeleny ’ mezi pamˇet ovou ˇc´ ast a vstupnˇe/v´ ystupn´ı obvody) a mohou tak b´ yt pouˇzity shodn´e instrukce pro komunikaci s pamˇet´ı. Druh´ ym zp˚ usobem je pouˇzit´ı samostatn´e I/O jednotky; z ˇcehoˇz vypl´ yv´ a nutnost rozˇs´ıˇren´ı ˇr´ıdic´ıch sign´ al˚ u na tˇri: RD, W R a IO/M . Pˇr´ıklad tohoto zp˚ usobu adresov´an´ı je uk´az´an v tabulce 1.3 a na obr´ azku 1.8. Byl zde pouˇzit princip ˇcten´ı a z´apisu z mikrokontrol´eru Intel 8085, jehoˇz pamˇet’ov´ y prostor je 16bitov´ y a I/O prostor 8bitov´ y. ˇ ızen´ı oddˇelen´eho adresov´an´ı pamˇeti a I/O jednotky u mikrokontrol´eru Intel Tabulka 1.3: R´ 8085. Operace ˇ Cten´ ı z pamˇeti.
RD
WR
IO/M
Adresa
0
1
0
A0–A15
Z´apis do pamˇeti. ˇ Cten´ ı z I/O obvodu.
1
0
0
A0–A15
0
1
1
A0–A7
Z´apis do I/O obvodu.
1
0
1
A0–A7
CPU
vst./výst. jednotka
datov´ a sbˇernice
pamˇet’ data/prog. adresn´ı sbˇernice
RD WR IO/M
Obr´ azek 1.8: Oddˇelen´e adresov´ an´ı pamˇeti a I/O jednotky u mikrokontrol´eru Intel 8085.
Fakulta elektrotechniky a komunikaˇcn´ıch technologi´ı VUT v Brnˇe
2
15
Instrukˇ cn´ı soubor mikrokontrol´ er˚ u
ˇ ıdic´ı program mikrokontrol´er˚ R´ u je od Von Neumannovy architektury tvoˇren posloupnost´ı instrukc´ı v podobˇe strojov´eho jazyka. Tato posloupnost je uloˇzena v programov´e pamˇeti v bin´ arn´ı podobˇe. Pˇrestoˇze ˇr´ıdic´ı jednotka MCU je schopna rozezn´avat software v´ yhradnˇe v t´eto formˇe, v´ yvoj aplikac´ı pˇr´ımo ve strojov´em jazyce se neprov´ad´ı. Takto sestaven´ y k´od je totiˇz znaˇcnˇe nepˇrehledn´ y a velmi n´ aroˇcn´ y na schopnosti program´atora. Existuj´ı dva z´akladn´ı zp˚ usoby v´ yvoje aplikac´ı pro MCU: prostˇrednictv´ım tzv. jazyka symbolick´ ych adres (JSA, assembly language) a s pomoc´ı vyˇsˇs´ıch programovac´ıch jazyk˚ u, pˇredevˇs´ım jazyka C. V t´eto kapitole je pozornost vˇenov´ana prvn´ımu zp˚ usobu. Jazyk symbolick´ ych adres vyuˇz´ıv´a jednotliv´e instrukce z instrukˇcn´ı sady pˇr´ısluˇsn´eho MCU. Takto sestaven´ y k´ od (textov´ y soubor, nejˇcastˇeji s koncovkou *.asm) je n´aslednˇe pˇreloˇzen pomoc´ı zn´am´ ych a nemˇenn´ ych pravidel do strojov´eho jazyka (viz obr´azek 2.1). Pˇreklad je tedy jednoznaˇcn´ y a prov´ ad´ı ho proces, kter´ y se naz´ yv´a assembler a je souˇc´ast´ı v´ yvojov´ ych n´astroj˚ u. Kaˇzd´ y typ mikrokontrol´eru pˇritom obsahuje odliˇsnou instrukˇcn´ı sadu, kter´a se liˇs´ı nejen poˇctem instrukc´ı, ale pˇredevˇs´ım pouˇzitou syntax´ı. zdrojov´ y k´ od (.asm)
pˇreklad (asembler)
strojov´ y k´ od (.hex)
Obr´ azek 2.1: Pˇreklad zdrojov´eho k´ odu z jazyka symbolick´ ych adres do strojov´eho k´odu. Pˇrekladaˇc pro mikrokontrol´ery AVR (AVR assembler) umoˇzn ˇuje program´ator˚ um zad´ avat ˇc´ıseln´e hodnot ve tˇrech soustav´ ach: des´ıtkov´a soustava, hexadecim´aln´ı a bin´arn´ı. Zvolen´a soustava se pak identifikuje prostˇrednictv´ım prefixu 0x, pˇr´ıp. $ pro hexadecim´aln´ı a 0b pro bin´ arn´ı soustavu. Zadan´e hodnoty jsou ch´ ap´any od nejm´enˇe v´ yznamn´ ych bit˚ u. Tj. z´apis 0b1100 reprezentuje 8mi bitovou hodnotu 0b0000 1100 a hodnota 0xA reprezentuje z´apis 0x0A. AVR assembler rovnˇeˇz dovoluje pouˇzit´ı nˇekter´ ych funkc´ı; viz k´od 2.1. Zdrojov´ y k´ od 2.1: Funkce podporovan´e asemblerem AVR. LOW ( HIGH( LWRD( HWRD(
1 2 3 4
16 bit_hodnota 16 bit_hodnota 32 bit_hodnota 32 bit_hodnota
) ) ) )
; ; ; ;
v r a c´ı v r a c´ı v r a c´ı v r a c´ı
n i ˇz ˇs´ı v yˇs ˇs´ı n i ˇz ˇs´ı v yˇs ˇs´ı
byte z 16 b i t o v ´e hodnoty byte z 16 b i t o v ´e hodnoty s l o v o z 32 b i t o v ´e hodnoty s l o v o z 32 b i t o v ´e hodnoty
Pˇri programov´ an´ı je vhodn´e vytv´ aˇret zdrojov´ y k´od, kter´ y bude srozumiteln´ y nejen pro autora k´odu, ale i pro vˇsechny ostatn´ı program´atory. Proto je nutn´e dodrˇzovat nˇekter´a zaˇzit´a pravidla, mezi kter´a patˇr´ı tak´e grafick´ a str´ anka zdrojov´eho k´odu. Pro pˇrehlednost vˇetven´ı programu je nutn´e vˇsechny instrukce odsadit od lev´eho okraje. Naopak n´avˇeˇst´ı, kter´a reprezentuj´ı m´ısta v pamˇeti vˇetven´eho k´ odu ponech´ av´ ame bez odsazen´ı. Na jeden ˇr´adek se p´ıˇse jen jedna instrukce a je vhodn´e pouˇz´ıvat koment´ aˇre. Nav´ıc, v´ yvoj kaˇzd´e aplikace by mˇel zapoˇc´ıt pˇrehlednou grafickou reprezentac´ı jej´ı funkce. K tomu u ´ˇcelu se vyuˇz´ıvaj´ı v´ yvojov´e diagramy (flowcharts) s ust´alen´ ymi tvary objekt˚ u pro dan´e operace. Uk´ azka pouˇz´ıvan´ ych tvar˚ u je zobrazena na obr´azku 2.2.
2.1
Form´ aty instrukc´ı
V mikroprocesorov´e technice obsahuj´ı instrukce dvoj´ı informaci: (1) jak´a operace m´a b´ yt vykon´ana (tzv. operaˇcn´ı k´ od – op code) a (2) adresu operand˚ u, se kter´ ymi se m´a pracovat. Z´akladn´ı form´aty instrukc´ı jsou 1, 2 a 3bytov´e. Odliˇsnou strukturu maj´ı instrukce RISC procesor˚ u. Vˇsechny tyto form´ aty jsou pops´ any v n´asleduj´ıc´ım textu.
16
Mikroprocesorov´a technika a embedded syst´emy
zaˇca ´tek / konec (pod)programu
zpracov´ an´ı dat
vol´ an´ı podprogramu
vstup / v´ ystup dat
smˇer v´ ykonu (pod)programu
podm´ınka + −
Obr´ azek 2.2: Symboly pouˇz´ıvan´e pro grafick´e ztv´arnˇen´ı funkce aplikace nebo jej´ı ˇc´asti prostˇrednictv´ım v´ yvojov´ ych diagram˚ u.
1bytov´ e, 2bytov´ e instrukce Jednobytov´e instrukce informuj´ı pouze o op k´odu (tj. o typu operace) a nepouˇz´ıvaj´ı ˇz´adn´e operandy vyjma registr˚ u. Pomoc´ı tˇechto instrukc´ı tedy nen´ı moˇzn´e pˇristupovat k pozic´ım v pamˇeti. Dvoubytov´e instrukce obsahuj´ı 8bitov´ y op k´od a 8bitovou adresu operandu, nebo pˇr´ımo zadanou hodnotu dat. Poˇrad´ı uloˇzen´ı tˇechto dvou byt˚ u v pamˇeti je vˇzdy: (1) op k´od a (2) adresa operand˚ u. Pˇr´ıkladem 1 a 2bytov´ ych instrukc´ı jsou tˇreba instrukce mikrokontrol´eru Intel 8051: ADD A, Rr (souˇcet obsahu akumul´ atoru, coˇz je speci´aln´ı pracovn´ı registr s oznaˇcen´ım A, s obsahem 8bitov´eho registru Rr, kde r=0, 1, . . ., 7); strojov´ y k´od: 0010 1rrr, ˇci instrukce pro kop´ırov´an´ı dat MOV A, direct (pˇresun obsah pamˇeti z adresy direct do akumul´atoru); strojov´ y k´od: 1110 0101 8bitov´ a adresa. V uk´azce 2.2 jsou uvedeni tito z´ astupci 1 a 2bytov´ ych instrukc´ı mikrokontrol´eru Intel 8051, spoleˇcnˇe s konkr´etn´ım u ´sekem k´ odu, kter´ y je uloˇzen v programov´e pamˇeti. Zdrojov´ y k´ od 2.2: Uk´ azka pˇrekladu 1 a 2bytov´ ych instrukc´ı mikrokontrol´eru Intel 8085. 1 2
MOV ADD
A , 3B A , R2
; ; ; ; ;
3 4 5
A = 0x3B A = A + R2 E5 (MOV) 3B (MOV) 2A (ADD)
3bytov´ e instrukce Tˇr´ıbytov´e instrukce obsahuj´ı 8bitov´ y op k´od a 16bitovou adresu operandu, pˇriˇcemˇz poˇrad´ı ukl´adan´ ych byt˚ u je vˇzdy n´ asleduj´ıc´ı: (1) op k´od, (2) niˇzˇs´ı byte adresy a (3) vyˇsˇs´ı byte adresy. Pˇr´ıkladem takov´eto instrukce je napˇr. JMP adresa mikrokontrol´eru Intel 8085, kter´a realizuje nepodm´ınˇen´ y skok na zadanou adresu. Strojov´ y k´od instrukce je 1100 0011 16bitov´ a adresa. Uk´azka zdrojov´eho k´ odu s pˇrekladem 2.3 obsahuje pˇreloˇzenou instrukci JMP se skokem na adresu 0x201F. Zdrojov´ y k´ od 2.3: Uk´ azka pˇrekladu 3bytov´e instrukce mikrokontrol´eru Intel 8085. 1 2 3 4
JMP
201 F
; ; ; ;
skok C3 1F 20
na a d r e s u 0 x201F (JMP) ( n i ˇz ˇs´ı byte a d r e s y ) ( v yˇs ˇs´ı byte a d r e s y )
Fakulta elektrotechniky a komunikaˇcn´ıch technologi´ı VUT v Brnˇe
17
Instrukce RISC procesor˚ u Mikroprocesory s architekturou typu RISC (redukovan´a instrukˇcn´ı sada) se vyznaˇcuj´ı konstantn´ı d´elkou vˇsech instrukc´ı a specifick´ ym form´atem uspoˇr´ad´an´ı operaˇcn´ıho k´odu a operand˚ u. To umoˇzn ˇuje rychlejˇs´ı dek´ odov´ an´ı instrukc´ı a t´ım i zv´ yˇsen´ı poˇcetn´ıho v´ ykonu programu. Pˇr´ıklady instrukc´ı RISC mikrokontrol´eru (AVR), doplnˇen´e strojov´ ymi k´ody, ze kter´ ych vypl´ yv´a snadnost dek´odov´an´ı, jsou zn´ azornˇeny v tabulce 2.1. Tabulka 2.1: Pˇr´ıklady instrukc´ı 8bitov´eho mikrokontrol´eru typu RISC (AVR). Instrukce
Strojov´ y k´ od
Popis instrukce
ADD Rd, Rr
0000 11rd dddd rrrr
Souˇcet hodnot registr˚ u Rd a Rr; v´ ysledek do Rd.
INC Rd
1001 010d dddd 0011
Inkrementace obsahu registru Rd, kde d=0, 1, . . ., 31.
LDI Rd, K
1110 KKKK dddd KKKK
Naplnˇen´ı registru Rd 8bitovou konstantou K, kde d=16, 17, . . ., 31 a K=0, 1, . . ., 255.
RET
1001 0101 0000 1000
N´avrat z podprogramu.
Jak je zˇrejm´e, strojov´ y k´ od instrukce pro inkrementaci obsahuje adresu jednoho operandu (registru Rd). Index pracovn´ıho registru, jehoˇz obsah se m´a zv´ yˇsit o jedniˇcku je v bin´arn´ı podobˇe zaps´an pˇr´ımo v tˇele instrukce – pˇet bit˚ u oznaˇcen´ ych p´ısmenem d. Podobn´ ym zp˚ usobem je do instrukce ADD vˇclenˇena informace o indexu destinaˇcn´ıho (Rd) a zdrojov´eho registru (Rr). V tomto pˇr´ıpadˇe je 5bitov´ a identifikaˇcn´ı hodnota registru Rr rozdˇelena na dvˇe ˇc´asti: niˇzˇs´ı ˇctveˇrice bit˚ u je uloˇzena na pozic´ıch 3 aˇz 0, nejvyˇsˇs´ı bit pak na pozici 9. Pozor, nezamˇen ˇovat indexy pracovn´ıch registr˚ u s hodnotami, kter´e registry obsahuj´ı!
2.2
Program´ atorsk´ y model
Definice 1 (Program´ atorsk´ y model) Program´ atorsk´y model mikrokontrol´eru (nebo tak´e softwarov´y pohled na MCU) obsahuje popis pamˇet’ov´eho prostoru MCU, soubor registr˚ u, jejich n´ azvy, adresy a funkce, kter´e m˚ uˇze program´ ator vyuˇz´ıvat. D´ ale zahrnuje veˇsker´e prostˇredky, kter´e program´ ator m˚ uˇze k v´yvoji aplikac´ı pouˇz´ıt (instrukce, direktivy). 2.2.1
Pamˇ et’ov´ y prostor AVR
Pamˇet’ov´ y prostor mikrokontrol´er˚ u AVR obsahuje oddˇelenou pamˇet’ pro program a data (Harvardsk´ a architektura), d´ ale umoˇzn ˇuje mapovat jak vnitˇrn´ı, tak i vnˇejˇs´ı adresn´ı prostor. Pˇrehledn´e zn´ azornˇen´ı vˇsech typ˚ u pamˇet´ı, kter´e obsahuje mikrokontrol´er ATmega16 je uveden na obr´azku 2.3. Pro uloˇzen´ı programu je pouˇzita pamˇet’ typu Flash se ˇs´ıˇrkou buˇ nky 16 bit˚ u. Na kaˇzdou adresovatelnou pozici je tak moˇzn´e uloˇzit strojov´ y k´od pr´avˇe jedn´e instrukce. Kapacita t´eto pamˇeti je pro mikrokontrol´er ATmega16 8k×16, tj. obsahuje 8k = 8 192 adresovateln´ ych pozic. Datov´a pamˇet’ je tvoˇrena technologi´ı SRAM s kapacitou 1k×8. (1 024 adresovateln´ ych pozic se ˇs´ıˇrkou 8 bit˚ u.) Tato oblast obsahuje tˇricet dva 8bitov´ ych registr˚ u pro obecn´e pouˇzit´ı (anglicky: General Purpose Registers; oznaˇcovan´e R0 aˇz R31; adresy 0x0000 aˇz 0x0020), n´aslednˇe ˇsedes´ at ˇctyˇri kontroln´ıch registr˚ u. Tyto registry slouˇz´ı k ˇr´ızen´ı jednotliv´ ych perif´eri´ı i samotn´eho j´ adra mikrokontrol´eru. Pˇredstavuj´ı nejd˚ uleˇzitˇejˇs´ı registry pro program´atora a pro mikrokontrol´er ATmega16 jsou namapov´ any na adres´ ach 0x0020 aˇz 0x005F. Nˇekter´e kontroln´ı registry ATmega16 jsou uvedeny v tabulce 2.2. K tˇemto registr˚ um se nejˇcastˇeji pˇristupuje pomoc´ı instrukc´ı IN a OUT (viz zdrojov´ y k´ od 4.1). Za kontroln´ımi registry je pamˇet’ov´ y prostor pro libovoln´e pouˇzit´ı.
18
Mikroprocesorov´a technika a embedded syst´emy
Programov´ a pamˇet’ Flash 15
Datov´ a pamˇet’ SRAM
0
Aplikaˇ cn´ı ˇ ca ´st
7 0x0000
Datov´ a pamˇet’ EEPROM
0
7
0
pracovn´ı registry
0x0000 0x001F
0x000
kontroln´ı registry
0x0020 0x005F
0x1FF 512×8
0x0060 Bootovac´ı ˇ c´ ast 0x1FFF 8k×16
z´ asobn´ık
0x045F
1k×8
Obr´ azek 2.3: Pamˇet’ov´ y prostor mikrokontrol´eru ATmega16.
V aplikac´ıch s podprogramy, ˇci pˇreruˇsen´ımi b´ yv´a ˇc´ast vyˇclenˇena pro tzv. z´asobn´ık, kter´ y slouˇz´ı k doˇcasn´emu uloˇzen´ı n´ avratov´ ych adres. Tabulka 2.2: Vybran´e kontroln´ı registry mikrokontrol´er˚ u AVR. Adresa
Registr
Funkce registru
... 0x39
PINA
Vstupn´ı registr portu A.
0x3A
DDRA
Smˇerov´ y registr portu A.
0x3B
PORTA
Datov´ y registr portu A.
TCNT0
Obsah 8bitov´eho ˇc´ıtaˇce/ˇcasovaˇce 0.
... 0x52 ... 0x5B
GICR
ˇ ıdic´ı registr pˇreruˇsen´ı. R´
0x5C
OCR0
Komparaˇcn´ı registr ˇc´ıtaˇce/ˇcasovaˇce 0.
0x5D
SPL
Ukazatel na z´ asobn´ık (niˇzˇs´ı byte).
0x5E
SPH
Ukazatel na z´ asobn´ık (vyˇsˇs´ı byte).
0x5F
SREG
Stavov´ y registr.
Posledn´ım adresovateln´ ym prostorem je pamˇet’ typu EEPROM s kapacitou 512×8. EEPROM je charakteristick´ a delˇs´ı dobou pˇr´ıstupu neˇz SRAM, ale nemaˇze sv˚ uj obsah po odpojen´ı nap´ajen´ı. Vyuˇzit´ım tak ˇcasto b´ yv´ a z´ aloha nastaven´ı pˇr´ıstroje, tabulky hodnot, apod. 2.2.2
Pˇ r´ıznakov´ e bity
Pˇr´ıznakov´e bity (anglicky: Flags) informuj´ı o typick´ ych v´ ysledc´ıch posledn´ı aritmetick´e, logick´e, pˇr´ıp. bitov´e operace. Jsou nastavov´any/nulov´any aritmeticko-logickou jednotkou (ALU), nebo prostˇrednictv´ım datov´e sbˇernice a lze je s u ´spˇechem vyuˇz´ıt napˇr. k ˇr´ızen´ı bˇehu programu (nejˇcastˇeji k jeho vˇetven´ı). Pˇr´ıznakov´e bity jsou uloˇzeny ve stavov´em registru, jehoˇz struktura (i n´azev) se liˇs´ı podle v´ yrobce MCU. Mikrokontrol´ery typu AVR obsahuj´ı SREG – Status Register (viz obr´ azek 2.4); klony Intel 8051 zase PSW – Program Status Word; firma Freescale pouˇz´ıv´a oznaˇcen´ı CCR – Code Condition Register, atd. Stavov´ y registr mikrokontrol´er˚ u AVR obsahuje n´asleduj´ıc´ı pˇr´ıznakov´e bity: pˇrenos, nula, z´aporn´e ˇc´ıslo, pˇreteˇcen´ı, znam´enkov´ y bit, poloviˇcn´ı pˇrenos, u ´loˇzn´ y bit a glob´aln´ı povolen´ı vˇsech
5
4
3
2
1
0
I
T
H
S
V
N
Z
C
datov´ a pamˇet’
program. ˇc´ıtaˇc
kontroln´ı registry
ukazatel na z´ asobn´ık
R0
instrukˇcn´ı registr instrukˇcn´ı dekod´er
R1
adresn´ı sbˇernice, 16 bit˚ u
6
19
program. pamˇet’
ˇr´ıdic´ı sign´ aly
7
datov´ a sbˇernice, 8 bit˚ u
Fakulta elektrotechniky a komunikaˇcn´ıch technologi´ı VUT v Brnˇe
R31
ALU
stavov´ y registr
SREG (b)
(a)
Obr´ azek 2.4: (a) Struktura a (b) pozice stavov´eho registru AVR.
pˇreruˇsen´ı. C (Carry Flag) Pˇr´ıznak pˇrenosu po posledn´ı aritmetick´e operaci nebo po bitov´em posuvu. Zdrojov´ y k´ od 2.4: Pˇr´ıznakov´e bity AVR – pˇrenos. 1 2 3
LDI LDI ADD
R16 , 225 R17 , 50 R16 , R17
; R16 = 225 ; R17 = 50 ; R16 = 225 + 50 = 1 9 , C = 1
Z (Zero Flag) Pˇr´ıznak nulov´eho v´ ysledku aritmetick´e nebo logick´e operace, pˇr´ıp. bitov´eho posuvu. Zdrojov´ y k´ od 2.5: Pˇr´ıznakov´e bity AVR – nula. 1 2
LDI R16 , 225 SUBI R16 , 225
; R16 = 225 ; R16 = R16 − 225 = 0 , Z = 1
Pozn.: Nulov´ y pˇr´ıznakov´ y bit je roven 1, pokud je v´ ysledek ROVEN nule, v opaˇcn´em pˇr´ıpadˇe je roven 0. Nejˇcastˇeji je pouˇz´ıv´ an pro realizaci cykl˚ u s koneˇcn´ ym poˇctem opakov´an´ı. N (Negative Flag) Pˇr´ıznak z´aporn´eho v´ ysledku se nastav´ı, pokud je nejv´ yznamnˇejˇs´ı bit (MSB) poˇcetn´ı operace roven 1.
20
Mikroprocesorov´a technika a embedded syst´emy
Zdrojov´ y k´ od 2.6: Pˇr´ıznakov´e bity AVR – z´aporn´a hodnota. 1 2
LDI LSL
R16 , 0 b01100000 R16
3
; R16 = 192 ( dek ) ; bitovy ´ posun d o l e v a ( l o g i c a l s h i f t ; R16 = 0 b1100 0 0 0 0 , N = 1
left )
V (Overflow Flag) Pˇr´ıznak pˇreteˇcen´ı (chybn´ y v´ ysledek) pˇri poˇc´ıt´an´ı se znam´enkov´ ymi ˇc´ısly (viz dvojkov´ y doplnˇek). Vyjadˇruj´ı-li hodnoty neznam´enkov´ a ˇc´ısla, tento bit nem´a smysl vyuˇz´ıvat. Zdrojov´ y k´ od 2.7: Pˇr´ıznakov´e bity AVR – pˇreteˇcen´ı. 1 2 3
LDI LDI ADD
R16 , 0 b11000000 R17 , 0 b10000000 R16 , R17
4
; ; ; ;
R16 R17 R16 V =
= −64 ( dek ) = −128 ( dek ) = 0 b0100 0000 = 64 1
S (Sign Flag) Pˇr´ıznak informuje, zda je v´ ysledek znam´enkov´e ˇc´ıslo. Dopoˇc´ıt´av´a se z hodnot pˇr´ıznak˚ u z´aporn´eho ˇc´ısla a pˇreteˇcen´ı: N ⊕ V, kde ⊕ pˇredstavuje exkluzivn´ı souˇcet. H (Half Carry Flag) Pˇr´ıznak tzv. pomocn´eho nebo poloviˇcn´ıho pˇrenosu z niˇzˇs´ıho niblu do vyˇsˇs´ıho (vyuˇz´ıv´a se pro BCD aritmetiku). Zdrojov´ y k´ od 2.8: Pˇr´ıznakov´e bity AVR – poloviˇcn´ı pˇrenos. 1 2
LDI LSL
R16 , 0 b00001000 R16
3
; R16 = 8 ( dek ) ; bitovy ´ posun d o l e v a ; R16 = 0 b0001 0 0 0 0 , H = 1
T (Transfer Bit) ´ zn´ Uloˇ y bit, vyuˇz´ıv´ an instrukcemi BST Rd, b a BLD Rd, b pro pˇresun jednoho bitu z/do registru Rd (d=0, 1, . . ., 31; b=0, 1, . . ., 7). Zdrojov´ y k´ od 2.9: Pˇr´ıznakov´e bity AVR – u ´loˇzn´ y bit. 1
LDI
R16 , 0 b01100100
BST
R16 , 2
BLD
R16 , 7
2 3 4 5 6
; ; ; ; ; ;
R16 = 100 ( dek ) B i t S t o r e from B i t . . . pˇr e s u n b i t u ˇc . 2 do T v r e g i s t r u SREG B i t Load from T Flag . . . pˇr e s u n T b i t u na p o z i c i 7 v r e g i s t r u R16 R16 = 0 b1110 0100
Fakulta elektrotechniky a komunikaˇcn´ıch technologi´ı VUT v Brnˇe
21
I (Global Interrupt Enable) Glob´aln´ı povolen´ı vˇsech pˇreruˇsen´ı. Tento bit mus´ı b´ yt nastaven u aplikac´ı vyuˇz´ıvaj´ıc´ı libovoln´e pˇreruˇsen´ı. Zdrojov´ y k´ od 2.10: Pˇr´ıznakov´e bity AVR – pˇreruˇsen´ı. 1 2
SEI CLI
2.2.3
; p o v o l e n´ı vˇs e c h pˇr e r uˇs e n´ı , I = 1 ; zaka ´ z a n´ı vˇs e c h pˇr e r uˇs e n´ı , I = 0
Direktivy pˇ rekladaˇ ce
Direktivy pˇrekladaˇce nejsou pˇrekl´ ad´ any do strojov´eho k´odu, pouze informuj´ı pˇrekladaˇc JSA jak vytvoˇrit v´ ysledn´ y strojov´ y k´ od. Mezi nejpouˇz´ıvanˇejˇs´ı direktivy patˇr´ı: urˇcen´ı typu pamˇeti pro uloˇzen´ı k´odu (.cseg, .dseg, .eseg), d´ale definov´an´ı maker (.macro, .endmacro), specifikov´ an´ı konkr´etn´ı adresy, od kter´e m´ a b´ yt k´ od uloˇzen (.org) ˇci vkl´adan´ı textov´ ych soubor˚ u do zdrojov´eho k´odu (.include). Pro pˇrehlednˇejˇs´ı a efektivnˇejˇs´ı programov´an´ı lze vyuˇz´ıt direktivy .def real = R16 pro pˇrejmenov´ an´ı registru, nebo definovat hodnotu konstanty .equ value = 32. V tomto pˇr´ıpadˇe pˇrekladaˇc nahrad´ı pˇred samotn´ ym pˇrevodem instrukc´ı do strojov´eho jazyka veˇsker´e ˇretˇezce real n´ azvem registru R16 a hodnoty value ˇc´ıslem 32. N´avˇeˇst´ı lze snadno identifikovat teˇckou pˇred samotn´ ym pˇr´ıkazem. Kompletn´ı seznam direktiv pˇrekladaˇce pro mikrokontrol´ery AVR je uveden v tabulce 2.3. Uk´azky pouˇzit´ı jsou pak patrn´e ze zdrojov´ ych k´ od˚ u v pˇr´ıloze A. Tabulka 2.3: Direktivy pˇrekladaˇce mikrokontrol´er˚ u AVR. Direktiva
V´ yznam
Direktiva
V´ yznam
.byte
Alokace byt˚ u v SRAM.
.eseg
EEPROM segment.
.cseg
Flash segment.
.exit
Opuˇstˇen´ı zdrojov´eho souboru.
.db
Alokace 8bitov´e hodnoty.
.include
Vloˇzen´ı zdrojov´eho souboru.
.def
Pˇrejmenov´ an´ı registru.
.list
Zapnut´ı generov´an´ı listfile.
.device
Definov´ an´ı typu MCU.
.listmac
Zapnut´ı generov´an´ı info o makru.
.dseg
Segment SRAM.
.macro
Zaˇc´atek definice makra.
.dw
Alokace 16bitov´e hodnoty.
.nolist
Vypnut´ı generov´an´ı do listfile.
.endmacro
Konec definice makra.
.org
Oznaˇcen´ı konkr´etn´ı adresy.
.equ
Definice v´ yrazu/konstanty.
.set
Definice v´ yrazu.
V n´asleduj´ıc´ım textu je pˇredstaveno vyuˇzit´ı direktiv pro implementaci maker. Makra se pouˇz´ıvaj´ı pro ˇcasto se opakuj´ıc´ı u ´seky programu. Pokud pˇrekladaˇc JSA naraz´ı v programu na n´azev makra, vloˇz´ı m´ısto nˇej k´ od definovan´ y mezi direktivou .macro a .endmacro. Jak bude pops´ano pozdˇeji, rozd´ıl mezi makrem a podprogramem je v tom, ˇze makro se vloˇz´ı pˇr´ımo do k´odu a jeho k´ od se pˇrekl´ ad´ a a vkl´ ad´ a pˇri kaˇzd´em uˇzit´ı makra; podprogram se pˇreloˇz´ı jen jednou a sk´aˇce se na nˇej. Kaˇzd´e makro m˚ uˇze m´ıt aˇz 10 vstupn´ıch parametr˚ u, pˇriˇcemˇz v samotn´em tˇele makra jsou tyto hodnoty symbolicky oznaˇcov´ any @0 (prvn´ı operand) aˇz @9 (des´at´ y operand). Necht’ je makro pro v´ ypoˇcet souˇctu komplexn´ıch ˇc´ısel definov´ano zp˚ usobem dle v´ ypisu 2.11. Pˇri vol´ an´ı makra KOMPLEXSUM R16, R17, R18, R19 se pˇredpokl´ad´a, ˇze prvn´ı dvojice registr˚ u obsahuje re´ alnou (R16) a imagin´arn´ı (R17) ˇc´ast prvn´ıho komplexn´ıho ˇc´ısla. Registry R18
22
Mikroprocesorov´a technika a embedded syst´emy
Zdrojov´ y k´ od 2.11: V´ ypoˇcet souˇctu komplexn´ıch ˇc´ısel – makro. 1 2 3 4 5
.include <m16def.inc> .macro KOMPLEXSUM ADD @0 , @2 ADD @1 , @3 .endmacro
; ; ; ; ;
d e f i n i ˇc n´ı s o u b o r m i k r o k o n t r o l´e r u ATmega16 z aˇc a ´ t e k makra s n´ a zvem KOMPLEXSUM s o uˇc e t 1 . a 3 . operandu , t j . r e a ´lny ´ c h ˇc a ´ s t´ı s o uˇc e t 2 . a 4 . operandu , t j . i m a g i n a ´ r n´ıc h ˇc ´ a s t´ı konec makra
6 7 8 9 10
reset : ; h l a v n´ı f u n k c e programu ... KOMPLEXSUM R16 , R17 , R18 , R19 ; pˇr e k l a d aˇc v l o ˇz´ı t ˇe l o makra ...
a R19 pak obsahuj´ı re´ alnou a imagin´ arn´ı ˇc´ast druh´eho komplexn´ıho ˇc´ısla. Pˇri pˇredzpracov´an´ı zdrojov´eho k´ odu bude makro nahrazeno n´asleduj´ıc´ı posloupnost´ı instrukc´ı a pˇreloˇzeno do strojov´eho k´odu mikrokontrol´eru. Zdrojov´ y k´ od 2.12: V´ ypoˇcet souˇctu komplexn´ıch ˇc´ısel – pˇreloˇzen´e makro. 1 2
ADD ADD
R16 , R18 R17 , R19
V´ ysledek souˇctu komplexn´ıch ˇc´ısel je tak uloˇzen v registru R16 (re´aln´a ˇc´ast) a v registru R17 (imagin´arn´ı ˇc´ ast). 2.2.4
Typy instrukc´ı
Obecnˇe lze instrukce libovoln´eho mikrokontrol´eru ˇci ˇc´ıslicov´eho syst´emu rozdˇelit dle jejich typu na: • aritmetick´e operace (souˇcet, rozd´ıl, inkrementace, . . .), • logick´e operace (AND, XOR, . . .), • skokov´e operace (nepodm´ınˇen´e, podm´ınˇen´e vˇetven´ı programu), • pˇresun dat (pˇresun mezi registry, ˇcten´ı z pamˇeti, . . .), • bitov´e operace (nastaven´ı/nulov´ an´ı jednotliv´ ych bit˚ u, z´amˇena nibl˚ u, . . .), • ˇr´ıdic´ı instrukce (ˇz´ adn´ a operace NOP, reˇzimy sn´ıˇzen´e spotˇreby, watchdog reset, . . .). Pro AVR (ATmega16) existuje 131 instrukc´ı, ale nˇekter´e se liˇs´ı jen nepatrnˇe. Niˇzˇs´ı ˇrady mikrokontrol´er˚ u AVR nemus´ı obsahovat vˇsechny instrukce. D˚ uleˇzit´a vlastnost kaˇzd´e instrukce je zda mˇen´ı ˇci nemˇen´ı pˇr´ıznakov´e bity a vlastn´ı doba v´ ykonu instrukce. Tyto informace lze vyˇc´ıst z manu´alu instrukˇcn´ı sady [Atm02]. Uk´azka aritmeticko/logick´ ych instrukc´ı mikrokontrol´er˚ u AVR, vˇcetnˇe ovlinˇ novan´ ych pˇr´ıznakov´ ych bit˚ u a poˇct˚ u instrukˇcn´ıch cykl˚ u je zn´azornˇena v tabulce 2.4. Prvnˇe uveden´ y operand za instrukc´ı souˇcasnˇe ud´av´a do jak´eho registru bude v´ ysledek operace uloˇzen. V literatuˇre se setk´ av´ ame tak´e s pojmem pseudoinstrukce. Popis tˇechto instrukc´ı sice nalezneme v manu´ alech instrukˇcn´ıch sad, ale o samostatn´e instrukce se nejedn´a – nemaj´ı vlastn´ı (jedineˇcn´ y) operaˇcn´ı k´ od, podle kter´eho by je instrukˇcn´ı dekod´er ˇr´ıdic´ı jednotky identifikoval. Pseudoinstrukce pˇredstavuj´ı vhodn´e oznaˇcen´ı jedn´e nebo i v´ıce jiˇz existuj´ıc´ıch instrukc´ı. D˚ uvodem zaveden´ı t´eto kategorie instrukc´ı je v´ ystiˇznˇejˇs´ı pojmenov´an´ı operace, kter´e pˇredstavuj´ı,
Fakulta elektrotechniky a komunikaˇcn´ıch technologi´ı VUT v Brnˇe
23
Tabulka 2.4: Vybran´e aritmetick´e a logick´e instrukce AVR. Instrukce
Popis
Funkce
Pˇ r´ıznaky
Cykly
ADD
Rd, Rr
Souˇcet bez pˇrenosu.
Rd=Rd+Rr
Z,C,N,V,H
1
ADC
Rd, Rr
Souˇcet s pˇrenosem.
Rd=Rd+Rr+C
Z,C,N,V,H
1
SUB
Rd, Rr
Rozd´ıl dvou registr˚ u.
Rd=Rd-Rr
Z,C,N,V,H
1
AND
Rd, Rr
Logick´ y souˇcin.
Rd=Rd and Rr
Z,N,V
1
OR
Rd, Rr
Logick´ y souˇcet.
Rd=Rd or Rr
Z,N,V
1
EOR
Rd, Rr
Exkluzivn´ı souˇcet.
Rd=Rd xor Rr
Z,N,V
1
COM
Rd
Jednotkov´ y doplnˇek.
Rd=$FF-Rd
Z,C,N,V
1
NEG
Rd
Dvojkov´ y doplnˇek.
Rd=$00-Rd
Z,C,N,V,H
1
SBR
Rd, K
Nastaven´ı bitu v kontrol. reg.
Rd=Rd or K
Z,N,V
1
CBR
Rd, K
Nulov´ an´ı bitu v kontrol. reg.
Rd=Rd and ($FF-K)
Z,N,V
1
INC
Rd
Inkrementace pracov. registru.
Rd=Rd+1
Z,N,V
1
DEC
Rd
Dekrementace pracov. registru.
Rd=Rd-1
Z,N,V
1
TST
Rd
Test nuly nebo z´ aporn´e hod.
Rd=Rd and Rd
Z,N,V
1
CLR
Rd
Vynulov´ an´ı pracovn´ıho registru.
Rd=Rd xor Rd
Z,N,V
1
SER
Rd
Nastaven´ı pracovn´ıho registru.
Rd=$FF
ˇz´adn´ y
1
MUL
Rd, Rr
N´ asoben´ı neznam´enkov´ ych hod.
R1:0=RdxRr
Z,C
2
N´ asoben´ı znam´enkov´ ych hodnot.
R1:0=RdxRr
Z,C
2
MULS Rd, Rr ...
coˇz pˇrisp´ıv´ a ke srozumitelnosti zdrojov´eho k´odu. Vybran´e pseudoinstrukce AVR jsou uvedeny v tabulce 2.5. Z operaˇcn´ıch k´ od˚ u je tak napˇr. zˇrejm´e, ˇze bitov´ y posun doleva je ve skuteˇcnosti realizov´an souˇctem dvou stejn´ ych hodnot. Tabulka 2.5: Vybran´e pseudoinstrukce AVR. Instrukce
Popis
Funkce
ADD
Rd, Rr
Souˇcet hodnot bez pˇrenosu.
Rd=Rd+Rr
0000 11rd dddd rrrr
LSL
Rd
Bitov´ y posun doleva.
Rd=Rd+Rd
0000 11dd dddd dddd
LDI
Rd, K
Naplnˇen´ı registru hodnotou.
Rd=K
1110 KKKK dddd KKKK
Nastaven´ı cel´eho registru.
Rd=$FF
1110 1111 dddd 1111
SER
Operaˇ cn´ı k´ od
AND
Rd, Rr
Logick´ y souˇcin.
Rd=Rd·Rr
0010 00rd dddd rrrr
TST
Rd
Testov´ an´ı nul./z´ aporn´e hodn.
Rd=Rd·Rd
0010 00dd dddd dddd
2.3
Proces dek´ odov´ an´ı a vykon´ an´ı instrukc´ı
Proces dek´ odov´ an´ı a vykon´ an´ı instrukc´ı, tj. bˇeh libovoln´eho programu je ovl´ad´an ˇr´ıdic´ı jednotkou a je vˇzdy prov´ adˇen v nˇekolika kroc´ıch: (1) Naˇcten´ı (anglicky: Fetch) op k´ odu instrukce: – ˇr´ıdic´ı jednotka generuje sign´al, kter´ y um´ıst´ı obsah 16bitov´eho, programov´eho ˇc´ıtaˇce
24
Mikroprocesorov´a technika a embedded syst´emy
(PC – Program Counter) na adresn´ı sbˇernici. (Programov´ y ˇc´ıtaˇc obsahuje adresu vykon´ avan´e instrukce, viz vˇetven´ı programu), – ˇr´ıdic´ı jednotka generuje sign´al R/W =1 pro ˇcten´ı z pamˇeti; ˇcten´a instrukce se tak zap´ıˇse z pˇr´ısluˇsn´e pozice programov´e pamˇeti na datovou sbˇernici, – ˇr´ıdic´ı jednotka generuje sign´al pro naˇcten´ı obsahu datov´e sbˇernice do instrukˇcn´ıho registru (IR – Instruction Register). (2) Inkrementace obsahu PC: – obsah programov´eho ˇc´ıtaˇce je zvˇetˇsen o jedniˇcku, takˇze obsahuje adresu n´asleduj´ıc´ı instrukce, pˇr´ıp. adresy operandu v programov´e pamˇeti. (3) Dek´odov´ an´ı operaˇcn´ıho k´ odu instrukce: – obsah instrukˇcn´ıho registru je pˇresunut do instrukˇcn´ıho dekod´eru ˇr´ıdic´ı jednotky, kde je identifikov´ ana instrukce, – pokud instrukce vyˇzaduje operandy, jsou naˇcteny (krok 1) do datov´eho registru. (4) Vykon´ an´ı instrukce: – ˇr´ıdic´ı jednotka generuje sign´aly nutn´e pro vykon´an´ı pˇr´ısluˇsn´e instrukce.
Fakulta elektrotechniky a komunikaˇcn´ıch technologi´ı VUT v Brnˇe
3
25
Programov´ an´ı mikrokontrol´ er˚ u
3.1
Typy adresov´ an´ı
Proces adresov´ an´ı zpˇr´ıstupˇ nuje data z programov´e a datov´e pamˇeti, pˇr´ıp. ze I/O jednotky. Mluv´ıme o pˇr´ım´em adresov´ an´ı, kdyˇz adresa operandu je souˇc´ast´ı instrukce. Pˇr´ımo lze adresovat pracovn´ı registry, kontroln´ı registry, datovou i programovou pamˇet’. Druh´ ym zp˚ usobem adresov´an´ı je nepˇr´ım´e adresov´ an´ı, kdy adresa operandu nen´ı souˇc´ast´ı instrukce – adresa je uloˇzena v nˇekter´em z ukazatel˚ u. 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: • registrov´e adresov´ an´ı: zdrojem informace (operand) je registr(y). Napˇr.: MOV Rd, Rr, • pˇr´ım´e adresov´ an´ı: operandy jsou pˇr´ımo urˇceny konkr´etn´ı adresou. Napˇr.: CALL k, • 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, nebo ST X, Rr, • bezprostˇredn´ı adresov´ an´ı: hodnota operandu je pˇr´ımo obsaˇzena v instrukci. Napˇr.: LDI Rd, K.
3.2
Vˇ etven´ı programu
Programov´ yˇ c´ıtaˇ c Podle Von Neumannovy koncepce procesoru jsou instrukce vykon´av´any sekvenˇcnˇe, tj. tak jak jsou uloˇzeny v programov´e pamˇeti. Adresu instrukce, kter´a se pr´avˇe vykon´av´a specifikuje programov´ y ˇc´ıtaˇc (PC – Program Counter), jehoˇz hodnota je pˇri startu aplikace vynulov´ana a ukazuje tak na prvn´ı pozici v programov´e pamˇeti. D´ale je hodnota tohoto ukazatele zpravidla pouze inkrementov´ ana. Existuj´ı vˇsak ˇctyˇri zp˚ usoby jak mˇenit hodnotu PC skokovˇe: (a) podm´ınˇen´ y skok, (b) nepodm´ınˇen´ y skok, (c) vol´ an´ı podprogramu, nebo (d) obsluha pˇreruˇsen´ı. Programov´ y ˇc´ıtaˇc je u ATmega16 tvoˇren 13bitovou hodnotou, reprezentovanou registrov´ ym p´arem PCH a PCL (Program Counter High a Low, viz obr´azek 3.1), ke kter´emu nelze pˇr´ımo pˇristupovat a mˇenit jeho hodnotu. Poˇcet bit˚ u (adresovateln´ y prostor) samozˇrejmˇe koresponduje s velikost´ı programov´e pamˇeti – pro ATmega16 lze adresovat celkem 213 = 8 k = 8 192 slov (instrukc´ı). Podm´ınˇ en´ y skok Podm´ınˇen´ y skok je reakc´ı na podm´ınku, jej´ıˇz v´ ysledek m˚ uˇze b´ yt bud’ pravdiv´ y (TRUE) nebo nepravdiv´ y (FALSE), podle kter´e dojde nebo nedojde ke skokov´e zmˇenˇe programov´eho ˇc´ıtaˇce. Jazyk symbolick´ ych adres zpravidla umoˇzn ˇuje vyuˇzit´ı jen jednoduch´ ych podm´ınek; sloˇzitˇejˇs´ı konstrukce je nutn´e naprogramovat postupn´ ym vnoˇren´ım. JSA mikrokontrol´eru AVR obsahuje dvˇe kategorie instrukc´ı pro podm´ınˇen´ y skok. Prvn´ı zahrnuje instrukce, kter´e vyhodnot´ı argument podm´ınky a v pˇr´ıpadˇe jej´ıho splnˇen´ı pˇreskoˇc´ı jedinou n´asleduj´ıc´ı instrukci! V manu´ alu instrukˇcn´ı sady lze tyto instrukce identifikovat anglick´ ym oznaˇcen´ım skip if . . . Viz zdrojov´ y k´ od A.3 na stranˇe 82. Nˇekter´e pˇr´ıklady tohoto druhu instrukc´ı jsou: • 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 kontroln´ım registru ”P” nulov´ y (Skip if Bit Is Cleared),
Mikroprocesorov´a technika a embedded syst´emy
13
12
11
10
9
8
−
−
−
PC12 PC11 PC10 PC9
PC8
PCH
PC7
PC6
PC5
PC4
PC3
PC2
PC1
PC0
PCL
7
6
5
4
3
2
1
0
datov´ a pamˇet’
program. ˇc´ıtaˇc
kontroln´ı registry
ukazatel na z´ asobn´ık
R0
instrukˇcn´ı registr instrukˇcn´ı dekod´er
(a)
R1
adresn´ı sbˇernice, 16 bit˚ u
14
program. pamˇet’
ˇr´ıdic´ı sign´ aly
15
datov´ a sbˇernice, 8 bit˚ u
26
R31
ALU
stavov´ y registr
(b)
Obr´ azek 3.1: (a) Struktura a (b) pozice programov´eho ˇc´ıtaˇce AVR. • SBIS P, b – pˇreskoˇc, je-li bit ”b” v kontroln´ım registru ”P” nastaven (Skip if Bit Is Set). Druhou kategori´ı instrukc´ı podm´ınˇen´eho skoku je skok na libovoln´e n´avˇeˇst´ı; anglicky oznaˇcovan´e jako branch if . . . Houfnˇe se k tomu vyuˇz´ıvaj´ı pˇr´ıznakov´e bity ze stavov´eho registru. K testov´an´ı hodnoty kaˇzd´eho pˇr´ıznaku existuje v instrukˇcn´ı sadˇe dvojice instrukc´ı. Vybran´e pˇr´ıklady: • BREQ k – skoˇc na n´ avˇeˇst´ı ”k”, je-li nulov´ y pˇr´ıznak Z=1 (BRench if EQual); jak napov´ıd´ a anglick´ y n´ azev instrukce, k vˇetven´ı dojde tak´e v pˇr´ıpadˇe, ˇze plat´ı rovnost registr˚ u Rd a Rr u instrukce CP, CPI, SUB nebo SUBI. Podm´ınkou je bezprostˇredn´ı posloupnost nˇekter´e z uveden´ ych instrukc´ı a BREQ. • BRNE k – skoˇc na ”k”, je-li Z=0 (BRench if Not Equal); vhodn´e pro konstrukci cykl˚ u, kdy testujeme, zda sumaˇcn´ı index jiˇz doˇc´ıtal do nuly, • BRVS k – skoˇc na ”k”, je-li V=1 (BRench if V is Set), V oznaˇcuje pˇr´ıznakov´ y bit overflow, tj. pˇreteˇcen´ı, • BRVC k – skoˇc na ”k”, je-li V=0 (BRench if V is Cleared), • BRIE k – skoˇc na ”k”, je-li I=1 (BRench if I is Enable), I–interrupt, • BRID k – skoˇc na ”k”, je-li I=0 (BRench if I is Disable). Doba trv´ an´ı tˇechto instrukc´ı je z´ avisl´a zda je, ˇci nen´ı podm´ınka vˇetven´ı splnˇena. V pˇr´ıpadˇe, ˇze podm´ınka pro skok nen´ı pravdiv´ a, doba v´ ykonu instrukc´ı je jeden strojov´ y cyklus (jedna perioda hodinov´eho sign´ alu). V opaˇcn´em pˇr´ıpadˇe trv´a v´ ykon instrukce delˇs´ı doby – typicky dva cykly.
Fakulta elektrotechniky a komunikaˇcn´ıch technologi´ı VUT v Brnˇe
27
Nepodm´ınˇ en´ y skok Instrukce pro nepodm´ınˇen´ y skok maj´ı za u ´kol pˇr´ımou zmˇenu hodnoty v programov´em ˇc´ıtaˇci a t´ım zajistit skok v programu. Nen´ı tedy uvaˇzov´ana ˇz´adn´a podm´ınka. Existuj´ı tˇri typy instrukc´ı pro nepodm´ınˇen´ y skok u instrukˇcn´ı sadu AVR: (a) relativn´ı skok, (b) nepˇr´ımo adresovan´ y skok a (c) skok s pˇr´ım´ ym adresov´ an´ım. Instrukce pro nepˇr´ım´ y skok (Indirect Jump) IJMP neobsahuje ˇz´adn´ y operand. Adresa pro skok je automaticky br´ana z registrov´eho p´aru ”Z”. Pracovn´ı registry R30 a R31 se tak st´ avaj´ı zdrojem adresy. Rozd´ıl mezi relativn´ım skokem a pˇr´ım´ ym skokem je ve zp˚ usobu pouˇzit´ı adresy skoku. Prvn´ı zp˚ usob (Relative Jump) ch´ ape adresu jako offset k aktu´aln´ı hodnotˇe programov´eho ˇc´ıtaˇce. Jej´ı rozsah je tedy omezen (−2K ≤ k ≥ 2K – 16bitov´a adresa) a pro velk´e rozsahy programov´e pamˇeti nelze instrukci RJMP k pouˇz´ıt. Pˇr´ım´ y skok (Direct Jump), vyuˇz´ıvaj´ıc´ı instrukci JMP k nem´a ˇz´adn´ a omezen´ı a umoˇzn ˇuje adresovat pozici v rozsahu 0 ≤ k ≥ 4 M (22bitov´a adresa). Druh´ y rozd´ıl pˇrirozenˇe plyne z bitov´e ˇs´ıˇrky adresy: instrukce RJMP k je 16bitov´a, zat´ımco instrukce JMP k zab´ır´ a dvoujn´ asobnou oblast v programov´e pamˇeti – je tedy 32bitov´a. Takto ˇsirok´ ych instrukc´ı je v instrukˇcn´ı sadˇe AVR jen nˇekolik. Doba v´ ykonu relativn´ıho skoku je kratˇs´ı (2 cykly) neˇz u pˇr´ım´eho adresov´ an´ı 22bitovou adresou (3 cykly). U relativn´ıho skoku je moˇzn´e, m´ısto n´avˇeˇst´ı, vyuˇz´ıt tak´e aktu´ aln´ı hodnoty programov´eho ˇc´ıtaˇce. Uk´azka 3.1 pˇredstavuje dvˇe moˇznosti, jak naprogramovat cyklus. Prvn´ı z nich vyuˇz´ıv´a n´avˇeˇst´ı jako identifik´ator adresy, druh´ y pak pˇr´ımo specifikuje o kolik pozic se m´a sn´ıˇzit ukazatel PC. Zdrojov´ y k´ od 3.1: Relativn´ı adresov´an´ı nepodm´ınˇen´eho skoku. 1 2 3 4 5
... delay : NOP DEC temp BRNE loop
; ; ; ;
p r v n´ı zp˚ u sob c y k l u ˇz a ´ dn´ a o p e r a c e ; s p o tˇr e b o v a ´ n´ı j ed no h o t a k t u p r o c e s o r u temp−− j e − l i temp != 0 s k oˇc na d e l a y
; ; ; ;
druh´ y zp˚ u sob c y k l u ˇz a ´ dn´ a o p e r a c e ; s p o tˇr e b o v a ´ n´ı j ed no h o t a k t u p r o c e s o r u temp−− j e − l i temp != 0 s n i ˇz PC o dva , t j . v r a t’ s e na i n s t r u k c i NOP
6 7 8 9 10
... NOP DEC temp BRNE PC−2
Vol´ an´ı podprogramu, z´ asobn´ık Podprogram (anglicky: Subroutine) je obecnˇe ˇc´ast k´odu, kter´a se ˇcasto opakuje. Do strojov´eho jazyka se pˇreloˇz´ı jen jednou a spouˇst´ı se zaps´an´ım adresy prvn´ı instrukce do programov´eho ˇc´ıtaˇce, tj. ”sk´ aˇce” se na nˇej. Po vykon´an´ı se program automaticky vrac´ı na m´ısto, odkud byl podprogram vol´ an. V JSA mikrokontrol´er˚ u AVR existuj´ı tˇri instrukce pro vol´an´ı podprogramu, jejichˇz rozd´ıl je obdobn´ y jako u nepodm´ınˇen´ ych skok˚ u (viz v´ yˇse): RCALL k (Relative Subroutine Call), ICALL (Indirect Call), CALL k (Direct Subroutine Call). Uk´azka zdrojov´eho k´ odu obsahuj´ıc´ı vnoˇren´e (postupn´e) vol´an´ı dvou podprogram˚ u je zn´azornˇena na v´ ypise 3.2. Jedn´ a se o ˇc´ast funkce pro komunikaci se znakov´ ym LCD displejem. Hodnoty PC naznaˇcuj´ı bˇeh programu. V prvn´ım sloupci jsou uvedeny uk´azkov´e adresy, na kter´ ych jsou jednotliv´e instrukce uloˇzeny. N´avrat z podprogramu a plynul´e pokraˇcov´an´ı v´ ykonu k´odu je zajiˇstˇen pomoc´ı uloˇzen´e tzv. n´avratov´e adresy (anglicky: Return Address). N´avratov´a adresa je adresa instrukce n´asleduj´ıc´ı po instrukci volaj´ıc´ı podprogram a mus´ı b´ yt uloˇzena jeˇstˇe pˇred skokem do podprogramu do ’ vyˇclenˇen´eho pamˇet ov´eho prostoru datov´e pamˇeti. Ten se naz´ yv´a z´asobn´ık (anglicky: Stack). Ukl´ad´an´ı automaticky zajiˇst’uje ˇr´ıdic´ı jednotka, proto se o tuto reˇzii nemus´ı program´ator starat. N´avratov´a adresa m˚ uˇze b´ yt PC+1, nebo PC+2, v z´avislosti na pouˇzit´e instrukci skoku RCALL
28
Mikroprocesorov´a technika a embedded syst´emy
Zdrojov´ y k´ od 3.2: Rekurzivn´ı vol´ an´ı dvou podprogram˚ u. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
... lcd_command : 0 x1D MOV 0 x1E SWAP 0 x1F ANDI 0 x20 OUT 0 x21 RCALL 0 x22 ANDI 0 x23 OUT ... lcd_enable 0 x48 SBI 0 x49 RCALL 0 x4A CBI 0 x4B RET ... delay5us : 0 x61 LDI 0 x62 DEC 0 x63 BRNE 0 x64 RET
; PC = . . . 1D, 1E , 1F , 2 0 , 21 SKOK 4 8 , 49 SKOK ; = 6 1 , 6 2 , 63 ( c y k l u s 3x ) 6 2 , 6 3 , 6 2 , 6 3 , ´ ´ ; = 64 NAVRAT 4A, 4B NAVRAT 22 , 23 , . . .
temp2 , temp1 temp1 temp1 , 0 x0F PORTD , temp1 lcd_enable temp2 , 0 x0F PORTD , temp2
; SKOK, n a ´vratova ´ a d r e s a : 0 x0022
PORTD , 5 delay5us PORTD , 5
; SKOK, n a ´vratova ´ a d r e s a : 0x004A ´ ; NAVRAT
temp1 , 0 x03 temp1 PC−1 ´ ; NAVRAT
nebo CALL. N´ avrat z podprogramu (tj. vyzvednut´ı n´avratov´e adresy ze z´asobn´ıku a jej´ı zaps´an´ı ’ do PC) zajiˇst uje instrukce RET (subroutine RETurn). Z´asobn´ık je ˇc´ ast pamˇeti SRAM (m˚ uˇze t´eˇz slouˇzit k z´alohov´an´ı obsahu pracovn´ıch registr˚ u) a ˇs´ıˇrka kaˇzd´eho pamˇet’ov´eho slova je tak 8 bit˚ u. Mikrokontrol´ery, kter´e nemaj´ı intern´ı pamˇet’ RAM, obsahuj´ı hardwarov´ y z´ asobn´ık s omezenou velikost´ı (napˇr. tˇri pozice u ATtiny11). Zapisovat/ˇc´ıst lze do/ze z´ asobn´ıku pouze do/z jedin´e pozice. Tu ud´av´a tzv. ukazatel na z´asobn´ık (SP – Stack Pointer), kter´ y vˇzdy obsahuje adresu vrcholu z´asobn´ıku. Ukazatel ATmega16 je 16bitov´ a hodnota uloˇzen´ a v registrov´em p´ aru SPH:SPL (viz obr´azek 3.2) a rovnˇeˇz patˇr´ı mezi kontroln´ı registry. Aby bylo moˇzn´e korektnˇe se z´ asobn´ıkem pracovat (tzn. aby bylo moˇzn´e pouˇz´ıvat podprogramy), mus´ı b´ yt hodnota ukazatele na z´asobn´ık inicializov´ana. T´eto operaci se ˇr´ık´a definice z´asobn´ıku a prov´ ad´ı se jedenkr´ at a to hned na zaˇc´atku hlavn´ıho programu. Ukazatel se pˇri definov´an´ı 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). Uk´azka definice z´ asobn´ıku je zobrazena pomoc´ı n´asleduj´ıc´ıho zdrojov´eho k´odu. (Konstanta RAMEND obsahuje adresu posledn´ı buˇ nky pamˇeti SRAM a je definov´ana v souboru *.inc.) Zdrojov´ y k´ od 3.3: Definice z´ asobn´ıku. 1 2 3 4 5
stack_definition : LDI R16 , LOW ( RAMEND ) OUT SPL , R16 LDI R16 , HIGH ( RAMEND ) OUT SPH , R16
; ; ; ; ;
d e f i n i c e za ´ s o b n´ık u na konec pamˇe ti SRAM do R16 u l oˇz n i ˇz ˇs´ı byte p o s l e d n´ı a d r e s y v SRAM SPL ( n i ˇz ˇs´ı byte Stack P o i n t e r u ) = R16 R16 = v yˇs ˇs´ı byte p o s l e d n´ı a d r e s y v SRAM SPH ( v yˇs ˇs´ı byte Stack P o i n t e r u ) = R16
Z´asobn´ık funguje jako LIFO syst´em (Last In First Out – posledn´ı zaps´an, prvn´ı ˇcten) a vzhledem k ˇs´ıˇrce n´ avratov´e adresy a slov v datov´e pamˇeti (z´asobn´ıku) je proces ukl´ad´an´ı adresy rozdˇelen do 4 f´ az´ı: (1) uloˇzen´ı niˇzˇs´ıho bytu adresy na pozici adresovanou SP,
Fakulta elektrotechniky a komunikaˇcn´ıch technologi´ı VUT v Brnˇe
12
11
10
9
8
SP15 SP14 SP13 SP12 SP11 SP10 SP9
SP8
SPH
SP7
SP6
SP5
SP4
SP3
SP2
SP1
SP0
SPL
7
6
5
4
3
2
1
0
program. ˇc´ıtaˇc
kontroln´ı registry
ukazatel na z´ asobn´ık
R0
instrukˇcn´ı registr instrukˇcn´ı dekod´er
(a)
R1
adresn´ı sbˇernice, 16 bit˚ u
13
datov´ a pamˇet’
ˇr´ıdic´ı sign´ aly
14
program. pamˇet’
datov´ a sbˇernice, 8 bit˚ u
15
29
R31
ALU
stavov´ y registr
(b)
Obr´ azek 3.2: (a) Struktura a (b) pozice ukazatele na z´asobn´ık AVR.
(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 vˇzdy obsahuje adresu prvn´ıho voln´eho bytu v z´asobn´ıku). Je patrn´e, proˇc se z´ asobn´ık definuje aˇz na samotn´ y konec datov´e pamˇeti – pˇri ukl´ad´an´ı se totiˇz hodnota SP sniˇzuje, tj. z´ asobn´ık se pln´ı smˇerem k niˇzˇs´ım adres´am, resp. ke kontroln´ım a pracovn´ım registr˚ um (viz obr´ azek 2.3). V pˇr´ıpadˇe zacyklen´ı programu a rekurzivn´ıho vol´an´ı st´ ale nov´ ych podprogram˚ u tak m˚ uˇze z´ asobn´ık zas´ahnout i do oblast´ı tˇechto ˇr´ıdic´ıch, pˇr´ıp. pracovn´ıch registr˚ u. V t´eto oblasti vˇsak nem´ a z´asobn´ık pr´avo z´apisu (ovˇsem ani ˇcten´ı), coˇz v d˚ usledku zp˚ usob´ı ztr´ atu jeho funkce. Dojde-li ke ˇcten´ı n´avratov´e adresy v situaci, kdy SP je v rozsahu 0 aˇz 0x60 (tj. v oblasti pracovn´ıch a kontroln´ıch registr˚ u), chod programu je pˇreruˇsen resetem. Proces ˇcten´ı n´ avratov´e adresy ze z´asobn´ıku je obdobn´ y: (1) SP = SP + 1 (ukazatel tak 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 u ATmega16 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. Po vykon´ an´ı ˇcten´ı adresy, uloˇzen´e adresy ve stacku z˚ ust´avaj´ı, ale pˇri n´asledn´em vol´an´ı podprogramu se pˇrep´ıˇs´ı nov´ ymi daty. 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 pracovn´ıch registr˚ u. Toho se nejˇcastˇeji vyuˇz´ıv´a na zaˇc´ atku podprogramu, kdy si potˇrebn´e registry zaz´alohujeme a pˇred koncem podprogramu hodnoty znovu ze z´asobn´ıku naˇcteme. Z pochopiteln´ ych d˚ uvod˚ u jsou f´aze ukl´ad´an´ı hodnot libovoln´eho registru (pomoc´ı instrukce PUSH Rr) pouze dvˇe:
30
Mikroprocesorov´a technika a embedded syst´emy
(1) uloˇzen´ı obsahu registru Rr na adresu definovanou SP, (2) SP = SP − 1. Obdobnˇe i f´ aze naˇcten´ı 8bitov´e hodnoty ze z´asobn´ıku do destinaˇcn´ıho registru pomoc´ı instrukce POP Rd: (1) SP = SP + 1, (2) naˇcten´ı slova z adresy SP do registru Rd.
3.3
Obsluha pˇ reruˇ sen´ı
Bˇeh programu (hodnota PC) je tak´e ovlivniteln´ y pomoc´ı tzv. pˇreruˇsen´ı (anglicky: Interrupt). V pˇr´ıpadˇe, ˇze mikroprocesor obdrˇz´ı ˇza´dost o obsluhu povolen´eho pˇreruˇsen´ı, mus´ı pˇreruˇsit vykon´avanou ˇcinnost (hlavn´ı program) a spustit obsluˇzn´ y program, kter´ y je urˇcen v´ yhradnˇe pro dan´ y zdroj pˇreruˇsen´ı. Kaˇzd´ y mikrokontrol´er obsahuje sadu moˇzn´ ych pˇreruˇsen´ı intern´ıch i extern´ıch; pˇriˇcemˇz zdroje pˇreruˇsen´ı z´ avis´ı na hardwarov´em vybaven´ı konkr´etn´ıho MCU. 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. Kaˇzd´e pˇreruˇsen´ı m´a sv˚ uj povolovac´ı bit; nav´ıc existuje jeden glob´ aln´ı povolovac´ı bit (u AVR je to bit I ve stavov´em registru). Jednotliv´a pˇreruˇsen´ı maj´ı r˚ uznou prioritu; niˇzˇs´ı hodnota vektoru pˇreruˇsen´ı adresa znamen´a vyˇsˇs´ı priorita a naopak. Seznam moˇzn´ ych zdroj˚ u pˇreruˇsen´ı mikrokontrol´eru ATmega16 je zobrazen v tabulce 3.1 a pro mikrokontrol´er ATtiny11 v tabulce 3.2. U ATmega16 je mezi jednotliv´ ymi vektory pˇreruˇsen´ı voln´ ych 32 bit˚ u (tj. dvˇe pamˇet’ov´e pozice); u ATtiny11 jen 16 bit˚ u. Do oblasti vektor˚ u pˇreruˇsen´ı se tak vkl´ad´a pouze nepodm´ınˇen´ y skok na samotnou obsluhu, kter´ a je uloˇzena kdekoliv v programov´e pamˇeti. (ATtiny11 m´a menˇs´ı pamˇet’ov´ y rozsah, proto zde nen´ı potˇreba instrukce JMP – instrukˇcn´ı sada obsahuje v´ yhradnˇe 16bitovou instrukci RJMP.) Pozn.: ATtiny11 neobsahuje datovou pamˇet’ SRAM, 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 uchovat maxim´alnˇe 3 adresy. Jednotliv´e f´ aze obsluhy libovoln´eho pˇreruˇsen´ı jsou n´asleduj´ıc´ı: (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´ı, ´ ´IC´I instrukce v programov´e pamˇeti (proto mus´ı (3) do z´asobn´ıku se uloˇz´ı adresa NASLEDUJ b´ yt definov´ an z´ asobn´ık), (4) podle zdroje pˇreruˇsen´ı se do PC naˇcte vektor pˇreruˇsen´ı (napˇr.: PC=0x0002 pro INT0 u ATmega16, viz tabulka 3.1), (5) vykon´a se obsluha pˇreruˇsen´ı, tj. konkr´etn´ı posloupnost instrukc´ı, (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 od m´ısta, kde byl pˇreruˇsen.
Fakulta elektrotechniky a komunikaˇcn´ıch technologi´ı VUT v Brnˇe
31
Tabulka 3.1: Pˇrehled vektor˚ u pˇreruˇsen´ı pro mikrokontrol´er ATmega16. ˇ C.
Adresa
Zdroj pˇ reruˇ sen´ı
Popis pˇ reruˇ sen´ı
1
0x0000
RESET
Extern´ı reset, pˇripojen´ı nap´ajen´ı, . . .
2
0x0002
INT0
Extern´ı poˇzadavek na pˇreruˇsen´ı 0.
3
0x0004
INT1
4
0x0006
TIMER2 COMP
Extern´ı poˇzadavek na pˇreruˇsen´ı 1. ˇ Casovaˇ c/ˇc´ıtaˇc 2 – shoda komparace.
5
0x0008
TIMER2 OVF
6
0x000A
TIMER1 CAPT
7
0x000C
TIMER1 COMPA
8
0x000E
TIMER1 COMPB
9
0x0010
TIMER1 OVF
ˇ Casovaˇ c/ˇc´ıtaˇc 2 – pˇreteˇcen´ı. ˇ Casovaˇc/ˇc´ıtaˇc 1 – zachycen´ı. ˇ Casovaˇ c/ˇc´ıtaˇc 1 – shoda s kompar´atorem A. ˇ Casovaˇ c/ˇc´ıtaˇc 1 – shoda s kompar´atorem B. ˇ Casovaˇ c/ˇc´ıtaˇc 1 – pˇreteˇcen´ı.
10
0x0012
TIMER0 OVF
ˇ Casovaˇ c/ˇc´ıtaˇc 0 – pˇreteˇcen´ı.
11
0x0014
SPI, STC
Dokonˇcen´ı s´eriov´eho pˇrenosu SPI.
12
0x0016
USART, RXC
USART – kompletn´ı pˇr´ıjem dat.
13
0x0018
USART, UDRE
USART – pr´azdn´ y datov´ y registr.
14
0x001A
USART, TXC
USART – kompletn´ı vysl´an´ı dat.
15
0x001C
ADC
ADC – dokonˇcen´ı A/D pˇrevodu.
16
0x001E
EE RDY
EEPROM – komunikace pˇripravena.
17
0x0020
ANA COMP
Zmˇena v´ ystupu analogov´eho kompar´atoru.
18
0x0022
TWI
Ud´alost na s´eriov´e sbˇernici I2C.
19
0x0024
INT2
20
0x0026
TIMER0 COMP
Extern´ı poˇzadavek na pˇreruˇsen´ı 2. ˇ Casovaˇ c/ˇc´ıtaˇc 0 – shoda komparace.
21
0x0028
SPM RDY
Uloˇzen´ı do programov´e pamˇeti pˇripraveno.
Tabulka 3.2: Vektory pˇreruˇsen´ı mikrokontrol´eru ATmega11. ˇ C.
Adresa
1
0x000
RESET
Extern´ı reset, pˇripojen´ı nap´ajen´ı.
2
0x001
INT0
Extern´ı poˇzadavek na pˇreruˇsen´ı 0.
3
0x002
I/O piny
4
0x003
TIMER0 OVF
Zmˇena stavu I/O pinu. ˇ Casovaˇ c/ˇc´ıtaˇc 0 – pˇreteˇcen´ı
5
0x004
ANA COMP
Zmˇena v´ ystupu analogov´eho kompar´atoru.
Zdroj pˇ reruˇ sen´ı Popis pˇ reruˇ sen´ı
Obecnˇe plat´ı pro vˇsechny zdroje pˇreruˇsen´ı, ˇze jejich poˇzadavek se obslouˇz´ı, pakliˇze jsou splnˇeny dvˇe podm´ınky: konkr´etn´ı zdroj pˇreruˇsen´ı je povolen a souˇcasnˇe jsou glob´alnˇe povolena vˇsechna pˇreruˇsen´ı. Kaˇzd´ y zdroj pˇreruˇsen´ı se nastavuje prostˇrednictv´ım sv´ ych kontroln´ıch registr˚ u; glob´ aln´ı povolen´ı pˇreruˇsen´ı je (u AVR) zajiˇstˇeno pˇr´ıznakov´ ym bitem I ve stavov´em registru SREG. K nastaven´ı tohoto bitu slouˇz´ı instrukce SEI; k nulov´an´ı – a souˇcasnˇe k zak´az´ an´ı vˇsech pˇreruˇsen´ı – slouˇz´ı instrukce CLI. Jako pˇr´ıklad nastaven´ı pˇreruˇsen´ı je v n´asleduj´ıc´ım textu pops´an extern´ı poˇzadavek na pˇreruˇsen´ı.
32
3.3.1
Mikroprocesorov´a technika a embedded syst´emy
Extern´ı poˇ zadavek na pˇ reruˇ sen´ı
Zdrojem extern´ıho poˇzadavku na pˇreruˇsen´ı (anglicky: External Interrupt) je zmˇena hodnoty vstupn´ıho sign´ alu nˇekter´eho z vyˇclenˇen´ ych pin˚ u mikrokontrol´eru. Pro ATmega16 jsou tyto zdroje 3 – oznaˇcovan´e jako INT 0, INT 1 a INT 2. Zdroje pˇreruˇsen´ı (napˇr. sign´al z tlaˇc´ıtka) mus´ı b´ yt pˇrivedeny na konkr´etn´ı piny: PD2, PD3 (port D) a PB2 (port B) jak naznaˇcuje obr´azek 3.3.
Obr´ azek 3.3: Zdroje extern´ıho pˇreruˇsen´ı u mikrokontrol´eru ATmega16: INT 0, INT 1 a INT 2. Extern´ı poˇzadavek na pˇreruˇsen´ı lze generovat pˇri (a) n´ızk´e u ´rovn´ı sign´alu, (b) libovoln´e zmˇenˇe hodnoty sign´ alu, tj. jak pˇrechod I → O, tak i O → I, d´ale pˇri (c) sestupn´e ˇci (d) vzestupn´e hranˇe vstupn´ıho sign´ alu. Volbu lze nastavit v kontroln´ım registru MCUCR (MCU Control Register) pomoc´ı dvojic bit˚ u ISC01:0 (pro INT 0), ˇci ISC11:0 (pro pˇreruˇsen´ı INT 1). Povolit extern´ı pˇreruˇsen´ı umoˇzn ˇuj´ı program´ ator˚ um bity INT2, INT1 a INT0 v registru GICR (General Interrupt Control Register). Samotn´ y poˇzadavek na pˇreruˇsen´ı je pro CPU signalizov´an pˇr´ıznakov´ ym bitem v registru GIFR (General Interrupt Flag Register); viz obr´azek 3.4. Nastaven´ı tˇechto pˇr´ıznakov´ ych bit˚ u je prov´adˇeno automaticky a pˇredstavuje samotn´ y poˇzadavek perif´erie na pˇreruˇsen´ı chodu mikrokontrol´eru. Detailn´ı popis vˇsech zdroj˚ u pˇreruˇsen´ı vˇcetnˇe pˇr´ısluˇsn´ ych kontroln´ıch registr˚ u je vˇzdy pops´ ano v katalogov´em listˇe mikrokontrol´eru (napˇr. [Atm16]). Uk´azka aplikace s pˇreruˇsen´ım v JSA je uvedena v pˇr´ıloze A.5 na stranˇe 82.
Fakulta elektrotechniky a komunikaˇcn´ıch technologi´ı VUT v Brnˇe
7
6
5
4
3
2
1
0
INT1
INT0
INT2
−
−
−
IVSEL
IVCE
33
GICR
(a) 7
6
5
4
3
2
1
0
SM2
SE
SM1
SM0
ISC11
ISC10
ISC01
ISC00
MCUCR
(b) 7
6
5
INTF1 INTF0 INTF2
4
3
2
1
0
−
−
−
−
−
GIFR
(c)
Obr´ azek 3.4: Struktura kontroln´ıch registr˚ u pro extern´ı pˇreruˇsen´ı: (a) GICR, (b) MCUCR a (c) GIFR.
34
Mikroprocesorov´a technika a embedded syst´emy
4
Vnitˇ rn´ı struktura z´ akladn´ıch perif´ eri´ı
V t´eto kapitole jsou pˇredstaveny nˇekter´e ze z´akladn´ıch intern´ıch perif´eri´ı, bˇeˇznˇe se vyskytuj´ıc´ı v MCU. Pˇredevˇs´ım se jedn´ a o vstupnˇe/v´ ystupn´ı (paraleln´ı) porty mikrokontrol´er˚ u a ˇcasovaˇc/ˇc´ıtaˇc.
4.1
Vstupnˇ e/v´ ystupn´ı port
Vstupnˇe/v´ ystupn´ı (I/O) port obsahuje piny, kter´e zajiˇst’uj´ı komunikaci s extern´ımi obvody a zaˇr´ızen´ımi a pˇredstavuj´ı nejvˇsestrannˇejˇs´ı zaˇr´ızen´ı vˇsech mikrokontrol´er˚ u. Porty obsahuj´ı jednotliv´e I/O piny, pˇriˇcemˇz nejˇcastˇeji port obsahuje pr´avˇe osm pin˚ u. Celkov´ y poˇcet pin˚ u v pouzdˇre MCU je odliˇsn´ y a specifikuje pouˇzit´ı dan´eho obvodu. Napˇr. mikrokontrol´er s oznaˇcen´ım RS08KA firmy Freescale obsahuje pouze 4 I/O piny, ATtiny12 (Atmel) jich m´a k dispozici 6, ATmega16 disponuje 32 I/O piny a ATmega103 jich m´a dokonce 48. U mikrokontrol´er˚ u AVR jsou ke kaˇzd´emu obousmˇern´emu I/O portu asociov´any tˇri kontroln´ı registry, prostˇrednictv´ım kter´ ych jsou jednotliv´e porty ˇci piny softwarovˇe ovl´ad´any: DDRn (Data Direction Registr) urˇcuje smˇer toku dat, z´apisem hodnoty 0 na pˇr´ısluˇsnou pozici tohoto registru konfigurujeme I/O pin jako vstupn´ı, z´apisem hodnoty 1 jako v´ ystupn´ı. PORTn je datov´ ym registrem portu a odpov´ıd´a hodnotˇe zapsan´e do vyrovn´avac´ıho registru portu, tedy hodnotˇe kterou zapisujeme na pˇr´ısluˇsn´ y pin (v´ yvod) br´any. PINn (Pins Input) je urˇcen pro ˇcten´ı a odpov´ıd´a hodnotˇe pˇreˇcten´e (synchronizovan´e) z pˇr´ısluˇsn´eho pinu (log. u ´roveˇ n sign´alu pˇriveden´a z vnˇejˇs´ıch obvod˚ u na tento pin). Smˇerov´ y registr DDRxn (x=A,B,C,D; n=0,1,. . .,7) obsahuje hodnotu ”0” na tˇech pozic´ıch portu, kter´e pln´ı funkci vstupn´ıch pin˚ u. Na druhou stranu, bity kter´e jsou rovny ”1” identifikuj´ı v´ ystupn´ı piny dan´eho portu. Funkci pin˚ u lze tedy nastavovat jednotlivˇe bez ohledu na ostatn´ı piny. Struktura smˇerov´eho registru pro port C je zobrazena na obr´azku 4.1. 7
6
5
4
3
2
1
0
DDC7
DDC6
DDC5
DDC4
DDC3
DDC2
DDC1
DDC0
DDRC
Obr´ azek 4.1: Struktura smˇerov´eho registru DDRC (Port C Data Direction Register). Hodnota bitu ve v´ ystupn´ım registru PORTxn – v pˇr´ıpadˇe definovan´eho v´ ystupn´ıho pinu – ud´av´a pˇr´ımo logickou u ´roveˇ n na pinu. Hodnota 1 nastav´ı v´ ystupn´ı pin na vysokou u ´roveˇ n, a obr´acenˇe. V pˇr´ıpadˇe, ˇze pin je definov´an jako vstupn´ı, aktivuje/deaktivuje hodnota bitu v registru PORTxn intern´ı pull-up rezistor, jak naznaˇcuje tabulka 4.1. Tabulka 4.1: Nastaven´ı funkce I/O pinu mikrokontrol´eru. DDRxn
PORTxn
I/O
Popis funkce
0
0
Vstupn´ı
Vysok´a impedance.
0
1
Vstupn´ı
Aktivace pull-up rezistoru.
1
0
V´ ystupn´ı N´ızk´a u ´roveˇ n.
1
1
V´ ystupn´ı Vysok´a u ´roveˇ n.
Vstupn´ı I/O registr PINxn obsahuje hodnoty 0 nebo 1, kter´e koresponduj´ı s u ´rovn´ı sign´alu na vstupu. Rovnˇeˇz se do tohoto registru kop´ıruj´ı data zapsan´a do v´ ystupn´ıho registru PORTxn, coˇz vypl´ yv´a tak´e z funkˇcn´ıho zapojen´ı jednoho I/O pinu mikrokontrol´eru AVR – viz obr´azek 4.2.
Fakulta elektrotechniky a komunikaˇcn´ıch technologi´ı VUT v Brnˇe
35
Pouˇzit´e ˇr´ıdic´ı sign´ aly: DDA0
D Q
WriteDA − z´ apis do registru DDRA
WriteDA
ReadDA − ˇcten´ı obsahu registru DDRA WriteRA − z´ apis do registru PORTA
ReadDA
ReadRA − ˇcten´ı obsahu registru PORTA ReadPA − ˇcten´ı obsahu registru PINA PA0 PORTA0
D Q
WriteRA
ˇr´ıdic´ı sbˇernice
datov´ a sbˇernice
ReadRA
ReadPA Q D
PINA0 clkI/O
Obr´ azek 4.2: Funkˇcn´ı sch´ema I/O pinu ˇc. 0 na portu A mikrokontrol´eru AVR (nen´ı zakreslen pull-up, pˇrepˇet’ov´ a ochrana, alternativn´ı funkce, ani synchronizace vstupu).
Kaˇzd´ y pin obsahuje pˇrepˇet’ovou ochranu (omezuj´ıc´ı diody) a moˇznost pˇripojen´ı intern´ıho pull-up rezistoru. Vˇetˇsina I/O pin˚ u umoˇzn ˇuje kromˇe klasick´e I/O komunikace tak´e alternativn´ı funkci. Konkr´etn´ı piny jsou tak vyuˇz´ıv´any intern´ımi perif´eriemi MCU jako jsou A/D pˇrevodn´ık, s´eriov´e komunikace SPI, I2C, ˇci JTAG. Oznaˇcen´ı sign´al˚ u pˇr´ısluˇsn´ ych alternativn´ıch funkc´ı pin˚ u lze vyˇc´ıst tak´e ze sch´ematick´e znaˇcky mikrokontrol´eru – viz napˇr. obr´azek 3.3. Konkr´etn´ı propojen´ı pin˚ u a intern´ıch perif´eri´ı nen´ı moˇzn´e mˇenit. Pr´ ace s kontroln´ımi registry Z pohledu program´ atora existuj´ı v jazyce symbolick´ ych adres dva z´akladn´ı zp˚ usoby specifikov´ an´ı hodnot jednotliv´ ych kontroln´ıch registr˚ u. Prvn´ı z nich vyuˇz´ıv´a kombinace instrukce pro naplnˇen´ı pracovn´ıho registru LDI a n´ asledn´e pˇrekop´ırov´an´ı t´eto hodnoty do kontroln´ıho registru pomoc´ı OUT. Lze pˇritom pˇrepisovat vˇsech osm bit˚ u v kontroln´ım registru, coˇz v mnoha pˇr´ıpadech nen´ı ˇz´adouc´ı. Efektivnˇejˇs´ı zp˚ usob je kombinace bitov´eho posunu a logick´eho souˇctu. Takto budou zmˇenˇeny pouze bity, jejichˇz index pouˇzijeme pˇri bitov´em posuvu. Programov´a uk´azka obou zp˚ usob˚ u je zn´ azornˇena ve v´ ypise 4.1. Druh´ y zp˚ usob ovlivˇ nov´ an´ı obsahu kontroln´ıch registr˚ u, pouˇz´ıvan´ y v jazyce symbolick´ ych adres, je zaloˇzen na instrukc´ıch SBI (Set Bit in I/O Register) pro nastaven´ı jednoho bitu a CBI (Clear Bit in I/O Register) pro nulov´ an´ı jednoho bitu. Obˇe instrukce maj´ı dva operandy, z nichˇz prvn´ı je identifik´ ator kontroln´ıho registru a druh´ y je index konkr´etn´ıho bitu z intervalu 0 aˇz 7. Pˇr´ıklad je uveden ve v´ ypise 4.2. V jazyce C je zp˚ usob ovlivnˇen´ı obsahu kontroln´ıch registr˚ u obdobn´ y. Opˇet je lepˇs´ı upˇrednostˇ novat zp˚ usob s bitov´ ym posuvem a logick´ ym souˇctem, jak naznaˇcuje v´ ypis 4.3.
36
Mikroprocesorov´a technika a embedded syst´emy
Zdrojov´ y k´ od 4.1: Z´ apis do kontroln´ıch registr˚ u pomoc´ı LDI a OUT v JSA. 1 2 3 4 5 6 7
.include ... LDI OUT ... LDI OUT
8 9 10 11 12 13
... OUT
<m16def.inc>
; d e f i n i ˇc n´ı s o u b o r m i k r o k o n t r o l´e r u ATmega16
R16 , 0 b00011000 DDRB , R16
; R16 <− 24 ; definova ´ n´ı v y ´ s t u p n´ıc h pin˚ u PB4 a PB3
R16 , (1<
; n a s t a v e n´ı v y ´ s t u p n´ıc h hodnot p o r t u B
Zdrojov´ y k´ od 4.2: Z´ apis do kontroln´ıch registr˚ u pomoc´ı SBI a CBI v JSA. 1 2 3 4 5 6
... SBI SBI CBI ... IN
DDRB , 0 x03 DDRB , 4 DDRB , 3
; definova ´ n´ı v y ´ s t u p n´ıh o pinu PB3 ; definov´ a n´ı v y ´ s t u p n´ıh o pinu PB4 ; definov´ a n´ı v s t u p n´ıh o pinu PB3
R16 , PINB
; n a ˇc t e n´ı hodnot v s t u p n´ıh o p o r t u B
Zdrojov´ y k´ od 4.3: Z´ apis do kontroln´ıch registr˚ u v jazyce C. 1 2 3 4
#include
// h l a v iˇc k o v y ´ s o u b o r m i k r o k o n t r o l´e r u ... // d e f i n o v a ´ n´ı v y ´ s t u p n´ıc h pin˚ u PB4 a PB3 DDRB = 0 b00011000 ;
5 6 7 8 9 10
// j i n y ´ zp˚ u sob d e f i n o v a ´ n´ı v y ´ s t u p n´ıc h pin˚ u PB4 a PB3 DDRB |= (1<
11 12 13
// n a ˇc t e n´ı v s t u p n´ıc h hodnot z p o r t u B do promˇe nn´e temp temp = PINB ;
Pˇ ripojen´ı extern´ıch perif´ eri´ı I/O piny mikrokontrol´er˚ u slouˇz´ı k pˇripojen´ı libovoln´ ych extern´ıch perif´eri´ı (napˇr. tlaˇc´ıtko, LED, kl´avesnice, . . .). Obecnˇe lze toto pˇripojen´ı realizovat tˇremi zp˚ usoby: (1) pˇr´ım´e pˇripojen´ı – jeden I/O pin je vyuˇzit k pˇripojen´ı jednoduch´eho zaˇr´ızen´ı (tlaˇc´ıtko, LED, . . .), (2) maticov´e uspoˇr´ ad´ an´ı – nˇekolik jednoduch´ ych zaˇr´ızen´ı je uspoˇr´ad´ano do matice, coˇz sniˇzuje poˇcet potˇrebn´ ych I/O pin˚ u (maticov´a kl´avesnice), (3) pomoc´ı pomocn´ ych obvod˚ u/ˇradiˇc˚ u, kter´e pracuj´ı nez´avisle na ˇr´ıdic´ım mikrokontrol´eru. Komunikace s tˇemito ˇradiˇci prob´ıh´a zpravidla s´eriovou cestou. U vstupn´ıch zaˇr´ızen´ı m˚ uˇze b´ yt vyuˇzito pˇreruˇsen´ı, kdy v pˇr´ıpadˇe ud´alosti generuje perif´erie poˇzadavek na pˇreruˇsen´ı, kter´e zajist´ı naˇcten´ı/vysl´ an´ı potˇrebn´ ych dat.
Fakulta elektrotechniky a komunikaˇcn´ıch technologi´ı VUT v Brnˇe
(a)
(b)
37
(c)
Obr´ azek 4.3: Pˇripojen´ı z´ akladn´ıch extern´ıch perif´eri´ı k mikrokontrol´eru: (a) LED diody, (b) tlaˇc´ıtka, (c) maticov´ a kl´ avesnice. Pˇripojen´ı a pˇredevˇs´ım softwarov´ a obsluha maticov´e kl´avesnice 4 × 4, viz obr´azek 4.3 (c), je pops´ana v n´ asleduj´ıc´ım textu. V pˇr´ıpadˇe pˇr´ım´eho pˇripojen´ı, by bylo potˇreba celkem 16 vstupn´ıch pin˚ u mikrokontrol´eru. Zapojen´ım do matice, kdy jsou tlaˇc´ıtka v kaˇzd´em ˇr´adku a sloupci ˇ ri z pin˚ pˇripojena na jedin´ y pin, staˇc´ı jen 8 pin˚ u, tj. jeden I/O port. Ctyˇ u mus´ı b´ yt definov´ any jako v´ ystupn´ı – tvoˇr´ı sloupce matice (napˇr. piny PB7–PB4) a ˇctyˇri piny jsou deklarov´any jako vstupn´ı a tvoˇr´ı ˇr´ adky matice (napˇr. PB3–PB0). Zjiˇstˇen´ı stisknut´e kl´avesy se prov´ad´ı tzv. skenov´an´ım kl´ avesnice, kdy jsou ve ˇctyˇrech kroc´ıch vysl´any hodnoty na v´ ystupn´ı piny: (1) PB7:4 = 0b1110, (2) PB7:4 = 0b1101, (3) PB7:4 = 0b1011, (4) PB7:4 = 0b0111. Po kaˇzd´em z uveden´ ych krok˚ u se tak´e skenuj´ı vstupn´ı 4 piny. Pokud je nˇekter´ y roven 0, je zˇrejm´e, ˇze bylo stisknuto tlaˇc´ıtko z pˇr´ısluˇsn´eho ˇr´adku a ze sloupce, kter´ y aktu´alnˇe obsahuje hodnotu 0. Pˇri sepnut´ı kaˇzd´eho mechanick´eho tlaˇc´ıtka doch´az´ı k z´akmit˚ um, kter´e tvoˇr´ı nechtˇen´e impulsy zp˚ usobuj´ıc´ı nekorektn´ı v´ ykon programu. Tyto z´akmity je nutn´e vˇzdy oˇsetˇrit! Zp˚ usob˚ u softwarov´eho oˇsetˇren´ı je nˇekolik. Z´ akladn´ı zp˚ usob nejprve vol´a funkci pro kr´atk´e zpoˇzdˇen´ı a to pˇri stisku i pˇri uvolnˇen´ı tlaˇc´ıtka. Vhodnˇe zvolenou dobou zpoˇzdˇen´ı je pˇreklenut pˇrechodov´ y jev na kontaktech. Doba zpoˇzdˇen´ı je z´ avisl´ a na proveden´ı a opotˇreben´ı kontakt˚ u a je nutn´e ji vyzkouˇset experiment´ alnˇe. Pro n´ızko napˇet’ov´e aplikace r´amcovˇe postaˇcuje doba v des´ıtk´ach milisekund. Po stisku se testuje, zda jiˇz bylo tlaˇc´ıtko uvolnˇeno, teprve pak se pokraˇcuje ve v´ ykonu pro’ gramu. V r´ amci prvn´ı zpoˇzd ovac´ı smyˇcky (tj. pˇri sepnut´ı) je moˇzn´e realizovat napˇr. ”p´ıpnut´ı reproduktoru”, kter´e je reprezentov´ ano vys´ıl´an´ım obd´eln´ıkov´eho sign´alu na reproduktor o zvolen´e frekvenci. Generuje-li tlaˇc´ıtko extern´ı zdroj pˇreruˇsen´ı, nen´ı nutn´e v r´amci oˇsetˇren´ı testovat jeho stav. Bˇeˇznou prax´ı je tak´e vynulovat pˇr´ısluˇsn´ y pˇr´ıznakov´ y bit extern´ıho pˇreruˇsen´ı pˇred ukonˇcen´ım obsluˇzn´e funkce (viz registr GIFR). Tento bit se nuluje automaticky, nicm´enˇe pokud nechtˇen´e z´ akmity na tlaˇc´ıtku vyvolaj´ı dalˇs´ı poˇzadavek na pˇreruˇsen´ı v dobˇe, kdy je prvn´ı teprve vykon´av´an, ruˇcn´ım nenulov´ an´ım pˇr´ıznakov´eho bitu neodstran´ıme dvoj´ı vykon´an´ı t´eto obsluhy.
38
4.2
Mikroprocesorov´a technika a embedded syst´emy
ˇ Casovaˇ c/ˇ c´ıtaˇ c
Mezi bˇeˇznou souˇc´ ast kaˇzd´eho mikrokontrol´eru patˇr´ı perif´erie, kter´a umoˇzn ˇuje odeˇc´ıtat ˇcas (ˇcasovaˇc, anglicky: Timer), pˇr´ıp. naˇc´ıtat vstupn´ı pulsy (ˇc´ıtaˇc, anglicky: Counter). Pˇrestoˇze tato perif´erie m˚ uˇze zast´ avat obˇe funkce, jej´ı vnitˇrn´ı struktura je nemˇenn´a. Jednotku oznaˇcovanou jako ˇcasovaˇc/ˇc´ıtaˇc tak lze vyuˇz´ıt k realizaci jednoduch´ ych aplikac´ı, jako je odmˇeˇrov´an´ı kr´atk´ ych ˇcasov´ ych interval˚ u, periodick´e spouˇstˇen´ı zvolen´e funkce, konstrukce jednoduch´ ych frekvenˇcn´ıch ˇc´ıtaˇc˚ u, apod. Vnitˇrn´ı struktura ˇcasovaˇce/ˇc´ıtaˇce mikrokontrol´eru ATmega16 je zobrazena na obr´azku 4.4.
Obr´ azek 4.4: Blokov´e sch´ema ˇcasovaˇce/ˇc´ıtaˇce mikrokontrol´eru ATmega16 (oznaˇcen´ı ”n” ud´av´ a ˇc´ıslo ˇcasovaˇce; pˇrevzato z [Atm16]). Podstatou jednotky je(jsou) registr(y), jehoˇz obsah se inkrementuje pomoc´ı hodinov´eho sign´alu clkT n . Tento sign´ al m˚ uˇze b´ yt odvozen od sign´alu j´adra MCU, nebo je tvoˇren extern´ım, periodick´ ym sign´ alem, pˇriveden´ ym na pin Tn. Lze nastavit zda m´a jednotka reagovat na n´astupnou nebo sestupnou hranu tohoto sign´ alu. Datov´ y registr TCNTn (Timer/Counter Register) m˚ uˇze b´ yt 8 i 16bitov´ y. Jednotka inkrementuje (dekrementuje) hodnotu tohoto datov´eho registru kaˇzdou periodu hodinov´eho sign´ alu. Frekvence hodinov´eho sign´alu j´adra mikrokontrol´eru lze sn´ıˇzit zaˇrazen´ım pˇreddˇeliˇcky s pˇredem definovanou hodnotou. Doba pˇreteˇcen´ı datov´eho registru se pak prodlouˇz´ı o n´ asobek hodnoty pˇreddˇeliˇcky. Oznaˇcen´ı bottom a top v obr´azku reprezentuje minim´aln´ı a maxim´ aln´ı hodnotu datov´eho registru, tj. pro 8bitov´ y ˇcasovaˇc: 0 a 255. Uvaˇzujme nyn´ı jen 8bitov´ y ˇcasovaˇc/ˇc´ıtaˇc mikrokontrol´eru ATmega16 s oznaˇcen´ım ”0”. Kromˇe datov´eho registru TCNT0 (Timer/Counter Register), lze k t´eto jednotce pˇristupovat tak´e prostˇrednictv´ım komparaˇcn´ıho registru OCR0 (Output Compare Register), kter´ y obsahuje hodnotu pro neust´ al´e porovn´ av´ an´ı s datov´ ym registrem, a pˇredevˇs´ım prostˇrednictv´ım ˇr´ıdic´ıho registru TCCR0 (Timer/Counter Control Register) – napˇr. pro nastaven´ı hodnoty pˇreddˇeliˇcky. Jednotka generuje dvoj´ı typ pˇreruˇsen´ı: pˇri pˇreteˇcen´ı hodnoty datov´eho registru, nebo pˇri rovnosti hodnot datov´eho a komparaˇcn´ıho registru. Ud´alost pˇreteˇcen´ı je obecnˇe signalizov´ana j´adru MCU prostˇrednictv´ım sign´ alu TOV0 (Timer Overflow), kter´ y je identifikov´an jako bit v kontroln´ım registru. Ud´alost komparace pak sign´ alem OC0 (viz obr´azek 4.4). Komparace hodnot lze vyuˇz´ıt ke snadn´emu generov´ an´ı PWM (Pulse Width Modulation) sign´alu na v´ ystupn´ım pinu OC0, jak
Fakulta elektrotechniky a komunikaˇcn´ıch technologi´ı VUT v Brnˇe
39
naznaˇcuje obr´ azek 4.5. Dobu pˇreteˇcen´ı tOV F lze vyj´adˇrit vztahem tOV F =
1 fCP U
· N · (2n − init),
(4.1)
kde fCP U je frekvence hodinov´eho sign´alu j´adra MCU, N je hodnota zvolen´e pˇreddˇeliˇcky, n je poˇcet bit˚ u v datov´em registru ˇcasovaˇce a init oznaˇcuje poˇc´ateˇcn´ı hodnotu tohoto registru. Uvaˇzujme frekvenci hodinov´eho sign´alu fCP U = 16 MHz a 16bitov´ y ˇcasovaˇc. S vyuˇzit´ım minim´aln´ı a maxim´ aln´ı hodnoty pˇreddˇeliˇcky m˚ uˇzeme nastavit ˇcasov´e intervaly, ve kter´ ych bude doch´azet k generov´ an´ı pˇreruˇsen´ı na 4,1 ms nebo 4,2 s. Bliˇzˇs´ı informace o vyuˇzit´ı jednotky pro odmˇeˇrov´an´ı ˇcasu a generov´ an´ı sign´ alu s promˇennou stˇr´ıdou, lze nal´ezt v poˇc´ıtaˇcov´ ych cviˇcen´ıch pˇredmˇetu. 255 OCR0
OCR0
TCNT0 0
OC0 (PB3) tOV F
tOV F
tOV F
tOV F
Obr´ azek 4.5: Princip generov´ an´ı PWM sign´alu pomoc´ı zmˇeny hodnoty komparaˇcn´ıho registru 8bitov´eho ˇcasovaˇce.
4.3
Watchdog ˇ casovaˇ c
Obdobou intern´ıho ˇcasovaˇce je obvod oznaˇcovan´ y jako watchdog. Jedn´a se o ”bezpeˇcnostn´ı ˇcasovaˇc”, jehoˇz v´ yznam je vyvolat reset (a t´ım i znovu-nastartov´an´ı) mikrokontrol´eru v pˇr´ıpadˇe, ˇze se procesor ”ztrat´ı”, pˇr´ıp. nevykon´av´a program, kter´ y by mˇel. Watchdog je nez´avisl´ y ˇcasovaˇc s oddˇelen´ ym hodinov´ ym syst´emem (nicm´enˇe frekvence je z´avisl´a na nap´ajec´ım napˇet´ı; pˇri VCC = 5 V ⇔ fW DT = 1 MHz). Frekvenci hodinov´eho sign´alu je opˇet moˇzn´e sn´ıˇzit pomoc´ı pˇreddˇeliˇcky. V d˚ usledku tak lze zajistit pˇreteˇcen´ı watchdogu od 16 ms do 2,1 s. Watchdog vych´ az´ı z filozofie, ˇze bˇeˇzn´ y v´ ykon programu v mikroprocesorov´e technice obsahuje nekoneˇcnou smyˇcku, ve kter´e prov´ ad´ı soustavn´e naˇc´ıt´ an´ı vstupn´ıch dat pomoc´ı tzv. pollingu (opakovan´e dotazov´ an´ı perif´erie, opak pˇreruˇsen´ı), nebo pˇreruˇsen´ı. Um´ıst´ıme-li do t´eto smyˇcky pˇr´ıkaz, kter´ y nuluje stav ˇcasovaˇce watchdogu, k jeho pˇreteˇcen´ı nem˚ uˇze doj´ıt (samozˇrejmˇe, byla-li zvolena dostateˇcnˇe velk´ a pˇreddˇeliˇcka). V pˇr´ıpadˇe, ˇze se vinou chybn´eho programov´an´ı, pˇr´ıp. nedokonal´eho hardwarov´eho n´avrhu, chod programu zacykl´ı mimo nekoneˇcnou smyˇcku (a t´ım tak´e mimo pˇr´ıkaz pro nulov´ an´ı stavu watchdogu), dojde k pˇreteˇcen´ı ˇcasovaˇce watchdogu. Toto pˇreteˇcen´ı zp˚ usob´ı reset cel´eho syst´emu, tj. k znovu zah´ ajen´ı v´ ykonu programu od prvn´ı adresy, ale tak´e k defaultn´ımu nastaven´ı vˇsech intern´ıch perif´eri´ı a I/O pin˚ u. Watchdog m˚ uˇze odstranit d˚ usledek nenad´al´e ud´alosti, kter´a nebyla oˇsetˇrena softwarovˇe nebo hardwarovˇe. Je-li vˇsak tato ud´alost trval´a, reset syst´emu dlouhodobˇe nepom˚ uˇze a nezb´ yv´ a, neˇz chybu odhalit a opravit. Uk´azka pouˇzit´ı watchdogu pro mikrokontrol´er AVR je pro jazyk symbolick´ ych adres uvedena v pˇr´ıloze A.6, respektive v pˇr´ıloze B.5 pro jazyk C.
40
5 5.1
Mikroprocesorov´a technika a embedded syst´emy
Komunikace zaˇ r´ızen´ı po sbˇ ernici S´ eriov´ y a paraleln´ı pˇ renos dat
Existuj´ı dva zp˚ usoby pˇresunu dat mezi pamˇet’ov´ ymi pozicemi: paraleln´ı a s´eriov´ y. Princip tˇechto pˇrenos˚ u je pro 3bitov´e registry zobrazen na obr´azku 5.1. V prvn´ım pˇr´ıpadˇe jsou registry tvoˇreny 0 trojic´ı klopn´ ych obvod˚ u typu D, ˇr´ızen´ ych hranou s charakteristickou rovnic´ı q = d. Ve druh´em 0 pˇr´ıpadˇe jsou posuvn´e (shift) registry tvoˇreny klopn´ ymi obvody typu JK (q = j · q + k · q).
(a)
(b)
Obr´ azek 5.1: Pˇrenos dat mezi registry: (a) paraleln´ı pˇrenos dat, (b) s´eriov´ y pˇrenos dat. Symbolicky lze zapsat libovoln´ y pˇresun dat z registru X do registru Y takto: [X]→[Y] (pˇresun obsahu registru X do registru Y). Pˇri paraleln´ım pˇrenosu zp˚ usob´ı hodinov´ y impulz, aplikov´ an na vstupy CLK, pˇresun dat z v´ ystup˚ u X2 , X1 , X0 (vstupy DY ) na v´ ystupy Y2 , Y1 , Y0 . Jedn´a se o paraleln´ı pˇresun, protoˇze cel´ y obsah registru X se pˇrekop´ıruje do Y najednou (pomoc´ı jedn´e hrany ˇr´ıdic´ıho hodinov´eho sign´ alu). Pˇri s´eriov´em pˇrenosu dat, zp˚ usob´ı aktivn´ı hrana sign´alu CLK pˇrekop´ırov´an´ı hodnot vstupn´ıch sign´ al˚ u vˇsech klopn´ ych obvod˚ u na jejich v´ ystupy (tj. dle obr´azku 5.1 (b) na vstupy n´asleduj´ıc´ıch klopn´ ych obvod˚ u vpravo). Hodnota z posledn´ıho klopn´eho obvodu je ztracena. Do prvn´ıho klopn´eho obvodu se uloˇz´ı stav s´eriov´eho vstupu S. S´eriov´ y pˇrenos mezi registry vyˇzaduje v´ıce ˇcasu (pˇrenos jednoho bitu vyˇzaduje jeden impulz hodinov´eho sign´alu), ale tak´e m´enˇe propojovac´ıch vodiˇc˚ u. Pˇ r´ıklad 5.1 Popiˇste s´eriov´y pˇrenos dat mezi dvojic´ı 3bitov´ych registr˚ u [X]→[Y]. Necht’ jsou poˇc´ ateˇcn´ı hodnoty registr˚ u [X]=101, [Y]=011 a hodnota s´eriov´eho vstupu z˚ ust´ av´ a bˇehem cel´eho pˇrenosu nemˇenn´ a S = 0. ˇ sen´ı 5.1 Dle propojen´ı obou registr˚ Reˇ u z obr´ azku 5.1 (b) a poˇc´ ateˇcn´ıch hodnot registr˚ u, se budou hodnoty bit˚ u pˇresouvat zleva doprava s kaˇzd´ym impulzem hodinov´eho sign´ alu. 1. impulz: s´eriov´y vstup S se pˇrekop´ıruje na v´ystup prvn´ıho klopn´eho obvodu X2 . P˚ uvodn´ı obsah registru X se posune o jednu pozici doprava, tj. jeho nejm´enˇe v´yznamn´y bit je na pozici nejv´yznamnˇejˇs´ıho bitu registru Y. Nejm´enˇe v´yznamn´y bit registru Y je ztracen: [X]=010, [Y]=101,
Fakulta elektrotechniky a komunikaˇcn´ıch technologi´ı VUT v Brnˇe
41
2. impulz: [X]=001, [Y]=010, 3. impulz: [X]=000, [Y]=101. Pˇrenos dat z registru X je dokonˇcen. P˚ uvodn´ı obsah destinaˇcn´ıho registru Y je ztracen a vlivem naˇc´ıt´ an´ı hodnoty s´eriov´eho vstupu S je obsah zdrojov´eho registru X vynulov´ an.
5.2
Obvody s tˇ r´ı-stavov´ ym v´ ystupem
Typick´a komunikace uvnitˇr mikrokontrol´eru, ale i mezi mikrokontrol´erem a zaˇr´ızen´ımi prob´ıh´ a po paraleln´ım veden´ı, tj. po sbˇernici (u 8bitov´ ych syst´em˚ u tvoˇrena zpravidla 8 vodiˇci). Vˇsechna zaˇr´ızen´ı obsahuj´ı vstupnˇe/v´ ystupn´ı port(y), pomoc´ı nˇehoˇz jsou pˇripojena na tuto skupinu vodiˇc˚ u. Aby byly eliminov´ any kolize na sbˇernici, kdy nˇekolik zaˇr´ızen´ı vys´ıl´a souˇcasnˇe (takov´ y stav na sbˇernici je d´ an kombinac´ı v´ıce sign´al˚ u a data jsou ”neˇciteln´a”) se pouˇz´ıvaj´ı syst´emy s tˇr´ıstavov´ ymi v´ ystupy (Three State Output), pˇr´ıp. oddˇelovac´ı buffery s tˇr´ıstavov´ ym v´ ystupem. V´ ystupy tak obsahuj´ı kromˇe stavu HIGH a LOW tak´e stav vysok´e impedance Z. Tˇr´ı-stavov´ y v´ ystup je ˇr´ızen povolovac´ım vstupem (Enable, Output Enable, pˇr´ıp. Gate), kter´ y zajist´ı aktivaci vˇzdy jen jednoho zaˇr´ızen´ı. V´ ystupy ostatn´ıch z˚ ust´avaj´ı ve stavu vysok´e impedance a neovlivˇ nuj´ı stav sbˇernice. Souˇc´ astky, kter´e obsahuj´ı tˇr´ı-stavov´ y v´ ystup maj´ı ve sv´e sch´ematick´e ˇ ızen´ı tˇechto obvod˚ znaˇcce mal´ y troj´ uheln´ıˇcek. R´ u m˚ uˇze b´ yt dle v´ yrobce odliˇsn´e: jak n´ızkou u ´rovn´ı kontroln´ıho vstupu Enable, tak i u ´rovn´ı vysokou. Rovnˇeˇz v´ ystup m˚ uˇze b´ yt v pˇr´ım´em, nebo v invertovan´em tvaru. Tˇr´ı-stavov´e obvody jsou obsaˇzeny v klopn´ ych obvodech, registrech, pamˇet’ov´ ych souˇc´ astk´ ach, a t´emˇeˇr ve vˇsech mikrokontrol´erech a bˇeˇznˇe se pouˇz´ıvaj´ı k pˇripojen´ı nˇekolika zaˇr´ızen´ı/sign´ al˚ u ke sbˇernici. Pˇr´ıklad takov´eho pˇripojen´ı je zobrazen na obr´azku 5.2.
OE A A
YA
OE B B
YB
OE C YC
OE D YD
DB0
D ˇr´ıdic´ı sbˇernice
intern´ı datov´ a sbˇernice
C
Obr´ azek 5.2: Pˇripojen´ı tˇr´ı sign´ al˚ u na sbˇernici pomoc´ı tˇr´ı-stavov´eho budiˇce sbˇernice 74HC125. Obvod 74HC125 obsahuje celkem 4 tˇr´ı-stavov´e budiˇce, aktivn´ı u ´roveˇ n ˇr´ıdic´ıch vstup˚ u je zde ˇ ıdic´ı n´ızk´a. Pˇr´ıklad popisuje pˇripojen´ı tˇr´ı sign´al˚ u, oznaˇcen´ ych A, B, C a D k datov´e sbˇernici. R´ sign´aly jsou oznaˇceny OE A (pro sign´al A) aˇz OE D . Je-li OE A = 0 a souˇcasnˇe OE B = OE C = OE D = 1 na datov´e sbˇernici je napˇet’ov´ y ekvivalent vstupu A. V situaci, kdy vˇsechny ˇr´ıdic´ı sign´aly jsou neaktivn´ı, tj. OE A = OE B = OE C = OE D = 1 jsou vˇsechny v´ ystupy ve stavu
42
Mikroprocesorov´a technika a embedded syst´emy
vysok´e impedance. V´ ystupy se tak chovaj´ı jako by byly fyzicky odpojeny od datov´e sbˇernice. ˇ ıdic´ı V pˇr´ıpadˇe aktivace v´ıce budiˇc˚ u souˇcasnˇe dojde ke kolizi na sbˇernici, coˇz je neˇz´adouc´ı. R´ sign´aly OE mus´ı zajistit, aby k takov´ ymto koliz´ım nedoch´azelo.
5.3
Pˇ resun dat po sbˇ ernici
Princip ˇr´ızen´ı komunikace mezi zaˇr´ızen´ımi po sbˇernici je pˇredstaven s pomoc´ı n´asleduj´ıc´ıho pˇr´ıkladu. Ke 4bitov´e datov´e sbˇernici (paraleln´ı vodiˇce oznaˇcen´e DB3–DB0) jsou pˇripojena tˇri zaˇr´ızen´ı, tvoˇren´ a 4bitov´ ymi registry 74174 (ˇctveˇrice 3stavov´ ych klopn´ ych obvod˚ u typu D) – viz obr´azek 5.3.
Obr´ azek 5.3: Komunikace mezi zaˇr´ızen´ımi (4bitov´e registry 74173) po datov´e sbˇernici. Registry, kromˇe vstupn´ıch a v´ ystupn´ıch datov´ ych sign´al˚ u, obsahuj´ı tak´e tˇri ˇr´ıdic´ı sign´aly: oznaˇcen´e IE (Input Enable), OE (Output Enable) a CLK (Clock). N´ızk´a u ´roveˇ n prvn´ıho z nich aktivuje vstupn´ı obvody (tj. naˇcten´ı 4bitov´eho slova do registru), druh´ y aktivuje v´ ystupn´ı obvody (tj. zap´ıˇse obsah registru na datovou sbˇernici – aktivn´ı u ´roveˇ n je dle oznaˇcen´ı opˇet n´ızk´a) a tˇret´ı reprezentuje hodinov´ y sign´ al, kter´ y synchronizuje veˇsker´e pˇrenosy. Tento sign´al je spoleˇcn´ y pro vˇsechny registry. Pˇ r´ıklad 5.2 Zajistˇete pˇrenos dat z registru B do registru A, tj [B]→[A] v zapojen´ı dle obr´ azku 5.3. Necht’ obsah registru B je 0b1100. ˇ sen´ı 5.2 Pro v´ystupy vˇsech registr˚ Reˇ u mus´ı platit, ˇze pouze registr B m´ a aktivov´ any v´ystupn´ı obvody, tj. OE A = 1, OE B = 0 a OE C = 1. Obsah registru B je t´ım zaps´ an na datovou sbˇernici. Pro vstupy registr˚ u mus´ı b´yt n´ aslednˇe splnˇeno, ˇze pouze registr A m´ a aktivov´ any vstupn´ı obvody, tj. IE A = 0, IE B = 1 a IE C = 1. N´ asledn´ a aktivn´ı hrana hodinov´eho sign´ alu zajist´ı pˇrenos (pˇreˇcten´ı) dat ze sbˇernice do klopn´ych obvod˚ u registru A, jak zobrazuje obr´ azek 5.4 (a). Platn´ a data jsou v registru A pˇrenesena v ˇcasov´em intervalu t1 − t2 . Neplatn´ a data jsou na sbˇernici pˇr´ıtomna v intervalech t1 −t0 a t3 −t2 . V ostatn´ıch okamˇzic´ıch je datov´ a sbˇernice ve stavu vysok´e impedance. Libovoln´y pˇrenos dat je tedy zajiˇstˇen generov´ an´ım korektn´ı posloupnost´ı ˇr´ıdic´ıch sign´ al˚ u.
Fakulta elektrotechniky a komunikaˇcn´ıch technologi´ı VUT v Brnˇe
43
OE B IE A CLK 1
DB3
OE B 1
DB2
IE A 0
DB1
CLK 0
DB0
0b1100
DB3 : 0 t0
(a)
t1
t2
t3
t0
t1
t2 t3
(b)
ˇ Obr´ azek 5.4: (a) Casov´ e pr˚ ubˇehy ˇr´ıdic´ıch a datov´ ych sign´al˚ u pˇri pˇrenosu dat, (b) zjednoduˇsen´e ˇcasov´e pr˚ ubˇehy na sbˇernici. V ˇc´ıslicov´ ych (a mikroprocesorov´ ych) syst´emech se bˇeˇznˇe pouˇz´ıv´a vˇetˇs´ı poˇcet registr˚ u neˇz 3. Obecnˇe lze na sbˇernici pˇripojit libovoln´ y poˇcet registr˚ u. Souˇcasnˇe se t´ım ale zvyˇsuje poˇcet ˇr´ıdic´ıch sign´ al˚ u OE, IE a vstupnˇe/v´ ystupn´ıch vodiˇc˚ u. Poˇcet zaˇr´ızen´ı, pˇripojen´ ych na sbˇernici je rozd´ıln´ y pˇr´ıpad od pˇr´ıpadu. Z´ avis´ı na velikosti pamˇeti syst´emu a na poˇctu vstupn´ıch a v´ ystupn´ıch zaˇr´ızen´ıch, kter´ a mus´ı s CPU komunikovat po sbˇernici. Pro vˇsechna ale plat´ı, ˇze mus´ı b´ yt ke ˇ sbˇernici pˇripojena pˇres 3stavov´e buffery. Rada zaˇr´ızen´ı tyto buffery jiˇz obsahuj´ı pˇr´ımo na ˇcipu, napˇr. registry 74173 (viz v´ yˇse). Ostatn´ı zaˇr´ızen´ı mohou b´ yt ke sbˇernici pˇripojena pˇres tzv. ˇradiˇc sbˇernice (Bus Driver). ˇ c sbˇernice obsahuje 3stavov´ Radiˇ y v´ ystup s velmi n´ızkou v´ ystupn´ı impedanc´ı, coˇz zp˚ usobuje ˇ c rychl´e nab´ıjen´ı a vyb´ıjen´ı celkov´e kapacitn´ı reaktance sbˇernice, tj. kr´atk´e doby pˇrechodu. (Radiˇ sbˇernice tedy nezhorˇsuje doby pˇrechodu.) Kapacitn´ı odpor je tvoˇren kumulac´ı parazitn´ıch kapacitanc´ı vˇsech vstup˚ u a v´ ystup˚ u, pˇripojen´ ych ke sbˇernici. Pˇr´ıkladem takov´eho ˇradiˇce sbˇernice je napˇr. 8bitov´ y 74HC541. Obdobnˇe jako u 4bitov´e sbˇernice, funguje tak´e komunikace prostˇrednictv´ım 8bitov´e, 16biˇıˇrka sbˇernice (poˇcet vodiˇc˚ tov´e, ˇci v´ıcebitov´e komunikace. S´ u) je d´ana ˇs´ıˇrkou datov´eho slova, pˇren´aˇsen´eho v syst´emu. 8bitov´e slovo ⇒ 8 vodiˇc˚ u, 16bitov´e slovo ⇒ 16 vodiˇc˚ u, . . . Nˇekter´e syst´emy obsahuj´ı kombinac´ı nˇekolika r˚ uznˇe-ˇsirok´ ych sbˇernic. ˇ Casov´ e pr˚ ubˇehy jednotliv´ ych sign´al˚ u na sbˇernici lze z d˚ uvodu pˇrehlednosti z´apisu sdruˇzit do jedin´eho pr˚ ubˇehu – v´ yhodn´e u v´ıcebitov´ ych syst´em˚ u. Na obr´azku 5.4 (b) jsou tak zn´azornˇeny ˇcasov´e pr˚ ubˇehy sign´ al˚ u z pˇr´ıkladu 5.2. (Jsou zakresleny pouze ˇr´ıdic´ı sign´aly, kter´e jsou bˇehem pˇrenosu v aktivn´ı u ´rovni.) Rovnˇeˇz ve sch´ematech se, z d˚ uvodu pˇripojen´ı velk´eho mnoˇzstv´ı zaˇr´ızen´ı ke sbˇernici, pouˇz´ıv´ a ’ zn´azornˇen´ı vodiˇc˚ u bud pomoc´ı ˇsirok´ ych ˇsipek – viz obr´azek 5.5 (a) (ˇc´ıslo v hranat´ ych z´avork´ ach [·] pˇredstavuje ˇs´ıˇrku registr˚ u/poˇcet pˇripojen´ ych vodiˇc˚ u), nebo pomoc´ı jedin´eho vodiˇce (fyzicky nespojeno) s indikovanou ˇs´ıˇrkou, tj s poˇctem bit˚ u – obr´azek 5.5 (b). Z obr´azk˚ u rovnˇeˇz plyne, ˇze uvaˇzovan´ y obvod (registr 74173) m´a vstupy i v´ ystupy napojen´e na shodn´ y vodiˇc datov´e sbˇernice, napˇr. vstupn´ı sign´al DC0 je propojen s v´ ystupem OC0 pˇres vodiˇc DB0 (to neplat´ı pˇri pouˇzit´ı ˇradiˇce sbˇernice). Z d˚ uvodu sn´ıˇzen´ı poˇctu pin˚ u souˇc´astek, bylo
44
Mikroprocesorov´a technika a embedded syst´emy
Obr´ azek 5.5: Zjednoduˇsen´e zn´ azornˇen´ı datov´e sbˇernice ve sch´ematu.
vyvinuto uspoˇr´ ad´ an´ı s propojen´ım vstup˚ u a v´ ystup˚ u uvnitˇr integrovan´ ych obvod˚ u. Kaˇzd´ y pin (I0 /O0 aˇz In /On ) tak m˚ uˇze pracovat jako vstupn´ı nebo v´ ystupn´ı v z´avislosti na ˇr´ıdic´ıch sign´alech (viz obr´azek 5.6). Proto jsou piny I/O naz´ yv´any jako obousmˇern´e datov´e linky.
Obr´ azek 5.6: Propojen´ı I/O pin˚ u uvnitˇr integrovan´eho obvodu.
Fakulta elektrotechniky a komunikaˇcn´ıch technologi´ı VUT v Brnˇe
6 6.1
45
Programov´ an´ı mikrokontrol´ er˚ u pomoc´ı vyˇ sˇ s´ıch jazyk˚ u Pˇ reklad aplikace z jazyka C
Podstatou programov´ an´ı v jazyce C je vyuˇzit´ı program˚ u ke konverzi zdrojov´ ych soubor˚ u na spustiteln´e, kter´e obsahuj´ı strojov´ y k´od aplikace pro c´ılov´ y procesor. Aplikace v jazyce C m˚ uˇze obsahovat ”libovoln´ y” poˇcet zdrojov´ ych soubor˚ u. Proces implementace se skl´ad´a ze tˇr´ı krok˚ u: pˇredzpracov´ an´ı (preprocessor), pˇrekladu (compiler) a linkov´an´ı (linker); viz obr´azek 6.1 (jsou ´ uvedeny pˇrep´ınaˇce pro pˇrevod k´ odu pomoc´ı pˇrekladaˇce GCC). Ukolem preprocesoru je zpracovat direktivy pˇrekladaˇce, tj. jen ty ˇr´adky kter´e v jazyce C zaˇc´ınaj´ı znakem #. Kompil´ator m´ a za u ´kol konvertovat zdrojov´e k´ ody do pˇrechodn´eho k´odu (tzv. objektov´ y soubor). Objektov´e ´ soubory obsahuj´ı pˇreloˇzen´ y zdrojov´ y k´od, nen´ı to vˇsak kompletn´ı program. Ukolem linkeru je pak kombinovat vˇsechny potˇrebn´e objektov´e soubory a vytv´aˇret spustiteln´ y k´od. Pˇri v´ yvoji nov´e aplikace tak nen´ı vˇzdy nutn´e kompilovat vˇsechny zdrojov´e soubory, ale jen ty ve kter´ ych doˇslo ke zmˇenˇe. Kromˇe pˇreloˇzen´ ych ˇc´ ast´ı pouˇzit´ ych knihoven (pouze ty rutiny, kter´e k´od vyuˇz´ıv´a) linker vkl´ad´a do v´ ysledn´eho programu tak´e start-up k´od, kter´ y funguje jako meziˇcl´anek mezi programem a pouˇzit´ ym operaˇcn´ım syst´emem. Jeden objektov´ y soubor na stejn´em hardwaru (napˇr. PC) nejde spustit stejnˇe v syst´emech Linux i Windows. textov´ y editor
zdrojov´ y soubor 1
···
zdrojov´ y soubor i
···
zdrojov´ y soubor N
pˇredzprac.
pˇredzprac.
pˇredzprac.
gcc -E
gcc -E
gcc -E
kompilace
kompilace
kompilace
gcc -c
gcc -c
gcc -c
objektov´ y soubor 1
···
objektov´ y soubor i
linkov´ an´ı gcc -o
···
objektov´ y soubor N
knihovna knihovna knihovna
spustiteln´ y soubor
Obr´ azek 6.1: Postup pˇrekladu aplikace v jazyce C. Pˇri v´ yvoji aplikac´ı pro 8bitov´e mikrokontrol´ery AVR je nutn´e zdrojov´ y k´od z jazyka C pˇrev´est nejprve do jazyka symbolick´ ych adres a n´aslednˇe vytvoˇrit spustiteln´ y k´od – v tomto pˇr´ıpadˇe je reprezentov´ an souborem *.hex ve strojov´em jazyce, jak naznaˇcuje obr´azek 6.2. Vlastnosti pˇrekladaˇce lze prezentovat na jednoduch´e uk´azce. Ve v´ ypise 6.1 je v lev´e ˇc´ asti uveden zdrojov´ y k´ od v jazyce C, kter´ y pˇredstavuje jednoduch´ y 8bitov´ y bin´arn´ı ˇc´ıtaˇc s v´ ystupem na port B (bez vloˇzen´eho zpoˇzdˇen´ı). V prostˇredn´ı ˇc´ asti v´ ypisu je zobrazen odpov´ıdaj´ıc´ı pˇreloˇzen´ y k´od v jazyce symbolick´ ych
46
Mikroprocesorov´a technika a embedded syst´emy
zdrojov´ y k´ od (.c, .h)
pˇrekladaˇc (kompil´ ator)
zdrojov´ y k´ od (.asm)
pˇreklad (asembler)
strojov´ y k´ od (.hex)
Obr´ azek 6.2: Zjednoduˇsen´ y pˇreklad zdrojov´eho k´odu z jazyka C pro MCU.
Zdrojov´ y k´ od 6.1: Uk´ azka zdrojov´eho k´odu v jazyce C a JSA pro AVR. 1 2 3 4 5
... DDRB = 0 xFF ;
6 7
temp = 0 x03 ;
8 9 10 11 12
PORTB = temp ; while ( 1 ) PORTB−− ;
LDI LDI OUT OUT SER OUT LDI STS OUT IN SUBI RJMP
R28 , 0 x5F R29 , 0 x04 0 x3E , R29 0 x3D , R28 R24 0 x17 , R24 R24 , 0 x03 0 x0060 , R24 0 x18 , R24 R24 , 0 x18 R24 , 0 x01 PC−0x0003
// // // //
(!) (!) (!) (!) SER OUT LDI
R24 0 x17 , R24 R24 , 0 x03
OUT
0 x18 , R24
// ( ! ) // ( ! ) DEC R24 RJMP PC−0x0002
adres (pˇreklad pomoc´ı GCC, bez optimalizac´ı). V k´odu jsou patrn´e jednak instrukce, kter´e bezprostˇrednˇe souvis´ı s pˇr´ıkazy v jazyce C – napˇr. kombinace instrukc´ı LDI a OUT pro plnˇen´ı kontroln´ıch registr˚ u – tak i instrukce, kter´e byly do k´odu vloˇzeny pˇrekladaˇcem a nemaj´ı v tomto konkr´etn´ım pˇr´ıkladˇe praktick´ y v´ yznam. Je to pˇredevˇs´ım definice z´asobn´ıku na ˇr´adc´ıch 1 aˇz 4, d´ale z´alohov´an´ı hodnoty registru R24 do datov´e pamˇeti instrukc´ı STS; ˇr´adek 8; STS k, Rr realizuje pˇr´ım´e uloˇzen´ı hodnoty registru do datov´e pamˇeti SRAM Store Direct to Data Space, kde 0 ≤ r ≤ 31, 0 ≤ k ≤ 65 535. Nadbyteˇcn´e je zde tak´e opakovan´e naˇc´ıt´an´ı aktu´aln´ı hodnoty portu B do pracovn´ıho registru R24 na ˇr´ adku 10. Lze spoˇc´ıtat, ˇze vytvoˇren´ yu ´sek k´odu zab´ır´a pr´avˇe 26 byt˚ u programov´e pamˇeti. Na prav´e stranˇe v´ ypisu 6.1 je zobrazen ruˇcnˇe optimalizovan´ y k´od, kter´ y vykon´av´a totoˇznou aplikaci. Jeho velikost je vˇsak jen 12 byt˚ u a kaˇzd´ y pr˚ uchod nekoneˇcnou smyˇckou je o jeden takt procesoru rychlejˇs´ı. Ruˇcnˇe optimalizovan´ y k´od je uveden jen pro ilustraci; d´ale budeme pracovat s pˇreloˇzen´ ym k´ odem pomoc´ı GCC. Takto vytvoˇren´ y k´od je assemblerem n´aslednˇe pˇreloˇzen do strojov´eho k´ odu mikrokontrol´eru AVR (viz v´ ypis 6.2). Tento pˇreklad je jiˇz jednoznaˇcn´ y, na rozd´ıl od pˇrekladu z jazyka C, kdy poˇcet instrukc´ı jeˇstˇe souvis´ı s vlastnostmi a efektivitou pˇrekladaˇce. V´ ysledn´a aplikace ve strojov´em k´ odu je uloˇzena do textov´eho souboru s koncovkou .hex. Form´ at ˇ ast souboru pro uk´azkovou aplikaci je zobrazena ve tohoto souboru je nejˇcastˇeji Intel HEX. C´ v´ ypise 6.3; jsou zde zobrazeny pouze instrukce od adresy 0x0048. V´ yznam jednotliv´ ych byt˚ u form´ atu Intel HEX jsou n´asleduj´ıc´ı: : Symbol identifikuj´ıc´ı zaˇc´ atek ˇr´ adku. 10 Poˇcet datov´ ych byt˚ u v jednom ˇr´ adku. Hodnota je uv´adˇena v hexadecim´aln´ı soustavˇe. Poˇcet byt˚ u je tedy 16. 0090 Adresa v programov´e pamˇeti pro uloˇzen´ı prvn´ıho datov´eho bytu. Hodnota je opˇet uv´adˇena v hexadecim´ aln´ı soustavˇe a ud´ av´ a adresu BYTU a nikoliv adresov´e pozice v programov´e pamˇeti, kter´ a obsahuje 2 byty, tj. 0x48 · 2 = 0x90. 00 Typ k´ odu; hodnota 00 aˇz 05. U mikrokontrol´eru AVR odpov´ıd´a identifik´atoru 64 kB ’ pamˇet ov´e str´ anky. ... Strojov´ y k´ od jednotliv´ ych instrukc´ı v poˇrad´ı little endian, tj. LSB byte uloˇzen dˇr´ıve neˇz MSB.
Fakulta elektrotechniky a komunikaˇcn´ıch technologi´ı VUT v Brnˇe
47
Zdrojov´ y k´ od 6.2: Pˇreklad uk´ azkov´e aplikace do strojov´eho k´odu mikrokontrol´eru AVR. 1 2
; ;
Adresa S t r o j . kod Instrukce Popis funkce ====================================================================== 0 x0047 E5CF LDI R28 , 0 x5F ; l o a d immediate 0 x0048 E0D4 LDI R29 , 0 x04 ; l o a d immediate 0 x0049 BFDE OUT 0 x3E , R29 ; out t o I /O l o c a t i o n 0 x004A BFCD OUT 0 x3D , R28 ; out t o I /O l o c a t i o n 0 x004B EF8F SER R24 ; set register 0 X004C BB87 OUT 0 x17 , R24 ; out t o I /O l o c a t i o n 0 x004D E083 LDI R24 , 0 x03 ; l o a d immediate 0 x004E 93800060 STS 0 x0060 , R24 ; s t o r e d i r e c t t o data s p a c e 0 x0050 BB88 OUT 0 x18 , R24 ; out t o I /O l o c a t i o n 0 x0051 B388 IN R24 , 0 x18 ; i n from I /O l o c a t i o n 0 x0052 5081 SUBI R24 , 0 x01 ; s u b t r a c t immediate 0 x0053 CFFC RJMP PC−0x0003 ; r e l a t i v e jump
3 4 5 6 7 8 9 10 11 12 13 14
Zdrojov´ y k´ od 6.3: Z´ apis testovan´e aplikace ve form´atu Intel HEX. :10 :08
1 2
0090 00 A0
00 00
D4E0 DEBF CDBF 8 FEF 87 BB 83 E0 8093 6000 88 BB 88 B3 8150 FCCF 3E
ED
ED Kontroln´ı souˇcet jednoho ˇr´ adku bez symbolu ”:”. Jednotliv´e byty se seˇctou; z v´ ysledku se pouˇzije jen LSB a k nˇemu se dopoˇc´ıt´a dvojkov´ y doplnˇek. Pro prvn´ı ˇr´adek ve v´ ypise 6.3 tedy plat´ı: 10 + 00 + 90 + 00 + D4 + E0 + DE + BF + CD + BF + 8F + EF + 87 + BB + 83 + E0 + 80 + 93 + 60 + 00 = B13. Dvojkov´ y doplnˇek k hodnotˇe $13 (0001 0011) je $ED (1110 1101).
6.2
Programov´ an´ı v jazyce C
Programovac´ı jazyk C vytvoˇrili Dennis MacAlistair Ritchie (* 9. z´aˇr´ı 1941, † 12. ˇr´ıjna 2011) a Brian W. Kernighan (* 1942). Jiˇz v roce 1978 vydali svou uˇcebnici tohoto jazyka s n´azvem The C Programming Language [Ker78]. Programovac´ı jazyk C byl poprv´e standardizov´an americkou spoleˇcnost´ı ANSI (American National Standards Institute) v 80. letech 20. stolet´ı. Pˇrestoˇze byl tento standard n´aslednˇe pˇrevzat tak´e mezin´ arodn´ı spoleˇcnost´ı ISO (International Organization for Standardization), je st´ale pouˇz´ıv´ an n´ azev jazyka ANSI C. V souˇcasn´e dobˇe (podzim 2011) je platn´a verze z roku 1999 s oznaˇcen´ım ISO/IEC 9899:1999 [Ans99], doplnˇen´a jiˇz tˇret´ı korekc´ı z roku 2007 (ISO/IEC 9899:1999 Cor. 3:2007(E)). Pracovn´ı skupina WG14, kter´a pˇripravuje standardizaci jazyka C, vˇsak dokonˇcuje nov´ y standard s oznaˇcen´ım ISO/IEC 9899:201x [Ans1x]. Aplikace se skl´ adaj´ı z tzv. modul˚ u, kter´e jsou tvoˇreny kombinac´ı textov´ ych soubor˚ u obsahuj´ıc´ı k´od (koncovka *.c) a deklarace (hlaviˇckov´e soubory; koncovka *.h). Typick´a struktura zdrojov´eho k´odu v jazyce C, tak jak ji definuj´ı standardy je zobrazena na obr´azku 6.3. K´od tedy obsahuje ˇc´ast, kterou zpracov´ av´ a preprocesor, deklaraˇcn´ı ˇc´ast a zdrojovou ˇc´ast. Zdrojov´ y k´od se skl´ ad´ a v´ yhradnˇe z funkc´ı (obdoba podprogram˚ u v JSA). Kaˇzd´a funkce je specifikov´ana sv´ ym n´azvem, kter´ y se skl´ ad´ a ze znak˚ u anglick´e abecedy, ˇc´ıslic a podtrˇz´ıtka. Funkce m˚ uˇze obsahovat libovoln´e parametry (vstupn´ı promˇenn´e), a m˚ uˇze tak´e vracet hodnotu libovoln´eho typu. Nem´a-li funkce vstupn´ı parametry, pˇr´ıp. v´ yslednou hodnotu, uˇz´ıv´a se k tomu oznaˇcen´ı void. Tˇelo cel´e funkce je ohraniˇceno p´ arem sloˇzen´ ych z´ avorek. Kaˇzd´a aplikace mus´ı obsahovat hlavn´ı funkci s n´azvem main(), kter´ a se spouˇst´ı jako prvn´ı. Tato funkce vrac´ı hodnotu typu int a zpravidla nem´a ˇz´adn´ y vstupn´ı parametr. Standard jazyka C tak´e definuje tzv. prototypy funkce. Ty popisuj´ı jednak n´azev funkce, d´ ale poˇcet a typy vstupn´ıch argument˚ u a typ n´avratov´e hodnoty dan´e funkce.
48
Mikroprocesorov´a technika a embedded syst´emy
Kaˇzd´a funkce (kromˇe main()) mus´ı m´ıt takto uveden´ y prototyp. Typick´ a struktura programu v C #include
int main( void ){ return( 0 ) ;
instrukce pro preprocessor vˇzdy prvn´ı volan´ a funkce pˇr´ıkazy/povely
}
funkce a(){ }
– – – – –
deklarace pˇriˇrazen´ı vol´ an´ı funkc´ı podm´ınky ...
pˇr´ıkazy/povely
funkce b(){ }
pˇr´ıkazy/povely
Obr´ azek 6.3: Anatomie programu v jazyce C. Dobrou program´ atorskou prax´ı je dodrˇzov´an´ı poˇrad´ı, ve kter´em jsou jednotliv´e ˇc´asti v textu uvedeny. Zdrojov´ y k´ od by tak mˇel vˇzdy zaˇc´ınat direktivami pro pˇrekladaˇc (napˇr. vkl´ad´an´ı pomocn´ ych knihoven), d´ ale uveden´ım prototyp˚ u funkc´ı (ˇcasto se vkl´ad´a do oddˇelen´ ych textov´ ych soubor˚ u s koncovkou *.h – hlaviˇckov´e soubory) a deklarac´ı glob´aln´ıch promˇenn´ ych. Uk´azka struktury zdrojov´eho k´ odu v jazyce C pro mikrokontrol´er AVR je uvedena ve v´ ypise 6.4. Z uveden´eho zdrojov´eho k´ odu jsou tak´e patrn´e z´akladn´ı znaky dobr´eho program´atora, tj. ˇcitelnost k´odu. Ta se vyznaˇcuje pouˇz´ıv´an´ım smyslupln´ ych n´azv˚ u promˇenn´ ych a funkc´ı, psan´ı v´ ystiˇzn´ ych koment´ aˇr˚ u, pouˇz´ıv´ an´ı pr´ azdn´ ych ˇr´adk˚ u pro oddˇelen´ı deklaraˇcn´ı a v´ ykonn´e ˇc´asti funkce a pˇredevˇs´ım pouˇzit´ı jednoho pˇr´ıkazu na jeden ˇr´adek. Pˇrestoˇze jazyk C je deklarov´ an jako free-form form´ at, dodrˇzov´ an´ı zm´ınˇen´ ych pravidel v´ yraznˇe pom´ah´a ˇcitelnosti zdrojov´ ych ˇ k´od˚ u. Pod´ıl´ı-li se na tvorbˇe aplikace v´ıce autor˚ u, je pˇrehlednost k´odu absolutn´ı nutnost´ı. Rada v´ yvojov´ ych firem tak´e definuje kostry sv´ ych zdrojov´ ych k´od˚ u – tzv. framework. Ty obsahuj´ı nejen pevnˇe definovan´e vstupy a v´ ystupy jednotliv´ ych modul˚ u (bezprobl´emov´e propojen´ı jednotliv´ ych ˇc´ast´ı), ale zpravidla tak´e pˇr´ıdavn´e informace, kter´e jsou n´aslednˇe vyuˇz´ıv´any ke tvorbˇe textov´e dokumentace pomoc´ı nˇekter´eho z n´astroj˚ u pro spr´avu softwar˚ u. Nejzn´amˇejˇs´ım je patrnˇe bal´ık n´astroj˚ u doxygen, podporuj´ıc´ı pˇres des´ıtku programovac´ıch jazyk˚ u [Dox11].
6.3
Specifika pˇ rekladaˇ ce GCC-AVR a knihovny AVR Libc
Jak bylo uvedeno, strojov´ y k´ od aplikace z´avis´ı na zvolen´em pˇrekladaˇci, pˇr´ıp. v´ yvojov´em prostˇred´ı, kter´ a dan´e pˇrekladaˇce podporuj´ı. K v´ yvoji aplikac´ı v jazyce C pro 8bitov´e mikrokontrol´ery existuje cel´ a ˇrada n´ astroj˚ u. Navz´ ajem se liˇs´ı m´ırou optimalizace v´ ysledn´eho k´odu, rychlost´ı pˇrekladu a cenou. Jedn´ım z rozˇs´ıˇren´ ych pˇrekladaˇc˚ u je GCC (GNU Compiler Collection) [Gcc09]. Jak n´azev napov´ıd´ a, jedn´ a se o soubor pˇrekl´adac´ıch n´astroj˚ u projektu GNU, kter´ y sdruˇzuje tzv. svobodn´ y software. Dopln´ıme-li pˇrekladaˇc GCC knihovnou, popisuj´ıc´ı strukturu a funkci mikrokontrol´er˚ u AVR, m˚ uˇzeme tento voln´ y n´ astroj vyuˇz´ıt tak´e k v´ yvoji aplikac´ı pro AVR. Pro operaˇcn´ı syst´em Windows je tato kombinace dostupn´ a prostˇrednictv´ım open source projektu s n´azvem WinAVR [Win08]. Tento n´ astroj kromˇe pˇrekladaˇce obsahuje tak´e program´ator, lad´ıc´ı n´astroje a dalˇs´ı funkce. Po nainstalov´ an´ı je vˇse dostupn´e pˇr´ımo z v´ yvojov´eho prostˇred´ı AVR Studio. V prostˇred´ı Linux je moˇzn´e vyuˇz´ıt n´astroje avra pro pˇreklad aplikac´ı z jazyka symbolick´ ych
Fakulta elektrotechniky a komunikaˇcn´ıch technologi´ı VUT v Brnˇe
49
Zdrojov´ y k´ od 6.4: Aplikace pro obsluhu kl´avesnice v jazyce C. 1 2
/∗ H l a v iˇc k o v´e soubory ∗/ #include
// h l a v iˇc k o v y ´ s o u b o r m i k r o k o n t r o l´e r u
/∗ Prototypy f u n k c´ı ∗/ void setup ( void ) ; i n t key_pressed ( void ) ;
// p r o t o t y p f u n k c e s e t u p // p r o t o t y p f u n k c e k e y p r e s s e d
/∗ G l o b a ´ l n´ı promˇe nn´e ∗/ char temp = 0 ;
// d e k l a r a c e 8 b i t o v ´e promˇe nn´e temp
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
/∗ H l a v n´ı f u n k c e ∗/ i n t main ( void ) { setup ( ) ; for ( ; ; ) { i f ( key_pressed ( ) ) { ... } } return ( 1 ) ; }
// v o l ´ a n´ı f u n k c e s e t u p // nekoneˇc n´ a smyˇcka // t ˇe l o podm´ınky
// v y ´ s t u p n´ı hodnota f u n k c e = 1
24 25 26 27 28 29
/∗ Funkce pro n a s t a v e n´ı k o n t r o l n´ıc h r e g i s t r˚ u ∗/ void setup ( void ) { // n a s t a v e n´ı I /O p o r t˚ u ... // t ˇe l o f u n k c e }
30 31 32 33 34 35 36 37
/∗ Funkce pro z j i ˇs t ˇe n´ı s t i s k n u t ´e h o i n t key_pressed ( void ) { // char key ; // ... // return ( key ) ; // }
t l a ˇc´ı t k a ∗/ v r a c´ı k´ o d s t i s k n u t ´e h o t l a ˇc´ı t k a deklarace loka ´ l n´ı promˇe nn´e t ˇe l o f u n k c e na ´vratova ´ hodnota f u n k c e
adres, bal´ıˇcky gcc-avr a binutils-avr pro pˇreklad aplikac´ı z jazyka C, d´ale avr-libc s knihovnami pro AVR a napˇr. avrdude pro naprogramov´an´ı c´ılov´eho mikrokontrol´eru. Pˇri v´ yuce pˇredmˇetu Mikroprocesorov´a technika a embedded syst´emy je v laboratoˇri pouˇz´ıv´ an voln´ y pˇrekladaˇc GCC (GNU Compiler Collection), uzp˚ usoben´ y pro aplikace s AVR (gcc-avr) a voln´e prostˇred´ı AVR Studio. V nˇem je konkr´etn´ı typ mikrokontrol´eru (napˇr. ATmega16) definov´an jiˇz pˇri vytvoˇren´ı projektu a pˇrekladaˇci je pˇred´an jako parametr. Do k´odu se tak vkl´ad´a vˇzdy stejn´ y hlaviˇckov´ y soubor io.h, kter´ y n´aslednˇe odk´aˇze na konkr´etn´ı definiˇcn´ı sou´ bor. V tˇechto souborech jsou jm´ena kontroln´ıch registr˚ u definov´any VELKYMI p´ısmeny (pozor, jazyk C je case sensitive), proto mus´ı b´ yt tato podm´ınka zachov´ana tak´e pˇri tvorbˇe zdrojov´ ych k´od˚ u. V n´ asleduj´ıc´ım textu jsou uvedeny z´akladn´ı pravidla, pˇr´ıp. specifika pro pˇrekladaˇc gcc-avr: plnˇen´ı kontroln´ıch registr˚ u (k´od 6.5), testov´an´ı jednotliv´ ych bit˚ u kontroln´ıch registr˚ u (k´ody 6.6 a 6.7) a pˇredevˇs´ım vyuˇzit´ı pˇreruˇsen´ı. Kaˇzd´ y pˇrekladaˇc pro 8bitov´e mikrokontrol´ery doplˇ nuje standard C o vlastn´ı zp˚ usob definov´an´ı obsluhy pˇreruˇsen´ı. Pro vyuˇzit´ı pˇreruˇsen´ı v jazyce C (a pˇrekladaˇce gcc-avr) je nutn´e vloˇzit do zdrojov´eho k´ odu hlaviˇckov´ y soubor interrupt.h. Nen´ı ovˇsem nutn´e definovat z´asobn´ık, protoˇze to udˇel´ a pˇrekladaˇc automaticky. Rovnˇeˇz nen´ı nutn´e zn´at konkr´etn´ı adresy vektor˚ u
50
Mikroprocesorov´a technika a embedded syst´emy
Zdrojov´ y k´ od 6.5: Plnˇen´ı kontroln´ıch registr˚ u. 1 2 3 4
#include // h l a v iˇc k o v y ´ s o u b o r m i k r o k o n t r o l´e r u ... // smˇe rov´ y r e g i s t r portu B: polovina vy ´ s t u p n´ı , p o l o v i n a v s t u p n´ı DDRD = 0 xF0 ;
5
// n a s t a v e n´ı pˇr e d d ˇe l i ˇc k y 1024 pro ˇc a s o v aˇc 0 TCCR0 |= ( 1<
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
}
Zdrojov´ y k´ od 6.6: Testov´ an´ı hodnoty jednoho bitu v kontroln´ıch registrech. 1 2 3 4 5
// j e − l i b i t ”b” v r e g i s t r u ” r e g ” roven 1 , v y k o n e j n ´ a s l e d u j´ı c´ı k´ od // r e g − l i b o v o l n y ´ ˇr ´ı d i c´ı r e g i s t r i f ( bit_is_set ( reg , b ) ) { ... }
6 7 8 9 10 11
// j e − l i b i t ”b” v r e g i s t r u ” r e g ” roven 0 , v y k o n e j n ´ a s l e d u j´ı c´ı k´ od // r e g − l i b o v o l n y ´ ˇr ´ı d i c´ı r e g i s t r i f ( bit_is_clear ( reg , b ) ) { ... }
Zdrojov´ y k´ od 6.7: Cyklus s testov´ an´ım hodnoty jednoho bitu v kontroln´ıch registrech. 1 2 3 4 5
// opakuj , pokud j e b i t ”b” v r e g i s t r u ” r e g ” roven 1 // r e g − l i b o v o l n y ´ ˇr ´ı d i c´ı r e g i s t r loop_until_bit_is_set ( reg , b ) { ... }
6 7 8 9 10 11
// opakuj , pokud j e b i t ”b” v r e g i s t r u ” r e g ” roven 0 // r e g − l i b o v o l n y ´ ˇr ´ı d i c´ı r e g i s t r loop_until_bit_is_clear ( reg , b ) { ... }
pˇreruˇsen´ı. Obsluhy pˇreruˇsen´ı pˇredstavuj´ı vˇzdy makra s n´azvem ISR (anglicky: Interrupt Service Routine) se vstupn´ım parametrem, kter´ y identifikuje zdroj pˇreruˇsen´ı. Zdroje pˇreruˇsen´ı pro mikrokontrol´er ATmega16 jsou uvedeny v tabulce 6.1. Glob´aln´ı povolen´ı pˇreruˇsen´ı je pro pˇrekladaˇc gcc-avr definov´ ano funkc´ı sei(). Uk´ azka aplikace, vyuˇz´ıvaj´ıc´ı dvoj´ıho pˇreruˇsen´ı: extern´ı zdroj pˇreruˇsen´ı a pˇreruˇsen´ı po dokonˇcen´ı A/D pˇrevodu, je uvedena ve v´ ypise 6.8.
Fakulta elektrotechniky a komunikaˇcn´ıch technologi´ı VUT v Brnˇe
51
Zdrojov´ y k´ od 6.8: Aplikace s pˇreruˇsen´ım v jazyce C. 1 2
#include #include
// h l a v iˇc k o v y ´ s o u b o r m i k r o k o n t r o l´e r u // h l a v iˇc k o v y ´ s o u b o r pro pˇr e r uˇs e n´ı
ISR ( INT0_vect ) { ... }
// o b s l u h a e x t e r n´ıh o pˇr e r uˇs e n i INT0 ; v i z t a b u l k a 6.1 // k´ o d o b s l u h y pˇr e r uˇs e n´ı
ISR ( ADC_vect ) { ... }
// o b s l u h a pˇr e r uˇs e n´ı A/D pˇr e v o d n´ık u ; v i z t a b u l k a 6.1 // k´ o d o b s l u h y pˇr e r uˇs e n´ı
3 4 5 6 7 8 9 10 11 12 13 14 15 16
i n t main ( void ) { ... sei ( ) ; ... }
// k´ o d h l a v n´ı f u n k c e // g l o b a ´ l n´ı p o v o l e n´ı pˇr e r uˇs e n´ı
Tabulka 6.1: Parametry makra obsluhy pˇreruˇsen´ı ISR() pro ATmega16. ˇ C.
Adresa
1
0x0000
2
0x0002
INT0 vect
Extern´ı poˇzadavek na pˇreruˇsen´ı 0.
3
0x0004
INT1 vect
4
0x0006
TIMER2 COMP vect
Extern´ı poˇzadavek na pˇreruˇsen´ı 1. ˇ Casovaˇ c/ˇc´ıtaˇc 2 – shoda komparace.
5
0x0008
TIMER2 OVF vect
6
0x000A
TIMER1 CAPT vect
7
0x000C
TIMER1 COMPA vect
8
0x000E
TIMER1 COMPB vect
9
0x0010
TIMER1 OVF vect
ˇ Casovaˇ c/ˇc´ıtaˇc 2 – pˇreteˇcen´ı. ˇ Casovaˇ c/ˇc´ıtaˇc 1 – zachycen´ı. ˇ Casovaˇ c/ˇc´ıtaˇc 1 – shoda s kompar´atorem A. ˇ Casovaˇc/ˇc´ıtaˇc 1 – shoda s kompar´atorem B. ˇ Casovaˇ c/ˇc´ıtaˇc 1 – pˇreteˇcen´ı.
10
0x0012
TIMER0 OVF vect
ˇ Casovaˇ c/ˇc´ıtaˇc 0 – pˇreteˇcen´ı.
11
0x0014
SPI STC vect
Dokonˇcen´ı s´eriov´eho pˇrenosu SPI.
12
0x0016
USART RXC vect
USART – kompletn´ı pˇr´ıjem dat.
13
0x0018
USART UDRE vect
USART – pr´azdn´ y datov´ y registr.
14
0x001A
USART TXC vect
USART – kompletn´ı vysl´an´ı dat.
15
0x001C
ADC vect
ADC – dokonˇcen´ı A/D pˇrevodu.
16
0x001E
EE RDY vect
EEPROM – komunikace pˇripravena.
17
0x0020
ANA COMP vect
Zmˇena v´ ystupu analogov´eho kompar´atoru.
18
0x0022
TWI vect
Ud´alost na s´eriov´e sbˇernici I2C.
19
0x0024
INT2 vect
20
0x0026
TIMER0 COMP vect
Extern´ı poˇzadavek na pˇreruˇsen´ı 2. ˇ Casovaˇ c/ˇc´ıtaˇc 0 – shoda komparace.
21
0x0028
SPM RDY vect
Uloˇzen´ı do programov´e pamˇeti pˇripraveno.
6.4
Parametr v C (GCC)
Popis pˇ reruˇ sen´ı Extern´ı reset, pˇripojen´ı nap´ajen´ı, . . .
Kombinace jazyka symbolick´ ych adres a C
Programov´ an´ı ve vyˇsˇs´ım jazyce je obecnˇe pohodlnˇejˇs´ı, rychlejˇs´ı a k´od je sn´aze pˇrenositeln´ y mezi platformami. Ovˇsem tak´e zpravidla zab´ır´a v´ıce m´ısta v pamˇeti, proto je i jeho v´ ykon pomalejˇs´ı.
52
Mikroprocesorov´a technika a embedded syst´emy
Pracovn´ı registry 7
0
R8 R9
R22 R23 v´ yst hodnota
{
R24 R25
} } }
vst param 8
vst param 1
vst param 0
Obr´ azek 6.4: Pˇred´ av´ an´ı parametr˚ u/v´ ystupn´ı hodnoty mezi k´odem v jazyce C a JSA pro mikrokontrol´er AVR. Bˇeˇznou prax´ı je tvorba aplikace v jazyce C (plat´ı bezezbytku u v´ıce-bitov´ ych procesor˚ u), pouze exponovan´e ˇc´ asti programu, kde je nutn´e m´ıt pˇrehled o poˇctu instrukc´ı, rychlosti v´ ykonu, ˇci konkr´etn´ı funkci se tvoˇr´ı v JSA. Proto existuj´ı zp˚ usoby jak zdrojov´e k´ody kombinovat. Pro jednoduch´e vkl´ ad´ an´ı instrukc´ı do zdrojov´eho k´odu je moˇzn´e pouˇz´ıt funkci asm() pˇrekladaˇce gcc-avr. Tato funkce m´ a jeden vstupn´ı parametr, kter´ y pˇredstavuje ˇretˇezec instrukc´ı, oddˇelen´ ych \n. Pˇr´ıklad tohoto principu, spoleˇcnˇe s pˇreloˇzen´ ym k´odem je uveden ve v´ ypisu k´odu 6.9. Zdrojov´ y k´ od 6.9: Vkl´ ad´ an´ı instrukc´ı do v´ ysledn´eho k´odu prostˇrednictv´ım funkce asm(). 1 2 3 4 5 6 7
asm ( ”LDI R16 , 255\ n DEC R16\n BRNE PC−1\n” ) ; asm ( ” SEI ” ) ; // pˇr i k o m p i l a c i z d r o j o v´e h o k´ o du s e v l o ˇz´ı n a ´ s l e d u j´ı c´ı i n s t r u k c e : // LDI R16 , 255 // DEC R16 // BRNE PC−1 // SEI
Situace je komplikovanˇejˇs´ı, je-li nutn´e pˇred´avat parametry/hodnoty promˇenn´ ych mezi jazykem C a niˇzˇs´ım jazykem symbolick´ ych adres. Typicky se pˇred´avaj´ı parametry z jazyka C do podprogramu v JSA, kter´ y je zpracuje a n´aslednˇe vrac´ı jedinou hodnotu zpˇet do jazyka C. Pˇred´av´an´ı parametr˚ u mezi funkcemi v JSA a hlavn´ı aplikac´ı v C je moˇzn´e pomoc´ı pˇredem urˇcen´ ych registr˚ u. Pˇrekop´ırov´ an´ı hodnot parametr˚ u/n´avratov´e hodnoty do/z registr˚ u zajiˇst’uje pˇrekladaˇc. Je moˇzn´e tak pouˇz´ıt aˇz devˇet vstupn´ıch parametr˚ u funkce, kde prvn´ı vstupn´ı parametr je vˇzdy v registrov´em p´ aru R25:R24, druh´ y vstupn´ı parametr v registrech R23:R22, atd. Posledn´ı vstupn´ı parametr (dev´ at´ y) je uloˇzen v registrech R9:R8. N´avratovou hodnotu funkce mus´ı program´ator pˇred ukonˇcen´ım rutiny uloˇzit do registrov´eho p´aru R25:R24, jak ukazuje obr´azek 6.4. Pokud je promˇenn´ a, jej´ıˇz hodnota se pˇred´av´a, deklarov´ana jako 8bitov´a, jsou vyuˇzity vˇzdy jen niˇzˇs´ı registry uveden´ ych p´ ar˚ u. Jednoduch´a aplikace kombinuj´ıc´ı funkce v jazyce C i v jazyce symbolick´ ych adres je pops´ ana v pˇr´ıloze B.6.
Fakulta elektrotechniky a komunikaˇcn´ıch technologi´ı VUT v Brnˇe
7
53
Ovl´ ad´ an´ı zobrazovac´ıch zaˇ r´ızen´ı
7.1
Pˇ r´ım´ e propojen´ı s MCU
Z´akladn´ım zobrazovac´ım zaˇr´ızen´ı embedded syst´em˚ u jsou LED diody, pˇr´ıp. 7segmentov´ y LED displej. Pˇr´ım´e propojen´ı LED diod k I/O port˚ um mikrokontrol´er˚ u a jejich ovl´ad´an´ı bylo pops´ ano v kapitole 4.1. Kombinac´ı vˇetˇs´ıho poˇctu LED diod do panelu, p´asku, ˇci do symbol˚ u, mohou vzniknout LED panely, ˇci 7segmentov´e displeje. Uvaˇzujeme-li takov´ yto displej pro jedin´ y symbol s bin´arn´ı teˇckou, je k pˇr´ım´emu propojen´ı s I/O portem mikrokontrol´eru potˇreba vyˇclenit pr´ avˇe 8 pin˚ u (1×7 segment˚ u + 1 teˇcka). Velmi ˇcasto se takov´eho symboly sdruˇzuj´ı do vˇetˇs´ıch displej˚ u. Pˇr´ım´e propojen´ı vˇsech aktivn´ıch prvk˚ u displeje s ˇr´ıdic´ım obvodem by bylo neefektivn´ı. Bˇeˇznˇe se odpov´ıdaj´ıc´ı sv´ıtic´ı segmenty vˇsech symbol˚ u (u displeje se spoleˇcnou anodou – common anode – jsou to katody, u displeje se spoleˇcnou katodou – common cathode – jsou to anody) pˇripojuj´ı na identick´e ˇr´ıdic´ı piny procesoru (pˇr´ıp. jin´eho ˇr´ıdic´ıho obvodu). Pro odliˇsen´ı jednotliv´ ych symbol˚ u zobrazovan´eho ˇretˇezce jsou spoleˇcn´e v´ yvody segment˚ u postupnˇe sp´ın´any tak, ˇze v dan´em okamˇziku je pˇripojen k nap´ ajec´ımu napˇet´ı vˇzdy jen jeden symbol. Na obr´azku 7.1 jsou sp´ınac´ı prvky pˇripojeny na piny PC7 aˇz PC2 (celkem tedy 6 symbol˚ u), zat´ımco jednotliv´e sv´ıtic´ı segmenty jsou pˇripojeny k portu A. Pro n symbol˚ u tedy vyuˇzijeme 8+n v´ ystupn´ıch pin˚ u procesoru. Rychlost sp´ın´ an´ı tranzistor˚ u je v ˇr´ adech des´ıtek milisekund. Pouˇzijeme-li analogii z televizn´ı techniky, sn´ımkov´e frekvenci 50 Hz odpov´ıd´a doba pˇrep´ın´an´ı 20 ms, sn´ımkov´e frekvenci 25 Hz je doba trv´an´ı jednoho sn´ımku 40 ms.
PC7
PC2
PA3
PA3
PA4 A1
PA2
PA4 A1
PA2
PA7
PA5
PA7
PA5
A6
A6
PA0
PA0
Obr´ azek 7.1: Zapojen´ı 7segmentov´eho displeje v laboratoˇri Mikroprocesorov´e techniky; 6 symbol˚ u.
7.2
Znakov´ e LCD displeje
Univerz´aln´ım a nejrozˇs´ıˇrenˇejˇs´ım zobrazovac´ım zaˇr´ızen´ım v embedded aplikac´ıch je LCD znakov´ y displej. Vˇetˇsina znakov´ ych LCD displej˚ u obsahuje ˇr´ıdic´ı obvod HD44780 firmy Hitachi (pˇr´ıp. jeho deriv´at), prostˇrednictv´ım kter´eho je moˇzn´e s displejem komunikovat. Tento ”ˇradiˇc” obsahuje jak znakovou sadu i instrukce pro ovl´ad´an´ı. Komunikace prob´ıh´a pomoc´ı 8 datov´ ych sign´ al˚ u (DB7 − DB0) a je ˇr´ızena 3 ˇr´ıdic´ımi sign´aly (RS, R/W a E). Kaˇzd´ y z ˇr´ıdic´ıch sign´al˚ u m´a sv˚ uj konkr´etn´ı v´ yznam. Sign´ al RS identifikuje, zda se po datov´e sbˇernici pˇren´aˇs´ı instrukce nebo data, kter´a se maj´ı na displeji zobrazit. Plat´ı-li v okamˇziku vzorkov´an´ı, ˇze RS = 0, pak je pˇren´aˇsena instrukce pro ˇr´ıdic´ı obvod (napˇr. pro smaz´an´ı obsahu displeje, ˇci pro inicializaci komunikace; seznam nejpouˇz´ıvanˇejˇs´ıch instrukc´ı je uveden v tabulce 7.1). Je-li RS = 1, pak hodnoty datov´ ych sign´al˚ u odpov´ıdaj´ı symbolu, kter´ y se m´a zobrazit na aktu´aln´ı pozici kurzoru, nebo uloˇzit do pamˇeti displeje. Druh´ y ˇr´ıdic´ı sign´ al R/W je roven 0 v okamˇziku, kdy chceme pˇren´aˇset instrukce/data do y, tj. z displeje ˇcteme data do mikrokontrol´eru. displeje a pro R/W = 1 je pˇrenos dat opaˇcn´ Vzhledem k tomu, ˇze LCD displej je prim´arnˇe urˇcen k zobrazov´an´ı dat a u ´daj˚ u, b´ yv´a tento
54
Mikroprocesorov´a technika a embedded syst´emy
Tabulka 7.1: Vybran´e pˇr´ıkazy HD44780 pro komunikaci s LCD displejem. RS
R/W
DB7 : DB0
Popis instrukce
0
0
0000 0001
Smaz´ an´ı displeje.
0
0
0000 001x
N´ avrat kurzoru na pozici (0,0).
0
0
0000 01IS
Nastaven´ı posuvu kurzoru. I: inkrementace pozice kurzoru. S: posuv displeje.
0
0
0000 1DCB
Zapnut´ı displeje/kurzoru. D: zapnut´ı displeje. C: zobrazen´ı kurzoru. B: blik´an´ı kurzoru.
0
0
001L NFxx
Nastaven´ı rozliˇsen´ı. L=1(0): nastaven´ı 8(4)bitov´e komunikace. N=1(0): dva(jeden) ˇr´adky displeje. F=1(0): velikost fontu 5×10(5×7).
0
0
01 cgram
Nastaven´ı adresy cgram v CGRAM segmentu.
1
0
data
1
1
data
Z´ apis dat do pamˇeti CGRAM. Zobrazen´ı znaku z adresy data. ˇ Cten´ ı dat z pamˇeti CGRAM. ˇ Cten´ı dat z adresy data.
sign´al v nˇekter´ ych aplikac´ıch trvale pˇripojen na u ´roveˇ n log. 0 (zem). Uˇsetˇr´ı se tak jeden ze sign´al˚ u pro komunikaci s displejem. Posledn´ım ˇr´ıdic´ım sign´ alem je povolovac´ı sign´al E (Enable), kter´ y synchronizuje celou komunikaci. Sestupn´ a hrana kladn´eho pulzu tohoto sign´alu urˇcuje okamˇziky vzorkov´an´ı, tj. ˇcten´ı stav˚ u datov´e sbˇernice i zb´ yvaj´ıc´ıch ˇr´ıdic´ıch sign´al˚ u. Pro spolehlivou komunikaci pˇritom plat´ı podm´ınka, ˇze vˇsechny stavy mus´ı b´ yt ust´aleny jiˇz pˇred n´astupnou hranou sign´alu E. Minim´aln´ı doba trv´an´ı kladn´eho pulzu je typicky tˇri takty hodinov´eho sign´alu ˇr´ıdic´ıho mikrokontrol´eru. Ten jedin´ y tak´e m˚ uˇze ovl´ adat sign´ aly na ˇr´ıdic´ı sbˇernici LCD displeje. Existuj´ı dva z´ akladn´ı zp˚ usoby datov´e komunikace mezi LCD a mikrokontrol´erem. Prvn´ı vyuˇz´ıv´a pln´ y poˇcet datov´ ych pin˚ u (oznaˇcov´an jako 8bitov´a komunikace), druh´ y zp˚ usob pak vyˇzaduje poloviˇcn´ı poˇcet datov´ ych vodiˇc˚ u (4bitov´a komunikace). V tomto pˇr´ıpadˇe se u LCD vyuˇz´ıv´a jen horn´ı polovina datov´ ych pin˚ u DB7 aˇz DB4 a pˇrenos dat (kter´a jsou vˇzdy 8bitov´ a) se prov´ad´ı v ˇcasov´em multiplexu: nejprve se vyˇsle horn´ı nibl, n´aslednˇe doln´ı. Obˇe poloviny jsou ˇr´ızeny samostatn´ ym pulzem ˇr´ıdic´ıho sign´alu E. Tento zp˚ usob propojen´ı je vyuˇzit tak´e na v´ yvojov´e desce pro poˇc´ıtaˇcov´ a cviˇcen´ı pˇredmˇetu Mikroprocesorov´a technika a embedded syst´emy (viz obr´ azek 7.2). V´ ybˇer typu komunikace se prov´ad´ı pˇri inicializaci LCD displeje (viz tabulka 7.1). Uk´ azka ˇcasov´ ych pr˚ ubˇeh˚ u na vˇsech vodiˇc´ıch pˇri pˇrenosu instrukce 0xF0 do LCD je zobrazena na obr´ azku 7.3.
Obr´ azek 7.2: Datov´e a ˇr´ıdic´ı sign´ aly LCD displeje pˇri 4bitov´e komunikaci.
Fakulta elektrotechniky a komunikaˇcn´ıch technologi´ı VUT v Brnˇe
RS
55
RS
R/W
R/W 0xF0
0xF
D7 : 0
D7 : 4
E
E
(a)
0x0
(b)
Obr´ azek 7.3: Z´ apis instrukce 0xF0 do LCD displeje prostˇrednictv´ım: (a) 8bitov´e a (b) 4bitov´e komunikace. V´ yhodou LCD displej˚ u s obvodem HD44780 je tak´e pˇr´ıtomnost znakov´e sady ve vnitˇrn´ı pamˇeti ˇradiˇce, tj. program´ ator nemus´ı specifikovat jak´e pixely maj´ı b´ yt sepnuty, chce-li napˇr´ıklad zobrazit znak A. Veˇsker´e znaky jsou zobrazov´any jako matice 5×8 obrazov´ ych bod˚ u (vˇetˇsina znak˚ u je menˇs´ıch). Kromˇe dostupn´ ych znak˚ u (viz obr´azek C.1 v pˇr´ıloze C) je moˇzn´e definovat aˇz 8 uˇzivatelsk´ ych znak˚ u v pamˇet’ov´em segmentu s oznaˇcen´ım CGRAM (Character Generator RAM). Kapacita tohoto segmentu je 64×8 a je namapov´an na poˇc´atek cel´e znakov´e sady. Postup vytvoˇren´ı a pouˇzit´ı vlastn´ıch symbol˚ u je pops´an v poˇc´ıtaˇcov´ ych cviˇcen´ıch pˇredmˇetu. Dle v´ yˇse popsan´eho zp˚ usobu lze naprogramovat komunikaci mezi LCD a mikrokontrol´erem v libovoln´em programovac´ım jazyce. Zˇrejmou v´ yhodou vyˇsˇs´ıch jazyk˚ u je vˇetˇs´ı dostupnost jiˇz hotov´ ych knihoven pro jednotliv´e perif´erie. Pro mikrokontrol´ery AVR tak lze pouˇz´ıt napˇr. knihovnu od Petera Fleuryho [Fle06]. Ta obsahuje zdrojov´ y soubor *.c a hlaviˇckov´ y soubor *.h, kter´e staˇc´ı pˇridat do projektu. Pro pr´aci s displejem pak staˇc´ı volat funkce s pˇr´ıpadn´ ym parametrem. Soupis nejd˚ uleˇzitˇejˇs´ıch funkc´ı z knihovny LCD je uveden v tabulce 7.2. Kostra aplikace zobrazuj´ıc´ı statick´ y text je uvedena ve v´ ypise 7.1. Tabulka 7.2: Soupis vybran´ ych funkc´ı z knihovny pro LCD. N´ azev funkce
Popis funkce
lcd init() ;
Inicializace LCD displeje.
lcd clrscr() ;
Smaz´ an´ı obsahu LCD displeje.
lcd gotoxy( 0, 2 ) ;
Pˇresun kurzoru na pozici (0, 2), tj. 1. sloupec, 3. ˇr´adek.
lcd putc( ’A’ ) ;
Zobrazen´ı znaku A.
lcd puts( "BMPT" ) ;
Zobrazen´ı ˇretˇezce znak˚ u BMPT.
lcd command( 0x40 ) ;
Z´ apis 1bytov´e instrukce 0x40 do LCD displeje.
lcd data( 0x0A ) ;
Z´ apis 1bytov´ ych dat 0x0A do LCD displeje.
56
Mikroprocesorov´a technika a embedded syst´emy
Zdrojov´ y k´ od 7.1: Pouˇzit´ı knihovny v jazyce C pro komunikaci se znakov´ ym LCD displejem. 1 2
#include #include ” l c d h . h”
// h l a v iˇc k o v y ´ s o u b o r m i k r o k o n t r o l´e r u // knihovna pro LCD
i n t main ( void ) {
// h l a v n´ı f u n k c e a p l i k a c e
3 4 5 6 7 8 9
lcd_init ( ) ; lcd_clrscr ( ) ; lcd_gotoxy ( 4 , 1 ) ; lcd_puts ( ” H e l l o LCD” ) ;
// // // //
i n i c i a l i z a c e komunikace s d i s p l e j e m smaz´ a n´ı obsahu d i s p l e j e pˇr e s u n k u r z o r u na p o z i c i 5 . s l o u p c e a 2 . ˇra ´ dku t i s k ˇr e t ˇe z c e na d i s p l e j i
while ( 1 ) ; return ( 1 ) ;
// nekoneˇc n´ a smyˇcka // v y ´ s t u p n´ı hodnota f u n k c e = 1
10 11 12 13
}
Fakulta elektrotechniky a komunikaˇcn´ıch technologi´ı VUT v Brnˇe
8 8.1
57
Zpracov´ an´ı analogov´ ych sign´ al˚ u A/D pˇ revodn´ık
MCU umoˇzn ˇuje zpracov´ avat vstupn´ı analogov´e sign´aly pomoc´ı intern´ıho A/D pˇrevodn´ıku a analogov´eho kompar´ atoru. A/D pˇrevodn´ık (Analog to Digital Converter) pˇrev´ad´ı velikost analogov´eho vstupn´ıho napˇet´ı na nbitovou digit´aln´ı hodnotu. Mikrokontrol´er ATmega16 obsahuje 8kan´alov´ y (piny PA0 aˇz PA7), 10bitov´ y pˇrevodn´ık. Pˇreveden´a bin´arn´ı hodnota je uloˇzena v registrov´em p´ aru ADCH:L (ADC Data Register) ve formˇe dvojkov´eho doplˇ nku a to z toho d˚ uvodu, ˇze pˇrev´adˇen´ a napˇet´ı mohou b´ yt jak kladn´a, tak i z´aporn´a. D˚ uvodem je fakt, ˇze vstupn´ı u ´roveˇ n je br´ana bud’ v˚ uˇci zemi, nebo lze pˇrev´adˇet diferenˇcn´ı hodnotu dvou vstupn´ıch kan´al˚ u a to vˇcetnˇe nastaviteln´eho zes´ılen´ı – pr´ avˇe v tomto pˇr´ıpadˇe m˚ uˇze b´ yt rozd´ıl dvou analogov´ ych hodnot z´aporn´ y. Minim´ aln´ı pˇrev´ adˇen´ a hodnota v˚ uˇci zemi je 0 V a maxim´aln´ı hodnota je d´ana hodnotou referenˇcn´ıho napˇet´ı VREF . Z d˚ uvodu niˇzˇs´ıho odbˇeru je A/D pˇrevodn´ık v MCU vypnut. Pro pouˇzit´ı je tedy nutn´e ho povolit. A/D pˇrevodn´ık m˚ uˇze pracovat v nˇekolika reˇzimech: (a) jednoduch´ y pˇrevod (Single Conversion), kdy se pˇrevede hodnota jedin´eho vzorku, pot´e je pˇrevod zastaven, (b) voln´ y bˇeh (Free Running), kdy je pˇrevod prov´ adˇen neust´ale (jeden je ukonˇcen, druh´ y spuˇstˇen) a (c) automatick´e spouˇstˇen´ı (Auto Triggering). Pˇri tomto reˇzimu zahajuje A/D pˇrevod speci´aln´ı ud´alost (napˇr. extern´ı pˇreruˇsen´ı, zmˇena hodnoty kompar´atoru, pˇreteˇcen´ı ˇcasovaˇce, komparace ˇcasovaˇce/ˇc´ıtaˇce, . . .). Pˇrevod je v tomto pˇr´ıpadˇe zah´ ajen n´abˇeˇznou hranou vybran´eho sign´alu; pokud pˇrijde nov´ a n´abˇeˇzn´a hrana a pˇredchoz´ı pˇrevod jeˇstˇe nen´ı dokonˇcen, pak je ignorov´ana. (Umoˇzn ˇuje zah´ajen´ı pˇrevodu v konstantn´ıch intervalech.) Po dokonˇcen´ı A/D pˇrevodu je v´ ysledek zaps´an do datov´ ych registr˚ u A/D pˇrevodn´ıku, tj. do ADCH:L a souˇcasnˇe je moˇzn´e generovat pˇreruˇsen´ı (pro ATmega16 – vektor 0x01C). Blokov´e sch´ema intern´ıho A/D pˇrevodn´ıku ATmega16 je zobrazeno na obr´azku 8.1. Intern´ı A/D pˇrevodn´ık potˇrebuje pro 10bitov´ y pˇrevod hodinov´ y sign´al o frekvenci fADC ˇ ıdic´ı frekvence m˚ od 50 kHz do 200 kHz. R´ uˇze b´ yt i vˇetˇs´ı, pokud je postaˇcuj´ıc´ı niˇzˇs´ı rozliˇsen´ı neˇz 10bitov´e. Tento hodinov´ y sign´ al je odvozen od ˇr´ıd´ıc´ıho sign´alu j´adra mikrokontrol´eru fCP U s pouˇzit´ım pˇreddˇeliˇcky o definovan´ ych hodnot´ach 2, 4, 8, 16, 32, 64 a 128. Doba dokonˇcen´ı A/D pˇrevodu z´ avis´ı na zvolen´em reˇzimu, pˇriˇcemˇz pˇrevod prvn´ı hodnoty trv´a d´ele neˇz vˇsechny n´asleduj´ıc´ı – je nutn´e prov´est inicializaci vnitˇrn´ıch obvod˚ u jednotky. Celkov´a doba pˇrevodu se skl´ad´a z doby navzorkov´ an´ı analogov´eho sign´alu a samotn´eho pˇrevodu, vˇcetnˇe uloˇzen´ı do datov´ ych registr˚ u. Navzorkov´ an´ı prvn´ıho vzorku vstupn´ıho sign´alu (sample & hold) trv´a pr´ avˇe 13,5 A/D cykl˚ u a n´ asledn´ y pˇrevod potˇrebuje dalˇs´ıch 11,5 takt˚ u. Dokonˇcen´ı prvn´ıho pˇrevodu vˇcetnˇe inicializace analogov´ ych obvod˚ u tak trv´a 25 hodinov´ ych cykl˚ u A/D pˇrevodn´ıku, jak naznaˇcuje obr´ azek 8.2. Navzorkov´ an´ı vˇsech n´ asleduj´ıc´ıch vzork˚ u trv´a uˇz jen 1,5 cykl˚ u, tj. cel´ y proces konverze hodnoty na bin´ arn´ı ˇc´ıslo trv´ a pr´ avˇe 13 cykl˚ u, jak naznaˇcuje obr´azek 8.3. Uvaˇzujeme-li doporuˇcen´ y rozsah frekvenc´ı fADC , vypl´ yv´ a n´ am ˇze maxim´aln´ı vzorkovac´ı frekvence jednoho kan´alu je 3,8 kS/s (fADCmin = 50 kHz) a 15,3 kS/s pˇri maxim´aln´ı frekvenci fADCmax = 200 kHz. Pˇri respektov´an´ı pomˇeru mezi vzorkovac´ı a maxim´aln´ı pouˇzitou frekvenc´ı vstupn´ıho analogov´eho sign´ alu zjist´ıme, ˇze intern´ı A/D pˇrevodn´ık mikrokontrol´eru ATmega16 lze s u ´spˇechem pouˇz´ıt pro pˇrevod ˇreˇcov´eho sign´ alu, pˇr´ıp. frekvenˇcnˇe omezen´eho sign´alu hudebn´ıho. Z vnitˇrn´ıho uspoˇr´ ad´ an´ı A/D pˇrevodn´ıku (obr´azek 8.1) plyne, ˇze v´ ybˇer kan´alu, jehoˇz analogov´ y sign´ al se bude pˇrev´ adˇet, zprostˇredkuje kontroln´ı registr ADMUX (ADC Multiplexer Selection Register). (Tento registr tak´e specifikuje referenˇcn´ı napˇet´ı pˇrevodn´ıku.) Chceme-li vyuˇz´ıvat intern´ı A/D pˇrevodn´ık k pˇrevodu sign´al˚ u z v´ıce odliˇsn´ ych zdroj˚ u/vodiˇc˚ u, je nutn´e pomoc´ı tohoto registru postupnˇe dan´e kan´aly pˇrep´ınat/stˇr´ıdat. Necht’ aplikace obsahuje tˇr´ıos´ y akcelerometr s analogov´ ym v´ ystupem; napˇr. MMA7361 firmy Freescale. Tento integrovan´ y obvod umoˇzn ˇuje vyhodnocovat zrychlen´ı (vˇcetnˇe gravitaˇcn´ıho)
58
Mikroprocesorov´a technika a embedded syst´emy
Figure 98. Analog to Digital Converter Block Schematic ADC CONVERSION COMPLETE IRQ
INTERRUPT FLAGS ADTS[2:0]
0
TRIGGER SELECT
ADC[9:0]
ADC DATA REGISTER (ADCH/ADCL) ADPS0
ADPS1
ADIF
ADPS2
ADEN
ADSC
ADATE
MUX1
15
ADC CTRL. & STATUS REGISTER (ADCSRA) MUX0
MUX3
MUX2
MUX4
ADLAR
REFS1
REFS0
ADC MULTIPLEXER SELECT (ADMUX)
ADIE
ADIF
8-BIT DATA BUS
AVCC
PRESCALER START
GAIN SELECTION
CHANNEL SELECTION
MUX DECODER
CONVERSION LOGIC
INTERNAL 2.56V REFERENCE
SAMPLE & HOLD COMPARATOR
AREF
10-BIT DAC
+
GND
BANDGAP REFERENCE ADC7
SINGLE ENDED / DIFFERENTIAL SELECTION ADC6 ADC5
ADC MULTIPLEXER OUTPUT
POS. INPUT MUX
ADC4 ADC3 +
ADC2
GAIN AMPLIFIER
ADC1 ADC0
NEG. INPUT MUX
The ADC converts an analog input voltage to a 10-bit digital value through successive Obr´ azek 8.1: Blokov´e sch´ema intern´ıho A/D pˇrevodn´ıku mikrokontrol´eru ATmega16 (pˇrevzato approximation. The minimum value represents GND and the maximum value represents zthe [Atm16]). voltage on the AREF pin minus 1 LSB. Optionally, AVCC or an internal 2.56V reference voltage may be connected to the AREF pin by writing to the REFSn bits in the ADMUX Register. The internal voltage reference may thus be decoupled by an external capacitor at the AREF pin to improve noise immunity.
ve tˇrech, na sobˇe kolm´ ych smˇerech. Velikost napˇet´ı na jednotliv´ ych v´ ystupech koresponduje The analog input channel and differential gain are selected by writing to the MUX bits in s ADMUX. velikost´ ı zrychlen´ ı v dan´ e m smˇ e ru. Chceme-li tyto hodnoty vyhodnocovat v mikrokontrol´eru Any of the ADC input pins, as well as GND and a fixed bandgap voltage reference, can be selected singlepˇ ended inputs thenutn´ ADC. eA selection input pins pomoc´ ı intern´ ıho as A/D revodn´ ıku,toje prov´adˇeoft ADC vzorkov´ an´ı tˇr´ı kan´al˚ u v ˇcasov´em mulcan be selected as positive and negative inputs to the differential gain amplifier. tiplexu. Nejprve se v registru ADMUX nastav´ı prvn´ı kan´al (napˇr. v ose x), spust´ı se A/D pˇrevod are selected, differential gainStatus stage amplifies the voltage (vIf differential registru channels ADCSRA – ADCtheControl and Register A) podif-jehoˇz dokonˇcen´ı se spust´ı obference between the selected input channel pair by the selected gain factor. This sluha pˇreruˇsen´ı. V t´eto obsluze je moˇzn´e pˇrevedenou hodnotu d´ale zpracov´avat, pˇredevˇs´ım je ale nutn´e zamˇenit vstupn´ı kan´ al (pomoc´ı ADMUX), zah´ajit pˇrevod, atd. Zdrojov´ y k´od takov´eto aplikace je uveden v pˇr´ıloze B.7. Tmega16(L) Jak jiˇz bylo uvedeno, nbitov´ y jednoduch´ y A/D pˇrevod konvertuje vstupn´ı napˇet´ı line´alnˇe 2466M–AVR–04/06 mezi GN D a VREF v 2n kroc´ıch (tj. vyuˇz´ıv´a hladiny 0 aˇz 2n −1). Mezi pˇrevedenou hodnotou a vstupn´ım napˇet´ım plat´ı pro jednoduch´ y pˇrevod n´asleduj´ıc´ı vztah: ADCH:L =
VIN · (2n − 1), VREF
(8.1)
kde VIN pˇredstavuje pˇrev´ adˇenou hodnotu napˇet´ı na zvolen´em vstupn´ım pinu a VREF je zvolen´e referenˇcn´ı napˇet´ı. Pro diferenˇcn´ı pˇrevod plat´ı vztah: ADCH:L =
VP OS − VN EG · (2n−1 − 1) · GAIN, VREF
(8.2)
source signal. Three additional CPU clock cycles are used for synchronization logic. When using Differential mode, along with Auto triggering from a source other than the ADC Conversion Complete, each conversion will require 25 ADC clocks. This is because the ADC must be disabled and re-enabled after every conversion. In Free Running mode, a new conversion will be started immediately after the conver-
Fakulta elektrotechniky a komunikaˇ cn´ıch technologi´ ı VUT vtimes, Brnˇesee sion completes, while ADSC remains high. For a summary of conversion
59
Table 81. Figure 101. ADC Timing Diagram, First Conversion (Single Conversion Mode) Next Conversion
First Conversion
Cycle Number
1
2
12
13
14
16
15
17
18
19
20
21
22
23
24
25
1
2
3
ADC Clock ADEN ADSC ADIF ADCH
MSB of Result
ADCL
LSB of Result
MUX and REFS Update
Conversion Complete
Sample & Hold
MUX and REFS Update
Obr´ azek 8.2: Doba pˇrevodu prvn´ıho vzorku A/D pˇrevodn´ıku (pˇrevzato z [Atm16]). Figure 102. ADC Timing Diagram, Single Conversion One Conversion
Cycle Number
1
2
3
4
5
6
7
8
9
Next Conversion 10
11
12
13
1
2
3
ADC Clock ADSC ADIF
4/06
ADCH
MSB of Result
ADCL
LSB of Result Sample & Hold MUX and REFS Update
Conversion Complete
209
MUX and REFS Update
Figure 103. ADC Timing Diagram, Auto Triggered Conversion
Obr´ azek 8.3: Doba pˇrevodu Onedruh´ eho a n´asleduj´ıc´ıch vzork˚ u A/D pˇrevodn´ıku (pˇrevzato Conversion Next Conversion z Cycle [Atm16]). 2 3 4 5 6 7 8 1 10 11 12 13 9 1 2 Number ADC Clock Trigger Source kde VP OS je napˇet´ı na neinvertuj´ıc´ım vstupn´ım pinu, VN EG je napˇet´ı na invertuj´ıc´ım vstupn´ım ADATE pinu (viz blokov´e sch´ema A/D pˇrevodn´ıku na obr´azku 8.1) a GAIN pˇredstavuje zvolen´e zes´ılen´ı ADIF (1, 10, 200×). V´ ysledek je reprezentov´an ve dvojkov´ em doplˇ nku, tj. pro 10bitov´e vyj´adˇren´ı se ADCH MSB of Result jedn´ a o hodnoty od −512 do +511. ADCL LSB of Result Referenˇcn´ı napˇet´ı, Sample kter´ e figuruje ve vztaz´ıch (8.1) a (8.2) lze vybrat z n´asleduj´ıc´ıch moˇznost´ı: Prescaler & Hold Conversion Prescaler Reset Complete (a) hodnota napˇ e t´ ı na pinu mikrokontrol´ e ru AREF, (b) u ´roveˇ n nap´ajec´ıho napˇet´ı na pinu Reset MUX and REFS Update AVCC, nebo (c) vnitˇrn´ı zdroj reference o hodnotˇe 2,56 V. V´ ybˇer se prov´ad´ı prostˇrednictv´ım bit˚ u REFS1:0 v kontroln´ ADMUX. Podrobnˇeji o intern´ım A/D pˇrevodn´ıku mikroFigure 104. ADC Timing Diagram,ım Freeregistru Running Conversion Conversion Conversion kontrol´eru ATmega16Onelze zjistit vNextkatalogov´ em listu [Atm16].
Cycle Number
8.2
11
12
13
1
2
3
4
Analogov´ y kompar´ ator ADC Clock
Dalˇs´ı moˇznost´ ı jak snadno zpˇr´ıstupnit analogov´e sign´aly pro mikrokontrol´ery je analogov´ y komADSC par´ator (Analog Comparator). Stejnˇ e jako A/D pˇ r evodn´ ık, je i kompar´ a tor bˇ e ˇ z nou perif´ eri´ı ADIF vˇetˇsiny 8bitov´ ych mikrokontrol´er˚ u. Funkce kompar´atoru je porovn´avat analogovou hodnotu na MSB of Result neinvertovan´eADCH m vstupu AIN0 s hodnotou na vstupu invertovan´em AIN1 (u ATmega16 jsou of Result to piny piny ADCL PB2 a PB3). PokudLSBplat´ ı, ˇze u ´roveˇ n napˇet´ı AIN0 > AIN1, v´ ystup kompar´atoru ACO = 1 (Analog Comparator Output). (Synchronizace v´ ystupu kompar´atoru a ACO bitu trv´ a Sample & Hold Conversion MUX and r REFS Complete u AVR 1 aˇz 2 takty j´ adra MCU.) Samozˇ ejmost´ı je generov´an´ı pˇreruˇsen´ı pˇri pˇreklopen´ı komUpdate par´atoru z 1→0, z 0→1, nebo pˇri libovoln´e zmˇenˇe v´ ystupn´ı hodnoty kompar´atoru. Vnitˇrn´ı uspoˇr´ad´an´ı analogov´eho kompar´ atoru mikrokontrol´eru ATmega16 je zobrazeno na obr´azku 8.4. Z obr´azku je patrn´e, ˇze analogov´ y kompar´ator umoˇzn ˇuje kromˇe porovn´av´an´ı dvou vstupn´ıch sign´al˚ u z pin˚ u PB2 (AIN0) a PB3 (AIN1), pˇripojen´ı tak´e jin´ ych sign´al˚ u (hodnot). Pro neinverATmega16(L) 2466M–AVR–04/06
omparator
The Analog Comparator compares the input values on the positive pin AIN0 and negative pin AIN1. When the voltage on the positive pin AIN0 is higher than the voltage on the negative pin AIN1, the Analog Comparator Output, ACO, is set. The comparator’s output can be set to trigger the Timer/Counter1 Input Capture function. In addition, the comparator can trigger a separate interrupt, exclusive to the Analog Comparator. The 60 can select Interrupt triggering on comparator output rise, fall or toggle. Mikroprocesorov´ a user A block diagram of the comparator and its surrounding logic is shown in Figure 97.
technika a embedded syst´emy
Figure 97. Analog Comparator Block Diagram(2) BANDGAP REFERENCE ACBG
ACME ADEN ADC MULTIPLEXER OUTPUT (1)
Notes:
See Table 80 on page 204. Obr´ a1. zek 8.4: Blokov´e sch´ema analogov´eho kompar´atoru mikrokontrol´eru ATmega16 (pˇrevzato 2. Refer to Figure 1 on page 2 and Table 25 on page 58 for Analog Comparator pin z [Atm16]). placement.
ion IO Register – Bit
7
6
5
4
3
2
1
0
ADTS2 jeADTS1 ADTS0 – ACME PSR2 PSR10 SFIOR tovan´ y vstup to vnitˇ rn´ı zdroj napˇ et’ov´ePUDu ´rovnˇ e o velikosti 1,23 V a pro invertovan´ y vstup lze Read/Write R/W R/W R/W R R/W R/W R/W R/W pˇ r ipojit libovoln´ y vstupn´ ı kan´ a l A/D pˇ r evodn´ ıku, tj. sign´ a ly z pin˚ u PA7:0 (ADC7:0). (Konkr´ etn´ı Initial Value 0 0 0 0 0 0 0 0 vstup nastavuje multiplexer A/D pˇrevodn´ıku.) • BitZ 3 –hlediska ACME: Analog Comparator programov´ an´ı Multiplexer jsou d˚ uleˇzEnable it´e kontroln´ı registry, prostˇrednictv´ım kter´ ych lze perif´erii When this bitADSR is written one and the ADC is switched off (ADEN in ADCSRA is ovl´adat: – logic Analog Comparator Control and Status Register (napˇr. zapnut´ı perif´erie, pozero), the ADC multiplexer selects the negative input to the Analog Comparator. When volen´ reruˇslogic en´ı,zero, . . .), pˇr´ıp. SFIOR – negative Specialinput Function IO Register. Detaily o pouˇzit´ı analogov´eho this bit isı pˇ written AIN1 is applied to the of the Analog Comparator. For a a detailed description this bit, seee “Analog Comparator Input” on kompar´ toru jsou opˇetofdostupn´ v katalogov´ em Multiplexed listu [Atm16].
page 204.
Tmega16(L) 2466M–AVR–04/06
Fakulta elektrotechniky a komunikaˇcn´ıch technologi´ı VUT v Brnˇe
9 9.1
61
ˇ ızen´ı s´ R´ eriov´ e komunikace Synchronn´ı a asynchronn´ı komunikace
S´eriov´a komunikace umoˇzn ˇuje pˇrenos dat po jednom, pˇr´ıp. po nˇekolika m´alo vodiˇc´ıch v ˇcasov´em multiplexu. V s´eriov´e komunikaci mezi mikrokontrol´erem a I/O zaˇr´ızen´ım se pouˇz´ıvaj´ı dva typy pˇrenos˚ u: asynchronn´ı a synchronn´ı. Pˇri asynchronn´ı komunikaci m˚ uˇze vys´ılaˇc pos´ılat data v libovoln´em okamˇziku s libovolnˇe dlouhou pauzou mezi vyslan´ ymi daty (tj. doba, kdy vys´ılaˇc nevys´ıl´a nen´ı pˇredem zn´ ama). D´ ale plat´ı, ˇze hodinov´ y sign´al pˇrij´ımaˇce nen´ı pˇren´aˇsen spoleˇcnˇe s daty smˇerem k pˇrij´ımaˇci. U synchronn´ı komunikace vys´ılaˇc nepˇretrˇzitˇe vys´ıl´a data, kter´a jsou obvykle pos´ıl´ ana ve skupin´ ach (bloc´ıch). Takov´eto bloky jsou oddˇeleny synchronizaˇcn´ımi symboly, kter´e slouˇz´ı k synchronizaci pˇrij´ımaˇce a t´ım ke spr´avn´e interpretaci vyslan´ ych dat. V situaci, kdy vys´ılaˇc nem´ a k dispozici ˇz´ adn´ a data jsou vys´ıl´any jen synchronizaˇcn´ı symboly. Vˇetˇsina s´eriov´ ych pˇrenos˚ u dat prob´ıh´a v mikroprocesorov´e technice asynchronnˇe, kdy je datov´ y sign´al rozdˇelen na ˇcasov´e intervaly pro jednotliv´e bity (TB – bit time). V tˇechto intervalech je sign´al ust´ alen v hodnotˇe log. 1 nebo log. 0 a ke zmˇenˇe stavu m˚ uˇze doj´ıt pouze na zaˇc´atku nebo na konci ˇcasov´eho intervalu TB . Pˇri asynchronn´ı komunikaci mezi dvˇema zaˇr´ızen´ımi je struktura pˇren´aˇsen´eho sign´ alu pevnˇe d´ ana, tj. tvoˇr´ı r´amec, kter´ y se skl´ad´a ze start bitu, 5 aˇz 9 datov´ ych bit˚ u (v poˇrad´ı od LSB k MSB), voliteln´eho paritn´ıho bit a stop bitu(˚ u). Stav s´eriov´e linky je v klidov´em stavu ve vysok´e u ´rovni. Start bit je tak vˇzdy reprezentov´ an stavem log. 0, voliteln´ y paritn´ı bit pˇredstavuje snadnou detekci jednoho chybn´eho bitu. Pouˇz´ıv´ a se jak lich´ a (PO , Odd), tak i sud´ a (PE , Even) parita, kter´a doplˇ nuje datov´e slovo na lich´ y/sud´ y poˇcet bit˚ u s hodnotou 1; paritu lze vypoˇc´ıst dle rovnic (9.1). PO = dM SB ⊕ . . . ⊕ dLSB ⊕ 1 a PE = dM SB ⊕ . . . ⊕ dLSB ⊕ 0,
(9.1)
kde dM SB pˇredstavuje hodnotu nejv´ yznamnˇejˇs´ıho bitu, dLSB hodnotu nejm´enˇe v´ yznamn´eho bitu a operace ⊕ reprezentuje exkluzivn´ı souˇcet (modulo 2). Stop bit je vˇzdy ve stavu log. 1 a nejˇcastˇeji se pouˇz´ıv´a jeden nebo dva, v´ yjimeˇcnˇe vˇsak i 1,5 bitu, kdy je doba trv´ an´ı stop bitu 1,5·TB . M´od komunikace se ˇcasto ud´av´a symbolicky, napˇr. 7E2 (7 datov´ ych bit˚ u, sud´ a parita, 2 stop bity), 8N1 (8 datov´ ych bit˚ u, bez parity, 1 stop bit), apod. Pˇr´ıklad ˇcasov´eho pr˚ ubˇehu asynchronn´ıho r´amce s m´odem 7E2 pro pˇrenos datov´eho slova 0x4B je zobrazen na obr´ azku 9.1.
0
1
1
neˇcinn´ y stav start LSB
0
1
0
0
1
0
1
MSB parita stop
1 stop neˇcinn´ y stav
TB
Obr´ azek 9.1: Struktura asynchronn´ıho r´amce pro m´od 7E2 a pˇrenos datov´eho slova 0x4B. M´ıra pˇrenosu dat je charakterizov´ana (a) symbolovou rychlost´ı, kter´a identifikuje jak ˇcasto m˚ uˇze doch´ azet ke zmˇenˇe datov´eho sign´alu pˇri s´eriov´e komunikaci SR = Cas mezi1 prechody [Bd] a (b) bitovou rychlost´ı, kter´ a ud´ av´ a frekvenci s jakou jsou pˇren´aˇseny jednotliv´e bity BR = 1 ı s´eriov´e komunikace je symbolov´a rychlost ˇc´ıselnˇe rovna bitov´e rychlosti TB [bit/s]. U asynchronn´ (jsou ale vyj´ adˇreny v odliˇsn´ ych jednotk´ach).
62
Mikroprocesorov´a technika a embedded syst´emy
Obr´ azek 9.2: Princip paralelnˇe/s´eriov´eho pˇrevodn´ıku.
Obr´ azek 9.3: Vnitˇrn´ı struktura jednotky UART.
9.2
Jednotka UART
Aritmeticko/logick´e jednotky mikroprocesor˚ u pracuj´ı vˇzdy s operandy s koneˇcn´ ym poˇctem bit˚ u. S t´ım souvis´ı tak´e ˇs´ıˇrka datov´e sbˇernice. Chceme-li tedy takov´a data vys´ılat ˇci pˇrij´ımat s´eriovou podobou, mus´ı ˇc´ıslicov´ y syst´em obsahovat pˇrevodn´ık s paralelnˇe s´eriovou a s´eriovˇe paraleln´ı ´ funkc´ı. Ukolem takov´eho pˇrevodn´ıku je (a) naˇc´ıst nbitov´a paraleln´ı data z datov´e sbˇernice mikrokontrol´eru, pˇrev´est je na s´eriov´e slovo a poslat do s´eriov´eho zaˇr´ızen´ı a (b) naˇc´ıst s´eriov´a data ze s´eriov´eho I/O zaˇr´ızen´ı, konvertovat je na nbitov´a a pˇren´est do mikrokontrol´eru pomoc´ı datov´e sbˇernice, jak naznaˇcuje obr´ azek 9.2. Takov´ yto pˇrevod lze prov´adˇet pomoc´ı zaˇr´ızen´ı zvan´e Univerz´aln´ı asynchronn´ı pˇrij´ımaˇc/vys´ılaˇc (UART – Universal Asynchronous Receiver Transmitter) – viz obr´azek 9.3. Z obr´azku je patrn´e, ˇze vˇsechna UART zaˇr´ızen´ı obsahuj´ı n´asleduj´ıc´ı z´akladn´ı ˇc´asti: (a) s´eriov´ y pˇrij´ımaˇc dat (Rx), kter´ y pˇrev´ ad´ı pˇrijat´a s´eriov´a data do paraleln´ı reprezentace a ukl´ad´a je v pˇrij´ımac´ım datov´em registru RxDR pro n´asledn´ y pˇrenos do mikrokontrol´eru; (b) s´eriov´ y vys´ılaˇc (Tx), jehoˇz u ´kolem je pˇrij´ımat paraleln´ı datov´a slova z vys´ılac´ıho datov´eho registru TxDR, pˇrev´est je do s´eriov´e podoby k n´ asledn´emu pˇrenosu; (c) obousmˇern´ y buffer datov´e sbˇernice, kter´ y zprostˇredkov´ av´ a pˇrenos paraleln´ıch dat od MCU do TxDR a od RxDR do mikrokontrol´eru prostˇrednictv´ım datov´e sbˇernice a (d) odvozen´e hodinov´e sign´aly RxCLK a TxCLK pro ˇcasov´an´ı pˇrij´ımac´ı a vys´ılac´ı ˇc´ asti jednotky. Proces vys´ıl´ an´ı dat pomoc´ı UART je n´asleduj´ıc´ı. Paraleln´ı data jsou posl´ana do vys´ılac´ıho datov´eho registru TxDR, kde ˇr´ıdic´ı logika vys´ılaˇce Tx dopln´ı tato data start bitem, pˇr´ıpadn´ ym paritn´ım bitem a poˇzadovan´ ym poˇctem stop bit˚ u. Cel´ y r´amec je n´aslednˇe um´ıstˇen do posuvn´eho vys´ılac´ıho registru. Ten je vys´ıl´ an zvolenou symbolovou rychlost´ı, kter´a je ˇr´ızena hodinov´ ym sign´alem TxCLK. T´ım je vytvoˇren datov´ y v´ ystup TxDATA (viz obr´azek 9.4).
Fakulta elektrotechniky a komunikaˇcn´ıch technologi´ı VUT v Brnˇe
63
Obr´ azek 9.4: Proces vys´ıl´ an´ı dat pomoc´ı jednotky UART.
Obr´ azek 9.5: Proces pˇr´ıjmu dat pomoc´ı jednotky UART.
Proces pˇr´ıjmu dat pomoc´ı jednotky UART je obdobn´ y. Pˇr´ıjem s´eriov´ ych dat je zah´ ajen zmˇenou stavu na lince RxDATA. Start bit je vˇzdy reprezentov´an pˇrechodem ze stavu log. 1 do stavu log. 0. N´ asleduj´ıc´ı bitov´e hodnoty jsou postupnˇe uloˇzeny v posuvn´em registru, pˇriˇcemˇz rychlost posuvu je definov´ ana hodinov´ ym sign´alem RxCLK (viz n´ıˇze). Po naˇcten´ı cel´eho slova jsou datov´e bity paralelnˇe pˇresunuty do datov´eho registru RxDR, kter´ y m˚ uˇze b´ yt naˇcten do MCU, jak napov´ıd´ a obr´ azek 9.5. Jak bylo uvedeno v u ´vodu t´eto kapitoly, podstatou asynchronn´ıho pˇrenosu je absence synchronizaˇcn´ıch znaˇcek (pˇr´ıp. sign´ al˚ u) v pˇren´aˇsen´em datov´em toku. Korektn´ı okamˇziky vzorkov´ an´ı na pˇrij´ımac´ı lince, mus´ı jednotka UART zjiˇst’ovat odliˇsnˇe. Pro usnadnˇen´ı synchronizace pˇrij´ımaˇce s´eriov´ ych dat, pouˇz´ıv´ a UART pomocn´ y hodinov´ y sign´al RxCLK s podstatnˇe vyˇsˇs´ı frekvenc´ı neˇz je symbolov´ a rychlost datov´eho toku (zpravidla je jeho frekvence 16× vyˇsˇs´ı). Po prvn´ı sestupn´e hranˇe pˇrijat´eho sign´ alu, Rx ˇcek´ a pr´ avˇe 8 period hodinov´eho sign´alu RxCLK. N´aslednˇe je testov´ an stav na vstupn´ı lince, zda je st´ ale ve stavu log. 0, tj. ˇze se nejedn´a o faleˇsn´ y start (zp˚ usoben´ y kr´atk´ ym parazitn´ım impulzem). Pakliˇze je tato podm´ınka splnˇena, vstupn´ı sign´al je d´ale vzorkov´an kaˇzd´ ych 16 period hodinov´eho sign´alu RxCLK, tj. pˇresnˇe uprostˇred doby trv´an´ı bitov´e periody. Navzorkovan´e hodnoty jsou pˇresunuty do posuvn´eho registru pˇrij´ımaˇce, jehoˇz pˇresun je ˇr´ızen n´abˇeˇznou hranou hodinov´e sign´ alu pˇrij´ımaˇce odvozen´eho od RxCLK (dˇeliˇcka kmitoˇctu 16). Intern´ı logika pˇrij´ımaˇce nakonec kontroluje poˇcet stop bit˚ u v pˇrijat´em r´amci. Pokud poˇcet stop bit˚ u nesouhlas´ı se zvolenou strukturou, je UART jednotkou signalizov´ana chyba r´amce (Framing Error Flag). D´ ale obvod UART vypoˇcte pˇr´ıpadnou paritu pˇrijat´eho datov´eho slova, kter´ a je porovn´ana s hodnotou pˇrijatou. Tak´e tato kontrola m˚ uˇze generovat informaci o chybˇe, tentokr´ at v podobˇe Parity Error Flag. Jsou-li pˇrijat´e bity pˇresunuty do datov´eho registru pˇrij´ımaˇce RxDR, je moˇzn´e pˇrij´ımat dalˇs´ı data do vstupn´ıho posuvn´eho registru. Tato data jiˇz ale nejsou pˇresunuta do RxDR, pokud jeho p˚ uvodn´ı obsah nebyl pˇrenesen do MCU. Pokud pˇrij´ımaˇc v tomto okamˇziku zachyt´ı dalˇs´ı r´ amec, je obsah v posuvn´em registru pˇreps´an (tj. dojde ke ztr´atˇe 2. datov´eho slova). To je n´aslednˇe signalizov´ ano pˇr´ıznakem ztr´aty dat (OverRun Error Flag). Vˇsechny jmenovan´e chyby jsou signalizov´ any pˇr´ısluˇsn´ ymi pˇr´ıznakov´ ymi bity v ˇr´ıdic´ıch registrech jednotky UART.
64
Mikroprocesorov´a technika a embedded syst´emy
Obr´ azek 9.6: Synchronizace pˇrij´ımaˇce UART (pˇrevzato z [Toc03]).
Obr´ azek 9.7: Napˇet’ov´e u ´rovnˇe asynchronn´ıho r´amce u RS-232 a TTL.
Princip ˇcasov´e synchronizace pˇrij´ımaˇce vych´az´ı z pˇredpokladu, ˇze jak struktura datov´eho r´amce, tak i symbolov´ a rychlost je totoˇzn´a s vys´ılaˇcem a je pˇredem zn´ama. Popsan´ y princip synchronizace pˇrij´ımaˇce je graficky zn´ azornˇen na obr´azku 9.6.
9.3
S´ eriov´ e rozhran´ı RS-232
Rozˇs´ıˇrenou aplikac´ı UART je s´eriov´ a komunikace pomoc´ı rozhran´ı RS-232 (s´eriov´ y COM port poˇc´ıtaˇce). Na rozd´ıl od UART, obsahuje RS-232 bipol´arn´ı, inverzn´ı reprezentaci logick´ ych u ´rovn´ı. To znamen´a, ˇze log. 1 je reprezentov´ ana z´aporn´ ym napˇet´ım menˇs´ım neˇz −3 V a log. 0 je reprezentov´ana kladn´ ym napˇet´ım vˇetˇs´ım neˇz +3 V. V poˇc´ıtaˇcov´e technice se pro RS-232 vyuˇz´ıv´ a u ´rovn´ı ±12 V z d˚ uvodu vyˇsˇs´ı odolnost proti ruˇsen´ı. Napˇet’ov´e p´asmo kolem 0 V je zak´az´ano, ˇ tj. v pˇr´ıpadˇe pˇreruˇsen´ı vodiˇce, lze tuto chybu snadno odhalit. Casov´ e pr˚ ubˇehy obou zp˚ usob˚ u asynchronn´ı komunikace (UART i RS-232) v m´odu 8N1 jsou zn´azornˇeny na obr´azku 9.7. Odliˇsn´e napˇet’ov´e u ´rovnˇe UART a RS-232 vyluˇcuj´ı pˇr´ım´e propojen´ı obou rozhran´ı. Proto se ˇcasto pouˇz´ıvaj´ı integrovan´e pˇrevodn´ıky jako napˇr. MAX232 (firmy Maxim, obr´azek 9.8), kter´ y konvertuje TTL u ´rovnˇe na +3,15 V pro log. 0 a log. 1 na −3,15 V, d´ale lze pouˇz´ıt ADM232 (Analog Devices), ˇci jin´e.
Fakulta elektrotechniky a komunikaˇ cn´ıch technologi´ı VUT v Brnˇe +5V-Powered, Multichannel RS-232
65
Drivers/Receivers MAX220–MAX249
+5V INPUT
C3
TOP VIEW C5 C1+ 1
1
16 VCC
V+ 2
C1
15 GND
C1- 3
14 T1OUT
MAX220 MAX232 MAX232A
C2+ 4 C2- 5
11 T1IN
T2OUT 7
10 T2IN 9
TTL/CMOS INPUTS
R2OUT
DIP/SO CAPACITANCE (µF) DEVICE C1 C2 C3 C4 MAX220 4.7 4.7 10 10 MAX232 1.0 1.0 1.0 1.0 MAX232A 0.1 0.1 0.1 0.1
6
V-
-10V C4
T1OUT 14
+5V
RS-232 OUTPUTS
400kΩ 10 T2IN
T2OUT 7
12 R1OUT
R1IN 13
TTL/CMOS OUTPUTS
C5 4.7 1.0 0.1
V+ 2 +10V
3 C14 C2+ +10V TO -10V 5 C2- VOLTAGE INVERTER +5V 400kΩ 11 T1IN
12 R1OUT
V- 6
R2IN 8
C2
13 R1IN
16 VCC +5V TO +10V VOLTAGE DOUBLER
C1+
RS-232 INPUTS
5kΩ R2IN 8
9 R2OUT
5kΩ GND 15
Figure 5. MAX220/MAX232/MAX232A Pin Configuration and Typical Operating Circuit
Obr´ azek 9.8: Pouˇzit´ı obvodu MAX232 pro komunikaci mezi UART a RS-232. +5V INPUT C3 ALL CAPACITORS = 0.1µF
TOP VIEW C5
9.4 (N.C.) EN 1 C1+ 2 V+ 3 C1- 4 C2+ 5 C2- 6 V- 7 T2OUT 8 R2IN 9
17 VCC 3 +10V C1+ +5V TO +10V V+ 4 C1- VOLTAGE DOUBLER 5 C2+ 7 -10V +10V TO -10V V6 C2C4 VOLTAGE INVERTER 2
S´ eriov´ a komunikace prostˇ rednictv´ım sbˇ ernice I2C (N.C.) EN 1
18 SHDN
C1
20 SHDN
C1+ 2
19 VCC
C2 Sbˇernice I2C (Inter-Integrated Circuit) byla vyvinuta firmou Philips Semiconductor pro komuV+ 3 18 GND 17 V +5V 4 ılˇ 17 T1 uvnitˇ 16 GND nikaci meziC1- d´ c´ımi bloky r jednoho zaˇ r´ızen´ı. Firma Atmel naz´ yv´a ten sam´ y postup jako (EXCEPT MAX220) 400kΩ MAX222 C2+ 5 16 N.C. 15 T1 T1OUT 15 T1IN 12 MAX242 TWI14 R1(Two-wire Serial15 Interface) – jedn´ a se vˇsak o totoˇznou komunikaci! Komunikaˇcn´ı protoMAX222 C2- 6 +5V R1 TTL/CMOS RS-232 MAX242 (EXCEPT MAX220) 400kΩ kol sbˇ erniceV- I2C umoˇz14n ˇuje propojen´ ı aˇ z 128T2 zaˇ r´ızen´ ı dvou obousmˇern´ ych vodiˇc˚ u: daINPUTS OUTPUTSı pomoc´ R1 7 13 R1 11 T2IN OUT 8 T2 13 N.C. 8 12 T1 tov´ y kan´alR2SDA (Synchronous Data) a hodinov´ y sign´al SCL (Synchronous Clock). Kaˇzd´ y vodiˇc 11 T2 12 T1 9 13 R1OUT R1IN 14 sbˇernice obsahuje pull-up y zajist´ ı vysokou u ´roveˇ n sign´alu v klidov´em stavu. R2 10 R2 11 T2 rezistor, kter´ 10 CC
OUT
OUT IN
IN
OUT
OUT
IN
IN
OUT
DIP/SO
OUT
IN
IN
OUT
IN
TTL/CMOS OUTPUTS
SSOP
R2IN 9
1 (N.C.) EN ( ) ARE FOR MAX222 ONLY. PIN NUMBERS IN TYPICAL OPERATING CIRCUIT ARE FOR DIP/SO PACKAGES ONLY.
RS-232 INPUTS
5kΩ 10 R2OUT
5kΩ SHDN
GND
18
16
Figure 6. MAX222/MAX242 Pin Configurations and Typical Operating Circuit ______________________________________________________________________________________
17
Obr´ azek 9.9: Pˇripojen´ı zaˇr´ızen´ı na sbˇernici I2C. Vzhledem k tomu, ˇze se jedn´ a o sbˇernici, mus´ı m´ıt vˇsechna pˇripojen´a zaˇr´ızen´ı individu´aln´ı 7bitovou adresu (jiˇz od v´ yrobce) a implementovan´ y mechanizmus komunikace pomoc´ı I2C sbˇernice. Komunikaˇcn´ı protokol I2C rozliˇsuje dvoj´ı typ zaˇr´ızen´ı: (a) Master zaˇr´ızen´ı, kter´e zahajuje a ukonˇcuje komunikaci na sbˇernici, generuje hodinov´ y sign´al SCL, a vys´ıl´a vˇsechny poˇzadavky a (b) Slave podˇr´ızen´e zaˇr´ızen´ı, ˇr´ızen´e hodinov´ ym sign´alem a vˇzdy adresovan´e Masterem. Poˇcet pˇripojen´ ych zaˇr´ızen´ı je limitov´ an pouze celkovou kapacitou sbˇernice (typ. 400 pF), nebo 7bitovou adresou podˇr´ızen´ ych obvod˚ u. Komunikace je zah´ajena startovac´ı ud´alost´ı (Start Condition) a ukonˇcena ukonˇcovac´ı ud´ alost´ı (Stop Condition). Pˇrenos kaˇzd´eho bitu je ˇr´ızen jedn´ım pulsem hodinov´eho sign´alu SCL, pˇriˇcemˇz plat´ı ˇze u ´roveˇ n datov´e linky SDA mus´ı b´ yt konstantn´ı v okamˇziku vysok´e u ´rovnˇe hodinov´eho sign´alu. Jedinou v´ yjimkou je pr´ avˇe generov´ an´ı startovac´ı a ukonˇcovac´ı ud´alosti, kdy Start i Stop je signalizov´ an zmˇenou stavu datov´e linky SDA bˇehem doby, kdy je hodinov´ y sign´al SCL na vysok´e u ´rovni (viz obr´azek 9.10). Komunikaˇcn´ı protokol I2C definuje dvoj´ı typ r´amc˚ u: adresn´ı a datov´ y. Vˇsechny adresn´ı pakety jsou 9bitov´e a obsahuj´ı 7bitovou adresu podˇr´ızen´eho zaˇr´ızen´ı, d´ale jeden R/W ˇr´ıdic´ı bit (R/W = 1: ˇcten´ı) a potvrzovac´ı bit (ACK – Acknowledge bit). Ten vys´ıl´a zaˇr´ızeni Slave v pˇr´ıpadˇe, ˇze rozpoznalo svou adresu – nuluje stav sign´alu SDA bˇehem 9. hodinov´eho cyklu
66
Mikroprocesorov´a technika a embedded syst´emy
ˇ Obr´ azek 9.10: Casov´ an´ı pˇrenosu bit˚ u na sbˇernici I2C, startovac´ı a ukonˇcovac´ı ud´alosti. SCL. Pokud je Slave zanepr´ azdnˇen, z˚ ustane sign´al SDA = 1 (coˇz je identifikov´ano jako NACK – Not Acknowledge) a Master n´ aslednˇe ukonˇc´ı komunikaci ud´alost´ı Stop. Adresn´ı pakety se sch´ematicky oznaˇcuj´ı jako SLA+R v pˇr´ıpadˇe n´asledn´eho ˇcten´ı a SLA+W, pokud je n´aslednˇe vyˇzadov´ an z´ apis dat do Slave zaˇr´ızen´ı. Nejv´ yznamnˇejˇs´ı adresn´ı bit (MSB) je odesl´an jako prvn´ı (na rozd´ıl od UART). Adresa zaˇr´ızen´ı je vˇzdy implementov´ana jiˇz v´ yrobcem (viz katalogov´e listy) a mus´ı b´ yt r˚ uzn´ a od 0. Adresa 0b000 0000 je vyhrazena pro vˇseobecn´e adresov´an´ı, kdy vˇsechny obvody Slave nastav´ı SDA = 0 v potvrzovac´ım ACK cyklu, tj. n´asleduj´ıc´ı ˇ ast adresy je moˇzn´e specifikovat tak´e pomoc´ı datov´ y paket bude pˇrijat vˇsemi obvody Slave. C´ u ´rovnˇe sign´al˚ u na nˇekolika extern´ıch pinech souˇc´astky.
Obr´ azek 9.11: Struktura adresn´ıho paketu na sbˇernici I2C. Vˇsechny datov´e pakety pˇren´ aˇsen´e po sbˇernici I2C jsou 9bitov´e a obsahuj´ı 1bytov´a data a jeden potvrzovac´ı bit ACK od Slave zaˇr´ızen´ı bˇehem 9. SCL cyklu (shodn´e s adresn´ım paketem). Pokud je SDA = 1, Slave signalizuje NACK (Non Acknowledge). Nejv´ yznamnˇejˇs´ı datov´ y bit (MSB) je opˇet vysl´ an jako prvn´ı. Typick´a komunikace na sbˇernici I2C zaˇc´ın´a startovac´ı ud´alost´ı, n´asleduje adresov´an´ı obvodu Slave SLA+R/W, jeden nebo v´ıce datov´ ych paket˚ u a ukonˇcen´ı komunikace, jak naznaˇcuje obr´azek 9.12.
Obr´ azek 9.12: Kombinace adresn´ıho a datov´eho paketu na sbˇernici I2C.
Pˇ r´ıklad 9.1 Analyzujte veˇskerou komunikace na sbˇernici I2C mezi mikrokontrol´erem ATmega16 a expand´erem portu PCF8574 firmy Philips. Kdo v kaˇzd´em okamˇziku na sbˇernici vys´ıl´ a? ˇ sen´ı 9.1 Komunikaci zah´ Reˇ aj´ı nadˇr´ızen´y odvod (v tomto pˇr´ıpadˇe MCU) startovac´ı ud´ alost´ı na datov´e lince SDA a generov´ an´ım hodinov´eho sign´ alu na lince SCL. N´ asleduje vysl´ an´ı adresy obvodu masterem – 0b010 0000 s poˇzadavkem na z´ apis (8. perioda sign´ alu SCL). N´ızkou u ´rovn´ı
Fakulta elektrotechniky a komunikaˇcn´ıch technologi´ı VUT v Brnˇe
67
v dobˇe trv´ an´ı 9. periody je zajiˇstˇeno, ˇze podˇr´ızen´y obvod pˇrijal svou adresu. Bezprostˇrednˇe pot´e zap´ıˇse nadˇr´ızen´y obvod jeden datov´y bajt, kter´y je opˇet podˇr´ızen´ym obvodem pˇrijat (ACK). Komunikace je pot´e nadˇr´ızen´ym obvodem ukonˇcena. Konkr´etn´ı stavy na sbˇernici jsou patrn´e na obr´ azku 9.13.
Obr´ azek 9.13: Komunikace po sbˇernici I2C s expand´erem portu PCF8574. Komunikace mezi zaˇr´ızen´ım Master a Slave m˚ uˇze prob´ıhat ve 4 z´akladn´ıch m´odech: • MT (Master Transmitter) – Master vys´ıl´a, • MR (Master Receiver) – Master pˇrij´ım´a, • ST (Slave Transmitter) – Slave vys´ıl´a, • SR (Slave Receiver) – Slave pˇrij´ım´a a v mnoha pˇr´ıpadech, mus´ı b´ yt m´ ody kombinov´any. Uvaˇzujme napˇr. ˇcten´ı dat ze s´eriov´e pamˇeti EEPROM. Master mus´ı v takov´em pˇr´ıpadˇe zah´ajit komunikaci, pot´e adresovat pamˇet’ovou souˇc´astku adresou SLA+W a v datov´em paketu vyslat adresu konkr´etn´ıho pamˇet’ov´eho slova, od kter´eho bude ˇcten´ı prob´ıhat (a0 ). Nyn´ı je nutn´e opˇet adresovat souˇc´astku, ale tentokr´ at v m´odu pro ˇcten´ı. To lze udˇelat v´ yhradnˇe po startovac´ı ud´alosti. Komunikace tak mus´ı b´ yt ukonˇcena, n´ aslednˇe znovu nav´ az´ ana (Repeated Start), aby mohl b´ yt vysl´an adresn´ı paket SLA+R. V n´ asleduj´ıc´ıch datov´ ych paketech podˇr´ızen´ y obvod vys´ıl´a obsah bunˇek a0 , a1 , ... dokud master neukonˇc´ı komunikaci ud´alost´ı stop. Mezi nejrozˇs´ıˇrenˇejˇs´ı obvody komunikuj´ıc´ı prostˇrednictv´ım I2C sbˇernice jsou expand´ery portu (napˇr. PCF8574), d´ ale AD/DA pˇrevodn´ıky (napˇr. PCF8591), obvody re´aln´eho ˇcasu (napˇr. PCF8563TD), teplotn´ı ˇcidla, audio procesory, digit´aln´ı potenciometry, aj.
68
10
Mikroprocesorov´a technika a embedded syst´emy
´ Uvod do sign´ alov´ ych procesor˚ u
Definice 2 Sign´ alov´y procesor (DSP – Digital Signal Processor) je mikroprocesor, pˇr´ıp. mikroprocesorov´y syst´em uzp˚ usoben´y pro efektivn´ı realizaci algoritm˚ u ˇc´ıslicov´eho zpracov´ an´ı sign´ al˚ u v re´ aln´em ˇcase. To vˇse s nejmenˇs´ımi vynaloˇzen´ymi n´ aklady. Nejˇcastˇejˇs´ı algoritmy ˇc´ıslicov´eho zpracov´an´ı dat jsou uvedeny v tabulce 10.1, ze kter´e je patrn´e, ˇze DSP jsou optimalizov´ any pro efektivn´ı v´ ypoˇcet matematick´ ych operac´ı souˇctu a souˇcinu. Tabulka 10.1: Vybran´e algoritmy ˇc´ıslicov´eho zpracov´an´ı sign´al˚ u. Typ algoritmu
Zp˚ usob v´ ypoˇ ctu
Konvoluce sign´ al˚ u.
y(l) =
ˇ ıslicov´a filtrace (FIR). C´ ˇ ıslicov´a filtrace (IIR). C´ Diskr´etn´ı Fourierova transformace. Diskr´etn´ı kosinov´ a transformace.
y(l) = y(l) =
N X i=0 M X i=0 M X
x(i) · h(l − i) a(i) · x(l − i) a(i) · x(l − i) +
i=0 N −1 X
X(l) = X(l) =
i=0 N −1 X
N X
b(i) · y(l − i)
i=1
x(i) · WNli li x(i) · CN
i=0
V´ yvoj DSP spˇeje k paraleln´ım syst´em˚ um, kdy je vykon´avan´a u ´loha rozdˇelena do d´ılˇc´ıch celk˚ u a ty jsou zpracov´ any souˇcasnˇe nˇekolika funkˇcn´ımi jednotkami, nebo cel´ ymi procesorov´ ymi j´adry.
10.1
Paraleln´ı zpracov´ an´ı instrukc´ı a dat
Paraleln´ı syst´emy lze dˇelit podle mnoˇzstv´ı paralelnˇe zpracovan´ ych instrukc´ı a dat [Fly66]. Dle poˇctu proces˚ u (instrukc´ı), kter´e jsou ˇreˇseny souˇcasnˇe dˇel´ıme syst´emy na Single Instruction Stream (SI) – vykon´ av´ an jen jeden proces, ˇci instrukce a na Multiple Instruction Stream (MI), kdy vnitˇrn´ı struktura mikroprocesorov´eho syst´emu umoˇzn ˇuje v´ ykon nˇekolika odliˇsn´ ych instrukc´ı. Obdobnˇe lze dˇelit syst´emy dle poˇctu zpracov´avan´ ych datov´ ych tok˚ u na Single Data Stream (SD) – vˇsechna data, se kter´ ymi procesor v dan´em okamˇziku pracuje pˇredstavuj´ı pr´avˇe jeden zpracov´avan´ y datov´ y tok a na Multiple Data Stream (MD) – data, kter´a jsou aktu´alnˇe zpracov´av´ana pˇredstavuj´ı nˇekolik nez´ avisl´ ych datov´ ych tok˚ u. Paraleln´ı zpracov´ an´ı instrukc´ı je umoˇznˇeno vnitˇrn´ı strukturou procesoru, kter´ y obsahuje nˇekolik nez´avisl´ ych funkˇcn´ıch jednotek, pˇr´ıp. cel´ ych jader, kdy kaˇzd´a jednotka m´a obvykle odliˇsnou funkci. Pˇri paraleln´ım zpracov´an´ı dat se tat´aˇz instrukce (operace) prov´ad´ı se souborem nez´avisl´ ych dat. Ta mohou b´ yt tvoˇrena napˇr. ˇsirok´ ymi registry (32 bit˚ u), pˇriˇcemˇz datov´a slova jsou pouze 8bitov´ a. Jedinou operac´ı (napˇr. souˇcet dvou 32bitov´ ych registr˚ u) je tak ale realizov´ an souˇcet hned 4 dvojic odliˇsn´ ych operand˚ u jak naznaˇcuje obr´azek 10.1.
10.2
Architektura sign´ alov´ ych procesor˚ u typu VLIW
V t´eto kapitole jsou pˇredstaveny sign´alov´e procesory firmy Texas Instruments (pouˇz´ıvan´e v poˇc´ıtaˇcov´ ych cviˇcen´ıch pˇredmˇetu) s architekturou VLIW.
Fakulta elektrotechniky a komunikaˇcn´ıch technologi´ı VUT v Brnˇe
31
0
31
16 15
0
69
31
24 23
16 15
×
×
×
=
=
=
(a)
(b)
(c)
8 7
0
Obr´ azek 10.1: S´eriov´e (a) a paraleln´ı zpracov´an´ı dat (b, c).
TI uvedl prvn´ı generaci DSP s oznaˇcen´ım TMS32010 v roce 1982, dalˇs´ı (TMS320C25) v roce 1986, a TMS320C50 v 1991. Tyto 16bitov´e procesory pracuj´ı s pevnou ˇr´adovou ˇc´arkou (Fixedpoint) a jsou k´ odovˇe kompatibiln´ı. Procesory C1x, C2x a C5x jsou zaloˇzeny na modifikovan´e Harvard architektuˇre s oddˇelen´ ym pamˇet’ov´ ym prostorem pro data a instrukce. Prvn´ım DSP s plovouc´ı ˇr´ adovou ˇc´ arkou (Floating-point) byl TMS320C30, kter´ y byl pˇredstaven na konci 80t´ ych let. Prvn´ı z´ astupce rodiny C6x s pevnou ˇr´adovou ˇc´arkou, tj. DSP TMS320C6201 byl zaveden v roce 1997. Na rozd´ıl od pˇredeˇsl´ ych fixed-point procesor˚ u (tj. C1x, C2x a C5x) byl C62x zaloˇzen na tzv. VLIW architektuˇre (st´ale pouˇz´ıvan´ y oddˇelen´ y prostor pro data a instrukce, jako u Harvard architektury) – Very Long Instruction Word, tj. s velmi dlouh´ ym instrukˇcn´ım slovem. Posledn´ı ˇrada DSP m´ a oznaˇcen´ı TMS320C6000 (32bitov´e DSP) a obsahuje 3 rodiny procesor˚ u: procesory s plovouc´ı ˇr´ adovou ˇc´arkou maj´ı oznaˇcen´ı C67xx, s pevnou ˇr´adovou ˇc´arkou pak maj´ı oznaˇcen´ı C62xx a C64xx. Prvn´ı procesor z t´eto ˇrady byl TMS320C6202, vyuˇz´ıvaj´ıc´ı pouze paraleln´ıho zpracov´ an´ı instrukc´ı. Aˇz C64xx byl doplnˇen paraleln´ım zpracov´an´ım dat; pˇriˇcemˇz procesory C62xx jsou kompatibiln´ı jak s C64xx, tak i C67xx (program urˇcen´ y pro C62xx na nich funguje; opaˇcnˇe to neplat´ı). Pozn.: od ˇr´ıjna 2009 firma vyr´ab´ı tak´e v´ıce-j´adrov´e sign´alov´e procesory. Vˇsichni z´ astupci rodiny DSP TMS320C6000 maj´ı v podstatˇe stejnou CPU, tak´e naz´ yvanou j´adro DSP. CPU obsahuje architekturu velmi dlouh´eho instrukˇcn´ıho slova, kterou TI naz´ yvaj´ı VelociTI a CPU vˇzdy naˇc´ıt´ a aˇz osm 32bitov´ ych instrukc´ı najednou – CPU obsahuje 256bitovou sbˇernici pro intern´ı programovou pamˇet’. Kaˇzd´a skupina takov´ ych instrukc´ı se naz´ yv´a instrukˇcn´ı paket. CPU obsahuje osm funkˇcn´ıch jednotek (oznaˇcen´ı .L – aritmetick´e operace, .S – bitov´e operace, .D – ˇr´ızen´ı pˇr´ıstupu do pamˇeti a .M – hardwarov´a n´asobiˇcka), 2 registrov´e soubory (A0–Ax, B0–Bx), a dvˇe datov´e cesty (oznaˇcen´ı A a B) jak naznaˇcuje obr´azek 10.2. Kromˇe sv´e prim´arn´ı funkce, jsou nˇekter´e funkˇcn´ı jednotky schopny prov´adˇet tak´e aritmeticko-logick´e operace (viz tabulka 10.2). Souˇcasnˇe ale plat´ı, ˇze vˇsechny jednotky nemus´ı b´ yt bˇehem v´ ykonu programu plnˇe vyt´ıˇzeny, tj. instrukˇcn´ı paket obsahuje promˇenn´ y poˇcet 32bitov´ ych instrukc´ı, ˇc´ımˇz jsou procesory TI odliˇsn´e od jin´ ych VLIW architektur. Hodnoty, uloˇzen´e v pracovn´ıch registrech obou sad (A i B) mohou pˇredstavovat jednak 32bitov´a data, ale tak´e 40bitov´ a data, ˇci ukazatele na operandy. 40bitov´a data jsou vˇzdy uloˇzena v registrov´em p´ aru (64 bit˚ u). 32 LSB jsou uloˇzeny v sud´em registru, zb´ yvaj´ıc´ıch 8 bit˚ u je pak uloˇzeno ve vyˇsˇs´ım (lich´em) registru. Tyto registrov´e p´ary jsou tak´e vyuˇzity pro uloˇzen´ı hodnot floating-point Double Precision. Nˇekter´e pracovn´ı registry mohou b´ yt nav´ıc vyuˇzity pro podm´ınˇen´e vˇetven´ı programu (viz napˇr. uk´azka programu 10.1), kdy se testuje zda hodnota v registru je/nen´ı nulov´ a. Tyto registry jsou A1, A2, B0, B1 a B2. Funkce sign´ alov´ ych procesor˚ u je charakterizov´ana trojic´ı ˇcasov´ ych interval˚ u: hodinov´ y cyklus, strojov´ y a instrukˇcn´ı cyklus. Hodinov´ y cyklus (takt) je doba periody hodinov´eho sign´ alu
70
Mikroprocesorov´a technika a embedded syst´emy
Obr´ azek 10.2: J´ adro sign´ alov´eho procesoru s plovouc´ı ˇr´adovou ˇc´arkou TMS320C6713.
Tabulka 10.2: Vyuˇzit´ı funkˇcn´ıch jednotek podle typu operace pro sign´alov´ y procesor s pevnou ˇr´adovou ˇc´arkou C64xx. Typ operace
.L
.S
.D
32bitov´e aritmetick´e operace.
•
•
•
Dvˇe 16bitov´e nebo ˇctyˇri 8bitov´e aritmetick´e operace.
•
•
40bitov´e aritmetick´e operace.
•
32bitov´e logick´e operace.
•
•
32 nebo 40bitov´e posuny.
•
•
32bitov´e operace s jednotliv´ ymi bity.
.M
•
•
N´asoben´ı dvou 16bitov´ ych operand˚ u.
•
Dvˇe 16bitov´e nebo ˇctyˇri 8bitov´e n´ asoben´ı.
• •
Pˇr´ıstup do pamˇeti – ˇcten´ı/z´ apis. Vˇetven´ı programu.
•
pro synchronizaci v´ ykonu j´ adra DSP. Strojov´ y cyklus odpov´ıd´a dobˇe proveden´ı jedn´e f´aze zˇretˇezen´eho zpracov´ an´ı instrukc´ı, tzv. pipeliningu. U DSP s architekturou VLIW trv´a jeden strojov´ y cyklus pr´ avˇe jeden hodinov´ y cyklus. Instrukˇcn´ı cyklus je doba proveden´ı jedn´e instrukce nebo instrukˇcn´ıho paketu. Instrukˇcn´ı cyklus je z´avisl´ y na typu instrukce. U VLIW (TI) jsou jednoduch´e aritmetick´e operace sloˇzeny pouze z jednoho strojov´eho cyklu, n´asoben´ı (fixedpoint) trvaj´ı 2 cykly, n´ asoben´ı (single precision) ale trv´a pr´avˇe 4 cykly, nebo dokonce 9 cykl˚ u pˇri pouˇzit´ı double precision; pˇr´ıstup do pamˇeti procesoru trv´a 5 cykl˚ u. U DSP s architekturou VLIW jsou instrukce pro jednotliv´e jednotky sdruˇzeny do tzv. instrukˇcn´ıch paket˚ u. Kaˇzd´ a z instrukc´ı je pr´avˇe 32bitov´a a nese informaci pro jednu ˇr´ıdic´ı jednotku; instrukˇcn´ı paket tedy obsahuje 8×32 = 256 bit˚ u. Tvorbˇe instrukˇcn´ıch paket˚ u je podˇr´ızeno tak´e programov´an´ı v jazyce symbolick´ ych adres DSP, kdy na jednotliv´e pakety se lze odkazovat pomoc´ı n´avˇeˇst´ı (napˇr. u podm´ınˇen´ ych ˇci nepodm´ınˇen´ ych skok˚ u), ale u d´ılˇc´ıch instrukc´ı (kter´e tvoˇr´ı paket) to nelze. Cel´ y paket se ch´ ape jako celek a stejnˇe tak se naˇc´ıt´a do ˇr´ıdic´ı jednotky pˇri v´ ykonu programu. Uk´ azka jednoho paketu, kter´ y obsahuje pˇet instrukc´ı je uvedena ve v´ ypise 10.1.
Fakulta elektrotechniky a komunikaˇcn´ıch technologi´ı VUT v Brnˇe
71
Zdrojov´ y k´ od 10.1: Syntaxe zdrojov´eho k´odu DSP v jazyce symbolick´ ych adres. 1
loop :
2 3 4 5 6
|| || || ||
LDDW LDDW MPYSP MPYSP [ A1 ] B
. D1 . D2 . M1X . M2X . S2
A4++, A7 : A6 B4++, B7 : B6 A6 , B6 , A5 A7 , B7 , B5 loop
; ; ; ; ; ;
na ´ v ˇe ˇs t´ı n a p l nˇe n´ı r e g i s t r˚ u A7 : A6 n a p l nˇe n´ı r e g i s t r˚ u B7 : B6 A5 = A6 x B6 B5 = A7 x B7 pokud A1!=0 s k oˇc na l o o p
Instrukce, kter´e tvoˇr´ı jeden instrukˇcn´ı paket jsou ve zdrojov´em k´odu uvozeny dvojitou svislou ˇc´arkou ||. Ve druh´em sloupci mohou b´ yt pouˇzity podm´ınky pro v´ ykon jednotliv´ ych instrukc´ı – v uk´azce je tak na posledn´ım ˇr´ adku testov´ana hodnota registru A1 a v´ ykon instrukce skoku je z´avisl´ y jej´ı hodnotˇe. Tˇret´ı sloupec obsahuje samotn´e instrukce, ˇctvrt´ y sloupec specifikuje, kter´ a z jednotek danou instrukci vykon´ a – jsou tedy pouˇzity funkˇcn´ı jednotky pro pr´aci s pamˇet´ı .D1, .D2, d´ ale hardwarov´e n´ asobiˇcky .M1, .M2 a jednotky .S2. P´at´ y sloupec obsahuje operandy instrukc´ı a posledn´ı sloupec v´ ystiˇzn´e koment´aˇre.
10.3
Zp˚ usoby adresov´ an´ı operand˚ u u sign´ alov´ ych procesor˚ u
V´ ypoˇcet adres pro ˇcten´ı/z´ apis operand˚ u v registrech nebo v pamˇeti prov´ad´ı jednotka generov´an´ı adres AGU (Address Generation Unit). Pro svou pr´aci vyuˇz´ıv´a celoˇc´ıselnou aritmetiku, obsahuje vlastn´ı ALU jednotku(y) a datov´e/ˇr´ıdic´ı registr(y) pro nastaven´ı zp˚ usobu adresov´ an´ı. Obecnˇe nejˇcastˇejˇs´ı zp˚ usoby adresov´ an´ı operand˚ u u DSP jsou line´arn´ı adresov´an´ı (pˇr´ım´e, ˇci nepˇr´ım´e), adresov´ an´ı modulo, adresov´an´ı v bitovˇe reverzn´ım poˇrad´ı. Pozn.: Zp˚ usob adresov´ an´ı se u TMS320C6000 nastavuje v registru AMR (Addressing Mode Register). Pˇr´ım´e adresov´ an´ı operand˚ u se vyznaˇcuje pˇr´ımo zadanou adresou, kde se nach´az´ı hodnota pro v´ ykon instrukce. Pozn.: U TMS320C6000 nen´ı tento zp˚ usob vyuˇzit. U nepˇr´ım´eho adresov´ an´ı hodnot operand˚ u obsahuje instrukce adresu, kde je v pamˇeti uloˇzena hodnota pro v´ ykon instrukce. Je to tedy ukazatel na hodnotu *nazev registru. Jako ukazatel m˚ uˇze b´ yt pouˇzit libovoln´ y registr a pˇri pouˇzit´ı instrukc´ı pro pˇr´ıstup do pamˇeti je moˇzn´e mˇenit hodnotu ukazatele, jak naznaˇcuje tabulka 10.3. Uk´azkov´e pˇr´ıklady nepˇr´ım´eho adresov´an´ı se zmˇenou adresy operand˚ u je naznaˇcen v tabulk´ach 10.4 a 10.5. Tabulka 10.3: Zmˇena hodnot ukazatel˚ u pˇri nepˇr´ım´em adresov´an´ı. Zmˇ ena hodnoty
Pˇ red adresac´ı Po adresaci
Inkrementace
*++rx
*rx++
Dekrementace
*--rx
*rx--
Vˇetˇs´ı zv´ yˇsen´ı
*+rx[konst]
*rx+[konst]
Vˇetˇs´ı zmenˇsen´ı
*-rx[konst]
*rx-[konst]
*rx
*rx
Beze zmˇeny
Tabulka 10.4: Pˇr´ıklad nepˇr´ım´eho adresov´an´ı operand˚ u – instrukce LDW *A10, B1 pro naˇcten´ı dat z pamˇeti do registru B1; doba v´ ykonu 5 cykl˚ u. N´ azev registru/pozice
Pˇ red v´ ykonem
Po v´ ykonu instrukce
B1
0x0000 0000
0x0000 1234
A10
0x0000 0100
0x0000 0100
Pamˇet’ov´ a pozice 0x100
0x0000 1234
0x0000 1234
72
Mikroprocesorov´a technika a embedded syst´emy
Tabulka 10.5: Pˇr´ıklad nepˇr´ım´eho adresov´an´ı operand˚ u – instrukce STB A1, *--A10 pro uloˇzen´ı hodnoty do pamˇeti; doba v´ ykonu 3 cykly. N´ azev registru/pozice
Pˇ red v´ ykonem
Po v´ ykonu instrukce
A1
0x0012 3456
0x0012 3456
A10
0x0000 0101
0x0000 0100
Pamˇet’ov´ a pozice 0x100 Pamˇet’ov´ a pozice 0x101
0x0000 1111
0x0000 0056
0x1111 1111
0x1111 1111
V pˇr´ıkladˇe s instrukc´ı LDW (Load Word – tj. 32 bit˚ u – From Memory) tvoˇr´ı ukazatel obsah ’ pracovn´ıho registru A10 a necht obsahuje hodnotu 0x0100. Obsah t´eto pamˇet’ov´e pozice se tedy pˇrekop´ıruje do registru B1. Tento pˇrenos trv´a pr´avˇe 5 takt˚ u procesoru (doba plyne s dokumentace k instrukˇcn´ı sady [Tex07]). Hodnota ukazatele se pˇred, ani po v´ ykonu instrukce nemˇenn´ı. Druh´ y pˇr´ıklad – s instrukc´ı STB A1, *--A10 – prov´ad´ı uloˇzen´ı jednoho bytu z pracovn´ıho registru A1 na pamˇet’ovou pozici danou hodnotou registru A10. Necht’ registr A1 obsahuje slovo 0x00123456 a ukazatel A10 je roven hodnotˇe 0x0101. Z´apis *--A10 pˇredstavuje pre-inkrementaci, tj. odeˇcten´ı hodnoty ukazatele, jeˇstˇe pˇred v´ ykonem instrukce. Adresa, kam se obsah A1 uloˇz´ı je tak 0x0100. Doba v´ ykonu instrukce STB je pr´avˇe 3 takty procesoru. Kromˇe line´ arn´ıho zp˚ usobu adresov´an´ı (hodnota ukazatele se konstantnˇe zvyˇsuje/sniˇzuje) je u DSP ˇcast´ ym zp˚ usobem adresov´ an´ı tzv. adresov´an´ı modulo (kruhov´a pamˇet’). V datov´e pamˇeti se vyhrad´ı blok urˇcit´e d´elky a pouze v nˇem se ”pohybuje”ukazatel operandu; aˇz ukazatel obsahuje nejvyˇsˇs´ı moˇznou adresu a instrukc´ı se provede dalˇs´ı zv´ yˇsen´ı, je do ukazuj´ıc´ıho registru automaticky nahr´ ana nejniˇzˇs´ı adresa ve vyˇclenˇen´em bloku. Pˇr´ıkladem pouˇzit´ı kruhov´e pamˇeti je typicky periodick´e ˇcten´ı koeficient˚ u ˇc´ıslicov´eho filtru, nebo dvojice ukazatel˚ u pro ukl´ad´an´ı pˇrijat´ ych/vyslan´ ych dat do pamˇeti. Generov´an´ı adresy v bitovˇe reverzn´ım poˇrad´ı je nejm´enˇe bˇeˇzn´ y zp˚ usob adresov´an´ı. Vyuˇz´ıv´ a se pouze u speci´ aln´ıch algoritm˚ u, kter´e vstupn´ı/v´ ystupn´ı data pˇrerovn´avaj´ı z bˇeˇzn´eho poˇrad´ı do jin´eho. Pˇr´ıkladem je algoritmus rychl´e Fourierovy transformace FFT (Fast Fourier Transform), kter´a je ˇcasto realizov´ ana pomoc´ı DSP. Jsou-li vstupn´ı vzorky pro v´ ypoˇcet FFT v pˇrirozen´em poˇrad´ı, tj. 0, 1, 2, . . ., je poˇrad´ı bit˚ u u indexu v´ ystupn´ıch vzork˚ u v obr´acen´em poˇrad´ı (LSB na prvn´ım m´ıstˇe, MSB posledn´ı): 0002 =0 0012 =1 0102 =2 0112 =3 . . . 1112 =7. 0002 =0 1002 =4 0102 =2 1102 =6 . . . 1112 =7. Z d˚ uvodu usnadnˇen´ı v´ ypoˇctu FFT, obsahuj´ı DSP hardwarovou ˇc´ast, kter´a realizuje toto ”pˇrehozen´ı”bez z´ asahu program´ atora – tj. prov´ad´ı adresov´an´ı v bitovˇe reverzn´ım poˇrad´ı.
Fakulta elektrotechniky a komunikaˇcn´ıch technologi´ı VUT v Brnˇe
11
73
Programov´ an´ı sign´ alov´ ych procesor˚ u
Na rozd´ıl od programov´ an´ı 8bitov´ ych mikrokontrol´er˚ u je v´ yvoj aplikac´ı pro sign´alov´e procesory zahajov´ an vˇzdy ve vyˇsˇs´ım jazyce. Postup pˇri v´ yvoji nov´e aplikace je n´asleduj´ıc´ı. (1) Naprogramovat celou aplikaci v jazyce C – viz napˇr. k´od 11.1. (2) Prov´est anal´ yzu real-time zpracov´an´ı; splˇ nuje-li aplikace toto krit´erium, v´ yvoj nov´eho programu t´ım konˇc´ı. V opaˇcn´em pˇr´ıpadˇe je vhodn´e vyuˇz´ıt optimalizaˇcn´ı n´astroje v´ yvojov´eho prostˇred´ı, pˇr´ıp. pˇreprogramov´ an´ı ˇcasovˇe n´aroˇcn´e ˇc´ asti pomoc´ı speci´ aln´ıch funkc´ı pro pˇrekladaˇc, ˇci pomoc´ı tzv. line´arn´ıho jazyka symbolick´ ych adres. Pokud ani v t´eto f´azi nejsou poˇzadavky na rychlost splnˇeny, je nutn´e pˇreprogramovat kritickou pas´ aˇz v jazyce symbolick´ ych adres. Zdrojov´ y k´ od 11.1: Aplikace pro DSP v jazyce C. 1 2 3 4
i n t main ( short short int y
void ) { a = 0 x40 ; b = 0 x20 ; ;
// d e k l a r a c e l o k ´ a l n´ı c h promˇe nn´ y ch
5 6
y = ( a + b ) << 1 ;
// y = 2x ( a+b )
while ( 1 ) ; return ( 1 ) ;
// nekoneˇc n´ a smyˇcka // v y ´ s t u p n´ı hodnota f u n k c e = 1
7 8 9 10
}
Pˇri programov´ an´ı v jazyce C lze kombinovat nˇekolik moˇznost´ı: cel´ y k´od naprogramovat v jazyce C, nebo pouˇz´ıt speci´ aln´ı funkce pˇrekladaˇce tzv. intrinsic (viz k´od 11.2), kritick´e pas´ aˇze pˇrepsat pomoc´ı line´ arn´ıho JSA (soubory *.sa) a ty volat z jazyka C, nebo kritick´e pas´aˇze pˇrepsat pomoc´ı funkc´ı v JSA (*.asm) a ty volat z jazyka C. Zdrojov´ y k´ od 11.2: Vybran´e speci´ aln´ı funkce pˇrekladaˇce intrinsic. 1 2 3
i n t abs ( i n t src ) ; i n t add2 ( i n t src1 , i n t src2 ) ; i n t mpy ( i n t src1 , i n t src2 ) ;
// a b s o l u t n´ı hodnota // s o uˇc e t // n a ´ s o b e n´ı
Pˇri kombinaci zdrojov´eho k´ odu v JSA a v jazyce C plat´ı z´asada, ˇze vyˇsˇs´ı programovac´ı jazyk se pˇri programov´ an´ı DSP pouˇz´ıv´ a pro inicializaci aplikace a pro ”nekritick´e” pas´aˇze k´odu (z pohledu velikosti nebo rychlosti). Kritick´e ˇc´asti je vhodn´e z hlediska absolutn´ı kontroly rychlosti a velikosti pˇreloˇzen´eho k´ odu programovat v jazyce symbolick´ ych adres, pˇr´ıp. v tzv. line´arn´ım JSA. Volan´e funkce v JSA i v C pouˇz´ıvaj´ı stejn´e registry. Mohou si tak´e vymˇen ˇovat parametry/v´ ysledn´e hodnoty. Pozor registr B3 vˇzdy obsahuje n´avratovou adresu z funkce v JSA. Funkce v JSA m˚ uˇze obsahovat aˇz 10 vstupn´ıch parametr˚ u. Ty jsou vˇzdy postupnˇe uloˇzeny v registrech A4, B4, A6, B6, A8, B8, A10, B10, A12 a B12. Pokud funkce vrac´ı hodnotu, je nutn´e ji pˇred n´avratem z funkce uloˇzit do registru A4. Funkce se ukonˇc´ı skokem na n´avratovou adresu, tj. instrukc´ı B B3. Kombinaci vyˇsˇs´ıho a niˇzˇs´ıho jazyka pˇredstavuj´ı uk´azkov´e zdrojov´e k´ody 11.3 a 11.4. Pˇri programov´ an´ı v JSA sign´ alov´eho procesoru TMS320C6000 je potˇreba specifikovat n´ azvy registr˚ u a pˇredevˇs´ım respektovat ˇcasov´an´ı jednotliv´ ych instrukc´ı. Napˇr. instrukci pro pˇr´ıstup do pamˇeti je nutn´e doplnit 4 instrukce NOP – pˇr´ıstup do pamˇeti totiˇz trv´a 5 strojov´ ych cykl˚ u; 1. cyklus @ spuˇstˇen´ı instrukce; naˇcten´ a/uloˇzen´a hodnota je k dispozici za dalˇs´ı 4 cykly. Line´arn´ı JSA je jak´ ymsi mezikrokem mezi JSA a jazykem C. Umoˇzn ˇuje snadnˇejˇs´ı pr´ aci pro program´ atora, ale ponech´ av´ a mu znaˇcnou kontrolu nad v´ ysledn´ ym k´odem. Nav´ıc je moˇzn´e pouˇz´ıvat symbolick´e n´ azvy registr˚ u, vˇcetnˇe pˇred´avan´ ych parametr˚ u (podobnˇe jako promˇenn´e v jazyce C), d´ ale spr´ avn´e ˇcasov´ an´ı v´ ykonu instrukc´ı prov´ad´ı pˇrekladaˇc automaticky, ale programuje se pˇr´ımo pomoc´ı instrukc´ı bez nutnosti specifikovat funkˇcn´ı jednotku. K´od je pˇrekladaˇcem optimalizov´ an vˇzdy jen mezi voln´e jednotky.
74
Mikroprocesorov´a technika a embedded syst´emy
Zdrojov´ y k´ od 11.3: Kombinace zdrojov´ ych k´od˚ u – soubor f1.c. 1 2 3 4 5 6
extern i n t asmFunction ( short , short ) ; // p r o t o t y p f u n k c e SOUBOR: f 1 . c // k´ o d f u n k c e asmFunction u l oˇz e n v jin´e m souboru i n t main ( void ) { // h l a v n´ı f u n k c e short a = 0 x40 ; // d e k l a r a c e l o k a ´ l n´ı c h promˇe nn´ y ch ; 8 b i t o v ´e short b = 0 x20 ; int y ; // 32 b i t o v ´ a promˇenn´ a
7 8
y = asmFunction ( a , b ) ;
// v o l a ´ n´ı f u n k c e v JSA
while ( 1 ) ; return ( 1 ) ;
// nekoneˇc n´ a smyˇcka // v y ´ s t u p n´ı hodnota f u n k c e = 1
9 10 11 12
}
Zdrojov´ y k´ od 11.4: Kombinace zdrojov´ ych k´od˚ u – soubor f2.asm. 1
. global _asmFunction
; definice globa ´ l . parametru
SOUBOR: f 2 . asm
2 3 4 5 6 7
_asmFunction : ADD . D1x SHL . S1 || B . S2 NOP 4
A4 , B4 , A4 A4 , 1 , A4 B3
; ; ; ; ;
volan´ a funkce A4 + B4 = A4 A4 << 1 = A4 skok na n´ a vratovou adresu , t j . ” na ” r e g i s t r B3 ˇc a s o v a ´ n´ı i n s t r u k c e B, k t e r ´ a trva ´ 5 c y k l˚ u
Takov´ yto zdrojov´ y k´ od (uloˇzen´ y v souboru s koncovkou *.sa) mus´ı obsahovat nˇekolik ˇc´ast´ı: • identifikace symbolu/funkce definovan´eho v jin´em zdrojov´em souboru pomoc´ı direktivy .global, • specifikace zaˇc´ atku funkce prostˇrednictv´ım direktivy .cproc, • konec funkce: .endproc, • pˇriˇrazen´ı vstupn´ıch hodnot promˇenn´ ym za .cproc, • deklarace promˇenn´ ych (symbolick´e oznaˇcen´ı registr˚ u): .reg, • n´avratov´ a hodnota funkce + ukonˇcen´ı funkce: .return. Ekvivalentem zdrojov´eho k´ odu z v´ ypisu 11.4 je k´od 11.5. Srovn´an´ı poˇcetn´ı n´aroˇcnosti algoritmu skal´ arn´ıho souˇcinu pro odliˇsn´e zp˚ usoby implementace zobrazuje tabulka 11.1. V´ıce o programov´ an´ı sign´ alov´ ych procesor˚ u ve vyˇsˇs´ım i niˇzˇs´ım programovac´ım jazyce v poˇc´ıtaˇcov´ ych cviˇcen´ıch pˇredmˇetu [Fry11]. Tabulka 11.1: Srovn´ an´ı poˇcetn´ı n´ aroˇcnosti 8bodov´eho souˇctu souˇcin˚ u (SoP). Program. jazyk
ˇ ıseln´ C´ a reprezentace
Poˇ cty cykl˚ u
Jazyk C
Floating-point
404
Jazyk C
Fixed-point
352
LJSA
Floating-point
203
LJSA
Fixed-point
166
JSA
Floating-point, VLIW
50
Fakulta elektrotechniky a komunikaˇcn´ıch technologi´ı VUT v Brnˇe
75
Zdrojov´ y k´ od 11.5: Kombinace zdrojov´ ych k´od˚ u – soubor f2.sa. 1
. global _asmFunction
; definice globa ´ l n´ıh o parametru
SOUBOR: f 2 . s a
2 3 4
_asmFunction : . reg y
. cproc a , b
; p ˇr i ˇr a z e n´ı hodnot od v s t u p n´ıc h operand˚ u ; ekvivalent loka ´ l n´ı promˇe nn´e
5 6 7
ADD SHL
a, b, y y, 1, y
; a + b = y ; y << 1 = y
8 9 10
. return y . endproc
; f u n k c e v r a c´ı hodnotu y ; konec f u n k c e v LJSA
76
Mikroprocesorov´a technika a embedded syst´emy
Literatura [Aic23]
Texas Instruments Incorporated. TLV320AIC23. Low-Power Stereo CODEC with HP Amplifier [online]. 2009 – [cit. 29. listopadu 2009]. Dostupn´e na www: http://focus. ti.com/docs/prod/folders/print/tlv320aic23.html.
[Ans99] Open Standards. International standard ISO/IEC 9899:1999 [online]. 2005 – [cit. 3. ˇr´ıjna 2011]. Dostupn´e na www: http://www.open-std.org/jtc1/sc22/wg14/www/ docs/n1124.pdf. [Ans1x] Open Standards. International standard ISO/IEC 9899:201x [online]. 2010 – [cit. 3. ˇr´ıjna 2011]. Dostupn´e na www: http://www.open-std.org/jtc1/sc22/WG14/www/ docs/n1539.pdf. [Atm01] Atmel Corporation. Ofici´ aln´ı str´ anka firmy Atmel [online]. 2011 – [cit. 3. ˇr´ıjna 2011]. Dostupn´e na www: http://www.atmel.com/. [Atm02] Atmel Corporation. 8-bit AVR Instruction Set [online]. 2011 – [cit. 3. ˇr´ıjna 2011]. Dostupn´e na www: http://www.atmel.com/dyn/resources/prod_documents/doc0856. pdf. [Atm03] Atmel Corporation. STK500 [online]. 2011 – [cit. 3. ˇr´ıjna 2011]. Dostupn´e na www: http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2735. [Atm04] Atmel Corporation. AVRISP mkII In-System Programmer [online]. 2011 – [cit. 3. ˇr´ıjna 2011]. Dostupn´e na www: http://www.atmel.com/dyn/products/tools_card. asp?tool_id=3808. [Atm05] Atmel Corporation. AVR Studio 4 [online]. 2011 – [cit. 3. ˇr´ıjna 2011]. Dostupn´e na www: http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2725. [Atm06] Atmel Corporation. AVR STK500 User Guide [online]. 2003 – [cit. 6. listopadu 2009]. Dostupn´e na www: http://www.atmel.com/atmel/acrobat/doc1925.pdf. [Atm16] Atmel Corporation. 8-bit Microcontroller ATmega16 [online]. 2010 – [cit. 3. ˇr´ıjna 2011]. Dostupn´e na www: http://www.atmel.com/dyn/resources/prod_ documents/doc2466.pdf. [Bar03] BARNETT, R., O’CULL, L., COX, S. Embedded C Programming and the Atmel AVR. 1st ed. New York (USA): Thomson Learning, Inc., 2003. [Dan05] DANDAMUDI, S.P. Guide to RICS Processors for Programmers and Engineers. 1st ed. New York (USA): Springer, 2005. [Dov07] Doveda Boys. Znakov´e LCD displeje [online]. 2007 – [cit. 3. ˇr´ıjna 2011]. Dostupn´e na www: http://www.doveda.byl.cz/. [Dox11] HEESCH, D. Doxygen [online]. 2011 – [cit. 30. ˇr´ıjna 2011]. Dostupn´e na www: http: //www.doxygen.org/. [Dup00] DUPOUY, B., DEMEURE, I., PAUTET, L. BCI Informatique. Syst`emes d’exploitation Paris (France): T´el´ecom ParisTech, 2000. [Fed01] FEDRA, Z. V´ysledn´e projekty pˇredmˇetu MMIA [online]. 2011 – [cit. 3. ˇr´ıjna 2011]. Dostupn´e na www: http://www.urel.feec.vutbr.cz/MIA.
Fakulta elektrotechniky a komunikaˇcn´ıch technologi´ı VUT v Brnˇe
77
[Fed08] FEDRA, Z., FRYZA, T. Different Poles of Three Decades Development in Microcontrollers’ Domain. In Proceedings of IEEE History of Telecommunication Conference Histelcon 2008. Paris (France), 2008, p. 148-151. [Fis83]
FISHER, J.A. Very Long Instruction Word Architectures and ELI-512. In Proceedings of the 10th Annual International Symposium on Computer Architecture ISCA’83. ISBN:0-89791-101-6. (Reprinted in IEEE Solid-State Circuits Magazine. Vol. 1, Issue 2, p. 23–33. ISSN: 1943-0582. Spring 2009.)
[Fle06]
FLEURY, P. LCD Library for HD44870 based LCD’s [online]. 2006 – [cit. 3. ˇr´ıjna 2011]. Dostupn´e na www: http://homepage.hispeed.ch/peterfleury/ avr-software.html.
[Fly66]
FLYNN, M. J. Very High-Speed Computing Systems. Proceedings of the IEEE. 1966, vol. 54, no. 12, p. 1901–1909.
[Fry01]
´ FRYZA, T. Tomas Fryza Homepage [online]. 2011 – [cit. 3. ˇr´ıjna 2011]. Dostupn´e na www: http://www.urel.feec.vutbr.cz/~fryza.
[Fry11]
´ ˇ FRYZA, T. SEBESTA, J., FEDRA, Z., ZELINKA, P. Mikroprocesorov´ a technika a embedded syst´emy. Poˇc´ıtaˇcov´ a cviˇcen´ı. 2. vyd´an´ı. Brno: FEKT VUT v Brnˇe, 2011.
[Gad01] GADRE, D.V. Programming and Customizing the AVR Microcontroller. New York (USA): McGraw-Hill, 2001. [Gcc09] GNU Project. GCC, the GNU Compiler Collection [online]. 2011 – [cit. 3. ˇr´ıjna 2011]. Dostupn´e na www: http://gcc.gnu.org/. [Gdb11] GDB: The GNU Project Debugger [online]. 2011 – [cit. 18. listopadu 2011]. Dostupn´e na www: http://www.gnu.org/s/gdb/. [Hit08]
Hitachi, Ltd. Ofici´ aln´ı str´ anky firmy Hitachi [online]. 2011 – [cit. 3. ˇr´ıjna 2011]. Dostupn´e na www: http://www.hitachi.com/.
[Cha05] CHASSAING, R. Digital Signal Processing and Applications with the C6713 and C6416 DSK. 1st ed. New Jersey (USA): John Wiley & Sons, 2005. [Int01]
Intel 4004 Microprocessor [online]. 2011 – [cit. 21. z´aˇr´ı 2011]. Dostupn´e na www: http: //e4004.szyc.org/index_en.html.
[Int71]
Intel Corporation. Intel Museum – The Intel 4004 [online]. 2011 – [cit. 18. listopadu 2011]. Dostupn´e na www: http://www.intel.com/about/companyinfo/museum/ exhibits/4004/index.htm.
[Itc11]
Channel 4. The IT Crowd [online]. 2011 – [cit. 19. listopadu 2011]. Dostupn´e na www: http://www.channel4.com/programmes/the-it-crowd.
ˇ ıslicov´ [Jan01] JAN, J. C´ a filtrace, anal´yza a restaurace sign´ al˚ u. 2. vyd´an´ı. Brno: FEKT VUT v Brnˇe, 2001. [Ker78] KERNIGHAN, B.W., RITCHIE, D.M. The C Programming Language. New Jersey (USA): Prentice-Hall, 1978. [Koc05] KOCHAN, S. G. Programming in C. A Complete Introduction to the C Programming Language. 3rd ed. Indianapolis (USA): Sams Publishing, 2005.
78
Mikroprocesorov´a technika a embedded syst´emy
[Lib09]
C library for use with GCC on AVR. AVR Libc Home Page [online]. 2011 – [cit. 21. z´ aˇr´ı 2011]. Dostupn´e na www: http://www.nongnu.org/avr-libc/.
[Mil97]
MILLER, L. H., QUILICI, A. E. The Joy of C. 3rd ed. New Jersey (USA): John Wiley & Sons Inc., 1997.
[Nuv10] Nuvoton. ISD1700 Datasheet [online]. 2010 – [cit. 9. prosince 2010]. Dostupn´e na www: http://www.nuvoton.com/hq/enu/productandsales/productlines/ consumerelectronicsic/isdvoiceic/isdchipcorder/documents/isd1700.pdf. [Pra05] PRATA, S. C Primer Plus. 5th ed. Indianapolis (USA): Sams Publishing, 2005. [Qur05] QURESHI, S. Embedded Image Processing on the TMS320C6000 DSP. Examples in Code Composer Studio and MATLAB. 1st ed. New York (USA): Springer, 2005. [Rtc97] Philips Semiconductors. PCF8583. Clock/calender with 240×8-bit RAM [online]. 1997 – [cit. 12. listopadu 2009]. Dostupn´e na www: http://www.aurel32.net/elec/ pcf8583.pdf. [Sco09]
ZEITNITZ, Ch. Soundcard Oscilloscope [online]. 2009 – [cit. 29. listopadu 2009]. Dostupn´e na www: http://www.zeitnitz.de/Christian/index.php?sel=scope_en.
ˇ C ˇ ´IK, R. Pomocn´y n´ [Sev08] SEV astroj pro programov´ an´ı mikrokontrol´er˚ u AVR v jazyce C. Diplomov´ a pr´ ace. Brno: FEKT VUT v Brnˇe, 2008. [Ter09]
HW server. Program Terminal pro komunikaci pˇres RS-232 [online]. 2009 – [cit. 12. listopadu 2009]. Dostupn´e na www: http://rs232.hw.cz/#Terminal.
[Tex01] Texas Instruments Incorporated. Code Composer Studio Tutorial. Developing a Simple Program. Tutori´ al dostupn´ y ve v´ yvojov´em prostˇred´ı Code Composer Studio 3.1. [Tex02] Texas Instruments Incorporated. Floating-Point Digital Signal Processor TMS320C6713 [online]. 2009 – [cit. 19. listopadu 2009]. Dostupn´e na www: http://focus. ti.com/docs/prod/folders/print/tms320c6713.html. [Tex03] Texas Instruments Incorporated. Code Composer Studio Integrated Development Environment (IDE) – v4.x [online]. 2009 – [cit. 19. listopadu 2009]. Dostupn´e na www: http://focus.ti.com/docs/toolsw/folders/print/ccstudio.html. [Tex04] Texas Instruments Incorporated. TMS320C67x DSP Library [online]. 2011 – [cit. 3. ˇr´ıjna 2011]. Dostupn´e na www: http://www.ti.com/tool/sprc121. [Tex05] Texas Instruments Incorporated. TMS320C6713 DSP Starter Kit (DSK) [online]. 2011 – [cit. 3. ˇr´ıjna 2011]. Dostupn´e na www: http://www.ti.com/tool/tmdsdsk6713. [Tex06] Texas Instruments Incorporated. Multicore Digital Signal Processor TMS320C6474 [online]. 2011 – [cit. 3. ˇr´ıjna 2011]. Dostupn´e na www: http://www.ti.com/product/ tms320c6474. [Tex07] Texas Instruments Incorporated. TMS320C67x/C67x+ DSP CPU and Instruction Set Refernce Guide [online]. 2006 – [cit. 6. ˇr´ıjna 2011]. Dostupn´e na www: http://www. ti.com/lit/ug/spru733a/spru733a.pdf. [Toc03] TOCCI, R.J., AMBROSIO, F.J. Microprocessors and Microcomputers. Hardware and Software. 6th ed. New Jersey (USA): Prentice Hall, 2003.
Fakulta elektrotechniky a komunikaˇcn´ıch technologi´ı VUT v Brnˇe
[Tre08]
79
TRETTER, S.A. Communication System Design Using DSP Algorithms. With Laboratory Experiments for the TMS320C6713 DSK. 1st ed. New York (USA): Springer, 2008.
´ NA, ˇ [Van03] VA V. Mikrokontrol´ery Atmel AVR, popis procesor˚ u a instrukˇcn´ı soubor. Praha: Ben, technick´ a literatura, 2003. [Win08] WinAVR. WinAVR home page [online]. 2010 – [cit. 3. ˇr´ıjna 2011]. Dostupn´e na www: http://winavr.sourceforge.net/.
80
Mikroprocesorov´a technika a embedded syst´emy
A
Uk´ azky program˚ u pro AVR v jazyce symbolick´ ych adres
V t´eto pˇr´ıloze jsou pˇredstaveny jednoduch´e zdrojov´e k´ody a aplikace pro 8bitov´ y mikrokontrol´er ATmega16, kter´e jsou vyvinuty v jazyce symbolick´ ych adres.
A.1
Pr´ ace s registry, aritmetick´ e operace
N´asleduj´ıc´ı zdrojov´ y k´ od pˇredstavuje jednoduch´ y programu v jazyce symbolick´ ych adres (JSA, ”assembleru”) pro 8bitov´ y mikrokontrol´er ATmega16 s j´adrem AVR. Aplikace pro tyto mikrokontrol´ery lze vyv´ıjet napˇr. v prostˇred´ı AVR Studio [Atm05]. Zdrojov´ y k´ od A.1: Uk´ azka zdrojov´eho k´odu v jazyce symbolick´ ych adres pro mikrokontrol´er AVR. 1
.include <m16def.inc>
; d e f i n i ˇc n´ı s o u b o r m i k r o k o n t r o l´e r u ATmega16
reset : LDI LDI
R16 , 0 x48 R17 , 12
; r e g i s t r R16 = 48 ( h e x . ) , t j . 72 ( d e k . ) ; R17 = 12 ( d e k . )
R18 , R16 R18 , R17
; R18 <− R16 , t j . R18 = 72 ; R18 = R18 + R17 = 84
2 3 4 5 6 7 8
MOV ADD
9 10 11
loop : RJMP loop
; nekoneˇc n´ a smyˇcka ; skok na n a ´ v ˇe ˇs t´ı l o o p
Prvn´ı ˇr´adek zdrojov´eho k´ odu obsahuje tzv. direktivu pˇrekladaˇce (intern´ı pˇr´ıkaz pro pˇrekl´adaj´ıc´ı software), kter´ a zajist´ı vloˇzen´ı textov´eho souboru m16def.inc s popisem mikrokontrol´eru ATmega16. Tento soubor je souˇc´ast´ı instalace AVR Studia. Samotn´ y program zaˇc´ın´ a od n´ avˇeˇst´ı reset:, kdy jsou pomoc´ı instrukce LDI (Load Immediate – bezprostˇredn´ı naplnˇen´ı registru) naplnˇeny dva registry 8bitov´ ymi hodnotami. U registru R16 je hodnota zad´ ana v ˇsestn´ actkov´e soustavˇe a u registru R17 v soustavˇe des´ıtkov´e. Pˇresun (kop´ırov´an´ı) obsahu registru se prov´ ad´ı instrukc´ı MOV (Copy Register); na sedm´em ˇr´adku je tak hodnota z registru R16 pˇrekop´ırov´ana do registru R18. Souˇcet dvou hodnot v registrech se prov´ad´ı instrukc´ı ADD (Add without Carry). Zacyklen´ı (tj. ukonˇcen´ı) programu lze prov´est bezprostˇredn´ım skokem na n´ avˇeˇst´ı pomoc´ı instrukce RJMP (Relative Jump). Detailn´ı popis instrukˇcn´ı sady mikrokontrol´er˚ u AVR lze nal´ezt na internetov´ ych str´ank´ach Atmel [Atm02]. Struˇcn´ y n´ avod, jak pracovat v prostˇred´ı AVR Studio, je uveden ve skriptech pro poˇc´ıtaˇcov´ a cviˇcen´ı pˇredmˇetu Mikroprocesorov´ a technika a embedded syst´emy [Fry11].
A.2
Ovl´ ad´ an´ı vstupnˇ e/v´ ystupn´ıho portu
Pomoc´ı kontroln´ıch registr˚ u je program´ator schopen ovl´adat veˇsker´e perif´erie mikrokontrol´er˚ u, pˇr´ıp. i jeho j´adro. Mezi bˇeˇzn´e perif´erie patˇr´ı ˇcasovaˇc/ˇc´ıtaˇc, A/D pˇrevodn´ık, dostupn´a s´eriov´a rozhran´ı, a pˇredevˇs´ım paraleln´ı porty pro obecn´e vyuˇzit´ı. V n´asleduj´ıc´ı uk´azce je pˇredstaven zp˚ usob ovl´ad´an´ı vstupnˇe/v´ ystupn´ıho portu B mikrokontrol´eru ATmega16. Pˇr´ıstup ke vˇsem kontroln´ım registr˚ um se prov´ ad´ı prostˇrednictv´ım instrukc´ı OUT a IN. Aplikace pˇredstavuje jednoduch´ y 8bitov´ y bin´arn´ı ˇc´ıtaˇc s v´ ystupem na portu B. Velikost v´ ysledn´eho k´odu je 12 B, tj. 0,1% pamˇeti Flash mikrokontrol´eru ATmega16. Jsou pouˇzity n´ asleduj´ıc´ı registry a instrukce: • R16 – jeden z 32 8bitov´ ych pracovn´ıch registr˚ u pro obecn´e pouˇzit´ı,
Fakulta elektrotechniky a komunikaˇcn´ıch technologi´ı VUT v Brnˇe
81
• DDRB (PortB Data Direction Register) – kontroln´ı registr; urˇcuje smˇer komunikace jednotliv´ ych pin˚ u na portu B. 0 ⇔ vstupn´ı pin, 1 ⇔ v´ ystupn´ı pin, • PORTB – kontroln´ı registr; obsahuje data pro logick´e u ´rovnˇe v´ ystupn´ıch pin˚ u portu B, • SER temp – do registru temp uloˇz osmibitovou konstantu 0xFF (255 dek.), • OUT DDRB, temp – do registru DDRB zkop´ıruj obsah registru temp, tj. ⇒ cel´ y port B bude v´ ystupn´ı, • DEC temp – od obsahu registru temp odeˇcti jedniˇcku, • RJMP reset – skoˇc na n´ avˇest´ı reset.
Zdrojov´ y k´ od A.2: Bin´ arn´ı ˇc´ıtaˇc v jazyce symbolick´ ych adres. 1 2
.include <m16def.inc> .def temp = R16
; d e f i n i ˇc n´ı s o u b o r m i k r o k o n t r o l´e r u ATmega16 ; symbolicky ´ n´ a zev r e g i s t r u R16
.cseg .org 0 x0000
; pamˇet’ ov´ y segment F l a s h ; u l oˇz od a d r e s y 0 x0000
reset : SER OUT
; temp = 255 ; smˇe rov´ y r e g . DDRB=255 , t j . c e l y ´ port B j e vy ´ s t u p n´ı
3 4 5 6 7 8 9
temp DDRB , temp
10 11 12 13 14
loop : OUT PORTB , temp DEC temp RJMP loop
; ; ; ;
nekoneˇc n´ a smyˇcka za ´ p i s hodnoty na v y ´ s t u p n´ı p o r t B dekrementace temp skok na n a ´ v ˇe ˇs t´ı l o o p
Zdrojov´ y k´ od lze rozdˇelit na tˇri ˇc´asti. V prvn´ı ˇc´asti je pomoc´ı direktiv pˇrekladaˇce definov´ana vnitˇrn´ı struktura pouˇzit´eho mikrokontrol´eru, d´ale je pouˇzit symbolick´ y n´azev registru a je zajiˇstˇeno uloˇzen´ı strojov´eho k´ odu v programov´e pamˇeti od adresy nula (direktivy .cseg a .org). Druh´ a ˇc´ ast aplikace obsahuje potˇrebn´a nastaven´ı kontroln´ıch registr˚ u – v tomto pˇr´ıpadˇe je pomoc´ı DDRB nastaven port B jako v´ ystupn´ı. Posledn´ı ˇc´ast zdrojov´eho k´odu je reprezentov´ana nekoneˇcnou smyˇckou s neust´ alou dekrementac´ı obsahu registru temp a aktualizov´an´ım hodnoty v´ ystupn´ıch pin˚ u portu B (instrukce OUT). Ekvivalent zdrojov´eho k´odu v jazyce C je uveden v kapitole B.1.
A.3
Podm´ınˇ en´ e vˇ etven´ı programu
Podm´ınˇen´e vˇetven´ı programu slouˇz´ı k ˇr´ızen´ı bˇehu programu pomoc´ı jednoduch´ ych podm´ınek. Mikrokontrol´ery AVR obsahuj´ı 25 r˚ uzn´ ych instrukc´ı pro podm´ınˇen´e vˇetven´ı programu, kter´e bud’ pˇreskoˇc´ı jednu n´ asleduj´ıc´ı instrukci, nebo skoˇc´ı na libovoln´e n´avˇeˇst´ı v programu. Uk´azkov´ a aplikace z v´ ypisu A.3 pˇredstavuje jednoduch´e testov´an´ı dvou vstupn´ıch pin˚ u na portu B (PB1 a PB0). Necht’ jsou na tyto piny pˇripojeny tlaˇc´ıtka. V nekoneˇcn´e smyˇcce loop se pak neust´ale kontroluje hodnota bit˚ u na pozici 0 a 1, tj. zda-li bylo nˇekter´e tlaˇc´ıtko stisknuto (tlaˇc´ıtka jsou zapojena tak, ˇze pˇri stisku, je na vstupu n´ızk´a u ´roveˇ n). Pokud ano, incrementuje se, pˇr´ıp. dekrementuje stav pomocn´eho ˇc´ıtaˇce, jehoˇz stav je neust´ale aktualizov´an na v´ ystupn´ım portu C. Pro testov´ an´ı jednoho bitu v kontroln´ım registru byla vyuˇzita instrukce SBIS, tj. Skip if Bit is Set. Jin´ y zp˚ usob podm´ınky lze realizovat pomoc´ı pˇr´ıznakov´ ych bit˚ u ze stavov´eho registru. Pro kaˇzd´ y z osmi bit˚ u obsahuje instrukˇcn´ı sada dvojici instrukc´ı, kter´e testuj´ı zda je dan´ y bit roven
82
Mikroprocesorov´a technika a embedded syst´emy
Zdrojov´ y k´ od A.3: Podm´ınˇen´e vˇetven´ı programu v jazyce symbolick´ ych adres. 1 2
.include <m16def.inc> .def temp = R16
; d e f i n i ˇc n´ı s o u b o r m i k r o k o n t r o l´e r u ATmega16 ; symbolicky ´ n´ a zev r e g i s t r u R16
reset : CLR OUT SER OUT
temp DDRB , temp temp DDRC , temp
; ; ; ;
n u l u j vˇs echny b i t y v r e g i s t r u temp p o r t B = v s t u p n´ı n a s t a v vˇs echny b i t y v r e g i s t r u temp port C = vy ´ s t u p n´ı
loop : SBIS INC SBIS DEC OUT RJMP
PINB , 0 x00 temp PINB , 0 x01 temp POTRC , temp loop
; ; ; ; ; ;
pokud p i n PB0 = 1 pˇr e s k oˇc n a ´ s l e d u j´ı c´ı i n s t r u k c i i n k r e m e n t u j obsah r e g i s t r u temp pokud p i n PB1 = 1 pˇr e s k oˇc n a ´ s l e d u j´ı c´ı i n s t r u k c i dekrementuj obsah r e g i s t r u temp p o ˇs l i obsah temp na p o r t C skok na n a ´ v ˇe ˇs t´ı l o o p
3 4 5 6 7 8 9 10 11 12 13 14 15 16
jedniˇcce nebo nule. Konstrukce loop: DEC temp a BRNE loop pak pˇredstavuje uk´azku testov´an´ı nulov´eho pˇr´ıznakov´eho bitu. Instrukce BRNE provede skok na n´avˇeˇst´ı loop pouze v pˇr´ıpadˇe, ˇze hodnota temp je r˚ uzn´ a od nuly. Viz n´ asleduj´ıc´ı kapitola.
A.4
Vol´ an´ı podprogramu
Podprogramy pˇredstavuj´ı jednu z nejˇcastˇeji pouˇz´ıvan´ ych softwarov´ ych konstrukc´ı. Specifikou podprogramu je automatick´ y n´ avrat po jeho skonˇcen´ı na m´ısto, odkud byl podprogram vol´an. K tomu je vyuˇz´ıv´ an z´ asobn´ık pro doˇcasn´e ukl´ad´an´ı n´avratov´ ych adres. Funkce je pˇredstavena na jednoduch´em bin´ arn´ım ˇc´ıtaˇci se zpoˇzdˇen´ım. Funkce podprogramu je tedy zpomalit rychlost s jakou se mˇen´ı stav bin´ arn´ıho ˇc´ıtaˇce counter. Zpoˇzdˇen´ı pˇredstavuje cyklus, kter´ y se opakuje pr´avˇe 256×. To je d´ano dekrementac´ı pomocn´e promˇenn´e temp; ta nab´ yv´ a postupn´ ych hodnot 255, 254, . . ., 0. Pˇri kaˇzd´e zmˇenˇe instrukc´ı DEC je tak´e ovlivˇ nov´ an nulov´ y pˇr´ıznakov´ y bit. Ten je testov´an instrukc´ı BRNE. Pokud nen´ı splnˇen podm´ınka, ˇze temp je rovno nule, instrukce skoku zajist´ı opakov´an´ı smyˇcky od n´avˇeˇst´ı delay. Z dob trv´ an´ı jednotliv´ ych instrukc´ı je moˇzn´e pˇresnˇe vypoˇc´ıst dobu zpoˇzdˇen´ı. K manu´alu instrukˇcn´ı sady [Atm02] plyne, ˇze DEC se vykon´a za 1 strojov´ y cyklus (tj. 1 perioda hodinov´eho sign´ alu), BRNE v pˇr´ıpadˇe skoku 2 periody, v opaˇcn´em pˇr´ıpadˇe jen 1 periodu a n´avrat z podprogramu RET trv´ a mikrokontrol´eru AVR pr´avˇe 4 periody. Zapoˇc´ıt´ame-li do doby v´ ykonu i samotn´e vol´ an´ı podprogramu (RCALL, 3 periody), dost´av´ame celkovou dobu trv´an´ı 3+256×1+255×2+1+4=774 cykl˚ u. Pˇri frekvenci fCP U = 1 MHz to znamen´a 774 µs, pˇri frekvence fCP U = 16 MHz trv´ a v´ ykon podprogramu 48 µs.
A.5
Obsluha pˇ reruˇ sen´ı
N´asleduj´ıc´ı zdrojov´ y k´ od reprezentuje jednoduchou aplikaci vyuˇz´ıvaj´ıc´ı pˇreruˇsen´ı od intern´ıho kompar´atoru. Pomoc´ı direktiv pˇrekladaˇce .org jsou do oblasti vektor˚ u pˇreruˇsen´ı, nadefinov´any nepodm´ınˇen´e skoky na konkr´etn´ı obsluˇzn´e rutiny pˇri resetu a pˇri zmˇenˇe v´ ystupu analogov´eho kompar´atoru. Aplikace vyuˇz´ıvaj´ıc´ı obsluhy pˇreruˇsen´ı ukl´adaj´ı, stejnˇe jako podprogramy, n´avratov´e adresy do z´asobn´ıku. Proto je nutn´e tento z´asobn´ık (registrov´ y p´ar SPH a SPL) definovat; nejl´epe bezprostˇrednˇe po spuˇstˇen´ı hlavn´ı ˇc´ asti aplikace (v naˇsem pˇr´ıpadˇe po n´avˇeˇst´ı reset:). Analogov´ y kompar´ator je nastaven prostˇrednictv´ım sv´eho kontroln´ıho registru ACSR (Analog Comparator Control and Status Register), kde se zamˇen´ı invertuj´ıc´ı vstup kompar´atoru za vnitˇrn´ı zdroj
Fakulta elektrotechniky a komunikaˇcn´ıch technologi´ı VUT v Brnˇe
83
Zdrojov´ y k´ od A.4: Vol´ an´ı podprogramu v jazyce symbolick´ ych adres. 1 2 3
.include <m16def.inc> .def temp = R16 .def counter = R17
; d e f i n i ˇc n´ı s o u b o r m i k r o k o n t r o l´e r u ATmega16 ; symbolicky ´ n´ a zev r e g i s t r u R16 ; symbolicky ´ n´ a zev r e g i s t r u R17
reset : LDI OUT LDI OUT
temp , LOW( RAMEND ) SPL , temp temp , HIGH( RAMEND ) SPH , temp
; ; ; ; ;
d e f i n i c e za ´ s o b n´ık u temp = n i ˇz ˇs´ı byte p o s l e d n´ı a d r e s y v SRAM n a p l nˇe n´ı n i ˇz ˇs´ı h o bytu Stack P o i n t e r u temp = v yˇs ˇs´ı byte p o s l e d n´ı a d r e s y v SRAM n a p l nˇe n´ı v yˇsˇs´ıh o bytu Stack P o i n t e r u )
setup : SER OUT CLR CLR
temp DDRB , temp counter temp
; ; ; ; ;
definov´ a n´ı p o r t u n a s t a v vˇs echny b i t y v r e g i s t r u temp port B = vy ´ s t u p n´ı n u l u j vˇs echny b i t y v r e g i s t r u c o u n t e r n u l u j hodnotu pro podprogram d e l a y
loop : OUT DEC RCALL RJMP
POTRB , counter counter delay loop
; ; ; ; ;
nekoneˇc n´ a smyˇcka p o ˇs l i obsah c o u n t e r na p o r t B dekrementace s t a v u ˇc´ı t a ˇc e c o u n t e r vola ´ n´ı podprogramu d e l a y skok na n a ´ v ˇe ˇs t´ı l o o p
; ; ; ;
podprogram r e a l i z u j´ı c´ı z p oˇz dˇe n´ı dekrementace pomocn´e promˇe nn´e pokud temp != 0 s k oˇc na d e l a y na ´ v r a t z podprogramu
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
delay : DEC BRNE RET
temp delay
referenˇcn´ıho napˇet´ı o nemˇenn´e hodnotˇe 1,23 V. Rovnˇeˇz se povol´ı pˇreruˇsen´ı pˇri jak´ekoliv zmˇenˇe v´ ystupu kompar´ atoru. Neinvertuj´ıc´ı vstup (pro ATmega16 je to pin PB3) pak pˇredstavuje sledovan´ y, vstupn´ı sign´ al. Hlavn´ı ˇc´ ast aplikace je zakonˇcena glob´aln´ım povolen´ım vˇsech pˇreruˇsen´ı (instrukce SEI) a nekoneˇcnou smyˇckou, kter´a jiˇz neobsahuje ˇz´adn´e dalˇs´ı instrukce. Toto zacyklen´ı je tedy moˇzn´e pˇreruˇsit pouze po zmˇenˇe v´ ystupn´ı hodnotˇe kompar´atoru, tj. pˇri zmˇenˇe stavu vstupn´ıho sign´ alu na pinu PB3.
A.6
ˇ Casovaˇ c watchdog
V´ yznam kontroln´ıho ˇcasovaˇce (tzv. watchdog) spoˇc´ıv´a ve vyvol´an´ı resetu cel´eho syst´emu v nestandardn´ıch situac´ıch. Takov´ a situace m˚ uˇze nastat napˇr. pˇri nedostateˇcn´em oˇsetˇren´ı podm´ınˇen´ ych skok˚ u, s´emantickou chybou, pˇr´ıp. ˇspatn´ ym hardwarov´ ym n´avrhem. Filozofie pouˇzit´ı watchdogu je v pˇredstavˇe, ˇze reset (a pˇredevˇs´ım n´asledn´e defaultn´ı nastaven´ı vˇsech intern´ıch perif´eri´ı, a v´ ykon programu od zaˇc´atku) odstran´ı vzniknou situaci. Watchdog obsahuje datov´ y registr, jejichˇz hodnota se automaticky zvyˇsuje, a reset se vyvol´a pˇri pˇreteˇcen´ı t´eto hodnoty. Intern´ı watchdog je tedy nutn´e opakovanˇe nulovat – typicky v nekoneˇcn´e smyˇcce – coˇz lze u mikrokontrol´er˚ u AVR prov´est instrukc´ı WDR (Watchdog Reset). Nastaven´ı jednotky je moˇzn´e prostˇrednictv´ım kontroln´ıho registru WDTCR (Watchdog Timer Control Register). V n´ asleduj´ıc´ım pˇr´ıkladˇe jsou vyuˇzity pouze bity pro povolen´ı watchdogu a pro nastaven´ı pˇreddˇeliˇcky ˇcasovaˇce: WDE – Watchdog Enable a WDP – Watchdog Timer Prescaler. Je-li nastavena maxim´ aln´ı pˇreddˇeliˇcka hodinov´eho sign´alu, k pˇreteˇcen´ı dojde pˇribliˇznˇe za 2,1 s. Aplikace obsahuje hlavn´ı funkci (od n´avˇeˇst´ı reset:) a nekoneˇcnou smyˇcku loop:, ve kter´e doch´az´ı k opakovan´emu nulov´ an´ı ˇcasovaˇce watchdog. D´ale aplikace obsahuje extern´ı zdroj pˇreruˇsen´ı INT0. V tˇele obsluhy tohoto pˇreruˇsen´ı je z´amˇern´a chyba – nekoneˇcn´a smyˇcka, kter´ a zp˚ usob´ı neukonˇcen´ı obsluhy pˇreruˇsen´ı a n´asledn´e pˇreteˇcen´ı watchdogu. Neb´ yt nˇej, do hlavn´ı
84
Mikroprocesorov´a technika a embedded syst´emy
Zdrojov´ y k´ od A.5: Obsluha pˇreruˇsen´ı v jazyce symbolick´ ych adres. 1 2
.include <m16def.inc> .def temp = R16
; d e f i n i ˇc n´ı s o u b o r m i k r o k o n t r o l´e r u ATmega16 ; symbolicky ´ n´ a zev r e g i s t r u R16
.cseg .org 0 x0000 RJMP reset .org 0 x0020 RJMP comparator
; ; ; ; ;
pamˇet’ ov´ y segment F l a s h u l oˇz od a d r e s y 0 x0000 skok na n a ´ v ˇe ˇs t´ı r e s e t v e k t o r pˇr e r uˇs e n´ı kompar´ a toru skok na n a ´ v ˇe ˇs t´ı comparator
.org 0 x002A reset : LDI temp , LOW( RAMEND ) OUT SPL , temp LDI temp , HIGH( RAMEND ) OUT SPH , temp
; ; ; ; ; ;
u l oˇz od a d r e s y 0x002A d e f i n i c e z´ a s o b n´ık u temp = n i ˇz ˇs´ı byte p o s l e d n´ı a d r e s y v SRAM n a p l nˇe n´ı n i ˇz ˇs´ı h o bytu Stack P o i n t e r u temp = v yˇs ˇs´ı byte p o s l e d n´ı a d r e s y v SRAM n a p l nˇe n´ı v yˇsˇs´ıh o bytu Stack P o i n t e r u )
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
setup : ; n a p l nˇe n´ı k o n t r o l n´ıc h r e g i s t r˚ u ; i n v e r t u j´ı c´ı vstup kompar´ a toru zamˇenˇen za v n i t ˇr n´ı r e f e r e n ˇc n´ı n a p ˇe t´ı 1 , 2 3 V ; p o v o l e n´ı pˇr e r uˇs e n´ı pˇr i pˇr e k l o p e n´ı v y ´ stupu kompar´ a toru LDI temp , (1<
25 26 27
loop : RJMP loop
; nekoneˇc n´ a smyˇcka ; skok na n a ´ v ˇe ˇs t´ı l o o p
comparator : IN temp , PORTB DEC temp OUT POTRB , temp RETI
; ; ; ; ;
28 29 30 31 32 33
o b s l u h a pˇr e r uˇs e n´ı kompar´ a toru n a ˇc t e n´ı a k t u a ´ l n´ıh o s t a v u p o r t u B dekrementace pomocn´e promˇe nn´e a k t u a l i z a c e vy ´ s t u p n´ıh o p o r t u B u k o nˇc e n´ı o b s l u h y pˇr e r uˇs e n´ı
funkce by se v´ ykon programu jiˇz nevr´atil. (Trv´an´ı nechtˇen´e smyˇcky je signalizov´ano rychl´ ym blik´an´ım LED diody pˇripojen´ı na pinu PB0.)
Fakulta elektrotechniky a komunikaˇcn´ıch technologi´ı VUT v Brnˇe
Zdrojov´ y k´ od A.6: Vyuˇzit´ı ochrann´eho ˇcasovaˇce watchdog v jazyce symbolick´ ych adres. 1 2
.include <m16def.inc> .def temp = R16
; d e f i n i ˇc n´ı s o u b o r m i k r o k o n t r o l´e r u ATmega16 ; symbolicky ´ n´ a zev r e g i s t r u R16
.cseg .org 0 x0000 RJMP reset .org 0 x0002 RJMP button
; ; ; ; ;
pamˇet’ ov´ y segment F l a s h u l oˇz od a d r e s y 0 x0000 skok na n a ´ v ˇe ˇs t´ı r e s e t v e k t o r e x t e r n´ıh o pˇr e r uˇs e n´ı INT0 skok na n a ´ v ˇe ˇs t´ı button
.org 0 x002A reset : LDI temp , LOW( RAMEND ) OUT SPL , temp LDI temp , HIGH( RAMEND ) OUT SPH , temp
; ; ; ; ; ;
u l oˇz od a d r e s y 0x002A d e f i n i c e z´ a s o b n´ık u temp = n i ˇz ˇs´ı byte p o s l e d n´ı a d r e s y v SRAM n a p l nˇe n´ı n i ˇz ˇs´ı h o bytu Stack P o i n t e r u temp = v yˇs ˇs´ı byte p o s l e d n´ı a d r e s y v SRAM n a p l nˇe n´ı v yˇsˇs´ıh o bytu Stack P o i n t e r u )
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
setup : LDI OUT LDI OUT LDI OUT LDI OUT SEI
; n a p l nˇe n´ı k o n t r o l n´ıc h r e g i s t r˚ u temp , ( 1<<WDE ) | ( 1<<WDP2 ) | ( 1<<WDP1 ) | ( 1<<WDP0 ) WDTCR , temp ; p o v o l e n´ı watchdogu s maxim´ a ln´ı pˇr e d d ˇe l i ˇc k o u temp , ( 1<
27 28 29 30
loop : WDR RJMP loop
; nekoneˇc n´ a smyˇcka ; nulova ´ n´ı watchdogu − n e d o j d e k r e s e t u ; skok na n a ´ v ˇe ˇs t´ı l o o p
button : IN DEC OUT RJMP RETI
; ; ; ; ; ;
31 32 33 34 35 36 37
temp , PORTB temp POTRB , temp button
o b s l u h a e x t e r n´ıh o pˇr e r uˇs e n´ı INT0 blika ´ n´ı LED na pinu PB0 a k t u a l i z a c e vy ´ s t u p n´ıh o pinu PB0 ´ z a c y k l e n´ı CHYBNE u k o nˇc e n´ı o b s l u h y pˇr e r uˇs e n´ı
85
86
B
Mikroprocesorov´a technika a embedded syst´emy
Uk´ azky program˚ u pro AVR v jazyce C
V t´eto kapitole jsou pˇredstaveny jednoduch´e zdrojov´e k´ody a aplikace pro 8bitov´ y mikrokontrol´er ATmega16, kter´e jsou vyvinuty ve vyˇsˇs´ım programovac´ım jazyce C. Ve vˇsech uk´azk´ach je pouˇzit voln´ y pˇrekladaˇc GCC s knihovnou avr-libc [Gcc09], [Lib09]. Pro tento pˇrekladaˇc plat´ı nˇekter´a pravidla. V d˚ usledku vlastnost´ı pˇrekladaˇc˚ u z jazyka C (case sensitive), je nutn´e n´azvy kontroln´ıch registr˚ u ps´ at velk´ ymi p´ısmeny (napˇr. DDRB, PORTB). Popisn´ y soubor konkr´etn´ıho mikrokontrol´eru vkl´ ad´ a pˇrekladaˇc automaticky na z´akladˇe vytvoˇren´eho projektu v AVR Studiu; program´ator vloˇz´ı jen soubor io.h pomoc´ı direktivy #include "avr\io.h". Nav´ıc, z´asobn´ık je u aplikac´ı s podprogramy a pˇreruˇsen´ımi definov´an automaticky, stejnˇe jako ukonˇcen´ı obou typ˚ u rutin.
B.1
Ovl´ ad´ an´ı vstupnˇ e/v´ ystupn´ıho portu
Aplikace je totoˇzn´ a se zdrojov´ ym k´odem, uveden´ ym v kapitole A.2, tj. prostˇrednictv´ım v´ ystupn´ıho portu B mikrokontrol´eru ATmega16 je generov´an 8bitov´ y bin´arn´ı ˇc´ıtaˇc. Velikost v´ ysledn´eho k´ odu je bez pouˇzit´ı optimalizaˇcn´ıch n´astroj˚ u rovna 184 B (tj. pˇribliˇznˇe 1,1% pamˇeti ATmega16). Zdrojov´ y k´ od B.1: Bin´ arn´ı ˇc´ıtaˇc v jazyce C. 1
#include
// h l a v iˇc k o v y ´ s o u b o r m i k r o k o n t r o l´e r u
i n t main ( void ) {
// h l a v n´ı f u n k c e a p l i k a c e
2 3 4 5 6
DDRB = 0 xFF ; PORTB = 0 xFF ;
// smˇe rov´ y r e g . DDRB = 2 5 5 , t j . c e l y ´ port B j e vy ´ s t u p n´ı // v y ´ s t u p n´ı p o r t B = 255
while ( 1 ) PORTB−− ;
// nekoneˇc n´ a smyˇcka // PORTB = PORTB − 1
return ( 1 ) ;
// v y ´ s t u p n´ı hodnota f u n k c e = 1
7 8 9 10 11 12
}
Hlavn´ı funkce cel´e aplikace main() obsahuje nastaven´ı v´ ystupn´ıho portu B a nekoneˇcnou smyˇcku while( 1 ) s aktualizac´ı v´ ystupn´ı hodnoty portu B. Zkr´acen´ y z´apis PORTB-- je totoˇzn´ y s rovnic´ı PORTB = PORTB − 1. Jsou-li k portu B pˇripojeny LED diody, mohla by b´ yt hodnota ˇc´ıtaˇce na nich pozorovateln´ a.
B.2
Podm´ınˇ en´ e vˇ etven´ı programu
Aplikace s podm´ınˇen´ ym v´ ykonem ˇc´ asti programu je ekvivalentem k´odu z kapitoly A.3. V programu jsou neust´ ale testov´ any dva bity kontroln´ıho registru PINB, kter´e koresponduj´ı s hodnotou dvou vstupn´ıch pin˚ u na portu B; tedy napˇr. hodnoty od tlaˇc´ıtek. Je-li stisknuto tlaˇc´ıtko na pinu PB0 je inkrementov´ ana lok´ aln´ı promˇenn´a temp; je-li stisknuto tlaˇc´ıtko na pinu PB1, promˇenn´ a temp je dekrementov´ ana. Hodnota t´eto promˇenn´e je indikov´ana na v´ ystupn´ım portu C. Pro testov´an´ı je vyuˇzita funkce bit is clear(), kter´a m´a dva parametry: n´azev kontroln´ıho registru a pozici bitu v nˇem. Jak n´ azev funkce napov´ıd´a v´ ystupn´ı hodnota je jedna (true), pokud je testovan´ y bit roven nule. Obdobnˇe lze vyuˇz´ıvat tak´e funkci bit is set(), jej´ıˇz hodnota je true, pokud testovan´ y bit je roven jedn´e. Viz napˇr. kapitola 6.3.
Fakulta elektrotechniky a komunikaˇcn´ıch technologi´ı VUT v Brnˇe
87
Zdrojov´ y k´ od B.2: Podm´ınˇen´e vˇetven´ı programu v jazyce C. 1
#include
// h l a v iˇc k o v y ´ s o u b o r m i k r o k o n t r o l´e r u
i n t main ( void ) { char temp = 0 ;
// h l a v n´ı f u n k c e a p l i k a c e // d e k l a r a c e l o k a ´ l n´ı 8 b i t o v ´e promˇe nn´e temp = 0
2 3 4 5 6 7
DDRB = 0 x00 ; DDRC = 0 xFF ;
// p o r t B = v s t u p n´ı // p o r t C = v y ´ s t u p n´ı
while ( 1 ) {
// nekoneˇc n´ a smyˇcka
8 9 10
// pokud p i n 0 na p o r t u B = 0 , i n k r e m e n t u j temp i f ( bit_is_clear ( PINB , 0 ) ) temp++ ;
11 12 13
// pokud p i n 1 na p o r t u B = 0 , dekrementuj temp i f ( bit_is_clear ( PINB , 1 ) ) temp−− ;
14 15 16
// p o ˇs l i obsah promˇe nn´e temp na v y ´ s t u p n´ı p o r t C PORTC = temp ;
17 18
}
19 20
return ( 1 ) ;
21 22
// v y ´ s t u p n´ı hodnota f u n k c e = 1
}
B.3
Vol´ an´ı funkce
Program v jazyce C se vˇzdy skl´ ad´ a z jednotliv´ ych funkc´ı. Kaˇzd´a funkce m˚ uˇze m´ıt (ale nemus´ı) urˇcit´ y poˇcet vstupn´ıch argument˚ u, kter´e jsou v tˇele funkce ch´ap´any jako lok´aln´ı promˇenn´e. Funkce tak´e m˚ uˇze (ale nemus´ı) vracet jedinou v´ ystupn´ı hodnotu. Velmi ˇcasto je touto hodnotou ˇc´ıseln´ y identifik´ ator, zda pˇri v´ ykonu funkce nedoˇslo k chybˇe. Funkce z jazyka C jsou pro AVR pˇrekl´ad´any jako podprogramy. Ve zdrojov´em k´ odu B.3 je pops´ an zp˚ usob pouˇzit´ı funkce v jazyce C. Kromˇe hlavn´ı funkce main() je ˇc´ ast k´ odu vykon´ av´ ana v r´ amci funkce delay(), kter´a je vol´ana pˇri kaˇzd´em pr˚ uchodu nekoneˇcn´e smyˇcky hlavn´ı funkce. Funkce delay() mus´ı b´ yt pˇredem definov´ana, tj. mus´ı b´ yt uveden jej´ı prototyp. Ten deklaruje pˇr´ıpadn´e vstupn´ı argumenty – v tomto pˇr´ıpadˇe, funkce obsahuje jedin´ y vstupn´ı argument typu unsigned char, tj. neznam´enkov´e, cel´e, 8bitov´e ˇc´ıslo. V´ ystupn´ı hodnota funkce je deklarov´ana jako int. Z´apisem delay( 255 ) vol´ame funkci a lok´aln´ı promˇennou temp napln´ıme vstupn´ı hodnotou 255, coˇz pˇredstavuje poˇcet opakov´ an´ı zpoˇzd’ovac´ıho cyklu while uvnitˇr funkce delay().
B.4
Obsluha pˇ reruˇ sen´ı
Pro vyuˇzit´ı pˇreruˇsen´ı mikrokontrol´er˚ u AVR v jazyce C je nutn´e vloˇzit do projektu hlaviˇckov´ y soubor interrupt.h, obsahuj´ıc´ı definice obsluˇzn´ ych rutin. Pˇri v´ yvoji aplikac´ı nen´ı nutn´e zn´ at konkr´etn´ı adresy vektor˚ u pˇreruˇsen´ı. Samotn´e obsluhy pˇreruˇsen´ı pˇredstavuj´ı vˇzdy makra ISR (anglicky: Interrupt Service Routine) se vstupn´ım parametrem, kter´ y identifikuje zdroj pˇreruˇsen´ı (viz tabulka 6.1). V pˇr´ıkladˇe B.4 (ekvivalent zdrojov´eho k´odu z kapitoly A.5) je t´ımto zdrojem intern´ı analogov´ y kompar´ ator (ANA COMP vect). Hlavn´ı funkce aplikace obsahuje jen nastaven´ı dvou kontroln´ıch registr˚ u: pro analogov´ y kompar´ator a port B. Pomoc´ı bit˚ u ACBG a ACIE je jeden ze vstup˚ u kompar´atoru zamˇenˇen za vnitˇrn´ı referenˇcn´ı napˇet´ı o hodnotˇe 1,23 V (pro ATmega16 je druh´ y z analogov´ ych vstup˚ u kompar´atoru pˇripojen na pin PB3), a je povoleno generov´an´ı pˇreruˇsen´ı pˇri libovoln´e zmˇenˇe na v´ ystupu kompar´ atoru. Pozn.: V´ yznam jednotliv´ ych bit˚ u byl zjiˇstˇen z manu´alu mikrokontrol´eru
88
Mikroprocesorov´a technika a embedded syst´emy
Zdrojov´ y k´ od B.3: Vol´ an´ı funkce v jazyce C. 1
#include
// h l a v iˇc k o v y ´ s o u b o r m i k r o k o n t r o l´e r u
i n t delay ( unsigned char ) ;
// p r o t o t y p f u n k c e d e l a y
i n t main ( void ) { unsigned char counter = 0 ;
// h l a v n´ı f u n k c e a p l i k a c e // d e k l a r a c e l o k a ´ l n´ı promˇe nn´e c o u n t e r
2 3 4 5 6 7 8
DDRB = 0 xFF ;
// p o r t B = v y ´ s t u p n´ı
while ( 1 ) { PORTB = counter ; counter−− ; delay ( 255 ) ; }
// // // //
return ( 1 ) ;
// v y ´ s t u p n´ı hodnota f u n k c e = 1
9 10 11 12 13 14
nekoneˇc n´ a smyˇcka a k t u a l i z a c e hodnoty na p o r t u B dekrementace ˇc´ı t a ˇc e vola ´ n´ı z p oˇz d’ o v a c´ı f u n k c e s parametrem 255
15 16 17
}
18 19
i n t delay ( unsigned char temp ) {
// t ˇe l o f u n k c e d e l a y
20 21 22
while ( temp > 0 ) temp−− ;
// opakuj , dokud temp != 0 // dekrementace pomocn´e promˇe nn´e
return ( 0 ) ;
// v y ´ s t u p n´ı hodnota f u n k c e = 0
23 24 25
}
Zdrojov´ y k´ od B.4: Pˇreruˇsen´ı mikrokontrol´eru v jazyce C. 1 2
#include #include
// h l a v iˇc k o v y ´ s o u b o r m i k r o k o n t r o l´e r u // h l a v iˇc k o v y ´ s o u b o r pro pˇr e r uˇs e n´ı
ISR ( ANA_COMP_vect ) {
// o b s l u h a pˇr e r uˇs e n i a n a l o g o v´e h o kompar´ a toru
3 4 5
PORTB−− ;
6 7
// dekrementace s t a v u v y ´ s t u p n´ıh o p o r t u B
}
8 9
i n t main ( void ) {
// h l a v n´ı f u n k c e a p l i k a c e
10
/∗ i n v e r t u j´ı c´ı vstup kompar´ a toru zamˇenˇen za v n i t ˇr n´ı r e f e r e n ˇc n´ı n a p ˇe t´ı 1 , 2 3 V zapnuto p o v o l e n´ı pˇr e r uˇs e n´ı pˇr i pˇr e k l o p e n´ı v y ´ stupu kompar´ a toru ∗/ ACSR |= ( 1<
11 12 13 14 15
DDRB = 0 xFF ;
// p o r t B = v y ´ s t u p n´ı
sei ( ) ; while ( 1 ) ; return ( 1 ) ;
// g l o b a ´ l n´ı p o v o l e n´ı pˇr e r uˇs e n´ı // nekoneˇc n´ a smyˇcka // v y ´ s t u p n´ı hodnota f u n k c e = 1
16 17 18 19 20
}
AVR [Atm16]. I/O port B mikrokontrol´eru AVR je nastaven jako v´ ystupn´ı. Hlavn´ı funkce d´ale obsahuje jen glob´ aln´ı povolen´ı vˇsech pˇreruˇsen´ı – v jazyce C pomoc´ı funkce sei() a nekoneˇcnou smyˇcku. Jedinou moˇznost´ı pro mikrokontrol´er, jak se z t´eto smyˇcky dostat je pouze pˇreruˇsen´ı od kompar´atoru. Obsluha pˇreruˇsen´ı obsahuje jen zmˇenu stavu na v´ ystupn´ım portu B. Nen´ı tak´e nutn´e implicitnˇe uv´ adˇet instrukci pro ukonˇcen´ı obsluhy pˇreruˇsen´ı (tj. RETI); tu pˇrid´a pˇrekladaˇc automaticky za posledn´ı pˇr´ıkaz makra ISR.
Fakulta elektrotechniky a komunikaˇcn´ıch technologi´ı VUT v Brnˇe
B.5
89
ˇ Casovaˇ c watchdog
Zdrojov´ y k´ od je ekvivalentem aplikace v jazyce symbolick´ ych adres z kapitoly A.6. V nekoneˇcn´e smyˇcce je pro nulov´ an´ı ˇcasovaˇce watchdog pouˇzita instrukce WDR. Jednoduch´e vloˇzen´ı instrukce(´ı) AVR do zdrojov´eho k´ odu v jazyce C, kdy nen´ı potˇreba pˇred´avat parametry/hodnoty mezi vyˇsˇs´ım a niˇzˇs´ım jazykem lze realizovat funkc´ı asm(). Parametrem t´eto funkce je ˇretˇezec obsahuj´ıc´ı posloupnost instrukc´ı, kter´ a se m´ a pˇr´ımo vloˇzit do pˇrekompilovan´e aplikace. Zdrojov´ y k´ od B.5: Vyuˇzit´ı ochrann´eho ˇcasovaˇce watchdog v jazyce C. 1 2
#include #include
// h l a v iˇc k o v y ´ s o u b o r m i k r o k o n t r o l´e r u // h l a v iˇc k o v y ´ s o u b o r pro pˇr e r uˇs e n´ı
ISR ( INT0_vect ) {
// o b s l u h a e x t e r n´ıh o pˇr e r uˇs e n i INT0
3 4 5
while ( 1 ) PORTB−− ;
6 7 8
´ z a c y k l e n´ı // CHYBNE // b l i k a ´ n´ı LED na pinu PB0
}
9 10
i n t main ( void ) {
// h l a v n´ı f u n k c e a p l i k a c e
11
// p o v o l e n´ı watchdogu s pˇr e d dˇe l iˇc k a , t j . pˇr e t e ˇc e n´ı za 2 , 1 s WDTCR |= ( 1<<WDE ) | ( 1<<WDP2 ) | ( 1<<WDP1 ) | ( 1<<WDP0 ) ;
12 13 14
GICR
15
|= ( 1<
// p o v o l e n´ı e x t e r n´ıh o pˇr e r uˇs e n´ı INT0
16
// g e n e r o v a t pˇr e r uˇs e n´ı INT0 na s e s t u p n o u hranu MCUCR |= ( 1<
17 18 19 20
DDRB = 1 ;
// p i n PB0 = v y ´ s t u p n´ı
sei ( ) ; while ( 1 ) { asm ( ”WDR” ) ; } return ( 1 ) ;
// g l o b a ´ l n´ı p o v o l e n´ı pˇr e r uˇs e n´ı // nekoneˇc n´ a smyˇcka // n u l o v ´ a n´ı watchdogu
21 22 23 24 25 26 27
// v y ´ s t u p n´ı hodnota f u n k c e = 1
}
Aplikace vyuˇz´ıv´ a extern´ıho zdroje pˇreruˇsen´ı s oznaˇcen´ım INT0. To se spust´ı pˇri kaˇzd´e sestupn´e hranˇe vstupn´ıho sign´ alu (viz naplnˇen´ı kontroln´ıch registr˚ u GICR a MCUCR). V r´amci pˇreruˇsen´ı doch´ az´ı k neˇz´ adouc´ımu zacyklen´ı a ke zmˇenˇe hodnoty na portu B. Je-li definov´an jako v´ ystupn´ı pouze pin PB0 (viz naplnˇen´ı registru DDRB), bude v tomto cyklu blikat pouze jedna LED dioda z portu B. Po uplynut´ı cca 2 sekund dojde k pˇreteˇcen´ı ochrann´eho ˇc´ıtaˇce watchdog, coˇz zp˚ usob´ı reset cel´eho syst´emu a n´ avrat do hlavn´ı funkce main().
B.6
Vol´ an´ı funkce v JSA z aplikace v jazyce C
Pˇri v´ yvoji aplikac´ı pro mikrokontrol´ery lze kombinovat zdrojov´e k´ody ve vyˇsˇs´ım jazyce C ˇ a v niˇzˇs´ım jazyce symbolick´ ych adres. Casto se toho vyuˇz´ıv´a pˇri vol´an´ı funkce(´ı), jej´ıˇz v´ ykon chce m´ıt program´ ator pod absolutn´ı kontrolou (pˇredevˇs´ım z d˚ uvodu pˇresn´eho ˇcasov´an´ı). V kapitole B.5 byla pˇredstavena funkce asm(), kter´a zajiˇst’uje vloˇzen´ı konkr´etn´ıch instrukc´ı pˇri pˇrekladu z jazyka C. V pˇr´ıpadˇe pˇred´ av´ an´ı hodnot promˇenn´ ych, deklarovan´ ych ve vyˇsˇs´ım jazyce, nen´ı ˇ moˇzn´e tento pˇr´ıstup pouˇz´ıt. Reˇsen´ım je vyuˇzit´ı samostatn´ ych zdrojov´ ych soubor˚ u a plnˇen´ı registr˚ u hodnotami vstupn´ıch parametr˚ u funkce v pevnˇe definovan´em poˇrad´ı. N´asleduj´ıc´ı aplikace realizuje v´ ypoˇcet souˇctu dvou komplexn´ıch ˇc´ısel. Zdrojov´ y k´od v jazyce C (koncovka .c) vypad´ a n´asledovnˇe.
90
Mikroprocesorov´a technika a embedded syst´emy
Zdrojov´ y k´ od B.6: Kombinace zdrojov´ ych k´od˚ u v jazyce C a v jazyce symbolick´ ych adres pro mikrokontrol´er AVR – soubor f1.c. 1
#include
// h l a v iˇc k o v y ´ s o u b o r m i k r o k o n t r o l´e r u
SOUBOR: f 1 . c
2 3 4
/∗ p r o t o t y p f u n k c e z e x t e r n´ıh o souboru ( f 2 . s ) ∗/ extern i n t add_compl ( int , i n t ) ;
5 6 7 8 9
i n t main ( int a int b int c
void ) { = 0 x0A05 ; = 0 x1403 ; ;
// h l a v n´ı f u n k c e a p l i k a c e // a r = 1 0 , a i = 5 // b r = 2 0 , b i = 3
10 11
c = add_compl ( a , b ) ;
// v o l a ´ n´ı f u n k c e v JSA
while ( 1 ) ; return ( 1 ) ;
// nekoneˇc n´ a smyˇcka // v y ´ s t u p n´ı hodnota f u n k c e = 1
12 13 14 15
}
Kl´ıˇcov´e slovo extern v prototypu funkce add compl() napov´ıd´a, ˇze tˇelo funkce se vyskytuje v jin´em zdrojov´em souboru. Tato funkce m´a dva vstupn´ı operandy – pˇredstavuj´ı komplexn´ı ˇc´ısla – a oba jsou typu int, tj. jsou to 16bitov´a ˇc´ısla. V´ yznam tˇechto bit˚ u je n´asleduj´ıc´ı: vyˇsˇs´ı bajt pˇredstavuje re´ alnou ˇc´ ast komplexn´ıho ˇc´ısla, niˇzˇs´ı byte pak pˇredstavuje imagin´arn´ı ˇc´ast. Funkce vrac´ı hodnotu stejn´eho typu a stejn´eho v´ yznamu. N´asleduje v´ ypis zdrojov´eho k´odu v jazyce symbolick´ ych adres, uloˇzen´em v textov´em souboru s koncovkou .s. Zdrojov´ y k´ od B.7: Kombinace zdrojov´ ych k´od˚ u v jazyce C a v jazyce symbolick´ ych adres pro mikrokontrol´er AVR – soubor f2.s. 1
#include
; h l a v iˇc k o v y ´ s o u b o r m i k r o k o n t r o l´e r u
.global add_compl .func add_compl add_compl : ADD R25 , R23 ADD R24 , R22
; definice globa ´ l n´ıh o parametru − n´ a zvu podprogramu ; z aˇc a ´ t e k podprogramu ( f u n k c e )
SOUBOR: f 2 . s
2 3 4 5 6 7
; s o uˇc e t r e a ´lny ´ c h ˇc a ´ s t´ı ; s o uˇc e t i m a g i n a ´ r n´ıc h ˇc a ´ s t´ı
8
RET .endfunc
9 10
; na ´ v r a t z podprogramu / f u n k c e ; konec podprogramu ( f u n k c e )
Proces pˇred´ av´ an´ı parametr˚ u mezi zdrojov´ ym k´odem v jazyce C a jazykem symbolick´ ych adres ’ je pevnˇe d´an a zajiˇst uje ho pˇrekladaˇc. Pˇri vol´an´ı funkce add compl( a, b ) je tak zajiˇstˇeno nakop´ırov´an´ı hodnot promˇenn´e a do registr˚ u R25 a R24, hodnota promˇenn´e b je pak pˇr´ıtomna v registrov´em p´ aru R23:22. V´ yznam jednotliv´ ych bajt˚ u je rovnˇeˇz patrn´ y z obr´azku B.1. Zdrojov´ y k´ od v jazyce symbolick´ ych adres mus´ı obsahovat direktivy .global, .func a .endfunc. Jejich v´ yznam je patrn´ y ze zdrojov´eho k´odu B.7. Vrac´ı-li funkce hodnotu, mus´ı b´ yt uloˇzena v registrech R25 a R24 (v naˇsem pˇr´ıpadˇe obsahuj´ı tyto registry re´alnou a imagin´arn´ı hodnotu v´ ysledn´eho souˇctu). V´ıce o pˇred´av´an´ı parametr˚ u z jazyka C v kapitole 6.4.
B.7
A/D pˇ revodn´ık
V t´eto kapitole je pˇredstavena moˇznost pouˇzit´ı intern´ıho A/D pˇrevodn´ıku mikrokontrol´eru AVR. Tento pˇrevodn´ık je 8mi kan´ alov´ y (lze tedy postupnˇe pˇrep´ınat aˇz mezi 8mi analogov´ ymi vstupy) a pˇreveden´a hodnota je 10bitov´ a. Pˇrevodn´ık je ˇr´ızen intern´ım hodinov´ ym sign´alem, jehoˇz frek-
Fakulta elektrotechniky a komunikaˇcn´ıch technologi´ı VUT v Brnˇe
91
Pracovn´ı registry 7
0
={b}
R22
<{b}
R23
={a}
R24
<{a}
R25
} }
int b
int a
Obr´ azek B.1: Pˇred´ av´ an´ı vstupn´ıch parametr˚ u z jazyka C pro mikrokontrol´ery AVR.
vence mus´ı leˇzet v intervalu 50 kHz aˇz 250 kHz; ta se odvozuje od frekvence j´adra mikrokontrol´er˚ u prostˇrednictv´ım pevn´ ych pˇreddˇeliˇcek. Zdrojov´ y k´od B.8 pˇredstavuje aplikaci, kter´a opakovanˇe pˇrev´ad´ı hodnoty ze vstup˚ u PA7, PA6 a PA5. Po dokonˇcen´ı kaˇzd´eho pˇrevodu se spust´ı obsluha pˇreruˇsen´ı ISR( ADC vect ) kde je nejprve naplnˇena promˇenn´a adcData pˇrevedenou hodnotou, n´aslednˇe se nastav´ı dalˇs´ı analogov´ y kan´al, rozsv´ıt´ı se barevn´a identifikaˇcn´ı dioda a zah´aj´ı se dalˇs´ı pˇrevod. Princip pˇrep´ın´ an´ı mezi kan´ aly je zˇrejm´ y z diagramu B.2. ISR: ADC
zpracov´ an´ı aktu´ aln´ıho vzorku
naˇcten´ı vzorku ADCW zpracov´ an´ı
kan´ al==7
+ kan´ al = 6
red LED
kan´ al = 5
yellow LED
kan´ al = 7
green LED
− pˇrep´ın´ an´ı mezi trojic´ı kan´ al˚ u
kan´ al==6
+
− kan´ al==5
+
− start nov´eho A/D pˇrevodu
zah´ ajen´ı nov´eho A/D pˇrevodu konec pˇreruˇsen´ı
Obr´ azek B.2: Obsluha pˇreruˇsen´ı po dokonˇcen´ı A/D pˇrevodu. V obsluze tak chyb´ı samotn´e zpracov´an´ı ˇc´ıseln´e hodnoty z analogov´eho kan´alu. K intern´ımu A/D pˇrevodn´ıku se pˇristupuje v´ yhradn´e prostˇrednictv´ım kontroln´ıch registr˚ u ADMUX (ADC Multiplexer Selection Register) – vybr´an´ı jednoho kan´alu, pˇr´ıp. referenˇcn´ıho napˇet´ı a ADCSRA (ADC Control and Status Register) – zapnut´ı A/D pˇrevodn´ıku, zah´ajen´ı pˇrevodu, povolen´ı pˇreruˇsen´ı po dokonˇcen´ı pˇrevodu, nastaven´ı pˇreddˇeliˇcky hodinov´eho sign´alu. Hlavn´ı funkce aplikace obsahuje pouze nastaven´ı vˇsech kontroln´ıch registr˚ u, povolen´ı pˇreruˇsen´ı a nekoneˇcnou smyˇcku.
92
Mikroprocesorov´a technika a embedded syst´emy
Zdrojov´ y k´ od B.8: A/D pˇrevod pomoc´ı intern´ıho pˇrevodn´ıku AVR 1 2
#include #include
// h l a v iˇc k o v y ´ s o u b o r m i k r o k o n t r o l´e r u // h l a v iˇc k o v y ´ s o u b o r pro pˇr e r uˇs e n´ı
#define #define #define #define
// // // //
3 4 5 6 7
LEDs red yellow green
PORTB 0 b11011111 0 b10111111 0 b01111111
d i r e k t i v y pre−p r o c e s o r u ˇc e r v e n a ´ LED d i o d a j e pˇr i p o j e n a ´ na pinu PB5 ˇz l u t a ´ LED d i o d a j e pˇr i p o j e n a ´ na pinu PB6 zelena ´ LED d i o d a j e pˇr i p o j e n a ´ na pinu PB7
8 9
char channel ;
// pomocn´ y identifika ´ t o r A/D ka n´ alu
ISR ( ADC_vect ) { unsigned i nt adcData ;
// o b s l u h a pˇr e r uˇs e n´ı A/D pˇr e v o d n´ık u // d e k l a r a c e l o k a ´ l n´ı promˇe nn´e
10 11 12 13
adcData = ADCW ;
14
// n a ˇc t e n´ı 10 b i t o v ´e hodnoty A/D pˇr evodu
15
/∗ zde c h y b´ı ˇc a ´ s t k´ o du , k t e r a ´ p r a c u j e s pˇr evedenou hodnotou ; napˇr . j i z o b r a z´ı na LCD d i s p l e j i , v yˇs l e po s ´e r i o v ´e l i n c e , pˇr i d a ´ do kruhov´e pamˇe ti FIR f i l t r u , apod . Promˇenn´ a adcData nab´ y v´ a hodnot 0 aˇz 1 , 0 2 3 ∗/
16 17 18 19
// r e ˇz i e pˇr e p´ın a ´ n´ı mezi 3 k a n ´ aly ; v i z u a ´ l n´ı s i g n a l i z a c e pomoc´ı LED d i o d i f ( channel == 7 ) { ADMUX |= ( 1<<MUX2 ) | ( 1<<MUX1 ) | ( 0<<MUX0 ) ; // k a n a ´ l PA6 channel = 6 ; // pomocn´ y identifika ´ t o r k an´ a lu LEDs = red ; // s i g n a l i z a ˇc n´ı LED } e l s e i f ( channel == 6 ) { ADMUX |= ( 1<<MUX2 ) | ( 0<<MUX1 ) | ( 1<<MUX0 ) ; // k a n a ´ l PA5 channel = 5 ; // pomocn´ y identifika ´ t o r k an´ a lu LEDs = yellow ; // s i g n a l i z a ˇc n´ı LED } e l s e i f ( channel == 5 ) { ADMUX |= ( 1<<MUX2 ) | ( 1<<MUX1 ) | ( 1<<MUX0 ) ; // k a n a ´ l PA7 channel = 7 ; // pomocn´ y identifika ´ t o r k an´ a lu LEDs = green ; // s i g n a l i z a ˇc n´ı LED }
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
// z a p n u t´ı A/D pˇr evodn´ıku , z a h a ´ j e n´ı nov´e ho pˇr evodu ADCSRA |= ( 1<
37 38 39
}
40 41
i n t main ( void ) {
// h l a v n´ı f u n k c e a p l i k a c e
42
DDRB = 0 b11100000 ;
43
// d e k l a r a c e v y ´ s t u p n´ıc h pin˚ u pro bar evn´e LED
44
// v y ´ bˇe r k an´ a lu na pinu PA7 ADMUX |= ( 1<<MUX2 ) | ( 1<<MUX1 ) | ( 1<<MUX0 ) ; channel = 7 ; // pomocn´ y identifika ´ t o r k an´ a lu
45 46 47 48
/∗ z a p n u t´ı A/D pˇr evodn´ıku , z a h a ´ j e n´ı pˇrevodu , p o v o l e n´ı pˇr e r uˇs e n´ı pˇr e d d ˇe l i ˇc k a n a s t a v e n a na 128 ∗/ ADCSRA |= ( 1<
49 50 51 52 53
sei ( ) ; while ( 1 ) ; return ( 1 ) ;
54 55 56 57
}
// g l o b a ´ l n´ı p o v o l e n´ı pˇr e r uˇs e n´ı // nekoneˇc n´ a smyˇcka // v y ´ s t u p n´ı hodnota f u n k c e = 1
Fakulta elektrotechniky a komunikaˇcn´ıch technologi´ı VUT v Brnˇe
C
Znakov´ a sada LCD displeje 0·
2·
3·
4·
5·
6·
7·
·0 ·1 ·2 ·3 ·4 ·5 ·6 ·7 ·8 ·9 ·A ·B ·C ·D ·E ·F Obr´ azek C.1: Znakov´ a sada LCD displeje.
A· B· C· D· E· F·
93