1. Úvodem
Během
studií jsem získal základní zkušenosti s programováním
mikroprocesorů v assembleru. Po několika letech jsem vrátil
zpět k jednočipům, avšak učím se je programovat v
jazyce C. Výhodou může být přehledný kód, který s
drobnými úpravami snadno přepasujeme na jiný typ
mikroprocesoru. Přeložený kód z jazyka C sice může být
pomalejší oproti rutinám, napsaným přímo v
assembleru. Používám program CodeVision AVR, jako
editor kódu a překladač. Existuje řada jiných překladačů,
ale tento je jednoduchý a bezproblémový. Mikroprocesor
programuji přes ISP rozhraní programátorem Presto od
firmy ASIX (www.asix.cz).
Programátor je vybaven USB rozhraním, podpora mnoho
mikroprocesorů a v neposlední řadě stálá aktualizace
a podpora výrobce. Programátor Presto mohu jen doporučit
1.3
Bitový
nebo bytový přístup - přístup k I/O bráně nebo paměti:
Jednočipy Atmel umožňují bitový
přístup na své vstupní / výstupní piny. K celé bráně
(8-mi I/O pinům) lze přistoupit adresou jednoho bytu.
Bytový zápis:
PORTB = 0x33; // tím
jsme zapsali, že chceme aktivovat výstup B0, B1, B4 a B5
Bitový zápis:
PORTB.5 = 1; // takto jsme nahodili pin B5
Bitové čtení:
DATA = PINB.2; //
stav na pinu B2 jsme uložili do proměnné data
Ale přístup k proměnným v paměti
je pouze bytový. To znamená, že když potřebujeme změnit
jeden bit jedné proměnné, musíme provést tzv. maskování a to s celým
bytem:
DATA = DATA&0x01;
// smazání celého byte, ponechání
hodnoty v prvním bitu
DATA = DATA&0x0f;
// smazání celého 1/2 byte, ponechání
spodní
poloviny proměnné data
Příklad:
Vyhodnocení stavů na vstupním pinu
s následnou změnou jednoho bitu v proměnné
DATA.
1)
DATA = 0;
If (INPUT == 1) DATA =
DATA|0x01;
else DATA ==DATA&0xfe;
// aby se na prvni bit zapsala nula
2)
DATA = 0;
If (INPUT == 1) DATA =
DATA|0x01;
else DATA ==DATA&~(0x01);
// provedena bitova inverse, prehledne elegantni
reseni
3)
DATA = 0;
DATA+=INPUT?1:0
// elegantni reseni
4)
nemusí fungovat, je třeba ověřit
DATA = 0;
DATA = DATA | (unsigned char)INPUT;
5)
to samé, ale zapsáno jednodušší formou
DATA = 0;
DATA
|= (unsigned
char)INPUT;