Hamik154

Vstupy a výstupy

Tentokrát si vysvětlíme princip práce se vstupně-výstupními piny. Zopakujeme si a případně i objasníme pár základních pojmů. A naznačíme další možnosti studia a experimentování.

Na DEVboard máme k dispozici LED2 a S2 (tlačítko). Jak se nastaví vstup tlačítka a výstup pro Led diodu? V Arduino IDE stačí pouze zadat v setup() funkci pinMode INPUT nebo OUTPUT:

//octopusLAB #DEVboard, ATtiny i/o example
#define LED2_PIN  1 // pin P1
#define BTN2_PIN  3 // pin P3

void setup() {  
  pinMode(LED2_PIN, OUTPUT); 
  //initialize digital pin as an output
  pinMode(BTN2_PIN,  INPUT_PULLUP);  
  // button - input
}
... 

Půjdeme však ještě více „do hloubky“: Mikrokontroléry mívají celou řadu vnitřních registrů (registry jsou často osmibitové: jeden BYTE = 8 bitů, jeden bit pak odpovídá i jednomu pinu na sběrnici). Některé piny sběrnice mohou plnit různé funkce – podle potřeby a nastavení. K registrům ATtiny máme přístup i z Arduino prostředí – pomocí jejich názvů, například:

PORTB (Port B Data Register) – port pro výstup a nastavení pull-up. Používá se spodních pět bitů: PB0 až PB4) Využít se dá i pátý bit RST, ale my ho ponecháme pro Reset a tak budeme mít k dispozici pět pinů. Pro ukázku s LED se PB1 (druhý bit registru – číslováno od nuly) ukáže na pinu sběrnice P1 – a podle toho Led svítí nebo nesvítí.
DDRB (Data Direction Register) – nastavení „směru“ („1″=výstup;“0″=vstup).
PINB (Port B Input) – registr, kde můžeme přečíst vstupní hodnoty.

Použijeme-li Arduino C klasicky pinMode() a digitalWrite() pro jednoduché blikání Ledky, bude mít přeložený kód např. 680 B – a tolik se nahrává do flash paměti. Když ale využijeme efektivnější práci s registry, má kód velikost 480 B – což je asi o čtvrtinu méně! V případě ATtiny 13, kde je k dispozici jen 1k (1024 B), to rozhoduje o proveditelnosti projektu.

Hodnota „X“ znamená, že to pro popisovaný příklad není podstatné
DDRB1=1 (zelená „1“ v oranžovém čtverci) nastaví PORTB1 jako výstupní a pak se signál dostává „ven“ na pin P1.
DDRB3=0 (modrá „0“ v oranžovém čtverci) nastaví možnost čtení, co se objeví „venku“ na pinu P3 – přečte se z PINB3.
PORTB3=1 (modrá „1“ v zeleném čtverci) připne PULL-UP rezistor na vstup PINB3.

Programování ve strojovém kódu procesoru ani práce s assemblerem (jazykem symbolických adres) se sice dnes už používá málo, je ale dobré znát pár základních principů, jak se pracuje s nastavením a čtením bitů v registrech a na sběrnicích.

Logické operace:
~ negace, & AND, | OR, ^ XOR
Zkrácený zápis přiřazení:
PORT = PORT & MASK; -> PORT &= MASK;
Binární zápis čísel:
1 => 0b00000001; 2 => 0b00000010; …

Nastavení mikrokontoléru, podle úvodního zadání může vypadat takto:

DDRB  = 0b00000010; //Data Direction  PB1 "1"out
PORTB = 0b00001000; //pull-up for PB3