Články / Návody a teória
Programovanie Atmel AVR v jazyku C - 1.časť
Dátum: 27.09.2011 Autor: martin knocik
som sa napísať sériu článkov o programovaní mikrokontrolérov Atmel AVR v jazyku C z dôvodu neexistencie žiadneho materiálu v slovenčine alebo češtine a nechcel som aby moje poznámky čo som si robil skončili zabudnuté v mojom pc.
Konkrétne pôjde o programovanie
ATmega32 v jazyku C, vo vývojovom prostredí Codeblocks, s kompilátorom avr-gcc (rovnaký typ používa aj AVRstudio), na operačnom systéme GNU Linux. Predpokladám znalosť syntaxe jazyku C. Predpokladám úroveň bežná pre programovanie na pc, nemienim vysvetľovať cykly a pod, kto má s tým problém, odporúčam knihu Učebnice jazyka C od Pavla Herouta. V 3 ďalších dieloch čo určite chcem napísať, budem rozoberať ako programovať Atmely, vstup/výstup, externé prerušenia. Myslím si že mne ako začiatočníkovi robili spomínané témy spočiatku robili ťažkosti, hlavne téma externého prerušenia, kde som zápasil s nedostatkom zrozumiteľných návodov pre ATmega32.
Zdroje – budú použité aj v dalších článkoch:
Pardue, Joe: C Programming for Microcontrollers Featuring ATMEL’s AVR Butterfly and the Free
WinAVR Compiler
http://extremeelectronics.co.in/category/avr-tutorials/
http://iamsuhasm.wordpress.com/tutsproj/avr-gcc-tutorial/
http://www.wikipedia.org/
datasheet ATmega32
ďalšie zdroje ktoré som použil budu priebežne pridavané
1.diel – binárna logika
základné pojmy
Bit [b] – základná jedontka informácie. Može nadobúdať hodnotu logická 0 alebo logická 1.
Bajt [B] – osem bitov
Baud [Bd] – jednotka signálovej rýchlosti, predstavuje počet zmien stavu prenosového média za sekundu v modulovanom signále. V niektorých systémoch sa signálna rýchlosť a prenosová rýchlosť rovnajú, keďže je možné, aby signálna udalosť niesla jeden bit, ale vo všeobecnosti je bežnejšie využívať šírku pásma zakódovaním viacerých bitov (až do množstva šestnásť) v jednej udalosti. Takže 2400-bitový modem v skutočnosti prenáša 600 baudov, kde každá udalosť modulácie kvadratúrou amplitúdy nesie štyri bity informácie.
Binárne operátory
~ binárna negácia,
NOT
& binárny logický súčin,
AND
| binárny logický súčet,
OR
^ binárny „
exclusive OR“
<< posun vľavo
>> posun vpravo
Pravdivostné tabuľky
AND
0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1
| OR
0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1
| XOR
0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0
|
Príklady
logické operácie s 2 premennými
| 00000000
|
| 00001000
|
| ------------
|
| OR | 00001000
|
|
|
| 11111111
|
| 00001000
|
| ------------
|
| OR | 11111111
|
|
|
| 01010101
|
| 00001000
|
| ------------
|
| OR | 01011101
|
Z týchto troch príkladov je vidieť že je ovplyvnený 3 bit (je podčiarknutý, počítané zľava od 0), bez ohľadu na to aká je hodnota 1 premennej.
Teraz to isté s operátorom AND.
| 00000000
|
| 00001000
|
| ------------
|
| AND | 00000000
|
|
|
| 11111111
|
| 00001000
|
| ------------
|
| AND | 00001000
|
|
|
| 01010101
|
| 00001000
|
| ------------
|
| AND | 00000000
|
Ak chceme zapísať hodnotu do premennej, môžeme miesto operátora priradenie = použiť logické operátory. Malo by to byť trochu rýchlejšie.
Operátor |= pre zápis logická 1, operátor &= pre zápis logická 0.
Mám premennú a. Chcem do nej zapísať hodnotu 01010101. Miesto operátora = použijem |=
char a;
a |= 01010101;
Teraz chcem vynulovať 0 a 3 bit.
a &= 11110110;
V premennej a je teraz uložená hodnota 010100000.
Chcem v premennej a zmeniť 7 a 5 bat na log.1
a |= 10100000;
Teraz je v premennej a uložená hodnota 11110000.
Operátory logický posun doľava <<, operátor logický posun doprava >>
Pri zápise spôsobom ako v predchádzajúcom príklade sa môže stať že sa pomýlime pri takom množstve núl a jednotiek. Preto sa dá napr pri zápise do registrov použiť operátory logického posunu.
Príklad
Budem do registra MCUCR zapisovať rôzne hodnoty podla tabuľky nastavenia. Prerušenia budu vysvetlene v ďalšom článku. Účel registra nás zatiaľ nemusí zaujímať. V každom registri je 8 bitov(lebo ide o 8 bitový mikrokontrolér).
Každý bit má svoje meno. Kvôli jednoduchosti príkladu sa budem použivať len bity ICS00, ISC01 -
riadia externé prerušenie 0 a bity ISC11, ISC10 – riadia ext prerušenie 1. Tabuľka hodnôt je rovnaká pre obe ISC11, ISC11 (tabuľka 34 na obrázku) ako aj pre bity ICS00, ISC01.
Operátor logický posun sprava >> funguje analogicky polohu bitov počítame sprava.
Napríklad podľa tabuľky chcem aby ľubovolná zmena log hodnoty vyvolala ext. prerušenie 1.
Aby som toho dosiahol, musím zmeniť hodnotu registra MCUCR z východzej hodnoty 00000000
na hodnotu 00001000 t.j. Treba zmeniť 3 bit s názvom ISC11 z log 0 na log 1. Dá sa to spraviť pomocou operátorov = alebo |= . Pomocou operátora log. posunu sa to dá spraviť prehľadnejšie a je hneď vidno čo sme spravili.
MCUCR |= (1 << ISC10);
Teraz je v MCUCR zapísaná hodnota 00001000. Je to aj to isté ako by sme zapísali (1<<3). To znamená zapísať log 1 na 3 miesto(počítané od 0) zprava.
môžem takto nastaviť aj viac bitov naraz. Napr chcem nastaviť aby ľubovolná zmena log hodnoty vyvolala ext. prerušenie 0 a ext. prerušenie 1
MCUCR |=(1 << ISC00) | (1 << ISC10);
Nový príklad. Register MCUCR je zaplnený 00000000. Čo spraví nasledujúci program ?
MCUCR |=(4 << ISC00);
Do registra nemôžem zapísať iné číslo ako 0 alebo 1. V skutočnosti sa zapíše miesto 4 v desiatkovej sústave 4 v binárnej sústave 00000100 pomocou OR. Výsledná hodnota v registri MCUCR bude
00000100, čo znamená že sme nastavili na log 1 nie bit ISC00, ale bit ISC10, ktorý je druhý zľava. Neviem aký ma praktický význam použivať pri operátoroch posunu čísla rôzne od 0 alebo 1, tento posledný príklad slúžil len ako ukážka čo všetko sa dá robiť s operátorom posunu.