Reklama

Základy ovládání mikrokontroléru ATmega(16/32) 4.díl – Ovládání vstupně/výstupních portů

Úvod

Nejdůležitější věc při používání jakéhokoliv mikrokontroléru je, aby dokázal komunikovat s okolními zařízeními. Toho je docíleno pomocí vstupně/výstupních portů. Mikrokontrolér ATmega16 obsahuje čtyři osmi-bitové porty označované jako PORTA, PORTB, PORTC a PORTD.

Základní popis

 

Jako první je nutné nastavit, jestli chceme použít PORTx jako vstupní nebo výstupní PORT. Tento směr řídí registr DDRx (DDRA, DDRB, DDRC, DDRD), kde lze nezávisle na sobě nastavit směr každému bitu samostatně. Pokud je tento registr nastaven na hodnotu log. 0, je brán jako vstupní v opačném případě při stavu log. 1 je nastaven jako výstupní. Z předchozí věty vyplývá, že při nastavení např. DDRA = 0b00001111, má PORTA nastaveny první čtyři bity jako výstupní a následující čtyři bity jsou nastaveny jako vstupní. Zápis hodnoty na PORTx při nastavení funkce výstupního pinu probíhá pomocí příkazu PORTx. Pokud tedy chceme zapsat např. hodnotu 255 na PORTA, stačí napsat PORTA = 0b11111111, nebo PORTA = 0xFF anebo také PORTA = 255. Při nastavení PORTx jako vstupního lze jeho stav číst pomocí registru PIN. Pokud tedy chceme zapsat aktuální stav z PORTA do proměnné state_a, stačí napsat state_a = PINA.

 

Dále lze pomocí bitu PUD v registru SFIOR odpojit všechny pull-up rezistory a to nastavením tohoto bitu do stavu log. 1. Dále pokud používáme PORTx jako vstupní bránu tzn. DDRx = 0x00, tak připojení pull-up rezistorů zajišťuje přiřazení do PORTx stav log. 1.

 

Mikrokontrolér ATmega16 obsahuje shodné proudové zatížení pro oba logické stavy, proto není nutné řešit v jakém stavu jsou buzeny např. LED diody. Ovšem je nutné dodržet maximální proud na jeden výstupní pin 40mA (výrobce testoval pin při 5V a 20 mA [1]) a celkový maximální proud tekoucí všemi výstupy nesmí překročit 200mA.

Podle datasheetu [1] jsou zde i další omezení, které jsou závislé na typu spínání (proti zemi, nebo proti Vcc) a na použitém pouzdru.
 
Pro spínání zátěže pomocí log. 0 tzn. spínání proti Vcc (anglické označení “SINK”) platí:
 
PDIP pouzdro:
1. Celkový součet pro všechny IOL, pro všechny porty nemá přesáhnout 200mA.
2. Celkový součet pro všechny IOL, pro porty A0 – A7 nemá přesáhnout 100mA.
3. Celkový součet pro všechny IOL, pro porty B0 – B7,C0 – C7, D0 – D7 a XTAL2 nemá přesáhnout 100mA.
 
TQFP a QFN/MLF pouzdro:
1. Celkový součet pro všechny IOL, pro všechny porty nemá přesáhnout 400mA.
2. Celkový součet pro všechny IOL, pro porty A0 – A7 nemá přesáhnout 100mA.
3. Celkový součet pro všechny IOL, pro porty B0 – B4 nemá přesáhnout 100mA.
4. Celkový součet pro všechny IOL, pro porty B3 – B7 XTAL2, D0 – D2, nemá přesáhnout 100mA.
5. Celkový součet pro všechny IOL, pro porty D3 – D7 nemá přesáhnout 100mA.
6. Celkový součet pro všechny IOL, pro porty C0 – C7 nemá přesáhnout 100mA.

 
Pro spínání zátěže pomocí log. 1 tzn. spínání proti zemi (anglické označení “SOURCE”) platí:
 
PDIP pouzdro:
1. Celkový součet pro všechny IOH, pro všechny porty nemá přesáhnout 200mA.
2. Celkový součet pro všechny IOH, pro porty A0 – A7 nemá přesáhnout 100mA.
3. Celkový součet pro všechny IOH, pro porty B0 – B7,C0 – C7, D0 – D7 a XTAL2 nemá přesáhnout 100mA.
 
TQFP and QFN/MLF pouzdro:
1. Celkový součet pro všechny IOH, pro všechny porty nemá přesáhnout 400mA.
2. Celkový součet pro všechny IOH, pro porty A0 – A7 nemá přesáhnout 100mA.
3. Celkový součet pro všechny IOH, pro porty B0 – B4 nemá přesáhnout 100mA.
4. Celkový součet pro všechny IOH, pro porty B3 – B7 XTAL2, D0 – D2 nemá přesáhnout 100mA.
5. Celkový součet pro všechny IOH, pro porty D3 – D7 nemá přesáhnout 100mA.
6. Celkový součet pro všechny IOH, pro porty C0 – C7 nemá přesáhnout 100mA.

 

Pro nepoužité piny mikrokontroléru je doporučeno definovat logickou úroveň. Nejjednodušším řešením je použití vnitřních “pull-up” rezistorů, ale lze použít i externí “pull-up” nebo “pull-down” rezistory. Přímé spojení s Vcc nebo GND není doporučeno, protože by to mohlo vést k nadměrným proudům v případě náhodné konfigurace pinů jako výstupních.

