1.
Základní
charakteristika
2.
Blokové schema
AT Mega 32
3.
Zapojení
pouzdra DIP40, popis vývodů
4.
Paměťový
prostor
5.
Popis registrů
6.
Časování
zpracování instrukce
7.
Systémové
hodiny, časování
8.
Obsluha I/O
portů
9.
Přerušovací
systém
10.
Čítač/časovač 0
11.
Čítač/časovač 1
12.
Čítač/časovač 2
13.
LCD displej
14.
A/D převodník
15.
Watchdog
časovač
16.
SPI rozhraní
17.
TWI rozhraní
18.
Sériový kanál
USART
19.
Rozhraní JTAG
Rodina mikrokontrolérů AVR
(nehledejte pod touto zkratkou žádné technické termíny, je to zkratka vytvořená
z počátečních písmen jmen tvůrců Alf (Egil Bogen), Vegard
(Wollan) RISC procesor) je zdařilým výsledkem architektury mikrokontrolérů
s architekturou RISC (Redused Instruction Set Computing) – procesorů
s redukovanou instrukční sadou. Základní rysy jsou tyto:
·
Architektura
typu Harvard a RISC.
·
32 identických
8-bitových registrů pro všeobecné použití (Register File), které jsou všechny
použitelné jako akumulátor.
·
Programové a
datové paměti
o
32 kB paměti
typu Flash pro program
o
1024 B datové paměti EEPROM pro ukládání dat
o
2 kB statické
paměti RAM pro registry, oblast I/O a data
·
JTAG rozhraní,
použitelné pro
o
Programování Flash, EEPROM, Fuses a Lock
Bits
o
Ladění
(debugging) programu
o
Boundary Scan –
technika dovolujíci sledování a nastavení úrovní na I/O bez přídavných
periferií pouze za podpory vývojového prostředí
·
Periferie:
o
Dva 8-bitové
čítače/časovače
o
Jeden 16-bitový
čítač/časovač
o
Hodiny reálného
času se samostatným oscilátorem
o
Čtyři PWM
výstupní kanály
o
8-kanálový,
10-bitový A/D převodník
o
TWI (2-vodičová
seriová sběrnice)
o
SPI sběrnice
(Serial Peripheral Interface)
o
Sériová
komunikace typu USART
o
Programovatelný
Watchdog časovač se samostatným oscilátorem na čipu
o
Analogový
komparátor
o 32 programovatelných I/O linek
Obr. 1 Blokové schema ATmega32
Obr.2 Zapojení pouzdra ATmega32
Popis vývodů:
VCC napájecí napětí
GND zem
Port A (PA7 ..PA0) 8 bitový obousměrný I/O port, alternativní použití pro vstupy A/D převodníku
Port B (PB7 ..PB0) 8 bitový obousměrný I/O port, alternativní použití vývodů bude popsáno v dalším textu
Port C (PC7 ..PC0) 8 bitový obousměrný I/O port, alternativní použití vývodů bude popsáno v dalším textu
Port D (PD7 ..PD0) 8 bitový obousměrný I/O port, alternativní použití vývodů bude popsáno v dalším textu
RESET vstup reset kontroléru, aktivní na „0“
XTAL1 připojení krystalu
XTAL2 připojení krystalu
AVCC napájecí napětí pro A/D převodník
AREF referenční napětí pro A/D převodník
Všechny 8 bitové I/O porty (PA až PD) jsou
obousměrné, umožňují připojit vnitřní zvyšující (Pull Up) rezistory. Maximální
výstupní proud jednotlivých pinů je 40mA, což umožňuje přímé připojení LED,
celkový odebíraný proud z I/O portů nesmí překročit 400mA, podrobnější
informace jsou uvedeny v katalogovém listu. Většina pinů portů má
alternativní použití pro speciální periferie. Pokud se tyto piny použijí,
nemohou se dále použít jako obecné I/O. Význam alternativního použití je popsán stručně v tabulce Tab.1.
Vývod |
Význam |
RESET |
nulovací
vstup |
AIN0 |
vstup
analogového komparátoru (+) |
AIN1 |
vstup
analogového komparátoru (-) |
SS |
Slave
Select kanálu SPI |
MOSI |
Master
Out/Slave In kanálu SPI |
MISO |
Master
In/Slave Out kanálu SPI |
SCK |
hodinový
signál kanálu SPI |
RxD |
vstup
USART |
TxD |
výstup
USART |
XCK |
hodiny
pro synchronní režim USART |
INT0 |
vstup
vnějšího přerušení 0 |
INT1 |
vstup
vnějšího přerušení 1 |
INT2 |
vstup
vnějšího přerušení 2 |
T0 |
hodinový
vstup čítače/časovače 0 |
T1 |
hodinový
vstup čítače/časovače 1 |
OC0 |
Output
Compare čítače/časovače 0 |
OC1A |
Output
Compare čítače/časovače 1 (kanál A) |
OC1B |
Output
Compare čítače/časovače 1 (kanál B) |
OC2 |
Output
Compare čítače/časovače 2 |
ICP |
Input
Capture čítače/časovače 1 |
TDI |
vstupní
data JTAG rozhraní |
TDO |
výstupní
data JTAG rozhraní |
TMS |
výběr
režimu JTAG rozhraní |
TCK |
hodinový
signál JTAG rozhraní |
SDA |
datový
signál TWI (I2C) rozhraní |
SCL |
hodinový signál TWI (I2C) rozhraní |
ADC0
až ADC7 |
kanály A/D převodníku |
Tab.1 Alternativní použití vývodů I/O portů ATmega32
Mikrokontroléry řady AVR používají harvardskou
strukturu, kde je oddělen paměťový prostor pro program a pro data.
Mikrokontrolér ATmega32 nemá podporu pro
vytvoření vnějšího paměťového prostoru. Používá tedy pouze vnitřní paměti,
které jsou typu Flash, RAM a EEPROM.
Vnitřní
programová paměť Flash
ATmega32 obsahuje 32kB v systému
reprogramovatelnou Flash paměť pro uložení programu. Jelikož instrukce AVR
procesorů jsou 16 nebo 32bitové, je organizace paměti 16kB x 16bitů. Tato paměť
je minimálně 10000x reprogramovatelná.
Program Counter (PC, programový čítač) ATmega32 je
14bitový, může adresovat 16k programové paměti.
Obr.3 Mapa vnitřních
pamětí ATmega32
Vnitřní datová
paměť SRAM
Tato paměť je tvořena statickými buňkami (Static RAM). Obsahuje pole 32 obecně použitelných registrů R0 až R31, pole 64 vstupně/výstupních registrů pro řízení periferií a blok volně použitelné paměti.
Vnitřní datová
paměť EEPROM
EEPROM (Electrically Eraseable Programable ROM) je
paměť, která si uchová svůj obsah i po vypnutí napájení mikrokontroléru (až
několik desítek let), používá se tedy pro uchování určitých dat, např.
nastavení předvolených stanic autorádia, konfiguračních parametrů různých
přístrojů apod. Zápis do této paměti je časově podstatně delší než zápis do
SRAM (asi 8,5 ms/1byte), pro přístup k této paměti se používají speciální
registry mikrokontroléru. Počet přeprogramování je min. 100000 x.
Mikrokontrolér ATmega32 je vybaven celou řadou registrů. Nyní uvedeme stručný popis základních registrů.
Registrové pole (Registr File)
Je
tvořeno z 32 všeobecně použitelných 8bitových registrů. S těmito registry
pracují přímo instrukce programu, jsou v nich uloženy operandy vstupující
do ALU (viz blokové schema architektury
AVR) a ukládá se do nich i výsledek operace. Ke každému registru je možné
přistupovat jeho jménem (R0 až R31) nebo jeho adresou ($0000 až $001F).
Ukazatele (pointery)
Ukazatele
se používají k nepřímému adresování paměti. Mikrokontroléry řady AVR mají
3 ukazatele: X,Y a Z. Ukazatele jsou 16bitové a jsou tvořeny dvojicemi
registrů, počínaje registrem R26, viz Obr.4.
Obr.4 Obecné registry Atmega32 a jejich adresy
Při
nepřímém adresování je do ukazatele vložena 16bitová adresa paměťové buňky, se kterou chceme pracovat.
Při blokovém zpracování dat (přesun bloku dat, prohledávání bloku dat, …) se do
ukazatele vloží počáteční adresa bloku, po provedení patřičné instrukce se
pouze inkrementuje (zvýší o 1) nebo dekrementuje (sníží o 1) obsah ukazatele a
tím pracujeme s následující buňkou paměti. Tuto inkrementaci či
dekrementaci obsahují některé speciální instrukce a provádějí ji automaticky
před (predekrement) přístupem do paměti
nebo po (postinkrement) přístupu do
paměti v rámci zpracování přesunu a není tedy potřebná další instrukce pro
modifikaci obsahu ukazatele, čímž se značně urychlí běh programu.
Vstupně/výstupní registry (I/O Memory)
Tyto
registry jsou uloženy v datové paměti mikrokontroléru od adresy $0020 až
$005F (64 buněk). Slouží k řízení zabudovaných periferií a jádra mikrokontroléru (čítačů/časovačů, přerušovacího systému,
komunikačních rozhraní SPI, TWI, USART, EEPROM, A/D převodníku, obsahují též
stavový registr a registr SP...). Přehled registrů je umístěn
v následující tabulce Tab.2.
Adresa |
Registr |
Popis funkce |
$00 ($20) |
TWBR |
Registr přenosové rychlosti TWI rozhraní |
$01 ($21) |
TWSR |
Stavový registr TWI rozhraní |
$02 ($22) |
TWAR |
Adresový registr TWI rozhraní |
$03 ($23) |
TWDR |
Datový registr TWI rozhraní |
$04 ($24) |
ADCL |
Datový registr A/D převodníku (dolní bajt) |
$05 ($25) |
ADCH |
Datový registr A/D převodníku (horní bajt) |
$06 ($26) |
ADCSRA |
Řídící a stavový registr A/D převodníku |
$07 ($27) |
ADMUX |
Řídící registr multiplexeru A/D převodníku |
$08 ($28) |
ACSR |
Řídící a stavový registr analogového komparátoru |
$09 ($29) |
UBRRL |
Registr přenosové rychlosti USART (dolní bajt) |
$0A ($2A) |
UCSRB |
Řídící/stavový registr B USART |
$0B ($2B) |
UCSRA |
Řídící/stavový registr A USART |
$0C ($2C) |
UDR |
Datový registr USART |
$0D ($2D) |
SPCR |
Řídící registr SPI |
$0E ($2E) |
SPSR |
Stavový registr SPI |
$0F ($2F) |
SPDR |
Datový registr SPI |
$10 ($30) |
PIND |
Vstupní vývody portu D |
$11 ($31) |
DDRD |
Směrový registr portu D |
$12 ($32) |
PORTD |
Datový registr portu D |
$13 ($33) |
PINC |
Vstupní vývody portu C |
$14 ($34) |
DDRC |
Směrový registr portu C |
$15 ($35) |
PORTC |
Datový registr portu C |
$16 ($36) |
PINB |
Vstupní vývody portu B |
$17 ($37) |
DDRB |
Směrový registr portu B |
$18 ($38) |
PORTB |
Datový registr portu B |
$19 ($39) |
PINA |
Vstupní vývody portu A |
$1A ($3A) |
DDRA |
Směrový registr portu A |
$1B ($3B) |
PORTA |
Datový registr portu A |
$1C ($3C) |
EECR |
Řídící registr EEPROM |
$1D ($3D) |
EEDR |
Datový registr EEPROM |
$1E ($3E) |
EEARL |
Adresový registr EEPROM (dolní bajt) |
$1F ($3F) |
EEARH |
Adresový registr EEPROM (horní bajt) |
$20 ($40) |
UCSRC |
Řídící/stavový registr C USART |
$20 ($40) |
UBRRH |
Registr přenosové rychlosti USART (horní bajt) |
$21 ($41) |
WDTCR |
Řídící registr WDT |
$22 ($42) |
ASSR |
Stavový registr asynchronního režimu čítače/časovače 2 |
$23 ($43) |
OCR2 |
Kompareční registr čítače/časovače 2 |
$24 ($44) |
TCNT2 |
Registr čítače/časovače 2 |
$25 ($45) |
TCCR2 |
Řídící registr čítače/časovače 2 |
$26 ($46) |
ICL1L |
Záchytný registr čítače/časovače 1 (dolní bajt) |
$27 ($47) |
ICL1H |
Záchytný registr čítače/časovače 1 (horní bajt) |
$28 ($48) |
OCR1BL |
Komparační registr B čítače/časovače 1 (dolní bajt) |
$29 ($49) |
OCR1BH |
Komparační registr B čítače/časovače 1 (horní bajt) |
$2A ($4A) |
OCR1AL |
Komparační registr A čítače/časovače 1 (dolní bajt) |
$2B($4B) |
OCR1AH |
Komparační registr A čítače/časovače 1 (horní bajt) |
$2C($4C) |
TCNT1L |
Registr čítače/časovače 1 (dolní bajt) |
$2D ($4D) |
TCNT1H |
Registr čítače/časovače 1 (horní bajt) |
$2E ($4E) |
TCCR1B |
Řídící registr B čítače/časovače 1 |
$2F ($4F) |
TCCR1A |
Řídící registr A čítače/časovače 1 |
$30 ($50) |
SFIOR |
Registr speciálních funkcí I/O |
$31 ($51) |
OSCCAL |
Kalibrační registr vnitřního RC oscilátoru |
$31 ($51) |
OCDR |
Registr pro podporu ladění na čipu |
$32 ($52) |
TCNT0 |
Registr čítače/časovače 0 |
$33 ($53) |
TCCR0 |
Řídící registr čítače/časovače 0 |
$34 ($53) |
MCUCSR |
Řídící/stavový registr mikrokontroléru |
$35 ($55) |
MCUCR |
Řídící registr mikrokontroléru |
$36 ($56) |
TWCR |
Řídící registr TWI |
$37 ($57) |
SPMCR |
Řídící registr pro zápis do programové paměti |
$38($58) |
TIFR |
Registr příznaků přerušení od čítačů/časovačů |
$39 ($59) |
TIMS |
Masky přerušení od čítačů/časovačů |
$3A ($5A) |
GIFR |
Stavový registr přerušovacího systému |
$3B ($5B) |
GICR |
Hlavní řídící registr přerušení |
$3C ($5C) |
OCR0 |
Komparační registr čítače/časovače 0 |
$3D ($5D) |
SPL |
Ukazatel zásobníku (nižší bajt) |
$3E ($5E) |
SPH |
Ukazatel zásobníku (vyšší bajt) |
$3F($5F) |
SREG |
Stavový registr |
Tab.2 I/O registry ATmega32
Nyní
popíšeme podrobně význam a obsah dvou obecně používaných registrů mikrokontrolérů:
Stavový
registr SREG (State Register):
Tento registr obsahuje příznaky, které definují stav mikrokontroléru po vykonání programové instrukce. Obsah stavového registru je definován následovně:
Bit |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
||
I |
T |
H |
S |
V |
N |
Z |
C |
SREG |
||
Čtení/zápis |
W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
||
Výchozí hodnota |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
Význam jednotlivých bitů:
· C – (Carry Flag) příznak přetečení – indikuje přetečení po aritmetické operaci, tzn. výsledek je větší než č. 255 (největší číslo v 8bitovém registru).
· Z – (Zero Flag) příznak nulového výsledku – indikuje nulový výsledek po aritmetické nebo logické operaci.
· N – (Negative Flag) příznak negativního výsledku – indikuje záporný (negativní) výsledek po aritmetické nebo logické operaci.
· V – (Two’s Complement Overflow Flag) příznak přeplnění čísla v druhém doplňku – podporuje aritmetiku dvojkového doplňku.
· S – (Sign) znaménkový bit – indikuje znaménko čísla v dvojkovém doplňku.
· H – (Half Carry Flag) – indikuje poloviční přenos (mezi dolní a horní polovinou bajtu) výsledku, používají jej instrukce pracující s BCD kódem.
· T – (Bit Copy Storage) – kopírovací bit, používají jej instrukce BLD (Bit LoaD) a BST (Bit STorage) jako zdrojový nebo cílový bit. Bit z registru registrového pole může být kopírován do bitu T instrukcí BST a opět uložen z T do bitu registru z registrového pole instrukcí BLD.
· I – (Global Interrupt Enable) – globální povolení přerušení. Je-li I=0, je příjem přerušení zakázán, což se provede po vstupu do obsluhy přerušení. Po vykonání obsluhy přerušení se instrukcí RETI opět uvede bit I do stavu I=1.
Ukazatel
vrcholu zásobníku SP (Stack Pointer):
Zásobníková
paměť je používána zejména pro dočasné uložení dat, pro uložení lokálních
proměnných a pro uložení návratové adresy po volání podprogramů nebo
podprogramů pro obsluhu přerušení. Tento registr (tvořený dvěma registry SPL a
SPH) ukazuje na vrchol zásobníkové paměti, tj. na posledně uložený bajt. Při
vložení dalšího údaje se obsah SP (adresa) snižuje, při výběru údaje se obsah
SP zvyšuje (jde o paměť typu LIFO – Last In First Out). Prostor pro
zásobníkovou paměť v datové oblasti SRAM musí být v programu definován před prvním voláním
podprogramu nebo před povolením obsluhy přerušení, jelikož výchozí hodnota je
$00. Registr SP musí být nastaven nad adresu $60, kde začíná oblast volně
použitelné RAM. Obvyklá hodnota je RAMEND=$085F.
Obsah ukazatele vrcholu zásobníku je definován následovně:
15 |
14 |
13 |
12 |
11 |
10 |
9 |
8 |
|||
SP15 |
SP14 |
SP13 |
SP12 |
SP11 |
SP10 |
SP9 |
SP8 |
SPH |
||
SP7 |
SP6 |
SP5 |
SP4 |
SP3 |
SP2 |
SP1 |
SP0 |
SPL |
||
Bit |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
||
Čtení/zápis |
W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
||
Čtení/zápis |
W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
||
Výchozí hodnota |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
||
Výchozí hodnota |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
Ostatní
registry popíšeme při popisu obsluhy jednotlivých zabudovaných periferií mikrokontroléru.
AVR architektura využívá registry registrového pole
pro uložení obou operandů aritmetickologických instrukcí. Tyto operandy jsou
načteny, instrukce vykonána a výsledek uložen zpět do registru během jediného
strojového cyklu, který je shodný s periodou systémových hodin. Nedochází
tedy k dělení instrukčního cyklu na více period hodin (např. I8051
potřebovala k vykonání instrukce od 12 do 48 period hodin, dle typu
instrukce), vše je vykonáno během jedné periody, což přináší vysokou výpočetní
rychlost, která je až 1MIPS (Milion Instruction Per
Second) na 1 MHz hodinového kmitočtu.
Mikrokontroléry AVR využívají tzv. předvýběru instrukce (prefetch) a zřetězené provádění instrukcí (pipelining). Během zpracování instrukce je zároveň prováděn
předvýběr následující instrukce, viz následující časový diagram na Obr. 5.
Obr.5 Časový diagram zpracování instrukcí
Časování jednocyklové instrukce je znázorněno v časovém diagramu na Obr. 6.
Obr.6 Časový diagram zpracování jednocyklové
instrukce
Na schematu na Obr. 7 je znázorněna distribuce hodinového signálu v mikrokontroléru.
Obr.7 Distribuce hodinového signálu
v mikrokontroléru
Druhy hodinového signálu jsou:
· clkCPU – hodiny jádra mikrokontroléru, řídí časování AVR jádra
· clkI/O - hodiny vstupně/výstupních jednotek, řídí čítač/časovač, SPI, USART, vnější přerušení
· clkFLASH – hodiny pro řízení Flash
· clkASY – hodiny asynchronního čítače/časovače, tvoří jej signál 32,768 kHz pro hodiny reálného času, které jsou v činnosti i v režimu spánku mikrokontroléru
· clkADC – hodiny pro A/D převodník
Zdroje taktovacího kmitočtu
jsou :
·
krystalový
oscilátor
·
NF krystalový
oscilátor
·
externí RC
oscilátor
·
kalibrovaný
vnitřní RC oscilátor
·
externí
hodinový signál
Výběr zdroje taktovacího kmitočtu se provádí pomocí programovatelných propojek CKSEL0 až CKSEL3 (jsou uloženy ve FLASH) podle následující tabulky Tab.3.
Tab.3 Výběr zdroje taktovacího signálu
Krystalový oscilátor:
Je vytvořen připojením
krystalu nebo keramického rezonátoru na vývody XTAL1 a XTAL2 mikrokontroléru
dle schématu na Obr. 8.
Obr.8 Schema připojení krystalového rezonátoru
Pomocí programových
propojek (fuse bits, bude vysvětleno později) lze volit 2 režimy oscilátoru:
·
plný rozkmit
signálu – výhodné pro silně rušivé okolí a široký rozsah kmitočtů
·
malý rozkmit
signálu – snížení odběru, malé rušení, malý kmitočtový rozsah
NF krystalový oscilátor
Pro řízení se používá tzv.
„hodinkový krystal“ s kmitočtem 32768 Hz.
Vnější RC oscilátor
Použijeme jej tam, kde
nezáleží na přesném časování.Zapojení je na schematu na Obr.9.
Obr.9 Schema zapojení vnějšího RC oscilátoru
Kmitočet oscilátoru je určen přibližně vztahem: f = 1/(3RC)
Kalibrovaný vnitřní RC oscilátor
Poskytuje hodinové kmitočty 1, 2, 4 a 8 MHz. Kalibrace je provedena pro Ucc = 5V a teplotu 25 oC při relativní odchylce kmitočtu 1%. Použitím tohoto zdroje kmitočtu nepotřebujeme žádné externí součástky. Tento oscilátor je používán též pro časování přístupu k EEPROM a FLASH.
Vnější hodiny
Zdroj hodinového signálu je
v tomto případě připojen k vývodu XTAL1 mikrokontroléru.
Pozn.: Nastavení
jednotlivých režimů zdroje hodin je podrobně popsáno v datasheetu ATmega32
a bude dle potřeby výuky vysvětleno.
ATmega32 obsahuje 4 vstupně
výstupní 8bitové porty. Všechny mají stejné vlastnosti, liší se pouze
alternativním použití vývodů pro různé zabudované periferie mikrokontroléru.
Pokud jsou porty využívány jako obecné číslicové vstupy/výstupy, lze měnit
orientaci jednotlivých bitů portů (vstup či výstup), u výstupních bitů portu
lze měnit stav a u vstupně orientovaných bitů lze nastavit připojení vnitřního
pull-up rezistoru. Budiče výstupních bitů umožňují přímé připojení LED. Na
Obr.10 je principiální schema zapojení jednoho bitu portu, na Obr.11 jeho
detailní zapojení.
Obr.10 Principiální schema zapojení jednoho bitu I/O
portu
V označení Pxn představuje x název portu (A,B,C nebo D) a n číslo bitu portu (0 až 7). Cv představuje vstupní kapacitu vstupu/výstupu, diody jsou ochranné, chrání vstupní obvody při vstupním signálu větším než +Ucc nebo při jeho záporné hodnotě. Rpu je volitelný pull-up rezistor.
Obr.11 Detailní zapojení
jednoho bitu I/O portu
Každý port je ovládán třemi registry: datovým registrem PORTX, směrovým registrem DDRX a registrem PINX, který obsahuje informaci o přečtené hodnotě z portu X. X v názvu registrů označuje, zda jde o port A, B, C nebo D.
Nastavení
portu se provádí zapsáním hodnot do registrů PORTX a DDRX. Nastavením určujeme,
zda bude příslušný pin portu vstupní nebo výstupní, bude-li jeho hodnota „0“ nebo „1“ (v případě
nastavení portu jako výstupní) a zda bude aktivován Pull-Up rezistor (v případě
nastavení portu jako vstupní).
Registr DDRX
Bit
DDRXn určuje směr vývodu PXn:
·
pro DDRXn
= 0 jde o vstup
·
pro DDRXn
= 1 jde o výstup
Bit |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
||
DDA7 |
DDA6 |
DDA5 |
DDA4 |
DDA3 |
DDA2 |
DDA1 |
DDA0 |
DDRA |
||
Čtení/zápis |
W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
||
Výchozí hodnota |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
Registr PORTX
Bit
PORTXn ovládá logickou úroveň vývodu
PXn, který je nastaven jako výstup
(DDRXn = 1)
·
pro
PORTXn = 0 je výstup „0“
·
pro
PORTXn = 1 je výstup „1“
Je-li
DDRXn = 0 (vývod PXn je orientován
jako vstup), určuje bit PORTXn, zda je připojen vnitřní Pull-Up rezistor:
·
pro
PORTXn = 0 je Pull-Up na vývodu PXn
odpojen
·
pro
PORTXn = 1 je Pull-Up na vývodu PXn
připojen
Bit |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
||
PORTA7 |
PORTA6 |
PORTA5 |
PORTA4 |
PORTA3 |
PORTA2 |
PORTA1 |
PORTA0 |
PORTA |
||
Čtení/zápis |
W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
||
Výchozí hodnota |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
Možné nastavení bitů portů je v tabulce Tab.4.
Tab.4 Nastavení orientace portů
Pozn.: Zápisem „1“ do bitu PUD v registru SFIOR lze
globálně zakázat Pull-Up rezistory na všech portech.
Registr PINX
Tento
registr umožňuje čtení fyzického stavu vývodů portů nezávisle na nastavení
jejich konfigurace. Tento registr je určen pouze pro čtení.
Bit |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
||
PINA7 |
PINA6 |
PINA5 |
PINA4 |
PINA3 |
PINA2 |
PINA1 |
PINA0 |
PINA |
||
Čtení/zápis |
R |
R |
R |
R |
R |
R |
R |
R |
||
Výchozí hodnota |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
Co jsou to přerušení? Jednoduše řečeno přerušení přeruší běh
zpracovávaného programu a přesměruje jej na tzv. „ rutinu pro obsluhu přerušení
“, po jejíž vykonání se vrátí zpět za místo, odkud byl původní běh programu
přerušen a pokračuje dál ve zpracování.
V době vykonávání rutiny přerušení může však přijít požadavek přerušení
programu od jiného zdroje přerušení. Pokud má nově příchozí požadavek vyšší
prioritu, přeruší se zpracování požadavku přerušení s nižší prioritou a začne
se zpracovávat nový požadavek. Po zpracování nového požadavku se dokončí
požadavek s nižší prioritou a poté mikrokontrolér pokračuje ve vykonávání
původního programu.
Mikrokontroléry AVR disponují 21 zdroji přerušení, každý z nich má svůj
vektor přerušení, t.j. svoji adresu umístění
v paměti programu. Po příchodu požadavku přerušení program skočí na tuto
adresu. Zde musí být uložena rutina (program)
pro obsluhu daného přerušení. Přerušení může být vyvoláno vnějšími
hardwareovými signály (INT0, INT1, INT2) na vývodech mikrokontroléru (PD2, PD3,
PB2), dále jednotlivými periferiemi mikrokontroléru, např. čítači/časovači,
sériovým kanálem, atd. Přerušení mají pevně určenou prioritu. Nejvyšší prioritu
má signál RESET.
V tabulce Tab.5 je uveden přehled zdrojů přerušení s adresami umístění rutin pro obsluhu přerušení.
Tab. 5 Vektory přerušení Atmega32 a jejich adresy v programové paměti
Všechna přerušení, která budeme používat,
musí být aktivována nastavením příslušných bitů
ve vstupně/výstupních registrech a bitem I globálního
povolení přerušení v registru SREG.
Bit |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
||
I |
T |
H |
S |
V |
N |
Z |
C |
SREG |
||
Čtení/zápis |
W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
||
Výchozí hodnota |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
Registr SREG obsahuje stavové bity běžné u všech procesorů. Bit I (bit7) musí být
nastaven na „1“, pro globální povolení přerušení.
Pokud je přerušení
aktivováno, je bit I automaticky nulován, čímž je zakázán příjem dalších
přerušení. Řízení programu přechází do rutiny obsluhy přerušení. Uživatel může
bit I v
obslužné rutině nastavit, pak je možné
přijmout další přerušení. Po návratu z obsluhy přerušení je bit I automaticky
nastaven, čímž je opět povolen příjem přerušení.
Nejvyšší prioritu má zdroj
RESET. Signál RESET mohou vyvolat následující zdroje:
·
Reset
po připojení napájení
(Power-on Reset) nastane, pokud napájecí napětí překročí úroveň UPOT
(přibližně 1,4 V)
·
Vnější
reset – je aktivován
vnějším signálem RESET, na který je přivedena log. „0“ alespoň po dobu 50 ns
·
Watchdog
reset – vyvolá se po
překročení doby určené obvodem Watchdog (WDT), pokud je tento obvod aktivován
·
Reset
při poklesu napájecího napětí
(Brown-Out reset) nastane, pokud napájecí napětí mikrokontroléru poklesne pod
hodnotu UBOT (typicky pod 2,7 V pro BODLEVEL = 1 nebo 4 V pro
BODLEVEL = 0)
·
JTAG
AVR Reset vyvolá jej
rozhraní JTAG
Ostatní zdroje přerušení jsou
vyvolány následujícími periferiemi mikrokontroléru: externími signály
přerušení, čítači/časovači, dokončením přenosu přes SPI rozhraní, sériovým
kanálem, A/D převodníkem, EEPROM pamětí, analogovým komparátorem, TWI (Two Wire
Interface) kanálem a jednotkou pro zápis do programové paměti.
Rutiny pro obsluhu přerušení
začínají na patřičných adresách uvedených v Tab.1, pokračují za oblastí od
adresy $0030 a za těmito rutinami pokračuje hlavní program. Pokud nejsou žádná
přerušení používána, je hlavní program umístěn od adresy $0000.
Rutiny pro obsluhu přerušení
vypadají stejně jako běžné funkce jazyka C, pouze je potřeba sdělit překladači,
že jde o interuptovou funkci a který vektor
přerušení (adresu umístění
v programové paměti) používá. Překladač potom zajistí správný postup
spuštění interuptové funkce a návrat zpět do hlavního programu. Navíc uloží
obsah registrů, které tato interuptová funkce používá, aby nedošlo
k poškození jejich obsahu.
V následujícím textu bude popsán způsob nastavení a práce s externím přerušením, ostatní typy přerušení budou popsány v kapitolách, které se zabývají jednotlivými speciálními periferiemi.
Atmega32 disponuje třemi HW
vstupy pro externí přerušení, označených INT0, INT1, INT2. Tyto vstupy jsou
vyvedeny na následující piny portů B a D:
Mikrokontrolér může na
těchto vstupech reagovat čtyřmi způsoby:
Zdroj externího přerušení
zvolíme zápisem log.1 na příslušná místa
v I/O registru GICR, bity INT0, INT1a INT2.
Bit |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
||
INT1 |
INT0 |
INT2 |
|
|
|
IVSEL |
IVCE |
GICR |
||
Čtení/zápis |
R/W |
R/W |
R/W |
R |
R |
R |
R/W |
R/W |
||
Výchozí hodnota |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
Reakci na změnu stavu interuptových vstupů nastavíme v I/O registru MCUCR, bity ISC00 a ISC01 nastavují INT0, bity ISC11 a ISC10 nastavují INT1.
Bit |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
||
SE |
SM2 |
SM1 |
SM0 |
ISC11 |
ISC10 |
ISC01 |
ISC00 |
MCUCR |
||
Čtení/zápis |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
||
Výchozí hodnota |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
Význam bitů je uveden v následujících tabulkách
Tab.6 a Tab.7
ISC01 |
ISC00 |
Popis |
0 |
0 |
vstup INT0 se aktivuje log.0 (úrovňově
citlivý vxtup) |
0 |
1 |
libovolná změna INT0 generuje přerušení |
1 |
0 |
vstup INT0 se aktivuje sestupnou hranou |
1 |
1 |
vstup INT0 se aktivuje náběžnou hranou |
Tab.6 Nastavení
citlivosti interruptového vstupu INT0
ISC11 |
ISC10 |
Popis |
0 |
0 |
vstup INT1 se aktivuje log.0 (úrovňově
citlivý vxtup) |
0 |
1 |
libovolná změna INT1 generuje přerušení |
1 |
0 |
vstup INT1 se aktivuje sestupnou hranou |
1 |
1 |
vstup INT1 se aktivuje náběžnou hranou |
Tab.7 Nastavení citlivosti interruptového vstupu INT1
Reakci na změnu stavu interuptového vstupu INT2 nastavíme v I/O registru MCUCSR, bit ISC2 takto: ISC2 = 1 … citlivost na náběžnou hranu impulsu, ISC2 = 0 … citlivost na sestupnou hranu impulsu.
Bit |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
||
JTD |
ISC2 |
|
JTRF |
WDRF |
BORF |
EXTRF |
PORF |
MCUCSR |
||
Čtení/zápis |
R/W |
R/W |
R |
R/W |
R/W |
R/W |
R/W |
R/W |
||
Výchozí hodnota |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
Příslušný pin portu použitý pro externí vstupy
přerušení nastavíme jako vstupní a podle druhu citlivosti nastavíme jeho úroveň
takto:
·
Při reakci na
náběžnou hranu nastavíme na pinu log.0 a „interruptové tlačítko“ spojíme přes
rezistor (přibližně 10k) na +5V (log.1).
·
Při reakci na
sestupnou hranu nastavíme na pinu log.1 a „interruptové tlačítko“ spojíme na
zemní potenciál zdroje (log.0).
Citlivost vstupu INT2 nastavíme v registru
MCUCSR takto: je-li bit ISC = 0 … citlivost na sestupnou hranu, je-li ISC = 1 …
citlivost na náběžnou hranu.
Čítače a časovače umožňují
přesně časovat běh nějaké události,
počítat vnější impulsy, generovat, dělit a měřit kmitočet, generovat
signál PWM (pulsně šířková modulace) pro fázové řízení a jiné činnosti.
Atmega32 obsahuje tři
čítače/časovače, které mají částečně jiné možnosti a budou postupně v dalším
textu vysvětleny. Rozdíl mezi čítačem a časovačem je následující:
Čítač je obvod, který počítá impulsy vnějšího signálu
přivedeného na vstupní piny
mikrokontroléru. Po načítání určitého počtu impulsů se provede
uživatelem definovaná činnost, např. zastavení pohybu dopravníku po napočtení
určitého počtu výrobků.
Časovač čítá pevný kmitočet odvozený od hodinového kmitočtu
mikrokontroléru. Napočítáním určitého
počtu impulsů je provedeno určení přesného časového úseku, např. po 1s
se posune vteřinová ručka hodin.
10.1 Základní vlastnosti čítače/časovače 0
10.2 Popis čítače/časovače 0
Schema zapojení
čítače/časovače 0 je na Obr.12.
Registr TCNTn
(v případě č/č 0 bude n=0) (Timer Counter) -zde je uložen aktuální obsah čítače
Registr OCRn (n=0)
(Output Compare Register) – komparační registr –
zde je uložena hodnota, se kterou se porovnává aktuální stav čítače TCNT0 v
komparačním režimu
Registr TCCRn
(n=0) (Timer/Counter Control Register)
– řídí činnost č/č 0
Signál TOVn
(n=0) (Timer/counter Overflow) – příznak přetečení
obsahu čítače (překročení hodnoty 255), vyvolá přerušení, je-li nastaveno
Signál OCFn
(n=0) (Output Compare Flag)– příznak dosažení shody
TCNT0 = OCR0, vyvolá přerušení, je-li nastaveno
Čítač/časovač 0 může
přijímat impulsy odvozené z pracovního kmitočtu mikrokontroléru přes
nastavitelnou předděličku, nebo z vnějšího vstupu Tn
(n=0).
Obsah registrů TCNT0 a OCR0
se neustále porovnává. Výsledek porovnání je použit pro generování výstupního
kmitočtu nebo pro generování signálu PWM
na výstupu Ocn (n=0).
Obr. 12
Zjednodušené zapojení čítače/časovače 0
Popis signálů:
10.3 Režimy činnosti
Chování čítače/ časovače a
vývodu OC0 je dán kombinací bitů WGM00,
WGM01 (režim generovaného průběhu) a COM00,
COM01(režim jednotky Output Compare). Bity jsou
umístěny v registru TCCR0. Režimy činnosti jsou popsány v Tab.8.
WGM01 |
WGM00 |
Režim |
Vrchol |
Aktualizace OCR0 |
Nastavení TOV0 |
0 |
0 |
normální |
0xFF |
okamžitě |
na vrcholu |
0 |
1 |
fázově korigovaný PWM |
0xFF |
na vrcholu |
na dnu |
1 |
0 |
CTC |
OCR0 |
okamžitě |
na vrcholu |
1 |
1 |
rychlý PWM |
0xFF |
na vrcholu |
na vrcholu |
Tab.8 Režimy činnosti čítače/časovače 0
10.3.1 Normální režim (WGM01 = 0,
WGM00 = 0)
Je to nejjednodušší režim.
V tomto režimu čítač čítá nahoru a nedochází k jeho nulování. Čítač přeteče,
když dosáhne svého maxima ($FF), restartuje se ($00) a nastaví se příznak
přetečení TOV0, který lze použít pro generování přerušení.
Je možné použít komparační jednotku pro generování přerušení při shodě TCNT0 = OCR0 např. ke generování výstupního signálu, doporučuje se však použít některý z módů k tomu určených, viz dále.
10.3.2 Režim CTC – Clear Timer on
Compare Match (WGM01 = 1, WGM00 = 0)
V tomto režimu se čítač
vynuluje, když TCNT0 dosáhne hodnoty OCR0. Obsah OCR0 určuje hodnotu
vrcholu, při kterém se čítač vynuluje, přičemž se nastaví příznak OCF0.
Je-li povoleno přerušení, vyvolá se.
Pro generování výstupního
průběhu na vývodu OC0 se zvolí režim toggle (COM01 = 0, COM00 = 1).
Při shodě TCNT0 s OCR0 se vývod OC0 neguje, dochází ke generování kmitočtu se
střídou 1:1. Nejvyšší generovaný kmitočet získáme při nastavení OCR0 = $00 a
platí pro něj vztah fOC0MAX = fCLK_IO / 2.
Pro ostatní nastavení platí
vztah:
fOC0 = fCLK_IO / (2*N*(1+OCR0))
kde N
určuje dělicí poměr předděličky (1, 8, 64, 256 nebo 1024), který se nastaví
v registru TCCR0, viz Tab.9.
Pin OC0 (PB3) musí být nastaven jako výstupní, jinak se
výstupní signál neobjeví !
Pro oba předešlé
režimy je význam bitů COM00 a COM01
uveden v tabulce Tab.10.
COM01 |
COM00 |
Popis |
0 |
0 |
čítač/časovač 0 odpojen od vývodu
OC0 |
0 |
1 |
negace stavu vývodu OC0 při shodě
(toggle) |
1 |
0 |
nulování vývodu OC0 při shodě
(log.0) |
1 |
1 |
nastavení vývodu OC0 při shodě
(log.1) |
Tab.10 Význam bitů COM00 a
COM01 pro normální a CTC režim
10.3.3 Rychlý PWM režim (WGM01 =
1, WGM00 = 1)
Tento režim poskytuje
vysokorychlostní generování PWM průběhu. Čítač čítá od $00 do maxima ($FF) a po přetečení se vrací opět do $00. Narozdíl od
fázově korigovaného režimu PWM (který používá dvoufázový průběh a bude popsán
později) poskytuje rychlý PWM režim 2x vyšší pracovní kmitočet.
Rychlý PWM režim je dobře
použitelný pro řízení výkonu, usměrnění nebo D/A převod. V tomto režimu je
čítač inkrementován do svého maxima, v následujícím cyklu hodin je nulován. Na
Obr. 13 je znázorněn režim jeho činnosti.
Obr. 13
Časový diagram pro rychlý PWM režim
V tomto režimu jsou dva
možné způsoby výstupu, neinvertující a invertující:
Neinvertující režim (COM01 = 1, COM00 = 0) – výstup OC0
je nastaven do log.1 po přetečení obsahu čítače. Po dosažení shody TCNT0 = OCR0
výstup přejde do log.0. Hodnota
OCR0 přímoúměrně určuje dobu trvání log.1 na výstupu OCR0.
V invertujícím režimu (COM01 = 1, COM00 = 1) je stav výstupu opačný.
Pro výstupní kmitočet PWM výstupu OC0 platí
vztah:
fOC0PWM = fclk_IO /(N *
256)
kde N
určuje dělicí poměr předděličky (1, 8, 64, 256 nebo 1024).
V mezních stavech OCR0 = 0 se generují krátké zákmity v
okamžiku přetečení čítače. Pro OCR0 = $FF bude
výstup stabilně v log.1 (neinvertující výstup) nebo v log.0 (invertující
výstup).
Při nastavení COM01 = 0,
COM00 = 1 je zvolen tzv. toggle režim, výstupní kmitočet má střídu 1 : 1 a hodnotu :
f OC0MAX
= f clk_IO / 2
COM01 |
COM00 |
Popis |
0 |
0 |
čítač/časovač 0 odpojen od vývodu
OC0 |
0 |
1 |
vyhrazeno |
1 |
0 |
OC0 = 0 po shodě, OC0 = 1 při
0xFF (neinvertující režim) |
1 |
1 |
OC0 = 1 po shodě, OC0 = 0 při
0xFF (invertující režim) |
Tab.11 Význam bitů COM00 a
COM01 rychlý PWM režim
10.3.4 Fázově korigovaný PWM režim (WGM01 = 0, WGM00 = 1)
Fázově korigovaný PWM režim
poskytuje PWM průběh s velkým rozlišením. Čítač čítá dvoufázově, z $00 do $FF a potom z $FF do $00.
V neinvertujícím režimu je
výstup OC0 vynulován při shodě TCNT0 = OCR0 při čítání nahoru.
K nastavení dojde při shodě TCNT0 = OCR0 při čítání dolů.
Při inverzním režimu je
činnost opačná.
Pro správnou funkci je
nutné nastavit bit PB3 v registru DDRB jako výstupní.
Dvoufázový PWM režim má
poloviční pracovní kmitočet než rychlý jednofázový režim, má ale pevné 8-bitové
rozlišení.
Výstupní kmitočet PWM
signálu na výstupu OC0 je určen vztahem:
fOC0PWM = fCLK_IO / (N * 510)
kde N
určuje dělicí poměr předděličky (1, 8, 64, 256 nebo 1024), viz Tab.9.
Mezní hodnoty OCR0
představují zvláštní případy generování PWM signálu:
Pro neinvertující režim
platí: je-li OCR0 = $00, je výstup stabilně v log.0, při OCR0 = $FF je výstup OC0 stabilně v log.1.
Pro invertující režim platí
vše opačně.
Na Obr. 14 je znázorněn
fázově korigovaný PWM režim činnosti.
Obr.14 Časový diagram pro fázově korigovaný PWM
režim
COM01 |
COM00 |
Popis |
0 |
0 |
čítač/časovač 0 odpojen od vývodu
OC0 |
0 |
1 |
vyhrazeno |
1 |
0 |
OC0 = 0 po shodě při čítání
nahoru, OC0 = 1 po shodě při čítání dolů
(neinvertující režim) |
1 |
1 |
OC0 = 1 po shodě při čítání
nahoru, OC0 = 0 po shodě při čítání dolů
(invertující režim) |
Tab.12 Význam bitů COM00 a
COM01 fázově korigovaný PWM režim
10.4 Registry čítače / časovače
V následujícím budou
uvedeny popisy registrů související s čítačem / časovačem 0.
Řídící registr TCCR0 (Timer/Counter Control Register)
Bit |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
||
FOC0 |
WGM00 |
COM01 |
COM00 |
WGM01 |
CS02 |
CS01 |
CS00 |
TCCR0 |
||
Čtení/zápis |
W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
||
Výchozí hodnota |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
CS02 |
CS01 |
CS00 |
Popis |
0 |
0 |
0 |
stop,čítač/časovač 0
je zastaven |
0 |
0 |
1 |
fCLK_I/O |
0 |
1 |
0 |
fCLK_I/O/8 |
0 |
1 |
1 |
fCLK_I/O/64 |
1 |
0 |
0 |
fCLK_I/O/256 |
1 |
0 |
1 |
fCLK_I/O/1024 |
1 |
1 |
0 |
sestupná hrana |
1 |
1 |
1 |
náběžná hrana |
Registr povolení/zákaz přerušení TIMSK (Timer/Counter Interrupt Mask Register)
Bit |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
||
OCIE2 |
TOIE2 |
TICIE1 |
OCIE1A |
OCIE1B |
TOIE1 |
OCIE0 |
TOIE0 |
TIMSK |
||
Čtení/zápis |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
||
Výchozí hodnota |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
·
OCIE0 (Output
Compare Match Interrupt Enable) – povolení přerušení při shodě TCNT0 = OCR0
·
TOIE0 (Overflow
Interrupt Enable) – povolení přerušení při přetečení obsahu TCNT0
Registr příznaků přerušení čítačů/časovačů TIFR (Timer/Counter Interrupt Flag Register)
Bit |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
||
OCF2 |
TOV2 |
ICF1 |
OCF1A |
OCF1B |
TOV1 |
OCF0 |
TOV0 |
TIFR |
||
Čtení/zápis |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
||
Výchozí hodnota |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
· OCF0 (Output Compare Flag) – příznak dosažení shody TCNT = OC0
· TOV0 (Timer/Counter Overflow Flag) – příznak přetečení čítače/časovače 0
Registr čítače/časovače 0 TCNT0 (Timer/Counter Register) – obsah čítače/časovače 0
Bit |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
||
MSB |
|
|
|
|
|
|
LSB |
TCNT0 |
||
Čtení/zápis |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
||
Výchozí hodnota |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
·
Obsahuje
aktuálně načítanou hodnotu
·
Lze jej číst a
do něj zapisovat
Porovnávací registr OC0 (Output
Compare Register) – hodnota porovnávacího registru
Bit |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
||
MSB |
|
|
|
|
|
|
LSB |
OCR0 |
||
Čtení/zápis |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
R/W |
||
Výchozí hodnota |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
·
Obsahuje
komparační úroveň, která je neustále porovnávána s TCNT0. Při shodě lze
vygenerovat přerušení nebo lze generovat signál na vývodu OC0
·
Lze jej číst a
do něj zapisovat