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