ATtiny13
Základy programování ATtiny13A
Tak, jako u ostatních mikrokontrolerů, i ATtiny dokáže v
podstatě jen číst stav vstupů, nebo řídit výstupy.
V následujících jednoduchých příkladech předvedu ty nejzákladnější
operace.
Základní struktura programu je podobná, jako při tvorbě
programu pro Arduino.
Na začátku je část "setup()", která se vykoná 1x při startu. A
pak následuje nekonečná smyčka "loop()".
V programu je možné používat podprogramy, podmínky, smyčky
a další běžné řídící struktury - tak jako při programování Arduina.
Vzhledem k malé velikosti paměti RAM, do které se při běhu programu ukládají
hodnoty proměnných a návratové adresy podprogramů, je třeba při psaní kódu
dávat pozor na přeplnění paměti.
1) Nastavení směru jednotlivých pinů a ovládání
logických výstupů
Hned na začátku projektu je třeba si rozmyslet, které z vývodů
obvodu budou sloužit pro vstupy a které pro výstupy.
K dispozici je celkem 6 vývodů, které jsou označeny jako PB0 až PB5.
Pokud budete používat ATtiny jen pro logické signály, tak na tom až
tolik nezáleží - každý z vývodů může být nastaven jako logický
vstup, nebo výstup.
Pokud ale chcete v projektu využít i analogové vstupy, je výběr
trochu omezenější. Pro obyčejné analogové vstupy je možné použít
jen vývody PB5, PB2, PB4 a PB3. Zbylé piny (PB0 a PB1) je možné použít
pro analogový komparátor.
Poznámka:
Trochu problémový je pin PB5, který má přednastavenou
funkci RESET. Když ho budete potřebovat využít, musíte nejdřív
nahrát do ATtiny program, a pak teprve pomocí FUSE bajtu změnit
funkci pinu PB5 z RESETU na obyčejný IN/OUT.
Od tohoto okamžiku ale přestane fungovat komunikace, takže když
budete chtít provést nějakou změnu v programu, tak budete
muset nejdříve provést vysokonapěťový
reset pojistek a pak teprve nahrát upravený program.
Pokud to tedy není nutné a v projektu vám stačí jen 5 vstupně/výstupních
pinů, tak ten resetovací pin nepoužívejte, nebo ho použijte v
tom zamýšleném významu "RESET". |
Takže první příklad - nastavení směru PB0 až PB2 na vstup a PB3
a PB4 na výstup.
DDRB = 0b00011000; // nastaveni smeru signalu na portu B ("1" = vystup ; "0" = vstup)
|
DDRB v tomto případě není běžná proměnná, ale je to jméno
vnitřního registru v ATtiny. Podle binární hodnoty tohoto registru se
nastaví piny na vstup, nebo výstup. Použitých je jen spodních 6 bitů
(PB0 až PB5).
S nastavením směru jednotlivých vývodů souvisí ještě jeden
registr s názvem PORTB.
Pokud je vývod nastaven jako vstupní, nastavením příslušného bitu v
registru PORTB se k tomuto vývodu připojí vnitřní Pull-Up odpor.
Pokud je vývod nastaven jako výstupní, příslušný bit v registru PORTB
ho ovládá.
PORTB = 0b0011100; //
pull-up pro vstup (PB2) a zaroven vystupy PB3 a PB4 nastavit do HIGH
|
Pokud je třeba například výstup PB4 přepnout z HIGH do LOW, dělá
se to touto konstrukcí:
PORTB &= 0b11101111; //
prepnuti vystupu PB4 do LOW - ostatni hodnoty jsou beze zmeny
|
Podobnou konstrukcí je možné stejný výstup přepnout z LOW do HIGH
beze změny ostatních bitů:
PORTB |= 0b00010000; //
prepnuti vystupu PB4 do HIGH - ostatni hodnoty jsou beze zmeny
|
2) Čtení logického stavu na vstupním pinu
Pro čtení stavu vstupního pinu slouží registr s názvem PINB.
Takže jednoduchý příklad na čtení pinu PB2 by vypadal třeba
takhle:
if ((PINB & 0b00000100) == 0)
{
// na vstupu PB2 je logicka "0"
}
else
{
// na vstupu PB2 je logicka "1"
}
|
S těmito znalostmi už se můžeme pustit do prvního "HelloWorld"
prográmku:
Na pinu PB2 bude tlačítko.
Na pinech PB3 a PB4 budou LED diody.
Požadovaná funkce:
Když bude tlačítko rozepnuté (kvůli vnitřnímu Pull-Up odporu bude na pinu
PB2 udržovaná logická "1") bude svítit LED na pinu PB4. LEDka na
PB3 je zhasnutá. Když se tlačítko sepne (přizemní) PB4 zhasne a
rozsvítí se PB3.
(celé schéma na kliknutí)
Poznámka:
Program se do ATtiny nahrává přes standardní ISP komunikaci
(MISO / MOSI / SCK / RESET)
Nahrávání programu se budu věnovat v další lekci, teď jen
upozorním na to, že pokud je ke komunikačním vývodům něco připojeno,
mohou být s nahráním programu problémy. LED s odpory nevadí -
na nich je vidět blikání při nahrávání programu. Problémem
jsou ale tlačítka, nebo analogové vstupy. Ty je lepší před
nahráním programu rozepnout nebo odpojit. |
// Program pro stridave pepinani LED na pinech PB3 a PB4 v zavislosti na logickem stavu na pinu PB2.
void setup()
{
DDRB = 0b00011000; // nastaveni smeru signalu na portu B ("1" = vystup ; "0" = vstup)
PORTB = 0b00001100; // pull-up pro vstup (PB2) a zaroven vystupy PB3 rozsvitit a PB4 zhasnout
}
void loop()
{
if ((PINB & 0b00000100) == 0)
{
// na vstupu PB2 je logicka "0" = (tlacitko sepnuto)
PORTB &= 0b11101111; // prepnuti vystupu PB4 do LOW - ostatni hodnoty jsou beze zmeny
PORTB |= 0b00001000; // prepnuti vystupu PB3 do HIGH - ostatni hodnoty jsou beze zmeny
}
else
{
// na vstupu PB2 je logicka "1" = (tlacitko rozepnuto)
PORTB &= 0b11110111; // prepnuti vystupu PB3 do LOW - ostatni hodnoty jsou beze zmeny
PORTB |= 0b00010000; // prepnuti vystupu PB4 do HIGH - ostatni hodnoty jsou beze zmeny
}
}
|
|