1. Mikrokontrolery AVR, jzyk C, podstawy programowaniaNiniejsza
darmowa publikacja zawiera jedynie fragment penejwersji caej
publikacji.Aby przeczyta ten tytu w penej wersji kliknij
tutaj.Niniejsza publikacja moe by kopiowana, oraz dowolnie
rozprowadzana tylko i wyczniew formie dostarczonej przez
Wydawnictwo ATNEL. Zabronione s jakiekolwiek zmiany wzawartoci
publikacji bez pisemnej zgody Wydawnictwa ATNEL - wydawcy
niniejszejpublikacji. Zabrania si jej odsprzeday.Pena wersja
niniejszej publikacji jest do nabycia wsklepie internetowym
http://witmir.pl
2. Stycze 2011 ATNEL Mikrokontrolery AVr WYDAWNICTWO jzyk C
podstAwy progrAMowAniA Mirosaw Karda Mojej onie Kasi
3. Ksika przeznaczona jest dla elektronikw i hobbystw, ktrzy
chc szybko, w oparciu o interesujceprzykady, pozna jzyk C
przeznaczony dla mikrokontrolerw AVR i nauczy si pisa dla
nichprogramy. Jest to jzyk wysokiego poziomu o nieograniczonych
moliwociach, pozwala rwnieatwo i wygodnie dokonywa pocze z jzykiem
maszynowym asembler. W sposb przystpnyopisana zostaa take
architektura oraz moliwoci samych mikrokontrolerw AVR wchodzcych
wskad dwch rodzin: ATmega i ATtiny. Prezentowany materia podzielony
jest na trzy czci. Pierwszaobejmuje zagadnienia zwizane z budow
mikrokontrolerw, druga to wykad na temat podstaw samegojzyka, a
trzecia zawiera szereg wicze wraz z kodami rdowymi, komentarzami i
bogatymi opisami.Opracowanie graficzne: Mirosaw KardaRedakcja:
Magorzata Koczaska Copyright by Wydawnictwo AtnelSzczecin 2011ISBN
978-83-931797-0-1Wydawnictwo ATNELul. Jasna 15/3870-777
Szczecinfax: 91 4635 683http://www.atnel.ple-mail:
[email protected] IWszystkie znaki wystpujce w tekcie s
zastrzeonymi znakami firmowymi bd towarowymi ich wacicieli. Autor
orazwydawnictwo Atnel dooyli wszelkich stara, by publikowane tu
informacje byy kompletne i rzetelne. Nie bior jednak
adnejodpowiedzialnoci ani za ich wykorzystanie, ani za zwizane z
tym ewentualne naruszenie praw patentowych lub autorskich.
Autororaz wydawnictwo Atnel nie ponosz take adnej odpowiedzialnoci
za ewentualne szkody wynike z wykorzystania informacjizawartych w
ksice. Wszelkie prawa zastrzeone. Nieautoryzowane rozpowszechnianie
caoci lub fragmentw niniejszejpublikacji w jakiejkolwiek postaci
jest zabronione. Wykonywanie kopii caoci lub fragmentw ksiki bd
doczonej pytyDVD metod kserograficzn, fotograficzn, a take
kopiowanie ksiki lub pyty DVD na nonikach filmowych,
magnetycznych,elektronicznych lub na nieutoryzowanych stronach
internetowych powoduje naruszenie praw autorskich niniejszej
publikacji.
8. Przedmowa Strona | 7 Stale rosnce zainteresowanie jzykiem C,
dla mikrokontrolerw serii AVR firmy ATMEL, powoduje due
zapotrzebowanie na wszelkiego rodzaju kursy, poradniki, e-booki czy
te ksiki. Z tymi ostatnimi jest niestety bardzo sabo. a to dlatego,
e po prostu nie istniaa dotd adna pozycja, ktra dotyczyaby wanie
jzyka C oraz rodziny AVR. Postanowiem napisa t ksik, by pomc
wszystkim, chccym pozna od podstaw tajniki tego uniwersalnego jzyka
programowania. Ma ona za zadanie,w moliwie najprostszy sposb
wprowadzi do wiata C take te osoby, ktre do tej pory nie miay
adnego kontaktu z programowaniem i stoj na rozdrou, prbujc
zdecydowa si, jakiego jzyka zacz si uczy, aby efektywnie i szybko
programowa mikrokontrolery. Dlaczego C? W zamierzchych czasach, gdy
powstaway pierwsze mikroprocesory, rozwj oprogramowania by cile
zwizany ze specyficznym jzykiem maszynowym kadego mikroprocesora.
Powodowao to konieczno pisania programw dla cile okrelonych urzdze.
Jzyki najniszego poziomu, asemblery bazuj na mnemonikach, ktre
zastpuj prawdziwy jzyk numeryczny zrozumiay dla procesora. Jednak,
aby nie trzeba byo pisa programw w postaci cigu cyfr w systemie
szesnastkowym typu: 0x3A, 0x1B, 0x41, 0x05, co miaoby spowodowa
zaadowanie np. liczby 22 do okrelonej komrki pamici RAM, mona
posugiwa si mnemonikami takich rozkazw. Dziki czemu powyszy cig
cyfr zastpi mona w asemblerze poleceniem o wieleprzyjaniejszym dla
oka, np.: MOV BUFOR, 22. Kompilator asemblera przetumaczy sam tak
mnemonik na cig cyfr zrozumiay dla konkretnego mikrokontrolera,
ktre zostay przedstawione wyej. Reasumujc, asembler jest najnisz
form kodu maszynowego, dajcego si zrozumie przez czowieka. Pisanie
programw w czystym asemblerze jest jak najbardziej moliwe i jeli
kto ma wieloletnie dowiadczenie, pozwala to na osiganie znacznej
wydajnoci programu napisanego w ten sposb. Jak wspomniaem, aby
efektywnie i dobrze pisa programy w jzyku najniszego poziomu,
trzeba powici wiele lat na nauk, a pomimo to nadal pisanie wikszych
programw staje si bardzo uciliwe, dugotrwae oraz wymaga czasu na
przetestowanie i sprawdzenie wszelkiego rodzaju bdw. Na dodatek
program napisany w specyficznym kodzie maszynowym jednego procesora
bdzie bardzo trudny do przeniesienia na inny typ. Czasem bdzie to w
ogle niemoliwe i spowoduje konieczno napisania programu od pocztku.
W zwizku z powyszym ogromny wkad pracy w napisanie programu zostaje
niejednokrotnie zniweczony, gdy przychodzi zmiana zaoe i konieczno
zastosowania w urzdzeniu innego typu mikroprocesora, a czasu na
modyfikacj i sprawdzenie dziaania jest niewiele. W takim momencie
bardzo pomocny okazuje si jzyk C. Jest to jzyk oglnego
przeznaczenia, ktry moe pracowa na kadym mikrokontrolerze, dla
ktrego stworzony jest kompilator C. W dzisiejszych czasach
praktycznie nie ma procesorw, ktrych nie mona byoby programowa w C,
za to zdarzaj si ju takie przypadki, gdzie producent wrcz nie
dostarcza asemblera do swoich produktw, w zamian dajc tylko
kompilator C. Dziki C mona: szybko i atwo porusza si midzy rnymi
rodzinami mikrokontrolerw, o wiele szybciej, efektywniej i
wydajniej pisa i testowa programy, a take tworzy kod, ktry jest o
wiele atwiejszy do nauki, zrozumienia i zapamitania.
9. Strona | 81 Wstp Odkd poznaem jzyk C, byem oczarowany jego
moliwociami, prostot i logik programowania. Obecnie zauwaam
specyficzne podejcie wielu osb, ktre po pierwszych prbach
samodzielnej nauki C szybko si zniechcaj z powodu rzekomej duej
trudnoci i zawioci zasad tego jzyka. Tymczasem prawdziwym powodem
jest nierzadko brak literatury opisujcej zasady jzyka C w oparciu o
praktyczne przykady, dziki ktrym mona z marszu rozwizywa du cz
swoich pocztkowo przyziemnych problemw. Rzadko, kiedy ksika na
temat jzyka C, a szczeglnie w aspekcie programowania
mikrokontrolerw AVR, jest pisana dla osb, ktre nie maj jeszcze
adnego dowiadczenia z programowaniem w ogle. Sporo dowiadcze do
napisania tej ksiki zebraem podczas prowadzenia kursw jzyka AVR GCC
dla procesorw AVR. Zatem jednym z celw, do ktrych d w tej ksice,
jest prba przyblienia i zainteresowania tym niezwykle przyjemnym i
atwym jzykiem osb, ktre wanie stoj na rozdrou i musz podj ciki
wybr. W ktr stron pj, aby w efektywny i atwy sposb programowa ca
rodzin mikrokontrolerw AVR Jzyk C czsto traktowany jest jako
narzdzie dla specjalistw a nie amatorw, hobbystw itp. Postaram si,
wic przeama te mity i udowodni, e kady po przeczytaniu tej ksiki
bdzie potrafi napisa samodzielnie przynajmniej proste programy ze
zrozumieniem podstawowych zasad tego jzyka. Poniewa jednak jzyka C
ciko uczy si od strony praktycznej w oderwaniu od sprztu, czyli w
naszym konkretnym przypadku od mikrokontrolerw serii, AVR, dlatego
konieczne bdzie take przyblienie zasad dziaania procesorw tej
rodziny. Wikszo przykadw bdzie odwoywaa si do mikrokontrolerw serii
ATmega, ale postaram si pokaza, e dziki temu, i korzysta bdziemy z
C to zaprogramowanie mikrokontrolerw z serii ATtiny nie bdzie si
praktycznie niczym rnio. Jedyne rnice, jakie wystpi w tym
przypadku, to pewne ograniczenia wynikajce z moliwoci sprztowych.
Dziki powyszym zaoeniom ksika ta skierowana jest do bardzo
szerokiego grona czytelnikw, ktrzy usilnie poszukuj wszelkich
informacji na te tematy. Bd stara si uywa prostego, czasem
potocznego jzyka, aby przybliy bardziej skomplikowane zagadnienia.
Na pierwszy rzut oka struktura ksiki moe wyda si nieco chaotyczna,
gdy nie opisuj w niej po kolei caych zagadnie w oderwaniu od
siebie. Nie znajdzie si tu pierwszej czci, w ktrej bdzie w kilku
kolejnych rozdziaach opisana rodzina mikrokontrolerw AVR. Nie
znajdzie si kolejnej, gdzie bdzie opisany czysty jzyk C i nie
znajdzie nastpnych rozdziaw osobno traktujcych o rodowiskach
programistycznych, o programatorach czy o sposobach wgrywania
programw fizycznie do mikrokontrolera. Przyjem zaoenie, i ksika
bdzie napisana w postaci kursu, jaki zwykle serwuj uczestnikom na
zajciach, gdzie wykady z teorii przeplatane s z praktyk, czyli tzw.
warsztatami, na ktrych pod okiem instruktora kady moe uczy si, pisa
czy testowa wasne programy. Pozwolio mi to na pynne przechodzenie z
tematu na temat tak, aby w jak najprostszy sposb wprowadzi
czytelnika do wiata mikrokontrolerw AVR oraz ich programowania. Moe
wic nie w osobnych dziaach, ale w pewnej logicznej kolejnoci bd
stara si podawa informacje tak, aby jak najszybciej mona byo je
przyswaja. W sposb, ktry sprawdzi si w praktyce. Potraktuj t ksik
jak dobrego przewodnika w trakcie przeprawy przez dungl, jak mog si
wydawa zakresy szczegowej wiedzy z wielu dziedzin elektroniki
cyfrowej i programowania.
10. Strona | 584 PodstawyjzykaC Wreszcie dotarlimy do miejsca,
gdzie bdzie mona pozna wicej informacji na temat samego4.1
Zagadnienia oglne jzyka C. Podobnie jak w przypadku omawiania
podstawowych zagadnie dotyczcych caej rodziny mikrokontrolerw,
teraz bd musia omwi skadni jzyka. W jzyku C stosujemy tzw. wolny
format jeli chodzi o pisanie kodu. Nie obowizuj tu reguy jak w
innych jzykach, gdzie trzeba si ogranicza do pisania rozkazw w
jednej linii. Nie ma tu adnych przymusw. Wszystko, co chcemy
zapisa, moe si znale w kadym miejscu linii, a nawet mona to samo
rozpisa na kilka linijek. Zwizane jest to z tym, e koniec
instrukcji, jak wydajemy, jest okrelony przez rednik, ktry stawiamy
na kocu, a nie przez to, e koczy si linia programu. Wewntrz
instrukcji moe znajdowa si dowolna ilo tzw. biaych znakw, do ktrych
zaliczamy spacje czy tabulatory. S one ignorowane przez kompilator.
Z tego wzgldu nie ma rnicy w tym, jak zapiszemy ponisz lini - moemy
to zrobi tak: int main(void) {return 0;} lub tak: int main(void) {
// od tego miejsca zaczyna si start programu. /* komentarze */
return 0 ; // koniec programu }4.1.1 Komentarze Biae znaki s
ignorowane przez kompilator, su one jedynie programicie. Syszae
zapewne przy okazji pisania kodw programu o tzw. wciciach. Dobrze
napisany kod jest wtedy, gdy ma stosowane wcicia. Bez nich kod
staje si mao czytelny i bardzo ciko wrci do jego analizy po duszym
czasie. Zauwaye powyej w jednym z przykadw dwie charakterystyczne
linie, w ktrych wida tzw. komentarze. To opisy, ktre mona wstawi do
kodu w celu zwikszenia czytelnoci programowanych zagadnie. Jeli w
dowolnym miejscu linii kompilator napotka dwa znaki // nastpujce po
sobie, to ignoruje wszystkie kolejne a do koca tej linii. Inna
forma do oznaczania caego bloku linii, w ktrych chcemy umieci
opisy, moe by zawarta pomidzy dwoma znacznikami, gdzie jeden
rozpoczyna blok /* natomiast drugi */ koczy taki blok. Zapamitaj, e
komentarze w jzyku C s bardzo istotnym elementem. Program napisany
bez adnych komentarzy czy krtkich chocia objanie, nie jest napisany
w dobrym stylu programistycznym. Stosuj komentarze zawsze, gdy
przygotowujesz skomplikowane procedury, funkcje czy obliczenia tak,
aby stanowio to uatwienie dla ciebie, gdy po duszym czasie wrcisz
do analizy kodu. Komentarze take s istotne dla innych osb, ktre bd
miay moliwo zapoznania si z kodem rdowym twojego programu.
11. Strona | 594.1.2 Definicja a DeKlaracja Zapamitaj rnice
pomidzy deklaracj a definicj, ebymy pniej dobrze si rozumieli. Brak
zrozumienia tego zagadnienia na samym pocztku prowadzi do wielu
nieporozumie, bywa take powodem rzekomych trudnoci w nauce jzyka C.
1. Deklaracja okrela pewne wasnoci identyfikatora (zmiennej czy
funkcji), jednak nie rezerwuje pamici. 2. Definicja zajmuje pami
dla nowego obiektu i jednoczenie go deklaruje. Wynika z powyszego,
e definicja jest rwnoczenie deklaracj, ale nigdy na odwrt. Przykady
Deklaracji: extern int a1; extern uint8_t tab[]; int max(int a, int
b); 1. Informuje kompilator, e identyfikator a1 oznacza zmienn typu
int. Jednoczenie swko extern oznacza, e zmienna ta jest tworzona
poza aktualnym plikiem rdowym. 2. Informuje kompilator, e
identyfikator tab jest tablic elementw jedno-bajtowych bez znaku.
3. Informuje kompilator, e identyfikator max jest funkcj zwracajc
warto typu int, oraz przyjmujc dwa argumenty typu int. Przykady
Definicji: int b1; int c2 = 5; uint16_t tab[20]; int max(int a, int
b) { return (a>b) ? a : b; } 1. Tworzy zmienn b1, zajmuje dla
niej pami (w jzyku AVR GCC) bd to dwa bajty, oraz informuje
kompilator, e identyfikator b1 oznacza zmienn typu int. 2. Tworzy
zmienn c2, zajmuje dla niej pami, zostaje ona zainicjalizowana
wartoci 5, oraz informuje kompilator, e c2 oznacza zmienn typu int.
3. Tworzy tablic tab, zajmuje dla niej pami 40 bajtw oraz informuje
kompilator, e identyfikator tab jest tablic dwubajtowych elementw
bez znaku. 4. Tworzy funkcj max, zajmuje dla niej pami lecz tym
razem w obszarze pamici programu FLASH, umieszcza w niej program
funkcji, oraz informuje kompilator, e funkcja max jest funkcj
zwracajc warto typu int a take o tym, e przyjmuje ona dwa argumenty
take o typie int. Nazwy zmiennych i funkcji mona tworzy dowolnie,
ale z pewnymi ograniczeniami: nie mog one by nazwami sw kluczowych
uywanych przez kompilator oraz nie mog zaczyna si od cyfry. Nazwy
mog by pisane zarwno wielkimi jak i maymi literami, jednak trzeba o
tym pamita, poniewa jeli zdefiniujemy zmienn o nazwie Rozmiar
(zaczyna si du liter), to pniej w kodzie kompilator nie rozpozna
tej nazwy, jeli napiszesz j tak: rozmiar.
12. Strona | 604.1.3 Wyraenia logiczne (Warunki) W jzyku C
wystpuje wiele instrukcji sterujcych programem (poznasz je w
kolejnym rozdziale), ktre podejmuj decyzje o wykonaniu lub
niewykonaniu pewnych zada w zalenoci od spenienia lub niespenienia
jakiego warunku. Dokadniej mwic w zalenoci od tego, czy jakie
wyraenie jest prawdziwe, czy faszywe. Najpierw jednak musisz si
dowiedzie, co to jest prawda i fasz w jzyku C. Poniej kilka
przykadw wyrae logicznych: 1. ( x < 50 ) 2. ( x == a ) 3. ( x !=
a ) Nie znajc wartoci zmiennych x lub a nie jestemy w stanie oceni
czy te wyraenia s prawdziwe czy faszywe. Jeeli jednak powiem, tobie
teraz, e x=7 natomiast a=10, to jeste w stanie szybko stwierdzi, e:
1. Wyraenie jest prawdziwe poniewa 7 jest mniejsze od 50 2.
Wyraenie jest faszywe poniewa 7 nie rwna si 10 3. Wyraenie jest
prawdziwe poniewa 7 jest rne od 10 Zaraz, zaraz ale skd bdzie o tym
wiedzia mikrokontroler. Okazuje si, e to nie bdzie dla niego adnym
problemem. Jeli mikrokontroler napotka np. taki warunek ( x < 50
), to najpierw podobnie jak my dokona obliczenia i na tej podstawie
sprawdzi, czy jest on prawdziwy, czy faszywy. Zmienna x przecie
musiaa by gdzie wczeniej zdefiniowana w programie, std bdzie znana
jej warto w momencie, gdy dojdzie do sprawdzania warunku.
ZAPAMITAJ! Warto zero jest zawsze rozumiana, jako stan: fasz Warto
inna ni zero jest zawsze rozumiana, jako stan: prawda Dziki temu w
wyniku operacji a=(5