Mikrokontrolery avr język c podstawy programowania

download Mikrokontrolery avr język c podstawy programowania

If you can't read please download the document

description

 

Transcript of Mikrokontrolery avr język c podstawy programowania

  • 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.
  • 4. Spis treci Strona | 3Przedmowa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 Wstp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2.1 Pierwszy pusty program w C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 Zaczynamy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 2.2 Od programu do procesora . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.2.1 Kompilacja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.2.2 rodowisko . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 2.2.3 Programatorsprztowy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 2.2.4 Programowanieprocesora . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 2.2.5 UruchamiamyAVRStudio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 2.2.6 Platformasprztowa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 3.1 Informacje oglne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253 ProcesoryAVR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 3.2 Programowanie ISP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 3.3 Sposoby taktowania procesorw . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 3.3.1 Wewntrznyoscylator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 3.3.2 Zewntrznyrezonatorkwarcowy . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 3.3.3 ZewntrznyoscylatorRC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 3.4 Zagadnienia zwizane z zasilaniem . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 3.3.4 Zewntrznygenerator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 3.5 Ukad resetu mikrokontrolera AVR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 3.6 Wewntrzne moduy procesorw AVR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 3.6.1 PamiFLASH,RAM,EEPROM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 3.6.2 Przerwania . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 3.6.3 Timerysprztowe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 3.6.3.1 PodstawowetrybypracyTimerw . . . . . . . . . . . . . . . . . . . 42 3.6.3.1.1 TrybzwykegoLICZNIKA . . . . . . . . . . . . . . . . . . . . 42 3.6.3.1.2 TrybCTCjedenznajwaniejszych . . . . . . . . . . 44 3.6.3.1.3 TrybPWM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 3.6.4 PrzetwornikADC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 3.6.5 Modukomparatoraanalogowego . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 3.6.6 ModuUART/USART,(czyliRS232) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 3.6.7 ModuSPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 3.6.8 ModuTWI,(czyliI2C) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 3.6.9 Watchdog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 3.6.10 Trybyoszczdzaniaenergii . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 3.6.11 FUSEBITS(ustawieniakonfiguracjiAVR) . . . . . . . . . . . . . . . . . . . . . . 54 3.6.12 LOCKBITS(zabezpieczeniaAVR) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
  • 5. Strona | 4 3.6.13 Bootloaderniesamowitemoliwoci . . . . . . . . . . . . . . . . . . . . . . . . 56 4.1 Zagadnienia oglne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 584 PodstawyjzykaC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 4.1.1 Komentarze . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 4.1.2 Definicjaadeklaracja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 4.2 Najwaniejsze instrukcje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 4.1.3 Wyraenialogiczne(warunki) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 4.2.1 InstrukcjawarunkowaIf,else . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 4.2.2 Ptlawhile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 4.2.3 Ptlado..while . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 4.2.4 Ptlafor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 4.2.5 Instrukcjabreak . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 4.2.6 Instrukcjaswitch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 4.2.7 Instrukcjacontinue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 4.2.8 Nawiasyklamrowe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 4.3 Typy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 4.2.9 Instrukcjagoto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 4.3.1 SystematykatypwjzykaC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 4.3.1.1 Typyzoone . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 4.3.1.2 Zakreswidocznocizmiennych . . . . . . . . . . . . . . . . . . . . . . 76 4.3.1.3 Typvoid . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77 4.3.1.4 Specyfikatorconst . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78 4.3.1.5 Specyfikatorvolatile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 4.3.1.6 Specyfikatorregister . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 4.3.1.7 InstrukcjaTypedef . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80 4.3.1.8 Typywyliczenioweenum . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 4.3.2 StaewjzykuC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 4.3.2.1 Staejakoliczbycakowite . . . . . . . . . . . . . . . . . . . . . . . . . 85 4.3.2.2 Staejakoliczbyzmiennoprzecinkowe . . . . . . . . . . . . . . . 86 4.3.2.3 Staeznakowe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 4.4 Operatory . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 4.3.2.4 Staetekstowe,stringi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 4.4.1 Arytmetyczne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 4.4.1.1 Modulo,czyli% . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 4.4.1.2 Inkrementacjaidekrementacja++-- . . . . . . . . . . . . . . . . 91 4.4.1.3 Operatorprzypisania= . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 4.4.2 OperatoryLogiczne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 4.4.2.1 Operatoryrelacji . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 4.4.2.2 Suma||oraziloczyn&&logiczny . . . . . . . . . . . . . . . . . . . . . 94 4.4.2.3 Negacjawykrzyknik! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 4.4.2.4 Operatorybitowe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
  • 6. Strona | 5 4.4.3 Pozostaeoperatoryprzypisania . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 4.4.4 Operatorpobieraniaadresu& . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 4.4.5 Wyraeniewarunkowe?: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 4.4.6 Operatorsizeof() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 4.4.7 Priorytetyoperatorw . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105 4.5 Funkcje *** . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 4.4.8 Operatoryrzutowania . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 4.5.1 Wynikdziaaniafunkcjijaktodziaa? . . . . . . . . . . . . . . . . . . . . . . 110 4.5.2 Stosujarzmianiepotwora . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112 4.5.3 Przekazywanieargumentwprzezwarto . . . . . . . . . . . . . . . . . . . 114 4.5.4 Funkcjetypuinline . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 4.5.5 Zakresywidocznocinazw . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 4.5.5.1 Zakresglobalny . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 4.5.5.2 Zakreslokalnyizmienneautomatyczne . . . . . . . . . . . . . 123 4.5.5.3 Zmienneifunkcjestatyczne . . . . . . . . . . . . . . . . . . . . . . . . . 124 4.6 Preprocesor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 4.5.6 Funkcjewrnychplikachprojektu . . . . . . . . . . . . . . . . . . . . . . . . . . 126 4.6.1 Dyrektywa#define . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 4.6.2 Makrodefinicje . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 4.6.3 Dyrektywa#undef . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 4.6.4 Operator##-sklejanienazw . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 4.6.5 Operatorzamianynastring# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 4.6.6 Dyrektywykompilacjiwarunkowej . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 4.6.7 Dyrektywy#ifdeforaz#ifndef . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 4.6.8 Dyrektywy#erroripozostae . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 4.7 Tablice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141 4.6.9 Dyrektywa#include . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 4.7.1 Tablicewielowymiarowe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144 4.7.2 Tablicajakoargumentfunkcji . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 4.8 Wskaniki . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 4.7.3 Tabliceznakowe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 4.9 Struktury, unie, pola bitowe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 4.9.1 Struktury . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 4.9.2 Unie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167 4.9.3 Poczeniestrukturyzuni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 4.9.4 Polabitowe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 5.1 Przygotowanie procesora do pracy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1735 Warsztatyzajciapraktyczne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173 5.2 Migoczca dioda LED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 5.3 Obsuga klawiszy typu micro-switch . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 5.4 Multipleksowanie LED - przerwania . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
  • 7. Strona | 6 5.5 Wywietlacz LCD (hd44780) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202 5.6 Sterowanie PWM (kolorowa dioda RGB) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223 5.7 Pomiar napicia za pomoc ADC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235 5.7.1 Klawiaturaanalogowa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246 5.8 Komunikacja RS232 / RS485 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257 5.7.2 Rnicowypomiarnapicia-amperomierz . . . . . . . . . . . . . . . . . . . . . 246 5.8.1 Inicjalizacja,kalibracja . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257 5.9 Odczyt-zapis magistrali I2C (RTC, EEPROM) . . . . . . . . . . . . . . . . . . . . . . . . . . . 277 5.8.2 UART,przerwania,buforcykliczny . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266 5.9.1 RTCsprztowaobsugaI2C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278 5.9.2 ProgramowaimplementacjaI2C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285 5.10 Modu SPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291 5.9.3 EEPROMI2C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289 5.10.1 SprztowaobsugaSPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291 5.11 Magistrala 1Wire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299 5.10.2 ProgramowaobsugaSPI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297 5.12 Odbir kodw RC5 w podczerwieni . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307 5.13 Sterowanie silnikami DC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316 5.14 Silnik krokowy unipolarny . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320 5.15 Silnik krokowy bipolarny . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326 5.16 Odczyt/zapis kart pamici SD (FAT) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330 5.16.1 FatFS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333 5.16.2 PetitFS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3486 FuseBityMkAvrCalculator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356 6.16.1 Fusebity,Lockbity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356 6.16.2 MkAvrCalculator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3607 Bootloader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368 8.1 Pilot na podczerwie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3718 Projekty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371 8.2 Modu Bluetooth (BTM-112/222) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379 8.3 ciemniacz pynna regulacja mocy 230V . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384 8.4 Wstp do systemw czasu rzeczywistego . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 395 8.5 Obsuga stosu AVR - TCP/IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417 8.5.1 KartasieciowaethernetENC28J60 . . . . . . . . . . . . . . . . . . . . . . . . . . 419 8.5.2 Serwerhttp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422 8.6 Programator USBASP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 454 8.5.3 SterownikurzdzeprotokUDP . . . . . . . . . . . . . . . . . . . . . . . . . . 4309 rodowiskoECLIPSE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455
  • 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