Mikrokontrolér   ATMEL  ATmega 32

 

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

 

 

1.Základní charakteristika

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2.Blokové schema AT Mega 32

 

 

Obr. 1  Blokové schema ATmega32

 

 

 

 

 

3.Zapojení pouzdra DIP 40

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

 

4.Paměťový prostor

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.

 

 

 

5. Popis registrů

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.

 

6. Časování zpracování instrukce

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

 

 

 

7.Systémové hodiny, časování

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 CKSEL0CKSEL3 (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.

 

8.Obsluha I/O portů

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

 

 

9.Přerušovací systém

 

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.

Externí přerušení

 

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:

  1. INT0    pin PD2
  2. INT1    pin PD3
  3. INT2    pin PB2

 

Mikrokontrolér může na těchto vstupech reagovat čtyřmi způsoby:

  1. na log.0
  2. na libovolnou změnu úrovně (na náběžnou i sestupnou hranu impulsu)
  3. na sestupnou hranu impulsu
  4. na náběžnou hranu impulsu

 

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.

 

        

 

10.Čítač/časovač 0

Čí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

                        Tab.9 Bity pro nastavení předděličky taktovacího kmitočtu

 

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

 

 

 

11.Čítač/časovač 1

 

 

 

 

 

12.Čítač/časovač 2

 

 

 

 

13. LCD displej


 

14. A/D převodník

 

 

                

 

 

15.TWI rozhraní

 

 

 

 

16.Sériový kanál USART

 

 

 

 

17. SPI rozhraní