Projekt OP VK CZ.1.07/1.1.07/11.0112
Podpora odborného vzdělávání na středních školách MSK
SŠ teleinformatiky Ostrava, p.o. Opavská 1119 708 61 Ostrava - Poruba www.teleinformatika.eu tel.: 596 919 000 e-mail:
[email protected]
www.spravnysmer.cz
MIKROKONTROLÉRY Atmel AVR – Atmega128 Vratislav Pivoňka
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128
Obsah: 1 2
Úvod ................................................................................................................... 1 Mikrokontrolér ATmega 128 ............................................................................. 2 2.1 Základní vlastnosti mikrokontroléru .......................................................... 2 2.2 Porty ........................................................................................................... 3 2.2.1 Port A ................................................................................................. 3 2.2.2 Port B ................................................................................................. 4 2.2.3 Port C ................................................................................................. 5 2.2.4 Port D ................................................................................................. 6 2.2.5 Port E.................................................................................................. 7 2.2.6 Port F .................................................................................................. 8 2.2.7 Port G ................................................................................................. 9 2.2.8 Speciální funkční registr .................................................................. 10 2.3 Jádro mikrokontroléru .............................................................................. 11 2.4 Aritmeticko logická jednotka ................................................................... 12 2.5 Registry .................................................................................................... 12 2.5.1 Stavový registr ................................................................................. 12 2.5.2 Hlavní registry.................................................................................. 14 2.6 Paměti....................................................................................................... 15 2.6.1 Paměť RAM ..................................................................................... 15 2.6.2 Paměť EEPROM .............................................................................. 16 2.6.3 Programová paměť Flash ................................................................. 17 2.7 Hodiny ...................................................................................................... 18 2.7.1 Kalibrovaný vnitřní RC oscilátor ..................................................... 19 2.8 Čítače – časovače ..................................................................................... 20 2.8.1 Módy čítače – časovače ................................................................... 20 2.8.2 Nastavení registrů časovačů ............................................................. 21 2.9 Obecné přerušení ...................................................................................... 24 2.10 Sériové periferní rozhraní – SPI............................................................... 25 2.11 USART..................................................................................................... 26 2.11.1 Nastavení komunikační rychlosti ..................................................... 27 2.11.2 Nastavení řídících registrů ............................................................... 27 2.11.3 Multiprocesorová komunikace ......................................................... 29 2.12 Analogový komparátor............................................................................. 30 2.13 Analogově digitální převodník................................................................. 30 3 Vývojové prostředky ........................................................................................ 32 3.1 Základní modul MB-ATmega128 ............................................................ 32 3.1.1 Vlastnosti modulu MB-ATmega128 ................................................ 33 3.1.2 Stručný popis modulu ...................................................................... 34 3.1.3 Provozní podmínky a parametry ...................................................... 35 3.1.4 Nastavení a použití ........................................................................... 35 3.2 Modul 8 LED a 8 tlačítek ......................................................................... 36 3.2.1 Vlastnosti modulu 8 LED a 8 tlačítek .............................................. 36 3.2.2 Stručný popis modulu ...................................................................... 36 3.2.3 Provozní podmínky a parametry ...................................................... 37 3.2.4 Použití tlačítek.................................................................................. 37 Řízení LED diod .............................................................................. 37 3.2.5 3.3 Modul LED displej a LCD displej ........................................................... 38
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128
4
5
6
7 8
3.3.1 Vlastnosti modulu LED displej a LCD displej ................................ 38 3.3.2 Stručný popis modulu ...................................................................... 38 3.3.3 Provozní podmínky a parametry ...................................................... 39 3.3.4 Nastavení a použití ........................................................................... 39 Prostředí AVR Studio 4 ................................................................................... 40 4.1 Nový projekt ............................................................................................ 40 4.2 Tvorba programu ...................................................................................... 41 4.3 Tabulka povelů mikrokontroléru ............................................................. 44 4.4 Zavedení programu do mikrokontroléru .................................................. 46 Příklady programů v Assembleru .................................................................... 49 5.1 Program „Čítač“ ....................................................................................... 49 5.1.1 Popis programu „Čítač“ ................................................................... 49 5.1.2 Vývojový diagram programu „Čítač“ .............................................. 50 5.1.3 Zdrojový kód programu „Čítač“ ...................................................... 50 5.2 Program „Tlačítka 1“ ............................................................................... 53 5.2.1 Popis programu „Tlačítka 1“............................................................ 53 5.2.2 Vývojový diagram programu „Tlačítka 1“ ...................................... 53 5.2.3 Zdrojový kód programu „Tlačítka 1“............................................... 53 5.3 Program „Tlačítka 2“ ............................................................................... 56 5.3.1 Popis programu „Tlačítka 2“............................................................ 56 5.3.2 Vývojový diagram programu „Tlačítka 2“ ...................................... 57 5.3.3 Zdrojový kód programu „Tlačítka 2“............................................... 57 5.4 Příklady užitečných podprogramů ........................................................... 61 5.4.1 Převod HEX na BCD ....................................................................... 61 5.4.2 Dekodér pro sedmisegmentový displej ............................................ 62 5.4.3 Generátor sekundových impulzů...................................................... 64 Programovací jazyk „C“ .................................................................................. 67 6.1 Program „Čítač“ ....................................................................................... 67 6.2 Program „Tlačítka 1“ ............................................................................... 68 6.3 Program „Tlačítka 2“ ............................................................................... 70 Závěr ................................................................................................................ 72 Použitá literatura .............................................................................................. 73
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128
1 Úvod S procesorovou technikou se dnes setkáváme na každém kroku. Mnohdy si to ani neuvědomujeme. Je téměř v každém elektronickém zařízení. Příkladem může být třeba i automatická pračka, kde kromě řízení vlastního chodu pračky váží prádlo a na základě toho pak určuje potřebné množství prášku a vody. Podle čistoty odtokové vody pak určuje potřebný počet máchání a při odstředění si hlídá správné rozložení prádla tak, aby se pračka zbytečně nechvěla. To je jen jeden příklad. Dále se s procesory setkáváme například v mikrovlnné troubě, myčce na nádobí, o automobilech, televizích a mobilních telefonech je zbytečné se zmiňovat. Proto je nutné, aby technici v dnešní době znali, jak jednočipové procesory – správněji řečeno mikrokontroléry – pracují. V praxi jim to může usnadnit rozhodování třeba při opravách, zda se jedná o programovou nebo obvodovou závadu. V současné době se začínají používat moderní a poměrně složité programovatelné logické obvody, ve kterých si můžeme sestavit i poměrně komplikovaný procesor „šitý na míru“. To ale již není zaměřením tohoto materiálu. Zde se budu věnovat mikrokontroléru, který vyrábí firma ATMEL. Jeho označení je ATmega 128. Jedná se o moderní obvod, který má v sobě integrovány všechny potřebné komponenty. Tato publikace vznikla hlavně pro potřebu výuky na Střední škole teleinformatiky v Ostravě. Není tedy rozpracována do detailu a některé záležitosti jsou rozebrány pouze okrajově.
1
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128
2 Mikrokontrolér ATmega 128 ATmega 128 je nízkopříkonový osmibitový mikrokontrolér RISC a Harvardské architektury. Většinu instrukcí provádí během jednoho strojového cyklu. Z toho je odvozena rychlost přibližně 1 MIPS při frekvenci hodinového oscilátoru 1 MHz. Mikrokontrolér tak dosahuje dobrého poměru výpočetního výkonu ku elektrickému příkonu. Je vhodný pro mnohostranné použití a má všestrannou programovou podporu. Mikrokontroléry AVR se vyrábějí v různých modifikacích. Nejpoužívanější skupiny
jsou
ATmega
a
ATtiny.
Zvolený
mikrokontrolér
nejvýkonnějším.
2.1 Základní vlastnosti mikrokontroléru Pokročilá RISC architektura •
133 většinou jednocyklových instrukcí
•
32 osmibitových pracovních registrů + periferní řídící registry
•
plně statický provoz
•
dvoucyklová násobička přímo na čipu
Programová a datová paměť •
128 kB Flash programová, programovatelná v zařízení
•
4 kB EEPROM
•
4 kB statická RAM
•
možnost externí paměti 64 kB
•
programovatelné klíče pro zabezpečení programu
Periferie •
dva 8bitové čítače/časovače s předděličem
•
dva 16bitové čítače/časovače s předděličem
•
reálný čas s odděleným oscilátorem
•
dva 8bitové kanály s pulzně šířkovou modulací (PWM)
•
6 PWM kanálů s programovatelným rozlišením 2 – 16 bitů
•
10bitový AD převodník
•
dvoudrátový sériový interface
2
patří
k těm
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 •
2 programovatelné sériové porty USART
•
SPI sériový interface Master/Slave
•
programovatelný Watchdog
•
analogový komparátor
Specielní doplňky •
Power-on reset, detektor podpětí
•
kalibrovaný RC oscilátor
•
vnější i vnitřní přerušení
•
6 módů snížení spotřeby
•
programová změna hodinového kmitočtu
•
možnost Pull-up rezistorů
Ostatní •
53 programovatelných vstup/výstupů
•
pouzdro 64 vývodů
•
pracovní napětí 4,5 – 5,5 V
•
hodinová frekvence 0 – 16 MHz
2.2 Porty Mikrokontrolér disponuje sedmi porty, které ale nejsou plně obsazeny a nejsou všechny obousměrné. Jsou označeny písmeny podle abecedy a jejich vlastnosti jsou následující:
2.2.1 Port A Port A datový registr - PORTA
Bit Čtení/zápis Po resetu
Port A řídící registr - DDRA
Bit Čtení/zápis Po resetu
Port A vstupní registr - PINA
Bit Čtení/zápis Po resetu
7 6 5 4 3 2 1 0 PORTA7PORTA6 PORTA5 PORTA4 PORTA3 PORTA2 PORTA1 PORTA0 PORTA R/W R/W R/W R/W R/W R/W R/W R/W 0 0 0 0 0 0 0 0 7 DDA7 R/W 0
6 DDA6 R/W 0
5 DDA5 R/W 0
4 DDA4 R/W 0
3 DDA3 R/W 0
2 DDA2 R/W 0
1 DDA1 R/W 0
0 DDA0 R/W 0
7 PINA7 R N/A
6 PINA6 R N/A
5 PINA5 R N/A
4 PINA4 R N/A
3 PINA3 R N/A
2 PINA2 R N/A
1 PINA1 R N/A
0 PINA0 R R/A
3
DDRA
PINA
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 Port A je vstupně/výstupní port s vnitřními Pull-up rezistory. Výstup portu je symetrický, je aktivně spínán při obou výstupních úrovních (1;0). Výstupní tranzistory jsou dimenzovány tak, že mohou spínat LED zobrazovače s ochranným odporem. Maximálně možný odebíraný proud z výstupu je 20 mA. Po resetu je uveden do třetího stavu. Zda je port nastaven jako vstupní nebo výstupní určujeme registrem DDRx, kde x má hodnotu dle písmenka, které označuje příslušný port – v našem případě DDRA. Můžeme nastavit každý pin samostatně jako vstupní nebo výstupní. Má-li odpovídající bit hodnotu 1, je nastaven jako výstupní. Má-li hodnotu 0, je nastaven jako vstupní. Výstup portu ovládáme registrem PORTx, v tomto případě PORTA. Do registru můžeme zapisovat výstupní hodnotu, výstupní hodnotu můžeme i zpětně přečíst. Je-li port nastaven jako vstupní, pak tímto registrem aktivujeme Pull-up rezistory. K tomu musí být nastaven bit PUD v registru SFIOR. Při nastavení portu jako vstupní používáme registr PINx, zde PINA. Tento registr slouží pouze ke čtení a nelze do něho zapisovat. Vstup je částečně ochráněn proti napěťovým špičkám pomocí diod, které nežádoucí napětí svedou buď do země nebo na napájecí napětí. Maximální povolený proud do vstupu je 2 mA. Alternativně port A slouží jako adresová a datová sběrnice pro externí paměť.
2.2.2 Port B Port B datový registr - PORTB
Bit Čtení/zápis Po resetu
Port B řídící registr - DDRB
Bit Čtení/zápis Po resetu
Port B vstupní registr - PINB
Bit Čtení/zápis Po resetu
7 6 5 4 3 2 1 0 PORTB7PORTB6 PORTB5 PORTB4 PORTB3 PORTB2 PORTB1 PORTB0 PORTB R/W R/W R/W R/W R/W R/W R/W R/W 0 0 0 0 0 0 0 0 7 DDB7 R/W 0
6 DDB6 R/W 0
5 DDB5 R/W 0
4 DDB4 R/W 0
3 DDB3 R/W 0
2 DDB2 R/W 0
1 DDB1 R/W 0
0 DDB0 R/W 0
7 PINB7 R N/A
6 PINB6 R N/A
5 PINB5 R N/A
4 PINB4 R N/A
3 PINB3 R N/A
2 PINB2 R N/A
1 PINB1 R N/A
0 PINB0 R R/A
DDRB
PINB
Port B je vstupně/výstupní port s vnitřními Pull-up rezistory. Výstup portu je symetrický, je aktivně spínán při obou výstupních úrovních (1;0). Výstupní tranzistory jsou dimenzovány tak, že mohou spínat LED zobrazovače s ochranným
4
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 odporem. Maximálně možný odebíraný proud z výstupu je 20 mA. Po resetu je uveden do třetího stavu. Zda je port nastaven jako vstupní nebo výstupní určujeme registrem DDRx, kde x má hodnotu dle písmenka, které označuje příslušný port – v našem případě DDRB. Můžeme nastavit každý pin samostatně jako vstupní nebo výstupní. Má-li odpovídající bit hodnotu 1, je nastaven jako výstupní. Má-li hodnotu 0, je nastaven jako vstupní. Výstup portu ovládáme registrem PORTx, v tomto případě PORTB. Do registru můžeme zapisovat výstupní hodnotu, výstupní hodnotu můžeme i zpětně přečíst. Je-li port nastaven jako vstupní, pak tímto registrem aktivujeme Pull-up rezistory. K tomu musí být nastaven bit PUD v registru SFIOR. Při nastavení portu jako vstupní používáme registr PINx, zde PINB. Tento registr slouží pouze ke čtení a nelze do něho zapisovat. Vstup je částečně ochráněn proti napěťovým špičkám pomocí diod, které nežádoucí napětí svedou buď do země nebo na napájecí napětí. Maximální povolený proud do vstupu je 2 mA. Alternativní funkce portu B je složitější. Bity 0 – 3 slouží pro sériový periferní interface (SPI), bity 4 – 7 jako možné výstupy časovačů, případně PWM výstupy. Detailněji jsou tyto možnosti rozebrány v příslušných kapitolách.
2.2.3 Port C Port C datový registr - PORTC
Bit Čtení/zápis Po resetu
Port C řídící registr - DDRC
Bit Čtení/zápis Po resetu
Port C vstupní registr - PINC
Bit Čtení/zápis Po resetu
7 6 5 4 3 2 1 0 PORTC7PORTC6 PORTC5 PORTC4 PORTC3 PORTC2 PORTC1 PORTC0 PORTC R/W R/W R/W R/W R/W R/W R/W R/W 0 0 0 0 0 0 0 0 7 DDC7 R/W 0
6 DDC6 R/W 0
5 DDC5 R/W 0
4 DDC4 R/W 0
3 DDC3 R/W 0
2 DDC2 R/W 0
1 DDC1 R/W 0
0 DDC0 R/W 0
7 PINC7 R N/A
6 PINC6 R N/A
5 PINC5 R N/A
4 PINC4 R N/A
3 PINC3 R N/A
2 PINC2 R N/A
1 PINC1 R N/A
0 PINC0 R R/A
DDRC
PINC
Port C je vstupně/výstupní port s vnitřními Pull-up rezistory. Výstup portu je symetrický, je aktivně spínán při obou výstupních úrovních (1;0). Výstupní tranzistory jsou dimenzovány tak, že mohou spínat LED zobrazovače s ochranným
5
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 odporem. Maximálně možný odebíraný proud z výstupu je 20 mA. Po resetu je uveden do třetího stavu. Zda je port nastaven jako vstupní nebo výstupní určujeme registrem DDRx, kde x má hodnotu dle písmenka, které označuje příslušný port – v našem případě DDRC. Můžeme nastavit každý pin samostatně jako vstupní nebo výstupní. Má-li odpovídající bit hodnotu 1, je nastaven jako výstupní. Má-li hodnotu 0, je nastaven jako vstupní. Výstup portu ovládáme registrem PORTx, v tomto případě PORTC. Do registru můžeme zapisovat výstupní hodnotu, výstupní hodnotu můžeme i zpětně přečíst. Je-li port nastaven jako vstupní, pak tímto registrem aktivujeme Pull-up rezistory. K tomu musí být nastaven bit PUD v registru SFIOR. Při nastavení portu jako vstupní používáme registr PINx, zde PINC. Tento registr slouží pouze ke čtení a nelze do něho zapisovat. Vstup je částečně ochráněn proti napěťovým špičkám pomocí diod, které nežádoucí napětí svedou buď do země nebo na napájecí napětí. Maximální povolený proud do vstupu je 2 mA. Alternativní funkce portu C je výstup horního adresového bajtu pro externí paměť
2.2.4 Port D Port D datový registr - PORTD
Bit Čtení/zápis Po resetu
Port D řídící registr - DDRD
Bit Čtení/zápis Po resetu
Port D vstupní registr - PIND
Bit Čtení/zápis Po resetu
7 6 5 4 3 2 1 0 PORTD7PORTD6 PORTD5 PORTD4 PORTD3 PORTD2 PORTD1 PORTD0 PORTD R/W R/W R/W R/W R/W R/W R/W R/W 0 0 0 0 0 0 0 0 7 DDD7 R/W 0
6 DDD6 R/W 0
5 DDD5 R/W 0
4 DDD4 R/W 0
3 DDD3 R/W 0
2 DDD2 R/W 0
1 DDD1 R/W 0
0 DDD0 R/W 0
7 PIND7 R N/A
6 PIND6 R N/A
5 PIND5 R N/A
4 PIND4 R N/A
3 PIND3 R N/A
2 PIND2 R N/A
1 PIND1 R N/A
0 PIND0 R R/A
DDRD
PIND
Port D je vstupně/výstupní port s vnitřními Pull-up rezistory. Výstup portu je symetrický, je aktivně spínán při obou výstupních úrovních (1;0). Výstupní tranzistory jsou dimenzovány tak, že mohou spínat LED zobrazovače s ochranným odporem. Maximálně možný odebíraný proud z výstupu je 20 mA. Po resetu je uveden do třetího stavu.
6
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 Zda je port nastaven jako vstupní nebo výstupní určujeme registrem DDRx, kde x má hodnotu dle písmenka, které označuje příslušný port – v našem případě DDRD. Můžeme nastavit každý pin samostatně jako vstupní nebo výstupní. Má-li odpovídající bit hodnotu 1, je nastaven jako výstupní. Má-li hodnotu 0, je nastaven jako vstupní. Výstup portu ovládáme registrem PORTx, v tomto případě PORTD. Do registru můžeme zapisovat výstupní hodnotu, výstupní hodnotu můžeme i zpětně přečíst. Je-li port nastaven jako vstupní, pak tímto registrem aktivujeme Pull-up rezistory. K tomu musí být nastaven bit PUD v registru SFIOR. Při nastavení portu jako vstupní používáme registr PINx, zde PIND. Tento registr slouží pouze ke čtení a nelze do něho zapisovat. Vstup je částečně ochráněn proti napěťovým špičkám pomocí diod, které nežádoucí napětí svedou buď do země, nebo na napájecí napětí. Maximální povolený proud do vstupu je 2 mA. Alternativních funkcí portu D je více. Bity 0 až 3 představují buď vstupy externího přerušení, nebo bity 0 a 1 představují vstupy SCL a SDA pro dvoudrátový sériový interface, bity 2 a 3 představují RxD a TxD pro USART1. Bit 4 představuje záchyt pro časovač 1, bit 5 externí hodiny pro USART1, bit 6 a 7 pak zdroj pro časovač 1 a 2.
2.2.5 Port E Port E datový registr - PORTE
Bit Čtení/zápis Po resetu
Port E řídící registr - DDRE
Bit Čtení/zápis Po resetu
Port E vstupní registr - PINE
Bit Čtení/zápis Po resetu
7 6 5 4 3 2 1 0 PORTE7 PORTE6 PORTE5 PORTE4 PORTE3 PORTE2 PORTE1 PORTE0 PORTE R/W R/W R/W R/W R/W R/W R/W R/W 0 0 0 0 0 0 0 0 7 DDE7 R/W 0
6 DDE6 R/W 0
5 DDE5 R/W 0
4 DDE4 R/W 0
3 DDE3 R/W 0
2 DDE2 R/W 0
1 DDE1 R/W 0
0 DDE0 R/W 0
7 PINE7 R N/A
6 PINE6 R N/A
5 PINE5 R N/A
4 PINE4 R N/A
3 PINE3 R N/A
2 PINE2 R N/A
1 PINE1 R N/A
0 PINE0 R R/A
DDRE
PINE
Port E je vstupně/výstupní port s vnitřními Pull-up rezistory. Výstup portu je symetrický, je aktivně spínán při obou výstupních úrovních (1;0). Výstupní tranzistory jsou dimenzovány tak, že mohou spínat LED zobrazovače s ochranným
7
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 odporem. Maximálně možný odebíraný proud z výstupu je 20 mA. Po resetu je uveden do třetího stavu. Zda je port nastaven jako vstupní nebo výstupní určujeme registrem DDRx, kde x má hodnotu dle písmenka, které označuje příslušný port – v našem případě DDRE. Můžeme nastavit každý pin samostatně jako vstupní nebo výstupní. Má-li odpovídající bit hodnotu 1, je nastaven jako výstupní. Má-li hodnotu 0, je nastaven jako vstupní. Výstup portu ovládáme registrem PORTx, v tomto případě PORTE. Do registru můžeme zapisovat výstupní hodnotu, výstupní hodnotu můžeme i zpětně přečíst. Je-li port nastaven jako vstupní, pak tímto registrem aktivujeme Pull-up rezistory. K tomu musí být nastaven bit PUD v registru SFIOR. Při nastavení portu jako vstupní používáme registr PINx, zde PINE. Tento registr slouží pouze ke čtení a nelze do něho zapisovat. Vstup je částečně ochráněn proti napěťovým špičkám pomocí diod, které nežádoucí napětí svedou buď do země, nebo na napájecí napětí. Maximální povolený proud do vstupu je 2 mA. Alternativní funkce jsou pro bit 0 programovací vstup nebo RxD USATR0. Bit 1 je programovací výstup nebo TxD USART0. Bit 2 představuje pozitivní vstup pro analogový komparátor nebo vstup/výstup externích hodin pro USART0. Bit 3 je negativní vstup analogového komparátoru nebo PWM výstup časovače 3. Bity 4 až 7 jsou vstupy externího přerušení 4 až 7 nebo vstupy/výstupy časovače 3.
2.2.6 Port F Port F datový registr - PORTF
Bit Čtení/zápis Po resetu
Port F řídící registr - DDRF
Bit Čtení/zápis Po resetu
Port F vstupní registr - PINF
Bit Čtení/zápis Po resetu
7 6 5 4 3 2 1 0 PORTF7 PORTF6 PORTF5 PORTF4 PORTF3 PORTF2 PORTF1 PORTF0 PORTF R/W R/W R/W R/W R/W R/W R/W R/W 0 0 0 0 0 0 0 0 7 DDF7 R/W 0
6 DDF6 R/W 0
5 DDF5 R/W 0
4 DDF4 R/W 0
3 DDF3 R/W 0
2 DDF2 R/W 0
1 DDF1 R/W 0
0 DDF0 R/W 0
7 PINF7 R N/A
6 PINF6 R N/A
5 PINF5 R N/A
4 PINF4 R N/A
3 PINF3 R N/A
2 PINF2 R N/A
1 PINF1 R N/A
0 PINF0 R R/A
DDRF
PINF
Port F je vstupně/výstupní port s vnitřními Pull-up rezistory. Výstup portu je symetrický, je aktivně spínán při obou výstupních úrovních (1;0). Výstupní
8
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 tranzistory jsou dimenzovány tak, že mohou spínat LED zobrazovače s ochranným odporem. Maximálně možný odebíraný proud z výstupu je 20 mA. Po resetu je uveden do třetího stavu. Zda je port nastaven jako vstupní nebo výstupní určujeme registrem DDRx, kde x má hodnotu dle písmenka, které označuje příslušný port – v našem případě DDRF. Můžeme nastavit každý pin samostatně jako vstupní nebo výstupní. Má-li odpovídající bit hodnotu 1, je nastaven jako výstupní. Má-li hodnotu 0, je nastaven jako vstupní. Výstup portu ovládáme registrem PORTx, v tomto případě PORTF. Do registru můžeme zapisovat výstupní hodnotu, výstupní hodnotu můžeme i zpětně přečíst. Je-li port nastaven jako vstupní, pak tímto registrem aktivujeme Pull-up rezistory. K tomu musí být nastaven bit PUD v registru SFIOR. Při nastavení portu jako vstupní používáme registr PINx, zde PINF. Tento registr slouží pouze ke čtení a nelze do něho zapisovat. Vstup je částečně ochráněn proti napěťovým špičkám pomocí diod, které nežádoucí napětí svedou buď do země, nebo na napájecí napětí. Maximální povolený proud do vstupu je 2 mA. Alternativní funkce jsou pro bity 0 až 7 multiplexované vstupy analogově digitálního převodníku. Jako další alternativa je pro bity 4 až 7 spolupráce s JTAG.
2.2.7 Port G Port G datový registr - PORTG
Bit Čtení/zápis Po resetu
Port G řídící registr - DDRG
Bit Čtení/zápis Po resetu
Port G vstupní registr - PING
Bit Čtení/zápis Po resetu
7 --R 0
6 --R 0
5 --R 0
4 3 2 1 0 PORTG4 PORTG3 PORTG2 PORTG1 PORTG0 PORTG R/W R/W R/W R/W R/W 0 0 0 0 0
7 --R 0
6 --R 0
5 --R 0
4 DDG4 R/W 0
3 DDG3 R/W 0
2 DDG2 R/W 0
1 DDG1 R/W 0
0 DDG0 R/W 0
7 --R 0
6 --R 0
5 --R 0
4 PING4 R N/A
3 PING3 R N/A
2 PING2 R N/A
1 PING1 R N/A
0 PING0 R R/A
DDRG
PING
Port G je vstupně/výstupní pětibitový port s vnitřními Pull-up rezistory. Výstup portu je symetrický, je aktivně spínán při obou výstupních úrovních (1;0). Výstupní tranzistory jsou dimenzovány tak, že mohou spínat LED zobrazovače s ochranným
9
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 odporem. Maximálně možný odebíraný proud z výstupu je 20 mA. Po resetu je uveden do třetího stavu. Zda je port nastaven jako vstupní nebo výstupní určujeme registrem DDRx, kde x má hodnotu dle písmenka, které označuje příslušný port – v našem případě DDRG. Můžeme nastavit každý pin samostatně jako vstupní nebo výstupní. Má-li odpovídající bit hodnotu 1, je nastaven jako výstupní. Má-li hodnotu 0, je nastaven jako vstupní. Výstup portu ovládáme registrem PORTx, v tomto případě PORTG. Do registru můžeme zapisovat výstupní hodnotu, výstupní hodnotu můžeme i zpětně přečíst. Je-li port nastaven jako vstupní, pak tímto registrem aktivujeme Pull-up rezistory. K tomu musí být nastaven bit PUD v registru SFIOR. Při nastavení portu jako vstupní používáme registr PINx, zde PING. Tento registr slouží pouze ke čtení a nelze do něho zapisovat. Vstup je částečně ochráněn proti napěťovým špičkám pomocí diod, které nežádoucí napětí svedou buď do země, nebo na napájecí napětí. Maximální povolený proud do vstupu je 2 mA. Port G se automaticky uvede do třetího stavu, pokud jsou zastaveny hodiny procesoru. Alternativní funkcí pro bity 0 až 2 je spolupráce s externí pamětí (signály RD, RW, ALE) a pro bity 3 a 4 připojení krystalu pro časovač 0.
2.2.8 Speciální funkční registr Funkční registr pro nastavení IO - SFIOR
Bit Čtení/zápis Po resetu
7 TMS R/W 0
6 --R/W 0
5 --R/W 0
4 --R/W 0
3 ACME R/W 0
2 PUD R/W 0
1 0 PSR0 PSR321 R/W R/W 0 0
SFIOR
Tento registr slouží k nastavení specielních funkcí. Jednotlivé bity mají následující funkce: •
TMS – synchronizační mód časovačů – v našich úlohách jej nebudeme používat. Musí být nastaven na hodnotu 0, aby časovače pracovaly spojitě.
•
ACME – analogový multiplexor – nastavuje činnost analogového multiplexoru pro AD převodník a vstup analogového komparátoru.
10
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 •
PUD – aktivace Pull-up rezistorů – pokud je bit nastaven na 0, mohou být dle nastavení příslušného výstupního registru Pull-up rezistory aktivní. Je-li tento bit nastaven na 1, jsou všechny Pull-up rezistory neaktivní bez ohledu na nastavení výstupního registru příslušného portu.
•
PRS0 a PRS321 – spolupracují s bitem TMS. Pokud bit TMS je nulován, tyto bity se automaticky nastaví na nulu.
2.3 Jádro mikrokontroléru Hlavním úkolem jádra mikrokontroléru je provádět správně programové instrukce, obsluhovat paměť, periferie i všechna dostupná přerušení. Tento
Obr. 1 Blokové schéma architektury AVR
mikrokontrolér je typickým představitelem Harvardské struktury s odděleným paměťovým prostorem pro program a pro data. Jeho blokové schéma je na obrázku č.
11
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 1. Program je uložen v paměti Flash. Jednostupňové zřetězení instrukcí podporuje zpracování instrukčního slova, to je přečtení, interpretace a provedení v jednom strojovém cyklu. Tuto paměť je možno programovat v hotové aplikaci.
2.4 Aritmeticko logická jednotka Aritmeticko logická jednotka je přímo napojena na 32 hlavních pracovních registrů. Veškeré operace mezi registry nebo mezi registrem a hodnotou přímo zadanou programem se provádějí v jednou hodinovém cyklu. Operace ALU jsou rozděleny do tří základních kategorií. Jsou to aritmetické, logické a bitové operace. V této architektuře je implementována hardvérová násobička, která provádí násobení kladných i záporných čísel.
2.5 Registry Registry jsou začleněny do adresového prostoru paměti RAM, která bude popsána dále. Lze k nim tedy přistupovat jako k registrům i jako k obecné paměti RAM. Práce s registry je ale pohodlnější a hlavně rychlejší, protože mají přímý přístup k aritmeticko logické jednotce.
2.5.1 Stavový registr Stavový registr nám udává vlastnosti výsledku operace, kterou provedla aritmeticko logická jednotka. Jednotlivé vlastnosti jsou vyjádřeny prostřednictvím jednotlivých bitů tohoto registru – příznaků. Na základě příznaků se provádějí další operace programu, například podmíněné skoky nebo přičtení jednotky v případě přenosu do vyššího řádu z předchozího sčítání. Stavový registr se automaticky neukládá při volání přerušení a neobnovuje se při návratu z přerušení. Proto pokud se v průběhu zpracování přerušení bude stavový registr měnit, je třeba ho na začátku obsluhy přerušení programově uložit a na konci obnovit. Pokud tak neprovedeme, bude docházet k nedefinovatelným programovým chybám. Stavový registr - SREG
Bit Čtení/zápis Po resetu
7 I R/W 0
6 T R/W 0
5 H R/W 0
12
4 S R/W 0
3 V R/W 0
2 N R/W 0
1 Z R/W 0
0 C R/W 0
SREG
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 Ze stavového registru lze libovolně číst a lze i libovolně zapisovat. Můžeme i jednotlivé příznaky programově měnit. Význam jednotlivých příznaků je následující: •
I – Hlavní příznak povolení přerušení – tento bit musí být nastaven, pokud má být přerušení povoleno. Je-li nulový, je přerušení zakázáno. V průběhu programu můžeme přerušení libovolně povolovat i zakazovat. Přerušení se automaticky zakáže na začátku obsluhy přerušení a automaticky se povalí na jeho konci při instrukci RETI.
•
T – Odkládací příznak – tento bit si můžeme libovolně nastavit v průběhu programu nebo do něho kopírovat jiný příznak. Můžeme i tento příznak zpětně kopírovat do jiného příznaku. Lze provádět i podmíněné skoky.
•
H – Příznak polovičního přenosu – nastavuje se při aritmetických operacích, pokud počítáme v BCD kódu. Signalizuje, že výsledek je větší než 10 a je nutno provést korekci.
•
S – Příznak znaménka – vždy vyjadřuje exkluzivní součet mezi příznakem V a příznakem N.
•
V – Příznak dvojkového doplňku – přeplnění – podporuje aritmetické operace s dvojkovým doplňkem – záporná čísla.
•
N – příznak záporného výsledku – signalizuje záporný výsledek aritmeticko logické operace.
•
Z – Příznak nulového výsledku – nastaví se na hodnotu logické 1, je-li výsledek záporný. Je-li kladný nebo nulový, je nulový.
•
C – Příznak přenosu do vyššího řádu – nastane-li při operaci přenos do vyššího řádu, je tento příznak nastaven na hodnotu 1. Při další matematické operaci se přičítá k výsledku.
13
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 2.5.2 Hlavní registry
Obr. 2 Struktura registrů
Pole registrů je optimalizováno pro práci RISC procesorů typu AVR. Jedná se o část paměti RAM, nad kterou může přímo pracovat aritmeticko logická jednotka. Můžeme říci, že registry jsou rozděleny do tří skupin. První skupina jsou registry s číslem R0 až R15 na adrese $00 až $0F. Do těchto registrů nemůžeme přímo zapisovat konstanty a nemůžeme provádět všechny operace. Lze je použít jako odkládací prostor, jako čítače – lze je inkrementovat nebo dekrementovat, rovněž je můžeme použít k porovnávání s registry z druhé skupiny. Druhá skupina jsou registry s číslem R16 až R25 na adrese $10 až $19 a lze s nimi provádět veškeré operace bez omezení. Třetí skupina představuje zvláštní dvojregistry, které je možno použít k
14
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 nepřímému adresování. Mají číslo R26 až R31 a jsou na adrese $1A až $1F. Skládají se vždy z dvojic osmibitových registrů. Při naplňování musíme přistupovat k dolní a k horní části samostatně. Provádíme-li při práci s pamětí inkrementování nebo dekrementování, je v tomto případě brána dvojice registrů jako celek. Statickou paměť RAM můžeme adresovat pomocí všech tří registrů, programovou paměť Flash pouze pomocí registru Z.
2.6 Paměti Protože procesory AVR jsou harvardské struktury, mají oddělený paměťový prostor pro ukládání dat a pro program. Paměť EEPROM představuje samostatný paměťový prostor, ke kterému není přímý přístup. Tento prostor se ovládá pomocí specielních registrů. Všechny tři prostory začínají adresou nula a jsou lineární.
2.6.1 Paměť RAM Prostor paměti SRAM v sobě zahrnuje oblast registrů, vstupně/výstupních portů a vlastní paměť RAM. Nemůžeme tedy data do paměti ukládat od adresy nula, protože bychom přepisovali obsah registrů. Rozdělení prostoru
je
ukázáno
na
obrázku
č. 3.
Mikrokontrolér může pracovat s touto pamětí ve dvou režimech: -
normální mód
-
kompatibilní mód s ATmega103
My
budeme
uvažovat
pouze
mód
normální. V tomto případě má vnitřní paměť
Obr. 3 Struktura paměti S-RAM
SRAM kapacitu 4096 bajtů. Je-li tato kapacita nedostačující, je možno ji rozšířit pomocí externí paměti. Připojení externí paměti k mikrokontroléru povolíme nastavením bitu SRE v MCUCR registru. K paměti pak přistupujeme stejnými povely jako k interní paměti. Je třeba si uvědomit, že se k paměti přistupuje pomocí rozšiřujících funkcí portů. Proto jsou přístupové doby pro zápis a pro čtení dat z externí paměti dvojnásobné. 15
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 Pro adresování vnitřní i externí paměti můžeme použít X, Y a Z registry, kde můžeme využít možnosti inkrementace nebo dekrementace registru před přístupem a nebo po přístupu k paměti.
2.6.2 Paměť EEPROM
Mikrokontrolér ATmega 128 má v sobě zabudovány 4 kB paměti typu EEPROM. Ta tvoří samostatný datový prostor a není dostupná jednoduchými povely přes datovou sběrnici. Přistupuje se k ní prostřednictvím adresového, datového a řídícího registru. Adresový registr je dvoubajtový, ostatní jednobajtové. V řídicím registru jednotlivé bity mají následující význam: •
EERIE – povolení přerušení – připravenost paměti – generuje přerušení, pokud byl cyklus zápisu ukončen. Možno použít pro vícebajtový zápis do paměti.
•
EEMWE – hlavní povolení zápisu do paměti – před nastavením bitu EEWE musí být nastaven tento bit. Je automaticky nulován po čtyřech taktech. Pokud není nastaven, zápis se neprovede.
•
EEWE – zápis do paměti EEPROM – před tímto nastavením musí být uložena adresa a data v příslušných registrech a nastaven bit EEMWE. Testováním tohoto bitu zjistíme, jestli byl předchozí zápis ukončen.
•
EERE – čteni paměti EEPROM – nastavením bitu na log. 1 provádíme čtení paměti. Platná adresa již musí být v registru EEAR. V tom okamžiku je procesor na 4 takty zastaven.
16
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 V následujících příkladech si ukážeme, jakým způsobem je možno do paměti EEPROM zapisovat nebo z ní číst. Přerušení není použito, využívá se čekací smyčky. Při zápisu do paměti EEPROM může nastat chyba. Například při poklesu napájecího napětí nebudou data správně uložena. Proto se doporučuje po každém zápisu překontrolovat správnost uložených dat. ; **** Podprogram zápisu dat do EEPROM EE_write: sbic ECR, EEWE ; čekání na ukončení předchozího zápisu rjmp EE_write out EEARH, r18 ; uložení registrů r18 a r17 do adresového registru out EEARL, r17 out EEDR, r16 ; uložení dat do datového registru sbi EECR, EEMWE ; povolit zápis do EEPROM sbi EECR, EEWE ; start zápisu do EEPROM ret ; **** Podprogram čtení dat z EEPROM EE_read: sbic EECR, EEWE ; čekání na ukončení (příp.)předchozího zápisu rjmp EE_read out EEARH, r18 ; uložení registrů r18 a r17 do adresového registru out EEARL, r17 sbi EECR, EERE ; start čtení z EEPROM in r16, EEDR ; čtení dat z datového registru ret
Před zápisem dat do paměti EEPROM je rovněž vhodné se přesvědčit, zda požadovaná data již nejsou v buňce obsažena. Ušetří se tím čas, protože nedochází ke zbytečnému mazání dat a opětovnému zápisu stejných dat. Šetří se tím i životnost paměťové buňky, která je omezena.
2.6.3 Programová paměť Flash Mikrokontrolér ATmega128 obsahuje 128 kB paměti Flash, která je programovatelná přímo v zapojeném procesoru do systému. To umožňuje vyvíjet program přímo v konečném zapojení mikrokontroléru. Protože všechny AVR instrukce jsou 16 nebo 32 bitové, je paměť organizována do dvou 64 kB bloků. Při práci s touto pamětí musíme tuto skutečnost vždy brát v úvahu. Pokud budeme ukládat např. text, jeho délka musí být sudá – dělitelná dvěma. K datům přistupujeme pomocí příkazu LPM nebo ELPM, podle toho, ve které části se data nacházejí (ELPM pro data nad 64 kB).
17
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 Příklad programu pro čtení dat z Flash paměti:
Tab: .DB Flash_read: ldi ldi lpm ret
0x01, 0x02, 0x03, 0x04, …
;data ve Flash
ZL, low(Tab * 2) ZH, high(Tab * 2) Tmp, Z+
; nastavení počátku tabulky ; čtení z Flash s inkrementací
Při tvorbě programu si musíme uvědomit, že adresový registr Z je tvořen dvěma dvoubajtovými registry, proto musíme naplnit každý zvlášť. Jak již bylo uvedeno, programová paměť Flash je tvořena dvěma bloky, které adresuje programový čítač najednou. My k ní ale nepřistupujeme pomocí programového čítače, proto se pro nás jeví jako jeden blok o dvojnásobné kapacitě. Proto musíme příslušnou adresu při zadávání do registru Z vždy násobit dvěma. Data do paměti Flash ukládáme pomocí programátoru, který bude popsán v dalších kapitolách. Je možno použít i příkazy mikrokontroléru. To je ale nad rámec našich potřeb a proto se tím nebudeme zabývat.
2.7 Hodiny Mikrokontroléry firmy Atmel umožňují pomocí Flash pojistek nastavit různé zdroje hodinového kmitočtu. Zdroj hodinového kmitočtu Externí krystal/keramický rezonátor Externí nízkofrekvenční krystal Externí RC oscilátor Kalibrovaný vnitřní RC oscilátor Externí hodiny
CKSEL3..0 1111 - 1010 1001 1000 - 0101 0100 - 0001 0000
Tabulka 1 Nastavení zdroje hodinového kmitočtu
Při prvním startu mikrokontroléru je jako zdroj hodinového kmitočtu vybrán kalibrovaný vnitřní RC oscilátor. Toto nastavení lze změnit pomocí programátoru. Jako zdroj budeme převážně používat krystalový rezonátor, který je již součástí vývojové desky. Jeho kmitočet je 14745600 Hz. Je třeba jen ověřit správné nastavení příslušných pojistek.
18
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 2.7.1 Kalibrovaný vnitřní RC oscilátor Vývojová deska nám umožňuje alternativně zvolit tento zdroj hodinového kmitočtu, proto si je částečně popíšeme. Oscilátor umožňuje zvolit kmitočet podle následující tabulky. Uvedené hodnoty jsou nominální pro napájecí napětí 5V a teplotu 25°C. Příslušný kmitočet se volí pomocí pojistek CKSEL. Přesnost oscilátoru dosahuje hodnoty ±3%, kalibrací lze docílit hodnoty ±1%.
CKSEL3..0 Nominální frekvence (MHz) 0001 1,0 0010 2,0 0011 4,0 0100 8,0 Tabulka 2 Nastavení vnitřního RC oscilátoru
Je-li využíván kmitočet 1 MHz, je kalibrace prováděna automaticky, protože je součástí identifikačního bajtu. Používáme-li jiný kmitočet, musíme kalibrační data programově uložit do registru OSCCAL. Hodnota $00 představuje nejnižší možnou frekvenci, hodnota $FF pak představuje nejvyšší možnou frekvenci. Rozsah možných hodnot odchylky od nominální frekvence je uveden v následující tabulce. Hodnota OSCCAL Minimální frekvence v % Maximální frekvence v % $00 50 100 $7F 75 150 $FF 100 200 Tabulka 3 Rozsah nastavení frekvencí vnitřního RC oscilátoru Registr kalibrace RC oscilátoru - OSCCAL Bit Čtení/zápis Po resetu
7 CAL7 R/W
6 CAL6 R/W
5 4 3 2 CAL5 CAL4 CAL3 CAL2 R/W R/W R/W R/W Data určena výrobcem
1 CAL1 R/W
0 CAL0 R/W
OSCCAL
Pokud budeme používat jiné hodnoty, než které určil výrobce pro frekvenci 1 MHz, je vhodné je uložit do paměti EEPROM a v úvodní části programu je načíst a uložit do tohoto registru.
19
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128
2.8 Čítače – časovače Pokud nesouhlasí vypočtený čas s naměřeným, je třeba prověřit nastavení pojistek, kterými se volí použitý oscilátor (vnější, RC, krystal) a dělič kmitočtu oscilátoru. Součástí mikrokontroléru jsou jak osmibitové tak šestnáctibitové čítače. Můžeme je využít následovně: -
Jednokanálový čítač
-
Pulzně šířkový modulátor
-
Generátor frekvencí
-
Měření nebo generování časových úseků
-
Připojit k různým zdrojům hodinové frekvence
Výstup z časovačů může být vyveden na piny mikrokontrolérů nebo může být využit vnitřně jako zdroj přerušení.
2.8.1 Módy čítače – časovače V normálním módu čítač běží spojitě od minimální po maximální možnou hodnotu, kdy dojde k přetečení a nastaví se opět minimální (nulová) hodnota. V tomto režimu můžeme využít přerušení při přetečení čítače nebo přerušení od shody s porovnávacím registrem. Porovnávací registr má označení OCRn a registr čítače TCNTn. Módu nulování čítače po shodě (CTC) čítač běží spojitě do doby, než dojde ke shodě s porovnávacím registrem. V tomto okamžiku dojde k vynulování registru čítače TCNTn a bude generováno přerušení. Protože v tomto módu nikdy nedojde k přetečení čítače, nemůže být toto přerušení generováno. Mód pulzně šířkové modulace v našich aplikacích používat nebudeme. Výstup může sloužit jako jednoduchý DA převodník.
20
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 2.8.2 Nastavení registrů časovačů Nastavení registrů časovačů je poměrně komplikované, proto si zde probereme pouze registry, které budeme používat v našich programech. Podrobnější informace jsou v technické dokumentaci k tomuto procesoru. Přerušení od jednotlivých časovačů v příslušném módu se provádí v registru TIMSK. Významy jednotlivých bitů jsou následující. Maska pro přerušení časovačů - TIMSK Bit Čtení/zápis Po resetu
7 6 5 4 3 2 OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1 R R R R R/W R/W 0 0 0 0 0 0
1 0 OCIE0 TOIE0 R/W R/W 0 0
•
TOIE0 – povolení přerušení od přetečení časovače/čítače 0
•
OCIE0
–
povolení
přerušení
od
čítače/časovače
0
při
TIMSK
shodě
s porovnávacím registrem •
TOIE1 – povolení přerušení od přetečení časovače/čítače 1
•
OCIE1B – povolení přerušení od čítače/časovače 1 při shodě s porovnávacím registrem B, možnost nastavení výstupu
•
OCIE1A – povolení přerušení od čítače/časovače 1 při shodě s porovnávacím registrem A, možnost nastavení výstupu
•
TICIE1 – povolení přerušení od vstupu časovače/čítače 1
•
TOIE2 – povolení přerušení od přetečení časovače/čítače 2
•
OCIE2
–
povolení
přerušení
od
čítače/časovače
0
při
shodě
s porovnávacím registrem Pokud budeme využívat jakékoliv přerušení od časovače/čítače, nesmíme zapomenout na celkové povolení přerušení ve stavovém registru. Protože budeme v dále uvedených příkladech používat šestnáctibitový časovač, popíšeme pouze jeho registry. Pokud by chtěl někdo použít jiný časovač, nastavení jeho registrů bude podobné. Tento
mikrokontrolér
umožňuje
nastavit takový režim,
že
při
shodě
porovnávacího registru s čítačem časovače dojde k nulování tohoto čítače. Pokud
21
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 bychom požili režim bez nulování, pouze s komparací, pak bychom museli provádět nulování čítače časovače v našem programu. V opačném případě by další přerušení nastalo až po 65536 cyklech. Kromě povolení přerušení musíme nastavit i řídící registry časovače. Zde nastavíme, v jakém módu bude časovač pracovat a jak bude připojen na výstupní piny mikrokontroléru. První registr má označení TCCR doplněné číslem časovače a porovnávacího registru (např. TCCR1A). Řídicí registr - TCCR1A
Bit Čtení/zápis Po resetu
7 6 5 4 3 2 1 0 COM1A1 COM1A0 COM1B1 COM1B0 COM1C1 COM1C0 WGM11 WGM10 TCCR1A R/W R/W R/W R/W R/W R/W R/W R/W 0 0 0 0 0 0 0 0
Bity COM nastavíme dle následující tabulky. Popis funkce COMxx1 COMxx0 0 0 Výstup pracuje normále, není napojen na časovač 0 1 Při shodě přepíná mezi nízkou a vysokou úrovní 1 0 Při shodě nastaví výstupní pin na nízkou úroveň 1 1 Při shodě nastaví výstupní pin na vysokou úroveň Tabulka 4 Výstupní mód časovače
Registr TCCR1A má pokračování v registru TCCR1B Řídicí registr - TCCR1B
Bit Čtení/zápis Po resetu
7 ICNC1 R/W 0
6 ICES1 R/W 0
5 --R 0
4 3 2 WGM13 WGM12 CS12 R/W R/W R/W 0 0 0
1 CS11 R/W 0
0 CS10 R/W 0
TCCR1B
Nastavení bitů WGM platí pro registry TCCR1A i TCCR1B. V následující tabulce jsou vybrány pouze některé hodnoty, pro jiné nastavení je třeba prostudovat firemní dokumentaci. WGMn3 WGMn2 WGMn1 WGMn0 Operační mód 0 0 0 0 Normální 0 0 0 1 PWM, fáze, 8 bit 0 1 0 0 CTC výstup 0 1 0 1 Rychlá PWM 8 bit 1 1 0 0 CTC vstup Tabulka 5 Operační mód časovače
22
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 Zbývá nám ještě nastavit frekvenci a vybrat zdroj generátoru časovače. To nastavíme dle následující tabulky. CSn2 CSn1 CSn0 Popis 0 0 0 Žádný zdroj hodin, časovač nepracuje 0 0 1 clk/1 – bez předděliče 0 1 0 clk/8 0 1 1 clk/64 1 0 0 clk/256 1 0 1 clk/1024 1 1 0 Externí hodiny – sestupná hrana 1 1 1 Externí hodiny – náběžná hrana Tabulka 6 Výběr hodinového zdroje pro časovač
Další registry, které budeme u časovačů využívat, jsou TCNT a OCR. Registr TCNT je vlastní časovač a OCR je porovnávací registr. Protože se jedná o dvoubajtové registry, přístup k nim vyžaduje určitá pravidla. Naplnění nebo čtení se musí provést ve dvou po sobě bezprostředně následujících krocích. Následující obsluha platí pro oba registry. TIM16_WriteTCNTn: in r18, SREG cli out TCNTnH, r16 out TCNTnL, r17 out SREG, r18 ret
odložení stavového registru zákaz přerušení uložení registrů do časovače obnovení stavového registru
TIM16_ReadTCNTn: in r18, SREG cli in r16, TCNTnH in r17, TCNTnL out SREG, r18 ret
odložení stavového registru zákaz přerušení čtení dat z registru obnovení stavového registru
Před uložením nebo čtením registrů musíme zakázat přerušení. V případě žádosti o přerušení v době ukládání dat, by nebyly bajty uloženy následně za sebou a čtení nebo ukládání by nebylo korektní. Následující příklad ukazuje čtení z registru. Stejný princip ukládání a čtení dat platí i pro registry OCR.
23
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128
2.9 Obecné přerušení jmp jmp jmp jmp jmp jmp jmp jmp jmp jmp jmp jmp jmp jmp jmp jmp jmp jmp jmp jmp jmp jmp jmp jmp jmp jmp jmp jmp jmp jmp jmp jmp jmp jmp jmp
RESET EXT_INT0 EXT_INT1 EXT_INT2 EXT_INT3 EXT_INT4 EXT_INT5 EXT_INT6 EXT_INT7 TIM2_COMP TIM2_OVF TIM1_CAPT TIM1_COMPA TIM1_COMPB TIM1_OVF TIM0_COMP TIM0_OVF SPI_STC USART0_RXC USART0_DRE USART0_TXC ADC EE_RDY ANA_COMP TIM1_COMPC TIM3_CAPT TIM3_COMPA TIM3_COMPB TIM3_COMPC TIM3_OVF USART1_RXC USART1_DRE USART1_TXC TWI SPM_RDY
; Reset ; IRQ0 Handler ; IRQ1 Handler ; IRQ2 Handler ; IRQ3 Handler ; IRQ4 Handler ; IRQ5 Handler ; IRQ6 Handler ; IRQ7 Handler ; Timer2 Compare Handler ; Timer2 Overflow Handler ; Timer1 Capture Handler ; Timer1 CompareA Handler ; Timer1 CompareB Handler ; Timer1 Overflow Handler ; Timer0 Compare Handler ; Timer0 Overflow Handler ; SPI Transfer Complete Handler ; USART0 RX Complete Handler ; USART0,UDR Empty Handler ; USART0 TX Complete Handler ; ADC Conversion Complete Handler ; EEPROM Ready Handler ; Analog Comparator Handler ; Timer1 CompareC Handler ; Timer3 Capture Handler ; Timer3 CompareA Handler ; Timer3 CompareB Handler ; Timer3 CompareC Handler ; Timer3 Overflow Handler ; USART1 RX Complete Handler ; USART1,UDR Empty Handler ; USART1 TX Complete Handler ; Two-wire Serial Interface Interrupt ; SPM Ready Handler
Přerušení používáme k obsluze událostí, které nejsou hlavním úkolem mikrokontroléru nebo které nastanou v neznámém okamžiku. Pokud budeme přerušení využívat, nesmíme zapomenout jej povolit příkazem sei. V tom případě může nastat jakékoliv přerušení. Proto doporučuji nastavit vektory všech přerušení a ta, která nebudou využívána zakončit příkazem konce přerušení reti. Vektory přerušení jsou následující.
24
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128
2.10
Sériové periferní rozhraní – SPI
Sériový periferní interface umožňuje sériovou synchronní komunikaci typu Master/Slave. Vyznačuje se velkou komunikační rychlostí. Umožňuje přenos mezi mikrokontrolérem a periferním obvodem nebo mezi mikrokontroléry navzájem. SPI má následující vlastnosti. •
Plně duplexní třídrátový synchronní přenos dat.
•
Nastavení obvodu jako Master nebo Slave.
•
Přerušení po příjmu dat.
•
Příznak kolize dat.
•
Možnost vysílání dvojnásobnou rychlostí.
MASTER posuvný registr
generátor CLK
SLAVE MISO
MISO
MOSI
MOSI
SCK
SCK
SS
posuvný registr
SS
Obr. 4 Propojení při SPI komunikaci
Vodič MISO (Master Input Slave Output) přenáší data z obvodu Slave do obvodu Master a vodič MOSI (Master Output Slave Input) přenáší data z obvodu Master do obvodu Slave. Vodičem SCK se přenášejí hodinové impulzy, které jdou z obvodu master do obvodu Slave. Obvod Master svými hodinovými impulzy řídí celou komunikaci. Vodič SS slouží k výběru obvodu Slave, kterých může být připojeno více. Tímto vstupem se synchronizuje přenos a zároveň se aktivuje příslušný obvod Slave. U obvodu Slave je nastaven vždy jako vstupní. U obvodu Master může být vodič SS nastaven jako vstupní i jako výstupní. Je-li výstupní, nemá v podstatě žádnou souvislost s SPI systémem a můžeme jej použít jako samostatný výstupní pin. Doporučuje se ale jej využít k ovládání SS pinu obvodu Slave pro zajištění synchronizace. Pokud jej nastavíme jako vstupní, pak musí být jeho úroveň na
25
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 logické 1. Jinak se předpokládá, že v síti je jiný Master a tento obvod se přepne do režimu Slave. Řídicí registr SPI - SPCR
Bit Čtení/zápis Po resetu
7 SPIE R/W 0
6 SPE R/W 0
5 4 DORD MSTR R/W R/W 0 0
3 CPOL R/W 0
2 CPHA R/W 0
1 SPR1 R/W 0
0 SPR0 R/W 0
•
SPIE – povolení přerušení SPI
•
SPE – povolení komunikace SPI – musí být nastaven na 1
•
DORD – je-li 1, LSB se vysílá první, je-li 0, MSB se vysílá první
•
MSTR – 0 SLAVE, 1 MASTER
•
CPOL – polarita hodin
•
CPHA – fáze hodin
•
SPR1,0 – nastavení frekvence hodin
SPCR
Data se předávají pomocí datového registru SPDR. Po naplnění tohoto registru MASTER začíná vysílat data. Protože modul SLAVE neví, kdy bude zahájeno vysílání, je třeba obsluhu SPI provádět pomocí přerušení.
2.11
USART
Univerzální asynchronní přijímač/vysílač. Je to plně duplexní sériový kanál, který může současně vysílat i přijímat. Hlavní vlastnosti tohoto rozhraní jsou: •
synchronní nebo asynchronní provoz,
•
jemné nastavení přenosové rychlosti,
•
možnost vysílání 5 až 9 bitů, 1 nebo 2 stop bity,
•
generátor sudé nebo liché parity,
•
detekce přetečení (nevyzvednutí) dat,
•
detekce chyby přenosu,
•
filtrace šumu,
•
možnost práce pod přerušením,
•
multiprocesorová komunikace,
•
možnost dvojnásobné rychlosti při asynchronní komunikaci.
Mikrokontrolér ATmega 128 má dva tyto porty. Jsou označeny jako USART0 a USART1. Mají rozdílné registry a každý je nutno samostatně nastavit. Budeme se tedy zabývat pouze jedním portem, druhy port nastavíme obdobně.
26
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 2.11.1 Nastavení komunikační rychlosti Frekvence generátoru hodinových impulzů je odvozena od frekvence hlavního krystalu mikrokontroléru. Nastavená rychlost platí pro přijímač i pro vysílač, a provedeme to vložením příslušné konstanty do registru UBRR. Tento registr je dvoubajtový, proto musíme nastavit každý bajt samostatně. Výpočet příslušné konstanty je uveden v následující tabulce. Mód Normální asynchronní mód Asynchronní mód s dvojitou rychlostí Synchronní MASTER mód
Přenosová rychlost f OSC BAUD = 16 ∗ (UBRR + 1) f OSC BAUD = 8 ∗ (UBRR + 1) f OSC BAUD = 2 ∗ (UBRR + 1)
Výpočet konstanty f OSC UBRR = −1 16 ∗ BAUD f OSC UBRR = −1 8 ∗ BAUD f OSC UBRR = −1 2 ∗ BAUD
Tabulka 7 Výpočet konstant pro nastavení přenosové rychlosti
BAUD – přenosová rychlost (bity za sekundu) FOSC – frekvence systémového oscilátoru UBRR – konstanta pro registry UBRRH a UBRRL, rozsah 0 až 4095
2.11.2 Nastavení řídících registrů Před první komunikací je nutno inicializovat komunikační port. Provedeme nastavení komunikační rychlosti, povolení vysílání, povolení příjmu a další. Podrobnosti jsou uvedeny v následujících registrech. Řídicí a status registr - UCSRnA Bit Čtení/zápis Po resetu
7 RXCn R 0
6 5 TXCn UDREn R/W R 0 1
4 FEn R 0
3 DORn R 0
2 UPEn R 0
1 0 U2Xn MPCMn UCSRnA R/W R/W 0 0
•
RXC – příjem dat (bajtu) ukončen, data jsou v přijímacím bufferu
•
TXC – vysílání dat ukončeno
•
UDRE – vysílací registr je volný, možno uložit další data pro vysílání
•
FE – chyba při příjmu dat, chyba rámce
•
DOR – došlo k přepsání dat v přijímacím bufferu (nebyla včas vyzvednuta)
•
UPE – chyba parity
•
U2X – možnost nastavení dvojnásobné rychlosti
•
MPCM – Multiprocesorový komunikační mód
27
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128
Řídicí a status registr - UCSRnB Bit
7 6 5 4 3 2 1 0 RXCIEn TXCIEn UDRIEn RXENn TXENn UCSZn2 RXB8n TXB8n UCSRnB R/W R/W R/W R/W R/W R/W R R/W 0 0 0 0 0 0 0 0
Čtení/zápis Po resetu
•
RXCIE – povolení přerušení při ukončení příjmu bajtu (bajt v přijímacím bufferu)
•
TXCIE – povolení přerušení při ukončení vysílání
•
UDRIE – povolení přerušení při uvolnění vysílacího bufferu
•
RXEN – povolení příjmu
•
TXEN – povolení vysílání
•
UCSZn2 – kombinace s registrem UCSRnC
•
RXB8 – toto je příjem 9.bitu při nastavení 9bitové komunikace
•
TXB8 – ... 9.bit pro vysílání ...
Řídicí a status registr - UCSRnC
Bit Čtení/zápis Po resetu
7 --R/W 0
6 5 4 3 2 1 0 UMSELn UPMn1 UPMn0 USBSn UCSZn1 UCSZn0 UCPOLn UCSRnC R/W R/W R/W R/W R/W R/W R/W 0 0 0 0 1 1 0
•
UMSEL – selekt módu, 0 – asynchronní, 1 – synchronní,
•
UPMn – nastavení parity, viz tabulka
•
USBS – počet stop bitů, 0 – 1 bit, 1 – 2 bity,
•
UCSZ – počet bitů při vysílání a přijímání
•
UCPOL – vysílání a přijímání dat s náběžnou nebo sestupnou hranou UPMn1 UPMn0 Mód parity 0 0 Bez parity 0 1 Nepoužito 1 0 Lichá parita 1 1 Sudá parita Tabulka 8 Nastavení bitů UPMn
UCSZn2 UCSZn1 UCSZn0 Počet bitů v rámci 0 0 0 5 bitů 0 0 1 6 bitů 0 1 0 7 bitů 0 1 1 8 bitů 1 0 0 Nepoužito 1 0 1 Nepoužito 1 1 0 Nepoužito 1 1 1 9 bitů Tabulka 9 Nastavení bitů UCSZ, počet vysílaných bitů
28
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 Příklad podprogramu inicializace sériového portu je uveden v následujících řádcích. USART_init: out out ldi out ldi out ret
UBRRH, r17 ; nastavení komunikační rychlosti UBRRL; r16 r16, (1<
Příjem a vysílání realizujeme pomocí datového registru UDR. Příklad kódu jednotlivých podprogramů je následující. USART_Transmit: sbis UCSRA, UDRE ; čekání na uvolnění vysíl.bufferu rjmp USART_Transmit out UDR, r16 ; uložení dat do vysílacího bufferu ret USART_Receive: sbis UCSRA, RXC ; čekání na příjem dat rjmp USART_Receive in r16, UDR ; čtení dat z bufferu ret
2.11.3 Multiprocesorová komunikace V krátkosti se ještě zmíníme o problémech multiprocesorové komunikace. Do rámce se vloží jedem bit, který bude signalizovat, zda je vysílán adresový bajt nebo datový bajt. Protože je maximální počet bitů v rámci 9, v tomto módu můžeme vysílat maximálně 8 bitů. Budeme-li vysílat bajt, který obsahuje adresu, nastavíme devátý bit. Pokud budeme vysílat data, tento bit nulujeme. Přijímací moduly pak reagují na tento bit. Je-li nastaven, přijímají jej a vyhodnocují všechny moduly. Když se adresa modulu shoduje s přijatou, modul vyhodnocuje i další přijímané rámce. Pokud se adresa neshoduje, modul další rámce ignoruje. Podrobnější informace o principu multiprocesorové komunikace najdeme ve firemní dokumentaci k tomuto mikrokontroléru.
29
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128
2.12
Analogový komparátor
Analogový komparátor porovnává napětí mezi dvěma vstupy a to AIN1 a AIN0. Je-li na vstupu AIN0 napětí větší než na vstupu AIN1, výstup komparátoru se nastaví na vysokou úroveň. Toho se může využít jako zdroje události, například vyvolat přerušení. Povolení činnosti komparátoru provedeme nastavením bitu ACME v registru SFIOR, který jsme uvedli v kapitole o portech. Řídicí a status registr - ACSR Bit Čtení/zápis Po resetu
7 ACD R/W 0
6 ACBG R/W 0
5 ACO R N/A
4 ACI R/W 0
3 ACIE R/W 0
2 ACIC R/W 0
1 ACIS1 R/W 0
0 ACIS0 R/W 0
ACSR
•
ACD – nastavením bitu na 1 je komparátor vypnut, což umožňuje snížení spotřeby
•
ACBG – přepínání reference – vnitřní nebo AIN0
•
ACO – výstup analogového komparátoru
•
ACI – příznak přerušení od komparátoru
•
ACIE – povolení přerušení od komparátoru
•
ACIC – propojení s časovačem ACIS1 ACIS0 Mód přerušení 0 0 Přerušení při změně stavu výstupu 0 1 Nepoužito 1 0 Přerušení při sestupné hraně výstupu 1 1 Přerušení při náběžné hraně výstupu Tabulka 10 Nastavení bitů ACIS komparátoru
2.13
Analogově digitální převodník
Použitý převodník je aproximačního typu s 10 bitovým rozlišením. Jeho vstup je připojen na osmivstupový analogový multiplexer. U některých vstupů je možno nastavit zesílení a tím převodník použít pro převod signálů nízké úrovně. Nemusíme používat externí zesilovač. Vstupní napětí můžeme používat v rozsahu 0 až Vcc. Rychlost převodu je až 15 kSPS při největším rozlišení. Rychlost vzorkování se nastavuje předděličem. Řídicí a status registr - ADCSRA Bit Čtení/zápis Po resetu
7 ADEN R/W 0
6 ADSC R/W 0
5 ADFR R/W 0
30
4 ADIF R/W 0
3 ADIE R/W 0
2 1 0 ADPS2 ADPS1 ADPS0 ADCSRA R/W R/W R/W 0 0 0
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 •
ADEN – povolení ADC, 1 – zapnut, 0 – vypnut
•
ADSC – start převodu
•
ADFR – volně běžící převod
•
ADIF – příznak přerušení na konci převodu
•
ADIE – povolení přerušení od ADC ADPS2 ADPS1 ADPS0 Hodnota předděliče 0 0 0 1 0 0 1 2 0 1 0 4 0 1 1 8 1 0 0 16 1 0 1 32 1 1 0 64 1 1 1 128 Tabulka 11 Nastavení bitů ADPS převodníku
Pro správnou činnost převodníku musíme správně nastavit i multiplexer. Registr ADC multiplexeru - ADMUX
Bit Čtení/zápis Po resetu
7 6 5 4 REFS1 REFS0 ADLAR MUX4 R/W R/W R/W R/W 0 0 0 0
3 MUX3 R/W 0
2 MUX2 R/W 0
1 MUX1 R/W 0
•
REFS – volba referenčního napětí
•
ADLAR – zarovnání výsledku v registru vlevo nebo vpravo
•
MUX – výběr vstupu a zesílení.
0 MUX0 R/W 0
ADMUX
Práce s AD převodníkem vyžaduje detailnější nastavení a úvahy, proto je třeba před jeho použitím detailněji prostudovat firemní dokumentaci.
31
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128
3 Vývojové prostředky Při používání všech vývojových prostředků je třeba dodržovat zásady pro práci se součástkami CMOS. Nedodržení těchto zásad může mít za následek poškození prostředku. Zejména je nutno zabezpečit, aby nedošlo k elektrostatickému výboji, nevystavovat přímému slunečnímu záření, mechanicky nenamáhat a nevystavovat vodě či velké vlhkosti.
3.1 Základní modul MB-ATmega128
Obr. 5 Základní deska MB-ATmega128
32
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 3.1.1 Vlastnosti modulu MB-ATmega128 •
Základová deska obsahuje RISC-ový mikrokontrolér Atmel ATmega12816AI TQFP64.
•
Pro vytváření programového kódu je možné použít volně dostupný vývojový software Atmel AVR Studio či WinAVR-GCC.
•
Mikrokontrolér se programuje ISP nebo JTAG programátorem připojeným na příslušný konektor (JTAG umožňuje i ladění).
•
Všechny I/O vývody MCU jsou přístupné na detailně popsaných konektorech, na které je možné připojit přídavné moduly či uživatelský hardware.
•
Vestavěné periferie je možné odpojit a konfigurovat pomocí propojek, což zaručuje vysokou univerzalitu desky.
•
Napájecí napětí pro mikrokontrolér a pro připojené moduly (+5V) je vytvářeno napěťovým regulátorem umístěným na desce.
•
K mikrokontroléru je standardním způsobem připojena asynchronní SRAM paměť 128k x 8bit, 55ns. Připojení řídících vodičů paměti k MCU je možné měnit pomocí propojek.
•
Základová deska obsahuje nastavitelnou napěťovou referenci pro interní AD převodník mikrokontroléru a také umožňuje připojení
•
externí napěťové reference či použít jako referenci napájecí napětí VCC.
•
Zdrojem hodinového signálu pro mikrokontrolér může být krystal umístěný v patici na základové desce a nebo externí zdroj hodinového signálu. Základová deska je dodávána s krystalem 14.7456MHz.
•
Pro vnitřní RTC obvod mikrokontroléru je na desce umístěný odpojitelný krystal 32.768kHz.
•
Základová deska dále obsahuje 2 odpojitelné sériové rozhraní RS-232.
•
Mikrokontrolér je možné resetovat tlačítkem RESET.
•
Rozměry (v x š x d) : 25mm x 74mm x 107mm
33
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 3.1.2 Stručný popis modulu Základová deska MB-ATmega128 je jednou z hlavních částí vývojového a výukového
modulárního
systému MVS. Obsahuje RISC-ový mikrokontrolér řady AVR firmy Atmel s označením
ATmega128-
16AI. Deska je určena k vývojovým a výukovým účelům v oblasti 8bitových RISC-ových mikrokontrolérů maximálním
s výkonem
16MIPS. Při návrhu základové desky byl kladen důraz na maximální Obr. 6 Periferie základové desky
využití
použitého obvodu Atmel
AVR MCU (mikrokontrolér). Základová deska proto obsahuje pouze součástky, které jsou nezbytně nutné pro jeho funkci (napěťový regulátor, zdroj referenčního napětí pro vnitřní ADC převodník, krystaly, resetovací obvod apod.) a 4 rozšiřující konektory CON1..4 typu MLW20, pomocí nichž se mikrokontrolér propojuje s ostatními moduly vývojového systému MVS. Na tyto konektory se také může připojit uživatelský hardware nebo část vyvíjené aplikace. Deska dále obsahuje 2 sériové komunikační rozhraní RS-232, které lze pro vyšší univerzálnost použití mikrokontroléru odpojit propojkami. Posledním periferním blokem umístěným na základové desce je asynchronní SRAM paměť 128k x 8bit. Paměť má připojeny své adresové, datové a řídící signály k MCU standardním způsobem. Pro speciální aplikace je možné paměť trvale zakázat připojením signálu CS1 na +5V pomocí propojky.
34
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 3.1.3 Provozní podmínky a parametry Maximální napájecí napětí VINMAX ...............................................12V stejnosměrných Provozní napájecí napětí VIN ...........................................6.5V – 8.0V stejnosměrných Maximální proudový odběr ITOT………..…………………......................................1A Maximální ztrátový výkon na hlavním napěťovém stabilizátoru PTOT……..........1.6W Klidový proudový odběr základové desky bez připojených modulů............60mA typ. Povolené vstupní napětí I/O vývodů...................-0.5V až VCC + 0.5V stejnosměrných Maximální odebíraný proud z I/O vývodu mikrokontroléru…............................20mA Maximální odebíraný proud ze všech I/O vývodů mikrokontroléru současně.. 200mA Skladovací teplota okolí........................................................................-10°C až +50°C Provozní teplota okolí..........................................................................+10°C až +40°C
3.1.4 Nastavení a použití V této sekci je popsáno jak základovou desku nastavovat a používat. Je zde uveden způsob připojení ke zdroji napájecího napětí, zapojení rozšiřujících konektorů a jejich používání, popis periférií umístěných na
desce
a
připojení
programovacího
kabelu. Dále je zde uveden význam jednotlivých propojek (jumperů), které se používají pro nastavování základové desky.
Obr. 7 Rozmístění konektorů a propojek
Legenda: CON1..4 rozšiřující konektory typu MLW20 CON5 napájecí konektor CON6 ISP programovací konektor CON7 JTAG programovací a ladící konektor CON8..9 RS-232 komunikační konektory typu Canon 9 (vidlice)
35
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 JP1 volba napěťové reference A/D převodníku JP2 volba připojení vývodů PG3M a PG4M mikrokontroléru (RTC krystal / IO) JP3 volba zdroje hodinového signálu pro mikrokontrolér JP4 volba připojení vývodů PE0M a PE1M mikrokontroléru (RS232-0 / CON2) JP5 volba připojení vývodů PD2M a PD3M mikrokontroléru (RS232-1 / CON1) JP6 volba připojení adresového signálu A15S SRAM paměti JP7 volba připojení signálu CS1\ SRAM paměti JP8 volba připojení adresového signálu A16S SRAM paměti
3.2 Modul 8 LED a 8 tlačítek
Obr. 8 Modul 8 LED a 8 tlačítek
3.2.1 Vlastnosti modulu 8 LED a 8 tlačítek •
8 LED diod přímo připojených na vývody konektoru.
•
8 tlačítek přímo připojených na vývody konektoru.
•
Možnost volby připojení tlačítek (+VCC / GND) a jejich pull-up / pull-down rezistorů.
•
Rozměry (v x š x d) : 20mm x 66mm x 33mm.
3.2.2 Stručný popis modulu Modul 8 LED diod a 8 tlačítek je jedním z mnoha modulů modulárního vývojového systému MVS. Lze jej použít ve spojení s některou ze základových desek pro zobrazení 8 binárních signálů a nastavování jiných 8 binárních signálů. Všech 8 LED diod je přímo připojených svými katodami k propojovacímu konektoru přes své ochranné rezistory a anody mají připojeny na +VCC. Taktéž každé z 8 tlačítek je propojeno jedním kontaktem na propojovací konektor a zároveň na
36
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 rezistor, který je možné připojit buď na napájecí napětí +VCC a nebo na nulové napětí GND. Volba se provádí společně pro všechny rezistory pomocí propojky. Druhý kontakt tlačítek je možné taktéž připojit pomocí propojky na napětí +VCC a nebo na GND. Tímto způsobem je tedy umožněno zapojit všechna tlačítka tak, že výstupní signál připojují na nulový potenciál GND s pull-up rezistory a nebo tak, že výstupní signál připojují na napětí +VCC s pull-down rezistory.
3.2.3 Provozní podmínky a parametry Maximální napájecí napětí VCC....................................................5.5V stejnosměrných Maximální napětí spínané tlačítky.......................................................................... 24V Maximální proud tlačítky......................................................................................50mA Maximální řídící napětí LED diod............................................................-0.5V..+5.5V Provozní napájecí napětí VCC..................................................0V – 5V stejnosměrných Skladovací teplota okolí........................................................................-10°C až +40°C Provozní teplota okolí..........................................................................+10°C až +30°C
3.2.4 Použití tlačítek Tlačítka jsou připojena tak, že spínají výstupní vodiče Btn 1..8 na nulový potenciál GND. Tyto vodiče jsou dále připojeny přes samostatné pull-up rezistory 10kΩ na napájecí napětí +VCC. Pokud není tlačítko stlačeno, je příslušný vodič Btn 1..8 ve stavu logické 1 (+VCC), a když je tlačítko stlačeno, je vodič na potenciálu logické 0 (GND).
3.2.5 Řízení LED diod LED diody mají anody připojeny na napájecí napětí +VCC a katody přes ochranné rezistory na konektor CON1. Proto pokud má daná LED dioda svítit je nutné, aby byl příslušný vodič konektoru CON1 (LED 1..8) připojený k této LED diodě připojen na nižší napětí, než je +VCC, nejlépe na napětí 0V (log. 0). Pokud dioda svítit nemá, je nutné na katodu připojit napětí srovnatelné s +VCC (log. 1). LED diody tedy zobrazují 8 bitovou informaci invertovaně.
37
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128
3.3 Modul LED displej a LCD displej
Obr. 9 Modul s LED nebo LCD displejem
3.3.1 Vlastnosti modulu LED displej a LCD displej •
4 sedmisegmentové LED displeje, řízené multiplexovaně.
•
Rozhraní pro znakový LCD modul (např. 2x16 znaků).
•
Maticová klávesnice 4x4 s alfanumerickými popisy.
•
Elektroakustický měnič.
•
Rozměry (v x š x d) : 30mm x 80.6mm x 86.7mm
3.3.2 Stručný popis modulu Modul LED a LCD displeje s maticovou klávesnicí je jedním z mnoha modulů modulárního vývojového systému MVS. Lze jej použít ve spojení s některou ze základových desek k vytvoření základního uživatelského vstupně / výstupního rozhraní. Modul obsahuje 4 sedmisegmentové LED zobrazovače, zapojené multiplexovaně, dále rozhraní pro znakový podsvětlený LCD modul, trimr pro řízení kontrastu, 16 tlačítek zapojených do matice 4x4 a elektroakustický měnič pro generování zvuků. Oba displeje (LED i LCD) jsou umístěny nad sebou, přičemž LCD modul se zapojuje do jednořadého konektoru a je tedy možné jej vyjmout a používat tak LED
38
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 displej umístěný pod ním. V případě, že se používá LCD modul, je možné LED displej vypnout pomocí propojky. Základová deska či uživatelský hardware se připojuje k tomuto modulu přes konektor CON1 typu MLW20.
3.3.3 Provozní podmínky a parametry Maximální napájecí napětí VCC...............................................................................5.5V Provozní napájecí napětí VCC......................................................................4.5V – 5.5V Dovolené napětí na vstupech / výstupech...........................................................0..5.5V Maximální proud do vstupů / výstupů....................................................................1mA Klidový proudový odběr (LED displej vypnut)......................................................5mA Skladovací teplota okolí........................................................................-10°C až +40°C Provozní teplota okolí..........................................................................+10°C až +30°C
3.3.4 Nastavení a použití Tento modul budeme převážně používat v režimu LED displeje. Dle popisu MLW konektoru jsou funkce následující: C0, C1 – odpovídá bitům 2, 3 příslušného portu, kam bude modul připojen. Těmito bity nastavujeme, která segmentovka má být aktivní – má svítit. Binární hodnotě 00 odpovídá levá segmentovka a hodnotě 11 pravá segmentovka. C2 – odpovídá bitu 4 příslušného portu. Tímto signálem můžeme zablokovat celý dekodér segmentového zobrazovače, které pak nebudou svítit. Proto na tomto bitu musí být trvale hodnota log.1. BPR – odpovídá bitu 5 příslušného portu. Zde je přes kondenzátor připojen akustický měnič (beeper). Chceme-li generovat nějaký tón, musíme v časovači vytvořit příslušné časové impulzy, kterými tento měnič budeme ovládat. IO0 – IO7 – tímto portem ovládáme segmenty aktivní segmentovou. Pokud bude na příslušném pinu úroveň log.1, příslušný segment nesvítí. Informace je tedy zobrazována invertovaně.
39
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128
4 Prostředí AVR Studio 4 Program AVR Studio 4 slouží k programování mikrokontrolérů typu AVR od firmy ATMEL. Na internetu je volně dostupný a můžeme si ho stáhnout na adrese www.atmel.com. Jedná se o kompletní vývojové prostředí, které umožňuje programovat uvedené mikrokontroléry v jazyce C nebo v jazyku symbolických adres ASSEMBLER. Součástí programu je i DEBUGGER, pomocí kterého můžeme v programu nalézt a odstranit logické chyby. AVR Studio 4 pracuje pod operačním systémem Windows. Při jeho instalaci nebyly zjištěny problémy.
4.1 Nový projekt
Po otevření programu AVR Studio 4 nám jsou nabídnuty projekty, které jsme v tomto prostředí již vytvořili. Vybereme příslušný projekt a tlačítkem LOAD jej nahrajeme do prostředí. Pokud vytváříme první nebo nový projekt, tlačítkem New Project jej založíme. Nejprve určíme typ projektu, zda jej budeme vytvářet v jazyce C nebo v Assembleru. Budeme používat Atmel AVR Assembler. Po této volbě musíme zadat název projektu. Zde se doporučuje používat krátké názvy ale hlavně bez diakritiky. Při nedodržení mohou vzniknout potíže při otevírání souborů. Pokud jsme zadali název projektu, můžeme si zvolit místo, kde bude uložen. Opět se nedoporučuje používat 40
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 diakritiku v názvech jednotlivých složek. Název základního souboru je vhodné
ponechat shodný s názvem projektu. Tlačítkem Next si otevřeme další okno. Zde musíme zvolit AVR simulátor a typ mikrokontroléru, se kterým budeme
pracovat. V našem případě se jedná o ATmega128. Tlačítkem Finish zadávání projektu ukončíme a můžeme začít pracovat.
4.2 Tvorba programu Postup při tvoření programu si vysvětlíme na jednoduchém příkladu programu Čítač, kterého výpis je uveden v kapitole 5.1. V úvodu každého programu je vhodné napsat do poznámky, o jaký program se jedná, co vykonává, jaké prostředky potřebuje, kdo jej vytvořil a o jakou verzi se
41
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 jedná. Usnadní to orientaci v jednotlivých projektech při jejich dodatečných opravách nebo doplňování. Než začneme psát jakýkoliv program, je třeba si uvědomit, že psaní programů pro mikrokontroléry je odlišné od psaní programů pro stolní počítač i když použijeme stejný programovací jazyk. V počítači je totiž operační systém, který nám kromě jiného umožňuje provádět základní obsluhu počítače. Jsou zde potřebné drivery pro ovládání periferií. V mikrokontroléru nic takového nenajdeme. Proto musíme veškeré programy potřebné pro ovládání periferií (drivery) napsat sami. Na začátku každého programu vložíme pomocí příkazu „.include“ konstanty a pojmenování jednotlivých registrů, které pro nás připravil výrobce mikrokontroléru dle jeho vlastností. Všimněte si, že před povelem je tečka. Ta upozorňuje překladač, že se jedná o příkaz pro něho, nikoliv pro mikrokontrolér. Takovýchto příkazů budeme používat více, v souvislosti s uvedených příkazem upozorním na „.NOLIST“ a „.LIST“. Těmito příkazy zakážeme nebo povolíme výpis (listing) příslušné části programu při překladu. V další části si můžeme dle vlastních požadavků a potřeb přejmenovat registry tak, aby jejich označení nám vyhovovalo. Nemusíme si pamatovat, že pro přenos dat mezi programy budeme používat registr číslo 16, ale přejmenujeme si ho například na pracovní. To provedeme pomocí příkazu „.DEF“. Pokud nám nebudou pro ukládání dat stačit registry, musíme využít paměťový prostor. Překladači musíme oznámit, že pracujeme v oblasti paměti RAM a to příkazem „.DSEG“ – datový segment. Pojmenujeme příslušnou proměnnou (oblast paměti) a určíme její velikost. Budeme-li používat konstanty nebo data uložená v paměti EEPROM, příslušný segment musíme označit jako „.ESEG“. Označení paměti – proměnné, provádíme v obou případech stejným způsobem. Nejprve zvolíme jednoznačný název paměťového místa, označíme je jako návěstí (za názvem je dvojtečka) a určíme velikost místa v bytech. Například:
42
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128
.DSEG Buffer:
.byte 5
.ESEG BDRT:
.byte 1
Pokud budeme v programu používat například Buffer, na jehož délku se budeme odkazovat a navíc tuto délku budeme v průběhu tvorby programu měnit, je vhodné si ji nadefinovat jako konstantu. Tuto konstantu nadefinujeme na začátku programu a v případě potřeby ji změníme pouze na tomto místě. Vše ostatní zařídí program AVR studio sám.
.EQU DlBuf = 5 … … .DSEG Buffer: .byte DlBuf … … cpi R1, DlBuf … …
Vlastní program píšeme do segmentu označeného „.CSEG“ – kódový segment. V úvodu každého programového kódu nezapomeneme nastavit ukazatel zásobníkové paměti, tzv. Stack Pointer. Jeho hodnotu nastavujeme vždy na konec oblasti paměti RAM. Podrobně je vše uvedeno v příkladech programů v kapitole 5. Chceme-li programovat v jazyku ANSI C, pak místo volby Atmel AVR Assembler, vybereme volbu AVR GCC. Na tomto místě bych ale chtěl upozornit na tu skutečnost, že program napsaný v Assembleru je rychlejší a zabírá méně místa v paměti mikrořadiče, zatímco stejný program napsaný v jazyce ANSI C je pomalejší a zabírá podstatné více místa v paměti. Je pravda, že programování v Assembleru je pro začátečníky komplikovanější. Dovoluje však více možností.
43
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128
4.3 Tabulka povelů mikrokontroléru Mnemo Operand Popis Aritmetické a logické instrukce ADD Rd,Rr Součet dvou registrů Součet dvou registrů s ADC Rd,Rr přenosem ADIW Rdl,K Přečtení konstanty ke slovu SUB Rd,Rr Rozdíl dvou registrů Odečtení konstanty od SUBI Rd,K registru Rozdíl dvou registrů s SBC Rd,Rr přenosem Odečtení konstanty od SBCI Rd,K registru s přenosem SBIW Rd,K Odečtení konstanty od slova AND Rd,Rr Logický součin dvou registrů Logický součin registru s ANDI Rd,K konstantou OR Rd,Rr Logický součet dvou registrů Logický součet registru a ORI Rd,K konstanty Exkluzivní součet dvou EOR Rd,Rr registrů COM Rd První doplněk (negace) NEG Rd Druhý doplněk SBR Rd,K Nastavení bitu v registru CBR Rd,K Nulování bitu v registru INC Rd Inkrement (+1) DEC Rd Dekrement (-1) TST Rd Test na nulu nebo mínus CLR Rd Nulování registru SER Rd Nastavení registru (na 0xFF) MUL Rd,Rr Násobení bez znaménka MULS Rd,Rr Násobení se znaménkem Násobení znaménkového MULSU Rd,Rr neznaménkovým Desetinné násobení bez FMUL Rd,Rr znaménka Desetinné násobení se FMULS Rd,Rr znaménkem Des. Nás. Znaménkového FMULSU Rd,Rr neznaménkovým Skokové instrukce RJMP k Relativní skok Nepřímý skok na adresu v IJMP registru Z JMP k Přímý skok RCALL k Relativní volání podprogramu Nepřímé volání podprogramu ICALL (registr Z) CALL k Přímé volání podprogramu RET Návrat z podprogramu RETI Návrat z přerušení Porovnání registrů a skok, CPSE Rd,Rr pokud rovno CP Rd,Rr Porovnání registrů Porovnání registrů s CPC Rd,Rr přenosem Porovnání registru s CPI Rd,K konstantou Skok, pokud je bit v registru SBRC Rr,b nulový Skok, pokud je bit v registru SBRS Rr,b nastaven Skok, pokud je bit v I/O SBIC P,b registru nulový
Operace
Příznak
Takt
Rd ← Rd + Rr
Z,C,N,V,H
1
Rd ← Rd + Rr + C
Z,C,N,V,H
1
Rdh:Rdl ← Rdh:Rdl + K Rd ← Rd - Rr
Z,C,N,V,S Z,C,N,V,H
2 1
Rd ← Rd - K
Z,C,N,V,H
1
Rd ← Rd - Rr - C
Z,C,N,V,H
1
Rd ← Rd - K - C
Z,C,N,V,H
1
Rdh:Rdl ← Rdh:Rdl - K Rd ← Rd • Rr
Z,C,N,V,S Z,N,V
2 1
Rd ← Rd • K
Z,N,V
1
Rd ← Rd v Rr
Z,N,V
1
Rd ← Rd v K
Z,N,V
1
Rd ← Rd (+) Rr
Z,N,V
1
Rd ← 0xFF - Rd Rd ← 0x00 - Rd Rd ← Rd v K Rd ← Rd • (0xFF - K) Rd ← Rd + 1 Rd ← Rd - 1 Rd ← Rd • Rd Rd ← 0x00 Rd ← 0xFF R1:R0 ← Rd x Rr R1:R0 ← Rd x Rr
Z,C,N,V Z,C,N,V,H Z,N,V Z,N,V Z,N,V Z,N,V Z,N,V Z,N,V --Z,C Z,C
1 1 1 1 1 1 1 1 1 2 2
R1:R0 ← Rd x Rr
Z,C
2
R1:R0 ← (Rd x Rr) << 1
Z,C
2
R1:R0 ← (Rd x Rr) << 1
Z,C
2
R1:R0 ← (Rd x Rr) << 1
Z,C
2
PC ← PC + k + 1
---
2
PC ← (Z)
---
2
PC ← k PC ← PC + k + 1
-----
3 3
PC ← (Z)
---
3
PC ← k PC ← Stack PC ← Stack
----I
4 4 4
If(Rd=Rr) PC←PC+2(3)
---
1/2/3
Rd - Rr
Z,N,V,C,H
1
Rd - Rr - C
Z,N,V,C,H
1
Rd - K
Z,N,V,C,H
1
If(Rr(b)=0) PC←PC+2(3)
---
1/2/3
If(Rr(b)=1) PC←PC+2(3)
---
1/2/3
If(P(b)=0) PC←PC+2(3)
---
1/2/3
44
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 SBIS
P,b
BRBS
s,k
BRBC
s,k
BREQ BRNE
k k
BRCS
k
BRCC
k
BRSH
k
BRLO BRMI BRPL
k k k
BRGE
k
BRLT
k
BRHS
k
BRHC
k
BRTS
k
BRTC
k
BRVS
k
BRVC
k
BRIE
k
BRID
k
Instrukce přenosu dat MOV Rd,Rr MOVW Rd,Rr LDI Rd, K LD Rd,X LD
Rd,X+
LD
Rd,-X
LD LD LD LDD LD LD LD LDD
Rd,Y Rd,Y+ Rd,-Y Rd,Y+q Rd,Z Rd,Z+ Rd,-Z Rd,Z+q
LDS
Rd,k
ST
X,Rr
ST
X+,Rr
ST
-X,Rr
ST ST ST STD ST ST ST STD
Y,Rr Y+,Rr -Y,Rr Y+q,Rr Z,Rr Z+,Rr -Z,Rr Z+q,Rr
STS
k,Rr
LPM
Skok, pokud je bit v I/O registru nastaven Skok, pokud je bit ve stavovém registru nastaven Skok, pokud je bit ve stavovém registru nulový Skok, pokud rovno Skok, pokud není rovno Skok, pokud je přenos nastaven Skok, pokud je přenos nulový Skok, pokud je rovno nebo větší Skok, pokud je menší Skok, pokud je záporný Skok, pokud je kladný Skok, pokud větší nebo rovno - znaménkově Skok, pokud menší než nula znaménkově Skok, pokud je nastaven poloviční přenos Skok, pokud je poloviční přenos nulový Skok, pokud je T příznak nastaven Skok, pokud je T příznak nulový Skok, pokud je příznak přeplnění nastaven Skok, pokud je příznak přeplnění nulový Skok, pokud je přerušení povoleno Skok, pokud je přerušení zakázáno Kopie registru Kopie dvou registrů (slova) Naplnění registru konstantou Nepřímé naplnění, adresa v X Nepřímé naplnění, adresa v X, pak inkrement adresy Nepřímé naplnění, adresa v X, napřed dekrement adresy … adresa v Y … … adresa v Y … … adresa v Y … … adresa v Y, pak přičtení q … adresa v Z … … adresa v Z … … adresa v Z … … adresa v Z, pak přičtení q Naplnění registru z přímé adresy k v SRAM Nepřímé uložení, adresa v X Nepřímé uložení, adresa v X, pak inkrement adresy Nepřímé uložení, adresa v X, napřed dekrement adresy … adresa v Y … … adresa v Y … … adresa v Y … … adresa v Y, pak přičtení q … adresa v Z … … adresa v Z … … adresa v Z … … adresa v Z, pak přičtení q Uložení registru na přímou adresu k v SRAM Čtení programové paměti
If(P(b)=1) PC←PC+2(3)
---
1/2/3
If(SREG(s)=0) PC←PC+1
---
1/2
If(SREG(s)=1) PC←PC+1
---
1/2
If(Z=1) PC←PC+k+1 If(Z=0) PC←PC+k+1
-----
1/2 1/2
If(C=1) PC←PC+k+1
---
1/2
If(C=0) PC←PC+k+1
---
1/2
If(C=0) PC←PC+k+1
---
1/2
If(C=1) PC←PC+k+1 If(N=1) PC←PC+k+1 If(N=0) PC←PC+k+1
-------
1/2 1/2 1/2
If(N(+)V=0) PC←PC+k+1
---
1/2
If(N(+)V=1) PC←PC+k+1
---
1/2
If(H=1) PC←PC+k+1
---
1/2
If(H=0) PC←PC+k+1
---
1/2
If(T=1) PC←PC+k+1
---
1/2
If(T=0) PC←PC+k+1
---
1/2
If(V=1) PC←PC+k+1
---
1/2
If(V=0) PC←PC+k+1
---
1/2
If(I=1) PC←PC+k+1
---
1/2
If(I=0) PC←PC+k+1
---
1/2
Rd ← Rr Rd+1:Rd ← Rr+1:Rr Rd ← K Rd ← (X)
---------
1 1 1 2
Rd ← (X), X ← X + 1
---
2
X ← X - 1, Rd ← (X)
---
2
Rd ← (Y) Rd ← (Y), Y ← Y + 1 Y ← Y - 1, Rd ← (Y) Rd ← (Y + q) Rd ← (Z) Rd ← (Z), Z ← Z + 1 Z ← Z - 1, Rd ← (Z) Rd ← (Z + q)
-----------------
2 2 2 2 2 2 2 2
Rd ← (k)
---
2
(X) ← Rr
---
2
(X) ← Rr, X ← X + 1
---
2
X ← X - 1, (X) ← Rr
---
2
(Y) ← Rr (Y) ← Rr, Y ← Y + 1 Y ← Y - 1, (Y) ← Rr (Y + q) ← Rr (Z) ← Rr (Z) ← Rr, Z ← Z + 1 Z ← Z - 1, (Z) ← Rr (Z + q) ← Rr
-----------------
2 2 2 2 2 2 2 2
(k) ← Rr
---
2
R0 ← (Z)
---
3
45
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 Naplnění registru z adresy v Z z programové paměti Čtení programové paměti, LPM Rd,Z+ pak inkrement Z ELPM Rozšířená programová paměť ELPM Rd,Z Rozšířená programová paměť ELPM Rd,Z+ Rozšířená programová paměť Uložení do programové SPM paměti IN Rd,P Čtení portu do registru OUT P,Rd Výstup registru na port PUSH Rr Odložení registru do Stacku POP Rd Obnovení registru ze Stacku Bitové a bity testující instrukce SBI P,b Nastavení bitu v I/O registru CBI P,b Nulování bitu v I/O registru LSL Rd Logický posun vlevo LSR Rd Logický posun vpravo Rotace registru vlevo s ROL Rd využitím přenosu Rotace registru vpravo s ROR Rd využitím přenosu ASR Rd Aritmetický posun vpravo Záměna horního a dolního SWAP Rd půlbajtu Nastavení bitu příznakového BSET s,k registru Nulování bitu příznakového BCLR s,k registru BST Rr,b Uložit bit z registru do T BLD Rd,b Uložit T do bitu registru SEC Nastavit přenos CLC Nulovat přenos SEN Nastavit záporný příznak CLN Nulovat záporný příznak SEZ Nastavit nulový příznak CLZ Nulovat nulový příznak SEI Povolit přerušení CLI Zakázat přerušení SES Nastavit příznak znaménka CLS Nulovat příznak znaménka Nastavení přetečení SEV dvojkového doplňku Nulování přetečení CLV dvojkového doplňku SET Nastavit T ve status registru CLT Nulovat T ve status registru SEH Nastavit poloviční přenos CLH Nulovat poloviční přenos Řídicí instrukce NOP Prázdná operace SLEEP Spát - Zastavit hodiny WDR Nulování čítače Watchdog BREAK LPM
Rd,Z
Rd ← (Z)
---
3
Rd ← (Z), Z ← Z + 1
---
3
R0 ← (RAMPZ:Z) Rd ← (RAMPZ:Z) Rd←(RAMPZ:Z),RAMPZ:Z←RAMPZ:Z+1
-------
3 3 3
(Z) ← R1:R0
---
Rd ← P P ← Rr Stack ← Rr Rd ← Stack
---------
1 1 2 2
P(b) ← 1 P(b) ← 0 Rd(n+1) ← Rd(n), Rd(0) ← 0 Rd(n) ← Rd(n+1), Rd(7) ← 0
----Z,C,N,V Z,C,N,V
2 2 1 1
Rd(0)←C,Rd(n+1)←Rd(n),C←Rd(7)
Z,C,N,V
1
Rd(7)←C,Rd(n)←Rd(n+1),C←Rd(0)
Z,C,N,V
1
Rd(n) ← Rd(n+1), n = 0 .. 6
Z,C,N,V
1
Rd(3..0)←Rd(7..4),Rd(7..4)←Rd(3..0)
---
1
SREG(s) ← 1
SREG(s)
1
SREG(s) ← 0
SREG(s)
1
T ← Rr(b) Rr(b) ← T C←1 C←0 N←1 N←0 Z←1 Z←0 I←1 I←0 S←1 S←0
T --C C N N Z Z I I S S
1 1 1 1 1 1 1 1 1 1 1 1
V←1
V
1
V←0
V
1
T←1 T←0 H←1 H←0
T T H H
1 1 1 1
Přečíst specifikaci Přečíst specifikaci Pouze pro kontrolu na čipu
---------
1 1 1
4.4 Zavedení programu do mikrokontroléru Použitý mikrokontrolér má zabudovaný port ISP (In Systém Programing), který umožňuje zavádět program přímo v aplikaci a tedy program v této aplikaci i odladit a vyzkoušet. K tomuto účelu slouží specielní programátor, který připojíme na paralelní port počítače. V programu „AVR studio“ data pomocí klávesy F7 přeložíme do HEXA kódu. Pomocí programu „AVR_ISP_prog“ data nahrajeme. 46
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128
Aktivací tlačítka „Load file“ nahrajeme příslušný soubor s příponou „.hex“. Hledat jej budeme ve složce, ve které máme uložený příslušný program. Tlačítkem „Reload – …“ pak zvolený soubor zavedeme do mikrokontroléru. Při dalším zavádění stejného programu jej nemusíme znovu nahrávat tlačítkem Load file, stačí pouze zavést tlačítkem Reload. Před tímto krokem nesmíme zapomenout upravený program v AVR studio přeložit do HEXA kódu klávesou F7. Jestliže v programu zadáme konstanty, které mají být uloženy v paměti EEPROM, program AVR studio vytvoří soubor s příponou „.eep“. Tento soubor nahrajeme tlačítkem „Load file“, ale tentokrát ve sloupci EEPROM. Tlačítkem „Reload“ zavedeme oba soubory.
47
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 Při zavádění souborů do aplikace se automaticky provádí restart procesoru. Nemusíme tedy restart provádět manuálně. Je třeba upozornit na tu skutečnost, že pro zavádění programu se používá SPI rozhraní. Pokud budeme toto rozhraní v aplikaci používat, je třeba zapojení upravit tak, aby nedošlo ke zkratu nebo přetížení programátoru použitými obvody. V tom případě by se nám naprogramování aplikace nezdařilo.
48
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128
5 Příklady programů v Assembleru 5.1 Program „Čítač“ 5.1.1 Popis programu „Čítač“ Uvedený program je velice jednoduchý a je na něm ukázáno, jak je třeba postupovat při vlastní tvorbě programů. Nejprve si vytvoříme vývojový diagram. Nejdříve musíme nastavit Stack Pointer, který ukazuje na odkládací paměť. Sem budeme ukládat návratové adresy při volání podprogramů. Tuto paměť umísťujeme vždy na konec paměti RAM. I když tento program je jednoduchý a podprogramy bychom nemuseli používat, pro jejich pochopení si je vytvoříme. Dále musíme nastavit příslušné porty, zda jsou vstupní nebo výstupní. Který port musíme nastavit, to je dáno konstrukcí přípravku. Je-li požadavek na nastavení počátečních hodnot, musíme je nastavit v této fázi programu. Po úvodním nastavení můžeme vytvářet hlavní smyčku, která se bude neustále opakovat. Zde budeme inkrementovat proměnnou (v našem případě čítač), obsah této proměnné pošleme na výstupní port a na závěr musíme chvíli počkat, abychom zaregistrovali blikání LED diod. Výstup na port a čekání si zpracujeme jako podprogramy, protože je pak budeme využívat i v jiných programech. Výstup na LED musíme nejprve negovat, protože LED diody jsou zapojeny proti napájení, budou tedy svítit, pokud na portu bude logická „0“. Požadujeme, aby svítila, bude-li v proměnné logická „1“. Čekací smyčka zaměstnává mikrokontrolér a tím zpomaluje celou hlavní smyčku programu. Jinak bychom při jeho rychlosti nestihli zaznamenat změny na výstupu a všechny LED by trvale svítily. To si můžeme ověřit změnou konstanty ve smyčce main, kde změníme nastavení zpoždění z hodnoty 200 na hodnotu menší.
49
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 5.1.2 Vývojový diagram programu „Čítač“
5.1.3 Zdrojový kód programu „Čítač“ ;*********************************************************** ;* ;*
* Program pro ovladani LED diod
*
;* ;*
* modul MB-ATmega128
;*
*
8 LED, 8 tlacitek
*
;* ;*
* Stredni skola teleinformatiky Ostrava
;*
* *
;***********************************************************
.NOLIST
; zakazani vypisu
.include "m128def.inc"
; vlozeni preddefinovanzch dat vyrobcem
.LIST
; povolit dalsi vypis
50
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128
; ***** Definice .DEF Tmp
= r16
; prirazeni promennych registrum – docasny
.DEF Cnt
= r17
; citac
.DEF Dly1 = r18
; promenna pro casove zpozdeni
.DEF Dly2 = r19
; ***** Programovy segment .CSEG
jmp
.ORG 0x0000
; pocatek pameti Flash – vektory preruseni
Reset
; prvni vektor je RESET ; dalsi neni vyuzito – není povoleno preruseni ; musi se ale preskocit
.ORG 0x0046
; konec vektoru, zacatek programu
; ***** Prvotni nastaveni po resetu Reset: ldi
Tmp, low(RAMEND)
; nastaveni Stack Pointeru na konec
pameti RAM out
SPL, Tmp
ldi
Tmp, high(RAMEND)
out
SPH, Tmp
ldi
Tmp, 0xFF
out
DDRB, Tmp
out
PortB, Tmp
; port B do "1" – nesviti LED
clr
Cnt
; nulovani citace
rjmp
main
; skok do hlavni smycky
; Port B jako vystupni
51
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 ; ***** Podprogram vystupu dat na LED OutLED: com
Tmp
; negovat registr – diody proti +
out
PortB, Tmp
; vystup na port B
ret
; ***** Zpozdeni 1 ms Delay: ldi
Dly1, 20
Del2: ldi
Dly2, 240
Del1: dec
Dly2
brne
Del1
dec
Dly1
brne
Del2
dec
Tmp
brne
Delay
; nastaveni konstant pro 1 ms
; dekrementuj prvni promennou az do nuly
; dekrementuj druhou promennou az do nuly
ret
; ***** Hlavni programova smycka main: inc
Cnt
; inkrementuj obsah citace
mov
Tmp, Cnt
; presun citac do docasneho registru
rcall
OutLED
; podprogram pro vystup na LED
ldi
Tmp, 200
; nastav zpozdeni na 200 ms
rcall
Delay
; podprogram zpozdeni
rjmp
main
; zpet na zacatek smycky
52
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128
5.2 Program „Tlačítka 1“ 5.2.1 Popis programu „Tlačítka 1“ Proti předchozímu programu zde budeme používat i vstupní port pro obsluhu tlačítek. V úvodu programu opět musíme nastavit Stack Pointer – nezapomenout – na konec paměti RAM. Pak podle přípravku nastavíme port B jako výstupní a port D jako vstupní. Počáteční hodnoty nastavovat nemusíme, protože program hned čte port tlačítek a nastavuje výstup. V hlavní smyčce provádíme čtení portu tlačítek a výstup na LED diody. Podprogram pro výstup na LED je stejný, jako jsme vytvořili v minulém příkladu. Podprogram pro čtení tlačítek si vytvoříme. Protože jsou tlačítka na vstupu mikrokontroléru připojena k zemi a odpory jsou připojeny na plus, budeme mít při stlačení tlačítka na vstupu logickou „0“ a naopak. Abychom dostali v proměnné odpovídající logické hodnoty, musíme proměnnou po přečtení portu negovat. Výsledný vývojový diagram je uveden v následující části.
5.2.2 Vývojový diagram programu „Tlačítka 1“
5.2.3 Zdrojový kód programu „Tlačítka 1“ ; ***********************************************
53
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 ;* ;*
* Ovladani tlacitek
*
;* ;*
* modul MB-ATmega128
;*
*
8 LED, 8 tlacitek
;* ;*
* *
Stredni skola teleinformatiky Ostrava
;*
* *
; ***********************************************
; ***** Vlozeni preddefinovanych dat procesoru .NOLIST .include "m128def.inc" .LIST
; ***** Prirazeni registru promennym .DEF Tmp
= r16
.DEF Tlc
= r17
; ***** Segment programoveho kodu .CSEG
; ***** Vektory preruseni .ORG 0x0000 jmp
Reset
; ***** Vlastni program .ORG 0x0046
; ***** Nastaveni procesoru po resetu Reset: ldi
Tmp, low(RAMEND) 54
; SP na konec RAM
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 out
SPL, Tmp
ldi
Tmp, high(RAMEND)
out
SPH, Tmp
ldi
Tmp, 0x00
out
DDRD, Tmp
ldi
Tmp, 0xFF
out
DDRB, Tmp
rjmp
main
; Port D vstupni
; Port B vystupni
; ***** Vstup tlacitek do promenne Tlc InBt: in
Tlc, PinD
com
Tlc
ret
; ***** Vystup Tmp na port LED OutLd: com
Tmp
out
PortB, Tmp
ret
; ***** Hlavni programova smycka main: rcall
InBt
mov
Tmp, Tlc
rcall
OutLD
rjmp
main
55
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128
5.3 Program „Tlačítka 2“ 5.3.1 Popis programu „Tlačítka 2“ Při vytváření tohoto programu budeme vycházet z předchozího programu „Tlačítka 1“, který si trochu upravíme. Od tohoto programu požadujeme, aby při prvním stisknutí tlačítka se příslušná LED dioda rozsvítila a při opětovné stlačení tlačítka LED dioda zhasla. Toto je typický příklad tlačítkového vypínače. Místo LED diod si můžeme představit libovolný spotřebič nebo relé, které bude třeba ovládat motor. Úvodní nastavení je stejné jako v předchozím případě, proto jej nebudeme dále rozepisovat. Použité podprogramy jsou rovněž z předchozích příkladů. Použijeme vstup tlačítek, výstup na LED a zpoždění. Protože mikrokontrolér je příliš rychlý, zaznamená zákmity tlačítek jako další stlačení. Může se tedy stát, že mikrokontrolér zdánlivě nereaguje, protože jedním impulzem diodu rozsvítíme a zákmit druhým impulzem ji zhasne. Po časovém zpoždění musíme kontrolovat, jestli je stav tlačítek stejný nebo se ještě mění. Pak při stlačení tlačítka provedeme změnu stavu LED diody. To provedeme pouze jednou, aby nám při držení tlačítka dioda neblikala.
56
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 5.3.2 Vývojový diagram programu „Tlačítka 2“
5.3.3 Zdrojový kód programu „Tlačítka 2“ ; ***************************************************** ;*
*
;*
Ovladani tlacitek zapnuto/vypnuto
*
;*
Vyuziva porty B a D
*
;*
Zpracovano pro ATmega128
;* ;*
* *
Stredni skola teleinformatiky Ostrava
;*
* *
; *****************************************************
57
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 ; ****** Vlozeni preddefinovanych dat procesoru ****** ; Adresy portu, registru a pod
.NOLIST .include "m128def.inc" .LIST
; ****** Prirazeni registru promennym .DEF Tmp
= r16
.DEF Posl
= r17
.DEF Tlc
= r18
; ****** Segment programoveho kodu .CSEG ; ****** Vektory preruseni .ORG 0x0000 jmp
Reset
; ****** Vlastni program .ORG 0x0046
; Nastaveni procesoru po resetu Reset: ldi
Tmp, low(RAMEND) ; nastaveni SP na konec pameti RAM
out
SPL, Tmp
ldi
Tmp, high(RAMEND)
out
SPH, Tmp
ldi
Tmp, 0x00
out
DDRD, Tmp
ldi
Tmp, 0xFF
out
DDRB, Tmp
out
PortB, Tmp
; vystup portu B do "1" – LED nesviti
ldi
Posl, 0x00
; vychozi stav tlacitek – zadne nebylo stlaceno
; port D jako vstupni
; port B jako vystupni
58
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128
rjmp
main
; Casove zpozdeni procesoru - zakmity tlacitek Dly: push
Tmp
push
Posl
ldi
Posl, 0xFF
Dly2: ldi
Tmp, 0xFF
Dly1: dec
Tmp
brne
Dly1
dec
Posl
brne
Dly2
pop
Posl
pop
Tmp
; odlozeni registru do stacku
; maximalni mozna hodnota pro zpozdeni
; dekrementuje, dokud neni nula
; obnoveni registru ze stacku
ret
; Vstup tlacitek do promenne Tmp InBt: in
Tmp, PinD
; nacteni portu tlacitek
com
Tmp
; negace – tlačítka proti zemi
rcall
Dly
; zpozdeni – odstraneni zakmitu
ret
; Vystup Tmp na port LED OutLd: com
Tmp
; LED zapojene proti napajeni – proto negovat
out
PortB, Tmp
; vystup na port LED
ret
; Hlavni program / smycka main: rcall
InBt
; nacteni tlacitek 59
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 cp
Tlc, Tmp
; porovnani s predchozim stavem
breq
main
; pokud se stav nezmenil jdi na zacatek
mov
Tlc,Tmp
; souc. stav tlacitek uloz do pameti
eor
Posl, Tlc
; zmen bit stlaceneho tlacitka
mov
Tmp, Posl
; posledni stav LED na vystup
rcall
OutLD
; vystup na LED
rjmp
main
; uzavreni smycky programu
60
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128
5.4 Příklady užitečných podprogramů 5.4.1 Převod HEX na BCD Při návrhu převodníku si musíme uvědomit, že mikrokontroléru je vlastní hexadecimální soustava. Desítková soustava je pro něho cizí. Proto musíme použít způsob, jako bychom my převáděli z desítkové soustavy do soustavy jiné, to je postupné dělení. Mikrokontrolér Atmega128 ale neumí dělit. Proto musíme dělení nahradit postupným odečítáním a počítat, kolikrát jsme dané číslo odečetli. Budeme převádět
jeden celý bajt, proto musíme počítat s výsledkem řádově stovky. Výsledek pak bude ve třech proměnných. Po ukončení převodu budou výsledky v proměnných Stovky a Desítky, jednotky zůstanou v původní proměnné. Nezapomenout nadefinovat příslušné proměnné. Pro označení desítek nelze použít označení Des, protože se jedná o rezervované slovo. Proto jsme použili označení Dst. Dále je uveden podprogram, není zde žádné nastavení atd. Hodnotu do převodníku zadáváme v proměnné Tmp.
61
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 ; ***** Prevod HEX cisla na BCD HnaBCD:
HnaB2:
HnaB1:
HnaB3:
clr
Sto
; nuluj pamet stovek
clr
Dst
; nuluj pamet desitek
cpi
Tmp, 100
; porovnej zda je vetsi nez 100
brlo
HnaB1
subi
Tmp, 100
; odecti 100
inc
Sto
; inkrementuj stovky
rjmp
HnaB2
; vrat se na stovky
cpi
Tmp, 10
; porovnej zda je vetsi nez 10
brlo
HnaB3
subi
Tmp, 10
; odecti 10
inc
Dst
; inkrementuj desitky
rjmp
HnaB1
ret
5.4.2 Dekodér pro sedmisegmentový displej
Na předcházejícím obrázku je znázorněno, jak jednotlivé segmenty svítí. Není zde naznačena tečka, která má označení h, protože v našem programu ji využívat nebudeme. Pro případné zájemce uvádíme, že tečku lze rozsvítit jednoduchou logickou funkcí AND. Jednotlivé segmenty jsou připojeny na port B dle následující tabulky. Připojení sedmisegmentového displeje Bit
7 h
6 g
5 f
4 e
3 d
2 c
1 b
0 a
Port B
Segment h bude mít u všech číslic hodnotu „0“. Ostatní pozice budou mít hodnotu „1“ v případě, že příslušný segment má svítit. V opačném případě budou mít hodnotu
62
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 „0“. Binární číslo pro jednodušší zápis budeme převádět do hexadecimálního kódu. V převodní tabulce nezapomeňte před příkazem „.DB“ tečku. ; ***** Tabulka dekodovani pro 7seg displej Tab7s:
.DB 0x3F, 0x06
; 0, 1
.DB 0x5B, 0x4F
; 2, 3
.DB 0x66, 0x6D
; 4, 5
.DB 0x7D, 0x07
; 6, 7
.DB 0x7F, 0x6F
; 8, 9
.DB 0x77, 0x7C
; A, b
.DB 0x39, 0x5E
; C, d
.DB 0x79, 0x71
; E, F
Vlastní program, který bude číst data z uvedené tabulky si připravíme podle následujícího vývojového diagramu.
Při zadávání adresy tabulky zadáváme samostatně horní bajt a dolní bajt. Nesmíme zapomenout tyto hodnoty vynásobit dvěma. Je to z důvodu organizace programové Flash paměti.
; ***** Nacteni znaku z tabulky Prev7s:
ldi
ZL, low(Tab7s*2)
ldi
ZH, high(Tab7s*2)
andi
Tmp, 0x0F
; adresa tabulky znaku 7segm displeje
; omezeni dat na 16
63
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 add
ZL, Tmp
; pricist cislo znaku
adc
ZH, NulReg
; v NulReg je ulozena nula
lpm
Tmp, Z
; nacti hodnotu z tabulky
ret
5.4.3 Generátor sekundových impulzů Generátor bude využívat přerušení časovače. Musíme zvolit, který časovač budeme používat, zjistit, které registry musíme nastavit a na jakou hodnotu. Pro nastavení přesného času musíme znát, jaká je frekvence použitého krystalu. V našem případě použijeme časovač 0 a frekvence oscilátoru je 14745600 Hz. Pro vytvoření sekundových impulzů můžeme použít několik způsobů. Dvoubajtový dělič, který je součástí časovače nám požadovaný dělící poměr neposkytne. Buď budeme dělit maximálním možným poměrem, tj. 65536 a pak počítat počet přerušení nebo použijeme předdělič a zkrátíme dělící poměr časovače. Zvolíme první způsob a budeme počítat počet přerušení do jedné sekundy. f osc 14745600 = = 225 Hz Dp 65536 fprer – četnost přerušení za sekundu [Hz] f prer =
fosc – frekvence použitého oscilátoru [Hz] Dp – dělící poměr časovače Programově tedy musíme napočítat 225 přerušení a pak teprve uběhne jedna sekunda. K tomu použijeme jednu proměnnou uloženou v registrech. Protože budeme používat přerušení, musíme problém rozložit do dvou částí. Je to nastavení časovače a vlastní obsluha přerušení. V hlavním programu pak nesmíme zapomenout povolit přerušení. Vývojové diagramy jednotlivých částí budou vypadat následovně.
64
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128
Timer_init: ldi
Tmp, 0x01
out
TCCR1B, Tmp
ldi
Tmp, 0x04
out
TIMSK, Tmp
ret
TIM1_OVF: in
Stat, SREG
inc
Cnt
cpi
Cnt, 225
brne
Tim0
inc
Vte
clr
Cnt
out
SREG, Stat
Tim0:
reti
65
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 Uvedený program samozřejmě není úplný. Je třeba jej doplnit o úvodní část programu, kde bude povoleno přerušení a o hlavní programovou smyčku, která bude získaná data dále zpracovávat. Tyto podprogramy mohou být i základem pro zpracování programu na zobrazování časového údaje.
66
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128
6 Programovací jazyk „C“ K programování mikrokontrolérů používáme normovaný jazyk C, tzv. ANSI-C. Použitím tohoto jazyka si zajistíme, že jednou napsaný a funkční program je přenositelný na jiné typy procesorů. Opět zdůrazňuji, že je třeba zvážit použití tohoto jazyka, neboť výsledný soubor je mnohem větší a práce mikrokontroléru pomalejší než při psaní programu v Assembleru.
6.1 Program „Čítač“ Požadavky máme stejné jako při programování v Assembleru. Nebudeme se tedy popisem dále zabývat. Stejný bude i vývojový diagram, proto se rovnou pustíme do psaní programu.
/************************************ *
*
*
Program CITAC
*
*
Port B / vystup na LED
*
* *
* ATmega128
*
* *
* Stredni skola teleinformatiky
*
*
Ostrava
*
*
*
************************************/
#include
// knihovna vstupu a vystupu procesoru
#include
// knihovna casove prodlevy
unsigned char citac;
void OutLED(unsigned char cis)
// funkce vystupu na LED
{ 67
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 PORTB = ~cis; }
int main (void) { SP = RAMEND;
// nastaveni Stack Pointeru
DDRB = 0xFF;
// nastaveni portu B jako vystupni
PORTB = 0xFF;
// zhasnuti LED
citac = 0;
// pocatecni podmínka citace
while (1)
// nekonecna smycka
{ citac++;
// inkrementace citace
OutLED(citac);
// vystup na LED
_delay_ms(200);
// casova prodleva
} } Pokud si necháme provést výpis překladu do Assembleru, zabírá 278 řádků programu. Náš program psaný přímo v Assembleru zabírá pouze 96 programových řádků
6.2 Program „Tlačítka 1“ Opět budeme vycházet ze stejných podmínek, jako byly v případě psaní programu v Assembleru. Výsledek je následující.
/**************************************** * *
* Ovladani tlacitek 1
*
* *
* ATmega128, madul tlacitka+LED
* * *
* *
Stredni skola teleinformatiky Ostrava
* *
68
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 *
*
****************************************/
#include
unsigned char tlacitko;
void OutLED(unsigned char obraz) { PORTB = ~obraz; }
unsigned char Tlac(void) { return (~PIND); }
int main(void) { DDRD = 0x00; DDRB = 0xFF; PORTB = 0xFF; while (1) { tlacitko = Tlac(); OutLED(tlacitko); } } Základ tohoto programu použijeme při psaní následujícího programu Tlačítka 2, který má opět funkci tlačítkového vypínače.
69
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128
6.3 Program „Tlačítka 2“ V tomto programu je třeba pamatovat, která LED dioda má svítit, protože musí reagovat na impulz z tlačítka. Při dalším impulzu musí zhasnout. Rovněž musíme ošetřit zákmity tlačítka.
/****************************************** *
*
*
Ovladani tlacitek 2
*
*
*
*
ATmega128, madul tlacitka+LED
*
* *
*
Stredni skola teleinformatiky
*
Ostrava
* *
*
*
******************************************/
#include #include
unsigned char tlacitko, tlc, LED;
void OutLED(unsigned char obraz) { PORTE = ~obraz; }
int Tlac(void) { int doc; do { doc = ~PINF; _delay_ms(10); 70
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128 } while (doc != ~PINF); return (doc); }
int main(void) { DDRF = 0x00; DDRE = 0xFF; PORTE = 0xFF; LED = 0x00; tlacitko = 0; tlc = 0; OutLED(LED); while (1) { tlc =(unsigned char)Tlac(); if (tlc != tlacitko) { tlacitko = tlc; LED ^= tlacitko; OutLED(LED); } } } Pokud budeme v jazyce C používat čekací smyčky _delay_ms nebo _delay_us, musíme v základním nastavení AVR studia zadat frekvenci oscilátoru. To provedeme v hlavním menu Project – Configuration Options – General – Frequency. V používaném modulu je zabudován krystal o frekvenci 14745600 Hz.
71
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128
7 Závěr Materiál byl zpracován pro potřebu výuky programování ve třetím ročníku. V současné době se jedná pouze o třídu 3.A. V příštích letech bude do této problematiky zapojeno více tříd. V této práci jsou v první části uvedeny vlastnosti mikrokontroléru, nastavení jednotlivých portů a registrů. Rovněž jsou zde krátké příklady nastavení a obsluhy probíraných komponent. V části vývojové prostředky jsou uvedeny vlastnosti a nastavení jednotlivých modulů, které používáme při tvorbě programů. Prostředí AVR Studio je rozpracováno v další části i s programem., který umožní zavedení programu do aplikace. V závěru práce jsou uvedeny jednoduché programy, které jsou zpracovány jak v jazyce Assembler, tak v jazyce C. Po kompilaci uvedených příkladů jsou zřejmé vlastnosti programů psaných v uvedených jazycích. Předložená práce je určena začátečníkům, kteří se seznamují s rozpracovaným mikrokontrolérem.
72
Střední škola teleinformatiky, Ostrava, p.o. Mikrokontroléry Atmel AVR – Atmega128
8 Použitá literatura Atmel: Technická dokumentace ATmega128 - 8-bit AVR microcontroller, dostupná na www.atmel.com. PK Design: MB-ATmega128 v2.2 Základová deska modulárního vývojového systému MVS, Uživatelský manuál PK Design: Modul 8 LED diod a 8 tlačítek v1.2 Přídavný modul modulárního vývojového systému MVS, Uživatelský manuál PK Design: Modul LED a LCD displeje s maticovou klávesnicí v2.0 Přídavný modul modulárního vývojového systému MVS, Uživatelský manuál BEN: C pro mikrokontroléry, Burkhard Mann
73