Svetelektro.com

Svetelektro.com

Meno:
Heslo:

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

Kategória: Návody a teória | 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
------------
OR00001000

11111111
00001000
------------
OR11111111

01010101
00001000
------------
OR01011101

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
------------
AND00000000

11111111
00001000
------------
AND00001000

01010101
00001000
------------
AND00000000


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.
 

01.08.2012

Meranie parametrov laboratórneho zdroja

 10181   19  Hodnotenie: 4.8Hodnotenie: 4.8Hodnotenie: 4.8Hodnotenie: 4.8Hodnotenie: 4.8

05.10.2012

NE555

 32884   16  Hodnotenie: 4.2777777777778Hodnotenie: 4.2777777777778Hodnotenie: 4.2777777777778Hodnotenie: 4.2777777777778Hodnotenie: 4.2777777777778

Priemerné hodnotenie: 4.13
Hlasov: 15

Veľmi dobrý

Zvoľte počet hviezdičiek:
Vynikajúci
Veľmi dobrý
Dobrý
Priemerný
Zlý



Za obsah komentárov je zodpovedný užívateľ, nie prevádzkovateľ týchto stránok.

Re: Programovanie Atmel AVR v jazyku C - 1.časť (Hodnotenie: 1)
Od: pin - 27.09.2011
(O užívateľovi | Poslať súkromú správu)
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. :)
Re: Programovanie Atmel AVR v jazyku C - 1.časť (Hodnotenie: 1)
Od: martin knocik - 27.09.2011
(O užívateľovi | Poslať súkromú správu) http://mkelektronika.hostujem.sk/
 
Máš pravdu s tým nulovaním, v čase pisania som si nemohol na to presne spomenuť.

Re: Programovanie Atmel AVR v jazyku C - 1.časť (Hodnotenie: 1)
Od: dan21 - 28.09.2011
(O užívateľovi | Poslať súkromú správu)
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" :-)

Re: Programovanie Atmel AVR v jazyku C - 1.časť (Hodnotenie: 1)
Od: martin63 - 19.10.2011
(O užívateľovi | Poslať súkromú správu)
Bude aj pokračovanie?
Autor stránky je Ondrej Závodský(zawin), o graficky design sa stará Ľuboš Fabo(BUFU).

TOPlist

Powered by Copyright © UNITED-NUKE CMS. All Rights Reserved.
Čas potrebný k spracovaniu stránky 0.01 sekúnd