Jako první test funkce vstupně/výstupních pinů byl vytvořen program nazývaný jako „běžící had“. Elektronické schéma lze vidět na Obr. 1.

Obr. 1: Elektronické schéma obvodu

Obr. 1: Elektronické schéma testovacího obvodu
Okomentovaný zdrojový kód
 

001: #define F_CPU 16000000UL// definice hodinového signál, nutné pro funkci delay
002: #include <util/delay.h>// hlavičkový soubor pro zpoždění
003: #include <avr/io.h>// knihovna AVR pro Input/output
004: #include <stdint.h>// knihovna pro standardní typy
005:
006: int main(void)
007: {
008: uint8_t state = 0;// aktuální pozice LED pásku
009: uint8_t count = 0;// počet posunutí
010:
011: DDRA = 0xFF;// nastavení PORTU A jako výstup
012: PORTA = 0xFF;// zhasnutí LED diod
013:
014: while(1)
015: {
016: if (state != 0b10000000)// pokud není aktuálně zobrazena poslední LED
017: {
018: // bitový posuv hodnoty 0x01 o počet pozic count
019: state = (1 << count);
020: PORTA = ~state;// negace a zobrazení hodnoty na PORTA
021: count++;// inkrementace počtu míst posunu
022: _delay_ms(50);// zpoždění 50ms
023: }
024: else
025: {
026: state = 0b000000001;// nový začátek posunu
027: PORTA = ~state;// negace a předání na PORTA
028: count = 1;// nastavení posunu na hodnotu 1
029: _delay_ms(50);// zpoždění 50ms
030: }
031: }
032: return 0;
033: }

Vzorové zdrojové kódy slouží pouze k jednoduché demonstraci funkce, proto často obsahují globální proměnné, neobsahují většinou ukazatele, dále také neobsahují kontroly proměnných, definování nevyužitých pinů mikrokontroléru a podobné správné programátorské návyky. Proto je nutné tyto kódy brát s patřičnou rezervou.
 

Výslednou realizici na kontaktním poli ukazuje Obr. 2.

Obr. 2: Výsledná realizace na kontaktním poli

Obr. 2: Výsledná realizace na kontaktním poli
[1] ATMEL. 8-bit AVR Microcontroller with 16K Bytes In-System Programmable Flash. [online] citováno 14. Října 2013. Dostupné na www: http://www.atmel.com/Images/doc2466.pdf

 
 
Aktualizace: 7.2.2016
 

Za případné chyby v textu, ve zdrojovém kódě, nebo ve schématickém zapojení se omlouváme.
AUTOŘI NEBEROU ŽÁDNOU ODPOVĚDNOST ZA PŘÍPADNÉ ÚJMY NA ZDRAVÍ ČI MAJETKU.
Jiné příspěvky v kategorii:

 

Základy ovládání mikrokontroléru ATmega(16/32) 1.díl – První kroky

Základy ovládání mikrokontroléru ATmega(16/32) 2. díl – Kompilace a krokování programu

Základy ovládání mikrokontroléru ATmega(16/32) 3.díl – Nahrání vytvořeného zdrojového kódu do mikrokontroléru

Základy ovládání mikrokontroléru ATmega(16/32) 5.díl – Ošetření zákmitů na vstupním pinu mikrokontroléru

Základy ovládání mikrokontroléru ATmega(16/32) 6.díl – Externí přerušení

Základy ovládání mikrokontroléru ATmega(16/32) 7. díl – Jednoduchá elektronická hrací kostka

Základy ovládání mikrokontroléru ATmega(16/32) 8.díl – A/D převodník (1.část)

Základy ovládání mikrokontroléru ATmega(16/32) 9.díl – A/D převodník (2.část)

Základy ovládání mikrokontroléru ATmega(16/32) 10.díl – A/D převodník (3.část)

Základy ovládání mikrokontroléru ATmega(16/32) 11.díl – Čítač / Časovač (1.část – Základní popis)

Základy ovládání mikrokontroléru ATmega(16/32) 12.díl – Čítač / Časovač (2.část – Popis registrů)

Základy ovládání mikrokontroléru ATmega(16/32) 13.díl – Čítač / Časovač (3.část – Praktická ukázka)

Základy ovládání mikrokontroléru ATmega(16/32) 14.díl – Dvouřádkový LCD displej

Základy ovládání mikrokontroléru ATmega(16/32) 15.díl – Popis implementace komunikace I2C a EEPROM paměti 24LC512

Základy ovládání mikrokontroléru ATmega(16/32) 16.díl – Watchdog

Základy ovládání mikrokontroléru ATmega(16/32) 17.díl – Obsluha maticové klávesnice

Základy ovládání mikrokontroléru ATmega(16/32) 18.díl – Jednotka USART (1. část – Popis)

Základy ovládání mikrokontroléru ATmega(16/32) 19.díl – Jednotka USART (2. část – Praktická ukázka)

Základy ovládání mikrokontroléru ATmega(16/32) 20. díl – Generování audio signálu pomocí PWM

Základy ovládání mikrokontroléru ATmega(16/32) 21. díl – Analogový komparátor

Základy ovládání mikrokontroléru ATmega(16/32) 22. díl – Krokování programu v jazyce symbolických adres (JSA)
 
Tajned facebook