SVETELEKTRO

27. septembra 2011   Verzia pre tlač Verzia pre tlač

Programovanie Atmel AVR v jazyku C – 1.časť


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
https://extremeelectronics.co.in/category/avr-tutorials/
https://iamsuhasm.wordpress.com/tutsproj/avr-gcc-tutorial/
https://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.

Ako sa vám páčil tento článok?
  • Páči sa mi (3)
  • Súhlasím (0)
  • Zábavné (0)
  • Informatívne (0)

Komentáre (4)

  1. pin píše:

    Pre nulovanie bitov b3 a b0 v premennej a má byť:
    a &= 11110110

    Tu aj vidno, že je nepraktické nazvať premennú jedným znakom a, lebo splýva s textom. Céčkari ju zvyčajne pomenujú aa.

    Môže to byť užitočný seriál, držím palce, aby bol dokončený čím skôr. 🙂

  2. dan21 píše:

    cast
    Príklady
    logické operácie s 2 premennými

    v texte pod prikladmi ma byt uvedene „pocitane zprava od 0“

    a v casti logicky posun pod obrazkom rovnaka „chyba“
    🙂

Pridaj komentár