Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8...

48

Transcript of Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8...

Page 1: Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8 AVR. Ukäady peryferyjne Rejestry dost pu do pami ci RAM .....513 Rejestr adresu

Wszelkie prawa zastrzeżone Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione Wykonywanie kopii metodą kserograficzną fotograficzną a także kopiowanie książki na nośniku filmowym magnetycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji

Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli

Autor oraz Wydawnictwo HELION dołożyli wszelkich starań by zawarte w tej książce informacje były kompletne i rzetelne Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanieani za związane z tym ewentualne naruszenie praw patentowych lub autorskich Autor oraz Wydawnictwo HELION nie ponoszą roacutewnież żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce

Redaktor prowadzący Michał Mrowiec

Projekt okładki Studio Gravite OlsztynObarek Pokoński Pazdrijowski Zaprucki

Fotografia na okładce została wykorzystana za zgodą Shutterstockcom

Wydawnictwo HELION ul Kościuszki 1c 44-100 GLIWICE tel 32 231 22 19 32 230 98 63 e-mail helionhelionpl WWW httphelionpl (księgarnia internetowa katalog książek)

Drogi Czytelniku Jeżeli chcesz ocenić tę książkę zajrzyj pod adres httphelionpluseropinieavrukpMożesz tam wpisać swoje uwagi spostrzeżenia recenzję

Kody źroacutedłowe wybranych przykładoacutew dostępne są pod adresemftpftphelionplprzykladyavrukpzip

ISBN 978-83-246-9225-5

Copyright copy Helion 2014

Printed in Poland

bull Kup książkębull Poleć książkę bull Oceń książkę

bull Księgarnia internetowabull Lubię to raquo Nasza społeczność

Spis tre ci

Wst p 9Sprz t 10Przyk ady 11Skroacutety jednostek 12

Rozdzia 20 Zwalniamy czyli kiedy opoacute nienia s konieczne 13Opoacute nienia i XMEGA 18Wykorzystanie timeroacutew do realizacji opoacute nie 20

Rozdzia 21 czenie kodu C i asemblera 23ABI 25S owo kluczowe asm 27

Typy operandoacutew 29Dost p do portoacutew IO 30Dost p do danych wielobajtowych 31Dost p do wska nikoacutew 32Lista modyfikowanych rejestroacutew 32Wielokrotne u ycie wstawki asemblerowej 33

Pliki S 34Wykorzystanie rejestroacutew w asemblerze 34Dyrektywy asemblera 40Wywo anie funkcji j zyka C z asemblera 41

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 43Obs uga wy wietlaczy alfanumerycznych 45

Funkcje biblioteczne 50Definiowanie w asnych znakoacutew 56

Transakcyjna obs uga LCD 58Optymalizacja 68

Rozdzia 23 Interfejs SPI i USART SPI 71Tryby pracy SPI 74Konfiguracja interfejsu SPI 75Konfiguracja USART w trybie SPI 76Pami ci DataFLASH 77

Organizacja pami ci 77Interfejs SPI pami ci 79Dost p do pami ci 81

Kup książkę Poleć książkę

4 AVR Uk ady peryferyjne

Polecenia 81Rejestr identyfikacyjny pami ci 87Polecenia odczytu pami ci 88Polecenia odczytu i zapisu bufora 89Polecenia transferu pomi dzy pami ci a buforem 91Rejestry specjalne 94

Transakcyjny dost p do SPI 95czymy DMA ze SPI 96

Wywo ania zwrotne (callbacks) 98Transakcje 103

Zasilanie 109

Rozdzia 24 Budujemy system plikoacutew 111Najprostszy system plikoacutew 111

Inicjalizacja pami ci 119System plikoacutew FATFAT32 128

Obs uga FAT 131Prototypy z diskioh 136Demonstracja 139Biblioteka PetitFS 144Konfiguracja PetitFS 149

Rozdzia 25 Jeszcze wi cej pami ci czyli karty SD SDHC i spoacute ka 151Troch o budowie karty 152Tryby pracy karty 153Zasilanie karty 154Komunikacja 156

Tryb pracy SPI 157Format protoko u 157Roacute nice pomi dzy kartami 160Inicjalizacja karty 161

Rejestry specjalne karty 169CID 169CSD 172

Operacje zapisu i odczytu sektoroacutew 173Operacje odczytu 173Operacje zapisu 176

Suma kontrolna 178Program 178

Potencjalne problemy 179FATFS na karcie 180

Rozdzia 26 Debuger 183Konfiguracja debugera 185Konfiguracja projektu do debugowania 186Debuger sprz towy 187Debuger programowy (symulator) 190

Plik stymulacji 191Pu apki 197

Punkty ledzenia 203Pu apki warunkowe 205

Podgl d pami ci 207Podgl d stosu wywo a 209Okre lenie czasu symulacji 209Okno dezasemblera 210

Kup książkę Poleć książkę

Spis tre ci 5

Okno podgl du zmiennych 211a cuchy formatuj ce 212

Makrodefinicja ASSERT 214Przerwania w trakcie debugowania 218_delay_xx i symulator 219

Rozdzia 27 Przetwornik analogowo-cyfrowy 221Przetwornik potokowy vs cykliczny 222Napi cie referencyjne 223Konfiguracja pinu IO 225Multiplekser wej ciowy 226Uk ad wzmacniania sygna u 227Co to jest LSB 228Kalibracja ADC 229Pomiar 231

Rozdzielczo przetwornika 231Tryby pracy przetwornika 231Wynik pomiaru 236Kalibracja offsetu 237Pomiar napi cia zasilania i temperatury mikrokontrolera 239

Redukcja poboru energii 242Preskaler ADC 243Wyzwalanie konwersji z wykorzystaniem systemu zdarze 245

Rejestr EVCTRL w XMEGA z ADC bez potoku 248Rejestr poroacutewnania 249

Termometr LM35 250Budujemy termometr z alarmem 251

Tryb ci g ej konwersji 252Przemiatanie wej 253Przerwania 254Wykorzystanie DMA do transferu wynikoacutew 254Nadproacutebkowanie 258

U rednianie 259Decymacja i interpolacja 259Interpolacja i decymacja w XMEGA 260

Jak zwi kszy precyzj pomiaroacutew 260Budujemy datalogger 261

Termistory jako mierniki temperatury 262Program dataloggera 265

Rozdzia 28 Komparator analogowy 279Komparator mdash troch teorii 279

Czas propagacji 281Histereza 281

Komparatory analogowe XMEGA 282Multipleksery wej cia 283Komparator okienkowy 284Przerwania 286Uruchomienie komparatora 287Rejestr stanu komparatora 287

Komparator jako oscylator 287Termostat z wykorzystaniem komparatoroacutew 290

Termistory 290

Kup książkę Poleć książkę

6 AVR Uk ady peryferyjne

Rozdzia 29 DAC 293Buforowanie wyj cia 294Napi cie referencyjne 295Taktowanie 296Zdarzenia 297Wykorzystanie DMA 298

Proacutebkowanie 8-bitowe 300Tryb dwukana owy 301Generowanie jednocze nie dwoacutech przebiegoacutew 301Wersja oszcz dna 304Inne sposoby wyzwalania konwersji 305

Tryb oszcz dzania energii 306Kalibracja DAC 306

Rozdzia 30 Monochromatyczne wy wietlacze graficzne 309Pod czenie LCD do mikrokontrolera 311Budowa i funkcje kontrolera ST7565R 313Funkcje specjalne kontrolera 319

Inwersja i testowanie obrazu 319Obracanie obrazu 319Regulacja kontrastu 321Numer pierwszej wy wietlanej linii 321

Czcionki 322Ma a optymalizacja 330Podwoacutejne buforowanie 332

Adres pocz tku wy wietlania obrazu 333Menu 335

Menu oparte na piktogramach 342

Rozdzia 31 Pliki z danymi mdash jak je dodawa do projektu 349Kompilacja plikoacutew binarnych 350

czenie plikoacutew obiektowych z projektem 352Dost p do danych binarnych 356

Klasyczny sposoacuteb dost pu do danych 358Dost p do danych z wykorzystaniem przestrzeni adresowych 359

Rozdzia 32 Magistrala pami ci zewn trznej 361Pod czenie pami ci 362

Konfiguracja portoacutew IO 362Przyporz dkowanie sygna oacutew interfejsu EBI do portoacutew IO 363Konfiguracja 4-portowa 364Pami SRAM 366Pami SRAM w trybie LPC 371Pami SDRAM 372

Konfiguracja sygna u CS 377Okre lenie adresu bazowego i wielko ci pami ci 377Uk ad sterowania sygna em wyboru w trybie SRAM 379Uk ad sterowania sygna em wyboru w trybie SDRAM 379

Przyk adowa konfiguracja pami ci SDRAM 381Konfiguracja zegara 383Dost p do pami ci z poziomu j zyka C 384

Dost p do pami ci poni ej granicy 64 kB 384Dost p do pami ci powy ej granicy 64 kB 386

Kup książkę Poleć książkę

Spis tre ci 7

Rozdzia 33 Generowanie obrazu wideo 391Generowanie obrazu wideo w standardzie VGA 393

Wtyczka VGA i konwersja sygna oacutew 396Monochromatyczny tryb tekstowy VGA 397Monochromatyczny tryb graficzny VGA 407

Generowanie sygna u composite 409Standard PAL 410Monochromatyczny tryb tekstowy 413Monochromatyczny tryb graficzny 416Tworzenie nak adek (OSD) 417

Czas na kolor 424Kodowanie koloru 425Konwerter cyfrowo-analogowy 426Generator obrazu composite 426Wykorzystanie EuroSCART 428Kolorowy obraz na TV 430

Rozdzia 34 Niech zagra muzyka 439Formaty plikoacutew d wi kowych 440

Cz stotliwo proacutebkowania 441Format pliku 442

Obroacutebka d wi ku 443Program Audacity 443Program SoX 445

Wzmacniacz 446Odtwarzamy muzyk z wykorzystaniem DAC 447

Inny sposoacuteb na podwoacutejne buforowanie 457Generowanie d wi ku z wykorzystaniem PWM 461

PWM mdash troch teorii 461Filtrowanie sygna u PWM 468Odtwarzamy d wi k za pomoc 8-bitowego PWM 472Rozszerzenie HiRes i PWM o wi kszej rozdzielczo ci 477

Kompresja d wi ku 480Proacutebkowanie nieliniowe 480Kompresja ADPCM 482Kompresja IMA ADPCM 482Nagrywanie mowy z wykorzystaniem kompresji ADPCM 486Algorytm ADPCM firmy Dialogic 492

Rozdzia 35 A mo e mp3 495Koprocesor mp3 496

Sposoby pod czenia do XMEGA 496Dost p do rejestroacutew uk adu 499Format pliku wav 500Rejestry GPIOR 502Testy uk adu 502Podstawowa komunikacja z koprocesorem 504Rejestry uk adu VS1003B 508

Rejestr trybu pracy 508Rejestr stanu uk adu 510Rejestr kontroli basoacutew 510Rejestr SCI_CLOCKF 511Rejestr czasu utworu 512Rejestr formatu audio 512

Kup książkę Poleć książkę

8 AVR Uk ady peryferyjne

Rejestry dost pu do pami ci RAM 513Rejestr adresu wtyczki 513Rejestr kontroli g o no ci 513

Odtwarzamy muzyk 513Odtwarzamy muzyk z wykorzystaniem DMA 518

Magnetofon cyfrowy 528VS100XX w roli magnetofonu 529

W asne wtyczki 535DTMF jako przyk ad w asnej wtyczki 535

Budujemy w asn wtyczk 541Tworzenie tablicy z kodem wynikowym 543Budowa wtyczki 544W asna aplikacja czyli dekoder DTMF 548

Rozdzia 36 Fusebity i lockbity 557Fusebity 558

Fusebit JTAGEN 558Fusebit RSTDISBL 559Fusebit BOOTRST 559Fusebity SUT 559Fusebit TOSCSEL 559Uk ad detekcji awarii zasilania 559Watchdog 560Fusebit EESAVE 561

Lockbity 561Sygnatura produkcyjna procesora 563

Numer serii 563Numer wafra 563Po o enie na wafrze 564Pozosta e bajty konfiguracyjne 564

Sygnatura u ytkownika 565Dost p do danych z poziomu aplikacji u ytkownika 568

Bajty kalibracyjne 569Konfiguracja fuse- i lockbitoacutew w AVR-libc 570

Lockbity w AVR-libc 570Fusebity w AVR-libc 571

Dodatek A Spis rozdzia oacutew ksi ki bdquoAVR Praktyczne projektyrdquo 573

Skorowidz 575

Kup książkę Poleć książkę

Rozdzia 22

Wy wietlacze LCDalfanumeryczne

Z tego rozdzia u dowiesz si

jak pod czy popularne wy wietlacze alfanumeryczne do XMEGA

jak stworzy bibliotek obs uguj c kontroler HD44780

jak przesy a polecenia dla LCD w formie transakcji i jak czy dost pdo kontrolera z aplikacji i funkcji obs ugi przerwa

Ze wzgl du na malej ce ceny zwi kszaj c si dost pno oraz niski poboacuter energiicoraz wi kszym zainteresowaniem ciesz si wy wietlacze LCD W tym rozdzialezostan omoacutewione wy wietlacze alfanumeryczne mdash ze uwagi na ich prostot s ci -gle najcz ciej stosowanymi typami wy wietlaczy W dalszej cz ci ksi ki zostanomoacutewione monochromatyczne wy wietlacze graficzne mdash daj one o wiele wi kszemo liwo ci ale ich sterowanie jest nieco bardziej skomplikowane Ze wzgl du na ko-nieczno przesy ania sporej liczby danych wymagaj tak e szybszego interfejsu -cz cego z mikrokontrolerem St d te zanim przejdziemy do ich praktycznego wyko-rzystania b dziemy musieli bli ej zapozna si z kilkoma uk adami peryferyjnymiXMEGA

Wy wietlacze LCD alfanumeryczne zawieraj zazwyczaj scalone kontrolery st d teprocesor nie steruje bezpo rednio matryc LCD ale komunikuje si z wyspecjalizo-wanym sterownikiem ktoacutery wykonuje jego polecenia Dlatego te wykorzystanie te-go typu wy wietlaczy wymaga znajomo ci typu u ytego w nich sterownika Wy wie-tlacze LCD mog by czone z mikrokontrolerem za pomoc roacute nych magistral mdashnajcz ciej s to magistrale SPI lub roacutewnoleg e (w wersji 4- 8- i 16-bitowej) Samewy wietlacze ze wzgl du na budow i mo liwo ci mo emy podzieli na dwie grupy

Wy wietlacze alfanumeryczne mdash umo liwiaj one wy wietlanie cyfr literi innych symboli Jednak w tym typie nie mamy mo liwo ci sterowaniaposzczegoacutelnymi pikselami

Wy wietlacze graficzne mdash w tym typie mo emy sterowa stanem ka dego piksela

Kup książkę Poleć książkę

44 AVR Uk ady peryferyjne

Aby wy wietlana na LCD zawarto by a widoczna niezb dne jest pod wietlenieKupuj c wy wietlacz musimy zwroacuteci uwag czy jest on wyposa ony w jakie pod-wietlenie (mo na dosta wy wietlacze LCD bez pod wietlenia) Oczywi cie lepiej

jest wybra wy wietlacz ktoacutery ma wbudowane pod wietlenie Samo pod wietleniemo e by wykonane w roacute ny sposoacuteb W starszych modelach spotyka si pod wietle-nie oparte na lampie CCFL (ang Cold Cathode Fluorescent Lamp) Tego typu wy-wietlacze s zwykle wi ksze ci sze ale przede wszystkim wymagaj specjalnej

przetwornicy do sterowania lamp Jej zadaniem jest generowanie wysokiego napi -cia niezb dnego do za wiecenia si lampy a nast pnie utrzymywanie go w granicachzapewniaj cych jej prawid owe dzia anie Wy wietlacze tego typu s wi c k opotliwew u ytkowaniu musimy wyda czasami sporo pieni dzy na odpowiedni przetworni-c a w dodatku trwa o takiej lampy jest kroacutetsza ni diod LED Wyst puj tak eproblemy ze sterowaniem jasno ci pod wietlenia W nowoczesnych wy wietlaczachLCD stosuje si praktycznie wy cznie pod wietlenie za pomoc diod LED Nie wy-magaj one adnych wyrafinowanych przetwornic do zasilania zwykle zadowalajsi napi ciem w granicach 3 ndash 12 V maj te znacznie wi ksz trwa o Jasno citakiego pod wietlenia z atwo ci mo na sterowa wykorzystuj c technik PWMPod wietlenie oparte na diodach LED mo e mie roacute ny kolor mdash bia y oacute ty zielonyniebieski czerwony Kolor mo emy sobie wi c dobra wg w asnych preferencji Naj-nowsze wy wietlacze alfanumeryczne s wykonywane w technologii OLED mdash w tejtechnologii wiec poszczegoacutelne piksele wi c taki wy wietlacz nie wymaga pod-wietlenia Niejako przy okazji zyskujemy znacznie lepsze czasy prze czania pikseli

mdash dla wy wietlaczy LCD szczegoacutelnie w ni szych temperaturach czas prze czaniawynosi kilkadziesi t do kilkuset milisekund co powoduje pojawienie si wyra nychbdquoduchoacutewrdquo i psuje estetyk Wy wietlacze OLED nie maj tej wady Jednak zazwyczajs dro sze

Je eli mo esz staraj si wybiera wy wietlacze LCD z pod wietleniem opartym nadiodach LED lub wykonane w technologii OLED

Kolejn istotn kwesti jest regulacja kontrastu Zwykle graficzne kolorowe LCD z wbu-dowanymi sterownikami automatycznie reguluj kontrast dodatkowo sterownik mazaimplementowane rejestry umo liwiaj ce wy cznie programow zmian kontrastuW przypadku prostszych sterownikoacutew wyst puj cych najcz ciej w wy wietlaczachmonochromatycznych (zaroacutewno alfanumerycznych jak i graficznych) kontrast re-guluje si podaj c odpowiednie napi cie na jeden z pinoacutew wy wietlacza Jest to nie-zwykle istotne gdy bez w a ciwego napi cia reguluj cego kontrast na wy wietlaczunic nie zobaczymy Mo emy w takiej sytuacji odnie b dne wra enie e wy wie-tlacz nie dzia a Z kolei je li kontrast b dzie zbyt du y wszystkie piksele b d w -czone co te mo e sugerowa b dne dzia anie LCD

Jedn z cz stszych przyczyn tego e po prawid owym pod czeniu wy wietlaczaLCD nic na nim nie wida albo wszystkie piksele s w czone jest nieprawid owenapi cie na pinie reguluj cym kontrast

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 45

Obs uga wy wietlaczyalfanumerycznych

Wy wietlacze alfanumeryczne s zbudowane z matryc pikseli zwykle o wielko ci5times8 pikseli pogrupowanych razem W tym typie wy wietlacza mo emy sterowazawarto ci tak utworzonej matrycy znakowej jednak nie ma mo liwo ci sterowaniaposzczegoacutelnymi pikselami Najcz ciej spotykane wy wietlacze tego rodzaju mogwy wietla 1times8 1times16 2times16 2times20 4times16 znakoacutew gdzie pierwszy wymiar okre laliczb wy wietlanych wierszy a drugi liczb znakoacutew w wierszu Poniewa nie steru-jemy poszczegoacutelnymi pikselami do kontrolera wysy amy tylko kod znaku ktoacutery mazosta wy wietlony na danej pozycji Kontroler na podstawie kodu znaku generujeadres do specjalnego obszaru pami ci tzw tablicy znakoacutew w ktoacuterej znajduje si bajtowareprezentacja poszczegoacutelnych pikseli tworz cych znak Dla matrycy 5times8 ma ona 40bitoacutew Tablica ta jest umieszczona w pami ci ROM kontrolera LCD nie mo emy jejwi c zmienia Zwykle jednak kontrolery udost pniaj mo liwo definicji kilku w a-snych znakoacutew dzi ki czemu mo emy zdefiniowa np znaki charakterystyczne dla j -zyka polskiego Takie podej cie do generowania obrazu ma podstawow zalet jakjest prostota i zwi zane z tym niewielkie zapotrzebowanie na pami RAM Do prze-chowania np zawarto ci 8-znakowego wy wietlacza LCD wystarczy zaledwie 8 bajtoacutewpami ci Ma to szczegoacutelne znaczenie w prostych mikrokontrolerach z niewielk ilo-ci pami ci RAM Najpopularniejszym kontrolerem stosowanym w wy wietlaczach

alfanumerycznych jest HD44780 nawet je li w posiadanym wy wietlaczu jest innykontroler to mamy du szans e jest on z nim kompatybilny Typowy rozk ad sy-gna oacutew modu oacutew opartych na tym kontrolerze pokazano w tabeli 221

Tabela 221 Typowy uk ad wyprowadze modu oacutew alfanumerycznych LCD opartych na kontrolerzeHD44780

Pin Nazwa Funkcja

1 GND Masa 2 Vcc Zasilanie (typowo 5 V) 3 Vee Regulacja kontrastu 4 RS Zapis polecenia 5 RW Strob odczytzapis 6 E Wyboacuter uk adu 7 D0 Bit danych 0 8 D1 Bit danych 1 9 D2 Bit danych 210 D3 Bit danych 311 D4 Bit danych 412 D5 Bit danych 513 D6 Bit danych 614 D7 Bit danych 715 A Pod wietlenie mdash anoda16 K Pod wietlenie mdash katoda

Kup książkę Poleć książkę

46 AVR Uk ady peryferyjne

Przed pod czeniem modu u zawsze upewnij si czy podany rozk ad odpowiadau ytemu modu owi W szczegoacutelno ci sprawd rozmieszczenie linii zasilaj cych Ichniew a ciwe pod czenie grozi uszkodzeniem modu u

Zwykle piny 15 i 16 steruj ce pod wietleniem s umieszczone osobno lub te przedpinem 1 St d te zawsze nale y je dok adnie zidentyfikowa przed pod czeniem mo-du u Do pinoacutew tych nale y pod czy napi cie wykorzystane do pod wietlenia modu uPrzy czone napi cie zale y od typu zastosowanego pod wietlenia mdash CCFL foliielektroluminescencyjnej lub diod LED W dalszej cz ci b dziemy zajmowa si modu-em z pod wietleniem LED W nocie katalogowej ka dego modu u znajduj si szcze-

goacute owe informacje dotycz ce zasilania pod wietlenia Zwykle w tym celu wymaganejest napi cie 5 V a nat enie pr du pod wietlenia wynosi 20 ndash 50 mA

Wy wietlacze LCD alfanumeryczne s dost pne w handlu w wersjach dostosowanychdo roacute nych napi zasilaj cych Typowo jest to napi cie 5 V co stwarza pewne pro-blemy przy pod czeniu takiego LCD do procesoroacutew rodziny XMEGA S one zasi-lane maksymalnym napi ciem 36 V nie ma wi c mo liwo ci aby LCD i procesordzia a y w tych samych domenach napi ciowych W efekcie przy po czeniu obu uk a-doacutew musimy zastosowa konwersj napi Poniewa LCD alfanumeryczny z perspek-tywy procesora jest urz dzeniem bardzo wolnym ca kowicie wystarczaj cym rozwi za-niem jest zastosowanie szeregowych rezystoroacutew ktoacutere wraz z wbudowanymi w procesordiodami zabezpieczaj cymi b d stanowi y uk ad obni aj cy napi cie na magistralikomunikacyjnej z 5 V do bezpiecznego dla wej cia XMEGA napi cia Z drugiej stronyjedynka logiczna generowana przez procesor zasilany napi ciem 33 V jest poprawnierozpoznawana przez LCD pracuj cy z napi ciem 5 V Je li procesor by by zasilanybardzo niskim napi ciem (rz du 18 ndash 28 V) wymagany by by bardziej skompliko-wany konwerter co zosta o szerzej omoacutewione w rozdziale 7 ksi ki AVR Praktyczneprojekty

Wy wietlacze LCD wymagaj pod wietlenia bez tego wy wietlana zawarto jestpraktycznie nieczytelna W starszych konstrukcjach wykorzystywano pod wietleniew oparciu o lampy fluorescencyjne lub folie elektroluminescencyjne jednak obecniedominuj cym typem jest pod wietlenie za pomoc diod LED

Poniewa zasilamy diod LED wymagane jest do czenie szeregowego rezystoraCzasami taki rezystor jest wbudowany w modu LCD

Pod wietlenie tego typu zu ywa spor ilo energii Innym rozwi zaniem jest kupnowy wietlacza wykonanego w technologii OLED (ang Organic Light-Emitting Diode)Wy wietlacze tego typu cechuj si zdecydowanie lepszym kontrastem ale tak e wi k-sz szybko ci prze czania w zwi zku z czym mo na za ich pomoc uzyska o wielelepsze efekty animacji ktoacutere s praktycznie nieosi galne dla klasycznych wy wietlaczyLCD Nie maj one tak e innej wady LCD mdash zale no ci szybko ci prze czania seg-mentoacutew od temperatury

Wy wietlacze OLED nie maj wyprowadzonych pinoacutew odpowiedzialnych za pod-wietlenie mdash po prostu go nie wymagaj

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 47

Kolejn istotn kwesti jest pod czenie w a ciwego napi cia reguluj cego kontrastwy wietlacza Dla wi kszo ci modu oacutew LCD mie ci si ono w przedziale GND ndash Vcca dla modu oacutew o rozszerzonym zakresie temperatury w przedziale od ndash7 do 0 V mdashrysunek 221

Rysunek 221Pod czenie napi ciareguluj cego kontrasta) modu y klasyczneb) modu y o rozszerzonymzakresie temperatur

Napi cie ujemne mo na uzyska z prostej pompy adunkowej sterowanej przebiegiemPWM z procesora Poboacuter pr du z tego wej cia jest znikomo ma y Alternatywniemo na u y uk adu ICL7660 ktoacutery mo e generowa napi cia ujemne

Kolejn decyzj jak musimy podj jest sposoacuteb pod czenia modu u LCD z mikro-kontrolerem Mamy do wyboru dwie opcje mdash albo pod czamy wszystkie 8 linii da-nych (D0 ndash D7) albo tylko 4 najstarsze (D4 ndash D7) Pod czaj c tylko 4 linie danychzmniejszamy liczb niezb dnych po cze modu u z mikrokontrolerem oraz liczbwykorzystanych linii IO Ze wzgl du na znikom ilo danych przesy anych zdo mo-du u wynikaj ce z pod czenia tylko 4 linii danych spowolnienie transmisji jest bezznaczenia W trybie 4-bitowym najpierw transferowana jest starsza a potem m od-sza tetrada Niewykorzystane linie D0 ndash D3 mo na pozostawi niepod czone wi k-szo modu oacutew wewn trznie podci ga niepod czone linie poprzez rezystor do Vcc

Poniewa linie D0 ndash D7 s dwukierunkowe musimy pami ta aby podczas operacjiodczytu z LCD odpowiednie piny mikrokontrolera by y ustawione jako wej cia W prze-ciwnym przypadku dojdzie do konfliktu

Kolejnym sygna em co do ktoacuterego musimy podj decyzj jest sygna RW okre laj cytyp operacji (odczytzapis) Poniewa zwykle zapisujemy dane do LCD w a ciwie niezachodzi konieczno ich odczytywania mo emy ten sygna na sta e po czy z mas oszcz dzaj c w ten sposoacuteb jedn lini IO procesora Takie rozwi zanie ma jednak po-wa n wad mdash po jego zastosowaniu nie jest mo liwe odczytywanie sygna u zaj to cimodu u (ang busy flag) Powoduje to e pomi dzy kolejnymi zapisami do modu u mu-simy stosowa opoacute nienia dobrane na najwolniejsz mo liw okoliczno W efekcieca a transmisja jest wolniejsza ni mog aby by

Je li korzystamy z tych modu oacutew nie musimy pisa w asnych procedur ich obs ugiInstaluj c rodowisko WinAVR (lub nowy toolchain firmy Atmel) w katalogu docavr-libcexamplessdtiodemo znajdziemy gotowe funkcje obs ugi HD44780 Funkcjete nie dzia aj z mikrokontrolerami XMEGA st d te w za czonych przyk adach zosta-y one zmodyfikowane tak aby poprawnie wspoacute pracowa roacutewnie z tymi mikro-kontrolerami

Kup książkę Poleć książkę

48 AVR Uk ady peryferyjne

Mo emy te skorzysta z licznych przyk adoacutew dost pnych w internecie W dalszejcz ci rozdzia u zostan wykorzystane funkcje z pakietu WinAVR napisane przezJoerga Wunscha Pokazane przyk ady zak adaj e wy wietlacz jest po czonyz mikrokontrolerem tak jak na rysunku 222

Rysunek 222 Po czenie LCD z mikrokontrolerem Na goacuterze pod czenie do mikrokontroleraXMEGA na dole pod czenie do modu u Xplained Na schematach pokazano tak e opcjonalne sposobypod czenia pinu Vee odpowiedzialnego za regulacj kontrastu LCD

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 49

Zanim co wy wietlimy na LCD musimy pozna w jaki sposoacuteb s generowane znakiSterownik LCD zawiera w sobie niezale nie od typu u ytej matrycy 80 bajtoacutew pami ciDDRAM (ang Display Data RAM) Je li zastosowana matryca wy wietla mniejszliczb znakoacutew to cz komoacuterek pami ci jest nieu ywana Mo emy je wykorzystado innych celoacutew mdash np jako zwyk pami RAM Mo emy te u y jej do przesu-wania napisoacutew ktoacutere nie mieszcz si na wy wietlaczu Aby mo na by o umie ciznak na w a ciwej pozycji niezb dne jest poznanie organizacji pami ci kontrolera W za-le no ci od u ytej matrycy pami ta jest zorganizowana nast puj co

Dla matryc 16times1 mdash pami jest podzielona na dwa obszary ka dy zawieraj cypo 8 znakoacutew Obszar pierwszy (od lewej) ma adresy 0x00 do 0x07 a obszar drugi(prawy) adresy 0x40 do 0x47 St d te gdy wy wietla si tekst przekraczaj cygranic obszaroacutew nale y zadba aby poszczegoacutelne litery trafi y pod w a ciweadresy

Dla matryc 20times1 mdash adresy 0x00 do 0x13

Dla matryc 16times2 mdash adres pierwszej linii zaczyna si od 0x00 do 0x0f adresdrugiej linii od 0x40 do 0x4f

Dla matryc 20times2 mdash adresy pierwszej linii to 0x00 do 0x13 a drugiej 0x40 do 0x53

Dla matryc 40times2 mdash adresy pierwszej linii to 0x00 do 0x27 drugiej linii 0x40do 0x67

Dla matryc 20times4 mdash adresy pierwszej linii to 0x00 do 0x13 drugiej 0x40 do 0x53trzeciej 0x14 do 0x27 a czwartej 0x54 do 0x67

Jak wida w niektoacuterych typach wy wietlaczy po ka dej linii zostaje od kilku do kil-kunastu bajtoacutew ktoacuterych zawarto nie jest wy wietlana Ma to pewn zalet mdash mo-emy do pami ci modu u wpisywa teksty d u sze ni s wy wietlane na ekranie co

u atwia przewijanie tekstu Niestety ma to te pewn wad mdash funkcje wy wietlaj ceco na ekranie musz bdquowiedzie rdquo jak organizacj ma matryca W przeciwnym przy-padku nie ma mo liwo ci prawid owego wyliczenia adresu komoacuterki do ktoacuterej ma od-by si zapis

W dalszej cz ci rozdzia u zostanie wykorzystany modu LCD o organizacji 16times2(ale mo na te bez problemu wykorzysta dowolny inny)

Zanim b dzie mo na co wy wietli na ekranie modu musi zosta zainicjalizowanyW trakcie inicjalizacji ustawiane s podstawowe parametry pracy sterownika LCD mdashorganizacja matrycy (liczba linii) wielko czcionki (5times8 lub 8times11 pikseli) Wielkoczcionki zale y od typu pod czonej matrycy LCD Dla konkretnego modu u LCDtylko jedna z tych warto ci b dzie poprawna Oproacutecz inicjalizacji modu u nale y tak-e poprawnie ustawi stan pinoacutew IO wykorzystywanych do pod czenia modu u LCD

Wi kszo pracy zwi zanej z inicjalizacj modu u LCD odbieraniem i wysy aniemdo niego danych wykonuje biblioteka Joerga Wunscha Dostarcza ona niskopozio-mowe funkcje umo liwiaj ce komunikacj ze sterownikiem hd44780 i innymi kom-patybilnymi z nim sterownikami Wystarczy e do aplikacji w ktoacuterej planujemy wy-korzysta taki modu do czymy plik hd44780c oraz plik nag oacutewkowy hd44780h

Kup książkę Poleć książkę

50 AVR Uk ady peryferyjne

Oba pliki bdquozak adaj rdquo e istnieje plik nag oacutewkowy definesh zawieraj cy podstawo-we definicje zwi zane ze sposobem pod czenia modu u LCD z mikrokontroleremNa pocz tku nale y okre li ktoacutere linie IO zosta y wykorzystane do pod czenia modu u

define HD44780_RS A 4define HD44780_RW A 5define HD44780_E A 6define HD44780_D4 A 0

W powy szym przyk adzie do kolejnych linii portu A (A4 ndash A6) zosta y pod czonesygna y RS RW i E modu u natomiast do linii A0 ndash A3 linie D4 ndash D7 modu u LCD Wa nejest aby linie danych czy z pinami IO w kolejno ci rosn cej Biblioteka wykorzy-stuje do transmisji danych pomi dzy modu em a mikrokontrolerem tylko 4 linie danychmdash dzi ki temu mo emy zmniejszy liczb po cze a zwolnione linie IO wykorzystado innych celoacutew W pliku wyst puje jeszcze jedna definicja

define USE_BUSY_BIT 1

Okre la ona e biblioteka b dzie u ywa flagi Busy modu u LCD mdash umo liwia touzyskanie optymalnej szybko ci wspoacute dzia ania z modu em Zako czenie realizacjibie cej operacji modu sygnalizuje zmian stanu tej flagi co umo liwia niezw ocznewys anie kolejnej komendy Je li nie u ywamy flagi Busy program musi generowamaksymalne zalecane w nocie katalogowej opoacute nienia w efekcie ca a transmisja zwal-nia Po zdefiniowaniu u ywanych pinoacutew w pliku definesh mo emy rozpocz korzy-stanie z biblioteki

W pliku hd44780h s udost pnione prototypy funkcji odpowiedzialnych za wspoacute -prac z modu em LCD

Funkcje bibliotecznePodstaw modu u stanowi dwie funkcje umo liwiaj ce odpowiednio wys anie da-nych do modu u oraz ich odczytanie

void hd44780_outbyte(uint8_t b uint8_t rs)uint8_t hd44780_inbyte(uint8_t rs)

Obie funkcje wysy aj odczytuj 8-bitow dan w przypadku wykorzystania tylko4-bitowej szyny danych wysy anie i odczytywanie danych odbywa si w dwoacutech etapachDodatkowo zmienna rs okre la tryb dost pu W przypadku wysy ania danych do modu urs = 0 powoduje e dane zostan wys ane do rejestru komend a je li rs = 1 dane trafido rejestru danych Przy odczycie jest podobnie z tym e dla rs = 0 jest odczytywanaflaga Busy i rejestr AC (ang Address Counter)

Kolejna funkcja odpowiada za oczekiwanie na gotowo modu uvoid hd44780_wait_ready(bool islong)

W przypadku gdy w pliku definesh symbol USE_BUSY_FLAG ma warto 1 parametrislong jest ignorowany a optymalizator kompilatora usuwa go gdy nie jest on wy-korzystywany przez funkcj Kiedy warto USE_BUSY_FLAG jest roacute na od 1 parametr

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 51

ten okre la d ugo opoacute nienia Je li jest roacute na od 0 opoacute nienie wynosi 152 ms a je-eli jest roacutewna 0 opoacute nienie wynosi 37 s Poniewa lepiej jest u ywa flagi Busy

mo emy ten parametr ignorowa

Powy sze trzy funkcje wystarcz do komunikacji z modu em dla wygody zdefiniowanojednak kolejne Funkcje hd44780_outcmd(n) i hd44780_incmd() umo liwiaj odpowiedniowys anie polecenia do rejestru komend kontrolera lub odczytanie bitu Busy i licznikaAC Dwie kolejne mdash hd44780_outdata(n) oraz hd44780_indata() mdash umo liwiaj zapisi odczytanie rejestru danych

Oproacutecz funkcji odpowiedzialnych za komunikacj z modu em LCD zdefiniowano tak efunkcj przeprowadzaj c podstawow inicjalizacj modu u hd44780_init(void) orazfunkcj hd44780_powerdown(void) ustawiaj c wszystkie linie u yte do komunikacjiw stan 0 co umo liwia bezpieczne od czenie zasilania od modu u LCD W przypadkupozostawienia ktoacuterej z wy ej wymienionych linii w stanie 1 przy od czonym za-silaniu modu u stanowi ona jego zasilanie W efekcie mimo wy czenia modu mo epobiera znaczny pr d

Szerszego omoacutewienia wymaga funkcja hd44780_outcmd(cmd) ktoacutera umo liwia wys a-nie polecenia do rejestru polece sterownika LCD Dla wygody zdefiniowane zosta yroacute ne komendy u atwiaj ce wspoacute prac z modu em LCD Komendy te s przekazy-wane jako argument wywo ania funkcji hd44780_outcmd np

hd44780_outcmd(HD44780_CLR)

powoduje wys anie do sterownika polecenia HD44780_CLR czyszcz cego zawartopami ci DDRAM kontrolera

KomendyFunkcja hd44780_outcmd przyjmuje jako argument predefiniowane makrodefinicjeznacznie u atwiaj ce wspoacute prac z kontrolerem modu u LCD Poni ej zostan onepokroacutetce omoacutewione

HD44780_SHIFT(shift right)Ta makrodefinicja powoduje przesuni cie pozycji wy wietlanego tekstu (shift = 1)o jedn pozycj w lewo (argument right = 0) lub w prawo (argument right = 1)W przypadku gdy shift = 0 przesuwany w lewo lub prawo jest tylko kursor Wysy-aj c wielokrotnie to polecenie uzyskujemy kolejne przesuni cia o jedn pozycj

w lewo lub prawo Polecenie to s u y g oacutewnie do przesuwania tekstu Jednak ze wzgl duna du bezw adno tekstowych modu oacutew LCD nie nale y przesuwa liter cz ciej niok raz na sekund mdash cz stsze przesuwanie daje bardzo nieprzyjemne efekty wizual-ne Ka dy bufor linii jest bdquozawijanyrdquo to znaczy e po ostatnim znaku z prawej jestwy wietlany pierwszy znak z lewej i odwrotnie Nale y pami ta e d ugo buforajest sta a dla danego modelu matrycy Np dla modu oacutew 16times2 bufor jednej linii wyno-si dok adnie 40 bajtoacutew z czego 16 jest jednorazowo wy wietlanych Poni szy kodcyklicznie przewija wy wietlany tekst w lewo

lcd_puttext_P(PSTR(Test bufora i przewijania tekstunTen tekst przewija sie w lewo))while(1)

Kup książkę Poleć książkę

52 AVR Uk ady peryferyjne

hd44780_outcmd(HD44780_SHIFT(10)) _delay_ms(700)

HD44780_FNSET(if8bit twoline font5x10)Polecenie to wybiera typ interfejsu mdash 8-bitowy je li warto parametru if8bit jestroacutewna 1 lub 4-bitowy je li jest roacutewna 0 Typ interfejsu musi odpowiada sposobowipo czenia modu u z mikrokontrolerem Parametr twoline okre la czy pod czonamatryca LCD ma jedn lini znakoacutew czy dwie Matryce ktoacutere maj 4 linie tekstu straktowane przez kontroler jako matryce dwuliniowe mdash parametr twoline powinienmie warto 1 Je li dla matrycy zawieraj cej dwie lub wi cej linii ustawimy go na 0to wy wietlana b dzie tylko jedna linia (w przypadku matryc dwuliniowych goacuterna)a w przypadku matryc 4-liniowych b d wy wietlane dwie linie rozdzielone lini pust

Ostatni parametr okre la typ u ywanego generatora znakoacutew Powinien on odpowiadau ytej w module matrycy zwykle wi c jego warto wynosi 0

HD44780_DISPCTL(disp cursor blink)Ustawia roacute ne parametry pracy matrycy Je li parametr disp ma warto 1 to matrycajest w czona (wy wietla zawarto DDRAM) a je li 0 to matryca jest wy czonalecz stan pami ci DDRAM nie ulega zmianie Np kod

while(1) hd44780_outcmd(HD44780_DISPCTL(011)) _delay_ms(700) hd44780_outcmd(HD44780_DISPCTL(111)) _delay_ms(700)

powoduje naprzemienne w czanie i wy czanie matrycy w efekcie wy wietlany tekstmruga

Parametr cursor okre la czy sprz towo wy wietlany kursor ma by widoczny (war-to parametru 1) czy niewidoczny (warto parametru 0) Je li kursor jest widocznyto dodatkowo mo emy okre li czy ma miga (warto parametru blink roacutewna 1)czy nie (blink = 0) Je li kursor jest widoczny i nie miga jest wy wietlany w postacipoziomej kreski Wy wietlanie kursora mo e by u yteczne w sytuacji kiedy u yt-kownik wprowadza jakie dane W pozosta ych sytuacjach kursor mo emy wy czy

HD44780_ENTMODE(inc shift)Okre la sposoacuteb wprowadzania danych do pami ci Je li parametr inc ma warto 1 topo ka dej operacji zapisuodczytu adres pami ci jest automatycznie zwi kszany o je-den co przy piesza operacj zapisuodczytu kolejnych znakoacutew Je li warto inc jestroacutewna 0 to adres jest automatycznie zmniejszany o 1 Dodatkowo parametr shiftokre la czy wy wietlany obraz ma by automatycznie przesuwany tak aby wy wie-tla ostatnio wprowadzony znak (shift = 1) lub go nie wy wietla (shift = 0)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 53

HD44780_CLRPowoduje wyczyszczenie (wype nienie znakami o kodzie 32) ca ej zawarto ci pami ciDDRAM Jednocze nie kursor wraca do pozycji pierwszej (pierwsza linia pierwszyznak)

Niewy wietlane bajty pami ci DDRAM tak e s kasowane Je li s one u ywanedo przechowywania zmiennych programu to przed operacj kasowania nale y jeskopiowa w bezpieczne miejsce W przeciwnym przypadku zostan utracone

Wska nik adresu do pami ci DDRAM jest ustawiany na 0 zerowane jest tak e prze-suni cie

HD44780_HOMEPowoduje powroacutet kursora do pozycji pocz tkowej mdash pierwsza linia pierwszy znakWska nik adresu do pami ci DDRAM w efekcie zawiera 0 zerowane jest roacutewnieprzesuni cie wy wietlania znakoacutew w efekcie s one wy wietlane od pozycji 0

HD44780_DDADDR(addr)Ustawia nast pny adres zapisuodczytu w pami ci DDRAM na addr Tylko 7 bitoacutewargumentu addr jest branych pod uwag w zwi zku z czym mo na zaadresowa mak-symalnie 128 bajtoacutew pami ci (z czego sterownik ma tylko 80 pozosta e lokacje snieu ywane)

HD44780_CGADDR(addr)Ustawia nast pn operacj odczytuzapisu w pami ci CGRAM na addr Pod uwagbranych jest tylko 6 bitoacutew zmiennej addr w efekcie mo na zaadresowa maksymalnie64 bajty pami ci CGRAM

Przedstawione powy ej funkcje zapewniaj jedynie podstawow komunikacj z mo-du em LCD Potrzebujemy jednak ci gle funkcji odpowiedzialnej za jego inicjalizacjmdash funkcja biblioteczna przeprowadza ten proces tylko w podstawowym zakresie musi-my jeszcze zadba o w a ciwe ustawienie parametroacutew zwi zane z posiadan matryc Napiszmy wi c w asne rozwini cie funkcji inicjalizacyjnej

void lcd_init() hd44780_init() Podstawowa inicjalizacja modu u hd44780_outcmd(HD44780_CLR) Wyczy pami DDRAM hd44780_wait_ready(1000) hd44780_outcmd(HD44780_ENTMODE(1 0)) Tryb autoinkrementacji AC hd44780_wait_ready(1000) hd44780_outcmd(HD44780_DISPCTL(1 0 0)) W cz wy wietlacz wy cz kursor hd44780_wait_ready(1000)

Zauwa e po wys aniu ka dego polecenia do modu u jest wywo ywana funkcjahd44780_wait_ready(1000) odpowiedzialna za oczekiwanie a realizacja wys anego po-lecenia dobiegnie ko ca Jest to niezb dne gdy do czasu uko czenia bie cej

Kup książkę Poleć książkę

54 AVR Uk ady peryferyjne

operacji dalsze polecenia s ignorowane Jako argument podany jest parametr 1000mdash jest on bez znaczenia nasza biblioteka korzysta z flagi Busy i po prostu go ignorujePo wykonaniu powy szej funkcji modu LCD jest poprawnie zainicjalizowany a jegopami jest wyczyszczona (zawiera bajty 0x20) i w efekcie modu nic nie wy wietlaOd tej chwili mo emy wysy a znaki do wy wietlenia

Po wykonaniu inicjalizacji ekran mo e pozosta czysty lub wy wietla ca kowiciewype nione kwadraty (wszystkie piksele w czone) Je li po inicjalizacji wszystkiepiksele s w czone nale y nieco zmniejszy kontrast

Aby sobie u atwi to zadanie zdefiniujmy funkcj wysy aj c do modu u jeden znakvoid lcd_putchar(char c) static bool second_nl_seen static uint8_t line=0

if ((second_nl_seen) ampamp (c = n)ampamp(line==0)) Odebrano pierwszy znak hd44780_wait_ready(40) hd44780_outcmd(HD44780_CLR) hd44780_wait_ready(1600) second_nl_seen=false if (c == n) if (line==0) line++ hd44780_outcmd(HD44780_DDADDR(64)) Adres pierwszego znaku drugiej linii hd44780_wait_ready(1000) else second_nl_seen=true line=0 else hd44780_outdata(c) hd44780_wait_ready(40)

Funkcja ta ze wzgl du na skomplikowane adresowanie pami ci DDRAM jest zale naod konkretnego modelu modu u LCD B dzie prawid owo wspoacute pracowa z modu a-mi 2times16 2times20 i 2times40 znakoacutew W przypadku innych modu oacutew pozycje niektoacuterychznakoacutew mog by nieprawid owe

Mo emy ju wy wietla na LCD pojedyncze znaki czas na wy wietlanie tekstu Po-niewa teksty jako sta e dla zaoszcz dzenia cennej pami ci RAM przechowuje si za-zwyczaj w pami ci FLASH zdefiniujmy funkcj odczytuj c podany a cuch zna-kowy z pami ci FLASH a nast pnie umieszczaj c go na LCD

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 55

void lcd_puttext_P(prog_char txt) char ch while((ch=pgm_read_byte(txt))) lcd_putchar(ch) txt++

Powy sza funkcja wysy a kolejne znaki odczytane z pami ci FLASH na LCD za po-moc funkcji LCD_putchar Po napotkaniu znaku ko ca a cucha (0 nul) przerywa swojedzia anie

Pozostaje nam przetestowa dzia anie przedstawionych funkcjiint main() lcd_init() lcd_puttext_P(PSTR(Test LCDnDruga linia)) while(1)

Na ekranie modu u LCD powinien wy wietli si napisTest LCDDruga linia

Je li na LCD nic nie widzimy to w pierwszej kolejno ci powinni my sprawdzi kon-trast zmieniaj c napi cie na pinie Vee modu u LCD

Warto zdefiniowa jeszcze funkcj ustawiaj c pozycj od ktoacuterej b dzie wy wietlanynast pny znak

void lcd_goto(uint8_t x uint8_t y) hd44780_outcmd(HD44780_DDADDR(0x40y+x)) hd44780_wait_ready(1000)

Funkcja ta przyjmuje dwa parametry x i y okre laj ce pozycj na ktoacuterej zostaniewy wietlony nast pny znak wys any z mikrokontrolera do modu u LCD Dzi ki temuz atwo ci mo emy uaktualnia zawarto LCD bez konieczno ci ponownego prze-sy ania wszystkich danych Funkcja ta jest zale na od typu zastosowanego modu u

Ostatni funkcj jest funkcja umo liwiaj ca czyszczenie zawarto ci pami ci modu uOdpowiedzialne za to jest proste polecenie wysy ane do sterownika

void lcd_cls() hd44780_outcmd(HD44780_CLR) hd44780_wait_ready(false)

Oproacutecz czyszczenia zawarto ci pami ci modu u powoduje ono ustawienie kursoraw punkcie (00)

Kup książkę Poleć książkę

56 AVR Uk ady peryferyjne

Definiowanie w asnych znakoacutewUk ad HD44780 jest wyposa ony w 64 bajty pami ci CGRAM (ang Character Ge-nerator RAM) ktoacutera mo e przechowywa mapy bitowe 8 znakoacutew o matrycy 5times8 pikselilub 4 znakoacutew o matrycy 5times10 pikseli Przyk ad definicji znaku na matrycy 5times8 poka-zano na rysunku 223

Rysunek 223Przyk ad definicji w asnego znakuw pami ci CGRAM Znak rysujemyna matrycy 5times8 bitoacutew polazaciemnione odpowiadaj warto ci 1pola bia e warto ci 0 Wartowyliczon dla ka dej linii pikseliwpisujemy do pami ci CGRAMsterownika Najstarsze 3 bity ka degobajta (pola szare) s bez znaczeniamdash wy wietlacz pomija jeprzy wy wietlaniu obrazu

1

2

3

4

5

6

7

0 00100 = 4

01110 = 14

11111 = 31

00100 = 4

00100 = 4

00100 = 4

11111 = 31

01110 = 14

Adres Warto

Dost p do tej pami ci jest mo liwy dzi ki wys aniu polecenia ustawiaj cego adreszapisuodczytu pami ci CGRAM Po jego wys aniu wszystkie operacje zapisu i od-czytu dotycz tej pami ci a nie pami ci DDRAM Aby wroacuteci do adresowania pa-mi ci DDRAM nale y wybra jej adres lub dokona operacji wymagaj cej przesu-ni cia kursora

Pami CGRAM jest pami ci ulotn po ponownym w czeniu zasilania definicjeznakoacutew musz by ponownie przes ane przez procesor

Bity o warto ci 1 w definicji znaku odpowiadaj w czonym pikselom bity o warto-ci 0 pikselom wy czonym Najstarsze 3 bity ka dego bajta w pami ci CGRAM s

bez znaczenia mdash te pozycje nie s wy wietlane przez matryc Definiuj c znak nale-y tak e pami ta e ostatnia linia wy wietlana przez matryc (w zale no ci od wiel-

ko ci matrycy znaku linia 8 lub 10) powinna zawiera same zera mdash w tej linii b dziewy wietlany kursor

Najcz ciej matryce LCD pod czone do sterownika HD44780 maj organizacj 5times8czyli jeden znak jest definiowany przez 8 kolejnych bajtoacutew okre laj cych stan po-szczegoacutelnych linii tworz cych znak Stwoacuterzmy funkcj ktoacuterej zadaniem b dzie za a-dowanie definicji znakoacutew z pami ci FLASH mikrokontrolera do pami ci CGRAM

void lcd_defchar_P(uint8_t charno prog_uint8_t chardef) hd44780_outcmd(HD44780_CGADDR(charno8)) hd44780_wait_ready(40) for(uint8_t c=0clt8c++) hd44780_outdata(pgm_read_byte(chardef))

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 57

hd44780_wait_ready(40) chardef++

Funkcja LCD_defchar_P jako argumenty przyjmuje numer definiowanego znaku (0 ndash 7)oraz wska nik do obszaru pami ci FLASH zawieraj cego definicj znaku (obszarten zajmuje 8 nast puj cych po sobie bajtoacutew) Jak widzimy funkcja najpierw ustawiaw a ciwy adres pod ktoacuterym znajdzie si pocz tek definicji znaku w pami ci CGRAMmdash poniewa jeden znak jest opisywany za pomoc 8 bajtoacutew kolejne adresy znakoacutewto kod_znakutimes8 Nast pnie dane opisuj ce znak s adowane z pami ci mikrokontrolerai zapisywane w pami ci CGRAM sterownika Poni szy program ilustruje wykorzy-stanie funkcji LCD_defchar_P

prog_uint8_t char1[8][8]=0000000255 00000025525500000255255255 0000255255255255 00025525525525525500255255255255255255 0255255255255255255255255255255255255255255255

int main() for(uint8_t x=0xlt8x++) lcd_defchar_P(xampchar1[x][0]) Za aduj wzorce znakoacutew lcd_init() for(uint8_t x=0xlt8x++) lcd_putchar(x) Wy wietl znaki o kodach 0 ndash 7 while(1)

W pierwszej linii funkcji main nast puje za adowanie nowych definicji znakoacutew dopami ci CGRAM nast pnie inicjalizowany jest wy wietlacz po czym w pierwszejlinii s wy wietlane znaki o kodach 0 ndash 7 a wi c znaki ktoacuterych definicja zosta aprzes ana z mikrokontrolera

Zauwa e pami CGRAM podobnie jak DDRAM mo emy zapisywa i odczytywaprzed inicjalizacj modu u LCD Proces inicjalizacji jest potrzebny tylko do prawi-d owego wy wietlania na ekranie LCD

Poniewa dane potrzebne do wy wietlenia znaku s na bie co pobierane z pami cipodczas od wie ania matrycy LCD jakiekolwiek zmiany w definicji znaku kiedy jest onwidoczny na LCD poci gaj za sob natychmiastowe zmiany w wy wietlanym obrazieMo na t w a ciwo sterownika wykorzysta do stworzenia prostych animacji

void lcd_box(uint8_t y) hd44780_outcmd(HD44780_CGADDR(0)) Zaczynamy od znaku o kodzie 0 hd44780_wait_ready(40) for(uint8_t c=0cltyc++) Stwoacuterz linie z w czonymi pikselami hd44780_outdata(0xFF) hd44780_wait_ready(40) for(uint8_t c=yclt8c++) Stwoacuterz linie z wy czonymi pikselami hd44780_outdata(0x00) hd44780_wait_ready(40)

Kup książkę Poleć książkę

58 AVR Uk ady peryferyjne

int main() lcd_init() lcd_putchar(0) while(1) for(uint8_t x=0xlt8x++) lcd_box(x) _delay_ms(100) for(int8_t x=7xgt=0x--) lcd_box(x) _delay_ms(100)

Funkcja main wy wietla na LCD tylko jeden znak o kodzie 0 a nast pnie cykliczniezmienia jego definicj w pami ci CGRAM W efekcie posta znaku wy wietlana naekranie ci gle si zmienia

Transakcyjna obs uga LCDPokazana do tej pory obs uga LCD alfanumerycznego mia a pewne wady Jak wiemyoperacje odwo uj ce si do kontrolera LCD s niezwykle wolne cykl odczytuzapisudowolnego rejestru kontrolera trwa co najmniej 1600 ns co dla MCU taktowanegozegarem 32 MHz przek ada si na czas wykonania oko o 52 instrukcji asemblera Cogorsza wi kszo komend realizowanych przez kontroler jest wykonywana w czasieoko o 37 s co przek ada si na tysi ce zmarnowanych taktoacutew MCU St d te jaki-kolwiek zapisodczyt LCD to z perspektywy programu straszne marnotrawstwo czasu

Problem ten dotyczy ka dego urz dzenia IO ktoacutere dzia a wolniej ni procesor W takiejsytuacji warto napisa pewn warstw po redni mdash sterownik mdash ktoacuterego zada-niem b dzie buforowanie da dost pu do urz dzenia i rozstrzyganie konfliktoacutewdzi ki czemu roacute ne cz ci programu b d bdquomia y wra enierdquo e maj wy czny do-st p do urz dzenia

Pokazane wcze niej funkcje obs ugi LCD maj jeszcze jedn wad mdash nie s wspoacute bie -ne czyli nie mo na ich wykonywa jednocze nie w kilku miejscach programu w tymw szczegoacutelno ci w programie g oacutewnym i w funkcjach obs ugi przerwa W wielu przy-padkach ta wada jest bez znaczenia jednak czasami jest uci liwa mdash dla przyk adugdy na wy wietlany tekst chcieliby my na o y inne informacje np o dacie lub godzi-nie Oczywi cie wy wietlanie mo na zorganizowa tak aby nie by o potrzeby pisaniawspoacute bie nego kodu np poprzez zastosowanie bufora pami ci VRAM kontrolera LCDRodzi to jednak kolejne problemy i jest ma o eleganckie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 59

Zastanoacutewmy si w jaki sposoacuteb najlepiej jednocze nie rozwi za problem wolnegodost pu do urz dzenia i wspoacute bie no ci kodu Rozwi zaniem mo e by wprowadze-nie tzw transakcji Transakcj nazywamy zbioacuter operacji tworz cych pewn ca-o To co wyroacute nia tak wykonywany zestaw operacji to atomowo spoacutejno

izolacja i trwa o Pod tymi terminami kryje si istota wykonywanej operacji Ato-mowo transakcji zapewnia e jest ona wykonywana w sposoacuteb niepodzielny co gwa-rantuje nam prawid ow wspoacute prac z danym urz dzeniem IO w tym przypadku kon-trolerem LCD Wa na dla nas jest tak e izolacja mdash dzi ki temu inne operacje na LCD(inne transakcje) nie b d mia y wp ywu na wynik aktualnie wykonywanej transakcjimdash nie b d zak oacuteca y jej wykonania z drugiej strony nasza transakcja nie zak oacuteciwykonania innych Trwa o z kolei zagwarantuje nam e je li sterownik potwierdziwykonanie transakcji to znaczy e efekt jej dzia ania jest wy wietlony na LCD Tacecha nie jest nam a tak potrzebna mdash jest ona wydawa oby si oczywista Niemniej jestto pewna gwarancja e ca a operacja przebieg a poprawnie i w efekcie LCD znajdujesi w okre lonym przez nas stanie Tyle teorii przejd my do praktyki

Kody poni szego przyk adu znajduj si w katalogu PrzykladyLCD-alfaLCD-transact

Aby zapewni transakcyjny dost p do LCD musimy stworzy pewne struktury danychktoacuterych zadaniem b dzie przechowywanie informacji o operacjach sk adaj cych sina transakcje i stanie ich wykonania W tym celu pos u ymy si wiadomo ciami z roz-dzia u 5 bdquoJak uporz dkowa chaos czyli z o one typy danych i listyrdquo Do przecho-wywania oczekuj cych transakcji pos u ymy si buforem pier cieniowym zanimjednak go zaimplementujemy zastanoacutewmy si jak powinna wygl da struktura prze-chowuj ca informacje o transakcji Struktura ta powinna zawiera co najmniej

pole danych (data) z informacjami ktoacutere maj by przes ane do kontrolera LCD

pole okre laj ce liczb danych do wys ania (len)

pole okre laj ce realizowane polecenie dla LCD (cmd) mdash pole to pos u yprogramowi sterownika do w a ciwej interpretacji danych znajduj cych siw polu data

kilka poacutel kontrolnych przechowuj cych informacje potrzebne do realizacjisamej transakcji Jedno z nich mdash Ready mdash b dzie przyjmowa warto trueje li dana transakcja zosta a zrealizowana lub false w przeciwnym przypadkuZnaczenie drugiego pola mdash SelfDel mdash mo e wydawa si nieco enigmatycznepole to okre la czy pami przydzielona dla transakcji ma by zwolnionaw sterowniku LCD (warto true) czy te zostanie zwolniona w programie(warto false)

Oto jak mo e wygl da struktura definiuj ca transakcj typedef struct volatile bool Ready 1 true je li transakcja zosta a zrealizowana bool SelfDel 1 true je li pami przydzielona transakcji ma zosta zwolniona LCD_Cmd cmd 2 Polecenie do zrealizowania uint8_t len 6 D ugo polecenia

Kup książkę Poleć książkę

60 AVR Uk ady peryferyjne

unsigned 0 Wyroacutewnanie do granicy bajta uint8_t data[] Dane transakcji LCD_trans

Nale y zwroacuteci uwag na poleunsigned 0

Nie definiuje ono adnego pola struktury ale jedynie informuje kompilator e kolejnepole (w naszym przyk adzie o nazwie data) ma by wyroacutewnane do granicy bajta mdashdzi ki temu dost p do kolejnego pola b dzie odbywa si szybciej Z kolei samo poledata jest zadeklarowane jako tzw typ niekompletny

Typ niekompletny (ang incomplete type) to typ ktoacuterego rozmiaru nie da si okre li

W pokazanym przyk adzie rozmiaru pola data nie da si okre li gdy zosta on za-deklarowany jako typ tablicowy z tym e nie podano wielko ci tablicy Wielko ci niepodano gdy na etapie deklaracji struktury nie wiemy jakiej wielko ci dane b d w niejprzechowywane Tego typu deklaracja ma bardzo powa ne konsekwencje mdash skorowielko ci pola data nie da si okre li to jaki b dzie wynik dzia ania operatora sizeof(LCD_trans) Kompilator stara si jako wybrn z tej sytuacji w zwi zku z czym

zwroacuteci wielko struktury ale tak jakby pole data w ogoacutele nie istnia o mdash jego roz-miar b dzie wynosi 0 W ramach wiczenia zastanoacutew si ile bajtoacutew pami ci b dziezajmowa a struktura LCD_trans

Skoro dysponujemy ju struktur przechowuj c poszczegoacutelne transakcje pora nastworzenie obiektu przechowuj cego kolekcj transakcji Dodanie kolejnej strukturyb dzie polega o na dodaniu jej do takiego obiektu z drugiej strony program sterownikaLCD b dzie moacuteg z tej kolekcji pobiera kolejne transakcje do realizacji Opis ten przy-pomina opis dzia ania bufora pier cieniowego mdash z jednym wyj tkiem mdash po zape nie-niu ca ego bufora nie b dziemy usuwa niezrealizowanych transakcji lecz zabloku-jemy dodawanie kolejnych W tym celu pos u ymy si definicj nast pnej struktury

typedef struct LCD_trans elements[LCD_MAXTRANS] Wska niki do transakcji uint8_t Beg Pierwszy element bufora uint8_t Count Liczba elementoacutew w buforze CircBuffer

Struktura ta zawiera deklaracj tablicy wska nikoacutew na transakcje (pole elements)Poniewa jest to tablica musimy zna liczb jej elementoacutew mdash jest ona zadeklarowanaw sta ej LCD_MAXTRANS

define LCD_MAXTRANS 10 Maksymalna liczba pami tanych transakcji

Do realizacji bufora s potrzebne jeszcze dwa pola Beg wskazuj ce na pierwsztransakcj w buforze oraz pole Count okre laj ce liczb transakcji znajduj cych siw buforze Je li Count == 0 to znaczy e w buforze nie ma adnych oczekuj cychtransakcji a je li Count == LCD_MAXTRANS to znaczy e bufor jest pe ny i nie mo na

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 61

dodawa do niego kolejnych transakcji W a ciwo t wykorzystuj dwie zdefiniowanew pliku LCD_transc funkcje

static inline bool cbIsFull(CircBuffer cb) return cb-gtCount == LCD_MAXTRANS

static inline bool cbIsEmpty(CircBuffer cb) return cb-gtCount == 0

Jak pami tamy w przypadku funkcji modyfikatory static inline powoduj e danafunkcja nie b dzie istnie jako samodzielna lecz w ka dym miejscu w ktoacuterym jestwywo ywana jest wstawiany raczej jej kod a nie wywo anie Ma to znaczenie dlakroacutetkich funkcji (a wi c takich jak pokazane powy ej) dla ktoacuterych koszty wywo anias zazwyczaj wi ksze ni koszty umieszczenia cia a funkcji w miejscu jej wywo aniaTego typu funkcje zachowuj si w sposoacuteb zbli ony do makrodefinicji (z tym e re-spektuj wszystkie regu y j zyka C w szczegoacutelno ci kolejno operatoroacutew czy kon-trol typoacutew)

Takie funkcje jako argument pobieraj adres bufora na ktoacuterym maj operowa W na-szym przypadku bufor jest zdefiniowany nast puj co

static CircBuffer LCD_TransBuffer Bufor na transakcje

Nale y zauwa y e jest on zdefiniowany jako struktura globalna z modyfikatoremstatic Modyfikator ten ogranicza zasi g widoczno ci zmiennej LCD_TransBuffer dopliku w ktoacuterym zmienna ta zosta a zdefiniowana (w tym przypadku modyfikator staticjest niejako przeciwie stwem modyfikatora extern) Dzia anie to ma jedynie znaczeniekosmetyczne mdash uniemo liwia odwo anie si do bufora za pomoc funkcji ktoacutere niezosta y zdefiniowane w miejscu jego definicji Oproacutecz funkcji umo liwiaj cych okre-lenie stanu bufora potrzebne s jeszcze funkcje umo liwiaj ce dodanie i pobranie trans-

akcji Pierwsz funkcj b dzie funkcja dodaj ca transakcj do buforabool cbAdd(CircBuffer cb LCD_trans elem) ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsFull(cb)) return false Czy jest miejsce w kolejce uint8_t end = (cb-gtBeg + cb-gtCount) LCD_MAXTRANS cb-gtelements[end] = elem Dodaj transakcj ++cb-gtCount Liczba elementoacutew w buforze return true Wszystko OK

Funkcja ta dodaje transakcj (zmienna elem) do bufora ko owego Zanim transakcjazostanie dodana sprawdzane jest czy w buforze jest miejsce mdash je li nie funkcjazwroacuteci false Je li dodanie jest mo liwe warto licznika okre laj cego liczb trans-akcji przechowywana w buforze (Count) zwi ksza si o jeden Warto zastanowi si te dlaczego praktycznie ca e cia o tej funkcji jest zamkni te w sekcji atomowej (ATOMIC_BLOCK) Jedn z cech naszego sterownika ma by mo liwo wspoacute bie nego dost pu

Kup książkę Poleć książkę

62 AVR Uk ady peryferyjne

do LCD mdash to znaczy e danie np zapisu do LCD mo e wyst pi zaroacutewno w g oacutewnejp tli programu jak i asynchronicznie w przerwaniu St d te wynika e funkcja do-daj ca transakcj musi by napisana w sposoacuteb zapewniaj cy jej poprawn prac w sytu-acji gdy zostanie ona przerwana i ponownie wywo ana przed zako czeniem dzia aniajej poprzedniej instancji Umieszczenie cia a tej funkcji w sekcji atomowej nam to za-pewnia mdash dzi ki temu bufor transakcji zawsze b dzie spoacutejny Dla zaspokojenia cie-kawo ci warto usun sekcj atomow i sprawdzi jak wtedy b dzie zachowywa si tafunkcja i jak wp ynie to na spoacutejno przechowywanych danych

Drug niezb dn funkcj jest funkcja odczytuj ca bufor transakcji i zwracaj ca trans-akcj do zrealizowania (lub NULL je li adnej transakcji nie ma w buforze)

LCD_trans cbRead(CircBuffer cb) LCD_trans elem ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsEmpty(cb)) return NULL Bufor pusty nie mo na zwroacuteci elementu elem = cb-gtelements[cb-gtBeg] cb-gtBeg = (cb-gtBeg + 1) LCD_MAXTRANS -- cb-gtCount Zmniejszamy liczb elementoacutew pozosta ych w buforze return elem

Funkcja ta jest bardzo podobna do poprzedniej mdash najpierw sprawdza czy bufor za-wiera jak oczekuj c transakcj (cbIsEmpty(cb)) je li tak to zwraca adres opisuj -cej j struktury i zmniejsza liczb transakcji oczekuj cych (pole Count) W ten sposoacutebmamy zrealizowan ca funkcjonalno zwi zan z obs ug bufora pier cieniowegoPokazane funkcje s uniwersalne i z bardzo podobnych (lub wr cz tych samych) b -dziemy korzysta w kolejnych rozdzia ach w kontek cie np obs ugi transakcji zwi -zanych z interfejsami szeregowymi

Pora przej do samego sterownika LCD Jego zadaniem b dzie sprawdzenie czyw buforze oczekuj jakie transakcje do realizacji a je li tak to ich wykonanie Ponie-wa dane do LCD mog by wysy ane co okre lony minimalny czas znacznie d u -szy ni czas jakiego na to zadanie potrzebuje mikrokontroler do wysy ania kolejnychpaczek danych pos u ymy si timerem Timer b dzie generowa przerwanie nadmiaru(TCD0_OVF_vect) ktoacutere b dzie wyznacza o tempo w jakim kolejne porcje danych b -d trafia y do LCD Z noty katalogowej kontrolera wynika e minimalny czas trwa-nia wysokiego stanu sygna u Enable to 230 ns a okres tego sygna u nie powinien bykroacutetszy ni 500 ns Poniewa nasz dost p do LCD odbywa si w sposoacuteb nieblokuj cyMCU wi c szybko wysy ania danych do LCD jest bez znaczenia St d te w poka-zanym przyk adzie przyj to e dane b d wysy ane co 4 s co okre la sta a

define LCD_ACCESSTIME 0000004

Poniewa komunikacja z LCD odbywa si w sposoacuteb nieblokuj cy nie zale y nam tena czasie (i tak w stosunku do czasu od wie ania samego LCD jest on bardzo kroacutetki)w efekcie nie ma potrzeby odczytywania flagi busy kontrolera Dzi ki temu w cz ciprzypadkoacutew mo emy w ogoacutele zrezygnowa z sygna u wyboru RW i wymusi jego sta y

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 63

poziom logiczny umo liwiaj cy zapis do LCD Dzi ki temu mo na zaoszcz dzi do-datkowy pin IO1

Ca a logika naszego sterownika jest zawarta w funkcji obs ugi przerwania przepe nieniatimera (TCD0_OVF_vect) Poniewa LCD jest po czony z MCU w trybie 4-bitowym(dla zaoszcz dzenia liczby wykorzystanych pinoacutew IO) kolejne 8-bitowe dane muszby podzielone na dwie tetrady i wys ane do LCD w kolejno ci starszam odsza tetradaInformacja o aktualnie wysy anych danych jest umieszczona w zmiennej trans o typie

static struct uint8_t pos 6 Pozycja w polu danych aktualnej transakcji uint8_t nibble 1 Ktoacutera tetrada jest wysy ana seq

Dlaczego tak Dzi ki wykorzystaniu struktury i poacutel bitowych mo na zaoszcz dzi je-den bajt pami ci SRAM Ze wzgl du na wielko pami ci obs ugiwanej przez kon-troler LCD mo emy by pewni e transakcje zawieraj ce wi cej ni 63 bajty s ra-czej nierealne (nie mia yby wi kszego sensu) St d te do przechowywania informacjio aktualnie wysy anym bajcie danych wystarczy 6 bitoacutew mdash tyle samo zosta o wyko-rzystanych do okre lenia d ugo ci pola danych transakcji w strukturze LCD_trans Zaosz-cz dzony bit mo na po wi ci na flag nibble okre laj c ktoacutera tetrada (m odszastarsza)jest wysy ana Bez poacutel bitowych flaga ta zaj aby dodatkowy bajt pami ci

Przejd my do implementacji sterownika Pierwsz rzecz jak nale y sprawdzi jestto czy w buforze czeka jaka transakcja do zrealizowania Odpowiedzialny za to jestfragment kodu obs ugi przerwania nadmiaru timera

if(trans == NULL) Nic do zrobienia sprawd my czy jaka transakcja oczekuje trans=cbRead(ampLCD_TransBuffer) Czy jest jaka oczekuj ca transakcja seqpos=0 seqnibble=0 if(trans == NULL) TCD0_CTRLA=TC_CLKSEL_OFF_gc Nie ma adnych transakcji mdash wy cz timer

W przypadku gdy adna transakcja nie oczekuje na realizacj timer jest wy czanymdash dzi ki temu nie b d zg aszane kolejne przerwania przepe nienia i MCU nie b -dzie traci czasu na ich obs ug Co prawda wynikaj cy z tego zysk czasowy jest mar-ginalny lecz ma to istotniejsz konsekwencj mdash w przypadku usypiania MCU zb d-ne przerwanie timera nie b dzie niepotrzebnie wybudza o procesora W takiej sytuacjiponowne w czenie timera nast pi dopiero w funkcji dodaj cej transakcj do kolejkimdash a wi c w sytuacji gdy mamy pewno e istnieje oczekuj ca transakcja

Druga cz funkcji obs ugi przerwania jest zwi zana z realizacj samej transakcjiW pokazanym przyk adzie zaimplementowano tylko jeden typ transakcji mdash daniezapisu a cucha tekstowego pod wskazany adres VRAM (na okre lonej pozycji LCD)Je li zajdzie taka potrzeba programista mo e zaimplementowa inne polecenia i doda

1 Warto zauwa y e w bdquoklasycznejrdquo obs udze LCD te nie musimy czyta stanu flagi busy zamiast tego

wystarczy wprowadza p tle opoacute niaj ce Jednak poniewa taka obs uga blokuje MCU nie jest onazalecana Wady tej nie ma dost p transakcyjny co jest jego dodatkow zalet

Kup książkę Poleć książkę

64 AVR Uk ady peryferyjne

kod odpowiedzialny za ich obs ug Zauwa my e ka da transakcja musi zawieraadres pocz tku pami ci wideo od ktoacuterego b dzie zapisywany tekst Dzieje si takdlatego e transakcja wykonana wcze niej mo e ustawi wska nik zapisu na dowolnejkomoacuterce pami ci W efekcie tekst z kolejnej transakcji by by wy wietlany od komoacuterkina ktoacuterej zako czy si zapis poprzedniej transakcji Takie dzia anie oczywi cie jestniedopuszczalne st d te ka dy zapis do pami ci wideo poprzedza ustawienie rejestruindeksowego Problem ten mo na rozwi za tak e w inny sposoacuteb mdash poprzez wpro-wadzenie tzw uchwytoacutew (ang handlers) ktoacutere zawiera yby stan kontrolera LCDNiemniej to rozwi zanie dodatkowo komplikowa oby nasz sterownik Struktura danych(zawartych w polu data) ma wi c nast puj cy format

bajt nr 0 zawiera warto pozycji od ktoacuterej nale y dokonywa zapisu pami ciwideo mdash jest to warto przesy ana do rejestru okre laj cego adres zapisu

kolejne bajty zawieraj a cuch znakowy ktoacutery nale y umie ci w pami ciCGRAM

Poniewa bajt nr 0 zawsze zawiera warto wpisywan do rejestroacutew steruj cych kon-trolera podczas jego wysy ania jest ustawiana linia RS sygnalizuj ca zapis do rejestruPodczas wysy ania kolejnych bajtoacutew linia ta jest zerowana w zwi zku z czym zapisodbywa si do pami ci CGRAM

Kod obs uguj cy transakcj wygl da nast puj coif(trans) Jest transakcja do zrealizowania uint8_t dat=trans-gtdata[seqpos] if(seqnibble == 0) datgtgt=4 To trzeba zmieni je li linie danych nie s po czone z pinami 0 ndash 3 portu IO hd44780_outnibble_nowait(dat amp 0x0F seqpos = 0) Zapisujemy rejestr steruj cy lub dane ++seqnibble if(seqnibble == 0) ++seqpos Co drug tetrad zwi kszamy pozycj bufora if(seqpos gt= trans-gtlen) trans-gtReady=true Koniec transakcji if(trans-gtSelfDel) free_re(trans) Zwolnij pami transakcji je li tak sobie yczy programista trans=NULL Koniec transakcji CLR(OUT HD44780_E)

Ta cz przerwania wysy a kolejne tetrady do kontrolera LCD Warto zastanowi sinad dzia aniem sekwencji

++seqnibble

Poniewa pole nibble jest jednobitowe operacja inkrementacji prowadzi do zmianystanu tego pola na przeciwny (pole to ma warto 0 lub 1) Kiedy zostan wys anewszystkie dane przeznaczone dla kontrolera obs uga transakcji ko czy si Stan tensygnalizuje nadanie warto ci true polu Ready struktury LCD_trans Dzi ki temu pro-gram mo e sprawdzi asynchronicznie w stosunku do przerwania kiedy transakcjauleg a zako czeniu Opcjonalnie jest wykonywana jeszcze jedna funkcja mdash je li poleSelfDel ma warto true to pami zarezerwowana na transakcj jest automatycznie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 65

zwalniana W tym celu wykorzystuje si funkcj free_re ktoacuterej prototyp jest zade-klarowany w pliku Alloc_safeh Funkcja ta wywo uje funkcj biblioteczn free ktoacute-ra zwalnia pami przydzielon dynamicznie na stercie Poniewa funkcja ta nie jestfunkcj reentrant nale y stworzy odpowiedni bdquoprotez rdquo opakowuj c j w blokatomowy co zapewnia e nie zostanie ona ponownie wywo ana zanim jej poprzed-nia instancja nie zako czy dzia ania Oczywi cie lepszym rozwi zaniem by oby napi-sanie w asnych funkcji dynamicznej alokacji pami ci ktoacutere b d reentrant

Bardzo wa ne jest aby pole SelfDel mia o warto true wy cznie dla transakcjidla ktoacuterych pami zosta a przydzielona dynamicznie funkcj malloc (lub jej po-chodnymi) W pozosta ych przypadkach pole to musi mie warto false mdash nie-stosowanie si do tej regu y spowoduje b d mened era pami ci i najprawdopo-dobniej nieprzewidywalne dzia anie programu

Drug wa n zasad jest aby zmienna zawieraj ca dane transakcji nie by azmienn automatyczn mdash zmienne takie s automatycznie niszczone po opusz-czeniu zawieraj cej je funkcji W rezultacie obszar pami ci zawieraj cy danetransakcji mo e zosta wykorzystany przez inne zmienne co spowoduje uszkodzeniezawartych w nim danych

Pami przydzielona transakcji musi by alokowana w sposoacuteb dynamiczny (funkcjamalloc_re) ewentualnie mo e to by pami alokowana dla zmiennej globalnej lubstatycznej mdash zmienne tego typu istniej przez ca y czas ycia programu

Warto te zauwa y e instrukcje steruj ce stanem linii Enable kontrolera LCD(SET(OUT HD44780_E) i CLR(OUT HD44780_E)) s rozdzielone wieloma innymi in-strukcjami Dzi ki temu generowany impuls dodatni tego sygna u ma czas trwania gt230 ns wymagany w specyfikacji kontrolera Nawet dla XMEGA taktowanej zegarem32 MHz 230 ns przek ada si na oko o 7 instrukcji asemblera mdash czas jaki z pewno-ci up ynie pomi dzy wykonaniem obu powy szych instrukcji steruj cych

Do wysy ania danych do kontrolera zosta a wykorzystana nieco zmodyfikowanafunkcja hd44780_outnibble_nowait roacute ni ca si od jej protoplasty hd44780_outnibbletylko tym e nie czeka na sygna braku zaj to ci mikrokontrolera (nie realizuje teopoacute nie ) Nie jest to potrzebne gdy kolejne tetrady s wysy ane w odst pach cza-sowych okre lanych przez timer

Mamy wi c zapewnion obs ug transakcji i mo liwo transakcyjnego wy wietlaniadanych na LCD musimy jeszcze mie funkcj ktoacutera tworzy odpowiednie transakcjemdash jest odpowiednikiem funkcji bezpo rednio wysy aj cej dane znakowe do LCDOdpowiednikiem tym jest pokazana poni ej funkcja

bool LCD_PutText_B(uint8_t x uint8_t y char txt LCD_trans buf bool autodel) buf-gtcmd=LCD_Text buf-gtReady=false buf-gtSelfDel=autodel Czy zwolni pami po zako czeniu transakcji buf-gtdata[0]=HD44780_DDADDR(x+y0x40) Ustaw adres w DDRAM strcpy((char)ampbuf-gtdata[1] txt) Skopiuj dane tekstowe + NULL

Kup książkę Poleć książkę

66 AVR Uk ady peryferyjne

buf-gtlen=strlen(txt) + 1 D ugo tekstu + pozycji + NULL ndash 1 bool ret=cbAdd(ampLCD_TransBuffer buf) if((ret==false) ampamp (autodel)) free_re(buf) Brak miejsca w kolejce else TCD0_CTRLA=TC_CLKSEL_DIV1_gc Preskaler 1 mdash odblokuj timer return ret

Funkcja ta buduje transakcj odpowiedzialn za wy wietlenie napisu txt na wskaza-nej pozycji x y LCD Wszystkie dane o transakcji zostan umieszczone w buforzew pami ci ktoacuterej adres jest okre lany wska nikiem buf Pami w buforze musi bywystarczaj co du a aby pomie ci ca transakcj Dodatkowy parametr autodel okre laczy pami ta ma by automatycznie zwalniana po obs u eniu transakcji (true) czynie (false) Je li transakcj uda o si umie ci w kolejce funkcja zwraca true Wartozauwa y e w takim przypadku funkcja uruchamia te timer (w naszym przypadkujest to timer TCD0) odpowiedzialny za generowanie przerwania Funkcja obs ugi prze-rwania wysy a dane do LCD

Pewn odmian powy szej funkcji jest funkcjabool LCD_PutText(uint8_t x uint8_t y char txt) LCD_trans trans=malloc_re(sizeof(LCD_trans) + strlen(txt) + 2) bool ret=LCD_PutText_B(x y txt trans true) return ret

Wykorzystuje ona funkcj LCD_PutText_B z tym e najpierw alokuje dynamiczniepami potrzebn na przechowanie tworzonej transakcji

Mamy komplet potrzebnych funkcji a wi c sprawd my jak ca o sprawdza siw praktyce W pliku LCD-transactc znajduje si kod pokazuj cy jak dzia aj naszetransakcje Aby to by o mo liwe nale y zainicjalizowa kontroler LCD

LCD_init()

Wykorzystujemy tu znan ju funkcj inicjalizuj c mdash nie ma potrzeby jej zmienia gdy operacja inicjalizacji LCD jest jednorazowa i nie trzeba wykonywa jej w posta-ci transakcji W drugim kroku musimy zainicjalizowa wykorzystywany timer i systemprzerwa

LCD_Timer_init(ampTCD0)PMIC_CTRL|=PMIC_LOLVLEN_bm Odblokuj przerwania niskiego poziomusei()

Poniewa dost p do LCD z pewno ci nie jest czynno ci krytyczn czasowo prze-rwaniom timera nadano najni szy priorytet Dzi ki temu mo na innym bardziej kry-tycznym przerwaniom nada wy sze priorytety i uzyska w ten sposoacuteb zmniejszenieczasu latencji obs ugi przerwa Sama inicjalizacja timera jest niezwykle prosta

void LCD_Timer_init(TC0_t tc) tc-gtINTCTRLA=TC_OVFINTLVL_LO_gc Odblokuj przerwania nadmiaru timera i nadaj im niski priorytet tc-gtPER=F_CPULCD_ACCESSTIME Przerwanie co 4 us (niezale nie od F_CPU)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 67

Sprowadza si ona tylko do odblokowania mo liwo ci zg aszania przerwania nadmia-ru oraz konfiguracji rejestru PER tak aby przerwania by y generowane co ok 4 s mdashniezale nie od cz stotliwo ci taktowania CPU Mo emy wi c przyst pi do wy wie-tlenia pierwszego napisu

LCD_PutText(00 Numer)

Powy sza funkcja ma jedn wad mdash alokuje dynamicznie pami po ka dym wywo-aniu (pami ta jest automatycznie zwalniana po obs u eniu transakcji) niemniej

ca y proces jest czasoch onny Mo emy tego unikn alokuj c pami bdquor cznierdquo i wielo-krotnie wykorzystuj c zaalokowany blok pami ci Ilustruje to poni szy przyk ad

LCD_trans buf=malloc_re(sizeof(LCD_trans) + 7)

Zmienna buf wskazuje na obszar pami ci ktoacutery mo e pomie ci a cuch 5-znakowyTyle wystarczy na potrzeby tego przyk adu mdash na LCD b d wy wietlane kolejneliczby w zakresie 0 ndash 65 535 najd u sza ma 5 znakoacutew st d te nasz bufor ma tak a nieinn d ugo

while(1) utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(60 bufstr buf false) while(LCD_IsTransCompleted(buf))

Do konwersji liczby na a cuch u yto funkcji bibliotecznej utoa (nag oacutewek stdlibh)Poniewa d ugo a cucha po konwersji jest zmienna (co spowodowa oby pozosta-wianie na LCD bdquoduchoacutewrdquo po poprzednich konwersjach) w kolejnej linii brakuj ceznaki uzupe niono spacjami Nast pnie tworzona jest transakcja w obszarze pami ciprzydzielonym zmiennej buf Ostatnia p tla while jest odpowiedzialna za oczekiwa-nie na zako czenie realizacji transakcji Po jej zako czeniu p tla jest wykonywana odpocz tku

Uwa ny czytelnik z pewno ci zauwa y e pami przydzielana funkcj malloc_renie jest nigdzie zwalniana mdash w normalnej sytuacji spowodowa oby to wyciek pami -ci W naszym przyk adzie jednak program nigdy si nie ko czy nie ma wi c potrzebyzwalniania pami ci wskazywanej przez zmienn buf

Powy szy przyk ad pokazuje jak unikn blokowania CPU na czas dost pu do wolnodzia aj cego urz dzenia jakim jest LCD alfanumeryczny Jednak to nie wszystkiezalety wynikaj ce z zastosowania transakcji Drug wa n zalet naszego rozwi zaniailustruje przyk ad znajduj cy si w katalogu PrzykladyLCD-alfaLCD-transact-intPowa nym ograniczeniem funkcji odpowiedzialnych za dost p do LCD w sposoacutebklasyczny by a niemo no ich wywo ywania z funkcji obs ugi przerwa mdash funkcjeobs ugi LCD nie by y reentrant2 Nasz system oparty na transakcjach nie ma tychwad Aby to zilustrowa zosta stworzony prosty przyk ad mdash tak jak poprzedniow p tli g oacutewnej programu s wy wietlane stale kolejne liczby ale jednocze nie wyko-

2 Poza tym blokowa y CPU na d ugi czas a jak pami tamy funkcje obs ugi przerwa powinny by

wykonywane mo liwie kroacutetko

Kup książkę Poleć książkę

68 AVR Uk ady peryferyjne

rzystano drugi timer (TCD1) w ktoacuterego funkcji obs ugi przerwania przepe nienia jestwy wietlany licznik tych przerwa

ISR(TCD1_OVF_vect) static char int_buf[sizeof(LCD_trans) + 7] static uint16_t cnt char bufstr[6]

utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(61 bufstr (LCD_trans)ampint_buf false)

Jak widzimy w sposoacuteb asynchroniczny z dwoacutech miejsc w programie mo emy uzy-ska dost p do LCD a ka da funkcja bdquoma wra enierdquo e ma LCD na wy czno Przy okazji warto przeanalizowa sposoacuteb w jaki jest rezerwowana pami na trans-akcj w przerwaniu Oczywi cie mo na by wykorzysta dynamiczn alokacj pami cilecz jak wspomniano taka alokacja jest czasoch onna St d te w pokazanym przy-k adzie wykorzystano tablic statyczn int_buf o rozmiarze umo liwiaj cym prze-chowanie kompletnej transakcji Dzi ki temu e zmienna int_buf jest zmienn statycz-n nie jest ona niszczona po zako czeniu funkcji obs ugi przerwania Gdyby pomins owo kluczowe static zmienna ta by aby niszczona a na LCD najprawdopodobniejzacz yby si pojawia przypadkowe tre ci Poniewa pami naszego bufora nie by aalokowana dynamicznie nie mo e ona zosta zwolniona w naszym sterowniku LCDst d te ostatni parametr wywo ania funkcji LCD_PutText_B musi mie warto false

OptymalizacjaPrzy okazji tego i poprzedniego przyk adu warto zastanowi si jeszcze nad jednkwesti mdash optymalizacji W podanych przyk adach wykorzystano wcze niej omoacute-wione funkcje dost pu do wy wietlacza LCD znajduj ce si w plikach hd44780ci hd44780h Wi kszo z zawartych tam funkcji nie jest wykorzystywana jednakkompilator mimo wszystko umieszcza ich kod w pliku wynikowym mdash dzieje si takponiewa nie mo e on bdquostwierdzi rdquo czy funkcje te nie s wykorzystywane w innychfragmentach programu Pami tajmy e kompilator kompiluje poszczegoacutelne pliki roacute-d owe osobno i dana jego instancja nie bdquowierdquo co znajduje si w innych plikach (innychjednostkach kompilacji) Tak ca o ciow wiedz ma dopiero konsolidator (linker)ktoacutery czy stworzone przez kompilator pliki obiektowe (o rozszerzeniu o) w plikwynikowy Linker jednak bdquonie wierdquo ktoacutera z funkcji programu zosta a u yta a ktoacuteranie mdash informacje te ma wy cznie kompilator W ten sposoacuteb powstaje typowe b dneko o w efekcie nasze nieu ywane funkcje nie s usuwane (linker zostawia je bdquonawszelki wypadekrdquo) i zajmuj niepotrzebnie pami Czy mo na temu jako zaradzi Oczywi cie tak W tym celu trzeba po czy si y kompilatora i linkera co zapewniaj od-powiednie opcje kompilacji We w a ciwo ciach projektu (ProjectProperties lub Alt+F7)wybieramy zak adk Toolchain a nast pnie AVRGNU C Compiler i OptimizationZnajdziemy tam pole wyboru o nazwie Prepare functions for garbage collection (ry-sunek 224)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 69

Rysunek 224 Aby da linkerowi mo liwo usuwania nieu ywanych funkcji nale y skompilowaprogram z wybran opcj ndashffunction-sections ktoacutera spowoduje e ka da funkcja programu znajdzie siwe w asnej sekcji

Zaznaczenie tej funkcji spowoduje umieszczenie ka dej funkcji w osobnej sekcji mdashsamo w sobie nie wp ynie to na skroacutecenie kodu wynikowego ale jest warunkiem nie-zb dnym dla podj cia stosownych dzia a przez linker Aby wyeliminowa nieu y-wane funkcje nale y zaznaczy jeszcze w ga zi AVRGNU LinkerOptimization poleGarbage collect unused sections (rysunek 225)

Rysunek 225 Zaznaczenie opcji Garbage collect unused sections (-Wl--gc-sections) spowodujee nieu ywane funkcje zostan usuni te z kodu wynikowego w efekcie kod programu ulegnie skroacuteceniu

Po zaznaczeniu tych opcji program zostanie skroacutecony o kilkaset bajtoacutew Oczywi cieje li wszystkie funkcje by yby wykorzystane nie uzyskaliby my adnego skroacuteceniakodu Niemniej w sytuacji gdy u ywa si bibliotek zazwyczaj przynajmniej czfunkcji nie jest wykorzystywana warto wi c skorzysta z tej mo liwo ci optymalizacji

Kup książkę Poleć książkę

70 AVR Uk ady peryferyjne

Je li mamy do czynienia z prekompilowan bibliotek (lib) to musi ona by skom-pilowana z zaznaczon opcj Prepare functions for garbage collection (-ffunction-sections) Alternatyw jest umieszczenie ka dej funkcji biblioteki w osobnym pliku(tak jak w przypadku bibliotek AVR-libc)

Na ekranie wyboru opcji optymalizacji linkera mamy jeszcze jedn przydatn opcjmdash Relax Branches (-mrelax) Dla mikrokontroleroacutew ktoacutere maj ponad 8 kB pami ciFLASH instrukcje skokoacutew s generowane jako tzw instrukcje d ugie mdash umo liwiajone skok do komoacuterki pami ci FLASH o dowolnym adresie Jednak cen za to jestwyd u enie instrukcji mdash ich kod jest d u szy podobnie jak czas wykonania Nie zawszejednak takie d ugie instrukcje musz by wykonywane mdash je li miejsce docelowe skokule y blisko (w zasi gu instrukcji skokoacutew wzgl dnych) to mo na w kodzie wynikowymzamieni instrukcje d u sze na kroacutetsze co przynosi oszcz dno ci w postaci skroacuteceniakodu wynikowego Poniewa dopiero linker bdquowierdquo jak poszczegoacutelne fragmenty kodus rozmieszczone w pami ci takiej podmiany mo na dokona na etapie linkowaniaprogramu co zapewnia powy sza opcja St d te warto to pole wyboru zaznaczy

Kup książkę Poleć książkę

SkorowidzA

ABI Application Binary Interface 25AC Address Counter 50ADPCM 482adres

bazowy 377bufora 61komoacuterki 84pu apki 202

ALE Address Latch Enable 368alfanumeryczne wy wietlacze 43algorytm ADPCM 492algorytmy stratne 495animacje 57antyaliasing 325architektury procesoroacutew XMEGA 352asembler 23

dyrektywy 40funkcje j zyka C 41obs uga przerwa 39

asynchroniczne wywo anie funkcji 101Atmel Studio 15

Bbajty kalibracyjne 569biblioteka

FATFS 131 139 176 180 517libcallback-liba 99PetitFS 144 149

bitADC_CH0START_bm 236IMPMODE 244

bitrate 442 512blokowanie przerwa 219b d 16 19

kwantyzacji 463offsetu 230wzmocnienia ADC 230

BOD 223bps bits per second 12

budowakarty 152linii obrazu 394pami ci SDRAM 374pliku stymulacji 192ramki PAL 412sygna u PAL 411wtyczki 544 545

bufor 78FIFO 497na transakcje 61transakcji 62

buforowanie wyj cia 294

CCAS Column Address Strobe 375CCFL 44charakterystyka

przetwornikoacutew 222termistora 264tryboacutew pracy 232

CID Card Identification 169CKE Clock Enable 375CLKIN 421COG Chip on Glass 310CRC 158 178CRC16 178CRC7 164CS Chip Select 361 375CSD Card Specific Data 172czas

dost pu do SDRAM 424adowania kondensatora 244

propagacji 281proacutebkowania 260symulacji 209

czcionki 322cz stotliwo

odchylania pionowego 428proacutebkowania 244 441 444 530przebiegu 504

Kup książkę Poleć książkę

576 AVR Uk ady peryferyjne

cz stotliwoPWM 465taktowania koprocesora 549taktowania procesora 209taktowania rdzenia 18

czyszczenie pami ci 318

DDAC Digital to Analog Converter 293 447 451

buforowanie wyj cia 294generowanie przebiegoacutew 301jitter 303kalibracja 306napi cie referencyjne 295system zdarze 297taktowanie 296tryb dwukana owy 301wykorzystanie DMA 298wyzwalanie konwersji 305

datalogger 261 265 275DD Device Density 86debuger 183

programowy 190sprz towy 185 187

decymacja 259DEBUG 219XMEGA 260

definicja symboli globalnych 36definiowanie w asnych znakoacutew 56deklaracja zapowiadaj ca 103 337dekoder DTMF 548 556DMA 254 298 402 458 518 523dost p do

danych 358 359 568danych binarnych 356 360danych wielobajtowych 31DataFLASH 137EEPROM 128FAT 136komoacuterki 375LCD 59 62 66 68operandu 30pami ci 81 384 386 387 561pami ci SDRAM 424pliku blokowy 141portoacutew IO 30rejestroacutew IO procesora 36rejestroacutew uk adu 499SPI 95sygnatury u ytkownika 565 567wska nikoacutew 32

DQM Data Mask 375DSP Digital Signal Processor 535

DTMF 535 553dyktafon 529dynamiczna alokacja pami ci 516dyrektywa global 38dyrektywy asemblera 40dzia anie

DMA 255komparatora 280timeroacutew 400

d wi k 443

EEBI External Bus Interface 361EEPROM 207eliminacja jitteru 24emulacja RS232 139

FFAT File Allocation Table 128 131FAT32 128FATFS 180filtr

dolnoprzepustowy 491drugiego rz du 470pierwszego rz du 469trzeciego rz du 471

filtrowanie sygna u PWM 468firmware 565FLASH 207format

odpowiedzi 159polecenia 158protoko u 157

funkcja_delay_ms 17 219c_zero 42callback 106 341callback() 99DataFLASH_CSEnable 100DF_FinishBufWrite() 269disk_initialize 136disk_ioctl 181disk_status 136disk_write 138DMA_SPI_init 104DTMF_GetCode 553free_re 65GPIOR0_init 507hd44780_outcmd 51hd44780_outnibble_nowait 65LCD_defchar_P 57

Kup książkę Poleć książkę

Skorowidz 577

Menu_Click_Func 515Menu_Free 516Menu_Recorder 532Menu_Run 527MS_CreateRegEntry 117MS_GetDirPos 125MS_GetRegItem 115MS_WritePages 116 118OSC_wait_for_rdy 473RecMenu_StartStop 532sprintf 142strtok 124sysclk_init() 200 209TMF_memcpy_PF 454udi_cdc_getc() 123udi_cdc_is_rx_ready() 123VS1003_Reset 506

funkcjeanalizuj ce 556biblioteczne 50biblioteki FATFS 143j zyka C 41kontrolera ST7565R 313opoacute niaj ce 17opoacute nie 219reentrant 524specjalne kontrolera 319steruj ce 314zapisu 133

fusebit 557BODACT 560BODLEVEL 560BOOTRST 559DVSDON 560EESAVE 561JTAGEN 558RSTDISBL 559SUT 559TOSCSEL 559

fusebity w AVR-libc 571

Ggenerator obrazu composite 426generowanie

d wi ku 461kolorowego obrazu 437obrazu wideo 391przebiegoacutew 301przerwa 285sygna u composite 409

g bia koloru 326gniazdo

karty SD 156VGA 396

Hhistereza 281

IIDE 11IMA ADPCM 483informacje

o kolorze 431o obrazie 434

inicjalizacjakarty 161karty SDHC 167karty SDSC 167karty SDXC 167licznika 419pami ci 119USART 505

instrukcjaicall 42movw 35nop 13 24

interfejsSCI 498SDI 498SPI 71 79RS232 120UART 123USART 71 73

interpolacja 259interpolacja w XMEGA 260inwersja obrazu 319

Jjednostki 12jitter 24 303 420

Kkalibracja

ADC 229DAC 306 564offsetu 237

kana DMA 82 522karta 154 158

mikroSD 152SD 151 152SDHC 151 152 160SDSC 160SDXC 151 160

Kup książkę Poleć książkę

578 AVR Uk ady peryferyjne

karty pami ci 151 152 157biblioteka FATFS 180budowa 152format polecenia 158inicjalizacja 161 167komunikacja 156odczyt danych 173opcje konfiguracyjne 181rejestry specjalne 169tryby pracy 153zapis danych 176zasilanie 154

kodasemblerowy 23 24C 23dost pu 24

kodowanieμ-law 481ADPCM 483Dialogic ADPCM 494informacji 166 426koloru 425znakoacutew 536

kodyformatoacutew audio 501zdarze 545

kolejno bajtoacutew 533kolor 424 430kolorowy obraz 437komparator 422

analogowy 279 280analogowy XMEGA 282okienkowy 284

kompilacja plikoacutew binarnych 350kompilator avr-gcc 11 359kompresja

ADPCM 482 486d wi ku 480IMA ADPCM 482

komunikacja z koprocesorem 504konfiguracja

4-portowa 364biblioteki 133debugera 185DMA 459 522fusebitoacutew 570kontrolera DMA 257 452komparatoroacutew 285lockbitoacutew 570LPC 371pami ci SDRAM 381PetitFS 149pinu IO 225portoacutew IO 362

preskalera 452projektu 186przerwa 219pu apki 203rejestru EVCTRL 248rejestru PER 67SPI 75sygna u CS 377typu czcionki 324urz dze IO 189USART 76zegara 383

konsolidacja 547kontroler

DMA 254 298 402 458 518 523KS108 310ST7565R 310ndash315 321

konwersjaDAC 305sygna oacutew 396wyzwalana 306

konwertercyfrowo-analogowy 426DAC 427

koprocesormp3 496VS1003B 10

korekcja fazy 466kwantyzacja 463

Llampa CCFL 44LE Latch Enable 433licznik 419

cykli 209TCC1 400timera 20

linie IO 50linie sygna owe

MISO 72 164MOSI 72SCK 72SS 72

linker 69lista

mnemonikoacutew 24modyfikowanych rejestroacutew 32

lockbity 557 561lockbity w AVR-libc 570LPC Low Pin Count 371LPCM 443 556LSB Least Significant Bit 228

Kup książkę Poleć książkę

Skorowidz 579

a cuchy formatuj ce 212czenie plikoacutew 352

Mmagistrala pami ci zewn trznej 361magnetofon cyfrowy 528makro _SFR_IO_ADDR() 39makrodefinicja

ASSERT 214HD44780_CGADDR() 53HD44780_CLR 53HD44780_DDADDR() 53HD44780_DISPCTL() 52HD44780_ENTMODE() 52HD44780_FNSET() 52HD44780_HOME 53HD44780_SHIFT() 51LOCKBITS 571

mapowanie sygna oacutew 366mapy bitowe 343marker czasowy 268maski bitowe 329matryce 49menu 335menu piktogramowe 342mierniki temperatury 262mikrokontroler

ARM 9AVR 9PIC 9XMEGA128A3U 10

MISO 72moc wydzielana 265model psychoakustyczny 495modu

alfanumeryczny 45NVM 568Xmega eXploreGO 10Xplained ATXMEGA A3BU 10Xplained ATXMEGA-A1 10Xplained XMEGA128A1 447Xplained XMEGA256A3 94Xplained XMEGA256A3BU 97 143 266

modyfikator 30const 85volatile 28 273

monitory CRT 395monochromatyczne wy wietlacze graficzne 309monochromatyczny

tryb graficzny 416tryb tekstowy 413

MOSI 72mp3 495Msps Megasamples per second 12multiplekser wej ciowy 226 283multipleksowanie adresoacutew 368 369muzyka 439

Nnadawanie kodoacutew DTMF 540nadproacutebkowanie 258nag oacutewek kontenera wav 500nagrywanie mowy 486najmniej znacz cy bit 228napi cie

offsetu 280referencyjne 223 295zasilania 239

Oobracanie obrazu 319obraz 319

composite 426kolorowy 430wideo 391

obroacutebka d wi ku 443 445obs uga

FAT 131 143klawiatury matrycowej 24LCD 58 63 67menu 337przerwania 37 38 458przerwania DMA 525przerwa w asemblerze 39przyciskoacutew 272wy wietlaczy alfanumerycznych 45

odczytblokowy 140danych 173 358

odpowied response 159R1 159R2 159R7 160

od wie anie pami ci 376odtwarzanie

d wi ku 472muzyki 447 513 518 521

offset 238offset ADC 230okno

Breakpoints 202Call stack 209dezasemblera 210

Kup książkę Poleć książkę

580 AVR Uk ady peryferyjne

oknoIO View 207podgl du zmiennych 211wyboru czcionek 324

OLED 46opcje

kompilatora 35zapisu d wi ku 445

operacjena buforach 91odczytu 173zapisu 176zapisu strony 92

operand 29operator

ascii 41

asciz 41

byte 41

section 41opoacute nienia 13 18opoacute nienie zmienne 16optymalizacja 16 68optymalizator 26organizacja pami ci 77organizacja pami ci VRAM 316oscylator 287OSD On-Screen Display 417ostrze enie 16oszcz dzanie energii 94

Ppakiet WinAVR 48pami

CGRAM 56 57 64DataFLASH 10 77 81 113 269DDRAM 49EEPROM 111FLASH 54 124 207RAM 49SDRAM 372SRAM 63 124 329 366 371VRAM 314 317

PCLK 421PCM 443PetitFS 144 149p tla

for 13while 201

pierwsza linia obrazu 321piksel 430piktogram 342pin IO 225

plikAlloc_safeh 65DataFLASHc 83DataFLASHIOc 136definesh 50delayh 14diskioh 132 136ffh 132ffconfh 132 181hd44780h 49integerh 132ioh 30LCD_transc 61LCD-transactc 66Makefile 14Menuc 19nothingo 541outfiletxt 547 551pffh 149SPIh 104stringh 113stymulacji 191 192

pliki mp3 495elf 351fon 323o 24S 24 34binarne 350 355csv 276d wi kowe 440obiektowe 352wav 500WMA 512z czcionkami 327z danymi 349

podbijacz napi cia 315podgl d

pami ci 207stosu wywo a 209zmiennych 211znakoacutew 325

pod czeniefototranzystora 262karty SD 155LCD z kontrolerem 311modu u 50pami ci 362 369 370 373termistora 262uk adu LM35 251wyj XMEGA 398

pod wietlenieCCFL 46OLED 46

Kup książkę Poleć książkę

Skorowidz 581

podwoacutejne buforowanie 255 332 457polecenia

kasowania strony 81konfiguracyjne pami ci 82kontrolera ST7565R 315odczytu bufora 82 89odczytu pami ci 81 88SDRAM 376transferu 91

polecenieACMD41 168cd 181CID 178CMD0 165CMD8 167CSD 178date 276dir 127 181dump 276erase 276get 276HD44780_CLR 51Init 178mkdir 181

po czenieDMA ze SPI 96dwoacutech komparatoroacutew 285koprocesora mp3 497LCD z mikrokontrolerem 48wyj cia XMEGA 411XMEGA z PC 121z telewizorem 431

pomiarnapi cia zasilania 239temperatury MCU 241

port IO 30 362pozycjonowanie grafik 345poacute obraz 410precyzja pomiaroacutew 260preskaler 478preskaler ADC 243program

Atmel Data Visualizer 275Audacity 443avr-objcopy 350dataloggera 265LCD Image Converter 323makeloadingtableexe 543Realterm 127 554riffstrip 483SoX 445Tracepoint 208

programowanie sygnatury u ytkownika 566protokoacute master-slave 157

prototypy 136proacutebki d wi kowe 447proacutebkowanie

8-bitowe 300nieliniowe 480

prymitywy graficzne 330przebieg PWM 468przebiegi 289 303przechwytywanie danych 276przemiatanie wej 253przerwanie 218 254 286 403

DMA 522komparatora 286

przestrze adresowa procesora 378przesy anie

danych 498polece 498

przetaktowanie procesora 436przetwornik

ADC 221analogowo-cyfrowy 221cykliczny 222potokowy 222

przyciski 272pseudooperatory 41pu apki breakpoints 197pu apki warunkowe 205punkty ledzenia 203PWM 461 462 472

RRAS Row Address Strobe 375redukcja poboru energii 242regulacja kontrastu 321rejestr 32 34rejestr AC 50

adresu wtyczki 513BASEADDR 377CID 169CMP 251CSD 172czasu utworu 512DATA 83EVCTRL 248formatu audio 512identyfikacyjny pami ci 87INTFLAGS 252kontroli basoacutew 510kontroli g o no ci 513MUXCTRL 227OCR 168PER 67poroacutewnania 249

Kup książkę Poleć książkę

582 AVR Uk ady peryferyjne

rejestr ACSCI_CLOCKF 511stanu komparatora 287stanu pami ci 86stanu uk adu 510trybu pracy 508WINCTRL 285

rejestrydost pu do pami ci RAM 513GPIOR 502IO procesora 36mikrokontrolera 25procesora 35specjalne 94specjalne karty 169uk adu VS1003B 508

relacja rodzic ndash dziecko 336reset uk adu 534rozdzielczo

LCD 329przetwornika 231PWM 463 477

rozszerzenie HiRes 477 479roacutewnanie Steinharta-Harta 263rysowanie map bitowych 343

Sschemat uk adu dataloggera 267SCI Serial Command Interface 498SCK 72SD Secure Digital 152SDI Serial Data Interface 498separator synchronizacji 422separowanie impulsoacutew synchronizacji 422shieldy 10skaler 422skaler napi cia 283skrypt makefile 353s owo kluczowe

asm 27extern 37static 68

specyfikatory lokalizacji zmiennej 213sps samples per second 12SS Slave Select 72standard PAL 410standard VGA 393sterowanie

dataloggerem 275sygna em 379

sterownik 121HD44780 49 56LCD 49 62

stos wywo a 209

strukturaFATFS 139Handle 118LCD_trans 60 63menu 338rejestru 86SimpleFSEntry 113 116SimpleFSHandle 113 118 140submenu 527systemu plikoacutew 112

sumabitowa 571kontrolna 178

sygnacomposite 409composite video output 430CS 377DREQ 497H-Sync 396synchronizacji 423V-Sync 396zegarowy CLK 374

sygna yinterfejsu EBI 363magistrali EBI 364steruj ce 375

sygnaturaprodukcyjna procesora 563u ytkownika 565

symbol__DELAY_ROUND_CLOSEST__ 17__DELAY_ROUND_DOWN__ 17_FS_FAT12 149_FS_FAT32 149_FS_MINIMIZE 133_FS_READONLY 133_FS_RPATH 135_FS_TINY 133_MAX_SS 135_MULTI_PARTITION 135_USE_DIR 149_USE_FASTSEEK 134_USE_FORWARD 134_USE_LABEL 134_USE_LFN 134_USE_LSEEK 149_USE_MKFS 134_USE_READ 149_USE_STRFUNC 134_USE_WRITE 149_VOLUMES 136F_CPU 14 15 18increment 36USE_BUSY_FLAG 50

Kup książkę Poleć książkę

Skorowidz 583

symboleglobalne 36w asemblerze 28zewn trzne 39

symulacja 198 209symulator 190synchronizacja

pami ci 331pionowa 395pozioma 394

systemplikoacutew 111 128przerwa 404zdarze 245

szablonfont_XMEGAtmpl 326image_XMEGAtmpl 343

szum 463szybko przesy ania danych 126

ledzenie wi zki 333rodowisko

graficzne 11programistyczne 11VSIDE 542WinAVR 47

Ttabela FAT 130tablica

framebuf 402 408plugintbl 552 555tekst 208z kodem wynikowym 543

taktowanieDAC 296mikrokontrolera 473

technologia OLED 44temperatura mikrokontrolera 239 241termistor 262 290

NTC 263PTC 263

termometrLM35 249 250z alarmem 251

termostat 290test uk adu VS1003B 503testowanie obrazu 319timer 16 62

TCC0 20

TCC1 399transakcja 59 62 65transakcje 17 103ndash107transakcyjna obs uga LCD 58transakcyjny dost p do SPI 95transfer 91

danych 97wynikoacutew 254

transmisja 72 83tryb

bez znaku 234ci g ej konwersji 252czterobitowy 153dwukana owy 301graficzny 416graficzny VGA 407idle 419jednobitowy 153LPC 371monochromatyczny 397 407oszcz dzania energii 94 306pracy multipleksera 226pracy SPI 157roacute nicowy 232single slope 312SPI 153tekstowy 413tekstowy VGA 397z pojedynczym wej ciem 234ze znakiem 235

trybygenerowania PWM 467pracy karty 153pracy przetwornika 231pracy SPI 74pracy uk adu 508

twierdzenie Nyquista 258tworzenie

adresu 84nak adek 417obrazu 335tablicy 543

typ__uint24 119karty 160niekompletny 60wyliczeniowy 114

typyoperandoacutew 29w AVR 34

Kup książkę Poleć książkę

584 AVR Uk ady peryferyjne

Uuchwyt handle 64 113uk ad

AD725 427 431buforowy 294CS 361DAC 284dataloggera 267detekcji awarii zasilania 559generuj cy obraz 393HiRes 477ICL7660 47LM35 250 251SampH 293sterowania sygna em 379USART 401VS1003B 496 503 508 530 538 556VS100XX 529wzmacniania sygna u 227

uk ady peryferyjne 9uruchomienie komparatora 287urz dzenie

master 72slave 72

u rednianie 259utrata danych 141u ycie wstawki asemblerowej 33

VVGA 393

Wwarto ci kalibracyjne

ADC 564oscylatoroacutew 564temperatury 564

warunkowa kompilacja 36WE Write Enable 375wej cie composite video input 425wektor przerwa 38 257wideo 391wielko pami ci 86 377w czenie DAC 299wska nik na struktur 27wska niki 32wstawki asemblerowe 24 33wtyczka 535 541 544

SineDTMF Generator 537VGA 396

wyboacuter cz stotliwo ci PWM 465 474wykorzystanie

DMA 254 518

EuroSCART 428PWM 461rejestroacutew 34

wyliczanie predyktora 489wy wietlacze

alfanumeryczne 43 45graficzne 43 309LCD 43OLED 46

wy wietlanielitera u 213map bitowych 344obrazu 333 346 406obrazu VGA 393

wywo ania zwrotne callbacks 98asynchroniczne 101synchroniczne 101

wyzwalanie konwersji 245wzmacniacz 446wzmacniacz operacyjny 279wzmacnianie sygna u 227

XXMEGA 9 18

Zzapis

bufora 269danych 176d wi ku 440 556

zasilaniekarty 154pami ci 109

zatrzask 368zatrzask 74HC573 433zatrza ni cie adresu 369zdarzenia 297zdarzenie compare match 399zegar 383 420 426zintegrowane rodowisko programistyczne 11z cze EuroSCART 425 428 429zmiana

g o no ci 527wielko ci strony 94

znaki 56

roacuted onapi cia odniesienia 284sygna u 240

Kup książkę Poleć książkę

Page 2: Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8 AVR. Ukäady peryferyjne Rejestry dost pu do pami ci RAM .....513 Rejestr adresu

Spis tre ci

Wst p 9Sprz t 10Przyk ady 11Skroacutety jednostek 12

Rozdzia 20 Zwalniamy czyli kiedy opoacute nienia s konieczne 13Opoacute nienia i XMEGA 18Wykorzystanie timeroacutew do realizacji opoacute nie 20

Rozdzia 21 czenie kodu C i asemblera 23ABI 25S owo kluczowe asm 27

Typy operandoacutew 29Dost p do portoacutew IO 30Dost p do danych wielobajtowych 31Dost p do wska nikoacutew 32Lista modyfikowanych rejestroacutew 32Wielokrotne u ycie wstawki asemblerowej 33

Pliki S 34Wykorzystanie rejestroacutew w asemblerze 34Dyrektywy asemblera 40Wywo anie funkcji j zyka C z asemblera 41

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 43Obs uga wy wietlaczy alfanumerycznych 45

Funkcje biblioteczne 50Definiowanie w asnych znakoacutew 56

Transakcyjna obs uga LCD 58Optymalizacja 68

Rozdzia 23 Interfejs SPI i USART SPI 71Tryby pracy SPI 74Konfiguracja interfejsu SPI 75Konfiguracja USART w trybie SPI 76Pami ci DataFLASH 77

Organizacja pami ci 77Interfejs SPI pami ci 79Dost p do pami ci 81

Kup książkę Poleć książkę

4 AVR Uk ady peryferyjne

Polecenia 81Rejestr identyfikacyjny pami ci 87Polecenia odczytu pami ci 88Polecenia odczytu i zapisu bufora 89Polecenia transferu pomi dzy pami ci a buforem 91Rejestry specjalne 94

Transakcyjny dost p do SPI 95czymy DMA ze SPI 96

Wywo ania zwrotne (callbacks) 98Transakcje 103

Zasilanie 109

Rozdzia 24 Budujemy system plikoacutew 111Najprostszy system plikoacutew 111

Inicjalizacja pami ci 119System plikoacutew FATFAT32 128

Obs uga FAT 131Prototypy z diskioh 136Demonstracja 139Biblioteka PetitFS 144Konfiguracja PetitFS 149

Rozdzia 25 Jeszcze wi cej pami ci czyli karty SD SDHC i spoacute ka 151Troch o budowie karty 152Tryby pracy karty 153Zasilanie karty 154Komunikacja 156

Tryb pracy SPI 157Format protoko u 157Roacute nice pomi dzy kartami 160Inicjalizacja karty 161

Rejestry specjalne karty 169CID 169CSD 172

Operacje zapisu i odczytu sektoroacutew 173Operacje odczytu 173Operacje zapisu 176

Suma kontrolna 178Program 178

Potencjalne problemy 179FATFS na karcie 180

Rozdzia 26 Debuger 183Konfiguracja debugera 185Konfiguracja projektu do debugowania 186Debuger sprz towy 187Debuger programowy (symulator) 190

Plik stymulacji 191Pu apki 197

Punkty ledzenia 203Pu apki warunkowe 205

Podgl d pami ci 207Podgl d stosu wywo a 209Okre lenie czasu symulacji 209Okno dezasemblera 210

Kup książkę Poleć książkę

Spis tre ci 5

Okno podgl du zmiennych 211a cuchy formatuj ce 212

Makrodefinicja ASSERT 214Przerwania w trakcie debugowania 218_delay_xx i symulator 219

Rozdzia 27 Przetwornik analogowo-cyfrowy 221Przetwornik potokowy vs cykliczny 222Napi cie referencyjne 223Konfiguracja pinu IO 225Multiplekser wej ciowy 226Uk ad wzmacniania sygna u 227Co to jest LSB 228Kalibracja ADC 229Pomiar 231

Rozdzielczo przetwornika 231Tryby pracy przetwornika 231Wynik pomiaru 236Kalibracja offsetu 237Pomiar napi cia zasilania i temperatury mikrokontrolera 239

Redukcja poboru energii 242Preskaler ADC 243Wyzwalanie konwersji z wykorzystaniem systemu zdarze 245

Rejestr EVCTRL w XMEGA z ADC bez potoku 248Rejestr poroacutewnania 249

Termometr LM35 250Budujemy termometr z alarmem 251

Tryb ci g ej konwersji 252Przemiatanie wej 253Przerwania 254Wykorzystanie DMA do transferu wynikoacutew 254Nadproacutebkowanie 258

U rednianie 259Decymacja i interpolacja 259Interpolacja i decymacja w XMEGA 260

Jak zwi kszy precyzj pomiaroacutew 260Budujemy datalogger 261

Termistory jako mierniki temperatury 262Program dataloggera 265

Rozdzia 28 Komparator analogowy 279Komparator mdash troch teorii 279

Czas propagacji 281Histereza 281

Komparatory analogowe XMEGA 282Multipleksery wej cia 283Komparator okienkowy 284Przerwania 286Uruchomienie komparatora 287Rejestr stanu komparatora 287

Komparator jako oscylator 287Termostat z wykorzystaniem komparatoroacutew 290

Termistory 290

Kup książkę Poleć książkę

6 AVR Uk ady peryferyjne

Rozdzia 29 DAC 293Buforowanie wyj cia 294Napi cie referencyjne 295Taktowanie 296Zdarzenia 297Wykorzystanie DMA 298

Proacutebkowanie 8-bitowe 300Tryb dwukana owy 301Generowanie jednocze nie dwoacutech przebiegoacutew 301Wersja oszcz dna 304Inne sposoby wyzwalania konwersji 305

Tryb oszcz dzania energii 306Kalibracja DAC 306

Rozdzia 30 Monochromatyczne wy wietlacze graficzne 309Pod czenie LCD do mikrokontrolera 311Budowa i funkcje kontrolera ST7565R 313Funkcje specjalne kontrolera 319

Inwersja i testowanie obrazu 319Obracanie obrazu 319Regulacja kontrastu 321Numer pierwszej wy wietlanej linii 321

Czcionki 322Ma a optymalizacja 330Podwoacutejne buforowanie 332

Adres pocz tku wy wietlania obrazu 333Menu 335

Menu oparte na piktogramach 342

Rozdzia 31 Pliki z danymi mdash jak je dodawa do projektu 349Kompilacja plikoacutew binarnych 350

czenie plikoacutew obiektowych z projektem 352Dost p do danych binarnych 356

Klasyczny sposoacuteb dost pu do danych 358Dost p do danych z wykorzystaniem przestrzeni adresowych 359

Rozdzia 32 Magistrala pami ci zewn trznej 361Pod czenie pami ci 362

Konfiguracja portoacutew IO 362Przyporz dkowanie sygna oacutew interfejsu EBI do portoacutew IO 363Konfiguracja 4-portowa 364Pami SRAM 366Pami SRAM w trybie LPC 371Pami SDRAM 372

Konfiguracja sygna u CS 377Okre lenie adresu bazowego i wielko ci pami ci 377Uk ad sterowania sygna em wyboru w trybie SRAM 379Uk ad sterowania sygna em wyboru w trybie SDRAM 379

Przyk adowa konfiguracja pami ci SDRAM 381Konfiguracja zegara 383Dost p do pami ci z poziomu j zyka C 384

Dost p do pami ci poni ej granicy 64 kB 384Dost p do pami ci powy ej granicy 64 kB 386

Kup książkę Poleć książkę

Spis tre ci 7

Rozdzia 33 Generowanie obrazu wideo 391Generowanie obrazu wideo w standardzie VGA 393

Wtyczka VGA i konwersja sygna oacutew 396Monochromatyczny tryb tekstowy VGA 397Monochromatyczny tryb graficzny VGA 407

Generowanie sygna u composite 409Standard PAL 410Monochromatyczny tryb tekstowy 413Monochromatyczny tryb graficzny 416Tworzenie nak adek (OSD) 417

Czas na kolor 424Kodowanie koloru 425Konwerter cyfrowo-analogowy 426Generator obrazu composite 426Wykorzystanie EuroSCART 428Kolorowy obraz na TV 430

Rozdzia 34 Niech zagra muzyka 439Formaty plikoacutew d wi kowych 440

Cz stotliwo proacutebkowania 441Format pliku 442

Obroacutebka d wi ku 443Program Audacity 443Program SoX 445

Wzmacniacz 446Odtwarzamy muzyk z wykorzystaniem DAC 447

Inny sposoacuteb na podwoacutejne buforowanie 457Generowanie d wi ku z wykorzystaniem PWM 461

PWM mdash troch teorii 461Filtrowanie sygna u PWM 468Odtwarzamy d wi k za pomoc 8-bitowego PWM 472Rozszerzenie HiRes i PWM o wi kszej rozdzielczo ci 477

Kompresja d wi ku 480Proacutebkowanie nieliniowe 480Kompresja ADPCM 482Kompresja IMA ADPCM 482Nagrywanie mowy z wykorzystaniem kompresji ADPCM 486Algorytm ADPCM firmy Dialogic 492

Rozdzia 35 A mo e mp3 495Koprocesor mp3 496

Sposoby pod czenia do XMEGA 496Dost p do rejestroacutew uk adu 499Format pliku wav 500Rejestry GPIOR 502Testy uk adu 502Podstawowa komunikacja z koprocesorem 504Rejestry uk adu VS1003B 508

Rejestr trybu pracy 508Rejestr stanu uk adu 510Rejestr kontroli basoacutew 510Rejestr SCI_CLOCKF 511Rejestr czasu utworu 512Rejestr formatu audio 512

Kup książkę Poleć książkę

8 AVR Uk ady peryferyjne

Rejestry dost pu do pami ci RAM 513Rejestr adresu wtyczki 513Rejestr kontroli g o no ci 513

Odtwarzamy muzyk 513Odtwarzamy muzyk z wykorzystaniem DMA 518

Magnetofon cyfrowy 528VS100XX w roli magnetofonu 529

W asne wtyczki 535DTMF jako przyk ad w asnej wtyczki 535

Budujemy w asn wtyczk 541Tworzenie tablicy z kodem wynikowym 543Budowa wtyczki 544W asna aplikacja czyli dekoder DTMF 548

Rozdzia 36 Fusebity i lockbity 557Fusebity 558

Fusebit JTAGEN 558Fusebit RSTDISBL 559Fusebit BOOTRST 559Fusebity SUT 559Fusebit TOSCSEL 559Uk ad detekcji awarii zasilania 559Watchdog 560Fusebit EESAVE 561

Lockbity 561Sygnatura produkcyjna procesora 563

Numer serii 563Numer wafra 563Po o enie na wafrze 564Pozosta e bajty konfiguracyjne 564

Sygnatura u ytkownika 565Dost p do danych z poziomu aplikacji u ytkownika 568

Bajty kalibracyjne 569Konfiguracja fuse- i lockbitoacutew w AVR-libc 570

Lockbity w AVR-libc 570Fusebity w AVR-libc 571

Dodatek A Spis rozdzia oacutew ksi ki bdquoAVR Praktyczne projektyrdquo 573

Skorowidz 575

Kup książkę Poleć książkę

Rozdzia 22

Wy wietlacze LCDalfanumeryczne

Z tego rozdzia u dowiesz si

jak pod czy popularne wy wietlacze alfanumeryczne do XMEGA

jak stworzy bibliotek obs uguj c kontroler HD44780

jak przesy a polecenia dla LCD w formie transakcji i jak czy dost pdo kontrolera z aplikacji i funkcji obs ugi przerwa

Ze wzgl du na malej ce ceny zwi kszaj c si dost pno oraz niski poboacuter energiicoraz wi kszym zainteresowaniem ciesz si wy wietlacze LCD W tym rozdzialezostan omoacutewione wy wietlacze alfanumeryczne mdash ze uwagi na ich prostot s ci -gle najcz ciej stosowanymi typami wy wietlaczy W dalszej cz ci ksi ki zostanomoacutewione monochromatyczne wy wietlacze graficzne mdash daj one o wiele wi kszemo liwo ci ale ich sterowanie jest nieco bardziej skomplikowane Ze wzgl du na ko-nieczno przesy ania sporej liczby danych wymagaj tak e szybszego interfejsu -cz cego z mikrokontrolerem St d te zanim przejdziemy do ich praktycznego wyko-rzystania b dziemy musieli bli ej zapozna si z kilkoma uk adami peryferyjnymiXMEGA

Wy wietlacze LCD alfanumeryczne zawieraj zazwyczaj scalone kontrolery st d teprocesor nie steruje bezpo rednio matryc LCD ale komunikuje si z wyspecjalizo-wanym sterownikiem ktoacutery wykonuje jego polecenia Dlatego te wykorzystanie te-go typu wy wietlaczy wymaga znajomo ci typu u ytego w nich sterownika Wy wie-tlacze LCD mog by czone z mikrokontrolerem za pomoc roacute nych magistral mdashnajcz ciej s to magistrale SPI lub roacutewnoleg e (w wersji 4- 8- i 16-bitowej) Samewy wietlacze ze wzgl du na budow i mo liwo ci mo emy podzieli na dwie grupy

Wy wietlacze alfanumeryczne mdash umo liwiaj one wy wietlanie cyfr literi innych symboli Jednak w tym typie nie mamy mo liwo ci sterowaniaposzczegoacutelnymi pikselami

Wy wietlacze graficzne mdash w tym typie mo emy sterowa stanem ka dego piksela

Kup książkę Poleć książkę

44 AVR Uk ady peryferyjne

Aby wy wietlana na LCD zawarto by a widoczna niezb dne jest pod wietlenieKupuj c wy wietlacz musimy zwroacuteci uwag czy jest on wyposa ony w jakie pod-wietlenie (mo na dosta wy wietlacze LCD bez pod wietlenia) Oczywi cie lepiej

jest wybra wy wietlacz ktoacutery ma wbudowane pod wietlenie Samo pod wietleniemo e by wykonane w roacute ny sposoacuteb W starszych modelach spotyka si pod wietle-nie oparte na lampie CCFL (ang Cold Cathode Fluorescent Lamp) Tego typu wy-wietlacze s zwykle wi ksze ci sze ale przede wszystkim wymagaj specjalnej

przetwornicy do sterowania lamp Jej zadaniem jest generowanie wysokiego napi -cia niezb dnego do za wiecenia si lampy a nast pnie utrzymywanie go w granicachzapewniaj cych jej prawid owe dzia anie Wy wietlacze tego typu s wi c k opotliwew u ytkowaniu musimy wyda czasami sporo pieni dzy na odpowiedni przetworni-c a w dodatku trwa o takiej lampy jest kroacutetsza ni diod LED Wyst puj tak eproblemy ze sterowaniem jasno ci pod wietlenia W nowoczesnych wy wietlaczachLCD stosuje si praktycznie wy cznie pod wietlenie za pomoc diod LED Nie wy-magaj one adnych wyrafinowanych przetwornic do zasilania zwykle zadowalajsi napi ciem w granicach 3 ndash 12 V maj te znacznie wi ksz trwa o Jasno citakiego pod wietlenia z atwo ci mo na sterowa wykorzystuj c technik PWMPod wietlenie oparte na diodach LED mo e mie roacute ny kolor mdash bia y oacute ty zielonyniebieski czerwony Kolor mo emy sobie wi c dobra wg w asnych preferencji Naj-nowsze wy wietlacze alfanumeryczne s wykonywane w technologii OLED mdash w tejtechnologii wiec poszczegoacutelne piksele wi c taki wy wietlacz nie wymaga pod-wietlenia Niejako przy okazji zyskujemy znacznie lepsze czasy prze czania pikseli

mdash dla wy wietlaczy LCD szczegoacutelnie w ni szych temperaturach czas prze czaniawynosi kilkadziesi t do kilkuset milisekund co powoduje pojawienie si wyra nychbdquoduchoacutewrdquo i psuje estetyk Wy wietlacze OLED nie maj tej wady Jednak zazwyczajs dro sze

Je eli mo esz staraj si wybiera wy wietlacze LCD z pod wietleniem opartym nadiodach LED lub wykonane w technologii OLED

Kolejn istotn kwesti jest regulacja kontrastu Zwykle graficzne kolorowe LCD z wbu-dowanymi sterownikami automatycznie reguluj kontrast dodatkowo sterownik mazaimplementowane rejestry umo liwiaj ce wy cznie programow zmian kontrastuW przypadku prostszych sterownikoacutew wyst puj cych najcz ciej w wy wietlaczachmonochromatycznych (zaroacutewno alfanumerycznych jak i graficznych) kontrast re-guluje si podaj c odpowiednie napi cie na jeden z pinoacutew wy wietlacza Jest to nie-zwykle istotne gdy bez w a ciwego napi cia reguluj cego kontrast na wy wietlaczunic nie zobaczymy Mo emy w takiej sytuacji odnie b dne wra enie e wy wie-tlacz nie dzia a Z kolei je li kontrast b dzie zbyt du y wszystkie piksele b d w -czone co te mo e sugerowa b dne dzia anie LCD

Jedn z cz stszych przyczyn tego e po prawid owym pod czeniu wy wietlaczaLCD nic na nim nie wida albo wszystkie piksele s w czone jest nieprawid owenapi cie na pinie reguluj cym kontrast

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 45

Obs uga wy wietlaczyalfanumerycznych

Wy wietlacze alfanumeryczne s zbudowane z matryc pikseli zwykle o wielko ci5times8 pikseli pogrupowanych razem W tym typie wy wietlacza mo emy sterowazawarto ci tak utworzonej matrycy znakowej jednak nie ma mo liwo ci sterowaniaposzczegoacutelnymi pikselami Najcz ciej spotykane wy wietlacze tego rodzaju mogwy wietla 1times8 1times16 2times16 2times20 4times16 znakoacutew gdzie pierwszy wymiar okre laliczb wy wietlanych wierszy a drugi liczb znakoacutew w wierszu Poniewa nie steru-jemy poszczegoacutelnymi pikselami do kontrolera wysy amy tylko kod znaku ktoacutery mazosta wy wietlony na danej pozycji Kontroler na podstawie kodu znaku generujeadres do specjalnego obszaru pami ci tzw tablicy znakoacutew w ktoacuterej znajduje si bajtowareprezentacja poszczegoacutelnych pikseli tworz cych znak Dla matrycy 5times8 ma ona 40bitoacutew Tablica ta jest umieszczona w pami ci ROM kontrolera LCD nie mo emy jejwi c zmienia Zwykle jednak kontrolery udost pniaj mo liwo definicji kilku w a-snych znakoacutew dzi ki czemu mo emy zdefiniowa np znaki charakterystyczne dla j -zyka polskiego Takie podej cie do generowania obrazu ma podstawow zalet jakjest prostota i zwi zane z tym niewielkie zapotrzebowanie na pami RAM Do prze-chowania np zawarto ci 8-znakowego wy wietlacza LCD wystarczy zaledwie 8 bajtoacutewpami ci Ma to szczegoacutelne znaczenie w prostych mikrokontrolerach z niewielk ilo-ci pami ci RAM Najpopularniejszym kontrolerem stosowanym w wy wietlaczach

alfanumerycznych jest HD44780 nawet je li w posiadanym wy wietlaczu jest innykontroler to mamy du szans e jest on z nim kompatybilny Typowy rozk ad sy-gna oacutew modu oacutew opartych na tym kontrolerze pokazano w tabeli 221

Tabela 221 Typowy uk ad wyprowadze modu oacutew alfanumerycznych LCD opartych na kontrolerzeHD44780

Pin Nazwa Funkcja

1 GND Masa 2 Vcc Zasilanie (typowo 5 V) 3 Vee Regulacja kontrastu 4 RS Zapis polecenia 5 RW Strob odczytzapis 6 E Wyboacuter uk adu 7 D0 Bit danych 0 8 D1 Bit danych 1 9 D2 Bit danych 210 D3 Bit danych 311 D4 Bit danych 412 D5 Bit danych 513 D6 Bit danych 614 D7 Bit danych 715 A Pod wietlenie mdash anoda16 K Pod wietlenie mdash katoda

Kup książkę Poleć książkę

46 AVR Uk ady peryferyjne

Przed pod czeniem modu u zawsze upewnij si czy podany rozk ad odpowiadau ytemu modu owi W szczegoacutelno ci sprawd rozmieszczenie linii zasilaj cych Ichniew a ciwe pod czenie grozi uszkodzeniem modu u

Zwykle piny 15 i 16 steruj ce pod wietleniem s umieszczone osobno lub te przedpinem 1 St d te zawsze nale y je dok adnie zidentyfikowa przed pod czeniem mo-du u Do pinoacutew tych nale y pod czy napi cie wykorzystane do pod wietlenia modu uPrzy czone napi cie zale y od typu zastosowanego pod wietlenia mdash CCFL foliielektroluminescencyjnej lub diod LED W dalszej cz ci b dziemy zajmowa si modu-em z pod wietleniem LED W nocie katalogowej ka dego modu u znajduj si szcze-

goacute owe informacje dotycz ce zasilania pod wietlenia Zwykle w tym celu wymaganejest napi cie 5 V a nat enie pr du pod wietlenia wynosi 20 ndash 50 mA

Wy wietlacze LCD alfanumeryczne s dost pne w handlu w wersjach dostosowanychdo roacute nych napi zasilaj cych Typowo jest to napi cie 5 V co stwarza pewne pro-blemy przy pod czeniu takiego LCD do procesoroacutew rodziny XMEGA S one zasi-lane maksymalnym napi ciem 36 V nie ma wi c mo liwo ci aby LCD i procesordzia a y w tych samych domenach napi ciowych W efekcie przy po czeniu obu uk a-doacutew musimy zastosowa konwersj napi Poniewa LCD alfanumeryczny z perspek-tywy procesora jest urz dzeniem bardzo wolnym ca kowicie wystarczaj cym rozwi za-niem jest zastosowanie szeregowych rezystoroacutew ktoacutere wraz z wbudowanymi w procesordiodami zabezpieczaj cymi b d stanowi y uk ad obni aj cy napi cie na magistralikomunikacyjnej z 5 V do bezpiecznego dla wej cia XMEGA napi cia Z drugiej stronyjedynka logiczna generowana przez procesor zasilany napi ciem 33 V jest poprawnierozpoznawana przez LCD pracuj cy z napi ciem 5 V Je li procesor by by zasilanybardzo niskim napi ciem (rz du 18 ndash 28 V) wymagany by by bardziej skompliko-wany konwerter co zosta o szerzej omoacutewione w rozdziale 7 ksi ki AVR Praktyczneprojekty

Wy wietlacze LCD wymagaj pod wietlenia bez tego wy wietlana zawarto jestpraktycznie nieczytelna W starszych konstrukcjach wykorzystywano pod wietleniew oparciu o lampy fluorescencyjne lub folie elektroluminescencyjne jednak obecniedominuj cym typem jest pod wietlenie za pomoc diod LED

Poniewa zasilamy diod LED wymagane jest do czenie szeregowego rezystoraCzasami taki rezystor jest wbudowany w modu LCD

Pod wietlenie tego typu zu ywa spor ilo energii Innym rozwi zaniem jest kupnowy wietlacza wykonanego w technologii OLED (ang Organic Light-Emitting Diode)Wy wietlacze tego typu cechuj si zdecydowanie lepszym kontrastem ale tak e wi k-sz szybko ci prze czania w zwi zku z czym mo na za ich pomoc uzyska o wielelepsze efekty animacji ktoacutere s praktycznie nieosi galne dla klasycznych wy wietlaczyLCD Nie maj one tak e innej wady LCD mdash zale no ci szybko ci prze czania seg-mentoacutew od temperatury

Wy wietlacze OLED nie maj wyprowadzonych pinoacutew odpowiedzialnych za pod-wietlenie mdash po prostu go nie wymagaj

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 47

Kolejn istotn kwesti jest pod czenie w a ciwego napi cia reguluj cego kontrastwy wietlacza Dla wi kszo ci modu oacutew LCD mie ci si ono w przedziale GND ndash Vcca dla modu oacutew o rozszerzonym zakresie temperatury w przedziale od ndash7 do 0 V mdashrysunek 221

Rysunek 221Pod czenie napi ciareguluj cego kontrasta) modu y klasyczneb) modu y o rozszerzonymzakresie temperatur

Napi cie ujemne mo na uzyska z prostej pompy adunkowej sterowanej przebiegiemPWM z procesora Poboacuter pr du z tego wej cia jest znikomo ma y Alternatywniemo na u y uk adu ICL7660 ktoacutery mo e generowa napi cia ujemne

Kolejn decyzj jak musimy podj jest sposoacuteb pod czenia modu u LCD z mikro-kontrolerem Mamy do wyboru dwie opcje mdash albo pod czamy wszystkie 8 linii da-nych (D0 ndash D7) albo tylko 4 najstarsze (D4 ndash D7) Pod czaj c tylko 4 linie danychzmniejszamy liczb niezb dnych po cze modu u z mikrokontrolerem oraz liczbwykorzystanych linii IO Ze wzgl du na znikom ilo danych przesy anych zdo mo-du u wynikaj ce z pod czenia tylko 4 linii danych spowolnienie transmisji jest bezznaczenia W trybie 4-bitowym najpierw transferowana jest starsza a potem m od-sza tetrada Niewykorzystane linie D0 ndash D3 mo na pozostawi niepod czone wi k-szo modu oacutew wewn trznie podci ga niepod czone linie poprzez rezystor do Vcc

Poniewa linie D0 ndash D7 s dwukierunkowe musimy pami ta aby podczas operacjiodczytu z LCD odpowiednie piny mikrokontrolera by y ustawione jako wej cia W prze-ciwnym przypadku dojdzie do konfliktu

Kolejnym sygna em co do ktoacuterego musimy podj decyzj jest sygna RW okre laj cytyp operacji (odczytzapis) Poniewa zwykle zapisujemy dane do LCD w a ciwie niezachodzi konieczno ich odczytywania mo emy ten sygna na sta e po czy z mas oszcz dzaj c w ten sposoacuteb jedn lini IO procesora Takie rozwi zanie ma jednak po-wa n wad mdash po jego zastosowaniu nie jest mo liwe odczytywanie sygna u zaj to cimodu u (ang busy flag) Powoduje to e pomi dzy kolejnymi zapisami do modu u mu-simy stosowa opoacute nienia dobrane na najwolniejsz mo liw okoliczno W efekcieca a transmisja jest wolniejsza ni mog aby by

Je li korzystamy z tych modu oacutew nie musimy pisa w asnych procedur ich obs ugiInstaluj c rodowisko WinAVR (lub nowy toolchain firmy Atmel) w katalogu docavr-libcexamplessdtiodemo znajdziemy gotowe funkcje obs ugi HD44780 Funkcjete nie dzia aj z mikrokontrolerami XMEGA st d te w za czonych przyk adach zosta-y one zmodyfikowane tak aby poprawnie wspoacute pracowa roacutewnie z tymi mikro-kontrolerami

Kup książkę Poleć książkę

48 AVR Uk ady peryferyjne

Mo emy te skorzysta z licznych przyk adoacutew dost pnych w internecie W dalszejcz ci rozdzia u zostan wykorzystane funkcje z pakietu WinAVR napisane przezJoerga Wunscha Pokazane przyk ady zak adaj e wy wietlacz jest po czonyz mikrokontrolerem tak jak na rysunku 222

Rysunek 222 Po czenie LCD z mikrokontrolerem Na goacuterze pod czenie do mikrokontroleraXMEGA na dole pod czenie do modu u Xplained Na schematach pokazano tak e opcjonalne sposobypod czenia pinu Vee odpowiedzialnego za regulacj kontrastu LCD

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 49

Zanim co wy wietlimy na LCD musimy pozna w jaki sposoacuteb s generowane znakiSterownik LCD zawiera w sobie niezale nie od typu u ytej matrycy 80 bajtoacutew pami ciDDRAM (ang Display Data RAM) Je li zastosowana matryca wy wietla mniejszliczb znakoacutew to cz komoacuterek pami ci jest nieu ywana Mo emy je wykorzystado innych celoacutew mdash np jako zwyk pami RAM Mo emy te u y jej do przesu-wania napisoacutew ktoacutere nie mieszcz si na wy wietlaczu Aby mo na by o umie ciznak na w a ciwej pozycji niezb dne jest poznanie organizacji pami ci kontrolera W za-le no ci od u ytej matrycy pami ta jest zorganizowana nast puj co

Dla matryc 16times1 mdash pami jest podzielona na dwa obszary ka dy zawieraj cypo 8 znakoacutew Obszar pierwszy (od lewej) ma adresy 0x00 do 0x07 a obszar drugi(prawy) adresy 0x40 do 0x47 St d te gdy wy wietla si tekst przekraczaj cygranic obszaroacutew nale y zadba aby poszczegoacutelne litery trafi y pod w a ciweadresy

Dla matryc 20times1 mdash adresy 0x00 do 0x13

Dla matryc 16times2 mdash adres pierwszej linii zaczyna si od 0x00 do 0x0f adresdrugiej linii od 0x40 do 0x4f

Dla matryc 20times2 mdash adresy pierwszej linii to 0x00 do 0x13 a drugiej 0x40 do 0x53

Dla matryc 40times2 mdash adresy pierwszej linii to 0x00 do 0x27 drugiej linii 0x40do 0x67

Dla matryc 20times4 mdash adresy pierwszej linii to 0x00 do 0x13 drugiej 0x40 do 0x53trzeciej 0x14 do 0x27 a czwartej 0x54 do 0x67

Jak wida w niektoacuterych typach wy wietlaczy po ka dej linii zostaje od kilku do kil-kunastu bajtoacutew ktoacuterych zawarto nie jest wy wietlana Ma to pewn zalet mdash mo-emy do pami ci modu u wpisywa teksty d u sze ni s wy wietlane na ekranie co

u atwia przewijanie tekstu Niestety ma to te pewn wad mdash funkcje wy wietlaj ceco na ekranie musz bdquowiedzie rdquo jak organizacj ma matryca W przeciwnym przy-padku nie ma mo liwo ci prawid owego wyliczenia adresu komoacuterki do ktoacuterej ma od-by si zapis

W dalszej cz ci rozdzia u zostanie wykorzystany modu LCD o organizacji 16times2(ale mo na te bez problemu wykorzysta dowolny inny)

Zanim b dzie mo na co wy wietli na ekranie modu musi zosta zainicjalizowanyW trakcie inicjalizacji ustawiane s podstawowe parametry pracy sterownika LCD mdashorganizacja matrycy (liczba linii) wielko czcionki (5times8 lub 8times11 pikseli) Wielkoczcionki zale y od typu pod czonej matrycy LCD Dla konkretnego modu u LCDtylko jedna z tych warto ci b dzie poprawna Oproacutecz inicjalizacji modu u nale y tak-e poprawnie ustawi stan pinoacutew IO wykorzystywanych do pod czenia modu u LCD

Wi kszo pracy zwi zanej z inicjalizacj modu u LCD odbieraniem i wysy aniemdo niego danych wykonuje biblioteka Joerga Wunscha Dostarcza ona niskopozio-mowe funkcje umo liwiaj ce komunikacj ze sterownikiem hd44780 i innymi kom-patybilnymi z nim sterownikami Wystarczy e do aplikacji w ktoacuterej planujemy wy-korzysta taki modu do czymy plik hd44780c oraz plik nag oacutewkowy hd44780h

Kup książkę Poleć książkę

50 AVR Uk ady peryferyjne

Oba pliki bdquozak adaj rdquo e istnieje plik nag oacutewkowy definesh zawieraj cy podstawo-we definicje zwi zane ze sposobem pod czenia modu u LCD z mikrokontroleremNa pocz tku nale y okre li ktoacutere linie IO zosta y wykorzystane do pod czenia modu u

define HD44780_RS A 4define HD44780_RW A 5define HD44780_E A 6define HD44780_D4 A 0

W powy szym przyk adzie do kolejnych linii portu A (A4 ndash A6) zosta y pod czonesygna y RS RW i E modu u natomiast do linii A0 ndash A3 linie D4 ndash D7 modu u LCD Wa nejest aby linie danych czy z pinami IO w kolejno ci rosn cej Biblioteka wykorzy-stuje do transmisji danych pomi dzy modu em a mikrokontrolerem tylko 4 linie danychmdash dzi ki temu mo emy zmniejszy liczb po cze a zwolnione linie IO wykorzystado innych celoacutew W pliku wyst puje jeszcze jedna definicja

define USE_BUSY_BIT 1

Okre la ona e biblioteka b dzie u ywa flagi Busy modu u LCD mdash umo liwia touzyskanie optymalnej szybko ci wspoacute dzia ania z modu em Zako czenie realizacjibie cej operacji modu sygnalizuje zmian stanu tej flagi co umo liwia niezw ocznewys anie kolejnej komendy Je li nie u ywamy flagi Busy program musi generowamaksymalne zalecane w nocie katalogowej opoacute nienia w efekcie ca a transmisja zwal-nia Po zdefiniowaniu u ywanych pinoacutew w pliku definesh mo emy rozpocz korzy-stanie z biblioteki

W pliku hd44780h s udost pnione prototypy funkcji odpowiedzialnych za wspoacute -prac z modu em LCD

Funkcje bibliotecznePodstaw modu u stanowi dwie funkcje umo liwiaj ce odpowiednio wys anie da-nych do modu u oraz ich odczytanie

void hd44780_outbyte(uint8_t b uint8_t rs)uint8_t hd44780_inbyte(uint8_t rs)

Obie funkcje wysy aj odczytuj 8-bitow dan w przypadku wykorzystania tylko4-bitowej szyny danych wysy anie i odczytywanie danych odbywa si w dwoacutech etapachDodatkowo zmienna rs okre la tryb dost pu W przypadku wysy ania danych do modu urs = 0 powoduje e dane zostan wys ane do rejestru komend a je li rs = 1 dane trafido rejestru danych Przy odczycie jest podobnie z tym e dla rs = 0 jest odczytywanaflaga Busy i rejestr AC (ang Address Counter)

Kolejna funkcja odpowiada za oczekiwanie na gotowo modu uvoid hd44780_wait_ready(bool islong)

W przypadku gdy w pliku definesh symbol USE_BUSY_FLAG ma warto 1 parametrislong jest ignorowany a optymalizator kompilatora usuwa go gdy nie jest on wy-korzystywany przez funkcj Kiedy warto USE_BUSY_FLAG jest roacute na od 1 parametr

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 51

ten okre la d ugo opoacute nienia Je li jest roacute na od 0 opoacute nienie wynosi 152 ms a je-eli jest roacutewna 0 opoacute nienie wynosi 37 s Poniewa lepiej jest u ywa flagi Busy

mo emy ten parametr ignorowa

Powy sze trzy funkcje wystarcz do komunikacji z modu em dla wygody zdefiniowanojednak kolejne Funkcje hd44780_outcmd(n) i hd44780_incmd() umo liwiaj odpowiedniowys anie polecenia do rejestru komend kontrolera lub odczytanie bitu Busy i licznikaAC Dwie kolejne mdash hd44780_outdata(n) oraz hd44780_indata() mdash umo liwiaj zapisi odczytanie rejestru danych

Oproacutecz funkcji odpowiedzialnych za komunikacj z modu em LCD zdefiniowano tak efunkcj przeprowadzaj c podstawow inicjalizacj modu u hd44780_init(void) orazfunkcj hd44780_powerdown(void) ustawiaj c wszystkie linie u yte do komunikacjiw stan 0 co umo liwia bezpieczne od czenie zasilania od modu u LCD W przypadkupozostawienia ktoacuterej z wy ej wymienionych linii w stanie 1 przy od czonym za-silaniu modu u stanowi ona jego zasilanie W efekcie mimo wy czenia modu mo epobiera znaczny pr d

Szerszego omoacutewienia wymaga funkcja hd44780_outcmd(cmd) ktoacutera umo liwia wys a-nie polecenia do rejestru polece sterownika LCD Dla wygody zdefiniowane zosta yroacute ne komendy u atwiaj ce wspoacute prac z modu em LCD Komendy te s przekazy-wane jako argument wywo ania funkcji hd44780_outcmd np

hd44780_outcmd(HD44780_CLR)

powoduje wys anie do sterownika polecenia HD44780_CLR czyszcz cego zawartopami ci DDRAM kontrolera

KomendyFunkcja hd44780_outcmd przyjmuje jako argument predefiniowane makrodefinicjeznacznie u atwiaj ce wspoacute prac z kontrolerem modu u LCD Poni ej zostan onepokroacutetce omoacutewione

HD44780_SHIFT(shift right)Ta makrodefinicja powoduje przesuni cie pozycji wy wietlanego tekstu (shift = 1)o jedn pozycj w lewo (argument right = 0) lub w prawo (argument right = 1)W przypadku gdy shift = 0 przesuwany w lewo lub prawo jest tylko kursor Wysy-aj c wielokrotnie to polecenie uzyskujemy kolejne przesuni cia o jedn pozycj

w lewo lub prawo Polecenie to s u y g oacutewnie do przesuwania tekstu Jednak ze wzgl duna du bezw adno tekstowych modu oacutew LCD nie nale y przesuwa liter cz ciej niok raz na sekund mdash cz stsze przesuwanie daje bardzo nieprzyjemne efekty wizual-ne Ka dy bufor linii jest bdquozawijanyrdquo to znaczy e po ostatnim znaku z prawej jestwy wietlany pierwszy znak z lewej i odwrotnie Nale y pami ta e d ugo buforajest sta a dla danego modelu matrycy Np dla modu oacutew 16times2 bufor jednej linii wyno-si dok adnie 40 bajtoacutew z czego 16 jest jednorazowo wy wietlanych Poni szy kodcyklicznie przewija wy wietlany tekst w lewo

lcd_puttext_P(PSTR(Test bufora i przewijania tekstunTen tekst przewija sie w lewo))while(1)

Kup książkę Poleć książkę

52 AVR Uk ady peryferyjne

hd44780_outcmd(HD44780_SHIFT(10)) _delay_ms(700)

HD44780_FNSET(if8bit twoline font5x10)Polecenie to wybiera typ interfejsu mdash 8-bitowy je li warto parametru if8bit jestroacutewna 1 lub 4-bitowy je li jest roacutewna 0 Typ interfejsu musi odpowiada sposobowipo czenia modu u z mikrokontrolerem Parametr twoline okre la czy pod czonamatryca LCD ma jedn lini znakoacutew czy dwie Matryce ktoacutere maj 4 linie tekstu straktowane przez kontroler jako matryce dwuliniowe mdash parametr twoline powinienmie warto 1 Je li dla matrycy zawieraj cej dwie lub wi cej linii ustawimy go na 0to wy wietlana b dzie tylko jedna linia (w przypadku matryc dwuliniowych goacuterna)a w przypadku matryc 4-liniowych b d wy wietlane dwie linie rozdzielone lini pust

Ostatni parametr okre la typ u ywanego generatora znakoacutew Powinien on odpowiadau ytej w module matrycy zwykle wi c jego warto wynosi 0

HD44780_DISPCTL(disp cursor blink)Ustawia roacute ne parametry pracy matrycy Je li parametr disp ma warto 1 to matrycajest w czona (wy wietla zawarto DDRAM) a je li 0 to matryca jest wy czonalecz stan pami ci DDRAM nie ulega zmianie Np kod

while(1) hd44780_outcmd(HD44780_DISPCTL(011)) _delay_ms(700) hd44780_outcmd(HD44780_DISPCTL(111)) _delay_ms(700)

powoduje naprzemienne w czanie i wy czanie matrycy w efekcie wy wietlany tekstmruga

Parametr cursor okre la czy sprz towo wy wietlany kursor ma by widoczny (war-to parametru 1) czy niewidoczny (warto parametru 0) Je li kursor jest widocznyto dodatkowo mo emy okre li czy ma miga (warto parametru blink roacutewna 1)czy nie (blink = 0) Je li kursor jest widoczny i nie miga jest wy wietlany w postacipoziomej kreski Wy wietlanie kursora mo e by u yteczne w sytuacji kiedy u yt-kownik wprowadza jakie dane W pozosta ych sytuacjach kursor mo emy wy czy

HD44780_ENTMODE(inc shift)Okre la sposoacuteb wprowadzania danych do pami ci Je li parametr inc ma warto 1 topo ka dej operacji zapisuodczytu adres pami ci jest automatycznie zwi kszany o je-den co przy piesza operacj zapisuodczytu kolejnych znakoacutew Je li warto inc jestroacutewna 0 to adres jest automatycznie zmniejszany o 1 Dodatkowo parametr shiftokre la czy wy wietlany obraz ma by automatycznie przesuwany tak aby wy wie-tla ostatnio wprowadzony znak (shift = 1) lub go nie wy wietla (shift = 0)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 53

HD44780_CLRPowoduje wyczyszczenie (wype nienie znakami o kodzie 32) ca ej zawarto ci pami ciDDRAM Jednocze nie kursor wraca do pozycji pierwszej (pierwsza linia pierwszyznak)

Niewy wietlane bajty pami ci DDRAM tak e s kasowane Je li s one u ywanedo przechowywania zmiennych programu to przed operacj kasowania nale y jeskopiowa w bezpieczne miejsce W przeciwnym przypadku zostan utracone

Wska nik adresu do pami ci DDRAM jest ustawiany na 0 zerowane jest tak e prze-suni cie

HD44780_HOMEPowoduje powroacutet kursora do pozycji pocz tkowej mdash pierwsza linia pierwszy znakWska nik adresu do pami ci DDRAM w efekcie zawiera 0 zerowane jest roacutewnieprzesuni cie wy wietlania znakoacutew w efekcie s one wy wietlane od pozycji 0

HD44780_DDADDR(addr)Ustawia nast pny adres zapisuodczytu w pami ci DDRAM na addr Tylko 7 bitoacutewargumentu addr jest branych pod uwag w zwi zku z czym mo na zaadresowa mak-symalnie 128 bajtoacutew pami ci (z czego sterownik ma tylko 80 pozosta e lokacje snieu ywane)

HD44780_CGADDR(addr)Ustawia nast pn operacj odczytuzapisu w pami ci CGRAM na addr Pod uwagbranych jest tylko 6 bitoacutew zmiennej addr w efekcie mo na zaadresowa maksymalnie64 bajty pami ci CGRAM

Przedstawione powy ej funkcje zapewniaj jedynie podstawow komunikacj z mo-du em LCD Potrzebujemy jednak ci gle funkcji odpowiedzialnej za jego inicjalizacjmdash funkcja biblioteczna przeprowadza ten proces tylko w podstawowym zakresie musi-my jeszcze zadba o w a ciwe ustawienie parametroacutew zwi zane z posiadan matryc Napiszmy wi c w asne rozwini cie funkcji inicjalizacyjnej

void lcd_init() hd44780_init() Podstawowa inicjalizacja modu u hd44780_outcmd(HD44780_CLR) Wyczy pami DDRAM hd44780_wait_ready(1000) hd44780_outcmd(HD44780_ENTMODE(1 0)) Tryb autoinkrementacji AC hd44780_wait_ready(1000) hd44780_outcmd(HD44780_DISPCTL(1 0 0)) W cz wy wietlacz wy cz kursor hd44780_wait_ready(1000)

Zauwa e po wys aniu ka dego polecenia do modu u jest wywo ywana funkcjahd44780_wait_ready(1000) odpowiedzialna za oczekiwanie a realizacja wys anego po-lecenia dobiegnie ko ca Jest to niezb dne gdy do czasu uko czenia bie cej

Kup książkę Poleć książkę

54 AVR Uk ady peryferyjne

operacji dalsze polecenia s ignorowane Jako argument podany jest parametr 1000mdash jest on bez znaczenia nasza biblioteka korzysta z flagi Busy i po prostu go ignorujePo wykonaniu powy szej funkcji modu LCD jest poprawnie zainicjalizowany a jegopami jest wyczyszczona (zawiera bajty 0x20) i w efekcie modu nic nie wy wietlaOd tej chwili mo emy wysy a znaki do wy wietlenia

Po wykonaniu inicjalizacji ekran mo e pozosta czysty lub wy wietla ca kowiciewype nione kwadraty (wszystkie piksele w czone) Je li po inicjalizacji wszystkiepiksele s w czone nale y nieco zmniejszy kontrast

Aby sobie u atwi to zadanie zdefiniujmy funkcj wysy aj c do modu u jeden znakvoid lcd_putchar(char c) static bool second_nl_seen static uint8_t line=0

if ((second_nl_seen) ampamp (c = n)ampamp(line==0)) Odebrano pierwszy znak hd44780_wait_ready(40) hd44780_outcmd(HD44780_CLR) hd44780_wait_ready(1600) second_nl_seen=false if (c == n) if (line==0) line++ hd44780_outcmd(HD44780_DDADDR(64)) Adres pierwszego znaku drugiej linii hd44780_wait_ready(1000) else second_nl_seen=true line=0 else hd44780_outdata(c) hd44780_wait_ready(40)

Funkcja ta ze wzgl du na skomplikowane adresowanie pami ci DDRAM jest zale naod konkretnego modelu modu u LCD B dzie prawid owo wspoacute pracowa z modu a-mi 2times16 2times20 i 2times40 znakoacutew W przypadku innych modu oacutew pozycje niektoacuterychznakoacutew mog by nieprawid owe

Mo emy ju wy wietla na LCD pojedyncze znaki czas na wy wietlanie tekstu Po-niewa teksty jako sta e dla zaoszcz dzenia cennej pami ci RAM przechowuje si za-zwyczaj w pami ci FLASH zdefiniujmy funkcj odczytuj c podany a cuch zna-kowy z pami ci FLASH a nast pnie umieszczaj c go na LCD

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 55

void lcd_puttext_P(prog_char txt) char ch while((ch=pgm_read_byte(txt))) lcd_putchar(ch) txt++

Powy sza funkcja wysy a kolejne znaki odczytane z pami ci FLASH na LCD za po-moc funkcji LCD_putchar Po napotkaniu znaku ko ca a cucha (0 nul) przerywa swojedzia anie

Pozostaje nam przetestowa dzia anie przedstawionych funkcjiint main() lcd_init() lcd_puttext_P(PSTR(Test LCDnDruga linia)) while(1)

Na ekranie modu u LCD powinien wy wietli si napisTest LCDDruga linia

Je li na LCD nic nie widzimy to w pierwszej kolejno ci powinni my sprawdzi kon-trast zmieniaj c napi cie na pinie Vee modu u LCD

Warto zdefiniowa jeszcze funkcj ustawiaj c pozycj od ktoacuterej b dzie wy wietlanynast pny znak

void lcd_goto(uint8_t x uint8_t y) hd44780_outcmd(HD44780_DDADDR(0x40y+x)) hd44780_wait_ready(1000)

Funkcja ta przyjmuje dwa parametry x i y okre laj ce pozycj na ktoacuterej zostaniewy wietlony nast pny znak wys any z mikrokontrolera do modu u LCD Dzi ki temuz atwo ci mo emy uaktualnia zawarto LCD bez konieczno ci ponownego prze-sy ania wszystkich danych Funkcja ta jest zale na od typu zastosowanego modu u

Ostatni funkcj jest funkcja umo liwiaj ca czyszczenie zawarto ci pami ci modu uOdpowiedzialne za to jest proste polecenie wysy ane do sterownika

void lcd_cls() hd44780_outcmd(HD44780_CLR) hd44780_wait_ready(false)

Oproacutecz czyszczenia zawarto ci pami ci modu u powoduje ono ustawienie kursoraw punkcie (00)

Kup książkę Poleć książkę

56 AVR Uk ady peryferyjne

Definiowanie w asnych znakoacutewUk ad HD44780 jest wyposa ony w 64 bajty pami ci CGRAM (ang Character Ge-nerator RAM) ktoacutera mo e przechowywa mapy bitowe 8 znakoacutew o matrycy 5times8 pikselilub 4 znakoacutew o matrycy 5times10 pikseli Przyk ad definicji znaku na matrycy 5times8 poka-zano na rysunku 223

Rysunek 223Przyk ad definicji w asnego znakuw pami ci CGRAM Znak rysujemyna matrycy 5times8 bitoacutew polazaciemnione odpowiadaj warto ci 1pola bia e warto ci 0 Wartowyliczon dla ka dej linii pikseliwpisujemy do pami ci CGRAMsterownika Najstarsze 3 bity ka degobajta (pola szare) s bez znaczeniamdash wy wietlacz pomija jeprzy wy wietlaniu obrazu

1

2

3

4

5

6

7

0 00100 = 4

01110 = 14

11111 = 31

00100 = 4

00100 = 4

00100 = 4

11111 = 31

01110 = 14

Adres Warto

Dost p do tej pami ci jest mo liwy dzi ki wys aniu polecenia ustawiaj cego adreszapisuodczytu pami ci CGRAM Po jego wys aniu wszystkie operacje zapisu i od-czytu dotycz tej pami ci a nie pami ci DDRAM Aby wroacuteci do adresowania pa-mi ci DDRAM nale y wybra jej adres lub dokona operacji wymagaj cej przesu-ni cia kursora

Pami CGRAM jest pami ci ulotn po ponownym w czeniu zasilania definicjeznakoacutew musz by ponownie przes ane przez procesor

Bity o warto ci 1 w definicji znaku odpowiadaj w czonym pikselom bity o warto-ci 0 pikselom wy czonym Najstarsze 3 bity ka dego bajta w pami ci CGRAM s

bez znaczenia mdash te pozycje nie s wy wietlane przez matryc Definiuj c znak nale-y tak e pami ta e ostatnia linia wy wietlana przez matryc (w zale no ci od wiel-

ko ci matrycy znaku linia 8 lub 10) powinna zawiera same zera mdash w tej linii b dziewy wietlany kursor

Najcz ciej matryce LCD pod czone do sterownika HD44780 maj organizacj 5times8czyli jeden znak jest definiowany przez 8 kolejnych bajtoacutew okre laj cych stan po-szczegoacutelnych linii tworz cych znak Stwoacuterzmy funkcj ktoacuterej zadaniem b dzie za a-dowanie definicji znakoacutew z pami ci FLASH mikrokontrolera do pami ci CGRAM

void lcd_defchar_P(uint8_t charno prog_uint8_t chardef) hd44780_outcmd(HD44780_CGADDR(charno8)) hd44780_wait_ready(40) for(uint8_t c=0clt8c++) hd44780_outdata(pgm_read_byte(chardef))

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 57

hd44780_wait_ready(40) chardef++

Funkcja LCD_defchar_P jako argumenty przyjmuje numer definiowanego znaku (0 ndash 7)oraz wska nik do obszaru pami ci FLASH zawieraj cego definicj znaku (obszarten zajmuje 8 nast puj cych po sobie bajtoacutew) Jak widzimy funkcja najpierw ustawiaw a ciwy adres pod ktoacuterym znajdzie si pocz tek definicji znaku w pami ci CGRAMmdash poniewa jeden znak jest opisywany za pomoc 8 bajtoacutew kolejne adresy znakoacutewto kod_znakutimes8 Nast pnie dane opisuj ce znak s adowane z pami ci mikrokontrolerai zapisywane w pami ci CGRAM sterownika Poni szy program ilustruje wykorzy-stanie funkcji LCD_defchar_P

prog_uint8_t char1[8][8]=0000000255 00000025525500000255255255 0000255255255255 00025525525525525500255255255255255255 0255255255255255255255255255255255255255255255

int main() for(uint8_t x=0xlt8x++) lcd_defchar_P(xampchar1[x][0]) Za aduj wzorce znakoacutew lcd_init() for(uint8_t x=0xlt8x++) lcd_putchar(x) Wy wietl znaki o kodach 0 ndash 7 while(1)

W pierwszej linii funkcji main nast puje za adowanie nowych definicji znakoacutew dopami ci CGRAM nast pnie inicjalizowany jest wy wietlacz po czym w pierwszejlinii s wy wietlane znaki o kodach 0 ndash 7 a wi c znaki ktoacuterych definicja zosta aprzes ana z mikrokontrolera

Zauwa e pami CGRAM podobnie jak DDRAM mo emy zapisywa i odczytywaprzed inicjalizacj modu u LCD Proces inicjalizacji jest potrzebny tylko do prawi-d owego wy wietlania na ekranie LCD

Poniewa dane potrzebne do wy wietlenia znaku s na bie co pobierane z pami cipodczas od wie ania matrycy LCD jakiekolwiek zmiany w definicji znaku kiedy jest onwidoczny na LCD poci gaj za sob natychmiastowe zmiany w wy wietlanym obrazieMo na t w a ciwo sterownika wykorzysta do stworzenia prostych animacji

void lcd_box(uint8_t y) hd44780_outcmd(HD44780_CGADDR(0)) Zaczynamy od znaku o kodzie 0 hd44780_wait_ready(40) for(uint8_t c=0cltyc++) Stwoacuterz linie z w czonymi pikselami hd44780_outdata(0xFF) hd44780_wait_ready(40) for(uint8_t c=yclt8c++) Stwoacuterz linie z wy czonymi pikselami hd44780_outdata(0x00) hd44780_wait_ready(40)

Kup książkę Poleć książkę

58 AVR Uk ady peryferyjne

int main() lcd_init() lcd_putchar(0) while(1) for(uint8_t x=0xlt8x++) lcd_box(x) _delay_ms(100) for(int8_t x=7xgt=0x--) lcd_box(x) _delay_ms(100)

Funkcja main wy wietla na LCD tylko jeden znak o kodzie 0 a nast pnie cykliczniezmienia jego definicj w pami ci CGRAM W efekcie posta znaku wy wietlana naekranie ci gle si zmienia

Transakcyjna obs uga LCDPokazana do tej pory obs uga LCD alfanumerycznego mia a pewne wady Jak wiemyoperacje odwo uj ce si do kontrolera LCD s niezwykle wolne cykl odczytuzapisudowolnego rejestru kontrolera trwa co najmniej 1600 ns co dla MCU taktowanegozegarem 32 MHz przek ada si na czas wykonania oko o 52 instrukcji asemblera Cogorsza wi kszo komend realizowanych przez kontroler jest wykonywana w czasieoko o 37 s co przek ada si na tysi ce zmarnowanych taktoacutew MCU St d te jaki-kolwiek zapisodczyt LCD to z perspektywy programu straszne marnotrawstwo czasu

Problem ten dotyczy ka dego urz dzenia IO ktoacutere dzia a wolniej ni procesor W takiejsytuacji warto napisa pewn warstw po redni mdash sterownik mdash ktoacuterego zada-niem b dzie buforowanie da dost pu do urz dzenia i rozstrzyganie konfliktoacutewdzi ki czemu roacute ne cz ci programu b d bdquomia y wra enierdquo e maj wy czny do-st p do urz dzenia

Pokazane wcze niej funkcje obs ugi LCD maj jeszcze jedn wad mdash nie s wspoacute bie -ne czyli nie mo na ich wykonywa jednocze nie w kilku miejscach programu w tymw szczegoacutelno ci w programie g oacutewnym i w funkcjach obs ugi przerwa W wielu przy-padkach ta wada jest bez znaczenia jednak czasami jest uci liwa mdash dla przyk adugdy na wy wietlany tekst chcieliby my na o y inne informacje np o dacie lub godzi-nie Oczywi cie wy wietlanie mo na zorganizowa tak aby nie by o potrzeby pisaniawspoacute bie nego kodu np poprzez zastosowanie bufora pami ci VRAM kontrolera LCDRodzi to jednak kolejne problemy i jest ma o eleganckie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 59

Zastanoacutewmy si w jaki sposoacuteb najlepiej jednocze nie rozwi za problem wolnegodost pu do urz dzenia i wspoacute bie no ci kodu Rozwi zaniem mo e by wprowadze-nie tzw transakcji Transakcj nazywamy zbioacuter operacji tworz cych pewn ca-o To co wyroacute nia tak wykonywany zestaw operacji to atomowo spoacutejno

izolacja i trwa o Pod tymi terminami kryje si istota wykonywanej operacji Ato-mowo transakcji zapewnia e jest ona wykonywana w sposoacuteb niepodzielny co gwa-rantuje nam prawid ow wspoacute prac z danym urz dzeniem IO w tym przypadku kon-trolerem LCD Wa na dla nas jest tak e izolacja mdash dzi ki temu inne operacje na LCD(inne transakcje) nie b d mia y wp ywu na wynik aktualnie wykonywanej transakcjimdash nie b d zak oacuteca y jej wykonania z drugiej strony nasza transakcja nie zak oacuteciwykonania innych Trwa o z kolei zagwarantuje nam e je li sterownik potwierdziwykonanie transakcji to znaczy e efekt jej dzia ania jest wy wietlony na LCD Tacecha nie jest nam a tak potrzebna mdash jest ona wydawa oby si oczywista Niemniej jestto pewna gwarancja e ca a operacja przebieg a poprawnie i w efekcie LCD znajdujesi w okre lonym przez nas stanie Tyle teorii przejd my do praktyki

Kody poni szego przyk adu znajduj si w katalogu PrzykladyLCD-alfaLCD-transact

Aby zapewni transakcyjny dost p do LCD musimy stworzy pewne struktury danychktoacuterych zadaniem b dzie przechowywanie informacji o operacjach sk adaj cych sina transakcje i stanie ich wykonania W tym celu pos u ymy si wiadomo ciami z roz-dzia u 5 bdquoJak uporz dkowa chaos czyli z o one typy danych i listyrdquo Do przecho-wywania oczekuj cych transakcji pos u ymy si buforem pier cieniowym zanimjednak go zaimplementujemy zastanoacutewmy si jak powinna wygl da struktura prze-chowuj ca informacje o transakcji Struktura ta powinna zawiera co najmniej

pole danych (data) z informacjami ktoacutere maj by przes ane do kontrolera LCD

pole okre laj ce liczb danych do wys ania (len)

pole okre laj ce realizowane polecenie dla LCD (cmd) mdash pole to pos u yprogramowi sterownika do w a ciwej interpretacji danych znajduj cych siw polu data

kilka poacutel kontrolnych przechowuj cych informacje potrzebne do realizacjisamej transakcji Jedno z nich mdash Ready mdash b dzie przyjmowa warto trueje li dana transakcja zosta a zrealizowana lub false w przeciwnym przypadkuZnaczenie drugiego pola mdash SelfDel mdash mo e wydawa si nieco enigmatycznepole to okre la czy pami przydzielona dla transakcji ma by zwolnionaw sterowniku LCD (warto true) czy te zostanie zwolniona w programie(warto false)

Oto jak mo e wygl da struktura definiuj ca transakcj typedef struct volatile bool Ready 1 true je li transakcja zosta a zrealizowana bool SelfDel 1 true je li pami przydzielona transakcji ma zosta zwolniona LCD_Cmd cmd 2 Polecenie do zrealizowania uint8_t len 6 D ugo polecenia

Kup książkę Poleć książkę

60 AVR Uk ady peryferyjne

unsigned 0 Wyroacutewnanie do granicy bajta uint8_t data[] Dane transakcji LCD_trans

Nale y zwroacuteci uwag na poleunsigned 0

Nie definiuje ono adnego pola struktury ale jedynie informuje kompilator e kolejnepole (w naszym przyk adzie o nazwie data) ma by wyroacutewnane do granicy bajta mdashdzi ki temu dost p do kolejnego pola b dzie odbywa si szybciej Z kolei samo poledata jest zadeklarowane jako tzw typ niekompletny

Typ niekompletny (ang incomplete type) to typ ktoacuterego rozmiaru nie da si okre li

W pokazanym przyk adzie rozmiaru pola data nie da si okre li gdy zosta on za-deklarowany jako typ tablicowy z tym e nie podano wielko ci tablicy Wielko ci niepodano gdy na etapie deklaracji struktury nie wiemy jakiej wielko ci dane b d w niejprzechowywane Tego typu deklaracja ma bardzo powa ne konsekwencje mdash skorowielko ci pola data nie da si okre li to jaki b dzie wynik dzia ania operatora sizeof(LCD_trans) Kompilator stara si jako wybrn z tej sytuacji w zwi zku z czym

zwroacuteci wielko struktury ale tak jakby pole data w ogoacutele nie istnia o mdash jego roz-miar b dzie wynosi 0 W ramach wiczenia zastanoacutew si ile bajtoacutew pami ci b dziezajmowa a struktura LCD_trans

Skoro dysponujemy ju struktur przechowuj c poszczegoacutelne transakcje pora nastworzenie obiektu przechowuj cego kolekcj transakcji Dodanie kolejnej strukturyb dzie polega o na dodaniu jej do takiego obiektu z drugiej strony program sterownikaLCD b dzie moacuteg z tej kolekcji pobiera kolejne transakcje do realizacji Opis ten przy-pomina opis dzia ania bufora pier cieniowego mdash z jednym wyj tkiem mdash po zape nie-niu ca ego bufora nie b dziemy usuwa niezrealizowanych transakcji lecz zabloku-jemy dodawanie kolejnych W tym celu pos u ymy si definicj nast pnej struktury

typedef struct LCD_trans elements[LCD_MAXTRANS] Wska niki do transakcji uint8_t Beg Pierwszy element bufora uint8_t Count Liczba elementoacutew w buforze CircBuffer

Struktura ta zawiera deklaracj tablicy wska nikoacutew na transakcje (pole elements)Poniewa jest to tablica musimy zna liczb jej elementoacutew mdash jest ona zadeklarowanaw sta ej LCD_MAXTRANS

define LCD_MAXTRANS 10 Maksymalna liczba pami tanych transakcji

Do realizacji bufora s potrzebne jeszcze dwa pola Beg wskazuj ce na pierwsztransakcj w buforze oraz pole Count okre laj ce liczb transakcji znajduj cych siw buforze Je li Count == 0 to znaczy e w buforze nie ma adnych oczekuj cychtransakcji a je li Count == LCD_MAXTRANS to znaczy e bufor jest pe ny i nie mo na

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 61

dodawa do niego kolejnych transakcji W a ciwo t wykorzystuj dwie zdefiniowanew pliku LCD_transc funkcje

static inline bool cbIsFull(CircBuffer cb) return cb-gtCount == LCD_MAXTRANS

static inline bool cbIsEmpty(CircBuffer cb) return cb-gtCount == 0

Jak pami tamy w przypadku funkcji modyfikatory static inline powoduj e danafunkcja nie b dzie istnie jako samodzielna lecz w ka dym miejscu w ktoacuterym jestwywo ywana jest wstawiany raczej jej kod a nie wywo anie Ma to znaczenie dlakroacutetkich funkcji (a wi c takich jak pokazane powy ej) dla ktoacuterych koszty wywo anias zazwyczaj wi ksze ni koszty umieszczenia cia a funkcji w miejscu jej wywo aniaTego typu funkcje zachowuj si w sposoacuteb zbli ony do makrodefinicji (z tym e re-spektuj wszystkie regu y j zyka C w szczegoacutelno ci kolejno operatoroacutew czy kon-trol typoacutew)

Takie funkcje jako argument pobieraj adres bufora na ktoacuterym maj operowa W na-szym przypadku bufor jest zdefiniowany nast puj co

static CircBuffer LCD_TransBuffer Bufor na transakcje

Nale y zauwa y e jest on zdefiniowany jako struktura globalna z modyfikatoremstatic Modyfikator ten ogranicza zasi g widoczno ci zmiennej LCD_TransBuffer dopliku w ktoacuterym zmienna ta zosta a zdefiniowana (w tym przypadku modyfikator staticjest niejako przeciwie stwem modyfikatora extern) Dzia anie to ma jedynie znaczeniekosmetyczne mdash uniemo liwia odwo anie si do bufora za pomoc funkcji ktoacutere niezosta y zdefiniowane w miejscu jego definicji Oproacutecz funkcji umo liwiaj cych okre-lenie stanu bufora potrzebne s jeszcze funkcje umo liwiaj ce dodanie i pobranie trans-

akcji Pierwsz funkcj b dzie funkcja dodaj ca transakcj do buforabool cbAdd(CircBuffer cb LCD_trans elem) ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsFull(cb)) return false Czy jest miejsce w kolejce uint8_t end = (cb-gtBeg + cb-gtCount) LCD_MAXTRANS cb-gtelements[end] = elem Dodaj transakcj ++cb-gtCount Liczba elementoacutew w buforze return true Wszystko OK

Funkcja ta dodaje transakcj (zmienna elem) do bufora ko owego Zanim transakcjazostanie dodana sprawdzane jest czy w buforze jest miejsce mdash je li nie funkcjazwroacuteci false Je li dodanie jest mo liwe warto licznika okre laj cego liczb trans-akcji przechowywana w buforze (Count) zwi ksza si o jeden Warto zastanowi si te dlaczego praktycznie ca e cia o tej funkcji jest zamkni te w sekcji atomowej (ATOMIC_BLOCK) Jedn z cech naszego sterownika ma by mo liwo wspoacute bie nego dost pu

Kup książkę Poleć książkę

62 AVR Uk ady peryferyjne

do LCD mdash to znaczy e danie np zapisu do LCD mo e wyst pi zaroacutewno w g oacutewnejp tli programu jak i asynchronicznie w przerwaniu St d te wynika e funkcja do-daj ca transakcj musi by napisana w sposoacuteb zapewniaj cy jej poprawn prac w sytu-acji gdy zostanie ona przerwana i ponownie wywo ana przed zako czeniem dzia aniajej poprzedniej instancji Umieszczenie cia a tej funkcji w sekcji atomowej nam to za-pewnia mdash dzi ki temu bufor transakcji zawsze b dzie spoacutejny Dla zaspokojenia cie-kawo ci warto usun sekcj atomow i sprawdzi jak wtedy b dzie zachowywa si tafunkcja i jak wp ynie to na spoacutejno przechowywanych danych

Drug niezb dn funkcj jest funkcja odczytuj ca bufor transakcji i zwracaj ca trans-akcj do zrealizowania (lub NULL je li adnej transakcji nie ma w buforze)

LCD_trans cbRead(CircBuffer cb) LCD_trans elem ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsEmpty(cb)) return NULL Bufor pusty nie mo na zwroacuteci elementu elem = cb-gtelements[cb-gtBeg] cb-gtBeg = (cb-gtBeg + 1) LCD_MAXTRANS -- cb-gtCount Zmniejszamy liczb elementoacutew pozosta ych w buforze return elem

Funkcja ta jest bardzo podobna do poprzedniej mdash najpierw sprawdza czy bufor za-wiera jak oczekuj c transakcj (cbIsEmpty(cb)) je li tak to zwraca adres opisuj -cej j struktury i zmniejsza liczb transakcji oczekuj cych (pole Count) W ten sposoacutebmamy zrealizowan ca funkcjonalno zwi zan z obs ug bufora pier cieniowegoPokazane funkcje s uniwersalne i z bardzo podobnych (lub wr cz tych samych) b -dziemy korzysta w kolejnych rozdzia ach w kontek cie np obs ugi transakcji zwi -zanych z interfejsami szeregowymi

Pora przej do samego sterownika LCD Jego zadaniem b dzie sprawdzenie czyw buforze oczekuj jakie transakcje do realizacji a je li tak to ich wykonanie Ponie-wa dane do LCD mog by wysy ane co okre lony minimalny czas znacznie d u -szy ni czas jakiego na to zadanie potrzebuje mikrokontroler do wysy ania kolejnychpaczek danych pos u ymy si timerem Timer b dzie generowa przerwanie nadmiaru(TCD0_OVF_vect) ktoacutere b dzie wyznacza o tempo w jakim kolejne porcje danych b -d trafia y do LCD Z noty katalogowej kontrolera wynika e minimalny czas trwa-nia wysokiego stanu sygna u Enable to 230 ns a okres tego sygna u nie powinien bykroacutetszy ni 500 ns Poniewa nasz dost p do LCD odbywa si w sposoacuteb nieblokuj cyMCU wi c szybko wysy ania danych do LCD jest bez znaczenia St d te w poka-zanym przyk adzie przyj to e dane b d wysy ane co 4 s co okre la sta a

define LCD_ACCESSTIME 0000004

Poniewa komunikacja z LCD odbywa si w sposoacuteb nieblokuj cy nie zale y nam tena czasie (i tak w stosunku do czasu od wie ania samego LCD jest on bardzo kroacutetki)w efekcie nie ma potrzeby odczytywania flagi busy kontrolera Dzi ki temu w cz ciprzypadkoacutew mo emy w ogoacutele zrezygnowa z sygna u wyboru RW i wymusi jego sta y

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 63

poziom logiczny umo liwiaj cy zapis do LCD Dzi ki temu mo na zaoszcz dzi do-datkowy pin IO1

Ca a logika naszego sterownika jest zawarta w funkcji obs ugi przerwania przepe nieniatimera (TCD0_OVF_vect) Poniewa LCD jest po czony z MCU w trybie 4-bitowym(dla zaoszcz dzenia liczby wykorzystanych pinoacutew IO) kolejne 8-bitowe dane muszby podzielone na dwie tetrady i wys ane do LCD w kolejno ci starszam odsza tetradaInformacja o aktualnie wysy anych danych jest umieszczona w zmiennej trans o typie

static struct uint8_t pos 6 Pozycja w polu danych aktualnej transakcji uint8_t nibble 1 Ktoacutera tetrada jest wysy ana seq

Dlaczego tak Dzi ki wykorzystaniu struktury i poacutel bitowych mo na zaoszcz dzi je-den bajt pami ci SRAM Ze wzgl du na wielko pami ci obs ugiwanej przez kon-troler LCD mo emy by pewni e transakcje zawieraj ce wi cej ni 63 bajty s ra-czej nierealne (nie mia yby wi kszego sensu) St d te do przechowywania informacjio aktualnie wysy anym bajcie danych wystarczy 6 bitoacutew mdash tyle samo zosta o wyko-rzystanych do okre lenia d ugo ci pola danych transakcji w strukturze LCD_trans Zaosz-cz dzony bit mo na po wi ci na flag nibble okre laj c ktoacutera tetrada (m odszastarsza)jest wysy ana Bez poacutel bitowych flaga ta zaj aby dodatkowy bajt pami ci

Przejd my do implementacji sterownika Pierwsz rzecz jak nale y sprawdzi jestto czy w buforze czeka jaka transakcja do zrealizowania Odpowiedzialny za to jestfragment kodu obs ugi przerwania nadmiaru timera

if(trans == NULL) Nic do zrobienia sprawd my czy jaka transakcja oczekuje trans=cbRead(ampLCD_TransBuffer) Czy jest jaka oczekuj ca transakcja seqpos=0 seqnibble=0 if(trans == NULL) TCD0_CTRLA=TC_CLKSEL_OFF_gc Nie ma adnych transakcji mdash wy cz timer

W przypadku gdy adna transakcja nie oczekuje na realizacj timer jest wy czanymdash dzi ki temu nie b d zg aszane kolejne przerwania przepe nienia i MCU nie b -dzie traci czasu na ich obs ug Co prawda wynikaj cy z tego zysk czasowy jest mar-ginalny lecz ma to istotniejsz konsekwencj mdash w przypadku usypiania MCU zb d-ne przerwanie timera nie b dzie niepotrzebnie wybudza o procesora W takiej sytuacjiponowne w czenie timera nast pi dopiero w funkcji dodaj cej transakcj do kolejkimdash a wi c w sytuacji gdy mamy pewno e istnieje oczekuj ca transakcja

Druga cz funkcji obs ugi przerwania jest zwi zana z realizacj samej transakcjiW pokazanym przyk adzie zaimplementowano tylko jeden typ transakcji mdash daniezapisu a cucha tekstowego pod wskazany adres VRAM (na okre lonej pozycji LCD)Je li zajdzie taka potrzeba programista mo e zaimplementowa inne polecenia i doda

1 Warto zauwa y e w bdquoklasycznejrdquo obs udze LCD te nie musimy czyta stanu flagi busy zamiast tego

wystarczy wprowadza p tle opoacute niaj ce Jednak poniewa taka obs uga blokuje MCU nie jest onazalecana Wady tej nie ma dost p transakcyjny co jest jego dodatkow zalet

Kup książkę Poleć książkę

64 AVR Uk ady peryferyjne

kod odpowiedzialny za ich obs ug Zauwa my e ka da transakcja musi zawieraadres pocz tku pami ci wideo od ktoacuterego b dzie zapisywany tekst Dzieje si takdlatego e transakcja wykonana wcze niej mo e ustawi wska nik zapisu na dowolnejkomoacuterce pami ci W efekcie tekst z kolejnej transakcji by by wy wietlany od komoacuterkina ktoacuterej zako czy si zapis poprzedniej transakcji Takie dzia anie oczywi cie jestniedopuszczalne st d te ka dy zapis do pami ci wideo poprzedza ustawienie rejestruindeksowego Problem ten mo na rozwi za tak e w inny sposoacuteb mdash poprzez wpro-wadzenie tzw uchwytoacutew (ang handlers) ktoacutere zawiera yby stan kontrolera LCDNiemniej to rozwi zanie dodatkowo komplikowa oby nasz sterownik Struktura danych(zawartych w polu data) ma wi c nast puj cy format

bajt nr 0 zawiera warto pozycji od ktoacuterej nale y dokonywa zapisu pami ciwideo mdash jest to warto przesy ana do rejestru okre laj cego adres zapisu

kolejne bajty zawieraj a cuch znakowy ktoacutery nale y umie ci w pami ciCGRAM

Poniewa bajt nr 0 zawsze zawiera warto wpisywan do rejestroacutew steruj cych kon-trolera podczas jego wysy ania jest ustawiana linia RS sygnalizuj ca zapis do rejestruPodczas wysy ania kolejnych bajtoacutew linia ta jest zerowana w zwi zku z czym zapisodbywa si do pami ci CGRAM

Kod obs uguj cy transakcj wygl da nast puj coif(trans) Jest transakcja do zrealizowania uint8_t dat=trans-gtdata[seqpos] if(seqnibble == 0) datgtgt=4 To trzeba zmieni je li linie danych nie s po czone z pinami 0 ndash 3 portu IO hd44780_outnibble_nowait(dat amp 0x0F seqpos = 0) Zapisujemy rejestr steruj cy lub dane ++seqnibble if(seqnibble == 0) ++seqpos Co drug tetrad zwi kszamy pozycj bufora if(seqpos gt= trans-gtlen) trans-gtReady=true Koniec transakcji if(trans-gtSelfDel) free_re(trans) Zwolnij pami transakcji je li tak sobie yczy programista trans=NULL Koniec transakcji CLR(OUT HD44780_E)

Ta cz przerwania wysy a kolejne tetrady do kontrolera LCD Warto zastanowi sinad dzia aniem sekwencji

++seqnibble

Poniewa pole nibble jest jednobitowe operacja inkrementacji prowadzi do zmianystanu tego pola na przeciwny (pole to ma warto 0 lub 1) Kiedy zostan wys anewszystkie dane przeznaczone dla kontrolera obs uga transakcji ko czy si Stan tensygnalizuje nadanie warto ci true polu Ready struktury LCD_trans Dzi ki temu pro-gram mo e sprawdzi asynchronicznie w stosunku do przerwania kiedy transakcjauleg a zako czeniu Opcjonalnie jest wykonywana jeszcze jedna funkcja mdash je li poleSelfDel ma warto true to pami zarezerwowana na transakcj jest automatycznie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 65

zwalniana W tym celu wykorzystuje si funkcj free_re ktoacuterej prototyp jest zade-klarowany w pliku Alloc_safeh Funkcja ta wywo uje funkcj biblioteczn free ktoacute-ra zwalnia pami przydzielon dynamicznie na stercie Poniewa funkcja ta nie jestfunkcj reentrant nale y stworzy odpowiedni bdquoprotez rdquo opakowuj c j w blokatomowy co zapewnia e nie zostanie ona ponownie wywo ana zanim jej poprzed-nia instancja nie zako czy dzia ania Oczywi cie lepszym rozwi zaniem by oby napi-sanie w asnych funkcji dynamicznej alokacji pami ci ktoacutere b d reentrant

Bardzo wa ne jest aby pole SelfDel mia o warto true wy cznie dla transakcjidla ktoacuterych pami zosta a przydzielona dynamicznie funkcj malloc (lub jej po-chodnymi) W pozosta ych przypadkach pole to musi mie warto false mdash nie-stosowanie si do tej regu y spowoduje b d mened era pami ci i najprawdopo-dobniej nieprzewidywalne dzia anie programu

Drug wa n zasad jest aby zmienna zawieraj ca dane transakcji nie by azmienn automatyczn mdash zmienne takie s automatycznie niszczone po opusz-czeniu zawieraj cej je funkcji W rezultacie obszar pami ci zawieraj cy danetransakcji mo e zosta wykorzystany przez inne zmienne co spowoduje uszkodzeniezawartych w nim danych

Pami przydzielona transakcji musi by alokowana w sposoacuteb dynamiczny (funkcjamalloc_re) ewentualnie mo e to by pami alokowana dla zmiennej globalnej lubstatycznej mdash zmienne tego typu istniej przez ca y czas ycia programu

Warto te zauwa y e instrukcje steruj ce stanem linii Enable kontrolera LCD(SET(OUT HD44780_E) i CLR(OUT HD44780_E)) s rozdzielone wieloma innymi in-strukcjami Dzi ki temu generowany impuls dodatni tego sygna u ma czas trwania gt230 ns wymagany w specyfikacji kontrolera Nawet dla XMEGA taktowanej zegarem32 MHz 230 ns przek ada si na oko o 7 instrukcji asemblera mdash czas jaki z pewno-ci up ynie pomi dzy wykonaniem obu powy szych instrukcji steruj cych

Do wysy ania danych do kontrolera zosta a wykorzystana nieco zmodyfikowanafunkcja hd44780_outnibble_nowait roacute ni ca si od jej protoplasty hd44780_outnibbletylko tym e nie czeka na sygna braku zaj to ci mikrokontrolera (nie realizuje teopoacute nie ) Nie jest to potrzebne gdy kolejne tetrady s wysy ane w odst pach cza-sowych okre lanych przez timer

Mamy wi c zapewnion obs ug transakcji i mo liwo transakcyjnego wy wietlaniadanych na LCD musimy jeszcze mie funkcj ktoacutera tworzy odpowiednie transakcjemdash jest odpowiednikiem funkcji bezpo rednio wysy aj cej dane znakowe do LCDOdpowiednikiem tym jest pokazana poni ej funkcja

bool LCD_PutText_B(uint8_t x uint8_t y char txt LCD_trans buf bool autodel) buf-gtcmd=LCD_Text buf-gtReady=false buf-gtSelfDel=autodel Czy zwolni pami po zako czeniu transakcji buf-gtdata[0]=HD44780_DDADDR(x+y0x40) Ustaw adres w DDRAM strcpy((char)ampbuf-gtdata[1] txt) Skopiuj dane tekstowe + NULL

Kup książkę Poleć książkę

66 AVR Uk ady peryferyjne

buf-gtlen=strlen(txt) + 1 D ugo tekstu + pozycji + NULL ndash 1 bool ret=cbAdd(ampLCD_TransBuffer buf) if((ret==false) ampamp (autodel)) free_re(buf) Brak miejsca w kolejce else TCD0_CTRLA=TC_CLKSEL_DIV1_gc Preskaler 1 mdash odblokuj timer return ret

Funkcja ta buduje transakcj odpowiedzialn za wy wietlenie napisu txt na wskaza-nej pozycji x y LCD Wszystkie dane o transakcji zostan umieszczone w buforzew pami ci ktoacuterej adres jest okre lany wska nikiem buf Pami w buforze musi bywystarczaj co du a aby pomie ci ca transakcj Dodatkowy parametr autodel okre laczy pami ta ma by automatycznie zwalniana po obs u eniu transakcji (true) czynie (false) Je li transakcj uda o si umie ci w kolejce funkcja zwraca true Wartozauwa y e w takim przypadku funkcja uruchamia te timer (w naszym przypadkujest to timer TCD0) odpowiedzialny za generowanie przerwania Funkcja obs ugi prze-rwania wysy a dane do LCD

Pewn odmian powy szej funkcji jest funkcjabool LCD_PutText(uint8_t x uint8_t y char txt) LCD_trans trans=malloc_re(sizeof(LCD_trans) + strlen(txt) + 2) bool ret=LCD_PutText_B(x y txt trans true) return ret

Wykorzystuje ona funkcj LCD_PutText_B z tym e najpierw alokuje dynamiczniepami potrzebn na przechowanie tworzonej transakcji

Mamy komplet potrzebnych funkcji a wi c sprawd my jak ca o sprawdza siw praktyce W pliku LCD-transactc znajduje si kod pokazuj cy jak dzia aj naszetransakcje Aby to by o mo liwe nale y zainicjalizowa kontroler LCD

LCD_init()

Wykorzystujemy tu znan ju funkcj inicjalizuj c mdash nie ma potrzeby jej zmienia gdy operacja inicjalizacji LCD jest jednorazowa i nie trzeba wykonywa jej w posta-ci transakcji W drugim kroku musimy zainicjalizowa wykorzystywany timer i systemprzerwa

LCD_Timer_init(ampTCD0)PMIC_CTRL|=PMIC_LOLVLEN_bm Odblokuj przerwania niskiego poziomusei()

Poniewa dost p do LCD z pewno ci nie jest czynno ci krytyczn czasowo prze-rwaniom timera nadano najni szy priorytet Dzi ki temu mo na innym bardziej kry-tycznym przerwaniom nada wy sze priorytety i uzyska w ten sposoacuteb zmniejszenieczasu latencji obs ugi przerwa Sama inicjalizacja timera jest niezwykle prosta

void LCD_Timer_init(TC0_t tc) tc-gtINTCTRLA=TC_OVFINTLVL_LO_gc Odblokuj przerwania nadmiaru timera i nadaj im niski priorytet tc-gtPER=F_CPULCD_ACCESSTIME Przerwanie co 4 us (niezale nie od F_CPU)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 67

Sprowadza si ona tylko do odblokowania mo liwo ci zg aszania przerwania nadmia-ru oraz konfiguracji rejestru PER tak aby przerwania by y generowane co ok 4 s mdashniezale nie od cz stotliwo ci taktowania CPU Mo emy wi c przyst pi do wy wie-tlenia pierwszego napisu

LCD_PutText(00 Numer)

Powy sza funkcja ma jedn wad mdash alokuje dynamicznie pami po ka dym wywo-aniu (pami ta jest automatycznie zwalniana po obs u eniu transakcji) niemniej

ca y proces jest czasoch onny Mo emy tego unikn alokuj c pami bdquor cznierdquo i wielo-krotnie wykorzystuj c zaalokowany blok pami ci Ilustruje to poni szy przyk ad

LCD_trans buf=malloc_re(sizeof(LCD_trans) + 7)

Zmienna buf wskazuje na obszar pami ci ktoacutery mo e pomie ci a cuch 5-znakowyTyle wystarczy na potrzeby tego przyk adu mdash na LCD b d wy wietlane kolejneliczby w zakresie 0 ndash 65 535 najd u sza ma 5 znakoacutew st d te nasz bufor ma tak a nieinn d ugo

while(1) utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(60 bufstr buf false) while(LCD_IsTransCompleted(buf))

Do konwersji liczby na a cuch u yto funkcji bibliotecznej utoa (nag oacutewek stdlibh)Poniewa d ugo a cucha po konwersji jest zmienna (co spowodowa oby pozosta-wianie na LCD bdquoduchoacutewrdquo po poprzednich konwersjach) w kolejnej linii brakuj ceznaki uzupe niono spacjami Nast pnie tworzona jest transakcja w obszarze pami ciprzydzielonym zmiennej buf Ostatnia p tla while jest odpowiedzialna za oczekiwa-nie na zako czenie realizacji transakcji Po jej zako czeniu p tla jest wykonywana odpocz tku

Uwa ny czytelnik z pewno ci zauwa y e pami przydzielana funkcj malloc_renie jest nigdzie zwalniana mdash w normalnej sytuacji spowodowa oby to wyciek pami -ci W naszym przyk adzie jednak program nigdy si nie ko czy nie ma wi c potrzebyzwalniania pami ci wskazywanej przez zmienn buf

Powy szy przyk ad pokazuje jak unikn blokowania CPU na czas dost pu do wolnodzia aj cego urz dzenia jakim jest LCD alfanumeryczny Jednak to nie wszystkiezalety wynikaj ce z zastosowania transakcji Drug wa n zalet naszego rozwi zaniailustruje przyk ad znajduj cy si w katalogu PrzykladyLCD-alfaLCD-transact-intPowa nym ograniczeniem funkcji odpowiedzialnych za dost p do LCD w sposoacutebklasyczny by a niemo no ich wywo ywania z funkcji obs ugi przerwa mdash funkcjeobs ugi LCD nie by y reentrant2 Nasz system oparty na transakcjach nie ma tychwad Aby to zilustrowa zosta stworzony prosty przyk ad mdash tak jak poprzedniow p tli g oacutewnej programu s wy wietlane stale kolejne liczby ale jednocze nie wyko-

2 Poza tym blokowa y CPU na d ugi czas a jak pami tamy funkcje obs ugi przerwa powinny by

wykonywane mo liwie kroacutetko

Kup książkę Poleć książkę

68 AVR Uk ady peryferyjne

rzystano drugi timer (TCD1) w ktoacuterego funkcji obs ugi przerwania przepe nienia jestwy wietlany licznik tych przerwa

ISR(TCD1_OVF_vect) static char int_buf[sizeof(LCD_trans) + 7] static uint16_t cnt char bufstr[6]

utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(61 bufstr (LCD_trans)ampint_buf false)

Jak widzimy w sposoacuteb asynchroniczny z dwoacutech miejsc w programie mo emy uzy-ska dost p do LCD a ka da funkcja bdquoma wra enierdquo e ma LCD na wy czno Przy okazji warto przeanalizowa sposoacuteb w jaki jest rezerwowana pami na trans-akcj w przerwaniu Oczywi cie mo na by wykorzysta dynamiczn alokacj pami cilecz jak wspomniano taka alokacja jest czasoch onna St d te w pokazanym przy-k adzie wykorzystano tablic statyczn int_buf o rozmiarze umo liwiaj cym prze-chowanie kompletnej transakcji Dzi ki temu e zmienna int_buf jest zmienn statycz-n nie jest ona niszczona po zako czeniu funkcji obs ugi przerwania Gdyby pomins owo kluczowe static zmienna ta by aby niszczona a na LCD najprawdopodobniejzacz yby si pojawia przypadkowe tre ci Poniewa pami naszego bufora nie by aalokowana dynamicznie nie mo e ona zosta zwolniona w naszym sterowniku LCDst d te ostatni parametr wywo ania funkcji LCD_PutText_B musi mie warto false

OptymalizacjaPrzy okazji tego i poprzedniego przyk adu warto zastanowi si jeszcze nad jednkwesti mdash optymalizacji W podanych przyk adach wykorzystano wcze niej omoacute-wione funkcje dost pu do wy wietlacza LCD znajduj ce si w plikach hd44780ci hd44780h Wi kszo z zawartych tam funkcji nie jest wykorzystywana jednakkompilator mimo wszystko umieszcza ich kod w pliku wynikowym mdash dzieje si takponiewa nie mo e on bdquostwierdzi rdquo czy funkcje te nie s wykorzystywane w innychfragmentach programu Pami tajmy e kompilator kompiluje poszczegoacutelne pliki roacute-d owe osobno i dana jego instancja nie bdquowierdquo co znajduje si w innych plikach (innychjednostkach kompilacji) Tak ca o ciow wiedz ma dopiero konsolidator (linker)ktoacutery czy stworzone przez kompilator pliki obiektowe (o rozszerzeniu o) w plikwynikowy Linker jednak bdquonie wierdquo ktoacutera z funkcji programu zosta a u yta a ktoacuteranie mdash informacje te ma wy cznie kompilator W ten sposoacuteb powstaje typowe b dneko o w efekcie nasze nieu ywane funkcje nie s usuwane (linker zostawia je bdquonawszelki wypadekrdquo) i zajmuj niepotrzebnie pami Czy mo na temu jako zaradzi Oczywi cie tak W tym celu trzeba po czy si y kompilatora i linkera co zapewniaj od-powiednie opcje kompilacji We w a ciwo ciach projektu (ProjectProperties lub Alt+F7)wybieramy zak adk Toolchain a nast pnie AVRGNU C Compiler i OptimizationZnajdziemy tam pole wyboru o nazwie Prepare functions for garbage collection (ry-sunek 224)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 69

Rysunek 224 Aby da linkerowi mo liwo usuwania nieu ywanych funkcji nale y skompilowaprogram z wybran opcj ndashffunction-sections ktoacutera spowoduje e ka da funkcja programu znajdzie siwe w asnej sekcji

Zaznaczenie tej funkcji spowoduje umieszczenie ka dej funkcji w osobnej sekcji mdashsamo w sobie nie wp ynie to na skroacutecenie kodu wynikowego ale jest warunkiem nie-zb dnym dla podj cia stosownych dzia a przez linker Aby wyeliminowa nieu y-wane funkcje nale y zaznaczy jeszcze w ga zi AVRGNU LinkerOptimization poleGarbage collect unused sections (rysunek 225)

Rysunek 225 Zaznaczenie opcji Garbage collect unused sections (-Wl--gc-sections) spowodujee nieu ywane funkcje zostan usuni te z kodu wynikowego w efekcie kod programu ulegnie skroacuteceniu

Po zaznaczeniu tych opcji program zostanie skroacutecony o kilkaset bajtoacutew Oczywi cieje li wszystkie funkcje by yby wykorzystane nie uzyskaliby my adnego skroacuteceniakodu Niemniej w sytuacji gdy u ywa si bibliotek zazwyczaj przynajmniej czfunkcji nie jest wykorzystywana warto wi c skorzysta z tej mo liwo ci optymalizacji

Kup książkę Poleć książkę

70 AVR Uk ady peryferyjne

Je li mamy do czynienia z prekompilowan bibliotek (lib) to musi ona by skom-pilowana z zaznaczon opcj Prepare functions for garbage collection (-ffunction-sections) Alternatyw jest umieszczenie ka dej funkcji biblioteki w osobnym pliku(tak jak w przypadku bibliotek AVR-libc)

Na ekranie wyboru opcji optymalizacji linkera mamy jeszcze jedn przydatn opcjmdash Relax Branches (-mrelax) Dla mikrokontroleroacutew ktoacutere maj ponad 8 kB pami ciFLASH instrukcje skokoacutew s generowane jako tzw instrukcje d ugie mdash umo liwiajone skok do komoacuterki pami ci FLASH o dowolnym adresie Jednak cen za to jestwyd u enie instrukcji mdash ich kod jest d u szy podobnie jak czas wykonania Nie zawszejednak takie d ugie instrukcje musz by wykonywane mdash je li miejsce docelowe skokule y blisko (w zasi gu instrukcji skokoacutew wzgl dnych) to mo na w kodzie wynikowymzamieni instrukcje d u sze na kroacutetsze co przynosi oszcz dno ci w postaci skroacuteceniakodu wynikowego Poniewa dopiero linker bdquowierdquo jak poszczegoacutelne fragmenty kodus rozmieszczone w pami ci takiej podmiany mo na dokona na etapie linkowaniaprogramu co zapewnia powy sza opcja St d te warto to pole wyboru zaznaczy

Kup książkę Poleć książkę

SkorowidzA

ABI Application Binary Interface 25AC Address Counter 50ADPCM 482adres

bazowy 377bufora 61komoacuterki 84pu apki 202

ALE Address Latch Enable 368alfanumeryczne wy wietlacze 43algorytm ADPCM 492algorytmy stratne 495animacje 57antyaliasing 325architektury procesoroacutew XMEGA 352asembler 23

dyrektywy 40funkcje j zyka C 41obs uga przerwa 39

asynchroniczne wywo anie funkcji 101Atmel Studio 15

Bbajty kalibracyjne 569biblioteka

FATFS 131 139 176 180 517libcallback-liba 99PetitFS 144 149

bitADC_CH0START_bm 236IMPMODE 244

bitrate 442 512blokowanie przerwa 219b d 16 19

kwantyzacji 463offsetu 230wzmocnienia ADC 230

BOD 223bps bits per second 12

budowakarty 152linii obrazu 394pami ci SDRAM 374pliku stymulacji 192ramki PAL 412sygna u PAL 411wtyczki 544 545

bufor 78FIFO 497na transakcje 61transakcji 62

buforowanie wyj cia 294

CCAS Column Address Strobe 375CCFL 44charakterystyka

przetwornikoacutew 222termistora 264tryboacutew pracy 232

CID Card Identification 169CKE Clock Enable 375CLKIN 421COG Chip on Glass 310CRC 158 178CRC16 178CRC7 164CS Chip Select 361 375CSD Card Specific Data 172czas

dost pu do SDRAM 424adowania kondensatora 244

propagacji 281proacutebkowania 260symulacji 209

czcionki 322cz stotliwo

odchylania pionowego 428proacutebkowania 244 441 444 530przebiegu 504

Kup książkę Poleć książkę

576 AVR Uk ady peryferyjne

cz stotliwoPWM 465taktowania koprocesora 549taktowania procesora 209taktowania rdzenia 18

czyszczenie pami ci 318

DDAC Digital to Analog Converter 293 447 451

buforowanie wyj cia 294generowanie przebiegoacutew 301jitter 303kalibracja 306napi cie referencyjne 295system zdarze 297taktowanie 296tryb dwukana owy 301wykorzystanie DMA 298wyzwalanie konwersji 305

datalogger 261 265 275DD Device Density 86debuger 183

programowy 190sprz towy 185 187

decymacja 259DEBUG 219XMEGA 260

definicja symboli globalnych 36definiowanie w asnych znakoacutew 56deklaracja zapowiadaj ca 103 337dekoder DTMF 548 556DMA 254 298 402 458 518 523dost p do

danych 358 359 568danych binarnych 356 360danych wielobajtowych 31DataFLASH 137EEPROM 128FAT 136komoacuterki 375LCD 59 62 66 68operandu 30pami ci 81 384 386 387 561pami ci SDRAM 424pliku blokowy 141portoacutew IO 30rejestroacutew IO procesora 36rejestroacutew uk adu 499SPI 95sygnatury u ytkownika 565 567wska nikoacutew 32

DQM Data Mask 375DSP Digital Signal Processor 535

DTMF 535 553dyktafon 529dynamiczna alokacja pami ci 516dyrektywa global 38dyrektywy asemblera 40dzia anie

DMA 255komparatora 280timeroacutew 400

d wi k 443

EEBI External Bus Interface 361EEPROM 207eliminacja jitteru 24emulacja RS232 139

FFAT File Allocation Table 128 131FAT32 128FATFS 180filtr

dolnoprzepustowy 491drugiego rz du 470pierwszego rz du 469trzeciego rz du 471

filtrowanie sygna u PWM 468firmware 565FLASH 207format

odpowiedzi 159polecenia 158protoko u 157

funkcja_delay_ms 17 219c_zero 42callback 106 341callback() 99DataFLASH_CSEnable 100DF_FinishBufWrite() 269disk_initialize 136disk_ioctl 181disk_status 136disk_write 138DMA_SPI_init 104DTMF_GetCode 553free_re 65GPIOR0_init 507hd44780_outcmd 51hd44780_outnibble_nowait 65LCD_defchar_P 57

Kup książkę Poleć książkę

Skorowidz 577

Menu_Click_Func 515Menu_Free 516Menu_Recorder 532Menu_Run 527MS_CreateRegEntry 117MS_GetDirPos 125MS_GetRegItem 115MS_WritePages 116 118OSC_wait_for_rdy 473RecMenu_StartStop 532sprintf 142strtok 124sysclk_init() 200 209TMF_memcpy_PF 454udi_cdc_getc() 123udi_cdc_is_rx_ready() 123VS1003_Reset 506

funkcjeanalizuj ce 556biblioteczne 50biblioteki FATFS 143j zyka C 41kontrolera ST7565R 313opoacute niaj ce 17opoacute nie 219reentrant 524specjalne kontrolera 319steruj ce 314zapisu 133

fusebit 557BODACT 560BODLEVEL 560BOOTRST 559DVSDON 560EESAVE 561JTAGEN 558RSTDISBL 559SUT 559TOSCSEL 559

fusebity w AVR-libc 571

Ggenerator obrazu composite 426generowanie

d wi ku 461kolorowego obrazu 437obrazu wideo 391przebiegoacutew 301przerwa 285sygna u composite 409

g bia koloru 326gniazdo

karty SD 156VGA 396

Hhistereza 281

IIDE 11IMA ADPCM 483informacje

o kolorze 431o obrazie 434

inicjalizacjakarty 161karty SDHC 167karty SDSC 167karty SDXC 167licznika 419pami ci 119USART 505

instrukcjaicall 42movw 35nop 13 24

interfejsSCI 498SDI 498SPI 71 79RS232 120UART 123USART 71 73

interpolacja 259interpolacja w XMEGA 260inwersja obrazu 319

Jjednostki 12jitter 24 303 420

Kkalibracja

ADC 229DAC 306 564offsetu 237

kana DMA 82 522karta 154 158

mikroSD 152SD 151 152SDHC 151 152 160SDSC 160SDXC 151 160

Kup książkę Poleć książkę

578 AVR Uk ady peryferyjne

karty pami ci 151 152 157biblioteka FATFS 180budowa 152format polecenia 158inicjalizacja 161 167komunikacja 156odczyt danych 173opcje konfiguracyjne 181rejestry specjalne 169tryby pracy 153zapis danych 176zasilanie 154

kodasemblerowy 23 24C 23dost pu 24

kodowanieμ-law 481ADPCM 483Dialogic ADPCM 494informacji 166 426koloru 425znakoacutew 536

kodyformatoacutew audio 501zdarze 545

kolejno bajtoacutew 533kolor 424 430kolorowy obraz 437komparator 422

analogowy 279 280analogowy XMEGA 282okienkowy 284

kompilacja plikoacutew binarnych 350kompilator avr-gcc 11 359kompresja

ADPCM 482 486d wi ku 480IMA ADPCM 482

komunikacja z koprocesorem 504konfiguracja

4-portowa 364biblioteki 133debugera 185DMA 459 522fusebitoacutew 570kontrolera DMA 257 452komparatoroacutew 285lockbitoacutew 570LPC 371pami ci SDRAM 381PetitFS 149pinu IO 225portoacutew IO 362

preskalera 452projektu 186przerwa 219pu apki 203rejestru EVCTRL 248rejestru PER 67SPI 75sygna u CS 377typu czcionki 324urz dze IO 189USART 76zegara 383

konsolidacja 547kontroler

DMA 254 298 402 458 518 523KS108 310ST7565R 310ndash315 321

konwersjaDAC 305sygna oacutew 396wyzwalana 306

konwertercyfrowo-analogowy 426DAC 427

koprocesormp3 496VS1003B 10

korekcja fazy 466kwantyzacja 463

Llampa CCFL 44LE Latch Enable 433licznik 419

cykli 209TCC1 400timera 20

linie IO 50linie sygna owe

MISO 72 164MOSI 72SCK 72SS 72

linker 69lista

mnemonikoacutew 24modyfikowanych rejestroacutew 32

lockbity 557 561lockbity w AVR-libc 570LPC Low Pin Count 371LPCM 443 556LSB Least Significant Bit 228

Kup książkę Poleć książkę

Skorowidz 579

a cuchy formatuj ce 212czenie plikoacutew 352

Mmagistrala pami ci zewn trznej 361magnetofon cyfrowy 528makro _SFR_IO_ADDR() 39makrodefinicja

ASSERT 214HD44780_CGADDR() 53HD44780_CLR 53HD44780_DDADDR() 53HD44780_DISPCTL() 52HD44780_ENTMODE() 52HD44780_FNSET() 52HD44780_HOME 53HD44780_SHIFT() 51LOCKBITS 571

mapowanie sygna oacutew 366mapy bitowe 343marker czasowy 268maski bitowe 329matryce 49menu 335menu piktogramowe 342mierniki temperatury 262mikrokontroler

ARM 9AVR 9PIC 9XMEGA128A3U 10

MISO 72moc wydzielana 265model psychoakustyczny 495modu

alfanumeryczny 45NVM 568Xmega eXploreGO 10Xplained ATXMEGA A3BU 10Xplained ATXMEGA-A1 10Xplained XMEGA128A1 447Xplained XMEGA256A3 94Xplained XMEGA256A3BU 97 143 266

modyfikator 30const 85volatile 28 273

monitory CRT 395monochromatyczne wy wietlacze graficzne 309monochromatyczny

tryb graficzny 416tryb tekstowy 413

MOSI 72mp3 495Msps Megasamples per second 12multiplekser wej ciowy 226 283multipleksowanie adresoacutew 368 369muzyka 439

Nnadawanie kodoacutew DTMF 540nadproacutebkowanie 258nag oacutewek kontenera wav 500nagrywanie mowy 486najmniej znacz cy bit 228napi cie

offsetu 280referencyjne 223 295zasilania 239

Oobracanie obrazu 319obraz 319

composite 426kolorowy 430wideo 391

obroacutebka d wi ku 443 445obs uga

FAT 131 143klawiatury matrycowej 24LCD 58 63 67menu 337przerwania 37 38 458przerwania DMA 525przerwa w asemblerze 39przyciskoacutew 272wy wietlaczy alfanumerycznych 45

odczytblokowy 140danych 173 358

odpowied response 159R1 159R2 159R7 160

od wie anie pami ci 376odtwarzanie

d wi ku 472muzyki 447 513 518 521

offset 238offset ADC 230okno

Breakpoints 202Call stack 209dezasemblera 210

Kup książkę Poleć książkę

580 AVR Uk ady peryferyjne

oknoIO View 207podgl du zmiennych 211wyboru czcionek 324

OLED 46opcje

kompilatora 35zapisu d wi ku 445

operacjena buforach 91odczytu 173zapisu 176zapisu strony 92

operand 29operator

ascii 41

asciz 41

byte 41

section 41opoacute nienia 13 18opoacute nienie zmienne 16optymalizacja 16 68optymalizator 26organizacja pami ci 77organizacja pami ci VRAM 316oscylator 287OSD On-Screen Display 417ostrze enie 16oszcz dzanie energii 94

Ppakiet WinAVR 48pami

CGRAM 56 57 64DataFLASH 10 77 81 113 269DDRAM 49EEPROM 111FLASH 54 124 207RAM 49SDRAM 372SRAM 63 124 329 366 371VRAM 314 317

PCLK 421PCM 443PetitFS 144 149p tla

for 13while 201

pierwsza linia obrazu 321piksel 430piktogram 342pin IO 225

plikAlloc_safeh 65DataFLASHc 83DataFLASHIOc 136definesh 50delayh 14diskioh 132 136ffh 132ffconfh 132 181hd44780h 49integerh 132ioh 30LCD_transc 61LCD-transactc 66Makefile 14Menuc 19nothingo 541outfiletxt 547 551pffh 149SPIh 104stringh 113stymulacji 191 192

pliki mp3 495elf 351fon 323o 24S 24 34binarne 350 355csv 276d wi kowe 440obiektowe 352wav 500WMA 512z czcionkami 327z danymi 349

podbijacz napi cia 315podgl d

pami ci 207stosu wywo a 209zmiennych 211znakoacutew 325

pod czeniefototranzystora 262karty SD 155LCD z kontrolerem 311modu u 50pami ci 362 369 370 373termistora 262uk adu LM35 251wyj XMEGA 398

pod wietlenieCCFL 46OLED 46

Kup książkę Poleć książkę

Skorowidz 581

podwoacutejne buforowanie 255 332 457polecenia

kasowania strony 81konfiguracyjne pami ci 82kontrolera ST7565R 315odczytu bufora 82 89odczytu pami ci 81 88SDRAM 376transferu 91

polecenieACMD41 168cd 181CID 178CMD0 165CMD8 167CSD 178date 276dir 127 181dump 276erase 276get 276HD44780_CLR 51Init 178mkdir 181

po czenieDMA ze SPI 96dwoacutech komparatoroacutew 285koprocesora mp3 497LCD z mikrokontrolerem 48wyj cia XMEGA 411XMEGA z PC 121z telewizorem 431

pomiarnapi cia zasilania 239temperatury MCU 241

port IO 30 362pozycjonowanie grafik 345poacute obraz 410precyzja pomiaroacutew 260preskaler 478preskaler ADC 243program

Atmel Data Visualizer 275Audacity 443avr-objcopy 350dataloggera 265LCD Image Converter 323makeloadingtableexe 543Realterm 127 554riffstrip 483SoX 445Tracepoint 208

programowanie sygnatury u ytkownika 566protokoacute master-slave 157

prototypy 136proacutebki d wi kowe 447proacutebkowanie

8-bitowe 300nieliniowe 480

prymitywy graficzne 330przebieg PWM 468przebiegi 289 303przechwytywanie danych 276przemiatanie wej 253przerwanie 218 254 286 403

DMA 522komparatora 286

przestrze adresowa procesora 378przesy anie

danych 498polece 498

przetaktowanie procesora 436przetwornik

ADC 221analogowo-cyfrowy 221cykliczny 222potokowy 222

przyciski 272pseudooperatory 41pu apki breakpoints 197pu apki warunkowe 205punkty ledzenia 203PWM 461 462 472

RRAS Row Address Strobe 375redukcja poboru energii 242regulacja kontrastu 321rejestr 32 34rejestr AC 50

adresu wtyczki 513BASEADDR 377CID 169CMP 251CSD 172czasu utworu 512DATA 83EVCTRL 248formatu audio 512identyfikacyjny pami ci 87INTFLAGS 252kontroli basoacutew 510kontroli g o no ci 513MUXCTRL 227OCR 168PER 67poroacutewnania 249

Kup książkę Poleć książkę

582 AVR Uk ady peryferyjne

rejestr ACSCI_CLOCKF 511stanu komparatora 287stanu pami ci 86stanu uk adu 510trybu pracy 508WINCTRL 285

rejestrydost pu do pami ci RAM 513GPIOR 502IO procesora 36mikrokontrolera 25procesora 35specjalne 94specjalne karty 169uk adu VS1003B 508

relacja rodzic ndash dziecko 336reset uk adu 534rozdzielczo

LCD 329przetwornika 231PWM 463 477

rozszerzenie HiRes 477 479roacutewnanie Steinharta-Harta 263rysowanie map bitowych 343

Sschemat uk adu dataloggera 267SCI Serial Command Interface 498SCK 72SD Secure Digital 152SDI Serial Data Interface 498separator synchronizacji 422separowanie impulsoacutew synchronizacji 422shieldy 10skaler 422skaler napi cia 283skrypt makefile 353s owo kluczowe

asm 27extern 37static 68

specyfikatory lokalizacji zmiennej 213sps samples per second 12SS Slave Select 72standard PAL 410standard VGA 393sterowanie

dataloggerem 275sygna em 379

sterownik 121HD44780 49 56LCD 49 62

stos wywo a 209

strukturaFATFS 139Handle 118LCD_trans 60 63menu 338rejestru 86SimpleFSEntry 113 116SimpleFSHandle 113 118 140submenu 527systemu plikoacutew 112

sumabitowa 571kontrolna 178

sygnacomposite 409composite video output 430CS 377DREQ 497H-Sync 396synchronizacji 423V-Sync 396zegarowy CLK 374

sygna yinterfejsu EBI 363magistrali EBI 364steruj ce 375

sygnaturaprodukcyjna procesora 563u ytkownika 565

symbol__DELAY_ROUND_CLOSEST__ 17__DELAY_ROUND_DOWN__ 17_FS_FAT12 149_FS_FAT32 149_FS_MINIMIZE 133_FS_READONLY 133_FS_RPATH 135_FS_TINY 133_MAX_SS 135_MULTI_PARTITION 135_USE_DIR 149_USE_FASTSEEK 134_USE_FORWARD 134_USE_LABEL 134_USE_LFN 134_USE_LSEEK 149_USE_MKFS 134_USE_READ 149_USE_STRFUNC 134_USE_WRITE 149_VOLUMES 136F_CPU 14 15 18increment 36USE_BUSY_FLAG 50

Kup książkę Poleć książkę

Skorowidz 583

symboleglobalne 36w asemblerze 28zewn trzne 39

symulacja 198 209symulator 190synchronizacja

pami ci 331pionowa 395pozioma 394

systemplikoacutew 111 128przerwa 404zdarze 245

szablonfont_XMEGAtmpl 326image_XMEGAtmpl 343

szum 463szybko przesy ania danych 126

ledzenie wi zki 333rodowisko

graficzne 11programistyczne 11VSIDE 542WinAVR 47

Ttabela FAT 130tablica

framebuf 402 408plugintbl 552 555tekst 208z kodem wynikowym 543

taktowanieDAC 296mikrokontrolera 473

technologia OLED 44temperatura mikrokontrolera 239 241termistor 262 290

NTC 263PTC 263

termometrLM35 249 250z alarmem 251

termostat 290test uk adu VS1003B 503testowanie obrazu 319timer 16 62

TCC0 20

TCC1 399transakcja 59 62 65transakcje 17 103ndash107transakcyjna obs uga LCD 58transakcyjny dost p do SPI 95transfer 91

danych 97wynikoacutew 254

transmisja 72 83tryb

bez znaku 234ci g ej konwersji 252czterobitowy 153dwukana owy 301graficzny 416graficzny VGA 407idle 419jednobitowy 153LPC 371monochromatyczny 397 407oszcz dzania energii 94 306pracy multipleksera 226pracy SPI 157roacute nicowy 232single slope 312SPI 153tekstowy 413tekstowy VGA 397z pojedynczym wej ciem 234ze znakiem 235

trybygenerowania PWM 467pracy karty 153pracy przetwornika 231pracy SPI 74pracy uk adu 508

twierdzenie Nyquista 258tworzenie

adresu 84nak adek 417obrazu 335tablicy 543

typ__uint24 119karty 160niekompletny 60wyliczeniowy 114

typyoperandoacutew 29w AVR 34

Kup książkę Poleć książkę

584 AVR Uk ady peryferyjne

Uuchwyt handle 64 113uk ad

AD725 427 431buforowy 294CS 361DAC 284dataloggera 267detekcji awarii zasilania 559generuj cy obraz 393HiRes 477ICL7660 47LM35 250 251SampH 293sterowania sygna em 379USART 401VS1003B 496 503 508 530 538 556VS100XX 529wzmacniania sygna u 227

uk ady peryferyjne 9uruchomienie komparatora 287urz dzenie

master 72slave 72

u rednianie 259utrata danych 141u ycie wstawki asemblerowej 33

VVGA 393

Wwarto ci kalibracyjne

ADC 564oscylatoroacutew 564temperatury 564

warunkowa kompilacja 36WE Write Enable 375wej cie composite video input 425wektor przerwa 38 257wideo 391wielko pami ci 86 377w czenie DAC 299wska nik na struktur 27wska niki 32wstawki asemblerowe 24 33wtyczka 535 541 544

SineDTMF Generator 537VGA 396

wyboacuter cz stotliwo ci PWM 465 474wykorzystanie

DMA 254 518

EuroSCART 428PWM 461rejestroacutew 34

wyliczanie predyktora 489wy wietlacze

alfanumeryczne 43 45graficzne 43 309LCD 43OLED 46

wy wietlanielitera u 213map bitowych 344obrazu 333 346 406obrazu VGA 393

wywo ania zwrotne callbacks 98asynchroniczne 101synchroniczne 101

wyzwalanie konwersji 245wzmacniacz 446wzmacniacz operacyjny 279wzmacnianie sygna u 227

XXMEGA 9 18

Zzapis

bufora 269danych 176d wi ku 440 556

zasilaniekarty 154pami ci 109

zatrzask 368zatrzask 74HC573 433zatrza ni cie adresu 369zdarzenia 297zdarzenie compare match 399zegar 383 420 426zintegrowane rodowisko programistyczne 11z cze EuroSCART 425 428 429zmiana

g o no ci 527wielko ci strony 94

znaki 56

roacuted onapi cia odniesienia 284sygna u 240

Kup książkę Poleć książkę

Page 3: Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8 AVR. Ukäady peryferyjne Rejestry dost pu do pami ci RAM .....513 Rejestr adresu

4 AVR Uk ady peryferyjne

Polecenia 81Rejestr identyfikacyjny pami ci 87Polecenia odczytu pami ci 88Polecenia odczytu i zapisu bufora 89Polecenia transferu pomi dzy pami ci a buforem 91Rejestry specjalne 94

Transakcyjny dost p do SPI 95czymy DMA ze SPI 96

Wywo ania zwrotne (callbacks) 98Transakcje 103

Zasilanie 109

Rozdzia 24 Budujemy system plikoacutew 111Najprostszy system plikoacutew 111

Inicjalizacja pami ci 119System plikoacutew FATFAT32 128

Obs uga FAT 131Prototypy z diskioh 136Demonstracja 139Biblioteka PetitFS 144Konfiguracja PetitFS 149

Rozdzia 25 Jeszcze wi cej pami ci czyli karty SD SDHC i spoacute ka 151Troch o budowie karty 152Tryby pracy karty 153Zasilanie karty 154Komunikacja 156

Tryb pracy SPI 157Format protoko u 157Roacute nice pomi dzy kartami 160Inicjalizacja karty 161

Rejestry specjalne karty 169CID 169CSD 172

Operacje zapisu i odczytu sektoroacutew 173Operacje odczytu 173Operacje zapisu 176

Suma kontrolna 178Program 178

Potencjalne problemy 179FATFS na karcie 180

Rozdzia 26 Debuger 183Konfiguracja debugera 185Konfiguracja projektu do debugowania 186Debuger sprz towy 187Debuger programowy (symulator) 190

Plik stymulacji 191Pu apki 197

Punkty ledzenia 203Pu apki warunkowe 205

Podgl d pami ci 207Podgl d stosu wywo a 209Okre lenie czasu symulacji 209Okno dezasemblera 210

Kup książkę Poleć książkę

Spis tre ci 5

Okno podgl du zmiennych 211a cuchy formatuj ce 212

Makrodefinicja ASSERT 214Przerwania w trakcie debugowania 218_delay_xx i symulator 219

Rozdzia 27 Przetwornik analogowo-cyfrowy 221Przetwornik potokowy vs cykliczny 222Napi cie referencyjne 223Konfiguracja pinu IO 225Multiplekser wej ciowy 226Uk ad wzmacniania sygna u 227Co to jest LSB 228Kalibracja ADC 229Pomiar 231

Rozdzielczo przetwornika 231Tryby pracy przetwornika 231Wynik pomiaru 236Kalibracja offsetu 237Pomiar napi cia zasilania i temperatury mikrokontrolera 239

Redukcja poboru energii 242Preskaler ADC 243Wyzwalanie konwersji z wykorzystaniem systemu zdarze 245

Rejestr EVCTRL w XMEGA z ADC bez potoku 248Rejestr poroacutewnania 249

Termometr LM35 250Budujemy termometr z alarmem 251

Tryb ci g ej konwersji 252Przemiatanie wej 253Przerwania 254Wykorzystanie DMA do transferu wynikoacutew 254Nadproacutebkowanie 258

U rednianie 259Decymacja i interpolacja 259Interpolacja i decymacja w XMEGA 260

Jak zwi kszy precyzj pomiaroacutew 260Budujemy datalogger 261

Termistory jako mierniki temperatury 262Program dataloggera 265

Rozdzia 28 Komparator analogowy 279Komparator mdash troch teorii 279

Czas propagacji 281Histereza 281

Komparatory analogowe XMEGA 282Multipleksery wej cia 283Komparator okienkowy 284Przerwania 286Uruchomienie komparatora 287Rejestr stanu komparatora 287

Komparator jako oscylator 287Termostat z wykorzystaniem komparatoroacutew 290

Termistory 290

Kup książkę Poleć książkę

6 AVR Uk ady peryferyjne

Rozdzia 29 DAC 293Buforowanie wyj cia 294Napi cie referencyjne 295Taktowanie 296Zdarzenia 297Wykorzystanie DMA 298

Proacutebkowanie 8-bitowe 300Tryb dwukana owy 301Generowanie jednocze nie dwoacutech przebiegoacutew 301Wersja oszcz dna 304Inne sposoby wyzwalania konwersji 305

Tryb oszcz dzania energii 306Kalibracja DAC 306

Rozdzia 30 Monochromatyczne wy wietlacze graficzne 309Pod czenie LCD do mikrokontrolera 311Budowa i funkcje kontrolera ST7565R 313Funkcje specjalne kontrolera 319

Inwersja i testowanie obrazu 319Obracanie obrazu 319Regulacja kontrastu 321Numer pierwszej wy wietlanej linii 321

Czcionki 322Ma a optymalizacja 330Podwoacutejne buforowanie 332

Adres pocz tku wy wietlania obrazu 333Menu 335

Menu oparte na piktogramach 342

Rozdzia 31 Pliki z danymi mdash jak je dodawa do projektu 349Kompilacja plikoacutew binarnych 350

czenie plikoacutew obiektowych z projektem 352Dost p do danych binarnych 356

Klasyczny sposoacuteb dost pu do danych 358Dost p do danych z wykorzystaniem przestrzeni adresowych 359

Rozdzia 32 Magistrala pami ci zewn trznej 361Pod czenie pami ci 362

Konfiguracja portoacutew IO 362Przyporz dkowanie sygna oacutew interfejsu EBI do portoacutew IO 363Konfiguracja 4-portowa 364Pami SRAM 366Pami SRAM w trybie LPC 371Pami SDRAM 372

Konfiguracja sygna u CS 377Okre lenie adresu bazowego i wielko ci pami ci 377Uk ad sterowania sygna em wyboru w trybie SRAM 379Uk ad sterowania sygna em wyboru w trybie SDRAM 379

Przyk adowa konfiguracja pami ci SDRAM 381Konfiguracja zegara 383Dost p do pami ci z poziomu j zyka C 384

Dost p do pami ci poni ej granicy 64 kB 384Dost p do pami ci powy ej granicy 64 kB 386

Kup książkę Poleć książkę

Spis tre ci 7

Rozdzia 33 Generowanie obrazu wideo 391Generowanie obrazu wideo w standardzie VGA 393

Wtyczka VGA i konwersja sygna oacutew 396Monochromatyczny tryb tekstowy VGA 397Monochromatyczny tryb graficzny VGA 407

Generowanie sygna u composite 409Standard PAL 410Monochromatyczny tryb tekstowy 413Monochromatyczny tryb graficzny 416Tworzenie nak adek (OSD) 417

Czas na kolor 424Kodowanie koloru 425Konwerter cyfrowo-analogowy 426Generator obrazu composite 426Wykorzystanie EuroSCART 428Kolorowy obraz na TV 430

Rozdzia 34 Niech zagra muzyka 439Formaty plikoacutew d wi kowych 440

Cz stotliwo proacutebkowania 441Format pliku 442

Obroacutebka d wi ku 443Program Audacity 443Program SoX 445

Wzmacniacz 446Odtwarzamy muzyk z wykorzystaniem DAC 447

Inny sposoacuteb na podwoacutejne buforowanie 457Generowanie d wi ku z wykorzystaniem PWM 461

PWM mdash troch teorii 461Filtrowanie sygna u PWM 468Odtwarzamy d wi k za pomoc 8-bitowego PWM 472Rozszerzenie HiRes i PWM o wi kszej rozdzielczo ci 477

Kompresja d wi ku 480Proacutebkowanie nieliniowe 480Kompresja ADPCM 482Kompresja IMA ADPCM 482Nagrywanie mowy z wykorzystaniem kompresji ADPCM 486Algorytm ADPCM firmy Dialogic 492

Rozdzia 35 A mo e mp3 495Koprocesor mp3 496

Sposoby pod czenia do XMEGA 496Dost p do rejestroacutew uk adu 499Format pliku wav 500Rejestry GPIOR 502Testy uk adu 502Podstawowa komunikacja z koprocesorem 504Rejestry uk adu VS1003B 508

Rejestr trybu pracy 508Rejestr stanu uk adu 510Rejestr kontroli basoacutew 510Rejestr SCI_CLOCKF 511Rejestr czasu utworu 512Rejestr formatu audio 512

Kup książkę Poleć książkę

8 AVR Uk ady peryferyjne

Rejestry dost pu do pami ci RAM 513Rejestr adresu wtyczki 513Rejestr kontroli g o no ci 513

Odtwarzamy muzyk 513Odtwarzamy muzyk z wykorzystaniem DMA 518

Magnetofon cyfrowy 528VS100XX w roli magnetofonu 529

W asne wtyczki 535DTMF jako przyk ad w asnej wtyczki 535

Budujemy w asn wtyczk 541Tworzenie tablicy z kodem wynikowym 543Budowa wtyczki 544W asna aplikacja czyli dekoder DTMF 548

Rozdzia 36 Fusebity i lockbity 557Fusebity 558

Fusebit JTAGEN 558Fusebit RSTDISBL 559Fusebit BOOTRST 559Fusebity SUT 559Fusebit TOSCSEL 559Uk ad detekcji awarii zasilania 559Watchdog 560Fusebit EESAVE 561

Lockbity 561Sygnatura produkcyjna procesora 563

Numer serii 563Numer wafra 563Po o enie na wafrze 564Pozosta e bajty konfiguracyjne 564

Sygnatura u ytkownika 565Dost p do danych z poziomu aplikacji u ytkownika 568

Bajty kalibracyjne 569Konfiguracja fuse- i lockbitoacutew w AVR-libc 570

Lockbity w AVR-libc 570Fusebity w AVR-libc 571

Dodatek A Spis rozdzia oacutew ksi ki bdquoAVR Praktyczne projektyrdquo 573

Skorowidz 575

Kup książkę Poleć książkę

Rozdzia 22

Wy wietlacze LCDalfanumeryczne

Z tego rozdzia u dowiesz si

jak pod czy popularne wy wietlacze alfanumeryczne do XMEGA

jak stworzy bibliotek obs uguj c kontroler HD44780

jak przesy a polecenia dla LCD w formie transakcji i jak czy dost pdo kontrolera z aplikacji i funkcji obs ugi przerwa

Ze wzgl du na malej ce ceny zwi kszaj c si dost pno oraz niski poboacuter energiicoraz wi kszym zainteresowaniem ciesz si wy wietlacze LCD W tym rozdzialezostan omoacutewione wy wietlacze alfanumeryczne mdash ze uwagi na ich prostot s ci -gle najcz ciej stosowanymi typami wy wietlaczy W dalszej cz ci ksi ki zostanomoacutewione monochromatyczne wy wietlacze graficzne mdash daj one o wiele wi kszemo liwo ci ale ich sterowanie jest nieco bardziej skomplikowane Ze wzgl du na ko-nieczno przesy ania sporej liczby danych wymagaj tak e szybszego interfejsu -cz cego z mikrokontrolerem St d te zanim przejdziemy do ich praktycznego wyko-rzystania b dziemy musieli bli ej zapozna si z kilkoma uk adami peryferyjnymiXMEGA

Wy wietlacze LCD alfanumeryczne zawieraj zazwyczaj scalone kontrolery st d teprocesor nie steruje bezpo rednio matryc LCD ale komunikuje si z wyspecjalizo-wanym sterownikiem ktoacutery wykonuje jego polecenia Dlatego te wykorzystanie te-go typu wy wietlaczy wymaga znajomo ci typu u ytego w nich sterownika Wy wie-tlacze LCD mog by czone z mikrokontrolerem za pomoc roacute nych magistral mdashnajcz ciej s to magistrale SPI lub roacutewnoleg e (w wersji 4- 8- i 16-bitowej) Samewy wietlacze ze wzgl du na budow i mo liwo ci mo emy podzieli na dwie grupy

Wy wietlacze alfanumeryczne mdash umo liwiaj one wy wietlanie cyfr literi innych symboli Jednak w tym typie nie mamy mo liwo ci sterowaniaposzczegoacutelnymi pikselami

Wy wietlacze graficzne mdash w tym typie mo emy sterowa stanem ka dego piksela

Kup książkę Poleć książkę

44 AVR Uk ady peryferyjne

Aby wy wietlana na LCD zawarto by a widoczna niezb dne jest pod wietlenieKupuj c wy wietlacz musimy zwroacuteci uwag czy jest on wyposa ony w jakie pod-wietlenie (mo na dosta wy wietlacze LCD bez pod wietlenia) Oczywi cie lepiej

jest wybra wy wietlacz ktoacutery ma wbudowane pod wietlenie Samo pod wietleniemo e by wykonane w roacute ny sposoacuteb W starszych modelach spotyka si pod wietle-nie oparte na lampie CCFL (ang Cold Cathode Fluorescent Lamp) Tego typu wy-wietlacze s zwykle wi ksze ci sze ale przede wszystkim wymagaj specjalnej

przetwornicy do sterowania lamp Jej zadaniem jest generowanie wysokiego napi -cia niezb dnego do za wiecenia si lampy a nast pnie utrzymywanie go w granicachzapewniaj cych jej prawid owe dzia anie Wy wietlacze tego typu s wi c k opotliwew u ytkowaniu musimy wyda czasami sporo pieni dzy na odpowiedni przetworni-c a w dodatku trwa o takiej lampy jest kroacutetsza ni diod LED Wyst puj tak eproblemy ze sterowaniem jasno ci pod wietlenia W nowoczesnych wy wietlaczachLCD stosuje si praktycznie wy cznie pod wietlenie za pomoc diod LED Nie wy-magaj one adnych wyrafinowanych przetwornic do zasilania zwykle zadowalajsi napi ciem w granicach 3 ndash 12 V maj te znacznie wi ksz trwa o Jasno citakiego pod wietlenia z atwo ci mo na sterowa wykorzystuj c technik PWMPod wietlenie oparte na diodach LED mo e mie roacute ny kolor mdash bia y oacute ty zielonyniebieski czerwony Kolor mo emy sobie wi c dobra wg w asnych preferencji Naj-nowsze wy wietlacze alfanumeryczne s wykonywane w technologii OLED mdash w tejtechnologii wiec poszczegoacutelne piksele wi c taki wy wietlacz nie wymaga pod-wietlenia Niejako przy okazji zyskujemy znacznie lepsze czasy prze czania pikseli

mdash dla wy wietlaczy LCD szczegoacutelnie w ni szych temperaturach czas prze czaniawynosi kilkadziesi t do kilkuset milisekund co powoduje pojawienie si wyra nychbdquoduchoacutewrdquo i psuje estetyk Wy wietlacze OLED nie maj tej wady Jednak zazwyczajs dro sze

Je eli mo esz staraj si wybiera wy wietlacze LCD z pod wietleniem opartym nadiodach LED lub wykonane w technologii OLED

Kolejn istotn kwesti jest regulacja kontrastu Zwykle graficzne kolorowe LCD z wbu-dowanymi sterownikami automatycznie reguluj kontrast dodatkowo sterownik mazaimplementowane rejestry umo liwiaj ce wy cznie programow zmian kontrastuW przypadku prostszych sterownikoacutew wyst puj cych najcz ciej w wy wietlaczachmonochromatycznych (zaroacutewno alfanumerycznych jak i graficznych) kontrast re-guluje si podaj c odpowiednie napi cie na jeden z pinoacutew wy wietlacza Jest to nie-zwykle istotne gdy bez w a ciwego napi cia reguluj cego kontrast na wy wietlaczunic nie zobaczymy Mo emy w takiej sytuacji odnie b dne wra enie e wy wie-tlacz nie dzia a Z kolei je li kontrast b dzie zbyt du y wszystkie piksele b d w -czone co te mo e sugerowa b dne dzia anie LCD

Jedn z cz stszych przyczyn tego e po prawid owym pod czeniu wy wietlaczaLCD nic na nim nie wida albo wszystkie piksele s w czone jest nieprawid owenapi cie na pinie reguluj cym kontrast

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 45

Obs uga wy wietlaczyalfanumerycznych

Wy wietlacze alfanumeryczne s zbudowane z matryc pikseli zwykle o wielko ci5times8 pikseli pogrupowanych razem W tym typie wy wietlacza mo emy sterowazawarto ci tak utworzonej matrycy znakowej jednak nie ma mo liwo ci sterowaniaposzczegoacutelnymi pikselami Najcz ciej spotykane wy wietlacze tego rodzaju mogwy wietla 1times8 1times16 2times16 2times20 4times16 znakoacutew gdzie pierwszy wymiar okre laliczb wy wietlanych wierszy a drugi liczb znakoacutew w wierszu Poniewa nie steru-jemy poszczegoacutelnymi pikselami do kontrolera wysy amy tylko kod znaku ktoacutery mazosta wy wietlony na danej pozycji Kontroler na podstawie kodu znaku generujeadres do specjalnego obszaru pami ci tzw tablicy znakoacutew w ktoacuterej znajduje si bajtowareprezentacja poszczegoacutelnych pikseli tworz cych znak Dla matrycy 5times8 ma ona 40bitoacutew Tablica ta jest umieszczona w pami ci ROM kontrolera LCD nie mo emy jejwi c zmienia Zwykle jednak kontrolery udost pniaj mo liwo definicji kilku w a-snych znakoacutew dzi ki czemu mo emy zdefiniowa np znaki charakterystyczne dla j -zyka polskiego Takie podej cie do generowania obrazu ma podstawow zalet jakjest prostota i zwi zane z tym niewielkie zapotrzebowanie na pami RAM Do prze-chowania np zawarto ci 8-znakowego wy wietlacza LCD wystarczy zaledwie 8 bajtoacutewpami ci Ma to szczegoacutelne znaczenie w prostych mikrokontrolerach z niewielk ilo-ci pami ci RAM Najpopularniejszym kontrolerem stosowanym w wy wietlaczach

alfanumerycznych jest HD44780 nawet je li w posiadanym wy wietlaczu jest innykontroler to mamy du szans e jest on z nim kompatybilny Typowy rozk ad sy-gna oacutew modu oacutew opartych na tym kontrolerze pokazano w tabeli 221

Tabela 221 Typowy uk ad wyprowadze modu oacutew alfanumerycznych LCD opartych na kontrolerzeHD44780

Pin Nazwa Funkcja

1 GND Masa 2 Vcc Zasilanie (typowo 5 V) 3 Vee Regulacja kontrastu 4 RS Zapis polecenia 5 RW Strob odczytzapis 6 E Wyboacuter uk adu 7 D0 Bit danych 0 8 D1 Bit danych 1 9 D2 Bit danych 210 D3 Bit danych 311 D4 Bit danych 412 D5 Bit danych 513 D6 Bit danych 614 D7 Bit danych 715 A Pod wietlenie mdash anoda16 K Pod wietlenie mdash katoda

Kup książkę Poleć książkę

46 AVR Uk ady peryferyjne

Przed pod czeniem modu u zawsze upewnij si czy podany rozk ad odpowiadau ytemu modu owi W szczegoacutelno ci sprawd rozmieszczenie linii zasilaj cych Ichniew a ciwe pod czenie grozi uszkodzeniem modu u

Zwykle piny 15 i 16 steruj ce pod wietleniem s umieszczone osobno lub te przedpinem 1 St d te zawsze nale y je dok adnie zidentyfikowa przed pod czeniem mo-du u Do pinoacutew tych nale y pod czy napi cie wykorzystane do pod wietlenia modu uPrzy czone napi cie zale y od typu zastosowanego pod wietlenia mdash CCFL foliielektroluminescencyjnej lub diod LED W dalszej cz ci b dziemy zajmowa si modu-em z pod wietleniem LED W nocie katalogowej ka dego modu u znajduj si szcze-

goacute owe informacje dotycz ce zasilania pod wietlenia Zwykle w tym celu wymaganejest napi cie 5 V a nat enie pr du pod wietlenia wynosi 20 ndash 50 mA

Wy wietlacze LCD alfanumeryczne s dost pne w handlu w wersjach dostosowanychdo roacute nych napi zasilaj cych Typowo jest to napi cie 5 V co stwarza pewne pro-blemy przy pod czeniu takiego LCD do procesoroacutew rodziny XMEGA S one zasi-lane maksymalnym napi ciem 36 V nie ma wi c mo liwo ci aby LCD i procesordzia a y w tych samych domenach napi ciowych W efekcie przy po czeniu obu uk a-doacutew musimy zastosowa konwersj napi Poniewa LCD alfanumeryczny z perspek-tywy procesora jest urz dzeniem bardzo wolnym ca kowicie wystarczaj cym rozwi za-niem jest zastosowanie szeregowych rezystoroacutew ktoacutere wraz z wbudowanymi w procesordiodami zabezpieczaj cymi b d stanowi y uk ad obni aj cy napi cie na magistralikomunikacyjnej z 5 V do bezpiecznego dla wej cia XMEGA napi cia Z drugiej stronyjedynka logiczna generowana przez procesor zasilany napi ciem 33 V jest poprawnierozpoznawana przez LCD pracuj cy z napi ciem 5 V Je li procesor by by zasilanybardzo niskim napi ciem (rz du 18 ndash 28 V) wymagany by by bardziej skompliko-wany konwerter co zosta o szerzej omoacutewione w rozdziale 7 ksi ki AVR Praktyczneprojekty

Wy wietlacze LCD wymagaj pod wietlenia bez tego wy wietlana zawarto jestpraktycznie nieczytelna W starszych konstrukcjach wykorzystywano pod wietleniew oparciu o lampy fluorescencyjne lub folie elektroluminescencyjne jednak obecniedominuj cym typem jest pod wietlenie za pomoc diod LED

Poniewa zasilamy diod LED wymagane jest do czenie szeregowego rezystoraCzasami taki rezystor jest wbudowany w modu LCD

Pod wietlenie tego typu zu ywa spor ilo energii Innym rozwi zaniem jest kupnowy wietlacza wykonanego w technologii OLED (ang Organic Light-Emitting Diode)Wy wietlacze tego typu cechuj si zdecydowanie lepszym kontrastem ale tak e wi k-sz szybko ci prze czania w zwi zku z czym mo na za ich pomoc uzyska o wielelepsze efekty animacji ktoacutere s praktycznie nieosi galne dla klasycznych wy wietlaczyLCD Nie maj one tak e innej wady LCD mdash zale no ci szybko ci prze czania seg-mentoacutew od temperatury

Wy wietlacze OLED nie maj wyprowadzonych pinoacutew odpowiedzialnych za pod-wietlenie mdash po prostu go nie wymagaj

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 47

Kolejn istotn kwesti jest pod czenie w a ciwego napi cia reguluj cego kontrastwy wietlacza Dla wi kszo ci modu oacutew LCD mie ci si ono w przedziale GND ndash Vcca dla modu oacutew o rozszerzonym zakresie temperatury w przedziale od ndash7 do 0 V mdashrysunek 221

Rysunek 221Pod czenie napi ciareguluj cego kontrasta) modu y klasyczneb) modu y o rozszerzonymzakresie temperatur

Napi cie ujemne mo na uzyska z prostej pompy adunkowej sterowanej przebiegiemPWM z procesora Poboacuter pr du z tego wej cia jest znikomo ma y Alternatywniemo na u y uk adu ICL7660 ktoacutery mo e generowa napi cia ujemne

Kolejn decyzj jak musimy podj jest sposoacuteb pod czenia modu u LCD z mikro-kontrolerem Mamy do wyboru dwie opcje mdash albo pod czamy wszystkie 8 linii da-nych (D0 ndash D7) albo tylko 4 najstarsze (D4 ndash D7) Pod czaj c tylko 4 linie danychzmniejszamy liczb niezb dnych po cze modu u z mikrokontrolerem oraz liczbwykorzystanych linii IO Ze wzgl du na znikom ilo danych przesy anych zdo mo-du u wynikaj ce z pod czenia tylko 4 linii danych spowolnienie transmisji jest bezznaczenia W trybie 4-bitowym najpierw transferowana jest starsza a potem m od-sza tetrada Niewykorzystane linie D0 ndash D3 mo na pozostawi niepod czone wi k-szo modu oacutew wewn trznie podci ga niepod czone linie poprzez rezystor do Vcc

Poniewa linie D0 ndash D7 s dwukierunkowe musimy pami ta aby podczas operacjiodczytu z LCD odpowiednie piny mikrokontrolera by y ustawione jako wej cia W prze-ciwnym przypadku dojdzie do konfliktu

Kolejnym sygna em co do ktoacuterego musimy podj decyzj jest sygna RW okre laj cytyp operacji (odczytzapis) Poniewa zwykle zapisujemy dane do LCD w a ciwie niezachodzi konieczno ich odczytywania mo emy ten sygna na sta e po czy z mas oszcz dzaj c w ten sposoacuteb jedn lini IO procesora Takie rozwi zanie ma jednak po-wa n wad mdash po jego zastosowaniu nie jest mo liwe odczytywanie sygna u zaj to cimodu u (ang busy flag) Powoduje to e pomi dzy kolejnymi zapisami do modu u mu-simy stosowa opoacute nienia dobrane na najwolniejsz mo liw okoliczno W efekcieca a transmisja jest wolniejsza ni mog aby by

Je li korzystamy z tych modu oacutew nie musimy pisa w asnych procedur ich obs ugiInstaluj c rodowisko WinAVR (lub nowy toolchain firmy Atmel) w katalogu docavr-libcexamplessdtiodemo znajdziemy gotowe funkcje obs ugi HD44780 Funkcjete nie dzia aj z mikrokontrolerami XMEGA st d te w za czonych przyk adach zosta-y one zmodyfikowane tak aby poprawnie wspoacute pracowa roacutewnie z tymi mikro-kontrolerami

Kup książkę Poleć książkę

48 AVR Uk ady peryferyjne

Mo emy te skorzysta z licznych przyk adoacutew dost pnych w internecie W dalszejcz ci rozdzia u zostan wykorzystane funkcje z pakietu WinAVR napisane przezJoerga Wunscha Pokazane przyk ady zak adaj e wy wietlacz jest po czonyz mikrokontrolerem tak jak na rysunku 222

Rysunek 222 Po czenie LCD z mikrokontrolerem Na goacuterze pod czenie do mikrokontroleraXMEGA na dole pod czenie do modu u Xplained Na schematach pokazano tak e opcjonalne sposobypod czenia pinu Vee odpowiedzialnego za regulacj kontrastu LCD

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 49

Zanim co wy wietlimy na LCD musimy pozna w jaki sposoacuteb s generowane znakiSterownik LCD zawiera w sobie niezale nie od typu u ytej matrycy 80 bajtoacutew pami ciDDRAM (ang Display Data RAM) Je li zastosowana matryca wy wietla mniejszliczb znakoacutew to cz komoacuterek pami ci jest nieu ywana Mo emy je wykorzystado innych celoacutew mdash np jako zwyk pami RAM Mo emy te u y jej do przesu-wania napisoacutew ktoacutere nie mieszcz si na wy wietlaczu Aby mo na by o umie ciznak na w a ciwej pozycji niezb dne jest poznanie organizacji pami ci kontrolera W za-le no ci od u ytej matrycy pami ta jest zorganizowana nast puj co

Dla matryc 16times1 mdash pami jest podzielona na dwa obszary ka dy zawieraj cypo 8 znakoacutew Obszar pierwszy (od lewej) ma adresy 0x00 do 0x07 a obszar drugi(prawy) adresy 0x40 do 0x47 St d te gdy wy wietla si tekst przekraczaj cygranic obszaroacutew nale y zadba aby poszczegoacutelne litery trafi y pod w a ciweadresy

Dla matryc 20times1 mdash adresy 0x00 do 0x13

Dla matryc 16times2 mdash adres pierwszej linii zaczyna si od 0x00 do 0x0f adresdrugiej linii od 0x40 do 0x4f

Dla matryc 20times2 mdash adresy pierwszej linii to 0x00 do 0x13 a drugiej 0x40 do 0x53

Dla matryc 40times2 mdash adresy pierwszej linii to 0x00 do 0x27 drugiej linii 0x40do 0x67

Dla matryc 20times4 mdash adresy pierwszej linii to 0x00 do 0x13 drugiej 0x40 do 0x53trzeciej 0x14 do 0x27 a czwartej 0x54 do 0x67

Jak wida w niektoacuterych typach wy wietlaczy po ka dej linii zostaje od kilku do kil-kunastu bajtoacutew ktoacuterych zawarto nie jest wy wietlana Ma to pewn zalet mdash mo-emy do pami ci modu u wpisywa teksty d u sze ni s wy wietlane na ekranie co

u atwia przewijanie tekstu Niestety ma to te pewn wad mdash funkcje wy wietlaj ceco na ekranie musz bdquowiedzie rdquo jak organizacj ma matryca W przeciwnym przy-padku nie ma mo liwo ci prawid owego wyliczenia adresu komoacuterki do ktoacuterej ma od-by si zapis

W dalszej cz ci rozdzia u zostanie wykorzystany modu LCD o organizacji 16times2(ale mo na te bez problemu wykorzysta dowolny inny)

Zanim b dzie mo na co wy wietli na ekranie modu musi zosta zainicjalizowanyW trakcie inicjalizacji ustawiane s podstawowe parametry pracy sterownika LCD mdashorganizacja matrycy (liczba linii) wielko czcionki (5times8 lub 8times11 pikseli) Wielkoczcionki zale y od typu pod czonej matrycy LCD Dla konkretnego modu u LCDtylko jedna z tych warto ci b dzie poprawna Oproacutecz inicjalizacji modu u nale y tak-e poprawnie ustawi stan pinoacutew IO wykorzystywanych do pod czenia modu u LCD

Wi kszo pracy zwi zanej z inicjalizacj modu u LCD odbieraniem i wysy aniemdo niego danych wykonuje biblioteka Joerga Wunscha Dostarcza ona niskopozio-mowe funkcje umo liwiaj ce komunikacj ze sterownikiem hd44780 i innymi kom-patybilnymi z nim sterownikami Wystarczy e do aplikacji w ktoacuterej planujemy wy-korzysta taki modu do czymy plik hd44780c oraz plik nag oacutewkowy hd44780h

Kup książkę Poleć książkę

50 AVR Uk ady peryferyjne

Oba pliki bdquozak adaj rdquo e istnieje plik nag oacutewkowy definesh zawieraj cy podstawo-we definicje zwi zane ze sposobem pod czenia modu u LCD z mikrokontroleremNa pocz tku nale y okre li ktoacutere linie IO zosta y wykorzystane do pod czenia modu u

define HD44780_RS A 4define HD44780_RW A 5define HD44780_E A 6define HD44780_D4 A 0

W powy szym przyk adzie do kolejnych linii portu A (A4 ndash A6) zosta y pod czonesygna y RS RW i E modu u natomiast do linii A0 ndash A3 linie D4 ndash D7 modu u LCD Wa nejest aby linie danych czy z pinami IO w kolejno ci rosn cej Biblioteka wykorzy-stuje do transmisji danych pomi dzy modu em a mikrokontrolerem tylko 4 linie danychmdash dzi ki temu mo emy zmniejszy liczb po cze a zwolnione linie IO wykorzystado innych celoacutew W pliku wyst puje jeszcze jedna definicja

define USE_BUSY_BIT 1

Okre la ona e biblioteka b dzie u ywa flagi Busy modu u LCD mdash umo liwia touzyskanie optymalnej szybko ci wspoacute dzia ania z modu em Zako czenie realizacjibie cej operacji modu sygnalizuje zmian stanu tej flagi co umo liwia niezw ocznewys anie kolejnej komendy Je li nie u ywamy flagi Busy program musi generowamaksymalne zalecane w nocie katalogowej opoacute nienia w efekcie ca a transmisja zwal-nia Po zdefiniowaniu u ywanych pinoacutew w pliku definesh mo emy rozpocz korzy-stanie z biblioteki

W pliku hd44780h s udost pnione prototypy funkcji odpowiedzialnych za wspoacute -prac z modu em LCD

Funkcje bibliotecznePodstaw modu u stanowi dwie funkcje umo liwiaj ce odpowiednio wys anie da-nych do modu u oraz ich odczytanie

void hd44780_outbyte(uint8_t b uint8_t rs)uint8_t hd44780_inbyte(uint8_t rs)

Obie funkcje wysy aj odczytuj 8-bitow dan w przypadku wykorzystania tylko4-bitowej szyny danych wysy anie i odczytywanie danych odbywa si w dwoacutech etapachDodatkowo zmienna rs okre la tryb dost pu W przypadku wysy ania danych do modu urs = 0 powoduje e dane zostan wys ane do rejestru komend a je li rs = 1 dane trafido rejestru danych Przy odczycie jest podobnie z tym e dla rs = 0 jest odczytywanaflaga Busy i rejestr AC (ang Address Counter)

Kolejna funkcja odpowiada za oczekiwanie na gotowo modu uvoid hd44780_wait_ready(bool islong)

W przypadku gdy w pliku definesh symbol USE_BUSY_FLAG ma warto 1 parametrislong jest ignorowany a optymalizator kompilatora usuwa go gdy nie jest on wy-korzystywany przez funkcj Kiedy warto USE_BUSY_FLAG jest roacute na od 1 parametr

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 51

ten okre la d ugo opoacute nienia Je li jest roacute na od 0 opoacute nienie wynosi 152 ms a je-eli jest roacutewna 0 opoacute nienie wynosi 37 s Poniewa lepiej jest u ywa flagi Busy

mo emy ten parametr ignorowa

Powy sze trzy funkcje wystarcz do komunikacji z modu em dla wygody zdefiniowanojednak kolejne Funkcje hd44780_outcmd(n) i hd44780_incmd() umo liwiaj odpowiedniowys anie polecenia do rejestru komend kontrolera lub odczytanie bitu Busy i licznikaAC Dwie kolejne mdash hd44780_outdata(n) oraz hd44780_indata() mdash umo liwiaj zapisi odczytanie rejestru danych

Oproacutecz funkcji odpowiedzialnych za komunikacj z modu em LCD zdefiniowano tak efunkcj przeprowadzaj c podstawow inicjalizacj modu u hd44780_init(void) orazfunkcj hd44780_powerdown(void) ustawiaj c wszystkie linie u yte do komunikacjiw stan 0 co umo liwia bezpieczne od czenie zasilania od modu u LCD W przypadkupozostawienia ktoacuterej z wy ej wymienionych linii w stanie 1 przy od czonym za-silaniu modu u stanowi ona jego zasilanie W efekcie mimo wy czenia modu mo epobiera znaczny pr d

Szerszego omoacutewienia wymaga funkcja hd44780_outcmd(cmd) ktoacutera umo liwia wys a-nie polecenia do rejestru polece sterownika LCD Dla wygody zdefiniowane zosta yroacute ne komendy u atwiaj ce wspoacute prac z modu em LCD Komendy te s przekazy-wane jako argument wywo ania funkcji hd44780_outcmd np

hd44780_outcmd(HD44780_CLR)

powoduje wys anie do sterownika polecenia HD44780_CLR czyszcz cego zawartopami ci DDRAM kontrolera

KomendyFunkcja hd44780_outcmd przyjmuje jako argument predefiniowane makrodefinicjeznacznie u atwiaj ce wspoacute prac z kontrolerem modu u LCD Poni ej zostan onepokroacutetce omoacutewione

HD44780_SHIFT(shift right)Ta makrodefinicja powoduje przesuni cie pozycji wy wietlanego tekstu (shift = 1)o jedn pozycj w lewo (argument right = 0) lub w prawo (argument right = 1)W przypadku gdy shift = 0 przesuwany w lewo lub prawo jest tylko kursor Wysy-aj c wielokrotnie to polecenie uzyskujemy kolejne przesuni cia o jedn pozycj

w lewo lub prawo Polecenie to s u y g oacutewnie do przesuwania tekstu Jednak ze wzgl duna du bezw adno tekstowych modu oacutew LCD nie nale y przesuwa liter cz ciej niok raz na sekund mdash cz stsze przesuwanie daje bardzo nieprzyjemne efekty wizual-ne Ka dy bufor linii jest bdquozawijanyrdquo to znaczy e po ostatnim znaku z prawej jestwy wietlany pierwszy znak z lewej i odwrotnie Nale y pami ta e d ugo buforajest sta a dla danego modelu matrycy Np dla modu oacutew 16times2 bufor jednej linii wyno-si dok adnie 40 bajtoacutew z czego 16 jest jednorazowo wy wietlanych Poni szy kodcyklicznie przewija wy wietlany tekst w lewo

lcd_puttext_P(PSTR(Test bufora i przewijania tekstunTen tekst przewija sie w lewo))while(1)

Kup książkę Poleć książkę

52 AVR Uk ady peryferyjne

hd44780_outcmd(HD44780_SHIFT(10)) _delay_ms(700)

HD44780_FNSET(if8bit twoline font5x10)Polecenie to wybiera typ interfejsu mdash 8-bitowy je li warto parametru if8bit jestroacutewna 1 lub 4-bitowy je li jest roacutewna 0 Typ interfejsu musi odpowiada sposobowipo czenia modu u z mikrokontrolerem Parametr twoline okre la czy pod czonamatryca LCD ma jedn lini znakoacutew czy dwie Matryce ktoacutere maj 4 linie tekstu straktowane przez kontroler jako matryce dwuliniowe mdash parametr twoline powinienmie warto 1 Je li dla matrycy zawieraj cej dwie lub wi cej linii ustawimy go na 0to wy wietlana b dzie tylko jedna linia (w przypadku matryc dwuliniowych goacuterna)a w przypadku matryc 4-liniowych b d wy wietlane dwie linie rozdzielone lini pust

Ostatni parametr okre la typ u ywanego generatora znakoacutew Powinien on odpowiadau ytej w module matrycy zwykle wi c jego warto wynosi 0

HD44780_DISPCTL(disp cursor blink)Ustawia roacute ne parametry pracy matrycy Je li parametr disp ma warto 1 to matrycajest w czona (wy wietla zawarto DDRAM) a je li 0 to matryca jest wy czonalecz stan pami ci DDRAM nie ulega zmianie Np kod

while(1) hd44780_outcmd(HD44780_DISPCTL(011)) _delay_ms(700) hd44780_outcmd(HD44780_DISPCTL(111)) _delay_ms(700)

powoduje naprzemienne w czanie i wy czanie matrycy w efekcie wy wietlany tekstmruga

Parametr cursor okre la czy sprz towo wy wietlany kursor ma by widoczny (war-to parametru 1) czy niewidoczny (warto parametru 0) Je li kursor jest widocznyto dodatkowo mo emy okre li czy ma miga (warto parametru blink roacutewna 1)czy nie (blink = 0) Je li kursor jest widoczny i nie miga jest wy wietlany w postacipoziomej kreski Wy wietlanie kursora mo e by u yteczne w sytuacji kiedy u yt-kownik wprowadza jakie dane W pozosta ych sytuacjach kursor mo emy wy czy

HD44780_ENTMODE(inc shift)Okre la sposoacuteb wprowadzania danych do pami ci Je li parametr inc ma warto 1 topo ka dej operacji zapisuodczytu adres pami ci jest automatycznie zwi kszany o je-den co przy piesza operacj zapisuodczytu kolejnych znakoacutew Je li warto inc jestroacutewna 0 to adres jest automatycznie zmniejszany o 1 Dodatkowo parametr shiftokre la czy wy wietlany obraz ma by automatycznie przesuwany tak aby wy wie-tla ostatnio wprowadzony znak (shift = 1) lub go nie wy wietla (shift = 0)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 53

HD44780_CLRPowoduje wyczyszczenie (wype nienie znakami o kodzie 32) ca ej zawarto ci pami ciDDRAM Jednocze nie kursor wraca do pozycji pierwszej (pierwsza linia pierwszyznak)

Niewy wietlane bajty pami ci DDRAM tak e s kasowane Je li s one u ywanedo przechowywania zmiennych programu to przed operacj kasowania nale y jeskopiowa w bezpieczne miejsce W przeciwnym przypadku zostan utracone

Wska nik adresu do pami ci DDRAM jest ustawiany na 0 zerowane jest tak e prze-suni cie

HD44780_HOMEPowoduje powroacutet kursora do pozycji pocz tkowej mdash pierwsza linia pierwszy znakWska nik adresu do pami ci DDRAM w efekcie zawiera 0 zerowane jest roacutewnieprzesuni cie wy wietlania znakoacutew w efekcie s one wy wietlane od pozycji 0

HD44780_DDADDR(addr)Ustawia nast pny adres zapisuodczytu w pami ci DDRAM na addr Tylko 7 bitoacutewargumentu addr jest branych pod uwag w zwi zku z czym mo na zaadresowa mak-symalnie 128 bajtoacutew pami ci (z czego sterownik ma tylko 80 pozosta e lokacje snieu ywane)

HD44780_CGADDR(addr)Ustawia nast pn operacj odczytuzapisu w pami ci CGRAM na addr Pod uwagbranych jest tylko 6 bitoacutew zmiennej addr w efekcie mo na zaadresowa maksymalnie64 bajty pami ci CGRAM

Przedstawione powy ej funkcje zapewniaj jedynie podstawow komunikacj z mo-du em LCD Potrzebujemy jednak ci gle funkcji odpowiedzialnej za jego inicjalizacjmdash funkcja biblioteczna przeprowadza ten proces tylko w podstawowym zakresie musi-my jeszcze zadba o w a ciwe ustawienie parametroacutew zwi zane z posiadan matryc Napiszmy wi c w asne rozwini cie funkcji inicjalizacyjnej

void lcd_init() hd44780_init() Podstawowa inicjalizacja modu u hd44780_outcmd(HD44780_CLR) Wyczy pami DDRAM hd44780_wait_ready(1000) hd44780_outcmd(HD44780_ENTMODE(1 0)) Tryb autoinkrementacji AC hd44780_wait_ready(1000) hd44780_outcmd(HD44780_DISPCTL(1 0 0)) W cz wy wietlacz wy cz kursor hd44780_wait_ready(1000)

Zauwa e po wys aniu ka dego polecenia do modu u jest wywo ywana funkcjahd44780_wait_ready(1000) odpowiedzialna za oczekiwanie a realizacja wys anego po-lecenia dobiegnie ko ca Jest to niezb dne gdy do czasu uko czenia bie cej

Kup książkę Poleć książkę

54 AVR Uk ady peryferyjne

operacji dalsze polecenia s ignorowane Jako argument podany jest parametr 1000mdash jest on bez znaczenia nasza biblioteka korzysta z flagi Busy i po prostu go ignorujePo wykonaniu powy szej funkcji modu LCD jest poprawnie zainicjalizowany a jegopami jest wyczyszczona (zawiera bajty 0x20) i w efekcie modu nic nie wy wietlaOd tej chwili mo emy wysy a znaki do wy wietlenia

Po wykonaniu inicjalizacji ekran mo e pozosta czysty lub wy wietla ca kowiciewype nione kwadraty (wszystkie piksele w czone) Je li po inicjalizacji wszystkiepiksele s w czone nale y nieco zmniejszy kontrast

Aby sobie u atwi to zadanie zdefiniujmy funkcj wysy aj c do modu u jeden znakvoid lcd_putchar(char c) static bool second_nl_seen static uint8_t line=0

if ((second_nl_seen) ampamp (c = n)ampamp(line==0)) Odebrano pierwszy znak hd44780_wait_ready(40) hd44780_outcmd(HD44780_CLR) hd44780_wait_ready(1600) second_nl_seen=false if (c == n) if (line==0) line++ hd44780_outcmd(HD44780_DDADDR(64)) Adres pierwszego znaku drugiej linii hd44780_wait_ready(1000) else second_nl_seen=true line=0 else hd44780_outdata(c) hd44780_wait_ready(40)

Funkcja ta ze wzgl du na skomplikowane adresowanie pami ci DDRAM jest zale naod konkretnego modelu modu u LCD B dzie prawid owo wspoacute pracowa z modu a-mi 2times16 2times20 i 2times40 znakoacutew W przypadku innych modu oacutew pozycje niektoacuterychznakoacutew mog by nieprawid owe

Mo emy ju wy wietla na LCD pojedyncze znaki czas na wy wietlanie tekstu Po-niewa teksty jako sta e dla zaoszcz dzenia cennej pami ci RAM przechowuje si za-zwyczaj w pami ci FLASH zdefiniujmy funkcj odczytuj c podany a cuch zna-kowy z pami ci FLASH a nast pnie umieszczaj c go na LCD

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 55

void lcd_puttext_P(prog_char txt) char ch while((ch=pgm_read_byte(txt))) lcd_putchar(ch) txt++

Powy sza funkcja wysy a kolejne znaki odczytane z pami ci FLASH na LCD za po-moc funkcji LCD_putchar Po napotkaniu znaku ko ca a cucha (0 nul) przerywa swojedzia anie

Pozostaje nam przetestowa dzia anie przedstawionych funkcjiint main() lcd_init() lcd_puttext_P(PSTR(Test LCDnDruga linia)) while(1)

Na ekranie modu u LCD powinien wy wietli si napisTest LCDDruga linia

Je li na LCD nic nie widzimy to w pierwszej kolejno ci powinni my sprawdzi kon-trast zmieniaj c napi cie na pinie Vee modu u LCD

Warto zdefiniowa jeszcze funkcj ustawiaj c pozycj od ktoacuterej b dzie wy wietlanynast pny znak

void lcd_goto(uint8_t x uint8_t y) hd44780_outcmd(HD44780_DDADDR(0x40y+x)) hd44780_wait_ready(1000)

Funkcja ta przyjmuje dwa parametry x i y okre laj ce pozycj na ktoacuterej zostaniewy wietlony nast pny znak wys any z mikrokontrolera do modu u LCD Dzi ki temuz atwo ci mo emy uaktualnia zawarto LCD bez konieczno ci ponownego prze-sy ania wszystkich danych Funkcja ta jest zale na od typu zastosowanego modu u

Ostatni funkcj jest funkcja umo liwiaj ca czyszczenie zawarto ci pami ci modu uOdpowiedzialne za to jest proste polecenie wysy ane do sterownika

void lcd_cls() hd44780_outcmd(HD44780_CLR) hd44780_wait_ready(false)

Oproacutecz czyszczenia zawarto ci pami ci modu u powoduje ono ustawienie kursoraw punkcie (00)

Kup książkę Poleć książkę

56 AVR Uk ady peryferyjne

Definiowanie w asnych znakoacutewUk ad HD44780 jest wyposa ony w 64 bajty pami ci CGRAM (ang Character Ge-nerator RAM) ktoacutera mo e przechowywa mapy bitowe 8 znakoacutew o matrycy 5times8 pikselilub 4 znakoacutew o matrycy 5times10 pikseli Przyk ad definicji znaku na matrycy 5times8 poka-zano na rysunku 223

Rysunek 223Przyk ad definicji w asnego znakuw pami ci CGRAM Znak rysujemyna matrycy 5times8 bitoacutew polazaciemnione odpowiadaj warto ci 1pola bia e warto ci 0 Wartowyliczon dla ka dej linii pikseliwpisujemy do pami ci CGRAMsterownika Najstarsze 3 bity ka degobajta (pola szare) s bez znaczeniamdash wy wietlacz pomija jeprzy wy wietlaniu obrazu

1

2

3

4

5

6

7

0 00100 = 4

01110 = 14

11111 = 31

00100 = 4

00100 = 4

00100 = 4

11111 = 31

01110 = 14

Adres Warto

Dost p do tej pami ci jest mo liwy dzi ki wys aniu polecenia ustawiaj cego adreszapisuodczytu pami ci CGRAM Po jego wys aniu wszystkie operacje zapisu i od-czytu dotycz tej pami ci a nie pami ci DDRAM Aby wroacuteci do adresowania pa-mi ci DDRAM nale y wybra jej adres lub dokona operacji wymagaj cej przesu-ni cia kursora

Pami CGRAM jest pami ci ulotn po ponownym w czeniu zasilania definicjeznakoacutew musz by ponownie przes ane przez procesor

Bity o warto ci 1 w definicji znaku odpowiadaj w czonym pikselom bity o warto-ci 0 pikselom wy czonym Najstarsze 3 bity ka dego bajta w pami ci CGRAM s

bez znaczenia mdash te pozycje nie s wy wietlane przez matryc Definiuj c znak nale-y tak e pami ta e ostatnia linia wy wietlana przez matryc (w zale no ci od wiel-

ko ci matrycy znaku linia 8 lub 10) powinna zawiera same zera mdash w tej linii b dziewy wietlany kursor

Najcz ciej matryce LCD pod czone do sterownika HD44780 maj organizacj 5times8czyli jeden znak jest definiowany przez 8 kolejnych bajtoacutew okre laj cych stan po-szczegoacutelnych linii tworz cych znak Stwoacuterzmy funkcj ktoacuterej zadaniem b dzie za a-dowanie definicji znakoacutew z pami ci FLASH mikrokontrolera do pami ci CGRAM

void lcd_defchar_P(uint8_t charno prog_uint8_t chardef) hd44780_outcmd(HD44780_CGADDR(charno8)) hd44780_wait_ready(40) for(uint8_t c=0clt8c++) hd44780_outdata(pgm_read_byte(chardef))

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 57

hd44780_wait_ready(40) chardef++

Funkcja LCD_defchar_P jako argumenty przyjmuje numer definiowanego znaku (0 ndash 7)oraz wska nik do obszaru pami ci FLASH zawieraj cego definicj znaku (obszarten zajmuje 8 nast puj cych po sobie bajtoacutew) Jak widzimy funkcja najpierw ustawiaw a ciwy adres pod ktoacuterym znajdzie si pocz tek definicji znaku w pami ci CGRAMmdash poniewa jeden znak jest opisywany za pomoc 8 bajtoacutew kolejne adresy znakoacutewto kod_znakutimes8 Nast pnie dane opisuj ce znak s adowane z pami ci mikrokontrolerai zapisywane w pami ci CGRAM sterownika Poni szy program ilustruje wykorzy-stanie funkcji LCD_defchar_P

prog_uint8_t char1[8][8]=0000000255 00000025525500000255255255 0000255255255255 00025525525525525500255255255255255255 0255255255255255255255255255255255255255255255

int main() for(uint8_t x=0xlt8x++) lcd_defchar_P(xampchar1[x][0]) Za aduj wzorce znakoacutew lcd_init() for(uint8_t x=0xlt8x++) lcd_putchar(x) Wy wietl znaki o kodach 0 ndash 7 while(1)

W pierwszej linii funkcji main nast puje za adowanie nowych definicji znakoacutew dopami ci CGRAM nast pnie inicjalizowany jest wy wietlacz po czym w pierwszejlinii s wy wietlane znaki o kodach 0 ndash 7 a wi c znaki ktoacuterych definicja zosta aprzes ana z mikrokontrolera

Zauwa e pami CGRAM podobnie jak DDRAM mo emy zapisywa i odczytywaprzed inicjalizacj modu u LCD Proces inicjalizacji jest potrzebny tylko do prawi-d owego wy wietlania na ekranie LCD

Poniewa dane potrzebne do wy wietlenia znaku s na bie co pobierane z pami cipodczas od wie ania matrycy LCD jakiekolwiek zmiany w definicji znaku kiedy jest onwidoczny na LCD poci gaj za sob natychmiastowe zmiany w wy wietlanym obrazieMo na t w a ciwo sterownika wykorzysta do stworzenia prostych animacji

void lcd_box(uint8_t y) hd44780_outcmd(HD44780_CGADDR(0)) Zaczynamy od znaku o kodzie 0 hd44780_wait_ready(40) for(uint8_t c=0cltyc++) Stwoacuterz linie z w czonymi pikselami hd44780_outdata(0xFF) hd44780_wait_ready(40) for(uint8_t c=yclt8c++) Stwoacuterz linie z wy czonymi pikselami hd44780_outdata(0x00) hd44780_wait_ready(40)

Kup książkę Poleć książkę

58 AVR Uk ady peryferyjne

int main() lcd_init() lcd_putchar(0) while(1) for(uint8_t x=0xlt8x++) lcd_box(x) _delay_ms(100) for(int8_t x=7xgt=0x--) lcd_box(x) _delay_ms(100)

Funkcja main wy wietla na LCD tylko jeden znak o kodzie 0 a nast pnie cykliczniezmienia jego definicj w pami ci CGRAM W efekcie posta znaku wy wietlana naekranie ci gle si zmienia

Transakcyjna obs uga LCDPokazana do tej pory obs uga LCD alfanumerycznego mia a pewne wady Jak wiemyoperacje odwo uj ce si do kontrolera LCD s niezwykle wolne cykl odczytuzapisudowolnego rejestru kontrolera trwa co najmniej 1600 ns co dla MCU taktowanegozegarem 32 MHz przek ada si na czas wykonania oko o 52 instrukcji asemblera Cogorsza wi kszo komend realizowanych przez kontroler jest wykonywana w czasieoko o 37 s co przek ada si na tysi ce zmarnowanych taktoacutew MCU St d te jaki-kolwiek zapisodczyt LCD to z perspektywy programu straszne marnotrawstwo czasu

Problem ten dotyczy ka dego urz dzenia IO ktoacutere dzia a wolniej ni procesor W takiejsytuacji warto napisa pewn warstw po redni mdash sterownik mdash ktoacuterego zada-niem b dzie buforowanie da dost pu do urz dzenia i rozstrzyganie konfliktoacutewdzi ki czemu roacute ne cz ci programu b d bdquomia y wra enierdquo e maj wy czny do-st p do urz dzenia

Pokazane wcze niej funkcje obs ugi LCD maj jeszcze jedn wad mdash nie s wspoacute bie -ne czyli nie mo na ich wykonywa jednocze nie w kilku miejscach programu w tymw szczegoacutelno ci w programie g oacutewnym i w funkcjach obs ugi przerwa W wielu przy-padkach ta wada jest bez znaczenia jednak czasami jest uci liwa mdash dla przyk adugdy na wy wietlany tekst chcieliby my na o y inne informacje np o dacie lub godzi-nie Oczywi cie wy wietlanie mo na zorganizowa tak aby nie by o potrzeby pisaniawspoacute bie nego kodu np poprzez zastosowanie bufora pami ci VRAM kontrolera LCDRodzi to jednak kolejne problemy i jest ma o eleganckie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 59

Zastanoacutewmy si w jaki sposoacuteb najlepiej jednocze nie rozwi za problem wolnegodost pu do urz dzenia i wspoacute bie no ci kodu Rozwi zaniem mo e by wprowadze-nie tzw transakcji Transakcj nazywamy zbioacuter operacji tworz cych pewn ca-o To co wyroacute nia tak wykonywany zestaw operacji to atomowo spoacutejno

izolacja i trwa o Pod tymi terminami kryje si istota wykonywanej operacji Ato-mowo transakcji zapewnia e jest ona wykonywana w sposoacuteb niepodzielny co gwa-rantuje nam prawid ow wspoacute prac z danym urz dzeniem IO w tym przypadku kon-trolerem LCD Wa na dla nas jest tak e izolacja mdash dzi ki temu inne operacje na LCD(inne transakcje) nie b d mia y wp ywu na wynik aktualnie wykonywanej transakcjimdash nie b d zak oacuteca y jej wykonania z drugiej strony nasza transakcja nie zak oacuteciwykonania innych Trwa o z kolei zagwarantuje nam e je li sterownik potwierdziwykonanie transakcji to znaczy e efekt jej dzia ania jest wy wietlony na LCD Tacecha nie jest nam a tak potrzebna mdash jest ona wydawa oby si oczywista Niemniej jestto pewna gwarancja e ca a operacja przebieg a poprawnie i w efekcie LCD znajdujesi w okre lonym przez nas stanie Tyle teorii przejd my do praktyki

Kody poni szego przyk adu znajduj si w katalogu PrzykladyLCD-alfaLCD-transact

Aby zapewni transakcyjny dost p do LCD musimy stworzy pewne struktury danychktoacuterych zadaniem b dzie przechowywanie informacji o operacjach sk adaj cych sina transakcje i stanie ich wykonania W tym celu pos u ymy si wiadomo ciami z roz-dzia u 5 bdquoJak uporz dkowa chaos czyli z o one typy danych i listyrdquo Do przecho-wywania oczekuj cych transakcji pos u ymy si buforem pier cieniowym zanimjednak go zaimplementujemy zastanoacutewmy si jak powinna wygl da struktura prze-chowuj ca informacje o transakcji Struktura ta powinna zawiera co najmniej

pole danych (data) z informacjami ktoacutere maj by przes ane do kontrolera LCD

pole okre laj ce liczb danych do wys ania (len)

pole okre laj ce realizowane polecenie dla LCD (cmd) mdash pole to pos u yprogramowi sterownika do w a ciwej interpretacji danych znajduj cych siw polu data

kilka poacutel kontrolnych przechowuj cych informacje potrzebne do realizacjisamej transakcji Jedno z nich mdash Ready mdash b dzie przyjmowa warto trueje li dana transakcja zosta a zrealizowana lub false w przeciwnym przypadkuZnaczenie drugiego pola mdash SelfDel mdash mo e wydawa si nieco enigmatycznepole to okre la czy pami przydzielona dla transakcji ma by zwolnionaw sterowniku LCD (warto true) czy te zostanie zwolniona w programie(warto false)

Oto jak mo e wygl da struktura definiuj ca transakcj typedef struct volatile bool Ready 1 true je li transakcja zosta a zrealizowana bool SelfDel 1 true je li pami przydzielona transakcji ma zosta zwolniona LCD_Cmd cmd 2 Polecenie do zrealizowania uint8_t len 6 D ugo polecenia

Kup książkę Poleć książkę

60 AVR Uk ady peryferyjne

unsigned 0 Wyroacutewnanie do granicy bajta uint8_t data[] Dane transakcji LCD_trans

Nale y zwroacuteci uwag na poleunsigned 0

Nie definiuje ono adnego pola struktury ale jedynie informuje kompilator e kolejnepole (w naszym przyk adzie o nazwie data) ma by wyroacutewnane do granicy bajta mdashdzi ki temu dost p do kolejnego pola b dzie odbywa si szybciej Z kolei samo poledata jest zadeklarowane jako tzw typ niekompletny

Typ niekompletny (ang incomplete type) to typ ktoacuterego rozmiaru nie da si okre li

W pokazanym przyk adzie rozmiaru pola data nie da si okre li gdy zosta on za-deklarowany jako typ tablicowy z tym e nie podano wielko ci tablicy Wielko ci niepodano gdy na etapie deklaracji struktury nie wiemy jakiej wielko ci dane b d w niejprzechowywane Tego typu deklaracja ma bardzo powa ne konsekwencje mdash skorowielko ci pola data nie da si okre li to jaki b dzie wynik dzia ania operatora sizeof(LCD_trans) Kompilator stara si jako wybrn z tej sytuacji w zwi zku z czym

zwroacuteci wielko struktury ale tak jakby pole data w ogoacutele nie istnia o mdash jego roz-miar b dzie wynosi 0 W ramach wiczenia zastanoacutew si ile bajtoacutew pami ci b dziezajmowa a struktura LCD_trans

Skoro dysponujemy ju struktur przechowuj c poszczegoacutelne transakcje pora nastworzenie obiektu przechowuj cego kolekcj transakcji Dodanie kolejnej strukturyb dzie polega o na dodaniu jej do takiego obiektu z drugiej strony program sterownikaLCD b dzie moacuteg z tej kolekcji pobiera kolejne transakcje do realizacji Opis ten przy-pomina opis dzia ania bufora pier cieniowego mdash z jednym wyj tkiem mdash po zape nie-niu ca ego bufora nie b dziemy usuwa niezrealizowanych transakcji lecz zabloku-jemy dodawanie kolejnych W tym celu pos u ymy si definicj nast pnej struktury

typedef struct LCD_trans elements[LCD_MAXTRANS] Wska niki do transakcji uint8_t Beg Pierwszy element bufora uint8_t Count Liczba elementoacutew w buforze CircBuffer

Struktura ta zawiera deklaracj tablicy wska nikoacutew na transakcje (pole elements)Poniewa jest to tablica musimy zna liczb jej elementoacutew mdash jest ona zadeklarowanaw sta ej LCD_MAXTRANS

define LCD_MAXTRANS 10 Maksymalna liczba pami tanych transakcji

Do realizacji bufora s potrzebne jeszcze dwa pola Beg wskazuj ce na pierwsztransakcj w buforze oraz pole Count okre laj ce liczb transakcji znajduj cych siw buforze Je li Count == 0 to znaczy e w buforze nie ma adnych oczekuj cychtransakcji a je li Count == LCD_MAXTRANS to znaczy e bufor jest pe ny i nie mo na

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 61

dodawa do niego kolejnych transakcji W a ciwo t wykorzystuj dwie zdefiniowanew pliku LCD_transc funkcje

static inline bool cbIsFull(CircBuffer cb) return cb-gtCount == LCD_MAXTRANS

static inline bool cbIsEmpty(CircBuffer cb) return cb-gtCount == 0

Jak pami tamy w przypadku funkcji modyfikatory static inline powoduj e danafunkcja nie b dzie istnie jako samodzielna lecz w ka dym miejscu w ktoacuterym jestwywo ywana jest wstawiany raczej jej kod a nie wywo anie Ma to znaczenie dlakroacutetkich funkcji (a wi c takich jak pokazane powy ej) dla ktoacuterych koszty wywo anias zazwyczaj wi ksze ni koszty umieszczenia cia a funkcji w miejscu jej wywo aniaTego typu funkcje zachowuj si w sposoacuteb zbli ony do makrodefinicji (z tym e re-spektuj wszystkie regu y j zyka C w szczegoacutelno ci kolejno operatoroacutew czy kon-trol typoacutew)

Takie funkcje jako argument pobieraj adres bufora na ktoacuterym maj operowa W na-szym przypadku bufor jest zdefiniowany nast puj co

static CircBuffer LCD_TransBuffer Bufor na transakcje

Nale y zauwa y e jest on zdefiniowany jako struktura globalna z modyfikatoremstatic Modyfikator ten ogranicza zasi g widoczno ci zmiennej LCD_TransBuffer dopliku w ktoacuterym zmienna ta zosta a zdefiniowana (w tym przypadku modyfikator staticjest niejako przeciwie stwem modyfikatora extern) Dzia anie to ma jedynie znaczeniekosmetyczne mdash uniemo liwia odwo anie si do bufora za pomoc funkcji ktoacutere niezosta y zdefiniowane w miejscu jego definicji Oproacutecz funkcji umo liwiaj cych okre-lenie stanu bufora potrzebne s jeszcze funkcje umo liwiaj ce dodanie i pobranie trans-

akcji Pierwsz funkcj b dzie funkcja dodaj ca transakcj do buforabool cbAdd(CircBuffer cb LCD_trans elem) ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsFull(cb)) return false Czy jest miejsce w kolejce uint8_t end = (cb-gtBeg + cb-gtCount) LCD_MAXTRANS cb-gtelements[end] = elem Dodaj transakcj ++cb-gtCount Liczba elementoacutew w buforze return true Wszystko OK

Funkcja ta dodaje transakcj (zmienna elem) do bufora ko owego Zanim transakcjazostanie dodana sprawdzane jest czy w buforze jest miejsce mdash je li nie funkcjazwroacuteci false Je li dodanie jest mo liwe warto licznika okre laj cego liczb trans-akcji przechowywana w buforze (Count) zwi ksza si o jeden Warto zastanowi si te dlaczego praktycznie ca e cia o tej funkcji jest zamkni te w sekcji atomowej (ATOMIC_BLOCK) Jedn z cech naszego sterownika ma by mo liwo wspoacute bie nego dost pu

Kup książkę Poleć książkę

62 AVR Uk ady peryferyjne

do LCD mdash to znaczy e danie np zapisu do LCD mo e wyst pi zaroacutewno w g oacutewnejp tli programu jak i asynchronicznie w przerwaniu St d te wynika e funkcja do-daj ca transakcj musi by napisana w sposoacuteb zapewniaj cy jej poprawn prac w sytu-acji gdy zostanie ona przerwana i ponownie wywo ana przed zako czeniem dzia aniajej poprzedniej instancji Umieszczenie cia a tej funkcji w sekcji atomowej nam to za-pewnia mdash dzi ki temu bufor transakcji zawsze b dzie spoacutejny Dla zaspokojenia cie-kawo ci warto usun sekcj atomow i sprawdzi jak wtedy b dzie zachowywa si tafunkcja i jak wp ynie to na spoacutejno przechowywanych danych

Drug niezb dn funkcj jest funkcja odczytuj ca bufor transakcji i zwracaj ca trans-akcj do zrealizowania (lub NULL je li adnej transakcji nie ma w buforze)

LCD_trans cbRead(CircBuffer cb) LCD_trans elem ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsEmpty(cb)) return NULL Bufor pusty nie mo na zwroacuteci elementu elem = cb-gtelements[cb-gtBeg] cb-gtBeg = (cb-gtBeg + 1) LCD_MAXTRANS -- cb-gtCount Zmniejszamy liczb elementoacutew pozosta ych w buforze return elem

Funkcja ta jest bardzo podobna do poprzedniej mdash najpierw sprawdza czy bufor za-wiera jak oczekuj c transakcj (cbIsEmpty(cb)) je li tak to zwraca adres opisuj -cej j struktury i zmniejsza liczb transakcji oczekuj cych (pole Count) W ten sposoacutebmamy zrealizowan ca funkcjonalno zwi zan z obs ug bufora pier cieniowegoPokazane funkcje s uniwersalne i z bardzo podobnych (lub wr cz tych samych) b -dziemy korzysta w kolejnych rozdzia ach w kontek cie np obs ugi transakcji zwi -zanych z interfejsami szeregowymi

Pora przej do samego sterownika LCD Jego zadaniem b dzie sprawdzenie czyw buforze oczekuj jakie transakcje do realizacji a je li tak to ich wykonanie Ponie-wa dane do LCD mog by wysy ane co okre lony minimalny czas znacznie d u -szy ni czas jakiego na to zadanie potrzebuje mikrokontroler do wysy ania kolejnychpaczek danych pos u ymy si timerem Timer b dzie generowa przerwanie nadmiaru(TCD0_OVF_vect) ktoacutere b dzie wyznacza o tempo w jakim kolejne porcje danych b -d trafia y do LCD Z noty katalogowej kontrolera wynika e minimalny czas trwa-nia wysokiego stanu sygna u Enable to 230 ns a okres tego sygna u nie powinien bykroacutetszy ni 500 ns Poniewa nasz dost p do LCD odbywa si w sposoacuteb nieblokuj cyMCU wi c szybko wysy ania danych do LCD jest bez znaczenia St d te w poka-zanym przyk adzie przyj to e dane b d wysy ane co 4 s co okre la sta a

define LCD_ACCESSTIME 0000004

Poniewa komunikacja z LCD odbywa si w sposoacuteb nieblokuj cy nie zale y nam tena czasie (i tak w stosunku do czasu od wie ania samego LCD jest on bardzo kroacutetki)w efekcie nie ma potrzeby odczytywania flagi busy kontrolera Dzi ki temu w cz ciprzypadkoacutew mo emy w ogoacutele zrezygnowa z sygna u wyboru RW i wymusi jego sta y

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 63

poziom logiczny umo liwiaj cy zapis do LCD Dzi ki temu mo na zaoszcz dzi do-datkowy pin IO1

Ca a logika naszego sterownika jest zawarta w funkcji obs ugi przerwania przepe nieniatimera (TCD0_OVF_vect) Poniewa LCD jest po czony z MCU w trybie 4-bitowym(dla zaoszcz dzenia liczby wykorzystanych pinoacutew IO) kolejne 8-bitowe dane muszby podzielone na dwie tetrady i wys ane do LCD w kolejno ci starszam odsza tetradaInformacja o aktualnie wysy anych danych jest umieszczona w zmiennej trans o typie

static struct uint8_t pos 6 Pozycja w polu danych aktualnej transakcji uint8_t nibble 1 Ktoacutera tetrada jest wysy ana seq

Dlaczego tak Dzi ki wykorzystaniu struktury i poacutel bitowych mo na zaoszcz dzi je-den bajt pami ci SRAM Ze wzgl du na wielko pami ci obs ugiwanej przez kon-troler LCD mo emy by pewni e transakcje zawieraj ce wi cej ni 63 bajty s ra-czej nierealne (nie mia yby wi kszego sensu) St d te do przechowywania informacjio aktualnie wysy anym bajcie danych wystarczy 6 bitoacutew mdash tyle samo zosta o wyko-rzystanych do okre lenia d ugo ci pola danych transakcji w strukturze LCD_trans Zaosz-cz dzony bit mo na po wi ci na flag nibble okre laj c ktoacutera tetrada (m odszastarsza)jest wysy ana Bez poacutel bitowych flaga ta zaj aby dodatkowy bajt pami ci

Przejd my do implementacji sterownika Pierwsz rzecz jak nale y sprawdzi jestto czy w buforze czeka jaka transakcja do zrealizowania Odpowiedzialny za to jestfragment kodu obs ugi przerwania nadmiaru timera

if(trans == NULL) Nic do zrobienia sprawd my czy jaka transakcja oczekuje trans=cbRead(ampLCD_TransBuffer) Czy jest jaka oczekuj ca transakcja seqpos=0 seqnibble=0 if(trans == NULL) TCD0_CTRLA=TC_CLKSEL_OFF_gc Nie ma adnych transakcji mdash wy cz timer

W przypadku gdy adna transakcja nie oczekuje na realizacj timer jest wy czanymdash dzi ki temu nie b d zg aszane kolejne przerwania przepe nienia i MCU nie b -dzie traci czasu na ich obs ug Co prawda wynikaj cy z tego zysk czasowy jest mar-ginalny lecz ma to istotniejsz konsekwencj mdash w przypadku usypiania MCU zb d-ne przerwanie timera nie b dzie niepotrzebnie wybudza o procesora W takiej sytuacjiponowne w czenie timera nast pi dopiero w funkcji dodaj cej transakcj do kolejkimdash a wi c w sytuacji gdy mamy pewno e istnieje oczekuj ca transakcja

Druga cz funkcji obs ugi przerwania jest zwi zana z realizacj samej transakcjiW pokazanym przyk adzie zaimplementowano tylko jeden typ transakcji mdash daniezapisu a cucha tekstowego pod wskazany adres VRAM (na okre lonej pozycji LCD)Je li zajdzie taka potrzeba programista mo e zaimplementowa inne polecenia i doda

1 Warto zauwa y e w bdquoklasycznejrdquo obs udze LCD te nie musimy czyta stanu flagi busy zamiast tego

wystarczy wprowadza p tle opoacute niaj ce Jednak poniewa taka obs uga blokuje MCU nie jest onazalecana Wady tej nie ma dost p transakcyjny co jest jego dodatkow zalet

Kup książkę Poleć książkę

64 AVR Uk ady peryferyjne

kod odpowiedzialny za ich obs ug Zauwa my e ka da transakcja musi zawieraadres pocz tku pami ci wideo od ktoacuterego b dzie zapisywany tekst Dzieje si takdlatego e transakcja wykonana wcze niej mo e ustawi wska nik zapisu na dowolnejkomoacuterce pami ci W efekcie tekst z kolejnej transakcji by by wy wietlany od komoacuterkina ktoacuterej zako czy si zapis poprzedniej transakcji Takie dzia anie oczywi cie jestniedopuszczalne st d te ka dy zapis do pami ci wideo poprzedza ustawienie rejestruindeksowego Problem ten mo na rozwi za tak e w inny sposoacuteb mdash poprzez wpro-wadzenie tzw uchwytoacutew (ang handlers) ktoacutere zawiera yby stan kontrolera LCDNiemniej to rozwi zanie dodatkowo komplikowa oby nasz sterownik Struktura danych(zawartych w polu data) ma wi c nast puj cy format

bajt nr 0 zawiera warto pozycji od ktoacuterej nale y dokonywa zapisu pami ciwideo mdash jest to warto przesy ana do rejestru okre laj cego adres zapisu

kolejne bajty zawieraj a cuch znakowy ktoacutery nale y umie ci w pami ciCGRAM

Poniewa bajt nr 0 zawsze zawiera warto wpisywan do rejestroacutew steruj cych kon-trolera podczas jego wysy ania jest ustawiana linia RS sygnalizuj ca zapis do rejestruPodczas wysy ania kolejnych bajtoacutew linia ta jest zerowana w zwi zku z czym zapisodbywa si do pami ci CGRAM

Kod obs uguj cy transakcj wygl da nast puj coif(trans) Jest transakcja do zrealizowania uint8_t dat=trans-gtdata[seqpos] if(seqnibble == 0) datgtgt=4 To trzeba zmieni je li linie danych nie s po czone z pinami 0 ndash 3 portu IO hd44780_outnibble_nowait(dat amp 0x0F seqpos = 0) Zapisujemy rejestr steruj cy lub dane ++seqnibble if(seqnibble == 0) ++seqpos Co drug tetrad zwi kszamy pozycj bufora if(seqpos gt= trans-gtlen) trans-gtReady=true Koniec transakcji if(trans-gtSelfDel) free_re(trans) Zwolnij pami transakcji je li tak sobie yczy programista trans=NULL Koniec transakcji CLR(OUT HD44780_E)

Ta cz przerwania wysy a kolejne tetrady do kontrolera LCD Warto zastanowi sinad dzia aniem sekwencji

++seqnibble

Poniewa pole nibble jest jednobitowe operacja inkrementacji prowadzi do zmianystanu tego pola na przeciwny (pole to ma warto 0 lub 1) Kiedy zostan wys anewszystkie dane przeznaczone dla kontrolera obs uga transakcji ko czy si Stan tensygnalizuje nadanie warto ci true polu Ready struktury LCD_trans Dzi ki temu pro-gram mo e sprawdzi asynchronicznie w stosunku do przerwania kiedy transakcjauleg a zako czeniu Opcjonalnie jest wykonywana jeszcze jedna funkcja mdash je li poleSelfDel ma warto true to pami zarezerwowana na transakcj jest automatycznie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 65

zwalniana W tym celu wykorzystuje si funkcj free_re ktoacuterej prototyp jest zade-klarowany w pliku Alloc_safeh Funkcja ta wywo uje funkcj biblioteczn free ktoacute-ra zwalnia pami przydzielon dynamicznie na stercie Poniewa funkcja ta nie jestfunkcj reentrant nale y stworzy odpowiedni bdquoprotez rdquo opakowuj c j w blokatomowy co zapewnia e nie zostanie ona ponownie wywo ana zanim jej poprzed-nia instancja nie zako czy dzia ania Oczywi cie lepszym rozwi zaniem by oby napi-sanie w asnych funkcji dynamicznej alokacji pami ci ktoacutere b d reentrant

Bardzo wa ne jest aby pole SelfDel mia o warto true wy cznie dla transakcjidla ktoacuterych pami zosta a przydzielona dynamicznie funkcj malloc (lub jej po-chodnymi) W pozosta ych przypadkach pole to musi mie warto false mdash nie-stosowanie si do tej regu y spowoduje b d mened era pami ci i najprawdopo-dobniej nieprzewidywalne dzia anie programu

Drug wa n zasad jest aby zmienna zawieraj ca dane transakcji nie by azmienn automatyczn mdash zmienne takie s automatycznie niszczone po opusz-czeniu zawieraj cej je funkcji W rezultacie obszar pami ci zawieraj cy danetransakcji mo e zosta wykorzystany przez inne zmienne co spowoduje uszkodzeniezawartych w nim danych

Pami przydzielona transakcji musi by alokowana w sposoacuteb dynamiczny (funkcjamalloc_re) ewentualnie mo e to by pami alokowana dla zmiennej globalnej lubstatycznej mdash zmienne tego typu istniej przez ca y czas ycia programu

Warto te zauwa y e instrukcje steruj ce stanem linii Enable kontrolera LCD(SET(OUT HD44780_E) i CLR(OUT HD44780_E)) s rozdzielone wieloma innymi in-strukcjami Dzi ki temu generowany impuls dodatni tego sygna u ma czas trwania gt230 ns wymagany w specyfikacji kontrolera Nawet dla XMEGA taktowanej zegarem32 MHz 230 ns przek ada si na oko o 7 instrukcji asemblera mdash czas jaki z pewno-ci up ynie pomi dzy wykonaniem obu powy szych instrukcji steruj cych

Do wysy ania danych do kontrolera zosta a wykorzystana nieco zmodyfikowanafunkcja hd44780_outnibble_nowait roacute ni ca si od jej protoplasty hd44780_outnibbletylko tym e nie czeka na sygna braku zaj to ci mikrokontrolera (nie realizuje teopoacute nie ) Nie jest to potrzebne gdy kolejne tetrady s wysy ane w odst pach cza-sowych okre lanych przez timer

Mamy wi c zapewnion obs ug transakcji i mo liwo transakcyjnego wy wietlaniadanych na LCD musimy jeszcze mie funkcj ktoacutera tworzy odpowiednie transakcjemdash jest odpowiednikiem funkcji bezpo rednio wysy aj cej dane znakowe do LCDOdpowiednikiem tym jest pokazana poni ej funkcja

bool LCD_PutText_B(uint8_t x uint8_t y char txt LCD_trans buf bool autodel) buf-gtcmd=LCD_Text buf-gtReady=false buf-gtSelfDel=autodel Czy zwolni pami po zako czeniu transakcji buf-gtdata[0]=HD44780_DDADDR(x+y0x40) Ustaw adres w DDRAM strcpy((char)ampbuf-gtdata[1] txt) Skopiuj dane tekstowe + NULL

Kup książkę Poleć książkę

66 AVR Uk ady peryferyjne

buf-gtlen=strlen(txt) + 1 D ugo tekstu + pozycji + NULL ndash 1 bool ret=cbAdd(ampLCD_TransBuffer buf) if((ret==false) ampamp (autodel)) free_re(buf) Brak miejsca w kolejce else TCD0_CTRLA=TC_CLKSEL_DIV1_gc Preskaler 1 mdash odblokuj timer return ret

Funkcja ta buduje transakcj odpowiedzialn za wy wietlenie napisu txt na wskaza-nej pozycji x y LCD Wszystkie dane o transakcji zostan umieszczone w buforzew pami ci ktoacuterej adres jest okre lany wska nikiem buf Pami w buforze musi bywystarczaj co du a aby pomie ci ca transakcj Dodatkowy parametr autodel okre laczy pami ta ma by automatycznie zwalniana po obs u eniu transakcji (true) czynie (false) Je li transakcj uda o si umie ci w kolejce funkcja zwraca true Wartozauwa y e w takim przypadku funkcja uruchamia te timer (w naszym przypadkujest to timer TCD0) odpowiedzialny za generowanie przerwania Funkcja obs ugi prze-rwania wysy a dane do LCD

Pewn odmian powy szej funkcji jest funkcjabool LCD_PutText(uint8_t x uint8_t y char txt) LCD_trans trans=malloc_re(sizeof(LCD_trans) + strlen(txt) + 2) bool ret=LCD_PutText_B(x y txt trans true) return ret

Wykorzystuje ona funkcj LCD_PutText_B z tym e najpierw alokuje dynamiczniepami potrzebn na przechowanie tworzonej transakcji

Mamy komplet potrzebnych funkcji a wi c sprawd my jak ca o sprawdza siw praktyce W pliku LCD-transactc znajduje si kod pokazuj cy jak dzia aj naszetransakcje Aby to by o mo liwe nale y zainicjalizowa kontroler LCD

LCD_init()

Wykorzystujemy tu znan ju funkcj inicjalizuj c mdash nie ma potrzeby jej zmienia gdy operacja inicjalizacji LCD jest jednorazowa i nie trzeba wykonywa jej w posta-ci transakcji W drugim kroku musimy zainicjalizowa wykorzystywany timer i systemprzerwa

LCD_Timer_init(ampTCD0)PMIC_CTRL|=PMIC_LOLVLEN_bm Odblokuj przerwania niskiego poziomusei()

Poniewa dost p do LCD z pewno ci nie jest czynno ci krytyczn czasowo prze-rwaniom timera nadano najni szy priorytet Dzi ki temu mo na innym bardziej kry-tycznym przerwaniom nada wy sze priorytety i uzyska w ten sposoacuteb zmniejszenieczasu latencji obs ugi przerwa Sama inicjalizacja timera jest niezwykle prosta

void LCD_Timer_init(TC0_t tc) tc-gtINTCTRLA=TC_OVFINTLVL_LO_gc Odblokuj przerwania nadmiaru timera i nadaj im niski priorytet tc-gtPER=F_CPULCD_ACCESSTIME Przerwanie co 4 us (niezale nie od F_CPU)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 67

Sprowadza si ona tylko do odblokowania mo liwo ci zg aszania przerwania nadmia-ru oraz konfiguracji rejestru PER tak aby przerwania by y generowane co ok 4 s mdashniezale nie od cz stotliwo ci taktowania CPU Mo emy wi c przyst pi do wy wie-tlenia pierwszego napisu

LCD_PutText(00 Numer)

Powy sza funkcja ma jedn wad mdash alokuje dynamicznie pami po ka dym wywo-aniu (pami ta jest automatycznie zwalniana po obs u eniu transakcji) niemniej

ca y proces jest czasoch onny Mo emy tego unikn alokuj c pami bdquor cznierdquo i wielo-krotnie wykorzystuj c zaalokowany blok pami ci Ilustruje to poni szy przyk ad

LCD_trans buf=malloc_re(sizeof(LCD_trans) + 7)

Zmienna buf wskazuje na obszar pami ci ktoacutery mo e pomie ci a cuch 5-znakowyTyle wystarczy na potrzeby tego przyk adu mdash na LCD b d wy wietlane kolejneliczby w zakresie 0 ndash 65 535 najd u sza ma 5 znakoacutew st d te nasz bufor ma tak a nieinn d ugo

while(1) utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(60 bufstr buf false) while(LCD_IsTransCompleted(buf))

Do konwersji liczby na a cuch u yto funkcji bibliotecznej utoa (nag oacutewek stdlibh)Poniewa d ugo a cucha po konwersji jest zmienna (co spowodowa oby pozosta-wianie na LCD bdquoduchoacutewrdquo po poprzednich konwersjach) w kolejnej linii brakuj ceznaki uzupe niono spacjami Nast pnie tworzona jest transakcja w obszarze pami ciprzydzielonym zmiennej buf Ostatnia p tla while jest odpowiedzialna za oczekiwa-nie na zako czenie realizacji transakcji Po jej zako czeniu p tla jest wykonywana odpocz tku

Uwa ny czytelnik z pewno ci zauwa y e pami przydzielana funkcj malloc_renie jest nigdzie zwalniana mdash w normalnej sytuacji spowodowa oby to wyciek pami -ci W naszym przyk adzie jednak program nigdy si nie ko czy nie ma wi c potrzebyzwalniania pami ci wskazywanej przez zmienn buf

Powy szy przyk ad pokazuje jak unikn blokowania CPU na czas dost pu do wolnodzia aj cego urz dzenia jakim jest LCD alfanumeryczny Jednak to nie wszystkiezalety wynikaj ce z zastosowania transakcji Drug wa n zalet naszego rozwi zaniailustruje przyk ad znajduj cy si w katalogu PrzykladyLCD-alfaLCD-transact-intPowa nym ograniczeniem funkcji odpowiedzialnych za dost p do LCD w sposoacutebklasyczny by a niemo no ich wywo ywania z funkcji obs ugi przerwa mdash funkcjeobs ugi LCD nie by y reentrant2 Nasz system oparty na transakcjach nie ma tychwad Aby to zilustrowa zosta stworzony prosty przyk ad mdash tak jak poprzedniow p tli g oacutewnej programu s wy wietlane stale kolejne liczby ale jednocze nie wyko-

2 Poza tym blokowa y CPU na d ugi czas a jak pami tamy funkcje obs ugi przerwa powinny by

wykonywane mo liwie kroacutetko

Kup książkę Poleć książkę

68 AVR Uk ady peryferyjne

rzystano drugi timer (TCD1) w ktoacuterego funkcji obs ugi przerwania przepe nienia jestwy wietlany licznik tych przerwa

ISR(TCD1_OVF_vect) static char int_buf[sizeof(LCD_trans) + 7] static uint16_t cnt char bufstr[6]

utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(61 bufstr (LCD_trans)ampint_buf false)

Jak widzimy w sposoacuteb asynchroniczny z dwoacutech miejsc w programie mo emy uzy-ska dost p do LCD a ka da funkcja bdquoma wra enierdquo e ma LCD na wy czno Przy okazji warto przeanalizowa sposoacuteb w jaki jest rezerwowana pami na trans-akcj w przerwaniu Oczywi cie mo na by wykorzysta dynamiczn alokacj pami cilecz jak wspomniano taka alokacja jest czasoch onna St d te w pokazanym przy-k adzie wykorzystano tablic statyczn int_buf o rozmiarze umo liwiaj cym prze-chowanie kompletnej transakcji Dzi ki temu e zmienna int_buf jest zmienn statycz-n nie jest ona niszczona po zako czeniu funkcji obs ugi przerwania Gdyby pomins owo kluczowe static zmienna ta by aby niszczona a na LCD najprawdopodobniejzacz yby si pojawia przypadkowe tre ci Poniewa pami naszego bufora nie by aalokowana dynamicznie nie mo e ona zosta zwolniona w naszym sterowniku LCDst d te ostatni parametr wywo ania funkcji LCD_PutText_B musi mie warto false

OptymalizacjaPrzy okazji tego i poprzedniego przyk adu warto zastanowi si jeszcze nad jednkwesti mdash optymalizacji W podanych przyk adach wykorzystano wcze niej omoacute-wione funkcje dost pu do wy wietlacza LCD znajduj ce si w plikach hd44780ci hd44780h Wi kszo z zawartych tam funkcji nie jest wykorzystywana jednakkompilator mimo wszystko umieszcza ich kod w pliku wynikowym mdash dzieje si takponiewa nie mo e on bdquostwierdzi rdquo czy funkcje te nie s wykorzystywane w innychfragmentach programu Pami tajmy e kompilator kompiluje poszczegoacutelne pliki roacute-d owe osobno i dana jego instancja nie bdquowierdquo co znajduje si w innych plikach (innychjednostkach kompilacji) Tak ca o ciow wiedz ma dopiero konsolidator (linker)ktoacutery czy stworzone przez kompilator pliki obiektowe (o rozszerzeniu o) w plikwynikowy Linker jednak bdquonie wierdquo ktoacutera z funkcji programu zosta a u yta a ktoacuteranie mdash informacje te ma wy cznie kompilator W ten sposoacuteb powstaje typowe b dneko o w efekcie nasze nieu ywane funkcje nie s usuwane (linker zostawia je bdquonawszelki wypadekrdquo) i zajmuj niepotrzebnie pami Czy mo na temu jako zaradzi Oczywi cie tak W tym celu trzeba po czy si y kompilatora i linkera co zapewniaj od-powiednie opcje kompilacji We w a ciwo ciach projektu (ProjectProperties lub Alt+F7)wybieramy zak adk Toolchain a nast pnie AVRGNU C Compiler i OptimizationZnajdziemy tam pole wyboru o nazwie Prepare functions for garbage collection (ry-sunek 224)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 69

Rysunek 224 Aby da linkerowi mo liwo usuwania nieu ywanych funkcji nale y skompilowaprogram z wybran opcj ndashffunction-sections ktoacutera spowoduje e ka da funkcja programu znajdzie siwe w asnej sekcji

Zaznaczenie tej funkcji spowoduje umieszczenie ka dej funkcji w osobnej sekcji mdashsamo w sobie nie wp ynie to na skroacutecenie kodu wynikowego ale jest warunkiem nie-zb dnym dla podj cia stosownych dzia a przez linker Aby wyeliminowa nieu y-wane funkcje nale y zaznaczy jeszcze w ga zi AVRGNU LinkerOptimization poleGarbage collect unused sections (rysunek 225)

Rysunek 225 Zaznaczenie opcji Garbage collect unused sections (-Wl--gc-sections) spowodujee nieu ywane funkcje zostan usuni te z kodu wynikowego w efekcie kod programu ulegnie skroacuteceniu

Po zaznaczeniu tych opcji program zostanie skroacutecony o kilkaset bajtoacutew Oczywi cieje li wszystkie funkcje by yby wykorzystane nie uzyskaliby my adnego skroacuteceniakodu Niemniej w sytuacji gdy u ywa si bibliotek zazwyczaj przynajmniej czfunkcji nie jest wykorzystywana warto wi c skorzysta z tej mo liwo ci optymalizacji

Kup książkę Poleć książkę

70 AVR Uk ady peryferyjne

Je li mamy do czynienia z prekompilowan bibliotek (lib) to musi ona by skom-pilowana z zaznaczon opcj Prepare functions for garbage collection (-ffunction-sections) Alternatyw jest umieszczenie ka dej funkcji biblioteki w osobnym pliku(tak jak w przypadku bibliotek AVR-libc)

Na ekranie wyboru opcji optymalizacji linkera mamy jeszcze jedn przydatn opcjmdash Relax Branches (-mrelax) Dla mikrokontroleroacutew ktoacutere maj ponad 8 kB pami ciFLASH instrukcje skokoacutew s generowane jako tzw instrukcje d ugie mdash umo liwiajone skok do komoacuterki pami ci FLASH o dowolnym adresie Jednak cen za to jestwyd u enie instrukcji mdash ich kod jest d u szy podobnie jak czas wykonania Nie zawszejednak takie d ugie instrukcje musz by wykonywane mdash je li miejsce docelowe skokule y blisko (w zasi gu instrukcji skokoacutew wzgl dnych) to mo na w kodzie wynikowymzamieni instrukcje d u sze na kroacutetsze co przynosi oszcz dno ci w postaci skroacuteceniakodu wynikowego Poniewa dopiero linker bdquowierdquo jak poszczegoacutelne fragmenty kodus rozmieszczone w pami ci takiej podmiany mo na dokona na etapie linkowaniaprogramu co zapewnia powy sza opcja St d te warto to pole wyboru zaznaczy

Kup książkę Poleć książkę

SkorowidzA

ABI Application Binary Interface 25AC Address Counter 50ADPCM 482adres

bazowy 377bufora 61komoacuterki 84pu apki 202

ALE Address Latch Enable 368alfanumeryczne wy wietlacze 43algorytm ADPCM 492algorytmy stratne 495animacje 57antyaliasing 325architektury procesoroacutew XMEGA 352asembler 23

dyrektywy 40funkcje j zyka C 41obs uga przerwa 39

asynchroniczne wywo anie funkcji 101Atmel Studio 15

Bbajty kalibracyjne 569biblioteka

FATFS 131 139 176 180 517libcallback-liba 99PetitFS 144 149

bitADC_CH0START_bm 236IMPMODE 244

bitrate 442 512blokowanie przerwa 219b d 16 19

kwantyzacji 463offsetu 230wzmocnienia ADC 230

BOD 223bps bits per second 12

budowakarty 152linii obrazu 394pami ci SDRAM 374pliku stymulacji 192ramki PAL 412sygna u PAL 411wtyczki 544 545

bufor 78FIFO 497na transakcje 61transakcji 62

buforowanie wyj cia 294

CCAS Column Address Strobe 375CCFL 44charakterystyka

przetwornikoacutew 222termistora 264tryboacutew pracy 232

CID Card Identification 169CKE Clock Enable 375CLKIN 421COG Chip on Glass 310CRC 158 178CRC16 178CRC7 164CS Chip Select 361 375CSD Card Specific Data 172czas

dost pu do SDRAM 424adowania kondensatora 244

propagacji 281proacutebkowania 260symulacji 209

czcionki 322cz stotliwo

odchylania pionowego 428proacutebkowania 244 441 444 530przebiegu 504

Kup książkę Poleć książkę

576 AVR Uk ady peryferyjne

cz stotliwoPWM 465taktowania koprocesora 549taktowania procesora 209taktowania rdzenia 18

czyszczenie pami ci 318

DDAC Digital to Analog Converter 293 447 451

buforowanie wyj cia 294generowanie przebiegoacutew 301jitter 303kalibracja 306napi cie referencyjne 295system zdarze 297taktowanie 296tryb dwukana owy 301wykorzystanie DMA 298wyzwalanie konwersji 305

datalogger 261 265 275DD Device Density 86debuger 183

programowy 190sprz towy 185 187

decymacja 259DEBUG 219XMEGA 260

definicja symboli globalnych 36definiowanie w asnych znakoacutew 56deklaracja zapowiadaj ca 103 337dekoder DTMF 548 556DMA 254 298 402 458 518 523dost p do

danych 358 359 568danych binarnych 356 360danych wielobajtowych 31DataFLASH 137EEPROM 128FAT 136komoacuterki 375LCD 59 62 66 68operandu 30pami ci 81 384 386 387 561pami ci SDRAM 424pliku blokowy 141portoacutew IO 30rejestroacutew IO procesora 36rejestroacutew uk adu 499SPI 95sygnatury u ytkownika 565 567wska nikoacutew 32

DQM Data Mask 375DSP Digital Signal Processor 535

DTMF 535 553dyktafon 529dynamiczna alokacja pami ci 516dyrektywa global 38dyrektywy asemblera 40dzia anie

DMA 255komparatora 280timeroacutew 400

d wi k 443

EEBI External Bus Interface 361EEPROM 207eliminacja jitteru 24emulacja RS232 139

FFAT File Allocation Table 128 131FAT32 128FATFS 180filtr

dolnoprzepustowy 491drugiego rz du 470pierwszego rz du 469trzeciego rz du 471

filtrowanie sygna u PWM 468firmware 565FLASH 207format

odpowiedzi 159polecenia 158protoko u 157

funkcja_delay_ms 17 219c_zero 42callback 106 341callback() 99DataFLASH_CSEnable 100DF_FinishBufWrite() 269disk_initialize 136disk_ioctl 181disk_status 136disk_write 138DMA_SPI_init 104DTMF_GetCode 553free_re 65GPIOR0_init 507hd44780_outcmd 51hd44780_outnibble_nowait 65LCD_defchar_P 57

Kup książkę Poleć książkę

Skorowidz 577

Menu_Click_Func 515Menu_Free 516Menu_Recorder 532Menu_Run 527MS_CreateRegEntry 117MS_GetDirPos 125MS_GetRegItem 115MS_WritePages 116 118OSC_wait_for_rdy 473RecMenu_StartStop 532sprintf 142strtok 124sysclk_init() 200 209TMF_memcpy_PF 454udi_cdc_getc() 123udi_cdc_is_rx_ready() 123VS1003_Reset 506

funkcjeanalizuj ce 556biblioteczne 50biblioteki FATFS 143j zyka C 41kontrolera ST7565R 313opoacute niaj ce 17opoacute nie 219reentrant 524specjalne kontrolera 319steruj ce 314zapisu 133

fusebit 557BODACT 560BODLEVEL 560BOOTRST 559DVSDON 560EESAVE 561JTAGEN 558RSTDISBL 559SUT 559TOSCSEL 559

fusebity w AVR-libc 571

Ggenerator obrazu composite 426generowanie

d wi ku 461kolorowego obrazu 437obrazu wideo 391przebiegoacutew 301przerwa 285sygna u composite 409

g bia koloru 326gniazdo

karty SD 156VGA 396

Hhistereza 281

IIDE 11IMA ADPCM 483informacje

o kolorze 431o obrazie 434

inicjalizacjakarty 161karty SDHC 167karty SDSC 167karty SDXC 167licznika 419pami ci 119USART 505

instrukcjaicall 42movw 35nop 13 24

interfejsSCI 498SDI 498SPI 71 79RS232 120UART 123USART 71 73

interpolacja 259interpolacja w XMEGA 260inwersja obrazu 319

Jjednostki 12jitter 24 303 420

Kkalibracja

ADC 229DAC 306 564offsetu 237

kana DMA 82 522karta 154 158

mikroSD 152SD 151 152SDHC 151 152 160SDSC 160SDXC 151 160

Kup książkę Poleć książkę

578 AVR Uk ady peryferyjne

karty pami ci 151 152 157biblioteka FATFS 180budowa 152format polecenia 158inicjalizacja 161 167komunikacja 156odczyt danych 173opcje konfiguracyjne 181rejestry specjalne 169tryby pracy 153zapis danych 176zasilanie 154

kodasemblerowy 23 24C 23dost pu 24

kodowanieμ-law 481ADPCM 483Dialogic ADPCM 494informacji 166 426koloru 425znakoacutew 536

kodyformatoacutew audio 501zdarze 545

kolejno bajtoacutew 533kolor 424 430kolorowy obraz 437komparator 422

analogowy 279 280analogowy XMEGA 282okienkowy 284

kompilacja plikoacutew binarnych 350kompilator avr-gcc 11 359kompresja

ADPCM 482 486d wi ku 480IMA ADPCM 482

komunikacja z koprocesorem 504konfiguracja

4-portowa 364biblioteki 133debugera 185DMA 459 522fusebitoacutew 570kontrolera DMA 257 452komparatoroacutew 285lockbitoacutew 570LPC 371pami ci SDRAM 381PetitFS 149pinu IO 225portoacutew IO 362

preskalera 452projektu 186przerwa 219pu apki 203rejestru EVCTRL 248rejestru PER 67SPI 75sygna u CS 377typu czcionki 324urz dze IO 189USART 76zegara 383

konsolidacja 547kontroler

DMA 254 298 402 458 518 523KS108 310ST7565R 310ndash315 321

konwersjaDAC 305sygna oacutew 396wyzwalana 306

konwertercyfrowo-analogowy 426DAC 427

koprocesormp3 496VS1003B 10

korekcja fazy 466kwantyzacja 463

Llampa CCFL 44LE Latch Enable 433licznik 419

cykli 209TCC1 400timera 20

linie IO 50linie sygna owe

MISO 72 164MOSI 72SCK 72SS 72

linker 69lista

mnemonikoacutew 24modyfikowanych rejestroacutew 32

lockbity 557 561lockbity w AVR-libc 570LPC Low Pin Count 371LPCM 443 556LSB Least Significant Bit 228

Kup książkę Poleć książkę

Skorowidz 579

a cuchy formatuj ce 212czenie plikoacutew 352

Mmagistrala pami ci zewn trznej 361magnetofon cyfrowy 528makro _SFR_IO_ADDR() 39makrodefinicja

ASSERT 214HD44780_CGADDR() 53HD44780_CLR 53HD44780_DDADDR() 53HD44780_DISPCTL() 52HD44780_ENTMODE() 52HD44780_FNSET() 52HD44780_HOME 53HD44780_SHIFT() 51LOCKBITS 571

mapowanie sygna oacutew 366mapy bitowe 343marker czasowy 268maski bitowe 329matryce 49menu 335menu piktogramowe 342mierniki temperatury 262mikrokontroler

ARM 9AVR 9PIC 9XMEGA128A3U 10

MISO 72moc wydzielana 265model psychoakustyczny 495modu

alfanumeryczny 45NVM 568Xmega eXploreGO 10Xplained ATXMEGA A3BU 10Xplained ATXMEGA-A1 10Xplained XMEGA128A1 447Xplained XMEGA256A3 94Xplained XMEGA256A3BU 97 143 266

modyfikator 30const 85volatile 28 273

monitory CRT 395monochromatyczne wy wietlacze graficzne 309monochromatyczny

tryb graficzny 416tryb tekstowy 413

MOSI 72mp3 495Msps Megasamples per second 12multiplekser wej ciowy 226 283multipleksowanie adresoacutew 368 369muzyka 439

Nnadawanie kodoacutew DTMF 540nadproacutebkowanie 258nag oacutewek kontenera wav 500nagrywanie mowy 486najmniej znacz cy bit 228napi cie

offsetu 280referencyjne 223 295zasilania 239

Oobracanie obrazu 319obraz 319

composite 426kolorowy 430wideo 391

obroacutebka d wi ku 443 445obs uga

FAT 131 143klawiatury matrycowej 24LCD 58 63 67menu 337przerwania 37 38 458przerwania DMA 525przerwa w asemblerze 39przyciskoacutew 272wy wietlaczy alfanumerycznych 45

odczytblokowy 140danych 173 358

odpowied response 159R1 159R2 159R7 160

od wie anie pami ci 376odtwarzanie

d wi ku 472muzyki 447 513 518 521

offset 238offset ADC 230okno

Breakpoints 202Call stack 209dezasemblera 210

Kup książkę Poleć książkę

580 AVR Uk ady peryferyjne

oknoIO View 207podgl du zmiennych 211wyboru czcionek 324

OLED 46opcje

kompilatora 35zapisu d wi ku 445

operacjena buforach 91odczytu 173zapisu 176zapisu strony 92

operand 29operator

ascii 41

asciz 41

byte 41

section 41opoacute nienia 13 18opoacute nienie zmienne 16optymalizacja 16 68optymalizator 26organizacja pami ci 77organizacja pami ci VRAM 316oscylator 287OSD On-Screen Display 417ostrze enie 16oszcz dzanie energii 94

Ppakiet WinAVR 48pami

CGRAM 56 57 64DataFLASH 10 77 81 113 269DDRAM 49EEPROM 111FLASH 54 124 207RAM 49SDRAM 372SRAM 63 124 329 366 371VRAM 314 317

PCLK 421PCM 443PetitFS 144 149p tla

for 13while 201

pierwsza linia obrazu 321piksel 430piktogram 342pin IO 225

plikAlloc_safeh 65DataFLASHc 83DataFLASHIOc 136definesh 50delayh 14diskioh 132 136ffh 132ffconfh 132 181hd44780h 49integerh 132ioh 30LCD_transc 61LCD-transactc 66Makefile 14Menuc 19nothingo 541outfiletxt 547 551pffh 149SPIh 104stringh 113stymulacji 191 192

pliki mp3 495elf 351fon 323o 24S 24 34binarne 350 355csv 276d wi kowe 440obiektowe 352wav 500WMA 512z czcionkami 327z danymi 349

podbijacz napi cia 315podgl d

pami ci 207stosu wywo a 209zmiennych 211znakoacutew 325

pod czeniefototranzystora 262karty SD 155LCD z kontrolerem 311modu u 50pami ci 362 369 370 373termistora 262uk adu LM35 251wyj XMEGA 398

pod wietlenieCCFL 46OLED 46

Kup książkę Poleć książkę

Skorowidz 581

podwoacutejne buforowanie 255 332 457polecenia

kasowania strony 81konfiguracyjne pami ci 82kontrolera ST7565R 315odczytu bufora 82 89odczytu pami ci 81 88SDRAM 376transferu 91

polecenieACMD41 168cd 181CID 178CMD0 165CMD8 167CSD 178date 276dir 127 181dump 276erase 276get 276HD44780_CLR 51Init 178mkdir 181

po czenieDMA ze SPI 96dwoacutech komparatoroacutew 285koprocesora mp3 497LCD z mikrokontrolerem 48wyj cia XMEGA 411XMEGA z PC 121z telewizorem 431

pomiarnapi cia zasilania 239temperatury MCU 241

port IO 30 362pozycjonowanie grafik 345poacute obraz 410precyzja pomiaroacutew 260preskaler 478preskaler ADC 243program

Atmel Data Visualizer 275Audacity 443avr-objcopy 350dataloggera 265LCD Image Converter 323makeloadingtableexe 543Realterm 127 554riffstrip 483SoX 445Tracepoint 208

programowanie sygnatury u ytkownika 566protokoacute master-slave 157

prototypy 136proacutebki d wi kowe 447proacutebkowanie

8-bitowe 300nieliniowe 480

prymitywy graficzne 330przebieg PWM 468przebiegi 289 303przechwytywanie danych 276przemiatanie wej 253przerwanie 218 254 286 403

DMA 522komparatora 286

przestrze adresowa procesora 378przesy anie

danych 498polece 498

przetaktowanie procesora 436przetwornik

ADC 221analogowo-cyfrowy 221cykliczny 222potokowy 222

przyciski 272pseudooperatory 41pu apki breakpoints 197pu apki warunkowe 205punkty ledzenia 203PWM 461 462 472

RRAS Row Address Strobe 375redukcja poboru energii 242regulacja kontrastu 321rejestr 32 34rejestr AC 50

adresu wtyczki 513BASEADDR 377CID 169CMP 251CSD 172czasu utworu 512DATA 83EVCTRL 248formatu audio 512identyfikacyjny pami ci 87INTFLAGS 252kontroli basoacutew 510kontroli g o no ci 513MUXCTRL 227OCR 168PER 67poroacutewnania 249

Kup książkę Poleć książkę

582 AVR Uk ady peryferyjne

rejestr ACSCI_CLOCKF 511stanu komparatora 287stanu pami ci 86stanu uk adu 510trybu pracy 508WINCTRL 285

rejestrydost pu do pami ci RAM 513GPIOR 502IO procesora 36mikrokontrolera 25procesora 35specjalne 94specjalne karty 169uk adu VS1003B 508

relacja rodzic ndash dziecko 336reset uk adu 534rozdzielczo

LCD 329przetwornika 231PWM 463 477

rozszerzenie HiRes 477 479roacutewnanie Steinharta-Harta 263rysowanie map bitowych 343

Sschemat uk adu dataloggera 267SCI Serial Command Interface 498SCK 72SD Secure Digital 152SDI Serial Data Interface 498separator synchronizacji 422separowanie impulsoacutew synchronizacji 422shieldy 10skaler 422skaler napi cia 283skrypt makefile 353s owo kluczowe

asm 27extern 37static 68

specyfikatory lokalizacji zmiennej 213sps samples per second 12SS Slave Select 72standard PAL 410standard VGA 393sterowanie

dataloggerem 275sygna em 379

sterownik 121HD44780 49 56LCD 49 62

stos wywo a 209

strukturaFATFS 139Handle 118LCD_trans 60 63menu 338rejestru 86SimpleFSEntry 113 116SimpleFSHandle 113 118 140submenu 527systemu plikoacutew 112

sumabitowa 571kontrolna 178

sygnacomposite 409composite video output 430CS 377DREQ 497H-Sync 396synchronizacji 423V-Sync 396zegarowy CLK 374

sygna yinterfejsu EBI 363magistrali EBI 364steruj ce 375

sygnaturaprodukcyjna procesora 563u ytkownika 565

symbol__DELAY_ROUND_CLOSEST__ 17__DELAY_ROUND_DOWN__ 17_FS_FAT12 149_FS_FAT32 149_FS_MINIMIZE 133_FS_READONLY 133_FS_RPATH 135_FS_TINY 133_MAX_SS 135_MULTI_PARTITION 135_USE_DIR 149_USE_FASTSEEK 134_USE_FORWARD 134_USE_LABEL 134_USE_LFN 134_USE_LSEEK 149_USE_MKFS 134_USE_READ 149_USE_STRFUNC 134_USE_WRITE 149_VOLUMES 136F_CPU 14 15 18increment 36USE_BUSY_FLAG 50

Kup książkę Poleć książkę

Skorowidz 583

symboleglobalne 36w asemblerze 28zewn trzne 39

symulacja 198 209symulator 190synchronizacja

pami ci 331pionowa 395pozioma 394

systemplikoacutew 111 128przerwa 404zdarze 245

szablonfont_XMEGAtmpl 326image_XMEGAtmpl 343

szum 463szybko przesy ania danych 126

ledzenie wi zki 333rodowisko

graficzne 11programistyczne 11VSIDE 542WinAVR 47

Ttabela FAT 130tablica

framebuf 402 408plugintbl 552 555tekst 208z kodem wynikowym 543

taktowanieDAC 296mikrokontrolera 473

technologia OLED 44temperatura mikrokontrolera 239 241termistor 262 290

NTC 263PTC 263

termometrLM35 249 250z alarmem 251

termostat 290test uk adu VS1003B 503testowanie obrazu 319timer 16 62

TCC0 20

TCC1 399transakcja 59 62 65transakcje 17 103ndash107transakcyjna obs uga LCD 58transakcyjny dost p do SPI 95transfer 91

danych 97wynikoacutew 254

transmisja 72 83tryb

bez znaku 234ci g ej konwersji 252czterobitowy 153dwukana owy 301graficzny 416graficzny VGA 407idle 419jednobitowy 153LPC 371monochromatyczny 397 407oszcz dzania energii 94 306pracy multipleksera 226pracy SPI 157roacute nicowy 232single slope 312SPI 153tekstowy 413tekstowy VGA 397z pojedynczym wej ciem 234ze znakiem 235

trybygenerowania PWM 467pracy karty 153pracy przetwornika 231pracy SPI 74pracy uk adu 508

twierdzenie Nyquista 258tworzenie

adresu 84nak adek 417obrazu 335tablicy 543

typ__uint24 119karty 160niekompletny 60wyliczeniowy 114

typyoperandoacutew 29w AVR 34

Kup książkę Poleć książkę

584 AVR Uk ady peryferyjne

Uuchwyt handle 64 113uk ad

AD725 427 431buforowy 294CS 361DAC 284dataloggera 267detekcji awarii zasilania 559generuj cy obraz 393HiRes 477ICL7660 47LM35 250 251SampH 293sterowania sygna em 379USART 401VS1003B 496 503 508 530 538 556VS100XX 529wzmacniania sygna u 227

uk ady peryferyjne 9uruchomienie komparatora 287urz dzenie

master 72slave 72

u rednianie 259utrata danych 141u ycie wstawki asemblerowej 33

VVGA 393

Wwarto ci kalibracyjne

ADC 564oscylatoroacutew 564temperatury 564

warunkowa kompilacja 36WE Write Enable 375wej cie composite video input 425wektor przerwa 38 257wideo 391wielko pami ci 86 377w czenie DAC 299wska nik na struktur 27wska niki 32wstawki asemblerowe 24 33wtyczka 535 541 544

SineDTMF Generator 537VGA 396

wyboacuter cz stotliwo ci PWM 465 474wykorzystanie

DMA 254 518

EuroSCART 428PWM 461rejestroacutew 34

wyliczanie predyktora 489wy wietlacze

alfanumeryczne 43 45graficzne 43 309LCD 43OLED 46

wy wietlanielitera u 213map bitowych 344obrazu 333 346 406obrazu VGA 393

wywo ania zwrotne callbacks 98asynchroniczne 101synchroniczne 101

wyzwalanie konwersji 245wzmacniacz 446wzmacniacz operacyjny 279wzmacnianie sygna u 227

XXMEGA 9 18

Zzapis

bufora 269danych 176d wi ku 440 556

zasilaniekarty 154pami ci 109

zatrzask 368zatrzask 74HC573 433zatrza ni cie adresu 369zdarzenia 297zdarzenie compare match 399zegar 383 420 426zintegrowane rodowisko programistyczne 11z cze EuroSCART 425 428 429zmiana

g o no ci 527wielko ci strony 94

znaki 56

roacuted onapi cia odniesienia 284sygna u 240

Kup książkę Poleć książkę

Page 4: Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8 AVR. Ukäady peryferyjne Rejestry dost pu do pami ci RAM .....513 Rejestr adresu

Spis tre ci 5

Okno podgl du zmiennych 211a cuchy formatuj ce 212

Makrodefinicja ASSERT 214Przerwania w trakcie debugowania 218_delay_xx i symulator 219

Rozdzia 27 Przetwornik analogowo-cyfrowy 221Przetwornik potokowy vs cykliczny 222Napi cie referencyjne 223Konfiguracja pinu IO 225Multiplekser wej ciowy 226Uk ad wzmacniania sygna u 227Co to jest LSB 228Kalibracja ADC 229Pomiar 231

Rozdzielczo przetwornika 231Tryby pracy przetwornika 231Wynik pomiaru 236Kalibracja offsetu 237Pomiar napi cia zasilania i temperatury mikrokontrolera 239

Redukcja poboru energii 242Preskaler ADC 243Wyzwalanie konwersji z wykorzystaniem systemu zdarze 245

Rejestr EVCTRL w XMEGA z ADC bez potoku 248Rejestr poroacutewnania 249

Termometr LM35 250Budujemy termometr z alarmem 251

Tryb ci g ej konwersji 252Przemiatanie wej 253Przerwania 254Wykorzystanie DMA do transferu wynikoacutew 254Nadproacutebkowanie 258

U rednianie 259Decymacja i interpolacja 259Interpolacja i decymacja w XMEGA 260

Jak zwi kszy precyzj pomiaroacutew 260Budujemy datalogger 261

Termistory jako mierniki temperatury 262Program dataloggera 265

Rozdzia 28 Komparator analogowy 279Komparator mdash troch teorii 279

Czas propagacji 281Histereza 281

Komparatory analogowe XMEGA 282Multipleksery wej cia 283Komparator okienkowy 284Przerwania 286Uruchomienie komparatora 287Rejestr stanu komparatora 287

Komparator jako oscylator 287Termostat z wykorzystaniem komparatoroacutew 290

Termistory 290

Kup książkę Poleć książkę

6 AVR Uk ady peryferyjne

Rozdzia 29 DAC 293Buforowanie wyj cia 294Napi cie referencyjne 295Taktowanie 296Zdarzenia 297Wykorzystanie DMA 298

Proacutebkowanie 8-bitowe 300Tryb dwukana owy 301Generowanie jednocze nie dwoacutech przebiegoacutew 301Wersja oszcz dna 304Inne sposoby wyzwalania konwersji 305

Tryb oszcz dzania energii 306Kalibracja DAC 306

Rozdzia 30 Monochromatyczne wy wietlacze graficzne 309Pod czenie LCD do mikrokontrolera 311Budowa i funkcje kontrolera ST7565R 313Funkcje specjalne kontrolera 319

Inwersja i testowanie obrazu 319Obracanie obrazu 319Regulacja kontrastu 321Numer pierwszej wy wietlanej linii 321

Czcionki 322Ma a optymalizacja 330Podwoacutejne buforowanie 332

Adres pocz tku wy wietlania obrazu 333Menu 335

Menu oparte na piktogramach 342

Rozdzia 31 Pliki z danymi mdash jak je dodawa do projektu 349Kompilacja plikoacutew binarnych 350

czenie plikoacutew obiektowych z projektem 352Dost p do danych binarnych 356

Klasyczny sposoacuteb dost pu do danych 358Dost p do danych z wykorzystaniem przestrzeni adresowych 359

Rozdzia 32 Magistrala pami ci zewn trznej 361Pod czenie pami ci 362

Konfiguracja portoacutew IO 362Przyporz dkowanie sygna oacutew interfejsu EBI do portoacutew IO 363Konfiguracja 4-portowa 364Pami SRAM 366Pami SRAM w trybie LPC 371Pami SDRAM 372

Konfiguracja sygna u CS 377Okre lenie adresu bazowego i wielko ci pami ci 377Uk ad sterowania sygna em wyboru w trybie SRAM 379Uk ad sterowania sygna em wyboru w trybie SDRAM 379

Przyk adowa konfiguracja pami ci SDRAM 381Konfiguracja zegara 383Dost p do pami ci z poziomu j zyka C 384

Dost p do pami ci poni ej granicy 64 kB 384Dost p do pami ci powy ej granicy 64 kB 386

Kup książkę Poleć książkę

Spis tre ci 7

Rozdzia 33 Generowanie obrazu wideo 391Generowanie obrazu wideo w standardzie VGA 393

Wtyczka VGA i konwersja sygna oacutew 396Monochromatyczny tryb tekstowy VGA 397Monochromatyczny tryb graficzny VGA 407

Generowanie sygna u composite 409Standard PAL 410Monochromatyczny tryb tekstowy 413Monochromatyczny tryb graficzny 416Tworzenie nak adek (OSD) 417

Czas na kolor 424Kodowanie koloru 425Konwerter cyfrowo-analogowy 426Generator obrazu composite 426Wykorzystanie EuroSCART 428Kolorowy obraz na TV 430

Rozdzia 34 Niech zagra muzyka 439Formaty plikoacutew d wi kowych 440

Cz stotliwo proacutebkowania 441Format pliku 442

Obroacutebka d wi ku 443Program Audacity 443Program SoX 445

Wzmacniacz 446Odtwarzamy muzyk z wykorzystaniem DAC 447

Inny sposoacuteb na podwoacutejne buforowanie 457Generowanie d wi ku z wykorzystaniem PWM 461

PWM mdash troch teorii 461Filtrowanie sygna u PWM 468Odtwarzamy d wi k za pomoc 8-bitowego PWM 472Rozszerzenie HiRes i PWM o wi kszej rozdzielczo ci 477

Kompresja d wi ku 480Proacutebkowanie nieliniowe 480Kompresja ADPCM 482Kompresja IMA ADPCM 482Nagrywanie mowy z wykorzystaniem kompresji ADPCM 486Algorytm ADPCM firmy Dialogic 492

Rozdzia 35 A mo e mp3 495Koprocesor mp3 496

Sposoby pod czenia do XMEGA 496Dost p do rejestroacutew uk adu 499Format pliku wav 500Rejestry GPIOR 502Testy uk adu 502Podstawowa komunikacja z koprocesorem 504Rejestry uk adu VS1003B 508

Rejestr trybu pracy 508Rejestr stanu uk adu 510Rejestr kontroli basoacutew 510Rejestr SCI_CLOCKF 511Rejestr czasu utworu 512Rejestr formatu audio 512

Kup książkę Poleć książkę

8 AVR Uk ady peryferyjne

Rejestry dost pu do pami ci RAM 513Rejestr adresu wtyczki 513Rejestr kontroli g o no ci 513

Odtwarzamy muzyk 513Odtwarzamy muzyk z wykorzystaniem DMA 518

Magnetofon cyfrowy 528VS100XX w roli magnetofonu 529

W asne wtyczki 535DTMF jako przyk ad w asnej wtyczki 535

Budujemy w asn wtyczk 541Tworzenie tablicy z kodem wynikowym 543Budowa wtyczki 544W asna aplikacja czyli dekoder DTMF 548

Rozdzia 36 Fusebity i lockbity 557Fusebity 558

Fusebit JTAGEN 558Fusebit RSTDISBL 559Fusebit BOOTRST 559Fusebity SUT 559Fusebit TOSCSEL 559Uk ad detekcji awarii zasilania 559Watchdog 560Fusebit EESAVE 561

Lockbity 561Sygnatura produkcyjna procesora 563

Numer serii 563Numer wafra 563Po o enie na wafrze 564Pozosta e bajty konfiguracyjne 564

Sygnatura u ytkownika 565Dost p do danych z poziomu aplikacji u ytkownika 568

Bajty kalibracyjne 569Konfiguracja fuse- i lockbitoacutew w AVR-libc 570

Lockbity w AVR-libc 570Fusebity w AVR-libc 571

Dodatek A Spis rozdzia oacutew ksi ki bdquoAVR Praktyczne projektyrdquo 573

Skorowidz 575

Kup książkę Poleć książkę

Rozdzia 22

Wy wietlacze LCDalfanumeryczne

Z tego rozdzia u dowiesz si

jak pod czy popularne wy wietlacze alfanumeryczne do XMEGA

jak stworzy bibliotek obs uguj c kontroler HD44780

jak przesy a polecenia dla LCD w formie transakcji i jak czy dost pdo kontrolera z aplikacji i funkcji obs ugi przerwa

Ze wzgl du na malej ce ceny zwi kszaj c si dost pno oraz niski poboacuter energiicoraz wi kszym zainteresowaniem ciesz si wy wietlacze LCD W tym rozdzialezostan omoacutewione wy wietlacze alfanumeryczne mdash ze uwagi na ich prostot s ci -gle najcz ciej stosowanymi typami wy wietlaczy W dalszej cz ci ksi ki zostanomoacutewione monochromatyczne wy wietlacze graficzne mdash daj one o wiele wi kszemo liwo ci ale ich sterowanie jest nieco bardziej skomplikowane Ze wzgl du na ko-nieczno przesy ania sporej liczby danych wymagaj tak e szybszego interfejsu -cz cego z mikrokontrolerem St d te zanim przejdziemy do ich praktycznego wyko-rzystania b dziemy musieli bli ej zapozna si z kilkoma uk adami peryferyjnymiXMEGA

Wy wietlacze LCD alfanumeryczne zawieraj zazwyczaj scalone kontrolery st d teprocesor nie steruje bezpo rednio matryc LCD ale komunikuje si z wyspecjalizo-wanym sterownikiem ktoacutery wykonuje jego polecenia Dlatego te wykorzystanie te-go typu wy wietlaczy wymaga znajomo ci typu u ytego w nich sterownika Wy wie-tlacze LCD mog by czone z mikrokontrolerem za pomoc roacute nych magistral mdashnajcz ciej s to magistrale SPI lub roacutewnoleg e (w wersji 4- 8- i 16-bitowej) Samewy wietlacze ze wzgl du na budow i mo liwo ci mo emy podzieli na dwie grupy

Wy wietlacze alfanumeryczne mdash umo liwiaj one wy wietlanie cyfr literi innych symboli Jednak w tym typie nie mamy mo liwo ci sterowaniaposzczegoacutelnymi pikselami

Wy wietlacze graficzne mdash w tym typie mo emy sterowa stanem ka dego piksela

Kup książkę Poleć książkę

44 AVR Uk ady peryferyjne

Aby wy wietlana na LCD zawarto by a widoczna niezb dne jest pod wietlenieKupuj c wy wietlacz musimy zwroacuteci uwag czy jest on wyposa ony w jakie pod-wietlenie (mo na dosta wy wietlacze LCD bez pod wietlenia) Oczywi cie lepiej

jest wybra wy wietlacz ktoacutery ma wbudowane pod wietlenie Samo pod wietleniemo e by wykonane w roacute ny sposoacuteb W starszych modelach spotyka si pod wietle-nie oparte na lampie CCFL (ang Cold Cathode Fluorescent Lamp) Tego typu wy-wietlacze s zwykle wi ksze ci sze ale przede wszystkim wymagaj specjalnej

przetwornicy do sterowania lamp Jej zadaniem jest generowanie wysokiego napi -cia niezb dnego do za wiecenia si lampy a nast pnie utrzymywanie go w granicachzapewniaj cych jej prawid owe dzia anie Wy wietlacze tego typu s wi c k opotliwew u ytkowaniu musimy wyda czasami sporo pieni dzy na odpowiedni przetworni-c a w dodatku trwa o takiej lampy jest kroacutetsza ni diod LED Wyst puj tak eproblemy ze sterowaniem jasno ci pod wietlenia W nowoczesnych wy wietlaczachLCD stosuje si praktycznie wy cznie pod wietlenie za pomoc diod LED Nie wy-magaj one adnych wyrafinowanych przetwornic do zasilania zwykle zadowalajsi napi ciem w granicach 3 ndash 12 V maj te znacznie wi ksz trwa o Jasno citakiego pod wietlenia z atwo ci mo na sterowa wykorzystuj c technik PWMPod wietlenie oparte na diodach LED mo e mie roacute ny kolor mdash bia y oacute ty zielonyniebieski czerwony Kolor mo emy sobie wi c dobra wg w asnych preferencji Naj-nowsze wy wietlacze alfanumeryczne s wykonywane w technologii OLED mdash w tejtechnologii wiec poszczegoacutelne piksele wi c taki wy wietlacz nie wymaga pod-wietlenia Niejako przy okazji zyskujemy znacznie lepsze czasy prze czania pikseli

mdash dla wy wietlaczy LCD szczegoacutelnie w ni szych temperaturach czas prze czaniawynosi kilkadziesi t do kilkuset milisekund co powoduje pojawienie si wyra nychbdquoduchoacutewrdquo i psuje estetyk Wy wietlacze OLED nie maj tej wady Jednak zazwyczajs dro sze

Je eli mo esz staraj si wybiera wy wietlacze LCD z pod wietleniem opartym nadiodach LED lub wykonane w technologii OLED

Kolejn istotn kwesti jest regulacja kontrastu Zwykle graficzne kolorowe LCD z wbu-dowanymi sterownikami automatycznie reguluj kontrast dodatkowo sterownik mazaimplementowane rejestry umo liwiaj ce wy cznie programow zmian kontrastuW przypadku prostszych sterownikoacutew wyst puj cych najcz ciej w wy wietlaczachmonochromatycznych (zaroacutewno alfanumerycznych jak i graficznych) kontrast re-guluje si podaj c odpowiednie napi cie na jeden z pinoacutew wy wietlacza Jest to nie-zwykle istotne gdy bez w a ciwego napi cia reguluj cego kontrast na wy wietlaczunic nie zobaczymy Mo emy w takiej sytuacji odnie b dne wra enie e wy wie-tlacz nie dzia a Z kolei je li kontrast b dzie zbyt du y wszystkie piksele b d w -czone co te mo e sugerowa b dne dzia anie LCD

Jedn z cz stszych przyczyn tego e po prawid owym pod czeniu wy wietlaczaLCD nic na nim nie wida albo wszystkie piksele s w czone jest nieprawid owenapi cie na pinie reguluj cym kontrast

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 45

Obs uga wy wietlaczyalfanumerycznych

Wy wietlacze alfanumeryczne s zbudowane z matryc pikseli zwykle o wielko ci5times8 pikseli pogrupowanych razem W tym typie wy wietlacza mo emy sterowazawarto ci tak utworzonej matrycy znakowej jednak nie ma mo liwo ci sterowaniaposzczegoacutelnymi pikselami Najcz ciej spotykane wy wietlacze tego rodzaju mogwy wietla 1times8 1times16 2times16 2times20 4times16 znakoacutew gdzie pierwszy wymiar okre laliczb wy wietlanych wierszy a drugi liczb znakoacutew w wierszu Poniewa nie steru-jemy poszczegoacutelnymi pikselami do kontrolera wysy amy tylko kod znaku ktoacutery mazosta wy wietlony na danej pozycji Kontroler na podstawie kodu znaku generujeadres do specjalnego obszaru pami ci tzw tablicy znakoacutew w ktoacuterej znajduje si bajtowareprezentacja poszczegoacutelnych pikseli tworz cych znak Dla matrycy 5times8 ma ona 40bitoacutew Tablica ta jest umieszczona w pami ci ROM kontrolera LCD nie mo emy jejwi c zmienia Zwykle jednak kontrolery udost pniaj mo liwo definicji kilku w a-snych znakoacutew dzi ki czemu mo emy zdefiniowa np znaki charakterystyczne dla j -zyka polskiego Takie podej cie do generowania obrazu ma podstawow zalet jakjest prostota i zwi zane z tym niewielkie zapotrzebowanie na pami RAM Do prze-chowania np zawarto ci 8-znakowego wy wietlacza LCD wystarczy zaledwie 8 bajtoacutewpami ci Ma to szczegoacutelne znaczenie w prostych mikrokontrolerach z niewielk ilo-ci pami ci RAM Najpopularniejszym kontrolerem stosowanym w wy wietlaczach

alfanumerycznych jest HD44780 nawet je li w posiadanym wy wietlaczu jest innykontroler to mamy du szans e jest on z nim kompatybilny Typowy rozk ad sy-gna oacutew modu oacutew opartych na tym kontrolerze pokazano w tabeli 221

Tabela 221 Typowy uk ad wyprowadze modu oacutew alfanumerycznych LCD opartych na kontrolerzeHD44780

Pin Nazwa Funkcja

1 GND Masa 2 Vcc Zasilanie (typowo 5 V) 3 Vee Regulacja kontrastu 4 RS Zapis polecenia 5 RW Strob odczytzapis 6 E Wyboacuter uk adu 7 D0 Bit danych 0 8 D1 Bit danych 1 9 D2 Bit danych 210 D3 Bit danych 311 D4 Bit danych 412 D5 Bit danych 513 D6 Bit danych 614 D7 Bit danych 715 A Pod wietlenie mdash anoda16 K Pod wietlenie mdash katoda

Kup książkę Poleć książkę

46 AVR Uk ady peryferyjne

Przed pod czeniem modu u zawsze upewnij si czy podany rozk ad odpowiadau ytemu modu owi W szczegoacutelno ci sprawd rozmieszczenie linii zasilaj cych Ichniew a ciwe pod czenie grozi uszkodzeniem modu u

Zwykle piny 15 i 16 steruj ce pod wietleniem s umieszczone osobno lub te przedpinem 1 St d te zawsze nale y je dok adnie zidentyfikowa przed pod czeniem mo-du u Do pinoacutew tych nale y pod czy napi cie wykorzystane do pod wietlenia modu uPrzy czone napi cie zale y od typu zastosowanego pod wietlenia mdash CCFL foliielektroluminescencyjnej lub diod LED W dalszej cz ci b dziemy zajmowa si modu-em z pod wietleniem LED W nocie katalogowej ka dego modu u znajduj si szcze-

goacute owe informacje dotycz ce zasilania pod wietlenia Zwykle w tym celu wymaganejest napi cie 5 V a nat enie pr du pod wietlenia wynosi 20 ndash 50 mA

Wy wietlacze LCD alfanumeryczne s dost pne w handlu w wersjach dostosowanychdo roacute nych napi zasilaj cych Typowo jest to napi cie 5 V co stwarza pewne pro-blemy przy pod czeniu takiego LCD do procesoroacutew rodziny XMEGA S one zasi-lane maksymalnym napi ciem 36 V nie ma wi c mo liwo ci aby LCD i procesordzia a y w tych samych domenach napi ciowych W efekcie przy po czeniu obu uk a-doacutew musimy zastosowa konwersj napi Poniewa LCD alfanumeryczny z perspek-tywy procesora jest urz dzeniem bardzo wolnym ca kowicie wystarczaj cym rozwi za-niem jest zastosowanie szeregowych rezystoroacutew ktoacutere wraz z wbudowanymi w procesordiodami zabezpieczaj cymi b d stanowi y uk ad obni aj cy napi cie na magistralikomunikacyjnej z 5 V do bezpiecznego dla wej cia XMEGA napi cia Z drugiej stronyjedynka logiczna generowana przez procesor zasilany napi ciem 33 V jest poprawnierozpoznawana przez LCD pracuj cy z napi ciem 5 V Je li procesor by by zasilanybardzo niskim napi ciem (rz du 18 ndash 28 V) wymagany by by bardziej skompliko-wany konwerter co zosta o szerzej omoacutewione w rozdziale 7 ksi ki AVR Praktyczneprojekty

Wy wietlacze LCD wymagaj pod wietlenia bez tego wy wietlana zawarto jestpraktycznie nieczytelna W starszych konstrukcjach wykorzystywano pod wietleniew oparciu o lampy fluorescencyjne lub folie elektroluminescencyjne jednak obecniedominuj cym typem jest pod wietlenie za pomoc diod LED

Poniewa zasilamy diod LED wymagane jest do czenie szeregowego rezystoraCzasami taki rezystor jest wbudowany w modu LCD

Pod wietlenie tego typu zu ywa spor ilo energii Innym rozwi zaniem jest kupnowy wietlacza wykonanego w technologii OLED (ang Organic Light-Emitting Diode)Wy wietlacze tego typu cechuj si zdecydowanie lepszym kontrastem ale tak e wi k-sz szybko ci prze czania w zwi zku z czym mo na za ich pomoc uzyska o wielelepsze efekty animacji ktoacutere s praktycznie nieosi galne dla klasycznych wy wietlaczyLCD Nie maj one tak e innej wady LCD mdash zale no ci szybko ci prze czania seg-mentoacutew od temperatury

Wy wietlacze OLED nie maj wyprowadzonych pinoacutew odpowiedzialnych za pod-wietlenie mdash po prostu go nie wymagaj

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 47

Kolejn istotn kwesti jest pod czenie w a ciwego napi cia reguluj cego kontrastwy wietlacza Dla wi kszo ci modu oacutew LCD mie ci si ono w przedziale GND ndash Vcca dla modu oacutew o rozszerzonym zakresie temperatury w przedziale od ndash7 do 0 V mdashrysunek 221

Rysunek 221Pod czenie napi ciareguluj cego kontrasta) modu y klasyczneb) modu y o rozszerzonymzakresie temperatur

Napi cie ujemne mo na uzyska z prostej pompy adunkowej sterowanej przebiegiemPWM z procesora Poboacuter pr du z tego wej cia jest znikomo ma y Alternatywniemo na u y uk adu ICL7660 ktoacutery mo e generowa napi cia ujemne

Kolejn decyzj jak musimy podj jest sposoacuteb pod czenia modu u LCD z mikro-kontrolerem Mamy do wyboru dwie opcje mdash albo pod czamy wszystkie 8 linii da-nych (D0 ndash D7) albo tylko 4 najstarsze (D4 ndash D7) Pod czaj c tylko 4 linie danychzmniejszamy liczb niezb dnych po cze modu u z mikrokontrolerem oraz liczbwykorzystanych linii IO Ze wzgl du na znikom ilo danych przesy anych zdo mo-du u wynikaj ce z pod czenia tylko 4 linii danych spowolnienie transmisji jest bezznaczenia W trybie 4-bitowym najpierw transferowana jest starsza a potem m od-sza tetrada Niewykorzystane linie D0 ndash D3 mo na pozostawi niepod czone wi k-szo modu oacutew wewn trznie podci ga niepod czone linie poprzez rezystor do Vcc

Poniewa linie D0 ndash D7 s dwukierunkowe musimy pami ta aby podczas operacjiodczytu z LCD odpowiednie piny mikrokontrolera by y ustawione jako wej cia W prze-ciwnym przypadku dojdzie do konfliktu

Kolejnym sygna em co do ktoacuterego musimy podj decyzj jest sygna RW okre laj cytyp operacji (odczytzapis) Poniewa zwykle zapisujemy dane do LCD w a ciwie niezachodzi konieczno ich odczytywania mo emy ten sygna na sta e po czy z mas oszcz dzaj c w ten sposoacuteb jedn lini IO procesora Takie rozwi zanie ma jednak po-wa n wad mdash po jego zastosowaniu nie jest mo liwe odczytywanie sygna u zaj to cimodu u (ang busy flag) Powoduje to e pomi dzy kolejnymi zapisami do modu u mu-simy stosowa opoacute nienia dobrane na najwolniejsz mo liw okoliczno W efekcieca a transmisja jest wolniejsza ni mog aby by

Je li korzystamy z tych modu oacutew nie musimy pisa w asnych procedur ich obs ugiInstaluj c rodowisko WinAVR (lub nowy toolchain firmy Atmel) w katalogu docavr-libcexamplessdtiodemo znajdziemy gotowe funkcje obs ugi HD44780 Funkcjete nie dzia aj z mikrokontrolerami XMEGA st d te w za czonych przyk adach zosta-y one zmodyfikowane tak aby poprawnie wspoacute pracowa roacutewnie z tymi mikro-kontrolerami

Kup książkę Poleć książkę

48 AVR Uk ady peryferyjne

Mo emy te skorzysta z licznych przyk adoacutew dost pnych w internecie W dalszejcz ci rozdzia u zostan wykorzystane funkcje z pakietu WinAVR napisane przezJoerga Wunscha Pokazane przyk ady zak adaj e wy wietlacz jest po czonyz mikrokontrolerem tak jak na rysunku 222

Rysunek 222 Po czenie LCD z mikrokontrolerem Na goacuterze pod czenie do mikrokontroleraXMEGA na dole pod czenie do modu u Xplained Na schematach pokazano tak e opcjonalne sposobypod czenia pinu Vee odpowiedzialnego za regulacj kontrastu LCD

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 49

Zanim co wy wietlimy na LCD musimy pozna w jaki sposoacuteb s generowane znakiSterownik LCD zawiera w sobie niezale nie od typu u ytej matrycy 80 bajtoacutew pami ciDDRAM (ang Display Data RAM) Je li zastosowana matryca wy wietla mniejszliczb znakoacutew to cz komoacuterek pami ci jest nieu ywana Mo emy je wykorzystado innych celoacutew mdash np jako zwyk pami RAM Mo emy te u y jej do przesu-wania napisoacutew ktoacutere nie mieszcz si na wy wietlaczu Aby mo na by o umie ciznak na w a ciwej pozycji niezb dne jest poznanie organizacji pami ci kontrolera W za-le no ci od u ytej matrycy pami ta jest zorganizowana nast puj co

Dla matryc 16times1 mdash pami jest podzielona na dwa obszary ka dy zawieraj cypo 8 znakoacutew Obszar pierwszy (od lewej) ma adresy 0x00 do 0x07 a obszar drugi(prawy) adresy 0x40 do 0x47 St d te gdy wy wietla si tekst przekraczaj cygranic obszaroacutew nale y zadba aby poszczegoacutelne litery trafi y pod w a ciweadresy

Dla matryc 20times1 mdash adresy 0x00 do 0x13

Dla matryc 16times2 mdash adres pierwszej linii zaczyna si od 0x00 do 0x0f adresdrugiej linii od 0x40 do 0x4f

Dla matryc 20times2 mdash adresy pierwszej linii to 0x00 do 0x13 a drugiej 0x40 do 0x53

Dla matryc 40times2 mdash adresy pierwszej linii to 0x00 do 0x27 drugiej linii 0x40do 0x67

Dla matryc 20times4 mdash adresy pierwszej linii to 0x00 do 0x13 drugiej 0x40 do 0x53trzeciej 0x14 do 0x27 a czwartej 0x54 do 0x67

Jak wida w niektoacuterych typach wy wietlaczy po ka dej linii zostaje od kilku do kil-kunastu bajtoacutew ktoacuterych zawarto nie jest wy wietlana Ma to pewn zalet mdash mo-emy do pami ci modu u wpisywa teksty d u sze ni s wy wietlane na ekranie co

u atwia przewijanie tekstu Niestety ma to te pewn wad mdash funkcje wy wietlaj ceco na ekranie musz bdquowiedzie rdquo jak organizacj ma matryca W przeciwnym przy-padku nie ma mo liwo ci prawid owego wyliczenia adresu komoacuterki do ktoacuterej ma od-by si zapis

W dalszej cz ci rozdzia u zostanie wykorzystany modu LCD o organizacji 16times2(ale mo na te bez problemu wykorzysta dowolny inny)

Zanim b dzie mo na co wy wietli na ekranie modu musi zosta zainicjalizowanyW trakcie inicjalizacji ustawiane s podstawowe parametry pracy sterownika LCD mdashorganizacja matrycy (liczba linii) wielko czcionki (5times8 lub 8times11 pikseli) Wielkoczcionki zale y od typu pod czonej matrycy LCD Dla konkretnego modu u LCDtylko jedna z tych warto ci b dzie poprawna Oproacutecz inicjalizacji modu u nale y tak-e poprawnie ustawi stan pinoacutew IO wykorzystywanych do pod czenia modu u LCD

Wi kszo pracy zwi zanej z inicjalizacj modu u LCD odbieraniem i wysy aniemdo niego danych wykonuje biblioteka Joerga Wunscha Dostarcza ona niskopozio-mowe funkcje umo liwiaj ce komunikacj ze sterownikiem hd44780 i innymi kom-patybilnymi z nim sterownikami Wystarczy e do aplikacji w ktoacuterej planujemy wy-korzysta taki modu do czymy plik hd44780c oraz plik nag oacutewkowy hd44780h

Kup książkę Poleć książkę

50 AVR Uk ady peryferyjne

Oba pliki bdquozak adaj rdquo e istnieje plik nag oacutewkowy definesh zawieraj cy podstawo-we definicje zwi zane ze sposobem pod czenia modu u LCD z mikrokontroleremNa pocz tku nale y okre li ktoacutere linie IO zosta y wykorzystane do pod czenia modu u

define HD44780_RS A 4define HD44780_RW A 5define HD44780_E A 6define HD44780_D4 A 0

W powy szym przyk adzie do kolejnych linii portu A (A4 ndash A6) zosta y pod czonesygna y RS RW i E modu u natomiast do linii A0 ndash A3 linie D4 ndash D7 modu u LCD Wa nejest aby linie danych czy z pinami IO w kolejno ci rosn cej Biblioteka wykorzy-stuje do transmisji danych pomi dzy modu em a mikrokontrolerem tylko 4 linie danychmdash dzi ki temu mo emy zmniejszy liczb po cze a zwolnione linie IO wykorzystado innych celoacutew W pliku wyst puje jeszcze jedna definicja

define USE_BUSY_BIT 1

Okre la ona e biblioteka b dzie u ywa flagi Busy modu u LCD mdash umo liwia touzyskanie optymalnej szybko ci wspoacute dzia ania z modu em Zako czenie realizacjibie cej operacji modu sygnalizuje zmian stanu tej flagi co umo liwia niezw ocznewys anie kolejnej komendy Je li nie u ywamy flagi Busy program musi generowamaksymalne zalecane w nocie katalogowej opoacute nienia w efekcie ca a transmisja zwal-nia Po zdefiniowaniu u ywanych pinoacutew w pliku definesh mo emy rozpocz korzy-stanie z biblioteki

W pliku hd44780h s udost pnione prototypy funkcji odpowiedzialnych za wspoacute -prac z modu em LCD

Funkcje bibliotecznePodstaw modu u stanowi dwie funkcje umo liwiaj ce odpowiednio wys anie da-nych do modu u oraz ich odczytanie

void hd44780_outbyte(uint8_t b uint8_t rs)uint8_t hd44780_inbyte(uint8_t rs)

Obie funkcje wysy aj odczytuj 8-bitow dan w przypadku wykorzystania tylko4-bitowej szyny danych wysy anie i odczytywanie danych odbywa si w dwoacutech etapachDodatkowo zmienna rs okre la tryb dost pu W przypadku wysy ania danych do modu urs = 0 powoduje e dane zostan wys ane do rejestru komend a je li rs = 1 dane trafido rejestru danych Przy odczycie jest podobnie z tym e dla rs = 0 jest odczytywanaflaga Busy i rejestr AC (ang Address Counter)

Kolejna funkcja odpowiada za oczekiwanie na gotowo modu uvoid hd44780_wait_ready(bool islong)

W przypadku gdy w pliku definesh symbol USE_BUSY_FLAG ma warto 1 parametrislong jest ignorowany a optymalizator kompilatora usuwa go gdy nie jest on wy-korzystywany przez funkcj Kiedy warto USE_BUSY_FLAG jest roacute na od 1 parametr

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 51

ten okre la d ugo opoacute nienia Je li jest roacute na od 0 opoacute nienie wynosi 152 ms a je-eli jest roacutewna 0 opoacute nienie wynosi 37 s Poniewa lepiej jest u ywa flagi Busy

mo emy ten parametr ignorowa

Powy sze trzy funkcje wystarcz do komunikacji z modu em dla wygody zdefiniowanojednak kolejne Funkcje hd44780_outcmd(n) i hd44780_incmd() umo liwiaj odpowiedniowys anie polecenia do rejestru komend kontrolera lub odczytanie bitu Busy i licznikaAC Dwie kolejne mdash hd44780_outdata(n) oraz hd44780_indata() mdash umo liwiaj zapisi odczytanie rejestru danych

Oproacutecz funkcji odpowiedzialnych za komunikacj z modu em LCD zdefiniowano tak efunkcj przeprowadzaj c podstawow inicjalizacj modu u hd44780_init(void) orazfunkcj hd44780_powerdown(void) ustawiaj c wszystkie linie u yte do komunikacjiw stan 0 co umo liwia bezpieczne od czenie zasilania od modu u LCD W przypadkupozostawienia ktoacuterej z wy ej wymienionych linii w stanie 1 przy od czonym za-silaniu modu u stanowi ona jego zasilanie W efekcie mimo wy czenia modu mo epobiera znaczny pr d

Szerszego omoacutewienia wymaga funkcja hd44780_outcmd(cmd) ktoacutera umo liwia wys a-nie polecenia do rejestru polece sterownika LCD Dla wygody zdefiniowane zosta yroacute ne komendy u atwiaj ce wspoacute prac z modu em LCD Komendy te s przekazy-wane jako argument wywo ania funkcji hd44780_outcmd np

hd44780_outcmd(HD44780_CLR)

powoduje wys anie do sterownika polecenia HD44780_CLR czyszcz cego zawartopami ci DDRAM kontrolera

KomendyFunkcja hd44780_outcmd przyjmuje jako argument predefiniowane makrodefinicjeznacznie u atwiaj ce wspoacute prac z kontrolerem modu u LCD Poni ej zostan onepokroacutetce omoacutewione

HD44780_SHIFT(shift right)Ta makrodefinicja powoduje przesuni cie pozycji wy wietlanego tekstu (shift = 1)o jedn pozycj w lewo (argument right = 0) lub w prawo (argument right = 1)W przypadku gdy shift = 0 przesuwany w lewo lub prawo jest tylko kursor Wysy-aj c wielokrotnie to polecenie uzyskujemy kolejne przesuni cia o jedn pozycj

w lewo lub prawo Polecenie to s u y g oacutewnie do przesuwania tekstu Jednak ze wzgl duna du bezw adno tekstowych modu oacutew LCD nie nale y przesuwa liter cz ciej niok raz na sekund mdash cz stsze przesuwanie daje bardzo nieprzyjemne efekty wizual-ne Ka dy bufor linii jest bdquozawijanyrdquo to znaczy e po ostatnim znaku z prawej jestwy wietlany pierwszy znak z lewej i odwrotnie Nale y pami ta e d ugo buforajest sta a dla danego modelu matrycy Np dla modu oacutew 16times2 bufor jednej linii wyno-si dok adnie 40 bajtoacutew z czego 16 jest jednorazowo wy wietlanych Poni szy kodcyklicznie przewija wy wietlany tekst w lewo

lcd_puttext_P(PSTR(Test bufora i przewijania tekstunTen tekst przewija sie w lewo))while(1)

Kup książkę Poleć książkę

52 AVR Uk ady peryferyjne

hd44780_outcmd(HD44780_SHIFT(10)) _delay_ms(700)

HD44780_FNSET(if8bit twoline font5x10)Polecenie to wybiera typ interfejsu mdash 8-bitowy je li warto parametru if8bit jestroacutewna 1 lub 4-bitowy je li jest roacutewna 0 Typ interfejsu musi odpowiada sposobowipo czenia modu u z mikrokontrolerem Parametr twoline okre la czy pod czonamatryca LCD ma jedn lini znakoacutew czy dwie Matryce ktoacutere maj 4 linie tekstu straktowane przez kontroler jako matryce dwuliniowe mdash parametr twoline powinienmie warto 1 Je li dla matrycy zawieraj cej dwie lub wi cej linii ustawimy go na 0to wy wietlana b dzie tylko jedna linia (w przypadku matryc dwuliniowych goacuterna)a w przypadku matryc 4-liniowych b d wy wietlane dwie linie rozdzielone lini pust

Ostatni parametr okre la typ u ywanego generatora znakoacutew Powinien on odpowiadau ytej w module matrycy zwykle wi c jego warto wynosi 0

HD44780_DISPCTL(disp cursor blink)Ustawia roacute ne parametry pracy matrycy Je li parametr disp ma warto 1 to matrycajest w czona (wy wietla zawarto DDRAM) a je li 0 to matryca jest wy czonalecz stan pami ci DDRAM nie ulega zmianie Np kod

while(1) hd44780_outcmd(HD44780_DISPCTL(011)) _delay_ms(700) hd44780_outcmd(HD44780_DISPCTL(111)) _delay_ms(700)

powoduje naprzemienne w czanie i wy czanie matrycy w efekcie wy wietlany tekstmruga

Parametr cursor okre la czy sprz towo wy wietlany kursor ma by widoczny (war-to parametru 1) czy niewidoczny (warto parametru 0) Je li kursor jest widocznyto dodatkowo mo emy okre li czy ma miga (warto parametru blink roacutewna 1)czy nie (blink = 0) Je li kursor jest widoczny i nie miga jest wy wietlany w postacipoziomej kreski Wy wietlanie kursora mo e by u yteczne w sytuacji kiedy u yt-kownik wprowadza jakie dane W pozosta ych sytuacjach kursor mo emy wy czy

HD44780_ENTMODE(inc shift)Okre la sposoacuteb wprowadzania danych do pami ci Je li parametr inc ma warto 1 topo ka dej operacji zapisuodczytu adres pami ci jest automatycznie zwi kszany o je-den co przy piesza operacj zapisuodczytu kolejnych znakoacutew Je li warto inc jestroacutewna 0 to adres jest automatycznie zmniejszany o 1 Dodatkowo parametr shiftokre la czy wy wietlany obraz ma by automatycznie przesuwany tak aby wy wie-tla ostatnio wprowadzony znak (shift = 1) lub go nie wy wietla (shift = 0)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 53

HD44780_CLRPowoduje wyczyszczenie (wype nienie znakami o kodzie 32) ca ej zawarto ci pami ciDDRAM Jednocze nie kursor wraca do pozycji pierwszej (pierwsza linia pierwszyznak)

Niewy wietlane bajty pami ci DDRAM tak e s kasowane Je li s one u ywanedo przechowywania zmiennych programu to przed operacj kasowania nale y jeskopiowa w bezpieczne miejsce W przeciwnym przypadku zostan utracone

Wska nik adresu do pami ci DDRAM jest ustawiany na 0 zerowane jest tak e prze-suni cie

HD44780_HOMEPowoduje powroacutet kursora do pozycji pocz tkowej mdash pierwsza linia pierwszy znakWska nik adresu do pami ci DDRAM w efekcie zawiera 0 zerowane jest roacutewnieprzesuni cie wy wietlania znakoacutew w efekcie s one wy wietlane od pozycji 0

HD44780_DDADDR(addr)Ustawia nast pny adres zapisuodczytu w pami ci DDRAM na addr Tylko 7 bitoacutewargumentu addr jest branych pod uwag w zwi zku z czym mo na zaadresowa mak-symalnie 128 bajtoacutew pami ci (z czego sterownik ma tylko 80 pozosta e lokacje snieu ywane)

HD44780_CGADDR(addr)Ustawia nast pn operacj odczytuzapisu w pami ci CGRAM na addr Pod uwagbranych jest tylko 6 bitoacutew zmiennej addr w efekcie mo na zaadresowa maksymalnie64 bajty pami ci CGRAM

Przedstawione powy ej funkcje zapewniaj jedynie podstawow komunikacj z mo-du em LCD Potrzebujemy jednak ci gle funkcji odpowiedzialnej za jego inicjalizacjmdash funkcja biblioteczna przeprowadza ten proces tylko w podstawowym zakresie musi-my jeszcze zadba o w a ciwe ustawienie parametroacutew zwi zane z posiadan matryc Napiszmy wi c w asne rozwini cie funkcji inicjalizacyjnej

void lcd_init() hd44780_init() Podstawowa inicjalizacja modu u hd44780_outcmd(HD44780_CLR) Wyczy pami DDRAM hd44780_wait_ready(1000) hd44780_outcmd(HD44780_ENTMODE(1 0)) Tryb autoinkrementacji AC hd44780_wait_ready(1000) hd44780_outcmd(HD44780_DISPCTL(1 0 0)) W cz wy wietlacz wy cz kursor hd44780_wait_ready(1000)

Zauwa e po wys aniu ka dego polecenia do modu u jest wywo ywana funkcjahd44780_wait_ready(1000) odpowiedzialna za oczekiwanie a realizacja wys anego po-lecenia dobiegnie ko ca Jest to niezb dne gdy do czasu uko czenia bie cej

Kup książkę Poleć książkę

54 AVR Uk ady peryferyjne

operacji dalsze polecenia s ignorowane Jako argument podany jest parametr 1000mdash jest on bez znaczenia nasza biblioteka korzysta z flagi Busy i po prostu go ignorujePo wykonaniu powy szej funkcji modu LCD jest poprawnie zainicjalizowany a jegopami jest wyczyszczona (zawiera bajty 0x20) i w efekcie modu nic nie wy wietlaOd tej chwili mo emy wysy a znaki do wy wietlenia

Po wykonaniu inicjalizacji ekran mo e pozosta czysty lub wy wietla ca kowiciewype nione kwadraty (wszystkie piksele w czone) Je li po inicjalizacji wszystkiepiksele s w czone nale y nieco zmniejszy kontrast

Aby sobie u atwi to zadanie zdefiniujmy funkcj wysy aj c do modu u jeden znakvoid lcd_putchar(char c) static bool second_nl_seen static uint8_t line=0

if ((second_nl_seen) ampamp (c = n)ampamp(line==0)) Odebrano pierwszy znak hd44780_wait_ready(40) hd44780_outcmd(HD44780_CLR) hd44780_wait_ready(1600) second_nl_seen=false if (c == n) if (line==0) line++ hd44780_outcmd(HD44780_DDADDR(64)) Adres pierwszego znaku drugiej linii hd44780_wait_ready(1000) else second_nl_seen=true line=0 else hd44780_outdata(c) hd44780_wait_ready(40)

Funkcja ta ze wzgl du na skomplikowane adresowanie pami ci DDRAM jest zale naod konkretnego modelu modu u LCD B dzie prawid owo wspoacute pracowa z modu a-mi 2times16 2times20 i 2times40 znakoacutew W przypadku innych modu oacutew pozycje niektoacuterychznakoacutew mog by nieprawid owe

Mo emy ju wy wietla na LCD pojedyncze znaki czas na wy wietlanie tekstu Po-niewa teksty jako sta e dla zaoszcz dzenia cennej pami ci RAM przechowuje si za-zwyczaj w pami ci FLASH zdefiniujmy funkcj odczytuj c podany a cuch zna-kowy z pami ci FLASH a nast pnie umieszczaj c go na LCD

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 55

void lcd_puttext_P(prog_char txt) char ch while((ch=pgm_read_byte(txt))) lcd_putchar(ch) txt++

Powy sza funkcja wysy a kolejne znaki odczytane z pami ci FLASH na LCD za po-moc funkcji LCD_putchar Po napotkaniu znaku ko ca a cucha (0 nul) przerywa swojedzia anie

Pozostaje nam przetestowa dzia anie przedstawionych funkcjiint main() lcd_init() lcd_puttext_P(PSTR(Test LCDnDruga linia)) while(1)

Na ekranie modu u LCD powinien wy wietli si napisTest LCDDruga linia

Je li na LCD nic nie widzimy to w pierwszej kolejno ci powinni my sprawdzi kon-trast zmieniaj c napi cie na pinie Vee modu u LCD

Warto zdefiniowa jeszcze funkcj ustawiaj c pozycj od ktoacuterej b dzie wy wietlanynast pny znak

void lcd_goto(uint8_t x uint8_t y) hd44780_outcmd(HD44780_DDADDR(0x40y+x)) hd44780_wait_ready(1000)

Funkcja ta przyjmuje dwa parametry x i y okre laj ce pozycj na ktoacuterej zostaniewy wietlony nast pny znak wys any z mikrokontrolera do modu u LCD Dzi ki temuz atwo ci mo emy uaktualnia zawarto LCD bez konieczno ci ponownego prze-sy ania wszystkich danych Funkcja ta jest zale na od typu zastosowanego modu u

Ostatni funkcj jest funkcja umo liwiaj ca czyszczenie zawarto ci pami ci modu uOdpowiedzialne za to jest proste polecenie wysy ane do sterownika

void lcd_cls() hd44780_outcmd(HD44780_CLR) hd44780_wait_ready(false)

Oproacutecz czyszczenia zawarto ci pami ci modu u powoduje ono ustawienie kursoraw punkcie (00)

Kup książkę Poleć książkę

56 AVR Uk ady peryferyjne

Definiowanie w asnych znakoacutewUk ad HD44780 jest wyposa ony w 64 bajty pami ci CGRAM (ang Character Ge-nerator RAM) ktoacutera mo e przechowywa mapy bitowe 8 znakoacutew o matrycy 5times8 pikselilub 4 znakoacutew o matrycy 5times10 pikseli Przyk ad definicji znaku na matrycy 5times8 poka-zano na rysunku 223

Rysunek 223Przyk ad definicji w asnego znakuw pami ci CGRAM Znak rysujemyna matrycy 5times8 bitoacutew polazaciemnione odpowiadaj warto ci 1pola bia e warto ci 0 Wartowyliczon dla ka dej linii pikseliwpisujemy do pami ci CGRAMsterownika Najstarsze 3 bity ka degobajta (pola szare) s bez znaczeniamdash wy wietlacz pomija jeprzy wy wietlaniu obrazu

1

2

3

4

5

6

7

0 00100 = 4

01110 = 14

11111 = 31

00100 = 4

00100 = 4

00100 = 4

11111 = 31

01110 = 14

Adres Warto

Dost p do tej pami ci jest mo liwy dzi ki wys aniu polecenia ustawiaj cego adreszapisuodczytu pami ci CGRAM Po jego wys aniu wszystkie operacje zapisu i od-czytu dotycz tej pami ci a nie pami ci DDRAM Aby wroacuteci do adresowania pa-mi ci DDRAM nale y wybra jej adres lub dokona operacji wymagaj cej przesu-ni cia kursora

Pami CGRAM jest pami ci ulotn po ponownym w czeniu zasilania definicjeznakoacutew musz by ponownie przes ane przez procesor

Bity o warto ci 1 w definicji znaku odpowiadaj w czonym pikselom bity o warto-ci 0 pikselom wy czonym Najstarsze 3 bity ka dego bajta w pami ci CGRAM s

bez znaczenia mdash te pozycje nie s wy wietlane przez matryc Definiuj c znak nale-y tak e pami ta e ostatnia linia wy wietlana przez matryc (w zale no ci od wiel-

ko ci matrycy znaku linia 8 lub 10) powinna zawiera same zera mdash w tej linii b dziewy wietlany kursor

Najcz ciej matryce LCD pod czone do sterownika HD44780 maj organizacj 5times8czyli jeden znak jest definiowany przez 8 kolejnych bajtoacutew okre laj cych stan po-szczegoacutelnych linii tworz cych znak Stwoacuterzmy funkcj ktoacuterej zadaniem b dzie za a-dowanie definicji znakoacutew z pami ci FLASH mikrokontrolera do pami ci CGRAM

void lcd_defchar_P(uint8_t charno prog_uint8_t chardef) hd44780_outcmd(HD44780_CGADDR(charno8)) hd44780_wait_ready(40) for(uint8_t c=0clt8c++) hd44780_outdata(pgm_read_byte(chardef))

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 57

hd44780_wait_ready(40) chardef++

Funkcja LCD_defchar_P jako argumenty przyjmuje numer definiowanego znaku (0 ndash 7)oraz wska nik do obszaru pami ci FLASH zawieraj cego definicj znaku (obszarten zajmuje 8 nast puj cych po sobie bajtoacutew) Jak widzimy funkcja najpierw ustawiaw a ciwy adres pod ktoacuterym znajdzie si pocz tek definicji znaku w pami ci CGRAMmdash poniewa jeden znak jest opisywany za pomoc 8 bajtoacutew kolejne adresy znakoacutewto kod_znakutimes8 Nast pnie dane opisuj ce znak s adowane z pami ci mikrokontrolerai zapisywane w pami ci CGRAM sterownika Poni szy program ilustruje wykorzy-stanie funkcji LCD_defchar_P

prog_uint8_t char1[8][8]=0000000255 00000025525500000255255255 0000255255255255 00025525525525525500255255255255255255 0255255255255255255255255255255255255255255255

int main() for(uint8_t x=0xlt8x++) lcd_defchar_P(xampchar1[x][0]) Za aduj wzorce znakoacutew lcd_init() for(uint8_t x=0xlt8x++) lcd_putchar(x) Wy wietl znaki o kodach 0 ndash 7 while(1)

W pierwszej linii funkcji main nast puje za adowanie nowych definicji znakoacutew dopami ci CGRAM nast pnie inicjalizowany jest wy wietlacz po czym w pierwszejlinii s wy wietlane znaki o kodach 0 ndash 7 a wi c znaki ktoacuterych definicja zosta aprzes ana z mikrokontrolera

Zauwa e pami CGRAM podobnie jak DDRAM mo emy zapisywa i odczytywaprzed inicjalizacj modu u LCD Proces inicjalizacji jest potrzebny tylko do prawi-d owego wy wietlania na ekranie LCD

Poniewa dane potrzebne do wy wietlenia znaku s na bie co pobierane z pami cipodczas od wie ania matrycy LCD jakiekolwiek zmiany w definicji znaku kiedy jest onwidoczny na LCD poci gaj za sob natychmiastowe zmiany w wy wietlanym obrazieMo na t w a ciwo sterownika wykorzysta do stworzenia prostych animacji

void lcd_box(uint8_t y) hd44780_outcmd(HD44780_CGADDR(0)) Zaczynamy od znaku o kodzie 0 hd44780_wait_ready(40) for(uint8_t c=0cltyc++) Stwoacuterz linie z w czonymi pikselami hd44780_outdata(0xFF) hd44780_wait_ready(40) for(uint8_t c=yclt8c++) Stwoacuterz linie z wy czonymi pikselami hd44780_outdata(0x00) hd44780_wait_ready(40)

Kup książkę Poleć książkę

58 AVR Uk ady peryferyjne

int main() lcd_init() lcd_putchar(0) while(1) for(uint8_t x=0xlt8x++) lcd_box(x) _delay_ms(100) for(int8_t x=7xgt=0x--) lcd_box(x) _delay_ms(100)

Funkcja main wy wietla na LCD tylko jeden znak o kodzie 0 a nast pnie cykliczniezmienia jego definicj w pami ci CGRAM W efekcie posta znaku wy wietlana naekranie ci gle si zmienia

Transakcyjna obs uga LCDPokazana do tej pory obs uga LCD alfanumerycznego mia a pewne wady Jak wiemyoperacje odwo uj ce si do kontrolera LCD s niezwykle wolne cykl odczytuzapisudowolnego rejestru kontrolera trwa co najmniej 1600 ns co dla MCU taktowanegozegarem 32 MHz przek ada si na czas wykonania oko o 52 instrukcji asemblera Cogorsza wi kszo komend realizowanych przez kontroler jest wykonywana w czasieoko o 37 s co przek ada si na tysi ce zmarnowanych taktoacutew MCU St d te jaki-kolwiek zapisodczyt LCD to z perspektywy programu straszne marnotrawstwo czasu

Problem ten dotyczy ka dego urz dzenia IO ktoacutere dzia a wolniej ni procesor W takiejsytuacji warto napisa pewn warstw po redni mdash sterownik mdash ktoacuterego zada-niem b dzie buforowanie da dost pu do urz dzenia i rozstrzyganie konfliktoacutewdzi ki czemu roacute ne cz ci programu b d bdquomia y wra enierdquo e maj wy czny do-st p do urz dzenia

Pokazane wcze niej funkcje obs ugi LCD maj jeszcze jedn wad mdash nie s wspoacute bie -ne czyli nie mo na ich wykonywa jednocze nie w kilku miejscach programu w tymw szczegoacutelno ci w programie g oacutewnym i w funkcjach obs ugi przerwa W wielu przy-padkach ta wada jest bez znaczenia jednak czasami jest uci liwa mdash dla przyk adugdy na wy wietlany tekst chcieliby my na o y inne informacje np o dacie lub godzi-nie Oczywi cie wy wietlanie mo na zorganizowa tak aby nie by o potrzeby pisaniawspoacute bie nego kodu np poprzez zastosowanie bufora pami ci VRAM kontrolera LCDRodzi to jednak kolejne problemy i jest ma o eleganckie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 59

Zastanoacutewmy si w jaki sposoacuteb najlepiej jednocze nie rozwi za problem wolnegodost pu do urz dzenia i wspoacute bie no ci kodu Rozwi zaniem mo e by wprowadze-nie tzw transakcji Transakcj nazywamy zbioacuter operacji tworz cych pewn ca-o To co wyroacute nia tak wykonywany zestaw operacji to atomowo spoacutejno

izolacja i trwa o Pod tymi terminami kryje si istota wykonywanej operacji Ato-mowo transakcji zapewnia e jest ona wykonywana w sposoacuteb niepodzielny co gwa-rantuje nam prawid ow wspoacute prac z danym urz dzeniem IO w tym przypadku kon-trolerem LCD Wa na dla nas jest tak e izolacja mdash dzi ki temu inne operacje na LCD(inne transakcje) nie b d mia y wp ywu na wynik aktualnie wykonywanej transakcjimdash nie b d zak oacuteca y jej wykonania z drugiej strony nasza transakcja nie zak oacuteciwykonania innych Trwa o z kolei zagwarantuje nam e je li sterownik potwierdziwykonanie transakcji to znaczy e efekt jej dzia ania jest wy wietlony na LCD Tacecha nie jest nam a tak potrzebna mdash jest ona wydawa oby si oczywista Niemniej jestto pewna gwarancja e ca a operacja przebieg a poprawnie i w efekcie LCD znajdujesi w okre lonym przez nas stanie Tyle teorii przejd my do praktyki

Kody poni szego przyk adu znajduj si w katalogu PrzykladyLCD-alfaLCD-transact

Aby zapewni transakcyjny dost p do LCD musimy stworzy pewne struktury danychktoacuterych zadaniem b dzie przechowywanie informacji o operacjach sk adaj cych sina transakcje i stanie ich wykonania W tym celu pos u ymy si wiadomo ciami z roz-dzia u 5 bdquoJak uporz dkowa chaos czyli z o one typy danych i listyrdquo Do przecho-wywania oczekuj cych transakcji pos u ymy si buforem pier cieniowym zanimjednak go zaimplementujemy zastanoacutewmy si jak powinna wygl da struktura prze-chowuj ca informacje o transakcji Struktura ta powinna zawiera co najmniej

pole danych (data) z informacjami ktoacutere maj by przes ane do kontrolera LCD

pole okre laj ce liczb danych do wys ania (len)

pole okre laj ce realizowane polecenie dla LCD (cmd) mdash pole to pos u yprogramowi sterownika do w a ciwej interpretacji danych znajduj cych siw polu data

kilka poacutel kontrolnych przechowuj cych informacje potrzebne do realizacjisamej transakcji Jedno z nich mdash Ready mdash b dzie przyjmowa warto trueje li dana transakcja zosta a zrealizowana lub false w przeciwnym przypadkuZnaczenie drugiego pola mdash SelfDel mdash mo e wydawa si nieco enigmatycznepole to okre la czy pami przydzielona dla transakcji ma by zwolnionaw sterowniku LCD (warto true) czy te zostanie zwolniona w programie(warto false)

Oto jak mo e wygl da struktura definiuj ca transakcj typedef struct volatile bool Ready 1 true je li transakcja zosta a zrealizowana bool SelfDel 1 true je li pami przydzielona transakcji ma zosta zwolniona LCD_Cmd cmd 2 Polecenie do zrealizowania uint8_t len 6 D ugo polecenia

Kup książkę Poleć książkę

60 AVR Uk ady peryferyjne

unsigned 0 Wyroacutewnanie do granicy bajta uint8_t data[] Dane transakcji LCD_trans

Nale y zwroacuteci uwag na poleunsigned 0

Nie definiuje ono adnego pola struktury ale jedynie informuje kompilator e kolejnepole (w naszym przyk adzie o nazwie data) ma by wyroacutewnane do granicy bajta mdashdzi ki temu dost p do kolejnego pola b dzie odbywa si szybciej Z kolei samo poledata jest zadeklarowane jako tzw typ niekompletny

Typ niekompletny (ang incomplete type) to typ ktoacuterego rozmiaru nie da si okre li

W pokazanym przyk adzie rozmiaru pola data nie da si okre li gdy zosta on za-deklarowany jako typ tablicowy z tym e nie podano wielko ci tablicy Wielko ci niepodano gdy na etapie deklaracji struktury nie wiemy jakiej wielko ci dane b d w niejprzechowywane Tego typu deklaracja ma bardzo powa ne konsekwencje mdash skorowielko ci pola data nie da si okre li to jaki b dzie wynik dzia ania operatora sizeof(LCD_trans) Kompilator stara si jako wybrn z tej sytuacji w zwi zku z czym

zwroacuteci wielko struktury ale tak jakby pole data w ogoacutele nie istnia o mdash jego roz-miar b dzie wynosi 0 W ramach wiczenia zastanoacutew si ile bajtoacutew pami ci b dziezajmowa a struktura LCD_trans

Skoro dysponujemy ju struktur przechowuj c poszczegoacutelne transakcje pora nastworzenie obiektu przechowuj cego kolekcj transakcji Dodanie kolejnej strukturyb dzie polega o na dodaniu jej do takiego obiektu z drugiej strony program sterownikaLCD b dzie moacuteg z tej kolekcji pobiera kolejne transakcje do realizacji Opis ten przy-pomina opis dzia ania bufora pier cieniowego mdash z jednym wyj tkiem mdash po zape nie-niu ca ego bufora nie b dziemy usuwa niezrealizowanych transakcji lecz zabloku-jemy dodawanie kolejnych W tym celu pos u ymy si definicj nast pnej struktury

typedef struct LCD_trans elements[LCD_MAXTRANS] Wska niki do transakcji uint8_t Beg Pierwszy element bufora uint8_t Count Liczba elementoacutew w buforze CircBuffer

Struktura ta zawiera deklaracj tablicy wska nikoacutew na transakcje (pole elements)Poniewa jest to tablica musimy zna liczb jej elementoacutew mdash jest ona zadeklarowanaw sta ej LCD_MAXTRANS

define LCD_MAXTRANS 10 Maksymalna liczba pami tanych transakcji

Do realizacji bufora s potrzebne jeszcze dwa pola Beg wskazuj ce na pierwsztransakcj w buforze oraz pole Count okre laj ce liczb transakcji znajduj cych siw buforze Je li Count == 0 to znaczy e w buforze nie ma adnych oczekuj cychtransakcji a je li Count == LCD_MAXTRANS to znaczy e bufor jest pe ny i nie mo na

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 61

dodawa do niego kolejnych transakcji W a ciwo t wykorzystuj dwie zdefiniowanew pliku LCD_transc funkcje

static inline bool cbIsFull(CircBuffer cb) return cb-gtCount == LCD_MAXTRANS

static inline bool cbIsEmpty(CircBuffer cb) return cb-gtCount == 0

Jak pami tamy w przypadku funkcji modyfikatory static inline powoduj e danafunkcja nie b dzie istnie jako samodzielna lecz w ka dym miejscu w ktoacuterym jestwywo ywana jest wstawiany raczej jej kod a nie wywo anie Ma to znaczenie dlakroacutetkich funkcji (a wi c takich jak pokazane powy ej) dla ktoacuterych koszty wywo anias zazwyczaj wi ksze ni koszty umieszczenia cia a funkcji w miejscu jej wywo aniaTego typu funkcje zachowuj si w sposoacuteb zbli ony do makrodefinicji (z tym e re-spektuj wszystkie regu y j zyka C w szczegoacutelno ci kolejno operatoroacutew czy kon-trol typoacutew)

Takie funkcje jako argument pobieraj adres bufora na ktoacuterym maj operowa W na-szym przypadku bufor jest zdefiniowany nast puj co

static CircBuffer LCD_TransBuffer Bufor na transakcje

Nale y zauwa y e jest on zdefiniowany jako struktura globalna z modyfikatoremstatic Modyfikator ten ogranicza zasi g widoczno ci zmiennej LCD_TransBuffer dopliku w ktoacuterym zmienna ta zosta a zdefiniowana (w tym przypadku modyfikator staticjest niejako przeciwie stwem modyfikatora extern) Dzia anie to ma jedynie znaczeniekosmetyczne mdash uniemo liwia odwo anie si do bufora za pomoc funkcji ktoacutere niezosta y zdefiniowane w miejscu jego definicji Oproacutecz funkcji umo liwiaj cych okre-lenie stanu bufora potrzebne s jeszcze funkcje umo liwiaj ce dodanie i pobranie trans-

akcji Pierwsz funkcj b dzie funkcja dodaj ca transakcj do buforabool cbAdd(CircBuffer cb LCD_trans elem) ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsFull(cb)) return false Czy jest miejsce w kolejce uint8_t end = (cb-gtBeg + cb-gtCount) LCD_MAXTRANS cb-gtelements[end] = elem Dodaj transakcj ++cb-gtCount Liczba elementoacutew w buforze return true Wszystko OK

Funkcja ta dodaje transakcj (zmienna elem) do bufora ko owego Zanim transakcjazostanie dodana sprawdzane jest czy w buforze jest miejsce mdash je li nie funkcjazwroacuteci false Je li dodanie jest mo liwe warto licznika okre laj cego liczb trans-akcji przechowywana w buforze (Count) zwi ksza si o jeden Warto zastanowi si te dlaczego praktycznie ca e cia o tej funkcji jest zamkni te w sekcji atomowej (ATOMIC_BLOCK) Jedn z cech naszego sterownika ma by mo liwo wspoacute bie nego dost pu

Kup książkę Poleć książkę

62 AVR Uk ady peryferyjne

do LCD mdash to znaczy e danie np zapisu do LCD mo e wyst pi zaroacutewno w g oacutewnejp tli programu jak i asynchronicznie w przerwaniu St d te wynika e funkcja do-daj ca transakcj musi by napisana w sposoacuteb zapewniaj cy jej poprawn prac w sytu-acji gdy zostanie ona przerwana i ponownie wywo ana przed zako czeniem dzia aniajej poprzedniej instancji Umieszczenie cia a tej funkcji w sekcji atomowej nam to za-pewnia mdash dzi ki temu bufor transakcji zawsze b dzie spoacutejny Dla zaspokojenia cie-kawo ci warto usun sekcj atomow i sprawdzi jak wtedy b dzie zachowywa si tafunkcja i jak wp ynie to na spoacutejno przechowywanych danych

Drug niezb dn funkcj jest funkcja odczytuj ca bufor transakcji i zwracaj ca trans-akcj do zrealizowania (lub NULL je li adnej transakcji nie ma w buforze)

LCD_trans cbRead(CircBuffer cb) LCD_trans elem ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsEmpty(cb)) return NULL Bufor pusty nie mo na zwroacuteci elementu elem = cb-gtelements[cb-gtBeg] cb-gtBeg = (cb-gtBeg + 1) LCD_MAXTRANS -- cb-gtCount Zmniejszamy liczb elementoacutew pozosta ych w buforze return elem

Funkcja ta jest bardzo podobna do poprzedniej mdash najpierw sprawdza czy bufor za-wiera jak oczekuj c transakcj (cbIsEmpty(cb)) je li tak to zwraca adres opisuj -cej j struktury i zmniejsza liczb transakcji oczekuj cych (pole Count) W ten sposoacutebmamy zrealizowan ca funkcjonalno zwi zan z obs ug bufora pier cieniowegoPokazane funkcje s uniwersalne i z bardzo podobnych (lub wr cz tych samych) b -dziemy korzysta w kolejnych rozdzia ach w kontek cie np obs ugi transakcji zwi -zanych z interfejsami szeregowymi

Pora przej do samego sterownika LCD Jego zadaniem b dzie sprawdzenie czyw buforze oczekuj jakie transakcje do realizacji a je li tak to ich wykonanie Ponie-wa dane do LCD mog by wysy ane co okre lony minimalny czas znacznie d u -szy ni czas jakiego na to zadanie potrzebuje mikrokontroler do wysy ania kolejnychpaczek danych pos u ymy si timerem Timer b dzie generowa przerwanie nadmiaru(TCD0_OVF_vect) ktoacutere b dzie wyznacza o tempo w jakim kolejne porcje danych b -d trafia y do LCD Z noty katalogowej kontrolera wynika e minimalny czas trwa-nia wysokiego stanu sygna u Enable to 230 ns a okres tego sygna u nie powinien bykroacutetszy ni 500 ns Poniewa nasz dost p do LCD odbywa si w sposoacuteb nieblokuj cyMCU wi c szybko wysy ania danych do LCD jest bez znaczenia St d te w poka-zanym przyk adzie przyj to e dane b d wysy ane co 4 s co okre la sta a

define LCD_ACCESSTIME 0000004

Poniewa komunikacja z LCD odbywa si w sposoacuteb nieblokuj cy nie zale y nam tena czasie (i tak w stosunku do czasu od wie ania samego LCD jest on bardzo kroacutetki)w efekcie nie ma potrzeby odczytywania flagi busy kontrolera Dzi ki temu w cz ciprzypadkoacutew mo emy w ogoacutele zrezygnowa z sygna u wyboru RW i wymusi jego sta y

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 63

poziom logiczny umo liwiaj cy zapis do LCD Dzi ki temu mo na zaoszcz dzi do-datkowy pin IO1

Ca a logika naszego sterownika jest zawarta w funkcji obs ugi przerwania przepe nieniatimera (TCD0_OVF_vect) Poniewa LCD jest po czony z MCU w trybie 4-bitowym(dla zaoszcz dzenia liczby wykorzystanych pinoacutew IO) kolejne 8-bitowe dane muszby podzielone na dwie tetrady i wys ane do LCD w kolejno ci starszam odsza tetradaInformacja o aktualnie wysy anych danych jest umieszczona w zmiennej trans o typie

static struct uint8_t pos 6 Pozycja w polu danych aktualnej transakcji uint8_t nibble 1 Ktoacutera tetrada jest wysy ana seq

Dlaczego tak Dzi ki wykorzystaniu struktury i poacutel bitowych mo na zaoszcz dzi je-den bajt pami ci SRAM Ze wzgl du na wielko pami ci obs ugiwanej przez kon-troler LCD mo emy by pewni e transakcje zawieraj ce wi cej ni 63 bajty s ra-czej nierealne (nie mia yby wi kszego sensu) St d te do przechowywania informacjio aktualnie wysy anym bajcie danych wystarczy 6 bitoacutew mdash tyle samo zosta o wyko-rzystanych do okre lenia d ugo ci pola danych transakcji w strukturze LCD_trans Zaosz-cz dzony bit mo na po wi ci na flag nibble okre laj c ktoacutera tetrada (m odszastarsza)jest wysy ana Bez poacutel bitowych flaga ta zaj aby dodatkowy bajt pami ci

Przejd my do implementacji sterownika Pierwsz rzecz jak nale y sprawdzi jestto czy w buforze czeka jaka transakcja do zrealizowania Odpowiedzialny za to jestfragment kodu obs ugi przerwania nadmiaru timera

if(trans == NULL) Nic do zrobienia sprawd my czy jaka transakcja oczekuje trans=cbRead(ampLCD_TransBuffer) Czy jest jaka oczekuj ca transakcja seqpos=0 seqnibble=0 if(trans == NULL) TCD0_CTRLA=TC_CLKSEL_OFF_gc Nie ma adnych transakcji mdash wy cz timer

W przypadku gdy adna transakcja nie oczekuje na realizacj timer jest wy czanymdash dzi ki temu nie b d zg aszane kolejne przerwania przepe nienia i MCU nie b -dzie traci czasu na ich obs ug Co prawda wynikaj cy z tego zysk czasowy jest mar-ginalny lecz ma to istotniejsz konsekwencj mdash w przypadku usypiania MCU zb d-ne przerwanie timera nie b dzie niepotrzebnie wybudza o procesora W takiej sytuacjiponowne w czenie timera nast pi dopiero w funkcji dodaj cej transakcj do kolejkimdash a wi c w sytuacji gdy mamy pewno e istnieje oczekuj ca transakcja

Druga cz funkcji obs ugi przerwania jest zwi zana z realizacj samej transakcjiW pokazanym przyk adzie zaimplementowano tylko jeden typ transakcji mdash daniezapisu a cucha tekstowego pod wskazany adres VRAM (na okre lonej pozycji LCD)Je li zajdzie taka potrzeba programista mo e zaimplementowa inne polecenia i doda

1 Warto zauwa y e w bdquoklasycznejrdquo obs udze LCD te nie musimy czyta stanu flagi busy zamiast tego

wystarczy wprowadza p tle opoacute niaj ce Jednak poniewa taka obs uga blokuje MCU nie jest onazalecana Wady tej nie ma dost p transakcyjny co jest jego dodatkow zalet

Kup książkę Poleć książkę

64 AVR Uk ady peryferyjne

kod odpowiedzialny za ich obs ug Zauwa my e ka da transakcja musi zawieraadres pocz tku pami ci wideo od ktoacuterego b dzie zapisywany tekst Dzieje si takdlatego e transakcja wykonana wcze niej mo e ustawi wska nik zapisu na dowolnejkomoacuterce pami ci W efekcie tekst z kolejnej transakcji by by wy wietlany od komoacuterkina ktoacuterej zako czy si zapis poprzedniej transakcji Takie dzia anie oczywi cie jestniedopuszczalne st d te ka dy zapis do pami ci wideo poprzedza ustawienie rejestruindeksowego Problem ten mo na rozwi za tak e w inny sposoacuteb mdash poprzez wpro-wadzenie tzw uchwytoacutew (ang handlers) ktoacutere zawiera yby stan kontrolera LCDNiemniej to rozwi zanie dodatkowo komplikowa oby nasz sterownik Struktura danych(zawartych w polu data) ma wi c nast puj cy format

bajt nr 0 zawiera warto pozycji od ktoacuterej nale y dokonywa zapisu pami ciwideo mdash jest to warto przesy ana do rejestru okre laj cego adres zapisu

kolejne bajty zawieraj a cuch znakowy ktoacutery nale y umie ci w pami ciCGRAM

Poniewa bajt nr 0 zawsze zawiera warto wpisywan do rejestroacutew steruj cych kon-trolera podczas jego wysy ania jest ustawiana linia RS sygnalizuj ca zapis do rejestruPodczas wysy ania kolejnych bajtoacutew linia ta jest zerowana w zwi zku z czym zapisodbywa si do pami ci CGRAM

Kod obs uguj cy transakcj wygl da nast puj coif(trans) Jest transakcja do zrealizowania uint8_t dat=trans-gtdata[seqpos] if(seqnibble == 0) datgtgt=4 To trzeba zmieni je li linie danych nie s po czone z pinami 0 ndash 3 portu IO hd44780_outnibble_nowait(dat amp 0x0F seqpos = 0) Zapisujemy rejestr steruj cy lub dane ++seqnibble if(seqnibble == 0) ++seqpos Co drug tetrad zwi kszamy pozycj bufora if(seqpos gt= trans-gtlen) trans-gtReady=true Koniec transakcji if(trans-gtSelfDel) free_re(trans) Zwolnij pami transakcji je li tak sobie yczy programista trans=NULL Koniec transakcji CLR(OUT HD44780_E)

Ta cz przerwania wysy a kolejne tetrady do kontrolera LCD Warto zastanowi sinad dzia aniem sekwencji

++seqnibble

Poniewa pole nibble jest jednobitowe operacja inkrementacji prowadzi do zmianystanu tego pola na przeciwny (pole to ma warto 0 lub 1) Kiedy zostan wys anewszystkie dane przeznaczone dla kontrolera obs uga transakcji ko czy si Stan tensygnalizuje nadanie warto ci true polu Ready struktury LCD_trans Dzi ki temu pro-gram mo e sprawdzi asynchronicznie w stosunku do przerwania kiedy transakcjauleg a zako czeniu Opcjonalnie jest wykonywana jeszcze jedna funkcja mdash je li poleSelfDel ma warto true to pami zarezerwowana na transakcj jest automatycznie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 65

zwalniana W tym celu wykorzystuje si funkcj free_re ktoacuterej prototyp jest zade-klarowany w pliku Alloc_safeh Funkcja ta wywo uje funkcj biblioteczn free ktoacute-ra zwalnia pami przydzielon dynamicznie na stercie Poniewa funkcja ta nie jestfunkcj reentrant nale y stworzy odpowiedni bdquoprotez rdquo opakowuj c j w blokatomowy co zapewnia e nie zostanie ona ponownie wywo ana zanim jej poprzed-nia instancja nie zako czy dzia ania Oczywi cie lepszym rozwi zaniem by oby napi-sanie w asnych funkcji dynamicznej alokacji pami ci ktoacutere b d reentrant

Bardzo wa ne jest aby pole SelfDel mia o warto true wy cznie dla transakcjidla ktoacuterych pami zosta a przydzielona dynamicznie funkcj malloc (lub jej po-chodnymi) W pozosta ych przypadkach pole to musi mie warto false mdash nie-stosowanie si do tej regu y spowoduje b d mened era pami ci i najprawdopo-dobniej nieprzewidywalne dzia anie programu

Drug wa n zasad jest aby zmienna zawieraj ca dane transakcji nie by azmienn automatyczn mdash zmienne takie s automatycznie niszczone po opusz-czeniu zawieraj cej je funkcji W rezultacie obszar pami ci zawieraj cy danetransakcji mo e zosta wykorzystany przez inne zmienne co spowoduje uszkodzeniezawartych w nim danych

Pami przydzielona transakcji musi by alokowana w sposoacuteb dynamiczny (funkcjamalloc_re) ewentualnie mo e to by pami alokowana dla zmiennej globalnej lubstatycznej mdash zmienne tego typu istniej przez ca y czas ycia programu

Warto te zauwa y e instrukcje steruj ce stanem linii Enable kontrolera LCD(SET(OUT HD44780_E) i CLR(OUT HD44780_E)) s rozdzielone wieloma innymi in-strukcjami Dzi ki temu generowany impuls dodatni tego sygna u ma czas trwania gt230 ns wymagany w specyfikacji kontrolera Nawet dla XMEGA taktowanej zegarem32 MHz 230 ns przek ada si na oko o 7 instrukcji asemblera mdash czas jaki z pewno-ci up ynie pomi dzy wykonaniem obu powy szych instrukcji steruj cych

Do wysy ania danych do kontrolera zosta a wykorzystana nieco zmodyfikowanafunkcja hd44780_outnibble_nowait roacute ni ca si od jej protoplasty hd44780_outnibbletylko tym e nie czeka na sygna braku zaj to ci mikrokontrolera (nie realizuje teopoacute nie ) Nie jest to potrzebne gdy kolejne tetrady s wysy ane w odst pach cza-sowych okre lanych przez timer

Mamy wi c zapewnion obs ug transakcji i mo liwo transakcyjnego wy wietlaniadanych na LCD musimy jeszcze mie funkcj ktoacutera tworzy odpowiednie transakcjemdash jest odpowiednikiem funkcji bezpo rednio wysy aj cej dane znakowe do LCDOdpowiednikiem tym jest pokazana poni ej funkcja

bool LCD_PutText_B(uint8_t x uint8_t y char txt LCD_trans buf bool autodel) buf-gtcmd=LCD_Text buf-gtReady=false buf-gtSelfDel=autodel Czy zwolni pami po zako czeniu transakcji buf-gtdata[0]=HD44780_DDADDR(x+y0x40) Ustaw adres w DDRAM strcpy((char)ampbuf-gtdata[1] txt) Skopiuj dane tekstowe + NULL

Kup książkę Poleć książkę

66 AVR Uk ady peryferyjne

buf-gtlen=strlen(txt) + 1 D ugo tekstu + pozycji + NULL ndash 1 bool ret=cbAdd(ampLCD_TransBuffer buf) if((ret==false) ampamp (autodel)) free_re(buf) Brak miejsca w kolejce else TCD0_CTRLA=TC_CLKSEL_DIV1_gc Preskaler 1 mdash odblokuj timer return ret

Funkcja ta buduje transakcj odpowiedzialn za wy wietlenie napisu txt na wskaza-nej pozycji x y LCD Wszystkie dane o transakcji zostan umieszczone w buforzew pami ci ktoacuterej adres jest okre lany wska nikiem buf Pami w buforze musi bywystarczaj co du a aby pomie ci ca transakcj Dodatkowy parametr autodel okre laczy pami ta ma by automatycznie zwalniana po obs u eniu transakcji (true) czynie (false) Je li transakcj uda o si umie ci w kolejce funkcja zwraca true Wartozauwa y e w takim przypadku funkcja uruchamia te timer (w naszym przypadkujest to timer TCD0) odpowiedzialny za generowanie przerwania Funkcja obs ugi prze-rwania wysy a dane do LCD

Pewn odmian powy szej funkcji jest funkcjabool LCD_PutText(uint8_t x uint8_t y char txt) LCD_trans trans=malloc_re(sizeof(LCD_trans) + strlen(txt) + 2) bool ret=LCD_PutText_B(x y txt trans true) return ret

Wykorzystuje ona funkcj LCD_PutText_B z tym e najpierw alokuje dynamiczniepami potrzebn na przechowanie tworzonej transakcji

Mamy komplet potrzebnych funkcji a wi c sprawd my jak ca o sprawdza siw praktyce W pliku LCD-transactc znajduje si kod pokazuj cy jak dzia aj naszetransakcje Aby to by o mo liwe nale y zainicjalizowa kontroler LCD

LCD_init()

Wykorzystujemy tu znan ju funkcj inicjalizuj c mdash nie ma potrzeby jej zmienia gdy operacja inicjalizacji LCD jest jednorazowa i nie trzeba wykonywa jej w posta-ci transakcji W drugim kroku musimy zainicjalizowa wykorzystywany timer i systemprzerwa

LCD_Timer_init(ampTCD0)PMIC_CTRL|=PMIC_LOLVLEN_bm Odblokuj przerwania niskiego poziomusei()

Poniewa dost p do LCD z pewno ci nie jest czynno ci krytyczn czasowo prze-rwaniom timera nadano najni szy priorytet Dzi ki temu mo na innym bardziej kry-tycznym przerwaniom nada wy sze priorytety i uzyska w ten sposoacuteb zmniejszenieczasu latencji obs ugi przerwa Sama inicjalizacja timera jest niezwykle prosta

void LCD_Timer_init(TC0_t tc) tc-gtINTCTRLA=TC_OVFINTLVL_LO_gc Odblokuj przerwania nadmiaru timera i nadaj im niski priorytet tc-gtPER=F_CPULCD_ACCESSTIME Przerwanie co 4 us (niezale nie od F_CPU)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 67

Sprowadza si ona tylko do odblokowania mo liwo ci zg aszania przerwania nadmia-ru oraz konfiguracji rejestru PER tak aby przerwania by y generowane co ok 4 s mdashniezale nie od cz stotliwo ci taktowania CPU Mo emy wi c przyst pi do wy wie-tlenia pierwszego napisu

LCD_PutText(00 Numer)

Powy sza funkcja ma jedn wad mdash alokuje dynamicznie pami po ka dym wywo-aniu (pami ta jest automatycznie zwalniana po obs u eniu transakcji) niemniej

ca y proces jest czasoch onny Mo emy tego unikn alokuj c pami bdquor cznierdquo i wielo-krotnie wykorzystuj c zaalokowany blok pami ci Ilustruje to poni szy przyk ad

LCD_trans buf=malloc_re(sizeof(LCD_trans) + 7)

Zmienna buf wskazuje na obszar pami ci ktoacutery mo e pomie ci a cuch 5-znakowyTyle wystarczy na potrzeby tego przyk adu mdash na LCD b d wy wietlane kolejneliczby w zakresie 0 ndash 65 535 najd u sza ma 5 znakoacutew st d te nasz bufor ma tak a nieinn d ugo

while(1) utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(60 bufstr buf false) while(LCD_IsTransCompleted(buf))

Do konwersji liczby na a cuch u yto funkcji bibliotecznej utoa (nag oacutewek stdlibh)Poniewa d ugo a cucha po konwersji jest zmienna (co spowodowa oby pozosta-wianie na LCD bdquoduchoacutewrdquo po poprzednich konwersjach) w kolejnej linii brakuj ceznaki uzupe niono spacjami Nast pnie tworzona jest transakcja w obszarze pami ciprzydzielonym zmiennej buf Ostatnia p tla while jest odpowiedzialna za oczekiwa-nie na zako czenie realizacji transakcji Po jej zako czeniu p tla jest wykonywana odpocz tku

Uwa ny czytelnik z pewno ci zauwa y e pami przydzielana funkcj malloc_renie jest nigdzie zwalniana mdash w normalnej sytuacji spowodowa oby to wyciek pami -ci W naszym przyk adzie jednak program nigdy si nie ko czy nie ma wi c potrzebyzwalniania pami ci wskazywanej przez zmienn buf

Powy szy przyk ad pokazuje jak unikn blokowania CPU na czas dost pu do wolnodzia aj cego urz dzenia jakim jest LCD alfanumeryczny Jednak to nie wszystkiezalety wynikaj ce z zastosowania transakcji Drug wa n zalet naszego rozwi zaniailustruje przyk ad znajduj cy si w katalogu PrzykladyLCD-alfaLCD-transact-intPowa nym ograniczeniem funkcji odpowiedzialnych za dost p do LCD w sposoacutebklasyczny by a niemo no ich wywo ywania z funkcji obs ugi przerwa mdash funkcjeobs ugi LCD nie by y reentrant2 Nasz system oparty na transakcjach nie ma tychwad Aby to zilustrowa zosta stworzony prosty przyk ad mdash tak jak poprzedniow p tli g oacutewnej programu s wy wietlane stale kolejne liczby ale jednocze nie wyko-

2 Poza tym blokowa y CPU na d ugi czas a jak pami tamy funkcje obs ugi przerwa powinny by

wykonywane mo liwie kroacutetko

Kup książkę Poleć książkę

68 AVR Uk ady peryferyjne

rzystano drugi timer (TCD1) w ktoacuterego funkcji obs ugi przerwania przepe nienia jestwy wietlany licznik tych przerwa

ISR(TCD1_OVF_vect) static char int_buf[sizeof(LCD_trans) + 7] static uint16_t cnt char bufstr[6]

utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(61 bufstr (LCD_trans)ampint_buf false)

Jak widzimy w sposoacuteb asynchroniczny z dwoacutech miejsc w programie mo emy uzy-ska dost p do LCD a ka da funkcja bdquoma wra enierdquo e ma LCD na wy czno Przy okazji warto przeanalizowa sposoacuteb w jaki jest rezerwowana pami na trans-akcj w przerwaniu Oczywi cie mo na by wykorzysta dynamiczn alokacj pami cilecz jak wspomniano taka alokacja jest czasoch onna St d te w pokazanym przy-k adzie wykorzystano tablic statyczn int_buf o rozmiarze umo liwiaj cym prze-chowanie kompletnej transakcji Dzi ki temu e zmienna int_buf jest zmienn statycz-n nie jest ona niszczona po zako czeniu funkcji obs ugi przerwania Gdyby pomins owo kluczowe static zmienna ta by aby niszczona a na LCD najprawdopodobniejzacz yby si pojawia przypadkowe tre ci Poniewa pami naszego bufora nie by aalokowana dynamicznie nie mo e ona zosta zwolniona w naszym sterowniku LCDst d te ostatni parametr wywo ania funkcji LCD_PutText_B musi mie warto false

OptymalizacjaPrzy okazji tego i poprzedniego przyk adu warto zastanowi si jeszcze nad jednkwesti mdash optymalizacji W podanych przyk adach wykorzystano wcze niej omoacute-wione funkcje dost pu do wy wietlacza LCD znajduj ce si w plikach hd44780ci hd44780h Wi kszo z zawartych tam funkcji nie jest wykorzystywana jednakkompilator mimo wszystko umieszcza ich kod w pliku wynikowym mdash dzieje si takponiewa nie mo e on bdquostwierdzi rdquo czy funkcje te nie s wykorzystywane w innychfragmentach programu Pami tajmy e kompilator kompiluje poszczegoacutelne pliki roacute-d owe osobno i dana jego instancja nie bdquowierdquo co znajduje si w innych plikach (innychjednostkach kompilacji) Tak ca o ciow wiedz ma dopiero konsolidator (linker)ktoacutery czy stworzone przez kompilator pliki obiektowe (o rozszerzeniu o) w plikwynikowy Linker jednak bdquonie wierdquo ktoacutera z funkcji programu zosta a u yta a ktoacuteranie mdash informacje te ma wy cznie kompilator W ten sposoacuteb powstaje typowe b dneko o w efekcie nasze nieu ywane funkcje nie s usuwane (linker zostawia je bdquonawszelki wypadekrdquo) i zajmuj niepotrzebnie pami Czy mo na temu jako zaradzi Oczywi cie tak W tym celu trzeba po czy si y kompilatora i linkera co zapewniaj od-powiednie opcje kompilacji We w a ciwo ciach projektu (ProjectProperties lub Alt+F7)wybieramy zak adk Toolchain a nast pnie AVRGNU C Compiler i OptimizationZnajdziemy tam pole wyboru o nazwie Prepare functions for garbage collection (ry-sunek 224)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 69

Rysunek 224 Aby da linkerowi mo liwo usuwania nieu ywanych funkcji nale y skompilowaprogram z wybran opcj ndashffunction-sections ktoacutera spowoduje e ka da funkcja programu znajdzie siwe w asnej sekcji

Zaznaczenie tej funkcji spowoduje umieszczenie ka dej funkcji w osobnej sekcji mdashsamo w sobie nie wp ynie to na skroacutecenie kodu wynikowego ale jest warunkiem nie-zb dnym dla podj cia stosownych dzia a przez linker Aby wyeliminowa nieu y-wane funkcje nale y zaznaczy jeszcze w ga zi AVRGNU LinkerOptimization poleGarbage collect unused sections (rysunek 225)

Rysunek 225 Zaznaczenie opcji Garbage collect unused sections (-Wl--gc-sections) spowodujee nieu ywane funkcje zostan usuni te z kodu wynikowego w efekcie kod programu ulegnie skroacuteceniu

Po zaznaczeniu tych opcji program zostanie skroacutecony o kilkaset bajtoacutew Oczywi cieje li wszystkie funkcje by yby wykorzystane nie uzyskaliby my adnego skroacuteceniakodu Niemniej w sytuacji gdy u ywa si bibliotek zazwyczaj przynajmniej czfunkcji nie jest wykorzystywana warto wi c skorzysta z tej mo liwo ci optymalizacji

Kup książkę Poleć książkę

70 AVR Uk ady peryferyjne

Je li mamy do czynienia z prekompilowan bibliotek (lib) to musi ona by skom-pilowana z zaznaczon opcj Prepare functions for garbage collection (-ffunction-sections) Alternatyw jest umieszczenie ka dej funkcji biblioteki w osobnym pliku(tak jak w przypadku bibliotek AVR-libc)

Na ekranie wyboru opcji optymalizacji linkera mamy jeszcze jedn przydatn opcjmdash Relax Branches (-mrelax) Dla mikrokontroleroacutew ktoacutere maj ponad 8 kB pami ciFLASH instrukcje skokoacutew s generowane jako tzw instrukcje d ugie mdash umo liwiajone skok do komoacuterki pami ci FLASH o dowolnym adresie Jednak cen za to jestwyd u enie instrukcji mdash ich kod jest d u szy podobnie jak czas wykonania Nie zawszejednak takie d ugie instrukcje musz by wykonywane mdash je li miejsce docelowe skokule y blisko (w zasi gu instrukcji skokoacutew wzgl dnych) to mo na w kodzie wynikowymzamieni instrukcje d u sze na kroacutetsze co przynosi oszcz dno ci w postaci skroacuteceniakodu wynikowego Poniewa dopiero linker bdquowierdquo jak poszczegoacutelne fragmenty kodus rozmieszczone w pami ci takiej podmiany mo na dokona na etapie linkowaniaprogramu co zapewnia powy sza opcja St d te warto to pole wyboru zaznaczy

Kup książkę Poleć książkę

SkorowidzA

ABI Application Binary Interface 25AC Address Counter 50ADPCM 482adres

bazowy 377bufora 61komoacuterki 84pu apki 202

ALE Address Latch Enable 368alfanumeryczne wy wietlacze 43algorytm ADPCM 492algorytmy stratne 495animacje 57antyaliasing 325architektury procesoroacutew XMEGA 352asembler 23

dyrektywy 40funkcje j zyka C 41obs uga przerwa 39

asynchroniczne wywo anie funkcji 101Atmel Studio 15

Bbajty kalibracyjne 569biblioteka

FATFS 131 139 176 180 517libcallback-liba 99PetitFS 144 149

bitADC_CH0START_bm 236IMPMODE 244

bitrate 442 512blokowanie przerwa 219b d 16 19

kwantyzacji 463offsetu 230wzmocnienia ADC 230

BOD 223bps bits per second 12

budowakarty 152linii obrazu 394pami ci SDRAM 374pliku stymulacji 192ramki PAL 412sygna u PAL 411wtyczki 544 545

bufor 78FIFO 497na transakcje 61transakcji 62

buforowanie wyj cia 294

CCAS Column Address Strobe 375CCFL 44charakterystyka

przetwornikoacutew 222termistora 264tryboacutew pracy 232

CID Card Identification 169CKE Clock Enable 375CLKIN 421COG Chip on Glass 310CRC 158 178CRC16 178CRC7 164CS Chip Select 361 375CSD Card Specific Data 172czas

dost pu do SDRAM 424adowania kondensatora 244

propagacji 281proacutebkowania 260symulacji 209

czcionki 322cz stotliwo

odchylania pionowego 428proacutebkowania 244 441 444 530przebiegu 504

Kup książkę Poleć książkę

576 AVR Uk ady peryferyjne

cz stotliwoPWM 465taktowania koprocesora 549taktowania procesora 209taktowania rdzenia 18

czyszczenie pami ci 318

DDAC Digital to Analog Converter 293 447 451

buforowanie wyj cia 294generowanie przebiegoacutew 301jitter 303kalibracja 306napi cie referencyjne 295system zdarze 297taktowanie 296tryb dwukana owy 301wykorzystanie DMA 298wyzwalanie konwersji 305

datalogger 261 265 275DD Device Density 86debuger 183

programowy 190sprz towy 185 187

decymacja 259DEBUG 219XMEGA 260

definicja symboli globalnych 36definiowanie w asnych znakoacutew 56deklaracja zapowiadaj ca 103 337dekoder DTMF 548 556DMA 254 298 402 458 518 523dost p do

danych 358 359 568danych binarnych 356 360danych wielobajtowych 31DataFLASH 137EEPROM 128FAT 136komoacuterki 375LCD 59 62 66 68operandu 30pami ci 81 384 386 387 561pami ci SDRAM 424pliku blokowy 141portoacutew IO 30rejestroacutew IO procesora 36rejestroacutew uk adu 499SPI 95sygnatury u ytkownika 565 567wska nikoacutew 32

DQM Data Mask 375DSP Digital Signal Processor 535

DTMF 535 553dyktafon 529dynamiczna alokacja pami ci 516dyrektywa global 38dyrektywy asemblera 40dzia anie

DMA 255komparatora 280timeroacutew 400

d wi k 443

EEBI External Bus Interface 361EEPROM 207eliminacja jitteru 24emulacja RS232 139

FFAT File Allocation Table 128 131FAT32 128FATFS 180filtr

dolnoprzepustowy 491drugiego rz du 470pierwszego rz du 469trzeciego rz du 471

filtrowanie sygna u PWM 468firmware 565FLASH 207format

odpowiedzi 159polecenia 158protoko u 157

funkcja_delay_ms 17 219c_zero 42callback 106 341callback() 99DataFLASH_CSEnable 100DF_FinishBufWrite() 269disk_initialize 136disk_ioctl 181disk_status 136disk_write 138DMA_SPI_init 104DTMF_GetCode 553free_re 65GPIOR0_init 507hd44780_outcmd 51hd44780_outnibble_nowait 65LCD_defchar_P 57

Kup książkę Poleć książkę

Skorowidz 577

Menu_Click_Func 515Menu_Free 516Menu_Recorder 532Menu_Run 527MS_CreateRegEntry 117MS_GetDirPos 125MS_GetRegItem 115MS_WritePages 116 118OSC_wait_for_rdy 473RecMenu_StartStop 532sprintf 142strtok 124sysclk_init() 200 209TMF_memcpy_PF 454udi_cdc_getc() 123udi_cdc_is_rx_ready() 123VS1003_Reset 506

funkcjeanalizuj ce 556biblioteczne 50biblioteki FATFS 143j zyka C 41kontrolera ST7565R 313opoacute niaj ce 17opoacute nie 219reentrant 524specjalne kontrolera 319steruj ce 314zapisu 133

fusebit 557BODACT 560BODLEVEL 560BOOTRST 559DVSDON 560EESAVE 561JTAGEN 558RSTDISBL 559SUT 559TOSCSEL 559

fusebity w AVR-libc 571

Ggenerator obrazu composite 426generowanie

d wi ku 461kolorowego obrazu 437obrazu wideo 391przebiegoacutew 301przerwa 285sygna u composite 409

g bia koloru 326gniazdo

karty SD 156VGA 396

Hhistereza 281

IIDE 11IMA ADPCM 483informacje

o kolorze 431o obrazie 434

inicjalizacjakarty 161karty SDHC 167karty SDSC 167karty SDXC 167licznika 419pami ci 119USART 505

instrukcjaicall 42movw 35nop 13 24

interfejsSCI 498SDI 498SPI 71 79RS232 120UART 123USART 71 73

interpolacja 259interpolacja w XMEGA 260inwersja obrazu 319

Jjednostki 12jitter 24 303 420

Kkalibracja

ADC 229DAC 306 564offsetu 237

kana DMA 82 522karta 154 158

mikroSD 152SD 151 152SDHC 151 152 160SDSC 160SDXC 151 160

Kup książkę Poleć książkę

578 AVR Uk ady peryferyjne

karty pami ci 151 152 157biblioteka FATFS 180budowa 152format polecenia 158inicjalizacja 161 167komunikacja 156odczyt danych 173opcje konfiguracyjne 181rejestry specjalne 169tryby pracy 153zapis danych 176zasilanie 154

kodasemblerowy 23 24C 23dost pu 24

kodowanieμ-law 481ADPCM 483Dialogic ADPCM 494informacji 166 426koloru 425znakoacutew 536

kodyformatoacutew audio 501zdarze 545

kolejno bajtoacutew 533kolor 424 430kolorowy obraz 437komparator 422

analogowy 279 280analogowy XMEGA 282okienkowy 284

kompilacja plikoacutew binarnych 350kompilator avr-gcc 11 359kompresja

ADPCM 482 486d wi ku 480IMA ADPCM 482

komunikacja z koprocesorem 504konfiguracja

4-portowa 364biblioteki 133debugera 185DMA 459 522fusebitoacutew 570kontrolera DMA 257 452komparatoroacutew 285lockbitoacutew 570LPC 371pami ci SDRAM 381PetitFS 149pinu IO 225portoacutew IO 362

preskalera 452projektu 186przerwa 219pu apki 203rejestru EVCTRL 248rejestru PER 67SPI 75sygna u CS 377typu czcionki 324urz dze IO 189USART 76zegara 383

konsolidacja 547kontroler

DMA 254 298 402 458 518 523KS108 310ST7565R 310ndash315 321

konwersjaDAC 305sygna oacutew 396wyzwalana 306

konwertercyfrowo-analogowy 426DAC 427

koprocesormp3 496VS1003B 10

korekcja fazy 466kwantyzacja 463

Llampa CCFL 44LE Latch Enable 433licznik 419

cykli 209TCC1 400timera 20

linie IO 50linie sygna owe

MISO 72 164MOSI 72SCK 72SS 72

linker 69lista

mnemonikoacutew 24modyfikowanych rejestroacutew 32

lockbity 557 561lockbity w AVR-libc 570LPC Low Pin Count 371LPCM 443 556LSB Least Significant Bit 228

Kup książkę Poleć książkę

Skorowidz 579

a cuchy formatuj ce 212czenie plikoacutew 352

Mmagistrala pami ci zewn trznej 361magnetofon cyfrowy 528makro _SFR_IO_ADDR() 39makrodefinicja

ASSERT 214HD44780_CGADDR() 53HD44780_CLR 53HD44780_DDADDR() 53HD44780_DISPCTL() 52HD44780_ENTMODE() 52HD44780_FNSET() 52HD44780_HOME 53HD44780_SHIFT() 51LOCKBITS 571

mapowanie sygna oacutew 366mapy bitowe 343marker czasowy 268maski bitowe 329matryce 49menu 335menu piktogramowe 342mierniki temperatury 262mikrokontroler

ARM 9AVR 9PIC 9XMEGA128A3U 10

MISO 72moc wydzielana 265model psychoakustyczny 495modu

alfanumeryczny 45NVM 568Xmega eXploreGO 10Xplained ATXMEGA A3BU 10Xplained ATXMEGA-A1 10Xplained XMEGA128A1 447Xplained XMEGA256A3 94Xplained XMEGA256A3BU 97 143 266

modyfikator 30const 85volatile 28 273

monitory CRT 395monochromatyczne wy wietlacze graficzne 309monochromatyczny

tryb graficzny 416tryb tekstowy 413

MOSI 72mp3 495Msps Megasamples per second 12multiplekser wej ciowy 226 283multipleksowanie adresoacutew 368 369muzyka 439

Nnadawanie kodoacutew DTMF 540nadproacutebkowanie 258nag oacutewek kontenera wav 500nagrywanie mowy 486najmniej znacz cy bit 228napi cie

offsetu 280referencyjne 223 295zasilania 239

Oobracanie obrazu 319obraz 319

composite 426kolorowy 430wideo 391

obroacutebka d wi ku 443 445obs uga

FAT 131 143klawiatury matrycowej 24LCD 58 63 67menu 337przerwania 37 38 458przerwania DMA 525przerwa w asemblerze 39przyciskoacutew 272wy wietlaczy alfanumerycznych 45

odczytblokowy 140danych 173 358

odpowied response 159R1 159R2 159R7 160

od wie anie pami ci 376odtwarzanie

d wi ku 472muzyki 447 513 518 521

offset 238offset ADC 230okno

Breakpoints 202Call stack 209dezasemblera 210

Kup książkę Poleć książkę

580 AVR Uk ady peryferyjne

oknoIO View 207podgl du zmiennych 211wyboru czcionek 324

OLED 46opcje

kompilatora 35zapisu d wi ku 445

operacjena buforach 91odczytu 173zapisu 176zapisu strony 92

operand 29operator

ascii 41

asciz 41

byte 41

section 41opoacute nienia 13 18opoacute nienie zmienne 16optymalizacja 16 68optymalizator 26organizacja pami ci 77organizacja pami ci VRAM 316oscylator 287OSD On-Screen Display 417ostrze enie 16oszcz dzanie energii 94

Ppakiet WinAVR 48pami

CGRAM 56 57 64DataFLASH 10 77 81 113 269DDRAM 49EEPROM 111FLASH 54 124 207RAM 49SDRAM 372SRAM 63 124 329 366 371VRAM 314 317

PCLK 421PCM 443PetitFS 144 149p tla

for 13while 201

pierwsza linia obrazu 321piksel 430piktogram 342pin IO 225

plikAlloc_safeh 65DataFLASHc 83DataFLASHIOc 136definesh 50delayh 14diskioh 132 136ffh 132ffconfh 132 181hd44780h 49integerh 132ioh 30LCD_transc 61LCD-transactc 66Makefile 14Menuc 19nothingo 541outfiletxt 547 551pffh 149SPIh 104stringh 113stymulacji 191 192

pliki mp3 495elf 351fon 323o 24S 24 34binarne 350 355csv 276d wi kowe 440obiektowe 352wav 500WMA 512z czcionkami 327z danymi 349

podbijacz napi cia 315podgl d

pami ci 207stosu wywo a 209zmiennych 211znakoacutew 325

pod czeniefototranzystora 262karty SD 155LCD z kontrolerem 311modu u 50pami ci 362 369 370 373termistora 262uk adu LM35 251wyj XMEGA 398

pod wietlenieCCFL 46OLED 46

Kup książkę Poleć książkę

Skorowidz 581

podwoacutejne buforowanie 255 332 457polecenia

kasowania strony 81konfiguracyjne pami ci 82kontrolera ST7565R 315odczytu bufora 82 89odczytu pami ci 81 88SDRAM 376transferu 91

polecenieACMD41 168cd 181CID 178CMD0 165CMD8 167CSD 178date 276dir 127 181dump 276erase 276get 276HD44780_CLR 51Init 178mkdir 181

po czenieDMA ze SPI 96dwoacutech komparatoroacutew 285koprocesora mp3 497LCD z mikrokontrolerem 48wyj cia XMEGA 411XMEGA z PC 121z telewizorem 431

pomiarnapi cia zasilania 239temperatury MCU 241

port IO 30 362pozycjonowanie grafik 345poacute obraz 410precyzja pomiaroacutew 260preskaler 478preskaler ADC 243program

Atmel Data Visualizer 275Audacity 443avr-objcopy 350dataloggera 265LCD Image Converter 323makeloadingtableexe 543Realterm 127 554riffstrip 483SoX 445Tracepoint 208

programowanie sygnatury u ytkownika 566protokoacute master-slave 157

prototypy 136proacutebki d wi kowe 447proacutebkowanie

8-bitowe 300nieliniowe 480

prymitywy graficzne 330przebieg PWM 468przebiegi 289 303przechwytywanie danych 276przemiatanie wej 253przerwanie 218 254 286 403

DMA 522komparatora 286

przestrze adresowa procesora 378przesy anie

danych 498polece 498

przetaktowanie procesora 436przetwornik

ADC 221analogowo-cyfrowy 221cykliczny 222potokowy 222

przyciski 272pseudooperatory 41pu apki breakpoints 197pu apki warunkowe 205punkty ledzenia 203PWM 461 462 472

RRAS Row Address Strobe 375redukcja poboru energii 242regulacja kontrastu 321rejestr 32 34rejestr AC 50

adresu wtyczki 513BASEADDR 377CID 169CMP 251CSD 172czasu utworu 512DATA 83EVCTRL 248formatu audio 512identyfikacyjny pami ci 87INTFLAGS 252kontroli basoacutew 510kontroli g o no ci 513MUXCTRL 227OCR 168PER 67poroacutewnania 249

Kup książkę Poleć książkę

582 AVR Uk ady peryferyjne

rejestr ACSCI_CLOCKF 511stanu komparatora 287stanu pami ci 86stanu uk adu 510trybu pracy 508WINCTRL 285

rejestrydost pu do pami ci RAM 513GPIOR 502IO procesora 36mikrokontrolera 25procesora 35specjalne 94specjalne karty 169uk adu VS1003B 508

relacja rodzic ndash dziecko 336reset uk adu 534rozdzielczo

LCD 329przetwornika 231PWM 463 477

rozszerzenie HiRes 477 479roacutewnanie Steinharta-Harta 263rysowanie map bitowych 343

Sschemat uk adu dataloggera 267SCI Serial Command Interface 498SCK 72SD Secure Digital 152SDI Serial Data Interface 498separator synchronizacji 422separowanie impulsoacutew synchronizacji 422shieldy 10skaler 422skaler napi cia 283skrypt makefile 353s owo kluczowe

asm 27extern 37static 68

specyfikatory lokalizacji zmiennej 213sps samples per second 12SS Slave Select 72standard PAL 410standard VGA 393sterowanie

dataloggerem 275sygna em 379

sterownik 121HD44780 49 56LCD 49 62

stos wywo a 209

strukturaFATFS 139Handle 118LCD_trans 60 63menu 338rejestru 86SimpleFSEntry 113 116SimpleFSHandle 113 118 140submenu 527systemu plikoacutew 112

sumabitowa 571kontrolna 178

sygnacomposite 409composite video output 430CS 377DREQ 497H-Sync 396synchronizacji 423V-Sync 396zegarowy CLK 374

sygna yinterfejsu EBI 363magistrali EBI 364steruj ce 375

sygnaturaprodukcyjna procesora 563u ytkownika 565

symbol__DELAY_ROUND_CLOSEST__ 17__DELAY_ROUND_DOWN__ 17_FS_FAT12 149_FS_FAT32 149_FS_MINIMIZE 133_FS_READONLY 133_FS_RPATH 135_FS_TINY 133_MAX_SS 135_MULTI_PARTITION 135_USE_DIR 149_USE_FASTSEEK 134_USE_FORWARD 134_USE_LABEL 134_USE_LFN 134_USE_LSEEK 149_USE_MKFS 134_USE_READ 149_USE_STRFUNC 134_USE_WRITE 149_VOLUMES 136F_CPU 14 15 18increment 36USE_BUSY_FLAG 50

Kup książkę Poleć książkę

Skorowidz 583

symboleglobalne 36w asemblerze 28zewn trzne 39

symulacja 198 209symulator 190synchronizacja

pami ci 331pionowa 395pozioma 394

systemplikoacutew 111 128przerwa 404zdarze 245

szablonfont_XMEGAtmpl 326image_XMEGAtmpl 343

szum 463szybko przesy ania danych 126

ledzenie wi zki 333rodowisko

graficzne 11programistyczne 11VSIDE 542WinAVR 47

Ttabela FAT 130tablica

framebuf 402 408plugintbl 552 555tekst 208z kodem wynikowym 543

taktowanieDAC 296mikrokontrolera 473

technologia OLED 44temperatura mikrokontrolera 239 241termistor 262 290

NTC 263PTC 263

termometrLM35 249 250z alarmem 251

termostat 290test uk adu VS1003B 503testowanie obrazu 319timer 16 62

TCC0 20

TCC1 399transakcja 59 62 65transakcje 17 103ndash107transakcyjna obs uga LCD 58transakcyjny dost p do SPI 95transfer 91

danych 97wynikoacutew 254

transmisja 72 83tryb

bez znaku 234ci g ej konwersji 252czterobitowy 153dwukana owy 301graficzny 416graficzny VGA 407idle 419jednobitowy 153LPC 371monochromatyczny 397 407oszcz dzania energii 94 306pracy multipleksera 226pracy SPI 157roacute nicowy 232single slope 312SPI 153tekstowy 413tekstowy VGA 397z pojedynczym wej ciem 234ze znakiem 235

trybygenerowania PWM 467pracy karty 153pracy przetwornika 231pracy SPI 74pracy uk adu 508

twierdzenie Nyquista 258tworzenie

adresu 84nak adek 417obrazu 335tablicy 543

typ__uint24 119karty 160niekompletny 60wyliczeniowy 114

typyoperandoacutew 29w AVR 34

Kup książkę Poleć książkę

584 AVR Uk ady peryferyjne

Uuchwyt handle 64 113uk ad

AD725 427 431buforowy 294CS 361DAC 284dataloggera 267detekcji awarii zasilania 559generuj cy obraz 393HiRes 477ICL7660 47LM35 250 251SampH 293sterowania sygna em 379USART 401VS1003B 496 503 508 530 538 556VS100XX 529wzmacniania sygna u 227

uk ady peryferyjne 9uruchomienie komparatora 287urz dzenie

master 72slave 72

u rednianie 259utrata danych 141u ycie wstawki asemblerowej 33

VVGA 393

Wwarto ci kalibracyjne

ADC 564oscylatoroacutew 564temperatury 564

warunkowa kompilacja 36WE Write Enable 375wej cie composite video input 425wektor przerwa 38 257wideo 391wielko pami ci 86 377w czenie DAC 299wska nik na struktur 27wska niki 32wstawki asemblerowe 24 33wtyczka 535 541 544

SineDTMF Generator 537VGA 396

wyboacuter cz stotliwo ci PWM 465 474wykorzystanie

DMA 254 518

EuroSCART 428PWM 461rejestroacutew 34

wyliczanie predyktora 489wy wietlacze

alfanumeryczne 43 45graficzne 43 309LCD 43OLED 46

wy wietlanielitera u 213map bitowych 344obrazu 333 346 406obrazu VGA 393

wywo ania zwrotne callbacks 98asynchroniczne 101synchroniczne 101

wyzwalanie konwersji 245wzmacniacz 446wzmacniacz operacyjny 279wzmacnianie sygna u 227

XXMEGA 9 18

Zzapis

bufora 269danych 176d wi ku 440 556

zasilaniekarty 154pami ci 109

zatrzask 368zatrzask 74HC573 433zatrza ni cie adresu 369zdarzenia 297zdarzenie compare match 399zegar 383 420 426zintegrowane rodowisko programistyczne 11z cze EuroSCART 425 428 429zmiana

g o no ci 527wielko ci strony 94

znaki 56

roacuted onapi cia odniesienia 284sygna u 240

Kup książkę Poleć książkę

Page 5: Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8 AVR. Ukäady peryferyjne Rejestry dost pu do pami ci RAM .....513 Rejestr adresu

6 AVR Uk ady peryferyjne

Rozdzia 29 DAC 293Buforowanie wyj cia 294Napi cie referencyjne 295Taktowanie 296Zdarzenia 297Wykorzystanie DMA 298

Proacutebkowanie 8-bitowe 300Tryb dwukana owy 301Generowanie jednocze nie dwoacutech przebiegoacutew 301Wersja oszcz dna 304Inne sposoby wyzwalania konwersji 305

Tryb oszcz dzania energii 306Kalibracja DAC 306

Rozdzia 30 Monochromatyczne wy wietlacze graficzne 309Pod czenie LCD do mikrokontrolera 311Budowa i funkcje kontrolera ST7565R 313Funkcje specjalne kontrolera 319

Inwersja i testowanie obrazu 319Obracanie obrazu 319Regulacja kontrastu 321Numer pierwszej wy wietlanej linii 321

Czcionki 322Ma a optymalizacja 330Podwoacutejne buforowanie 332

Adres pocz tku wy wietlania obrazu 333Menu 335

Menu oparte na piktogramach 342

Rozdzia 31 Pliki z danymi mdash jak je dodawa do projektu 349Kompilacja plikoacutew binarnych 350

czenie plikoacutew obiektowych z projektem 352Dost p do danych binarnych 356

Klasyczny sposoacuteb dost pu do danych 358Dost p do danych z wykorzystaniem przestrzeni adresowych 359

Rozdzia 32 Magistrala pami ci zewn trznej 361Pod czenie pami ci 362

Konfiguracja portoacutew IO 362Przyporz dkowanie sygna oacutew interfejsu EBI do portoacutew IO 363Konfiguracja 4-portowa 364Pami SRAM 366Pami SRAM w trybie LPC 371Pami SDRAM 372

Konfiguracja sygna u CS 377Okre lenie adresu bazowego i wielko ci pami ci 377Uk ad sterowania sygna em wyboru w trybie SRAM 379Uk ad sterowania sygna em wyboru w trybie SDRAM 379

Przyk adowa konfiguracja pami ci SDRAM 381Konfiguracja zegara 383Dost p do pami ci z poziomu j zyka C 384

Dost p do pami ci poni ej granicy 64 kB 384Dost p do pami ci powy ej granicy 64 kB 386

Kup książkę Poleć książkę

Spis tre ci 7

Rozdzia 33 Generowanie obrazu wideo 391Generowanie obrazu wideo w standardzie VGA 393

Wtyczka VGA i konwersja sygna oacutew 396Monochromatyczny tryb tekstowy VGA 397Monochromatyczny tryb graficzny VGA 407

Generowanie sygna u composite 409Standard PAL 410Monochromatyczny tryb tekstowy 413Monochromatyczny tryb graficzny 416Tworzenie nak adek (OSD) 417

Czas na kolor 424Kodowanie koloru 425Konwerter cyfrowo-analogowy 426Generator obrazu composite 426Wykorzystanie EuroSCART 428Kolorowy obraz na TV 430

Rozdzia 34 Niech zagra muzyka 439Formaty plikoacutew d wi kowych 440

Cz stotliwo proacutebkowania 441Format pliku 442

Obroacutebka d wi ku 443Program Audacity 443Program SoX 445

Wzmacniacz 446Odtwarzamy muzyk z wykorzystaniem DAC 447

Inny sposoacuteb na podwoacutejne buforowanie 457Generowanie d wi ku z wykorzystaniem PWM 461

PWM mdash troch teorii 461Filtrowanie sygna u PWM 468Odtwarzamy d wi k za pomoc 8-bitowego PWM 472Rozszerzenie HiRes i PWM o wi kszej rozdzielczo ci 477

Kompresja d wi ku 480Proacutebkowanie nieliniowe 480Kompresja ADPCM 482Kompresja IMA ADPCM 482Nagrywanie mowy z wykorzystaniem kompresji ADPCM 486Algorytm ADPCM firmy Dialogic 492

Rozdzia 35 A mo e mp3 495Koprocesor mp3 496

Sposoby pod czenia do XMEGA 496Dost p do rejestroacutew uk adu 499Format pliku wav 500Rejestry GPIOR 502Testy uk adu 502Podstawowa komunikacja z koprocesorem 504Rejestry uk adu VS1003B 508

Rejestr trybu pracy 508Rejestr stanu uk adu 510Rejestr kontroli basoacutew 510Rejestr SCI_CLOCKF 511Rejestr czasu utworu 512Rejestr formatu audio 512

Kup książkę Poleć książkę

8 AVR Uk ady peryferyjne

Rejestry dost pu do pami ci RAM 513Rejestr adresu wtyczki 513Rejestr kontroli g o no ci 513

Odtwarzamy muzyk 513Odtwarzamy muzyk z wykorzystaniem DMA 518

Magnetofon cyfrowy 528VS100XX w roli magnetofonu 529

W asne wtyczki 535DTMF jako przyk ad w asnej wtyczki 535

Budujemy w asn wtyczk 541Tworzenie tablicy z kodem wynikowym 543Budowa wtyczki 544W asna aplikacja czyli dekoder DTMF 548

Rozdzia 36 Fusebity i lockbity 557Fusebity 558

Fusebit JTAGEN 558Fusebit RSTDISBL 559Fusebit BOOTRST 559Fusebity SUT 559Fusebit TOSCSEL 559Uk ad detekcji awarii zasilania 559Watchdog 560Fusebit EESAVE 561

Lockbity 561Sygnatura produkcyjna procesora 563

Numer serii 563Numer wafra 563Po o enie na wafrze 564Pozosta e bajty konfiguracyjne 564

Sygnatura u ytkownika 565Dost p do danych z poziomu aplikacji u ytkownika 568

Bajty kalibracyjne 569Konfiguracja fuse- i lockbitoacutew w AVR-libc 570

Lockbity w AVR-libc 570Fusebity w AVR-libc 571

Dodatek A Spis rozdzia oacutew ksi ki bdquoAVR Praktyczne projektyrdquo 573

Skorowidz 575

Kup książkę Poleć książkę

Rozdzia 22

Wy wietlacze LCDalfanumeryczne

Z tego rozdzia u dowiesz si

jak pod czy popularne wy wietlacze alfanumeryczne do XMEGA

jak stworzy bibliotek obs uguj c kontroler HD44780

jak przesy a polecenia dla LCD w formie transakcji i jak czy dost pdo kontrolera z aplikacji i funkcji obs ugi przerwa

Ze wzgl du na malej ce ceny zwi kszaj c si dost pno oraz niski poboacuter energiicoraz wi kszym zainteresowaniem ciesz si wy wietlacze LCD W tym rozdzialezostan omoacutewione wy wietlacze alfanumeryczne mdash ze uwagi na ich prostot s ci -gle najcz ciej stosowanymi typami wy wietlaczy W dalszej cz ci ksi ki zostanomoacutewione monochromatyczne wy wietlacze graficzne mdash daj one o wiele wi kszemo liwo ci ale ich sterowanie jest nieco bardziej skomplikowane Ze wzgl du na ko-nieczno przesy ania sporej liczby danych wymagaj tak e szybszego interfejsu -cz cego z mikrokontrolerem St d te zanim przejdziemy do ich praktycznego wyko-rzystania b dziemy musieli bli ej zapozna si z kilkoma uk adami peryferyjnymiXMEGA

Wy wietlacze LCD alfanumeryczne zawieraj zazwyczaj scalone kontrolery st d teprocesor nie steruje bezpo rednio matryc LCD ale komunikuje si z wyspecjalizo-wanym sterownikiem ktoacutery wykonuje jego polecenia Dlatego te wykorzystanie te-go typu wy wietlaczy wymaga znajomo ci typu u ytego w nich sterownika Wy wie-tlacze LCD mog by czone z mikrokontrolerem za pomoc roacute nych magistral mdashnajcz ciej s to magistrale SPI lub roacutewnoleg e (w wersji 4- 8- i 16-bitowej) Samewy wietlacze ze wzgl du na budow i mo liwo ci mo emy podzieli na dwie grupy

Wy wietlacze alfanumeryczne mdash umo liwiaj one wy wietlanie cyfr literi innych symboli Jednak w tym typie nie mamy mo liwo ci sterowaniaposzczegoacutelnymi pikselami

Wy wietlacze graficzne mdash w tym typie mo emy sterowa stanem ka dego piksela

Kup książkę Poleć książkę

44 AVR Uk ady peryferyjne

Aby wy wietlana na LCD zawarto by a widoczna niezb dne jest pod wietlenieKupuj c wy wietlacz musimy zwroacuteci uwag czy jest on wyposa ony w jakie pod-wietlenie (mo na dosta wy wietlacze LCD bez pod wietlenia) Oczywi cie lepiej

jest wybra wy wietlacz ktoacutery ma wbudowane pod wietlenie Samo pod wietleniemo e by wykonane w roacute ny sposoacuteb W starszych modelach spotyka si pod wietle-nie oparte na lampie CCFL (ang Cold Cathode Fluorescent Lamp) Tego typu wy-wietlacze s zwykle wi ksze ci sze ale przede wszystkim wymagaj specjalnej

przetwornicy do sterowania lamp Jej zadaniem jest generowanie wysokiego napi -cia niezb dnego do za wiecenia si lampy a nast pnie utrzymywanie go w granicachzapewniaj cych jej prawid owe dzia anie Wy wietlacze tego typu s wi c k opotliwew u ytkowaniu musimy wyda czasami sporo pieni dzy na odpowiedni przetworni-c a w dodatku trwa o takiej lampy jest kroacutetsza ni diod LED Wyst puj tak eproblemy ze sterowaniem jasno ci pod wietlenia W nowoczesnych wy wietlaczachLCD stosuje si praktycznie wy cznie pod wietlenie za pomoc diod LED Nie wy-magaj one adnych wyrafinowanych przetwornic do zasilania zwykle zadowalajsi napi ciem w granicach 3 ndash 12 V maj te znacznie wi ksz trwa o Jasno citakiego pod wietlenia z atwo ci mo na sterowa wykorzystuj c technik PWMPod wietlenie oparte na diodach LED mo e mie roacute ny kolor mdash bia y oacute ty zielonyniebieski czerwony Kolor mo emy sobie wi c dobra wg w asnych preferencji Naj-nowsze wy wietlacze alfanumeryczne s wykonywane w technologii OLED mdash w tejtechnologii wiec poszczegoacutelne piksele wi c taki wy wietlacz nie wymaga pod-wietlenia Niejako przy okazji zyskujemy znacznie lepsze czasy prze czania pikseli

mdash dla wy wietlaczy LCD szczegoacutelnie w ni szych temperaturach czas prze czaniawynosi kilkadziesi t do kilkuset milisekund co powoduje pojawienie si wyra nychbdquoduchoacutewrdquo i psuje estetyk Wy wietlacze OLED nie maj tej wady Jednak zazwyczajs dro sze

Je eli mo esz staraj si wybiera wy wietlacze LCD z pod wietleniem opartym nadiodach LED lub wykonane w technologii OLED

Kolejn istotn kwesti jest regulacja kontrastu Zwykle graficzne kolorowe LCD z wbu-dowanymi sterownikami automatycznie reguluj kontrast dodatkowo sterownik mazaimplementowane rejestry umo liwiaj ce wy cznie programow zmian kontrastuW przypadku prostszych sterownikoacutew wyst puj cych najcz ciej w wy wietlaczachmonochromatycznych (zaroacutewno alfanumerycznych jak i graficznych) kontrast re-guluje si podaj c odpowiednie napi cie na jeden z pinoacutew wy wietlacza Jest to nie-zwykle istotne gdy bez w a ciwego napi cia reguluj cego kontrast na wy wietlaczunic nie zobaczymy Mo emy w takiej sytuacji odnie b dne wra enie e wy wie-tlacz nie dzia a Z kolei je li kontrast b dzie zbyt du y wszystkie piksele b d w -czone co te mo e sugerowa b dne dzia anie LCD

Jedn z cz stszych przyczyn tego e po prawid owym pod czeniu wy wietlaczaLCD nic na nim nie wida albo wszystkie piksele s w czone jest nieprawid owenapi cie na pinie reguluj cym kontrast

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 45

Obs uga wy wietlaczyalfanumerycznych

Wy wietlacze alfanumeryczne s zbudowane z matryc pikseli zwykle o wielko ci5times8 pikseli pogrupowanych razem W tym typie wy wietlacza mo emy sterowazawarto ci tak utworzonej matrycy znakowej jednak nie ma mo liwo ci sterowaniaposzczegoacutelnymi pikselami Najcz ciej spotykane wy wietlacze tego rodzaju mogwy wietla 1times8 1times16 2times16 2times20 4times16 znakoacutew gdzie pierwszy wymiar okre laliczb wy wietlanych wierszy a drugi liczb znakoacutew w wierszu Poniewa nie steru-jemy poszczegoacutelnymi pikselami do kontrolera wysy amy tylko kod znaku ktoacutery mazosta wy wietlony na danej pozycji Kontroler na podstawie kodu znaku generujeadres do specjalnego obszaru pami ci tzw tablicy znakoacutew w ktoacuterej znajduje si bajtowareprezentacja poszczegoacutelnych pikseli tworz cych znak Dla matrycy 5times8 ma ona 40bitoacutew Tablica ta jest umieszczona w pami ci ROM kontrolera LCD nie mo emy jejwi c zmienia Zwykle jednak kontrolery udost pniaj mo liwo definicji kilku w a-snych znakoacutew dzi ki czemu mo emy zdefiniowa np znaki charakterystyczne dla j -zyka polskiego Takie podej cie do generowania obrazu ma podstawow zalet jakjest prostota i zwi zane z tym niewielkie zapotrzebowanie na pami RAM Do prze-chowania np zawarto ci 8-znakowego wy wietlacza LCD wystarczy zaledwie 8 bajtoacutewpami ci Ma to szczegoacutelne znaczenie w prostych mikrokontrolerach z niewielk ilo-ci pami ci RAM Najpopularniejszym kontrolerem stosowanym w wy wietlaczach

alfanumerycznych jest HD44780 nawet je li w posiadanym wy wietlaczu jest innykontroler to mamy du szans e jest on z nim kompatybilny Typowy rozk ad sy-gna oacutew modu oacutew opartych na tym kontrolerze pokazano w tabeli 221

Tabela 221 Typowy uk ad wyprowadze modu oacutew alfanumerycznych LCD opartych na kontrolerzeHD44780

Pin Nazwa Funkcja

1 GND Masa 2 Vcc Zasilanie (typowo 5 V) 3 Vee Regulacja kontrastu 4 RS Zapis polecenia 5 RW Strob odczytzapis 6 E Wyboacuter uk adu 7 D0 Bit danych 0 8 D1 Bit danych 1 9 D2 Bit danych 210 D3 Bit danych 311 D4 Bit danych 412 D5 Bit danych 513 D6 Bit danych 614 D7 Bit danych 715 A Pod wietlenie mdash anoda16 K Pod wietlenie mdash katoda

Kup książkę Poleć książkę

46 AVR Uk ady peryferyjne

Przed pod czeniem modu u zawsze upewnij si czy podany rozk ad odpowiadau ytemu modu owi W szczegoacutelno ci sprawd rozmieszczenie linii zasilaj cych Ichniew a ciwe pod czenie grozi uszkodzeniem modu u

Zwykle piny 15 i 16 steruj ce pod wietleniem s umieszczone osobno lub te przedpinem 1 St d te zawsze nale y je dok adnie zidentyfikowa przed pod czeniem mo-du u Do pinoacutew tych nale y pod czy napi cie wykorzystane do pod wietlenia modu uPrzy czone napi cie zale y od typu zastosowanego pod wietlenia mdash CCFL foliielektroluminescencyjnej lub diod LED W dalszej cz ci b dziemy zajmowa si modu-em z pod wietleniem LED W nocie katalogowej ka dego modu u znajduj si szcze-

goacute owe informacje dotycz ce zasilania pod wietlenia Zwykle w tym celu wymaganejest napi cie 5 V a nat enie pr du pod wietlenia wynosi 20 ndash 50 mA

Wy wietlacze LCD alfanumeryczne s dost pne w handlu w wersjach dostosowanychdo roacute nych napi zasilaj cych Typowo jest to napi cie 5 V co stwarza pewne pro-blemy przy pod czeniu takiego LCD do procesoroacutew rodziny XMEGA S one zasi-lane maksymalnym napi ciem 36 V nie ma wi c mo liwo ci aby LCD i procesordzia a y w tych samych domenach napi ciowych W efekcie przy po czeniu obu uk a-doacutew musimy zastosowa konwersj napi Poniewa LCD alfanumeryczny z perspek-tywy procesora jest urz dzeniem bardzo wolnym ca kowicie wystarczaj cym rozwi za-niem jest zastosowanie szeregowych rezystoroacutew ktoacutere wraz z wbudowanymi w procesordiodami zabezpieczaj cymi b d stanowi y uk ad obni aj cy napi cie na magistralikomunikacyjnej z 5 V do bezpiecznego dla wej cia XMEGA napi cia Z drugiej stronyjedynka logiczna generowana przez procesor zasilany napi ciem 33 V jest poprawnierozpoznawana przez LCD pracuj cy z napi ciem 5 V Je li procesor by by zasilanybardzo niskim napi ciem (rz du 18 ndash 28 V) wymagany by by bardziej skompliko-wany konwerter co zosta o szerzej omoacutewione w rozdziale 7 ksi ki AVR Praktyczneprojekty

Wy wietlacze LCD wymagaj pod wietlenia bez tego wy wietlana zawarto jestpraktycznie nieczytelna W starszych konstrukcjach wykorzystywano pod wietleniew oparciu o lampy fluorescencyjne lub folie elektroluminescencyjne jednak obecniedominuj cym typem jest pod wietlenie za pomoc diod LED

Poniewa zasilamy diod LED wymagane jest do czenie szeregowego rezystoraCzasami taki rezystor jest wbudowany w modu LCD

Pod wietlenie tego typu zu ywa spor ilo energii Innym rozwi zaniem jest kupnowy wietlacza wykonanego w technologii OLED (ang Organic Light-Emitting Diode)Wy wietlacze tego typu cechuj si zdecydowanie lepszym kontrastem ale tak e wi k-sz szybko ci prze czania w zwi zku z czym mo na za ich pomoc uzyska o wielelepsze efekty animacji ktoacutere s praktycznie nieosi galne dla klasycznych wy wietlaczyLCD Nie maj one tak e innej wady LCD mdash zale no ci szybko ci prze czania seg-mentoacutew od temperatury

Wy wietlacze OLED nie maj wyprowadzonych pinoacutew odpowiedzialnych za pod-wietlenie mdash po prostu go nie wymagaj

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 47

Kolejn istotn kwesti jest pod czenie w a ciwego napi cia reguluj cego kontrastwy wietlacza Dla wi kszo ci modu oacutew LCD mie ci si ono w przedziale GND ndash Vcca dla modu oacutew o rozszerzonym zakresie temperatury w przedziale od ndash7 do 0 V mdashrysunek 221

Rysunek 221Pod czenie napi ciareguluj cego kontrasta) modu y klasyczneb) modu y o rozszerzonymzakresie temperatur

Napi cie ujemne mo na uzyska z prostej pompy adunkowej sterowanej przebiegiemPWM z procesora Poboacuter pr du z tego wej cia jest znikomo ma y Alternatywniemo na u y uk adu ICL7660 ktoacutery mo e generowa napi cia ujemne

Kolejn decyzj jak musimy podj jest sposoacuteb pod czenia modu u LCD z mikro-kontrolerem Mamy do wyboru dwie opcje mdash albo pod czamy wszystkie 8 linii da-nych (D0 ndash D7) albo tylko 4 najstarsze (D4 ndash D7) Pod czaj c tylko 4 linie danychzmniejszamy liczb niezb dnych po cze modu u z mikrokontrolerem oraz liczbwykorzystanych linii IO Ze wzgl du na znikom ilo danych przesy anych zdo mo-du u wynikaj ce z pod czenia tylko 4 linii danych spowolnienie transmisji jest bezznaczenia W trybie 4-bitowym najpierw transferowana jest starsza a potem m od-sza tetrada Niewykorzystane linie D0 ndash D3 mo na pozostawi niepod czone wi k-szo modu oacutew wewn trznie podci ga niepod czone linie poprzez rezystor do Vcc

Poniewa linie D0 ndash D7 s dwukierunkowe musimy pami ta aby podczas operacjiodczytu z LCD odpowiednie piny mikrokontrolera by y ustawione jako wej cia W prze-ciwnym przypadku dojdzie do konfliktu

Kolejnym sygna em co do ktoacuterego musimy podj decyzj jest sygna RW okre laj cytyp operacji (odczytzapis) Poniewa zwykle zapisujemy dane do LCD w a ciwie niezachodzi konieczno ich odczytywania mo emy ten sygna na sta e po czy z mas oszcz dzaj c w ten sposoacuteb jedn lini IO procesora Takie rozwi zanie ma jednak po-wa n wad mdash po jego zastosowaniu nie jest mo liwe odczytywanie sygna u zaj to cimodu u (ang busy flag) Powoduje to e pomi dzy kolejnymi zapisami do modu u mu-simy stosowa opoacute nienia dobrane na najwolniejsz mo liw okoliczno W efekcieca a transmisja jest wolniejsza ni mog aby by

Je li korzystamy z tych modu oacutew nie musimy pisa w asnych procedur ich obs ugiInstaluj c rodowisko WinAVR (lub nowy toolchain firmy Atmel) w katalogu docavr-libcexamplessdtiodemo znajdziemy gotowe funkcje obs ugi HD44780 Funkcjete nie dzia aj z mikrokontrolerami XMEGA st d te w za czonych przyk adach zosta-y one zmodyfikowane tak aby poprawnie wspoacute pracowa roacutewnie z tymi mikro-kontrolerami

Kup książkę Poleć książkę

48 AVR Uk ady peryferyjne

Mo emy te skorzysta z licznych przyk adoacutew dost pnych w internecie W dalszejcz ci rozdzia u zostan wykorzystane funkcje z pakietu WinAVR napisane przezJoerga Wunscha Pokazane przyk ady zak adaj e wy wietlacz jest po czonyz mikrokontrolerem tak jak na rysunku 222

Rysunek 222 Po czenie LCD z mikrokontrolerem Na goacuterze pod czenie do mikrokontroleraXMEGA na dole pod czenie do modu u Xplained Na schematach pokazano tak e opcjonalne sposobypod czenia pinu Vee odpowiedzialnego za regulacj kontrastu LCD

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 49

Zanim co wy wietlimy na LCD musimy pozna w jaki sposoacuteb s generowane znakiSterownik LCD zawiera w sobie niezale nie od typu u ytej matrycy 80 bajtoacutew pami ciDDRAM (ang Display Data RAM) Je li zastosowana matryca wy wietla mniejszliczb znakoacutew to cz komoacuterek pami ci jest nieu ywana Mo emy je wykorzystado innych celoacutew mdash np jako zwyk pami RAM Mo emy te u y jej do przesu-wania napisoacutew ktoacutere nie mieszcz si na wy wietlaczu Aby mo na by o umie ciznak na w a ciwej pozycji niezb dne jest poznanie organizacji pami ci kontrolera W za-le no ci od u ytej matrycy pami ta jest zorganizowana nast puj co

Dla matryc 16times1 mdash pami jest podzielona na dwa obszary ka dy zawieraj cypo 8 znakoacutew Obszar pierwszy (od lewej) ma adresy 0x00 do 0x07 a obszar drugi(prawy) adresy 0x40 do 0x47 St d te gdy wy wietla si tekst przekraczaj cygranic obszaroacutew nale y zadba aby poszczegoacutelne litery trafi y pod w a ciweadresy

Dla matryc 20times1 mdash adresy 0x00 do 0x13

Dla matryc 16times2 mdash adres pierwszej linii zaczyna si od 0x00 do 0x0f adresdrugiej linii od 0x40 do 0x4f

Dla matryc 20times2 mdash adresy pierwszej linii to 0x00 do 0x13 a drugiej 0x40 do 0x53

Dla matryc 40times2 mdash adresy pierwszej linii to 0x00 do 0x27 drugiej linii 0x40do 0x67

Dla matryc 20times4 mdash adresy pierwszej linii to 0x00 do 0x13 drugiej 0x40 do 0x53trzeciej 0x14 do 0x27 a czwartej 0x54 do 0x67

Jak wida w niektoacuterych typach wy wietlaczy po ka dej linii zostaje od kilku do kil-kunastu bajtoacutew ktoacuterych zawarto nie jest wy wietlana Ma to pewn zalet mdash mo-emy do pami ci modu u wpisywa teksty d u sze ni s wy wietlane na ekranie co

u atwia przewijanie tekstu Niestety ma to te pewn wad mdash funkcje wy wietlaj ceco na ekranie musz bdquowiedzie rdquo jak organizacj ma matryca W przeciwnym przy-padku nie ma mo liwo ci prawid owego wyliczenia adresu komoacuterki do ktoacuterej ma od-by si zapis

W dalszej cz ci rozdzia u zostanie wykorzystany modu LCD o organizacji 16times2(ale mo na te bez problemu wykorzysta dowolny inny)

Zanim b dzie mo na co wy wietli na ekranie modu musi zosta zainicjalizowanyW trakcie inicjalizacji ustawiane s podstawowe parametry pracy sterownika LCD mdashorganizacja matrycy (liczba linii) wielko czcionki (5times8 lub 8times11 pikseli) Wielkoczcionki zale y od typu pod czonej matrycy LCD Dla konkretnego modu u LCDtylko jedna z tych warto ci b dzie poprawna Oproacutecz inicjalizacji modu u nale y tak-e poprawnie ustawi stan pinoacutew IO wykorzystywanych do pod czenia modu u LCD

Wi kszo pracy zwi zanej z inicjalizacj modu u LCD odbieraniem i wysy aniemdo niego danych wykonuje biblioteka Joerga Wunscha Dostarcza ona niskopozio-mowe funkcje umo liwiaj ce komunikacj ze sterownikiem hd44780 i innymi kom-patybilnymi z nim sterownikami Wystarczy e do aplikacji w ktoacuterej planujemy wy-korzysta taki modu do czymy plik hd44780c oraz plik nag oacutewkowy hd44780h

Kup książkę Poleć książkę

50 AVR Uk ady peryferyjne

Oba pliki bdquozak adaj rdquo e istnieje plik nag oacutewkowy definesh zawieraj cy podstawo-we definicje zwi zane ze sposobem pod czenia modu u LCD z mikrokontroleremNa pocz tku nale y okre li ktoacutere linie IO zosta y wykorzystane do pod czenia modu u

define HD44780_RS A 4define HD44780_RW A 5define HD44780_E A 6define HD44780_D4 A 0

W powy szym przyk adzie do kolejnych linii portu A (A4 ndash A6) zosta y pod czonesygna y RS RW i E modu u natomiast do linii A0 ndash A3 linie D4 ndash D7 modu u LCD Wa nejest aby linie danych czy z pinami IO w kolejno ci rosn cej Biblioteka wykorzy-stuje do transmisji danych pomi dzy modu em a mikrokontrolerem tylko 4 linie danychmdash dzi ki temu mo emy zmniejszy liczb po cze a zwolnione linie IO wykorzystado innych celoacutew W pliku wyst puje jeszcze jedna definicja

define USE_BUSY_BIT 1

Okre la ona e biblioteka b dzie u ywa flagi Busy modu u LCD mdash umo liwia touzyskanie optymalnej szybko ci wspoacute dzia ania z modu em Zako czenie realizacjibie cej operacji modu sygnalizuje zmian stanu tej flagi co umo liwia niezw ocznewys anie kolejnej komendy Je li nie u ywamy flagi Busy program musi generowamaksymalne zalecane w nocie katalogowej opoacute nienia w efekcie ca a transmisja zwal-nia Po zdefiniowaniu u ywanych pinoacutew w pliku definesh mo emy rozpocz korzy-stanie z biblioteki

W pliku hd44780h s udost pnione prototypy funkcji odpowiedzialnych za wspoacute -prac z modu em LCD

Funkcje bibliotecznePodstaw modu u stanowi dwie funkcje umo liwiaj ce odpowiednio wys anie da-nych do modu u oraz ich odczytanie

void hd44780_outbyte(uint8_t b uint8_t rs)uint8_t hd44780_inbyte(uint8_t rs)

Obie funkcje wysy aj odczytuj 8-bitow dan w przypadku wykorzystania tylko4-bitowej szyny danych wysy anie i odczytywanie danych odbywa si w dwoacutech etapachDodatkowo zmienna rs okre la tryb dost pu W przypadku wysy ania danych do modu urs = 0 powoduje e dane zostan wys ane do rejestru komend a je li rs = 1 dane trafido rejestru danych Przy odczycie jest podobnie z tym e dla rs = 0 jest odczytywanaflaga Busy i rejestr AC (ang Address Counter)

Kolejna funkcja odpowiada za oczekiwanie na gotowo modu uvoid hd44780_wait_ready(bool islong)

W przypadku gdy w pliku definesh symbol USE_BUSY_FLAG ma warto 1 parametrislong jest ignorowany a optymalizator kompilatora usuwa go gdy nie jest on wy-korzystywany przez funkcj Kiedy warto USE_BUSY_FLAG jest roacute na od 1 parametr

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 51

ten okre la d ugo opoacute nienia Je li jest roacute na od 0 opoacute nienie wynosi 152 ms a je-eli jest roacutewna 0 opoacute nienie wynosi 37 s Poniewa lepiej jest u ywa flagi Busy

mo emy ten parametr ignorowa

Powy sze trzy funkcje wystarcz do komunikacji z modu em dla wygody zdefiniowanojednak kolejne Funkcje hd44780_outcmd(n) i hd44780_incmd() umo liwiaj odpowiedniowys anie polecenia do rejestru komend kontrolera lub odczytanie bitu Busy i licznikaAC Dwie kolejne mdash hd44780_outdata(n) oraz hd44780_indata() mdash umo liwiaj zapisi odczytanie rejestru danych

Oproacutecz funkcji odpowiedzialnych za komunikacj z modu em LCD zdefiniowano tak efunkcj przeprowadzaj c podstawow inicjalizacj modu u hd44780_init(void) orazfunkcj hd44780_powerdown(void) ustawiaj c wszystkie linie u yte do komunikacjiw stan 0 co umo liwia bezpieczne od czenie zasilania od modu u LCD W przypadkupozostawienia ktoacuterej z wy ej wymienionych linii w stanie 1 przy od czonym za-silaniu modu u stanowi ona jego zasilanie W efekcie mimo wy czenia modu mo epobiera znaczny pr d

Szerszego omoacutewienia wymaga funkcja hd44780_outcmd(cmd) ktoacutera umo liwia wys a-nie polecenia do rejestru polece sterownika LCD Dla wygody zdefiniowane zosta yroacute ne komendy u atwiaj ce wspoacute prac z modu em LCD Komendy te s przekazy-wane jako argument wywo ania funkcji hd44780_outcmd np

hd44780_outcmd(HD44780_CLR)

powoduje wys anie do sterownika polecenia HD44780_CLR czyszcz cego zawartopami ci DDRAM kontrolera

KomendyFunkcja hd44780_outcmd przyjmuje jako argument predefiniowane makrodefinicjeznacznie u atwiaj ce wspoacute prac z kontrolerem modu u LCD Poni ej zostan onepokroacutetce omoacutewione

HD44780_SHIFT(shift right)Ta makrodefinicja powoduje przesuni cie pozycji wy wietlanego tekstu (shift = 1)o jedn pozycj w lewo (argument right = 0) lub w prawo (argument right = 1)W przypadku gdy shift = 0 przesuwany w lewo lub prawo jest tylko kursor Wysy-aj c wielokrotnie to polecenie uzyskujemy kolejne przesuni cia o jedn pozycj

w lewo lub prawo Polecenie to s u y g oacutewnie do przesuwania tekstu Jednak ze wzgl duna du bezw adno tekstowych modu oacutew LCD nie nale y przesuwa liter cz ciej niok raz na sekund mdash cz stsze przesuwanie daje bardzo nieprzyjemne efekty wizual-ne Ka dy bufor linii jest bdquozawijanyrdquo to znaczy e po ostatnim znaku z prawej jestwy wietlany pierwszy znak z lewej i odwrotnie Nale y pami ta e d ugo buforajest sta a dla danego modelu matrycy Np dla modu oacutew 16times2 bufor jednej linii wyno-si dok adnie 40 bajtoacutew z czego 16 jest jednorazowo wy wietlanych Poni szy kodcyklicznie przewija wy wietlany tekst w lewo

lcd_puttext_P(PSTR(Test bufora i przewijania tekstunTen tekst przewija sie w lewo))while(1)

Kup książkę Poleć książkę

52 AVR Uk ady peryferyjne

hd44780_outcmd(HD44780_SHIFT(10)) _delay_ms(700)

HD44780_FNSET(if8bit twoline font5x10)Polecenie to wybiera typ interfejsu mdash 8-bitowy je li warto parametru if8bit jestroacutewna 1 lub 4-bitowy je li jest roacutewna 0 Typ interfejsu musi odpowiada sposobowipo czenia modu u z mikrokontrolerem Parametr twoline okre la czy pod czonamatryca LCD ma jedn lini znakoacutew czy dwie Matryce ktoacutere maj 4 linie tekstu straktowane przez kontroler jako matryce dwuliniowe mdash parametr twoline powinienmie warto 1 Je li dla matrycy zawieraj cej dwie lub wi cej linii ustawimy go na 0to wy wietlana b dzie tylko jedna linia (w przypadku matryc dwuliniowych goacuterna)a w przypadku matryc 4-liniowych b d wy wietlane dwie linie rozdzielone lini pust

Ostatni parametr okre la typ u ywanego generatora znakoacutew Powinien on odpowiadau ytej w module matrycy zwykle wi c jego warto wynosi 0

HD44780_DISPCTL(disp cursor blink)Ustawia roacute ne parametry pracy matrycy Je li parametr disp ma warto 1 to matrycajest w czona (wy wietla zawarto DDRAM) a je li 0 to matryca jest wy czonalecz stan pami ci DDRAM nie ulega zmianie Np kod

while(1) hd44780_outcmd(HD44780_DISPCTL(011)) _delay_ms(700) hd44780_outcmd(HD44780_DISPCTL(111)) _delay_ms(700)

powoduje naprzemienne w czanie i wy czanie matrycy w efekcie wy wietlany tekstmruga

Parametr cursor okre la czy sprz towo wy wietlany kursor ma by widoczny (war-to parametru 1) czy niewidoczny (warto parametru 0) Je li kursor jest widocznyto dodatkowo mo emy okre li czy ma miga (warto parametru blink roacutewna 1)czy nie (blink = 0) Je li kursor jest widoczny i nie miga jest wy wietlany w postacipoziomej kreski Wy wietlanie kursora mo e by u yteczne w sytuacji kiedy u yt-kownik wprowadza jakie dane W pozosta ych sytuacjach kursor mo emy wy czy

HD44780_ENTMODE(inc shift)Okre la sposoacuteb wprowadzania danych do pami ci Je li parametr inc ma warto 1 topo ka dej operacji zapisuodczytu adres pami ci jest automatycznie zwi kszany o je-den co przy piesza operacj zapisuodczytu kolejnych znakoacutew Je li warto inc jestroacutewna 0 to adres jest automatycznie zmniejszany o 1 Dodatkowo parametr shiftokre la czy wy wietlany obraz ma by automatycznie przesuwany tak aby wy wie-tla ostatnio wprowadzony znak (shift = 1) lub go nie wy wietla (shift = 0)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 53

HD44780_CLRPowoduje wyczyszczenie (wype nienie znakami o kodzie 32) ca ej zawarto ci pami ciDDRAM Jednocze nie kursor wraca do pozycji pierwszej (pierwsza linia pierwszyznak)

Niewy wietlane bajty pami ci DDRAM tak e s kasowane Je li s one u ywanedo przechowywania zmiennych programu to przed operacj kasowania nale y jeskopiowa w bezpieczne miejsce W przeciwnym przypadku zostan utracone

Wska nik adresu do pami ci DDRAM jest ustawiany na 0 zerowane jest tak e prze-suni cie

HD44780_HOMEPowoduje powroacutet kursora do pozycji pocz tkowej mdash pierwsza linia pierwszy znakWska nik adresu do pami ci DDRAM w efekcie zawiera 0 zerowane jest roacutewnieprzesuni cie wy wietlania znakoacutew w efekcie s one wy wietlane od pozycji 0

HD44780_DDADDR(addr)Ustawia nast pny adres zapisuodczytu w pami ci DDRAM na addr Tylko 7 bitoacutewargumentu addr jest branych pod uwag w zwi zku z czym mo na zaadresowa mak-symalnie 128 bajtoacutew pami ci (z czego sterownik ma tylko 80 pozosta e lokacje snieu ywane)

HD44780_CGADDR(addr)Ustawia nast pn operacj odczytuzapisu w pami ci CGRAM na addr Pod uwagbranych jest tylko 6 bitoacutew zmiennej addr w efekcie mo na zaadresowa maksymalnie64 bajty pami ci CGRAM

Przedstawione powy ej funkcje zapewniaj jedynie podstawow komunikacj z mo-du em LCD Potrzebujemy jednak ci gle funkcji odpowiedzialnej za jego inicjalizacjmdash funkcja biblioteczna przeprowadza ten proces tylko w podstawowym zakresie musi-my jeszcze zadba o w a ciwe ustawienie parametroacutew zwi zane z posiadan matryc Napiszmy wi c w asne rozwini cie funkcji inicjalizacyjnej

void lcd_init() hd44780_init() Podstawowa inicjalizacja modu u hd44780_outcmd(HD44780_CLR) Wyczy pami DDRAM hd44780_wait_ready(1000) hd44780_outcmd(HD44780_ENTMODE(1 0)) Tryb autoinkrementacji AC hd44780_wait_ready(1000) hd44780_outcmd(HD44780_DISPCTL(1 0 0)) W cz wy wietlacz wy cz kursor hd44780_wait_ready(1000)

Zauwa e po wys aniu ka dego polecenia do modu u jest wywo ywana funkcjahd44780_wait_ready(1000) odpowiedzialna za oczekiwanie a realizacja wys anego po-lecenia dobiegnie ko ca Jest to niezb dne gdy do czasu uko czenia bie cej

Kup książkę Poleć książkę

54 AVR Uk ady peryferyjne

operacji dalsze polecenia s ignorowane Jako argument podany jest parametr 1000mdash jest on bez znaczenia nasza biblioteka korzysta z flagi Busy i po prostu go ignorujePo wykonaniu powy szej funkcji modu LCD jest poprawnie zainicjalizowany a jegopami jest wyczyszczona (zawiera bajty 0x20) i w efekcie modu nic nie wy wietlaOd tej chwili mo emy wysy a znaki do wy wietlenia

Po wykonaniu inicjalizacji ekran mo e pozosta czysty lub wy wietla ca kowiciewype nione kwadraty (wszystkie piksele w czone) Je li po inicjalizacji wszystkiepiksele s w czone nale y nieco zmniejszy kontrast

Aby sobie u atwi to zadanie zdefiniujmy funkcj wysy aj c do modu u jeden znakvoid lcd_putchar(char c) static bool second_nl_seen static uint8_t line=0

if ((second_nl_seen) ampamp (c = n)ampamp(line==0)) Odebrano pierwszy znak hd44780_wait_ready(40) hd44780_outcmd(HD44780_CLR) hd44780_wait_ready(1600) second_nl_seen=false if (c == n) if (line==0) line++ hd44780_outcmd(HD44780_DDADDR(64)) Adres pierwszego znaku drugiej linii hd44780_wait_ready(1000) else second_nl_seen=true line=0 else hd44780_outdata(c) hd44780_wait_ready(40)

Funkcja ta ze wzgl du na skomplikowane adresowanie pami ci DDRAM jest zale naod konkretnego modelu modu u LCD B dzie prawid owo wspoacute pracowa z modu a-mi 2times16 2times20 i 2times40 znakoacutew W przypadku innych modu oacutew pozycje niektoacuterychznakoacutew mog by nieprawid owe

Mo emy ju wy wietla na LCD pojedyncze znaki czas na wy wietlanie tekstu Po-niewa teksty jako sta e dla zaoszcz dzenia cennej pami ci RAM przechowuje si za-zwyczaj w pami ci FLASH zdefiniujmy funkcj odczytuj c podany a cuch zna-kowy z pami ci FLASH a nast pnie umieszczaj c go na LCD

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 55

void lcd_puttext_P(prog_char txt) char ch while((ch=pgm_read_byte(txt))) lcd_putchar(ch) txt++

Powy sza funkcja wysy a kolejne znaki odczytane z pami ci FLASH na LCD za po-moc funkcji LCD_putchar Po napotkaniu znaku ko ca a cucha (0 nul) przerywa swojedzia anie

Pozostaje nam przetestowa dzia anie przedstawionych funkcjiint main() lcd_init() lcd_puttext_P(PSTR(Test LCDnDruga linia)) while(1)

Na ekranie modu u LCD powinien wy wietli si napisTest LCDDruga linia

Je li na LCD nic nie widzimy to w pierwszej kolejno ci powinni my sprawdzi kon-trast zmieniaj c napi cie na pinie Vee modu u LCD

Warto zdefiniowa jeszcze funkcj ustawiaj c pozycj od ktoacuterej b dzie wy wietlanynast pny znak

void lcd_goto(uint8_t x uint8_t y) hd44780_outcmd(HD44780_DDADDR(0x40y+x)) hd44780_wait_ready(1000)

Funkcja ta przyjmuje dwa parametry x i y okre laj ce pozycj na ktoacuterej zostaniewy wietlony nast pny znak wys any z mikrokontrolera do modu u LCD Dzi ki temuz atwo ci mo emy uaktualnia zawarto LCD bez konieczno ci ponownego prze-sy ania wszystkich danych Funkcja ta jest zale na od typu zastosowanego modu u

Ostatni funkcj jest funkcja umo liwiaj ca czyszczenie zawarto ci pami ci modu uOdpowiedzialne za to jest proste polecenie wysy ane do sterownika

void lcd_cls() hd44780_outcmd(HD44780_CLR) hd44780_wait_ready(false)

Oproacutecz czyszczenia zawarto ci pami ci modu u powoduje ono ustawienie kursoraw punkcie (00)

Kup książkę Poleć książkę

56 AVR Uk ady peryferyjne

Definiowanie w asnych znakoacutewUk ad HD44780 jest wyposa ony w 64 bajty pami ci CGRAM (ang Character Ge-nerator RAM) ktoacutera mo e przechowywa mapy bitowe 8 znakoacutew o matrycy 5times8 pikselilub 4 znakoacutew o matrycy 5times10 pikseli Przyk ad definicji znaku na matrycy 5times8 poka-zano na rysunku 223

Rysunek 223Przyk ad definicji w asnego znakuw pami ci CGRAM Znak rysujemyna matrycy 5times8 bitoacutew polazaciemnione odpowiadaj warto ci 1pola bia e warto ci 0 Wartowyliczon dla ka dej linii pikseliwpisujemy do pami ci CGRAMsterownika Najstarsze 3 bity ka degobajta (pola szare) s bez znaczeniamdash wy wietlacz pomija jeprzy wy wietlaniu obrazu

1

2

3

4

5

6

7

0 00100 = 4

01110 = 14

11111 = 31

00100 = 4

00100 = 4

00100 = 4

11111 = 31

01110 = 14

Adres Warto

Dost p do tej pami ci jest mo liwy dzi ki wys aniu polecenia ustawiaj cego adreszapisuodczytu pami ci CGRAM Po jego wys aniu wszystkie operacje zapisu i od-czytu dotycz tej pami ci a nie pami ci DDRAM Aby wroacuteci do adresowania pa-mi ci DDRAM nale y wybra jej adres lub dokona operacji wymagaj cej przesu-ni cia kursora

Pami CGRAM jest pami ci ulotn po ponownym w czeniu zasilania definicjeznakoacutew musz by ponownie przes ane przez procesor

Bity o warto ci 1 w definicji znaku odpowiadaj w czonym pikselom bity o warto-ci 0 pikselom wy czonym Najstarsze 3 bity ka dego bajta w pami ci CGRAM s

bez znaczenia mdash te pozycje nie s wy wietlane przez matryc Definiuj c znak nale-y tak e pami ta e ostatnia linia wy wietlana przez matryc (w zale no ci od wiel-

ko ci matrycy znaku linia 8 lub 10) powinna zawiera same zera mdash w tej linii b dziewy wietlany kursor

Najcz ciej matryce LCD pod czone do sterownika HD44780 maj organizacj 5times8czyli jeden znak jest definiowany przez 8 kolejnych bajtoacutew okre laj cych stan po-szczegoacutelnych linii tworz cych znak Stwoacuterzmy funkcj ktoacuterej zadaniem b dzie za a-dowanie definicji znakoacutew z pami ci FLASH mikrokontrolera do pami ci CGRAM

void lcd_defchar_P(uint8_t charno prog_uint8_t chardef) hd44780_outcmd(HD44780_CGADDR(charno8)) hd44780_wait_ready(40) for(uint8_t c=0clt8c++) hd44780_outdata(pgm_read_byte(chardef))

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 57

hd44780_wait_ready(40) chardef++

Funkcja LCD_defchar_P jako argumenty przyjmuje numer definiowanego znaku (0 ndash 7)oraz wska nik do obszaru pami ci FLASH zawieraj cego definicj znaku (obszarten zajmuje 8 nast puj cych po sobie bajtoacutew) Jak widzimy funkcja najpierw ustawiaw a ciwy adres pod ktoacuterym znajdzie si pocz tek definicji znaku w pami ci CGRAMmdash poniewa jeden znak jest opisywany za pomoc 8 bajtoacutew kolejne adresy znakoacutewto kod_znakutimes8 Nast pnie dane opisuj ce znak s adowane z pami ci mikrokontrolerai zapisywane w pami ci CGRAM sterownika Poni szy program ilustruje wykorzy-stanie funkcji LCD_defchar_P

prog_uint8_t char1[8][8]=0000000255 00000025525500000255255255 0000255255255255 00025525525525525500255255255255255255 0255255255255255255255255255255255255255255255

int main() for(uint8_t x=0xlt8x++) lcd_defchar_P(xampchar1[x][0]) Za aduj wzorce znakoacutew lcd_init() for(uint8_t x=0xlt8x++) lcd_putchar(x) Wy wietl znaki o kodach 0 ndash 7 while(1)

W pierwszej linii funkcji main nast puje za adowanie nowych definicji znakoacutew dopami ci CGRAM nast pnie inicjalizowany jest wy wietlacz po czym w pierwszejlinii s wy wietlane znaki o kodach 0 ndash 7 a wi c znaki ktoacuterych definicja zosta aprzes ana z mikrokontrolera

Zauwa e pami CGRAM podobnie jak DDRAM mo emy zapisywa i odczytywaprzed inicjalizacj modu u LCD Proces inicjalizacji jest potrzebny tylko do prawi-d owego wy wietlania na ekranie LCD

Poniewa dane potrzebne do wy wietlenia znaku s na bie co pobierane z pami cipodczas od wie ania matrycy LCD jakiekolwiek zmiany w definicji znaku kiedy jest onwidoczny na LCD poci gaj za sob natychmiastowe zmiany w wy wietlanym obrazieMo na t w a ciwo sterownika wykorzysta do stworzenia prostych animacji

void lcd_box(uint8_t y) hd44780_outcmd(HD44780_CGADDR(0)) Zaczynamy od znaku o kodzie 0 hd44780_wait_ready(40) for(uint8_t c=0cltyc++) Stwoacuterz linie z w czonymi pikselami hd44780_outdata(0xFF) hd44780_wait_ready(40) for(uint8_t c=yclt8c++) Stwoacuterz linie z wy czonymi pikselami hd44780_outdata(0x00) hd44780_wait_ready(40)

Kup książkę Poleć książkę

58 AVR Uk ady peryferyjne

int main() lcd_init() lcd_putchar(0) while(1) for(uint8_t x=0xlt8x++) lcd_box(x) _delay_ms(100) for(int8_t x=7xgt=0x--) lcd_box(x) _delay_ms(100)

Funkcja main wy wietla na LCD tylko jeden znak o kodzie 0 a nast pnie cykliczniezmienia jego definicj w pami ci CGRAM W efekcie posta znaku wy wietlana naekranie ci gle si zmienia

Transakcyjna obs uga LCDPokazana do tej pory obs uga LCD alfanumerycznego mia a pewne wady Jak wiemyoperacje odwo uj ce si do kontrolera LCD s niezwykle wolne cykl odczytuzapisudowolnego rejestru kontrolera trwa co najmniej 1600 ns co dla MCU taktowanegozegarem 32 MHz przek ada si na czas wykonania oko o 52 instrukcji asemblera Cogorsza wi kszo komend realizowanych przez kontroler jest wykonywana w czasieoko o 37 s co przek ada si na tysi ce zmarnowanych taktoacutew MCU St d te jaki-kolwiek zapisodczyt LCD to z perspektywy programu straszne marnotrawstwo czasu

Problem ten dotyczy ka dego urz dzenia IO ktoacutere dzia a wolniej ni procesor W takiejsytuacji warto napisa pewn warstw po redni mdash sterownik mdash ktoacuterego zada-niem b dzie buforowanie da dost pu do urz dzenia i rozstrzyganie konfliktoacutewdzi ki czemu roacute ne cz ci programu b d bdquomia y wra enierdquo e maj wy czny do-st p do urz dzenia

Pokazane wcze niej funkcje obs ugi LCD maj jeszcze jedn wad mdash nie s wspoacute bie -ne czyli nie mo na ich wykonywa jednocze nie w kilku miejscach programu w tymw szczegoacutelno ci w programie g oacutewnym i w funkcjach obs ugi przerwa W wielu przy-padkach ta wada jest bez znaczenia jednak czasami jest uci liwa mdash dla przyk adugdy na wy wietlany tekst chcieliby my na o y inne informacje np o dacie lub godzi-nie Oczywi cie wy wietlanie mo na zorganizowa tak aby nie by o potrzeby pisaniawspoacute bie nego kodu np poprzez zastosowanie bufora pami ci VRAM kontrolera LCDRodzi to jednak kolejne problemy i jest ma o eleganckie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 59

Zastanoacutewmy si w jaki sposoacuteb najlepiej jednocze nie rozwi za problem wolnegodost pu do urz dzenia i wspoacute bie no ci kodu Rozwi zaniem mo e by wprowadze-nie tzw transakcji Transakcj nazywamy zbioacuter operacji tworz cych pewn ca-o To co wyroacute nia tak wykonywany zestaw operacji to atomowo spoacutejno

izolacja i trwa o Pod tymi terminami kryje si istota wykonywanej operacji Ato-mowo transakcji zapewnia e jest ona wykonywana w sposoacuteb niepodzielny co gwa-rantuje nam prawid ow wspoacute prac z danym urz dzeniem IO w tym przypadku kon-trolerem LCD Wa na dla nas jest tak e izolacja mdash dzi ki temu inne operacje na LCD(inne transakcje) nie b d mia y wp ywu na wynik aktualnie wykonywanej transakcjimdash nie b d zak oacuteca y jej wykonania z drugiej strony nasza transakcja nie zak oacuteciwykonania innych Trwa o z kolei zagwarantuje nam e je li sterownik potwierdziwykonanie transakcji to znaczy e efekt jej dzia ania jest wy wietlony na LCD Tacecha nie jest nam a tak potrzebna mdash jest ona wydawa oby si oczywista Niemniej jestto pewna gwarancja e ca a operacja przebieg a poprawnie i w efekcie LCD znajdujesi w okre lonym przez nas stanie Tyle teorii przejd my do praktyki

Kody poni szego przyk adu znajduj si w katalogu PrzykladyLCD-alfaLCD-transact

Aby zapewni transakcyjny dost p do LCD musimy stworzy pewne struktury danychktoacuterych zadaniem b dzie przechowywanie informacji o operacjach sk adaj cych sina transakcje i stanie ich wykonania W tym celu pos u ymy si wiadomo ciami z roz-dzia u 5 bdquoJak uporz dkowa chaos czyli z o one typy danych i listyrdquo Do przecho-wywania oczekuj cych transakcji pos u ymy si buforem pier cieniowym zanimjednak go zaimplementujemy zastanoacutewmy si jak powinna wygl da struktura prze-chowuj ca informacje o transakcji Struktura ta powinna zawiera co najmniej

pole danych (data) z informacjami ktoacutere maj by przes ane do kontrolera LCD

pole okre laj ce liczb danych do wys ania (len)

pole okre laj ce realizowane polecenie dla LCD (cmd) mdash pole to pos u yprogramowi sterownika do w a ciwej interpretacji danych znajduj cych siw polu data

kilka poacutel kontrolnych przechowuj cych informacje potrzebne do realizacjisamej transakcji Jedno z nich mdash Ready mdash b dzie przyjmowa warto trueje li dana transakcja zosta a zrealizowana lub false w przeciwnym przypadkuZnaczenie drugiego pola mdash SelfDel mdash mo e wydawa si nieco enigmatycznepole to okre la czy pami przydzielona dla transakcji ma by zwolnionaw sterowniku LCD (warto true) czy te zostanie zwolniona w programie(warto false)

Oto jak mo e wygl da struktura definiuj ca transakcj typedef struct volatile bool Ready 1 true je li transakcja zosta a zrealizowana bool SelfDel 1 true je li pami przydzielona transakcji ma zosta zwolniona LCD_Cmd cmd 2 Polecenie do zrealizowania uint8_t len 6 D ugo polecenia

Kup książkę Poleć książkę

60 AVR Uk ady peryferyjne

unsigned 0 Wyroacutewnanie do granicy bajta uint8_t data[] Dane transakcji LCD_trans

Nale y zwroacuteci uwag na poleunsigned 0

Nie definiuje ono adnego pola struktury ale jedynie informuje kompilator e kolejnepole (w naszym przyk adzie o nazwie data) ma by wyroacutewnane do granicy bajta mdashdzi ki temu dost p do kolejnego pola b dzie odbywa si szybciej Z kolei samo poledata jest zadeklarowane jako tzw typ niekompletny

Typ niekompletny (ang incomplete type) to typ ktoacuterego rozmiaru nie da si okre li

W pokazanym przyk adzie rozmiaru pola data nie da si okre li gdy zosta on za-deklarowany jako typ tablicowy z tym e nie podano wielko ci tablicy Wielko ci niepodano gdy na etapie deklaracji struktury nie wiemy jakiej wielko ci dane b d w niejprzechowywane Tego typu deklaracja ma bardzo powa ne konsekwencje mdash skorowielko ci pola data nie da si okre li to jaki b dzie wynik dzia ania operatora sizeof(LCD_trans) Kompilator stara si jako wybrn z tej sytuacji w zwi zku z czym

zwroacuteci wielko struktury ale tak jakby pole data w ogoacutele nie istnia o mdash jego roz-miar b dzie wynosi 0 W ramach wiczenia zastanoacutew si ile bajtoacutew pami ci b dziezajmowa a struktura LCD_trans

Skoro dysponujemy ju struktur przechowuj c poszczegoacutelne transakcje pora nastworzenie obiektu przechowuj cego kolekcj transakcji Dodanie kolejnej strukturyb dzie polega o na dodaniu jej do takiego obiektu z drugiej strony program sterownikaLCD b dzie moacuteg z tej kolekcji pobiera kolejne transakcje do realizacji Opis ten przy-pomina opis dzia ania bufora pier cieniowego mdash z jednym wyj tkiem mdash po zape nie-niu ca ego bufora nie b dziemy usuwa niezrealizowanych transakcji lecz zabloku-jemy dodawanie kolejnych W tym celu pos u ymy si definicj nast pnej struktury

typedef struct LCD_trans elements[LCD_MAXTRANS] Wska niki do transakcji uint8_t Beg Pierwszy element bufora uint8_t Count Liczba elementoacutew w buforze CircBuffer

Struktura ta zawiera deklaracj tablicy wska nikoacutew na transakcje (pole elements)Poniewa jest to tablica musimy zna liczb jej elementoacutew mdash jest ona zadeklarowanaw sta ej LCD_MAXTRANS

define LCD_MAXTRANS 10 Maksymalna liczba pami tanych transakcji

Do realizacji bufora s potrzebne jeszcze dwa pola Beg wskazuj ce na pierwsztransakcj w buforze oraz pole Count okre laj ce liczb transakcji znajduj cych siw buforze Je li Count == 0 to znaczy e w buforze nie ma adnych oczekuj cychtransakcji a je li Count == LCD_MAXTRANS to znaczy e bufor jest pe ny i nie mo na

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 61

dodawa do niego kolejnych transakcji W a ciwo t wykorzystuj dwie zdefiniowanew pliku LCD_transc funkcje

static inline bool cbIsFull(CircBuffer cb) return cb-gtCount == LCD_MAXTRANS

static inline bool cbIsEmpty(CircBuffer cb) return cb-gtCount == 0

Jak pami tamy w przypadku funkcji modyfikatory static inline powoduj e danafunkcja nie b dzie istnie jako samodzielna lecz w ka dym miejscu w ktoacuterym jestwywo ywana jest wstawiany raczej jej kod a nie wywo anie Ma to znaczenie dlakroacutetkich funkcji (a wi c takich jak pokazane powy ej) dla ktoacuterych koszty wywo anias zazwyczaj wi ksze ni koszty umieszczenia cia a funkcji w miejscu jej wywo aniaTego typu funkcje zachowuj si w sposoacuteb zbli ony do makrodefinicji (z tym e re-spektuj wszystkie regu y j zyka C w szczegoacutelno ci kolejno operatoroacutew czy kon-trol typoacutew)

Takie funkcje jako argument pobieraj adres bufora na ktoacuterym maj operowa W na-szym przypadku bufor jest zdefiniowany nast puj co

static CircBuffer LCD_TransBuffer Bufor na transakcje

Nale y zauwa y e jest on zdefiniowany jako struktura globalna z modyfikatoremstatic Modyfikator ten ogranicza zasi g widoczno ci zmiennej LCD_TransBuffer dopliku w ktoacuterym zmienna ta zosta a zdefiniowana (w tym przypadku modyfikator staticjest niejako przeciwie stwem modyfikatora extern) Dzia anie to ma jedynie znaczeniekosmetyczne mdash uniemo liwia odwo anie si do bufora za pomoc funkcji ktoacutere niezosta y zdefiniowane w miejscu jego definicji Oproacutecz funkcji umo liwiaj cych okre-lenie stanu bufora potrzebne s jeszcze funkcje umo liwiaj ce dodanie i pobranie trans-

akcji Pierwsz funkcj b dzie funkcja dodaj ca transakcj do buforabool cbAdd(CircBuffer cb LCD_trans elem) ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsFull(cb)) return false Czy jest miejsce w kolejce uint8_t end = (cb-gtBeg + cb-gtCount) LCD_MAXTRANS cb-gtelements[end] = elem Dodaj transakcj ++cb-gtCount Liczba elementoacutew w buforze return true Wszystko OK

Funkcja ta dodaje transakcj (zmienna elem) do bufora ko owego Zanim transakcjazostanie dodana sprawdzane jest czy w buforze jest miejsce mdash je li nie funkcjazwroacuteci false Je li dodanie jest mo liwe warto licznika okre laj cego liczb trans-akcji przechowywana w buforze (Count) zwi ksza si o jeden Warto zastanowi si te dlaczego praktycznie ca e cia o tej funkcji jest zamkni te w sekcji atomowej (ATOMIC_BLOCK) Jedn z cech naszego sterownika ma by mo liwo wspoacute bie nego dost pu

Kup książkę Poleć książkę

62 AVR Uk ady peryferyjne

do LCD mdash to znaczy e danie np zapisu do LCD mo e wyst pi zaroacutewno w g oacutewnejp tli programu jak i asynchronicznie w przerwaniu St d te wynika e funkcja do-daj ca transakcj musi by napisana w sposoacuteb zapewniaj cy jej poprawn prac w sytu-acji gdy zostanie ona przerwana i ponownie wywo ana przed zako czeniem dzia aniajej poprzedniej instancji Umieszczenie cia a tej funkcji w sekcji atomowej nam to za-pewnia mdash dzi ki temu bufor transakcji zawsze b dzie spoacutejny Dla zaspokojenia cie-kawo ci warto usun sekcj atomow i sprawdzi jak wtedy b dzie zachowywa si tafunkcja i jak wp ynie to na spoacutejno przechowywanych danych

Drug niezb dn funkcj jest funkcja odczytuj ca bufor transakcji i zwracaj ca trans-akcj do zrealizowania (lub NULL je li adnej transakcji nie ma w buforze)

LCD_trans cbRead(CircBuffer cb) LCD_trans elem ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsEmpty(cb)) return NULL Bufor pusty nie mo na zwroacuteci elementu elem = cb-gtelements[cb-gtBeg] cb-gtBeg = (cb-gtBeg + 1) LCD_MAXTRANS -- cb-gtCount Zmniejszamy liczb elementoacutew pozosta ych w buforze return elem

Funkcja ta jest bardzo podobna do poprzedniej mdash najpierw sprawdza czy bufor za-wiera jak oczekuj c transakcj (cbIsEmpty(cb)) je li tak to zwraca adres opisuj -cej j struktury i zmniejsza liczb transakcji oczekuj cych (pole Count) W ten sposoacutebmamy zrealizowan ca funkcjonalno zwi zan z obs ug bufora pier cieniowegoPokazane funkcje s uniwersalne i z bardzo podobnych (lub wr cz tych samych) b -dziemy korzysta w kolejnych rozdzia ach w kontek cie np obs ugi transakcji zwi -zanych z interfejsami szeregowymi

Pora przej do samego sterownika LCD Jego zadaniem b dzie sprawdzenie czyw buforze oczekuj jakie transakcje do realizacji a je li tak to ich wykonanie Ponie-wa dane do LCD mog by wysy ane co okre lony minimalny czas znacznie d u -szy ni czas jakiego na to zadanie potrzebuje mikrokontroler do wysy ania kolejnychpaczek danych pos u ymy si timerem Timer b dzie generowa przerwanie nadmiaru(TCD0_OVF_vect) ktoacutere b dzie wyznacza o tempo w jakim kolejne porcje danych b -d trafia y do LCD Z noty katalogowej kontrolera wynika e minimalny czas trwa-nia wysokiego stanu sygna u Enable to 230 ns a okres tego sygna u nie powinien bykroacutetszy ni 500 ns Poniewa nasz dost p do LCD odbywa si w sposoacuteb nieblokuj cyMCU wi c szybko wysy ania danych do LCD jest bez znaczenia St d te w poka-zanym przyk adzie przyj to e dane b d wysy ane co 4 s co okre la sta a

define LCD_ACCESSTIME 0000004

Poniewa komunikacja z LCD odbywa si w sposoacuteb nieblokuj cy nie zale y nam tena czasie (i tak w stosunku do czasu od wie ania samego LCD jest on bardzo kroacutetki)w efekcie nie ma potrzeby odczytywania flagi busy kontrolera Dzi ki temu w cz ciprzypadkoacutew mo emy w ogoacutele zrezygnowa z sygna u wyboru RW i wymusi jego sta y

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 63

poziom logiczny umo liwiaj cy zapis do LCD Dzi ki temu mo na zaoszcz dzi do-datkowy pin IO1

Ca a logika naszego sterownika jest zawarta w funkcji obs ugi przerwania przepe nieniatimera (TCD0_OVF_vect) Poniewa LCD jest po czony z MCU w trybie 4-bitowym(dla zaoszcz dzenia liczby wykorzystanych pinoacutew IO) kolejne 8-bitowe dane muszby podzielone na dwie tetrady i wys ane do LCD w kolejno ci starszam odsza tetradaInformacja o aktualnie wysy anych danych jest umieszczona w zmiennej trans o typie

static struct uint8_t pos 6 Pozycja w polu danych aktualnej transakcji uint8_t nibble 1 Ktoacutera tetrada jest wysy ana seq

Dlaczego tak Dzi ki wykorzystaniu struktury i poacutel bitowych mo na zaoszcz dzi je-den bajt pami ci SRAM Ze wzgl du na wielko pami ci obs ugiwanej przez kon-troler LCD mo emy by pewni e transakcje zawieraj ce wi cej ni 63 bajty s ra-czej nierealne (nie mia yby wi kszego sensu) St d te do przechowywania informacjio aktualnie wysy anym bajcie danych wystarczy 6 bitoacutew mdash tyle samo zosta o wyko-rzystanych do okre lenia d ugo ci pola danych transakcji w strukturze LCD_trans Zaosz-cz dzony bit mo na po wi ci na flag nibble okre laj c ktoacutera tetrada (m odszastarsza)jest wysy ana Bez poacutel bitowych flaga ta zaj aby dodatkowy bajt pami ci

Przejd my do implementacji sterownika Pierwsz rzecz jak nale y sprawdzi jestto czy w buforze czeka jaka transakcja do zrealizowania Odpowiedzialny za to jestfragment kodu obs ugi przerwania nadmiaru timera

if(trans == NULL) Nic do zrobienia sprawd my czy jaka transakcja oczekuje trans=cbRead(ampLCD_TransBuffer) Czy jest jaka oczekuj ca transakcja seqpos=0 seqnibble=0 if(trans == NULL) TCD0_CTRLA=TC_CLKSEL_OFF_gc Nie ma adnych transakcji mdash wy cz timer

W przypadku gdy adna transakcja nie oczekuje na realizacj timer jest wy czanymdash dzi ki temu nie b d zg aszane kolejne przerwania przepe nienia i MCU nie b -dzie traci czasu na ich obs ug Co prawda wynikaj cy z tego zysk czasowy jest mar-ginalny lecz ma to istotniejsz konsekwencj mdash w przypadku usypiania MCU zb d-ne przerwanie timera nie b dzie niepotrzebnie wybudza o procesora W takiej sytuacjiponowne w czenie timera nast pi dopiero w funkcji dodaj cej transakcj do kolejkimdash a wi c w sytuacji gdy mamy pewno e istnieje oczekuj ca transakcja

Druga cz funkcji obs ugi przerwania jest zwi zana z realizacj samej transakcjiW pokazanym przyk adzie zaimplementowano tylko jeden typ transakcji mdash daniezapisu a cucha tekstowego pod wskazany adres VRAM (na okre lonej pozycji LCD)Je li zajdzie taka potrzeba programista mo e zaimplementowa inne polecenia i doda

1 Warto zauwa y e w bdquoklasycznejrdquo obs udze LCD te nie musimy czyta stanu flagi busy zamiast tego

wystarczy wprowadza p tle opoacute niaj ce Jednak poniewa taka obs uga blokuje MCU nie jest onazalecana Wady tej nie ma dost p transakcyjny co jest jego dodatkow zalet

Kup książkę Poleć książkę

64 AVR Uk ady peryferyjne

kod odpowiedzialny za ich obs ug Zauwa my e ka da transakcja musi zawieraadres pocz tku pami ci wideo od ktoacuterego b dzie zapisywany tekst Dzieje si takdlatego e transakcja wykonana wcze niej mo e ustawi wska nik zapisu na dowolnejkomoacuterce pami ci W efekcie tekst z kolejnej transakcji by by wy wietlany od komoacuterkina ktoacuterej zako czy si zapis poprzedniej transakcji Takie dzia anie oczywi cie jestniedopuszczalne st d te ka dy zapis do pami ci wideo poprzedza ustawienie rejestruindeksowego Problem ten mo na rozwi za tak e w inny sposoacuteb mdash poprzez wpro-wadzenie tzw uchwytoacutew (ang handlers) ktoacutere zawiera yby stan kontrolera LCDNiemniej to rozwi zanie dodatkowo komplikowa oby nasz sterownik Struktura danych(zawartych w polu data) ma wi c nast puj cy format

bajt nr 0 zawiera warto pozycji od ktoacuterej nale y dokonywa zapisu pami ciwideo mdash jest to warto przesy ana do rejestru okre laj cego adres zapisu

kolejne bajty zawieraj a cuch znakowy ktoacutery nale y umie ci w pami ciCGRAM

Poniewa bajt nr 0 zawsze zawiera warto wpisywan do rejestroacutew steruj cych kon-trolera podczas jego wysy ania jest ustawiana linia RS sygnalizuj ca zapis do rejestruPodczas wysy ania kolejnych bajtoacutew linia ta jest zerowana w zwi zku z czym zapisodbywa si do pami ci CGRAM

Kod obs uguj cy transakcj wygl da nast puj coif(trans) Jest transakcja do zrealizowania uint8_t dat=trans-gtdata[seqpos] if(seqnibble == 0) datgtgt=4 To trzeba zmieni je li linie danych nie s po czone z pinami 0 ndash 3 portu IO hd44780_outnibble_nowait(dat amp 0x0F seqpos = 0) Zapisujemy rejestr steruj cy lub dane ++seqnibble if(seqnibble == 0) ++seqpos Co drug tetrad zwi kszamy pozycj bufora if(seqpos gt= trans-gtlen) trans-gtReady=true Koniec transakcji if(trans-gtSelfDel) free_re(trans) Zwolnij pami transakcji je li tak sobie yczy programista trans=NULL Koniec transakcji CLR(OUT HD44780_E)

Ta cz przerwania wysy a kolejne tetrady do kontrolera LCD Warto zastanowi sinad dzia aniem sekwencji

++seqnibble

Poniewa pole nibble jest jednobitowe operacja inkrementacji prowadzi do zmianystanu tego pola na przeciwny (pole to ma warto 0 lub 1) Kiedy zostan wys anewszystkie dane przeznaczone dla kontrolera obs uga transakcji ko czy si Stan tensygnalizuje nadanie warto ci true polu Ready struktury LCD_trans Dzi ki temu pro-gram mo e sprawdzi asynchronicznie w stosunku do przerwania kiedy transakcjauleg a zako czeniu Opcjonalnie jest wykonywana jeszcze jedna funkcja mdash je li poleSelfDel ma warto true to pami zarezerwowana na transakcj jest automatycznie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 65

zwalniana W tym celu wykorzystuje si funkcj free_re ktoacuterej prototyp jest zade-klarowany w pliku Alloc_safeh Funkcja ta wywo uje funkcj biblioteczn free ktoacute-ra zwalnia pami przydzielon dynamicznie na stercie Poniewa funkcja ta nie jestfunkcj reentrant nale y stworzy odpowiedni bdquoprotez rdquo opakowuj c j w blokatomowy co zapewnia e nie zostanie ona ponownie wywo ana zanim jej poprzed-nia instancja nie zako czy dzia ania Oczywi cie lepszym rozwi zaniem by oby napi-sanie w asnych funkcji dynamicznej alokacji pami ci ktoacutere b d reentrant

Bardzo wa ne jest aby pole SelfDel mia o warto true wy cznie dla transakcjidla ktoacuterych pami zosta a przydzielona dynamicznie funkcj malloc (lub jej po-chodnymi) W pozosta ych przypadkach pole to musi mie warto false mdash nie-stosowanie si do tej regu y spowoduje b d mened era pami ci i najprawdopo-dobniej nieprzewidywalne dzia anie programu

Drug wa n zasad jest aby zmienna zawieraj ca dane transakcji nie by azmienn automatyczn mdash zmienne takie s automatycznie niszczone po opusz-czeniu zawieraj cej je funkcji W rezultacie obszar pami ci zawieraj cy danetransakcji mo e zosta wykorzystany przez inne zmienne co spowoduje uszkodzeniezawartych w nim danych

Pami przydzielona transakcji musi by alokowana w sposoacuteb dynamiczny (funkcjamalloc_re) ewentualnie mo e to by pami alokowana dla zmiennej globalnej lubstatycznej mdash zmienne tego typu istniej przez ca y czas ycia programu

Warto te zauwa y e instrukcje steruj ce stanem linii Enable kontrolera LCD(SET(OUT HD44780_E) i CLR(OUT HD44780_E)) s rozdzielone wieloma innymi in-strukcjami Dzi ki temu generowany impuls dodatni tego sygna u ma czas trwania gt230 ns wymagany w specyfikacji kontrolera Nawet dla XMEGA taktowanej zegarem32 MHz 230 ns przek ada si na oko o 7 instrukcji asemblera mdash czas jaki z pewno-ci up ynie pomi dzy wykonaniem obu powy szych instrukcji steruj cych

Do wysy ania danych do kontrolera zosta a wykorzystana nieco zmodyfikowanafunkcja hd44780_outnibble_nowait roacute ni ca si od jej protoplasty hd44780_outnibbletylko tym e nie czeka na sygna braku zaj to ci mikrokontrolera (nie realizuje teopoacute nie ) Nie jest to potrzebne gdy kolejne tetrady s wysy ane w odst pach cza-sowych okre lanych przez timer

Mamy wi c zapewnion obs ug transakcji i mo liwo transakcyjnego wy wietlaniadanych na LCD musimy jeszcze mie funkcj ktoacutera tworzy odpowiednie transakcjemdash jest odpowiednikiem funkcji bezpo rednio wysy aj cej dane znakowe do LCDOdpowiednikiem tym jest pokazana poni ej funkcja

bool LCD_PutText_B(uint8_t x uint8_t y char txt LCD_trans buf bool autodel) buf-gtcmd=LCD_Text buf-gtReady=false buf-gtSelfDel=autodel Czy zwolni pami po zako czeniu transakcji buf-gtdata[0]=HD44780_DDADDR(x+y0x40) Ustaw adres w DDRAM strcpy((char)ampbuf-gtdata[1] txt) Skopiuj dane tekstowe + NULL

Kup książkę Poleć książkę

66 AVR Uk ady peryferyjne

buf-gtlen=strlen(txt) + 1 D ugo tekstu + pozycji + NULL ndash 1 bool ret=cbAdd(ampLCD_TransBuffer buf) if((ret==false) ampamp (autodel)) free_re(buf) Brak miejsca w kolejce else TCD0_CTRLA=TC_CLKSEL_DIV1_gc Preskaler 1 mdash odblokuj timer return ret

Funkcja ta buduje transakcj odpowiedzialn za wy wietlenie napisu txt na wskaza-nej pozycji x y LCD Wszystkie dane o transakcji zostan umieszczone w buforzew pami ci ktoacuterej adres jest okre lany wska nikiem buf Pami w buforze musi bywystarczaj co du a aby pomie ci ca transakcj Dodatkowy parametr autodel okre laczy pami ta ma by automatycznie zwalniana po obs u eniu transakcji (true) czynie (false) Je li transakcj uda o si umie ci w kolejce funkcja zwraca true Wartozauwa y e w takim przypadku funkcja uruchamia te timer (w naszym przypadkujest to timer TCD0) odpowiedzialny za generowanie przerwania Funkcja obs ugi prze-rwania wysy a dane do LCD

Pewn odmian powy szej funkcji jest funkcjabool LCD_PutText(uint8_t x uint8_t y char txt) LCD_trans trans=malloc_re(sizeof(LCD_trans) + strlen(txt) + 2) bool ret=LCD_PutText_B(x y txt trans true) return ret

Wykorzystuje ona funkcj LCD_PutText_B z tym e najpierw alokuje dynamiczniepami potrzebn na przechowanie tworzonej transakcji

Mamy komplet potrzebnych funkcji a wi c sprawd my jak ca o sprawdza siw praktyce W pliku LCD-transactc znajduje si kod pokazuj cy jak dzia aj naszetransakcje Aby to by o mo liwe nale y zainicjalizowa kontroler LCD

LCD_init()

Wykorzystujemy tu znan ju funkcj inicjalizuj c mdash nie ma potrzeby jej zmienia gdy operacja inicjalizacji LCD jest jednorazowa i nie trzeba wykonywa jej w posta-ci transakcji W drugim kroku musimy zainicjalizowa wykorzystywany timer i systemprzerwa

LCD_Timer_init(ampTCD0)PMIC_CTRL|=PMIC_LOLVLEN_bm Odblokuj przerwania niskiego poziomusei()

Poniewa dost p do LCD z pewno ci nie jest czynno ci krytyczn czasowo prze-rwaniom timera nadano najni szy priorytet Dzi ki temu mo na innym bardziej kry-tycznym przerwaniom nada wy sze priorytety i uzyska w ten sposoacuteb zmniejszenieczasu latencji obs ugi przerwa Sama inicjalizacja timera jest niezwykle prosta

void LCD_Timer_init(TC0_t tc) tc-gtINTCTRLA=TC_OVFINTLVL_LO_gc Odblokuj przerwania nadmiaru timera i nadaj im niski priorytet tc-gtPER=F_CPULCD_ACCESSTIME Przerwanie co 4 us (niezale nie od F_CPU)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 67

Sprowadza si ona tylko do odblokowania mo liwo ci zg aszania przerwania nadmia-ru oraz konfiguracji rejestru PER tak aby przerwania by y generowane co ok 4 s mdashniezale nie od cz stotliwo ci taktowania CPU Mo emy wi c przyst pi do wy wie-tlenia pierwszego napisu

LCD_PutText(00 Numer)

Powy sza funkcja ma jedn wad mdash alokuje dynamicznie pami po ka dym wywo-aniu (pami ta jest automatycznie zwalniana po obs u eniu transakcji) niemniej

ca y proces jest czasoch onny Mo emy tego unikn alokuj c pami bdquor cznierdquo i wielo-krotnie wykorzystuj c zaalokowany blok pami ci Ilustruje to poni szy przyk ad

LCD_trans buf=malloc_re(sizeof(LCD_trans) + 7)

Zmienna buf wskazuje na obszar pami ci ktoacutery mo e pomie ci a cuch 5-znakowyTyle wystarczy na potrzeby tego przyk adu mdash na LCD b d wy wietlane kolejneliczby w zakresie 0 ndash 65 535 najd u sza ma 5 znakoacutew st d te nasz bufor ma tak a nieinn d ugo

while(1) utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(60 bufstr buf false) while(LCD_IsTransCompleted(buf))

Do konwersji liczby na a cuch u yto funkcji bibliotecznej utoa (nag oacutewek stdlibh)Poniewa d ugo a cucha po konwersji jest zmienna (co spowodowa oby pozosta-wianie na LCD bdquoduchoacutewrdquo po poprzednich konwersjach) w kolejnej linii brakuj ceznaki uzupe niono spacjami Nast pnie tworzona jest transakcja w obszarze pami ciprzydzielonym zmiennej buf Ostatnia p tla while jest odpowiedzialna za oczekiwa-nie na zako czenie realizacji transakcji Po jej zako czeniu p tla jest wykonywana odpocz tku

Uwa ny czytelnik z pewno ci zauwa y e pami przydzielana funkcj malloc_renie jest nigdzie zwalniana mdash w normalnej sytuacji spowodowa oby to wyciek pami -ci W naszym przyk adzie jednak program nigdy si nie ko czy nie ma wi c potrzebyzwalniania pami ci wskazywanej przez zmienn buf

Powy szy przyk ad pokazuje jak unikn blokowania CPU na czas dost pu do wolnodzia aj cego urz dzenia jakim jest LCD alfanumeryczny Jednak to nie wszystkiezalety wynikaj ce z zastosowania transakcji Drug wa n zalet naszego rozwi zaniailustruje przyk ad znajduj cy si w katalogu PrzykladyLCD-alfaLCD-transact-intPowa nym ograniczeniem funkcji odpowiedzialnych za dost p do LCD w sposoacutebklasyczny by a niemo no ich wywo ywania z funkcji obs ugi przerwa mdash funkcjeobs ugi LCD nie by y reentrant2 Nasz system oparty na transakcjach nie ma tychwad Aby to zilustrowa zosta stworzony prosty przyk ad mdash tak jak poprzedniow p tli g oacutewnej programu s wy wietlane stale kolejne liczby ale jednocze nie wyko-

2 Poza tym blokowa y CPU na d ugi czas a jak pami tamy funkcje obs ugi przerwa powinny by

wykonywane mo liwie kroacutetko

Kup książkę Poleć książkę

68 AVR Uk ady peryferyjne

rzystano drugi timer (TCD1) w ktoacuterego funkcji obs ugi przerwania przepe nienia jestwy wietlany licznik tych przerwa

ISR(TCD1_OVF_vect) static char int_buf[sizeof(LCD_trans) + 7] static uint16_t cnt char bufstr[6]

utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(61 bufstr (LCD_trans)ampint_buf false)

Jak widzimy w sposoacuteb asynchroniczny z dwoacutech miejsc w programie mo emy uzy-ska dost p do LCD a ka da funkcja bdquoma wra enierdquo e ma LCD na wy czno Przy okazji warto przeanalizowa sposoacuteb w jaki jest rezerwowana pami na trans-akcj w przerwaniu Oczywi cie mo na by wykorzysta dynamiczn alokacj pami cilecz jak wspomniano taka alokacja jest czasoch onna St d te w pokazanym przy-k adzie wykorzystano tablic statyczn int_buf o rozmiarze umo liwiaj cym prze-chowanie kompletnej transakcji Dzi ki temu e zmienna int_buf jest zmienn statycz-n nie jest ona niszczona po zako czeniu funkcji obs ugi przerwania Gdyby pomins owo kluczowe static zmienna ta by aby niszczona a na LCD najprawdopodobniejzacz yby si pojawia przypadkowe tre ci Poniewa pami naszego bufora nie by aalokowana dynamicznie nie mo e ona zosta zwolniona w naszym sterowniku LCDst d te ostatni parametr wywo ania funkcji LCD_PutText_B musi mie warto false

OptymalizacjaPrzy okazji tego i poprzedniego przyk adu warto zastanowi si jeszcze nad jednkwesti mdash optymalizacji W podanych przyk adach wykorzystano wcze niej omoacute-wione funkcje dost pu do wy wietlacza LCD znajduj ce si w plikach hd44780ci hd44780h Wi kszo z zawartych tam funkcji nie jest wykorzystywana jednakkompilator mimo wszystko umieszcza ich kod w pliku wynikowym mdash dzieje si takponiewa nie mo e on bdquostwierdzi rdquo czy funkcje te nie s wykorzystywane w innychfragmentach programu Pami tajmy e kompilator kompiluje poszczegoacutelne pliki roacute-d owe osobno i dana jego instancja nie bdquowierdquo co znajduje si w innych plikach (innychjednostkach kompilacji) Tak ca o ciow wiedz ma dopiero konsolidator (linker)ktoacutery czy stworzone przez kompilator pliki obiektowe (o rozszerzeniu o) w plikwynikowy Linker jednak bdquonie wierdquo ktoacutera z funkcji programu zosta a u yta a ktoacuteranie mdash informacje te ma wy cznie kompilator W ten sposoacuteb powstaje typowe b dneko o w efekcie nasze nieu ywane funkcje nie s usuwane (linker zostawia je bdquonawszelki wypadekrdquo) i zajmuj niepotrzebnie pami Czy mo na temu jako zaradzi Oczywi cie tak W tym celu trzeba po czy si y kompilatora i linkera co zapewniaj od-powiednie opcje kompilacji We w a ciwo ciach projektu (ProjectProperties lub Alt+F7)wybieramy zak adk Toolchain a nast pnie AVRGNU C Compiler i OptimizationZnajdziemy tam pole wyboru o nazwie Prepare functions for garbage collection (ry-sunek 224)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 69

Rysunek 224 Aby da linkerowi mo liwo usuwania nieu ywanych funkcji nale y skompilowaprogram z wybran opcj ndashffunction-sections ktoacutera spowoduje e ka da funkcja programu znajdzie siwe w asnej sekcji

Zaznaczenie tej funkcji spowoduje umieszczenie ka dej funkcji w osobnej sekcji mdashsamo w sobie nie wp ynie to na skroacutecenie kodu wynikowego ale jest warunkiem nie-zb dnym dla podj cia stosownych dzia a przez linker Aby wyeliminowa nieu y-wane funkcje nale y zaznaczy jeszcze w ga zi AVRGNU LinkerOptimization poleGarbage collect unused sections (rysunek 225)

Rysunek 225 Zaznaczenie opcji Garbage collect unused sections (-Wl--gc-sections) spowodujee nieu ywane funkcje zostan usuni te z kodu wynikowego w efekcie kod programu ulegnie skroacuteceniu

Po zaznaczeniu tych opcji program zostanie skroacutecony o kilkaset bajtoacutew Oczywi cieje li wszystkie funkcje by yby wykorzystane nie uzyskaliby my adnego skroacuteceniakodu Niemniej w sytuacji gdy u ywa si bibliotek zazwyczaj przynajmniej czfunkcji nie jest wykorzystywana warto wi c skorzysta z tej mo liwo ci optymalizacji

Kup książkę Poleć książkę

70 AVR Uk ady peryferyjne

Je li mamy do czynienia z prekompilowan bibliotek (lib) to musi ona by skom-pilowana z zaznaczon opcj Prepare functions for garbage collection (-ffunction-sections) Alternatyw jest umieszczenie ka dej funkcji biblioteki w osobnym pliku(tak jak w przypadku bibliotek AVR-libc)

Na ekranie wyboru opcji optymalizacji linkera mamy jeszcze jedn przydatn opcjmdash Relax Branches (-mrelax) Dla mikrokontroleroacutew ktoacutere maj ponad 8 kB pami ciFLASH instrukcje skokoacutew s generowane jako tzw instrukcje d ugie mdash umo liwiajone skok do komoacuterki pami ci FLASH o dowolnym adresie Jednak cen za to jestwyd u enie instrukcji mdash ich kod jest d u szy podobnie jak czas wykonania Nie zawszejednak takie d ugie instrukcje musz by wykonywane mdash je li miejsce docelowe skokule y blisko (w zasi gu instrukcji skokoacutew wzgl dnych) to mo na w kodzie wynikowymzamieni instrukcje d u sze na kroacutetsze co przynosi oszcz dno ci w postaci skroacuteceniakodu wynikowego Poniewa dopiero linker bdquowierdquo jak poszczegoacutelne fragmenty kodus rozmieszczone w pami ci takiej podmiany mo na dokona na etapie linkowaniaprogramu co zapewnia powy sza opcja St d te warto to pole wyboru zaznaczy

Kup książkę Poleć książkę

SkorowidzA

ABI Application Binary Interface 25AC Address Counter 50ADPCM 482adres

bazowy 377bufora 61komoacuterki 84pu apki 202

ALE Address Latch Enable 368alfanumeryczne wy wietlacze 43algorytm ADPCM 492algorytmy stratne 495animacje 57antyaliasing 325architektury procesoroacutew XMEGA 352asembler 23

dyrektywy 40funkcje j zyka C 41obs uga przerwa 39

asynchroniczne wywo anie funkcji 101Atmel Studio 15

Bbajty kalibracyjne 569biblioteka

FATFS 131 139 176 180 517libcallback-liba 99PetitFS 144 149

bitADC_CH0START_bm 236IMPMODE 244

bitrate 442 512blokowanie przerwa 219b d 16 19

kwantyzacji 463offsetu 230wzmocnienia ADC 230

BOD 223bps bits per second 12

budowakarty 152linii obrazu 394pami ci SDRAM 374pliku stymulacji 192ramki PAL 412sygna u PAL 411wtyczki 544 545

bufor 78FIFO 497na transakcje 61transakcji 62

buforowanie wyj cia 294

CCAS Column Address Strobe 375CCFL 44charakterystyka

przetwornikoacutew 222termistora 264tryboacutew pracy 232

CID Card Identification 169CKE Clock Enable 375CLKIN 421COG Chip on Glass 310CRC 158 178CRC16 178CRC7 164CS Chip Select 361 375CSD Card Specific Data 172czas

dost pu do SDRAM 424adowania kondensatora 244

propagacji 281proacutebkowania 260symulacji 209

czcionki 322cz stotliwo

odchylania pionowego 428proacutebkowania 244 441 444 530przebiegu 504

Kup książkę Poleć książkę

576 AVR Uk ady peryferyjne

cz stotliwoPWM 465taktowania koprocesora 549taktowania procesora 209taktowania rdzenia 18

czyszczenie pami ci 318

DDAC Digital to Analog Converter 293 447 451

buforowanie wyj cia 294generowanie przebiegoacutew 301jitter 303kalibracja 306napi cie referencyjne 295system zdarze 297taktowanie 296tryb dwukana owy 301wykorzystanie DMA 298wyzwalanie konwersji 305

datalogger 261 265 275DD Device Density 86debuger 183

programowy 190sprz towy 185 187

decymacja 259DEBUG 219XMEGA 260

definicja symboli globalnych 36definiowanie w asnych znakoacutew 56deklaracja zapowiadaj ca 103 337dekoder DTMF 548 556DMA 254 298 402 458 518 523dost p do

danych 358 359 568danych binarnych 356 360danych wielobajtowych 31DataFLASH 137EEPROM 128FAT 136komoacuterki 375LCD 59 62 66 68operandu 30pami ci 81 384 386 387 561pami ci SDRAM 424pliku blokowy 141portoacutew IO 30rejestroacutew IO procesora 36rejestroacutew uk adu 499SPI 95sygnatury u ytkownika 565 567wska nikoacutew 32

DQM Data Mask 375DSP Digital Signal Processor 535

DTMF 535 553dyktafon 529dynamiczna alokacja pami ci 516dyrektywa global 38dyrektywy asemblera 40dzia anie

DMA 255komparatora 280timeroacutew 400

d wi k 443

EEBI External Bus Interface 361EEPROM 207eliminacja jitteru 24emulacja RS232 139

FFAT File Allocation Table 128 131FAT32 128FATFS 180filtr

dolnoprzepustowy 491drugiego rz du 470pierwszego rz du 469trzeciego rz du 471

filtrowanie sygna u PWM 468firmware 565FLASH 207format

odpowiedzi 159polecenia 158protoko u 157

funkcja_delay_ms 17 219c_zero 42callback 106 341callback() 99DataFLASH_CSEnable 100DF_FinishBufWrite() 269disk_initialize 136disk_ioctl 181disk_status 136disk_write 138DMA_SPI_init 104DTMF_GetCode 553free_re 65GPIOR0_init 507hd44780_outcmd 51hd44780_outnibble_nowait 65LCD_defchar_P 57

Kup książkę Poleć książkę

Skorowidz 577

Menu_Click_Func 515Menu_Free 516Menu_Recorder 532Menu_Run 527MS_CreateRegEntry 117MS_GetDirPos 125MS_GetRegItem 115MS_WritePages 116 118OSC_wait_for_rdy 473RecMenu_StartStop 532sprintf 142strtok 124sysclk_init() 200 209TMF_memcpy_PF 454udi_cdc_getc() 123udi_cdc_is_rx_ready() 123VS1003_Reset 506

funkcjeanalizuj ce 556biblioteczne 50biblioteki FATFS 143j zyka C 41kontrolera ST7565R 313opoacute niaj ce 17opoacute nie 219reentrant 524specjalne kontrolera 319steruj ce 314zapisu 133

fusebit 557BODACT 560BODLEVEL 560BOOTRST 559DVSDON 560EESAVE 561JTAGEN 558RSTDISBL 559SUT 559TOSCSEL 559

fusebity w AVR-libc 571

Ggenerator obrazu composite 426generowanie

d wi ku 461kolorowego obrazu 437obrazu wideo 391przebiegoacutew 301przerwa 285sygna u composite 409

g bia koloru 326gniazdo

karty SD 156VGA 396

Hhistereza 281

IIDE 11IMA ADPCM 483informacje

o kolorze 431o obrazie 434

inicjalizacjakarty 161karty SDHC 167karty SDSC 167karty SDXC 167licznika 419pami ci 119USART 505

instrukcjaicall 42movw 35nop 13 24

interfejsSCI 498SDI 498SPI 71 79RS232 120UART 123USART 71 73

interpolacja 259interpolacja w XMEGA 260inwersja obrazu 319

Jjednostki 12jitter 24 303 420

Kkalibracja

ADC 229DAC 306 564offsetu 237

kana DMA 82 522karta 154 158

mikroSD 152SD 151 152SDHC 151 152 160SDSC 160SDXC 151 160

Kup książkę Poleć książkę

578 AVR Uk ady peryferyjne

karty pami ci 151 152 157biblioteka FATFS 180budowa 152format polecenia 158inicjalizacja 161 167komunikacja 156odczyt danych 173opcje konfiguracyjne 181rejestry specjalne 169tryby pracy 153zapis danych 176zasilanie 154

kodasemblerowy 23 24C 23dost pu 24

kodowanieμ-law 481ADPCM 483Dialogic ADPCM 494informacji 166 426koloru 425znakoacutew 536

kodyformatoacutew audio 501zdarze 545

kolejno bajtoacutew 533kolor 424 430kolorowy obraz 437komparator 422

analogowy 279 280analogowy XMEGA 282okienkowy 284

kompilacja plikoacutew binarnych 350kompilator avr-gcc 11 359kompresja

ADPCM 482 486d wi ku 480IMA ADPCM 482

komunikacja z koprocesorem 504konfiguracja

4-portowa 364biblioteki 133debugera 185DMA 459 522fusebitoacutew 570kontrolera DMA 257 452komparatoroacutew 285lockbitoacutew 570LPC 371pami ci SDRAM 381PetitFS 149pinu IO 225portoacutew IO 362

preskalera 452projektu 186przerwa 219pu apki 203rejestru EVCTRL 248rejestru PER 67SPI 75sygna u CS 377typu czcionki 324urz dze IO 189USART 76zegara 383

konsolidacja 547kontroler

DMA 254 298 402 458 518 523KS108 310ST7565R 310ndash315 321

konwersjaDAC 305sygna oacutew 396wyzwalana 306

konwertercyfrowo-analogowy 426DAC 427

koprocesormp3 496VS1003B 10

korekcja fazy 466kwantyzacja 463

Llampa CCFL 44LE Latch Enable 433licznik 419

cykli 209TCC1 400timera 20

linie IO 50linie sygna owe

MISO 72 164MOSI 72SCK 72SS 72

linker 69lista

mnemonikoacutew 24modyfikowanych rejestroacutew 32

lockbity 557 561lockbity w AVR-libc 570LPC Low Pin Count 371LPCM 443 556LSB Least Significant Bit 228

Kup książkę Poleć książkę

Skorowidz 579

a cuchy formatuj ce 212czenie plikoacutew 352

Mmagistrala pami ci zewn trznej 361magnetofon cyfrowy 528makro _SFR_IO_ADDR() 39makrodefinicja

ASSERT 214HD44780_CGADDR() 53HD44780_CLR 53HD44780_DDADDR() 53HD44780_DISPCTL() 52HD44780_ENTMODE() 52HD44780_FNSET() 52HD44780_HOME 53HD44780_SHIFT() 51LOCKBITS 571

mapowanie sygna oacutew 366mapy bitowe 343marker czasowy 268maski bitowe 329matryce 49menu 335menu piktogramowe 342mierniki temperatury 262mikrokontroler

ARM 9AVR 9PIC 9XMEGA128A3U 10

MISO 72moc wydzielana 265model psychoakustyczny 495modu

alfanumeryczny 45NVM 568Xmega eXploreGO 10Xplained ATXMEGA A3BU 10Xplained ATXMEGA-A1 10Xplained XMEGA128A1 447Xplained XMEGA256A3 94Xplained XMEGA256A3BU 97 143 266

modyfikator 30const 85volatile 28 273

monitory CRT 395monochromatyczne wy wietlacze graficzne 309monochromatyczny

tryb graficzny 416tryb tekstowy 413

MOSI 72mp3 495Msps Megasamples per second 12multiplekser wej ciowy 226 283multipleksowanie adresoacutew 368 369muzyka 439

Nnadawanie kodoacutew DTMF 540nadproacutebkowanie 258nag oacutewek kontenera wav 500nagrywanie mowy 486najmniej znacz cy bit 228napi cie

offsetu 280referencyjne 223 295zasilania 239

Oobracanie obrazu 319obraz 319

composite 426kolorowy 430wideo 391

obroacutebka d wi ku 443 445obs uga

FAT 131 143klawiatury matrycowej 24LCD 58 63 67menu 337przerwania 37 38 458przerwania DMA 525przerwa w asemblerze 39przyciskoacutew 272wy wietlaczy alfanumerycznych 45

odczytblokowy 140danych 173 358

odpowied response 159R1 159R2 159R7 160

od wie anie pami ci 376odtwarzanie

d wi ku 472muzyki 447 513 518 521

offset 238offset ADC 230okno

Breakpoints 202Call stack 209dezasemblera 210

Kup książkę Poleć książkę

580 AVR Uk ady peryferyjne

oknoIO View 207podgl du zmiennych 211wyboru czcionek 324

OLED 46opcje

kompilatora 35zapisu d wi ku 445

operacjena buforach 91odczytu 173zapisu 176zapisu strony 92

operand 29operator

ascii 41

asciz 41

byte 41

section 41opoacute nienia 13 18opoacute nienie zmienne 16optymalizacja 16 68optymalizator 26organizacja pami ci 77organizacja pami ci VRAM 316oscylator 287OSD On-Screen Display 417ostrze enie 16oszcz dzanie energii 94

Ppakiet WinAVR 48pami

CGRAM 56 57 64DataFLASH 10 77 81 113 269DDRAM 49EEPROM 111FLASH 54 124 207RAM 49SDRAM 372SRAM 63 124 329 366 371VRAM 314 317

PCLK 421PCM 443PetitFS 144 149p tla

for 13while 201

pierwsza linia obrazu 321piksel 430piktogram 342pin IO 225

plikAlloc_safeh 65DataFLASHc 83DataFLASHIOc 136definesh 50delayh 14diskioh 132 136ffh 132ffconfh 132 181hd44780h 49integerh 132ioh 30LCD_transc 61LCD-transactc 66Makefile 14Menuc 19nothingo 541outfiletxt 547 551pffh 149SPIh 104stringh 113stymulacji 191 192

pliki mp3 495elf 351fon 323o 24S 24 34binarne 350 355csv 276d wi kowe 440obiektowe 352wav 500WMA 512z czcionkami 327z danymi 349

podbijacz napi cia 315podgl d

pami ci 207stosu wywo a 209zmiennych 211znakoacutew 325

pod czeniefototranzystora 262karty SD 155LCD z kontrolerem 311modu u 50pami ci 362 369 370 373termistora 262uk adu LM35 251wyj XMEGA 398

pod wietlenieCCFL 46OLED 46

Kup książkę Poleć książkę

Skorowidz 581

podwoacutejne buforowanie 255 332 457polecenia

kasowania strony 81konfiguracyjne pami ci 82kontrolera ST7565R 315odczytu bufora 82 89odczytu pami ci 81 88SDRAM 376transferu 91

polecenieACMD41 168cd 181CID 178CMD0 165CMD8 167CSD 178date 276dir 127 181dump 276erase 276get 276HD44780_CLR 51Init 178mkdir 181

po czenieDMA ze SPI 96dwoacutech komparatoroacutew 285koprocesora mp3 497LCD z mikrokontrolerem 48wyj cia XMEGA 411XMEGA z PC 121z telewizorem 431

pomiarnapi cia zasilania 239temperatury MCU 241

port IO 30 362pozycjonowanie grafik 345poacute obraz 410precyzja pomiaroacutew 260preskaler 478preskaler ADC 243program

Atmel Data Visualizer 275Audacity 443avr-objcopy 350dataloggera 265LCD Image Converter 323makeloadingtableexe 543Realterm 127 554riffstrip 483SoX 445Tracepoint 208

programowanie sygnatury u ytkownika 566protokoacute master-slave 157

prototypy 136proacutebki d wi kowe 447proacutebkowanie

8-bitowe 300nieliniowe 480

prymitywy graficzne 330przebieg PWM 468przebiegi 289 303przechwytywanie danych 276przemiatanie wej 253przerwanie 218 254 286 403

DMA 522komparatora 286

przestrze adresowa procesora 378przesy anie

danych 498polece 498

przetaktowanie procesora 436przetwornik

ADC 221analogowo-cyfrowy 221cykliczny 222potokowy 222

przyciski 272pseudooperatory 41pu apki breakpoints 197pu apki warunkowe 205punkty ledzenia 203PWM 461 462 472

RRAS Row Address Strobe 375redukcja poboru energii 242regulacja kontrastu 321rejestr 32 34rejestr AC 50

adresu wtyczki 513BASEADDR 377CID 169CMP 251CSD 172czasu utworu 512DATA 83EVCTRL 248formatu audio 512identyfikacyjny pami ci 87INTFLAGS 252kontroli basoacutew 510kontroli g o no ci 513MUXCTRL 227OCR 168PER 67poroacutewnania 249

Kup książkę Poleć książkę

582 AVR Uk ady peryferyjne

rejestr ACSCI_CLOCKF 511stanu komparatora 287stanu pami ci 86stanu uk adu 510trybu pracy 508WINCTRL 285

rejestrydost pu do pami ci RAM 513GPIOR 502IO procesora 36mikrokontrolera 25procesora 35specjalne 94specjalne karty 169uk adu VS1003B 508

relacja rodzic ndash dziecko 336reset uk adu 534rozdzielczo

LCD 329przetwornika 231PWM 463 477

rozszerzenie HiRes 477 479roacutewnanie Steinharta-Harta 263rysowanie map bitowych 343

Sschemat uk adu dataloggera 267SCI Serial Command Interface 498SCK 72SD Secure Digital 152SDI Serial Data Interface 498separator synchronizacji 422separowanie impulsoacutew synchronizacji 422shieldy 10skaler 422skaler napi cia 283skrypt makefile 353s owo kluczowe

asm 27extern 37static 68

specyfikatory lokalizacji zmiennej 213sps samples per second 12SS Slave Select 72standard PAL 410standard VGA 393sterowanie

dataloggerem 275sygna em 379

sterownik 121HD44780 49 56LCD 49 62

stos wywo a 209

strukturaFATFS 139Handle 118LCD_trans 60 63menu 338rejestru 86SimpleFSEntry 113 116SimpleFSHandle 113 118 140submenu 527systemu plikoacutew 112

sumabitowa 571kontrolna 178

sygnacomposite 409composite video output 430CS 377DREQ 497H-Sync 396synchronizacji 423V-Sync 396zegarowy CLK 374

sygna yinterfejsu EBI 363magistrali EBI 364steruj ce 375

sygnaturaprodukcyjna procesora 563u ytkownika 565

symbol__DELAY_ROUND_CLOSEST__ 17__DELAY_ROUND_DOWN__ 17_FS_FAT12 149_FS_FAT32 149_FS_MINIMIZE 133_FS_READONLY 133_FS_RPATH 135_FS_TINY 133_MAX_SS 135_MULTI_PARTITION 135_USE_DIR 149_USE_FASTSEEK 134_USE_FORWARD 134_USE_LABEL 134_USE_LFN 134_USE_LSEEK 149_USE_MKFS 134_USE_READ 149_USE_STRFUNC 134_USE_WRITE 149_VOLUMES 136F_CPU 14 15 18increment 36USE_BUSY_FLAG 50

Kup książkę Poleć książkę

Skorowidz 583

symboleglobalne 36w asemblerze 28zewn trzne 39

symulacja 198 209symulator 190synchronizacja

pami ci 331pionowa 395pozioma 394

systemplikoacutew 111 128przerwa 404zdarze 245

szablonfont_XMEGAtmpl 326image_XMEGAtmpl 343

szum 463szybko przesy ania danych 126

ledzenie wi zki 333rodowisko

graficzne 11programistyczne 11VSIDE 542WinAVR 47

Ttabela FAT 130tablica

framebuf 402 408plugintbl 552 555tekst 208z kodem wynikowym 543

taktowanieDAC 296mikrokontrolera 473

technologia OLED 44temperatura mikrokontrolera 239 241termistor 262 290

NTC 263PTC 263

termometrLM35 249 250z alarmem 251

termostat 290test uk adu VS1003B 503testowanie obrazu 319timer 16 62

TCC0 20

TCC1 399transakcja 59 62 65transakcje 17 103ndash107transakcyjna obs uga LCD 58transakcyjny dost p do SPI 95transfer 91

danych 97wynikoacutew 254

transmisja 72 83tryb

bez znaku 234ci g ej konwersji 252czterobitowy 153dwukana owy 301graficzny 416graficzny VGA 407idle 419jednobitowy 153LPC 371monochromatyczny 397 407oszcz dzania energii 94 306pracy multipleksera 226pracy SPI 157roacute nicowy 232single slope 312SPI 153tekstowy 413tekstowy VGA 397z pojedynczym wej ciem 234ze znakiem 235

trybygenerowania PWM 467pracy karty 153pracy przetwornika 231pracy SPI 74pracy uk adu 508

twierdzenie Nyquista 258tworzenie

adresu 84nak adek 417obrazu 335tablicy 543

typ__uint24 119karty 160niekompletny 60wyliczeniowy 114

typyoperandoacutew 29w AVR 34

Kup książkę Poleć książkę

584 AVR Uk ady peryferyjne

Uuchwyt handle 64 113uk ad

AD725 427 431buforowy 294CS 361DAC 284dataloggera 267detekcji awarii zasilania 559generuj cy obraz 393HiRes 477ICL7660 47LM35 250 251SampH 293sterowania sygna em 379USART 401VS1003B 496 503 508 530 538 556VS100XX 529wzmacniania sygna u 227

uk ady peryferyjne 9uruchomienie komparatora 287urz dzenie

master 72slave 72

u rednianie 259utrata danych 141u ycie wstawki asemblerowej 33

VVGA 393

Wwarto ci kalibracyjne

ADC 564oscylatoroacutew 564temperatury 564

warunkowa kompilacja 36WE Write Enable 375wej cie composite video input 425wektor przerwa 38 257wideo 391wielko pami ci 86 377w czenie DAC 299wska nik na struktur 27wska niki 32wstawki asemblerowe 24 33wtyczka 535 541 544

SineDTMF Generator 537VGA 396

wyboacuter cz stotliwo ci PWM 465 474wykorzystanie

DMA 254 518

EuroSCART 428PWM 461rejestroacutew 34

wyliczanie predyktora 489wy wietlacze

alfanumeryczne 43 45graficzne 43 309LCD 43OLED 46

wy wietlanielitera u 213map bitowych 344obrazu 333 346 406obrazu VGA 393

wywo ania zwrotne callbacks 98asynchroniczne 101synchroniczne 101

wyzwalanie konwersji 245wzmacniacz 446wzmacniacz operacyjny 279wzmacnianie sygna u 227

XXMEGA 9 18

Zzapis

bufora 269danych 176d wi ku 440 556

zasilaniekarty 154pami ci 109

zatrzask 368zatrzask 74HC573 433zatrza ni cie adresu 369zdarzenia 297zdarzenie compare match 399zegar 383 420 426zintegrowane rodowisko programistyczne 11z cze EuroSCART 425 428 429zmiana

g o no ci 527wielko ci strony 94

znaki 56

roacuted onapi cia odniesienia 284sygna u 240

Kup książkę Poleć książkę

Page 6: Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8 AVR. Ukäady peryferyjne Rejestry dost pu do pami ci RAM .....513 Rejestr adresu

Spis tre ci 7

Rozdzia 33 Generowanie obrazu wideo 391Generowanie obrazu wideo w standardzie VGA 393

Wtyczka VGA i konwersja sygna oacutew 396Monochromatyczny tryb tekstowy VGA 397Monochromatyczny tryb graficzny VGA 407

Generowanie sygna u composite 409Standard PAL 410Monochromatyczny tryb tekstowy 413Monochromatyczny tryb graficzny 416Tworzenie nak adek (OSD) 417

Czas na kolor 424Kodowanie koloru 425Konwerter cyfrowo-analogowy 426Generator obrazu composite 426Wykorzystanie EuroSCART 428Kolorowy obraz na TV 430

Rozdzia 34 Niech zagra muzyka 439Formaty plikoacutew d wi kowych 440

Cz stotliwo proacutebkowania 441Format pliku 442

Obroacutebka d wi ku 443Program Audacity 443Program SoX 445

Wzmacniacz 446Odtwarzamy muzyk z wykorzystaniem DAC 447

Inny sposoacuteb na podwoacutejne buforowanie 457Generowanie d wi ku z wykorzystaniem PWM 461

PWM mdash troch teorii 461Filtrowanie sygna u PWM 468Odtwarzamy d wi k za pomoc 8-bitowego PWM 472Rozszerzenie HiRes i PWM o wi kszej rozdzielczo ci 477

Kompresja d wi ku 480Proacutebkowanie nieliniowe 480Kompresja ADPCM 482Kompresja IMA ADPCM 482Nagrywanie mowy z wykorzystaniem kompresji ADPCM 486Algorytm ADPCM firmy Dialogic 492

Rozdzia 35 A mo e mp3 495Koprocesor mp3 496

Sposoby pod czenia do XMEGA 496Dost p do rejestroacutew uk adu 499Format pliku wav 500Rejestry GPIOR 502Testy uk adu 502Podstawowa komunikacja z koprocesorem 504Rejestry uk adu VS1003B 508

Rejestr trybu pracy 508Rejestr stanu uk adu 510Rejestr kontroli basoacutew 510Rejestr SCI_CLOCKF 511Rejestr czasu utworu 512Rejestr formatu audio 512

Kup książkę Poleć książkę

8 AVR Uk ady peryferyjne

Rejestry dost pu do pami ci RAM 513Rejestr adresu wtyczki 513Rejestr kontroli g o no ci 513

Odtwarzamy muzyk 513Odtwarzamy muzyk z wykorzystaniem DMA 518

Magnetofon cyfrowy 528VS100XX w roli magnetofonu 529

W asne wtyczki 535DTMF jako przyk ad w asnej wtyczki 535

Budujemy w asn wtyczk 541Tworzenie tablicy z kodem wynikowym 543Budowa wtyczki 544W asna aplikacja czyli dekoder DTMF 548

Rozdzia 36 Fusebity i lockbity 557Fusebity 558

Fusebit JTAGEN 558Fusebit RSTDISBL 559Fusebit BOOTRST 559Fusebity SUT 559Fusebit TOSCSEL 559Uk ad detekcji awarii zasilania 559Watchdog 560Fusebit EESAVE 561

Lockbity 561Sygnatura produkcyjna procesora 563

Numer serii 563Numer wafra 563Po o enie na wafrze 564Pozosta e bajty konfiguracyjne 564

Sygnatura u ytkownika 565Dost p do danych z poziomu aplikacji u ytkownika 568

Bajty kalibracyjne 569Konfiguracja fuse- i lockbitoacutew w AVR-libc 570

Lockbity w AVR-libc 570Fusebity w AVR-libc 571

Dodatek A Spis rozdzia oacutew ksi ki bdquoAVR Praktyczne projektyrdquo 573

Skorowidz 575

Kup książkę Poleć książkę

Rozdzia 22

Wy wietlacze LCDalfanumeryczne

Z tego rozdzia u dowiesz si

jak pod czy popularne wy wietlacze alfanumeryczne do XMEGA

jak stworzy bibliotek obs uguj c kontroler HD44780

jak przesy a polecenia dla LCD w formie transakcji i jak czy dost pdo kontrolera z aplikacji i funkcji obs ugi przerwa

Ze wzgl du na malej ce ceny zwi kszaj c si dost pno oraz niski poboacuter energiicoraz wi kszym zainteresowaniem ciesz si wy wietlacze LCD W tym rozdzialezostan omoacutewione wy wietlacze alfanumeryczne mdash ze uwagi na ich prostot s ci -gle najcz ciej stosowanymi typami wy wietlaczy W dalszej cz ci ksi ki zostanomoacutewione monochromatyczne wy wietlacze graficzne mdash daj one o wiele wi kszemo liwo ci ale ich sterowanie jest nieco bardziej skomplikowane Ze wzgl du na ko-nieczno przesy ania sporej liczby danych wymagaj tak e szybszego interfejsu -cz cego z mikrokontrolerem St d te zanim przejdziemy do ich praktycznego wyko-rzystania b dziemy musieli bli ej zapozna si z kilkoma uk adami peryferyjnymiXMEGA

Wy wietlacze LCD alfanumeryczne zawieraj zazwyczaj scalone kontrolery st d teprocesor nie steruje bezpo rednio matryc LCD ale komunikuje si z wyspecjalizo-wanym sterownikiem ktoacutery wykonuje jego polecenia Dlatego te wykorzystanie te-go typu wy wietlaczy wymaga znajomo ci typu u ytego w nich sterownika Wy wie-tlacze LCD mog by czone z mikrokontrolerem za pomoc roacute nych magistral mdashnajcz ciej s to magistrale SPI lub roacutewnoleg e (w wersji 4- 8- i 16-bitowej) Samewy wietlacze ze wzgl du na budow i mo liwo ci mo emy podzieli na dwie grupy

Wy wietlacze alfanumeryczne mdash umo liwiaj one wy wietlanie cyfr literi innych symboli Jednak w tym typie nie mamy mo liwo ci sterowaniaposzczegoacutelnymi pikselami

Wy wietlacze graficzne mdash w tym typie mo emy sterowa stanem ka dego piksela

Kup książkę Poleć książkę

44 AVR Uk ady peryferyjne

Aby wy wietlana na LCD zawarto by a widoczna niezb dne jest pod wietlenieKupuj c wy wietlacz musimy zwroacuteci uwag czy jest on wyposa ony w jakie pod-wietlenie (mo na dosta wy wietlacze LCD bez pod wietlenia) Oczywi cie lepiej

jest wybra wy wietlacz ktoacutery ma wbudowane pod wietlenie Samo pod wietleniemo e by wykonane w roacute ny sposoacuteb W starszych modelach spotyka si pod wietle-nie oparte na lampie CCFL (ang Cold Cathode Fluorescent Lamp) Tego typu wy-wietlacze s zwykle wi ksze ci sze ale przede wszystkim wymagaj specjalnej

przetwornicy do sterowania lamp Jej zadaniem jest generowanie wysokiego napi -cia niezb dnego do za wiecenia si lampy a nast pnie utrzymywanie go w granicachzapewniaj cych jej prawid owe dzia anie Wy wietlacze tego typu s wi c k opotliwew u ytkowaniu musimy wyda czasami sporo pieni dzy na odpowiedni przetworni-c a w dodatku trwa o takiej lampy jest kroacutetsza ni diod LED Wyst puj tak eproblemy ze sterowaniem jasno ci pod wietlenia W nowoczesnych wy wietlaczachLCD stosuje si praktycznie wy cznie pod wietlenie za pomoc diod LED Nie wy-magaj one adnych wyrafinowanych przetwornic do zasilania zwykle zadowalajsi napi ciem w granicach 3 ndash 12 V maj te znacznie wi ksz trwa o Jasno citakiego pod wietlenia z atwo ci mo na sterowa wykorzystuj c technik PWMPod wietlenie oparte na diodach LED mo e mie roacute ny kolor mdash bia y oacute ty zielonyniebieski czerwony Kolor mo emy sobie wi c dobra wg w asnych preferencji Naj-nowsze wy wietlacze alfanumeryczne s wykonywane w technologii OLED mdash w tejtechnologii wiec poszczegoacutelne piksele wi c taki wy wietlacz nie wymaga pod-wietlenia Niejako przy okazji zyskujemy znacznie lepsze czasy prze czania pikseli

mdash dla wy wietlaczy LCD szczegoacutelnie w ni szych temperaturach czas prze czaniawynosi kilkadziesi t do kilkuset milisekund co powoduje pojawienie si wyra nychbdquoduchoacutewrdquo i psuje estetyk Wy wietlacze OLED nie maj tej wady Jednak zazwyczajs dro sze

Je eli mo esz staraj si wybiera wy wietlacze LCD z pod wietleniem opartym nadiodach LED lub wykonane w technologii OLED

Kolejn istotn kwesti jest regulacja kontrastu Zwykle graficzne kolorowe LCD z wbu-dowanymi sterownikami automatycznie reguluj kontrast dodatkowo sterownik mazaimplementowane rejestry umo liwiaj ce wy cznie programow zmian kontrastuW przypadku prostszych sterownikoacutew wyst puj cych najcz ciej w wy wietlaczachmonochromatycznych (zaroacutewno alfanumerycznych jak i graficznych) kontrast re-guluje si podaj c odpowiednie napi cie na jeden z pinoacutew wy wietlacza Jest to nie-zwykle istotne gdy bez w a ciwego napi cia reguluj cego kontrast na wy wietlaczunic nie zobaczymy Mo emy w takiej sytuacji odnie b dne wra enie e wy wie-tlacz nie dzia a Z kolei je li kontrast b dzie zbyt du y wszystkie piksele b d w -czone co te mo e sugerowa b dne dzia anie LCD

Jedn z cz stszych przyczyn tego e po prawid owym pod czeniu wy wietlaczaLCD nic na nim nie wida albo wszystkie piksele s w czone jest nieprawid owenapi cie na pinie reguluj cym kontrast

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 45

Obs uga wy wietlaczyalfanumerycznych

Wy wietlacze alfanumeryczne s zbudowane z matryc pikseli zwykle o wielko ci5times8 pikseli pogrupowanych razem W tym typie wy wietlacza mo emy sterowazawarto ci tak utworzonej matrycy znakowej jednak nie ma mo liwo ci sterowaniaposzczegoacutelnymi pikselami Najcz ciej spotykane wy wietlacze tego rodzaju mogwy wietla 1times8 1times16 2times16 2times20 4times16 znakoacutew gdzie pierwszy wymiar okre laliczb wy wietlanych wierszy a drugi liczb znakoacutew w wierszu Poniewa nie steru-jemy poszczegoacutelnymi pikselami do kontrolera wysy amy tylko kod znaku ktoacutery mazosta wy wietlony na danej pozycji Kontroler na podstawie kodu znaku generujeadres do specjalnego obszaru pami ci tzw tablicy znakoacutew w ktoacuterej znajduje si bajtowareprezentacja poszczegoacutelnych pikseli tworz cych znak Dla matrycy 5times8 ma ona 40bitoacutew Tablica ta jest umieszczona w pami ci ROM kontrolera LCD nie mo emy jejwi c zmienia Zwykle jednak kontrolery udost pniaj mo liwo definicji kilku w a-snych znakoacutew dzi ki czemu mo emy zdefiniowa np znaki charakterystyczne dla j -zyka polskiego Takie podej cie do generowania obrazu ma podstawow zalet jakjest prostota i zwi zane z tym niewielkie zapotrzebowanie na pami RAM Do prze-chowania np zawarto ci 8-znakowego wy wietlacza LCD wystarczy zaledwie 8 bajtoacutewpami ci Ma to szczegoacutelne znaczenie w prostych mikrokontrolerach z niewielk ilo-ci pami ci RAM Najpopularniejszym kontrolerem stosowanym w wy wietlaczach

alfanumerycznych jest HD44780 nawet je li w posiadanym wy wietlaczu jest innykontroler to mamy du szans e jest on z nim kompatybilny Typowy rozk ad sy-gna oacutew modu oacutew opartych na tym kontrolerze pokazano w tabeli 221

Tabela 221 Typowy uk ad wyprowadze modu oacutew alfanumerycznych LCD opartych na kontrolerzeHD44780

Pin Nazwa Funkcja

1 GND Masa 2 Vcc Zasilanie (typowo 5 V) 3 Vee Regulacja kontrastu 4 RS Zapis polecenia 5 RW Strob odczytzapis 6 E Wyboacuter uk adu 7 D0 Bit danych 0 8 D1 Bit danych 1 9 D2 Bit danych 210 D3 Bit danych 311 D4 Bit danych 412 D5 Bit danych 513 D6 Bit danych 614 D7 Bit danych 715 A Pod wietlenie mdash anoda16 K Pod wietlenie mdash katoda

Kup książkę Poleć książkę

46 AVR Uk ady peryferyjne

Przed pod czeniem modu u zawsze upewnij si czy podany rozk ad odpowiadau ytemu modu owi W szczegoacutelno ci sprawd rozmieszczenie linii zasilaj cych Ichniew a ciwe pod czenie grozi uszkodzeniem modu u

Zwykle piny 15 i 16 steruj ce pod wietleniem s umieszczone osobno lub te przedpinem 1 St d te zawsze nale y je dok adnie zidentyfikowa przed pod czeniem mo-du u Do pinoacutew tych nale y pod czy napi cie wykorzystane do pod wietlenia modu uPrzy czone napi cie zale y od typu zastosowanego pod wietlenia mdash CCFL foliielektroluminescencyjnej lub diod LED W dalszej cz ci b dziemy zajmowa si modu-em z pod wietleniem LED W nocie katalogowej ka dego modu u znajduj si szcze-

goacute owe informacje dotycz ce zasilania pod wietlenia Zwykle w tym celu wymaganejest napi cie 5 V a nat enie pr du pod wietlenia wynosi 20 ndash 50 mA

Wy wietlacze LCD alfanumeryczne s dost pne w handlu w wersjach dostosowanychdo roacute nych napi zasilaj cych Typowo jest to napi cie 5 V co stwarza pewne pro-blemy przy pod czeniu takiego LCD do procesoroacutew rodziny XMEGA S one zasi-lane maksymalnym napi ciem 36 V nie ma wi c mo liwo ci aby LCD i procesordzia a y w tych samych domenach napi ciowych W efekcie przy po czeniu obu uk a-doacutew musimy zastosowa konwersj napi Poniewa LCD alfanumeryczny z perspek-tywy procesora jest urz dzeniem bardzo wolnym ca kowicie wystarczaj cym rozwi za-niem jest zastosowanie szeregowych rezystoroacutew ktoacutere wraz z wbudowanymi w procesordiodami zabezpieczaj cymi b d stanowi y uk ad obni aj cy napi cie na magistralikomunikacyjnej z 5 V do bezpiecznego dla wej cia XMEGA napi cia Z drugiej stronyjedynka logiczna generowana przez procesor zasilany napi ciem 33 V jest poprawnierozpoznawana przez LCD pracuj cy z napi ciem 5 V Je li procesor by by zasilanybardzo niskim napi ciem (rz du 18 ndash 28 V) wymagany by by bardziej skompliko-wany konwerter co zosta o szerzej omoacutewione w rozdziale 7 ksi ki AVR Praktyczneprojekty

Wy wietlacze LCD wymagaj pod wietlenia bez tego wy wietlana zawarto jestpraktycznie nieczytelna W starszych konstrukcjach wykorzystywano pod wietleniew oparciu o lampy fluorescencyjne lub folie elektroluminescencyjne jednak obecniedominuj cym typem jest pod wietlenie za pomoc diod LED

Poniewa zasilamy diod LED wymagane jest do czenie szeregowego rezystoraCzasami taki rezystor jest wbudowany w modu LCD

Pod wietlenie tego typu zu ywa spor ilo energii Innym rozwi zaniem jest kupnowy wietlacza wykonanego w technologii OLED (ang Organic Light-Emitting Diode)Wy wietlacze tego typu cechuj si zdecydowanie lepszym kontrastem ale tak e wi k-sz szybko ci prze czania w zwi zku z czym mo na za ich pomoc uzyska o wielelepsze efekty animacji ktoacutere s praktycznie nieosi galne dla klasycznych wy wietlaczyLCD Nie maj one tak e innej wady LCD mdash zale no ci szybko ci prze czania seg-mentoacutew od temperatury

Wy wietlacze OLED nie maj wyprowadzonych pinoacutew odpowiedzialnych za pod-wietlenie mdash po prostu go nie wymagaj

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 47

Kolejn istotn kwesti jest pod czenie w a ciwego napi cia reguluj cego kontrastwy wietlacza Dla wi kszo ci modu oacutew LCD mie ci si ono w przedziale GND ndash Vcca dla modu oacutew o rozszerzonym zakresie temperatury w przedziale od ndash7 do 0 V mdashrysunek 221

Rysunek 221Pod czenie napi ciareguluj cego kontrasta) modu y klasyczneb) modu y o rozszerzonymzakresie temperatur

Napi cie ujemne mo na uzyska z prostej pompy adunkowej sterowanej przebiegiemPWM z procesora Poboacuter pr du z tego wej cia jest znikomo ma y Alternatywniemo na u y uk adu ICL7660 ktoacutery mo e generowa napi cia ujemne

Kolejn decyzj jak musimy podj jest sposoacuteb pod czenia modu u LCD z mikro-kontrolerem Mamy do wyboru dwie opcje mdash albo pod czamy wszystkie 8 linii da-nych (D0 ndash D7) albo tylko 4 najstarsze (D4 ndash D7) Pod czaj c tylko 4 linie danychzmniejszamy liczb niezb dnych po cze modu u z mikrokontrolerem oraz liczbwykorzystanych linii IO Ze wzgl du na znikom ilo danych przesy anych zdo mo-du u wynikaj ce z pod czenia tylko 4 linii danych spowolnienie transmisji jest bezznaczenia W trybie 4-bitowym najpierw transferowana jest starsza a potem m od-sza tetrada Niewykorzystane linie D0 ndash D3 mo na pozostawi niepod czone wi k-szo modu oacutew wewn trznie podci ga niepod czone linie poprzez rezystor do Vcc

Poniewa linie D0 ndash D7 s dwukierunkowe musimy pami ta aby podczas operacjiodczytu z LCD odpowiednie piny mikrokontrolera by y ustawione jako wej cia W prze-ciwnym przypadku dojdzie do konfliktu

Kolejnym sygna em co do ktoacuterego musimy podj decyzj jest sygna RW okre laj cytyp operacji (odczytzapis) Poniewa zwykle zapisujemy dane do LCD w a ciwie niezachodzi konieczno ich odczytywania mo emy ten sygna na sta e po czy z mas oszcz dzaj c w ten sposoacuteb jedn lini IO procesora Takie rozwi zanie ma jednak po-wa n wad mdash po jego zastosowaniu nie jest mo liwe odczytywanie sygna u zaj to cimodu u (ang busy flag) Powoduje to e pomi dzy kolejnymi zapisami do modu u mu-simy stosowa opoacute nienia dobrane na najwolniejsz mo liw okoliczno W efekcieca a transmisja jest wolniejsza ni mog aby by

Je li korzystamy z tych modu oacutew nie musimy pisa w asnych procedur ich obs ugiInstaluj c rodowisko WinAVR (lub nowy toolchain firmy Atmel) w katalogu docavr-libcexamplessdtiodemo znajdziemy gotowe funkcje obs ugi HD44780 Funkcjete nie dzia aj z mikrokontrolerami XMEGA st d te w za czonych przyk adach zosta-y one zmodyfikowane tak aby poprawnie wspoacute pracowa roacutewnie z tymi mikro-kontrolerami

Kup książkę Poleć książkę

48 AVR Uk ady peryferyjne

Mo emy te skorzysta z licznych przyk adoacutew dost pnych w internecie W dalszejcz ci rozdzia u zostan wykorzystane funkcje z pakietu WinAVR napisane przezJoerga Wunscha Pokazane przyk ady zak adaj e wy wietlacz jest po czonyz mikrokontrolerem tak jak na rysunku 222

Rysunek 222 Po czenie LCD z mikrokontrolerem Na goacuterze pod czenie do mikrokontroleraXMEGA na dole pod czenie do modu u Xplained Na schematach pokazano tak e opcjonalne sposobypod czenia pinu Vee odpowiedzialnego za regulacj kontrastu LCD

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 49

Zanim co wy wietlimy na LCD musimy pozna w jaki sposoacuteb s generowane znakiSterownik LCD zawiera w sobie niezale nie od typu u ytej matrycy 80 bajtoacutew pami ciDDRAM (ang Display Data RAM) Je li zastosowana matryca wy wietla mniejszliczb znakoacutew to cz komoacuterek pami ci jest nieu ywana Mo emy je wykorzystado innych celoacutew mdash np jako zwyk pami RAM Mo emy te u y jej do przesu-wania napisoacutew ktoacutere nie mieszcz si na wy wietlaczu Aby mo na by o umie ciznak na w a ciwej pozycji niezb dne jest poznanie organizacji pami ci kontrolera W za-le no ci od u ytej matrycy pami ta jest zorganizowana nast puj co

Dla matryc 16times1 mdash pami jest podzielona na dwa obszary ka dy zawieraj cypo 8 znakoacutew Obszar pierwszy (od lewej) ma adresy 0x00 do 0x07 a obszar drugi(prawy) adresy 0x40 do 0x47 St d te gdy wy wietla si tekst przekraczaj cygranic obszaroacutew nale y zadba aby poszczegoacutelne litery trafi y pod w a ciweadresy

Dla matryc 20times1 mdash adresy 0x00 do 0x13

Dla matryc 16times2 mdash adres pierwszej linii zaczyna si od 0x00 do 0x0f adresdrugiej linii od 0x40 do 0x4f

Dla matryc 20times2 mdash adresy pierwszej linii to 0x00 do 0x13 a drugiej 0x40 do 0x53

Dla matryc 40times2 mdash adresy pierwszej linii to 0x00 do 0x27 drugiej linii 0x40do 0x67

Dla matryc 20times4 mdash adresy pierwszej linii to 0x00 do 0x13 drugiej 0x40 do 0x53trzeciej 0x14 do 0x27 a czwartej 0x54 do 0x67

Jak wida w niektoacuterych typach wy wietlaczy po ka dej linii zostaje od kilku do kil-kunastu bajtoacutew ktoacuterych zawarto nie jest wy wietlana Ma to pewn zalet mdash mo-emy do pami ci modu u wpisywa teksty d u sze ni s wy wietlane na ekranie co

u atwia przewijanie tekstu Niestety ma to te pewn wad mdash funkcje wy wietlaj ceco na ekranie musz bdquowiedzie rdquo jak organizacj ma matryca W przeciwnym przy-padku nie ma mo liwo ci prawid owego wyliczenia adresu komoacuterki do ktoacuterej ma od-by si zapis

W dalszej cz ci rozdzia u zostanie wykorzystany modu LCD o organizacji 16times2(ale mo na te bez problemu wykorzysta dowolny inny)

Zanim b dzie mo na co wy wietli na ekranie modu musi zosta zainicjalizowanyW trakcie inicjalizacji ustawiane s podstawowe parametry pracy sterownika LCD mdashorganizacja matrycy (liczba linii) wielko czcionki (5times8 lub 8times11 pikseli) Wielkoczcionki zale y od typu pod czonej matrycy LCD Dla konkretnego modu u LCDtylko jedna z tych warto ci b dzie poprawna Oproacutecz inicjalizacji modu u nale y tak-e poprawnie ustawi stan pinoacutew IO wykorzystywanych do pod czenia modu u LCD

Wi kszo pracy zwi zanej z inicjalizacj modu u LCD odbieraniem i wysy aniemdo niego danych wykonuje biblioteka Joerga Wunscha Dostarcza ona niskopozio-mowe funkcje umo liwiaj ce komunikacj ze sterownikiem hd44780 i innymi kom-patybilnymi z nim sterownikami Wystarczy e do aplikacji w ktoacuterej planujemy wy-korzysta taki modu do czymy plik hd44780c oraz plik nag oacutewkowy hd44780h

Kup książkę Poleć książkę

50 AVR Uk ady peryferyjne

Oba pliki bdquozak adaj rdquo e istnieje plik nag oacutewkowy definesh zawieraj cy podstawo-we definicje zwi zane ze sposobem pod czenia modu u LCD z mikrokontroleremNa pocz tku nale y okre li ktoacutere linie IO zosta y wykorzystane do pod czenia modu u

define HD44780_RS A 4define HD44780_RW A 5define HD44780_E A 6define HD44780_D4 A 0

W powy szym przyk adzie do kolejnych linii portu A (A4 ndash A6) zosta y pod czonesygna y RS RW i E modu u natomiast do linii A0 ndash A3 linie D4 ndash D7 modu u LCD Wa nejest aby linie danych czy z pinami IO w kolejno ci rosn cej Biblioteka wykorzy-stuje do transmisji danych pomi dzy modu em a mikrokontrolerem tylko 4 linie danychmdash dzi ki temu mo emy zmniejszy liczb po cze a zwolnione linie IO wykorzystado innych celoacutew W pliku wyst puje jeszcze jedna definicja

define USE_BUSY_BIT 1

Okre la ona e biblioteka b dzie u ywa flagi Busy modu u LCD mdash umo liwia touzyskanie optymalnej szybko ci wspoacute dzia ania z modu em Zako czenie realizacjibie cej operacji modu sygnalizuje zmian stanu tej flagi co umo liwia niezw ocznewys anie kolejnej komendy Je li nie u ywamy flagi Busy program musi generowamaksymalne zalecane w nocie katalogowej opoacute nienia w efekcie ca a transmisja zwal-nia Po zdefiniowaniu u ywanych pinoacutew w pliku definesh mo emy rozpocz korzy-stanie z biblioteki

W pliku hd44780h s udost pnione prototypy funkcji odpowiedzialnych za wspoacute -prac z modu em LCD

Funkcje bibliotecznePodstaw modu u stanowi dwie funkcje umo liwiaj ce odpowiednio wys anie da-nych do modu u oraz ich odczytanie

void hd44780_outbyte(uint8_t b uint8_t rs)uint8_t hd44780_inbyte(uint8_t rs)

Obie funkcje wysy aj odczytuj 8-bitow dan w przypadku wykorzystania tylko4-bitowej szyny danych wysy anie i odczytywanie danych odbywa si w dwoacutech etapachDodatkowo zmienna rs okre la tryb dost pu W przypadku wysy ania danych do modu urs = 0 powoduje e dane zostan wys ane do rejestru komend a je li rs = 1 dane trafido rejestru danych Przy odczycie jest podobnie z tym e dla rs = 0 jest odczytywanaflaga Busy i rejestr AC (ang Address Counter)

Kolejna funkcja odpowiada za oczekiwanie na gotowo modu uvoid hd44780_wait_ready(bool islong)

W przypadku gdy w pliku definesh symbol USE_BUSY_FLAG ma warto 1 parametrislong jest ignorowany a optymalizator kompilatora usuwa go gdy nie jest on wy-korzystywany przez funkcj Kiedy warto USE_BUSY_FLAG jest roacute na od 1 parametr

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 51

ten okre la d ugo opoacute nienia Je li jest roacute na od 0 opoacute nienie wynosi 152 ms a je-eli jest roacutewna 0 opoacute nienie wynosi 37 s Poniewa lepiej jest u ywa flagi Busy

mo emy ten parametr ignorowa

Powy sze trzy funkcje wystarcz do komunikacji z modu em dla wygody zdefiniowanojednak kolejne Funkcje hd44780_outcmd(n) i hd44780_incmd() umo liwiaj odpowiedniowys anie polecenia do rejestru komend kontrolera lub odczytanie bitu Busy i licznikaAC Dwie kolejne mdash hd44780_outdata(n) oraz hd44780_indata() mdash umo liwiaj zapisi odczytanie rejestru danych

Oproacutecz funkcji odpowiedzialnych za komunikacj z modu em LCD zdefiniowano tak efunkcj przeprowadzaj c podstawow inicjalizacj modu u hd44780_init(void) orazfunkcj hd44780_powerdown(void) ustawiaj c wszystkie linie u yte do komunikacjiw stan 0 co umo liwia bezpieczne od czenie zasilania od modu u LCD W przypadkupozostawienia ktoacuterej z wy ej wymienionych linii w stanie 1 przy od czonym za-silaniu modu u stanowi ona jego zasilanie W efekcie mimo wy czenia modu mo epobiera znaczny pr d

Szerszego omoacutewienia wymaga funkcja hd44780_outcmd(cmd) ktoacutera umo liwia wys a-nie polecenia do rejestru polece sterownika LCD Dla wygody zdefiniowane zosta yroacute ne komendy u atwiaj ce wspoacute prac z modu em LCD Komendy te s przekazy-wane jako argument wywo ania funkcji hd44780_outcmd np

hd44780_outcmd(HD44780_CLR)

powoduje wys anie do sterownika polecenia HD44780_CLR czyszcz cego zawartopami ci DDRAM kontrolera

KomendyFunkcja hd44780_outcmd przyjmuje jako argument predefiniowane makrodefinicjeznacznie u atwiaj ce wspoacute prac z kontrolerem modu u LCD Poni ej zostan onepokroacutetce omoacutewione

HD44780_SHIFT(shift right)Ta makrodefinicja powoduje przesuni cie pozycji wy wietlanego tekstu (shift = 1)o jedn pozycj w lewo (argument right = 0) lub w prawo (argument right = 1)W przypadku gdy shift = 0 przesuwany w lewo lub prawo jest tylko kursor Wysy-aj c wielokrotnie to polecenie uzyskujemy kolejne przesuni cia o jedn pozycj

w lewo lub prawo Polecenie to s u y g oacutewnie do przesuwania tekstu Jednak ze wzgl duna du bezw adno tekstowych modu oacutew LCD nie nale y przesuwa liter cz ciej niok raz na sekund mdash cz stsze przesuwanie daje bardzo nieprzyjemne efekty wizual-ne Ka dy bufor linii jest bdquozawijanyrdquo to znaczy e po ostatnim znaku z prawej jestwy wietlany pierwszy znak z lewej i odwrotnie Nale y pami ta e d ugo buforajest sta a dla danego modelu matrycy Np dla modu oacutew 16times2 bufor jednej linii wyno-si dok adnie 40 bajtoacutew z czego 16 jest jednorazowo wy wietlanych Poni szy kodcyklicznie przewija wy wietlany tekst w lewo

lcd_puttext_P(PSTR(Test bufora i przewijania tekstunTen tekst przewija sie w lewo))while(1)

Kup książkę Poleć książkę

52 AVR Uk ady peryferyjne

hd44780_outcmd(HD44780_SHIFT(10)) _delay_ms(700)

HD44780_FNSET(if8bit twoline font5x10)Polecenie to wybiera typ interfejsu mdash 8-bitowy je li warto parametru if8bit jestroacutewna 1 lub 4-bitowy je li jest roacutewna 0 Typ interfejsu musi odpowiada sposobowipo czenia modu u z mikrokontrolerem Parametr twoline okre la czy pod czonamatryca LCD ma jedn lini znakoacutew czy dwie Matryce ktoacutere maj 4 linie tekstu straktowane przez kontroler jako matryce dwuliniowe mdash parametr twoline powinienmie warto 1 Je li dla matrycy zawieraj cej dwie lub wi cej linii ustawimy go na 0to wy wietlana b dzie tylko jedna linia (w przypadku matryc dwuliniowych goacuterna)a w przypadku matryc 4-liniowych b d wy wietlane dwie linie rozdzielone lini pust

Ostatni parametr okre la typ u ywanego generatora znakoacutew Powinien on odpowiadau ytej w module matrycy zwykle wi c jego warto wynosi 0

HD44780_DISPCTL(disp cursor blink)Ustawia roacute ne parametry pracy matrycy Je li parametr disp ma warto 1 to matrycajest w czona (wy wietla zawarto DDRAM) a je li 0 to matryca jest wy czonalecz stan pami ci DDRAM nie ulega zmianie Np kod

while(1) hd44780_outcmd(HD44780_DISPCTL(011)) _delay_ms(700) hd44780_outcmd(HD44780_DISPCTL(111)) _delay_ms(700)

powoduje naprzemienne w czanie i wy czanie matrycy w efekcie wy wietlany tekstmruga

Parametr cursor okre la czy sprz towo wy wietlany kursor ma by widoczny (war-to parametru 1) czy niewidoczny (warto parametru 0) Je li kursor jest widocznyto dodatkowo mo emy okre li czy ma miga (warto parametru blink roacutewna 1)czy nie (blink = 0) Je li kursor jest widoczny i nie miga jest wy wietlany w postacipoziomej kreski Wy wietlanie kursora mo e by u yteczne w sytuacji kiedy u yt-kownik wprowadza jakie dane W pozosta ych sytuacjach kursor mo emy wy czy

HD44780_ENTMODE(inc shift)Okre la sposoacuteb wprowadzania danych do pami ci Je li parametr inc ma warto 1 topo ka dej operacji zapisuodczytu adres pami ci jest automatycznie zwi kszany o je-den co przy piesza operacj zapisuodczytu kolejnych znakoacutew Je li warto inc jestroacutewna 0 to adres jest automatycznie zmniejszany o 1 Dodatkowo parametr shiftokre la czy wy wietlany obraz ma by automatycznie przesuwany tak aby wy wie-tla ostatnio wprowadzony znak (shift = 1) lub go nie wy wietla (shift = 0)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 53

HD44780_CLRPowoduje wyczyszczenie (wype nienie znakami o kodzie 32) ca ej zawarto ci pami ciDDRAM Jednocze nie kursor wraca do pozycji pierwszej (pierwsza linia pierwszyznak)

Niewy wietlane bajty pami ci DDRAM tak e s kasowane Je li s one u ywanedo przechowywania zmiennych programu to przed operacj kasowania nale y jeskopiowa w bezpieczne miejsce W przeciwnym przypadku zostan utracone

Wska nik adresu do pami ci DDRAM jest ustawiany na 0 zerowane jest tak e prze-suni cie

HD44780_HOMEPowoduje powroacutet kursora do pozycji pocz tkowej mdash pierwsza linia pierwszy znakWska nik adresu do pami ci DDRAM w efekcie zawiera 0 zerowane jest roacutewnieprzesuni cie wy wietlania znakoacutew w efekcie s one wy wietlane od pozycji 0

HD44780_DDADDR(addr)Ustawia nast pny adres zapisuodczytu w pami ci DDRAM na addr Tylko 7 bitoacutewargumentu addr jest branych pod uwag w zwi zku z czym mo na zaadresowa mak-symalnie 128 bajtoacutew pami ci (z czego sterownik ma tylko 80 pozosta e lokacje snieu ywane)

HD44780_CGADDR(addr)Ustawia nast pn operacj odczytuzapisu w pami ci CGRAM na addr Pod uwagbranych jest tylko 6 bitoacutew zmiennej addr w efekcie mo na zaadresowa maksymalnie64 bajty pami ci CGRAM

Przedstawione powy ej funkcje zapewniaj jedynie podstawow komunikacj z mo-du em LCD Potrzebujemy jednak ci gle funkcji odpowiedzialnej za jego inicjalizacjmdash funkcja biblioteczna przeprowadza ten proces tylko w podstawowym zakresie musi-my jeszcze zadba o w a ciwe ustawienie parametroacutew zwi zane z posiadan matryc Napiszmy wi c w asne rozwini cie funkcji inicjalizacyjnej

void lcd_init() hd44780_init() Podstawowa inicjalizacja modu u hd44780_outcmd(HD44780_CLR) Wyczy pami DDRAM hd44780_wait_ready(1000) hd44780_outcmd(HD44780_ENTMODE(1 0)) Tryb autoinkrementacji AC hd44780_wait_ready(1000) hd44780_outcmd(HD44780_DISPCTL(1 0 0)) W cz wy wietlacz wy cz kursor hd44780_wait_ready(1000)

Zauwa e po wys aniu ka dego polecenia do modu u jest wywo ywana funkcjahd44780_wait_ready(1000) odpowiedzialna za oczekiwanie a realizacja wys anego po-lecenia dobiegnie ko ca Jest to niezb dne gdy do czasu uko czenia bie cej

Kup książkę Poleć książkę

54 AVR Uk ady peryferyjne

operacji dalsze polecenia s ignorowane Jako argument podany jest parametr 1000mdash jest on bez znaczenia nasza biblioteka korzysta z flagi Busy i po prostu go ignorujePo wykonaniu powy szej funkcji modu LCD jest poprawnie zainicjalizowany a jegopami jest wyczyszczona (zawiera bajty 0x20) i w efekcie modu nic nie wy wietlaOd tej chwili mo emy wysy a znaki do wy wietlenia

Po wykonaniu inicjalizacji ekran mo e pozosta czysty lub wy wietla ca kowiciewype nione kwadraty (wszystkie piksele w czone) Je li po inicjalizacji wszystkiepiksele s w czone nale y nieco zmniejszy kontrast

Aby sobie u atwi to zadanie zdefiniujmy funkcj wysy aj c do modu u jeden znakvoid lcd_putchar(char c) static bool second_nl_seen static uint8_t line=0

if ((second_nl_seen) ampamp (c = n)ampamp(line==0)) Odebrano pierwszy znak hd44780_wait_ready(40) hd44780_outcmd(HD44780_CLR) hd44780_wait_ready(1600) second_nl_seen=false if (c == n) if (line==0) line++ hd44780_outcmd(HD44780_DDADDR(64)) Adres pierwszego znaku drugiej linii hd44780_wait_ready(1000) else second_nl_seen=true line=0 else hd44780_outdata(c) hd44780_wait_ready(40)

Funkcja ta ze wzgl du na skomplikowane adresowanie pami ci DDRAM jest zale naod konkretnego modelu modu u LCD B dzie prawid owo wspoacute pracowa z modu a-mi 2times16 2times20 i 2times40 znakoacutew W przypadku innych modu oacutew pozycje niektoacuterychznakoacutew mog by nieprawid owe

Mo emy ju wy wietla na LCD pojedyncze znaki czas na wy wietlanie tekstu Po-niewa teksty jako sta e dla zaoszcz dzenia cennej pami ci RAM przechowuje si za-zwyczaj w pami ci FLASH zdefiniujmy funkcj odczytuj c podany a cuch zna-kowy z pami ci FLASH a nast pnie umieszczaj c go na LCD

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 55

void lcd_puttext_P(prog_char txt) char ch while((ch=pgm_read_byte(txt))) lcd_putchar(ch) txt++

Powy sza funkcja wysy a kolejne znaki odczytane z pami ci FLASH na LCD za po-moc funkcji LCD_putchar Po napotkaniu znaku ko ca a cucha (0 nul) przerywa swojedzia anie

Pozostaje nam przetestowa dzia anie przedstawionych funkcjiint main() lcd_init() lcd_puttext_P(PSTR(Test LCDnDruga linia)) while(1)

Na ekranie modu u LCD powinien wy wietli si napisTest LCDDruga linia

Je li na LCD nic nie widzimy to w pierwszej kolejno ci powinni my sprawdzi kon-trast zmieniaj c napi cie na pinie Vee modu u LCD

Warto zdefiniowa jeszcze funkcj ustawiaj c pozycj od ktoacuterej b dzie wy wietlanynast pny znak

void lcd_goto(uint8_t x uint8_t y) hd44780_outcmd(HD44780_DDADDR(0x40y+x)) hd44780_wait_ready(1000)

Funkcja ta przyjmuje dwa parametry x i y okre laj ce pozycj na ktoacuterej zostaniewy wietlony nast pny znak wys any z mikrokontrolera do modu u LCD Dzi ki temuz atwo ci mo emy uaktualnia zawarto LCD bez konieczno ci ponownego prze-sy ania wszystkich danych Funkcja ta jest zale na od typu zastosowanego modu u

Ostatni funkcj jest funkcja umo liwiaj ca czyszczenie zawarto ci pami ci modu uOdpowiedzialne za to jest proste polecenie wysy ane do sterownika

void lcd_cls() hd44780_outcmd(HD44780_CLR) hd44780_wait_ready(false)

Oproacutecz czyszczenia zawarto ci pami ci modu u powoduje ono ustawienie kursoraw punkcie (00)

Kup książkę Poleć książkę

56 AVR Uk ady peryferyjne

Definiowanie w asnych znakoacutewUk ad HD44780 jest wyposa ony w 64 bajty pami ci CGRAM (ang Character Ge-nerator RAM) ktoacutera mo e przechowywa mapy bitowe 8 znakoacutew o matrycy 5times8 pikselilub 4 znakoacutew o matrycy 5times10 pikseli Przyk ad definicji znaku na matrycy 5times8 poka-zano na rysunku 223

Rysunek 223Przyk ad definicji w asnego znakuw pami ci CGRAM Znak rysujemyna matrycy 5times8 bitoacutew polazaciemnione odpowiadaj warto ci 1pola bia e warto ci 0 Wartowyliczon dla ka dej linii pikseliwpisujemy do pami ci CGRAMsterownika Najstarsze 3 bity ka degobajta (pola szare) s bez znaczeniamdash wy wietlacz pomija jeprzy wy wietlaniu obrazu

1

2

3

4

5

6

7

0 00100 = 4

01110 = 14

11111 = 31

00100 = 4

00100 = 4

00100 = 4

11111 = 31

01110 = 14

Adres Warto

Dost p do tej pami ci jest mo liwy dzi ki wys aniu polecenia ustawiaj cego adreszapisuodczytu pami ci CGRAM Po jego wys aniu wszystkie operacje zapisu i od-czytu dotycz tej pami ci a nie pami ci DDRAM Aby wroacuteci do adresowania pa-mi ci DDRAM nale y wybra jej adres lub dokona operacji wymagaj cej przesu-ni cia kursora

Pami CGRAM jest pami ci ulotn po ponownym w czeniu zasilania definicjeznakoacutew musz by ponownie przes ane przez procesor

Bity o warto ci 1 w definicji znaku odpowiadaj w czonym pikselom bity o warto-ci 0 pikselom wy czonym Najstarsze 3 bity ka dego bajta w pami ci CGRAM s

bez znaczenia mdash te pozycje nie s wy wietlane przez matryc Definiuj c znak nale-y tak e pami ta e ostatnia linia wy wietlana przez matryc (w zale no ci od wiel-

ko ci matrycy znaku linia 8 lub 10) powinna zawiera same zera mdash w tej linii b dziewy wietlany kursor

Najcz ciej matryce LCD pod czone do sterownika HD44780 maj organizacj 5times8czyli jeden znak jest definiowany przez 8 kolejnych bajtoacutew okre laj cych stan po-szczegoacutelnych linii tworz cych znak Stwoacuterzmy funkcj ktoacuterej zadaniem b dzie za a-dowanie definicji znakoacutew z pami ci FLASH mikrokontrolera do pami ci CGRAM

void lcd_defchar_P(uint8_t charno prog_uint8_t chardef) hd44780_outcmd(HD44780_CGADDR(charno8)) hd44780_wait_ready(40) for(uint8_t c=0clt8c++) hd44780_outdata(pgm_read_byte(chardef))

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 57

hd44780_wait_ready(40) chardef++

Funkcja LCD_defchar_P jako argumenty przyjmuje numer definiowanego znaku (0 ndash 7)oraz wska nik do obszaru pami ci FLASH zawieraj cego definicj znaku (obszarten zajmuje 8 nast puj cych po sobie bajtoacutew) Jak widzimy funkcja najpierw ustawiaw a ciwy adres pod ktoacuterym znajdzie si pocz tek definicji znaku w pami ci CGRAMmdash poniewa jeden znak jest opisywany za pomoc 8 bajtoacutew kolejne adresy znakoacutewto kod_znakutimes8 Nast pnie dane opisuj ce znak s adowane z pami ci mikrokontrolerai zapisywane w pami ci CGRAM sterownika Poni szy program ilustruje wykorzy-stanie funkcji LCD_defchar_P

prog_uint8_t char1[8][8]=0000000255 00000025525500000255255255 0000255255255255 00025525525525525500255255255255255255 0255255255255255255255255255255255255255255255

int main() for(uint8_t x=0xlt8x++) lcd_defchar_P(xampchar1[x][0]) Za aduj wzorce znakoacutew lcd_init() for(uint8_t x=0xlt8x++) lcd_putchar(x) Wy wietl znaki o kodach 0 ndash 7 while(1)

W pierwszej linii funkcji main nast puje za adowanie nowych definicji znakoacutew dopami ci CGRAM nast pnie inicjalizowany jest wy wietlacz po czym w pierwszejlinii s wy wietlane znaki o kodach 0 ndash 7 a wi c znaki ktoacuterych definicja zosta aprzes ana z mikrokontrolera

Zauwa e pami CGRAM podobnie jak DDRAM mo emy zapisywa i odczytywaprzed inicjalizacj modu u LCD Proces inicjalizacji jest potrzebny tylko do prawi-d owego wy wietlania na ekranie LCD

Poniewa dane potrzebne do wy wietlenia znaku s na bie co pobierane z pami cipodczas od wie ania matrycy LCD jakiekolwiek zmiany w definicji znaku kiedy jest onwidoczny na LCD poci gaj za sob natychmiastowe zmiany w wy wietlanym obrazieMo na t w a ciwo sterownika wykorzysta do stworzenia prostych animacji

void lcd_box(uint8_t y) hd44780_outcmd(HD44780_CGADDR(0)) Zaczynamy od znaku o kodzie 0 hd44780_wait_ready(40) for(uint8_t c=0cltyc++) Stwoacuterz linie z w czonymi pikselami hd44780_outdata(0xFF) hd44780_wait_ready(40) for(uint8_t c=yclt8c++) Stwoacuterz linie z wy czonymi pikselami hd44780_outdata(0x00) hd44780_wait_ready(40)

Kup książkę Poleć książkę

58 AVR Uk ady peryferyjne

int main() lcd_init() lcd_putchar(0) while(1) for(uint8_t x=0xlt8x++) lcd_box(x) _delay_ms(100) for(int8_t x=7xgt=0x--) lcd_box(x) _delay_ms(100)

Funkcja main wy wietla na LCD tylko jeden znak o kodzie 0 a nast pnie cykliczniezmienia jego definicj w pami ci CGRAM W efekcie posta znaku wy wietlana naekranie ci gle si zmienia

Transakcyjna obs uga LCDPokazana do tej pory obs uga LCD alfanumerycznego mia a pewne wady Jak wiemyoperacje odwo uj ce si do kontrolera LCD s niezwykle wolne cykl odczytuzapisudowolnego rejestru kontrolera trwa co najmniej 1600 ns co dla MCU taktowanegozegarem 32 MHz przek ada si na czas wykonania oko o 52 instrukcji asemblera Cogorsza wi kszo komend realizowanych przez kontroler jest wykonywana w czasieoko o 37 s co przek ada si na tysi ce zmarnowanych taktoacutew MCU St d te jaki-kolwiek zapisodczyt LCD to z perspektywy programu straszne marnotrawstwo czasu

Problem ten dotyczy ka dego urz dzenia IO ktoacutere dzia a wolniej ni procesor W takiejsytuacji warto napisa pewn warstw po redni mdash sterownik mdash ktoacuterego zada-niem b dzie buforowanie da dost pu do urz dzenia i rozstrzyganie konfliktoacutewdzi ki czemu roacute ne cz ci programu b d bdquomia y wra enierdquo e maj wy czny do-st p do urz dzenia

Pokazane wcze niej funkcje obs ugi LCD maj jeszcze jedn wad mdash nie s wspoacute bie -ne czyli nie mo na ich wykonywa jednocze nie w kilku miejscach programu w tymw szczegoacutelno ci w programie g oacutewnym i w funkcjach obs ugi przerwa W wielu przy-padkach ta wada jest bez znaczenia jednak czasami jest uci liwa mdash dla przyk adugdy na wy wietlany tekst chcieliby my na o y inne informacje np o dacie lub godzi-nie Oczywi cie wy wietlanie mo na zorganizowa tak aby nie by o potrzeby pisaniawspoacute bie nego kodu np poprzez zastosowanie bufora pami ci VRAM kontrolera LCDRodzi to jednak kolejne problemy i jest ma o eleganckie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 59

Zastanoacutewmy si w jaki sposoacuteb najlepiej jednocze nie rozwi za problem wolnegodost pu do urz dzenia i wspoacute bie no ci kodu Rozwi zaniem mo e by wprowadze-nie tzw transakcji Transakcj nazywamy zbioacuter operacji tworz cych pewn ca-o To co wyroacute nia tak wykonywany zestaw operacji to atomowo spoacutejno

izolacja i trwa o Pod tymi terminami kryje si istota wykonywanej operacji Ato-mowo transakcji zapewnia e jest ona wykonywana w sposoacuteb niepodzielny co gwa-rantuje nam prawid ow wspoacute prac z danym urz dzeniem IO w tym przypadku kon-trolerem LCD Wa na dla nas jest tak e izolacja mdash dzi ki temu inne operacje na LCD(inne transakcje) nie b d mia y wp ywu na wynik aktualnie wykonywanej transakcjimdash nie b d zak oacuteca y jej wykonania z drugiej strony nasza transakcja nie zak oacuteciwykonania innych Trwa o z kolei zagwarantuje nam e je li sterownik potwierdziwykonanie transakcji to znaczy e efekt jej dzia ania jest wy wietlony na LCD Tacecha nie jest nam a tak potrzebna mdash jest ona wydawa oby si oczywista Niemniej jestto pewna gwarancja e ca a operacja przebieg a poprawnie i w efekcie LCD znajdujesi w okre lonym przez nas stanie Tyle teorii przejd my do praktyki

Kody poni szego przyk adu znajduj si w katalogu PrzykladyLCD-alfaLCD-transact

Aby zapewni transakcyjny dost p do LCD musimy stworzy pewne struktury danychktoacuterych zadaniem b dzie przechowywanie informacji o operacjach sk adaj cych sina transakcje i stanie ich wykonania W tym celu pos u ymy si wiadomo ciami z roz-dzia u 5 bdquoJak uporz dkowa chaos czyli z o one typy danych i listyrdquo Do przecho-wywania oczekuj cych transakcji pos u ymy si buforem pier cieniowym zanimjednak go zaimplementujemy zastanoacutewmy si jak powinna wygl da struktura prze-chowuj ca informacje o transakcji Struktura ta powinna zawiera co najmniej

pole danych (data) z informacjami ktoacutere maj by przes ane do kontrolera LCD

pole okre laj ce liczb danych do wys ania (len)

pole okre laj ce realizowane polecenie dla LCD (cmd) mdash pole to pos u yprogramowi sterownika do w a ciwej interpretacji danych znajduj cych siw polu data

kilka poacutel kontrolnych przechowuj cych informacje potrzebne do realizacjisamej transakcji Jedno z nich mdash Ready mdash b dzie przyjmowa warto trueje li dana transakcja zosta a zrealizowana lub false w przeciwnym przypadkuZnaczenie drugiego pola mdash SelfDel mdash mo e wydawa si nieco enigmatycznepole to okre la czy pami przydzielona dla transakcji ma by zwolnionaw sterowniku LCD (warto true) czy te zostanie zwolniona w programie(warto false)

Oto jak mo e wygl da struktura definiuj ca transakcj typedef struct volatile bool Ready 1 true je li transakcja zosta a zrealizowana bool SelfDel 1 true je li pami przydzielona transakcji ma zosta zwolniona LCD_Cmd cmd 2 Polecenie do zrealizowania uint8_t len 6 D ugo polecenia

Kup książkę Poleć książkę

60 AVR Uk ady peryferyjne

unsigned 0 Wyroacutewnanie do granicy bajta uint8_t data[] Dane transakcji LCD_trans

Nale y zwroacuteci uwag na poleunsigned 0

Nie definiuje ono adnego pola struktury ale jedynie informuje kompilator e kolejnepole (w naszym przyk adzie o nazwie data) ma by wyroacutewnane do granicy bajta mdashdzi ki temu dost p do kolejnego pola b dzie odbywa si szybciej Z kolei samo poledata jest zadeklarowane jako tzw typ niekompletny

Typ niekompletny (ang incomplete type) to typ ktoacuterego rozmiaru nie da si okre li

W pokazanym przyk adzie rozmiaru pola data nie da si okre li gdy zosta on za-deklarowany jako typ tablicowy z tym e nie podano wielko ci tablicy Wielko ci niepodano gdy na etapie deklaracji struktury nie wiemy jakiej wielko ci dane b d w niejprzechowywane Tego typu deklaracja ma bardzo powa ne konsekwencje mdash skorowielko ci pola data nie da si okre li to jaki b dzie wynik dzia ania operatora sizeof(LCD_trans) Kompilator stara si jako wybrn z tej sytuacji w zwi zku z czym

zwroacuteci wielko struktury ale tak jakby pole data w ogoacutele nie istnia o mdash jego roz-miar b dzie wynosi 0 W ramach wiczenia zastanoacutew si ile bajtoacutew pami ci b dziezajmowa a struktura LCD_trans

Skoro dysponujemy ju struktur przechowuj c poszczegoacutelne transakcje pora nastworzenie obiektu przechowuj cego kolekcj transakcji Dodanie kolejnej strukturyb dzie polega o na dodaniu jej do takiego obiektu z drugiej strony program sterownikaLCD b dzie moacuteg z tej kolekcji pobiera kolejne transakcje do realizacji Opis ten przy-pomina opis dzia ania bufora pier cieniowego mdash z jednym wyj tkiem mdash po zape nie-niu ca ego bufora nie b dziemy usuwa niezrealizowanych transakcji lecz zabloku-jemy dodawanie kolejnych W tym celu pos u ymy si definicj nast pnej struktury

typedef struct LCD_trans elements[LCD_MAXTRANS] Wska niki do transakcji uint8_t Beg Pierwszy element bufora uint8_t Count Liczba elementoacutew w buforze CircBuffer

Struktura ta zawiera deklaracj tablicy wska nikoacutew na transakcje (pole elements)Poniewa jest to tablica musimy zna liczb jej elementoacutew mdash jest ona zadeklarowanaw sta ej LCD_MAXTRANS

define LCD_MAXTRANS 10 Maksymalna liczba pami tanych transakcji

Do realizacji bufora s potrzebne jeszcze dwa pola Beg wskazuj ce na pierwsztransakcj w buforze oraz pole Count okre laj ce liczb transakcji znajduj cych siw buforze Je li Count == 0 to znaczy e w buforze nie ma adnych oczekuj cychtransakcji a je li Count == LCD_MAXTRANS to znaczy e bufor jest pe ny i nie mo na

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 61

dodawa do niego kolejnych transakcji W a ciwo t wykorzystuj dwie zdefiniowanew pliku LCD_transc funkcje

static inline bool cbIsFull(CircBuffer cb) return cb-gtCount == LCD_MAXTRANS

static inline bool cbIsEmpty(CircBuffer cb) return cb-gtCount == 0

Jak pami tamy w przypadku funkcji modyfikatory static inline powoduj e danafunkcja nie b dzie istnie jako samodzielna lecz w ka dym miejscu w ktoacuterym jestwywo ywana jest wstawiany raczej jej kod a nie wywo anie Ma to znaczenie dlakroacutetkich funkcji (a wi c takich jak pokazane powy ej) dla ktoacuterych koszty wywo anias zazwyczaj wi ksze ni koszty umieszczenia cia a funkcji w miejscu jej wywo aniaTego typu funkcje zachowuj si w sposoacuteb zbli ony do makrodefinicji (z tym e re-spektuj wszystkie regu y j zyka C w szczegoacutelno ci kolejno operatoroacutew czy kon-trol typoacutew)

Takie funkcje jako argument pobieraj adres bufora na ktoacuterym maj operowa W na-szym przypadku bufor jest zdefiniowany nast puj co

static CircBuffer LCD_TransBuffer Bufor na transakcje

Nale y zauwa y e jest on zdefiniowany jako struktura globalna z modyfikatoremstatic Modyfikator ten ogranicza zasi g widoczno ci zmiennej LCD_TransBuffer dopliku w ktoacuterym zmienna ta zosta a zdefiniowana (w tym przypadku modyfikator staticjest niejako przeciwie stwem modyfikatora extern) Dzia anie to ma jedynie znaczeniekosmetyczne mdash uniemo liwia odwo anie si do bufora za pomoc funkcji ktoacutere niezosta y zdefiniowane w miejscu jego definicji Oproacutecz funkcji umo liwiaj cych okre-lenie stanu bufora potrzebne s jeszcze funkcje umo liwiaj ce dodanie i pobranie trans-

akcji Pierwsz funkcj b dzie funkcja dodaj ca transakcj do buforabool cbAdd(CircBuffer cb LCD_trans elem) ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsFull(cb)) return false Czy jest miejsce w kolejce uint8_t end = (cb-gtBeg + cb-gtCount) LCD_MAXTRANS cb-gtelements[end] = elem Dodaj transakcj ++cb-gtCount Liczba elementoacutew w buforze return true Wszystko OK

Funkcja ta dodaje transakcj (zmienna elem) do bufora ko owego Zanim transakcjazostanie dodana sprawdzane jest czy w buforze jest miejsce mdash je li nie funkcjazwroacuteci false Je li dodanie jest mo liwe warto licznika okre laj cego liczb trans-akcji przechowywana w buforze (Count) zwi ksza si o jeden Warto zastanowi si te dlaczego praktycznie ca e cia o tej funkcji jest zamkni te w sekcji atomowej (ATOMIC_BLOCK) Jedn z cech naszego sterownika ma by mo liwo wspoacute bie nego dost pu

Kup książkę Poleć książkę

62 AVR Uk ady peryferyjne

do LCD mdash to znaczy e danie np zapisu do LCD mo e wyst pi zaroacutewno w g oacutewnejp tli programu jak i asynchronicznie w przerwaniu St d te wynika e funkcja do-daj ca transakcj musi by napisana w sposoacuteb zapewniaj cy jej poprawn prac w sytu-acji gdy zostanie ona przerwana i ponownie wywo ana przed zako czeniem dzia aniajej poprzedniej instancji Umieszczenie cia a tej funkcji w sekcji atomowej nam to za-pewnia mdash dzi ki temu bufor transakcji zawsze b dzie spoacutejny Dla zaspokojenia cie-kawo ci warto usun sekcj atomow i sprawdzi jak wtedy b dzie zachowywa si tafunkcja i jak wp ynie to na spoacutejno przechowywanych danych

Drug niezb dn funkcj jest funkcja odczytuj ca bufor transakcji i zwracaj ca trans-akcj do zrealizowania (lub NULL je li adnej transakcji nie ma w buforze)

LCD_trans cbRead(CircBuffer cb) LCD_trans elem ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsEmpty(cb)) return NULL Bufor pusty nie mo na zwroacuteci elementu elem = cb-gtelements[cb-gtBeg] cb-gtBeg = (cb-gtBeg + 1) LCD_MAXTRANS -- cb-gtCount Zmniejszamy liczb elementoacutew pozosta ych w buforze return elem

Funkcja ta jest bardzo podobna do poprzedniej mdash najpierw sprawdza czy bufor za-wiera jak oczekuj c transakcj (cbIsEmpty(cb)) je li tak to zwraca adres opisuj -cej j struktury i zmniejsza liczb transakcji oczekuj cych (pole Count) W ten sposoacutebmamy zrealizowan ca funkcjonalno zwi zan z obs ug bufora pier cieniowegoPokazane funkcje s uniwersalne i z bardzo podobnych (lub wr cz tych samych) b -dziemy korzysta w kolejnych rozdzia ach w kontek cie np obs ugi transakcji zwi -zanych z interfejsami szeregowymi

Pora przej do samego sterownika LCD Jego zadaniem b dzie sprawdzenie czyw buforze oczekuj jakie transakcje do realizacji a je li tak to ich wykonanie Ponie-wa dane do LCD mog by wysy ane co okre lony minimalny czas znacznie d u -szy ni czas jakiego na to zadanie potrzebuje mikrokontroler do wysy ania kolejnychpaczek danych pos u ymy si timerem Timer b dzie generowa przerwanie nadmiaru(TCD0_OVF_vect) ktoacutere b dzie wyznacza o tempo w jakim kolejne porcje danych b -d trafia y do LCD Z noty katalogowej kontrolera wynika e minimalny czas trwa-nia wysokiego stanu sygna u Enable to 230 ns a okres tego sygna u nie powinien bykroacutetszy ni 500 ns Poniewa nasz dost p do LCD odbywa si w sposoacuteb nieblokuj cyMCU wi c szybko wysy ania danych do LCD jest bez znaczenia St d te w poka-zanym przyk adzie przyj to e dane b d wysy ane co 4 s co okre la sta a

define LCD_ACCESSTIME 0000004

Poniewa komunikacja z LCD odbywa si w sposoacuteb nieblokuj cy nie zale y nam tena czasie (i tak w stosunku do czasu od wie ania samego LCD jest on bardzo kroacutetki)w efekcie nie ma potrzeby odczytywania flagi busy kontrolera Dzi ki temu w cz ciprzypadkoacutew mo emy w ogoacutele zrezygnowa z sygna u wyboru RW i wymusi jego sta y

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 63

poziom logiczny umo liwiaj cy zapis do LCD Dzi ki temu mo na zaoszcz dzi do-datkowy pin IO1

Ca a logika naszego sterownika jest zawarta w funkcji obs ugi przerwania przepe nieniatimera (TCD0_OVF_vect) Poniewa LCD jest po czony z MCU w trybie 4-bitowym(dla zaoszcz dzenia liczby wykorzystanych pinoacutew IO) kolejne 8-bitowe dane muszby podzielone na dwie tetrady i wys ane do LCD w kolejno ci starszam odsza tetradaInformacja o aktualnie wysy anych danych jest umieszczona w zmiennej trans o typie

static struct uint8_t pos 6 Pozycja w polu danych aktualnej transakcji uint8_t nibble 1 Ktoacutera tetrada jest wysy ana seq

Dlaczego tak Dzi ki wykorzystaniu struktury i poacutel bitowych mo na zaoszcz dzi je-den bajt pami ci SRAM Ze wzgl du na wielko pami ci obs ugiwanej przez kon-troler LCD mo emy by pewni e transakcje zawieraj ce wi cej ni 63 bajty s ra-czej nierealne (nie mia yby wi kszego sensu) St d te do przechowywania informacjio aktualnie wysy anym bajcie danych wystarczy 6 bitoacutew mdash tyle samo zosta o wyko-rzystanych do okre lenia d ugo ci pola danych transakcji w strukturze LCD_trans Zaosz-cz dzony bit mo na po wi ci na flag nibble okre laj c ktoacutera tetrada (m odszastarsza)jest wysy ana Bez poacutel bitowych flaga ta zaj aby dodatkowy bajt pami ci

Przejd my do implementacji sterownika Pierwsz rzecz jak nale y sprawdzi jestto czy w buforze czeka jaka transakcja do zrealizowania Odpowiedzialny za to jestfragment kodu obs ugi przerwania nadmiaru timera

if(trans == NULL) Nic do zrobienia sprawd my czy jaka transakcja oczekuje trans=cbRead(ampLCD_TransBuffer) Czy jest jaka oczekuj ca transakcja seqpos=0 seqnibble=0 if(trans == NULL) TCD0_CTRLA=TC_CLKSEL_OFF_gc Nie ma adnych transakcji mdash wy cz timer

W przypadku gdy adna transakcja nie oczekuje na realizacj timer jest wy czanymdash dzi ki temu nie b d zg aszane kolejne przerwania przepe nienia i MCU nie b -dzie traci czasu na ich obs ug Co prawda wynikaj cy z tego zysk czasowy jest mar-ginalny lecz ma to istotniejsz konsekwencj mdash w przypadku usypiania MCU zb d-ne przerwanie timera nie b dzie niepotrzebnie wybudza o procesora W takiej sytuacjiponowne w czenie timera nast pi dopiero w funkcji dodaj cej transakcj do kolejkimdash a wi c w sytuacji gdy mamy pewno e istnieje oczekuj ca transakcja

Druga cz funkcji obs ugi przerwania jest zwi zana z realizacj samej transakcjiW pokazanym przyk adzie zaimplementowano tylko jeden typ transakcji mdash daniezapisu a cucha tekstowego pod wskazany adres VRAM (na okre lonej pozycji LCD)Je li zajdzie taka potrzeba programista mo e zaimplementowa inne polecenia i doda

1 Warto zauwa y e w bdquoklasycznejrdquo obs udze LCD te nie musimy czyta stanu flagi busy zamiast tego

wystarczy wprowadza p tle opoacute niaj ce Jednak poniewa taka obs uga blokuje MCU nie jest onazalecana Wady tej nie ma dost p transakcyjny co jest jego dodatkow zalet

Kup książkę Poleć książkę

64 AVR Uk ady peryferyjne

kod odpowiedzialny za ich obs ug Zauwa my e ka da transakcja musi zawieraadres pocz tku pami ci wideo od ktoacuterego b dzie zapisywany tekst Dzieje si takdlatego e transakcja wykonana wcze niej mo e ustawi wska nik zapisu na dowolnejkomoacuterce pami ci W efekcie tekst z kolejnej transakcji by by wy wietlany od komoacuterkina ktoacuterej zako czy si zapis poprzedniej transakcji Takie dzia anie oczywi cie jestniedopuszczalne st d te ka dy zapis do pami ci wideo poprzedza ustawienie rejestruindeksowego Problem ten mo na rozwi za tak e w inny sposoacuteb mdash poprzez wpro-wadzenie tzw uchwytoacutew (ang handlers) ktoacutere zawiera yby stan kontrolera LCDNiemniej to rozwi zanie dodatkowo komplikowa oby nasz sterownik Struktura danych(zawartych w polu data) ma wi c nast puj cy format

bajt nr 0 zawiera warto pozycji od ktoacuterej nale y dokonywa zapisu pami ciwideo mdash jest to warto przesy ana do rejestru okre laj cego adres zapisu

kolejne bajty zawieraj a cuch znakowy ktoacutery nale y umie ci w pami ciCGRAM

Poniewa bajt nr 0 zawsze zawiera warto wpisywan do rejestroacutew steruj cych kon-trolera podczas jego wysy ania jest ustawiana linia RS sygnalizuj ca zapis do rejestruPodczas wysy ania kolejnych bajtoacutew linia ta jest zerowana w zwi zku z czym zapisodbywa si do pami ci CGRAM

Kod obs uguj cy transakcj wygl da nast puj coif(trans) Jest transakcja do zrealizowania uint8_t dat=trans-gtdata[seqpos] if(seqnibble == 0) datgtgt=4 To trzeba zmieni je li linie danych nie s po czone z pinami 0 ndash 3 portu IO hd44780_outnibble_nowait(dat amp 0x0F seqpos = 0) Zapisujemy rejestr steruj cy lub dane ++seqnibble if(seqnibble == 0) ++seqpos Co drug tetrad zwi kszamy pozycj bufora if(seqpos gt= trans-gtlen) trans-gtReady=true Koniec transakcji if(trans-gtSelfDel) free_re(trans) Zwolnij pami transakcji je li tak sobie yczy programista trans=NULL Koniec transakcji CLR(OUT HD44780_E)

Ta cz przerwania wysy a kolejne tetrady do kontrolera LCD Warto zastanowi sinad dzia aniem sekwencji

++seqnibble

Poniewa pole nibble jest jednobitowe operacja inkrementacji prowadzi do zmianystanu tego pola na przeciwny (pole to ma warto 0 lub 1) Kiedy zostan wys anewszystkie dane przeznaczone dla kontrolera obs uga transakcji ko czy si Stan tensygnalizuje nadanie warto ci true polu Ready struktury LCD_trans Dzi ki temu pro-gram mo e sprawdzi asynchronicznie w stosunku do przerwania kiedy transakcjauleg a zako czeniu Opcjonalnie jest wykonywana jeszcze jedna funkcja mdash je li poleSelfDel ma warto true to pami zarezerwowana na transakcj jest automatycznie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 65

zwalniana W tym celu wykorzystuje si funkcj free_re ktoacuterej prototyp jest zade-klarowany w pliku Alloc_safeh Funkcja ta wywo uje funkcj biblioteczn free ktoacute-ra zwalnia pami przydzielon dynamicznie na stercie Poniewa funkcja ta nie jestfunkcj reentrant nale y stworzy odpowiedni bdquoprotez rdquo opakowuj c j w blokatomowy co zapewnia e nie zostanie ona ponownie wywo ana zanim jej poprzed-nia instancja nie zako czy dzia ania Oczywi cie lepszym rozwi zaniem by oby napi-sanie w asnych funkcji dynamicznej alokacji pami ci ktoacutere b d reentrant

Bardzo wa ne jest aby pole SelfDel mia o warto true wy cznie dla transakcjidla ktoacuterych pami zosta a przydzielona dynamicznie funkcj malloc (lub jej po-chodnymi) W pozosta ych przypadkach pole to musi mie warto false mdash nie-stosowanie si do tej regu y spowoduje b d mened era pami ci i najprawdopo-dobniej nieprzewidywalne dzia anie programu

Drug wa n zasad jest aby zmienna zawieraj ca dane transakcji nie by azmienn automatyczn mdash zmienne takie s automatycznie niszczone po opusz-czeniu zawieraj cej je funkcji W rezultacie obszar pami ci zawieraj cy danetransakcji mo e zosta wykorzystany przez inne zmienne co spowoduje uszkodzeniezawartych w nim danych

Pami przydzielona transakcji musi by alokowana w sposoacuteb dynamiczny (funkcjamalloc_re) ewentualnie mo e to by pami alokowana dla zmiennej globalnej lubstatycznej mdash zmienne tego typu istniej przez ca y czas ycia programu

Warto te zauwa y e instrukcje steruj ce stanem linii Enable kontrolera LCD(SET(OUT HD44780_E) i CLR(OUT HD44780_E)) s rozdzielone wieloma innymi in-strukcjami Dzi ki temu generowany impuls dodatni tego sygna u ma czas trwania gt230 ns wymagany w specyfikacji kontrolera Nawet dla XMEGA taktowanej zegarem32 MHz 230 ns przek ada si na oko o 7 instrukcji asemblera mdash czas jaki z pewno-ci up ynie pomi dzy wykonaniem obu powy szych instrukcji steruj cych

Do wysy ania danych do kontrolera zosta a wykorzystana nieco zmodyfikowanafunkcja hd44780_outnibble_nowait roacute ni ca si od jej protoplasty hd44780_outnibbletylko tym e nie czeka na sygna braku zaj to ci mikrokontrolera (nie realizuje teopoacute nie ) Nie jest to potrzebne gdy kolejne tetrady s wysy ane w odst pach cza-sowych okre lanych przez timer

Mamy wi c zapewnion obs ug transakcji i mo liwo transakcyjnego wy wietlaniadanych na LCD musimy jeszcze mie funkcj ktoacutera tworzy odpowiednie transakcjemdash jest odpowiednikiem funkcji bezpo rednio wysy aj cej dane znakowe do LCDOdpowiednikiem tym jest pokazana poni ej funkcja

bool LCD_PutText_B(uint8_t x uint8_t y char txt LCD_trans buf bool autodel) buf-gtcmd=LCD_Text buf-gtReady=false buf-gtSelfDel=autodel Czy zwolni pami po zako czeniu transakcji buf-gtdata[0]=HD44780_DDADDR(x+y0x40) Ustaw adres w DDRAM strcpy((char)ampbuf-gtdata[1] txt) Skopiuj dane tekstowe + NULL

Kup książkę Poleć książkę

66 AVR Uk ady peryferyjne

buf-gtlen=strlen(txt) + 1 D ugo tekstu + pozycji + NULL ndash 1 bool ret=cbAdd(ampLCD_TransBuffer buf) if((ret==false) ampamp (autodel)) free_re(buf) Brak miejsca w kolejce else TCD0_CTRLA=TC_CLKSEL_DIV1_gc Preskaler 1 mdash odblokuj timer return ret

Funkcja ta buduje transakcj odpowiedzialn za wy wietlenie napisu txt na wskaza-nej pozycji x y LCD Wszystkie dane o transakcji zostan umieszczone w buforzew pami ci ktoacuterej adres jest okre lany wska nikiem buf Pami w buforze musi bywystarczaj co du a aby pomie ci ca transakcj Dodatkowy parametr autodel okre laczy pami ta ma by automatycznie zwalniana po obs u eniu transakcji (true) czynie (false) Je li transakcj uda o si umie ci w kolejce funkcja zwraca true Wartozauwa y e w takim przypadku funkcja uruchamia te timer (w naszym przypadkujest to timer TCD0) odpowiedzialny za generowanie przerwania Funkcja obs ugi prze-rwania wysy a dane do LCD

Pewn odmian powy szej funkcji jest funkcjabool LCD_PutText(uint8_t x uint8_t y char txt) LCD_trans trans=malloc_re(sizeof(LCD_trans) + strlen(txt) + 2) bool ret=LCD_PutText_B(x y txt trans true) return ret

Wykorzystuje ona funkcj LCD_PutText_B z tym e najpierw alokuje dynamiczniepami potrzebn na przechowanie tworzonej transakcji

Mamy komplet potrzebnych funkcji a wi c sprawd my jak ca o sprawdza siw praktyce W pliku LCD-transactc znajduje si kod pokazuj cy jak dzia aj naszetransakcje Aby to by o mo liwe nale y zainicjalizowa kontroler LCD

LCD_init()

Wykorzystujemy tu znan ju funkcj inicjalizuj c mdash nie ma potrzeby jej zmienia gdy operacja inicjalizacji LCD jest jednorazowa i nie trzeba wykonywa jej w posta-ci transakcji W drugim kroku musimy zainicjalizowa wykorzystywany timer i systemprzerwa

LCD_Timer_init(ampTCD0)PMIC_CTRL|=PMIC_LOLVLEN_bm Odblokuj przerwania niskiego poziomusei()

Poniewa dost p do LCD z pewno ci nie jest czynno ci krytyczn czasowo prze-rwaniom timera nadano najni szy priorytet Dzi ki temu mo na innym bardziej kry-tycznym przerwaniom nada wy sze priorytety i uzyska w ten sposoacuteb zmniejszenieczasu latencji obs ugi przerwa Sama inicjalizacja timera jest niezwykle prosta

void LCD_Timer_init(TC0_t tc) tc-gtINTCTRLA=TC_OVFINTLVL_LO_gc Odblokuj przerwania nadmiaru timera i nadaj im niski priorytet tc-gtPER=F_CPULCD_ACCESSTIME Przerwanie co 4 us (niezale nie od F_CPU)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 67

Sprowadza si ona tylko do odblokowania mo liwo ci zg aszania przerwania nadmia-ru oraz konfiguracji rejestru PER tak aby przerwania by y generowane co ok 4 s mdashniezale nie od cz stotliwo ci taktowania CPU Mo emy wi c przyst pi do wy wie-tlenia pierwszego napisu

LCD_PutText(00 Numer)

Powy sza funkcja ma jedn wad mdash alokuje dynamicznie pami po ka dym wywo-aniu (pami ta jest automatycznie zwalniana po obs u eniu transakcji) niemniej

ca y proces jest czasoch onny Mo emy tego unikn alokuj c pami bdquor cznierdquo i wielo-krotnie wykorzystuj c zaalokowany blok pami ci Ilustruje to poni szy przyk ad

LCD_trans buf=malloc_re(sizeof(LCD_trans) + 7)

Zmienna buf wskazuje na obszar pami ci ktoacutery mo e pomie ci a cuch 5-znakowyTyle wystarczy na potrzeby tego przyk adu mdash na LCD b d wy wietlane kolejneliczby w zakresie 0 ndash 65 535 najd u sza ma 5 znakoacutew st d te nasz bufor ma tak a nieinn d ugo

while(1) utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(60 bufstr buf false) while(LCD_IsTransCompleted(buf))

Do konwersji liczby na a cuch u yto funkcji bibliotecznej utoa (nag oacutewek stdlibh)Poniewa d ugo a cucha po konwersji jest zmienna (co spowodowa oby pozosta-wianie na LCD bdquoduchoacutewrdquo po poprzednich konwersjach) w kolejnej linii brakuj ceznaki uzupe niono spacjami Nast pnie tworzona jest transakcja w obszarze pami ciprzydzielonym zmiennej buf Ostatnia p tla while jest odpowiedzialna za oczekiwa-nie na zako czenie realizacji transakcji Po jej zako czeniu p tla jest wykonywana odpocz tku

Uwa ny czytelnik z pewno ci zauwa y e pami przydzielana funkcj malloc_renie jest nigdzie zwalniana mdash w normalnej sytuacji spowodowa oby to wyciek pami -ci W naszym przyk adzie jednak program nigdy si nie ko czy nie ma wi c potrzebyzwalniania pami ci wskazywanej przez zmienn buf

Powy szy przyk ad pokazuje jak unikn blokowania CPU na czas dost pu do wolnodzia aj cego urz dzenia jakim jest LCD alfanumeryczny Jednak to nie wszystkiezalety wynikaj ce z zastosowania transakcji Drug wa n zalet naszego rozwi zaniailustruje przyk ad znajduj cy si w katalogu PrzykladyLCD-alfaLCD-transact-intPowa nym ograniczeniem funkcji odpowiedzialnych za dost p do LCD w sposoacutebklasyczny by a niemo no ich wywo ywania z funkcji obs ugi przerwa mdash funkcjeobs ugi LCD nie by y reentrant2 Nasz system oparty na transakcjach nie ma tychwad Aby to zilustrowa zosta stworzony prosty przyk ad mdash tak jak poprzedniow p tli g oacutewnej programu s wy wietlane stale kolejne liczby ale jednocze nie wyko-

2 Poza tym blokowa y CPU na d ugi czas a jak pami tamy funkcje obs ugi przerwa powinny by

wykonywane mo liwie kroacutetko

Kup książkę Poleć książkę

68 AVR Uk ady peryferyjne

rzystano drugi timer (TCD1) w ktoacuterego funkcji obs ugi przerwania przepe nienia jestwy wietlany licznik tych przerwa

ISR(TCD1_OVF_vect) static char int_buf[sizeof(LCD_trans) + 7] static uint16_t cnt char bufstr[6]

utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(61 bufstr (LCD_trans)ampint_buf false)

Jak widzimy w sposoacuteb asynchroniczny z dwoacutech miejsc w programie mo emy uzy-ska dost p do LCD a ka da funkcja bdquoma wra enierdquo e ma LCD na wy czno Przy okazji warto przeanalizowa sposoacuteb w jaki jest rezerwowana pami na trans-akcj w przerwaniu Oczywi cie mo na by wykorzysta dynamiczn alokacj pami cilecz jak wspomniano taka alokacja jest czasoch onna St d te w pokazanym przy-k adzie wykorzystano tablic statyczn int_buf o rozmiarze umo liwiaj cym prze-chowanie kompletnej transakcji Dzi ki temu e zmienna int_buf jest zmienn statycz-n nie jest ona niszczona po zako czeniu funkcji obs ugi przerwania Gdyby pomins owo kluczowe static zmienna ta by aby niszczona a na LCD najprawdopodobniejzacz yby si pojawia przypadkowe tre ci Poniewa pami naszego bufora nie by aalokowana dynamicznie nie mo e ona zosta zwolniona w naszym sterowniku LCDst d te ostatni parametr wywo ania funkcji LCD_PutText_B musi mie warto false

OptymalizacjaPrzy okazji tego i poprzedniego przyk adu warto zastanowi si jeszcze nad jednkwesti mdash optymalizacji W podanych przyk adach wykorzystano wcze niej omoacute-wione funkcje dost pu do wy wietlacza LCD znajduj ce si w plikach hd44780ci hd44780h Wi kszo z zawartych tam funkcji nie jest wykorzystywana jednakkompilator mimo wszystko umieszcza ich kod w pliku wynikowym mdash dzieje si takponiewa nie mo e on bdquostwierdzi rdquo czy funkcje te nie s wykorzystywane w innychfragmentach programu Pami tajmy e kompilator kompiluje poszczegoacutelne pliki roacute-d owe osobno i dana jego instancja nie bdquowierdquo co znajduje si w innych plikach (innychjednostkach kompilacji) Tak ca o ciow wiedz ma dopiero konsolidator (linker)ktoacutery czy stworzone przez kompilator pliki obiektowe (o rozszerzeniu o) w plikwynikowy Linker jednak bdquonie wierdquo ktoacutera z funkcji programu zosta a u yta a ktoacuteranie mdash informacje te ma wy cznie kompilator W ten sposoacuteb powstaje typowe b dneko o w efekcie nasze nieu ywane funkcje nie s usuwane (linker zostawia je bdquonawszelki wypadekrdquo) i zajmuj niepotrzebnie pami Czy mo na temu jako zaradzi Oczywi cie tak W tym celu trzeba po czy si y kompilatora i linkera co zapewniaj od-powiednie opcje kompilacji We w a ciwo ciach projektu (ProjectProperties lub Alt+F7)wybieramy zak adk Toolchain a nast pnie AVRGNU C Compiler i OptimizationZnajdziemy tam pole wyboru o nazwie Prepare functions for garbage collection (ry-sunek 224)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 69

Rysunek 224 Aby da linkerowi mo liwo usuwania nieu ywanych funkcji nale y skompilowaprogram z wybran opcj ndashffunction-sections ktoacutera spowoduje e ka da funkcja programu znajdzie siwe w asnej sekcji

Zaznaczenie tej funkcji spowoduje umieszczenie ka dej funkcji w osobnej sekcji mdashsamo w sobie nie wp ynie to na skroacutecenie kodu wynikowego ale jest warunkiem nie-zb dnym dla podj cia stosownych dzia a przez linker Aby wyeliminowa nieu y-wane funkcje nale y zaznaczy jeszcze w ga zi AVRGNU LinkerOptimization poleGarbage collect unused sections (rysunek 225)

Rysunek 225 Zaznaczenie opcji Garbage collect unused sections (-Wl--gc-sections) spowodujee nieu ywane funkcje zostan usuni te z kodu wynikowego w efekcie kod programu ulegnie skroacuteceniu

Po zaznaczeniu tych opcji program zostanie skroacutecony o kilkaset bajtoacutew Oczywi cieje li wszystkie funkcje by yby wykorzystane nie uzyskaliby my adnego skroacuteceniakodu Niemniej w sytuacji gdy u ywa si bibliotek zazwyczaj przynajmniej czfunkcji nie jest wykorzystywana warto wi c skorzysta z tej mo liwo ci optymalizacji

Kup książkę Poleć książkę

70 AVR Uk ady peryferyjne

Je li mamy do czynienia z prekompilowan bibliotek (lib) to musi ona by skom-pilowana z zaznaczon opcj Prepare functions for garbage collection (-ffunction-sections) Alternatyw jest umieszczenie ka dej funkcji biblioteki w osobnym pliku(tak jak w przypadku bibliotek AVR-libc)

Na ekranie wyboru opcji optymalizacji linkera mamy jeszcze jedn przydatn opcjmdash Relax Branches (-mrelax) Dla mikrokontroleroacutew ktoacutere maj ponad 8 kB pami ciFLASH instrukcje skokoacutew s generowane jako tzw instrukcje d ugie mdash umo liwiajone skok do komoacuterki pami ci FLASH o dowolnym adresie Jednak cen za to jestwyd u enie instrukcji mdash ich kod jest d u szy podobnie jak czas wykonania Nie zawszejednak takie d ugie instrukcje musz by wykonywane mdash je li miejsce docelowe skokule y blisko (w zasi gu instrukcji skokoacutew wzgl dnych) to mo na w kodzie wynikowymzamieni instrukcje d u sze na kroacutetsze co przynosi oszcz dno ci w postaci skroacuteceniakodu wynikowego Poniewa dopiero linker bdquowierdquo jak poszczegoacutelne fragmenty kodus rozmieszczone w pami ci takiej podmiany mo na dokona na etapie linkowaniaprogramu co zapewnia powy sza opcja St d te warto to pole wyboru zaznaczy

Kup książkę Poleć książkę

SkorowidzA

ABI Application Binary Interface 25AC Address Counter 50ADPCM 482adres

bazowy 377bufora 61komoacuterki 84pu apki 202

ALE Address Latch Enable 368alfanumeryczne wy wietlacze 43algorytm ADPCM 492algorytmy stratne 495animacje 57antyaliasing 325architektury procesoroacutew XMEGA 352asembler 23

dyrektywy 40funkcje j zyka C 41obs uga przerwa 39

asynchroniczne wywo anie funkcji 101Atmel Studio 15

Bbajty kalibracyjne 569biblioteka

FATFS 131 139 176 180 517libcallback-liba 99PetitFS 144 149

bitADC_CH0START_bm 236IMPMODE 244

bitrate 442 512blokowanie przerwa 219b d 16 19

kwantyzacji 463offsetu 230wzmocnienia ADC 230

BOD 223bps bits per second 12

budowakarty 152linii obrazu 394pami ci SDRAM 374pliku stymulacji 192ramki PAL 412sygna u PAL 411wtyczki 544 545

bufor 78FIFO 497na transakcje 61transakcji 62

buforowanie wyj cia 294

CCAS Column Address Strobe 375CCFL 44charakterystyka

przetwornikoacutew 222termistora 264tryboacutew pracy 232

CID Card Identification 169CKE Clock Enable 375CLKIN 421COG Chip on Glass 310CRC 158 178CRC16 178CRC7 164CS Chip Select 361 375CSD Card Specific Data 172czas

dost pu do SDRAM 424adowania kondensatora 244

propagacji 281proacutebkowania 260symulacji 209

czcionki 322cz stotliwo

odchylania pionowego 428proacutebkowania 244 441 444 530przebiegu 504

Kup książkę Poleć książkę

576 AVR Uk ady peryferyjne

cz stotliwoPWM 465taktowania koprocesora 549taktowania procesora 209taktowania rdzenia 18

czyszczenie pami ci 318

DDAC Digital to Analog Converter 293 447 451

buforowanie wyj cia 294generowanie przebiegoacutew 301jitter 303kalibracja 306napi cie referencyjne 295system zdarze 297taktowanie 296tryb dwukana owy 301wykorzystanie DMA 298wyzwalanie konwersji 305

datalogger 261 265 275DD Device Density 86debuger 183

programowy 190sprz towy 185 187

decymacja 259DEBUG 219XMEGA 260

definicja symboli globalnych 36definiowanie w asnych znakoacutew 56deklaracja zapowiadaj ca 103 337dekoder DTMF 548 556DMA 254 298 402 458 518 523dost p do

danych 358 359 568danych binarnych 356 360danych wielobajtowych 31DataFLASH 137EEPROM 128FAT 136komoacuterki 375LCD 59 62 66 68operandu 30pami ci 81 384 386 387 561pami ci SDRAM 424pliku blokowy 141portoacutew IO 30rejestroacutew IO procesora 36rejestroacutew uk adu 499SPI 95sygnatury u ytkownika 565 567wska nikoacutew 32

DQM Data Mask 375DSP Digital Signal Processor 535

DTMF 535 553dyktafon 529dynamiczna alokacja pami ci 516dyrektywa global 38dyrektywy asemblera 40dzia anie

DMA 255komparatora 280timeroacutew 400

d wi k 443

EEBI External Bus Interface 361EEPROM 207eliminacja jitteru 24emulacja RS232 139

FFAT File Allocation Table 128 131FAT32 128FATFS 180filtr

dolnoprzepustowy 491drugiego rz du 470pierwszego rz du 469trzeciego rz du 471

filtrowanie sygna u PWM 468firmware 565FLASH 207format

odpowiedzi 159polecenia 158protoko u 157

funkcja_delay_ms 17 219c_zero 42callback 106 341callback() 99DataFLASH_CSEnable 100DF_FinishBufWrite() 269disk_initialize 136disk_ioctl 181disk_status 136disk_write 138DMA_SPI_init 104DTMF_GetCode 553free_re 65GPIOR0_init 507hd44780_outcmd 51hd44780_outnibble_nowait 65LCD_defchar_P 57

Kup książkę Poleć książkę

Skorowidz 577

Menu_Click_Func 515Menu_Free 516Menu_Recorder 532Menu_Run 527MS_CreateRegEntry 117MS_GetDirPos 125MS_GetRegItem 115MS_WritePages 116 118OSC_wait_for_rdy 473RecMenu_StartStop 532sprintf 142strtok 124sysclk_init() 200 209TMF_memcpy_PF 454udi_cdc_getc() 123udi_cdc_is_rx_ready() 123VS1003_Reset 506

funkcjeanalizuj ce 556biblioteczne 50biblioteki FATFS 143j zyka C 41kontrolera ST7565R 313opoacute niaj ce 17opoacute nie 219reentrant 524specjalne kontrolera 319steruj ce 314zapisu 133

fusebit 557BODACT 560BODLEVEL 560BOOTRST 559DVSDON 560EESAVE 561JTAGEN 558RSTDISBL 559SUT 559TOSCSEL 559

fusebity w AVR-libc 571

Ggenerator obrazu composite 426generowanie

d wi ku 461kolorowego obrazu 437obrazu wideo 391przebiegoacutew 301przerwa 285sygna u composite 409

g bia koloru 326gniazdo

karty SD 156VGA 396

Hhistereza 281

IIDE 11IMA ADPCM 483informacje

o kolorze 431o obrazie 434

inicjalizacjakarty 161karty SDHC 167karty SDSC 167karty SDXC 167licznika 419pami ci 119USART 505

instrukcjaicall 42movw 35nop 13 24

interfejsSCI 498SDI 498SPI 71 79RS232 120UART 123USART 71 73

interpolacja 259interpolacja w XMEGA 260inwersja obrazu 319

Jjednostki 12jitter 24 303 420

Kkalibracja

ADC 229DAC 306 564offsetu 237

kana DMA 82 522karta 154 158

mikroSD 152SD 151 152SDHC 151 152 160SDSC 160SDXC 151 160

Kup książkę Poleć książkę

578 AVR Uk ady peryferyjne

karty pami ci 151 152 157biblioteka FATFS 180budowa 152format polecenia 158inicjalizacja 161 167komunikacja 156odczyt danych 173opcje konfiguracyjne 181rejestry specjalne 169tryby pracy 153zapis danych 176zasilanie 154

kodasemblerowy 23 24C 23dost pu 24

kodowanieμ-law 481ADPCM 483Dialogic ADPCM 494informacji 166 426koloru 425znakoacutew 536

kodyformatoacutew audio 501zdarze 545

kolejno bajtoacutew 533kolor 424 430kolorowy obraz 437komparator 422

analogowy 279 280analogowy XMEGA 282okienkowy 284

kompilacja plikoacutew binarnych 350kompilator avr-gcc 11 359kompresja

ADPCM 482 486d wi ku 480IMA ADPCM 482

komunikacja z koprocesorem 504konfiguracja

4-portowa 364biblioteki 133debugera 185DMA 459 522fusebitoacutew 570kontrolera DMA 257 452komparatoroacutew 285lockbitoacutew 570LPC 371pami ci SDRAM 381PetitFS 149pinu IO 225portoacutew IO 362

preskalera 452projektu 186przerwa 219pu apki 203rejestru EVCTRL 248rejestru PER 67SPI 75sygna u CS 377typu czcionki 324urz dze IO 189USART 76zegara 383

konsolidacja 547kontroler

DMA 254 298 402 458 518 523KS108 310ST7565R 310ndash315 321

konwersjaDAC 305sygna oacutew 396wyzwalana 306

konwertercyfrowo-analogowy 426DAC 427

koprocesormp3 496VS1003B 10

korekcja fazy 466kwantyzacja 463

Llampa CCFL 44LE Latch Enable 433licznik 419

cykli 209TCC1 400timera 20

linie IO 50linie sygna owe

MISO 72 164MOSI 72SCK 72SS 72

linker 69lista

mnemonikoacutew 24modyfikowanych rejestroacutew 32

lockbity 557 561lockbity w AVR-libc 570LPC Low Pin Count 371LPCM 443 556LSB Least Significant Bit 228

Kup książkę Poleć książkę

Skorowidz 579

a cuchy formatuj ce 212czenie plikoacutew 352

Mmagistrala pami ci zewn trznej 361magnetofon cyfrowy 528makro _SFR_IO_ADDR() 39makrodefinicja

ASSERT 214HD44780_CGADDR() 53HD44780_CLR 53HD44780_DDADDR() 53HD44780_DISPCTL() 52HD44780_ENTMODE() 52HD44780_FNSET() 52HD44780_HOME 53HD44780_SHIFT() 51LOCKBITS 571

mapowanie sygna oacutew 366mapy bitowe 343marker czasowy 268maski bitowe 329matryce 49menu 335menu piktogramowe 342mierniki temperatury 262mikrokontroler

ARM 9AVR 9PIC 9XMEGA128A3U 10

MISO 72moc wydzielana 265model psychoakustyczny 495modu

alfanumeryczny 45NVM 568Xmega eXploreGO 10Xplained ATXMEGA A3BU 10Xplained ATXMEGA-A1 10Xplained XMEGA128A1 447Xplained XMEGA256A3 94Xplained XMEGA256A3BU 97 143 266

modyfikator 30const 85volatile 28 273

monitory CRT 395monochromatyczne wy wietlacze graficzne 309monochromatyczny

tryb graficzny 416tryb tekstowy 413

MOSI 72mp3 495Msps Megasamples per second 12multiplekser wej ciowy 226 283multipleksowanie adresoacutew 368 369muzyka 439

Nnadawanie kodoacutew DTMF 540nadproacutebkowanie 258nag oacutewek kontenera wav 500nagrywanie mowy 486najmniej znacz cy bit 228napi cie

offsetu 280referencyjne 223 295zasilania 239

Oobracanie obrazu 319obraz 319

composite 426kolorowy 430wideo 391

obroacutebka d wi ku 443 445obs uga

FAT 131 143klawiatury matrycowej 24LCD 58 63 67menu 337przerwania 37 38 458przerwania DMA 525przerwa w asemblerze 39przyciskoacutew 272wy wietlaczy alfanumerycznych 45

odczytblokowy 140danych 173 358

odpowied response 159R1 159R2 159R7 160

od wie anie pami ci 376odtwarzanie

d wi ku 472muzyki 447 513 518 521

offset 238offset ADC 230okno

Breakpoints 202Call stack 209dezasemblera 210

Kup książkę Poleć książkę

580 AVR Uk ady peryferyjne

oknoIO View 207podgl du zmiennych 211wyboru czcionek 324

OLED 46opcje

kompilatora 35zapisu d wi ku 445

operacjena buforach 91odczytu 173zapisu 176zapisu strony 92

operand 29operator

ascii 41

asciz 41

byte 41

section 41opoacute nienia 13 18opoacute nienie zmienne 16optymalizacja 16 68optymalizator 26organizacja pami ci 77organizacja pami ci VRAM 316oscylator 287OSD On-Screen Display 417ostrze enie 16oszcz dzanie energii 94

Ppakiet WinAVR 48pami

CGRAM 56 57 64DataFLASH 10 77 81 113 269DDRAM 49EEPROM 111FLASH 54 124 207RAM 49SDRAM 372SRAM 63 124 329 366 371VRAM 314 317

PCLK 421PCM 443PetitFS 144 149p tla

for 13while 201

pierwsza linia obrazu 321piksel 430piktogram 342pin IO 225

plikAlloc_safeh 65DataFLASHc 83DataFLASHIOc 136definesh 50delayh 14diskioh 132 136ffh 132ffconfh 132 181hd44780h 49integerh 132ioh 30LCD_transc 61LCD-transactc 66Makefile 14Menuc 19nothingo 541outfiletxt 547 551pffh 149SPIh 104stringh 113stymulacji 191 192

pliki mp3 495elf 351fon 323o 24S 24 34binarne 350 355csv 276d wi kowe 440obiektowe 352wav 500WMA 512z czcionkami 327z danymi 349

podbijacz napi cia 315podgl d

pami ci 207stosu wywo a 209zmiennych 211znakoacutew 325

pod czeniefototranzystora 262karty SD 155LCD z kontrolerem 311modu u 50pami ci 362 369 370 373termistora 262uk adu LM35 251wyj XMEGA 398

pod wietlenieCCFL 46OLED 46

Kup książkę Poleć książkę

Skorowidz 581

podwoacutejne buforowanie 255 332 457polecenia

kasowania strony 81konfiguracyjne pami ci 82kontrolera ST7565R 315odczytu bufora 82 89odczytu pami ci 81 88SDRAM 376transferu 91

polecenieACMD41 168cd 181CID 178CMD0 165CMD8 167CSD 178date 276dir 127 181dump 276erase 276get 276HD44780_CLR 51Init 178mkdir 181

po czenieDMA ze SPI 96dwoacutech komparatoroacutew 285koprocesora mp3 497LCD z mikrokontrolerem 48wyj cia XMEGA 411XMEGA z PC 121z telewizorem 431

pomiarnapi cia zasilania 239temperatury MCU 241

port IO 30 362pozycjonowanie grafik 345poacute obraz 410precyzja pomiaroacutew 260preskaler 478preskaler ADC 243program

Atmel Data Visualizer 275Audacity 443avr-objcopy 350dataloggera 265LCD Image Converter 323makeloadingtableexe 543Realterm 127 554riffstrip 483SoX 445Tracepoint 208

programowanie sygnatury u ytkownika 566protokoacute master-slave 157

prototypy 136proacutebki d wi kowe 447proacutebkowanie

8-bitowe 300nieliniowe 480

prymitywy graficzne 330przebieg PWM 468przebiegi 289 303przechwytywanie danych 276przemiatanie wej 253przerwanie 218 254 286 403

DMA 522komparatora 286

przestrze adresowa procesora 378przesy anie

danych 498polece 498

przetaktowanie procesora 436przetwornik

ADC 221analogowo-cyfrowy 221cykliczny 222potokowy 222

przyciski 272pseudooperatory 41pu apki breakpoints 197pu apki warunkowe 205punkty ledzenia 203PWM 461 462 472

RRAS Row Address Strobe 375redukcja poboru energii 242regulacja kontrastu 321rejestr 32 34rejestr AC 50

adresu wtyczki 513BASEADDR 377CID 169CMP 251CSD 172czasu utworu 512DATA 83EVCTRL 248formatu audio 512identyfikacyjny pami ci 87INTFLAGS 252kontroli basoacutew 510kontroli g o no ci 513MUXCTRL 227OCR 168PER 67poroacutewnania 249

Kup książkę Poleć książkę

582 AVR Uk ady peryferyjne

rejestr ACSCI_CLOCKF 511stanu komparatora 287stanu pami ci 86stanu uk adu 510trybu pracy 508WINCTRL 285

rejestrydost pu do pami ci RAM 513GPIOR 502IO procesora 36mikrokontrolera 25procesora 35specjalne 94specjalne karty 169uk adu VS1003B 508

relacja rodzic ndash dziecko 336reset uk adu 534rozdzielczo

LCD 329przetwornika 231PWM 463 477

rozszerzenie HiRes 477 479roacutewnanie Steinharta-Harta 263rysowanie map bitowych 343

Sschemat uk adu dataloggera 267SCI Serial Command Interface 498SCK 72SD Secure Digital 152SDI Serial Data Interface 498separator synchronizacji 422separowanie impulsoacutew synchronizacji 422shieldy 10skaler 422skaler napi cia 283skrypt makefile 353s owo kluczowe

asm 27extern 37static 68

specyfikatory lokalizacji zmiennej 213sps samples per second 12SS Slave Select 72standard PAL 410standard VGA 393sterowanie

dataloggerem 275sygna em 379

sterownik 121HD44780 49 56LCD 49 62

stos wywo a 209

strukturaFATFS 139Handle 118LCD_trans 60 63menu 338rejestru 86SimpleFSEntry 113 116SimpleFSHandle 113 118 140submenu 527systemu plikoacutew 112

sumabitowa 571kontrolna 178

sygnacomposite 409composite video output 430CS 377DREQ 497H-Sync 396synchronizacji 423V-Sync 396zegarowy CLK 374

sygna yinterfejsu EBI 363magistrali EBI 364steruj ce 375

sygnaturaprodukcyjna procesora 563u ytkownika 565

symbol__DELAY_ROUND_CLOSEST__ 17__DELAY_ROUND_DOWN__ 17_FS_FAT12 149_FS_FAT32 149_FS_MINIMIZE 133_FS_READONLY 133_FS_RPATH 135_FS_TINY 133_MAX_SS 135_MULTI_PARTITION 135_USE_DIR 149_USE_FASTSEEK 134_USE_FORWARD 134_USE_LABEL 134_USE_LFN 134_USE_LSEEK 149_USE_MKFS 134_USE_READ 149_USE_STRFUNC 134_USE_WRITE 149_VOLUMES 136F_CPU 14 15 18increment 36USE_BUSY_FLAG 50

Kup książkę Poleć książkę

Skorowidz 583

symboleglobalne 36w asemblerze 28zewn trzne 39

symulacja 198 209symulator 190synchronizacja

pami ci 331pionowa 395pozioma 394

systemplikoacutew 111 128przerwa 404zdarze 245

szablonfont_XMEGAtmpl 326image_XMEGAtmpl 343

szum 463szybko przesy ania danych 126

ledzenie wi zki 333rodowisko

graficzne 11programistyczne 11VSIDE 542WinAVR 47

Ttabela FAT 130tablica

framebuf 402 408plugintbl 552 555tekst 208z kodem wynikowym 543

taktowanieDAC 296mikrokontrolera 473

technologia OLED 44temperatura mikrokontrolera 239 241termistor 262 290

NTC 263PTC 263

termometrLM35 249 250z alarmem 251

termostat 290test uk adu VS1003B 503testowanie obrazu 319timer 16 62

TCC0 20

TCC1 399transakcja 59 62 65transakcje 17 103ndash107transakcyjna obs uga LCD 58transakcyjny dost p do SPI 95transfer 91

danych 97wynikoacutew 254

transmisja 72 83tryb

bez znaku 234ci g ej konwersji 252czterobitowy 153dwukana owy 301graficzny 416graficzny VGA 407idle 419jednobitowy 153LPC 371monochromatyczny 397 407oszcz dzania energii 94 306pracy multipleksera 226pracy SPI 157roacute nicowy 232single slope 312SPI 153tekstowy 413tekstowy VGA 397z pojedynczym wej ciem 234ze znakiem 235

trybygenerowania PWM 467pracy karty 153pracy przetwornika 231pracy SPI 74pracy uk adu 508

twierdzenie Nyquista 258tworzenie

adresu 84nak adek 417obrazu 335tablicy 543

typ__uint24 119karty 160niekompletny 60wyliczeniowy 114

typyoperandoacutew 29w AVR 34

Kup książkę Poleć książkę

584 AVR Uk ady peryferyjne

Uuchwyt handle 64 113uk ad

AD725 427 431buforowy 294CS 361DAC 284dataloggera 267detekcji awarii zasilania 559generuj cy obraz 393HiRes 477ICL7660 47LM35 250 251SampH 293sterowania sygna em 379USART 401VS1003B 496 503 508 530 538 556VS100XX 529wzmacniania sygna u 227

uk ady peryferyjne 9uruchomienie komparatora 287urz dzenie

master 72slave 72

u rednianie 259utrata danych 141u ycie wstawki asemblerowej 33

VVGA 393

Wwarto ci kalibracyjne

ADC 564oscylatoroacutew 564temperatury 564

warunkowa kompilacja 36WE Write Enable 375wej cie composite video input 425wektor przerwa 38 257wideo 391wielko pami ci 86 377w czenie DAC 299wska nik na struktur 27wska niki 32wstawki asemblerowe 24 33wtyczka 535 541 544

SineDTMF Generator 537VGA 396

wyboacuter cz stotliwo ci PWM 465 474wykorzystanie

DMA 254 518

EuroSCART 428PWM 461rejestroacutew 34

wyliczanie predyktora 489wy wietlacze

alfanumeryczne 43 45graficzne 43 309LCD 43OLED 46

wy wietlanielitera u 213map bitowych 344obrazu 333 346 406obrazu VGA 393

wywo ania zwrotne callbacks 98asynchroniczne 101synchroniczne 101

wyzwalanie konwersji 245wzmacniacz 446wzmacniacz operacyjny 279wzmacnianie sygna u 227

XXMEGA 9 18

Zzapis

bufora 269danych 176d wi ku 440 556

zasilaniekarty 154pami ci 109

zatrzask 368zatrzask 74HC573 433zatrza ni cie adresu 369zdarzenia 297zdarzenie compare match 399zegar 383 420 426zintegrowane rodowisko programistyczne 11z cze EuroSCART 425 428 429zmiana

g o no ci 527wielko ci strony 94

znaki 56

roacuted onapi cia odniesienia 284sygna u 240

Kup książkę Poleć książkę

Page 7: Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8 AVR. Ukäady peryferyjne Rejestry dost pu do pami ci RAM .....513 Rejestr adresu

8 AVR Uk ady peryferyjne

Rejestry dost pu do pami ci RAM 513Rejestr adresu wtyczki 513Rejestr kontroli g o no ci 513

Odtwarzamy muzyk 513Odtwarzamy muzyk z wykorzystaniem DMA 518

Magnetofon cyfrowy 528VS100XX w roli magnetofonu 529

W asne wtyczki 535DTMF jako przyk ad w asnej wtyczki 535

Budujemy w asn wtyczk 541Tworzenie tablicy z kodem wynikowym 543Budowa wtyczki 544W asna aplikacja czyli dekoder DTMF 548

Rozdzia 36 Fusebity i lockbity 557Fusebity 558

Fusebit JTAGEN 558Fusebit RSTDISBL 559Fusebit BOOTRST 559Fusebity SUT 559Fusebit TOSCSEL 559Uk ad detekcji awarii zasilania 559Watchdog 560Fusebit EESAVE 561

Lockbity 561Sygnatura produkcyjna procesora 563

Numer serii 563Numer wafra 563Po o enie na wafrze 564Pozosta e bajty konfiguracyjne 564

Sygnatura u ytkownika 565Dost p do danych z poziomu aplikacji u ytkownika 568

Bajty kalibracyjne 569Konfiguracja fuse- i lockbitoacutew w AVR-libc 570

Lockbity w AVR-libc 570Fusebity w AVR-libc 571

Dodatek A Spis rozdzia oacutew ksi ki bdquoAVR Praktyczne projektyrdquo 573

Skorowidz 575

Kup książkę Poleć książkę

Rozdzia 22

Wy wietlacze LCDalfanumeryczne

Z tego rozdzia u dowiesz si

jak pod czy popularne wy wietlacze alfanumeryczne do XMEGA

jak stworzy bibliotek obs uguj c kontroler HD44780

jak przesy a polecenia dla LCD w formie transakcji i jak czy dost pdo kontrolera z aplikacji i funkcji obs ugi przerwa

Ze wzgl du na malej ce ceny zwi kszaj c si dost pno oraz niski poboacuter energiicoraz wi kszym zainteresowaniem ciesz si wy wietlacze LCD W tym rozdzialezostan omoacutewione wy wietlacze alfanumeryczne mdash ze uwagi na ich prostot s ci -gle najcz ciej stosowanymi typami wy wietlaczy W dalszej cz ci ksi ki zostanomoacutewione monochromatyczne wy wietlacze graficzne mdash daj one o wiele wi kszemo liwo ci ale ich sterowanie jest nieco bardziej skomplikowane Ze wzgl du na ko-nieczno przesy ania sporej liczby danych wymagaj tak e szybszego interfejsu -cz cego z mikrokontrolerem St d te zanim przejdziemy do ich praktycznego wyko-rzystania b dziemy musieli bli ej zapozna si z kilkoma uk adami peryferyjnymiXMEGA

Wy wietlacze LCD alfanumeryczne zawieraj zazwyczaj scalone kontrolery st d teprocesor nie steruje bezpo rednio matryc LCD ale komunikuje si z wyspecjalizo-wanym sterownikiem ktoacutery wykonuje jego polecenia Dlatego te wykorzystanie te-go typu wy wietlaczy wymaga znajomo ci typu u ytego w nich sterownika Wy wie-tlacze LCD mog by czone z mikrokontrolerem za pomoc roacute nych magistral mdashnajcz ciej s to magistrale SPI lub roacutewnoleg e (w wersji 4- 8- i 16-bitowej) Samewy wietlacze ze wzgl du na budow i mo liwo ci mo emy podzieli na dwie grupy

Wy wietlacze alfanumeryczne mdash umo liwiaj one wy wietlanie cyfr literi innych symboli Jednak w tym typie nie mamy mo liwo ci sterowaniaposzczegoacutelnymi pikselami

Wy wietlacze graficzne mdash w tym typie mo emy sterowa stanem ka dego piksela

Kup książkę Poleć książkę

44 AVR Uk ady peryferyjne

Aby wy wietlana na LCD zawarto by a widoczna niezb dne jest pod wietlenieKupuj c wy wietlacz musimy zwroacuteci uwag czy jest on wyposa ony w jakie pod-wietlenie (mo na dosta wy wietlacze LCD bez pod wietlenia) Oczywi cie lepiej

jest wybra wy wietlacz ktoacutery ma wbudowane pod wietlenie Samo pod wietleniemo e by wykonane w roacute ny sposoacuteb W starszych modelach spotyka si pod wietle-nie oparte na lampie CCFL (ang Cold Cathode Fluorescent Lamp) Tego typu wy-wietlacze s zwykle wi ksze ci sze ale przede wszystkim wymagaj specjalnej

przetwornicy do sterowania lamp Jej zadaniem jest generowanie wysokiego napi -cia niezb dnego do za wiecenia si lampy a nast pnie utrzymywanie go w granicachzapewniaj cych jej prawid owe dzia anie Wy wietlacze tego typu s wi c k opotliwew u ytkowaniu musimy wyda czasami sporo pieni dzy na odpowiedni przetworni-c a w dodatku trwa o takiej lampy jest kroacutetsza ni diod LED Wyst puj tak eproblemy ze sterowaniem jasno ci pod wietlenia W nowoczesnych wy wietlaczachLCD stosuje si praktycznie wy cznie pod wietlenie za pomoc diod LED Nie wy-magaj one adnych wyrafinowanych przetwornic do zasilania zwykle zadowalajsi napi ciem w granicach 3 ndash 12 V maj te znacznie wi ksz trwa o Jasno citakiego pod wietlenia z atwo ci mo na sterowa wykorzystuj c technik PWMPod wietlenie oparte na diodach LED mo e mie roacute ny kolor mdash bia y oacute ty zielonyniebieski czerwony Kolor mo emy sobie wi c dobra wg w asnych preferencji Naj-nowsze wy wietlacze alfanumeryczne s wykonywane w technologii OLED mdash w tejtechnologii wiec poszczegoacutelne piksele wi c taki wy wietlacz nie wymaga pod-wietlenia Niejako przy okazji zyskujemy znacznie lepsze czasy prze czania pikseli

mdash dla wy wietlaczy LCD szczegoacutelnie w ni szych temperaturach czas prze czaniawynosi kilkadziesi t do kilkuset milisekund co powoduje pojawienie si wyra nychbdquoduchoacutewrdquo i psuje estetyk Wy wietlacze OLED nie maj tej wady Jednak zazwyczajs dro sze

Je eli mo esz staraj si wybiera wy wietlacze LCD z pod wietleniem opartym nadiodach LED lub wykonane w technologii OLED

Kolejn istotn kwesti jest regulacja kontrastu Zwykle graficzne kolorowe LCD z wbu-dowanymi sterownikami automatycznie reguluj kontrast dodatkowo sterownik mazaimplementowane rejestry umo liwiaj ce wy cznie programow zmian kontrastuW przypadku prostszych sterownikoacutew wyst puj cych najcz ciej w wy wietlaczachmonochromatycznych (zaroacutewno alfanumerycznych jak i graficznych) kontrast re-guluje si podaj c odpowiednie napi cie na jeden z pinoacutew wy wietlacza Jest to nie-zwykle istotne gdy bez w a ciwego napi cia reguluj cego kontrast na wy wietlaczunic nie zobaczymy Mo emy w takiej sytuacji odnie b dne wra enie e wy wie-tlacz nie dzia a Z kolei je li kontrast b dzie zbyt du y wszystkie piksele b d w -czone co te mo e sugerowa b dne dzia anie LCD

Jedn z cz stszych przyczyn tego e po prawid owym pod czeniu wy wietlaczaLCD nic na nim nie wida albo wszystkie piksele s w czone jest nieprawid owenapi cie na pinie reguluj cym kontrast

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 45

Obs uga wy wietlaczyalfanumerycznych

Wy wietlacze alfanumeryczne s zbudowane z matryc pikseli zwykle o wielko ci5times8 pikseli pogrupowanych razem W tym typie wy wietlacza mo emy sterowazawarto ci tak utworzonej matrycy znakowej jednak nie ma mo liwo ci sterowaniaposzczegoacutelnymi pikselami Najcz ciej spotykane wy wietlacze tego rodzaju mogwy wietla 1times8 1times16 2times16 2times20 4times16 znakoacutew gdzie pierwszy wymiar okre laliczb wy wietlanych wierszy a drugi liczb znakoacutew w wierszu Poniewa nie steru-jemy poszczegoacutelnymi pikselami do kontrolera wysy amy tylko kod znaku ktoacutery mazosta wy wietlony na danej pozycji Kontroler na podstawie kodu znaku generujeadres do specjalnego obszaru pami ci tzw tablicy znakoacutew w ktoacuterej znajduje si bajtowareprezentacja poszczegoacutelnych pikseli tworz cych znak Dla matrycy 5times8 ma ona 40bitoacutew Tablica ta jest umieszczona w pami ci ROM kontrolera LCD nie mo emy jejwi c zmienia Zwykle jednak kontrolery udost pniaj mo liwo definicji kilku w a-snych znakoacutew dzi ki czemu mo emy zdefiniowa np znaki charakterystyczne dla j -zyka polskiego Takie podej cie do generowania obrazu ma podstawow zalet jakjest prostota i zwi zane z tym niewielkie zapotrzebowanie na pami RAM Do prze-chowania np zawarto ci 8-znakowego wy wietlacza LCD wystarczy zaledwie 8 bajtoacutewpami ci Ma to szczegoacutelne znaczenie w prostych mikrokontrolerach z niewielk ilo-ci pami ci RAM Najpopularniejszym kontrolerem stosowanym w wy wietlaczach

alfanumerycznych jest HD44780 nawet je li w posiadanym wy wietlaczu jest innykontroler to mamy du szans e jest on z nim kompatybilny Typowy rozk ad sy-gna oacutew modu oacutew opartych na tym kontrolerze pokazano w tabeli 221

Tabela 221 Typowy uk ad wyprowadze modu oacutew alfanumerycznych LCD opartych na kontrolerzeHD44780

Pin Nazwa Funkcja

1 GND Masa 2 Vcc Zasilanie (typowo 5 V) 3 Vee Regulacja kontrastu 4 RS Zapis polecenia 5 RW Strob odczytzapis 6 E Wyboacuter uk adu 7 D0 Bit danych 0 8 D1 Bit danych 1 9 D2 Bit danych 210 D3 Bit danych 311 D4 Bit danych 412 D5 Bit danych 513 D6 Bit danych 614 D7 Bit danych 715 A Pod wietlenie mdash anoda16 K Pod wietlenie mdash katoda

Kup książkę Poleć książkę

46 AVR Uk ady peryferyjne

Przed pod czeniem modu u zawsze upewnij si czy podany rozk ad odpowiadau ytemu modu owi W szczegoacutelno ci sprawd rozmieszczenie linii zasilaj cych Ichniew a ciwe pod czenie grozi uszkodzeniem modu u

Zwykle piny 15 i 16 steruj ce pod wietleniem s umieszczone osobno lub te przedpinem 1 St d te zawsze nale y je dok adnie zidentyfikowa przed pod czeniem mo-du u Do pinoacutew tych nale y pod czy napi cie wykorzystane do pod wietlenia modu uPrzy czone napi cie zale y od typu zastosowanego pod wietlenia mdash CCFL foliielektroluminescencyjnej lub diod LED W dalszej cz ci b dziemy zajmowa si modu-em z pod wietleniem LED W nocie katalogowej ka dego modu u znajduj si szcze-

goacute owe informacje dotycz ce zasilania pod wietlenia Zwykle w tym celu wymaganejest napi cie 5 V a nat enie pr du pod wietlenia wynosi 20 ndash 50 mA

Wy wietlacze LCD alfanumeryczne s dost pne w handlu w wersjach dostosowanychdo roacute nych napi zasilaj cych Typowo jest to napi cie 5 V co stwarza pewne pro-blemy przy pod czeniu takiego LCD do procesoroacutew rodziny XMEGA S one zasi-lane maksymalnym napi ciem 36 V nie ma wi c mo liwo ci aby LCD i procesordzia a y w tych samych domenach napi ciowych W efekcie przy po czeniu obu uk a-doacutew musimy zastosowa konwersj napi Poniewa LCD alfanumeryczny z perspek-tywy procesora jest urz dzeniem bardzo wolnym ca kowicie wystarczaj cym rozwi za-niem jest zastosowanie szeregowych rezystoroacutew ktoacutere wraz z wbudowanymi w procesordiodami zabezpieczaj cymi b d stanowi y uk ad obni aj cy napi cie na magistralikomunikacyjnej z 5 V do bezpiecznego dla wej cia XMEGA napi cia Z drugiej stronyjedynka logiczna generowana przez procesor zasilany napi ciem 33 V jest poprawnierozpoznawana przez LCD pracuj cy z napi ciem 5 V Je li procesor by by zasilanybardzo niskim napi ciem (rz du 18 ndash 28 V) wymagany by by bardziej skompliko-wany konwerter co zosta o szerzej omoacutewione w rozdziale 7 ksi ki AVR Praktyczneprojekty

Wy wietlacze LCD wymagaj pod wietlenia bez tego wy wietlana zawarto jestpraktycznie nieczytelna W starszych konstrukcjach wykorzystywano pod wietleniew oparciu o lampy fluorescencyjne lub folie elektroluminescencyjne jednak obecniedominuj cym typem jest pod wietlenie za pomoc diod LED

Poniewa zasilamy diod LED wymagane jest do czenie szeregowego rezystoraCzasami taki rezystor jest wbudowany w modu LCD

Pod wietlenie tego typu zu ywa spor ilo energii Innym rozwi zaniem jest kupnowy wietlacza wykonanego w technologii OLED (ang Organic Light-Emitting Diode)Wy wietlacze tego typu cechuj si zdecydowanie lepszym kontrastem ale tak e wi k-sz szybko ci prze czania w zwi zku z czym mo na za ich pomoc uzyska o wielelepsze efekty animacji ktoacutere s praktycznie nieosi galne dla klasycznych wy wietlaczyLCD Nie maj one tak e innej wady LCD mdash zale no ci szybko ci prze czania seg-mentoacutew od temperatury

Wy wietlacze OLED nie maj wyprowadzonych pinoacutew odpowiedzialnych za pod-wietlenie mdash po prostu go nie wymagaj

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 47

Kolejn istotn kwesti jest pod czenie w a ciwego napi cia reguluj cego kontrastwy wietlacza Dla wi kszo ci modu oacutew LCD mie ci si ono w przedziale GND ndash Vcca dla modu oacutew o rozszerzonym zakresie temperatury w przedziale od ndash7 do 0 V mdashrysunek 221

Rysunek 221Pod czenie napi ciareguluj cego kontrasta) modu y klasyczneb) modu y o rozszerzonymzakresie temperatur

Napi cie ujemne mo na uzyska z prostej pompy adunkowej sterowanej przebiegiemPWM z procesora Poboacuter pr du z tego wej cia jest znikomo ma y Alternatywniemo na u y uk adu ICL7660 ktoacutery mo e generowa napi cia ujemne

Kolejn decyzj jak musimy podj jest sposoacuteb pod czenia modu u LCD z mikro-kontrolerem Mamy do wyboru dwie opcje mdash albo pod czamy wszystkie 8 linii da-nych (D0 ndash D7) albo tylko 4 najstarsze (D4 ndash D7) Pod czaj c tylko 4 linie danychzmniejszamy liczb niezb dnych po cze modu u z mikrokontrolerem oraz liczbwykorzystanych linii IO Ze wzgl du na znikom ilo danych przesy anych zdo mo-du u wynikaj ce z pod czenia tylko 4 linii danych spowolnienie transmisji jest bezznaczenia W trybie 4-bitowym najpierw transferowana jest starsza a potem m od-sza tetrada Niewykorzystane linie D0 ndash D3 mo na pozostawi niepod czone wi k-szo modu oacutew wewn trznie podci ga niepod czone linie poprzez rezystor do Vcc

Poniewa linie D0 ndash D7 s dwukierunkowe musimy pami ta aby podczas operacjiodczytu z LCD odpowiednie piny mikrokontrolera by y ustawione jako wej cia W prze-ciwnym przypadku dojdzie do konfliktu

Kolejnym sygna em co do ktoacuterego musimy podj decyzj jest sygna RW okre laj cytyp operacji (odczytzapis) Poniewa zwykle zapisujemy dane do LCD w a ciwie niezachodzi konieczno ich odczytywania mo emy ten sygna na sta e po czy z mas oszcz dzaj c w ten sposoacuteb jedn lini IO procesora Takie rozwi zanie ma jednak po-wa n wad mdash po jego zastosowaniu nie jest mo liwe odczytywanie sygna u zaj to cimodu u (ang busy flag) Powoduje to e pomi dzy kolejnymi zapisami do modu u mu-simy stosowa opoacute nienia dobrane na najwolniejsz mo liw okoliczno W efekcieca a transmisja jest wolniejsza ni mog aby by

Je li korzystamy z tych modu oacutew nie musimy pisa w asnych procedur ich obs ugiInstaluj c rodowisko WinAVR (lub nowy toolchain firmy Atmel) w katalogu docavr-libcexamplessdtiodemo znajdziemy gotowe funkcje obs ugi HD44780 Funkcjete nie dzia aj z mikrokontrolerami XMEGA st d te w za czonych przyk adach zosta-y one zmodyfikowane tak aby poprawnie wspoacute pracowa roacutewnie z tymi mikro-kontrolerami

Kup książkę Poleć książkę

48 AVR Uk ady peryferyjne

Mo emy te skorzysta z licznych przyk adoacutew dost pnych w internecie W dalszejcz ci rozdzia u zostan wykorzystane funkcje z pakietu WinAVR napisane przezJoerga Wunscha Pokazane przyk ady zak adaj e wy wietlacz jest po czonyz mikrokontrolerem tak jak na rysunku 222

Rysunek 222 Po czenie LCD z mikrokontrolerem Na goacuterze pod czenie do mikrokontroleraXMEGA na dole pod czenie do modu u Xplained Na schematach pokazano tak e opcjonalne sposobypod czenia pinu Vee odpowiedzialnego za regulacj kontrastu LCD

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 49

Zanim co wy wietlimy na LCD musimy pozna w jaki sposoacuteb s generowane znakiSterownik LCD zawiera w sobie niezale nie od typu u ytej matrycy 80 bajtoacutew pami ciDDRAM (ang Display Data RAM) Je li zastosowana matryca wy wietla mniejszliczb znakoacutew to cz komoacuterek pami ci jest nieu ywana Mo emy je wykorzystado innych celoacutew mdash np jako zwyk pami RAM Mo emy te u y jej do przesu-wania napisoacutew ktoacutere nie mieszcz si na wy wietlaczu Aby mo na by o umie ciznak na w a ciwej pozycji niezb dne jest poznanie organizacji pami ci kontrolera W za-le no ci od u ytej matrycy pami ta jest zorganizowana nast puj co

Dla matryc 16times1 mdash pami jest podzielona na dwa obszary ka dy zawieraj cypo 8 znakoacutew Obszar pierwszy (od lewej) ma adresy 0x00 do 0x07 a obszar drugi(prawy) adresy 0x40 do 0x47 St d te gdy wy wietla si tekst przekraczaj cygranic obszaroacutew nale y zadba aby poszczegoacutelne litery trafi y pod w a ciweadresy

Dla matryc 20times1 mdash adresy 0x00 do 0x13

Dla matryc 16times2 mdash adres pierwszej linii zaczyna si od 0x00 do 0x0f adresdrugiej linii od 0x40 do 0x4f

Dla matryc 20times2 mdash adresy pierwszej linii to 0x00 do 0x13 a drugiej 0x40 do 0x53

Dla matryc 40times2 mdash adresy pierwszej linii to 0x00 do 0x27 drugiej linii 0x40do 0x67

Dla matryc 20times4 mdash adresy pierwszej linii to 0x00 do 0x13 drugiej 0x40 do 0x53trzeciej 0x14 do 0x27 a czwartej 0x54 do 0x67

Jak wida w niektoacuterych typach wy wietlaczy po ka dej linii zostaje od kilku do kil-kunastu bajtoacutew ktoacuterych zawarto nie jest wy wietlana Ma to pewn zalet mdash mo-emy do pami ci modu u wpisywa teksty d u sze ni s wy wietlane na ekranie co

u atwia przewijanie tekstu Niestety ma to te pewn wad mdash funkcje wy wietlaj ceco na ekranie musz bdquowiedzie rdquo jak organizacj ma matryca W przeciwnym przy-padku nie ma mo liwo ci prawid owego wyliczenia adresu komoacuterki do ktoacuterej ma od-by si zapis

W dalszej cz ci rozdzia u zostanie wykorzystany modu LCD o organizacji 16times2(ale mo na te bez problemu wykorzysta dowolny inny)

Zanim b dzie mo na co wy wietli na ekranie modu musi zosta zainicjalizowanyW trakcie inicjalizacji ustawiane s podstawowe parametry pracy sterownika LCD mdashorganizacja matrycy (liczba linii) wielko czcionki (5times8 lub 8times11 pikseli) Wielkoczcionki zale y od typu pod czonej matrycy LCD Dla konkretnego modu u LCDtylko jedna z tych warto ci b dzie poprawna Oproacutecz inicjalizacji modu u nale y tak-e poprawnie ustawi stan pinoacutew IO wykorzystywanych do pod czenia modu u LCD

Wi kszo pracy zwi zanej z inicjalizacj modu u LCD odbieraniem i wysy aniemdo niego danych wykonuje biblioteka Joerga Wunscha Dostarcza ona niskopozio-mowe funkcje umo liwiaj ce komunikacj ze sterownikiem hd44780 i innymi kom-patybilnymi z nim sterownikami Wystarczy e do aplikacji w ktoacuterej planujemy wy-korzysta taki modu do czymy plik hd44780c oraz plik nag oacutewkowy hd44780h

Kup książkę Poleć książkę

50 AVR Uk ady peryferyjne

Oba pliki bdquozak adaj rdquo e istnieje plik nag oacutewkowy definesh zawieraj cy podstawo-we definicje zwi zane ze sposobem pod czenia modu u LCD z mikrokontroleremNa pocz tku nale y okre li ktoacutere linie IO zosta y wykorzystane do pod czenia modu u

define HD44780_RS A 4define HD44780_RW A 5define HD44780_E A 6define HD44780_D4 A 0

W powy szym przyk adzie do kolejnych linii portu A (A4 ndash A6) zosta y pod czonesygna y RS RW i E modu u natomiast do linii A0 ndash A3 linie D4 ndash D7 modu u LCD Wa nejest aby linie danych czy z pinami IO w kolejno ci rosn cej Biblioteka wykorzy-stuje do transmisji danych pomi dzy modu em a mikrokontrolerem tylko 4 linie danychmdash dzi ki temu mo emy zmniejszy liczb po cze a zwolnione linie IO wykorzystado innych celoacutew W pliku wyst puje jeszcze jedna definicja

define USE_BUSY_BIT 1

Okre la ona e biblioteka b dzie u ywa flagi Busy modu u LCD mdash umo liwia touzyskanie optymalnej szybko ci wspoacute dzia ania z modu em Zako czenie realizacjibie cej operacji modu sygnalizuje zmian stanu tej flagi co umo liwia niezw ocznewys anie kolejnej komendy Je li nie u ywamy flagi Busy program musi generowamaksymalne zalecane w nocie katalogowej opoacute nienia w efekcie ca a transmisja zwal-nia Po zdefiniowaniu u ywanych pinoacutew w pliku definesh mo emy rozpocz korzy-stanie z biblioteki

W pliku hd44780h s udost pnione prototypy funkcji odpowiedzialnych za wspoacute -prac z modu em LCD

Funkcje bibliotecznePodstaw modu u stanowi dwie funkcje umo liwiaj ce odpowiednio wys anie da-nych do modu u oraz ich odczytanie

void hd44780_outbyte(uint8_t b uint8_t rs)uint8_t hd44780_inbyte(uint8_t rs)

Obie funkcje wysy aj odczytuj 8-bitow dan w przypadku wykorzystania tylko4-bitowej szyny danych wysy anie i odczytywanie danych odbywa si w dwoacutech etapachDodatkowo zmienna rs okre la tryb dost pu W przypadku wysy ania danych do modu urs = 0 powoduje e dane zostan wys ane do rejestru komend a je li rs = 1 dane trafido rejestru danych Przy odczycie jest podobnie z tym e dla rs = 0 jest odczytywanaflaga Busy i rejestr AC (ang Address Counter)

Kolejna funkcja odpowiada za oczekiwanie na gotowo modu uvoid hd44780_wait_ready(bool islong)

W przypadku gdy w pliku definesh symbol USE_BUSY_FLAG ma warto 1 parametrislong jest ignorowany a optymalizator kompilatora usuwa go gdy nie jest on wy-korzystywany przez funkcj Kiedy warto USE_BUSY_FLAG jest roacute na od 1 parametr

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 51

ten okre la d ugo opoacute nienia Je li jest roacute na od 0 opoacute nienie wynosi 152 ms a je-eli jest roacutewna 0 opoacute nienie wynosi 37 s Poniewa lepiej jest u ywa flagi Busy

mo emy ten parametr ignorowa

Powy sze trzy funkcje wystarcz do komunikacji z modu em dla wygody zdefiniowanojednak kolejne Funkcje hd44780_outcmd(n) i hd44780_incmd() umo liwiaj odpowiedniowys anie polecenia do rejestru komend kontrolera lub odczytanie bitu Busy i licznikaAC Dwie kolejne mdash hd44780_outdata(n) oraz hd44780_indata() mdash umo liwiaj zapisi odczytanie rejestru danych

Oproacutecz funkcji odpowiedzialnych za komunikacj z modu em LCD zdefiniowano tak efunkcj przeprowadzaj c podstawow inicjalizacj modu u hd44780_init(void) orazfunkcj hd44780_powerdown(void) ustawiaj c wszystkie linie u yte do komunikacjiw stan 0 co umo liwia bezpieczne od czenie zasilania od modu u LCD W przypadkupozostawienia ktoacuterej z wy ej wymienionych linii w stanie 1 przy od czonym za-silaniu modu u stanowi ona jego zasilanie W efekcie mimo wy czenia modu mo epobiera znaczny pr d

Szerszego omoacutewienia wymaga funkcja hd44780_outcmd(cmd) ktoacutera umo liwia wys a-nie polecenia do rejestru polece sterownika LCD Dla wygody zdefiniowane zosta yroacute ne komendy u atwiaj ce wspoacute prac z modu em LCD Komendy te s przekazy-wane jako argument wywo ania funkcji hd44780_outcmd np

hd44780_outcmd(HD44780_CLR)

powoduje wys anie do sterownika polecenia HD44780_CLR czyszcz cego zawartopami ci DDRAM kontrolera

KomendyFunkcja hd44780_outcmd przyjmuje jako argument predefiniowane makrodefinicjeznacznie u atwiaj ce wspoacute prac z kontrolerem modu u LCD Poni ej zostan onepokroacutetce omoacutewione

HD44780_SHIFT(shift right)Ta makrodefinicja powoduje przesuni cie pozycji wy wietlanego tekstu (shift = 1)o jedn pozycj w lewo (argument right = 0) lub w prawo (argument right = 1)W przypadku gdy shift = 0 przesuwany w lewo lub prawo jest tylko kursor Wysy-aj c wielokrotnie to polecenie uzyskujemy kolejne przesuni cia o jedn pozycj

w lewo lub prawo Polecenie to s u y g oacutewnie do przesuwania tekstu Jednak ze wzgl duna du bezw adno tekstowych modu oacutew LCD nie nale y przesuwa liter cz ciej niok raz na sekund mdash cz stsze przesuwanie daje bardzo nieprzyjemne efekty wizual-ne Ka dy bufor linii jest bdquozawijanyrdquo to znaczy e po ostatnim znaku z prawej jestwy wietlany pierwszy znak z lewej i odwrotnie Nale y pami ta e d ugo buforajest sta a dla danego modelu matrycy Np dla modu oacutew 16times2 bufor jednej linii wyno-si dok adnie 40 bajtoacutew z czego 16 jest jednorazowo wy wietlanych Poni szy kodcyklicznie przewija wy wietlany tekst w lewo

lcd_puttext_P(PSTR(Test bufora i przewijania tekstunTen tekst przewija sie w lewo))while(1)

Kup książkę Poleć książkę

52 AVR Uk ady peryferyjne

hd44780_outcmd(HD44780_SHIFT(10)) _delay_ms(700)

HD44780_FNSET(if8bit twoline font5x10)Polecenie to wybiera typ interfejsu mdash 8-bitowy je li warto parametru if8bit jestroacutewna 1 lub 4-bitowy je li jest roacutewna 0 Typ interfejsu musi odpowiada sposobowipo czenia modu u z mikrokontrolerem Parametr twoline okre la czy pod czonamatryca LCD ma jedn lini znakoacutew czy dwie Matryce ktoacutere maj 4 linie tekstu straktowane przez kontroler jako matryce dwuliniowe mdash parametr twoline powinienmie warto 1 Je li dla matrycy zawieraj cej dwie lub wi cej linii ustawimy go na 0to wy wietlana b dzie tylko jedna linia (w przypadku matryc dwuliniowych goacuterna)a w przypadku matryc 4-liniowych b d wy wietlane dwie linie rozdzielone lini pust

Ostatni parametr okre la typ u ywanego generatora znakoacutew Powinien on odpowiadau ytej w module matrycy zwykle wi c jego warto wynosi 0

HD44780_DISPCTL(disp cursor blink)Ustawia roacute ne parametry pracy matrycy Je li parametr disp ma warto 1 to matrycajest w czona (wy wietla zawarto DDRAM) a je li 0 to matryca jest wy czonalecz stan pami ci DDRAM nie ulega zmianie Np kod

while(1) hd44780_outcmd(HD44780_DISPCTL(011)) _delay_ms(700) hd44780_outcmd(HD44780_DISPCTL(111)) _delay_ms(700)

powoduje naprzemienne w czanie i wy czanie matrycy w efekcie wy wietlany tekstmruga

Parametr cursor okre la czy sprz towo wy wietlany kursor ma by widoczny (war-to parametru 1) czy niewidoczny (warto parametru 0) Je li kursor jest widocznyto dodatkowo mo emy okre li czy ma miga (warto parametru blink roacutewna 1)czy nie (blink = 0) Je li kursor jest widoczny i nie miga jest wy wietlany w postacipoziomej kreski Wy wietlanie kursora mo e by u yteczne w sytuacji kiedy u yt-kownik wprowadza jakie dane W pozosta ych sytuacjach kursor mo emy wy czy

HD44780_ENTMODE(inc shift)Okre la sposoacuteb wprowadzania danych do pami ci Je li parametr inc ma warto 1 topo ka dej operacji zapisuodczytu adres pami ci jest automatycznie zwi kszany o je-den co przy piesza operacj zapisuodczytu kolejnych znakoacutew Je li warto inc jestroacutewna 0 to adres jest automatycznie zmniejszany o 1 Dodatkowo parametr shiftokre la czy wy wietlany obraz ma by automatycznie przesuwany tak aby wy wie-tla ostatnio wprowadzony znak (shift = 1) lub go nie wy wietla (shift = 0)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 53

HD44780_CLRPowoduje wyczyszczenie (wype nienie znakami o kodzie 32) ca ej zawarto ci pami ciDDRAM Jednocze nie kursor wraca do pozycji pierwszej (pierwsza linia pierwszyznak)

Niewy wietlane bajty pami ci DDRAM tak e s kasowane Je li s one u ywanedo przechowywania zmiennych programu to przed operacj kasowania nale y jeskopiowa w bezpieczne miejsce W przeciwnym przypadku zostan utracone

Wska nik adresu do pami ci DDRAM jest ustawiany na 0 zerowane jest tak e prze-suni cie

HD44780_HOMEPowoduje powroacutet kursora do pozycji pocz tkowej mdash pierwsza linia pierwszy znakWska nik adresu do pami ci DDRAM w efekcie zawiera 0 zerowane jest roacutewnieprzesuni cie wy wietlania znakoacutew w efekcie s one wy wietlane od pozycji 0

HD44780_DDADDR(addr)Ustawia nast pny adres zapisuodczytu w pami ci DDRAM na addr Tylko 7 bitoacutewargumentu addr jest branych pod uwag w zwi zku z czym mo na zaadresowa mak-symalnie 128 bajtoacutew pami ci (z czego sterownik ma tylko 80 pozosta e lokacje snieu ywane)

HD44780_CGADDR(addr)Ustawia nast pn operacj odczytuzapisu w pami ci CGRAM na addr Pod uwagbranych jest tylko 6 bitoacutew zmiennej addr w efekcie mo na zaadresowa maksymalnie64 bajty pami ci CGRAM

Przedstawione powy ej funkcje zapewniaj jedynie podstawow komunikacj z mo-du em LCD Potrzebujemy jednak ci gle funkcji odpowiedzialnej za jego inicjalizacjmdash funkcja biblioteczna przeprowadza ten proces tylko w podstawowym zakresie musi-my jeszcze zadba o w a ciwe ustawienie parametroacutew zwi zane z posiadan matryc Napiszmy wi c w asne rozwini cie funkcji inicjalizacyjnej

void lcd_init() hd44780_init() Podstawowa inicjalizacja modu u hd44780_outcmd(HD44780_CLR) Wyczy pami DDRAM hd44780_wait_ready(1000) hd44780_outcmd(HD44780_ENTMODE(1 0)) Tryb autoinkrementacji AC hd44780_wait_ready(1000) hd44780_outcmd(HD44780_DISPCTL(1 0 0)) W cz wy wietlacz wy cz kursor hd44780_wait_ready(1000)

Zauwa e po wys aniu ka dego polecenia do modu u jest wywo ywana funkcjahd44780_wait_ready(1000) odpowiedzialna za oczekiwanie a realizacja wys anego po-lecenia dobiegnie ko ca Jest to niezb dne gdy do czasu uko czenia bie cej

Kup książkę Poleć książkę

54 AVR Uk ady peryferyjne

operacji dalsze polecenia s ignorowane Jako argument podany jest parametr 1000mdash jest on bez znaczenia nasza biblioteka korzysta z flagi Busy i po prostu go ignorujePo wykonaniu powy szej funkcji modu LCD jest poprawnie zainicjalizowany a jegopami jest wyczyszczona (zawiera bajty 0x20) i w efekcie modu nic nie wy wietlaOd tej chwili mo emy wysy a znaki do wy wietlenia

Po wykonaniu inicjalizacji ekran mo e pozosta czysty lub wy wietla ca kowiciewype nione kwadraty (wszystkie piksele w czone) Je li po inicjalizacji wszystkiepiksele s w czone nale y nieco zmniejszy kontrast

Aby sobie u atwi to zadanie zdefiniujmy funkcj wysy aj c do modu u jeden znakvoid lcd_putchar(char c) static bool second_nl_seen static uint8_t line=0

if ((second_nl_seen) ampamp (c = n)ampamp(line==0)) Odebrano pierwszy znak hd44780_wait_ready(40) hd44780_outcmd(HD44780_CLR) hd44780_wait_ready(1600) second_nl_seen=false if (c == n) if (line==0) line++ hd44780_outcmd(HD44780_DDADDR(64)) Adres pierwszego znaku drugiej linii hd44780_wait_ready(1000) else second_nl_seen=true line=0 else hd44780_outdata(c) hd44780_wait_ready(40)

Funkcja ta ze wzgl du na skomplikowane adresowanie pami ci DDRAM jest zale naod konkretnego modelu modu u LCD B dzie prawid owo wspoacute pracowa z modu a-mi 2times16 2times20 i 2times40 znakoacutew W przypadku innych modu oacutew pozycje niektoacuterychznakoacutew mog by nieprawid owe

Mo emy ju wy wietla na LCD pojedyncze znaki czas na wy wietlanie tekstu Po-niewa teksty jako sta e dla zaoszcz dzenia cennej pami ci RAM przechowuje si za-zwyczaj w pami ci FLASH zdefiniujmy funkcj odczytuj c podany a cuch zna-kowy z pami ci FLASH a nast pnie umieszczaj c go na LCD

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 55

void lcd_puttext_P(prog_char txt) char ch while((ch=pgm_read_byte(txt))) lcd_putchar(ch) txt++

Powy sza funkcja wysy a kolejne znaki odczytane z pami ci FLASH na LCD za po-moc funkcji LCD_putchar Po napotkaniu znaku ko ca a cucha (0 nul) przerywa swojedzia anie

Pozostaje nam przetestowa dzia anie przedstawionych funkcjiint main() lcd_init() lcd_puttext_P(PSTR(Test LCDnDruga linia)) while(1)

Na ekranie modu u LCD powinien wy wietli si napisTest LCDDruga linia

Je li na LCD nic nie widzimy to w pierwszej kolejno ci powinni my sprawdzi kon-trast zmieniaj c napi cie na pinie Vee modu u LCD

Warto zdefiniowa jeszcze funkcj ustawiaj c pozycj od ktoacuterej b dzie wy wietlanynast pny znak

void lcd_goto(uint8_t x uint8_t y) hd44780_outcmd(HD44780_DDADDR(0x40y+x)) hd44780_wait_ready(1000)

Funkcja ta przyjmuje dwa parametry x i y okre laj ce pozycj na ktoacuterej zostaniewy wietlony nast pny znak wys any z mikrokontrolera do modu u LCD Dzi ki temuz atwo ci mo emy uaktualnia zawarto LCD bez konieczno ci ponownego prze-sy ania wszystkich danych Funkcja ta jest zale na od typu zastosowanego modu u

Ostatni funkcj jest funkcja umo liwiaj ca czyszczenie zawarto ci pami ci modu uOdpowiedzialne za to jest proste polecenie wysy ane do sterownika

void lcd_cls() hd44780_outcmd(HD44780_CLR) hd44780_wait_ready(false)

Oproacutecz czyszczenia zawarto ci pami ci modu u powoduje ono ustawienie kursoraw punkcie (00)

Kup książkę Poleć książkę

56 AVR Uk ady peryferyjne

Definiowanie w asnych znakoacutewUk ad HD44780 jest wyposa ony w 64 bajty pami ci CGRAM (ang Character Ge-nerator RAM) ktoacutera mo e przechowywa mapy bitowe 8 znakoacutew o matrycy 5times8 pikselilub 4 znakoacutew o matrycy 5times10 pikseli Przyk ad definicji znaku na matrycy 5times8 poka-zano na rysunku 223

Rysunek 223Przyk ad definicji w asnego znakuw pami ci CGRAM Znak rysujemyna matrycy 5times8 bitoacutew polazaciemnione odpowiadaj warto ci 1pola bia e warto ci 0 Wartowyliczon dla ka dej linii pikseliwpisujemy do pami ci CGRAMsterownika Najstarsze 3 bity ka degobajta (pola szare) s bez znaczeniamdash wy wietlacz pomija jeprzy wy wietlaniu obrazu

1

2

3

4

5

6

7

0 00100 = 4

01110 = 14

11111 = 31

00100 = 4

00100 = 4

00100 = 4

11111 = 31

01110 = 14

Adres Warto

Dost p do tej pami ci jest mo liwy dzi ki wys aniu polecenia ustawiaj cego adreszapisuodczytu pami ci CGRAM Po jego wys aniu wszystkie operacje zapisu i od-czytu dotycz tej pami ci a nie pami ci DDRAM Aby wroacuteci do adresowania pa-mi ci DDRAM nale y wybra jej adres lub dokona operacji wymagaj cej przesu-ni cia kursora

Pami CGRAM jest pami ci ulotn po ponownym w czeniu zasilania definicjeznakoacutew musz by ponownie przes ane przez procesor

Bity o warto ci 1 w definicji znaku odpowiadaj w czonym pikselom bity o warto-ci 0 pikselom wy czonym Najstarsze 3 bity ka dego bajta w pami ci CGRAM s

bez znaczenia mdash te pozycje nie s wy wietlane przez matryc Definiuj c znak nale-y tak e pami ta e ostatnia linia wy wietlana przez matryc (w zale no ci od wiel-

ko ci matrycy znaku linia 8 lub 10) powinna zawiera same zera mdash w tej linii b dziewy wietlany kursor

Najcz ciej matryce LCD pod czone do sterownika HD44780 maj organizacj 5times8czyli jeden znak jest definiowany przez 8 kolejnych bajtoacutew okre laj cych stan po-szczegoacutelnych linii tworz cych znak Stwoacuterzmy funkcj ktoacuterej zadaniem b dzie za a-dowanie definicji znakoacutew z pami ci FLASH mikrokontrolera do pami ci CGRAM

void lcd_defchar_P(uint8_t charno prog_uint8_t chardef) hd44780_outcmd(HD44780_CGADDR(charno8)) hd44780_wait_ready(40) for(uint8_t c=0clt8c++) hd44780_outdata(pgm_read_byte(chardef))

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 57

hd44780_wait_ready(40) chardef++

Funkcja LCD_defchar_P jako argumenty przyjmuje numer definiowanego znaku (0 ndash 7)oraz wska nik do obszaru pami ci FLASH zawieraj cego definicj znaku (obszarten zajmuje 8 nast puj cych po sobie bajtoacutew) Jak widzimy funkcja najpierw ustawiaw a ciwy adres pod ktoacuterym znajdzie si pocz tek definicji znaku w pami ci CGRAMmdash poniewa jeden znak jest opisywany za pomoc 8 bajtoacutew kolejne adresy znakoacutewto kod_znakutimes8 Nast pnie dane opisuj ce znak s adowane z pami ci mikrokontrolerai zapisywane w pami ci CGRAM sterownika Poni szy program ilustruje wykorzy-stanie funkcji LCD_defchar_P

prog_uint8_t char1[8][8]=0000000255 00000025525500000255255255 0000255255255255 00025525525525525500255255255255255255 0255255255255255255255255255255255255255255255

int main() for(uint8_t x=0xlt8x++) lcd_defchar_P(xampchar1[x][0]) Za aduj wzorce znakoacutew lcd_init() for(uint8_t x=0xlt8x++) lcd_putchar(x) Wy wietl znaki o kodach 0 ndash 7 while(1)

W pierwszej linii funkcji main nast puje za adowanie nowych definicji znakoacutew dopami ci CGRAM nast pnie inicjalizowany jest wy wietlacz po czym w pierwszejlinii s wy wietlane znaki o kodach 0 ndash 7 a wi c znaki ktoacuterych definicja zosta aprzes ana z mikrokontrolera

Zauwa e pami CGRAM podobnie jak DDRAM mo emy zapisywa i odczytywaprzed inicjalizacj modu u LCD Proces inicjalizacji jest potrzebny tylko do prawi-d owego wy wietlania na ekranie LCD

Poniewa dane potrzebne do wy wietlenia znaku s na bie co pobierane z pami cipodczas od wie ania matrycy LCD jakiekolwiek zmiany w definicji znaku kiedy jest onwidoczny na LCD poci gaj za sob natychmiastowe zmiany w wy wietlanym obrazieMo na t w a ciwo sterownika wykorzysta do stworzenia prostych animacji

void lcd_box(uint8_t y) hd44780_outcmd(HD44780_CGADDR(0)) Zaczynamy od znaku o kodzie 0 hd44780_wait_ready(40) for(uint8_t c=0cltyc++) Stwoacuterz linie z w czonymi pikselami hd44780_outdata(0xFF) hd44780_wait_ready(40) for(uint8_t c=yclt8c++) Stwoacuterz linie z wy czonymi pikselami hd44780_outdata(0x00) hd44780_wait_ready(40)

Kup książkę Poleć książkę

58 AVR Uk ady peryferyjne

int main() lcd_init() lcd_putchar(0) while(1) for(uint8_t x=0xlt8x++) lcd_box(x) _delay_ms(100) for(int8_t x=7xgt=0x--) lcd_box(x) _delay_ms(100)

Funkcja main wy wietla na LCD tylko jeden znak o kodzie 0 a nast pnie cykliczniezmienia jego definicj w pami ci CGRAM W efekcie posta znaku wy wietlana naekranie ci gle si zmienia

Transakcyjna obs uga LCDPokazana do tej pory obs uga LCD alfanumerycznego mia a pewne wady Jak wiemyoperacje odwo uj ce si do kontrolera LCD s niezwykle wolne cykl odczytuzapisudowolnego rejestru kontrolera trwa co najmniej 1600 ns co dla MCU taktowanegozegarem 32 MHz przek ada si na czas wykonania oko o 52 instrukcji asemblera Cogorsza wi kszo komend realizowanych przez kontroler jest wykonywana w czasieoko o 37 s co przek ada si na tysi ce zmarnowanych taktoacutew MCU St d te jaki-kolwiek zapisodczyt LCD to z perspektywy programu straszne marnotrawstwo czasu

Problem ten dotyczy ka dego urz dzenia IO ktoacutere dzia a wolniej ni procesor W takiejsytuacji warto napisa pewn warstw po redni mdash sterownik mdash ktoacuterego zada-niem b dzie buforowanie da dost pu do urz dzenia i rozstrzyganie konfliktoacutewdzi ki czemu roacute ne cz ci programu b d bdquomia y wra enierdquo e maj wy czny do-st p do urz dzenia

Pokazane wcze niej funkcje obs ugi LCD maj jeszcze jedn wad mdash nie s wspoacute bie -ne czyli nie mo na ich wykonywa jednocze nie w kilku miejscach programu w tymw szczegoacutelno ci w programie g oacutewnym i w funkcjach obs ugi przerwa W wielu przy-padkach ta wada jest bez znaczenia jednak czasami jest uci liwa mdash dla przyk adugdy na wy wietlany tekst chcieliby my na o y inne informacje np o dacie lub godzi-nie Oczywi cie wy wietlanie mo na zorganizowa tak aby nie by o potrzeby pisaniawspoacute bie nego kodu np poprzez zastosowanie bufora pami ci VRAM kontrolera LCDRodzi to jednak kolejne problemy i jest ma o eleganckie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 59

Zastanoacutewmy si w jaki sposoacuteb najlepiej jednocze nie rozwi za problem wolnegodost pu do urz dzenia i wspoacute bie no ci kodu Rozwi zaniem mo e by wprowadze-nie tzw transakcji Transakcj nazywamy zbioacuter operacji tworz cych pewn ca-o To co wyroacute nia tak wykonywany zestaw operacji to atomowo spoacutejno

izolacja i trwa o Pod tymi terminami kryje si istota wykonywanej operacji Ato-mowo transakcji zapewnia e jest ona wykonywana w sposoacuteb niepodzielny co gwa-rantuje nam prawid ow wspoacute prac z danym urz dzeniem IO w tym przypadku kon-trolerem LCD Wa na dla nas jest tak e izolacja mdash dzi ki temu inne operacje na LCD(inne transakcje) nie b d mia y wp ywu na wynik aktualnie wykonywanej transakcjimdash nie b d zak oacuteca y jej wykonania z drugiej strony nasza transakcja nie zak oacuteciwykonania innych Trwa o z kolei zagwarantuje nam e je li sterownik potwierdziwykonanie transakcji to znaczy e efekt jej dzia ania jest wy wietlony na LCD Tacecha nie jest nam a tak potrzebna mdash jest ona wydawa oby si oczywista Niemniej jestto pewna gwarancja e ca a operacja przebieg a poprawnie i w efekcie LCD znajdujesi w okre lonym przez nas stanie Tyle teorii przejd my do praktyki

Kody poni szego przyk adu znajduj si w katalogu PrzykladyLCD-alfaLCD-transact

Aby zapewni transakcyjny dost p do LCD musimy stworzy pewne struktury danychktoacuterych zadaniem b dzie przechowywanie informacji o operacjach sk adaj cych sina transakcje i stanie ich wykonania W tym celu pos u ymy si wiadomo ciami z roz-dzia u 5 bdquoJak uporz dkowa chaos czyli z o one typy danych i listyrdquo Do przecho-wywania oczekuj cych transakcji pos u ymy si buforem pier cieniowym zanimjednak go zaimplementujemy zastanoacutewmy si jak powinna wygl da struktura prze-chowuj ca informacje o transakcji Struktura ta powinna zawiera co najmniej

pole danych (data) z informacjami ktoacutere maj by przes ane do kontrolera LCD

pole okre laj ce liczb danych do wys ania (len)

pole okre laj ce realizowane polecenie dla LCD (cmd) mdash pole to pos u yprogramowi sterownika do w a ciwej interpretacji danych znajduj cych siw polu data

kilka poacutel kontrolnych przechowuj cych informacje potrzebne do realizacjisamej transakcji Jedno z nich mdash Ready mdash b dzie przyjmowa warto trueje li dana transakcja zosta a zrealizowana lub false w przeciwnym przypadkuZnaczenie drugiego pola mdash SelfDel mdash mo e wydawa si nieco enigmatycznepole to okre la czy pami przydzielona dla transakcji ma by zwolnionaw sterowniku LCD (warto true) czy te zostanie zwolniona w programie(warto false)

Oto jak mo e wygl da struktura definiuj ca transakcj typedef struct volatile bool Ready 1 true je li transakcja zosta a zrealizowana bool SelfDel 1 true je li pami przydzielona transakcji ma zosta zwolniona LCD_Cmd cmd 2 Polecenie do zrealizowania uint8_t len 6 D ugo polecenia

Kup książkę Poleć książkę

60 AVR Uk ady peryferyjne

unsigned 0 Wyroacutewnanie do granicy bajta uint8_t data[] Dane transakcji LCD_trans

Nale y zwroacuteci uwag na poleunsigned 0

Nie definiuje ono adnego pola struktury ale jedynie informuje kompilator e kolejnepole (w naszym przyk adzie o nazwie data) ma by wyroacutewnane do granicy bajta mdashdzi ki temu dost p do kolejnego pola b dzie odbywa si szybciej Z kolei samo poledata jest zadeklarowane jako tzw typ niekompletny

Typ niekompletny (ang incomplete type) to typ ktoacuterego rozmiaru nie da si okre li

W pokazanym przyk adzie rozmiaru pola data nie da si okre li gdy zosta on za-deklarowany jako typ tablicowy z tym e nie podano wielko ci tablicy Wielko ci niepodano gdy na etapie deklaracji struktury nie wiemy jakiej wielko ci dane b d w niejprzechowywane Tego typu deklaracja ma bardzo powa ne konsekwencje mdash skorowielko ci pola data nie da si okre li to jaki b dzie wynik dzia ania operatora sizeof(LCD_trans) Kompilator stara si jako wybrn z tej sytuacji w zwi zku z czym

zwroacuteci wielko struktury ale tak jakby pole data w ogoacutele nie istnia o mdash jego roz-miar b dzie wynosi 0 W ramach wiczenia zastanoacutew si ile bajtoacutew pami ci b dziezajmowa a struktura LCD_trans

Skoro dysponujemy ju struktur przechowuj c poszczegoacutelne transakcje pora nastworzenie obiektu przechowuj cego kolekcj transakcji Dodanie kolejnej strukturyb dzie polega o na dodaniu jej do takiego obiektu z drugiej strony program sterownikaLCD b dzie moacuteg z tej kolekcji pobiera kolejne transakcje do realizacji Opis ten przy-pomina opis dzia ania bufora pier cieniowego mdash z jednym wyj tkiem mdash po zape nie-niu ca ego bufora nie b dziemy usuwa niezrealizowanych transakcji lecz zabloku-jemy dodawanie kolejnych W tym celu pos u ymy si definicj nast pnej struktury

typedef struct LCD_trans elements[LCD_MAXTRANS] Wska niki do transakcji uint8_t Beg Pierwszy element bufora uint8_t Count Liczba elementoacutew w buforze CircBuffer

Struktura ta zawiera deklaracj tablicy wska nikoacutew na transakcje (pole elements)Poniewa jest to tablica musimy zna liczb jej elementoacutew mdash jest ona zadeklarowanaw sta ej LCD_MAXTRANS

define LCD_MAXTRANS 10 Maksymalna liczba pami tanych transakcji

Do realizacji bufora s potrzebne jeszcze dwa pola Beg wskazuj ce na pierwsztransakcj w buforze oraz pole Count okre laj ce liczb transakcji znajduj cych siw buforze Je li Count == 0 to znaczy e w buforze nie ma adnych oczekuj cychtransakcji a je li Count == LCD_MAXTRANS to znaczy e bufor jest pe ny i nie mo na

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 61

dodawa do niego kolejnych transakcji W a ciwo t wykorzystuj dwie zdefiniowanew pliku LCD_transc funkcje

static inline bool cbIsFull(CircBuffer cb) return cb-gtCount == LCD_MAXTRANS

static inline bool cbIsEmpty(CircBuffer cb) return cb-gtCount == 0

Jak pami tamy w przypadku funkcji modyfikatory static inline powoduj e danafunkcja nie b dzie istnie jako samodzielna lecz w ka dym miejscu w ktoacuterym jestwywo ywana jest wstawiany raczej jej kod a nie wywo anie Ma to znaczenie dlakroacutetkich funkcji (a wi c takich jak pokazane powy ej) dla ktoacuterych koszty wywo anias zazwyczaj wi ksze ni koszty umieszczenia cia a funkcji w miejscu jej wywo aniaTego typu funkcje zachowuj si w sposoacuteb zbli ony do makrodefinicji (z tym e re-spektuj wszystkie regu y j zyka C w szczegoacutelno ci kolejno operatoroacutew czy kon-trol typoacutew)

Takie funkcje jako argument pobieraj adres bufora na ktoacuterym maj operowa W na-szym przypadku bufor jest zdefiniowany nast puj co

static CircBuffer LCD_TransBuffer Bufor na transakcje

Nale y zauwa y e jest on zdefiniowany jako struktura globalna z modyfikatoremstatic Modyfikator ten ogranicza zasi g widoczno ci zmiennej LCD_TransBuffer dopliku w ktoacuterym zmienna ta zosta a zdefiniowana (w tym przypadku modyfikator staticjest niejako przeciwie stwem modyfikatora extern) Dzia anie to ma jedynie znaczeniekosmetyczne mdash uniemo liwia odwo anie si do bufora za pomoc funkcji ktoacutere niezosta y zdefiniowane w miejscu jego definicji Oproacutecz funkcji umo liwiaj cych okre-lenie stanu bufora potrzebne s jeszcze funkcje umo liwiaj ce dodanie i pobranie trans-

akcji Pierwsz funkcj b dzie funkcja dodaj ca transakcj do buforabool cbAdd(CircBuffer cb LCD_trans elem) ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsFull(cb)) return false Czy jest miejsce w kolejce uint8_t end = (cb-gtBeg + cb-gtCount) LCD_MAXTRANS cb-gtelements[end] = elem Dodaj transakcj ++cb-gtCount Liczba elementoacutew w buforze return true Wszystko OK

Funkcja ta dodaje transakcj (zmienna elem) do bufora ko owego Zanim transakcjazostanie dodana sprawdzane jest czy w buforze jest miejsce mdash je li nie funkcjazwroacuteci false Je li dodanie jest mo liwe warto licznika okre laj cego liczb trans-akcji przechowywana w buforze (Count) zwi ksza si o jeden Warto zastanowi si te dlaczego praktycznie ca e cia o tej funkcji jest zamkni te w sekcji atomowej (ATOMIC_BLOCK) Jedn z cech naszego sterownika ma by mo liwo wspoacute bie nego dost pu

Kup książkę Poleć książkę

62 AVR Uk ady peryferyjne

do LCD mdash to znaczy e danie np zapisu do LCD mo e wyst pi zaroacutewno w g oacutewnejp tli programu jak i asynchronicznie w przerwaniu St d te wynika e funkcja do-daj ca transakcj musi by napisana w sposoacuteb zapewniaj cy jej poprawn prac w sytu-acji gdy zostanie ona przerwana i ponownie wywo ana przed zako czeniem dzia aniajej poprzedniej instancji Umieszczenie cia a tej funkcji w sekcji atomowej nam to za-pewnia mdash dzi ki temu bufor transakcji zawsze b dzie spoacutejny Dla zaspokojenia cie-kawo ci warto usun sekcj atomow i sprawdzi jak wtedy b dzie zachowywa si tafunkcja i jak wp ynie to na spoacutejno przechowywanych danych

Drug niezb dn funkcj jest funkcja odczytuj ca bufor transakcji i zwracaj ca trans-akcj do zrealizowania (lub NULL je li adnej transakcji nie ma w buforze)

LCD_trans cbRead(CircBuffer cb) LCD_trans elem ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsEmpty(cb)) return NULL Bufor pusty nie mo na zwroacuteci elementu elem = cb-gtelements[cb-gtBeg] cb-gtBeg = (cb-gtBeg + 1) LCD_MAXTRANS -- cb-gtCount Zmniejszamy liczb elementoacutew pozosta ych w buforze return elem

Funkcja ta jest bardzo podobna do poprzedniej mdash najpierw sprawdza czy bufor za-wiera jak oczekuj c transakcj (cbIsEmpty(cb)) je li tak to zwraca adres opisuj -cej j struktury i zmniejsza liczb transakcji oczekuj cych (pole Count) W ten sposoacutebmamy zrealizowan ca funkcjonalno zwi zan z obs ug bufora pier cieniowegoPokazane funkcje s uniwersalne i z bardzo podobnych (lub wr cz tych samych) b -dziemy korzysta w kolejnych rozdzia ach w kontek cie np obs ugi transakcji zwi -zanych z interfejsami szeregowymi

Pora przej do samego sterownika LCD Jego zadaniem b dzie sprawdzenie czyw buforze oczekuj jakie transakcje do realizacji a je li tak to ich wykonanie Ponie-wa dane do LCD mog by wysy ane co okre lony minimalny czas znacznie d u -szy ni czas jakiego na to zadanie potrzebuje mikrokontroler do wysy ania kolejnychpaczek danych pos u ymy si timerem Timer b dzie generowa przerwanie nadmiaru(TCD0_OVF_vect) ktoacutere b dzie wyznacza o tempo w jakim kolejne porcje danych b -d trafia y do LCD Z noty katalogowej kontrolera wynika e minimalny czas trwa-nia wysokiego stanu sygna u Enable to 230 ns a okres tego sygna u nie powinien bykroacutetszy ni 500 ns Poniewa nasz dost p do LCD odbywa si w sposoacuteb nieblokuj cyMCU wi c szybko wysy ania danych do LCD jest bez znaczenia St d te w poka-zanym przyk adzie przyj to e dane b d wysy ane co 4 s co okre la sta a

define LCD_ACCESSTIME 0000004

Poniewa komunikacja z LCD odbywa si w sposoacuteb nieblokuj cy nie zale y nam tena czasie (i tak w stosunku do czasu od wie ania samego LCD jest on bardzo kroacutetki)w efekcie nie ma potrzeby odczytywania flagi busy kontrolera Dzi ki temu w cz ciprzypadkoacutew mo emy w ogoacutele zrezygnowa z sygna u wyboru RW i wymusi jego sta y

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 63

poziom logiczny umo liwiaj cy zapis do LCD Dzi ki temu mo na zaoszcz dzi do-datkowy pin IO1

Ca a logika naszego sterownika jest zawarta w funkcji obs ugi przerwania przepe nieniatimera (TCD0_OVF_vect) Poniewa LCD jest po czony z MCU w trybie 4-bitowym(dla zaoszcz dzenia liczby wykorzystanych pinoacutew IO) kolejne 8-bitowe dane muszby podzielone na dwie tetrady i wys ane do LCD w kolejno ci starszam odsza tetradaInformacja o aktualnie wysy anych danych jest umieszczona w zmiennej trans o typie

static struct uint8_t pos 6 Pozycja w polu danych aktualnej transakcji uint8_t nibble 1 Ktoacutera tetrada jest wysy ana seq

Dlaczego tak Dzi ki wykorzystaniu struktury i poacutel bitowych mo na zaoszcz dzi je-den bajt pami ci SRAM Ze wzgl du na wielko pami ci obs ugiwanej przez kon-troler LCD mo emy by pewni e transakcje zawieraj ce wi cej ni 63 bajty s ra-czej nierealne (nie mia yby wi kszego sensu) St d te do przechowywania informacjio aktualnie wysy anym bajcie danych wystarczy 6 bitoacutew mdash tyle samo zosta o wyko-rzystanych do okre lenia d ugo ci pola danych transakcji w strukturze LCD_trans Zaosz-cz dzony bit mo na po wi ci na flag nibble okre laj c ktoacutera tetrada (m odszastarsza)jest wysy ana Bez poacutel bitowych flaga ta zaj aby dodatkowy bajt pami ci

Przejd my do implementacji sterownika Pierwsz rzecz jak nale y sprawdzi jestto czy w buforze czeka jaka transakcja do zrealizowania Odpowiedzialny za to jestfragment kodu obs ugi przerwania nadmiaru timera

if(trans == NULL) Nic do zrobienia sprawd my czy jaka transakcja oczekuje trans=cbRead(ampLCD_TransBuffer) Czy jest jaka oczekuj ca transakcja seqpos=0 seqnibble=0 if(trans == NULL) TCD0_CTRLA=TC_CLKSEL_OFF_gc Nie ma adnych transakcji mdash wy cz timer

W przypadku gdy adna transakcja nie oczekuje na realizacj timer jest wy czanymdash dzi ki temu nie b d zg aszane kolejne przerwania przepe nienia i MCU nie b -dzie traci czasu na ich obs ug Co prawda wynikaj cy z tego zysk czasowy jest mar-ginalny lecz ma to istotniejsz konsekwencj mdash w przypadku usypiania MCU zb d-ne przerwanie timera nie b dzie niepotrzebnie wybudza o procesora W takiej sytuacjiponowne w czenie timera nast pi dopiero w funkcji dodaj cej transakcj do kolejkimdash a wi c w sytuacji gdy mamy pewno e istnieje oczekuj ca transakcja

Druga cz funkcji obs ugi przerwania jest zwi zana z realizacj samej transakcjiW pokazanym przyk adzie zaimplementowano tylko jeden typ transakcji mdash daniezapisu a cucha tekstowego pod wskazany adres VRAM (na okre lonej pozycji LCD)Je li zajdzie taka potrzeba programista mo e zaimplementowa inne polecenia i doda

1 Warto zauwa y e w bdquoklasycznejrdquo obs udze LCD te nie musimy czyta stanu flagi busy zamiast tego

wystarczy wprowadza p tle opoacute niaj ce Jednak poniewa taka obs uga blokuje MCU nie jest onazalecana Wady tej nie ma dost p transakcyjny co jest jego dodatkow zalet

Kup książkę Poleć książkę

64 AVR Uk ady peryferyjne

kod odpowiedzialny za ich obs ug Zauwa my e ka da transakcja musi zawieraadres pocz tku pami ci wideo od ktoacuterego b dzie zapisywany tekst Dzieje si takdlatego e transakcja wykonana wcze niej mo e ustawi wska nik zapisu na dowolnejkomoacuterce pami ci W efekcie tekst z kolejnej transakcji by by wy wietlany od komoacuterkina ktoacuterej zako czy si zapis poprzedniej transakcji Takie dzia anie oczywi cie jestniedopuszczalne st d te ka dy zapis do pami ci wideo poprzedza ustawienie rejestruindeksowego Problem ten mo na rozwi za tak e w inny sposoacuteb mdash poprzez wpro-wadzenie tzw uchwytoacutew (ang handlers) ktoacutere zawiera yby stan kontrolera LCDNiemniej to rozwi zanie dodatkowo komplikowa oby nasz sterownik Struktura danych(zawartych w polu data) ma wi c nast puj cy format

bajt nr 0 zawiera warto pozycji od ktoacuterej nale y dokonywa zapisu pami ciwideo mdash jest to warto przesy ana do rejestru okre laj cego adres zapisu

kolejne bajty zawieraj a cuch znakowy ktoacutery nale y umie ci w pami ciCGRAM

Poniewa bajt nr 0 zawsze zawiera warto wpisywan do rejestroacutew steruj cych kon-trolera podczas jego wysy ania jest ustawiana linia RS sygnalizuj ca zapis do rejestruPodczas wysy ania kolejnych bajtoacutew linia ta jest zerowana w zwi zku z czym zapisodbywa si do pami ci CGRAM

Kod obs uguj cy transakcj wygl da nast puj coif(trans) Jest transakcja do zrealizowania uint8_t dat=trans-gtdata[seqpos] if(seqnibble == 0) datgtgt=4 To trzeba zmieni je li linie danych nie s po czone z pinami 0 ndash 3 portu IO hd44780_outnibble_nowait(dat amp 0x0F seqpos = 0) Zapisujemy rejestr steruj cy lub dane ++seqnibble if(seqnibble == 0) ++seqpos Co drug tetrad zwi kszamy pozycj bufora if(seqpos gt= trans-gtlen) trans-gtReady=true Koniec transakcji if(trans-gtSelfDel) free_re(trans) Zwolnij pami transakcji je li tak sobie yczy programista trans=NULL Koniec transakcji CLR(OUT HD44780_E)

Ta cz przerwania wysy a kolejne tetrady do kontrolera LCD Warto zastanowi sinad dzia aniem sekwencji

++seqnibble

Poniewa pole nibble jest jednobitowe operacja inkrementacji prowadzi do zmianystanu tego pola na przeciwny (pole to ma warto 0 lub 1) Kiedy zostan wys anewszystkie dane przeznaczone dla kontrolera obs uga transakcji ko czy si Stan tensygnalizuje nadanie warto ci true polu Ready struktury LCD_trans Dzi ki temu pro-gram mo e sprawdzi asynchronicznie w stosunku do przerwania kiedy transakcjauleg a zako czeniu Opcjonalnie jest wykonywana jeszcze jedna funkcja mdash je li poleSelfDel ma warto true to pami zarezerwowana na transakcj jest automatycznie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 65

zwalniana W tym celu wykorzystuje si funkcj free_re ktoacuterej prototyp jest zade-klarowany w pliku Alloc_safeh Funkcja ta wywo uje funkcj biblioteczn free ktoacute-ra zwalnia pami przydzielon dynamicznie na stercie Poniewa funkcja ta nie jestfunkcj reentrant nale y stworzy odpowiedni bdquoprotez rdquo opakowuj c j w blokatomowy co zapewnia e nie zostanie ona ponownie wywo ana zanim jej poprzed-nia instancja nie zako czy dzia ania Oczywi cie lepszym rozwi zaniem by oby napi-sanie w asnych funkcji dynamicznej alokacji pami ci ktoacutere b d reentrant

Bardzo wa ne jest aby pole SelfDel mia o warto true wy cznie dla transakcjidla ktoacuterych pami zosta a przydzielona dynamicznie funkcj malloc (lub jej po-chodnymi) W pozosta ych przypadkach pole to musi mie warto false mdash nie-stosowanie si do tej regu y spowoduje b d mened era pami ci i najprawdopo-dobniej nieprzewidywalne dzia anie programu

Drug wa n zasad jest aby zmienna zawieraj ca dane transakcji nie by azmienn automatyczn mdash zmienne takie s automatycznie niszczone po opusz-czeniu zawieraj cej je funkcji W rezultacie obszar pami ci zawieraj cy danetransakcji mo e zosta wykorzystany przez inne zmienne co spowoduje uszkodzeniezawartych w nim danych

Pami przydzielona transakcji musi by alokowana w sposoacuteb dynamiczny (funkcjamalloc_re) ewentualnie mo e to by pami alokowana dla zmiennej globalnej lubstatycznej mdash zmienne tego typu istniej przez ca y czas ycia programu

Warto te zauwa y e instrukcje steruj ce stanem linii Enable kontrolera LCD(SET(OUT HD44780_E) i CLR(OUT HD44780_E)) s rozdzielone wieloma innymi in-strukcjami Dzi ki temu generowany impuls dodatni tego sygna u ma czas trwania gt230 ns wymagany w specyfikacji kontrolera Nawet dla XMEGA taktowanej zegarem32 MHz 230 ns przek ada si na oko o 7 instrukcji asemblera mdash czas jaki z pewno-ci up ynie pomi dzy wykonaniem obu powy szych instrukcji steruj cych

Do wysy ania danych do kontrolera zosta a wykorzystana nieco zmodyfikowanafunkcja hd44780_outnibble_nowait roacute ni ca si od jej protoplasty hd44780_outnibbletylko tym e nie czeka na sygna braku zaj to ci mikrokontrolera (nie realizuje teopoacute nie ) Nie jest to potrzebne gdy kolejne tetrady s wysy ane w odst pach cza-sowych okre lanych przez timer

Mamy wi c zapewnion obs ug transakcji i mo liwo transakcyjnego wy wietlaniadanych na LCD musimy jeszcze mie funkcj ktoacutera tworzy odpowiednie transakcjemdash jest odpowiednikiem funkcji bezpo rednio wysy aj cej dane znakowe do LCDOdpowiednikiem tym jest pokazana poni ej funkcja

bool LCD_PutText_B(uint8_t x uint8_t y char txt LCD_trans buf bool autodel) buf-gtcmd=LCD_Text buf-gtReady=false buf-gtSelfDel=autodel Czy zwolni pami po zako czeniu transakcji buf-gtdata[0]=HD44780_DDADDR(x+y0x40) Ustaw adres w DDRAM strcpy((char)ampbuf-gtdata[1] txt) Skopiuj dane tekstowe + NULL

Kup książkę Poleć książkę

66 AVR Uk ady peryferyjne

buf-gtlen=strlen(txt) + 1 D ugo tekstu + pozycji + NULL ndash 1 bool ret=cbAdd(ampLCD_TransBuffer buf) if((ret==false) ampamp (autodel)) free_re(buf) Brak miejsca w kolejce else TCD0_CTRLA=TC_CLKSEL_DIV1_gc Preskaler 1 mdash odblokuj timer return ret

Funkcja ta buduje transakcj odpowiedzialn za wy wietlenie napisu txt na wskaza-nej pozycji x y LCD Wszystkie dane o transakcji zostan umieszczone w buforzew pami ci ktoacuterej adres jest okre lany wska nikiem buf Pami w buforze musi bywystarczaj co du a aby pomie ci ca transakcj Dodatkowy parametr autodel okre laczy pami ta ma by automatycznie zwalniana po obs u eniu transakcji (true) czynie (false) Je li transakcj uda o si umie ci w kolejce funkcja zwraca true Wartozauwa y e w takim przypadku funkcja uruchamia te timer (w naszym przypadkujest to timer TCD0) odpowiedzialny za generowanie przerwania Funkcja obs ugi prze-rwania wysy a dane do LCD

Pewn odmian powy szej funkcji jest funkcjabool LCD_PutText(uint8_t x uint8_t y char txt) LCD_trans trans=malloc_re(sizeof(LCD_trans) + strlen(txt) + 2) bool ret=LCD_PutText_B(x y txt trans true) return ret

Wykorzystuje ona funkcj LCD_PutText_B z tym e najpierw alokuje dynamiczniepami potrzebn na przechowanie tworzonej transakcji

Mamy komplet potrzebnych funkcji a wi c sprawd my jak ca o sprawdza siw praktyce W pliku LCD-transactc znajduje si kod pokazuj cy jak dzia aj naszetransakcje Aby to by o mo liwe nale y zainicjalizowa kontroler LCD

LCD_init()

Wykorzystujemy tu znan ju funkcj inicjalizuj c mdash nie ma potrzeby jej zmienia gdy operacja inicjalizacji LCD jest jednorazowa i nie trzeba wykonywa jej w posta-ci transakcji W drugim kroku musimy zainicjalizowa wykorzystywany timer i systemprzerwa

LCD_Timer_init(ampTCD0)PMIC_CTRL|=PMIC_LOLVLEN_bm Odblokuj przerwania niskiego poziomusei()

Poniewa dost p do LCD z pewno ci nie jest czynno ci krytyczn czasowo prze-rwaniom timera nadano najni szy priorytet Dzi ki temu mo na innym bardziej kry-tycznym przerwaniom nada wy sze priorytety i uzyska w ten sposoacuteb zmniejszenieczasu latencji obs ugi przerwa Sama inicjalizacja timera jest niezwykle prosta

void LCD_Timer_init(TC0_t tc) tc-gtINTCTRLA=TC_OVFINTLVL_LO_gc Odblokuj przerwania nadmiaru timera i nadaj im niski priorytet tc-gtPER=F_CPULCD_ACCESSTIME Przerwanie co 4 us (niezale nie od F_CPU)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 67

Sprowadza si ona tylko do odblokowania mo liwo ci zg aszania przerwania nadmia-ru oraz konfiguracji rejestru PER tak aby przerwania by y generowane co ok 4 s mdashniezale nie od cz stotliwo ci taktowania CPU Mo emy wi c przyst pi do wy wie-tlenia pierwszego napisu

LCD_PutText(00 Numer)

Powy sza funkcja ma jedn wad mdash alokuje dynamicznie pami po ka dym wywo-aniu (pami ta jest automatycznie zwalniana po obs u eniu transakcji) niemniej

ca y proces jest czasoch onny Mo emy tego unikn alokuj c pami bdquor cznierdquo i wielo-krotnie wykorzystuj c zaalokowany blok pami ci Ilustruje to poni szy przyk ad

LCD_trans buf=malloc_re(sizeof(LCD_trans) + 7)

Zmienna buf wskazuje na obszar pami ci ktoacutery mo e pomie ci a cuch 5-znakowyTyle wystarczy na potrzeby tego przyk adu mdash na LCD b d wy wietlane kolejneliczby w zakresie 0 ndash 65 535 najd u sza ma 5 znakoacutew st d te nasz bufor ma tak a nieinn d ugo

while(1) utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(60 bufstr buf false) while(LCD_IsTransCompleted(buf))

Do konwersji liczby na a cuch u yto funkcji bibliotecznej utoa (nag oacutewek stdlibh)Poniewa d ugo a cucha po konwersji jest zmienna (co spowodowa oby pozosta-wianie na LCD bdquoduchoacutewrdquo po poprzednich konwersjach) w kolejnej linii brakuj ceznaki uzupe niono spacjami Nast pnie tworzona jest transakcja w obszarze pami ciprzydzielonym zmiennej buf Ostatnia p tla while jest odpowiedzialna za oczekiwa-nie na zako czenie realizacji transakcji Po jej zako czeniu p tla jest wykonywana odpocz tku

Uwa ny czytelnik z pewno ci zauwa y e pami przydzielana funkcj malloc_renie jest nigdzie zwalniana mdash w normalnej sytuacji spowodowa oby to wyciek pami -ci W naszym przyk adzie jednak program nigdy si nie ko czy nie ma wi c potrzebyzwalniania pami ci wskazywanej przez zmienn buf

Powy szy przyk ad pokazuje jak unikn blokowania CPU na czas dost pu do wolnodzia aj cego urz dzenia jakim jest LCD alfanumeryczny Jednak to nie wszystkiezalety wynikaj ce z zastosowania transakcji Drug wa n zalet naszego rozwi zaniailustruje przyk ad znajduj cy si w katalogu PrzykladyLCD-alfaLCD-transact-intPowa nym ograniczeniem funkcji odpowiedzialnych za dost p do LCD w sposoacutebklasyczny by a niemo no ich wywo ywania z funkcji obs ugi przerwa mdash funkcjeobs ugi LCD nie by y reentrant2 Nasz system oparty na transakcjach nie ma tychwad Aby to zilustrowa zosta stworzony prosty przyk ad mdash tak jak poprzedniow p tli g oacutewnej programu s wy wietlane stale kolejne liczby ale jednocze nie wyko-

2 Poza tym blokowa y CPU na d ugi czas a jak pami tamy funkcje obs ugi przerwa powinny by

wykonywane mo liwie kroacutetko

Kup książkę Poleć książkę

68 AVR Uk ady peryferyjne

rzystano drugi timer (TCD1) w ktoacuterego funkcji obs ugi przerwania przepe nienia jestwy wietlany licznik tych przerwa

ISR(TCD1_OVF_vect) static char int_buf[sizeof(LCD_trans) + 7] static uint16_t cnt char bufstr[6]

utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(61 bufstr (LCD_trans)ampint_buf false)

Jak widzimy w sposoacuteb asynchroniczny z dwoacutech miejsc w programie mo emy uzy-ska dost p do LCD a ka da funkcja bdquoma wra enierdquo e ma LCD na wy czno Przy okazji warto przeanalizowa sposoacuteb w jaki jest rezerwowana pami na trans-akcj w przerwaniu Oczywi cie mo na by wykorzysta dynamiczn alokacj pami cilecz jak wspomniano taka alokacja jest czasoch onna St d te w pokazanym przy-k adzie wykorzystano tablic statyczn int_buf o rozmiarze umo liwiaj cym prze-chowanie kompletnej transakcji Dzi ki temu e zmienna int_buf jest zmienn statycz-n nie jest ona niszczona po zako czeniu funkcji obs ugi przerwania Gdyby pomins owo kluczowe static zmienna ta by aby niszczona a na LCD najprawdopodobniejzacz yby si pojawia przypadkowe tre ci Poniewa pami naszego bufora nie by aalokowana dynamicznie nie mo e ona zosta zwolniona w naszym sterowniku LCDst d te ostatni parametr wywo ania funkcji LCD_PutText_B musi mie warto false

OptymalizacjaPrzy okazji tego i poprzedniego przyk adu warto zastanowi si jeszcze nad jednkwesti mdash optymalizacji W podanych przyk adach wykorzystano wcze niej omoacute-wione funkcje dost pu do wy wietlacza LCD znajduj ce si w plikach hd44780ci hd44780h Wi kszo z zawartych tam funkcji nie jest wykorzystywana jednakkompilator mimo wszystko umieszcza ich kod w pliku wynikowym mdash dzieje si takponiewa nie mo e on bdquostwierdzi rdquo czy funkcje te nie s wykorzystywane w innychfragmentach programu Pami tajmy e kompilator kompiluje poszczegoacutelne pliki roacute-d owe osobno i dana jego instancja nie bdquowierdquo co znajduje si w innych plikach (innychjednostkach kompilacji) Tak ca o ciow wiedz ma dopiero konsolidator (linker)ktoacutery czy stworzone przez kompilator pliki obiektowe (o rozszerzeniu o) w plikwynikowy Linker jednak bdquonie wierdquo ktoacutera z funkcji programu zosta a u yta a ktoacuteranie mdash informacje te ma wy cznie kompilator W ten sposoacuteb powstaje typowe b dneko o w efekcie nasze nieu ywane funkcje nie s usuwane (linker zostawia je bdquonawszelki wypadekrdquo) i zajmuj niepotrzebnie pami Czy mo na temu jako zaradzi Oczywi cie tak W tym celu trzeba po czy si y kompilatora i linkera co zapewniaj od-powiednie opcje kompilacji We w a ciwo ciach projektu (ProjectProperties lub Alt+F7)wybieramy zak adk Toolchain a nast pnie AVRGNU C Compiler i OptimizationZnajdziemy tam pole wyboru o nazwie Prepare functions for garbage collection (ry-sunek 224)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 69

Rysunek 224 Aby da linkerowi mo liwo usuwania nieu ywanych funkcji nale y skompilowaprogram z wybran opcj ndashffunction-sections ktoacutera spowoduje e ka da funkcja programu znajdzie siwe w asnej sekcji

Zaznaczenie tej funkcji spowoduje umieszczenie ka dej funkcji w osobnej sekcji mdashsamo w sobie nie wp ynie to na skroacutecenie kodu wynikowego ale jest warunkiem nie-zb dnym dla podj cia stosownych dzia a przez linker Aby wyeliminowa nieu y-wane funkcje nale y zaznaczy jeszcze w ga zi AVRGNU LinkerOptimization poleGarbage collect unused sections (rysunek 225)

Rysunek 225 Zaznaczenie opcji Garbage collect unused sections (-Wl--gc-sections) spowodujee nieu ywane funkcje zostan usuni te z kodu wynikowego w efekcie kod programu ulegnie skroacuteceniu

Po zaznaczeniu tych opcji program zostanie skroacutecony o kilkaset bajtoacutew Oczywi cieje li wszystkie funkcje by yby wykorzystane nie uzyskaliby my adnego skroacuteceniakodu Niemniej w sytuacji gdy u ywa si bibliotek zazwyczaj przynajmniej czfunkcji nie jest wykorzystywana warto wi c skorzysta z tej mo liwo ci optymalizacji

Kup książkę Poleć książkę

70 AVR Uk ady peryferyjne

Je li mamy do czynienia z prekompilowan bibliotek (lib) to musi ona by skom-pilowana z zaznaczon opcj Prepare functions for garbage collection (-ffunction-sections) Alternatyw jest umieszczenie ka dej funkcji biblioteki w osobnym pliku(tak jak w przypadku bibliotek AVR-libc)

Na ekranie wyboru opcji optymalizacji linkera mamy jeszcze jedn przydatn opcjmdash Relax Branches (-mrelax) Dla mikrokontroleroacutew ktoacutere maj ponad 8 kB pami ciFLASH instrukcje skokoacutew s generowane jako tzw instrukcje d ugie mdash umo liwiajone skok do komoacuterki pami ci FLASH o dowolnym adresie Jednak cen za to jestwyd u enie instrukcji mdash ich kod jest d u szy podobnie jak czas wykonania Nie zawszejednak takie d ugie instrukcje musz by wykonywane mdash je li miejsce docelowe skokule y blisko (w zasi gu instrukcji skokoacutew wzgl dnych) to mo na w kodzie wynikowymzamieni instrukcje d u sze na kroacutetsze co przynosi oszcz dno ci w postaci skroacuteceniakodu wynikowego Poniewa dopiero linker bdquowierdquo jak poszczegoacutelne fragmenty kodus rozmieszczone w pami ci takiej podmiany mo na dokona na etapie linkowaniaprogramu co zapewnia powy sza opcja St d te warto to pole wyboru zaznaczy

Kup książkę Poleć książkę

SkorowidzA

ABI Application Binary Interface 25AC Address Counter 50ADPCM 482adres

bazowy 377bufora 61komoacuterki 84pu apki 202

ALE Address Latch Enable 368alfanumeryczne wy wietlacze 43algorytm ADPCM 492algorytmy stratne 495animacje 57antyaliasing 325architektury procesoroacutew XMEGA 352asembler 23

dyrektywy 40funkcje j zyka C 41obs uga przerwa 39

asynchroniczne wywo anie funkcji 101Atmel Studio 15

Bbajty kalibracyjne 569biblioteka

FATFS 131 139 176 180 517libcallback-liba 99PetitFS 144 149

bitADC_CH0START_bm 236IMPMODE 244

bitrate 442 512blokowanie przerwa 219b d 16 19

kwantyzacji 463offsetu 230wzmocnienia ADC 230

BOD 223bps bits per second 12

budowakarty 152linii obrazu 394pami ci SDRAM 374pliku stymulacji 192ramki PAL 412sygna u PAL 411wtyczki 544 545

bufor 78FIFO 497na transakcje 61transakcji 62

buforowanie wyj cia 294

CCAS Column Address Strobe 375CCFL 44charakterystyka

przetwornikoacutew 222termistora 264tryboacutew pracy 232

CID Card Identification 169CKE Clock Enable 375CLKIN 421COG Chip on Glass 310CRC 158 178CRC16 178CRC7 164CS Chip Select 361 375CSD Card Specific Data 172czas

dost pu do SDRAM 424adowania kondensatora 244

propagacji 281proacutebkowania 260symulacji 209

czcionki 322cz stotliwo

odchylania pionowego 428proacutebkowania 244 441 444 530przebiegu 504

Kup książkę Poleć książkę

576 AVR Uk ady peryferyjne

cz stotliwoPWM 465taktowania koprocesora 549taktowania procesora 209taktowania rdzenia 18

czyszczenie pami ci 318

DDAC Digital to Analog Converter 293 447 451

buforowanie wyj cia 294generowanie przebiegoacutew 301jitter 303kalibracja 306napi cie referencyjne 295system zdarze 297taktowanie 296tryb dwukana owy 301wykorzystanie DMA 298wyzwalanie konwersji 305

datalogger 261 265 275DD Device Density 86debuger 183

programowy 190sprz towy 185 187

decymacja 259DEBUG 219XMEGA 260

definicja symboli globalnych 36definiowanie w asnych znakoacutew 56deklaracja zapowiadaj ca 103 337dekoder DTMF 548 556DMA 254 298 402 458 518 523dost p do

danych 358 359 568danych binarnych 356 360danych wielobajtowych 31DataFLASH 137EEPROM 128FAT 136komoacuterki 375LCD 59 62 66 68operandu 30pami ci 81 384 386 387 561pami ci SDRAM 424pliku blokowy 141portoacutew IO 30rejestroacutew IO procesora 36rejestroacutew uk adu 499SPI 95sygnatury u ytkownika 565 567wska nikoacutew 32

DQM Data Mask 375DSP Digital Signal Processor 535

DTMF 535 553dyktafon 529dynamiczna alokacja pami ci 516dyrektywa global 38dyrektywy asemblera 40dzia anie

DMA 255komparatora 280timeroacutew 400

d wi k 443

EEBI External Bus Interface 361EEPROM 207eliminacja jitteru 24emulacja RS232 139

FFAT File Allocation Table 128 131FAT32 128FATFS 180filtr

dolnoprzepustowy 491drugiego rz du 470pierwszego rz du 469trzeciego rz du 471

filtrowanie sygna u PWM 468firmware 565FLASH 207format

odpowiedzi 159polecenia 158protoko u 157

funkcja_delay_ms 17 219c_zero 42callback 106 341callback() 99DataFLASH_CSEnable 100DF_FinishBufWrite() 269disk_initialize 136disk_ioctl 181disk_status 136disk_write 138DMA_SPI_init 104DTMF_GetCode 553free_re 65GPIOR0_init 507hd44780_outcmd 51hd44780_outnibble_nowait 65LCD_defchar_P 57

Kup książkę Poleć książkę

Skorowidz 577

Menu_Click_Func 515Menu_Free 516Menu_Recorder 532Menu_Run 527MS_CreateRegEntry 117MS_GetDirPos 125MS_GetRegItem 115MS_WritePages 116 118OSC_wait_for_rdy 473RecMenu_StartStop 532sprintf 142strtok 124sysclk_init() 200 209TMF_memcpy_PF 454udi_cdc_getc() 123udi_cdc_is_rx_ready() 123VS1003_Reset 506

funkcjeanalizuj ce 556biblioteczne 50biblioteki FATFS 143j zyka C 41kontrolera ST7565R 313opoacute niaj ce 17opoacute nie 219reentrant 524specjalne kontrolera 319steruj ce 314zapisu 133

fusebit 557BODACT 560BODLEVEL 560BOOTRST 559DVSDON 560EESAVE 561JTAGEN 558RSTDISBL 559SUT 559TOSCSEL 559

fusebity w AVR-libc 571

Ggenerator obrazu composite 426generowanie

d wi ku 461kolorowego obrazu 437obrazu wideo 391przebiegoacutew 301przerwa 285sygna u composite 409

g bia koloru 326gniazdo

karty SD 156VGA 396

Hhistereza 281

IIDE 11IMA ADPCM 483informacje

o kolorze 431o obrazie 434

inicjalizacjakarty 161karty SDHC 167karty SDSC 167karty SDXC 167licznika 419pami ci 119USART 505

instrukcjaicall 42movw 35nop 13 24

interfejsSCI 498SDI 498SPI 71 79RS232 120UART 123USART 71 73

interpolacja 259interpolacja w XMEGA 260inwersja obrazu 319

Jjednostki 12jitter 24 303 420

Kkalibracja

ADC 229DAC 306 564offsetu 237

kana DMA 82 522karta 154 158

mikroSD 152SD 151 152SDHC 151 152 160SDSC 160SDXC 151 160

Kup książkę Poleć książkę

578 AVR Uk ady peryferyjne

karty pami ci 151 152 157biblioteka FATFS 180budowa 152format polecenia 158inicjalizacja 161 167komunikacja 156odczyt danych 173opcje konfiguracyjne 181rejestry specjalne 169tryby pracy 153zapis danych 176zasilanie 154

kodasemblerowy 23 24C 23dost pu 24

kodowanieμ-law 481ADPCM 483Dialogic ADPCM 494informacji 166 426koloru 425znakoacutew 536

kodyformatoacutew audio 501zdarze 545

kolejno bajtoacutew 533kolor 424 430kolorowy obraz 437komparator 422

analogowy 279 280analogowy XMEGA 282okienkowy 284

kompilacja plikoacutew binarnych 350kompilator avr-gcc 11 359kompresja

ADPCM 482 486d wi ku 480IMA ADPCM 482

komunikacja z koprocesorem 504konfiguracja

4-portowa 364biblioteki 133debugera 185DMA 459 522fusebitoacutew 570kontrolera DMA 257 452komparatoroacutew 285lockbitoacutew 570LPC 371pami ci SDRAM 381PetitFS 149pinu IO 225portoacutew IO 362

preskalera 452projektu 186przerwa 219pu apki 203rejestru EVCTRL 248rejestru PER 67SPI 75sygna u CS 377typu czcionki 324urz dze IO 189USART 76zegara 383

konsolidacja 547kontroler

DMA 254 298 402 458 518 523KS108 310ST7565R 310ndash315 321

konwersjaDAC 305sygna oacutew 396wyzwalana 306

konwertercyfrowo-analogowy 426DAC 427

koprocesormp3 496VS1003B 10

korekcja fazy 466kwantyzacja 463

Llampa CCFL 44LE Latch Enable 433licznik 419

cykli 209TCC1 400timera 20

linie IO 50linie sygna owe

MISO 72 164MOSI 72SCK 72SS 72

linker 69lista

mnemonikoacutew 24modyfikowanych rejestroacutew 32

lockbity 557 561lockbity w AVR-libc 570LPC Low Pin Count 371LPCM 443 556LSB Least Significant Bit 228

Kup książkę Poleć książkę

Skorowidz 579

a cuchy formatuj ce 212czenie plikoacutew 352

Mmagistrala pami ci zewn trznej 361magnetofon cyfrowy 528makro _SFR_IO_ADDR() 39makrodefinicja

ASSERT 214HD44780_CGADDR() 53HD44780_CLR 53HD44780_DDADDR() 53HD44780_DISPCTL() 52HD44780_ENTMODE() 52HD44780_FNSET() 52HD44780_HOME 53HD44780_SHIFT() 51LOCKBITS 571

mapowanie sygna oacutew 366mapy bitowe 343marker czasowy 268maski bitowe 329matryce 49menu 335menu piktogramowe 342mierniki temperatury 262mikrokontroler

ARM 9AVR 9PIC 9XMEGA128A3U 10

MISO 72moc wydzielana 265model psychoakustyczny 495modu

alfanumeryczny 45NVM 568Xmega eXploreGO 10Xplained ATXMEGA A3BU 10Xplained ATXMEGA-A1 10Xplained XMEGA128A1 447Xplained XMEGA256A3 94Xplained XMEGA256A3BU 97 143 266

modyfikator 30const 85volatile 28 273

monitory CRT 395monochromatyczne wy wietlacze graficzne 309monochromatyczny

tryb graficzny 416tryb tekstowy 413

MOSI 72mp3 495Msps Megasamples per second 12multiplekser wej ciowy 226 283multipleksowanie adresoacutew 368 369muzyka 439

Nnadawanie kodoacutew DTMF 540nadproacutebkowanie 258nag oacutewek kontenera wav 500nagrywanie mowy 486najmniej znacz cy bit 228napi cie

offsetu 280referencyjne 223 295zasilania 239

Oobracanie obrazu 319obraz 319

composite 426kolorowy 430wideo 391

obroacutebka d wi ku 443 445obs uga

FAT 131 143klawiatury matrycowej 24LCD 58 63 67menu 337przerwania 37 38 458przerwania DMA 525przerwa w asemblerze 39przyciskoacutew 272wy wietlaczy alfanumerycznych 45

odczytblokowy 140danych 173 358

odpowied response 159R1 159R2 159R7 160

od wie anie pami ci 376odtwarzanie

d wi ku 472muzyki 447 513 518 521

offset 238offset ADC 230okno

Breakpoints 202Call stack 209dezasemblera 210

Kup książkę Poleć książkę

580 AVR Uk ady peryferyjne

oknoIO View 207podgl du zmiennych 211wyboru czcionek 324

OLED 46opcje

kompilatora 35zapisu d wi ku 445

operacjena buforach 91odczytu 173zapisu 176zapisu strony 92

operand 29operator

ascii 41

asciz 41

byte 41

section 41opoacute nienia 13 18opoacute nienie zmienne 16optymalizacja 16 68optymalizator 26organizacja pami ci 77organizacja pami ci VRAM 316oscylator 287OSD On-Screen Display 417ostrze enie 16oszcz dzanie energii 94

Ppakiet WinAVR 48pami

CGRAM 56 57 64DataFLASH 10 77 81 113 269DDRAM 49EEPROM 111FLASH 54 124 207RAM 49SDRAM 372SRAM 63 124 329 366 371VRAM 314 317

PCLK 421PCM 443PetitFS 144 149p tla

for 13while 201

pierwsza linia obrazu 321piksel 430piktogram 342pin IO 225

plikAlloc_safeh 65DataFLASHc 83DataFLASHIOc 136definesh 50delayh 14diskioh 132 136ffh 132ffconfh 132 181hd44780h 49integerh 132ioh 30LCD_transc 61LCD-transactc 66Makefile 14Menuc 19nothingo 541outfiletxt 547 551pffh 149SPIh 104stringh 113stymulacji 191 192

pliki mp3 495elf 351fon 323o 24S 24 34binarne 350 355csv 276d wi kowe 440obiektowe 352wav 500WMA 512z czcionkami 327z danymi 349

podbijacz napi cia 315podgl d

pami ci 207stosu wywo a 209zmiennych 211znakoacutew 325

pod czeniefototranzystora 262karty SD 155LCD z kontrolerem 311modu u 50pami ci 362 369 370 373termistora 262uk adu LM35 251wyj XMEGA 398

pod wietlenieCCFL 46OLED 46

Kup książkę Poleć książkę

Skorowidz 581

podwoacutejne buforowanie 255 332 457polecenia

kasowania strony 81konfiguracyjne pami ci 82kontrolera ST7565R 315odczytu bufora 82 89odczytu pami ci 81 88SDRAM 376transferu 91

polecenieACMD41 168cd 181CID 178CMD0 165CMD8 167CSD 178date 276dir 127 181dump 276erase 276get 276HD44780_CLR 51Init 178mkdir 181

po czenieDMA ze SPI 96dwoacutech komparatoroacutew 285koprocesora mp3 497LCD z mikrokontrolerem 48wyj cia XMEGA 411XMEGA z PC 121z telewizorem 431

pomiarnapi cia zasilania 239temperatury MCU 241

port IO 30 362pozycjonowanie grafik 345poacute obraz 410precyzja pomiaroacutew 260preskaler 478preskaler ADC 243program

Atmel Data Visualizer 275Audacity 443avr-objcopy 350dataloggera 265LCD Image Converter 323makeloadingtableexe 543Realterm 127 554riffstrip 483SoX 445Tracepoint 208

programowanie sygnatury u ytkownika 566protokoacute master-slave 157

prototypy 136proacutebki d wi kowe 447proacutebkowanie

8-bitowe 300nieliniowe 480

prymitywy graficzne 330przebieg PWM 468przebiegi 289 303przechwytywanie danych 276przemiatanie wej 253przerwanie 218 254 286 403

DMA 522komparatora 286

przestrze adresowa procesora 378przesy anie

danych 498polece 498

przetaktowanie procesora 436przetwornik

ADC 221analogowo-cyfrowy 221cykliczny 222potokowy 222

przyciski 272pseudooperatory 41pu apki breakpoints 197pu apki warunkowe 205punkty ledzenia 203PWM 461 462 472

RRAS Row Address Strobe 375redukcja poboru energii 242regulacja kontrastu 321rejestr 32 34rejestr AC 50

adresu wtyczki 513BASEADDR 377CID 169CMP 251CSD 172czasu utworu 512DATA 83EVCTRL 248formatu audio 512identyfikacyjny pami ci 87INTFLAGS 252kontroli basoacutew 510kontroli g o no ci 513MUXCTRL 227OCR 168PER 67poroacutewnania 249

Kup książkę Poleć książkę

582 AVR Uk ady peryferyjne

rejestr ACSCI_CLOCKF 511stanu komparatora 287stanu pami ci 86stanu uk adu 510trybu pracy 508WINCTRL 285

rejestrydost pu do pami ci RAM 513GPIOR 502IO procesora 36mikrokontrolera 25procesora 35specjalne 94specjalne karty 169uk adu VS1003B 508

relacja rodzic ndash dziecko 336reset uk adu 534rozdzielczo

LCD 329przetwornika 231PWM 463 477

rozszerzenie HiRes 477 479roacutewnanie Steinharta-Harta 263rysowanie map bitowych 343

Sschemat uk adu dataloggera 267SCI Serial Command Interface 498SCK 72SD Secure Digital 152SDI Serial Data Interface 498separator synchronizacji 422separowanie impulsoacutew synchronizacji 422shieldy 10skaler 422skaler napi cia 283skrypt makefile 353s owo kluczowe

asm 27extern 37static 68

specyfikatory lokalizacji zmiennej 213sps samples per second 12SS Slave Select 72standard PAL 410standard VGA 393sterowanie

dataloggerem 275sygna em 379

sterownik 121HD44780 49 56LCD 49 62

stos wywo a 209

strukturaFATFS 139Handle 118LCD_trans 60 63menu 338rejestru 86SimpleFSEntry 113 116SimpleFSHandle 113 118 140submenu 527systemu plikoacutew 112

sumabitowa 571kontrolna 178

sygnacomposite 409composite video output 430CS 377DREQ 497H-Sync 396synchronizacji 423V-Sync 396zegarowy CLK 374

sygna yinterfejsu EBI 363magistrali EBI 364steruj ce 375

sygnaturaprodukcyjna procesora 563u ytkownika 565

symbol__DELAY_ROUND_CLOSEST__ 17__DELAY_ROUND_DOWN__ 17_FS_FAT12 149_FS_FAT32 149_FS_MINIMIZE 133_FS_READONLY 133_FS_RPATH 135_FS_TINY 133_MAX_SS 135_MULTI_PARTITION 135_USE_DIR 149_USE_FASTSEEK 134_USE_FORWARD 134_USE_LABEL 134_USE_LFN 134_USE_LSEEK 149_USE_MKFS 134_USE_READ 149_USE_STRFUNC 134_USE_WRITE 149_VOLUMES 136F_CPU 14 15 18increment 36USE_BUSY_FLAG 50

Kup książkę Poleć książkę

Skorowidz 583

symboleglobalne 36w asemblerze 28zewn trzne 39

symulacja 198 209symulator 190synchronizacja

pami ci 331pionowa 395pozioma 394

systemplikoacutew 111 128przerwa 404zdarze 245

szablonfont_XMEGAtmpl 326image_XMEGAtmpl 343

szum 463szybko przesy ania danych 126

ledzenie wi zki 333rodowisko

graficzne 11programistyczne 11VSIDE 542WinAVR 47

Ttabela FAT 130tablica

framebuf 402 408plugintbl 552 555tekst 208z kodem wynikowym 543

taktowanieDAC 296mikrokontrolera 473

technologia OLED 44temperatura mikrokontrolera 239 241termistor 262 290

NTC 263PTC 263

termometrLM35 249 250z alarmem 251

termostat 290test uk adu VS1003B 503testowanie obrazu 319timer 16 62

TCC0 20

TCC1 399transakcja 59 62 65transakcje 17 103ndash107transakcyjna obs uga LCD 58transakcyjny dost p do SPI 95transfer 91

danych 97wynikoacutew 254

transmisja 72 83tryb

bez znaku 234ci g ej konwersji 252czterobitowy 153dwukana owy 301graficzny 416graficzny VGA 407idle 419jednobitowy 153LPC 371monochromatyczny 397 407oszcz dzania energii 94 306pracy multipleksera 226pracy SPI 157roacute nicowy 232single slope 312SPI 153tekstowy 413tekstowy VGA 397z pojedynczym wej ciem 234ze znakiem 235

trybygenerowania PWM 467pracy karty 153pracy przetwornika 231pracy SPI 74pracy uk adu 508

twierdzenie Nyquista 258tworzenie

adresu 84nak adek 417obrazu 335tablicy 543

typ__uint24 119karty 160niekompletny 60wyliczeniowy 114

typyoperandoacutew 29w AVR 34

Kup książkę Poleć książkę

584 AVR Uk ady peryferyjne

Uuchwyt handle 64 113uk ad

AD725 427 431buforowy 294CS 361DAC 284dataloggera 267detekcji awarii zasilania 559generuj cy obraz 393HiRes 477ICL7660 47LM35 250 251SampH 293sterowania sygna em 379USART 401VS1003B 496 503 508 530 538 556VS100XX 529wzmacniania sygna u 227

uk ady peryferyjne 9uruchomienie komparatora 287urz dzenie

master 72slave 72

u rednianie 259utrata danych 141u ycie wstawki asemblerowej 33

VVGA 393

Wwarto ci kalibracyjne

ADC 564oscylatoroacutew 564temperatury 564

warunkowa kompilacja 36WE Write Enable 375wej cie composite video input 425wektor przerwa 38 257wideo 391wielko pami ci 86 377w czenie DAC 299wska nik na struktur 27wska niki 32wstawki asemblerowe 24 33wtyczka 535 541 544

SineDTMF Generator 537VGA 396

wyboacuter cz stotliwo ci PWM 465 474wykorzystanie

DMA 254 518

EuroSCART 428PWM 461rejestroacutew 34

wyliczanie predyktora 489wy wietlacze

alfanumeryczne 43 45graficzne 43 309LCD 43OLED 46

wy wietlanielitera u 213map bitowych 344obrazu 333 346 406obrazu VGA 393

wywo ania zwrotne callbacks 98asynchroniczne 101synchroniczne 101

wyzwalanie konwersji 245wzmacniacz 446wzmacniacz operacyjny 279wzmacnianie sygna u 227

XXMEGA 9 18

Zzapis

bufora 269danych 176d wi ku 440 556

zasilaniekarty 154pami ci 109

zatrzask 368zatrzask 74HC573 433zatrza ni cie adresu 369zdarzenia 297zdarzenie compare match 399zegar 383 420 426zintegrowane rodowisko programistyczne 11z cze EuroSCART 425 428 429zmiana

g o no ci 527wielko ci strony 94

znaki 56

roacuted onapi cia odniesienia 284sygna u 240

Kup książkę Poleć książkę

Page 8: Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8 AVR. Ukäady peryferyjne Rejestry dost pu do pami ci RAM .....513 Rejestr adresu

Rozdzia 22

Wy wietlacze LCDalfanumeryczne

Z tego rozdzia u dowiesz si

jak pod czy popularne wy wietlacze alfanumeryczne do XMEGA

jak stworzy bibliotek obs uguj c kontroler HD44780

jak przesy a polecenia dla LCD w formie transakcji i jak czy dost pdo kontrolera z aplikacji i funkcji obs ugi przerwa

Ze wzgl du na malej ce ceny zwi kszaj c si dost pno oraz niski poboacuter energiicoraz wi kszym zainteresowaniem ciesz si wy wietlacze LCD W tym rozdzialezostan omoacutewione wy wietlacze alfanumeryczne mdash ze uwagi na ich prostot s ci -gle najcz ciej stosowanymi typami wy wietlaczy W dalszej cz ci ksi ki zostanomoacutewione monochromatyczne wy wietlacze graficzne mdash daj one o wiele wi kszemo liwo ci ale ich sterowanie jest nieco bardziej skomplikowane Ze wzgl du na ko-nieczno przesy ania sporej liczby danych wymagaj tak e szybszego interfejsu -cz cego z mikrokontrolerem St d te zanim przejdziemy do ich praktycznego wyko-rzystania b dziemy musieli bli ej zapozna si z kilkoma uk adami peryferyjnymiXMEGA

Wy wietlacze LCD alfanumeryczne zawieraj zazwyczaj scalone kontrolery st d teprocesor nie steruje bezpo rednio matryc LCD ale komunikuje si z wyspecjalizo-wanym sterownikiem ktoacutery wykonuje jego polecenia Dlatego te wykorzystanie te-go typu wy wietlaczy wymaga znajomo ci typu u ytego w nich sterownika Wy wie-tlacze LCD mog by czone z mikrokontrolerem za pomoc roacute nych magistral mdashnajcz ciej s to magistrale SPI lub roacutewnoleg e (w wersji 4- 8- i 16-bitowej) Samewy wietlacze ze wzgl du na budow i mo liwo ci mo emy podzieli na dwie grupy

Wy wietlacze alfanumeryczne mdash umo liwiaj one wy wietlanie cyfr literi innych symboli Jednak w tym typie nie mamy mo liwo ci sterowaniaposzczegoacutelnymi pikselami

Wy wietlacze graficzne mdash w tym typie mo emy sterowa stanem ka dego piksela

Kup książkę Poleć książkę

44 AVR Uk ady peryferyjne

Aby wy wietlana na LCD zawarto by a widoczna niezb dne jest pod wietlenieKupuj c wy wietlacz musimy zwroacuteci uwag czy jest on wyposa ony w jakie pod-wietlenie (mo na dosta wy wietlacze LCD bez pod wietlenia) Oczywi cie lepiej

jest wybra wy wietlacz ktoacutery ma wbudowane pod wietlenie Samo pod wietleniemo e by wykonane w roacute ny sposoacuteb W starszych modelach spotyka si pod wietle-nie oparte na lampie CCFL (ang Cold Cathode Fluorescent Lamp) Tego typu wy-wietlacze s zwykle wi ksze ci sze ale przede wszystkim wymagaj specjalnej

przetwornicy do sterowania lamp Jej zadaniem jest generowanie wysokiego napi -cia niezb dnego do za wiecenia si lampy a nast pnie utrzymywanie go w granicachzapewniaj cych jej prawid owe dzia anie Wy wietlacze tego typu s wi c k opotliwew u ytkowaniu musimy wyda czasami sporo pieni dzy na odpowiedni przetworni-c a w dodatku trwa o takiej lampy jest kroacutetsza ni diod LED Wyst puj tak eproblemy ze sterowaniem jasno ci pod wietlenia W nowoczesnych wy wietlaczachLCD stosuje si praktycznie wy cznie pod wietlenie za pomoc diod LED Nie wy-magaj one adnych wyrafinowanych przetwornic do zasilania zwykle zadowalajsi napi ciem w granicach 3 ndash 12 V maj te znacznie wi ksz trwa o Jasno citakiego pod wietlenia z atwo ci mo na sterowa wykorzystuj c technik PWMPod wietlenie oparte na diodach LED mo e mie roacute ny kolor mdash bia y oacute ty zielonyniebieski czerwony Kolor mo emy sobie wi c dobra wg w asnych preferencji Naj-nowsze wy wietlacze alfanumeryczne s wykonywane w technologii OLED mdash w tejtechnologii wiec poszczegoacutelne piksele wi c taki wy wietlacz nie wymaga pod-wietlenia Niejako przy okazji zyskujemy znacznie lepsze czasy prze czania pikseli

mdash dla wy wietlaczy LCD szczegoacutelnie w ni szych temperaturach czas prze czaniawynosi kilkadziesi t do kilkuset milisekund co powoduje pojawienie si wyra nychbdquoduchoacutewrdquo i psuje estetyk Wy wietlacze OLED nie maj tej wady Jednak zazwyczajs dro sze

Je eli mo esz staraj si wybiera wy wietlacze LCD z pod wietleniem opartym nadiodach LED lub wykonane w technologii OLED

Kolejn istotn kwesti jest regulacja kontrastu Zwykle graficzne kolorowe LCD z wbu-dowanymi sterownikami automatycznie reguluj kontrast dodatkowo sterownik mazaimplementowane rejestry umo liwiaj ce wy cznie programow zmian kontrastuW przypadku prostszych sterownikoacutew wyst puj cych najcz ciej w wy wietlaczachmonochromatycznych (zaroacutewno alfanumerycznych jak i graficznych) kontrast re-guluje si podaj c odpowiednie napi cie na jeden z pinoacutew wy wietlacza Jest to nie-zwykle istotne gdy bez w a ciwego napi cia reguluj cego kontrast na wy wietlaczunic nie zobaczymy Mo emy w takiej sytuacji odnie b dne wra enie e wy wie-tlacz nie dzia a Z kolei je li kontrast b dzie zbyt du y wszystkie piksele b d w -czone co te mo e sugerowa b dne dzia anie LCD

Jedn z cz stszych przyczyn tego e po prawid owym pod czeniu wy wietlaczaLCD nic na nim nie wida albo wszystkie piksele s w czone jest nieprawid owenapi cie na pinie reguluj cym kontrast

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 45

Obs uga wy wietlaczyalfanumerycznych

Wy wietlacze alfanumeryczne s zbudowane z matryc pikseli zwykle o wielko ci5times8 pikseli pogrupowanych razem W tym typie wy wietlacza mo emy sterowazawarto ci tak utworzonej matrycy znakowej jednak nie ma mo liwo ci sterowaniaposzczegoacutelnymi pikselami Najcz ciej spotykane wy wietlacze tego rodzaju mogwy wietla 1times8 1times16 2times16 2times20 4times16 znakoacutew gdzie pierwszy wymiar okre laliczb wy wietlanych wierszy a drugi liczb znakoacutew w wierszu Poniewa nie steru-jemy poszczegoacutelnymi pikselami do kontrolera wysy amy tylko kod znaku ktoacutery mazosta wy wietlony na danej pozycji Kontroler na podstawie kodu znaku generujeadres do specjalnego obszaru pami ci tzw tablicy znakoacutew w ktoacuterej znajduje si bajtowareprezentacja poszczegoacutelnych pikseli tworz cych znak Dla matrycy 5times8 ma ona 40bitoacutew Tablica ta jest umieszczona w pami ci ROM kontrolera LCD nie mo emy jejwi c zmienia Zwykle jednak kontrolery udost pniaj mo liwo definicji kilku w a-snych znakoacutew dzi ki czemu mo emy zdefiniowa np znaki charakterystyczne dla j -zyka polskiego Takie podej cie do generowania obrazu ma podstawow zalet jakjest prostota i zwi zane z tym niewielkie zapotrzebowanie na pami RAM Do prze-chowania np zawarto ci 8-znakowego wy wietlacza LCD wystarczy zaledwie 8 bajtoacutewpami ci Ma to szczegoacutelne znaczenie w prostych mikrokontrolerach z niewielk ilo-ci pami ci RAM Najpopularniejszym kontrolerem stosowanym w wy wietlaczach

alfanumerycznych jest HD44780 nawet je li w posiadanym wy wietlaczu jest innykontroler to mamy du szans e jest on z nim kompatybilny Typowy rozk ad sy-gna oacutew modu oacutew opartych na tym kontrolerze pokazano w tabeli 221

Tabela 221 Typowy uk ad wyprowadze modu oacutew alfanumerycznych LCD opartych na kontrolerzeHD44780

Pin Nazwa Funkcja

1 GND Masa 2 Vcc Zasilanie (typowo 5 V) 3 Vee Regulacja kontrastu 4 RS Zapis polecenia 5 RW Strob odczytzapis 6 E Wyboacuter uk adu 7 D0 Bit danych 0 8 D1 Bit danych 1 9 D2 Bit danych 210 D3 Bit danych 311 D4 Bit danych 412 D5 Bit danych 513 D6 Bit danych 614 D7 Bit danych 715 A Pod wietlenie mdash anoda16 K Pod wietlenie mdash katoda

Kup książkę Poleć książkę

46 AVR Uk ady peryferyjne

Przed pod czeniem modu u zawsze upewnij si czy podany rozk ad odpowiadau ytemu modu owi W szczegoacutelno ci sprawd rozmieszczenie linii zasilaj cych Ichniew a ciwe pod czenie grozi uszkodzeniem modu u

Zwykle piny 15 i 16 steruj ce pod wietleniem s umieszczone osobno lub te przedpinem 1 St d te zawsze nale y je dok adnie zidentyfikowa przed pod czeniem mo-du u Do pinoacutew tych nale y pod czy napi cie wykorzystane do pod wietlenia modu uPrzy czone napi cie zale y od typu zastosowanego pod wietlenia mdash CCFL foliielektroluminescencyjnej lub diod LED W dalszej cz ci b dziemy zajmowa si modu-em z pod wietleniem LED W nocie katalogowej ka dego modu u znajduj si szcze-

goacute owe informacje dotycz ce zasilania pod wietlenia Zwykle w tym celu wymaganejest napi cie 5 V a nat enie pr du pod wietlenia wynosi 20 ndash 50 mA

Wy wietlacze LCD alfanumeryczne s dost pne w handlu w wersjach dostosowanychdo roacute nych napi zasilaj cych Typowo jest to napi cie 5 V co stwarza pewne pro-blemy przy pod czeniu takiego LCD do procesoroacutew rodziny XMEGA S one zasi-lane maksymalnym napi ciem 36 V nie ma wi c mo liwo ci aby LCD i procesordzia a y w tych samych domenach napi ciowych W efekcie przy po czeniu obu uk a-doacutew musimy zastosowa konwersj napi Poniewa LCD alfanumeryczny z perspek-tywy procesora jest urz dzeniem bardzo wolnym ca kowicie wystarczaj cym rozwi za-niem jest zastosowanie szeregowych rezystoroacutew ktoacutere wraz z wbudowanymi w procesordiodami zabezpieczaj cymi b d stanowi y uk ad obni aj cy napi cie na magistralikomunikacyjnej z 5 V do bezpiecznego dla wej cia XMEGA napi cia Z drugiej stronyjedynka logiczna generowana przez procesor zasilany napi ciem 33 V jest poprawnierozpoznawana przez LCD pracuj cy z napi ciem 5 V Je li procesor by by zasilanybardzo niskim napi ciem (rz du 18 ndash 28 V) wymagany by by bardziej skompliko-wany konwerter co zosta o szerzej omoacutewione w rozdziale 7 ksi ki AVR Praktyczneprojekty

Wy wietlacze LCD wymagaj pod wietlenia bez tego wy wietlana zawarto jestpraktycznie nieczytelna W starszych konstrukcjach wykorzystywano pod wietleniew oparciu o lampy fluorescencyjne lub folie elektroluminescencyjne jednak obecniedominuj cym typem jest pod wietlenie za pomoc diod LED

Poniewa zasilamy diod LED wymagane jest do czenie szeregowego rezystoraCzasami taki rezystor jest wbudowany w modu LCD

Pod wietlenie tego typu zu ywa spor ilo energii Innym rozwi zaniem jest kupnowy wietlacza wykonanego w technologii OLED (ang Organic Light-Emitting Diode)Wy wietlacze tego typu cechuj si zdecydowanie lepszym kontrastem ale tak e wi k-sz szybko ci prze czania w zwi zku z czym mo na za ich pomoc uzyska o wielelepsze efekty animacji ktoacutere s praktycznie nieosi galne dla klasycznych wy wietlaczyLCD Nie maj one tak e innej wady LCD mdash zale no ci szybko ci prze czania seg-mentoacutew od temperatury

Wy wietlacze OLED nie maj wyprowadzonych pinoacutew odpowiedzialnych za pod-wietlenie mdash po prostu go nie wymagaj

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 47

Kolejn istotn kwesti jest pod czenie w a ciwego napi cia reguluj cego kontrastwy wietlacza Dla wi kszo ci modu oacutew LCD mie ci si ono w przedziale GND ndash Vcca dla modu oacutew o rozszerzonym zakresie temperatury w przedziale od ndash7 do 0 V mdashrysunek 221

Rysunek 221Pod czenie napi ciareguluj cego kontrasta) modu y klasyczneb) modu y o rozszerzonymzakresie temperatur

Napi cie ujemne mo na uzyska z prostej pompy adunkowej sterowanej przebiegiemPWM z procesora Poboacuter pr du z tego wej cia jest znikomo ma y Alternatywniemo na u y uk adu ICL7660 ktoacutery mo e generowa napi cia ujemne

Kolejn decyzj jak musimy podj jest sposoacuteb pod czenia modu u LCD z mikro-kontrolerem Mamy do wyboru dwie opcje mdash albo pod czamy wszystkie 8 linii da-nych (D0 ndash D7) albo tylko 4 najstarsze (D4 ndash D7) Pod czaj c tylko 4 linie danychzmniejszamy liczb niezb dnych po cze modu u z mikrokontrolerem oraz liczbwykorzystanych linii IO Ze wzgl du na znikom ilo danych przesy anych zdo mo-du u wynikaj ce z pod czenia tylko 4 linii danych spowolnienie transmisji jest bezznaczenia W trybie 4-bitowym najpierw transferowana jest starsza a potem m od-sza tetrada Niewykorzystane linie D0 ndash D3 mo na pozostawi niepod czone wi k-szo modu oacutew wewn trznie podci ga niepod czone linie poprzez rezystor do Vcc

Poniewa linie D0 ndash D7 s dwukierunkowe musimy pami ta aby podczas operacjiodczytu z LCD odpowiednie piny mikrokontrolera by y ustawione jako wej cia W prze-ciwnym przypadku dojdzie do konfliktu

Kolejnym sygna em co do ktoacuterego musimy podj decyzj jest sygna RW okre laj cytyp operacji (odczytzapis) Poniewa zwykle zapisujemy dane do LCD w a ciwie niezachodzi konieczno ich odczytywania mo emy ten sygna na sta e po czy z mas oszcz dzaj c w ten sposoacuteb jedn lini IO procesora Takie rozwi zanie ma jednak po-wa n wad mdash po jego zastosowaniu nie jest mo liwe odczytywanie sygna u zaj to cimodu u (ang busy flag) Powoduje to e pomi dzy kolejnymi zapisami do modu u mu-simy stosowa opoacute nienia dobrane na najwolniejsz mo liw okoliczno W efekcieca a transmisja jest wolniejsza ni mog aby by

Je li korzystamy z tych modu oacutew nie musimy pisa w asnych procedur ich obs ugiInstaluj c rodowisko WinAVR (lub nowy toolchain firmy Atmel) w katalogu docavr-libcexamplessdtiodemo znajdziemy gotowe funkcje obs ugi HD44780 Funkcjete nie dzia aj z mikrokontrolerami XMEGA st d te w za czonych przyk adach zosta-y one zmodyfikowane tak aby poprawnie wspoacute pracowa roacutewnie z tymi mikro-kontrolerami

Kup książkę Poleć książkę

48 AVR Uk ady peryferyjne

Mo emy te skorzysta z licznych przyk adoacutew dost pnych w internecie W dalszejcz ci rozdzia u zostan wykorzystane funkcje z pakietu WinAVR napisane przezJoerga Wunscha Pokazane przyk ady zak adaj e wy wietlacz jest po czonyz mikrokontrolerem tak jak na rysunku 222

Rysunek 222 Po czenie LCD z mikrokontrolerem Na goacuterze pod czenie do mikrokontroleraXMEGA na dole pod czenie do modu u Xplained Na schematach pokazano tak e opcjonalne sposobypod czenia pinu Vee odpowiedzialnego za regulacj kontrastu LCD

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 49

Zanim co wy wietlimy na LCD musimy pozna w jaki sposoacuteb s generowane znakiSterownik LCD zawiera w sobie niezale nie od typu u ytej matrycy 80 bajtoacutew pami ciDDRAM (ang Display Data RAM) Je li zastosowana matryca wy wietla mniejszliczb znakoacutew to cz komoacuterek pami ci jest nieu ywana Mo emy je wykorzystado innych celoacutew mdash np jako zwyk pami RAM Mo emy te u y jej do przesu-wania napisoacutew ktoacutere nie mieszcz si na wy wietlaczu Aby mo na by o umie ciznak na w a ciwej pozycji niezb dne jest poznanie organizacji pami ci kontrolera W za-le no ci od u ytej matrycy pami ta jest zorganizowana nast puj co

Dla matryc 16times1 mdash pami jest podzielona na dwa obszary ka dy zawieraj cypo 8 znakoacutew Obszar pierwszy (od lewej) ma adresy 0x00 do 0x07 a obszar drugi(prawy) adresy 0x40 do 0x47 St d te gdy wy wietla si tekst przekraczaj cygranic obszaroacutew nale y zadba aby poszczegoacutelne litery trafi y pod w a ciweadresy

Dla matryc 20times1 mdash adresy 0x00 do 0x13

Dla matryc 16times2 mdash adres pierwszej linii zaczyna si od 0x00 do 0x0f adresdrugiej linii od 0x40 do 0x4f

Dla matryc 20times2 mdash adresy pierwszej linii to 0x00 do 0x13 a drugiej 0x40 do 0x53

Dla matryc 40times2 mdash adresy pierwszej linii to 0x00 do 0x27 drugiej linii 0x40do 0x67

Dla matryc 20times4 mdash adresy pierwszej linii to 0x00 do 0x13 drugiej 0x40 do 0x53trzeciej 0x14 do 0x27 a czwartej 0x54 do 0x67

Jak wida w niektoacuterych typach wy wietlaczy po ka dej linii zostaje od kilku do kil-kunastu bajtoacutew ktoacuterych zawarto nie jest wy wietlana Ma to pewn zalet mdash mo-emy do pami ci modu u wpisywa teksty d u sze ni s wy wietlane na ekranie co

u atwia przewijanie tekstu Niestety ma to te pewn wad mdash funkcje wy wietlaj ceco na ekranie musz bdquowiedzie rdquo jak organizacj ma matryca W przeciwnym przy-padku nie ma mo liwo ci prawid owego wyliczenia adresu komoacuterki do ktoacuterej ma od-by si zapis

W dalszej cz ci rozdzia u zostanie wykorzystany modu LCD o organizacji 16times2(ale mo na te bez problemu wykorzysta dowolny inny)

Zanim b dzie mo na co wy wietli na ekranie modu musi zosta zainicjalizowanyW trakcie inicjalizacji ustawiane s podstawowe parametry pracy sterownika LCD mdashorganizacja matrycy (liczba linii) wielko czcionki (5times8 lub 8times11 pikseli) Wielkoczcionki zale y od typu pod czonej matrycy LCD Dla konkretnego modu u LCDtylko jedna z tych warto ci b dzie poprawna Oproacutecz inicjalizacji modu u nale y tak-e poprawnie ustawi stan pinoacutew IO wykorzystywanych do pod czenia modu u LCD

Wi kszo pracy zwi zanej z inicjalizacj modu u LCD odbieraniem i wysy aniemdo niego danych wykonuje biblioteka Joerga Wunscha Dostarcza ona niskopozio-mowe funkcje umo liwiaj ce komunikacj ze sterownikiem hd44780 i innymi kom-patybilnymi z nim sterownikami Wystarczy e do aplikacji w ktoacuterej planujemy wy-korzysta taki modu do czymy plik hd44780c oraz plik nag oacutewkowy hd44780h

Kup książkę Poleć książkę

50 AVR Uk ady peryferyjne

Oba pliki bdquozak adaj rdquo e istnieje plik nag oacutewkowy definesh zawieraj cy podstawo-we definicje zwi zane ze sposobem pod czenia modu u LCD z mikrokontroleremNa pocz tku nale y okre li ktoacutere linie IO zosta y wykorzystane do pod czenia modu u

define HD44780_RS A 4define HD44780_RW A 5define HD44780_E A 6define HD44780_D4 A 0

W powy szym przyk adzie do kolejnych linii portu A (A4 ndash A6) zosta y pod czonesygna y RS RW i E modu u natomiast do linii A0 ndash A3 linie D4 ndash D7 modu u LCD Wa nejest aby linie danych czy z pinami IO w kolejno ci rosn cej Biblioteka wykorzy-stuje do transmisji danych pomi dzy modu em a mikrokontrolerem tylko 4 linie danychmdash dzi ki temu mo emy zmniejszy liczb po cze a zwolnione linie IO wykorzystado innych celoacutew W pliku wyst puje jeszcze jedna definicja

define USE_BUSY_BIT 1

Okre la ona e biblioteka b dzie u ywa flagi Busy modu u LCD mdash umo liwia touzyskanie optymalnej szybko ci wspoacute dzia ania z modu em Zako czenie realizacjibie cej operacji modu sygnalizuje zmian stanu tej flagi co umo liwia niezw ocznewys anie kolejnej komendy Je li nie u ywamy flagi Busy program musi generowamaksymalne zalecane w nocie katalogowej opoacute nienia w efekcie ca a transmisja zwal-nia Po zdefiniowaniu u ywanych pinoacutew w pliku definesh mo emy rozpocz korzy-stanie z biblioteki

W pliku hd44780h s udost pnione prototypy funkcji odpowiedzialnych za wspoacute -prac z modu em LCD

Funkcje bibliotecznePodstaw modu u stanowi dwie funkcje umo liwiaj ce odpowiednio wys anie da-nych do modu u oraz ich odczytanie

void hd44780_outbyte(uint8_t b uint8_t rs)uint8_t hd44780_inbyte(uint8_t rs)

Obie funkcje wysy aj odczytuj 8-bitow dan w przypadku wykorzystania tylko4-bitowej szyny danych wysy anie i odczytywanie danych odbywa si w dwoacutech etapachDodatkowo zmienna rs okre la tryb dost pu W przypadku wysy ania danych do modu urs = 0 powoduje e dane zostan wys ane do rejestru komend a je li rs = 1 dane trafido rejestru danych Przy odczycie jest podobnie z tym e dla rs = 0 jest odczytywanaflaga Busy i rejestr AC (ang Address Counter)

Kolejna funkcja odpowiada za oczekiwanie na gotowo modu uvoid hd44780_wait_ready(bool islong)

W przypadku gdy w pliku definesh symbol USE_BUSY_FLAG ma warto 1 parametrislong jest ignorowany a optymalizator kompilatora usuwa go gdy nie jest on wy-korzystywany przez funkcj Kiedy warto USE_BUSY_FLAG jest roacute na od 1 parametr

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 51

ten okre la d ugo opoacute nienia Je li jest roacute na od 0 opoacute nienie wynosi 152 ms a je-eli jest roacutewna 0 opoacute nienie wynosi 37 s Poniewa lepiej jest u ywa flagi Busy

mo emy ten parametr ignorowa

Powy sze trzy funkcje wystarcz do komunikacji z modu em dla wygody zdefiniowanojednak kolejne Funkcje hd44780_outcmd(n) i hd44780_incmd() umo liwiaj odpowiedniowys anie polecenia do rejestru komend kontrolera lub odczytanie bitu Busy i licznikaAC Dwie kolejne mdash hd44780_outdata(n) oraz hd44780_indata() mdash umo liwiaj zapisi odczytanie rejestru danych

Oproacutecz funkcji odpowiedzialnych za komunikacj z modu em LCD zdefiniowano tak efunkcj przeprowadzaj c podstawow inicjalizacj modu u hd44780_init(void) orazfunkcj hd44780_powerdown(void) ustawiaj c wszystkie linie u yte do komunikacjiw stan 0 co umo liwia bezpieczne od czenie zasilania od modu u LCD W przypadkupozostawienia ktoacuterej z wy ej wymienionych linii w stanie 1 przy od czonym za-silaniu modu u stanowi ona jego zasilanie W efekcie mimo wy czenia modu mo epobiera znaczny pr d

Szerszego omoacutewienia wymaga funkcja hd44780_outcmd(cmd) ktoacutera umo liwia wys a-nie polecenia do rejestru polece sterownika LCD Dla wygody zdefiniowane zosta yroacute ne komendy u atwiaj ce wspoacute prac z modu em LCD Komendy te s przekazy-wane jako argument wywo ania funkcji hd44780_outcmd np

hd44780_outcmd(HD44780_CLR)

powoduje wys anie do sterownika polecenia HD44780_CLR czyszcz cego zawartopami ci DDRAM kontrolera

KomendyFunkcja hd44780_outcmd przyjmuje jako argument predefiniowane makrodefinicjeznacznie u atwiaj ce wspoacute prac z kontrolerem modu u LCD Poni ej zostan onepokroacutetce omoacutewione

HD44780_SHIFT(shift right)Ta makrodefinicja powoduje przesuni cie pozycji wy wietlanego tekstu (shift = 1)o jedn pozycj w lewo (argument right = 0) lub w prawo (argument right = 1)W przypadku gdy shift = 0 przesuwany w lewo lub prawo jest tylko kursor Wysy-aj c wielokrotnie to polecenie uzyskujemy kolejne przesuni cia o jedn pozycj

w lewo lub prawo Polecenie to s u y g oacutewnie do przesuwania tekstu Jednak ze wzgl duna du bezw adno tekstowych modu oacutew LCD nie nale y przesuwa liter cz ciej niok raz na sekund mdash cz stsze przesuwanie daje bardzo nieprzyjemne efekty wizual-ne Ka dy bufor linii jest bdquozawijanyrdquo to znaczy e po ostatnim znaku z prawej jestwy wietlany pierwszy znak z lewej i odwrotnie Nale y pami ta e d ugo buforajest sta a dla danego modelu matrycy Np dla modu oacutew 16times2 bufor jednej linii wyno-si dok adnie 40 bajtoacutew z czego 16 jest jednorazowo wy wietlanych Poni szy kodcyklicznie przewija wy wietlany tekst w lewo

lcd_puttext_P(PSTR(Test bufora i przewijania tekstunTen tekst przewija sie w lewo))while(1)

Kup książkę Poleć książkę

52 AVR Uk ady peryferyjne

hd44780_outcmd(HD44780_SHIFT(10)) _delay_ms(700)

HD44780_FNSET(if8bit twoline font5x10)Polecenie to wybiera typ interfejsu mdash 8-bitowy je li warto parametru if8bit jestroacutewna 1 lub 4-bitowy je li jest roacutewna 0 Typ interfejsu musi odpowiada sposobowipo czenia modu u z mikrokontrolerem Parametr twoline okre la czy pod czonamatryca LCD ma jedn lini znakoacutew czy dwie Matryce ktoacutere maj 4 linie tekstu straktowane przez kontroler jako matryce dwuliniowe mdash parametr twoline powinienmie warto 1 Je li dla matrycy zawieraj cej dwie lub wi cej linii ustawimy go na 0to wy wietlana b dzie tylko jedna linia (w przypadku matryc dwuliniowych goacuterna)a w przypadku matryc 4-liniowych b d wy wietlane dwie linie rozdzielone lini pust

Ostatni parametr okre la typ u ywanego generatora znakoacutew Powinien on odpowiadau ytej w module matrycy zwykle wi c jego warto wynosi 0

HD44780_DISPCTL(disp cursor blink)Ustawia roacute ne parametry pracy matrycy Je li parametr disp ma warto 1 to matrycajest w czona (wy wietla zawarto DDRAM) a je li 0 to matryca jest wy czonalecz stan pami ci DDRAM nie ulega zmianie Np kod

while(1) hd44780_outcmd(HD44780_DISPCTL(011)) _delay_ms(700) hd44780_outcmd(HD44780_DISPCTL(111)) _delay_ms(700)

powoduje naprzemienne w czanie i wy czanie matrycy w efekcie wy wietlany tekstmruga

Parametr cursor okre la czy sprz towo wy wietlany kursor ma by widoczny (war-to parametru 1) czy niewidoczny (warto parametru 0) Je li kursor jest widocznyto dodatkowo mo emy okre li czy ma miga (warto parametru blink roacutewna 1)czy nie (blink = 0) Je li kursor jest widoczny i nie miga jest wy wietlany w postacipoziomej kreski Wy wietlanie kursora mo e by u yteczne w sytuacji kiedy u yt-kownik wprowadza jakie dane W pozosta ych sytuacjach kursor mo emy wy czy

HD44780_ENTMODE(inc shift)Okre la sposoacuteb wprowadzania danych do pami ci Je li parametr inc ma warto 1 topo ka dej operacji zapisuodczytu adres pami ci jest automatycznie zwi kszany o je-den co przy piesza operacj zapisuodczytu kolejnych znakoacutew Je li warto inc jestroacutewna 0 to adres jest automatycznie zmniejszany o 1 Dodatkowo parametr shiftokre la czy wy wietlany obraz ma by automatycznie przesuwany tak aby wy wie-tla ostatnio wprowadzony znak (shift = 1) lub go nie wy wietla (shift = 0)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 53

HD44780_CLRPowoduje wyczyszczenie (wype nienie znakami o kodzie 32) ca ej zawarto ci pami ciDDRAM Jednocze nie kursor wraca do pozycji pierwszej (pierwsza linia pierwszyznak)

Niewy wietlane bajty pami ci DDRAM tak e s kasowane Je li s one u ywanedo przechowywania zmiennych programu to przed operacj kasowania nale y jeskopiowa w bezpieczne miejsce W przeciwnym przypadku zostan utracone

Wska nik adresu do pami ci DDRAM jest ustawiany na 0 zerowane jest tak e prze-suni cie

HD44780_HOMEPowoduje powroacutet kursora do pozycji pocz tkowej mdash pierwsza linia pierwszy znakWska nik adresu do pami ci DDRAM w efekcie zawiera 0 zerowane jest roacutewnieprzesuni cie wy wietlania znakoacutew w efekcie s one wy wietlane od pozycji 0

HD44780_DDADDR(addr)Ustawia nast pny adres zapisuodczytu w pami ci DDRAM na addr Tylko 7 bitoacutewargumentu addr jest branych pod uwag w zwi zku z czym mo na zaadresowa mak-symalnie 128 bajtoacutew pami ci (z czego sterownik ma tylko 80 pozosta e lokacje snieu ywane)

HD44780_CGADDR(addr)Ustawia nast pn operacj odczytuzapisu w pami ci CGRAM na addr Pod uwagbranych jest tylko 6 bitoacutew zmiennej addr w efekcie mo na zaadresowa maksymalnie64 bajty pami ci CGRAM

Przedstawione powy ej funkcje zapewniaj jedynie podstawow komunikacj z mo-du em LCD Potrzebujemy jednak ci gle funkcji odpowiedzialnej za jego inicjalizacjmdash funkcja biblioteczna przeprowadza ten proces tylko w podstawowym zakresie musi-my jeszcze zadba o w a ciwe ustawienie parametroacutew zwi zane z posiadan matryc Napiszmy wi c w asne rozwini cie funkcji inicjalizacyjnej

void lcd_init() hd44780_init() Podstawowa inicjalizacja modu u hd44780_outcmd(HD44780_CLR) Wyczy pami DDRAM hd44780_wait_ready(1000) hd44780_outcmd(HD44780_ENTMODE(1 0)) Tryb autoinkrementacji AC hd44780_wait_ready(1000) hd44780_outcmd(HD44780_DISPCTL(1 0 0)) W cz wy wietlacz wy cz kursor hd44780_wait_ready(1000)

Zauwa e po wys aniu ka dego polecenia do modu u jest wywo ywana funkcjahd44780_wait_ready(1000) odpowiedzialna za oczekiwanie a realizacja wys anego po-lecenia dobiegnie ko ca Jest to niezb dne gdy do czasu uko czenia bie cej

Kup książkę Poleć książkę

54 AVR Uk ady peryferyjne

operacji dalsze polecenia s ignorowane Jako argument podany jest parametr 1000mdash jest on bez znaczenia nasza biblioteka korzysta z flagi Busy i po prostu go ignorujePo wykonaniu powy szej funkcji modu LCD jest poprawnie zainicjalizowany a jegopami jest wyczyszczona (zawiera bajty 0x20) i w efekcie modu nic nie wy wietlaOd tej chwili mo emy wysy a znaki do wy wietlenia

Po wykonaniu inicjalizacji ekran mo e pozosta czysty lub wy wietla ca kowiciewype nione kwadraty (wszystkie piksele w czone) Je li po inicjalizacji wszystkiepiksele s w czone nale y nieco zmniejszy kontrast

Aby sobie u atwi to zadanie zdefiniujmy funkcj wysy aj c do modu u jeden znakvoid lcd_putchar(char c) static bool second_nl_seen static uint8_t line=0

if ((second_nl_seen) ampamp (c = n)ampamp(line==0)) Odebrano pierwszy znak hd44780_wait_ready(40) hd44780_outcmd(HD44780_CLR) hd44780_wait_ready(1600) second_nl_seen=false if (c == n) if (line==0) line++ hd44780_outcmd(HD44780_DDADDR(64)) Adres pierwszego znaku drugiej linii hd44780_wait_ready(1000) else second_nl_seen=true line=0 else hd44780_outdata(c) hd44780_wait_ready(40)

Funkcja ta ze wzgl du na skomplikowane adresowanie pami ci DDRAM jest zale naod konkretnego modelu modu u LCD B dzie prawid owo wspoacute pracowa z modu a-mi 2times16 2times20 i 2times40 znakoacutew W przypadku innych modu oacutew pozycje niektoacuterychznakoacutew mog by nieprawid owe

Mo emy ju wy wietla na LCD pojedyncze znaki czas na wy wietlanie tekstu Po-niewa teksty jako sta e dla zaoszcz dzenia cennej pami ci RAM przechowuje si za-zwyczaj w pami ci FLASH zdefiniujmy funkcj odczytuj c podany a cuch zna-kowy z pami ci FLASH a nast pnie umieszczaj c go na LCD

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 55

void lcd_puttext_P(prog_char txt) char ch while((ch=pgm_read_byte(txt))) lcd_putchar(ch) txt++

Powy sza funkcja wysy a kolejne znaki odczytane z pami ci FLASH na LCD za po-moc funkcji LCD_putchar Po napotkaniu znaku ko ca a cucha (0 nul) przerywa swojedzia anie

Pozostaje nam przetestowa dzia anie przedstawionych funkcjiint main() lcd_init() lcd_puttext_P(PSTR(Test LCDnDruga linia)) while(1)

Na ekranie modu u LCD powinien wy wietli si napisTest LCDDruga linia

Je li na LCD nic nie widzimy to w pierwszej kolejno ci powinni my sprawdzi kon-trast zmieniaj c napi cie na pinie Vee modu u LCD

Warto zdefiniowa jeszcze funkcj ustawiaj c pozycj od ktoacuterej b dzie wy wietlanynast pny znak

void lcd_goto(uint8_t x uint8_t y) hd44780_outcmd(HD44780_DDADDR(0x40y+x)) hd44780_wait_ready(1000)

Funkcja ta przyjmuje dwa parametry x i y okre laj ce pozycj na ktoacuterej zostaniewy wietlony nast pny znak wys any z mikrokontrolera do modu u LCD Dzi ki temuz atwo ci mo emy uaktualnia zawarto LCD bez konieczno ci ponownego prze-sy ania wszystkich danych Funkcja ta jest zale na od typu zastosowanego modu u

Ostatni funkcj jest funkcja umo liwiaj ca czyszczenie zawarto ci pami ci modu uOdpowiedzialne za to jest proste polecenie wysy ane do sterownika

void lcd_cls() hd44780_outcmd(HD44780_CLR) hd44780_wait_ready(false)

Oproacutecz czyszczenia zawarto ci pami ci modu u powoduje ono ustawienie kursoraw punkcie (00)

Kup książkę Poleć książkę

56 AVR Uk ady peryferyjne

Definiowanie w asnych znakoacutewUk ad HD44780 jest wyposa ony w 64 bajty pami ci CGRAM (ang Character Ge-nerator RAM) ktoacutera mo e przechowywa mapy bitowe 8 znakoacutew o matrycy 5times8 pikselilub 4 znakoacutew o matrycy 5times10 pikseli Przyk ad definicji znaku na matrycy 5times8 poka-zano na rysunku 223

Rysunek 223Przyk ad definicji w asnego znakuw pami ci CGRAM Znak rysujemyna matrycy 5times8 bitoacutew polazaciemnione odpowiadaj warto ci 1pola bia e warto ci 0 Wartowyliczon dla ka dej linii pikseliwpisujemy do pami ci CGRAMsterownika Najstarsze 3 bity ka degobajta (pola szare) s bez znaczeniamdash wy wietlacz pomija jeprzy wy wietlaniu obrazu

1

2

3

4

5

6

7

0 00100 = 4

01110 = 14

11111 = 31

00100 = 4

00100 = 4

00100 = 4

11111 = 31

01110 = 14

Adres Warto

Dost p do tej pami ci jest mo liwy dzi ki wys aniu polecenia ustawiaj cego adreszapisuodczytu pami ci CGRAM Po jego wys aniu wszystkie operacje zapisu i od-czytu dotycz tej pami ci a nie pami ci DDRAM Aby wroacuteci do adresowania pa-mi ci DDRAM nale y wybra jej adres lub dokona operacji wymagaj cej przesu-ni cia kursora

Pami CGRAM jest pami ci ulotn po ponownym w czeniu zasilania definicjeznakoacutew musz by ponownie przes ane przez procesor

Bity o warto ci 1 w definicji znaku odpowiadaj w czonym pikselom bity o warto-ci 0 pikselom wy czonym Najstarsze 3 bity ka dego bajta w pami ci CGRAM s

bez znaczenia mdash te pozycje nie s wy wietlane przez matryc Definiuj c znak nale-y tak e pami ta e ostatnia linia wy wietlana przez matryc (w zale no ci od wiel-

ko ci matrycy znaku linia 8 lub 10) powinna zawiera same zera mdash w tej linii b dziewy wietlany kursor

Najcz ciej matryce LCD pod czone do sterownika HD44780 maj organizacj 5times8czyli jeden znak jest definiowany przez 8 kolejnych bajtoacutew okre laj cych stan po-szczegoacutelnych linii tworz cych znak Stwoacuterzmy funkcj ktoacuterej zadaniem b dzie za a-dowanie definicji znakoacutew z pami ci FLASH mikrokontrolera do pami ci CGRAM

void lcd_defchar_P(uint8_t charno prog_uint8_t chardef) hd44780_outcmd(HD44780_CGADDR(charno8)) hd44780_wait_ready(40) for(uint8_t c=0clt8c++) hd44780_outdata(pgm_read_byte(chardef))

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 57

hd44780_wait_ready(40) chardef++

Funkcja LCD_defchar_P jako argumenty przyjmuje numer definiowanego znaku (0 ndash 7)oraz wska nik do obszaru pami ci FLASH zawieraj cego definicj znaku (obszarten zajmuje 8 nast puj cych po sobie bajtoacutew) Jak widzimy funkcja najpierw ustawiaw a ciwy adres pod ktoacuterym znajdzie si pocz tek definicji znaku w pami ci CGRAMmdash poniewa jeden znak jest opisywany za pomoc 8 bajtoacutew kolejne adresy znakoacutewto kod_znakutimes8 Nast pnie dane opisuj ce znak s adowane z pami ci mikrokontrolerai zapisywane w pami ci CGRAM sterownika Poni szy program ilustruje wykorzy-stanie funkcji LCD_defchar_P

prog_uint8_t char1[8][8]=0000000255 00000025525500000255255255 0000255255255255 00025525525525525500255255255255255255 0255255255255255255255255255255255255255255255

int main() for(uint8_t x=0xlt8x++) lcd_defchar_P(xampchar1[x][0]) Za aduj wzorce znakoacutew lcd_init() for(uint8_t x=0xlt8x++) lcd_putchar(x) Wy wietl znaki o kodach 0 ndash 7 while(1)

W pierwszej linii funkcji main nast puje za adowanie nowych definicji znakoacutew dopami ci CGRAM nast pnie inicjalizowany jest wy wietlacz po czym w pierwszejlinii s wy wietlane znaki o kodach 0 ndash 7 a wi c znaki ktoacuterych definicja zosta aprzes ana z mikrokontrolera

Zauwa e pami CGRAM podobnie jak DDRAM mo emy zapisywa i odczytywaprzed inicjalizacj modu u LCD Proces inicjalizacji jest potrzebny tylko do prawi-d owego wy wietlania na ekranie LCD

Poniewa dane potrzebne do wy wietlenia znaku s na bie co pobierane z pami cipodczas od wie ania matrycy LCD jakiekolwiek zmiany w definicji znaku kiedy jest onwidoczny na LCD poci gaj za sob natychmiastowe zmiany w wy wietlanym obrazieMo na t w a ciwo sterownika wykorzysta do stworzenia prostych animacji

void lcd_box(uint8_t y) hd44780_outcmd(HD44780_CGADDR(0)) Zaczynamy od znaku o kodzie 0 hd44780_wait_ready(40) for(uint8_t c=0cltyc++) Stwoacuterz linie z w czonymi pikselami hd44780_outdata(0xFF) hd44780_wait_ready(40) for(uint8_t c=yclt8c++) Stwoacuterz linie z wy czonymi pikselami hd44780_outdata(0x00) hd44780_wait_ready(40)

Kup książkę Poleć książkę

58 AVR Uk ady peryferyjne

int main() lcd_init() lcd_putchar(0) while(1) for(uint8_t x=0xlt8x++) lcd_box(x) _delay_ms(100) for(int8_t x=7xgt=0x--) lcd_box(x) _delay_ms(100)

Funkcja main wy wietla na LCD tylko jeden znak o kodzie 0 a nast pnie cykliczniezmienia jego definicj w pami ci CGRAM W efekcie posta znaku wy wietlana naekranie ci gle si zmienia

Transakcyjna obs uga LCDPokazana do tej pory obs uga LCD alfanumerycznego mia a pewne wady Jak wiemyoperacje odwo uj ce si do kontrolera LCD s niezwykle wolne cykl odczytuzapisudowolnego rejestru kontrolera trwa co najmniej 1600 ns co dla MCU taktowanegozegarem 32 MHz przek ada si na czas wykonania oko o 52 instrukcji asemblera Cogorsza wi kszo komend realizowanych przez kontroler jest wykonywana w czasieoko o 37 s co przek ada si na tysi ce zmarnowanych taktoacutew MCU St d te jaki-kolwiek zapisodczyt LCD to z perspektywy programu straszne marnotrawstwo czasu

Problem ten dotyczy ka dego urz dzenia IO ktoacutere dzia a wolniej ni procesor W takiejsytuacji warto napisa pewn warstw po redni mdash sterownik mdash ktoacuterego zada-niem b dzie buforowanie da dost pu do urz dzenia i rozstrzyganie konfliktoacutewdzi ki czemu roacute ne cz ci programu b d bdquomia y wra enierdquo e maj wy czny do-st p do urz dzenia

Pokazane wcze niej funkcje obs ugi LCD maj jeszcze jedn wad mdash nie s wspoacute bie -ne czyli nie mo na ich wykonywa jednocze nie w kilku miejscach programu w tymw szczegoacutelno ci w programie g oacutewnym i w funkcjach obs ugi przerwa W wielu przy-padkach ta wada jest bez znaczenia jednak czasami jest uci liwa mdash dla przyk adugdy na wy wietlany tekst chcieliby my na o y inne informacje np o dacie lub godzi-nie Oczywi cie wy wietlanie mo na zorganizowa tak aby nie by o potrzeby pisaniawspoacute bie nego kodu np poprzez zastosowanie bufora pami ci VRAM kontrolera LCDRodzi to jednak kolejne problemy i jest ma o eleganckie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 59

Zastanoacutewmy si w jaki sposoacuteb najlepiej jednocze nie rozwi za problem wolnegodost pu do urz dzenia i wspoacute bie no ci kodu Rozwi zaniem mo e by wprowadze-nie tzw transakcji Transakcj nazywamy zbioacuter operacji tworz cych pewn ca-o To co wyroacute nia tak wykonywany zestaw operacji to atomowo spoacutejno

izolacja i trwa o Pod tymi terminami kryje si istota wykonywanej operacji Ato-mowo transakcji zapewnia e jest ona wykonywana w sposoacuteb niepodzielny co gwa-rantuje nam prawid ow wspoacute prac z danym urz dzeniem IO w tym przypadku kon-trolerem LCD Wa na dla nas jest tak e izolacja mdash dzi ki temu inne operacje na LCD(inne transakcje) nie b d mia y wp ywu na wynik aktualnie wykonywanej transakcjimdash nie b d zak oacuteca y jej wykonania z drugiej strony nasza transakcja nie zak oacuteciwykonania innych Trwa o z kolei zagwarantuje nam e je li sterownik potwierdziwykonanie transakcji to znaczy e efekt jej dzia ania jest wy wietlony na LCD Tacecha nie jest nam a tak potrzebna mdash jest ona wydawa oby si oczywista Niemniej jestto pewna gwarancja e ca a operacja przebieg a poprawnie i w efekcie LCD znajdujesi w okre lonym przez nas stanie Tyle teorii przejd my do praktyki

Kody poni szego przyk adu znajduj si w katalogu PrzykladyLCD-alfaLCD-transact

Aby zapewni transakcyjny dost p do LCD musimy stworzy pewne struktury danychktoacuterych zadaniem b dzie przechowywanie informacji o operacjach sk adaj cych sina transakcje i stanie ich wykonania W tym celu pos u ymy si wiadomo ciami z roz-dzia u 5 bdquoJak uporz dkowa chaos czyli z o one typy danych i listyrdquo Do przecho-wywania oczekuj cych transakcji pos u ymy si buforem pier cieniowym zanimjednak go zaimplementujemy zastanoacutewmy si jak powinna wygl da struktura prze-chowuj ca informacje o transakcji Struktura ta powinna zawiera co najmniej

pole danych (data) z informacjami ktoacutere maj by przes ane do kontrolera LCD

pole okre laj ce liczb danych do wys ania (len)

pole okre laj ce realizowane polecenie dla LCD (cmd) mdash pole to pos u yprogramowi sterownika do w a ciwej interpretacji danych znajduj cych siw polu data

kilka poacutel kontrolnych przechowuj cych informacje potrzebne do realizacjisamej transakcji Jedno z nich mdash Ready mdash b dzie przyjmowa warto trueje li dana transakcja zosta a zrealizowana lub false w przeciwnym przypadkuZnaczenie drugiego pola mdash SelfDel mdash mo e wydawa si nieco enigmatycznepole to okre la czy pami przydzielona dla transakcji ma by zwolnionaw sterowniku LCD (warto true) czy te zostanie zwolniona w programie(warto false)

Oto jak mo e wygl da struktura definiuj ca transakcj typedef struct volatile bool Ready 1 true je li transakcja zosta a zrealizowana bool SelfDel 1 true je li pami przydzielona transakcji ma zosta zwolniona LCD_Cmd cmd 2 Polecenie do zrealizowania uint8_t len 6 D ugo polecenia

Kup książkę Poleć książkę

60 AVR Uk ady peryferyjne

unsigned 0 Wyroacutewnanie do granicy bajta uint8_t data[] Dane transakcji LCD_trans

Nale y zwroacuteci uwag na poleunsigned 0

Nie definiuje ono adnego pola struktury ale jedynie informuje kompilator e kolejnepole (w naszym przyk adzie o nazwie data) ma by wyroacutewnane do granicy bajta mdashdzi ki temu dost p do kolejnego pola b dzie odbywa si szybciej Z kolei samo poledata jest zadeklarowane jako tzw typ niekompletny

Typ niekompletny (ang incomplete type) to typ ktoacuterego rozmiaru nie da si okre li

W pokazanym przyk adzie rozmiaru pola data nie da si okre li gdy zosta on za-deklarowany jako typ tablicowy z tym e nie podano wielko ci tablicy Wielko ci niepodano gdy na etapie deklaracji struktury nie wiemy jakiej wielko ci dane b d w niejprzechowywane Tego typu deklaracja ma bardzo powa ne konsekwencje mdash skorowielko ci pola data nie da si okre li to jaki b dzie wynik dzia ania operatora sizeof(LCD_trans) Kompilator stara si jako wybrn z tej sytuacji w zwi zku z czym

zwroacuteci wielko struktury ale tak jakby pole data w ogoacutele nie istnia o mdash jego roz-miar b dzie wynosi 0 W ramach wiczenia zastanoacutew si ile bajtoacutew pami ci b dziezajmowa a struktura LCD_trans

Skoro dysponujemy ju struktur przechowuj c poszczegoacutelne transakcje pora nastworzenie obiektu przechowuj cego kolekcj transakcji Dodanie kolejnej strukturyb dzie polega o na dodaniu jej do takiego obiektu z drugiej strony program sterownikaLCD b dzie moacuteg z tej kolekcji pobiera kolejne transakcje do realizacji Opis ten przy-pomina opis dzia ania bufora pier cieniowego mdash z jednym wyj tkiem mdash po zape nie-niu ca ego bufora nie b dziemy usuwa niezrealizowanych transakcji lecz zabloku-jemy dodawanie kolejnych W tym celu pos u ymy si definicj nast pnej struktury

typedef struct LCD_trans elements[LCD_MAXTRANS] Wska niki do transakcji uint8_t Beg Pierwszy element bufora uint8_t Count Liczba elementoacutew w buforze CircBuffer

Struktura ta zawiera deklaracj tablicy wska nikoacutew na transakcje (pole elements)Poniewa jest to tablica musimy zna liczb jej elementoacutew mdash jest ona zadeklarowanaw sta ej LCD_MAXTRANS

define LCD_MAXTRANS 10 Maksymalna liczba pami tanych transakcji

Do realizacji bufora s potrzebne jeszcze dwa pola Beg wskazuj ce na pierwsztransakcj w buforze oraz pole Count okre laj ce liczb transakcji znajduj cych siw buforze Je li Count == 0 to znaczy e w buforze nie ma adnych oczekuj cychtransakcji a je li Count == LCD_MAXTRANS to znaczy e bufor jest pe ny i nie mo na

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 61

dodawa do niego kolejnych transakcji W a ciwo t wykorzystuj dwie zdefiniowanew pliku LCD_transc funkcje

static inline bool cbIsFull(CircBuffer cb) return cb-gtCount == LCD_MAXTRANS

static inline bool cbIsEmpty(CircBuffer cb) return cb-gtCount == 0

Jak pami tamy w przypadku funkcji modyfikatory static inline powoduj e danafunkcja nie b dzie istnie jako samodzielna lecz w ka dym miejscu w ktoacuterym jestwywo ywana jest wstawiany raczej jej kod a nie wywo anie Ma to znaczenie dlakroacutetkich funkcji (a wi c takich jak pokazane powy ej) dla ktoacuterych koszty wywo anias zazwyczaj wi ksze ni koszty umieszczenia cia a funkcji w miejscu jej wywo aniaTego typu funkcje zachowuj si w sposoacuteb zbli ony do makrodefinicji (z tym e re-spektuj wszystkie regu y j zyka C w szczegoacutelno ci kolejno operatoroacutew czy kon-trol typoacutew)

Takie funkcje jako argument pobieraj adres bufora na ktoacuterym maj operowa W na-szym przypadku bufor jest zdefiniowany nast puj co

static CircBuffer LCD_TransBuffer Bufor na transakcje

Nale y zauwa y e jest on zdefiniowany jako struktura globalna z modyfikatoremstatic Modyfikator ten ogranicza zasi g widoczno ci zmiennej LCD_TransBuffer dopliku w ktoacuterym zmienna ta zosta a zdefiniowana (w tym przypadku modyfikator staticjest niejako przeciwie stwem modyfikatora extern) Dzia anie to ma jedynie znaczeniekosmetyczne mdash uniemo liwia odwo anie si do bufora za pomoc funkcji ktoacutere niezosta y zdefiniowane w miejscu jego definicji Oproacutecz funkcji umo liwiaj cych okre-lenie stanu bufora potrzebne s jeszcze funkcje umo liwiaj ce dodanie i pobranie trans-

akcji Pierwsz funkcj b dzie funkcja dodaj ca transakcj do buforabool cbAdd(CircBuffer cb LCD_trans elem) ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsFull(cb)) return false Czy jest miejsce w kolejce uint8_t end = (cb-gtBeg + cb-gtCount) LCD_MAXTRANS cb-gtelements[end] = elem Dodaj transakcj ++cb-gtCount Liczba elementoacutew w buforze return true Wszystko OK

Funkcja ta dodaje transakcj (zmienna elem) do bufora ko owego Zanim transakcjazostanie dodana sprawdzane jest czy w buforze jest miejsce mdash je li nie funkcjazwroacuteci false Je li dodanie jest mo liwe warto licznika okre laj cego liczb trans-akcji przechowywana w buforze (Count) zwi ksza si o jeden Warto zastanowi si te dlaczego praktycznie ca e cia o tej funkcji jest zamkni te w sekcji atomowej (ATOMIC_BLOCK) Jedn z cech naszego sterownika ma by mo liwo wspoacute bie nego dost pu

Kup książkę Poleć książkę

62 AVR Uk ady peryferyjne

do LCD mdash to znaczy e danie np zapisu do LCD mo e wyst pi zaroacutewno w g oacutewnejp tli programu jak i asynchronicznie w przerwaniu St d te wynika e funkcja do-daj ca transakcj musi by napisana w sposoacuteb zapewniaj cy jej poprawn prac w sytu-acji gdy zostanie ona przerwana i ponownie wywo ana przed zako czeniem dzia aniajej poprzedniej instancji Umieszczenie cia a tej funkcji w sekcji atomowej nam to za-pewnia mdash dzi ki temu bufor transakcji zawsze b dzie spoacutejny Dla zaspokojenia cie-kawo ci warto usun sekcj atomow i sprawdzi jak wtedy b dzie zachowywa si tafunkcja i jak wp ynie to na spoacutejno przechowywanych danych

Drug niezb dn funkcj jest funkcja odczytuj ca bufor transakcji i zwracaj ca trans-akcj do zrealizowania (lub NULL je li adnej transakcji nie ma w buforze)

LCD_trans cbRead(CircBuffer cb) LCD_trans elem ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsEmpty(cb)) return NULL Bufor pusty nie mo na zwroacuteci elementu elem = cb-gtelements[cb-gtBeg] cb-gtBeg = (cb-gtBeg + 1) LCD_MAXTRANS -- cb-gtCount Zmniejszamy liczb elementoacutew pozosta ych w buforze return elem

Funkcja ta jest bardzo podobna do poprzedniej mdash najpierw sprawdza czy bufor za-wiera jak oczekuj c transakcj (cbIsEmpty(cb)) je li tak to zwraca adres opisuj -cej j struktury i zmniejsza liczb transakcji oczekuj cych (pole Count) W ten sposoacutebmamy zrealizowan ca funkcjonalno zwi zan z obs ug bufora pier cieniowegoPokazane funkcje s uniwersalne i z bardzo podobnych (lub wr cz tych samych) b -dziemy korzysta w kolejnych rozdzia ach w kontek cie np obs ugi transakcji zwi -zanych z interfejsami szeregowymi

Pora przej do samego sterownika LCD Jego zadaniem b dzie sprawdzenie czyw buforze oczekuj jakie transakcje do realizacji a je li tak to ich wykonanie Ponie-wa dane do LCD mog by wysy ane co okre lony minimalny czas znacznie d u -szy ni czas jakiego na to zadanie potrzebuje mikrokontroler do wysy ania kolejnychpaczek danych pos u ymy si timerem Timer b dzie generowa przerwanie nadmiaru(TCD0_OVF_vect) ktoacutere b dzie wyznacza o tempo w jakim kolejne porcje danych b -d trafia y do LCD Z noty katalogowej kontrolera wynika e minimalny czas trwa-nia wysokiego stanu sygna u Enable to 230 ns a okres tego sygna u nie powinien bykroacutetszy ni 500 ns Poniewa nasz dost p do LCD odbywa si w sposoacuteb nieblokuj cyMCU wi c szybko wysy ania danych do LCD jest bez znaczenia St d te w poka-zanym przyk adzie przyj to e dane b d wysy ane co 4 s co okre la sta a

define LCD_ACCESSTIME 0000004

Poniewa komunikacja z LCD odbywa si w sposoacuteb nieblokuj cy nie zale y nam tena czasie (i tak w stosunku do czasu od wie ania samego LCD jest on bardzo kroacutetki)w efekcie nie ma potrzeby odczytywania flagi busy kontrolera Dzi ki temu w cz ciprzypadkoacutew mo emy w ogoacutele zrezygnowa z sygna u wyboru RW i wymusi jego sta y

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 63

poziom logiczny umo liwiaj cy zapis do LCD Dzi ki temu mo na zaoszcz dzi do-datkowy pin IO1

Ca a logika naszego sterownika jest zawarta w funkcji obs ugi przerwania przepe nieniatimera (TCD0_OVF_vect) Poniewa LCD jest po czony z MCU w trybie 4-bitowym(dla zaoszcz dzenia liczby wykorzystanych pinoacutew IO) kolejne 8-bitowe dane muszby podzielone na dwie tetrady i wys ane do LCD w kolejno ci starszam odsza tetradaInformacja o aktualnie wysy anych danych jest umieszczona w zmiennej trans o typie

static struct uint8_t pos 6 Pozycja w polu danych aktualnej transakcji uint8_t nibble 1 Ktoacutera tetrada jest wysy ana seq

Dlaczego tak Dzi ki wykorzystaniu struktury i poacutel bitowych mo na zaoszcz dzi je-den bajt pami ci SRAM Ze wzgl du na wielko pami ci obs ugiwanej przez kon-troler LCD mo emy by pewni e transakcje zawieraj ce wi cej ni 63 bajty s ra-czej nierealne (nie mia yby wi kszego sensu) St d te do przechowywania informacjio aktualnie wysy anym bajcie danych wystarczy 6 bitoacutew mdash tyle samo zosta o wyko-rzystanych do okre lenia d ugo ci pola danych transakcji w strukturze LCD_trans Zaosz-cz dzony bit mo na po wi ci na flag nibble okre laj c ktoacutera tetrada (m odszastarsza)jest wysy ana Bez poacutel bitowych flaga ta zaj aby dodatkowy bajt pami ci

Przejd my do implementacji sterownika Pierwsz rzecz jak nale y sprawdzi jestto czy w buforze czeka jaka transakcja do zrealizowania Odpowiedzialny za to jestfragment kodu obs ugi przerwania nadmiaru timera

if(trans == NULL) Nic do zrobienia sprawd my czy jaka transakcja oczekuje trans=cbRead(ampLCD_TransBuffer) Czy jest jaka oczekuj ca transakcja seqpos=0 seqnibble=0 if(trans == NULL) TCD0_CTRLA=TC_CLKSEL_OFF_gc Nie ma adnych transakcji mdash wy cz timer

W przypadku gdy adna transakcja nie oczekuje na realizacj timer jest wy czanymdash dzi ki temu nie b d zg aszane kolejne przerwania przepe nienia i MCU nie b -dzie traci czasu na ich obs ug Co prawda wynikaj cy z tego zysk czasowy jest mar-ginalny lecz ma to istotniejsz konsekwencj mdash w przypadku usypiania MCU zb d-ne przerwanie timera nie b dzie niepotrzebnie wybudza o procesora W takiej sytuacjiponowne w czenie timera nast pi dopiero w funkcji dodaj cej transakcj do kolejkimdash a wi c w sytuacji gdy mamy pewno e istnieje oczekuj ca transakcja

Druga cz funkcji obs ugi przerwania jest zwi zana z realizacj samej transakcjiW pokazanym przyk adzie zaimplementowano tylko jeden typ transakcji mdash daniezapisu a cucha tekstowego pod wskazany adres VRAM (na okre lonej pozycji LCD)Je li zajdzie taka potrzeba programista mo e zaimplementowa inne polecenia i doda

1 Warto zauwa y e w bdquoklasycznejrdquo obs udze LCD te nie musimy czyta stanu flagi busy zamiast tego

wystarczy wprowadza p tle opoacute niaj ce Jednak poniewa taka obs uga blokuje MCU nie jest onazalecana Wady tej nie ma dost p transakcyjny co jest jego dodatkow zalet

Kup książkę Poleć książkę

64 AVR Uk ady peryferyjne

kod odpowiedzialny za ich obs ug Zauwa my e ka da transakcja musi zawieraadres pocz tku pami ci wideo od ktoacuterego b dzie zapisywany tekst Dzieje si takdlatego e transakcja wykonana wcze niej mo e ustawi wska nik zapisu na dowolnejkomoacuterce pami ci W efekcie tekst z kolejnej transakcji by by wy wietlany od komoacuterkina ktoacuterej zako czy si zapis poprzedniej transakcji Takie dzia anie oczywi cie jestniedopuszczalne st d te ka dy zapis do pami ci wideo poprzedza ustawienie rejestruindeksowego Problem ten mo na rozwi za tak e w inny sposoacuteb mdash poprzez wpro-wadzenie tzw uchwytoacutew (ang handlers) ktoacutere zawiera yby stan kontrolera LCDNiemniej to rozwi zanie dodatkowo komplikowa oby nasz sterownik Struktura danych(zawartych w polu data) ma wi c nast puj cy format

bajt nr 0 zawiera warto pozycji od ktoacuterej nale y dokonywa zapisu pami ciwideo mdash jest to warto przesy ana do rejestru okre laj cego adres zapisu

kolejne bajty zawieraj a cuch znakowy ktoacutery nale y umie ci w pami ciCGRAM

Poniewa bajt nr 0 zawsze zawiera warto wpisywan do rejestroacutew steruj cych kon-trolera podczas jego wysy ania jest ustawiana linia RS sygnalizuj ca zapis do rejestruPodczas wysy ania kolejnych bajtoacutew linia ta jest zerowana w zwi zku z czym zapisodbywa si do pami ci CGRAM

Kod obs uguj cy transakcj wygl da nast puj coif(trans) Jest transakcja do zrealizowania uint8_t dat=trans-gtdata[seqpos] if(seqnibble == 0) datgtgt=4 To trzeba zmieni je li linie danych nie s po czone z pinami 0 ndash 3 portu IO hd44780_outnibble_nowait(dat amp 0x0F seqpos = 0) Zapisujemy rejestr steruj cy lub dane ++seqnibble if(seqnibble == 0) ++seqpos Co drug tetrad zwi kszamy pozycj bufora if(seqpos gt= trans-gtlen) trans-gtReady=true Koniec transakcji if(trans-gtSelfDel) free_re(trans) Zwolnij pami transakcji je li tak sobie yczy programista trans=NULL Koniec transakcji CLR(OUT HD44780_E)

Ta cz przerwania wysy a kolejne tetrady do kontrolera LCD Warto zastanowi sinad dzia aniem sekwencji

++seqnibble

Poniewa pole nibble jest jednobitowe operacja inkrementacji prowadzi do zmianystanu tego pola na przeciwny (pole to ma warto 0 lub 1) Kiedy zostan wys anewszystkie dane przeznaczone dla kontrolera obs uga transakcji ko czy si Stan tensygnalizuje nadanie warto ci true polu Ready struktury LCD_trans Dzi ki temu pro-gram mo e sprawdzi asynchronicznie w stosunku do przerwania kiedy transakcjauleg a zako czeniu Opcjonalnie jest wykonywana jeszcze jedna funkcja mdash je li poleSelfDel ma warto true to pami zarezerwowana na transakcj jest automatycznie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 65

zwalniana W tym celu wykorzystuje si funkcj free_re ktoacuterej prototyp jest zade-klarowany w pliku Alloc_safeh Funkcja ta wywo uje funkcj biblioteczn free ktoacute-ra zwalnia pami przydzielon dynamicznie na stercie Poniewa funkcja ta nie jestfunkcj reentrant nale y stworzy odpowiedni bdquoprotez rdquo opakowuj c j w blokatomowy co zapewnia e nie zostanie ona ponownie wywo ana zanim jej poprzed-nia instancja nie zako czy dzia ania Oczywi cie lepszym rozwi zaniem by oby napi-sanie w asnych funkcji dynamicznej alokacji pami ci ktoacutere b d reentrant

Bardzo wa ne jest aby pole SelfDel mia o warto true wy cznie dla transakcjidla ktoacuterych pami zosta a przydzielona dynamicznie funkcj malloc (lub jej po-chodnymi) W pozosta ych przypadkach pole to musi mie warto false mdash nie-stosowanie si do tej regu y spowoduje b d mened era pami ci i najprawdopo-dobniej nieprzewidywalne dzia anie programu

Drug wa n zasad jest aby zmienna zawieraj ca dane transakcji nie by azmienn automatyczn mdash zmienne takie s automatycznie niszczone po opusz-czeniu zawieraj cej je funkcji W rezultacie obszar pami ci zawieraj cy danetransakcji mo e zosta wykorzystany przez inne zmienne co spowoduje uszkodzeniezawartych w nim danych

Pami przydzielona transakcji musi by alokowana w sposoacuteb dynamiczny (funkcjamalloc_re) ewentualnie mo e to by pami alokowana dla zmiennej globalnej lubstatycznej mdash zmienne tego typu istniej przez ca y czas ycia programu

Warto te zauwa y e instrukcje steruj ce stanem linii Enable kontrolera LCD(SET(OUT HD44780_E) i CLR(OUT HD44780_E)) s rozdzielone wieloma innymi in-strukcjami Dzi ki temu generowany impuls dodatni tego sygna u ma czas trwania gt230 ns wymagany w specyfikacji kontrolera Nawet dla XMEGA taktowanej zegarem32 MHz 230 ns przek ada si na oko o 7 instrukcji asemblera mdash czas jaki z pewno-ci up ynie pomi dzy wykonaniem obu powy szych instrukcji steruj cych

Do wysy ania danych do kontrolera zosta a wykorzystana nieco zmodyfikowanafunkcja hd44780_outnibble_nowait roacute ni ca si od jej protoplasty hd44780_outnibbletylko tym e nie czeka na sygna braku zaj to ci mikrokontrolera (nie realizuje teopoacute nie ) Nie jest to potrzebne gdy kolejne tetrady s wysy ane w odst pach cza-sowych okre lanych przez timer

Mamy wi c zapewnion obs ug transakcji i mo liwo transakcyjnego wy wietlaniadanych na LCD musimy jeszcze mie funkcj ktoacutera tworzy odpowiednie transakcjemdash jest odpowiednikiem funkcji bezpo rednio wysy aj cej dane znakowe do LCDOdpowiednikiem tym jest pokazana poni ej funkcja

bool LCD_PutText_B(uint8_t x uint8_t y char txt LCD_trans buf bool autodel) buf-gtcmd=LCD_Text buf-gtReady=false buf-gtSelfDel=autodel Czy zwolni pami po zako czeniu transakcji buf-gtdata[0]=HD44780_DDADDR(x+y0x40) Ustaw adres w DDRAM strcpy((char)ampbuf-gtdata[1] txt) Skopiuj dane tekstowe + NULL

Kup książkę Poleć książkę

66 AVR Uk ady peryferyjne

buf-gtlen=strlen(txt) + 1 D ugo tekstu + pozycji + NULL ndash 1 bool ret=cbAdd(ampLCD_TransBuffer buf) if((ret==false) ampamp (autodel)) free_re(buf) Brak miejsca w kolejce else TCD0_CTRLA=TC_CLKSEL_DIV1_gc Preskaler 1 mdash odblokuj timer return ret

Funkcja ta buduje transakcj odpowiedzialn za wy wietlenie napisu txt na wskaza-nej pozycji x y LCD Wszystkie dane o transakcji zostan umieszczone w buforzew pami ci ktoacuterej adres jest okre lany wska nikiem buf Pami w buforze musi bywystarczaj co du a aby pomie ci ca transakcj Dodatkowy parametr autodel okre laczy pami ta ma by automatycznie zwalniana po obs u eniu transakcji (true) czynie (false) Je li transakcj uda o si umie ci w kolejce funkcja zwraca true Wartozauwa y e w takim przypadku funkcja uruchamia te timer (w naszym przypadkujest to timer TCD0) odpowiedzialny za generowanie przerwania Funkcja obs ugi prze-rwania wysy a dane do LCD

Pewn odmian powy szej funkcji jest funkcjabool LCD_PutText(uint8_t x uint8_t y char txt) LCD_trans trans=malloc_re(sizeof(LCD_trans) + strlen(txt) + 2) bool ret=LCD_PutText_B(x y txt trans true) return ret

Wykorzystuje ona funkcj LCD_PutText_B z tym e najpierw alokuje dynamiczniepami potrzebn na przechowanie tworzonej transakcji

Mamy komplet potrzebnych funkcji a wi c sprawd my jak ca o sprawdza siw praktyce W pliku LCD-transactc znajduje si kod pokazuj cy jak dzia aj naszetransakcje Aby to by o mo liwe nale y zainicjalizowa kontroler LCD

LCD_init()

Wykorzystujemy tu znan ju funkcj inicjalizuj c mdash nie ma potrzeby jej zmienia gdy operacja inicjalizacji LCD jest jednorazowa i nie trzeba wykonywa jej w posta-ci transakcji W drugim kroku musimy zainicjalizowa wykorzystywany timer i systemprzerwa

LCD_Timer_init(ampTCD0)PMIC_CTRL|=PMIC_LOLVLEN_bm Odblokuj przerwania niskiego poziomusei()

Poniewa dost p do LCD z pewno ci nie jest czynno ci krytyczn czasowo prze-rwaniom timera nadano najni szy priorytet Dzi ki temu mo na innym bardziej kry-tycznym przerwaniom nada wy sze priorytety i uzyska w ten sposoacuteb zmniejszenieczasu latencji obs ugi przerwa Sama inicjalizacja timera jest niezwykle prosta

void LCD_Timer_init(TC0_t tc) tc-gtINTCTRLA=TC_OVFINTLVL_LO_gc Odblokuj przerwania nadmiaru timera i nadaj im niski priorytet tc-gtPER=F_CPULCD_ACCESSTIME Przerwanie co 4 us (niezale nie od F_CPU)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 67

Sprowadza si ona tylko do odblokowania mo liwo ci zg aszania przerwania nadmia-ru oraz konfiguracji rejestru PER tak aby przerwania by y generowane co ok 4 s mdashniezale nie od cz stotliwo ci taktowania CPU Mo emy wi c przyst pi do wy wie-tlenia pierwszego napisu

LCD_PutText(00 Numer)

Powy sza funkcja ma jedn wad mdash alokuje dynamicznie pami po ka dym wywo-aniu (pami ta jest automatycznie zwalniana po obs u eniu transakcji) niemniej

ca y proces jest czasoch onny Mo emy tego unikn alokuj c pami bdquor cznierdquo i wielo-krotnie wykorzystuj c zaalokowany blok pami ci Ilustruje to poni szy przyk ad

LCD_trans buf=malloc_re(sizeof(LCD_trans) + 7)

Zmienna buf wskazuje na obszar pami ci ktoacutery mo e pomie ci a cuch 5-znakowyTyle wystarczy na potrzeby tego przyk adu mdash na LCD b d wy wietlane kolejneliczby w zakresie 0 ndash 65 535 najd u sza ma 5 znakoacutew st d te nasz bufor ma tak a nieinn d ugo

while(1) utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(60 bufstr buf false) while(LCD_IsTransCompleted(buf))

Do konwersji liczby na a cuch u yto funkcji bibliotecznej utoa (nag oacutewek stdlibh)Poniewa d ugo a cucha po konwersji jest zmienna (co spowodowa oby pozosta-wianie na LCD bdquoduchoacutewrdquo po poprzednich konwersjach) w kolejnej linii brakuj ceznaki uzupe niono spacjami Nast pnie tworzona jest transakcja w obszarze pami ciprzydzielonym zmiennej buf Ostatnia p tla while jest odpowiedzialna za oczekiwa-nie na zako czenie realizacji transakcji Po jej zako czeniu p tla jest wykonywana odpocz tku

Uwa ny czytelnik z pewno ci zauwa y e pami przydzielana funkcj malloc_renie jest nigdzie zwalniana mdash w normalnej sytuacji spowodowa oby to wyciek pami -ci W naszym przyk adzie jednak program nigdy si nie ko czy nie ma wi c potrzebyzwalniania pami ci wskazywanej przez zmienn buf

Powy szy przyk ad pokazuje jak unikn blokowania CPU na czas dost pu do wolnodzia aj cego urz dzenia jakim jest LCD alfanumeryczny Jednak to nie wszystkiezalety wynikaj ce z zastosowania transakcji Drug wa n zalet naszego rozwi zaniailustruje przyk ad znajduj cy si w katalogu PrzykladyLCD-alfaLCD-transact-intPowa nym ograniczeniem funkcji odpowiedzialnych za dost p do LCD w sposoacutebklasyczny by a niemo no ich wywo ywania z funkcji obs ugi przerwa mdash funkcjeobs ugi LCD nie by y reentrant2 Nasz system oparty na transakcjach nie ma tychwad Aby to zilustrowa zosta stworzony prosty przyk ad mdash tak jak poprzedniow p tli g oacutewnej programu s wy wietlane stale kolejne liczby ale jednocze nie wyko-

2 Poza tym blokowa y CPU na d ugi czas a jak pami tamy funkcje obs ugi przerwa powinny by

wykonywane mo liwie kroacutetko

Kup książkę Poleć książkę

68 AVR Uk ady peryferyjne

rzystano drugi timer (TCD1) w ktoacuterego funkcji obs ugi przerwania przepe nienia jestwy wietlany licznik tych przerwa

ISR(TCD1_OVF_vect) static char int_buf[sizeof(LCD_trans) + 7] static uint16_t cnt char bufstr[6]

utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(61 bufstr (LCD_trans)ampint_buf false)

Jak widzimy w sposoacuteb asynchroniczny z dwoacutech miejsc w programie mo emy uzy-ska dost p do LCD a ka da funkcja bdquoma wra enierdquo e ma LCD na wy czno Przy okazji warto przeanalizowa sposoacuteb w jaki jest rezerwowana pami na trans-akcj w przerwaniu Oczywi cie mo na by wykorzysta dynamiczn alokacj pami cilecz jak wspomniano taka alokacja jest czasoch onna St d te w pokazanym przy-k adzie wykorzystano tablic statyczn int_buf o rozmiarze umo liwiaj cym prze-chowanie kompletnej transakcji Dzi ki temu e zmienna int_buf jest zmienn statycz-n nie jest ona niszczona po zako czeniu funkcji obs ugi przerwania Gdyby pomins owo kluczowe static zmienna ta by aby niszczona a na LCD najprawdopodobniejzacz yby si pojawia przypadkowe tre ci Poniewa pami naszego bufora nie by aalokowana dynamicznie nie mo e ona zosta zwolniona w naszym sterowniku LCDst d te ostatni parametr wywo ania funkcji LCD_PutText_B musi mie warto false

OptymalizacjaPrzy okazji tego i poprzedniego przyk adu warto zastanowi si jeszcze nad jednkwesti mdash optymalizacji W podanych przyk adach wykorzystano wcze niej omoacute-wione funkcje dost pu do wy wietlacza LCD znajduj ce si w plikach hd44780ci hd44780h Wi kszo z zawartych tam funkcji nie jest wykorzystywana jednakkompilator mimo wszystko umieszcza ich kod w pliku wynikowym mdash dzieje si takponiewa nie mo e on bdquostwierdzi rdquo czy funkcje te nie s wykorzystywane w innychfragmentach programu Pami tajmy e kompilator kompiluje poszczegoacutelne pliki roacute-d owe osobno i dana jego instancja nie bdquowierdquo co znajduje si w innych plikach (innychjednostkach kompilacji) Tak ca o ciow wiedz ma dopiero konsolidator (linker)ktoacutery czy stworzone przez kompilator pliki obiektowe (o rozszerzeniu o) w plikwynikowy Linker jednak bdquonie wierdquo ktoacutera z funkcji programu zosta a u yta a ktoacuteranie mdash informacje te ma wy cznie kompilator W ten sposoacuteb powstaje typowe b dneko o w efekcie nasze nieu ywane funkcje nie s usuwane (linker zostawia je bdquonawszelki wypadekrdquo) i zajmuj niepotrzebnie pami Czy mo na temu jako zaradzi Oczywi cie tak W tym celu trzeba po czy si y kompilatora i linkera co zapewniaj od-powiednie opcje kompilacji We w a ciwo ciach projektu (ProjectProperties lub Alt+F7)wybieramy zak adk Toolchain a nast pnie AVRGNU C Compiler i OptimizationZnajdziemy tam pole wyboru o nazwie Prepare functions for garbage collection (ry-sunek 224)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 69

Rysunek 224 Aby da linkerowi mo liwo usuwania nieu ywanych funkcji nale y skompilowaprogram z wybran opcj ndashffunction-sections ktoacutera spowoduje e ka da funkcja programu znajdzie siwe w asnej sekcji

Zaznaczenie tej funkcji spowoduje umieszczenie ka dej funkcji w osobnej sekcji mdashsamo w sobie nie wp ynie to na skroacutecenie kodu wynikowego ale jest warunkiem nie-zb dnym dla podj cia stosownych dzia a przez linker Aby wyeliminowa nieu y-wane funkcje nale y zaznaczy jeszcze w ga zi AVRGNU LinkerOptimization poleGarbage collect unused sections (rysunek 225)

Rysunek 225 Zaznaczenie opcji Garbage collect unused sections (-Wl--gc-sections) spowodujee nieu ywane funkcje zostan usuni te z kodu wynikowego w efekcie kod programu ulegnie skroacuteceniu

Po zaznaczeniu tych opcji program zostanie skroacutecony o kilkaset bajtoacutew Oczywi cieje li wszystkie funkcje by yby wykorzystane nie uzyskaliby my adnego skroacuteceniakodu Niemniej w sytuacji gdy u ywa si bibliotek zazwyczaj przynajmniej czfunkcji nie jest wykorzystywana warto wi c skorzysta z tej mo liwo ci optymalizacji

Kup książkę Poleć książkę

70 AVR Uk ady peryferyjne

Je li mamy do czynienia z prekompilowan bibliotek (lib) to musi ona by skom-pilowana z zaznaczon opcj Prepare functions for garbage collection (-ffunction-sections) Alternatyw jest umieszczenie ka dej funkcji biblioteki w osobnym pliku(tak jak w przypadku bibliotek AVR-libc)

Na ekranie wyboru opcji optymalizacji linkera mamy jeszcze jedn przydatn opcjmdash Relax Branches (-mrelax) Dla mikrokontroleroacutew ktoacutere maj ponad 8 kB pami ciFLASH instrukcje skokoacutew s generowane jako tzw instrukcje d ugie mdash umo liwiajone skok do komoacuterki pami ci FLASH o dowolnym adresie Jednak cen za to jestwyd u enie instrukcji mdash ich kod jest d u szy podobnie jak czas wykonania Nie zawszejednak takie d ugie instrukcje musz by wykonywane mdash je li miejsce docelowe skokule y blisko (w zasi gu instrukcji skokoacutew wzgl dnych) to mo na w kodzie wynikowymzamieni instrukcje d u sze na kroacutetsze co przynosi oszcz dno ci w postaci skroacuteceniakodu wynikowego Poniewa dopiero linker bdquowierdquo jak poszczegoacutelne fragmenty kodus rozmieszczone w pami ci takiej podmiany mo na dokona na etapie linkowaniaprogramu co zapewnia powy sza opcja St d te warto to pole wyboru zaznaczy

Kup książkę Poleć książkę

SkorowidzA

ABI Application Binary Interface 25AC Address Counter 50ADPCM 482adres

bazowy 377bufora 61komoacuterki 84pu apki 202

ALE Address Latch Enable 368alfanumeryczne wy wietlacze 43algorytm ADPCM 492algorytmy stratne 495animacje 57antyaliasing 325architektury procesoroacutew XMEGA 352asembler 23

dyrektywy 40funkcje j zyka C 41obs uga przerwa 39

asynchroniczne wywo anie funkcji 101Atmel Studio 15

Bbajty kalibracyjne 569biblioteka

FATFS 131 139 176 180 517libcallback-liba 99PetitFS 144 149

bitADC_CH0START_bm 236IMPMODE 244

bitrate 442 512blokowanie przerwa 219b d 16 19

kwantyzacji 463offsetu 230wzmocnienia ADC 230

BOD 223bps bits per second 12

budowakarty 152linii obrazu 394pami ci SDRAM 374pliku stymulacji 192ramki PAL 412sygna u PAL 411wtyczki 544 545

bufor 78FIFO 497na transakcje 61transakcji 62

buforowanie wyj cia 294

CCAS Column Address Strobe 375CCFL 44charakterystyka

przetwornikoacutew 222termistora 264tryboacutew pracy 232

CID Card Identification 169CKE Clock Enable 375CLKIN 421COG Chip on Glass 310CRC 158 178CRC16 178CRC7 164CS Chip Select 361 375CSD Card Specific Data 172czas

dost pu do SDRAM 424adowania kondensatora 244

propagacji 281proacutebkowania 260symulacji 209

czcionki 322cz stotliwo

odchylania pionowego 428proacutebkowania 244 441 444 530przebiegu 504

Kup książkę Poleć książkę

576 AVR Uk ady peryferyjne

cz stotliwoPWM 465taktowania koprocesora 549taktowania procesora 209taktowania rdzenia 18

czyszczenie pami ci 318

DDAC Digital to Analog Converter 293 447 451

buforowanie wyj cia 294generowanie przebiegoacutew 301jitter 303kalibracja 306napi cie referencyjne 295system zdarze 297taktowanie 296tryb dwukana owy 301wykorzystanie DMA 298wyzwalanie konwersji 305

datalogger 261 265 275DD Device Density 86debuger 183

programowy 190sprz towy 185 187

decymacja 259DEBUG 219XMEGA 260

definicja symboli globalnych 36definiowanie w asnych znakoacutew 56deklaracja zapowiadaj ca 103 337dekoder DTMF 548 556DMA 254 298 402 458 518 523dost p do

danych 358 359 568danych binarnych 356 360danych wielobajtowych 31DataFLASH 137EEPROM 128FAT 136komoacuterki 375LCD 59 62 66 68operandu 30pami ci 81 384 386 387 561pami ci SDRAM 424pliku blokowy 141portoacutew IO 30rejestroacutew IO procesora 36rejestroacutew uk adu 499SPI 95sygnatury u ytkownika 565 567wska nikoacutew 32

DQM Data Mask 375DSP Digital Signal Processor 535

DTMF 535 553dyktafon 529dynamiczna alokacja pami ci 516dyrektywa global 38dyrektywy asemblera 40dzia anie

DMA 255komparatora 280timeroacutew 400

d wi k 443

EEBI External Bus Interface 361EEPROM 207eliminacja jitteru 24emulacja RS232 139

FFAT File Allocation Table 128 131FAT32 128FATFS 180filtr

dolnoprzepustowy 491drugiego rz du 470pierwszego rz du 469trzeciego rz du 471

filtrowanie sygna u PWM 468firmware 565FLASH 207format

odpowiedzi 159polecenia 158protoko u 157

funkcja_delay_ms 17 219c_zero 42callback 106 341callback() 99DataFLASH_CSEnable 100DF_FinishBufWrite() 269disk_initialize 136disk_ioctl 181disk_status 136disk_write 138DMA_SPI_init 104DTMF_GetCode 553free_re 65GPIOR0_init 507hd44780_outcmd 51hd44780_outnibble_nowait 65LCD_defchar_P 57

Kup książkę Poleć książkę

Skorowidz 577

Menu_Click_Func 515Menu_Free 516Menu_Recorder 532Menu_Run 527MS_CreateRegEntry 117MS_GetDirPos 125MS_GetRegItem 115MS_WritePages 116 118OSC_wait_for_rdy 473RecMenu_StartStop 532sprintf 142strtok 124sysclk_init() 200 209TMF_memcpy_PF 454udi_cdc_getc() 123udi_cdc_is_rx_ready() 123VS1003_Reset 506

funkcjeanalizuj ce 556biblioteczne 50biblioteki FATFS 143j zyka C 41kontrolera ST7565R 313opoacute niaj ce 17opoacute nie 219reentrant 524specjalne kontrolera 319steruj ce 314zapisu 133

fusebit 557BODACT 560BODLEVEL 560BOOTRST 559DVSDON 560EESAVE 561JTAGEN 558RSTDISBL 559SUT 559TOSCSEL 559

fusebity w AVR-libc 571

Ggenerator obrazu composite 426generowanie

d wi ku 461kolorowego obrazu 437obrazu wideo 391przebiegoacutew 301przerwa 285sygna u composite 409

g bia koloru 326gniazdo

karty SD 156VGA 396

Hhistereza 281

IIDE 11IMA ADPCM 483informacje

o kolorze 431o obrazie 434

inicjalizacjakarty 161karty SDHC 167karty SDSC 167karty SDXC 167licznika 419pami ci 119USART 505

instrukcjaicall 42movw 35nop 13 24

interfejsSCI 498SDI 498SPI 71 79RS232 120UART 123USART 71 73

interpolacja 259interpolacja w XMEGA 260inwersja obrazu 319

Jjednostki 12jitter 24 303 420

Kkalibracja

ADC 229DAC 306 564offsetu 237

kana DMA 82 522karta 154 158

mikroSD 152SD 151 152SDHC 151 152 160SDSC 160SDXC 151 160

Kup książkę Poleć książkę

578 AVR Uk ady peryferyjne

karty pami ci 151 152 157biblioteka FATFS 180budowa 152format polecenia 158inicjalizacja 161 167komunikacja 156odczyt danych 173opcje konfiguracyjne 181rejestry specjalne 169tryby pracy 153zapis danych 176zasilanie 154

kodasemblerowy 23 24C 23dost pu 24

kodowanieμ-law 481ADPCM 483Dialogic ADPCM 494informacji 166 426koloru 425znakoacutew 536

kodyformatoacutew audio 501zdarze 545

kolejno bajtoacutew 533kolor 424 430kolorowy obraz 437komparator 422

analogowy 279 280analogowy XMEGA 282okienkowy 284

kompilacja plikoacutew binarnych 350kompilator avr-gcc 11 359kompresja

ADPCM 482 486d wi ku 480IMA ADPCM 482

komunikacja z koprocesorem 504konfiguracja

4-portowa 364biblioteki 133debugera 185DMA 459 522fusebitoacutew 570kontrolera DMA 257 452komparatoroacutew 285lockbitoacutew 570LPC 371pami ci SDRAM 381PetitFS 149pinu IO 225portoacutew IO 362

preskalera 452projektu 186przerwa 219pu apki 203rejestru EVCTRL 248rejestru PER 67SPI 75sygna u CS 377typu czcionki 324urz dze IO 189USART 76zegara 383

konsolidacja 547kontroler

DMA 254 298 402 458 518 523KS108 310ST7565R 310ndash315 321

konwersjaDAC 305sygna oacutew 396wyzwalana 306

konwertercyfrowo-analogowy 426DAC 427

koprocesormp3 496VS1003B 10

korekcja fazy 466kwantyzacja 463

Llampa CCFL 44LE Latch Enable 433licznik 419

cykli 209TCC1 400timera 20

linie IO 50linie sygna owe

MISO 72 164MOSI 72SCK 72SS 72

linker 69lista

mnemonikoacutew 24modyfikowanych rejestroacutew 32

lockbity 557 561lockbity w AVR-libc 570LPC Low Pin Count 371LPCM 443 556LSB Least Significant Bit 228

Kup książkę Poleć książkę

Skorowidz 579

a cuchy formatuj ce 212czenie plikoacutew 352

Mmagistrala pami ci zewn trznej 361magnetofon cyfrowy 528makro _SFR_IO_ADDR() 39makrodefinicja

ASSERT 214HD44780_CGADDR() 53HD44780_CLR 53HD44780_DDADDR() 53HD44780_DISPCTL() 52HD44780_ENTMODE() 52HD44780_FNSET() 52HD44780_HOME 53HD44780_SHIFT() 51LOCKBITS 571

mapowanie sygna oacutew 366mapy bitowe 343marker czasowy 268maski bitowe 329matryce 49menu 335menu piktogramowe 342mierniki temperatury 262mikrokontroler

ARM 9AVR 9PIC 9XMEGA128A3U 10

MISO 72moc wydzielana 265model psychoakustyczny 495modu

alfanumeryczny 45NVM 568Xmega eXploreGO 10Xplained ATXMEGA A3BU 10Xplained ATXMEGA-A1 10Xplained XMEGA128A1 447Xplained XMEGA256A3 94Xplained XMEGA256A3BU 97 143 266

modyfikator 30const 85volatile 28 273

monitory CRT 395monochromatyczne wy wietlacze graficzne 309monochromatyczny

tryb graficzny 416tryb tekstowy 413

MOSI 72mp3 495Msps Megasamples per second 12multiplekser wej ciowy 226 283multipleksowanie adresoacutew 368 369muzyka 439

Nnadawanie kodoacutew DTMF 540nadproacutebkowanie 258nag oacutewek kontenera wav 500nagrywanie mowy 486najmniej znacz cy bit 228napi cie

offsetu 280referencyjne 223 295zasilania 239

Oobracanie obrazu 319obraz 319

composite 426kolorowy 430wideo 391

obroacutebka d wi ku 443 445obs uga

FAT 131 143klawiatury matrycowej 24LCD 58 63 67menu 337przerwania 37 38 458przerwania DMA 525przerwa w asemblerze 39przyciskoacutew 272wy wietlaczy alfanumerycznych 45

odczytblokowy 140danych 173 358

odpowied response 159R1 159R2 159R7 160

od wie anie pami ci 376odtwarzanie

d wi ku 472muzyki 447 513 518 521

offset 238offset ADC 230okno

Breakpoints 202Call stack 209dezasemblera 210

Kup książkę Poleć książkę

580 AVR Uk ady peryferyjne

oknoIO View 207podgl du zmiennych 211wyboru czcionek 324

OLED 46opcje

kompilatora 35zapisu d wi ku 445

operacjena buforach 91odczytu 173zapisu 176zapisu strony 92

operand 29operator

ascii 41

asciz 41

byte 41

section 41opoacute nienia 13 18opoacute nienie zmienne 16optymalizacja 16 68optymalizator 26organizacja pami ci 77organizacja pami ci VRAM 316oscylator 287OSD On-Screen Display 417ostrze enie 16oszcz dzanie energii 94

Ppakiet WinAVR 48pami

CGRAM 56 57 64DataFLASH 10 77 81 113 269DDRAM 49EEPROM 111FLASH 54 124 207RAM 49SDRAM 372SRAM 63 124 329 366 371VRAM 314 317

PCLK 421PCM 443PetitFS 144 149p tla

for 13while 201

pierwsza linia obrazu 321piksel 430piktogram 342pin IO 225

plikAlloc_safeh 65DataFLASHc 83DataFLASHIOc 136definesh 50delayh 14diskioh 132 136ffh 132ffconfh 132 181hd44780h 49integerh 132ioh 30LCD_transc 61LCD-transactc 66Makefile 14Menuc 19nothingo 541outfiletxt 547 551pffh 149SPIh 104stringh 113stymulacji 191 192

pliki mp3 495elf 351fon 323o 24S 24 34binarne 350 355csv 276d wi kowe 440obiektowe 352wav 500WMA 512z czcionkami 327z danymi 349

podbijacz napi cia 315podgl d

pami ci 207stosu wywo a 209zmiennych 211znakoacutew 325

pod czeniefototranzystora 262karty SD 155LCD z kontrolerem 311modu u 50pami ci 362 369 370 373termistora 262uk adu LM35 251wyj XMEGA 398

pod wietlenieCCFL 46OLED 46

Kup książkę Poleć książkę

Skorowidz 581

podwoacutejne buforowanie 255 332 457polecenia

kasowania strony 81konfiguracyjne pami ci 82kontrolera ST7565R 315odczytu bufora 82 89odczytu pami ci 81 88SDRAM 376transferu 91

polecenieACMD41 168cd 181CID 178CMD0 165CMD8 167CSD 178date 276dir 127 181dump 276erase 276get 276HD44780_CLR 51Init 178mkdir 181

po czenieDMA ze SPI 96dwoacutech komparatoroacutew 285koprocesora mp3 497LCD z mikrokontrolerem 48wyj cia XMEGA 411XMEGA z PC 121z telewizorem 431

pomiarnapi cia zasilania 239temperatury MCU 241

port IO 30 362pozycjonowanie grafik 345poacute obraz 410precyzja pomiaroacutew 260preskaler 478preskaler ADC 243program

Atmel Data Visualizer 275Audacity 443avr-objcopy 350dataloggera 265LCD Image Converter 323makeloadingtableexe 543Realterm 127 554riffstrip 483SoX 445Tracepoint 208

programowanie sygnatury u ytkownika 566protokoacute master-slave 157

prototypy 136proacutebki d wi kowe 447proacutebkowanie

8-bitowe 300nieliniowe 480

prymitywy graficzne 330przebieg PWM 468przebiegi 289 303przechwytywanie danych 276przemiatanie wej 253przerwanie 218 254 286 403

DMA 522komparatora 286

przestrze adresowa procesora 378przesy anie

danych 498polece 498

przetaktowanie procesora 436przetwornik

ADC 221analogowo-cyfrowy 221cykliczny 222potokowy 222

przyciski 272pseudooperatory 41pu apki breakpoints 197pu apki warunkowe 205punkty ledzenia 203PWM 461 462 472

RRAS Row Address Strobe 375redukcja poboru energii 242regulacja kontrastu 321rejestr 32 34rejestr AC 50

adresu wtyczki 513BASEADDR 377CID 169CMP 251CSD 172czasu utworu 512DATA 83EVCTRL 248formatu audio 512identyfikacyjny pami ci 87INTFLAGS 252kontroli basoacutew 510kontroli g o no ci 513MUXCTRL 227OCR 168PER 67poroacutewnania 249

Kup książkę Poleć książkę

582 AVR Uk ady peryferyjne

rejestr ACSCI_CLOCKF 511stanu komparatora 287stanu pami ci 86stanu uk adu 510trybu pracy 508WINCTRL 285

rejestrydost pu do pami ci RAM 513GPIOR 502IO procesora 36mikrokontrolera 25procesora 35specjalne 94specjalne karty 169uk adu VS1003B 508

relacja rodzic ndash dziecko 336reset uk adu 534rozdzielczo

LCD 329przetwornika 231PWM 463 477

rozszerzenie HiRes 477 479roacutewnanie Steinharta-Harta 263rysowanie map bitowych 343

Sschemat uk adu dataloggera 267SCI Serial Command Interface 498SCK 72SD Secure Digital 152SDI Serial Data Interface 498separator synchronizacji 422separowanie impulsoacutew synchronizacji 422shieldy 10skaler 422skaler napi cia 283skrypt makefile 353s owo kluczowe

asm 27extern 37static 68

specyfikatory lokalizacji zmiennej 213sps samples per second 12SS Slave Select 72standard PAL 410standard VGA 393sterowanie

dataloggerem 275sygna em 379

sterownik 121HD44780 49 56LCD 49 62

stos wywo a 209

strukturaFATFS 139Handle 118LCD_trans 60 63menu 338rejestru 86SimpleFSEntry 113 116SimpleFSHandle 113 118 140submenu 527systemu plikoacutew 112

sumabitowa 571kontrolna 178

sygnacomposite 409composite video output 430CS 377DREQ 497H-Sync 396synchronizacji 423V-Sync 396zegarowy CLK 374

sygna yinterfejsu EBI 363magistrali EBI 364steruj ce 375

sygnaturaprodukcyjna procesora 563u ytkownika 565

symbol__DELAY_ROUND_CLOSEST__ 17__DELAY_ROUND_DOWN__ 17_FS_FAT12 149_FS_FAT32 149_FS_MINIMIZE 133_FS_READONLY 133_FS_RPATH 135_FS_TINY 133_MAX_SS 135_MULTI_PARTITION 135_USE_DIR 149_USE_FASTSEEK 134_USE_FORWARD 134_USE_LABEL 134_USE_LFN 134_USE_LSEEK 149_USE_MKFS 134_USE_READ 149_USE_STRFUNC 134_USE_WRITE 149_VOLUMES 136F_CPU 14 15 18increment 36USE_BUSY_FLAG 50

Kup książkę Poleć książkę

Skorowidz 583

symboleglobalne 36w asemblerze 28zewn trzne 39

symulacja 198 209symulator 190synchronizacja

pami ci 331pionowa 395pozioma 394

systemplikoacutew 111 128przerwa 404zdarze 245

szablonfont_XMEGAtmpl 326image_XMEGAtmpl 343

szum 463szybko przesy ania danych 126

ledzenie wi zki 333rodowisko

graficzne 11programistyczne 11VSIDE 542WinAVR 47

Ttabela FAT 130tablica

framebuf 402 408plugintbl 552 555tekst 208z kodem wynikowym 543

taktowanieDAC 296mikrokontrolera 473

technologia OLED 44temperatura mikrokontrolera 239 241termistor 262 290

NTC 263PTC 263

termometrLM35 249 250z alarmem 251

termostat 290test uk adu VS1003B 503testowanie obrazu 319timer 16 62

TCC0 20

TCC1 399transakcja 59 62 65transakcje 17 103ndash107transakcyjna obs uga LCD 58transakcyjny dost p do SPI 95transfer 91

danych 97wynikoacutew 254

transmisja 72 83tryb

bez znaku 234ci g ej konwersji 252czterobitowy 153dwukana owy 301graficzny 416graficzny VGA 407idle 419jednobitowy 153LPC 371monochromatyczny 397 407oszcz dzania energii 94 306pracy multipleksera 226pracy SPI 157roacute nicowy 232single slope 312SPI 153tekstowy 413tekstowy VGA 397z pojedynczym wej ciem 234ze znakiem 235

trybygenerowania PWM 467pracy karty 153pracy przetwornika 231pracy SPI 74pracy uk adu 508

twierdzenie Nyquista 258tworzenie

adresu 84nak adek 417obrazu 335tablicy 543

typ__uint24 119karty 160niekompletny 60wyliczeniowy 114

typyoperandoacutew 29w AVR 34

Kup książkę Poleć książkę

584 AVR Uk ady peryferyjne

Uuchwyt handle 64 113uk ad

AD725 427 431buforowy 294CS 361DAC 284dataloggera 267detekcji awarii zasilania 559generuj cy obraz 393HiRes 477ICL7660 47LM35 250 251SampH 293sterowania sygna em 379USART 401VS1003B 496 503 508 530 538 556VS100XX 529wzmacniania sygna u 227

uk ady peryferyjne 9uruchomienie komparatora 287urz dzenie

master 72slave 72

u rednianie 259utrata danych 141u ycie wstawki asemblerowej 33

VVGA 393

Wwarto ci kalibracyjne

ADC 564oscylatoroacutew 564temperatury 564

warunkowa kompilacja 36WE Write Enable 375wej cie composite video input 425wektor przerwa 38 257wideo 391wielko pami ci 86 377w czenie DAC 299wska nik na struktur 27wska niki 32wstawki asemblerowe 24 33wtyczka 535 541 544

SineDTMF Generator 537VGA 396

wyboacuter cz stotliwo ci PWM 465 474wykorzystanie

DMA 254 518

EuroSCART 428PWM 461rejestroacutew 34

wyliczanie predyktora 489wy wietlacze

alfanumeryczne 43 45graficzne 43 309LCD 43OLED 46

wy wietlanielitera u 213map bitowych 344obrazu 333 346 406obrazu VGA 393

wywo ania zwrotne callbacks 98asynchroniczne 101synchroniczne 101

wyzwalanie konwersji 245wzmacniacz 446wzmacniacz operacyjny 279wzmacnianie sygna u 227

XXMEGA 9 18

Zzapis

bufora 269danych 176d wi ku 440 556

zasilaniekarty 154pami ci 109

zatrzask 368zatrzask 74HC573 433zatrza ni cie adresu 369zdarzenia 297zdarzenie compare match 399zegar 383 420 426zintegrowane rodowisko programistyczne 11z cze EuroSCART 425 428 429zmiana

g o no ci 527wielko ci strony 94

znaki 56

roacuted onapi cia odniesienia 284sygna u 240

Kup książkę Poleć książkę

Page 9: Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8 AVR. Ukäady peryferyjne Rejestry dost pu do pami ci RAM .....513 Rejestr adresu

44 AVR Uk ady peryferyjne

Aby wy wietlana na LCD zawarto by a widoczna niezb dne jest pod wietlenieKupuj c wy wietlacz musimy zwroacuteci uwag czy jest on wyposa ony w jakie pod-wietlenie (mo na dosta wy wietlacze LCD bez pod wietlenia) Oczywi cie lepiej

jest wybra wy wietlacz ktoacutery ma wbudowane pod wietlenie Samo pod wietleniemo e by wykonane w roacute ny sposoacuteb W starszych modelach spotyka si pod wietle-nie oparte na lampie CCFL (ang Cold Cathode Fluorescent Lamp) Tego typu wy-wietlacze s zwykle wi ksze ci sze ale przede wszystkim wymagaj specjalnej

przetwornicy do sterowania lamp Jej zadaniem jest generowanie wysokiego napi -cia niezb dnego do za wiecenia si lampy a nast pnie utrzymywanie go w granicachzapewniaj cych jej prawid owe dzia anie Wy wietlacze tego typu s wi c k opotliwew u ytkowaniu musimy wyda czasami sporo pieni dzy na odpowiedni przetworni-c a w dodatku trwa o takiej lampy jest kroacutetsza ni diod LED Wyst puj tak eproblemy ze sterowaniem jasno ci pod wietlenia W nowoczesnych wy wietlaczachLCD stosuje si praktycznie wy cznie pod wietlenie za pomoc diod LED Nie wy-magaj one adnych wyrafinowanych przetwornic do zasilania zwykle zadowalajsi napi ciem w granicach 3 ndash 12 V maj te znacznie wi ksz trwa o Jasno citakiego pod wietlenia z atwo ci mo na sterowa wykorzystuj c technik PWMPod wietlenie oparte na diodach LED mo e mie roacute ny kolor mdash bia y oacute ty zielonyniebieski czerwony Kolor mo emy sobie wi c dobra wg w asnych preferencji Naj-nowsze wy wietlacze alfanumeryczne s wykonywane w technologii OLED mdash w tejtechnologii wiec poszczegoacutelne piksele wi c taki wy wietlacz nie wymaga pod-wietlenia Niejako przy okazji zyskujemy znacznie lepsze czasy prze czania pikseli

mdash dla wy wietlaczy LCD szczegoacutelnie w ni szych temperaturach czas prze czaniawynosi kilkadziesi t do kilkuset milisekund co powoduje pojawienie si wyra nychbdquoduchoacutewrdquo i psuje estetyk Wy wietlacze OLED nie maj tej wady Jednak zazwyczajs dro sze

Je eli mo esz staraj si wybiera wy wietlacze LCD z pod wietleniem opartym nadiodach LED lub wykonane w technologii OLED

Kolejn istotn kwesti jest regulacja kontrastu Zwykle graficzne kolorowe LCD z wbu-dowanymi sterownikami automatycznie reguluj kontrast dodatkowo sterownik mazaimplementowane rejestry umo liwiaj ce wy cznie programow zmian kontrastuW przypadku prostszych sterownikoacutew wyst puj cych najcz ciej w wy wietlaczachmonochromatycznych (zaroacutewno alfanumerycznych jak i graficznych) kontrast re-guluje si podaj c odpowiednie napi cie na jeden z pinoacutew wy wietlacza Jest to nie-zwykle istotne gdy bez w a ciwego napi cia reguluj cego kontrast na wy wietlaczunic nie zobaczymy Mo emy w takiej sytuacji odnie b dne wra enie e wy wie-tlacz nie dzia a Z kolei je li kontrast b dzie zbyt du y wszystkie piksele b d w -czone co te mo e sugerowa b dne dzia anie LCD

Jedn z cz stszych przyczyn tego e po prawid owym pod czeniu wy wietlaczaLCD nic na nim nie wida albo wszystkie piksele s w czone jest nieprawid owenapi cie na pinie reguluj cym kontrast

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 45

Obs uga wy wietlaczyalfanumerycznych

Wy wietlacze alfanumeryczne s zbudowane z matryc pikseli zwykle o wielko ci5times8 pikseli pogrupowanych razem W tym typie wy wietlacza mo emy sterowazawarto ci tak utworzonej matrycy znakowej jednak nie ma mo liwo ci sterowaniaposzczegoacutelnymi pikselami Najcz ciej spotykane wy wietlacze tego rodzaju mogwy wietla 1times8 1times16 2times16 2times20 4times16 znakoacutew gdzie pierwszy wymiar okre laliczb wy wietlanych wierszy a drugi liczb znakoacutew w wierszu Poniewa nie steru-jemy poszczegoacutelnymi pikselami do kontrolera wysy amy tylko kod znaku ktoacutery mazosta wy wietlony na danej pozycji Kontroler na podstawie kodu znaku generujeadres do specjalnego obszaru pami ci tzw tablicy znakoacutew w ktoacuterej znajduje si bajtowareprezentacja poszczegoacutelnych pikseli tworz cych znak Dla matrycy 5times8 ma ona 40bitoacutew Tablica ta jest umieszczona w pami ci ROM kontrolera LCD nie mo emy jejwi c zmienia Zwykle jednak kontrolery udost pniaj mo liwo definicji kilku w a-snych znakoacutew dzi ki czemu mo emy zdefiniowa np znaki charakterystyczne dla j -zyka polskiego Takie podej cie do generowania obrazu ma podstawow zalet jakjest prostota i zwi zane z tym niewielkie zapotrzebowanie na pami RAM Do prze-chowania np zawarto ci 8-znakowego wy wietlacza LCD wystarczy zaledwie 8 bajtoacutewpami ci Ma to szczegoacutelne znaczenie w prostych mikrokontrolerach z niewielk ilo-ci pami ci RAM Najpopularniejszym kontrolerem stosowanym w wy wietlaczach

alfanumerycznych jest HD44780 nawet je li w posiadanym wy wietlaczu jest innykontroler to mamy du szans e jest on z nim kompatybilny Typowy rozk ad sy-gna oacutew modu oacutew opartych na tym kontrolerze pokazano w tabeli 221

Tabela 221 Typowy uk ad wyprowadze modu oacutew alfanumerycznych LCD opartych na kontrolerzeHD44780

Pin Nazwa Funkcja

1 GND Masa 2 Vcc Zasilanie (typowo 5 V) 3 Vee Regulacja kontrastu 4 RS Zapis polecenia 5 RW Strob odczytzapis 6 E Wyboacuter uk adu 7 D0 Bit danych 0 8 D1 Bit danych 1 9 D2 Bit danych 210 D3 Bit danych 311 D4 Bit danych 412 D5 Bit danych 513 D6 Bit danych 614 D7 Bit danych 715 A Pod wietlenie mdash anoda16 K Pod wietlenie mdash katoda

Kup książkę Poleć książkę

46 AVR Uk ady peryferyjne

Przed pod czeniem modu u zawsze upewnij si czy podany rozk ad odpowiadau ytemu modu owi W szczegoacutelno ci sprawd rozmieszczenie linii zasilaj cych Ichniew a ciwe pod czenie grozi uszkodzeniem modu u

Zwykle piny 15 i 16 steruj ce pod wietleniem s umieszczone osobno lub te przedpinem 1 St d te zawsze nale y je dok adnie zidentyfikowa przed pod czeniem mo-du u Do pinoacutew tych nale y pod czy napi cie wykorzystane do pod wietlenia modu uPrzy czone napi cie zale y od typu zastosowanego pod wietlenia mdash CCFL foliielektroluminescencyjnej lub diod LED W dalszej cz ci b dziemy zajmowa si modu-em z pod wietleniem LED W nocie katalogowej ka dego modu u znajduj si szcze-

goacute owe informacje dotycz ce zasilania pod wietlenia Zwykle w tym celu wymaganejest napi cie 5 V a nat enie pr du pod wietlenia wynosi 20 ndash 50 mA

Wy wietlacze LCD alfanumeryczne s dost pne w handlu w wersjach dostosowanychdo roacute nych napi zasilaj cych Typowo jest to napi cie 5 V co stwarza pewne pro-blemy przy pod czeniu takiego LCD do procesoroacutew rodziny XMEGA S one zasi-lane maksymalnym napi ciem 36 V nie ma wi c mo liwo ci aby LCD i procesordzia a y w tych samych domenach napi ciowych W efekcie przy po czeniu obu uk a-doacutew musimy zastosowa konwersj napi Poniewa LCD alfanumeryczny z perspek-tywy procesora jest urz dzeniem bardzo wolnym ca kowicie wystarczaj cym rozwi za-niem jest zastosowanie szeregowych rezystoroacutew ktoacutere wraz z wbudowanymi w procesordiodami zabezpieczaj cymi b d stanowi y uk ad obni aj cy napi cie na magistralikomunikacyjnej z 5 V do bezpiecznego dla wej cia XMEGA napi cia Z drugiej stronyjedynka logiczna generowana przez procesor zasilany napi ciem 33 V jest poprawnierozpoznawana przez LCD pracuj cy z napi ciem 5 V Je li procesor by by zasilanybardzo niskim napi ciem (rz du 18 ndash 28 V) wymagany by by bardziej skompliko-wany konwerter co zosta o szerzej omoacutewione w rozdziale 7 ksi ki AVR Praktyczneprojekty

Wy wietlacze LCD wymagaj pod wietlenia bez tego wy wietlana zawarto jestpraktycznie nieczytelna W starszych konstrukcjach wykorzystywano pod wietleniew oparciu o lampy fluorescencyjne lub folie elektroluminescencyjne jednak obecniedominuj cym typem jest pod wietlenie za pomoc diod LED

Poniewa zasilamy diod LED wymagane jest do czenie szeregowego rezystoraCzasami taki rezystor jest wbudowany w modu LCD

Pod wietlenie tego typu zu ywa spor ilo energii Innym rozwi zaniem jest kupnowy wietlacza wykonanego w technologii OLED (ang Organic Light-Emitting Diode)Wy wietlacze tego typu cechuj si zdecydowanie lepszym kontrastem ale tak e wi k-sz szybko ci prze czania w zwi zku z czym mo na za ich pomoc uzyska o wielelepsze efekty animacji ktoacutere s praktycznie nieosi galne dla klasycznych wy wietlaczyLCD Nie maj one tak e innej wady LCD mdash zale no ci szybko ci prze czania seg-mentoacutew od temperatury

Wy wietlacze OLED nie maj wyprowadzonych pinoacutew odpowiedzialnych za pod-wietlenie mdash po prostu go nie wymagaj

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 47

Kolejn istotn kwesti jest pod czenie w a ciwego napi cia reguluj cego kontrastwy wietlacza Dla wi kszo ci modu oacutew LCD mie ci si ono w przedziale GND ndash Vcca dla modu oacutew o rozszerzonym zakresie temperatury w przedziale od ndash7 do 0 V mdashrysunek 221

Rysunek 221Pod czenie napi ciareguluj cego kontrasta) modu y klasyczneb) modu y o rozszerzonymzakresie temperatur

Napi cie ujemne mo na uzyska z prostej pompy adunkowej sterowanej przebiegiemPWM z procesora Poboacuter pr du z tego wej cia jest znikomo ma y Alternatywniemo na u y uk adu ICL7660 ktoacutery mo e generowa napi cia ujemne

Kolejn decyzj jak musimy podj jest sposoacuteb pod czenia modu u LCD z mikro-kontrolerem Mamy do wyboru dwie opcje mdash albo pod czamy wszystkie 8 linii da-nych (D0 ndash D7) albo tylko 4 najstarsze (D4 ndash D7) Pod czaj c tylko 4 linie danychzmniejszamy liczb niezb dnych po cze modu u z mikrokontrolerem oraz liczbwykorzystanych linii IO Ze wzgl du na znikom ilo danych przesy anych zdo mo-du u wynikaj ce z pod czenia tylko 4 linii danych spowolnienie transmisji jest bezznaczenia W trybie 4-bitowym najpierw transferowana jest starsza a potem m od-sza tetrada Niewykorzystane linie D0 ndash D3 mo na pozostawi niepod czone wi k-szo modu oacutew wewn trznie podci ga niepod czone linie poprzez rezystor do Vcc

Poniewa linie D0 ndash D7 s dwukierunkowe musimy pami ta aby podczas operacjiodczytu z LCD odpowiednie piny mikrokontrolera by y ustawione jako wej cia W prze-ciwnym przypadku dojdzie do konfliktu

Kolejnym sygna em co do ktoacuterego musimy podj decyzj jest sygna RW okre laj cytyp operacji (odczytzapis) Poniewa zwykle zapisujemy dane do LCD w a ciwie niezachodzi konieczno ich odczytywania mo emy ten sygna na sta e po czy z mas oszcz dzaj c w ten sposoacuteb jedn lini IO procesora Takie rozwi zanie ma jednak po-wa n wad mdash po jego zastosowaniu nie jest mo liwe odczytywanie sygna u zaj to cimodu u (ang busy flag) Powoduje to e pomi dzy kolejnymi zapisami do modu u mu-simy stosowa opoacute nienia dobrane na najwolniejsz mo liw okoliczno W efekcieca a transmisja jest wolniejsza ni mog aby by

Je li korzystamy z tych modu oacutew nie musimy pisa w asnych procedur ich obs ugiInstaluj c rodowisko WinAVR (lub nowy toolchain firmy Atmel) w katalogu docavr-libcexamplessdtiodemo znajdziemy gotowe funkcje obs ugi HD44780 Funkcjete nie dzia aj z mikrokontrolerami XMEGA st d te w za czonych przyk adach zosta-y one zmodyfikowane tak aby poprawnie wspoacute pracowa roacutewnie z tymi mikro-kontrolerami

Kup książkę Poleć książkę

48 AVR Uk ady peryferyjne

Mo emy te skorzysta z licznych przyk adoacutew dost pnych w internecie W dalszejcz ci rozdzia u zostan wykorzystane funkcje z pakietu WinAVR napisane przezJoerga Wunscha Pokazane przyk ady zak adaj e wy wietlacz jest po czonyz mikrokontrolerem tak jak na rysunku 222

Rysunek 222 Po czenie LCD z mikrokontrolerem Na goacuterze pod czenie do mikrokontroleraXMEGA na dole pod czenie do modu u Xplained Na schematach pokazano tak e opcjonalne sposobypod czenia pinu Vee odpowiedzialnego za regulacj kontrastu LCD

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 49

Zanim co wy wietlimy na LCD musimy pozna w jaki sposoacuteb s generowane znakiSterownik LCD zawiera w sobie niezale nie od typu u ytej matrycy 80 bajtoacutew pami ciDDRAM (ang Display Data RAM) Je li zastosowana matryca wy wietla mniejszliczb znakoacutew to cz komoacuterek pami ci jest nieu ywana Mo emy je wykorzystado innych celoacutew mdash np jako zwyk pami RAM Mo emy te u y jej do przesu-wania napisoacutew ktoacutere nie mieszcz si na wy wietlaczu Aby mo na by o umie ciznak na w a ciwej pozycji niezb dne jest poznanie organizacji pami ci kontrolera W za-le no ci od u ytej matrycy pami ta jest zorganizowana nast puj co

Dla matryc 16times1 mdash pami jest podzielona na dwa obszary ka dy zawieraj cypo 8 znakoacutew Obszar pierwszy (od lewej) ma adresy 0x00 do 0x07 a obszar drugi(prawy) adresy 0x40 do 0x47 St d te gdy wy wietla si tekst przekraczaj cygranic obszaroacutew nale y zadba aby poszczegoacutelne litery trafi y pod w a ciweadresy

Dla matryc 20times1 mdash adresy 0x00 do 0x13

Dla matryc 16times2 mdash adres pierwszej linii zaczyna si od 0x00 do 0x0f adresdrugiej linii od 0x40 do 0x4f

Dla matryc 20times2 mdash adresy pierwszej linii to 0x00 do 0x13 a drugiej 0x40 do 0x53

Dla matryc 40times2 mdash adresy pierwszej linii to 0x00 do 0x27 drugiej linii 0x40do 0x67

Dla matryc 20times4 mdash adresy pierwszej linii to 0x00 do 0x13 drugiej 0x40 do 0x53trzeciej 0x14 do 0x27 a czwartej 0x54 do 0x67

Jak wida w niektoacuterych typach wy wietlaczy po ka dej linii zostaje od kilku do kil-kunastu bajtoacutew ktoacuterych zawarto nie jest wy wietlana Ma to pewn zalet mdash mo-emy do pami ci modu u wpisywa teksty d u sze ni s wy wietlane na ekranie co

u atwia przewijanie tekstu Niestety ma to te pewn wad mdash funkcje wy wietlaj ceco na ekranie musz bdquowiedzie rdquo jak organizacj ma matryca W przeciwnym przy-padku nie ma mo liwo ci prawid owego wyliczenia adresu komoacuterki do ktoacuterej ma od-by si zapis

W dalszej cz ci rozdzia u zostanie wykorzystany modu LCD o organizacji 16times2(ale mo na te bez problemu wykorzysta dowolny inny)

Zanim b dzie mo na co wy wietli na ekranie modu musi zosta zainicjalizowanyW trakcie inicjalizacji ustawiane s podstawowe parametry pracy sterownika LCD mdashorganizacja matrycy (liczba linii) wielko czcionki (5times8 lub 8times11 pikseli) Wielkoczcionki zale y od typu pod czonej matrycy LCD Dla konkretnego modu u LCDtylko jedna z tych warto ci b dzie poprawna Oproacutecz inicjalizacji modu u nale y tak-e poprawnie ustawi stan pinoacutew IO wykorzystywanych do pod czenia modu u LCD

Wi kszo pracy zwi zanej z inicjalizacj modu u LCD odbieraniem i wysy aniemdo niego danych wykonuje biblioteka Joerga Wunscha Dostarcza ona niskopozio-mowe funkcje umo liwiaj ce komunikacj ze sterownikiem hd44780 i innymi kom-patybilnymi z nim sterownikami Wystarczy e do aplikacji w ktoacuterej planujemy wy-korzysta taki modu do czymy plik hd44780c oraz plik nag oacutewkowy hd44780h

Kup książkę Poleć książkę

50 AVR Uk ady peryferyjne

Oba pliki bdquozak adaj rdquo e istnieje plik nag oacutewkowy definesh zawieraj cy podstawo-we definicje zwi zane ze sposobem pod czenia modu u LCD z mikrokontroleremNa pocz tku nale y okre li ktoacutere linie IO zosta y wykorzystane do pod czenia modu u

define HD44780_RS A 4define HD44780_RW A 5define HD44780_E A 6define HD44780_D4 A 0

W powy szym przyk adzie do kolejnych linii portu A (A4 ndash A6) zosta y pod czonesygna y RS RW i E modu u natomiast do linii A0 ndash A3 linie D4 ndash D7 modu u LCD Wa nejest aby linie danych czy z pinami IO w kolejno ci rosn cej Biblioteka wykorzy-stuje do transmisji danych pomi dzy modu em a mikrokontrolerem tylko 4 linie danychmdash dzi ki temu mo emy zmniejszy liczb po cze a zwolnione linie IO wykorzystado innych celoacutew W pliku wyst puje jeszcze jedna definicja

define USE_BUSY_BIT 1

Okre la ona e biblioteka b dzie u ywa flagi Busy modu u LCD mdash umo liwia touzyskanie optymalnej szybko ci wspoacute dzia ania z modu em Zako czenie realizacjibie cej operacji modu sygnalizuje zmian stanu tej flagi co umo liwia niezw ocznewys anie kolejnej komendy Je li nie u ywamy flagi Busy program musi generowamaksymalne zalecane w nocie katalogowej opoacute nienia w efekcie ca a transmisja zwal-nia Po zdefiniowaniu u ywanych pinoacutew w pliku definesh mo emy rozpocz korzy-stanie z biblioteki

W pliku hd44780h s udost pnione prototypy funkcji odpowiedzialnych za wspoacute -prac z modu em LCD

Funkcje bibliotecznePodstaw modu u stanowi dwie funkcje umo liwiaj ce odpowiednio wys anie da-nych do modu u oraz ich odczytanie

void hd44780_outbyte(uint8_t b uint8_t rs)uint8_t hd44780_inbyte(uint8_t rs)

Obie funkcje wysy aj odczytuj 8-bitow dan w przypadku wykorzystania tylko4-bitowej szyny danych wysy anie i odczytywanie danych odbywa si w dwoacutech etapachDodatkowo zmienna rs okre la tryb dost pu W przypadku wysy ania danych do modu urs = 0 powoduje e dane zostan wys ane do rejestru komend a je li rs = 1 dane trafido rejestru danych Przy odczycie jest podobnie z tym e dla rs = 0 jest odczytywanaflaga Busy i rejestr AC (ang Address Counter)

Kolejna funkcja odpowiada za oczekiwanie na gotowo modu uvoid hd44780_wait_ready(bool islong)

W przypadku gdy w pliku definesh symbol USE_BUSY_FLAG ma warto 1 parametrislong jest ignorowany a optymalizator kompilatora usuwa go gdy nie jest on wy-korzystywany przez funkcj Kiedy warto USE_BUSY_FLAG jest roacute na od 1 parametr

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 51

ten okre la d ugo opoacute nienia Je li jest roacute na od 0 opoacute nienie wynosi 152 ms a je-eli jest roacutewna 0 opoacute nienie wynosi 37 s Poniewa lepiej jest u ywa flagi Busy

mo emy ten parametr ignorowa

Powy sze trzy funkcje wystarcz do komunikacji z modu em dla wygody zdefiniowanojednak kolejne Funkcje hd44780_outcmd(n) i hd44780_incmd() umo liwiaj odpowiedniowys anie polecenia do rejestru komend kontrolera lub odczytanie bitu Busy i licznikaAC Dwie kolejne mdash hd44780_outdata(n) oraz hd44780_indata() mdash umo liwiaj zapisi odczytanie rejestru danych

Oproacutecz funkcji odpowiedzialnych za komunikacj z modu em LCD zdefiniowano tak efunkcj przeprowadzaj c podstawow inicjalizacj modu u hd44780_init(void) orazfunkcj hd44780_powerdown(void) ustawiaj c wszystkie linie u yte do komunikacjiw stan 0 co umo liwia bezpieczne od czenie zasilania od modu u LCD W przypadkupozostawienia ktoacuterej z wy ej wymienionych linii w stanie 1 przy od czonym za-silaniu modu u stanowi ona jego zasilanie W efekcie mimo wy czenia modu mo epobiera znaczny pr d

Szerszego omoacutewienia wymaga funkcja hd44780_outcmd(cmd) ktoacutera umo liwia wys a-nie polecenia do rejestru polece sterownika LCD Dla wygody zdefiniowane zosta yroacute ne komendy u atwiaj ce wspoacute prac z modu em LCD Komendy te s przekazy-wane jako argument wywo ania funkcji hd44780_outcmd np

hd44780_outcmd(HD44780_CLR)

powoduje wys anie do sterownika polecenia HD44780_CLR czyszcz cego zawartopami ci DDRAM kontrolera

KomendyFunkcja hd44780_outcmd przyjmuje jako argument predefiniowane makrodefinicjeznacznie u atwiaj ce wspoacute prac z kontrolerem modu u LCD Poni ej zostan onepokroacutetce omoacutewione

HD44780_SHIFT(shift right)Ta makrodefinicja powoduje przesuni cie pozycji wy wietlanego tekstu (shift = 1)o jedn pozycj w lewo (argument right = 0) lub w prawo (argument right = 1)W przypadku gdy shift = 0 przesuwany w lewo lub prawo jest tylko kursor Wysy-aj c wielokrotnie to polecenie uzyskujemy kolejne przesuni cia o jedn pozycj

w lewo lub prawo Polecenie to s u y g oacutewnie do przesuwania tekstu Jednak ze wzgl duna du bezw adno tekstowych modu oacutew LCD nie nale y przesuwa liter cz ciej niok raz na sekund mdash cz stsze przesuwanie daje bardzo nieprzyjemne efekty wizual-ne Ka dy bufor linii jest bdquozawijanyrdquo to znaczy e po ostatnim znaku z prawej jestwy wietlany pierwszy znak z lewej i odwrotnie Nale y pami ta e d ugo buforajest sta a dla danego modelu matrycy Np dla modu oacutew 16times2 bufor jednej linii wyno-si dok adnie 40 bajtoacutew z czego 16 jest jednorazowo wy wietlanych Poni szy kodcyklicznie przewija wy wietlany tekst w lewo

lcd_puttext_P(PSTR(Test bufora i przewijania tekstunTen tekst przewija sie w lewo))while(1)

Kup książkę Poleć książkę

52 AVR Uk ady peryferyjne

hd44780_outcmd(HD44780_SHIFT(10)) _delay_ms(700)

HD44780_FNSET(if8bit twoline font5x10)Polecenie to wybiera typ interfejsu mdash 8-bitowy je li warto parametru if8bit jestroacutewna 1 lub 4-bitowy je li jest roacutewna 0 Typ interfejsu musi odpowiada sposobowipo czenia modu u z mikrokontrolerem Parametr twoline okre la czy pod czonamatryca LCD ma jedn lini znakoacutew czy dwie Matryce ktoacutere maj 4 linie tekstu straktowane przez kontroler jako matryce dwuliniowe mdash parametr twoline powinienmie warto 1 Je li dla matrycy zawieraj cej dwie lub wi cej linii ustawimy go na 0to wy wietlana b dzie tylko jedna linia (w przypadku matryc dwuliniowych goacuterna)a w przypadku matryc 4-liniowych b d wy wietlane dwie linie rozdzielone lini pust

Ostatni parametr okre la typ u ywanego generatora znakoacutew Powinien on odpowiadau ytej w module matrycy zwykle wi c jego warto wynosi 0

HD44780_DISPCTL(disp cursor blink)Ustawia roacute ne parametry pracy matrycy Je li parametr disp ma warto 1 to matrycajest w czona (wy wietla zawarto DDRAM) a je li 0 to matryca jest wy czonalecz stan pami ci DDRAM nie ulega zmianie Np kod

while(1) hd44780_outcmd(HD44780_DISPCTL(011)) _delay_ms(700) hd44780_outcmd(HD44780_DISPCTL(111)) _delay_ms(700)

powoduje naprzemienne w czanie i wy czanie matrycy w efekcie wy wietlany tekstmruga

Parametr cursor okre la czy sprz towo wy wietlany kursor ma by widoczny (war-to parametru 1) czy niewidoczny (warto parametru 0) Je li kursor jest widocznyto dodatkowo mo emy okre li czy ma miga (warto parametru blink roacutewna 1)czy nie (blink = 0) Je li kursor jest widoczny i nie miga jest wy wietlany w postacipoziomej kreski Wy wietlanie kursora mo e by u yteczne w sytuacji kiedy u yt-kownik wprowadza jakie dane W pozosta ych sytuacjach kursor mo emy wy czy

HD44780_ENTMODE(inc shift)Okre la sposoacuteb wprowadzania danych do pami ci Je li parametr inc ma warto 1 topo ka dej operacji zapisuodczytu adres pami ci jest automatycznie zwi kszany o je-den co przy piesza operacj zapisuodczytu kolejnych znakoacutew Je li warto inc jestroacutewna 0 to adres jest automatycznie zmniejszany o 1 Dodatkowo parametr shiftokre la czy wy wietlany obraz ma by automatycznie przesuwany tak aby wy wie-tla ostatnio wprowadzony znak (shift = 1) lub go nie wy wietla (shift = 0)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 53

HD44780_CLRPowoduje wyczyszczenie (wype nienie znakami o kodzie 32) ca ej zawarto ci pami ciDDRAM Jednocze nie kursor wraca do pozycji pierwszej (pierwsza linia pierwszyznak)

Niewy wietlane bajty pami ci DDRAM tak e s kasowane Je li s one u ywanedo przechowywania zmiennych programu to przed operacj kasowania nale y jeskopiowa w bezpieczne miejsce W przeciwnym przypadku zostan utracone

Wska nik adresu do pami ci DDRAM jest ustawiany na 0 zerowane jest tak e prze-suni cie

HD44780_HOMEPowoduje powroacutet kursora do pozycji pocz tkowej mdash pierwsza linia pierwszy znakWska nik adresu do pami ci DDRAM w efekcie zawiera 0 zerowane jest roacutewnieprzesuni cie wy wietlania znakoacutew w efekcie s one wy wietlane od pozycji 0

HD44780_DDADDR(addr)Ustawia nast pny adres zapisuodczytu w pami ci DDRAM na addr Tylko 7 bitoacutewargumentu addr jest branych pod uwag w zwi zku z czym mo na zaadresowa mak-symalnie 128 bajtoacutew pami ci (z czego sterownik ma tylko 80 pozosta e lokacje snieu ywane)

HD44780_CGADDR(addr)Ustawia nast pn operacj odczytuzapisu w pami ci CGRAM na addr Pod uwagbranych jest tylko 6 bitoacutew zmiennej addr w efekcie mo na zaadresowa maksymalnie64 bajty pami ci CGRAM

Przedstawione powy ej funkcje zapewniaj jedynie podstawow komunikacj z mo-du em LCD Potrzebujemy jednak ci gle funkcji odpowiedzialnej za jego inicjalizacjmdash funkcja biblioteczna przeprowadza ten proces tylko w podstawowym zakresie musi-my jeszcze zadba o w a ciwe ustawienie parametroacutew zwi zane z posiadan matryc Napiszmy wi c w asne rozwini cie funkcji inicjalizacyjnej

void lcd_init() hd44780_init() Podstawowa inicjalizacja modu u hd44780_outcmd(HD44780_CLR) Wyczy pami DDRAM hd44780_wait_ready(1000) hd44780_outcmd(HD44780_ENTMODE(1 0)) Tryb autoinkrementacji AC hd44780_wait_ready(1000) hd44780_outcmd(HD44780_DISPCTL(1 0 0)) W cz wy wietlacz wy cz kursor hd44780_wait_ready(1000)

Zauwa e po wys aniu ka dego polecenia do modu u jest wywo ywana funkcjahd44780_wait_ready(1000) odpowiedzialna za oczekiwanie a realizacja wys anego po-lecenia dobiegnie ko ca Jest to niezb dne gdy do czasu uko czenia bie cej

Kup książkę Poleć książkę

54 AVR Uk ady peryferyjne

operacji dalsze polecenia s ignorowane Jako argument podany jest parametr 1000mdash jest on bez znaczenia nasza biblioteka korzysta z flagi Busy i po prostu go ignorujePo wykonaniu powy szej funkcji modu LCD jest poprawnie zainicjalizowany a jegopami jest wyczyszczona (zawiera bajty 0x20) i w efekcie modu nic nie wy wietlaOd tej chwili mo emy wysy a znaki do wy wietlenia

Po wykonaniu inicjalizacji ekran mo e pozosta czysty lub wy wietla ca kowiciewype nione kwadraty (wszystkie piksele w czone) Je li po inicjalizacji wszystkiepiksele s w czone nale y nieco zmniejszy kontrast

Aby sobie u atwi to zadanie zdefiniujmy funkcj wysy aj c do modu u jeden znakvoid lcd_putchar(char c) static bool second_nl_seen static uint8_t line=0

if ((second_nl_seen) ampamp (c = n)ampamp(line==0)) Odebrano pierwszy znak hd44780_wait_ready(40) hd44780_outcmd(HD44780_CLR) hd44780_wait_ready(1600) second_nl_seen=false if (c == n) if (line==0) line++ hd44780_outcmd(HD44780_DDADDR(64)) Adres pierwszego znaku drugiej linii hd44780_wait_ready(1000) else second_nl_seen=true line=0 else hd44780_outdata(c) hd44780_wait_ready(40)

Funkcja ta ze wzgl du na skomplikowane adresowanie pami ci DDRAM jest zale naod konkretnego modelu modu u LCD B dzie prawid owo wspoacute pracowa z modu a-mi 2times16 2times20 i 2times40 znakoacutew W przypadku innych modu oacutew pozycje niektoacuterychznakoacutew mog by nieprawid owe

Mo emy ju wy wietla na LCD pojedyncze znaki czas na wy wietlanie tekstu Po-niewa teksty jako sta e dla zaoszcz dzenia cennej pami ci RAM przechowuje si za-zwyczaj w pami ci FLASH zdefiniujmy funkcj odczytuj c podany a cuch zna-kowy z pami ci FLASH a nast pnie umieszczaj c go na LCD

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 55

void lcd_puttext_P(prog_char txt) char ch while((ch=pgm_read_byte(txt))) lcd_putchar(ch) txt++

Powy sza funkcja wysy a kolejne znaki odczytane z pami ci FLASH na LCD za po-moc funkcji LCD_putchar Po napotkaniu znaku ko ca a cucha (0 nul) przerywa swojedzia anie

Pozostaje nam przetestowa dzia anie przedstawionych funkcjiint main() lcd_init() lcd_puttext_P(PSTR(Test LCDnDruga linia)) while(1)

Na ekranie modu u LCD powinien wy wietli si napisTest LCDDruga linia

Je li na LCD nic nie widzimy to w pierwszej kolejno ci powinni my sprawdzi kon-trast zmieniaj c napi cie na pinie Vee modu u LCD

Warto zdefiniowa jeszcze funkcj ustawiaj c pozycj od ktoacuterej b dzie wy wietlanynast pny znak

void lcd_goto(uint8_t x uint8_t y) hd44780_outcmd(HD44780_DDADDR(0x40y+x)) hd44780_wait_ready(1000)

Funkcja ta przyjmuje dwa parametry x i y okre laj ce pozycj na ktoacuterej zostaniewy wietlony nast pny znak wys any z mikrokontrolera do modu u LCD Dzi ki temuz atwo ci mo emy uaktualnia zawarto LCD bez konieczno ci ponownego prze-sy ania wszystkich danych Funkcja ta jest zale na od typu zastosowanego modu u

Ostatni funkcj jest funkcja umo liwiaj ca czyszczenie zawarto ci pami ci modu uOdpowiedzialne za to jest proste polecenie wysy ane do sterownika

void lcd_cls() hd44780_outcmd(HD44780_CLR) hd44780_wait_ready(false)

Oproacutecz czyszczenia zawarto ci pami ci modu u powoduje ono ustawienie kursoraw punkcie (00)

Kup książkę Poleć książkę

56 AVR Uk ady peryferyjne

Definiowanie w asnych znakoacutewUk ad HD44780 jest wyposa ony w 64 bajty pami ci CGRAM (ang Character Ge-nerator RAM) ktoacutera mo e przechowywa mapy bitowe 8 znakoacutew o matrycy 5times8 pikselilub 4 znakoacutew o matrycy 5times10 pikseli Przyk ad definicji znaku na matrycy 5times8 poka-zano na rysunku 223

Rysunek 223Przyk ad definicji w asnego znakuw pami ci CGRAM Znak rysujemyna matrycy 5times8 bitoacutew polazaciemnione odpowiadaj warto ci 1pola bia e warto ci 0 Wartowyliczon dla ka dej linii pikseliwpisujemy do pami ci CGRAMsterownika Najstarsze 3 bity ka degobajta (pola szare) s bez znaczeniamdash wy wietlacz pomija jeprzy wy wietlaniu obrazu

1

2

3

4

5

6

7

0 00100 = 4

01110 = 14

11111 = 31

00100 = 4

00100 = 4

00100 = 4

11111 = 31

01110 = 14

Adres Warto

Dost p do tej pami ci jest mo liwy dzi ki wys aniu polecenia ustawiaj cego adreszapisuodczytu pami ci CGRAM Po jego wys aniu wszystkie operacje zapisu i od-czytu dotycz tej pami ci a nie pami ci DDRAM Aby wroacuteci do adresowania pa-mi ci DDRAM nale y wybra jej adres lub dokona operacji wymagaj cej przesu-ni cia kursora

Pami CGRAM jest pami ci ulotn po ponownym w czeniu zasilania definicjeznakoacutew musz by ponownie przes ane przez procesor

Bity o warto ci 1 w definicji znaku odpowiadaj w czonym pikselom bity o warto-ci 0 pikselom wy czonym Najstarsze 3 bity ka dego bajta w pami ci CGRAM s

bez znaczenia mdash te pozycje nie s wy wietlane przez matryc Definiuj c znak nale-y tak e pami ta e ostatnia linia wy wietlana przez matryc (w zale no ci od wiel-

ko ci matrycy znaku linia 8 lub 10) powinna zawiera same zera mdash w tej linii b dziewy wietlany kursor

Najcz ciej matryce LCD pod czone do sterownika HD44780 maj organizacj 5times8czyli jeden znak jest definiowany przez 8 kolejnych bajtoacutew okre laj cych stan po-szczegoacutelnych linii tworz cych znak Stwoacuterzmy funkcj ktoacuterej zadaniem b dzie za a-dowanie definicji znakoacutew z pami ci FLASH mikrokontrolera do pami ci CGRAM

void lcd_defchar_P(uint8_t charno prog_uint8_t chardef) hd44780_outcmd(HD44780_CGADDR(charno8)) hd44780_wait_ready(40) for(uint8_t c=0clt8c++) hd44780_outdata(pgm_read_byte(chardef))

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 57

hd44780_wait_ready(40) chardef++

Funkcja LCD_defchar_P jako argumenty przyjmuje numer definiowanego znaku (0 ndash 7)oraz wska nik do obszaru pami ci FLASH zawieraj cego definicj znaku (obszarten zajmuje 8 nast puj cych po sobie bajtoacutew) Jak widzimy funkcja najpierw ustawiaw a ciwy adres pod ktoacuterym znajdzie si pocz tek definicji znaku w pami ci CGRAMmdash poniewa jeden znak jest opisywany za pomoc 8 bajtoacutew kolejne adresy znakoacutewto kod_znakutimes8 Nast pnie dane opisuj ce znak s adowane z pami ci mikrokontrolerai zapisywane w pami ci CGRAM sterownika Poni szy program ilustruje wykorzy-stanie funkcji LCD_defchar_P

prog_uint8_t char1[8][8]=0000000255 00000025525500000255255255 0000255255255255 00025525525525525500255255255255255255 0255255255255255255255255255255255255255255255

int main() for(uint8_t x=0xlt8x++) lcd_defchar_P(xampchar1[x][0]) Za aduj wzorce znakoacutew lcd_init() for(uint8_t x=0xlt8x++) lcd_putchar(x) Wy wietl znaki o kodach 0 ndash 7 while(1)

W pierwszej linii funkcji main nast puje za adowanie nowych definicji znakoacutew dopami ci CGRAM nast pnie inicjalizowany jest wy wietlacz po czym w pierwszejlinii s wy wietlane znaki o kodach 0 ndash 7 a wi c znaki ktoacuterych definicja zosta aprzes ana z mikrokontrolera

Zauwa e pami CGRAM podobnie jak DDRAM mo emy zapisywa i odczytywaprzed inicjalizacj modu u LCD Proces inicjalizacji jest potrzebny tylko do prawi-d owego wy wietlania na ekranie LCD

Poniewa dane potrzebne do wy wietlenia znaku s na bie co pobierane z pami cipodczas od wie ania matrycy LCD jakiekolwiek zmiany w definicji znaku kiedy jest onwidoczny na LCD poci gaj za sob natychmiastowe zmiany w wy wietlanym obrazieMo na t w a ciwo sterownika wykorzysta do stworzenia prostych animacji

void lcd_box(uint8_t y) hd44780_outcmd(HD44780_CGADDR(0)) Zaczynamy od znaku o kodzie 0 hd44780_wait_ready(40) for(uint8_t c=0cltyc++) Stwoacuterz linie z w czonymi pikselami hd44780_outdata(0xFF) hd44780_wait_ready(40) for(uint8_t c=yclt8c++) Stwoacuterz linie z wy czonymi pikselami hd44780_outdata(0x00) hd44780_wait_ready(40)

Kup książkę Poleć książkę

58 AVR Uk ady peryferyjne

int main() lcd_init() lcd_putchar(0) while(1) for(uint8_t x=0xlt8x++) lcd_box(x) _delay_ms(100) for(int8_t x=7xgt=0x--) lcd_box(x) _delay_ms(100)

Funkcja main wy wietla na LCD tylko jeden znak o kodzie 0 a nast pnie cykliczniezmienia jego definicj w pami ci CGRAM W efekcie posta znaku wy wietlana naekranie ci gle si zmienia

Transakcyjna obs uga LCDPokazana do tej pory obs uga LCD alfanumerycznego mia a pewne wady Jak wiemyoperacje odwo uj ce si do kontrolera LCD s niezwykle wolne cykl odczytuzapisudowolnego rejestru kontrolera trwa co najmniej 1600 ns co dla MCU taktowanegozegarem 32 MHz przek ada si na czas wykonania oko o 52 instrukcji asemblera Cogorsza wi kszo komend realizowanych przez kontroler jest wykonywana w czasieoko o 37 s co przek ada si na tysi ce zmarnowanych taktoacutew MCU St d te jaki-kolwiek zapisodczyt LCD to z perspektywy programu straszne marnotrawstwo czasu

Problem ten dotyczy ka dego urz dzenia IO ktoacutere dzia a wolniej ni procesor W takiejsytuacji warto napisa pewn warstw po redni mdash sterownik mdash ktoacuterego zada-niem b dzie buforowanie da dost pu do urz dzenia i rozstrzyganie konfliktoacutewdzi ki czemu roacute ne cz ci programu b d bdquomia y wra enierdquo e maj wy czny do-st p do urz dzenia

Pokazane wcze niej funkcje obs ugi LCD maj jeszcze jedn wad mdash nie s wspoacute bie -ne czyli nie mo na ich wykonywa jednocze nie w kilku miejscach programu w tymw szczegoacutelno ci w programie g oacutewnym i w funkcjach obs ugi przerwa W wielu przy-padkach ta wada jest bez znaczenia jednak czasami jest uci liwa mdash dla przyk adugdy na wy wietlany tekst chcieliby my na o y inne informacje np o dacie lub godzi-nie Oczywi cie wy wietlanie mo na zorganizowa tak aby nie by o potrzeby pisaniawspoacute bie nego kodu np poprzez zastosowanie bufora pami ci VRAM kontrolera LCDRodzi to jednak kolejne problemy i jest ma o eleganckie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 59

Zastanoacutewmy si w jaki sposoacuteb najlepiej jednocze nie rozwi za problem wolnegodost pu do urz dzenia i wspoacute bie no ci kodu Rozwi zaniem mo e by wprowadze-nie tzw transakcji Transakcj nazywamy zbioacuter operacji tworz cych pewn ca-o To co wyroacute nia tak wykonywany zestaw operacji to atomowo spoacutejno

izolacja i trwa o Pod tymi terminami kryje si istota wykonywanej operacji Ato-mowo transakcji zapewnia e jest ona wykonywana w sposoacuteb niepodzielny co gwa-rantuje nam prawid ow wspoacute prac z danym urz dzeniem IO w tym przypadku kon-trolerem LCD Wa na dla nas jest tak e izolacja mdash dzi ki temu inne operacje na LCD(inne transakcje) nie b d mia y wp ywu na wynik aktualnie wykonywanej transakcjimdash nie b d zak oacuteca y jej wykonania z drugiej strony nasza transakcja nie zak oacuteciwykonania innych Trwa o z kolei zagwarantuje nam e je li sterownik potwierdziwykonanie transakcji to znaczy e efekt jej dzia ania jest wy wietlony na LCD Tacecha nie jest nam a tak potrzebna mdash jest ona wydawa oby si oczywista Niemniej jestto pewna gwarancja e ca a operacja przebieg a poprawnie i w efekcie LCD znajdujesi w okre lonym przez nas stanie Tyle teorii przejd my do praktyki

Kody poni szego przyk adu znajduj si w katalogu PrzykladyLCD-alfaLCD-transact

Aby zapewni transakcyjny dost p do LCD musimy stworzy pewne struktury danychktoacuterych zadaniem b dzie przechowywanie informacji o operacjach sk adaj cych sina transakcje i stanie ich wykonania W tym celu pos u ymy si wiadomo ciami z roz-dzia u 5 bdquoJak uporz dkowa chaos czyli z o one typy danych i listyrdquo Do przecho-wywania oczekuj cych transakcji pos u ymy si buforem pier cieniowym zanimjednak go zaimplementujemy zastanoacutewmy si jak powinna wygl da struktura prze-chowuj ca informacje o transakcji Struktura ta powinna zawiera co najmniej

pole danych (data) z informacjami ktoacutere maj by przes ane do kontrolera LCD

pole okre laj ce liczb danych do wys ania (len)

pole okre laj ce realizowane polecenie dla LCD (cmd) mdash pole to pos u yprogramowi sterownika do w a ciwej interpretacji danych znajduj cych siw polu data

kilka poacutel kontrolnych przechowuj cych informacje potrzebne do realizacjisamej transakcji Jedno z nich mdash Ready mdash b dzie przyjmowa warto trueje li dana transakcja zosta a zrealizowana lub false w przeciwnym przypadkuZnaczenie drugiego pola mdash SelfDel mdash mo e wydawa si nieco enigmatycznepole to okre la czy pami przydzielona dla transakcji ma by zwolnionaw sterowniku LCD (warto true) czy te zostanie zwolniona w programie(warto false)

Oto jak mo e wygl da struktura definiuj ca transakcj typedef struct volatile bool Ready 1 true je li transakcja zosta a zrealizowana bool SelfDel 1 true je li pami przydzielona transakcji ma zosta zwolniona LCD_Cmd cmd 2 Polecenie do zrealizowania uint8_t len 6 D ugo polecenia

Kup książkę Poleć książkę

60 AVR Uk ady peryferyjne

unsigned 0 Wyroacutewnanie do granicy bajta uint8_t data[] Dane transakcji LCD_trans

Nale y zwroacuteci uwag na poleunsigned 0

Nie definiuje ono adnego pola struktury ale jedynie informuje kompilator e kolejnepole (w naszym przyk adzie o nazwie data) ma by wyroacutewnane do granicy bajta mdashdzi ki temu dost p do kolejnego pola b dzie odbywa si szybciej Z kolei samo poledata jest zadeklarowane jako tzw typ niekompletny

Typ niekompletny (ang incomplete type) to typ ktoacuterego rozmiaru nie da si okre li

W pokazanym przyk adzie rozmiaru pola data nie da si okre li gdy zosta on za-deklarowany jako typ tablicowy z tym e nie podano wielko ci tablicy Wielko ci niepodano gdy na etapie deklaracji struktury nie wiemy jakiej wielko ci dane b d w niejprzechowywane Tego typu deklaracja ma bardzo powa ne konsekwencje mdash skorowielko ci pola data nie da si okre li to jaki b dzie wynik dzia ania operatora sizeof(LCD_trans) Kompilator stara si jako wybrn z tej sytuacji w zwi zku z czym

zwroacuteci wielko struktury ale tak jakby pole data w ogoacutele nie istnia o mdash jego roz-miar b dzie wynosi 0 W ramach wiczenia zastanoacutew si ile bajtoacutew pami ci b dziezajmowa a struktura LCD_trans

Skoro dysponujemy ju struktur przechowuj c poszczegoacutelne transakcje pora nastworzenie obiektu przechowuj cego kolekcj transakcji Dodanie kolejnej strukturyb dzie polega o na dodaniu jej do takiego obiektu z drugiej strony program sterownikaLCD b dzie moacuteg z tej kolekcji pobiera kolejne transakcje do realizacji Opis ten przy-pomina opis dzia ania bufora pier cieniowego mdash z jednym wyj tkiem mdash po zape nie-niu ca ego bufora nie b dziemy usuwa niezrealizowanych transakcji lecz zabloku-jemy dodawanie kolejnych W tym celu pos u ymy si definicj nast pnej struktury

typedef struct LCD_trans elements[LCD_MAXTRANS] Wska niki do transakcji uint8_t Beg Pierwszy element bufora uint8_t Count Liczba elementoacutew w buforze CircBuffer

Struktura ta zawiera deklaracj tablicy wska nikoacutew na transakcje (pole elements)Poniewa jest to tablica musimy zna liczb jej elementoacutew mdash jest ona zadeklarowanaw sta ej LCD_MAXTRANS

define LCD_MAXTRANS 10 Maksymalna liczba pami tanych transakcji

Do realizacji bufora s potrzebne jeszcze dwa pola Beg wskazuj ce na pierwsztransakcj w buforze oraz pole Count okre laj ce liczb transakcji znajduj cych siw buforze Je li Count == 0 to znaczy e w buforze nie ma adnych oczekuj cychtransakcji a je li Count == LCD_MAXTRANS to znaczy e bufor jest pe ny i nie mo na

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 61

dodawa do niego kolejnych transakcji W a ciwo t wykorzystuj dwie zdefiniowanew pliku LCD_transc funkcje

static inline bool cbIsFull(CircBuffer cb) return cb-gtCount == LCD_MAXTRANS

static inline bool cbIsEmpty(CircBuffer cb) return cb-gtCount == 0

Jak pami tamy w przypadku funkcji modyfikatory static inline powoduj e danafunkcja nie b dzie istnie jako samodzielna lecz w ka dym miejscu w ktoacuterym jestwywo ywana jest wstawiany raczej jej kod a nie wywo anie Ma to znaczenie dlakroacutetkich funkcji (a wi c takich jak pokazane powy ej) dla ktoacuterych koszty wywo anias zazwyczaj wi ksze ni koszty umieszczenia cia a funkcji w miejscu jej wywo aniaTego typu funkcje zachowuj si w sposoacuteb zbli ony do makrodefinicji (z tym e re-spektuj wszystkie regu y j zyka C w szczegoacutelno ci kolejno operatoroacutew czy kon-trol typoacutew)

Takie funkcje jako argument pobieraj adres bufora na ktoacuterym maj operowa W na-szym przypadku bufor jest zdefiniowany nast puj co

static CircBuffer LCD_TransBuffer Bufor na transakcje

Nale y zauwa y e jest on zdefiniowany jako struktura globalna z modyfikatoremstatic Modyfikator ten ogranicza zasi g widoczno ci zmiennej LCD_TransBuffer dopliku w ktoacuterym zmienna ta zosta a zdefiniowana (w tym przypadku modyfikator staticjest niejako przeciwie stwem modyfikatora extern) Dzia anie to ma jedynie znaczeniekosmetyczne mdash uniemo liwia odwo anie si do bufora za pomoc funkcji ktoacutere niezosta y zdefiniowane w miejscu jego definicji Oproacutecz funkcji umo liwiaj cych okre-lenie stanu bufora potrzebne s jeszcze funkcje umo liwiaj ce dodanie i pobranie trans-

akcji Pierwsz funkcj b dzie funkcja dodaj ca transakcj do buforabool cbAdd(CircBuffer cb LCD_trans elem) ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsFull(cb)) return false Czy jest miejsce w kolejce uint8_t end = (cb-gtBeg + cb-gtCount) LCD_MAXTRANS cb-gtelements[end] = elem Dodaj transakcj ++cb-gtCount Liczba elementoacutew w buforze return true Wszystko OK

Funkcja ta dodaje transakcj (zmienna elem) do bufora ko owego Zanim transakcjazostanie dodana sprawdzane jest czy w buforze jest miejsce mdash je li nie funkcjazwroacuteci false Je li dodanie jest mo liwe warto licznika okre laj cego liczb trans-akcji przechowywana w buforze (Count) zwi ksza si o jeden Warto zastanowi si te dlaczego praktycznie ca e cia o tej funkcji jest zamkni te w sekcji atomowej (ATOMIC_BLOCK) Jedn z cech naszego sterownika ma by mo liwo wspoacute bie nego dost pu

Kup książkę Poleć książkę

62 AVR Uk ady peryferyjne

do LCD mdash to znaczy e danie np zapisu do LCD mo e wyst pi zaroacutewno w g oacutewnejp tli programu jak i asynchronicznie w przerwaniu St d te wynika e funkcja do-daj ca transakcj musi by napisana w sposoacuteb zapewniaj cy jej poprawn prac w sytu-acji gdy zostanie ona przerwana i ponownie wywo ana przed zako czeniem dzia aniajej poprzedniej instancji Umieszczenie cia a tej funkcji w sekcji atomowej nam to za-pewnia mdash dzi ki temu bufor transakcji zawsze b dzie spoacutejny Dla zaspokojenia cie-kawo ci warto usun sekcj atomow i sprawdzi jak wtedy b dzie zachowywa si tafunkcja i jak wp ynie to na spoacutejno przechowywanych danych

Drug niezb dn funkcj jest funkcja odczytuj ca bufor transakcji i zwracaj ca trans-akcj do zrealizowania (lub NULL je li adnej transakcji nie ma w buforze)

LCD_trans cbRead(CircBuffer cb) LCD_trans elem ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsEmpty(cb)) return NULL Bufor pusty nie mo na zwroacuteci elementu elem = cb-gtelements[cb-gtBeg] cb-gtBeg = (cb-gtBeg + 1) LCD_MAXTRANS -- cb-gtCount Zmniejszamy liczb elementoacutew pozosta ych w buforze return elem

Funkcja ta jest bardzo podobna do poprzedniej mdash najpierw sprawdza czy bufor za-wiera jak oczekuj c transakcj (cbIsEmpty(cb)) je li tak to zwraca adres opisuj -cej j struktury i zmniejsza liczb transakcji oczekuj cych (pole Count) W ten sposoacutebmamy zrealizowan ca funkcjonalno zwi zan z obs ug bufora pier cieniowegoPokazane funkcje s uniwersalne i z bardzo podobnych (lub wr cz tych samych) b -dziemy korzysta w kolejnych rozdzia ach w kontek cie np obs ugi transakcji zwi -zanych z interfejsami szeregowymi

Pora przej do samego sterownika LCD Jego zadaniem b dzie sprawdzenie czyw buforze oczekuj jakie transakcje do realizacji a je li tak to ich wykonanie Ponie-wa dane do LCD mog by wysy ane co okre lony minimalny czas znacznie d u -szy ni czas jakiego na to zadanie potrzebuje mikrokontroler do wysy ania kolejnychpaczek danych pos u ymy si timerem Timer b dzie generowa przerwanie nadmiaru(TCD0_OVF_vect) ktoacutere b dzie wyznacza o tempo w jakim kolejne porcje danych b -d trafia y do LCD Z noty katalogowej kontrolera wynika e minimalny czas trwa-nia wysokiego stanu sygna u Enable to 230 ns a okres tego sygna u nie powinien bykroacutetszy ni 500 ns Poniewa nasz dost p do LCD odbywa si w sposoacuteb nieblokuj cyMCU wi c szybko wysy ania danych do LCD jest bez znaczenia St d te w poka-zanym przyk adzie przyj to e dane b d wysy ane co 4 s co okre la sta a

define LCD_ACCESSTIME 0000004

Poniewa komunikacja z LCD odbywa si w sposoacuteb nieblokuj cy nie zale y nam tena czasie (i tak w stosunku do czasu od wie ania samego LCD jest on bardzo kroacutetki)w efekcie nie ma potrzeby odczytywania flagi busy kontrolera Dzi ki temu w cz ciprzypadkoacutew mo emy w ogoacutele zrezygnowa z sygna u wyboru RW i wymusi jego sta y

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 63

poziom logiczny umo liwiaj cy zapis do LCD Dzi ki temu mo na zaoszcz dzi do-datkowy pin IO1

Ca a logika naszego sterownika jest zawarta w funkcji obs ugi przerwania przepe nieniatimera (TCD0_OVF_vect) Poniewa LCD jest po czony z MCU w trybie 4-bitowym(dla zaoszcz dzenia liczby wykorzystanych pinoacutew IO) kolejne 8-bitowe dane muszby podzielone na dwie tetrady i wys ane do LCD w kolejno ci starszam odsza tetradaInformacja o aktualnie wysy anych danych jest umieszczona w zmiennej trans o typie

static struct uint8_t pos 6 Pozycja w polu danych aktualnej transakcji uint8_t nibble 1 Ktoacutera tetrada jest wysy ana seq

Dlaczego tak Dzi ki wykorzystaniu struktury i poacutel bitowych mo na zaoszcz dzi je-den bajt pami ci SRAM Ze wzgl du na wielko pami ci obs ugiwanej przez kon-troler LCD mo emy by pewni e transakcje zawieraj ce wi cej ni 63 bajty s ra-czej nierealne (nie mia yby wi kszego sensu) St d te do przechowywania informacjio aktualnie wysy anym bajcie danych wystarczy 6 bitoacutew mdash tyle samo zosta o wyko-rzystanych do okre lenia d ugo ci pola danych transakcji w strukturze LCD_trans Zaosz-cz dzony bit mo na po wi ci na flag nibble okre laj c ktoacutera tetrada (m odszastarsza)jest wysy ana Bez poacutel bitowych flaga ta zaj aby dodatkowy bajt pami ci

Przejd my do implementacji sterownika Pierwsz rzecz jak nale y sprawdzi jestto czy w buforze czeka jaka transakcja do zrealizowania Odpowiedzialny za to jestfragment kodu obs ugi przerwania nadmiaru timera

if(trans == NULL) Nic do zrobienia sprawd my czy jaka transakcja oczekuje trans=cbRead(ampLCD_TransBuffer) Czy jest jaka oczekuj ca transakcja seqpos=0 seqnibble=0 if(trans == NULL) TCD0_CTRLA=TC_CLKSEL_OFF_gc Nie ma adnych transakcji mdash wy cz timer

W przypadku gdy adna transakcja nie oczekuje na realizacj timer jest wy czanymdash dzi ki temu nie b d zg aszane kolejne przerwania przepe nienia i MCU nie b -dzie traci czasu na ich obs ug Co prawda wynikaj cy z tego zysk czasowy jest mar-ginalny lecz ma to istotniejsz konsekwencj mdash w przypadku usypiania MCU zb d-ne przerwanie timera nie b dzie niepotrzebnie wybudza o procesora W takiej sytuacjiponowne w czenie timera nast pi dopiero w funkcji dodaj cej transakcj do kolejkimdash a wi c w sytuacji gdy mamy pewno e istnieje oczekuj ca transakcja

Druga cz funkcji obs ugi przerwania jest zwi zana z realizacj samej transakcjiW pokazanym przyk adzie zaimplementowano tylko jeden typ transakcji mdash daniezapisu a cucha tekstowego pod wskazany adres VRAM (na okre lonej pozycji LCD)Je li zajdzie taka potrzeba programista mo e zaimplementowa inne polecenia i doda

1 Warto zauwa y e w bdquoklasycznejrdquo obs udze LCD te nie musimy czyta stanu flagi busy zamiast tego

wystarczy wprowadza p tle opoacute niaj ce Jednak poniewa taka obs uga blokuje MCU nie jest onazalecana Wady tej nie ma dost p transakcyjny co jest jego dodatkow zalet

Kup książkę Poleć książkę

64 AVR Uk ady peryferyjne

kod odpowiedzialny za ich obs ug Zauwa my e ka da transakcja musi zawieraadres pocz tku pami ci wideo od ktoacuterego b dzie zapisywany tekst Dzieje si takdlatego e transakcja wykonana wcze niej mo e ustawi wska nik zapisu na dowolnejkomoacuterce pami ci W efekcie tekst z kolejnej transakcji by by wy wietlany od komoacuterkina ktoacuterej zako czy si zapis poprzedniej transakcji Takie dzia anie oczywi cie jestniedopuszczalne st d te ka dy zapis do pami ci wideo poprzedza ustawienie rejestruindeksowego Problem ten mo na rozwi za tak e w inny sposoacuteb mdash poprzez wpro-wadzenie tzw uchwytoacutew (ang handlers) ktoacutere zawiera yby stan kontrolera LCDNiemniej to rozwi zanie dodatkowo komplikowa oby nasz sterownik Struktura danych(zawartych w polu data) ma wi c nast puj cy format

bajt nr 0 zawiera warto pozycji od ktoacuterej nale y dokonywa zapisu pami ciwideo mdash jest to warto przesy ana do rejestru okre laj cego adres zapisu

kolejne bajty zawieraj a cuch znakowy ktoacutery nale y umie ci w pami ciCGRAM

Poniewa bajt nr 0 zawsze zawiera warto wpisywan do rejestroacutew steruj cych kon-trolera podczas jego wysy ania jest ustawiana linia RS sygnalizuj ca zapis do rejestruPodczas wysy ania kolejnych bajtoacutew linia ta jest zerowana w zwi zku z czym zapisodbywa si do pami ci CGRAM

Kod obs uguj cy transakcj wygl da nast puj coif(trans) Jest transakcja do zrealizowania uint8_t dat=trans-gtdata[seqpos] if(seqnibble == 0) datgtgt=4 To trzeba zmieni je li linie danych nie s po czone z pinami 0 ndash 3 portu IO hd44780_outnibble_nowait(dat amp 0x0F seqpos = 0) Zapisujemy rejestr steruj cy lub dane ++seqnibble if(seqnibble == 0) ++seqpos Co drug tetrad zwi kszamy pozycj bufora if(seqpos gt= trans-gtlen) trans-gtReady=true Koniec transakcji if(trans-gtSelfDel) free_re(trans) Zwolnij pami transakcji je li tak sobie yczy programista trans=NULL Koniec transakcji CLR(OUT HD44780_E)

Ta cz przerwania wysy a kolejne tetrady do kontrolera LCD Warto zastanowi sinad dzia aniem sekwencji

++seqnibble

Poniewa pole nibble jest jednobitowe operacja inkrementacji prowadzi do zmianystanu tego pola na przeciwny (pole to ma warto 0 lub 1) Kiedy zostan wys anewszystkie dane przeznaczone dla kontrolera obs uga transakcji ko czy si Stan tensygnalizuje nadanie warto ci true polu Ready struktury LCD_trans Dzi ki temu pro-gram mo e sprawdzi asynchronicznie w stosunku do przerwania kiedy transakcjauleg a zako czeniu Opcjonalnie jest wykonywana jeszcze jedna funkcja mdash je li poleSelfDel ma warto true to pami zarezerwowana na transakcj jest automatycznie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 65

zwalniana W tym celu wykorzystuje si funkcj free_re ktoacuterej prototyp jest zade-klarowany w pliku Alloc_safeh Funkcja ta wywo uje funkcj biblioteczn free ktoacute-ra zwalnia pami przydzielon dynamicznie na stercie Poniewa funkcja ta nie jestfunkcj reentrant nale y stworzy odpowiedni bdquoprotez rdquo opakowuj c j w blokatomowy co zapewnia e nie zostanie ona ponownie wywo ana zanim jej poprzed-nia instancja nie zako czy dzia ania Oczywi cie lepszym rozwi zaniem by oby napi-sanie w asnych funkcji dynamicznej alokacji pami ci ktoacutere b d reentrant

Bardzo wa ne jest aby pole SelfDel mia o warto true wy cznie dla transakcjidla ktoacuterych pami zosta a przydzielona dynamicznie funkcj malloc (lub jej po-chodnymi) W pozosta ych przypadkach pole to musi mie warto false mdash nie-stosowanie si do tej regu y spowoduje b d mened era pami ci i najprawdopo-dobniej nieprzewidywalne dzia anie programu

Drug wa n zasad jest aby zmienna zawieraj ca dane transakcji nie by azmienn automatyczn mdash zmienne takie s automatycznie niszczone po opusz-czeniu zawieraj cej je funkcji W rezultacie obszar pami ci zawieraj cy danetransakcji mo e zosta wykorzystany przez inne zmienne co spowoduje uszkodzeniezawartych w nim danych

Pami przydzielona transakcji musi by alokowana w sposoacuteb dynamiczny (funkcjamalloc_re) ewentualnie mo e to by pami alokowana dla zmiennej globalnej lubstatycznej mdash zmienne tego typu istniej przez ca y czas ycia programu

Warto te zauwa y e instrukcje steruj ce stanem linii Enable kontrolera LCD(SET(OUT HD44780_E) i CLR(OUT HD44780_E)) s rozdzielone wieloma innymi in-strukcjami Dzi ki temu generowany impuls dodatni tego sygna u ma czas trwania gt230 ns wymagany w specyfikacji kontrolera Nawet dla XMEGA taktowanej zegarem32 MHz 230 ns przek ada si na oko o 7 instrukcji asemblera mdash czas jaki z pewno-ci up ynie pomi dzy wykonaniem obu powy szych instrukcji steruj cych

Do wysy ania danych do kontrolera zosta a wykorzystana nieco zmodyfikowanafunkcja hd44780_outnibble_nowait roacute ni ca si od jej protoplasty hd44780_outnibbletylko tym e nie czeka na sygna braku zaj to ci mikrokontrolera (nie realizuje teopoacute nie ) Nie jest to potrzebne gdy kolejne tetrady s wysy ane w odst pach cza-sowych okre lanych przez timer

Mamy wi c zapewnion obs ug transakcji i mo liwo transakcyjnego wy wietlaniadanych na LCD musimy jeszcze mie funkcj ktoacutera tworzy odpowiednie transakcjemdash jest odpowiednikiem funkcji bezpo rednio wysy aj cej dane znakowe do LCDOdpowiednikiem tym jest pokazana poni ej funkcja

bool LCD_PutText_B(uint8_t x uint8_t y char txt LCD_trans buf bool autodel) buf-gtcmd=LCD_Text buf-gtReady=false buf-gtSelfDel=autodel Czy zwolni pami po zako czeniu transakcji buf-gtdata[0]=HD44780_DDADDR(x+y0x40) Ustaw adres w DDRAM strcpy((char)ampbuf-gtdata[1] txt) Skopiuj dane tekstowe + NULL

Kup książkę Poleć książkę

66 AVR Uk ady peryferyjne

buf-gtlen=strlen(txt) + 1 D ugo tekstu + pozycji + NULL ndash 1 bool ret=cbAdd(ampLCD_TransBuffer buf) if((ret==false) ampamp (autodel)) free_re(buf) Brak miejsca w kolejce else TCD0_CTRLA=TC_CLKSEL_DIV1_gc Preskaler 1 mdash odblokuj timer return ret

Funkcja ta buduje transakcj odpowiedzialn za wy wietlenie napisu txt na wskaza-nej pozycji x y LCD Wszystkie dane o transakcji zostan umieszczone w buforzew pami ci ktoacuterej adres jest okre lany wska nikiem buf Pami w buforze musi bywystarczaj co du a aby pomie ci ca transakcj Dodatkowy parametr autodel okre laczy pami ta ma by automatycznie zwalniana po obs u eniu transakcji (true) czynie (false) Je li transakcj uda o si umie ci w kolejce funkcja zwraca true Wartozauwa y e w takim przypadku funkcja uruchamia te timer (w naszym przypadkujest to timer TCD0) odpowiedzialny za generowanie przerwania Funkcja obs ugi prze-rwania wysy a dane do LCD

Pewn odmian powy szej funkcji jest funkcjabool LCD_PutText(uint8_t x uint8_t y char txt) LCD_trans trans=malloc_re(sizeof(LCD_trans) + strlen(txt) + 2) bool ret=LCD_PutText_B(x y txt trans true) return ret

Wykorzystuje ona funkcj LCD_PutText_B z tym e najpierw alokuje dynamiczniepami potrzebn na przechowanie tworzonej transakcji

Mamy komplet potrzebnych funkcji a wi c sprawd my jak ca o sprawdza siw praktyce W pliku LCD-transactc znajduje si kod pokazuj cy jak dzia aj naszetransakcje Aby to by o mo liwe nale y zainicjalizowa kontroler LCD

LCD_init()

Wykorzystujemy tu znan ju funkcj inicjalizuj c mdash nie ma potrzeby jej zmienia gdy operacja inicjalizacji LCD jest jednorazowa i nie trzeba wykonywa jej w posta-ci transakcji W drugim kroku musimy zainicjalizowa wykorzystywany timer i systemprzerwa

LCD_Timer_init(ampTCD0)PMIC_CTRL|=PMIC_LOLVLEN_bm Odblokuj przerwania niskiego poziomusei()

Poniewa dost p do LCD z pewno ci nie jest czynno ci krytyczn czasowo prze-rwaniom timera nadano najni szy priorytet Dzi ki temu mo na innym bardziej kry-tycznym przerwaniom nada wy sze priorytety i uzyska w ten sposoacuteb zmniejszenieczasu latencji obs ugi przerwa Sama inicjalizacja timera jest niezwykle prosta

void LCD_Timer_init(TC0_t tc) tc-gtINTCTRLA=TC_OVFINTLVL_LO_gc Odblokuj przerwania nadmiaru timera i nadaj im niski priorytet tc-gtPER=F_CPULCD_ACCESSTIME Przerwanie co 4 us (niezale nie od F_CPU)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 67

Sprowadza si ona tylko do odblokowania mo liwo ci zg aszania przerwania nadmia-ru oraz konfiguracji rejestru PER tak aby przerwania by y generowane co ok 4 s mdashniezale nie od cz stotliwo ci taktowania CPU Mo emy wi c przyst pi do wy wie-tlenia pierwszego napisu

LCD_PutText(00 Numer)

Powy sza funkcja ma jedn wad mdash alokuje dynamicznie pami po ka dym wywo-aniu (pami ta jest automatycznie zwalniana po obs u eniu transakcji) niemniej

ca y proces jest czasoch onny Mo emy tego unikn alokuj c pami bdquor cznierdquo i wielo-krotnie wykorzystuj c zaalokowany blok pami ci Ilustruje to poni szy przyk ad

LCD_trans buf=malloc_re(sizeof(LCD_trans) + 7)

Zmienna buf wskazuje na obszar pami ci ktoacutery mo e pomie ci a cuch 5-znakowyTyle wystarczy na potrzeby tego przyk adu mdash na LCD b d wy wietlane kolejneliczby w zakresie 0 ndash 65 535 najd u sza ma 5 znakoacutew st d te nasz bufor ma tak a nieinn d ugo

while(1) utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(60 bufstr buf false) while(LCD_IsTransCompleted(buf))

Do konwersji liczby na a cuch u yto funkcji bibliotecznej utoa (nag oacutewek stdlibh)Poniewa d ugo a cucha po konwersji jest zmienna (co spowodowa oby pozosta-wianie na LCD bdquoduchoacutewrdquo po poprzednich konwersjach) w kolejnej linii brakuj ceznaki uzupe niono spacjami Nast pnie tworzona jest transakcja w obszarze pami ciprzydzielonym zmiennej buf Ostatnia p tla while jest odpowiedzialna za oczekiwa-nie na zako czenie realizacji transakcji Po jej zako czeniu p tla jest wykonywana odpocz tku

Uwa ny czytelnik z pewno ci zauwa y e pami przydzielana funkcj malloc_renie jest nigdzie zwalniana mdash w normalnej sytuacji spowodowa oby to wyciek pami -ci W naszym przyk adzie jednak program nigdy si nie ko czy nie ma wi c potrzebyzwalniania pami ci wskazywanej przez zmienn buf

Powy szy przyk ad pokazuje jak unikn blokowania CPU na czas dost pu do wolnodzia aj cego urz dzenia jakim jest LCD alfanumeryczny Jednak to nie wszystkiezalety wynikaj ce z zastosowania transakcji Drug wa n zalet naszego rozwi zaniailustruje przyk ad znajduj cy si w katalogu PrzykladyLCD-alfaLCD-transact-intPowa nym ograniczeniem funkcji odpowiedzialnych za dost p do LCD w sposoacutebklasyczny by a niemo no ich wywo ywania z funkcji obs ugi przerwa mdash funkcjeobs ugi LCD nie by y reentrant2 Nasz system oparty na transakcjach nie ma tychwad Aby to zilustrowa zosta stworzony prosty przyk ad mdash tak jak poprzedniow p tli g oacutewnej programu s wy wietlane stale kolejne liczby ale jednocze nie wyko-

2 Poza tym blokowa y CPU na d ugi czas a jak pami tamy funkcje obs ugi przerwa powinny by

wykonywane mo liwie kroacutetko

Kup książkę Poleć książkę

68 AVR Uk ady peryferyjne

rzystano drugi timer (TCD1) w ktoacuterego funkcji obs ugi przerwania przepe nienia jestwy wietlany licznik tych przerwa

ISR(TCD1_OVF_vect) static char int_buf[sizeof(LCD_trans) + 7] static uint16_t cnt char bufstr[6]

utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(61 bufstr (LCD_trans)ampint_buf false)

Jak widzimy w sposoacuteb asynchroniczny z dwoacutech miejsc w programie mo emy uzy-ska dost p do LCD a ka da funkcja bdquoma wra enierdquo e ma LCD na wy czno Przy okazji warto przeanalizowa sposoacuteb w jaki jest rezerwowana pami na trans-akcj w przerwaniu Oczywi cie mo na by wykorzysta dynamiczn alokacj pami cilecz jak wspomniano taka alokacja jest czasoch onna St d te w pokazanym przy-k adzie wykorzystano tablic statyczn int_buf o rozmiarze umo liwiaj cym prze-chowanie kompletnej transakcji Dzi ki temu e zmienna int_buf jest zmienn statycz-n nie jest ona niszczona po zako czeniu funkcji obs ugi przerwania Gdyby pomins owo kluczowe static zmienna ta by aby niszczona a na LCD najprawdopodobniejzacz yby si pojawia przypadkowe tre ci Poniewa pami naszego bufora nie by aalokowana dynamicznie nie mo e ona zosta zwolniona w naszym sterowniku LCDst d te ostatni parametr wywo ania funkcji LCD_PutText_B musi mie warto false

OptymalizacjaPrzy okazji tego i poprzedniego przyk adu warto zastanowi si jeszcze nad jednkwesti mdash optymalizacji W podanych przyk adach wykorzystano wcze niej omoacute-wione funkcje dost pu do wy wietlacza LCD znajduj ce si w plikach hd44780ci hd44780h Wi kszo z zawartych tam funkcji nie jest wykorzystywana jednakkompilator mimo wszystko umieszcza ich kod w pliku wynikowym mdash dzieje si takponiewa nie mo e on bdquostwierdzi rdquo czy funkcje te nie s wykorzystywane w innychfragmentach programu Pami tajmy e kompilator kompiluje poszczegoacutelne pliki roacute-d owe osobno i dana jego instancja nie bdquowierdquo co znajduje si w innych plikach (innychjednostkach kompilacji) Tak ca o ciow wiedz ma dopiero konsolidator (linker)ktoacutery czy stworzone przez kompilator pliki obiektowe (o rozszerzeniu o) w plikwynikowy Linker jednak bdquonie wierdquo ktoacutera z funkcji programu zosta a u yta a ktoacuteranie mdash informacje te ma wy cznie kompilator W ten sposoacuteb powstaje typowe b dneko o w efekcie nasze nieu ywane funkcje nie s usuwane (linker zostawia je bdquonawszelki wypadekrdquo) i zajmuj niepotrzebnie pami Czy mo na temu jako zaradzi Oczywi cie tak W tym celu trzeba po czy si y kompilatora i linkera co zapewniaj od-powiednie opcje kompilacji We w a ciwo ciach projektu (ProjectProperties lub Alt+F7)wybieramy zak adk Toolchain a nast pnie AVRGNU C Compiler i OptimizationZnajdziemy tam pole wyboru o nazwie Prepare functions for garbage collection (ry-sunek 224)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 69

Rysunek 224 Aby da linkerowi mo liwo usuwania nieu ywanych funkcji nale y skompilowaprogram z wybran opcj ndashffunction-sections ktoacutera spowoduje e ka da funkcja programu znajdzie siwe w asnej sekcji

Zaznaczenie tej funkcji spowoduje umieszczenie ka dej funkcji w osobnej sekcji mdashsamo w sobie nie wp ynie to na skroacutecenie kodu wynikowego ale jest warunkiem nie-zb dnym dla podj cia stosownych dzia a przez linker Aby wyeliminowa nieu y-wane funkcje nale y zaznaczy jeszcze w ga zi AVRGNU LinkerOptimization poleGarbage collect unused sections (rysunek 225)

Rysunek 225 Zaznaczenie opcji Garbage collect unused sections (-Wl--gc-sections) spowodujee nieu ywane funkcje zostan usuni te z kodu wynikowego w efekcie kod programu ulegnie skroacuteceniu

Po zaznaczeniu tych opcji program zostanie skroacutecony o kilkaset bajtoacutew Oczywi cieje li wszystkie funkcje by yby wykorzystane nie uzyskaliby my adnego skroacuteceniakodu Niemniej w sytuacji gdy u ywa si bibliotek zazwyczaj przynajmniej czfunkcji nie jest wykorzystywana warto wi c skorzysta z tej mo liwo ci optymalizacji

Kup książkę Poleć książkę

70 AVR Uk ady peryferyjne

Je li mamy do czynienia z prekompilowan bibliotek (lib) to musi ona by skom-pilowana z zaznaczon opcj Prepare functions for garbage collection (-ffunction-sections) Alternatyw jest umieszczenie ka dej funkcji biblioteki w osobnym pliku(tak jak w przypadku bibliotek AVR-libc)

Na ekranie wyboru opcji optymalizacji linkera mamy jeszcze jedn przydatn opcjmdash Relax Branches (-mrelax) Dla mikrokontroleroacutew ktoacutere maj ponad 8 kB pami ciFLASH instrukcje skokoacutew s generowane jako tzw instrukcje d ugie mdash umo liwiajone skok do komoacuterki pami ci FLASH o dowolnym adresie Jednak cen za to jestwyd u enie instrukcji mdash ich kod jest d u szy podobnie jak czas wykonania Nie zawszejednak takie d ugie instrukcje musz by wykonywane mdash je li miejsce docelowe skokule y blisko (w zasi gu instrukcji skokoacutew wzgl dnych) to mo na w kodzie wynikowymzamieni instrukcje d u sze na kroacutetsze co przynosi oszcz dno ci w postaci skroacuteceniakodu wynikowego Poniewa dopiero linker bdquowierdquo jak poszczegoacutelne fragmenty kodus rozmieszczone w pami ci takiej podmiany mo na dokona na etapie linkowaniaprogramu co zapewnia powy sza opcja St d te warto to pole wyboru zaznaczy

Kup książkę Poleć książkę

SkorowidzA

ABI Application Binary Interface 25AC Address Counter 50ADPCM 482adres

bazowy 377bufora 61komoacuterki 84pu apki 202

ALE Address Latch Enable 368alfanumeryczne wy wietlacze 43algorytm ADPCM 492algorytmy stratne 495animacje 57antyaliasing 325architektury procesoroacutew XMEGA 352asembler 23

dyrektywy 40funkcje j zyka C 41obs uga przerwa 39

asynchroniczne wywo anie funkcji 101Atmel Studio 15

Bbajty kalibracyjne 569biblioteka

FATFS 131 139 176 180 517libcallback-liba 99PetitFS 144 149

bitADC_CH0START_bm 236IMPMODE 244

bitrate 442 512blokowanie przerwa 219b d 16 19

kwantyzacji 463offsetu 230wzmocnienia ADC 230

BOD 223bps bits per second 12

budowakarty 152linii obrazu 394pami ci SDRAM 374pliku stymulacji 192ramki PAL 412sygna u PAL 411wtyczki 544 545

bufor 78FIFO 497na transakcje 61transakcji 62

buforowanie wyj cia 294

CCAS Column Address Strobe 375CCFL 44charakterystyka

przetwornikoacutew 222termistora 264tryboacutew pracy 232

CID Card Identification 169CKE Clock Enable 375CLKIN 421COG Chip on Glass 310CRC 158 178CRC16 178CRC7 164CS Chip Select 361 375CSD Card Specific Data 172czas

dost pu do SDRAM 424adowania kondensatora 244

propagacji 281proacutebkowania 260symulacji 209

czcionki 322cz stotliwo

odchylania pionowego 428proacutebkowania 244 441 444 530przebiegu 504

Kup książkę Poleć książkę

576 AVR Uk ady peryferyjne

cz stotliwoPWM 465taktowania koprocesora 549taktowania procesora 209taktowania rdzenia 18

czyszczenie pami ci 318

DDAC Digital to Analog Converter 293 447 451

buforowanie wyj cia 294generowanie przebiegoacutew 301jitter 303kalibracja 306napi cie referencyjne 295system zdarze 297taktowanie 296tryb dwukana owy 301wykorzystanie DMA 298wyzwalanie konwersji 305

datalogger 261 265 275DD Device Density 86debuger 183

programowy 190sprz towy 185 187

decymacja 259DEBUG 219XMEGA 260

definicja symboli globalnych 36definiowanie w asnych znakoacutew 56deklaracja zapowiadaj ca 103 337dekoder DTMF 548 556DMA 254 298 402 458 518 523dost p do

danych 358 359 568danych binarnych 356 360danych wielobajtowych 31DataFLASH 137EEPROM 128FAT 136komoacuterki 375LCD 59 62 66 68operandu 30pami ci 81 384 386 387 561pami ci SDRAM 424pliku blokowy 141portoacutew IO 30rejestroacutew IO procesora 36rejestroacutew uk adu 499SPI 95sygnatury u ytkownika 565 567wska nikoacutew 32

DQM Data Mask 375DSP Digital Signal Processor 535

DTMF 535 553dyktafon 529dynamiczna alokacja pami ci 516dyrektywa global 38dyrektywy asemblera 40dzia anie

DMA 255komparatora 280timeroacutew 400

d wi k 443

EEBI External Bus Interface 361EEPROM 207eliminacja jitteru 24emulacja RS232 139

FFAT File Allocation Table 128 131FAT32 128FATFS 180filtr

dolnoprzepustowy 491drugiego rz du 470pierwszego rz du 469trzeciego rz du 471

filtrowanie sygna u PWM 468firmware 565FLASH 207format

odpowiedzi 159polecenia 158protoko u 157

funkcja_delay_ms 17 219c_zero 42callback 106 341callback() 99DataFLASH_CSEnable 100DF_FinishBufWrite() 269disk_initialize 136disk_ioctl 181disk_status 136disk_write 138DMA_SPI_init 104DTMF_GetCode 553free_re 65GPIOR0_init 507hd44780_outcmd 51hd44780_outnibble_nowait 65LCD_defchar_P 57

Kup książkę Poleć książkę

Skorowidz 577

Menu_Click_Func 515Menu_Free 516Menu_Recorder 532Menu_Run 527MS_CreateRegEntry 117MS_GetDirPos 125MS_GetRegItem 115MS_WritePages 116 118OSC_wait_for_rdy 473RecMenu_StartStop 532sprintf 142strtok 124sysclk_init() 200 209TMF_memcpy_PF 454udi_cdc_getc() 123udi_cdc_is_rx_ready() 123VS1003_Reset 506

funkcjeanalizuj ce 556biblioteczne 50biblioteki FATFS 143j zyka C 41kontrolera ST7565R 313opoacute niaj ce 17opoacute nie 219reentrant 524specjalne kontrolera 319steruj ce 314zapisu 133

fusebit 557BODACT 560BODLEVEL 560BOOTRST 559DVSDON 560EESAVE 561JTAGEN 558RSTDISBL 559SUT 559TOSCSEL 559

fusebity w AVR-libc 571

Ggenerator obrazu composite 426generowanie

d wi ku 461kolorowego obrazu 437obrazu wideo 391przebiegoacutew 301przerwa 285sygna u composite 409

g bia koloru 326gniazdo

karty SD 156VGA 396

Hhistereza 281

IIDE 11IMA ADPCM 483informacje

o kolorze 431o obrazie 434

inicjalizacjakarty 161karty SDHC 167karty SDSC 167karty SDXC 167licznika 419pami ci 119USART 505

instrukcjaicall 42movw 35nop 13 24

interfejsSCI 498SDI 498SPI 71 79RS232 120UART 123USART 71 73

interpolacja 259interpolacja w XMEGA 260inwersja obrazu 319

Jjednostki 12jitter 24 303 420

Kkalibracja

ADC 229DAC 306 564offsetu 237

kana DMA 82 522karta 154 158

mikroSD 152SD 151 152SDHC 151 152 160SDSC 160SDXC 151 160

Kup książkę Poleć książkę

578 AVR Uk ady peryferyjne

karty pami ci 151 152 157biblioteka FATFS 180budowa 152format polecenia 158inicjalizacja 161 167komunikacja 156odczyt danych 173opcje konfiguracyjne 181rejestry specjalne 169tryby pracy 153zapis danych 176zasilanie 154

kodasemblerowy 23 24C 23dost pu 24

kodowanieμ-law 481ADPCM 483Dialogic ADPCM 494informacji 166 426koloru 425znakoacutew 536

kodyformatoacutew audio 501zdarze 545

kolejno bajtoacutew 533kolor 424 430kolorowy obraz 437komparator 422

analogowy 279 280analogowy XMEGA 282okienkowy 284

kompilacja plikoacutew binarnych 350kompilator avr-gcc 11 359kompresja

ADPCM 482 486d wi ku 480IMA ADPCM 482

komunikacja z koprocesorem 504konfiguracja

4-portowa 364biblioteki 133debugera 185DMA 459 522fusebitoacutew 570kontrolera DMA 257 452komparatoroacutew 285lockbitoacutew 570LPC 371pami ci SDRAM 381PetitFS 149pinu IO 225portoacutew IO 362

preskalera 452projektu 186przerwa 219pu apki 203rejestru EVCTRL 248rejestru PER 67SPI 75sygna u CS 377typu czcionki 324urz dze IO 189USART 76zegara 383

konsolidacja 547kontroler

DMA 254 298 402 458 518 523KS108 310ST7565R 310ndash315 321

konwersjaDAC 305sygna oacutew 396wyzwalana 306

konwertercyfrowo-analogowy 426DAC 427

koprocesormp3 496VS1003B 10

korekcja fazy 466kwantyzacja 463

Llampa CCFL 44LE Latch Enable 433licznik 419

cykli 209TCC1 400timera 20

linie IO 50linie sygna owe

MISO 72 164MOSI 72SCK 72SS 72

linker 69lista

mnemonikoacutew 24modyfikowanych rejestroacutew 32

lockbity 557 561lockbity w AVR-libc 570LPC Low Pin Count 371LPCM 443 556LSB Least Significant Bit 228

Kup książkę Poleć książkę

Skorowidz 579

a cuchy formatuj ce 212czenie plikoacutew 352

Mmagistrala pami ci zewn trznej 361magnetofon cyfrowy 528makro _SFR_IO_ADDR() 39makrodefinicja

ASSERT 214HD44780_CGADDR() 53HD44780_CLR 53HD44780_DDADDR() 53HD44780_DISPCTL() 52HD44780_ENTMODE() 52HD44780_FNSET() 52HD44780_HOME 53HD44780_SHIFT() 51LOCKBITS 571

mapowanie sygna oacutew 366mapy bitowe 343marker czasowy 268maski bitowe 329matryce 49menu 335menu piktogramowe 342mierniki temperatury 262mikrokontroler

ARM 9AVR 9PIC 9XMEGA128A3U 10

MISO 72moc wydzielana 265model psychoakustyczny 495modu

alfanumeryczny 45NVM 568Xmega eXploreGO 10Xplained ATXMEGA A3BU 10Xplained ATXMEGA-A1 10Xplained XMEGA128A1 447Xplained XMEGA256A3 94Xplained XMEGA256A3BU 97 143 266

modyfikator 30const 85volatile 28 273

monitory CRT 395monochromatyczne wy wietlacze graficzne 309monochromatyczny

tryb graficzny 416tryb tekstowy 413

MOSI 72mp3 495Msps Megasamples per second 12multiplekser wej ciowy 226 283multipleksowanie adresoacutew 368 369muzyka 439

Nnadawanie kodoacutew DTMF 540nadproacutebkowanie 258nag oacutewek kontenera wav 500nagrywanie mowy 486najmniej znacz cy bit 228napi cie

offsetu 280referencyjne 223 295zasilania 239

Oobracanie obrazu 319obraz 319

composite 426kolorowy 430wideo 391

obroacutebka d wi ku 443 445obs uga

FAT 131 143klawiatury matrycowej 24LCD 58 63 67menu 337przerwania 37 38 458przerwania DMA 525przerwa w asemblerze 39przyciskoacutew 272wy wietlaczy alfanumerycznych 45

odczytblokowy 140danych 173 358

odpowied response 159R1 159R2 159R7 160

od wie anie pami ci 376odtwarzanie

d wi ku 472muzyki 447 513 518 521

offset 238offset ADC 230okno

Breakpoints 202Call stack 209dezasemblera 210

Kup książkę Poleć książkę

580 AVR Uk ady peryferyjne

oknoIO View 207podgl du zmiennych 211wyboru czcionek 324

OLED 46opcje

kompilatora 35zapisu d wi ku 445

operacjena buforach 91odczytu 173zapisu 176zapisu strony 92

operand 29operator

ascii 41

asciz 41

byte 41

section 41opoacute nienia 13 18opoacute nienie zmienne 16optymalizacja 16 68optymalizator 26organizacja pami ci 77organizacja pami ci VRAM 316oscylator 287OSD On-Screen Display 417ostrze enie 16oszcz dzanie energii 94

Ppakiet WinAVR 48pami

CGRAM 56 57 64DataFLASH 10 77 81 113 269DDRAM 49EEPROM 111FLASH 54 124 207RAM 49SDRAM 372SRAM 63 124 329 366 371VRAM 314 317

PCLK 421PCM 443PetitFS 144 149p tla

for 13while 201

pierwsza linia obrazu 321piksel 430piktogram 342pin IO 225

plikAlloc_safeh 65DataFLASHc 83DataFLASHIOc 136definesh 50delayh 14diskioh 132 136ffh 132ffconfh 132 181hd44780h 49integerh 132ioh 30LCD_transc 61LCD-transactc 66Makefile 14Menuc 19nothingo 541outfiletxt 547 551pffh 149SPIh 104stringh 113stymulacji 191 192

pliki mp3 495elf 351fon 323o 24S 24 34binarne 350 355csv 276d wi kowe 440obiektowe 352wav 500WMA 512z czcionkami 327z danymi 349

podbijacz napi cia 315podgl d

pami ci 207stosu wywo a 209zmiennych 211znakoacutew 325

pod czeniefototranzystora 262karty SD 155LCD z kontrolerem 311modu u 50pami ci 362 369 370 373termistora 262uk adu LM35 251wyj XMEGA 398

pod wietlenieCCFL 46OLED 46

Kup książkę Poleć książkę

Skorowidz 581

podwoacutejne buforowanie 255 332 457polecenia

kasowania strony 81konfiguracyjne pami ci 82kontrolera ST7565R 315odczytu bufora 82 89odczytu pami ci 81 88SDRAM 376transferu 91

polecenieACMD41 168cd 181CID 178CMD0 165CMD8 167CSD 178date 276dir 127 181dump 276erase 276get 276HD44780_CLR 51Init 178mkdir 181

po czenieDMA ze SPI 96dwoacutech komparatoroacutew 285koprocesora mp3 497LCD z mikrokontrolerem 48wyj cia XMEGA 411XMEGA z PC 121z telewizorem 431

pomiarnapi cia zasilania 239temperatury MCU 241

port IO 30 362pozycjonowanie grafik 345poacute obraz 410precyzja pomiaroacutew 260preskaler 478preskaler ADC 243program

Atmel Data Visualizer 275Audacity 443avr-objcopy 350dataloggera 265LCD Image Converter 323makeloadingtableexe 543Realterm 127 554riffstrip 483SoX 445Tracepoint 208

programowanie sygnatury u ytkownika 566protokoacute master-slave 157

prototypy 136proacutebki d wi kowe 447proacutebkowanie

8-bitowe 300nieliniowe 480

prymitywy graficzne 330przebieg PWM 468przebiegi 289 303przechwytywanie danych 276przemiatanie wej 253przerwanie 218 254 286 403

DMA 522komparatora 286

przestrze adresowa procesora 378przesy anie

danych 498polece 498

przetaktowanie procesora 436przetwornik

ADC 221analogowo-cyfrowy 221cykliczny 222potokowy 222

przyciski 272pseudooperatory 41pu apki breakpoints 197pu apki warunkowe 205punkty ledzenia 203PWM 461 462 472

RRAS Row Address Strobe 375redukcja poboru energii 242regulacja kontrastu 321rejestr 32 34rejestr AC 50

adresu wtyczki 513BASEADDR 377CID 169CMP 251CSD 172czasu utworu 512DATA 83EVCTRL 248formatu audio 512identyfikacyjny pami ci 87INTFLAGS 252kontroli basoacutew 510kontroli g o no ci 513MUXCTRL 227OCR 168PER 67poroacutewnania 249

Kup książkę Poleć książkę

582 AVR Uk ady peryferyjne

rejestr ACSCI_CLOCKF 511stanu komparatora 287stanu pami ci 86stanu uk adu 510trybu pracy 508WINCTRL 285

rejestrydost pu do pami ci RAM 513GPIOR 502IO procesora 36mikrokontrolera 25procesora 35specjalne 94specjalne karty 169uk adu VS1003B 508

relacja rodzic ndash dziecko 336reset uk adu 534rozdzielczo

LCD 329przetwornika 231PWM 463 477

rozszerzenie HiRes 477 479roacutewnanie Steinharta-Harta 263rysowanie map bitowych 343

Sschemat uk adu dataloggera 267SCI Serial Command Interface 498SCK 72SD Secure Digital 152SDI Serial Data Interface 498separator synchronizacji 422separowanie impulsoacutew synchronizacji 422shieldy 10skaler 422skaler napi cia 283skrypt makefile 353s owo kluczowe

asm 27extern 37static 68

specyfikatory lokalizacji zmiennej 213sps samples per second 12SS Slave Select 72standard PAL 410standard VGA 393sterowanie

dataloggerem 275sygna em 379

sterownik 121HD44780 49 56LCD 49 62

stos wywo a 209

strukturaFATFS 139Handle 118LCD_trans 60 63menu 338rejestru 86SimpleFSEntry 113 116SimpleFSHandle 113 118 140submenu 527systemu plikoacutew 112

sumabitowa 571kontrolna 178

sygnacomposite 409composite video output 430CS 377DREQ 497H-Sync 396synchronizacji 423V-Sync 396zegarowy CLK 374

sygna yinterfejsu EBI 363magistrali EBI 364steruj ce 375

sygnaturaprodukcyjna procesora 563u ytkownika 565

symbol__DELAY_ROUND_CLOSEST__ 17__DELAY_ROUND_DOWN__ 17_FS_FAT12 149_FS_FAT32 149_FS_MINIMIZE 133_FS_READONLY 133_FS_RPATH 135_FS_TINY 133_MAX_SS 135_MULTI_PARTITION 135_USE_DIR 149_USE_FASTSEEK 134_USE_FORWARD 134_USE_LABEL 134_USE_LFN 134_USE_LSEEK 149_USE_MKFS 134_USE_READ 149_USE_STRFUNC 134_USE_WRITE 149_VOLUMES 136F_CPU 14 15 18increment 36USE_BUSY_FLAG 50

Kup książkę Poleć książkę

Skorowidz 583

symboleglobalne 36w asemblerze 28zewn trzne 39

symulacja 198 209symulator 190synchronizacja

pami ci 331pionowa 395pozioma 394

systemplikoacutew 111 128przerwa 404zdarze 245

szablonfont_XMEGAtmpl 326image_XMEGAtmpl 343

szum 463szybko przesy ania danych 126

ledzenie wi zki 333rodowisko

graficzne 11programistyczne 11VSIDE 542WinAVR 47

Ttabela FAT 130tablica

framebuf 402 408plugintbl 552 555tekst 208z kodem wynikowym 543

taktowanieDAC 296mikrokontrolera 473

technologia OLED 44temperatura mikrokontrolera 239 241termistor 262 290

NTC 263PTC 263

termometrLM35 249 250z alarmem 251

termostat 290test uk adu VS1003B 503testowanie obrazu 319timer 16 62

TCC0 20

TCC1 399transakcja 59 62 65transakcje 17 103ndash107transakcyjna obs uga LCD 58transakcyjny dost p do SPI 95transfer 91

danych 97wynikoacutew 254

transmisja 72 83tryb

bez znaku 234ci g ej konwersji 252czterobitowy 153dwukana owy 301graficzny 416graficzny VGA 407idle 419jednobitowy 153LPC 371monochromatyczny 397 407oszcz dzania energii 94 306pracy multipleksera 226pracy SPI 157roacute nicowy 232single slope 312SPI 153tekstowy 413tekstowy VGA 397z pojedynczym wej ciem 234ze znakiem 235

trybygenerowania PWM 467pracy karty 153pracy przetwornika 231pracy SPI 74pracy uk adu 508

twierdzenie Nyquista 258tworzenie

adresu 84nak adek 417obrazu 335tablicy 543

typ__uint24 119karty 160niekompletny 60wyliczeniowy 114

typyoperandoacutew 29w AVR 34

Kup książkę Poleć książkę

584 AVR Uk ady peryferyjne

Uuchwyt handle 64 113uk ad

AD725 427 431buforowy 294CS 361DAC 284dataloggera 267detekcji awarii zasilania 559generuj cy obraz 393HiRes 477ICL7660 47LM35 250 251SampH 293sterowania sygna em 379USART 401VS1003B 496 503 508 530 538 556VS100XX 529wzmacniania sygna u 227

uk ady peryferyjne 9uruchomienie komparatora 287urz dzenie

master 72slave 72

u rednianie 259utrata danych 141u ycie wstawki asemblerowej 33

VVGA 393

Wwarto ci kalibracyjne

ADC 564oscylatoroacutew 564temperatury 564

warunkowa kompilacja 36WE Write Enable 375wej cie composite video input 425wektor przerwa 38 257wideo 391wielko pami ci 86 377w czenie DAC 299wska nik na struktur 27wska niki 32wstawki asemblerowe 24 33wtyczka 535 541 544

SineDTMF Generator 537VGA 396

wyboacuter cz stotliwo ci PWM 465 474wykorzystanie

DMA 254 518

EuroSCART 428PWM 461rejestroacutew 34

wyliczanie predyktora 489wy wietlacze

alfanumeryczne 43 45graficzne 43 309LCD 43OLED 46

wy wietlanielitera u 213map bitowych 344obrazu 333 346 406obrazu VGA 393

wywo ania zwrotne callbacks 98asynchroniczne 101synchroniczne 101

wyzwalanie konwersji 245wzmacniacz 446wzmacniacz operacyjny 279wzmacnianie sygna u 227

XXMEGA 9 18

Zzapis

bufora 269danych 176d wi ku 440 556

zasilaniekarty 154pami ci 109

zatrzask 368zatrzask 74HC573 433zatrza ni cie adresu 369zdarzenia 297zdarzenie compare match 399zegar 383 420 426zintegrowane rodowisko programistyczne 11z cze EuroSCART 425 428 429zmiana

g o no ci 527wielko ci strony 94

znaki 56

roacuted onapi cia odniesienia 284sygna u 240

Kup książkę Poleć książkę

Page 10: Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8 AVR. Ukäady peryferyjne Rejestry dost pu do pami ci RAM .....513 Rejestr adresu

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 45

Obs uga wy wietlaczyalfanumerycznych

Wy wietlacze alfanumeryczne s zbudowane z matryc pikseli zwykle o wielko ci5times8 pikseli pogrupowanych razem W tym typie wy wietlacza mo emy sterowazawarto ci tak utworzonej matrycy znakowej jednak nie ma mo liwo ci sterowaniaposzczegoacutelnymi pikselami Najcz ciej spotykane wy wietlacze tego rodzaju mogwy wietla 1times8 1times16 2times16 2times20 4times16 znakoacutew gdzie pierwszy wymiar okre laliczb wy wietlanych wierszy a drugi liczb znakoacutew w wierszu Poniewa nie steru-jemy poszczegoacutelnymi pikselami do kontrolera wysy amy tylko kod znaku ktoacutery mazosta wy wietlony na danej pozycji Kontroler na podstawie kodu znaku generujeadres do specjalnego obszaru pami ci tzw tablicy znakoacutew w ktoacuterej znajduje si bajtowareprezentacja poszczegoacutelnych pikseli tworz cych znak Dla matrycy 5times8 ma ona 40bitoacutew Tablica ta jest umieszczona w pami ci ROM kontrolera LCD nie mo emy jejwi c zmienia Zwykle jednak kontrolery udost pniaj mo liwo definicji kilku w a-snych znakoacutew dzi ki czemu mo emy zdefiniowa np znaki charakterystyczne dla j -zyka polskiego Takie podej cie do generowania obrazu ma podstawow zalet jakjest prostota i zwi zane z tym niewielkie zapotrzebowanie na pami RAM Do prze-chowania np zawarto ci 8-znakowego wy wietlacza LCD wystarczy zaledwie 8 bajtoacutewpami ci Ma to szczegoacutelne znaczenie w prostych mikrokontrolerach z niewielk ilo-ci pami ci RAM Najpopularniejszym kontrolerem stosowanym w wy wietlaczach

alfanumerycznych jest HD44780 nawet je li w posiadanym wy wietlaczu jest innykontroler to mamy du szans e jest on z nim kompatybilny Typowy rozk ad sy-gna oacutew modu oacutew opartych na tym kontrolerze pokazano w tabeli 221

Tabela 221 Typowy uk ad wyprowadze modu oacutew alfanumerycznych LCD opartych na kontrolerzeHD44780

Pin Nazwa Funkcja

1 GND Masa 2 Vcc Zasilanie (typowo 5 V) 3 Vee Regulacja kontrastu 4 RS Zapis polecenia 5 RW Strob odczytzapis 6 E Wyboacuter uk adu 7 D0 Bit danych 0 8 D1 Bit danych 1 9 D2 Bit danych 210 D3 Bit danych 311 D4 Bit danych 412 D5 Bit danych 513 D6 Bit danych 614 D7 Bit danych 715 A Pod wietlenie mdash anoda16 K Pod wietlenie mdash katoda

Kup książkę Poleć książkę

46 AVR Uk ady peryferyjne

Przed pod czeniem modu u zawsze upewnij si czy podany rozk ad odpowiadau ytemu modu owi W szczegoacutelno ci sprawd rozmieszczenie linii zasilaj cych Ichniew a ciwe pod czenie grozi uszkodzeniem modu u

Zwykle piny 15 i 16 steruj ce pod wietleniem s umieszczone osobno lub te przedpinem 1 St d te zawsze nale y je dok adnie zidentyfikowa przed pod czeniem mo-du u Do pinoacutew tych nale y pod czy napi cie wykorzystane do pod wietlenia modu uPrzy czone napi cie zale y od typu zastosowanego pod wietlenia mdash CCFL foliielektroluminescencyjnej lub diod LED W dalszej cz ci b dziemy zajmowa si modu-em z pod wietleniem LED W nocie katalogowej ka dego modu u znajduj si szcze-

goacute owe informacje dotycz ce zasilania pod wietlenia Zwykle w tym celu wymaganejest napi cie 5 V a nat enie pr du pod wietlenia wynosi 20 ndash 50 mA

Wy wietlacze LCD alfanumeryczne s dost pne w handlu w wersjach dostosowanychdo roacute nych napi zasilaj cych Typowo jest to napi cie 5 V co stwarza pewne pro-blemy przy pod czeniu takiego LCD do procesoroacutew rodziny XMEGA S one zasi-lane maksymalnym napi ciem 36 V nie ma wi c mo liwo ci aby LCD i procesordzia a y w tych samych domenach napi ciowych W efekcie przy po czeniu obu uk a-doacutew musimy zastosowa konwersj napi Poniewa LCD alfanumeryczny z perspek-tywy procesora jest urz dzeniem bardzo wolnym ca kowicie wystarczaj cym rozwi za-niem jest zastosowanie szeregowych rezystoroacutew ktoacutere wraz z wbudowanymi w procesordiodami zabezpieczaj cymi b d stanowi y uk ad obni aj cy napi cie na magistralikomunikacyjnej z 5 V do bezpiecznego dla wej cia XMEGA napi cia Z drugiej stronyjedynka logiczna generowana przez procesor zasilany napi ciem 33 V jest poprawnierozpoznawana przez LCD pracuj cy z napi ciem 5 V Je li procesor by by zasilanybardzo niskim napi ciem (rz du 18 ndash 28 V) wymagany by by bardziej skompliko-wany konwerter co zosta o szerzej omoacutewione w rozdziale 7 ksi ki AVR Praktyczneprojekty

Wy wietlacze LCD wymagaj pod wietlenia bez tego wy wietlana zawarto jestpraktycznie nieczytelna W starszych konstrukcjach wykorzystywano pod wietleniew oparciu o lampy fluorescencyjne lub folie elektroluminescencyjne jednak obecniedominuj cym typem jest pod wietlenie za pomoc diod LED

Poniewa zasilamy diod LED wymagane jest do czenie szeregowego rezystoraCzasami taki rezystor jest wbudowany w modu LCD

Pod wietlenie tego typu zu ywa spor ilo energii Innym rozwi zaniem jest kupnowy wietlacza wykonanego w technologii OLED (ang Organic Light-Emitting Diode)Wy wietlacze tego typu cechuj si zdecydowanie lepszym kontrastem ale tak e wi k-sz szybko ci prze czania w zwi zku z czym mo na za ich pomoc uzyska o wielelepsze efekty animacji ktoacutere s praktycznie nieosi galne dla klasycznych wy wietlaczyLCD Nie maj one tak e innej wady LCD mdash zale no ci szybko ci prze czania seg-mentoacutew od temperatury

Wy wietlacze OLED nie maj wyprowadzonych pinoacutew odpowiedzialnych za pod-wietlenie mdash po prostu go nie wymagaj

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 47

Kolejn istotn kwesti jest pod czenie w a ciwego napi cia reguluj cego kontrastwy wietlacza Dla wi kszo ci modu oacutew LCD mie ci si ono w przedziale GND ndash Vcca dla modu oacutew o rozszerzonym zakresie temperatury w przedziale od ndash7 do 0 V mdashrysunek 221

Rysunek 221Pod czenie napi ciareguluj cego kontrasta) modu y klasyczneb) modu y o rozszerzonymzakresie temperatur

Napi cie ujemne mo na uzyska z prostej pompy adunkowej sterowanej przebiegiemPWM z procesora Poboacuter pr du z tego wej cia jest znikomo ma y Alternatywniemo na u y uk adu ICL7660 ktoacutery mo e generowa napi cia ujemne

Kolejn decyzj jak musimy podj jest sposoacuteb pod czenia modu u LCD z mikro-kontrolerem Mamy do wyboru dwie opcje mdash albo pod czamy wszystkie 8 linii da-nych (D0 ndash D7) albo tylko 4 najstarsze (D4 ndash D7) Pod czaj c tylko 4 linie danychzmniejszamy liczb niezb dnych po cze modu u z mikrokontrolerem oraz liczbwykorzystanych linii IO Ze wzgl du na znikom ilo danych przesy anych zdo mo-du u wynikaj ce z pod czenia tylko 4 linii danych spowolnienie transmisji jest bezznaczenia W trybie 4-bitowym najpierw transferowana jest starsza a potem m od-sza tetrada Niewykorzystane linie D0 ndash D3 mo na pozostawi niepod czone wi k-szo modu oacutew wewn trznie podci ga niepod czone linie poprzez rezystor do Vcc

Poniewa linie D0 ndash D7 s dwukierunkowe musimy pami ta aby podczas operacjiodczytu z LCD odpowiednie piny mikrokontrolera by y ustawione jako wej cia W prze-ciwnym przypadku dojdzie do konfliktu

Kolejnym sygna em co do ktoacuterego musimy podj decyzj jest sygna RW okre laj cytyp operacji (odczytzapis) Poniewa zwykle zapisujemy dane do LCD w a ciwie niezachodzi konieczno ich odczytywania mo emy ten sygna na sta e po czy z mas oszcz dzaj c w ten sposoacuteb jedn lini IO procesora Takie rozwi zanie ma jednak po-wa n wad mdash po jego zastosowaniu nie jest mo liwe odczytywanie sygna u zaj to cimodu u (ang busy flag) Powoduje to e pomi dzy kolejnymi zapisami do modu u mu-simy stosowa opoacute nienia dobrane na najwolniejsz mo liw okoliczno W efekcieca a transmisja jest wolniejsza ni mog aby by

Je li korzystamy z tych modu oacutew nie musimy pisa w asnych procedur ich obs ugiInstaluj c rodowisko WinAVR (lub nowy toolchain firmy Atmel) w katalogu docavr-libcexamplessdtiodemo znajdziemy gotowe funkcje obs ugi HD44780 Funkcjete nie dzia aj z mikrokontrolerami XMEGA st d te w za czonych przyk adach zosta-y one zmodyfikowane tak aby poprawnie wspoacute pracowa roacutewnie z tymi mikro-kontrolerami

Kup książkę Poleć książkę

48 AVR Uk ady peryferyjne

Mo emy te skorzysta z licznych przyk adoacutew dost pnych w internecie W dalszejcz ci rozdzia u zostan wykorzystane funkcje z pakietu WinAVR napisane przezJoerga Wunscha Pokazane przyk ady zak adaj e wy wietlacz jest po czonyz mikrokontrolerem tak jak na rysunku 222

Rysunek 222 Po czenie LCD z mikrokontrolerem Na goacuterze pod czenie do mikrokontroleraXMEGA na dole pod czenie do modu u Xplained Na schematach pokazano tak e opcjonalne sposobypod czenia pinu Vee odpowiedzialnego za regulacj kontrastu LCD

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 49

Zanim co wy wietlimy na LCD musimy pozna w jaki sposoacuteb s generowane znakiSterownik LCD zawiera w sobie niezale nie od typu u ytej matrycy 80 bajtoacutew pami ciDDRAM (ang Display Data RAM) Je li zastosowana matryca wy wietla mniejszliczb znakoacutew to cz komoacuterek pami ci jest nieu ywana Mo emy je wykorzystado innych celoacutew mdash np jako zwyk pami RAM Mo emy te u y jej do przesu-wania napisoacutew ktoacutere nie mieszcz si na wy wietlaczu Aby mo na by o umie ciznak na w a ciwej pozycji niezb dne jest poznanie organizacji pami ci kontrolera W za-le no ci od u ytej matrycy pami ta jest zorganizowana nast puj co

Dla matryc 16times1 mdash pami jest podzielona na dwa obszary ka dy zawieraj cypo 8 znakoacutew Obszar pierwszy (od lewej) ma adresy 0x00 do 0x07 a obszar drugi(prawy) adresy 0x40 do 0x47 St d te gdy wy wietla si tekst przekraczaj cygranic obszaroacutew nale y zadba aby poszczegoacutelne litery trafi y pod w a ciweadresy

Dla matryc 20times1 mdash adresy 0x00 do 0x13

Dla matryc 16times2 mdash adres pierwszej linii zaczyna si od 0x00 do 0x0f adresdrugiej linii od 0x40 do 0x4f

Dla matryc 20times2 mdash adresy pierwszej linii to 0x00 do 0x13 a drugiej 0x40 do 0x53

Dla matryc 40times2 mdash adresy pierwszej linii to 0x00 do 0x27 drugiej linii 0x40do 0x67

Dla matryc 20times4 mdash adresy pierwszej linii to 0x00 do 0x13 drugiej 0x40 do 0x53trzeciej 0x14 do 0x27 a czwartej 0x54 do 0x67

Jak wida w niektoacuterych typach wy wietlaczy po ka dej linii zostaje od kilku do kil-kunastu bajtoacutew ktoacuterych zawarto nie jest wy wietlana Ma to pewn zalet mdash mo-emy do pami ci modu u wpisywa teksty d u sze ni s wy wietlane na ekranie co

u atwia przewijanie tekstu Niestety ma to te pewn wad mdash funkcje wy wietlaj ceco na ekranie musz bdquowiedzie rdquo jak organizacj ma matryca W przeciwnym przy-padku nie ma mo liwo ci prawid owego wyliczenia adresu komoacuterki do ktoacuterej ma od-by si zapis

W dalszej cz ci rozdzia u zostanie wykorzystany modu LCD o organizacji 16times2(ale mo na te bez problemu wykorzysta dowolny inny)

Zanim b dzie mo na co wy wietli na ekranie modu musi zosta zainicjalizowanyW trakcie inicjalizacji ustawiane s podstawowe parametry pracy sterownika LCD mdashorganizacja matrycy (liczba linii) wielko czcionki (5times8 lub 8times11 pikseli) Wielkoczcionki zale y od typu pod czonej matrycy LCD Dla konkretnego modu u LCDtylko jedna z tych warto ci b dzie poprawna Oproacutecz inicjalizacji modu u nale y tak-e poprawnie ustawi stan pinoacutew IO wykorzystywanych do pod czenia modu u LCD

Wi kszo pracy zwi zanej z inicjalizacj modu u LCD odbieraniem i wysy aniemdo niego danych wykonuje biblioteka Joerga Wunscha Dostarcza ona niskopozio-mowe funkcje umo liwiaj ce komunikacj ze sterownikiem hd44780 i innymi kom-patybilnymi z nim sterownikami Wystarczy e do aplikacji w ktoacuterej planujemy wy-korzysta taki modu do czymy plik hd44780c oraz plik nag oacutewkowy hd44780h

Kup książkę Poleć książkę

50 AVR Uk ady peryferyjne

Oba pliki bdquozak adaj rdquo e istnieje plik nag oacutewkowy definesh zawieraj cy podstawo-we definicje zwi zane ze sposobem pod czenia modu u LCD z mikrokontroleremNa pocz tku nale y okre li ktoacutere linie IO zosta y wykorzystane do pod czenia modu u

define HD44780_RS A 4define HD44780_RW A 5define HD44780_E A 6define HD44780_D4 A 0

W powy szym przyk adzie do kolejnych linii portu A (A4 ndash A6) zosta y pod czonesygna y RS RW i E modu u natomiast do linii A0 ndash A3 linie D4 ndash D7 modu u LCD Wa nejest aby linie danych czy z pinami IO w kolejno ci rosn cej Biblioteka wykorzy-stuje do transmisji danych pomi dzy modu em a mikrokontrolerem tylko 4 linie danychmdash dzi ki temu mo emy zmniejszy liczb po cze a zwolnione linie IO wykorzystado innych celoacutew W pliku wyst puje jeszcze jedna definicja

define USE_BUSY_BIT 1

Okre la ona e biblioteka b dzie u ywa flagi Busy modu u LCD mdash umo liwia touzyskanie optymalnej szybko ci wspoacute dzia ania z modu em Zako czenie realizacjibie cej operacji modu sygnalizuje zmian stanu tej flagi co umo liwia niezw ocznewys anie kolejnej komendy Je li nie u ywamy flagi Busy program musi generowamaksymalne zalecane w nocie katalogowej opoacute nienia w efekcie ca a transmisja zwal-nia Po zdefiniowaniu u ywanych pinoacutew w pliku definesh mo emy rozpocz korzy-stanie z biblioteki

W pliku hd44780h s udost pnione prototypy funkcji odpowiedzialnych za wspoacute -prac z modu em LCD

Funkcje bibliotecznePodstaw modu u stanowi dwie funkcje umo liwiaj ce odpowiednio wys anie da-nych do modu u oraz ich odczytanie

void hd44780_outbyte(uint8_t b uint8_t rs)uint8_t hd44780_inbyte(uint8_t rs)

Obie funkcje wysy aj odczytuj 8-bitow dan w przypadku wykorzystania tylko4-bitowej szyny danych wysy anie i odczytywanie danych odbywa si w dwoacutech etapachDodatkowo zmienna rs okre la tryb dost pu W przypadku wysy ania danych do modu urs = 0 powoduje e dane zostan wys ane do rejestru komend a je li rs = 1 dane trafido rejestru danych Przy odczycie jest podobnie z tym e dla rs = 0 jest odczytywanaflaga Busy i rejestr AC (ang Address Counter)

Kolejna funkcja odpowiada za oczekiwanie na gotowo modu uvoid hd44780_wait_ready(bool islong)

W przypadku gdy w pliku definesh symbol USE_BUSY_FLAG ma warto 1 parametrislong jest ignorowany a optymalizator kompilatora usuwa go gdy nie jest on wy-korzystywany przez funkcj Kiedy warto USE_BUSY_FLAG jest roacute na od 1 parametr

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 51

ten okre la d ugo opoacute nienia Je li jest roacute na od 0 opoacute nienie wynosi 152 ms a je-eli jest roacutewna 0 opoacute nienie wynosi 37 s Poniewa lepiej jest u ywa flagi Busy

mo emy ten parametr ignorowa

Powy sze trzy funkcje wystarcz do komunikacji z modu em dla wygody zdefiniowanojednak kolejne Funkcje hd44780_outcmd(n) i hd44780_incmd() umo liwiaj odpowiedniowys anie polecenia do rejestru komend kontrolera lub odczytanie bitu Busy i licznikaAC Dwie kolejne mdash hd44780_outdata(n) oraz hd44780_indata() mdash umo liwiaj zapisi odczytanie rejestru danych

Oproacutecz funkcji odpowiedzialnych za komunikacj z modu em LCD zdefiniowano tak efunkcj przeprowadzaj c podstawow inicjalizacj modu u hd44780_init(void) orazfunkcj hd44780_powerdown(void) ustawiaj c wszystkie linie u yte do komunikacjiw stan 0 co umo liwia bezpieczne od czenie zasilania od modu u LCD W przypadkupozostawienia ktoacuterej z wy ej wymienionych linii w stanie 1 przy od czonym za-silaniu modu u stanowi ona jego zasilanie W efekcie mimo wy czenia modu mo epobiera znaczny pr d

Szerszego omoacutewienia wymaga funkcja hd44780_outcmd(cmd) ktoacutera umo liwia wys a-nie polecenia do rejestru polece sterownika LCD Dla wygody zdefiniowane zosta yroacute ne komendy u atwiaj ce wspoacute prac z modu em LCD Komendy te s przekazy-wane jako argument wywo ania funkcji hd44780_outcmd np

hd44780_outcmd(HD44780_CLR)

powoduje wys anie do sterownika polecenia HD44780_CLR czyszcz cego zawartopami ci DDRAM kontrolera

KomendyFunkcja hd44780_outcmd przyjmuje jako argument predefiniowane makrodefinicjeznacznie u atwiaj ce wspoacute prac z kontrolerem modu u LCD Poni ej zostan onepokroacutetce omoacutewione

HD44780_SHIFT(shift right)Ta makrodefinicja powoduje przesuni cie pozycji wy wietlanego tekstu (shift = 1)o jedn pozycj w lewo (argument right = 0) lub w prawo (argument right = 1)W przypadku gdy shift = 0 przesuwany w lewo lub prawo jest tylko kursor Wysy-aj c wielokrotnie to polecenie uzyskujemy kolejne przesuni cia o jedn pozycj

w lewo lub prawo Polecenie to s u y g oacutewnie do przesuwania tekstu Jednak ze wzgl duna du bezw adno tekstowych modu oacutew LCD nie nale y przesuwa liter cz ciej niok raz na sekund mdash cz stsze przesuwanie daje bardzo nieprzyjemne efekty wizual-ne Ka dy bufor linii jest bdquozawijanyrdquo to znaczy e po ostatnim znaku z prawej jestwy wietlany pierwszy znak z lewej i odwrotnie Nale y pami ta e d ugo buforajest sta a dla danego modelu matrycy Np dla modu oacutew 16times2 bufor jednej linii wyno-si dok adnie 40 bajtoacutew z czego 16 jest jednorazowo wy wietlanych Poni szy kodcyklicznie przewija wy wietlany tekst w lewo

lcd_puttext_P(PSTR(Test bufora i przewijania tekstunTen tekst przewija sie w lewo))while(1)

Kup książkę Poleć książkę

52 AVR Uk ady peryferyjne

hd44780_outcmd(HD44780_SHIFT(10)) _delay_ms(700)

HD44780_FNSET(if8bit twoline font5x10)Polecenie to wybiera typ interfejsu mdash 8-bitowy je li warto parametru if8bit jestroacutewna 1 lub 4-bitowy je li jest roacutewna 0 Typ interfejsu musi odpowiada sposobowipo czenia modu u z mikrokontrolerem Parametr twoline okre la czy pod czonamatryca LCD ma jedn lini znakoacutew czy dwie Matryce ktoacutere maj 4 linie tekstu straktowane przez kontroler jako matryce dwuliniowe mdash parametr twoline powinienmie warto 1 Je li dla matrycy zawieraj cej dwie lub wi cej linii ustawimy go na 0to wy wietlana b dzie tylko jedna linia (w przypadku matryc dwuliniowych goacuterna)a w przypadku matryc 4-liniowych b d wy wietlane dwie linie rozdzielone lini pust

Ostatni parametr okre la typ u ywanego generatora znakoacutew Powinien on odpowiadau ytej w module matrycy zwykle wi c jego warto wynosi 0

HD44780_DISPCTL(disp cursor blink)Ustawia roacute ne parametry pracy matrycy Je li parametr disp ma warto 1 to matrycajest w czona (wy wietla zawarto DDRAM) a je li 0 to matryca jest wy czonalecz stan pami ci DDRAM nie ulega zmianie Np kod

while(1) hd44780_outcmd(HD44780_DISPCTL(011)) _delay_ms(700) hd44780_outcmd(HD44780_DISPCTL(111)) _delay_ms(700)

powoduje naprzemienne w czanie i wy czanie matrycy w efekcie wy wietlany tekstmruga

Parametr cursor okre la czy sprz towo wy wietlany kursor ma by widoczny (war-to parametru 1) czy niewidoczny (warto parametru 0) Je li kursor jest widocznyto dodatkowo mo emy okre li czy ma miga (warto parametru blink roacutewna 1)czy nie (blink = 0) Je li kursor jest widoczny i nie miga jest wy wietlany w postacipoziomej kreski Wy wietlanie kursora mo e by u yteczne w sytuacji kiedy u yt-kownik wprowadza jakie dane W pozosta ych sytuacjach kursor mo emy wy czy

HD44780_ENTMODE(inc shift)Okre la sposoacuteb wprowadzania danych do pami ci Je li parametr inc ma warto 1 topo ka dej operacji zapisuodczytu adres pami ci jest automatycznie zwi kszany o je-den co przy piesza operacj zapisuodczytu kolejnych znakoacutew Je li warto inc jestroacutewna 0 to adres jest automatycznie zmniejszany o 1 Dodatkowo parametr shiftokre la czy wy wietlany obraz ma by automatycznie przesuwany tak aby wy wie-tla ostatnio wprowadzony znak (shift = 1) lub go nie wy wietla (shift = 0)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 53

HD44780_CLRPowoduje wyczyszczenie (wype nienie znakami o kodzie 32) ca ej zawarto ci pami ciDDRAM Jednocze nie kursor wraca do pozycji pierwszej (pierwsza linia pierwszyznak)

Niewy wietlane bajty pami ci DDRAM tak e s kasowane Je li s one u ywanedo przechowywania zmiennych programu to przed operacj kasowania nale y jeskopiowa w bezpieczne miejsce W przeciwnym przypadku zostan utracone

Wska nik adresu do pami ci DDRAM jest ustawiany na 0 zerowane jest tak e prze-suni cie

HD44780_HOMEPowoduje powroacutet kursora do pozycji pocz tkowej mdash pierwsza linia pierwszy znakWska nik adresu do pami ci DDRAM w efekcie zawiera 0 zerowane jest roacutewnieprzesuni cie wy wietlania znakoacutew w efekcie s one wy wietlane od pozycji 0

HD44780_DDADDR(addr)Ustawia nast pny adres zapisuodczytu w pami ci DDRAM na addr Tylko 7 bitoacutewargumentu addr jest branych pod uwag w zwi zku z czym mo na zaadresowa mak-symalnie 128 bajtoacutew pami ci (z czego sterownik ma tylko 80 pozosta e lokacje snieu ywane)

HD44780_CGADDR(addr)Ustawia nast pn operacj odczytuzapisu w pami ci CGRAM na addr Pod uwagbranych jest tylko 6 bitoacutew zmiennej addr w efekcie mo na zaadresowa maksymalnie64 bajty pami ci CGRAM

Przedstawione powy ej funkcje zapewniaj jedynie podstawow komunikacj z mo-du em LCD Potrzebujemy jednak ci gle funkcji odpowiedzialnej za jego inicjalizacjmdash funkcja biblioteczna przeprowadza ten proces tylko w podstawowym zakresie musi-my jeszcze zadba o w a ciwe ustawienie parametroacutew zwi zane z posiadan matryc Napiszmy wi c w asne rozwini cie funkcji inicjalizacyjnej

void lcd_init() hd44780_init() Podstawowa inicjalizacja modu u hd44780_outcmd(HD44780_CLR) Wyczy pami DDRAM hd44780_wait_ready(1000) hd44780_outcmd(HD44780_ENTMODE(1 0)) Tryb autoinkrementacji AC hd44780_wait_ready(1000) hd44780_outcmd(HD44780_DISPCTL(1 0 0)) W cz wy wietlacz wy cz kursor hd44780_wait_ready(1000)

Zauwa e po wys aniu ka dego polecenia do modu u jest wywo ywana funkcjahd44780_wait_ready(1000) odpowiedzialna za oczekiwanie a realizacja wys anego po-lecenia dobiegnie ko ca Jest to niezb dne gdy do czasu uko czenia bie cej

Kup książkę Poleć książkę

54 AVR Uk ady peryferyjne

operacji dalsze polecenia s ignorowane Jako argument podany jest parametr 1000mdash jest on bez znaczenia nasza biblioteka korzysta z flagi Busy i po prostu go ignorujePo wykonaniu powy szej funkcji modu LCD jest poprawnie zainicjalizowany a jegopami jest wyczyszczona (zawiera bajty 0x20) i w efekcie modu nic nie wy wietlaOd tej chwili mo emy wysy a znaki do wy wietlenia

Po wykonaniu inicjalizacji ekran mo e pozosta czysty lub wy wietla ca kowiciewype nione kwadraty (wszystkie piksele w czone) Je li po inicjalizacji wszystkiepiksele s w czone nale y nieco zmniejszy kontrast

Aby sobie u atwi to zadanie zdefiniujmy funkcj wysy aj c do modu u jeden znakvoid lcd_putchar(char c) static bool second_nl_seen static uint8_t line=0

if ((second_nl_seen) ampamp (c = n)ampamp(line==0)) Odebrano pierwszy znak hd44780_wait_ready(40) hd44780_outcmd(HD44780_CLR) hd44780_wait_ready(1600) second_nl_seen=false if (c == n) if (line==0) line++ hd44780_outcmd(HD44780_DDADDR(64)) Adres pierwszego znaku drugiej linii hd44780_wait_ready(1000) else second_nl_seen=true line=0 else hd44780_outdata(c) hd44780_wait_ready(40)

Funkcja ta ze wzgl du na skomplikowane adresowanie pami ci DDRAM jest zale naod konkretnego modelu modu u LCD B dzie prawid owo wspoacute pracowa z modu a-mi 2times16 2times20 i 2times40 znakoacutew W przypadku innych modu oacutew pozycje niektoacuterychznakoacutew mog by nieprawid owe

Mo emy ju wy wietla na LCD pojedyncze znaki czas na wy wietlanie tekstu Po-niewa teksty jako sta e dla zaoszcz dzenia cennej pami ci RAM przechowuje si za-zwyczaj w pami ci FLASH zdefiniujmy funkcj odczytuj c podany a cuch zna-kowy z pami ci FLASH a nast pnie umieszczaj c go na LCD

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 55

void lcd_puttext_P(prog_char txt) char ch while((ch=pgm_read_byte(txt))) lcd_putchar(ch) txt++

Powy sza funkcja wysy a kolejne znaki odczytane z pami ci FLASH na LCD za po-moc funkcji LCD_putchar Po napotkaniu znaku ko ca a cucha (0 nul) przerywa swojedzia anie

Pozostaje nam przetestowa dzia anie przedstawionych funkcjiint main() lcd_init() lcd_puttext_P(PSTR(Test LCDnDruga linia)) while(1)

Na ekranie modu u LCD powinien wy wietli si napisTest LCDDruga linia

Je li na LCD nic nie widzimy to w pierwszej kolejno ci powinni my sprawdzi kon-trast zmieniaj c napi cie na pinie Vee modu u LCD

Warto zdefiniowa jeszcze funkcj ustawiaj c pozycj od ktoacuterej b dzie wy wietlanynast pny znak

void lcd_goto(uint8_t x uint8_t y) hd44780_outcmd(HD44780_DDADDR(0x40y+x)) hd44780_wait_ready(1000)

Funkcja ta przyjmuje dwa parametry x i y okre laj ce pozycj na ktoacuterej zostaniewy wietlony nast pny znak wys any z mikrokontrolera do modu u LCD Dzi ki temuz atwo ci mo emy uaktualnia zawarto LCD bez konieczno ci ponownego prze-sy ania wszystkich danych Funkcja ta jest zale na od typu zastosowanego modu u

Ostatni funkcj jest funkcja umo liwiaj ca czyszczenie zawarto ci pami ci modu uOdpowiedzialne za to jest proste polecenie wysy ane do sterownika

void lcd_cls() hd44780_outcmd(HD44780_CLR) hd44780_wait_ready(false)

Oproacutecz czyszczenia zawarto ci pami ci modu u powoduje ono ustawienie kursoraw punkcie (00)

Kup książkę Poleć książkę

56 AVR Uk ady peryferyjne

Definiowanie w asnych znakoacutewUk ad HD44780 jest wyposa ony w 64 bajty pami ci CGRAM (ang Character Ge-nerator RAM) ktoacutera mo e przechowywa mapy bitowe 8 znakoacutew o matrycy 5times8 pikselilub 4 znakoacutew o matrycy 5times10 pikseli Przyk ad definicji znaku na matrycy 5times8 poka-zano na rysunku 223

Rysunek 223Przyk ad definicji w asnego znakuw pami ci CGRAM Znak rysujemyna matrycy 5times8 bitoacutew polazaciemnione odpowiadaj warto ci 1pola bia e warto ci 0 Wartowyliczon dla ka dej linii pikseliwpisujemy do pami ci CGRAMsterownika Najstarsze 3 bity ka degobajta (pola szare) s bez znaczeniamdash wy wietlacz pomija jeprzy wy wietlaniu obrazu

1

2

3

4

5

6

7

0 00100 = 4

01110 = 14

11111 = 31

00100 = 4

00100 = 4

00100 = 4

11111 = 31

01110 = 14

Adres Warto

Dost p do tej pami ci jest mo liwy dzi ki wys aniu polecenia ustawiaj cego adreszapisuodczytu pami ci CGRAM Po jego wys aniu wszystkie operacje zapisu i od-czytu dotycz tej pami ci a nie pami ci DDRAM Aby wroacuteci do adresowania pa-mi ci DDRAM nale y wybra jej adres lub dokona operacji wymagaj cej przesu-ni cia kursora

Pami CGRAM jest pami ci ulotn po ponownym w czeniu zasilania definicjeznakoacutew musz by ponownie przes ane przez procesor

Bity o warto ci 1 w definicji znaku odpowiadaj w czonym pikselom bity o warto-ci 0 pikselom wy czonym Najstarsze 3 bity ka dego bajta w pami ci CGRAM s

bez znaczenia mdash te pozycje nie s wy wietlane przez matryc Definiuj c znak nale-y tak e pami ta e ostatnia linia wy wietlana przez matryc (w zale no ci od wiel-

ko ci matrycy znaku linia 8 lub 10) powinna zawiera same zera mdash w tej linii b dziewy wietlany kursor

Najcz ciej matryce LCD pod czone do sterownika HD44780 maj organizacj 5times8czyli jeden znak jest definiowany przez 8 kolejnych bajtoacutew okre laj cych stan po-szczegoacutelnych linii tworz cych znak Stwoacuterzmy funkcj ktoacuterej zadaniem b dzie za a-dowanie definicji znakoacutew z pami ci FLASH mikrokontrolera do pami ci CGRAM

void lcd_defchar_P(uint8_t charno prog_uint8_t chardef) hd44780_outcmd(HD44780_CGADDR(charno8)) hd44780_wait_ready(40) for(uint8_t c=0clt8c++) hd44780_outdata(pgm_read_byte(chardef))

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 57

hd44780_wait_ready(40) chardef++

Funkcja LCD_defchar_P jako argumenty przyjmuje numer definiowanego znaku (0 ndash 7)oraz wska nik do obszaru pami ci FLASH zawieraj cego definicj znaku (obszarten zajmuje 8 nast puj cych po sobie bajtoacutew) Jak widzimy funkcja najpierw ustawiaw a ciwy adres pod ktoacuterym znajdzie si pocz tek definicji znaku w pami ci CGRAMmdash poniewa jeden znak jest opisywany za pomoc 8 bajtoacutew kolejne adresy znakoacutewto kod_znakutimes8 Nast pnie dane opisuj ce znak s adowane z pami ci mikrokontrolerai zapisywane w pami ci CGRAM sterownika Poni szy program ilustruje wykorzy-stanie funkcji LCD_defchar_P

prog_uint8_t char1[8][8]=0000000255 00000025525500000255255255 0000255255255255 00025525525525525500255255255255255255 0255255255255255255255255255255255255255255255

int main() for(uint8_t x=0xlt8x++) lcd_defchar_P(xampchar1[x][0]) Za aduj wzorce znakoacutew lcd_init() for(uint8_t x=0xlt8x++) lcd_putchar(x) Wy wietl znaki o kodach 0 ndash 7 while(1)

W pierwszej linii funkcji main nast puje za adowanie nowych definicji znakoacutew dopami ci CGRAM nast pnie inicjalizowany jest wy wietlacz po czym w pierwszejlinii s wy wietlane znaki o kodach 0 ndash 7 a wi c znaki ktoacuterych definicja zosta aprzes ana z mikrokontrolera

Zauwa e pami CGRAM podobnie jak DDRAM mo emy zapisywa i odczytywaprzed inicjalizacj modu u LCD Proces inicjalizacji jest potrzebny tylko do prawi-d owego wy wietlania na ekranie LCD

Poniewa dane potrzebne do wy wietlenia znaku s na bie co pobierane z pami cipodczas od wie ania matrycy LCD jakiekolwiek zmiany w definicji znaku kiedy jest onwidoczny na LCD poci gaj za sob natychmiastowe zmiany w wy wietlanym obrazieMo na t w a ciwo sterownika wykorzysta do stworzenia prostych animacji

void lcd_box(uint8_t y) hd44780_outcmd(HD44780_CGADDR(0)) Zaczynamy od znaku o kodzie 0 hd44780_wait_ready(40) for(uint8_t c=0cltyc++) Stwoacuterz linie z w czonymi pikselami hd44780_outdata(0xFF) hd44780_wait_ready(40) for(uint8_t c=yclt8c++) Stwoacuterz linie z wy czonymi pikselami hd44780_outdata(0x00) hd44780_wait_ready(40)

Kup książkę Poleć książkę

58 AVR Uk ady peryferyjne

int main() lcd_init() lcd_putchar(0) while(1) for(uint8_t x=0xlt8x++) lcd_box(x) _delay_ms(100) for(int8_t x=7xgt=0x--) lcd_box(x) _delay_ms(100)

Funkcja main wy wietla na LCD tylko jeden znak o kodzie 0 a nast pnie cykliczniezmienia jego definicj w pami ci CGRAM W efekcie posta znaku wy wietlana naekranie ci gle si zmienia

Transakcyjna obs uga LCDPokazana do tej pory obs uga LCD alfanumerycznego mia a pewne wady Jak wiemyoperacje odwo uj ce si do kontrolera LCD s niezwykle wolne cykl odczytuzapisudowolnego rejestru kontrolera trwa co najmniej 1600 ns co dla MCU taktowanegozegarem 32 MHz przek ada si na czas wykonania oko o 52 instrukcji asemblera Cogorsza wi kszo komend realizowanych przez kontroler jest wykonywana w czasieoko o 37 s co przek ada si na tysi ce zmarnowanych taktoacutew MCU St d te jaki-kolwiek zapisodczyt LCD to z perspektywy programu straszne marnotrawstwo czasu

Problem ten dotyczy ka dego urz dzenia IO ktoacutere dzia a wolniej ni procesor W takiejsytuacji warto napisa pewn warstw po redni mdash sterownik mdash ktoacuterego zada-niem b dzie buforowanie da dost pu do urz dzenia i rozstrzyganie konfliktoacutewdzi ki czemu roacute ne cz ci programu b d bdquomia y wra enierdquo e maj wy czny do-st p do urz dzenia

Pokazane wcze niej funkcje obs ugi LCD maj jeszcze jedn wad mdash nie s wspoacute bie -ne czyli nie mo na ich wykonywa jednocze nie w kilku miejscach programu w tymw szczegoacutelno ci w programie g oacutewnym i w funkcjach obs ugi przerwa W wielu przy-padkach ta wada jest bez znaczenia jednak czasami jest uci liwa mdash dla przyk adugdy na wy wietlany tekst chcieliby my na o y inne informacje np o dacie lub godzi-nie Oczywi cie wy wietlanie mo na zorganizowa tak aby nie by o potrzeby pisaniawspoacute bie nego kodu np poprzez zastosowanie bufora pami ci VRAM kontrolera LCDRodzi to jednak kolejne problemy i jest ma o eleganckie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 59

Zastanoacutewmy si w jaki sposoacuteb najlepiej jednocze nie rozwi za problem wolnegodost pu do urz dzenia i wspoacute bie no ci kodu Rozwi zaniem mo e by wprowadze-nie tzw transakcji Transakcj nazywamy zbioacuter operacji tworz cych pewn ca-o To co wyroacute nia tak wykonywany zestaw operacji to atomowo spoacutejno

izolacja i trwa o Pod tymi terminami kryje si istota wykonywanej operacji Ato-mowo transakcji zapewnia e jest ona wykonywana w sposoacuteb niepodzielny co gwa-rantuje nam prawid ow wspoacute prac z danym urz dzeniem IO w tym przypadku kon-trolerem LCD Wa na dla nas jest tak e izolacja mdash dzi ki temu inne operacje na LCD(inne transakcje) nie b d mia y wp ywu na wynik aktualnie wykonywanej transakcjimdash nie b d zak oacuteca y jej wykonania z drugiej strony nasza transakcja nie zak oacuteciwykonania innych Trwa o z kolei zagwarantuje nam e je li sterownik potwierdziwykonanie transakcji to znaczy e efekt jej dzia ania jest wy wietlony na LCD Tacecha nie jest nam a tak potrzebna mdash jest ona wydawa oby si oczywista Niemniej jestto pewna gwarancja e ca a operacja przebieg a poprawnie i w efekcie LCD znajdujesi w okre lonym przez nas stanie Tyle teorii przejd my do praktyki

Kody poni szego przyk adu znajduj si w katalogu PrzykladyLCD-alfaLCD-transact

Aby zapewni transakcyjny dost p do LCD musimy stworzy pewne struktury danychktoacuterych zadaniem b dzie przechowywanie informacji o operacjach sk adaj cych sina transakcje i stanie ich wykonania W tym celu pos u ymy si wiadomo ciami z roz-dzia u 5 bdquoJak uporz dkowa chaos czyli z o one typy danych i listyrdquo Do przecho-wywania oczekuj cych transakcji pos u ymy si buforem pier cieniowym zanimjednak go zaimplementujemy zastanoacutewmy si jak powinna wygl da struktura prze-chowuj ca informacje o transakcji Struktura ta powinna zawiera co najmniej

pole danych (data) z informacjami ktoacutere maj by przes ane do kontrolera LCD

pole okre laj ce liczb danych do wys ania (len)

pole okre laj ce realizowane polecenie dla LCD (cmd) mdash pole to pos u yprogramowi sterownika do w a ciwej interpretacji danych znajduj cych siw polu data

kilka poacutel kontrolnych przechowuj cych informacje potrzebne do realizacjisamej transakcji Jedno z nich mdash Ready mdash b dzie przyjmowa warto trueje li dana transakcja zosta a zrealizowana lub false w przeciwnym przypadkuZnaczenie drugiego pola mdash SelfDel mdash mo e wydawa si nieco enigmatycznepole to okre la czy pami przydzielona dla transakcji ma by zwolnionaw sterowniku LCD (warto true) czy te zostanie zwolniona w programie(warto false)

Oto jak mo e wygl da struktura definiuj ca transakcj typedef struct volatile bool Ready 1 true je li transakcja zosta a zrealizowana bool SelfDel 1 true je li pami przydzielona transakcji ma zosta zwolniona LCD_Cmd cmd 2 Polecenie do zrealizowania uint8_t len 6 D ugo polecenia

Kup książkę Poleć książkę

60 AVR Uk ady peryferyjne

unsigned 0 Wyroacutewnanie do granicy bajta uint8_t data[] Dane transakcji LCD_trans

Nale y zwroacuteci uwag na poleunsigned 0

Nie definiuje ono adnego pola struktury ale jedynie informuje kompilator e kolejnepole (w naszym przyk adzie o nazwie data) ma by wyroacutewnane do granicy bajta mdashdzi ki temu dost p do kolejnego pola b dzie odbywa si szybciej Z kolei samo poledata jest zadeklarowane jako tzw typ niekompletny

Typ niekompletny (ang incomplete type) to typ ktoacuterego rozmiaru nie da si okre li

W pokazanym przyk adzie rozmiaru pola data nie da si okre li gdy zosta on za-deklarowany jako typ tablicowy z tym e nie podano wielko ci tablicy Wielko ci niepodano gdy na etapie deklaracji struktury nie wiemy jakiej wielko ci dane b d w niejprzechowywane Tego typu deklaracja ma bardzo powa ne konsekwencje mdash skorowielko ci pola data nie da si okre li to jaki b dzie wynik dzia ania operatora sizeof(LCD_trans) Kompilator stara si jako wybrn z tej sytuacji w zwi zku z czym

zwroacuteci wielko struktury ale tak jakby pole data w ogoacutele nie istnia o mdash jego roz-miar b dzie wynosi 0 W ramach wiczenia zastanoacutew si ile bajtoacutew pami ci b dziezajmowa a struktura LCD_trans

Skoro dysponujemy ju struktur przechowuj c poszczegoacutelne transakcje pora nastworzenie obiektu przechowuj cego kolekcj transakcji Dodanie kolejnej strukturyb dzie polega o na dodaniu jej do takiego obiektu z drugiej strony program sterownikaLCD b dzie moacuteg z tej kolekcji pobiera kolejne transakcje do realizacji Opis ten przy-pomina opis dzia ania bufora pier cieniowego mdash z jednym wyj tkiem mdash po zape nie-niu ca ego bufora nie b dziemy usuwa niezrealizowanych transakcji lecz zabloku-jemy dodawanie kolejnych W tym celu pos u ymy si definicj nast pnej struktury

typedef struct LCD_trans elements[LCD_MAXTRANS] Wska niki do transakcji uint8_t Beg Pierwszy element bufora uint8_t Count Liczba elementoacutew w buforze CircBuffer

Struktura ta zawiera deklaracj tablicy wska nikoacutew na transakcje (pole elements)Poniewa jest to tablica musimy zna liczb jej elementoacutew mdash jest ona zadeklarowanaw sta ej LCD_MAXTRANS

define LCD_MAXTRANS 10 Maksymalna liczba pami tanych transakcji

Do realizacji bufora s potrzebne jeszcze dwa pola Beg wskazuj ce na pierwsztransakcj w buforze oraz pole Count okre laj ce liczb transakcji znajduj cych siw buforze Je li Count == 0 to znaczy e w buforze nie ma adnych oczekuj cychtransakcji a je li Count == LCD_MAXTRANS to znaczy e bufor jest pe ny i nie mo na

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 61

dodawa do niego kolejnych transakcji W a ciwo t wykorzystuj dwie zdefiniowanew pliku LCD_transc funkcje

static inline bool cbIsFull(CircBuffer cb) return cb-gtCount == LCD_MAXTRANS

static inline bool cbIsEmpty(CircBuffer cb) return cb-gtCount == 0

Jak pami tamy w przypadku funkcji modyfikatory static inline powoduj e danafunkcja nie b dzie istnie jako samodzielna lecz w ka dym miejscu w ktoacuterym jestwywo ywana jest wstawiany raczej jej kod a nie wywo anie Ma to znaczenie dlakroacutetkich funkcji (a wi c takich jak pokazane powy ej) dla ktoacuterych koszty wywo anias zazwyczaj wi ksze ni koszty umieszczenia cia a funkcji w miejscu jej wywo aniaTego typu funkcje zachowuj si w sposoacuteb zbli ony do makrodefinicji (z tym e re-spektuj wszystkie regu y j zyka C w szczegoacutelno ci kolejno operatoroacutew czy kon-trol typoacutew)

Takie funkcje jako argument pobieraj adres bufora na ktoacuterym maj operowa W na-szym przypadku bufor jest zdefiniowany nast puj co

static CircBuffer LCD_TransBuffer Bufor na transakcje

Nale y zauwa y e jest on zdefiniowany jako struktura globalna z modyfikatoremstatic Modyfikator ten ogranicza zasi g widoczno ci zmiennej LCD_TransBuffer dopliku w ktoacuterym zmienna ta zosta a zdefiniowana (w tym przypadku modyfikator staticjest niejako przeciwie stwem modyfikatora extern) Dzia anie to ma jedynie znaczeniekosmetyczne mdash uniemo liwia odwo anie si do bufora za pomoc funkcji ktoacutere niezosta y zdefiniowane w miejscu jego definicji Oproacutecz funkcji umo liwiaj cych okre-lenie stanu bufora potrzebne s jeszcze funkcje umo liwiaj ce dodanie i pobranie trans-

akcji Pierwsz funkcj b dzie funkcja dodaj ca transakcj do buforabool cbAdd(CircBuffer cb LCD_trans elem) ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsFull(cb)) return false Czy jest miejsce w kolejce uint8_t end = (cb-gtBeg + cb-gtCount) LCD_MAXTRANS cb-gtelements[end] = elem Dodaj transakcj ++cb-gtCount Liczba elementoacutew w buforze return true Wszystko OK

Funkcja ta dodaje transakcj (zmienna elem) do bufora ko owego Zanim transakcjazostanie dodana sprawdzane jest czy w buforze jest miejsce mdash je li nie funkcjazwroacuteci false Je li dodanie jest mo liwe warto licznika okre laj cego liczb trans-akcji przechowywana w buforze (Count) zwi ksza si o jeden Warto zastanowi si te dlaczego praktycznie ca e cia o tej funkcji jest zamkni te w sekcji atomowej (ATOMIC_BLOCK) Jedn z cech naszego sterownika ma by mo liwo wspoacute bie nego dost pu

Kup książkę Poleć książkę

62 AVR Uk ady peryferyjne

do LCD mdash to znaczy e danie np zapisu do LCD mo e wyst pi zaroacutewno w g oacutewnejp tli programu jak i asynchronicznie w przerwaniu St d te wynika e funkcja do-daj ca transakcj musi by napisana w sposoacuteb zapewniaj cy jej poprawn prac w sytu-acji gdy zostanie ona przerwana i ponownie wywo ana przed zako czeniem dzia aniajej poprzedniej instancji Umieszczenie cia a tej funkcji w sekcji atomowej nam to za-pewnia mdash dzi ki temu bufor transakcji zawsze b dzie spoacutejny Dla zaspokojenia cie-kawo ci warto usun sekcj atomow i sprawdzi jak wtedy b dzie zachowywa si tafunkcja i jak wp ynie to na spoacutejno przechowywanych danych

Drug niezb dn funkcj jest funkcja odczytuj ca bufor transakcji i zwracaj ca trans-akcj do zrealizowania (lub NULL je li adnej transakcji nie ma w buforze)

LCD_trans cbRead(CircBuffer cb) LCD_trans elem ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsEmpty(cb)) return NULL Bufor pusty nie mo na zwroacuteci elementu elem = cb-gtelements[cb-gtBeg] cb-gtBeg = (cb-gtBeg + 1) LCD_MAXTRANS -- cb-gtCount Zmniejszamy liczb elementoacutew pozosta ych w buforze return elem

Funkcja ta jest bardzo podobna do poprzedniej mdash najpierw sprawdza czy bufor za-wiera jak oczekuj c transakcj (cbIsEmpty(cb)) je li tak to zwraca adres opisuj -cej j struktury i zmniejsza liczb transakcji oczekuj cych (pole Count) W ten sposoacutebmamy zrealizowan ca funkcjonalno zwi zan z obs ug bufora pier cieniowegoPokazane funkcje s uniwersalne i z bardzo podobnych (lub wr cz tych samych) b -dziemy korzysta w kolejnych rozdzia ach w kontek cie np obs ugi transakcji zwi -zanych z interfejsami szeregowymi

Pora przej do samego sterownika LCD Jego zadaniem b dzie sprawdzenie czyw buforze oczekuj jakie transakcje do realizacji a je li tak to ich wykonanie Ponie-wa dane do LCD mog by wysy ane co okre lony minimalny czas znacznie d u -szy ni czas jakiego na to zadanie potrzebuje mikrokontroler do wysy ania kolejnychpaczek danych pos u ymy si timerem Timer b dzie generowa przerwanie nadmiaru(TCD0_OVF_vect) ktoacutere b dzie wyznacza o tempo w jakim kolejne porcje danych b -d trafia y do LCD Z noty katalogowej kontrolera wynika e minimalny czas trwa-nia wysokiego stanu sygna u Enable to 230 ns a okres tego sygna u nie powinien bykroacutetszy ni 500 ns Poniewa nasz dost p do LCD odbywa si w sposoacuteb nieblokuj cyMCU wi c szybko wysy ania danych do LCD jest bez znaczenia St d te w poka-zanym przyk adzie przyj to e dane b d wysy ane co 4 s co okre la sta a

define LCD_ACCESSTIME 0000004

Poniewa komunikacja z LCD odbywa si w sposoacuteb nieblokuj cy nie zale y nam tena czasie (i tak w stosunku do czasu od wie ania samego LCD jest on bardzo kroacutetki)w efekcie nie ma potrzeby odczytywania flagi busy kontrolera Dzi ki temu w cz ciprzypadkoacutew mo emy w ogoacutele zrezygnowa z sygna u wyboru RW i wymusi jego sta y

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 63

poziom logiczny umo liwiaj cy zapis do LCD Dzi ki temu mo na zaoszcz dzi do-datkowy pin IO1

Ca a logika naszego sterownika jest zawarta w funkcji obs ugi przerwania przepe nieniatimera (TCD0_OVF_vect) Poniewa LCD jest po czony z MCU w trybie 4-bitowym(dla zaoszcz dzenia liczby wykorzystanych pinoacutew IO) kolejne 8-bitowe dane muszby podzielone na dwie tetrady i wys ane do LCD w kolejno ci starszam odsza tetradaInformacja o aktualnie wysy anych danych jest umieszczona w zmiennej trans o typie

static struct uint8_t pos 6 Pozycja w polu danych aktualnej transakcji uint8_t nibble 1 Ktoacutera tetrada jest wysy ana seq

Dlaczego tak Dzi ki wykorzystaniu struktury i poacutel bitowych mo na zaoszcz dzi je-den bajt pami ci SRAM Ze wzgl du na wielko pami ci obs ugiwanej przez kon-troler LCD mo emy by pewni e transakcje zawieraj ce wi cej ni 63 bajty s ra-czej nierealne (nie mia yby wi kszego sensu) St d te do przechowywania informacjio aktualnie wysy anym bajcie danych wystarczy 6 bitoacutew mdash tyle samo zosta o wyko-rzystanych do okre lenia d ugo ci pola danych transakcji w strukturze LCD_trans Zaosz-cz dzony bit mo na po wi ci na flag nibble okre laj c ktoacutera tetrada (m odszastarsza)jest wysy ana Bez poacutel bitowych flaga ta zaj aby dodatkowy bajt pami ci

Przejd my do implementacji sterownika Pierwsz rzecz jak nale y sprawdzi jestto czy w buforze czeka jaka transakcja do zrealizowania Odpowiedzialny za to jestfragment kodu obs ugi przerwania nadmiaru timera

if(trans == NULL) Nic do zrobienia sprawd my czy jaka transakcja oczekuje trans=cbRead(ampLCD_TransBuffer) Czy jest jaka oczekuj ca transakcja seqpos=0 seqnibble=0 if(trans == NULL) TCD0_CTRLA=TC_CLKSEL_OFF_gc Nie ma adnych transakcji mdash wy cz timer

W przypadku gdy adna transakcja nie oczekuje na realizacj timer jest wy czanymdash dzi ki temu nie b d zg aszane kolejne przerwania przepe nienia i MCU nie b -dzie traci czasu na ich obs ug Co prawda wynikaj cy z tego zysk czasowy jest mar-ginalny lecz ma to istotniejsz konsekwencj mdash w przypadku usypiania MCU zb d-ne przerwanie timera nie b dzie niepotrzebnie wybudza o procesora W takiej sytuacjiponowne w czenie timera nast pi dopiero w funkcji dodaj cej transakcj do kolejkimdash a wi c w sytuacji gdy mamy pewno e istnieje oczekuj ca transakcja

Druga cz funkcji obs ugi przerwania jest zwi zana z realizacj samej transakcjiW pokazanym przyk adzie zaimplementowano tylko jeden typ transakcji mdash daniezapisu a cucha tekstowego pod wskazany adres VRAM (na okre lonej pozycji LCD)Je li zajdzie taka potrzeba programista mo e zaimplementowa inne polecenia i doda

1 Warto zauwa y e w bdquoklasycznejrdquo obs udze LCD te nie musimy czyta stanu flagi busy zamiast tego

wystarczy wprowadza p tle opoacute niaj ce Jednak poniewa taka obs uga blokuje MCU nie jest onazalecana Wady tej nie ma dost p transakcyjny co jest jego dodatkow zalet

Kup książkę Poleć książkę

64 AVR Uk ady peryferyjne

kod odpowiedzialny za ich obs ug Zauwa my e ka da transakcja musi zawieraadres pocz tku pami ci wideo od ktoacuterego b dzie zapisywany tekst Dzieje si takdlatego e transakcja wykonana wcze niej mo e ustawi wska nik zapisu na dowolnejkomoacuterce pami ci W efekcie tekst z kolejnej transakcji by by wy wietlany od komoacuterkina ktoacuterej zako czy si zapis poprzedniej transakcji Takie dzia anie oczywi cie jestniedopuszczalne st d te ka dy zapis do pami ci wideo poprzedza ustawienie rejestruindeksowego Problem ten mo na rozwi za tak e w inny sposoacuteb mdash poprzez wpro-wadzenie tzw uchwytoacutew (ang handlers) ktoacutere zawiera yby stan kontrolera LCDNiemniej to rozwi zanie dodatkowo komplikowa oby nasz sterownik Struktura danych(zawartych w polu data) ma wi c nast puj cy format

bajt nr 0 zawiera warto pozycji od ktoacuterej nale y dokonywa zapisu pami ciwideo mdash jest to warto przesy ana do rejestru okre laj cego adres zapisu

kolejne bajty zawieraj a cuch znakowy ktoacutery nale y umie ci w pami ciCGRAM

Poniewa bajt nr 0 zawsze zawiera warto wpisywan do rejestroacutew steruj cych kon-trolera podczas jego wysy ania jest ustawiana linia RS sygnalizuj ca zapis do rejestruPodczas wysy ania kolejnych bajtoacutew linia ta jest zerowana w zwi zku z czym zapisodbywa si do pami ci CGRAM

Kod obs uguj cy transakcj wygl da nast puj coif(trans) Jest transakcja do zrealizowania uint8_t dat=trans-gtdata[seqpos] if(seqnibble == 0) datgtgt=4 To trzeba zmieni je li linie danych nie s po czone z pinami 0 ndash 3 portu IO hd44780_outnibble_nowait(dat amp 0x0F seqpos = 0) Zapisujemy rejestr steruj cy lub dane ++seqnibble if(seqnibble == 0) ++seqpos Co drug tetrad zwi kszamy pozycj bufora if(seqpos gt= trans-gtlen) trans-gtReady=true Koniec transakcji if(trans-gtSelfDel) free_re(trans) Zwolnij pami transakcji je li tak sobie yczy programista trans=NULL Koniec transakcji CLR(OUT HD44780_E)

Ta cz przerwania wysy a kolejne tetrady do kontrolera LCD Warto zastanowi sinad dzia aniem sekwencji

++seqnibble

Poniewa pole nibble jest jednobitowe operacja inkrementacji prowadzi do zmianystanu tego pola na przeciwny (pole to ma warto 0 lub 1) Kiedy zostan wys anewszystkie dane przeznaczone dla kontrolera obs uga transakcji ko czy si Stan tensygnalizuje nadanie warto ci true polu Ready struktury LCD_trans Dzi ki temu pro-gram mo e sprawdzi asynchronicznie w stosunku do przerwania kiedy transakcjauleg a zako czeniu Opcjonalnie jest wykonywana jeszcze jedna funkcja mdash je li poleSelfDel ma warto true to pami zarezerwowana na transakcj jest automatycznie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 65

zwalniana W tym celu wykorzystuje si funkcj free_re ktoacuterej prototyp jest zade-klarowany w pliku Alloc_safeh Funkcja ta wywo uje funkcj biblioteczn free ktoacute-ra zwalnia pami przydzielon dynamicznie na stercie Poniewa funkcja ta nie jestfunkcj reentrant nale y stworzy odpowiedni bdquoprotez rdquo opakowuj c j w blokatomowy co zapewnia e nie zostanie ona ponownie wywo ana zanim jej poprzed-nia instancja nie zako czy dzia ania Oczywi cie lepszym rozwi zaniem by oby napi-sanie w asnych funkcji dynamicznej alokacji pami ci ktoacutere b d reentrant

Bardzo wa ne jest aby pole SelfDel mia o warto true wy cznie dla transakcjidla ktoacuterych pami zosta a przydzielona dynamicznie funkcj malloc (lub jej po-chodnymi) W pozosta ych przypadkach pole to musi mie warto false mdash nie-stosowanie si do tej regu y spowoduje b d mened era pami ci i najprawdopo-dobniej nieprzewidywalne dzia anie programu

Drug wa n zasad jest aby zmienna zawieraj ca dane transakcji nie by azmienn automatyczn mdash zmienne takie s automatycznie niszczone po opusz-czeniu zawieraj cej je funkcji W rezultacie obszar pami ci zawieraj cy danetransakcji mo e zosta wykorzystany przez inne zmienne co spowoduje uszkodzeniezawartych w nim danych

Pami przydzielona transakcji musi by alokowana w sposoacuteb dynamiczny (funkcjamalloc_re) ewentualnie mo e to by pami alokowana dla zmiennej globalnej lubstatycznej mdash zmienne tego typu istniej przez ca y czas ycia programu

Warto te zauwa y e instrukcje steruj ce stanem linii Enable kontrolera LCD(SET(OUT HD44780_E) i CLR(OUT HD44780_E)) s rozdzielone wieloma innymi in-strukcjami Dzi ki temu generowany impuls dodatni tego sygna u ma czas trwania gt230 ns wymagany w specyfikacji kontrolera Nawet dla XMEGA taktowanej zegarem32 MHz 230 ns przek ada si na oko o 7 instrukcji asemblera mdash czas jaki z pewno-ci up ynie pomi dzy wykonaniem obu powy szych instrukcji steruj cych

Do wysy ania danych do kontrolera zosta a wykorzystana nieco zmodyfikowanafunkcja hd44780_outnibble_nowait roacute ni ca si od jej protoplasty hd44780_outnibbletylko tym e nie czeka na sygna braku zaj to ci mikrokontrolera (nie realizuje teopoacute nie ) Nie jest to potrzebne gdy kolejne tetrady s wysy ane w odst pach cza-sowych okre lanych przez timer

Mamy wi c zapewnion obs ug transakcji i mo liwo transakcyjnego wy wietlaniadanych na LCD musimy jeszcze mie funkcj ktoacutera tworzy odpowiednie transakcjemdash jest odpowiednikiem funkcji bezpo rednio wysy aj cej dane znakowe do LCDOdpowiednikiem tym jest pokazana poni ej funkcja

bool LCD_PutText_B(uint8_t x uint8_t y char txt LCD_trans buf bool autodel) buf-gtcmd=LCD_Text buf-gtReady=false buf-gtSelfDel=autodel Czy zwolni pami po zako czeniu transakcji buf-gtdata[0]=HD44780_DDADDR(x+y0x40) Ustaw adres w DDRAM strcpy((char)ampbuf-gtdata[1] txt) Skopiuj dane tekstowe + NULL

Kup książkę Poleć książkę

66 AVR Uk ady peryferyjne

buf-gtlen=strlen(txt) + 1 D ugo tekstu + pozycji + NULL ndash 1 bool ret=cbAdd(ampLCD_TransBuffer buf) if((ret==false) ampamp (autodel)) free_re(buf) Brak miejsca w kolejce else TCD0_CTRLA=TC_CLKSEL_DIV1_gc Preskaler 1 mdash odblokuj timer return ret

Funkcja ta buduje transakcj odpowiedzialn za wy wietlenie napisu txt na wskaza-nej pozycji x y LCD Wszystkie dane o transakcji zostan umieszczone w buforzew pami ci ktoacuterej adres jest okre lany wska nikiem buf Pami w buforze musi bywystarczaj co du a aby pomie ci ca transakcj Dodatkowy parametr autodel okre laczy pami ta ma by automatycznie zwalniana po obs u eniu transakcji (true) czynie (false) Je li transakcj uda o si umie ci w kolejce funkcja zwraca true Wartozauwa y e w takim przypadku funkcja uruchamia te timer (w naszym przypadkujest to timer TCD0) odpowiedzialny za generowanie przerwania Funkcja obs ugi prze-rwania wysy a dane do LCD

Pewn odmian powy szej funkcji jest funkcjabool LCD_PutText(uint8_t x uint8_t y char txt) LCD_trans trans=malloc_re(sizeof(LCD_trans) + strlen(txt) + 2) bool ret=LCD_PutText_B(x y txt trans true) return ret

Wykorzystuje ona funkcj LCD_PutText_B z tym e najpierw alokuje dynamiczniepami potrzebn na przechowanie tworzonej transakcji

Mamy komplet potrzebnych funkcji a wi c sprawd my jak ca o sprawdza siw praktyce W pliku LCD-transactc znajduje si kod pokazuj cy jak dzia aj naszetransakcje Aby to by o mo liwe nale y zainicjalizowa kontroler LCD

LCD_init()

Wykorzystujemy tu znan ju funkcj inicjalizuj c mdash nie ma potrzeby jej zmienia gdy operacja inicjalizacji LCD jest jednorazowa i nie trzeba wykonywa jej w posta-ci transakcji W drugim kroku musimy zainicjalizowa wykorzystywany timer i systemprzerwa

LCD_Timer_init(ampTCD0)PMIC_CTRL|=PMIC_LOLVLEN_bm Odblokuj przerwania niskiego poziomusei()

Poniewa dost p do LCD z pewno ci nie jest czynno ci krytyczn czasowo prze-rwaniom timera nadano najni szy priorytet Dzi ki temu mo na innym bardziej kry-tycznym przerwaniom nada wy sze priorytety i uzyska w ten sposoacuteb zmniejszenieczasu latencji obs ugi przerwa Sama inicjalizacja timera jest niezwykle prosta

void LCD_Timer_init(TC0_t tc) tc-gtINTCTRLA=TC_OVFINTLVL_LO_gc Odblokuj przerwania nadmiaru timera i nadaj im niski priorytet tc-gtPER=F_CPULCD_ACCESSTIME Przerwanie co 4 us (niezale nie od F_CPU)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 67

Sprowadza si ona tylko do odblokowania mo liwo ci zg aszania przerwania nadmia-ru oraz konfiguracji rejestru PER tak aby przerwania by y generowane co ok 4 s mdashniezale nie od cz stotliwo ci taktowania CPU Mo emy wi c przyst pi do wy wie-tlenia pierwszego napisu

LCD_PutText(00 Numer)

Powy sza funkcja ma jedn wad mdash alokuje dynamicznie pami po ka dym wywo-aniu (pami ta jest automatycznie zwalniana po obs u eniu transakcji) niemniej

ca y proces jest czasoch onny Mo emy tego unikn alokuj c pami bdquor cznierdquo i wielo-krotnie wykorzystuj c zaalokowany blok pami ci Ilustruje to poni szy przyk ad

LCD_trans buf=malloc_re(sizeof(LCD_trans) + 7)

Zmienna buf wskazuje na obszar pami ci ktoacutery mo e pomie ci a cuch 5-znakowyTyle wystarczy na potrzeby tego przyk adu mdash na LCD b d wy wietlane kolejneliczby w zakresie 0 ndash 65 535 najd u sza ma 5 znakoacutew st d te nasz bufor ma tak a nieinn d ugo

while(1) utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(60 bufstr buf false) while(LCD_IsTransCompleted(buf))

Do konwersji liczby na a cuch u yto funkcji bibliotecznej utoa (nag oacutewek stdlibh)Poniewa d ugo a cucha po konwersji jest zmienna (co spowodowa oby pozosta-wianie na LCD bdquoduchoacutewrdquo po poprzednich konwersjach) w kolejnej linii brakuj ceznaki uzupe niono spacjami Nast pnie tworzona jest transakcja w obszarze pami ciprzydzielonym zmiennej buf Ostatnia p tla while jest odpowiedzialna za oczekiwa-nie na zako czenie realizacji transakcji Po jej zako czeniu p tla jest wykonywana odpocz tku

Uwa ny czytelnik z pewno ci zauwa y e pami przydzielana funkcj malloc_renie jest nigdzie zwalniana mdash w normalnej sytuacji spowodowa oby to wyciek pami -ci W naszym przyk adzie jednak program nigdy si nie ko czy nie ma wi c potrzebyzwalniania pami ci wskazywanej przez zmienn buf

Powy szy przyk ad pokazuje jak unikn blokowania CPU na czas dost pu do wolnodzia aj cego urz dzenia jakim jest LCD alfanumeryczny Jednak to nie wszystkiezalety wynikaj ce z zastosowania transakcji Drug wa n zalet naszego rozwi zaniailustruje przyk ad znajduj cy si w katalogu PrzykladyLCD-alfaLCD-transact-intPowa nym ograniczeniem funkcji odpowiedzialnych za dost p do LCD w sposoacutebklasyczny by a niemo no ich wywo ywania z funkcji obs ugi przerwa mdash funkcjeobs ugi LCD nie by y reentrant2 Nasz system oparty na transakcjach nie ma tychwad Aby to zilustrowa zosta stworzony prosty przyk ad mdash tak jak poprzedniow p tli g oacutewnej programu s wy wietlane stale kolejne liczby ale jednocze nie wyko-

2 Poza tym blokowa y CPU na d ugi czas a jak pami tamy funkcje obs ugi przerwa powinny by

wykonywane mo liwie kroacutetko

Kup książkę Poleć książkę

68 AVR Uk ady peryferyjne

rzystano drugi timer (TCD1) w ktoacuterego funkcji obs ugi przerwania przepe nienia jestwy wietlany licznik tych przerwa

ISR(TCD1_OVF_vect) static char int_buf[sizeof(LCD_trans) + 7] static uint16_t cnt char bufstr[6]

utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(61 bufstr (LCD_trans)ampint_buf false)

Jak widzimy w sposoacuteb asynchroniczny z dwoacutech miejsc w programie mo emy uzy-ska dost p do LCD a ka da funkcja bdquoma wra enierdquo e ma LCD na wy czno Przy okazji warto przeanalizowa sposoacuteb w jaki jest rezerwowana pami na trans-akcj w przerwaniu Oczywi cie mo na by wykorzysta dynamiczn alokacj pami cilecz jak wspomniano taka alokacja jest czasoch onna St d te w pokazanym przy-k adzie wykorzystano tablic statyczn int_buf o rozmiarze umo liwiaj cym prze-chowanie kompletnej transakcji Dzi ki temu e zmienna int_buf jest zmienn statycz-n nie jest ona niszczona po zako czeniu funkcji obs ugi przerwania Gdyby pomins owo kluczowe static zmienna ta by aby niszczona a na LCD najprawdopodobniejzacz yby si pojawia przypadkowe tre ci Poniewa pami naszego bufora nie by aalokowana dynamicznie nie mo e ona zosta zwolniona w naszym sterowniku LCDst d te ostatni parametr wywo ania funkcji LCD_PutText_B musi mie warto false

OptymalizacjaPrzy okazji tego i poprzedniego przyk adu warto zastanowi si jeszcze nad jednkwesti mdash optymalizacji W podanych przyk adach wykorzystano wcze niej omoacute-wione funkcje dost pu do wy wietlacza LCD znajduj ce si w plikach hd44780ci hd44780h Wi kszo z zawartych tam funkcji nie jest wykorzystywana jednakkompilator mimo wszystko umieszcza ich kod w pliku wynikowym mdash dzieje si takponiewa nie mo e on bdquostwierdzi rdquo czy funkcje te nie s wykorzystywane w innychfragmentach programu Pami tajmy e kompilator kompiluje poszczegoacutelne pliki roacute-d owe osobno i dana jego instancja nie bdquowierdquo co znajduje si w innych plikach (innychjednostkach kompilacji) Tak ca o ciow wiedz ma dopiero konsolidator (linker)ktoacutery czy stworzone przez kompilator pliki obiektowe (o rozszerzeniu o) w plikwynikowy Linker jednak bdquonie wierdquo ktoacutera z funkcji programu zosta a u yta a ktoacuteranie mdash informacje te ma wy cznie kompilator W ten sposoacuteb powstaje typowe b dneko o w efekcie nasze nieu ywane funkcje nie s usuwane (linker zostawia je bdquonawszelki wypadekrdquo) i zajmuj niepotrzebnie pami Czy mo na temu jako zaradzi Oczywi cie tak W tym celu trzeba po czy si y kompilatora i linkera co zapewniaj od-powiednie opcje kompilacji We w a ciwo ciach projektu (ProjectProperties lub Alt+F7)wybieramy zak adk Toolchain a nast pnie AVRGNU C Compiler i OptimizationZnajdziemy tam pole wyboru o nazwie Prepare functions for garbage collection (ry-sunek 224)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 69

Rysunek 224 Aby da linkerowi mo liwo usuwania nieu ywanych funkcji nale y skompilowaprogram z wybran opcj ndashffunction-sections ktoacutera spowoduje e ka da funkcja programu znajdzie siwe w asnej sekcji

Zaznaczenie tej funkcji spowoduje umieszczenie ka dej funkcji w osobnej sekcji mdashsamo w sobie nie wp ynie to na skroacutecenie kodu wynikowego ale jest warunkiem nie-zb dnym dla podj cia stosownych dzia a przez linker Aby wyeliminowa nieu y-wane funkcje nale y zaznaczy jeszcze w ga zi AVRGNU LinkerOptimization poleGarbage collect unused sections (rysunek 225)

Rysunek 225 Zaznaczenie opcji Garbage collect unused sections (-Wl--gc-sections) spowodujee nieu ywane funkcje zostan usuni te z kodu wynikowego w efekcie kod programu ulegnie skroacuteceniu

Po zaznaczeniu tych opcji program zostanie skroacutecony o kilkaset bajtoacutew Oczywi cieje li wszystkie funkcje by yby wykorzystane nie uzyskaliby my adnego skroacuteceniakodu Niemniej w sytuacji gdy u ywa si bibliotek zazwyczaj przynajmniej czfunkcji nie jest wykorzystywana warto wi c skorzysta z tej mo liwo ci optymalizacji

Kup książkę Poleć książkę

70 AVR Uk ady peryferyjne

Je li mamy do czynienia z prekompilowan bibliotek (lib) to musi ona by skom-pilowana z zaznaczon opcj Prepare functions for garbage collection (-ffunction-sections) Alternatyw jest umieszczenie ka dej funkcji biblioteki w osobnym pliku(tak jak w przypadku bibliotek AVR-libc)

Na ekranie wyboru opcji optymalizacji linkera mamy jeszcze jedn przydatn opcjmdash Relax Branches (-mrelax) Dla mikrokontroleroacutew ktoacutere maj ponad 8 kB pami ciFLASH instrukcje skokoacutew s generowane jako tzw instrukcje d ugie mdash umo liwiajone skok do komoacuterki pami ci FLASH o dowolnym adresie Jednak cen za to jestwyd u enie instrukcji mdash ich kod jest d u szy podobnie jak czas wykonania Nie zawszejednak takie d ugie instrukcje musz by wykonywane mdash je li miejsce docelowe skokule y blisko (w zasi gu instrukcji skokoacutew wzgl dnych) to mo na w kodzie wynikowymzamieni instrukcje d u sze na kroacutetsze co przynosi oszcz dno ci w postaci skroacuteceniakodu wynikowego Poniewa dopiero linker bdquowierdquo jak poszczegoacutelne fragmenty kodus rozmieszczone w pami ci takiej podmiany mo na dokona na etapie linkowaniaprogramu co zapewnia powy sza opcja St d te warto to pole wyboru zaznaczy

Kup książkę Poleć książkę

SkorowidzA

ABI Application Binary Interface 25AC Address Counter 50ADPCM 482adres

bazowy 377bufora 61komoacuterki 84pu apki 202

ALE Address Latch Enable 368alfanumeryczne wy wietlacze 43algorytm ADPCM 492algorytmy stratne 495animacje 57antyaliasing 325architektury procesoroacutew XMEGA 352asembler 23

dyrektywy 40funkcje j zyka C 41obs uga przerwa 39

asynchroniczne wywo anie funkcji 101Atmel Studio 15

Bbajty kalibracyjne 569biblioteka

FATFS 131 139 176 180 517libcallback-liba 99PetitFS 144 149

bitADC_CH0START_bm 236IMPMODE 244

bitrate 442 512blokowanie przerwa 219b d 16 19

kwantyzacji 463offsetu 230wzmocnienia ADC 230

BOD 223bps bits per second 12

budowakarty 152linii obrazu 394pami ci SDRAM 374pliku stymulacji 192ramki PAL 412sygna u PAL 411wtyczki 544 545

bufor 78FIFO 497na transakcje 61transakcji 62

buforowanie wyj cia 294

CCAS Column Address Strobe 375CCFL 44charakterystyka

przetwornikoacutew 222termistora 264tryboacutew pracy 232

CID Card Identification 169CKE Clock Enable 375CLKIN 421COG Chip on Glass 310CRC 158 178CRC16 178CRC7 164CS Chip Select 361 375CSD Card Specific Data 172czas

dost pu do SDRAM 424adowania kondensatora 244

propagacji 281proacutebkowania 260symulacji 209

czcionki 322cz stotliwo

odchylania pionowego 428proacutebkowania 244 441 444 530przebiegu 504

Kup książkę Poleć książkę

576 AVR Uk ady peryferyjne

cz stotliwoPWM 465taktowania koprocesora 549taktowania procesora 209taktowania rdzenia 18

czyszczenie pami ci 318

DDAC Digital to Analog Converter 293 447 451

buforowanie wyj cia 294generowanie przebiegoacutew 301jitter 303kalibracja 306napi cie referencyjne 295system zdarze 297taktowanie 296tryb dwukana owy 301wykorzystanie DMA 298wyzwalanie konwersji 305

datalogger 261 265 275DD Device Density 86debuger 183

programowy 190sprz towy 185 187

decymacja 259DEBUG 219XMEGA 260

definicja symboli globalnych 36definiowanie w asnych znakoacutew 56deklaracja zapowiadaj ca 103 337dekoder DTMF 548 556DMA 254 298 402 458 518 523dost p do

danych 358 359 568danych binarnych 356 360danych wielobajtowych 31DataFLASH 137EEPROM 128FAT 136komoacuterki 375LCD 59 62 66 68operandu 30pami ci 81 384 386 387 561pami ci SDRAM 424pliku blokowy 141portoacutew IO 30rejestroacutew IO procesora 36rejestroacutew uk adu 499SPI 95sygnatury u ytkownika 565 567wska nikoacutew 32

DQM Data Mask 375DSP Digital Signal Processor 535

DTMF 535 553dyktafon 529dynamiczna alokacja pami ci 516dyrektywa global 38dyrektywy asemblera 40dzia anie

DMA 255komparatora 280timeroacutew 400

d wi k 443

EEBI External Bus Interface 361EEPROM 207eliminacja jitteru 24emulacja RS232 139

FFAT File Allocation Table 128 131FAT32 128FATFS 180filtr

dolnoprzepustowy 491drugiego rz du 470pierwszego rz du 469trzeciego rz du 471

filtrowanie sygna u PWM 468firmware 565FLASH 207format

odpowiedzi 159polecenia 158protoko u 157

funkcja_delay_ms 17 219c_zero 42callback 106 341callback() 99DataFLASH_CSEnable 100DF_FinishBufWrite() 269disk_initialize 136disk_ioctl 181disk_status 136disk_write 138DMA_SPI_init 104DTMF_GetCode 553free_re 65GPIOR0_init 507hd44780_outcmd 51hd44780_outnibble_nowait 65LCD_defchar_P 57

Kup książkę Poleć książkę

Skorowidz 577

Menu_Click_Func 515Menu_Free 516Menu_Recorder 532Menu_Run 527MS_CreateRegEntry 117MS_GetDirPos 125MS_GetRegItem 115MS_WritePages 116 118OSC_wait_for_rdy 473RecMenu_StartStop 532sprintf 142strtok 124sysclk_init() 200 209TMF_memcpy_PF 454udi_cdc_getc() 123udi_cdc_is_rx_ready() 123VS1003_Reset 506

funkcjeanalizuj ce 556biblioteczne 50biblioteki FATFS 143j zyka C 41kontrolera ST7565R 313opoacute niaj ce 17opoacute nie 219reentrant 524specjalne kontrolera 319steruj ce 314zapisu 133

fusebit 557BODACT 560BODLEVEL 560BOOTRST 559DVSDON 560EESAVE 561JTAGEN 558RSTDISBL 559SUT 559TOSCSEL 559

fusebity w AVR-libc 571

Ggenerator obrazu composite 426generowanie

d wi ku 461kolorowego obrazu 437obrazu wideo 391przebiegoacutew 301przerwa 285sygna u composite 409

g bia koloru 326gniazdo

karty SD 156VGA 396

Hhistereza 281

IIDE 11IMA ADPCM 483informacje

o kolorze 431o obrazie 434

inicjalizacjakarty 161karty SDHC 167karty SDSC 167karty SDXC 167licznika 419pami ci 119USART 505

instrukcjaicall 42movw 35nop 13 24

interfejsSCI 498SDI 498SPI 71 79RS232 120UART 123USART 71 73

interpolacja 259interpolacja w XMEGA 260inwersja obrazu 319

Jjednostki 12jitter 24 303 420

Kkalibracja

ADC 229DAC 306 564offsetu 237

kana DMA 82 522karta 154 158

mikroSD 152SD 151 152SDHC 151 152 160SDSC 160SDXC 151 160

Kup książkę Poleć książkę

578 AVR Uk ady peryferyjne

karty pami ci 151 152 157biblioteka FATFS 180budowa 152format polecenia 158inicjalizacja 161 167komunikacja 156odczyt danych 173opcje konfiguracyjne 181rejestry specjalne 169tryby pracy 153zapis danych 176zasilanie 154

kodasemblerowy 23 24C 23dost pu 24

kodowanieμ-law 481ADPCM 483Dialogic ADPCM 494informacji 166 426koloru 425znakoacutew 536

kodyformatoacutew audio 501zdarze 545

kolejno bajtoacutew 533kolor 424 430kolorowy obraz 437komparator 422

analogowy 279 280analogowy XMEGA 282okienkowy 284

kompilacja plikoacutew binarnych 350kompilator avr-gcc 11 359kompresja

ADPCM 482 486d wi ku 480IMA ADPCM 482

komunikacja z koprocesorem 504konfiguracja

4-portowa 364biblioteki 133debugera 185DMA 459 522fusebitoacutew 570kontrolera DMA 257 452komparatoroacutew 285lockbitoacutew 570LPC 371pami ci SDRAM 381PetitFS 149pinu IO 225portoacutew IO 362

preskalera 452projektu 186przerwa 219pu apki 203rejestru EVCTRL 248rejestru PER 67SPI 75sygna u CS 377typu czcionki 324urz dze IO 189USART 76zegara 383

konsolidacja 547kontroler

DMA 254 298 402 458 518 523KS108 310ST7565R 310ndash315 321

konwersjaDAC 305sygna oacutew 396wyzwalana 306

konwertercyfrowo-analogowy 426DAC 427

koprocesormp3 496VS1003B 10

korekcja fazy 466kwantyzacja 463

Llampa CCFL 44LE Latch Enable 433licznik 419

cykli 209TCC1 400timera 20

linie IO 50linie sygna owe

MISO 72 164MOSI 72SCK 72SS 72

linker 69lista

mnemonikoacutew 24modyfikowanych rejestroacutew 32

lockbity 557 561lockbity w AVR-libc 570LPC Low Pin Count 371LPCM 443 556LSB Least Significant Bit 228

Kup książkę Poleć książkę

Skorowidz 579

a cuchy formatuj ce 212czenie plikoacutew 352

Mmagistrala pami ci zewn trznej 361magnetofon cyfrowy 528makro _SFR_IO_ADDR() 39makrodefinicja

ASSERT 214HD44780_CGADDR() 53HD44780_CLR 53HD44780_DDADDR() 53HD44780_DISPCTL() 52HD44780_ENTMODE() 52HD44780_FNSET() 52HD44780_HOME 53HD44780_SHIFT() 51LOCKBITS 571

mapowanie sygna oacutew 366mapy bitowe 343marker czasowy 268maski bitowe 329matryce 49menu 335menu piktogramowe 342mierniki temperatury 262mikrokontroler

ARM 9AVR 9PIC 9XMEGA128A3U 10

MISO 72moc wydzielana 265model psychoakustyczny 495modu

alfanumeryczny 45NVM 568Xmega eXploreGO 10Xplained ATXMEGA A3BU 10Xplained ATXMEGA-A1 10Xplained XMEGA128A1 447Xplained XMEGA256A3 94Xplained XMEGA256A3BU 97 143 266

modyfikator 30const 85volatile 28 273

monitory CRT 395monochromatyczne wy wietlacze graficzne 309monochromatyczny

tryb graficzny 416tryb tekstowy 413

MOSI 72mp3 495Msps Megasamples per second 12multiplekser wej ciowy 226 283multipleksowanie adresoacutew 368 369muzyka 439

Nnadawanie kodoacutew DTMF 540nadproacutebkowanie 258nag oacutewek kontenera wav 500nagrywanie mowy 486najmniej znacz cy bit 228napi cie

offsetu 280referencyjne 223 295zasilania 239

Oobracanie obrazu 319obraz 319

composite 426kolorowy 430wideo 391

obroacutebka d wi ku 443 445obs uga

FAT 131 143klawiatury matrycowej 24LCD 58 63 67menu 337przerwania 37 38 458przerwania DMA 525przerwa w asemblerze 39przyciskoacutew 272wy wietlaczy alfanumerycznych 45

odczytblokowy 140danych 173 358

odpowied response 159R1 159R2 159R7 160

od wie anie pami ci 376odtwarzanie

d wi ku 472muzyki 447 513 518 521

offset 238offset ADC 230okno

Breakpoints 202Call stack 209dezasemblera 210

Kup książkę Poleć książkę

580 AVR Uk ady peryferyjne

oknoIO View 207podgl du zmiennych 211wyboru czcionek 324

OLED 46opcje

kompilatora 35zapisu d wi ku 445

operacjena buforach 91odczytu 173zapisu 176zapisu strony 92

operand 29operator

ascii 41

asciz 41

byte 41

section 41opoacute nienia 13 18opoacute nienie zmienne 16optymalizacja 16 68optymalizator 26organizacja pami ci 77organizacja pami ci VRAM 316oscylator 287OSD On-Screen Display 417ostrze enie 16oszcz dzanie energii 94

Ppakiet WinAVR 48pami

CGRAM 56 57 64DataFLASH 10 77 81 113 269DDRAM 49EEPROM 111FLASH 54 124 207RAM 49SDRAM 372SRAM 63 124 329 366 371VRAM 314 317

PCLK 421PCM 443PetitFS 144 149p tla

for 13while 201

pierwsza linia obrazu 321piksel 430piktogram 342pin IO 225

plikAlloc_safeh 65DataFLASHc 83DataFLASHIOc 136definesh 50delayh 14diskioh 132 136ffh 132ffconfh 132 181hd44780h 49integerh 132ioh 30LCD_transc 61LCD-transactc 66Makefile 14Menuc 19nothingo 541outfiletxt 547 551pffh 149SPIh 104stringh 113stymulacji 191 192

pliki mp3 495elf 351fon 323o 24S 24 34binarne 350 355csv 276d wi kowe 440obiektowe 352wav 500WMA 512z czcionkami 327z danymi 349

podbijacz napi cia 315podgl d

pami ci 207stosu wywo a 209zmiennych 211znakoacutew 325

pod czeniefototranzystora 262karty SD 155LCD z kontrolerem 311modu u 50pami ci 362 369 370 373termistora 262uk adu LM35 251wyj XMEGA 398

pod wietlenieCCFL 46OLED 46

Kup książkę Poleć książkę

Skorowidz 581

podwoacutejne buforowanie 255 332 457polecenia

kasowania strony 81konfiguracyjne pami ci 82kontrolera ST7565R 315odczytu bufora 82 89odczytu pami ci 81 88SDRAM 376transferu 91

polecenieACMD41 168cd 181CID 178CMD0 165CMD8 167CSD 178date 276dir 127 181dump 276erase 276get 276HD44780_CLR 51Init 178mkdir 181

po czenieDMA ze SPI 96dwoacutech komparatoroacutew 285koprocesora mp3 497LCD z mikrokontrolerem 48wyj cia XMEGA 411XMEGA z PC 121z telewizorem 431

pomiarnapi cia zasilania 239temperatury MCU 241

port IO 30 362pozycjonowanie grafik 345poacute obraz 410precyzja pomiaroacutew 260preskaler 478preskaler ADC 243program

Atmel Data Visualizer 275Audacity 443avr-objcopy 350dataloggera 265LCD Image Converter 323makeloadingtableexe 543Realterm 127 554riffstrip 483SoX 445Tracepoint 208

programowanie sygnatury u ytkownika 566protokoacute master-slave 157

prototypy 136proacutebki d wi kowe 447proacutebkowanie

8-bitowe 300nieliniowe 480

prymitywy graficzne 330przebieg PWM 468przebiegi 289 303przechwytywanie danych 276przemiatanie wej 253przerwanie 218 254 286 403

DMA 522komparatora 286

przestrze adresowa procesora 378przesy anie

danych 498polece 498

przetaktowanie procesora 436przetwornik

ADC 221analogowo-cyfrowy 221cykliczny 222potokowy 222

przyciski 272pseudooperatory 41pu apki breakpoints 197pu apki warunkowe 205punkty ledzenia 203PWM 461 462 472

RRAS Row Address Strobe 375redukcja poboru energii 242regulacja kontrastu 321rejestr 32 34rejestr AC 50

adresu wtyczki 513BASEADDR 377CID 169CMP 251CSD 172czasu utworu 512DATA 83EVCTRL 248formatu audio 512identyfikacyjny pami ci 87INTFLAGS 252kontroli basoacutew 510kontroli g o no ci 513MUXCTRL 227OCR 168PER 67poroacutewnania 249

Kup książkę Poleć książkę

582 AVR Uk ady peryferyjne

rejestr ACSCI_CLOCKF 511stanu komparatora 287stanu pami ci 86stanu uk adu 510trybu pracy 508WINCTRL 285

rejestrydost pu do pami ci RAM 513GPIOR 502IO procesora 36mikrokontrolera 25procesora 35specjalne 94specjalne karty 169uk adu VS1003B 508

relacja rodzic ndash dziecko 336reset uk adu 534rozdzielczo

LCD 329przetwornika 231PWM 463 477

rozszerzenie HiRes 477 479roacutewnanie Steinharta-Harta 263rysowanie map bitowych 343

Sschemat uk adu dataloggera 267SCI Serial Command Interface 498SCK 72SD Secure Digital 152SDI Serial Data Interface 498separator synchronizacji 422separowanie impulsoacutew synchronizacji 422shieldy 10skaler 422skaler napi cia 283skrypt makefile 353s owo kluczowe

asm 27extern 37static 68

specyfikatory lokalizacji zmiennej 213sps samples per second 12SS Slave Select 72standard PAL 410standard VGA 393sterowanie

dataloggerem 275sygna em 379

sterownik 121HD44780 49 56LCD 49 62

stos wywo a 209

strukturaFATFS 139Handle 118LCD_trans 60 63menu 338rejestru 86SimpleFSEntry 113 116SimpleFSHandle 113 118 140submenu 527systemu plikoacutew 112

sumabitowa 571kontrolna 178

sygnacomposite 409composite video output 430CS 377DREQ 497H-Sync 396synchronizacji 423V-Sync 396zegarowy CLK 374

sygna yinterfejsu EBI 363magistrali EBI 364steruj ce 375

sygnaturaprodukcyjna procesora 563u ytkownika 565

symbol__DELAY_ROUND_CLOSEST__ 17__DELAY_ROUND_DOWN__ 17_FS_FAT12 149_FS_FAT32 149_FS_MINIMIZE 133_FS_READONLY 133_FS_RPATH 135_FS_TINY 133_MAX_SS 135_MULTI_PARTITION 135_USE_DIR 149_USE_FASTSEEK 134_USE_FORWARD 134_USE_LABEL 134_USE_LFN 134_USE_LSEEK 149_USE_MKFS 134_USE_READ 149_USE_STRFUNC 134_USE_WRITE 149_VOLUMES 136F_CPU 14 15 18increment 36USE_BUSY_FLAG 50

Kup książkę Poleć książkę

Skorowidz 583

symboleglobalne 36w asemblerze 28zewn trzne 39

symulacja 198 209symulator 190synchronizacja

pami ci 331pionowa 395pozioma 394

systemplikoacutew 111 128przerwa 404zdarze 245

szablonfont_XMEGAtmpl 326image_XMEGAtmpl 343

szum 463szybko przesy ania danych 126

ledzenie wi zki 333rodowisko

graficzne 11programistyczne 11VSIDE 542WinAVR 47

Ttabela FAT 130tablica

framebuf 402 408plugintbl 552 555tekst 208z kodem wynikowym 543

taktowanieDAC 296mikrokontrolera 473

technologia OLED 44temperatura mikrokontrolera 239 241termistor 262 290

NTC 263PTC 263

termometrLM35 249 250z alarmem 251

termostat 290test uk adu VS1003B 503testowanie obrazu 319timer 16 62

TCC0 20

TCC1 399transakcja 59 62 65transakcje 17 103ndash107transakcyjna obs uga LCD 58transakcyjny dost p do SPI 95transfer 91

danych 97wynikoacutew 254

transmisja 72 83tryb

bez znaku 234ci g ej konwersji 252czterobitowy 153dwukana owy 301graficzny 416graficzny VGA 407idle 419jednobitowy 153LPC 371monochromatyczny 397 407oszcz dzania energii 94 306pracy multipleksera 226pracy SPI 157roacute nicowy 232single slope 312SPI 153tekstowy 413tekstowy VGA 397z pojedynczym wej ciem 234ze znakiem 235

trybygenerowania PWM 467pracy karty 153pracy przetwornika 231pracy SPI 74pracy uk adu 508

twierdzenie Nyquista 258tworzenie

adresu 84nak adek 417obrazu 335tablicy 543

typ__uint24 119karty 160niekompletny 60wyliczeniowy 114

typyoperandoacutew 29w AVR 34

Kup książkę Poleć książkę

584 AVR Uk ady peryferyjne

Uuchwyt handle 64 113uk ad

AD725 427 431buforowy 294CS 361DAC 284dataloggera 267detekcji awarii zasilania 559generuj cy obraz 393HiRes 477ICL7660 47LM35 250 251SampH 293sterowania sygna em 379USART 401VS1003B 496 503 508 530 538 556VS100XX 529wzmacniania sygna u 227

uk ady peryferyjne 9uruchomienie komparatora 287urz dzenie

master 72slave 72

u rednianie 259utrata danych 141u ycie wstawki asemblerowej 33

VVGA 393

Wwarto ci kalibracyjne

ADC 564oscylatoroacutew 564temperatury 564

warunkowa kompilacja 36WE Write Enable 375wej cie composite video input 425wektor przerwa 38 257wideo 391wielko pami ci 86 377w czenie DAC 299wska nik na struktur 27wska niki 32wstawki asemblerowe 24 33wtyczka 535 541 544

SineDTMF Generator 537VGA 396

wyboacuter cz stotliwo ci PWM 465 474wykorzystanie

DMA 254 518

EuroSCART 428PWM 461rejestroacutew 34

wyliczanie predyktora 489wy wietlacze

alfanumeryczne 43 45graficzne 43 309LCD 43OLED 46

wy wietlanielitera u 213map bitowych 344obrazu 333 346 406obrazu VGA 393

wywo ania zwrotne callbacks 98asynchroniczne 101synchroniczne 101

wyzwalanie konwersji 245wzmacniacz 446wzmacniacz operacyjny 279wzmacnianie sygna u 227

XXMEGA 9 18

Zzapis

bufora 269danych 176d wi ku 440 556

zasilaniekarty 154pami ci 109

zatrzask 368zatrzask 74HC573 433zatrza ni cie adresu 369zdarzenia 297zdarzenie compare match 399zegar 383 420 426zintegrowane rodowisko programistyczne 11z cze EuroSCART 425 428 429zmiana

g o no ci 527wielko ci strony 94

znaki 56

roacuted onapi cia odniesienia 284sygna u 240

Kup książkę Poleć książkę

Page 11: Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8 AVR. Ukäady peryferyjne Rejestry dost pu do pami ci RAM .....513 Rejestr adresu

46 AVR Uk ady peryferyjne

Przed pod czeniem modu u zawsze upewnij si czy podany rozk ad odpowiadau ytemu modu owi W szczegoacutelno ci sprawd rozmieszczenie linii zasilaj cych Ichniew a ciwe pod czenie grozi uszkodzeniem modu u

Zwykle piny 15 i 16 steruj ce pod wietleniem s umieszczone osobno lub te przedpinem 1 St d te zawsze nale y je dok adnie zidentyfikowa przed pod czeniem mo-du u Do pinoacutew tych nale y pod czy napi cie wykorzystane do pod wietlenia modu uPrzy czone napi cie zale y od typu zastosowanego pod wietlenia mdash CCFL foliielektroluminescencyjnej lub diod LED W dalszej cz ci b dziemy zajmowa si modu-em z pod wietleniem LED W nocie katalogowej ka dego modu u znajduj si szcze-

goacute owe informacje dotycz ce zasilania pod wietlenia Zwykle w tym celu wymaganejest napi cie 5 V a nat enie pr du pod wietlenia wynosi 20 ndash 50 mA

Wy wietlacze LCD alfanumeryczne s dost pne w handlu w wersjach dostosowanychdo roacute nych napi zasilaj cych Typowo jest to napi cie 5 V co stwarza pewne pro-blemy przy pod czeniu takiego LCD do procesoroacutew rodziny XMEGA S one zasi-lane maksymalnym napi ciem 36 V nie ma wi c mo liwo ci aby LCD i procesordzia a y w tych samych domenach napi ciowych W efekcie przy po czeniu obu uk a-doacutew musimy zastosowa konwersj napi Poniewa LCD alfanumeryczny z perspek-tywy procesora jest urz dzeniem bardzo wolnym ca kowicie wystarczaj cym rozwi za-niem jest zastosowanie szeregowych rezystoroacutew ktoacutere wraz z wbudowanymi w procesordiodami zabezpieczaj cymi b d stanowi y uk ad obni aj cy napi cie na magistralikomunikacyjnej z 5 V do bezpiecznego dla wej cia XMEGA napi cia Z drugiej stronyjedynka logiczna generowana przez procesor zasilany napi ciem 33 V jest poprawnierozpoznawana przez LCD pracuj cy z napi ciem 5 V Je li procesor by by zasilanybardzo niskim napi ciem (rz du 18 ndash 28 V) wymagany by by bardziej skompliko-wany konwerter co zosta o szerzej omoacutewione w rozdziale 7 ksi ki AVR Praktyczneprojekty

Wy wietlacze LCD wymagaj pod wietlenia bez tego wy wietlana zawarto jestpraktycznie nieczytelna W starszych konstrukcjach wykorzystywano pod wietleniew oparciu o lampy fluorescencyjne lub folie elektroluminescencyjne jednak obecniedominuj cym typem jest pod wietlenie za pomoc diod LED

Poniewa zasilamy diod LED wymagane jest do czenie szeregowego rezystoraCzasami taki rezystor jest wbudowany w modu LCD

Pod wietlenie tego typu zu ywa spor ilo energii Innym rozwi zaniem jest kupnowy wietlacza wykonanego w technologii OLED (ang Organic Light-Emitting Diode)Wy wietlacze tego typu cechuj si zdecydowanie lepszym kontrastem ale tak e wi k-sz szybko ci prze czania w zwi zku z czym mo na za ich pomoc uzyska o wielelepsze efekty animacji ktoacutere s praktycznie nieosi galne dla klasycznych wy wietlaczyLCD Nie maj one tak e innej wady LCD mdash zale no ci szybko ci prze czania seg-mentoacutew od temperatury

Wy wietlacze OLED nie maj wyprowadzonych pinoacutew odpowiedzialnych za pod-wietlenie mdash po prostu go nie wymagaj

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 47

Kolejn istotn kwesti jest pod czenie w a ciwego napi cia reguluj cego kontrastwy wietlacza Dla wi kszo ci modu oacutew LCD mie ci si ono w przedziale GND ndash Vcca dla modu oacutew o rozszerzonym zakresie temperatury w przedziale od ndash7 do 0 V mdashrysunek 221

Rysunek 221Pod czenie napi ciareguluj cego kontrasta) modu y klasyczneb) modu y o rozszerzonymzakresie temperatur

Napi cie ujemne mo na uzyska z prostej pompy adunkowej sterowanej przebiegiemPWM z procesora Poboacuter pr du z tego wej cia jest znikomo ma y Alternatywniemo na u y uk adu ICL7660 ktoacutery mo e generowa napi cia ujemne

Kolejn decyzj jak musimy podj jest sposoacuteb pod czenia modu u LCD z mikro-kontrolerem Mamy do wyboru dwie opcje mdash albo pod czamy wszystkie 8 linii da-nych (D0 ndash D7) albo tylko 4 najstarsze (D4 ndash D7) Pod czaj c tylko 4 linie danychzmniejszamy liczb niezb dnych po cze modu u z mikrokontrolerem oraz liczbwykorzystanych linii IO Ze wzgl du na znikom ilo danych przesy anych zdo mo-du u wynikaj ce z pod czenia tylko 4 linii danych spowolnienie transmisji jest bezznaczenia W trybie 4-bitowym najpierw transferowana jest starsza a potem m od-sza tetrada Niewykorzystane linie D0 ndash D3 mo na pozostawi niepod czone wi k-szo modu oacutew wewn trznie podci ga niepod czone linie poprzez rezystor do Vcc

Poniewa linie D0 ndash D7 s dwukierunkowe musimy pami ta aby podczas operacjiodczytu z LCD odpowiednie piny mikrokontrolera by y ustawione jako wej cia W prze-ciwnym przypadku dojdzie do konfliktu

Kolejnym sygna em co do ktoacuterego musimy podj decyzj jest sygna RW okre laj cytyp operacji (odczytzapis) Poniewa zwykle zapisujemy dane do LCD w a ciwie niezachodzi konieczno ich odczytywania mo emy ten sygna na sta e po czy z mas oszcz dzaj c w ten sposoacuteb jedn lini IO procesora Takie rozwi zanie ma jednak po-wa n wad mdash po jego zastosowaniu nie jest mo liwe odczytywanie sygna u zaj to cimodu u (ang busy flag) Powoduje to e pomi dzy kolejnymi zapisami do modu u mu-simy stosowa opoacute nienia dobrane na najwolniejsz mo liw okoliczno W efekcieca a transmisja jest wolniejsza ni mog aby by

Je li korzystamy z tych modu oacutew nie musimy pisa w asnych procedur ich obs ugiInstaluj c rodowisko WinAVR (lub nowy toolchain firmy Atmel) w katalogu docavr-libcexamplessdtiodemo znajdziemy gotowe funkcje obs ugi HD44780 Funkcjete nie dzia aj z mikrokontrolerami XMEGA st d te w za czonych przyk adach zosta-y one zmodyfikowane tak aby poprawnie wspoacute pracowa roacutewnie z tymi mikro-kontrolerami

Kup książkę Poleć książkę

48 AVR Uk ady peryferyjne

Mo emy te skorzysta z licznych przyk adoacutew dost pnych w internecie W dalszejcz ci rozdzia u zostan wykorzystane funkcje z pakietu WinAVR napisane przezJoerga Wunscha Pokazane przyk ady zak adaj e wy wietlacz jest po czonyz mikrokontrolerem tak jak na rysunku 222

Rysunek 222 Po czenie LCD z mikrokontrolerem Na goacuterze pod czenie do mikrokontroleraXMEGA na dole pod czenie do modu u Xplained Na schematach pokazano tak e opcjonalne sposobypod czenia pinu Vee odpowiedzialnego za regulacj kontrastu LCD

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 49

Zanim co wy wietlimy na LCD musimy pozna w jaki sposoacuteb s generowane znakiSterownik LCD zawiera w sobie niezale nie od typu u ytej matrycy 80 bajtoacutew pami ciDDRAM (ang Display Data RAM) Je li zastosowana matryca wy wietla mniejszliczb znakoacutew to cz komoacuterek pami ci jest nieu ywana Mo emy je wykorzystado innych celoacutew mdash np jako zwyk pami RAM Mo emy te u y jej do przesu-wania napisoacutew ktoacutere nie mieszcz si na wy wietlaczu Aby mo na by o umie ciznak na w a ciwej pozycji niezb dne jest poznanie organizacji pami ci kontrolera W za-le no ci od u ytej matrycy pami ta jest zorganizowana nast puj co

Dla matryc 16times1 mdash pami jest podzielona na dwa obszary ka dy zawieraj cypo 8 znakoacutew Obszar pierwszy (od lewej) ma adresy 0x00 do 0x07 a obszar drugi(prawy) adresy 0x40 do 0x47 St d te gdy wy wietla si tekst przekraczaj cygranic obszaroacutew nale y zadba aby poszczegoacutelne litery trafi y pod w a ciweadresy

Dla matryc 20times1 mdash adresy 0x00 do 0x13

Dla matryc 16times2 mdash adres pierwszej linii zaczyna si od 0x00 do 0x0f adresdrugiej linii od 0x40 do 0x4f

Dla matryc 20times2 mdash adresy pierwszej linii to 0x00 do 0x13 a drugiej 0x40 do 0x53

Dla matryc 40times2 mdash adresy pierwszej linii to 0x00 do 0x27 drugiej linii 0x40do 0x67

Dla matryc 20times4 mdash adresy pierwszej linii to 0x00 do 0x13 drugiej 0x40 do 0x53trzeciej 0x14 do 0x27 a czwartej 0x54 do 0x67

Jak wida w niektoacuterych typach wy wietlaczy po ka dej linii zostaje od kilku do kil-kunastu bajtoacutew ktoacuterych zawarto nie jest wy wietlana Ma to pewn zalet mdash mo-emy do pami ci modu u wpisywa teksty d u sze ni s wy wietlane na ekranie co

u atwia przewijanie tekstu Niestety ma to te pewn wad mdash funkcje wy wietlaj ceco na ekranie musz bdquowiedzie rdquo jak organizacj ma matryca W przeciwnym przy-padku nie ma mo liwo ci prawid owego wyliczenia adresu komoacuterki do ktoacuterej ma od-by si zapis

W dalszej cz ci rozdzia u zostanie wykorzystany modu LCD o organizacji 16times2(ale mo na te bez problemu wykorzysta dowolny inny)

Zanim b dzie mo na co wy wietli na ekranie modu musi zosta zainicjalizowanyW trakcie inicjalizacji ustawiane s podstawowe parametry pracy sterownika LCD mdashorganizacja matrycy (liczba linii) wielko czcionki (5times8 lub 8times11 pikseli) Wielkoczcionki zale y od typu pod czonej matrycy LCD Dla konkretnego modu u LCDtylko jedna z tych warto ci b dzie poprawna Oproacutecz inicjalizacji modu u nale y tak-e poprawnie ustawi stan pinoacutew IO wykorzystywanych do pod czenia modu u LCD

Wi kszo pracy zwi zanej z inicjalizacj modu u LCD odbieraniem i wysy aniemdo niego danych wykonuje biblioteka Joerga Wunscha Dostarcza ona niskopozio-mowe funkcje umo liwiaj ce komunikacj ze sterownikiem hd44780 i innymi kom-patybilnymi z nim sterownikami Wystarczy e do aplikacji w ktoacuterej planujemy wy-korzysta taki modu do czymy plik hd44780c oraz plik nag oacutewkowy hd44780h

Kup książkę Poleć książkę

50 AVR Uk ady peryferyjne

Oba pliki bdquozak adaj rdquo e istnieje plik nag oacutewkowy definesh zawieraj cy podstawo-we definicje zwi zane ze sposobem pod czenia modu u LCD z mikrokontroleremNa pocz tku nale y okre li ktoacutere linie IO zosta y wykorzystane do pod czenia modu u

define HD44780_RS A 4define HD44780_RW A 5define HD44780_E A 6define HD44780_D4 A 0

W powy szym przyk adzie do kolejnych linii portu A (A4 ndash A6) zosta y pod czonesygna y RS RW i E modu u natomiast do linii A0 ndash A3 linie D4 ndash D7 modu u LCD Wa nejest aby linie danych czy z pinami IO w kolejno ci rosn cej Biblioteka wykorzy-stuje do transmisji danych pomi dzy modu em a mikrokontrolerem tylko 4 linie danychmdash dzi ki temu mo emy zmniejszy liczb po cze a zwolnione linie IO wykorzystado innych celoacutew W pliku wyst puje jeszcze jedna definicja

define USE_BUSY_BIT 1

Okre la ona e biblioteka b dzie u ywa flagi Busy modu u LCD mdash umo liwia touzyskanie optymalnej szybko ci wspoacute dzia ania z modu em Zako czenie realizacjibie cej operacji modu sygnalizuje zmian stanu tej flagi co umo liwia niezw ocznewys anie kolejnej komendy Je li nie u ywamy flagi Busy program musi generowamaksymalne zalecane w nocie katalogowej opoacute nienia w efekcie ca a transmisja zwal-nia Po zdefiniowaniu u ywanych pinoacutew w pliku definesh mo emy rozpocz korzy-stanie z biblioteki

W pliku hd44780h s udost pnione prototypy funkcji odpowiedzialnych za wspoacute -prac z modu em LCD

Funkcje bibliotecznePodstaw modu u stanowi dwie funkcje umo liwiaj ce odpowiednio wys anie da-nych do modu u oraz ich odczytanie

void hd44780_outbyte(uint8_t b uint8_t rs)uint8_t hd44780_inbyte(uint8_t rs)

Obie funkcje wysy aj odczytuj 8-bitow dan w przypadku wykorzystania tylko4-bitowej szyny danych wysy anie i odczytywanie danych odbywa si w dwoacutech etapachDodatkowo zmienna rs okre la tryb dost pu W przypadku wysy ania danych do modu urs = 0 powoduje e dane zostan wys ane do rejestru komend a je li rs = 1 dane trafido rejestru danych Przy odczycie jest podobnie z tym e dla rs = 0 jest odczytywanaflaga Busy i rejestr AC (ang Address Counter)

Kolejna funkcja odpowiada za oczekiwanie na gotowo modu uvoid hd44780_wait_ready(bool islong)

W przypadku gdy w pliku definesh symbol USE_BUSY_FLAG ma warto 1 parametrislong jest ignorowany a optymalizator kompilatora usuwa go gdy nie jest on wy-korzystywany przez funkcj Kiedy warto USE_BUSY_FLAG jest roacute na od 1 parametr

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 51

ten okre la d ugo opoacute nienia Je li jest roacute na od 0 opoacute nienie wynosi 152 ms a je-eli jest roacutewna 0 opoacute nienie wynosi 37 s Poniewa lepiej jest u ywa flagi Busy

mo emy ten parametr ignorowa

Powy sze trzy funkcje wystarcz do komunikacji z modu em dla wygody zdefiniowanojednak kolejne Funkcje hd44780_outcmd(n) i hd44780_incmd() umo liwiaj odpowiedniowys anie polecenia do rejestru komend kontrolera lub odczytanie bitu Busy i licznikaAC Dwie kolejne mdash hd44780_outdata(n) oraz hd44780_indata() mdash umo liwiaj zapisi odczytanie rejestru danych

Oproacutecz funkcji odpowiedzialnych za komunikacj z modu em LCD zdefiniowano tak efunkcj przeprowadzaj c podstawow inicjalizacj modu u hd44780_init(void) orazfunkcj hd44780_powerdown(void) ustawiaj c wszystkie linie u yte do komunikacjiw stan 0 co umo liwia bezpieczne od czenie zasilania od modu u LCD W przypadkupozostawienia ktoacuterej z wy ej wymienionych linii w stanie 1 przy od czonym za-silaniu modu u stanowi ona jego zasilanie W efekcie mimo wy czenia modu mo epobiera znaczny pr d

Szerszego omoacutewienia wymaga funkcja hd44780_outcmd(cmd) ktoacutera umo liwia wys a-nie polecenia do rejestru polece sterownika LCD Dla wygody zdefiniowane zosta yroacute ne komendy u atwiaj ce wspoacute prac z modu em LCD Komendy te s przekazy-wane jako argument wywo ania funkcji hd44780_outcmd np

hd44780_outcmd(HD44780_CLR)

powoduje wys anie do sterownika polecenia HD44780_CLR czyszcz cego zawartopami ci DDRAM kontrolera

KomendyFunkcja hd44780_outcmd przyjmuje jako argument predefiniowane makrodefinicjeznacznie u atwiaj ce wspoacute prac z kontrolerem modu u LCD Poni ej zostan onepokroacutetce omoacutewione

HD44780_SHIFT(shift right)Ta makrodefinicja powoduje przesuni cie pozycji wy wietlanego tekstu (shift = 1)o jedn pozycj w lewo (argument right = 0) lub w prawo (argument right = 1)W przypadku gdy shift = 0 przesuwany w lewo lub prawo jest tylko kursor Wysy-aj c wielokrotnie to polecenie uzyskujemy kolejne przesuni cia o jedn pozycj

w lewo lub prawo Polecenie to s u y g oacutewnie do przesuwania tekstu Jednak ze wzgl duna du bezw adno tekstowych modu oacutew LCD nie nale y przesuwa liter cz ciej niok raz na sekund mdash cz stsze przesuwanie daje bardzo nieprzyjemne efekty wizual-ne Ka dy bufor linii jest bdquozawijanyrdquo to znaczy e po ostatnim znaku z prawej jestwy wietlany pierwszy znak z lewej i odwrotnie Nale y pami ta e d ugo buforajest sta a dla danego modelu matrycy Np dla modu oacutew 16times2 bufor jednej linii wyno-si dok adnie 40 bajtoacutew z czego 16 jest jednorazowo wy wietlanych Poni szy kodcyklicznie przewija wy wietlany tekst w lewo

lcd_puttext_P(PSTR(Test bufora i przewijania tekstunTen tekst przewija sie w lewo))while(1)

Kup książkę Poleć książkę

52 AVR Uk ady peryferyjne

hd44780_outcmd(HD44780_SHIFT(10)) _delay_ms(700)

HD44780_FNSET(if8bit twoline font5x10)Polecenie to wybiera typ interfejsu mdash 8-bitowy je li warto parametru if8bit jestroacutewna 1 lub 4-bitowy je li jest roacutewna 0 Typ interfejsu musi odpowiada sposobowipo czenia modu u z mikrokontrolerem Parametr twoline okre la czy pod czonamatryca LCD ma jedn lini znakoacutew czy dwie Matryce ktoacutere maj 4 linie tekstu straktowane przez kontroler jako matryce dwuliniowe mdash parametr twoline powinienmie warto 1 Je li dla matrycy zawieraj cej dwie lub wi cej linii ustawimy go na 0to wy wietlana b dzie tylko jedna linia (w przypadku matryc dwuliniowych goacuterna)a w przypadku matryc 4-liniowych b d wy wietlane dwie linie rozdzielone lini pust

Ostatni parametr okre la typ u ywanego generatora znakoacutew Powinien on odpowiadau ytej w module matrycy zwykle wi c jego warto wynosi 0

HD44780_DISPCTL(disp cursor blink)Ustawia roacute ne parametry pracy matrycy Je li parametr disp ma warto 1 to matrycajest w czona (wy wietla zawarto DDRAM) a je li 0 to matryca jest wy czonalecz stan pami ci DDRAM nie ulega zmianie Np kod

while(1) hd44780_outcmd(HD44780_DISPCTL(011)) _delay_ms(700) hd44780_outcmd(HD44780_DISPCTL(111)) _delay_ms(700)

powoduje naprzemienne w czanie i wy czanie matrycy w efekcie wy wietlany tekstmruga

Parametr cursor okre la czy sprz towo wy wietlany kursor ma by widoczny (war-to parametru 1) czy niewidoczny (warto parametru 0) Je li kursor jest widocznyto dodatkowo mo emy okre li czy ma miga (warto parametru blink roacutewna 1)czy nie (blink = 0) Je li kursor jest widoczny i nie miga jest wy wietlany w postacipoziomej kreski Wy wietlanie kursora mo e by u yteczne w sytuacji kiedy u yt-kownik wprowadza jakie dane W pozosta ych sytuacjach kursor mo emy wy czy

HD44780_ENTMODE(inc shift)Okre la sposoacuteb wprowadzania danych do pami ci Je li parametr inc ma warto 1 topo ka dej operacji zapisuodczytu adres pami ci jest automatycznie zwi kszany o je-den co przy piesza operacj zapisuodczytu kolejnych znakoacutew Je li warto inc jestroacutewna 0 to adres jest automatycznie zmniejszany o 1 Dodatkowo parametr shiftokre la czy wy wietlany obraz ma by automatycznie przesuwany tak aby wy wie-tla ostatnio wprowadzony znak (shift = 1) lub go nie wy wietla (shift = 0)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 53

HD44780_CLRPowoduje wyczyszczenie (wype nienie znakami o kodzie 32) ca ej zawarto ci pami ciDDRAM Jednocze nie kursor wraca do pozycji pierwszej (pierwsza linia pierwszyznak)

Niewy wietlane bajty pami ci DDRAM tak e s kasowane Je li s one u ywanedo przechowywania zmiennych programu to przed operacj kasowania nale y jeskopiowa w bezpieczne miejsce W przeciwnym przypadku zostan utracone

Wska nik adresu do pami ci DDRAM jest ustawiany na 0 zerowane jest tak e prze-suni cie

HD44780_HOMEPowoduje powroacutet kursora do pozycji pocz tkowej mdash pierwsza linia pierwszy znakWska nik adresu do pami ci DDRAM w efekcie zawiera 0 zerowane jest roacutewnieprzesuni cie wy wietlania znakoacutew w efekcie s one wy wietlane od pozycji 0

HD44780_DDADDR(addr)Ustawia nast pny adres zapisuodczytu w pami ci DDRAM na addr Tylko 7 bitoacutewargumentu addr jest branych pod uwag w zwi zku z czym mo na zaadresowa mak-symalnie 128 bajtoacutew pami ci (z czego sterownik ma tylko 80 pozosta e lokacje snieu ywane)

HD44780_CGADDR(addr)Ustawia nast pn operacj odczytuzapisu w pami ci CGRAM na addr Pod uwagbranych jest tylko 6 bitoacutew zmiennej addr w efekcie mo na zaadresowa maksymalnie64 bajty pami ci CGRAM

Przedstawione powy ej funkcje zapewniaj jedynie podstawow komunikacj z mo-du em LCD Potrzebujemy jednak ci gle funkcji odpowiedzialnej za jego inicjalizacjmdash funkcja biblioteczna przeprowadza ten proces tylko w podstawowym zakresie musi-my jeszcze zadba o w a ciwe ustawienie parametroacutew zwi zane z posiadan matryc Napiszmy wi c w asne rozwini cie funkcji inicjalizacyjnej

void lcd_init() hd44780_init() Podstawowa inicjalizacja modu u hd44780_outcmd(HD44780_CLR) Wyczy pami DDRAM hd44780_wait_ready(1000) hd44780_outcmd(HD44780_ENTMODE(1 0)) Tryb autoinkrementacji AC hd44780_wait_ready(1000) hd44780_outcmd(HD44780_DISPCTL(1 0 0)) W cz wy wietlacz wy cz kursor hd44780_wait_ready(1000)

Zauwa e po wys aniu ka dego polecenia do modu u jest wywo ywana funkcjahd44780_wait_ready(1000) odpowiedzialna za oczekiwanie a realizacja wys anego po-lecenia dobiegnie ko ca Jest to niezb dne gdy do czasu uko czenia bie cej

Kup książkę Poleć książkę

54 AVR Uk ady peryferyjne

operacji dalsze polecenia s ignorowane Jako argument podany jest parametr 1000mdash jest on bez znaczenia nasza biblioteka korzysta z flagi Busy i po prostu go ignorujePo wykonaniu powy szej funkcji modu LCD jest poprawnie zainicjalizowany a jegopami jest wyczyszczona (zawiera bajty 0x20) i w efekcie modu nic nie wy wietlaOd tej chwili mo emy wysy a znaki do wy wietlenia

Po wykonaniu inicjalizacji ekran mo e pozosta czysty lub wy wietla ca kowiciewype nione kwadraty (wszystkie piksele w czone) Je li po inicjalizacji wszystkiepiksele s w czone nale y nieco zmniejszy kontrast

Aby sobie u atwi to zadanie zdefiniujmy funkcj wysy aj c do modu u jeden znakvoid lcd_putchar(char c) static bool second_nl_seen static uint8_t line=0

if ((second_nl_seen) ampamp (c = n)ampamp(line==0)) Odebrano pierwszy znak hd44780_wait_ready(40) hd44780_outcmd(HD44780_CLR) hd44780_wait_ready(1600) second_nl_seen=false if (c == n) if (line==0) line++ hd44780_outcmd(HD44780_DDADDR(64)) Adres pierwszego znaku drugiej linii hd44780_wait_ready(1000) else second_nl_seen=true line=0 else hd44780_outdata(c) hd44780_wait_ready(40)

Funkcja ta ze wzgl du na skomplikowane adresowanie pami ci DDRAM jest zale naod konkretnego modelu modu u LCD B dzie prawid owo wspoacute pracowa z modu a-mi 2times16 2times20 i 2times40 znakoacutew W przypadku innych modu oacutew pozycje niektoacuterychznakoacutew mog by nieprawid owe

Mo emy ju wy wietla na LCD pojedyncze znaki czas na wy wietlanie tekstu Po-niewa teksty jako sta e dla zaoszcz dzenia cennej pami ci RAM przechowuje si za-zwyczaj w pami ci FLASH zdefiniujmy funkcj odczytuj c podany a cuch zna-kowy z pami ci FLASH a nast pnie umieszczaj c go na LCD

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 55

void lcd_puttext_P(prog_char txt) char ch while((ch=pgm_read_byte(txt))) lcd_putchar(ch) txt++

Powy sza funkcja wysy a kolejne znaki odczytane z pami ci FLASH na LCD za po-moc funkcji LCD_putchar Po napotkaniu znaku ko ca a cucha (0 nul) przerywa swojedzia anie

Pozostaje nam przetestowa dzia anie przedstawionych funkcjiint main() lcd_init() lcd_puttext_P(PSTR(Test LCDnDruga linia)) while(1)

Na ekranie modu u LCD powinien wy wietli si napisTest LCDDruga linia

Je li na LCD nic nie widzimy to w pierwszej kolejno ci powinni my sprawdzi kon-trast zmieniaj c napi cie na pinie Vee modu u LCD

Warto zdefiniowa jeszcze funkcj ustawiaj c pozycj od ktoacuterej b dzie wy wietlanynast pny znak

void lcd_goto(uint8_t x uint8_t y) hd44780_outcmd(HD44780_DDADDR(0x40y+x)) hd44780_wait_ready(1000)

Funkcja ta przyjmuje dwa parametry x i y okre laj ce pozycj na ktoacuterej zostaniewy wietlony nast pny znak wys any z mikrokontrolera do modu u LCD Dzi ki temuz atwo ci mo emy uaktualnia zawarto LCD bez konieczno ci ponownego prze-sy ania wszystkich danych Funkcja ta jest zale na od typu zastosowanego modu u

Ostatni funkcj jest funkcja umo liwiaj ca czyszczenie zawarto ci pami ci modu uOdpowiedzialne za to jest proste polecenie wysy ane do sterownika

void lcd_cls() hd44780_outcmd(HD44780_CLR) hd44780_wait_ready(false)

Oproacutecz czyszczenia zawarto ci pami ci modu u powoduje ono ustawienie kursoraw punkcie (00)

Kup książkę Poleć książkę

56 AVR Uk ady peryferyjne

Definiowanie w asnych znakoacutewUk ad HD44780 jest wyposa ony w 64 bajty pami ci CGRAM (ang Character Ge-nerator RAM) ktoacutera mo e przechowywa mapy bitowe 8 znakoacutew o matrycy 5times8 pikselilub 4 znakoacutew o matrycy 5times10 pikseli Przyk ad definicji znaku na matrycy 5times8 poka-zano na rysunku 223

Rysunek 223Przyk ad definicji w asnego znakuw pami ci CGRAM Znak rysujemyna matrycy 5times8 bitoacutew polazaciemnione odpowiadaj warto ci 1pola bia e warto ci 0 Wartowyliczon dla ka dej linii pikseliwpisujemy do pami ci CGRAMsterownika Najstarsze 3 bity ka degobajta (pola szare) s bez znaczeniamdash wy wietlacz pomija jeprzy wy wietlaniu obrazu

1

2

3

4

5

6

7

0 00100 = 4

01110 = 14

11111 = 31

00100 = 4

00100 = 4

00100 = 4

11111 = 31

01110 = 14

Adres Warto

Dost p do tej pami ci jest mo liwy dzi ki wys aniu polecenia ustawiaj cego adreszapisuodczytu pami ci CGRAM Po jego wys aniu wszystkie operacje zapisu i od-czytu dotycz tej pami ci a nie pami ci DDRAM Aby wroacuteci do adresowania pa-mi ci DDRAM nale y wybra jej adres lub dokona operacji wymagaj cej przesu-ni cia kursora

Pami CGRAM jest pami ci ulotn po ponownym w czeniu zasilania definicjeznakoacutew musz by ponownie przes ane przez procesor

Bity o warto ci 1 w definicji znaku odpowiadaj w czonym pikselom bity o warto-ci 0 pikselom wy czonym Najstarsze 3 bity ka dego bajta w pami ci CGRAM s

bez znaczenia mdash te pozycje nie s wy wietlane przez matryc Definiuj c znak nale-y tak e pami ta e ostatnia linia wy wietlana przez matryc (w zale no ci od wiel-

ko ci matrycy znaku linia 8 lub 10) powinna zawiera same zera mdash w tej linii b dziewy wietlany kursor

Najcz ciej matryce LCD pod czone do sterownika HD44780 maj organizacj 5times8czyli jeden znak jest definiowany przez 8 kolejnych bajtoacutew okre laj cych stan po-szczegoacutelnych linii tworz cych znak Stwoacuterzmy funkcj ktoacuterej zadaniem b dzie za a-dowanie definicji znakoacutew z pami ci FLASH mikrokontrolera do pami ci CGRAM

void lcd_defchar_P(uint8_t charno prog_uint8_t chardef) hd44780_outcmd(HD44780_CGADDR(charno8)) hd44780_wait_ready(40) for(uint8_t c=0clt8c++) hd44780_outdata(pgm_read_byte(chardef))

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 57

hd44780_wait_ready(40) chardef++

Funkcja LCD_defchar_P jako argumenty przyjmuje numer definiowanego znaku (0 ndash 7)oraz wska nik do obszaru pami ci FLASH zawieraj cego definicj znaku (obszarten zajmuje 8 nast puj cych po sobie bajtoacutew) Jak widzimy funkcja najpierw ustawiaw a ciwy adres pod ktoacuterym znajdzie si pocz tek definicji znaku w pami ci CGRAMmdash poniewa jeden znak jest opisywany za pomoc 8 bajtoacutew kolejne adresy znakoacutewto kod_znakutimes8 Nast pnie dane opisuj ce znak s adowane z pami ci mikrokontrolerai zapisywane w pami ci CGRAM sterownika Poni szy program ilustruje wykorzy-stanie funkcji LCD_defchar_P

prog_uint8_t char1[8][8]=0000000255 00000025525500000255255255 0000255255255255 00025525525525525500255255255255255255 0255255255255255255255255255255255255255255255

int main() for(uint8_t x=0xlt8x++) lcd_defchar_P(xampchar1[x][0]) Za aduj wzorce znakoacutew lcd_init() for(uint8_t x=0xlt8x++) lcd_putchar(x) Wy wietl znaki o kodach 0 ndash 7 while(1)

W pierwszej linii funkcji main nast puje za adowanie nowych definicji znakoacutew dopami ci CGRAM nast pnie inicjalizowany jest wy wietlacz po czym w pierwszejlinii s wy wietlane znaki o kodach 0 ndash 7 a wi c znaki ktoacuterych definicja zosta aprzes ana z mikrokontrolera

Zauwa e pami CGRAM podobnie jak DDRAM mo emy zapisywa i odczytywaprzed inicjalizacj modu u LCD Proces inicjalizacji jest potrzebny tylko do prawi-d owego wy wietlania na ekranie LCD

Poniewa dane potrzebne do wy wietlenia znaku s na bie co pobierane z pami cipodczas od wie ania matrycy LCD jakiekolwiek zmiany w definicji znaku kiedy jest onwidoczny na LCD poci gaj za sob natychmiastowe zmiany w wy wietlanym obrazieMo na t w a ciwo sterownika wykorzysta do stworzenia prostych animacji

void lcd_box(uint8_t y) hd44780_outcmd(HD44780_CGADDR(0)) Zaczynamy od znaku o kodzie 0 hd44780_wait_ready(40) for(uint8_t c=0cltyc++) Stwoacuterz linie z w czonymi pikselami hd44780_outdata(0xFF) hd44780_wait_ready(40) for(uint8_t c=yclt8c++) Stwoacuterz linie z wy czonymi pikselami hd44780_outdata(0x00) hd44780_wait_ready(40)

Kup książkę Poleć książkę

58 AVR Uk ady peryferyjne

int main() lcd_init() lcd_putchar(0) while(1) for(uint8_t x=0xlt8x++) lcd_box(x) _delay_ms(100) for(int8_t x=7xgt=0x--) lcd_box(x) _delay_ms(100)

Funkcja main wy wietla na LCD tylko jeden znak o kodzie 0 a nast pnie cykliczniezmienia jego definicj w pami ci CGRAM W efekcie posta znaku wy wietlana naekranie ci gle si zmienia

Transakcyjna obs uga LCDPokazana do tej pory obs uga LCD alfanumerycznego mia a pewne wady Jak wiemyoperacje odwo uj ce si do kontrolera LCD s niezwykle wolne cykl odczytuzapisudowolnego rejestru kontrolera trwa co najmniej 1600 ns co dla MCU taktowanegozegarem 32 MHz przek ada si na czas wykonania oko o 52 instrukcji asemblera Cogorsza wi kszo komend realizowanych przez kontroler jest wykonywana w czasieoko o 37 s co przek ada si na tysi ce zmarnowanych taktoacutew MCU St d te jaki-kolwiek zapisodczyt LCD to z perspektywy programu straszne marnotrawstwo czasu

Problem ten dotyczy ka dego urz dzenia IO ktoacutere dzia a wolniej ni procesor W takiejsytuacji warto napisa pewn warstw po redni mdash sterownik mdash ktoacuterego zada-niem b dzie buforowanie da dost pu do urz dzenia i rozstrzyganie konfliktoacutewdzi ki czemu roacute ne cz ci programu b d bdquomia y wra enierdquo e maj wy czny do-st p do urz dzenia

Pokazane wcze niej funkcje obs ugi LCD maj jeszcze jedn wad mdash nie s wspoacute bie -ne czyli nie mo na ich wykonywa jednocze nie w kilku miejscach programu w tymw szczegoacutelno ci w programie g oacutewnym i w funkcjach obs ugi przerwa W wielu przy-padkach ta wada jest bez znaczenia jednak czasami jest uci liwa mdash dla przyk adugdy na wy wietlany tekst chcieliby my na o y inne informacje np o dacie lub godzi-nie Oczywi cie wy wietlanie mo na zorganizowa tak aby nie by o potrzeby pisaniawspoacute bie nego kodu np poprzez zastosowanie bufora pami ci VRAM kontrolera LCDRodzi to jednak kolejne problemy i jest ma o eleganckie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 59

Zastanoacutewmy si w jaki sposoacuteb najlepiej jednocze nie rozwi za problem wolnegodost pu do urz dzenia i wspoacute bie no ci kodu Rozwi zaniem mo e by wprowadze-nie tzw transakcji Transakcj nazywamy zbioacuter operacji tworz cych pewn ca-o To co wyroacute nia tak wykonywany zestaw operacji to atomowo spoacutejno

izolacja i trwa o Pod tymi terminami kryje si istota wykonywanej operacji Ato-mowo transakcji zapewnia e jest ona wykonywana w sposoacuteb niepodzielny co gwa-rantuje nam prawid ow wspoacute prac z danym urz dzeniem IO w tym przypadku kon-trolerem LCD Wa na dla nas jest tak e izolacja mdash dzi ki temu inne operacje na LCD(inne transakcje) nie b d mia y wp ywu na wynik aktualnie wykonywanej transakcjimdash nie b d zak oacuteca y jej wykonania z drugiej strony nasza transakcja nie zak oacuteciwykonania innych Trwa o z kolei zagwarantuje nam e je li sterownik potwierdziwykonanie transakcji to znaczy e efekt jej dzia ania jest wy wietlony na LCD Tacecha nie jest nam a tak potrzebna mdash jest ona wydawa oby si oczywista Niemniej jestto pewna gwarancja e ca a operacja przebieg a poprawnie i w efekcie LCD znajdujesi w okre lonym przez nas stanie Tyle teorii przejd my do praktyki

Kody poni szego przyk adu znajduj si w katalogu PrzykladyLCD-alfaLCD-transact

Aby zapewni transakcyjny dost p do LCD musimy stworzy pewne struktury danychktoacuterych zadaniem b dzie przechowywanie informacji o operacjach sk adaj cych sina transakcje i stanie ich wykonania W tym celu pos u ymy si wiadomo ciami z roz-dzia u 5 bdquoJak uporz dkowa chaos czyli z o one typy danych i listyrdquo Do przecho-wywania oczekuj cych transakcji pos u ymy si buforem pier cieniowym zanimjednak go zaimplementujemy zastanoacutewmy si jak powinna wygl da struktura prze-chowuj ca informacje o transakcji Struktura ta powinna zawiera co najmniej

pole danych (data) z informacjami ktoacutere maj by przes ane do kontrolera LCD

pole okre laj ce liczb danych do wys ania (len)

pole okre laj ce realizowane polecenie dla LCD (cmd) mdash pole to pos u yprogramowi sterownika do w a ciwej interpretacji danych znajduj cych siw polu data

kilka poacutel kontrolnych przechowuj cych informacje potrzebne do realizacjisamej transakcji Jedno z nich mdash Ready mdash b dzie przyjmowa warto trueje li dana transakcja zosta a zrealizowana lub false w przeciwnym przypadkuZnaczenie drugiego pola mdash SelfDel mdash mo e wydawa si nieco enigmatycznepole to okre la czy pami przydzielona dla transakcji ma by zwolnionaw sterowniku LCD (warto true) czy te zostanie zwolniona w programie(warto false)

Oto jak mo e wygl da struktura definiuj ca transakcj typedef struct volatile bool Ready 1 true je li transakcja zosta a zrealizowana bool SelfDel 1 true je li pami przydzielona transakcji ma zosta zwolniona LCD_Cmd cmd 2 Polecenie do zrealizowania uint8_t len 6 D ugo polecenia

Kup książkę Poleć książkę

60 AVR Uk ady peryferyjne

unsigned 0 Wyroacutewnanie do granicy bajta uint8_t data[] Dane transakcji LCD_trans

Nale y zwroacuteci uwag na poleunsigned 0

Nie definiuje ono adnego pola struktury ale jedynie informuje kompilator e kolejnepole (w naszym przyk adzie o nazwie data) ma by wyroacutewnane do granicy bajta mdashdzi ki temu dost p do kolejnego pola b dzie odbywa si szybciej Z kolei samo poledata jest zadeklarowane jako tzw typ niekompletny

Typ niekompletny (ang incomplete type) to typ ktoacuterego rozmiaru nie da si okre li

W pokazanym przyk adzie rozmiaru pola data nie da si okre li gdy zosta on za-deklarowany jako typ tablicowy z tym e nie podano wielko ci tablicy Wielko ci niepodano gdy na etapie deklaracji struktury nie wiemy jakiej wielko ci dane b d w niejprzechowywane Tego typu deklaracja ma bardzo powa ne konsekwencje mdash skorowielko ci pola data nie da si okre li to jaki b dzie wynik dzia ania operatora sizeof(LCD_trans) Kompilator stara si jako wybrn z tej sytuacji w zwi zku z czym

zwroacuteci wielko struktury ale tak jakby pole data w ogoacutele nie istnia o mdash jego roz-miar b dzie wynosi 0 W ramach wiczenia zastanoacutew si ile bajtoacutew pami ci b dziezajmowa a struktura LCD_trans

Skoro dysponujemy ju struktur przechowuj c poszczegoacutelne transakcje pora nastworzenie obiektu przechowuj cego kolekcj transakcji Dodanie kolejnej strukturyb dzie polega o na dodaniu jej do takiego obiektu z drugiej strony program sterownikaLCD b dzie moacuteg z tej kolekcji pobiera kolejne transakcje do realizacji Opis ten przy-pomina opis dzia ania bufora pier cieniowego mdash z jednym wyj tkiem mdash po zape nie-niu ca ego bufora nie b dziemy usuwa niezrealizowanych transakcji lecz zabloku-jemy dodawanie kolejnych W tym celu pos u ymy si definicj nast pnej struktury

typedef struct LCD_trans elements[LCD_MAXTRANS] Wska niki do transakcji uint8_t Beg Pierwszy element bufora uint8_t Count Liczba elementoacutew w buforze CircBuffer

Struktura ta zawiera deklaracj tablicy wska nikoacutew na transakcje (pole elements)Poniewa jest to tablica musimy zna liczb jej elementoacutew mdash jest ona zadeklarowanaw sta ej LCD_MAXTRANS

define LCD_MAXTRANS 10 Maksymalna liczba pami tanych transakcji

Do realizacji bufora s potrzebne jeszcze dwa pola Beg wskazuj ce na pierwsztransakcj w buforze oraz pole Count okre laj ce liczb transakcji znajduj cych siw buforze Je li Count == 0 to znaczy e w buforze nie ma adnych oczekuj cychtransakcji a je li Count == LCD_MAXTRANS to znaczy e bufor jest pe ny i nie mo na

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 61

dodawa do niego kolejnych transakcji W a ciwo t wykorzystuj dwie zdefiniowanew pliku LCD_transc funkcje

static inline bool cbIsFull(CircBuffer cb) return cb-gtCount == LCD_MAXTRANS

static inline bool cbIsEmpty(CircBuffer cb) return cb-gtCount == 0

Jak pami tamy w przypadku funkcji modyfikatory static inline powoduj e danafunkcja nie b dzie istnie jako samodzielna lecz w ka dym miejscu w ktoacuterym jestwywo ywana jest wstawiany raczej jej kod a nie wywo anie Ma to znaczenie dlakroacutetkich funkcji (a wi c takich jak pokazane powy ej) dla ktoacuterych koszty wywo anias zazwyczaj wi ksze ni koszty umieszczenia cia a funkcji w miejscu jej wywo aniaTego typu funkcje zachowuj si w sposoacuteb zbli ony do makrodefinicji (z tym e re-spektuj wszystkie regu y j zyka C w szczegoacutelno ci kolejno operatoroacutew czy kon-trol typoacutew)

Takie funkcje jako argument pobieraj adres bufora na ktoacuterym maj operowa W na-szym przypadku bufor jest zdefiniowany nast puj co

static CircBuffer LCD_TransBuffer Bufor na transakcje

Nale y zauwa y e jest on zdefiniowany jako struktura globalna z modyfikatoremstatic Modyfikator ten ogranicza zasi g widoczno ci zmiennej LCD_TransBuffer dopliku w ktoacuterym zmienna ta zosta a zdefiniowana (w tym przypadku modyfikator staticjest niejako przeciwie stwem modyfikatora extern) Dzia anie to ma jedynie znaczeniekosmetyczne mdash uniemo liwia odwo anie si do bufora za pomoc funkcji ktoacutere niezosta y zdefiniowane w miejscu jego definicji Oproacutecz funkcji umo liwiaj cych okre-lenie stanu bufora potrzebne s jeszcze funkcje umo liwiaj ce dodanie i pobranie trans-

akcji Pierwsz funkcj b dzie funkcja dodaj ca transakcj do buforabool cbAdd(CircBuffer cb LCD_trans elem) ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsFull(cb)) return false Czy jest miejsce w kolejce uint8_t end = (cb-gtBeg + cb-gtCount) LCD_MAXTRANS cb-gtelements[end] = elem Dodaj transakcj ++cb-gtCount Liczba elementoacutew w buforze return true Wszystko OK

Funkcja ta dodaje transakcj (zmienna elem) do bufora ko owego Zanim transakcjazostanie dodana sprawdzane jest czy w buforze jest miejsce mdash je li nie funkcjazwroacuteci false Je li dodanie jest mo liwe warto licznika okre laj cego liczb trans-akcji przechowywana w buforze (Count) zwi ksza si o jeden Warto zastanowi si te dlaczego praktycznie ca e cia o tej funkcji jest zamkni te w sekcji atomowej (ATOMIC_BLOCK) Jedn z cech naszego sterownika ma by mo liwo wspoacute bie nego dost pu

Kup książkę Poleć książkę

62 AVR Uk ady peryferyjne

do LCD mdash to znaczy e danie np zapisu do LCD mo e wyst pi zaroacutewno w g oacutewnejp tli programu jak i asynchronicznie w przerwaniu St d te wynika e funkcja do-daj ca transakcj musi by napisana w sposoacuteb zapewniaj cy jej poprawn prac w sytu-acji gdy zostanie ona przerwana i ponownie wywo ana przed zako czeniem dzia aniajej poprzedniej instancji Umieszczenie cia a tej funkcji w sekcji atomowej nam to za-pewnia mdash dzi ki temu bufor transakcji zawsze b dzie spoacutejny Dla zaspokojenia cie-kawo ci warto usun sekcj atomow i sprawdzi jak wtedy b dzie zachowywa si tafunkcja i jak wp ynie to na spoacutejno przechowywanych danych

Drug niezb dn funkcj jest funkcja odczytuj ca bufor transakcji i zwracaj ca trans-akcj do zrealizowania (lub NULL je li adnej transakcji nie ma w buforze)

LCD_trans cbRead(CircBuffer cb) LCD_trans elem ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsEmpty(cb)) return NULL Bufor pusty nie mo na zwroacuteci elementu elem = cb-gtelements[cb-gtBeg] cb-gtBeg = (cb-gtBeg + 1) LCD_MAXTRANS -- cb-gtCount Zmniejszamy liczb elementoacutew pozosta ych w buforze return elem

Funkcja ta jest bardzo podobna do poprzedniej mdash najpierw sprawdza czy bufor za-wiera jak oczekuj c transakcj (cbIsEmpty(cb)) je li tak to zwraca adres opisuj -cej j struktury i zmniejsza liczb transakcji oczekuj cych (pole Count) W ten sposoacutebmamy zrealizowan ca funkcjonalno zwi zan z obs ug bufora pier cieniowegoPokazane funkcje s uniwersalne i z bardzo podobnych (lub wr cz tych samych) b -dziemy korzysta w kolejnych rozdzia ach w kontek cie np obs ugi transakcji zwi -zanych z interfejsami szeregowymi

Pora przej do samego sterownika LCD Jego zadaniem b dzie sprawdzenie czyw buforze oczekuj jakie transakcje do realizacji a je li tak to ich wykonanie Ponie-wa dane do LCD mog by wysy ane co okre lony minimalny czas znacznie d u -szy ni czas jakiego na to zadanie potrzebuje mikrokontroler do wysy ania kolejnychpaczek danych pos u ymy si timerem Timer b dzie generowa przerwanie nadmiaru(TCD0_OVF_vect) ktoacutere b dzie wyznacza o tempo w jakim kolejne porcje danych b -d trafia y do LCD Z noty katalogowej kontrolera wynika e minimalny czas trwa-nia wysokiego stanu sygna u Enable to 230 ns a okres tego sygna u nie powinien bykroacutetszy ni 500 ns Poniewa nasz dost p do LCD odbywa si w sposoacuteb nieblokuj cyMCU wi c szybko wysy ania danych do LCD jest bez znaczenia St d te w poka-zanym przyk adzie przyj to e dane b d wysy ane co 4 s co okre la sta a

define LCD_ACCESSTIME 0000004

Poniewa komunikacja z LCD odbywa si w sposoacuteb nieblokuj cy nie zale y nam tena czasie (i tak w stosunku do czasu od wie ania samego LCD jest on bardzo kroacutetki)w efekcie nie ma potrzeby odczytywania flagi busy kontrolera Dzi ki temu w cz ciprzypadkoacutew mo emy w ogoacutele zrezygnowa z sygna u wyboru RW i wymusi jego sta y

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 63

poziom logiczny umo liwiaj cy zapis do LCD Dzi ki temu mo na zaoszcz dzi do-datkowy pin IO1

Ca a logika naszego sterownika jest zawarta w funkcji obs ugi przerwania przepe nieniatimera (TCD0_OVF_vect) Poniewa LCD jest po czony z MCU w trybie 4-bitowym(dla zaoszcz dzenia liczby wykorzystanych pinoacutew IO) kolejne 8-bitowe dane muszby podzielone na dwie tetrady i wys ane do LCD w kolejno ci starszam odsza tetradaInformacja o aktualnie wysy anych danych jest umieszczona w zmiennej trans o typie

static struct uint8_t pos 6 Pozycja w polu danych aktualnej transakcji uint8_t nibble 1 Ktoacutera tetrada jest wysy ana seq

Dlaczego tak Dzi ki wykorzystaniu struktury i poacutel bitowych mo na zaoszcz dzi je-den bajt pami ci SRAM Ze wzgl du na wielko pami ci obs ugiwanej przez kon-troler LCD mo emy by pewni e transakcje zawieraj ce wi cej ni 63 bajty s ra-czej nierealne (nie mia yby wi kszego sensu) St d te do przechowywania informacjio aktualnie wysy anym bajcie danych wystarczy 6 bitoacutew mdash tyle samo zosta o wyko-rzystanych do okre lenia d ugo ci pola danych transakcji w strukturze LCD_trans Zaosz-cz dzony bit mo na po wi ci na flag nibble okre laj c ktoacutera tetrada (m odszastarsza)jest wysy ana Bez poacutel bitowych flaga ta zaj aby dodatkowy bajt pami ci

Przejd my do implementacji sterownika Pierwsz rzecz jak nale y sprawdzi jestto czy w buforze czeka jaka transakcja do zrealizowania Odpowiedzialny za to jestfragment kodu obs ugi przerwania nadmiaru timera

if(trans == NULL) Nic do zrobienia sprawd my czy jaka transakcja oczekuje trans=cbRead(ampLCD_TransBuffer) Czy jest jaka oczekuj ca transakcja seqpos=0 seqnibble=0 if(trans == NULL) TCD0_CTRLA=TC_CLKSEL_OFF_gc Nie ma adnych transakcji mdash wy cz timer

W przypadku gdy adna transakcja nie oczekuje na realizacj timer jest wy czanymdash dzi ki temu nie b d zg aszane kolejne przerwania przepe nienia i MCU nie b -dzie traci czasu na ich obs ug Co prawda wynikaj cy z tego zysk czasowy jest mar-ginalny lecz ma to istotniejsz konsekwencj mdash w przypadku usypiania MCU zb d-ne przerwanie timera nie b dzie niepotrzebnie wybudza o procesora W takiej sytuacjiponowne w czenie timera nast pi dopiero w funkcji dodaj cej transakcj do kolejkimdash a wi c w sytuacji gdy mamy pewno e istnieje oczekuj ca transakcja

Druga cz funkcji obs ugi przerwania jest zwi zana z realizacj samej transakcjiW pokazanym przyk adzie zaimplementowano tylko jeden typ transakcji mdash daniezapisu a cucha tekstowego pod wskazany adres VRAM (na okre lonej pozycji LCD)Je li zajdzie taka potrzeba programista mo e zaimplementowa inne polecenia i doda

1 Warto zauwa y e w bdquoklasycznejrdquo obs udze LCD te nie musimy czyta stanu flagi busy zamiast tego

wystarczy wprowadza p tle opoacute niaj ce Jednak poniewa taka obs uga blokuje MCU nie jest onazalecana Wady tej nie ma dost p transakcyjny co jest jego dodatkow zalet

Kup książkę Poleć książkę

64 AVR Uk ady peryferyjne

kod odpowiedzialny za ich obs ug Zauwa my e ka da transakcja musi zawieraadres pocz tku pami ci wideo od ktoacuterego b dzie zapisywany tekst Dzieje si takdlatego e transakcja wykonana wcze niej mo e ustawi wska nik zapisu na dowolnejkomoacuterce pami ci W efekcie tekst z kolejnej transakcji by by wy wietlany od komoacuterkina ktoacuterej zako czy si zapis poprzedniej transakcji Takie dzia anie oczywi cie jestniedopuszczalne st d te ka dy zapis do pami ci wideo poprzedza ustawienie rejestruindeksowego Problem ten mo na rozwi za tak e w inny sposoacuteb mdash poprzez wpro-wadzenie tzw uchwytoacutew (ang handlers) ktoacutere zawiera yby stan kontrolera LCDNiemniej to rozwi zanie dodatkowo komplikowa oby nasz sterownik Struktura danych(zawartych w polu data) ma wi c nast puj cy format

bajt nr 0 zawiera warto pozycji od ktoacuterej nale y dokonywa zapisu pami ciwideo mdash jest to warto przesy ana do rejestru okre laj cego adres zapisu

kolejne bajty zawieraj a cuch znakowy ktoacutery nale y umie ci w pami ciCGRAM

Poniewa bajt nr 0 zawsze zawiera warto wpisywan do rejestroacutew steruj cych kon-trolera podczas jego wysy ania jest ustawiana linia RS sygnalizuj ca zapis do rejestruPodczas wysy ania kolejnych bajtoacutew linia ta jest zerowana w zwi zku z czym zapisodbywa si do pami ci CGRAM

Kod obs uguj cy transakcj wygl da nast puj coif(trans) Jest transakcja do zrealizowania uint8_t dat=trans-gtdata[seqpos] if(seqnibble == 0) datgtgt=4 To trzeba zmieni je li linie danych nie s po czone z pinami 0 ndash 3 portu IO hd44780_outnibble_nowait(dat amp 0x0F seqpos = 0) Zapisujemy rejestr steruj cy lub dane ++seqnibble if(seqnibble == 0) ++seqpos Co drug tetrad zwi kszamy pozycj bufora if(seqpos gt= trans-gtlen) trans-gtReady=true Koniec transakcji if(trans-gtSelfDel) free_re(trans) Zwolnij pami transakcji je li tak sobie yczy programista trans=NULL Koniec transakcji CLR(OUT HD44780_E)

Ta cz przerwania wysy a kolejne tetrady do kontrolera LCD Warto zastanowi sinad dzia aniem sekwencji

++seqnibble

Poniewa pole nibble jest jednobitowe operacja inkrementacji prowadzi do zmianystanu tego pola na przeciwny (pole to ma warto 0 lub 1) Kiedy zostan wys anewszystkie dane przeznaczone dla kontrolera obs uga transakcji ko czy si Stan tensygnalizuje nadanie warto ci true polu Ready struktury LCD_trans Dzi ki temu pro-gram mo e sprawdzi asynchronicznie w stosunku do przerwania kiedy transakcjauleg a zako czeniu Opcjonalnie jest wykonywana jeszcze jedna funkcja mdash je li poleSelfDel ma warto true to pami zarezerwowana na transakcj jest automatycznie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 65

zwalniana W tym celu wykorzystuje si funkcj free_re ktoacuterej prototyp jest zade-klarowany w pliku Alloc_safeh Funkcja ta wywo uje funkcj biblioteczn free ktoacute-ra zwalnia pami przydzielon dynamicznie na stercie Poniewa funkcja ta nie jestfunkcj reentrant nale y stworzy odpowiedni bdquoprotez rdquo opakowuj c j w blokatomowy co zapewnia e nie zostanie ona ponownie wywo ana zanim jej poprzed-nia instancja nie zako czy dzia ania Oczywi cie lepszym rozwi zaniem by oby napi-sanie w asnych funkcji dynamicznej alokacji pami ci ktoacutere b d reentrant

Bardzo wa ne jest aby pole SelfDel mia o warto true wy cznie dla transakcjidla ktoacuterych pami zosta a przydzielona dynamicznie funkcj malloc (lub jej po-chodnymi) W pozosta ych przypadkach pole to musi mie warto false mdash nie-stosowanie si do tej regu y spowoduje b d mened era pami ci i najprawdopo-dobniej nieprzewidywalne dzia anie programu

Drug wa n zasad jest aby zmienna zawieraj ca dane transakcji nie by azmienn automatyczn mdash zmienne takie s automatycznie niszczone po opusz-czeniu zawieraj cej je funkcji W rezultacie obszar pami ci zawieraj cy danetransakcji mo e zosta wykorzystany przez inne zmienne co spowoduje uszkodzeniezawartych w nim danych

Pami przydzielona transakcji musi by alokowana w sposoacuteb dynamiczny (funkcjamalloc_re) ewentualnie mo e to by pami alokowana dla zmiennej globalnej lubstatycznej mdash zmienne tego typu istniej przez ca y czas ycia programu

Warto te zauwa y e instrukcje steruj ce stanem linii Enable kontrolera LCD(SET(OUT HD44780_E) i CLR(OUT HD44780_E)) s rozdzielone wieloma innymi in-strukcjami Dzi ki temu generowany impuls dodatni tego sygna u ma czas trwania gt230 ns wymagany w specyfikacji kontrolera Nawet dla XMEGA taktowanej zegarem32 MHz 230 ns przek ada si na oko o 7 instrukcji asemblera mdash czas jaki z pewno-ci up ynie pomi dzy wykonaniem obu powy szych instrukcji steruj cych

Do wysy ania danych do kontrolera zosta a wykorzystana nieco zmodyfikowanafunkcja hd44780_outnibble_nowait roacute ni ca si od jej protoplasty hd44780_outnibbletylko tym e nie czeka na sygna braku zaj to ci mikrokontrolera (nie realizuje teopoacute nie ) Nie jest to potrzebne gdy kolejne tetrady s wysy ane w odst pach cza-sowych okre lanych przez timer

Mamy wi c zapewnion obs ug transakcji i mo liwo transakcyjnego wy wietlaniadanych na LCD musimy jeszcze mie funkcj ktoacutera tworzy odpowiednie transakcjemdash jest odpowiednikiem funkcji bezpo rednio wysy aj cej dane znakowe do LCDOdpowiednikiem tym jest pokazana poni ej funkcja

bool LCD_PutText_B(uint8_t x uint8_t y char txt LCD_trans buf bool autodel) buf-gtcmd=LCD_Text buf-gtReady=false buf-gtSelfDel=autodel Czy zwolni pami po zako czeniu transakcji buf-gtdata[0]=HD44780_DDADDR(x+y0x40) Ustaw adres w DDRAM strcpy((char)ampbuf-gtdata[1] txt) Skopiuj dane tekstowe + NULL

Kup książkę Poleć książkę

66 AVR Uk ady peryferyjne

buf-gtlen=strlen(txt) + 1 D ugo tekstu + pozycji + NULL ndash 1 bool ret=cbAdd(ampLCD_TransBuffer buf) if((ret==false) ampamp (autodel)) free_re(buf) Brak miejsca w kolejce else TCD0_CTRLA=TC_CLKSEL_DIV1_gc Preskaler 1 mdash odblokuj timer return ret

Funkcja ta buduje transakcj odpowiedzialn za wy wietlenie napisu txt na wskaza-nej pozycji x y LCD Wszystkie dane o transakcji zostan umieszczone w buforzew pami ci ktoacuterej adres jest okre lany wska nikiem buf Pami w buforze musi bywystarczaj co du a aby pomie ci ca transakcj Dodatkowy parametr autodel okre laczy pami ta ma by automatycznie zwalniana po obs u eniu transakcji (true) czynie (false) Je li transakcj uda o si umie ci w kolejce funkcja zwraca true Wartozauwa y e w takim przypadku funkcja uruchamia te timer (w naszym przypadkujest to timer TCD0) odpowiedzialny za generowanie przerwania Funkcja obs ugi prze-rwania wysy a dane do LCD

Pewn odmian powy szej funkcji jest funkcjabool LCD_PutText(uint8_t x uint8_t y char txt) LCD_trans trans=malloc_re(sizeof(LCD_trans) + strlen(txt) + 2) bool ret=LCD_PutText_B(x y txt trans true) return ret

Wykorzystuje ona funkcj LCD_PutText_B z tym e najpierw alokuje dynamiczniepami potrzebn na przechowanie tworzonej transakcji

Mamy komplet potrzebnych funkcji a wi c sprawd my jak ca o sprawdza siw praktyce W pliku LCD-transactc znajduje si kod pokazuj cy jak dzia aj naszetransakcje Aby to by o mo liwe nale y zainicjalizowa kontroler LCD

LCD_init()

Wykorzystujemy tu znan ju funkcj inicjalizuj c mdash nie ma potrzeby jej zmienia gdy operacja inicjalizacji LCD jest jednorazowa i nie trzeba wykonywa jej w posta-ci transakcji W drugim kroku musimy zainicjalizowa wykorzystywany timer i systemprzerwa

LCD_Timer_init(ampTCD0)PMIC_CTRL|=PMIC_LOLVLEN_bm Odblokuj przerwania niskiego poziomusei()

Poniewa dost p do LCD z pewno ci nie jest czynno ci krytyczn czasowo prze-rwaniom timera nadano najni szy priorytet Dzi ki temu mo na innym bardziej kry-tycznym przerwaniom nada wy sze priorytety i uzyska w ten sposoacuteb zmniejszenieczasu latencji obs ugi przerwa Sama inicjalizacja timera jest niezwykle prosta

void LCD_Timer_init(TC0_t tc) tc-gtINTCTRLA=TC_OVFINTLVL_LO_gc Odblokuj przerwania nadmiaru timera i nadaj im niski priorytet tc-gtPER=F_CPULCD_ACCESSTIME Przerwanie co 4 us (niezale nie od F_CPU)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 67

Sprowadza si ona tylko do odblokowania mo liwo ci zg aszania przerwania nadmia-ru oraz konfiguracji rejestru PER tak aby przerwania by y generowane co ok 4 s mdashniezale nie od cz stotliwo ci taktowania CPU Mo emy wi c przyst pi do wy wie-tlenia pierwszego napisu

LCD_PutText(00 Numer)

Powy sza funkcja ma jedn wad mdash alokuje dynamicznie pami po ka dym wywo-aniu (pami ta jest automatycznie zwalniana po obs u eniu transakcji) niemniej

ca y proces jest czasoch onny Mo emy tego unikn alokuj c pami bdquor cznierdquo i wielo-krotnie wykorzystuj c zaalokowany blok pami ci Ilustruje to poni szy przyk ad

LCD_trans buf=malloc_re(sizeof(LCD_trans) + 7)

Zmienna buf wskazuje na obszar pami ci ktoacutery mo e pomie ci a cuch 5-znakowyTyle wystarczy na potrzeby tego przyk adu mdash na LCD b d wy wietlane kolejneliczby w zakresie 0 ndash 65 535 najd u sza ma 5 znakoacutew st d te nasz bufor ma tak a nieinn d ugo

while(1) utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(60 bufstr buf false) while(LCD_IsTransCompleted(buf))

Do konwersji liczby na a cuch u yto funkcji bibliotecznej utoa (nag oacutewek stdlibh)Poniewa d ugo a cucha po konwersji jest zmienna (co spowodowa oby pozosta-wianie na LCD bdquoduchoacutewrdquo po poprzednich konwersjach) w kolejnej linii brakuj ceznaki uzupe niono spacjami Nast pnie tworzona jest transakcja w obszarze pami ciprzydzielonym zmiennej buf Ostatnia p tla while jest odpowiedzialna za oczekiwa-nie na zako czenie realizacji transakcji Po jej zako czeniu p tla jest wykonywana odpocz tku

Uwa ny czytelnik z pewno ci zauwa y e pami przydzielana funkcj malloc_renie jest nigdzie zwalniana mdash w normalnej sytuacji spowodowa oby to wyciek pami -ci W naszym przyk adzie jednak program nigdy si nie ko czy nie ma wi c potrzebyzwalniania pami ci wskazywanej przez zmienn buf

Powy szy przyk ad pokazuje jak unikn blokowania CPU na czas dost pu do wolnodzia aj cego urz dzenia jakim jest LCD alfanumeryczny Jednak to nie wszystkiezalety wynikaj ce z zastosowania transakcji Drug wa n zalet naszego rozwi zaniailustruje przyk ad znajduj cy si w katalogu PrzykladyLCD-alfaLCD-transact-intPowa nym ograniczeniem funkcji odpowiedzialnych za dost p do LCD w sposoacutebklasyczny by a niemo no ich wywo ywania z funkcji obs ugi przerwa mdash funkcjeobs ugi LCD nie by y reentrant2 Nasz system oparty na transakcjach nie ma tychwad Aby to zilustrowa zosta stworzony prosty przyk ad mdash tak jak poprzedniow p tli g oacutewnej programu s wy wietlane stale kolejne liczby ale jednocze nie wyko-

2 Poza tym blokowa y CPU na d ugi czas a jak pami tamy funkcje obs ugi przerwa powinny by

wykonywane mo liwie kroacutetko

Kup książkę Poleć książkę

68 AVR Uk ady peryferyjne

rzystano drugi timer (TCD1) w ktoacuterego funkcji obs ugi przerwania przepe nienia jestwy wietlany licznik tych przerwa

ISR(TCD1_OVF_vect) static char int_buf[sizeof(LCD_trans) + 7] static uint16_t cnt char bufstr[6]

utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(61 bufstr (LCD_trans)ampint_buf false)

Jak widzimy w sposoacuteb asynchroniczny z dwoacutech miejsc w programie mo emy uzy-ska dost p do LCD a ka da funkcja bdquoma wra enierdquo e ma LCD na wy czno Przy okazji warto przeanalizowa sposoacuteb w jaki jest rezerwowana pami na trans-akcj w przerwaniu Oczywi cie mo na by wykorzysta dynamiczn alokacj pami cilecz jak wspomniano taka alokacja jest czasoch onna St d te w pokazanym przy-k adzie wykorzystano tablic statyczn int_buf o rozmiarze umo liwiaj cym prze-chowanie kompletnej transakcji Dzi ki temu e zmienna int_buf jest zmienn statycz-n nie jest ona niszczona po zako czeniu funkcji obs ugi przerwania Gdyby pomins owo kluczowe static zmienna ta by aby niszczona a na LCD najprawdopodobniejzacz yby si pojawia przypadkowe tre ci Poniewa pami naszego bufora nie by aalokowana dynamicznie nie mo e ona zosta zwolniona w naszym sterowniku LCDst d te ostatni parametr wywo ania funkcji LCD_PutText_B musi mie warto false

OptymalizacjaPrzy okazji tego i poprzedniego przyk adu warto zastanowi si jeszcze nad jednkwesti mdash optymalizacji W podanych przyk adach wykorzystano wcze niej omoacute-wione funkcje dost pu do wy wietlacza LCD znajduj ce si w plikach hd44780ci hd44780h Wi kszo z zawartych tam funkcji nie jest wykorzystywana jednakkompilator mimo wszystko umieszcza ich kod w pliku wynikowym mdash dzieje si takponiewa nie mo e on bdquostwierdzi rdquo czy funkcje te nie s wykorzystywane w innychfragmentach programu Pami tajmy e kompilator kompiluje poszczegoacutelne pliki roacute-d owe osobno i dana jego instancja nie bdquowierdquo co znajduje si w innych plikach (innychjednostkach kompilacji) Tak ca o ciow wiedz ma dopiero konsolidator (linker)ktoacutery czy stworzone przez kompilator pliki obiektowe (o rozszerzeniu o) w plikwynikowy Linker jednak bdquonie wierdquo ktoacutera z funkcji programu zosta a u yta a ktoacuteranie mdash informacje te ma wy cznie kompilator W ten sposoacuteb powstaje typowe b dneko o w efekcie nasze nieu ywane funkcje nie s usuwane (linker zostawia je bdquonawszelki wypadekrdquo) i zajmuj niepotrzebnie pami Czy mo na temu jako zaradzi Oczywi cie tak W tym celu trzeba po czy si y kompilatora i linkera co zapewniaj od-powiednie opcje kompilacji We w a ciwo ciach projektu (ProjectProperties lub Alt+F7)wybieramy zak adk Toolchain a nast pnie AVRGNU C Compiler i OptimizationZnajdziemy tam pole wyboru o nazwie Prepare functions for garbage collection (ry-sunek 224)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 69

Rysunek 224 Aby da linkerowi mo liwo usuwania nieu ywanych funkcji nale y skompilowaprogram z wybran opcj ndashffunction-sections ktoacutera spowoduje e ka da funkcja programu znajdzie siwe w asnej sekcji

Zaznaczenie tej funkcji spowoduje umieszczenie ka dej funkcji w osobnej sekcji mdashsamo w sobie nie wp ynie to na skroacutecenie kodu wynikowego ale jest warunkiem nie-zb dnym dla podj cia stosownych dzia a przez linker Aby wyeliminowa nieu y-wane funkcje nale y zaznaczy jeszcze w ga zi AVRGNU LinkerOptimization poleGarbage collect unused sections (rysunek 225)

Rysunek 225 Zaznaczenie opcji Garbage collect unused sections (-Wl--gc-sections) spowodujee nieu ywane funkcje zostan usuni te z kodu wynikowego w efekcie kod programu ulegnie skroacuteceniu

Po zaznaczeniu tych opcji program zostanie skroacutecony o kilkaset bajtoacutew Oczywi cieje li wszystkie funkcje by yby wykorzystane nie uzyskaliby my adnego skroacuteceniakodu Niemniej w sytuacji gdy u ywa si bibliotek zazwyczaj przynajmniej czfunkcji nie jest wykorzystywana warto wi c skorzysta z tej mo liwo ci optymalizacji

Kup książkę Poleć książkę

70 AVR Uk ady peryferyjne

Je li mamy do czynienia z prekompilowan bibliotek (lib) to musi ona by skom-pilowana z zaznaczon opcj Prepare functions for garbage collection (-ffunction-sections) Alternatyw jest umieszczenie ka dej funkcji biblioteki w osobnym pliku(tak jak w przypadku bibliotek AVR-libc)

Na ekranie wyboru opcji optymalizacji linkera mamy jeszcze jedn przydatn opcjmdash Relax Branches (-mrelax) Dla mikrokontroleroacutew ktoacutere maj ponad 8 kB pami ciFLASH instrukcje skokoacutew s generowane jako tzw instrukcje d ugie mdash umo liwiajone skok do komoacuterki pami ci FLASH o dowolnym adresie Jednak cen za to jestwyd u enie instrukcji mdash ich kod jest d u szy podobnie jak czas wykonania Nie zawszejednak takie d ugie instrukcje musz by wykonywane mdash je li miejsce docelowe skokule y blisko (w zasi gu instrukcji skokoacutew wzgl dnych) to mo na w kodzie wynikowymzamieni instrukcje d u sze na kroacutetsze co przynosi oszcz dno ci w postaci skroacuteceniakodu wynikowego Poniewa dopiero linker bdquowierdquo jak poszczegoacutelne fragmenty kodus rozmieszczone w pami ci takiej podmiany mo na dokona na etapie linkowaniaprogramu co zapewnia powy sza opcja St d te warto to pole wyboru zaznaczy

Kup książkę Poleć książkę

SkorowidzA

ABI Application Binary Interface 25AC Address Counter 50ADPCM 482adres

bazowy 377bufora 61komoacuterki 84pu apki 202

ALE Address Latch Enable 368alfanumeryczne wy wietlacze 43algorytm ADPCM 492algorytmy stratne 495animacje 57antyaliasing 325architektury procesoroacutew XMEGA 352asembler 23

dyrektywy 40funkcje j zyka C 41obs uga przerwa 39

asynchroniczne wywo anie funkcji 101Atmel Studio 15

Bbajty kalibracyjne 569biblioteka

FATFS 131 139 176 180 517libcallback-liba 99PetitFS 144 149

bitADC_CH0START_bm 236IMPMODE 244

bitrate 442 512blokowanie przerwa 219b d 16 19

kwantyzacji 463offsetu 230wzmocnienia ADC 230

BOD 223bps bits per second 12

budowakarty 152linii obrazu 394pami ci SDRAM 374pliku stymulacji 192ramki PAL 412sygna u PAL 411wtyczki 544 545

bufor 78FIFO 497na transakcje 61transakcji 62

buforowanie wyj cia 294

CCAS Column Address Strobe 375CCFL 44charakterystyka

przetwornikoacutew 222termistora 264tryboacutew pracy 232

CID Card Identification 169CKE Clock Enable 375CLKIN 421COG Chip on Glass 310CRC 158 178CRC16 178CRC7 164CS Chip Select 361 375CSD Card Specific Data 172czas

dost pu do SDRAM 424adowania kondensatora 244

propagacji 281proacutebkowania 260symulacji 209

czcionki 322cz stotliwo

odchylania pionowego 428proacutebkowania 244 441 444 530przebiegu 504

Kup książkę Poleć książkę

576 AVR Uk ady peryferyjne

cz stotliwoPWM 465taktowania koprocesora 549taktowania procesora 209taktowania rdzenia 18

czyszczenie pami ci 318

DDAC Digital to Analog Converter 293 447 451

buforowanie wyj cia 294generowanie przebiegoacutew 301jitter 303kalibracja 306napi cie referencyjne 295system zdarze 297taktowanie 296tryb dwukana owy 301wykorzystanie DMA 298wyzwalanie konwersji 305

datalogger 261 265 275DD Device Density 86debuger 183

programowy 190sprz towy 185 187

decymacja 259DEBUG 219XMEGA 260

definicja symboli globalnych 36definiowanie w asnych znakoacutew 56deklaracja zapowiadaj ca 103 337dekoder DTMF 548 556DMA 254 298 402 458 518 523dost p do

danych 358 359 568danych binarnych 356 360danych wielobajtowych 31DataFLASH 137EEPROM 128FAT 136komoacuterki 375LCD 59 62 66 68operandu 30pami ci 81 384 386 387 561pami ci SDRAM 424pliku blokowy 141portoacutew IO 30rejestroacutew IO procesora 36rejestroacutew uk adu 499SPI 95sygnatury u ytkownika 565 567wska nikoacutew 32

DQM Data Mask 375DSP Digital Signal Processor 535

DTMF 535 553dyktafon 529dynamiczna alokacja pami ci 516dyrektywa global 38dyrektywy asemblera 40dzia anie

DMA 255komparatora 280timeroacutew 400

d wi k 443

EEBI External Bus Interface 361EEPROM 207eliminacja jitteru 24emulacja RS232 139

FFAT File Allocation Table 128 131FAT32 128FATFS 180filtr

dolnoprzepustowy 491drugiego rz du 470pierwszego rz du 469trzeciego rz du 471

filtrowanie sygna u PWM 468firmware 565FLASH 207format

odpowiedzi 159polecenia 158protoko u 157

funkcja_delay_ms 17 219c_zero 42callback 106 341callback() 99DataFLASH_CSEnable 100DF_FinishBufWrite() 269disk_initialize 136disk_ioctl 181disk_status 136disk_write 138DMA_SPI_init 104DTMF_GetCode 553free_re 65GPIOR0_init 507hd44780_outcmd 51hd44780_outnibble_nowait 65LCD_defchar_P 57

Kup książkę Poleć książkę

Skorowidz 577

Menu_Click_Func 515Menu_Free 516Menu_Recorder 532Menu_Run 527MS_CreateRegEntry 117MS_GetDirPos 125MS_GetRegItem 115MS_WritePages 116 118OSC_wait_for_rdy 473RecMenu_StartStop 532sprintf 142strtok 124sysclk_init() 200 209TMF_memcpy_PF 454udi_cdc_getc() 123udi_cdc_is_rx_ready() 123VS1003_Reset 506

funkcjeanalizuj ce 556biblioteczne 50biblioteki FATFS 143j zyka C 41kontrolera ST7565R 313opoacute niaj ce 17opoacute nie 219reentrant 524specjalne kontrolera 319steruj ce 314zapisu 133

fusebit 557BODACT 560BODLEVEL 560BOOTRST 559DVSDON 560EESAVE 561JTAGEN 558RSTDISBL 559SUT 559TOSCSEL 559

fusebity w AVR-libc 571

Ggenerator obrazu composite 426generowanie

d wi ku 461kolorowego obrazu 437obrazu wideo 391przebiegoacutew 301przerwa 285sygna u composite 409

g bia koloru 326gniazdo

karty SD 156VGA 396

Hhistereza 281

IIDE 11IMA ADPCM 483informacje

o kolorze 431o obrazie 434

inicjalizacjakarty 161karty SDHC 167karty SDSC 167karty SDXC 167licznika 419pami ci 119USART 505

instrukcjaicall 42movw 35nop 13 24

interfejsSCI 498SDI 498SPI 71 79RS232 120UART 123USART 71 73

interpolacja 259interpolacja w XMEGA 260inwersja obrazu 319

Jjednostki 12jitter 24 303 420

Kkalibracja

ADC 229DAC 306 564offsetu 237

kana DMA 82 522karta 154 158

mikroSD 152SD 151 152SDHC 151 152 160SDSC 160SDXC 151 160

Kup książkę Poleć książkę

578 AVR Uk ady peryferyjne

karty pami ci 151 152 157biblioteka FATFS 180budowa 152format polecenia 158inicjalizacja 161 167komunikacja 156odczyt danych 173opcje konfiguracyjne 181rejestry specjalne 169tryby pracy 153zapis danych 176zasilanie 154

kodasemblerowy 23 24C 23dost pu 24

kodowanieμ-law 481ADPCM 483Dialogic ADPCM 494informacji 166 426koloru 425znakoacutew 536

kodyformatoacutew audio 501zdarze 545

kolejno bajtoacutew 533kolor 424 430kolorowy obraz 437komparator 422

analogowy 279 280analogowy XMEGA 282okienkowy 284

kompilacja plikoacutew binarnych 350kompilator avr-gcc 11 359kompresja

ADPCM 482 486d wi ku 480IMA ADPCM 482

komunikacja z koprocesorem 504konfiguracja

4-portowa 364biblioteki 133debugera 185DMA 459 522fusebitoacutew 570kontrolera DMA 257 452komparatoroacutew 285lockbitoacutew 570LPC 371pami ci SDRAM 381PetitFS 149pinu IO 225portoacutew IO 362

preskalera 452projektu 186przerwa 219pu apki 203rejestru EVCTRL 248rejestru PER 67SPI 75sygna u CS 377typu czcionki 324urz dze IO 189USART 76zegara 383

konsolidacja 547kontroler

DMA 254 298 402 458 518 523KS108 310ST7565R 310ndash315 321

konwersjaDAC 305sygna oacutew 396wyzwalana 306

konwertercyfrowo-analogowy 426DAC 427

koprocesormp3 496VS1003B 10

korekcja fazy 466kwantyzacja 463

Llampa CCFL 44LE Latch Enable 433licznik 419

cykli 209TCC1 400timera 20

linie IO 50linie sygna owe

MISO 72 164MOSI 72SCK 72SS 72

linker 69lista

mnemonikoacutew 24modyfikowanych rejestroacutew 32

lockbity 557 561lockbity w AVR-libc 570LPC Low Pin Count 371LPCM 443 556LSB Least Significant Bit 228

Kup książkę Poleć książkę

Skorowidz 579

a cuchy formatuj ce 212czenie plikoacutew 352

Mmagistrala pami ci zewn trznej 361magnetofon cyfrowy 528makro _SFR_IO_ADDR() 39makrodefinicja

ASSERT 214HD44780_CGADDR() 53HD44780_CLR 53HD44780_DDADDR() 53HD44780_DISPCTL() 52HD44780_ENTMODE() 52HD44780_FNSET() 52HD44780_HOME 53HD44780_SHIFT() 51LOCKBITS 571

mapowanie sygna oacutew 366mapy bitowe 343marker czasowy 268maski bitowe 329matryce 49menu 335menu piktogramowe 342mierniki temperatury 262mikrokontroler

ARM 9AVR 9PIC 9XMEGA128A3U 10

MISO 72moc wydzielana 265model psychoakustyczny 495modu

alfanumeryczny 45NVM 568Xmega eXploreGO 10Xplained ATXMEGA A3BU 10Xplained ATXMEGA-A1 10Xplained XMEGA128A1 447Xplained XMEGA256A3 94Xplained XMEGA256A3BU 97 143 266

modyfikator 30const 85volatile 28 273

monitory CRT 395monochromatyczne wy wietlacze graficzne 309monochromatyczny

tryb graficzny 416tryb tekstowy 413

MOSI 72mp3 495Msps Megasamples per second 12multiplekser wej ciowy 226 283multipleksowanie adresoacutew 368 369muzyka 439

Nnadawanie kodoacutew DTMF 540nadproacutebkowanie 258nag oacutewek kontenera wav 500nagrywanie mowy 486najmniej znacz cy bit 228napi cie

offsetu 280referencyjne 223 295zasilania 239

Oobracanie obrazu 319obraz 319

composite 426kolorowy 430wideo 391

obroacutebka d wi ku 443 445obs uga

FAT 131 143klawiatury matrycowej 24LCD 58 63 67menu 337przerwania 37 38 458przerwania DMA 525przerwa w asemblerze 39przyciskoacutew 272wy wietlaczy alfanumerycznych 45

odczytblokowy 140danych 173 358

odpowied response 159R1 159R2 159R7 160

od wie anie pami ci 376odtwarzanie

d wi ku 472muzyki 447 513 518 521

offset 238offset ADC 230okno

Breakpoints 202Call stack 209dezasemblera 210

Kup książkę Poleć książkę

580 AVR Uk ady peryferyjne

oknoIO View 207podgl du zmiennych 211wyboru czcionek 324

OLED 46opcje

kompilatora 35zapisu d wi ku 445

operacjena buforach 91odczytu 173zapisu 176zapisu strony 92

operand 29operator

ascii 41

asciz 41

byte 41

section 41opoacute nienia 13 18opoacute nienie zmienne 16optymalizacja 16 68optymalizator 26organizacja pami ci 77organizacja pami ci VRAM 316oscylator 287OSD On-Screen Display 417ostrze enie 16oszcz dzanie energii 94

Ppakiet WinAVR 48pami

CGRAM 56 57 64DataFLASH 10 77 81 113 269DDRAM 49EEPROM 111FLASH 54 124 207RAM 49SDRAM 372SRAM 63 124 329 366 371VRAM 314 317

PCLK 421PCM 443PetitFS 144 149p tla

for 13while 201

pierwsza linia obrazu 321piksel 430piktogram 342pin IO 225

plikAlloc_safeh 65DataFLASHc 83DataFLASHIOc 136definesh 50delayh 14diskioh 132 136ffh 132ffconfh 132 181hd44780h 49integerh 132ioh 30LCD_transc 61LCD-transactc 66Makefile 14Menuc 19nothingo 541outfiletxt 547 551pffh 149SPIh 104stringh 113stymulacji 191 192

pliki mp3 495elf 351fon 323o 24S 24 34binarne 350 355csv 276d wi kowe 440obiektowe 352wav 500WMA 512z czcionkami 327z danymi 349

podbijacz napi cia 315podgl d

pami ci 207stosu wywo a 209zmiennych 211znakoacutew 325

pod czeniefototranzystora 262karty SD 155LCD z kontrolerem 311modu u 50pami ci 362 369 370 373termistora 262uk adu LM35 251wyj XMEGA 398

pod wietlenieCCFL 46OLED 46

Kup książkę Poleć książkę

Skorowidz 581

podwoacutejne buforowanie 255 332 457polecenia

kasowania strony 81konfiguracyjne pami ci 82kontrolera ST7565R 315odczytu bufora 82 89odczytu pami ci 81 88SDRAM 376transferu 91

polecenieACMD41 168cd 181CID 178CMD0 165CMD8 167CSD 178date 276dir 127 181dump 276erase 276get 276HD44780_CLR 51Init 178mkdir 181

po czenieDMA ze SPI 96dwoacutech komparatoroacutew 285koprocesora mp3 497LCD z mikrokontrolerem 48wyj cia XMEGA 411XMEGA z PC 121z telewizorem 431

pomiarnapi cia zasilania 239temperatury MCU 241

port IO 30 362pozycjonowanie grafik 345poacute obraz 410precyzja pomiaroacutew 260preskaler 478preskaler ADC 243program

Atmel Data Visualizer 275Audacity 443avr-objcopy 350dataloggera 265LCD Image Converter 323makeloadingtableexe 543Realterm 127 554riffstrip 483SoX 445Tracepoint 208

programowanie sygnatury u ytkownika 566protokoacute master-slave 157

prototypy 136proacutebki d wi kowe 447proacutebkowanie

8-bitowe 300nieliniowe 480

prymitywy graficzne 330przebieg PWM 468przebiegi 289 303przechwytywanie danych 276przemiatanie wej 253przerwanie 218 254 286 403

DMA 522komparatora 286

przestrze adresowa procesora 378przesy anie

danych 498polece 498

przetaktowanie procesora 436przetwornik

ADC 221analogowo-cyfrowy 221cykliczny 222potokowy 222

przyciski 272pseudooperatory 41pu apki breakpoints 197pu apki warunkowe 205punkty ledzenia 203PWM 461 462 472

RRAS Row Address Strobe 375redukcja poboru energii 242regulacja kontrastu 321rejestr 32 34rejestr AC 50

adresu wtyczki 513BASEADDR 377CID 169CMP 251CSD 172czasu utworu 512DATA 83EVCTRL 248formatu audio 512identyfikacyjny pami ci 87INTFLAGS 252kontroli basoacutew 510kontroli g o no ci 513MUXCTRL 227OCR 168PER 67poroacutewnania 249

Kup książkę Poleć książkę

582 AVR Uk ady peryferyjne

rejestr ACSCI_CLOCKF 511stanu komparatora 287stanu pami ci 86stanu uk adu 510trybu pracy 508WINCTRL 285

rejestrydost pu do pami ci RAM 513GPIOR 502IO procesora 36mikrokontrolera 25procesora 35specjalne 94specjalne karty 169uk adu VS1003B 508

relacja rodzic ndash dziecko 336reset uk adu 534rozdzielczo

LCD 329przetwornika 231PWM 463 477

rozszerzenie HiRes 477 479roacutewnanie Steinharta-Harta 263rysowanie map bitowych 343

Sschemat uk adu dataloggera 267SCI Serial Command Interface 498SCK 72SD Secure Digital 152SDI Serial Data Interface 498separator synchronizacji 422separowanie impulsoacutew synchronizacji 422shieldy 10skaler 422skaler napi cia 283skrypt makefile 353s owo kluczowe

asm 27extern 37static 68

specyfikatory lokalizacji zmiennej 213sps samples per second 12SS Slave Select 72standard PAL 410standard VGA 393sterowanie

dataloggerem 275sygna em 379

sterownik 121HD44780 49 56LCD 49 62

stos wywo a 209

strukturaFATFS 139Handle 118LCD_trans 60 63menu 338rejestru 86SimpleFSEntry 113 116SimpleFSHandle 113 118 140submenu 527systemu plikoacutew 112

sumabitowa 571kontrolna 178

sygnacomposite 409composite video output 430CS 377DREQ 497H-Sync 396synchronizacji 423V-Sync 396zegarowy CLK 374

sygna yinterfejsu EBI 363magistrali EBI 364steruj ce 375

sygnaturaprodukcyjna procesora 563u ytkownika 565

symbol__DELAY_ROUND_CLOSEST__ 17__DELAY_ROUND_DOWN__ 17_FS_FAT12 149_FS_FAT32 149_FS_MINIMIZE 133_FS_READONLY 133_FS_RPATH 135_FS_TINY 133_MAX_SS 135_MULTI_PARTITION 135_USE_DIR 149_USE_FASTSEEK 134_USE_FORWARD 134_USE_LABEL 134_USE_LFN 134_USE_LSEEK 149_USE_MKFS 134_USE_READ 149_USE_STRFUNC 134_USE_WRITE 149_VOLUMES 136F_CPU 14 15 18increment 36USE_BUSY_FLAG 50

Kup książkę Poleć książkę

Skorowidz 583

symboleglobalne 36w asemblerze 28zewn trzne 39

symulacja 198 209symulator 190synchronizacja

pami ci 331pionowa 395pozioma 394

systemplikoacutew 111 128przerwa 404zdarze 245

szablonfont_XMEGAtmpl 326image_XMEGAtmpl 343

szum 463szybko przesy ania danych 126

ledzenie wi zki 333rodowisko

graficzne 11programistyczne 11VSIDE 542WinAVR 47

Ttabela FAT 130tablica

framebuf 402 408plugintbl 552 555tekst 208z kodem wynikowym 543

taktowanieDAC 296mikrokontrolera 473

technologia OLED 44temperatura mikrokontrolera 239 241termistor 262 290

NTC 263PTC 263

termometrLM35 249 250z alarmem 251

termostat 290test uk adu VS1003B 503testowanie obrazu 319timer 16 62

TCC0 20

TCC1 399transakcja 59 62 65transakcje 17 103ndash107transakcyjna obs uga LCD 58transakcyjny dost p do SPI 95transfer 91

danych 97wynikoacutew 254

transmisja 72 83tryb

bez znaku 234ci g ej konwersji 252czterobitowy 153dwukana owy 301graficzny 416graficzny VGA 407idle 419jednobitowy 153LPC 371monochromatyczny 397 407oszcz dzania energii 94 306pracy multipleksera 226pracy SPI 157roacute nicowy 232single slope 312SPI 153tekstowy 413tekstowy VGA 397z pojedynczym wej ciem 234ze znakiem 235

trybygenerowania PWM 467pracy karty 153pracy przetwornika 231pracy SPI 74pracy uk adu 508

twierdzenie Nyquista 258tworzenie

adresu 84nak adek 417obrazu 335tablicy 543

typ__uint24 119karty 160niekompletny 60wyliczeniowy 114

typyoperandoacutew 29w AVR 34

Kup książkę Poleć książkę

584 AVR Uk ady peryferyjne

Uuchwyt handle 64 113uk ad

AD725 427 431buforowy 294CS 361DAC 284dataloggera 267detekcji awarii zasilania 559generuj cy obraz 393HiRes 477ICL7660 47LM35 250 251SampH 293sterowania sygna em 379USART 401VS1003B 496 503 508 530 538 556VS100XX 529wzmacniania sygna u 227

uk ady peryferyjne 9uruchomienie komparatora 287urz dzenie

master 72slave 72

u rednianie 259utrata danych 141u ycie wstawki asemblerowej 33

VVGA 393

Wwarto ci kalibracyjne

ADC 564oscylatoroacutew 564temperatury 564

warunkowa kompilacja 36WE Write Enable 375wej cie composite video input 425wektor przerwa 38 257wideo 391wielko pami ci 86 377w czenie DAC 299wska nik na struktur 27wska niki 32wstawki asemblerowe 24 33wtyczka 535 541 544

SineDTMF Generator 537VGA 396

wyboacuter cz stotliwo ci PWM 465 474wykorzystanie

DMA 254 518

EuroSCART 428PWM 461rejestroacutew 34

wyliczanie predyktora 489wy wietlacze

alfanumeryczne 43 45graficzne 43 309LCD 43OLED 46

wy wietlanielitera u 213map bitowych 344obrazu 333 346 406obrazu VGA 393

wywo ania zwrotne callbacks 98asynchroniczne 101synchroniczne 101

wyzwalanie konwersji 245wzmacniacz 446wzmacniacz operacyjny 279wzmacnianie sygna u 227

XXMEGA 9 18

Zzapis

bufora 269danych 176d wi ku 440 556

zasilaniekarty 154pami ci 109

zatrzask 368zatrzask 74HC573 433zatrza ni cie adresu 369zdarzenia 297zdarzenie compare match 399zegar 383 420 426zintegrowane rodowisko programistyczne 11z cze EuroSCART 425 428 429zmiana

g o no ci 527wielko ci strony 94

znaki 56

roacuted onapi cia odniesienia 284sygna u 240

Kup książkę Poleć książkę

Page 12: Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8 AVR. Ukäady peryferyjne Rejestry dost pu do pami ci RAM .....513 Rejestr adresu

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 47

Kolejn istotn kwesti jest pod czenie w a ciwego napi cia reguluj cego kontrastwy wietlacza Dla wi kszo ci modu oacutew LCD mie ci si ono w przedziale GND ndash Vcca dla modu oacutew o rozszerzonym zakresie temperatury w przedziale od ndash7 do 0 V mdashrysunek 221

Rysunek 221Pod czenie napi ciareguluj cego kontrasta) modu y klasyczneb) modu y o rozszerzonymzakresie temperatur

Napi cie ujemne mo na uzyska z prostej pompy adunkowej sterowanej przebiegiemPWM z procesora Poboacuter pr du z tego wej cia jest znikomo ma y Alternatywniemo na u y uk adu ICL7660 ktoacutery mo e generowa napi cia ujemne

Kolejn decyzj jak musimy podj jest sposoacuteb pod czenia modu u LCD z mikro-kontrolerem Mamy do wyboru dwie opcje mdash albo pod czamy wszystkie 8 linii da-nych (D0 ndash D7) albo tylko 4 najstarsze (D4 ndash D7) Pod czaj c tylko 4 linie danychzmniejszamy liczb niezb dnych po cze modu u z mikrokontrolerem oraz liczbwykorzystanych linii IO Ze wzgl du na znikom ilo danych przesy anych zdo mo-du u wynikaj ce z pod czenia tylko 4 linii danych spowolnienie transmisji jest bezznaczenia W trybie 4-bitowym najpierw transferowana jest starsza a potem m od-sza tetrada Niewykorzystane linie D0 ndash D3 mo na pozostawi niepod czone wi k-szo modu oacutew wewn trznie podci ga niepod czone linie poprzez rezystor do Vcc

Poniewa linie D0 ndash D7 s dwukierunkowe musimy pami ta aby podczas operacjiodczytu z LCD odpowiednie piny mikrokontrolera by y ustawione jako wej cia W prze-ciwnym przypadku dojdzie do konfliktu

Kolejnym sygna em co do ktoacuterego musimy podj decyzj jest sygna RW okre laj cytyp operacji (odczytzapis) Poniewa zwykle zapisujemy dane do LCD w a ciwie niezachodzi konieczno ich odczytywania mo emy ten sygna na sta e po czy z mas oszcz dzaj c w ten sposoacuteb jedn lini IO procesora Takie rozwi zanie ma jednak po-wa n wad mdash po jego zastosowaniu nie jest mo liwe odczytywanie sygna u zaj to cimodu u (ang busy flag) Powoduje to e pomi dzy kolejnymi zapisami do modu u mu-simy stosowa opoacute nienia dobrane na najwolniejsz mo liw okoliczno W efekcieca a transmisja jest wolniejsza ni mog aby by

Je li korzystamy z tych modu oacutew nie musimy pisa w asnych procedur ich obs ugiInstaluj c rodowisko WinAVR (lub nowy toolchain firmy Atmel) w katalogu docavr-libcexamplessdtiodemo znajdziemy gotowe funkcje obs ugi HD44780 Funkcjete nie dzia aj z mikrokontrolerami XMEGA st d te w za czonych przyk adach zosta-y one zmodyfikowane tak aby poprawnie wspoacute pracowa roacutewnie z tymi mikro-kontrolerami

Kup książkę Poleć książkę

48 AVR Uk ady peryferyjne

Mo emy te skorzysta z licznych przyk adoacutew dost pnych w internecie W dalszejcz ci rozdzia u zostan wykorzystane funkcje z pakietu WinAVR napisane przezJoerga Wunscha Pokazane przyk ady zak adaj e wy wietlacz jest po czonyz mikrokontrolerem tak jak na rysunku 222

Rysunek 222 Po czenie LCD z mikrokontrolerem Na goacuterze pod czenie do mikrokontroleraXMEGA na dole pod czenie do modu u Xplained Na schematach pokazano tak e opcjonalne sposobypod czenia pinu Vee odpowiedzialnego za regulacj kontrastu LCD

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 49

Zanim co wy wietlimy na LCD musimy pozna w jaki sposoacuteb s generowane znakiSterownik LCD zawiera w sobie niezale nie od typu u ytej matrycy 80 bajtoacutew pami ciDDRAM (ang Display Data RAM) Je li zastosowana matryca wy wietla mniejszliczb znakoacutew to cz komoacuterek pami ci jest nieu ywana Mo emy je wykorzystado innych celoacutew mdash np jako zwyk pami RAM Mo emy te u y jej do przesu-wania napisoacutew ktoacutere nie mieszcz si na wy wietlaczu Aby mo na by o umie ciznak na w a ciwej pozycji niezb dne jest poznanie organizacji pami ci kontrolera W za-le no ci od u ytej matrycy pami ta jest zorganizowana nast puj co

Dla matryc 16times1 mdash pami jest podzielona na dwa obszary ka dy zawieraj cypo 8 znakoacutew Obszar pierwszy (od lewej) ma adresy 0x00 do 0x07 a obszar drugi(prawy) adresy 0x40 do 0x47 St d te gdy wy wietla si tekst przekraczaj cygranic obszaroacutew nale y zadba aby poszczegoacutelne litery trafi y pod w a ciweadresy

Dla matryc 20times1 mdash adresy 0x00 do 0x13

Dla matryc 16times2 mdash adres pierwszej linii zaczyna si od 0x00 do 0x0f adresdrugiej linii od 0x40 do 0x4f

Dla matryc 20times2 mdash adresy pierwszej linii to 0x00 do 0x13 a drugiej 0x40 do 0x53

Dla matryc 40times2 mdash adresy pierwszej linii to 0x00 do 0x27 drugiej linii 0x40do 0x67

Dla matryc 20times4 mdash adresy pierwszej linii to 0x00 do 0x13 drugiej 0x40 do 0x53trzeciej 0x14 do 0x27 a czwartej 0x54 do 0x67

Jak wida w niektoacuterych typach wy wietlaczy po ka dej linii zostaje od kilku do kil-kunastu bajtoacutew ktoacuterych zawarto nie jest wy wietlana Ma to pewn zalet mdash mo-emy do pami ci modu u wpisywa teksty d u sze ni s wy wietlane na ekranie co

u atwia przewijanie tekstu Niestety ma to te pewn wad mdash funkcje wy wietlaj ceco na ekranie musz bdquowiedzie rdquo jak organizacj ma matryca W przeciwnym przy-padku nie ma mo liwo ci prawid owego wyliczenia adresu komoacuterki do ktoacuterej ma od-by si zapis

W dalszej cz ci rozdzia u zostanie wykorzystany modu LCD o organizacji 16times2(ale mo na te bez problemu wykorzysta dowolny inny)

Zanim b dzie mo na co wy wietli na ekranie modu musi zosta zainicjalizowanyW trakcie inicjalizacji ustawiane s podstawowe parametry pracy sterownika LCD mdashorganizacja matrycy (liczba linii) wielko czcionki (5times8 lub 8times11 pikseli) Wielkoczcionki zale y od typu pod czonej matrycy LCD Dla konkretnego modu u LCDtylko jedna z tych warto ci b dzie poprawna Oproacutecz inicjalizacji modu u nale y tak-e poprawnie ustawi stan pinoacutew IO wykorzystywanych do pod czenia modu u LCD

Wi kszo pracy zwi zanej z inicjalizacj modu u LCD odbieraniem i wysy aniemdo niego danych wykonuje biblioteka Joerga Wunscha Dostarcza ona niskopozio-mowe funkcje umo liwiaj ce komunikacj ze sterownikiem hd44780 i innymi kom-patybilnymi z nim sterownikami Wystarczy e do aplikacji w ktoacuterej planujemy wy-korzysta taki modu do czymy plik hd44780c oraz plik nag oacutewkowy hd44780h

Kup książkę Poleć książkę

50 AVR Uk ady peryferyjne

Oba pliki bdquozak adaj rdquo e istnieje plik nag oacutewkowy definesh zawieraj cy podstawo-we definicje zwi zane ze sposobem pod czenia modu u LCD z mikrokontroleremNa pocz tku nale y okre li ktoacutere linie IO zosta y wykorzystane do pod czenia modu u

define HD44780_RS A 4define HD44780_RW A 5define HD44780_E A 6define HD44780_D4 A 0

W powy szym przyk adzie do kolejnych linii portu A (A4 ndash A6) zosta y pod czonesygna y RS RW i E modu u natomiast do linii A0 ndash A3 linie D4 ndash D7 modu u LCD Wa nejest aby linie danych czy z pinami IO w kolejno ci rosn cej Biblioteka wykorzy-stuje do transmisji danych pomi dzy modu em a mikrokontrolerem tylko 4 linie danychmdash dzi ki temu mo emy zmniejszy liczb po cze a zwolnione linie IO wykorzystado innych celoacutew W pliku wyst puje jeszcze jedna definicja

define USE_BUSY_BIT 1

Okre la ona e biblioteka b dzie u ywa flagi Busy modu u LCD mdash umo liwia touzyskanie optymalnej szybko ci wspoacute dzia ania z modu em Zako czenie realizacjibie cej operacji modu sygnalizuje zmian stanu tej flagi co umo liwia niezw ocznewys anie kolejnej komendy Je li nie u ywamy flagi Busy program musi generowamaksymalne zalecane w nocie katalogowej opoacute nienia w efekcie ca a transmisja zwal-nia Po zdefiniowaniu u ywanych pinoacutew w pliku definesh mo emy rozpocz korzy-stanie z biblioteki

W pliku hd44780h s udost pnione prototypy funkcji odpowiedzialnych za wspoacute -prac z modu em LCD

Funkcje bibliotecznePodstaw modu u stanowi dwie funkcje umo liwiaj ce odpowiednio wys anie da-nych do modu u oraz ich odczytanie

void hd44780_outbyte(uint8_t b uint8_t rs)uint8_t hd44780_inbyte(uint8_t rs)

Obie funkcje wysy aj odczytuj 8-bitow dan w przypadku wykorzystania tylko4-bitowej szyny danych wysy anie i odczytywanie danych odbywa si w dwoacutech etapachDodatkowo zmienna rs okre la tryb dost pu W przypadku wysy ania danych do modu urs = 0 powoduje e dane zostan wys ane do rejestru komend a je li rs = 1 dane trafido rejestru danych Przy odczycie jest podobnie z tym e dla rs = 0 jest odczytywanaflaga Busy i rejestr AC (ang Address Counter)

Kolejna funkcja odpowiada za oczekiwanie na gotowo modu uvoid hd44780_wait_ready(bool islong)

W przypadku gdy w pliku definesh symbol USE_BUSY_FLAG ma warto 1 parametrislong jest ignorowany a optymalizator kompilatora usuwa go gdy nie jest on wy-korzystywany przez funkcj Kiedy warto USE_BUSY_FLAG jest roacute na od 1 parametr

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 51

ten okre la d ugo opoacute nienia Je li jest roacute na od 0 opoacute nienie wynosi 152 ms a je-eli jest roacutewna 0 opoacute nienie wynosi 37 s Poniewa lepiej jest u ywa flagi Busy

mo emy ten parametr ignorowa

Powy sze trzy funkcje wystarcz do komunikacji z modu em dla wygody zdefiniowanojednak kolejne Funkcje hd44780_outcmd(n) i hd44780_incmd() umo liwiaj odpowiedniowys anie polecenia do rejestru komend kontrolera lub odczytanie bitu Busy i licznikaAC Dwie kolejne mdash hd44780_outdata(n) oraz hd44780_indata() mdash umo liwiaj zapisi odczytanie rejestru danych

Oproacutecz funkcji odpowiedzialnych za komunikacj z modu em LCD zdefiniowano tak efunkcj przeprowadzaj c podstawow inicjalizacj modu u hd44780_init(void) orazfunkcj hd44780_powerdown(void) ustawiaj c wszystkie linie u yte do komunikacjiw stan 0 co umo liwia bezpieczne od czenie zasilania od modu u LCD W przypadkupozostawienia ktoacuterej z wy ej wymienionych linii w stanie 1 przy od czonym za-silaniu modu u stanowi ona jego zasilanie W efekcie mimo wy czenia modu mo epobiera znaczny pr d

Szerszego omoacutewienia wymaga funkcja hd44780_outcmd(cmd) ktoacutera umo liwia wys a-nie polecenia do rejestru polece sterownika LCD Dla wygody zdefiniowane zosta yroacute ne komendy u atwiaj ce wspoacute prac z modu em LCD Komendy te s przekazy-wane jako argument wywo ania funkcji hd44780_outcmd np

hd44780_outcmd(HD44780_CLR)

powoduje wys anie do sterownika polecenia HD44780_CLR czyszcz cego zawartopami ci DDRAM kontrolera

KomendyFunkcja hd44780_outcmd przyjmuje jako argument predefiniowane makrodefinicjeznacznie u atwiaj ce wspoacute prac z kontrolerem modu u LCD Poni ej zostan onepokroacutetce omoacutewione

HD44780_SHIFT(shift right)Ta makrodefinicja powoduje przesuni cie pozycji wy wietlanego tekstu (shift = 1)o jedn pozycj w lewo (argument right = 0) lub w prawo (argument right = 1)W przypadku gdy shift = 0 przesuwany w lewo lub prawo jest tylko kursor Wysy-aj c wielokrotnie to polecenie uzyskujemy kolejne przesuni cia o jedn pozycj

w lewo lub prawo Polecenie to s u y g oacutewnie do przesuwania tekstu Jednak ze wzgl duna du bezw adno tekstowych modu oacutew LCD nie nale y przesuwa liter cz ciej niok raz na sekund mdash cz stsze przesuwanie daje bardzo nieprzyjemne efekty wizual-ne Ka dy bufor linii jest bdquozawijanyrdquo to znaczy e po ostatnim znaku z prawej jestwy wietlany pierwszy znak z lewej i odwrotnie Nale y pami ta e d ugo buforajest sta a dla danego modelu matrycy Np dla modu oacutew 16times2 bufor jednej linii wyno-si dok adnie 40 bajtoacutew z czego 16 jest jednorazowo wy wietlanych Poni szy kodcyklicznie przewija wy wietlany tekst w lewo

lcd_puttext_P(PSTR(Test bufora i przewijania tekstunTen tekst przewija sie w lewo))while(1)

Kup książkę Poleć książkę

52 AVR Uk ady peryferyjne

hd44780_outcmd(HD44780_SHIFT(10)) _delay_ms(700)

HD44780_FNSET(if8bit twoline font5x10)Polecenie to wybiera typ interfejsu mdash 8-bitowy je li warto parametru if8bit jestroacutewna 1 lub 4-bitowy je li jest roacutewna 0 Typ interfejsu musi odpowiada sposobowipo czenia modu u z mikrokontrolerem Parametr twoline okre la czy pod czonamatryca LCD ma jedn lini znakoacutew czy dwie Matryce ktoacutere maj 4 linie tekstu straktowane przez kontroler jako matryce dwuliniowe mdash parametr twoline powinienmie warto 1 Je li dla matrycy zawieraj cej dwie lub wi cej linii ustawimy go na 0to wy wietlana b dzie tylko jedna linia (w przypadku matryc dwuliniowych goacuterna)a w przypadku matryc 4-liniowych b d wy wietlane dwie linie rozdzielone lini pust

Ostatni parametr okre la typ u ywanego generatora znakoacutew Powinien on odpowiadau ytej w module matrycy zwykle wi c jego warto wynosi 0

HD44780_DISPCTL(disp cursor blink)Ustawia roacute ne parametry pracy matrycy Je li parametr disp ma warto 1 to matrycajest w czona (wy wietla zawarto DDRAM) a je li 0 to matryca jest wy czonalecz stan pami ci DDRAM nie ulega zmianie Np kod

while(1) hd44780_outcmd(HD44780_DISPCTL(011)) _delay_ms(700) hd44780_outcmd(HD44780_DISPCTL(111)) _delay_ms(700)

powoduje naprzemienne w czanie i wy czanie matrycy w efekcie wy wietlany tekstmruga

Parametr cursor okre la czy sprz towo wy wietlany kursor ma by widoczny (war-to parametru 1) czy niewidoczny (warto parametru 0) Je li kursor jest widocznyto dodatkowo mo emy okre li czy ma miga (warto parametru blink roacutewna 1)czy nie (blink = 0) Je li kursor jest widoczny i nie miga jest wy wietlany w postacipoziomej kreski Wy wietlanie kursora mo e by u yteczne w sytuacji kiedy u yt-kownik wprowadza jakie dane W pozosta ych sytuacjach kursor mo emy wy czy

HD44780_ENTMODE(inc shift)Okre la sposoacuteb wprowadzania danych do pami ci Je li parametr inc ma warto 1 topo ka dej operacji zapisuodczytu adres pami ci jest automatycznie zwi kszany o je-den co przy piesza operacj zapisuodczytu kolejnych znakoacutew Je li warto inc jestroacutewna 0 to adres jest automatycznie zmniejszany o 1 Dodatkowo parametr shiftokre la czy wy wietlany obraz ma by automatycznie przesuwany tak aby wy wie-tla ostatnio wprowadzony znak (shift = 1) lub go nie wy wietla (shift = 0)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 53

HD44780_CLRPowoduje wyczyszczenie (wype nienie znakami o kodzie 32) ca ej zawarto ci pami ciDDRAM Jednocze nie kursor wraca do pozycji pierwszej (pierwsza linia pierwszyznak)

Niewy wietlane bajty pami ci DDRAM tak e s kasowane Je li s one u ywanedo przechowywania zmiennych programu to przed operacj kasowania nale y jeskopiowa w bezpieczne miejsce W przeciwnym przypadku zostan utracone

Wska nik adresu do pami ci DDRAM jest ustawiany na 0 zerowane jest tak e prze-suni cie

HD44780_HOMEPowoduje powroacutet kursora do pozycji pocz tkowej mdash pierwsza linia pierwszy znakWska nik adresu do pami ci DDRAM w efekcie zawiera 0 zerowane jest roacutewnieprzesuni cie wy wietlania znakoacutew w efekcie s one wy wietlane od pozycji 0

HD44780_DDADDR(addr)Ustawia nast pny adres zapisuodczytu w pami ci DDRAM na addr Tylko 7 bitoacutewargumentu addr jest branych pod uwag w zwi zku z czym mo na zaadresowa mak-symalnie 128 bajtoacutew pami ci (z czego sterownik ma tylko 80 pozosta e lokacje snieu ywane)

HD44780_CGADDR(addr)Ustawia nast pn operacj odczytuzapisu w pami ci CGRAM na addr Pod uwagbranych jest tylko 6 bitoacutew zmiennej addr w efekcie mo na zaadresowa maksymalnie64 bajty pami ci CGRAM

Przedstawione powy ej funkcje zapewniaj jedynie podstawow komunikacj z mo-du em LCD Potrzebujemy jednak ci gle funkcji odpowiedzialnej za jego inicjalizacjmdash funkcja biblioteczna przeprowadza ten proces tylko w podstawowym zakresie musi-my jeszcze zadba o w a ciwe ustawienie parametroacutew zwi zane z posiadan matryc Napiszmy wi c w asne rozwini cie funkcji inicjalizacyjnej

void lcd_init() hd44780_init() Podstawowa inicjalizacja modu u hd44780_outcmd(HD44780_CLR) Wyczy pami DDRAM hd44780_wait_ready(1000) hd44780_outcmd(HD44780_ENTMODE(1 0)) Tryb autoinkrementacji AC hd44780_wait_ready(1000) hd44780_outcmd(HD44780_DISPCTL(1 0 0)) W cz wy wietlacz wy cz kursor hd44780_wait_ready(1000)

Zauwa e po wys aniu ka dego polecenia do modu u jest wywo ywana funkcjahd44780_wait_ready(1000) odpowiedzialna za oczekiwanie a realizacja wys anego po-lecenia dobiegnie ko ca Jest to niezb dne gdy do czasu uko czenia bie cej

Kup książkę Poleć książkę

54 AVR Uk ady peryferyjne

operacji dalsze polecenia s ignorowane Jako argument podany jest parametr 1000mdash jest on bez znaczenia nasza biblioteka korzysta z flagi Busy i po prostu go ignorujePo wykonaniu powy szej funkcji modu LCD jest poprawnie zainicjalizowany a jegopami jest wyczyszczona (zawiera bajty 0x20) i w efekcie modu nic nie wy wietlaOd tej chwili mo emy wysy a znaki do wy wietlenia

Po wykonaniu inicjalizacji ekran mo e pozosta czysty lub wy wietla ca kowiciewype nione kwadraty (wszystkie piksele w czone) Je li po inicjalizacji wszystkiepiksele s w czone nale y nieco zmniejszy kontrast

Aby sobie u atwi to zadanie zdefiniujmy funkcj wysy aj c do modu u jeden znakvoid lcd_putchar(char c) static bool second_nl_seen static uint8_t line=0

if ((second_nl_seen) ampamp (c = n)ampamp(line==0)) Odebrano pierwszy znak hd44780_wait_ready(40) hd44780_outcmd(HD44780_CLR) hd44780_wait_ready(1600) second_nl_seen=false if (c == n) if (line==0) line++ hd44780_outcmd(HD44780_DDADDR(64)) Adres pierwszego znaku drugiej linii hd44780_wait_ready(1000) else second_nl_seen=true line=0 else hd44780_outdata(c) hd44780_wait_ready(40)

Funkcja ta ze wzgl du na skomplikowane adresowanie pami ci DDRAM jest zale naod konkretnego modelu modu u LCD B dzie prawid owo wspoacute pracowa z modu a-mi 2times16 2times20 i 2times40 znakoacutew W przypadku innych modu oacutew pozycje niektoacuterychznakoacutew mog by nieprawid owe

Mo emy ju wy wietla na LCD pojedyncze znaki czas na wy wietlanie tekstu Po-niewa teksty jako sta e dla zaoszcz dzenia cennej pami ci RAM przechowuje si za-zwyczaj w pami ci FLASH zdefiniujmy funkcj odczytuj c podany a cuch zna-kowy z pami ci FLASH a nast pnie umieszczaj c go na LCD

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 55

void lcd_puttext_P(prog_char txt) char ch while((ch=pgm_read_byte(txt))) lcd_putchar(ch) txt++

Powy sza funkcja wysy a kolejne znaki odczytane z pami ci FLASH na LCD za po-moc funkcji LCD_putchar Po napotkaniu znaku ko ca a cucha (0 nul) przerywa swojedzia anie

Pozostaje nam przetestowa dzia anie przedstawionych funkcjiint main() lcd_init() lcd_puttext_P(PSTR(Test LCDnDruga linia)) while(1)

Na ekranie modu u LCD powinien wy wietli si napisTest LCDDruga linia

Je li na LCD nic nie widzimy to w pierwszej kolejno ci powinni my sprawdzi kon-trast zmieniaj c napi cie na pinie Vee modu u LCD

Warto zdefiniowa jeszcze funkcj ustawiaj c pozycj od ktoacuterej b dzie wy wietlanynast pny znak

void lcd_goto(uint8_t x uint8_t y) hd44780_outcmd(HD44780_DDADDR(0x40y+x)) hd44780_wait_ready(1000)

Funkcja ta przyjmuje dwa parametry x i y okre laj ce pozycj na ktoacuterej zostaniewy wietlony nast pny znak wys any z mikrokontrolera do modu u LCD Dzi ki temuz atwo ci mo emy uaktualnia zawarto LCD bez konieczno ci ponownego prze-sy ania wszystkich danych Funkcja ta jest zale na od typu zastosowanego modu u

Ostatni funkcj jest funkcja umo liwiaj ca czyszczenie zawarto ci pami ci modu uOdpowiedzialne za to jest proste polecenie wysy ane do sterownika

void lcd_cls() hd44780_outcmd(HD44780_CLR) hd44780_wait_ready(false)

Oproacutecz czyszczenia zawarto ci pami ci modu u powoduje ono ustawienie kursoraw punkcie (00)

Kup książkę Poleć książkę

56 AVR Uk ady peryferyjne

Definiowanie w asnych znakoacutewUk ad HD44780 jest wyposa ony w 64 bajty pami ci CGRAM (ang Character Ge-nerator RAM) ktoacutera mo e przechowywa mapy bitowe 8 znakoacutew o matrycy 5times8 pikselilub 4 znakoacutew o matrycy 5times10 pikseli Przyk ad definicji znaku na matrycy 5times8 poka-zano na rysunku 223

Rysunek 223Przyk ad definicji w asnego znakuw pami ci CGRAM Znak rysujemyna matrycy 5times8 bitoacutew polazaciemnione odpowiadaj warto ci 1pola bia e warto ci 0 Wartowyliczon dla ka dej linii pikseliwpisujemy do pami ci CGRAMsterownika Najstarsze 3 bity ka degobajta (pola szare) s bez znaczeniamdash wy wietlacz pomija jeprzy wy wietlaniu obrazu

1

2

3

4

5

6

7

0 00100 = 4

01110 = 14

11111 = 31

00100 = 4

00100 = 4

00100 = 4

11111 = 31

01110 = 14

Adres Warto

Dost p do tej pami ci jest mo liwy dzi ki wys aniu polecenia ustawiaj cego adreszapisuodczytu pami ci CGRAM Po jego wys aniu wszystkie operacje zapisu i od-czytu dotycz tej pami ci a nie pami ci DDRAM Aby wroacuteci do adresowania pa-mi ci DDRAM nale y wybra jej adres lub dokona operacji wymagaj cej przesu-ni cia kursora

Pami CGRAM jest pami ci ulotn po ponownym w czeniu zasilania definicjeznakoacutew musz by ponownie przes ane przez procesor

Bity o warto ci 1 w definicji znaku odpowiadaj w czonym pikselom bity o warto-ci 0 pikselom wy czonym Najstarsze 3 bity ka dego bajta w pami ci CGRAM s

bez znaczenia mdash te pozycje nie s wy wietlane przez matryc Definiuj c znak nale-y tak e pami ta e ostatnia linia wy wietlana przez matryc (w zale no ci od wiel-

ko ci matrycy znaku linia 8 lub 10) powinna zawiera same zera mdash w tej linii b dziewy wietlany kursor

Najcz ciej matryce LCD pod czone do sterownika HD44780 maj organizacj 5times8czyli jeden znak jest definiowany przez 8 kolejnych bajtoacutew okre laj cych stan po-szczegoacutelnych linii tworz cych znak Stwoacuterzmy funkcj ktoacuterej zadaniem b dzie za a-dowanie definicji znakoacutew z pami ci FLASH mikrokontrolera do pami ci CGRAM

void lcd_defchar_P(uint8_t charno prog_uint8_t chardef) hd44780_outcmd(HD44780_CGADDR(charno8)) hd44780_wait_ready(40) for(uint8_t c=0clt8c++) hd44780_outdata(pgm_read_byte(chardef))

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 57

hd44780_wait_ready(40) chardef++

Funkcja LCD_defchar_P jako argumenty przyjmuje numer definiowanego znaku (0 ndash 7)oraz wska nik do obszaru pami ci FLASH zawieraj cego definicj znaku (obszarten zajmuje 8 nast puj cych po sobie bajtoacutew) Jak widzimy funkcja najpierw ustawiaw a ciwy adres pod ktoacuterym znajdzie si pocz tek definicji znaku w pami ci CGRAMmdash poniewa jeden znak jest opisywany za pomoc 8 bajtoacutew kolejne adresy znakoacutewto kod_znakutimes8 Nast pnie dane opisuj ce znak s adowane z pami ci mikrokontrolerai zapisywane w pami ci CGRAM sterownika Poni szy program ilustruje wykorzy-stanie funkcji LCD_defchar_P

prog_uint8_t char1[8][8]=0000000255 00000025525500000255255255 0000255255255255 00025525525525525500255255255255255255 0255255255255255255255255255255255255255255255

int main() for(uint8_t x=0xlt8x++) lcd_defchar_P(xampchar1[x][0]) Za aduj wzorce znakoacutew lcd_init() for(uint8_t x=0xlt8x++) lcd_putchar(x) Wy wietl znaki o kodach 0 ndash 7 while(1)

W pierwszej linii funkcji main nast puje za adowanie nowych definicji znakoacutew dopami ci CGRAM nast pnie inicjalizowany jest wy wietlacz po czym w pierwszejlinii s wy wietlane znaki o kodach 0 ndash 7 a wi c znaki ktoacuterych definicja zosta aprzes ana z mikrokontrolera

Zauwa e pami CGRAM podobnie jak DDRAM mo emy zapisywa i odczytywaprzed inicjalizacj modu u LCD Proces inicjalizacji jest potrzebny tylko do prawi-d owego wy wietlania na ekranie LCD

Poniewa dane potrzebne do wy wietlenia znaku s na bie co pobierane z pami cipodczas od wie ania matrycy LCD jakiekolwiek zmiany w definicji znaku kiedy jest onwidoczny na LCD poci gaj za sob natychmiastowe zmiany w wy wietlanym obrazieMo na t w a ciwo sterownika wykorzysta do stworzenia prostych animacji

void lcd_box(uint8_t y) hd44780_outcmd(HD44780_CGADDR(0)) Zaczynamy od znaku o kodzie 0 hd44780_wait_ready(40) for(uint8_t c=0cltyc++) Stwoacuterz linie z w czonymi pikselami hd44780_outdata(0xFF) hd44780_wait_ready(40) for(uint8_t c=yclt8c++) Stwoacuterz linie z wy czonymi pikselami hd44780_outdata(0x00) hd44780_wait_ready(40)

Kup książkę Poleć książkę

58 AVR Uk ady peryferyjne

int main() lcd_init() lcd_putchar(0) while(1) for(uint8_t x=0xlt8x++) lcd_box(x) _delay_ms(100) for(int8_t x=7xgt=0x--) lcd_box(x) _delay_ms(100)

Funkcja main wy wietla na LCD tylko jeden znak o kodzie 0 a nast pnie cykliczniezmienia jego definicj w pami ci CGRAM W efekcie posta znaku wy wietlana naekranie ci gle si zmienia

Transakcyjna obs uga LCDPokazana do tej pory obs uga LCD alfanumerycznego mia a pewne wady Jak wiemyoperacje odwo uj ce si do kontrolera LCD s niezwykle wolne cykl odczytuzapisudowolnego rejestru kontrolera trwa co najmniej 1600 ns co dla MCU taktowanegozegarem 32 MHz przek ada si na czas wykonania oko o 52 instrukcji asemblera Cogorsza wi kszo komend realizowanych przez kontroler jest wykonywana w czasieoko o 37 s co przek ada si na tysi ce zmarnowanych taktoacutew MCU St d te jaki-kolwiek zapisodczyt LCD to z perspektywy programu straszne marnotrawstwo czasu

Problem ten dotyczy ka dego urz dzenia IO ktoacutere dzia a wolniej ni procesor W takiejsytuacji warto napisa pewn warstw po redni mdash sterownik mdash ktoacuterego zada-niem b dzie buforowanie da dost pu do urz dzenia i rozstrzyganie konfliktoacutewdzi ki czemu roacute ne cz ci programu b d bdquomia y wra enierdquo e maj wy czny do-st p do urz dzenia

Pokazane wcze niej funkcje obs ugi LCD maj jeszcze jedn wad mdash nie s wspoacute bie -ne czyli nie mo na ich wykonywa jednocze nie w kilku miejscach programu w tymw szczegoacutelno ci w programie g oacutewnym i w funkcjach obs ugi przerwa W wielu przy-padkach ta wada jest bez znaczenia jednak czasami jest uci liwa mdash dla przyk adugdy na wy wietlany tekst chcieliby my na o y inne informacje np o dacie lub godzi-nie Oczywi cie wy wietlanie mo na zorganizowa tak aby nie by o potrzeby pisaniawspoacute bie nego kodu np poprzez zastosowanie bufora pami ci VRAM kontrolera LCDRodzi to jednak kolejne problemy i jest ma o eleganckie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 59

Zastanoacutewmy si w jaki sposoacuteb najlepiej jednocze nie rozwi za problem wolnegodost pu do urz dzenia i wspoacute bie no ci kodu Rozwi zaniem mo e by wprowadze-nie tzw transakcji Transakcj nazywamy zbioacuter operacji tworz cych pewn ca-o To co wyroacute nia tak wykonywany zestaw operacji to atomowo spoacutejno

izolacja i trwa o Pod tymi terminami kryje si istota wykonywanej operacji Ato-mowo transakcji zapewnia e jest ona wykonywana w sposoacuteb niepodzielny co gwa-rantuje nam prawid ow wspoacute prac z danym urz dzeniem IO w tym przypadku kon-trolerem LCD Wa na dla nas jest tak e izolacja mdash dzi ki temu inne operacje na LCD(inne transakcje) nie b d mia y wp ywu na wynik aktualnie wykonywanej transakcjimdash nie b d zak oacuteca y jej wykonania z drugiej strony nasza transakcja nie zak oacuteciwykonania innych Trwa o z kolei zagwarantuje nam e je li sterownik potwierdziwykonanie transakcji to znaczy e efekt jej dzia ania jest wy wietlony na LCD Tacecha nie jest nam a tak potrzebna mdash jest ona wydawa oby si oczywista Niemniej jestto pewna gwarancja e ca a operacja przebieg a poprawnie i w efekcie LCD znajdujesi w okre lonym przez nas stanie Tyle teorii przejd my do praktyki

Kody poni szego przyk adu znajduj si w katalogu PrzykladyLCD-alfaLCD-transact

Aby zapewni transakcyjny dost p do LCD musimy stworzy pewne struktury danychktoacuterych zadaniem b dzie przechowywanie informacji o operacjach sk adaj cych sina transakcje i stanie ich wykonania W tym celu pos u ymy si wiadomo ciami z roz-dzia u 5 bdquoJak uporz dkowa chaos czyli z o one typy danych i listyrdquo Do przecho-wywania oczekuj cych transakcji pos u ymy si buforem pier cieniowym zanimjednak go zaimplementujemy zastanoacutewmy si jak powinna wygl da struktura prze-chowuj ca informacje o transakcji Struktura ta powinna zawiera co najmniej

pole danych (data) z informacjami ktoacutere maj by przes ane do kontrolera LCD

pole okre laj ce liczb danych do wys ania (len)

pole okre laj ce realizowane polecenie dla LCD (cmd) mdash pole to pos u yprogramowi sterownika do w a ciwej interpretacji danych znajduj cych siw polu data

kilka poacutel kontrolnych przechowuj cych informacje potrzebne do realizacjisamej transakcji Jedno z nich mdash Ready mdash b dzie przyjmowa warto trueje li dana transakcja zosta a zrealizowana lub false w przeciwnym przypadkuZnaczenie drugiego pola mdash SelfDel mdash mo e wydawa si nieco enigmatycznepole to okre la czy pami przydzielona dla transakcji ma by zwolnionaw sterowniku LCD (warto true) czy te zostanie zwolniona w programie(warto false)

Oto jak mo e wygl da struktura definiuj ca transakcj typedef struct volatile bool Ready 1 true je li transakcja zosta a zrealizowana bool SelfDel 1 true je li pami przydzielona transakcji ma zosta zwolniona LCD_Cmd cmd 2 Polecenie do zrealizowania uint8_t len 6 D ugo polecenia

Kup książkę Poleć książkę

60 AVR Uk ady peryferyjne

unsigned 0 Wyroacutewnanie do granicy bajta uint8_t data[] Dane transakcji LCD_trans

Nale y zwroacuteci uwag na poleunsigned 0

Nie definiuje ono adnego pola struktury ale jedynie informuje kompilator e kolejnepole (w naszym przyk adzie o nazwie data) ma by wyroacutewnane do granicy bajta mdashdzi ki temu dost p do kolejnego pola b dzie odbywa si szybciej Z kolei samo poledata jest zadeklarowane jako tzw typ niekompletny

Typ niekompletny (ang incomplete type) to typ ktoacuterego rozmiaru nie da si okre li

W pokazanym przyk adzie rozmiaru pola data nie da si okre li gdy zosta on za-deklarowany jako typ tablicowy z tym e nie podano wielko ci tablicy Wielko ci niepodano gdy na etapie deklaracji struktury nie wiemy jakiej wielko ci dane b d w niejprzechowywane Tego typu deklaracja ma bardzo powa ne konsekwencje mdash skorowielko ci pola data nie da si okre li to jaki b dzie wynik dzia ania operatora sizeof(LCD_trans) Kompilator stara si jako wybrn z tej sytuacji w zwi zku z czym

zwroacuteci wielko struktury ale tak jakby pole data w ogoacutele nie istnia o mdash jego roz-miar b dzie wynosi 0 W ramach wiczenia zastanoacutew si ile bajtoacutew pami ci b dziezajmowa a struktura LCD_trans

Skoro dysponujemy ju struktur przechowuj c poszczegoacutelne transakcje pora nastworzenie obiektu przechowuj cego kolekcj transakcji Dodanie kolejnej strukturyb dzie polega o na dodaniu jej do takiego obiektu z drugiej strony program sterownikaLCD b dzie moacuteg z tej kolekcji pobiera kolejne transakcje do realizacji Opis ten przy-pomina opis dzia ania bufora pier cieniowego mdash z jednym wyj tkiem mdash po zape nie-niu ca ego bufora nie b dziemy usuwa niezrealizowanych transakcji lecz zabloku-jemy dodawanie kolejnych W tym celu pos u ymy si definicj nast pnej struktury

typedef struct LCD_trans elements[LCD_MAXTRANS] Wska niki do transakcji uint8_t Beg Pierwszy element bufora uint8_t Count Liczba elementoacutew w buforze CircBuffer

Struktura ta zawiera deklaracj tablicy wska nikoacutew na transakcje (pole elements)Poniewa jest to tablica musimy zna liczb jej elementoacutew mdash jest ona zadeklarowanaw sta ej LCD_MAXTRANS

define LCD_MAXTRANS 10 Maksymalna liczba pami tanych transakcji

Do realizacji bufora s potrzebne jeszcze dwa pola Beg wskazuj ce na pierwsztransakcj w buforze oraz pole Count okre laj ce liczb transakcji znajduj cych siw buforze Je li Count == 0 to znaczy e w buforze nie ma adnych oczekuj cychtransakcji a je li Count == LCD_MAXTRANS to znaczy e bufor jest pe ny i nie mo na

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 61

dodawa do niego kolejnych transakcji W a ciwo t wykorzystuj dwie zdefiniowanew pliku LCD_transc funkcje

static inline bool cbIsFull(CircBuffer cb) return cb-gtCount == LCD_MAXTRANS

static inline bool cbIsEmpty(CircBuffer cb) return cb-gtCount == 0

Jak pami tamy w przypadku funkcji modyfikatory static inline powoduj e danafunkcja nie b dzie istnie jako samodzielna lecz w ka dym miejscu w ktoacuterym jestwywo ywana jest wstawiany raczej jej kod a nie wywo anie Ma to znaczenie dlakroacutetkich funkcji (a wi c takich jak pokazane powy ej) dla ktoacuterych koszty wywo anias zazwyczaj wi ksze ni koszty umieszczenia cia a funkcji w miejscu jej wywo aniaTego typu funkcje zachowuj si w sposoacuteb zbli ony do makrodefinicji (z tym e re-spektuj wszystkie regu y j zyka C w szczegoacutelno ci kolejno operatoroacutew czy kon-trol typoacutew)

Takie funkcje jako argument pobieraj adres bufora na ktoacuterym maj operowa W na-szym przypadku bufor jest zdefiniowany nast puj co

static CircBuffer LCD_TransBuffer Bufor na transakcje

Nale y zauwa y e jest on zdefiniowany jako struktura globalna z modyfikatoremstatic Modyfikator ten ogranicza zasi g widoczno ci zmiennej LCD_TransBuffer dopliku w ktoacuterym zmienna ta zosta a zdefiniowana (w tym przypadku modyfikator staticjest niejako przeciwie stwem modyfikatora extern) Dzia anie to ma jedynie znaczeniekosmetyczne mdash uniemo liwia odwo anie si do bufora za pomoc funkcji ktoacutere niezosta y zdefiniowane w miejscu jego definicji Oproacutecz funkcji umo liwiaj cych okre-lenie stanu bufora potrzebne s jeszcze funkcje umo liwiaj ce dodanie i pobranie trans-

akcji Pierwsz funkcj b dzie funkcja dodaj ca transakcj do buforabool cbAdd(CircBuffer cb LCD_trans elem) ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsFull(cb)) return false Czy jest miejsce w kolejce uint8_t end = (cb-gtBeg + cb-gtCount) LCD_MAXTRANS cb-gtelements[end] = elem Dodaj transakcj ++cb-gtCount Liczba elementoacutew w buforze return true Wszystko OK

Funkcja ta dodaje transakcj (zmienna elem) do bufora ko owego Zanim transakcjazostanie dodana sprawdzane jest czy w buforze jest miejsce mdash je li nie funkcjazwroacuteci false Je li dodanie jest mo liwe warto licznika okre laj cego liczb trans-akcji przechowywana w buforze (Count) zwi ksza si o jeden Warto zastanowi si te dlaczego praktycznie ca e cia o tej funkcji jest zamkni te w sekcji atomowej (ATOMIC_BLOCK) Jedn z cech naszego sterownika ma by mo liwo wspoacute bie nego dost pu

Kup książkę Poleć książkę

62 AVR Uk ady peryferyjne

do LCD mdash to znaczy e danie np zapisu do LCD mo e wyst pi zaroacutewno w g oacutewnejp tli programu jak i asynchronicznie w przerwaniu St d te wynika e funkcja do-daj ca transakcj musi by napisana w sposoacuteb zapewniaj cy jej poprawn prac w sytu-acji gdy zostanie ona przerwana i ponownie wywo ana przed zako czeniem dzia aniajej poprzedniej instancji Umieszczenie cia a tej funkcji w sekcji atomowej nam to za-pewnia mdash dzi ki temu bufor transakcji zawsze b dzie spoacutejny Dla zaspokojenia cie-kawo ci warto usun sekcj atomow i sprawdzi jak wtedy b dzie zachowywa si tafunkcja i jak wp ynie to na spoacutejno przechowywanych danych

Drug niezb dn funkcj jest funkcja odczytuj ca bufor transakcji i zwracaj ca trans-akcj do zrealizowania (lub NULL je li adnej transakcji nie ma w buforze)

LCD_trans cbRead(CircBuffer cb) LCD_trans elem ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsEmpty(cb)) return NULL Bufor pusty nie mo na zwroacuteci elementu elem = cb-gtelements[cb-gtBeg] cb-gtBeg = (cb-gtBeg + 1) LCD_MAXTRANS -- cb-gtCount Zmniejszamy liczb elementoacutew pozosta ych w buforze return elem

Funkcja ta jest bardzo podobna do poprzedniej mdash najpierw sprawdza czy bufor za-wiera jak oczekuj c transakcj (cbIsEmpty(cb)) je li tak to zwraca adres opisuj -cej j struktury i zmniejsza liczb transakcji oczekuj cych (pole Count) W ten sposoacutebmamy zrealizowan ca funkcjonalno zwi zan z obs ug bufora pier cieniowegoPokazane funkcje s uniwersalne i z bardzo podobnych (lub wr cz tych samych) b -dziemy korzysta w kolejnych rozdzia ach w kontek cie np obs ugi transakcji zwi -zanych z interfejsami szeregowymi

Pora przej do samego sterownika LCD Jego zadaniem b dzie sprawdzenie czyw buforze oczekuj jakie transakcje do realizacji a je li tak to ich wykonanie Ponie-wa dane do LCD mog by wysy ane co okre lony minimalny czas znacznie d u -szy ni czas jakiego na to zadanie potrzebuje mikrokontroler do wysy ania kolejnychpaczek danych pos u ymy si timerem Timer b dzie generowa przerwanie nadmiaru(TCD0_OVF_vect) ktoacutere b dzie wyznacza o tempo w jakim kolejne porcje danych b -d trafia y do LCD Z noty katalogowej kontrolera wynika e minimalny czas trwa-nia wysokiego stanu sygna u Enable to 230 ns a okres tego sygna u nie powinien bykroacutetszy ni 500 ns Poniewa nasz dost p do LCD odbywa si w sposoacuteb nieblokuj cyMCU wi c szybko wysy ania danych do LCD jest bez znaczenia St d te w poka-zanym przyk adzie przyj to e dane b d wysy ane co 4 s co okre la sta a

define LCD_ACCESSTIME 0000004

Poniewa komunikacja z LCD odbywa si w sposoacuteb nieblokuj cy nie zale y nam tena czasie (i tak w stosunku do czasu od wie ania samego LCD jest on bardzo kroacutetki)w efekcie nie ma potrzeby odczytywania flagi busy kontrolera Dzi ki temu w cz ciprzypadkoacutew mo emy w ogoacutele zrezygnowa z sygna u wyboru RW i wymusi jego sta y

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 63

poziom logiczny umo liwiaj cy zapis do LCD Dzi ki temu mo na zaoszcz dzi do-datkowy pin IO1

Ca a logika naszego sterownika jest zawarta w funkcji obs ugi przerwania przepe nieniatimera (TCD0_OVF_vect) Poniewa LCD jest po czony z MCU w trybie 4-bitowym(dla zaoszcz dzenia liczby wykorzystanych pinoacutew IO) kolejne 8-bitowe dane muszby podzielone na dwie tetrady i wys ane do LCD w kolejno ci starszam odsza tetradaInformacja o aktualnie wysy anych danych jest umieszczona w zmiennej trans o typie

static struct uint8_t pos 6 Pozycja w polu danych aktualnej transakcji uint8_t nibble 1 Ktoacutera tetrada jest wysy ana seq

Dlaczego tak Dzi ki wykorzystaniu struktury i poacutel bitowych mo na zaoszcz dzi je-den bajt pami ci SRAM Ze wzgl du na wielko pami ci obs ugiwanej przez kon-troler LCD mo emy by pewni e transakcje zawieraj ce wi cej ni 63 bajty s ra-czej nierealne (nie mia yby wi kszego sensu) St d te do przechowywania informacjio aktualnie wysy anym bajcie danych wystarczy 6 bitoacutew mdash tyle samo zosta o wyko-rzystanych do okre lenia d ugo ci pola danych transakcji w strukturze LCD_trans Zaosz-cz dzony bit mo na po wi ci na flag nibble okre laj c ktoacutera tetrada (m odszastarsza)jest wysy ana Bez poacutel bitowych flaga ta zaj aby dodatkowy bajt pami ci

Przejd my do implementacji sterownika Pierwsz rzecz jak nale y sprawdzi jestto czy w buforze czeka jaka transakcja do zrealizowania Odpowiedzialny za to jestfragment kodu obs ugi przerwania nadmiaru timera

if(trans == NULL) Nic do zrobienia sprawd my czy jaka transakcja oczekuje trans=cbRead(ampLCD_TransBuffer) Czy jest jaka oczekuj ca transakcja seqpos=0 seqnibble=0 if(trans == NULL) TCD0_CTRLA=TC_CLKSEL_OFF_gc Nie ma adnych transakcji mdash wy cz timer

W przypadku gdy adna transakcja nie oczekuje na realizacj timer jest wy czanymdash dzi ki temu nie b d zg aszane kolejne przerwania przepe nienia i MCU nie b -dzie traci czasu na ich obs ug Co prawda wynikaj cy z tego zysk czasowy jest mar-ginalny lecz ma to istotniejsz konsekwencj mdash w przypadku usypiania MCU zb d-ne przerwanie timera nie b dzie niepotrzebnie wybudza o procesora W takiej sytuacjiponowne w czenie timera nast pi dopiero w funkcji dodaj cej transakcj do kolejkimdash a wi c w sytuacji gdy mamy pewno e istnieje oczekuj ca transakcja

Druga cz funkcji obs ugi przerwania jest zwi zana z realizacj samej transakcjiW pokazanym przyk adzie zaimplementowano tylko jeden typ transakcji mdash daniezapisu a cucha tekstowego pod wskazany adres VRAM (na okre lonej pozycji LCD)Je li zajdzie taka potrzeba programista mo e zaimplementowa inne polecenia i doda

1 Warto zauwa y e w bdquoklasycznejrdquo obs udze LCD te nie musimy czyta stanu flagi busy zamiast tego

wystarczy wprowadza p tle opoacute niaj ce Jednak poniewa taka obs uga blokuje MCU nie jest onazalecana Wady tej nie ma dost p transakcyjny co jest jego dodatkow zalet

Kup książkę Poleć książkę

64 AVR Uk ady peryferyjne

kod odpowiedzialny za ich obs ug Zauwa my e ka da transakcja musi zawieraadres pocz tku pami ci wideo od ktoacuterego b dzie zapisywany tekst Dzieje si takdlatego e transakcja wykonana wcze niej mo e ustawi wska nik zapisu na dowolnejkomoacuterce pami ci W efekcie tekst z kolejnej transakcji by by wy wietlany od komoacuterkina ktoacuterej zako czy si zapis poprzedniej transakcji Takie dzia anie oczywi cie jestniedopuszczalne st d te ka dy zapis do pami ci wideo poprzedza ustawienie rejestruindeksowego Problem ten mo na rozwi za tak e w inny sposoacuteb mdash poprzez wpro-wadzenie tzw uchwytoacutew (ang handlers) ktoacutere zawiera yby stan kontrolera LCDNiemniej to rozwi zanie dodatkowo komplikowa oby nasz sterownik Struktura danych(zawartych w polu data) ma wi c nast puj cy format

bajt nr 0 zawiera warto pozycji od ktoacuterej nale y dokonywa zapisu pami ciwideo mdash jest to warto przesy ana do rejestru okre laj cego adres zapisu

kolejne bajty zawieraj a cuch znakowy ktoacutery nale y umie ci w pami ciCGRAM

Poniewa bajt nr 0 zawsze zawiera warto wpisywan do rejestroacutew steruj cych kon-trolera podczas jego wysy ania jest ustawiana linia RS sygnalizuj ca zapis do rejestruPodczas wysy ania kolejnych bajtoacutew linia ta jest zerowana w zwi zku z czym zapisodbywa si do pami ci CGRAM

Kod obs uguj cy transakcj wygl da nast puj coif(trans) Jest transakcja do zrealizowania uint8_t dat=trans-gtdata[seqpos] if(seqnibble == 0) datgtgt=4 To trzeba zmieni je li linie danych nie s po czone z pinami 0 ndash 3 portu IO hd44780_outnibble_nowait(dat amp 0x0F seqpos = 0) Zapisujemy rejestr steruj cy lub dane ++seqnibble if(seqnibble == 0) ++seqpos Co drug tetrad zwi kszamy pozycj bufora if(seqpos gt= trans-gtlen) trans-gtReady=true Koniec transakcji if(trans-gtSelfDel) free_re(trans) Zwolnij pami transakcji je li tak sobie yczy programista trans=NULL Koniec transakcji CLR(OUT HD44780_E)

Ta cz przerwania wysy a kolejne tetrady do kontrolera LCD Warto zastanowi sinad dzia aniem sekwencji

++seqnibble

Poniewa pole nibble jest jednobitowe operacja inkrementacji prowadzi do zmianystanu tego pola na przeciwny (pole to ma warto 0 lub 1) Kiedy zostan wys anewszystkie dane przeznaczone dla kontrolera obs uga transakcji ko czy si Stan tensygnalizuje nadanie warto ci true polu Ready struktury LCD_trans Dzi ki temu pro-gram mo e sprawdzi asynchronicznie w stosunku do przerwania kiedy transakcjauleg a zako czeniu Opcjonalnie jest wykonywana jeszcze jedna funkcja mdash je li poleSelfDel ma warto true to pami zarezerwowana na transakcj jest automatycznie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 65

zwalniana W tym celu wykorzystuje si funkcj free_re ktoacuterej prototyp jest zade-klarowany w pliku Alloc_safeh Funkcja ta wywo uje funkcj biblioteczn free ktoacute-ra zwalnia pami przydzielon dynamicznie na stercie Poniewa funkcja ta nie jestfunkcj reentrant nale y stworzy odpowiedni bdquoprotez rdquo opakowuj c j w blokatomowy co zapewnia e nie zostanie ona ponownie wywo ana zanim jej poprzed-nia instancja nie zako czy dzia ania Oczywi cie lepszym rozwi zaniem by oby napi-sanie w asnych funkcji dynamicznej alokacji pami ci ktoacutere b d reentrant

Bardzo wa ne jest aby pole SelfDel mia o warto true wy cznie dla transakcjidla ktoacuterych pami zosta a przydzielona dynamicznie funkcj malloc (lub jej po-chodnymi) W pozosta ych przypadkach pole to musi mie warto false mdash nie-stosowanie si do tej regu y spowoduje b d mened era pami ci i najprawdopo-dobniej nieprzewidywalne dzia anie programu

Drug wa n zasad jest aby zmienna zawieraj ca dane transakcji nie by azmienn automatyczn mdash zmienne takie s automatycznie niszczone po opusz-czeniu zawieraj cej je funkcji W rezultacie obszar pami ci zawieraj cy danetransakcji mo e zosta wykorzystany przez inne zmienne co spowoduje uszkodzeniezawartych w nim danych

Pami przydzielona transakcji musi by alokowana w sposoacuteb dynamiczny (funkcjamalloc_re) ewentualnie mo e to by pami alokowana dla zmiennej globalnej lubstatycznej mdash zmienne tego typu istniej przez ca y czas ycia programu

Warto te zauwa y e instrukcje steruj ce stanem linii Enable kontrolera LCD(SET(OUT HD44780_E) i CLR(OUT HD44780_E)) s rozdzielone wieloma innymi in-strukcjami Dzi ki temu generowany impuls dodatni tego sygna u ma czas trwania gt230 ns wymagany w specyfikacji kontrolera Nawet dla XMEGA taktowanej zegarem32 MHz 230 ns przek ada si na oko o 7 instrukcji asemblera mdash czas jaki z pewno-ci up ynie pomi dzy wykonaniem obu powy szych instrukcji steruj cych

Do wysy ania danych do kontrolera zosta a wykorzystana nieco zmodyfikowanafunkcja hd44780_outnibble_nowait roacute ni ca si od jej protoplasty hd44780_outnibbletylko tym e nie czeka na sygna braku zaj to ci mikrokontrolera (nie realizuje teopoacute nie ) Nie jest to potrzebne gdy kolejne tetrady s wysy ane w odst pach cza-sowych okre lanych przez timer

Mamy wi c zapewnion obs ug transakcji i mo liwo transakcyjnego wy wietlaniadanych na LCD musimy jeszcze mie funkcj ktoacutera tworzy odpowiednie transakcjemdash jest odpowiednikiem funkcji bezpo rednio wysy aj cej dane znakowe do LCDOdpowiednikiem tym jest pokazana poni ej funkcja

bool LCD_PutText_B(uint8_t x uint8_t y char txt LCD_trans buf bool autodel) buf-gtcmd=LCD_Text buf-gtReady=false buf-gtSelfDel=autodel Czy zwolni pami po zako czeniu transakcji buf-gtdata[0]=HD44780_DDADDR(x+y0x40) Ustaw adres w DDRAM strcpy((char)ampbuf-gtdata[1] txt) Skopiuj dane tekstowe + NULL

Kup książkę Poleć książkę

66 AVR Uk ady peryferyjne

buf-gtlen=strlen(txt) + 1 D ugo tekstu + pozycji + NULL ndash 1 bool ret=cbAdd(ampLCD_TransBuffer buf) if((ret==false) ampamp (autodel)) free_re(buf) Brak miejsca w kolejce else TCD0_CTRLA=TC_CLKSEL_DIV1_gc Preskaler 1 mdash odblokuj timer return ret

Funkcja ta buduje transakcj odpowiedzialn za wy wietlenie napisu txt na wskaza-nej pozycji x y LCD Wszystkie dane o transakcji zostan umieszczone w buforzew pami ci ktoacuterej adres jest okre lany wska nikiem buf Pami w buforze musi bywystarczaj co du a aby pomie ci ca transakcj Dodatkowy parametr autodel okre laczy pami ta ma by automatycznie zwalniana po obs u eniu transakcji (true) czynie (false) Je li transakcj uda o si umie ci w kolejce funkcja zwraca true Wartozauwa y e w takim przypadku funkcja uruchamia te timer (w naszym przypadkujest to timer TCD0) odpowiedzialny za generowanie przerwania Funkcja obs ugi prze-rwania wysy a dane do LCD

Pewn odmian powy szej funkcji jest funkcjabool LCD_PutText(uint8_t x uint8_t y char txt) LCD_trans trans=malloc_re(sizeof(LCD_trans) + strlen(txt) + 2) bool ret=LCD_PutText_B(x y txt trans true) return ret

Wykorzystuje ona funkcj LCD_PutText_B z tym e najpierw alokuje dynamiczniepami potrzebn na przechowanie tworzonej transakcji

Mamy komplet potrzebnych funkcji a wi c sprawd my jak ca o sprawdza siw praktyce W pliku LCD-transactc znajduje si kod pokazuj cy jak dzia aj naszetransakcje Aby to by o mo liwe nale y zainicjalizowa kontroler LCD

LCD_init()

Wykorzystujemy tu znan ju funkcj inicjalizuj c mdash nie ma potrzeby jej zmienia gdy operacja inicjalizacji LCD jest jednorazowa i nie trzeba wykonywa jej w posta-ci transakcji W drugim kroku musimy zainicjalizowa wykorzystywany timer i systemprzerwa

LCD_Timer_init(ampTCD0)PMIC_CTRL|=PMIC_LOLVLEN_bm Odblokuj przerwania niskiego poziomusei()

Poniewa dost p do LCD z pewno ci nie jest czynno ci krytyczn czasowo prze-rwaniom timera nadano najni szy priorytet Dzi ki temu mo na innym bardziej kry-tycznym przerwaniom nada wy sze priorytety i uzyska w ten sposoacuteb zmniejszenieczasu latencji obs ugi przerwa Sama inicjalizacja timera jest niezwykle prosta

void LCD_Timer_init(TC0_t tc) tc-gtINTCTRLA=TC_OVFINTLVL_LO_gc Odblokuj przerwania nadmiaru timera i nadaj im niski priorytet tc-gtPER=F_CPULCD_ACCESSTIME Przerwanie co 4 us (niezale nie od F_CPU)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 67

Sprowadza si ona tylko do odblokowania mo liwo ci zg aszania przerwania nadmia-ru oraz konfiguracji rejestru PER tak aby przerwania by y generowane co ok 4 s mdashniezale nie od cz stotliwo ci taktowania CPU Mo emy wi c przyst pi do wy wie-tlenia pierwszego napisu

LCD_PutText(00 Numer)

Powy sza funkcja ma jedn wad mdash alokuje dynamicznie pami po ka dym wywo-aniu (pami ta jest automatycznie zwalniana po obs u eniu transakcji) niemniej

ca y proces jest czasoch onny Mo emy tego unikn alokuj c pami bdquor cznierdquo i wielo-krotnie wykorzystuj c zaalokowany blok pami ci Ilustruje to poni szy przyk ad

LCD_trans buf=malloc_re(sizeof(LCD_trans) + 7)

Zmienna buf wskazuje na obszar pami ci ktoacutery mo e pomie ci a cuch 5-znakowyTyle wystarczy na potrzeby tego przyk adu mdash na LCD b d wy wietlane kolejneliczby w zakresie 0 ndash 65 535 najd u sza ma 5 znakoacutew st d te nasz bufor ma tak a nieinn d ugo

while(1) utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(60 bufstr buf false) while(LCD_IsTransCompleted(buf))

Do konwersji liczby na a cuch u yto funkcji bibliotecznej utoa (nag oacutewek stdlibh)Poniewa d ugo a cucha po konwersji jest zmienna (co spowodowa oby pozosta-wianie na LCD bdquoduchoacutewrdquo po poprzednich konwersjach) w kolejnej linii brakuj ceznaki uzupe niono spacjami Nast pnie tworzona jest transakcja w obszarze pami ciprzydzielonym zmiennej buf Ostatnia p tla while jest odpowiedzialna za oczekiwa-nie na zako czenie realizacji transakcji Po jej zako czeniu p tla jest wykonywana odpocz tku

Uwa ny czytelnik z pewno ci zauwa y e pami przydzielana funkcj malloc_renie jest nigdzie zwalniana mdash w normalnej sytuacji spowodowa oby to wyciek pami -ci W naszym przyk adzie jednak program nigdy si nie ko czy nie ma wi c potrzebyzwalniania pami ci wskazywanej przez zmienn buf

Powy szy przyk ad pokazuje jak unikn blokowania CPU na czas dost pu do wolnodzia aj cego urz dzenia jakim jest LCD alfanumeryczny Jednak to nie wszystkiezalety wynikaj ce z zastosowania transakcji Drug wa n zalet naszego rozwi zaniailustruje przyk ad znajduj cy si w katalogu PrzykladyLCD-alfaLCD-transact-intPowa nym ograniczeniem funkcji odpowiedzialnych za dost p do LCD w sposoacutebklasyczny by a niemo no ich wywo ywania z funkcji obs ugi przerwa mdash funkcjeobs ugi LCD nie by y reentrant2 Nasz system oparty na transakcjach nie ma tychwad Aby to zilustrowa zosta stworzony prosty przyk ad mdash tak jak poprzedniow p tli g oacutewnej programu s wy wietlane stale kolejne liczby ale jednocze nie wyko-

2 Poza tym blokowa y CPU na d ugi czas a jak pami tamy funkcje obs ugi przerwa powinny by

wykonywane mo liwie kroacutetko

Kup książkę Poleć książkę

68 AVR Uk ady peryferyjne

rzystano drugi timer (TCD1) w ktoacuterego funkcji obs ugi przerwania przepe nienia jestwy wietlany licznik tych przerwa

ISR(TCD1_OVF_vect) static char int_buf[sizeof(LCD_trans) + 7] static uint16_t cnt char bufstr[6]

utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(61 bufstr (LCD_trans)ampint_buf false)

Jak widzimy w sposoacuteb asynchroniczny z dwoacutech miejsc w programie mo emy uzy-ska dost p do LCD a ka da funkcja bdquoma wra enierdquo e ma LCD na wy czno Przy okazji warto przeanalizowa sposoacuteb w jaki jest rezerwowana pami na trans-akcj w przerwaniu Oczywi cie mo na by wykorzysta dynamiczn alokacj pami cilecz jak wspomniano taka alokacja jest czasoch onna St d te w pokazanym przy-k adzie wykorzystano tablic statyczn int_buf o rozmiarze umo liwiaj cym prze-chowanie kompletnej transakcji Dzi ki temu e zmienna int_buf jest zmienn statycz-n nie jest ona niszczona po zako czeniu funkcji obs ugi przerwania Gdyby pomins owo kluczowe static zmienna ta by aby niszczona a na LCD najprawdopodobniejzacz yby si pojawia przypadkowe tre ci Poniewa pami naszego bufora nie by aalokowana dynamicznie nie mo e ona zosta zwolniona w naszym sterowniku LCDst d te ostatni parametr wywo ania funkcji LCD_PutText_B musi mie warto false

OptymalizacjaPrzy okazji tego i poprzedniego przyk adu warto zastanowi si jeszcze nad jednkwesti mdash optymalizacji W podanych przyk adach wykorzystano wcze niej omoacute-wione funkcje dost pu do wy wietlacza LCD znajduj ce si w plikach hd44780ci hd44780h Wi kszo z zawartych tam funkcji nie jest wykorzystywana jednakkompilator mimo wszystko umieszcza ich kod w pliku wynikowym mdash dzieje si takponiewa nie mo e on bdquostwierdzi rdquo czy funkcje te nie s wykorzystywane w innychfragmentach programu Pami tajmy e kompilator kompiluje poszczegoacutelne pliki roacute-d owe osobno i dana jego instancja nie bdquowierdquo co znajduje si w innych plikach (innychjednostkach kompilacji) Tak ca o ciow wiedz ma dopiero konsolidator (linker)ktoacutery czy stworzone przez kompilator pliki obiektowe (o rozszerzeniu o) w plikwynikowy Linker jednak bdquonie wierdquo ktoacutera z funkcji programu zosta a u yta a ktoacuteranie mdash informacje te ma wy cznie kompilator W ten sposoacuteb powstaje typowe b dneko o w efekcie nasze nieu ywane funkcje nie s usuwane (linker zostawia je bdquonawszelki wypadekrdquo) i zajmuj niepotrzebnie pami Czy mo na temu jako zaradzi Oczywi cie tak W tym celu trzeba po czy si y kompilatora i linkera co zapewniaj od-powiednie opcje kompilacji We w a ciwo ciach projektu (ProjectProperties lub Alt+F7)wybieramy zak adk Toolchain a nast pnie AVRGNU C Compiler i OptimizationZnajdziemy tam pole wyboru o nazwie Prepare functions for garbage collection (ry-sunek 224)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 69

Rysunek 224 Aby da linkerowi mo liwo usuwania nieu ywanych funkcji nale y skompilowaprogram z wybran opcj ndashffunction-sections ktoacutera spowoduje e ka da funkcja programu znajdzie siwe w asnej sekcji

Zaznaczenie tej funkcji spowoduje umieszczenie ka dej funkcji w osobnej sekcji mdashsamo w sobie nie wp ynie to na skroacutecenie kodu wynikowego ale jest warunkiem nie-zb dnym dla podj cia stosownych dzia a przez linker Aby wyeliminowa nieu y-wane funkcje nale y zaznaczy jeszcze w ga zi AVRGNU LinkerOptimization poleGarbage collect unused sections (rysunek 225)

Rysunek 225 Zaznaczenie opcji Garbage collect unused sections (-Wl--gc-sections) spowodujee nieu ywane funkcje zostan usuni te z kodu wynikowego w efekcie kod programu ulegnie skroacuteceniu

Po zaznaczeniu tych opcji program zostanie skroacutecony o kilkaset bajtoacutew Oczywi cieje li wszystkie funkcje by yby wykorzystane nie uzyskaliby my adnego skroacuteceniakodu Niemniej w sytuacji gdy u ywa si bibliotek zazwyczaj przynajmniej czfunkcji nie jest wykorzystywana warto wi c skorzysta z tej mo liwo ci optymalizacji

Kup książkę Poleć książkę

70 AVR Uk ady peryferyjne

Je li mamy do czynienia z prekompilowan bibliotek (lib) to musi ona by skom-pilowana z zaznaczon opcj Prepare functions for garbage collection (-ffunction-sections) Alternatyw jest umieszczenie ka dej funkcji biblioteki w osobnym pliku(tak jak w przypadku bibliotek AVR-libc)

Na ekranie wyboru opcji optymalizacji linkera mamy jeszcze jedn przydatn opcjmdash Relax Branches (-mrelax) Dla mikrokontroleroacutew ktoacutere maj ponad 8 kB pami ciFLASH instrukcje skokoacutew s generowane jako tzw instrukcje d ugie mdash umo liwiajone skok do komoacuterki pami ci FLASH o dowolnym adresie Jednak cen za to jestwyd u enie instrukcji mdash ich kod jest d u szy podobnie jak czas wykonania Nie zawszejednak takie d ugie instrukcje musz by wykonywane mdash je li miejsce docelowe skokule y blisko (w zasi gu instrukcji skokoacutew wzgl dnych) to mo na w kodzie wynikowymzamieni instrukcje d u sze na kroacutetsze co przynosi oszcz dno ci w postaci skroacuteceniakodu wynikowego Poniewa dopiero linker bdquowierdquo jak poszczegoacutelne fragmenty kodus rozmieszczone w pami ci takiej podmiany mo na dokona na etapie linkowaniaprogramu co zapewnia powy sza opcja St d te warto to pole wyboru zaznaczy

Kup książkę Poleć książkę

SkorowidzA

ABI Application Binary Interface 25AC Address Counter 50ADPCM 482adres

bazowy 377bufora 61komoacuterki 84pu apki 202

ALE Address Latch Enable 368alfanumeryczne wy wietlacze 43algorytm ADPCM 492algorytmy stratne 495animacje 57antyaliasing 325architektury procesoroacutew XMEGA 352asembler 23

dyrektywy 40funkcje j zyka C 41obs uga przerwa 39

asynchroniczne wywo anie funkcji 101Atmel Studio 15

Bbajty kalibracyjne 569biblioteka

FATFS 131 139 176 180 517libcallback-liba 99PetitFS 144 149

bitADC_CH0START_bm 236IMPMODE 244

bitrate 442 512blokowanie przerwa 219b d 16 19

kwantyzacji 463offsetu 230wzmocnienia ADC 230

BOD 223bps bits per second 12

budowakarty 152linii obrazu 394pami ci SDRAM 374pliku stymulacji 192ramki PAL 412sygna u PAL 411wtyczki 544 545

bufor 78FIFO 497na transakcje 61transakcji 62

buforowanie wyj cia 294

CCAS Column Address Strobe 375CCFL 44charakterystyka

przetwornikoacutew 222termistora 264tryboacutew pracy 232

CID Card Identification 169CKE Clock Enable 375CLKIN 421COG Chip on Glass 310CRC 158 178CRC16 178CRC7 164CS Chip Select 361 375CSD Card Specific Data 172czas

dost pu do SDRAM 424adowania kondensatora 244

propagacji 281proacutebkowania 260symulacji 209

czcionki 322cz stotliwo

odchylania pionowego 428proacutebkowania 244 441 444 530przebiegu 504

Kup książkę Poleć książkę

576 AVR Uk ady peryferyjne

cz stotliwoPWM 465taktowania koprocesora 549taktowania procesora 209taktowania rdzenia 18

czyszczenie pami ci 318

DDAC Digital to Analog Converter 293 447 451

buforowanie wyj cia 294generowanie przebiegoacutew 301jitter 303kalibracja 306napi cie referencyjne 295system zdarze 297taktowanie 296tryb dwukana owy 301wykorzystanie DMA 298wyzwalanie konwersji 305

datalogger 261 265 275DD Device Density 86debuger 183

programowy 190sprz towy 185 187

decymacja 259DEBUG 219XMEGA 260

definicja symboli globalnych 36definiowanie w asnych znakoacutew 56deklaracja zapowiadaj ca 103 337dekoder DTMF 548 556DMA 254 298 402 458 518 523dost p do

danych 358 359 568danych binarnych 356 360danych wielobajtowych 31DataFLASH 137EEPROM 128FAT 136komoacuterki 375LCD 59 62 66 68operandu 30pami ci 81 384 386 387 561pami ci SDRAM 424pliku blokowy 141portoacutew IO 30rejestroacutew IO procesora 36rejestroacutew uk adu 499SPI 95sygnatury u ytkownika 565 567wska nikoacutew 32

DQM Data Mask 375DSP Digital Signal Processor 535

DTMF 535 553dyktafon 529dynamiczna alokacja pami ci 516dyrektywa global 38dyrektywy asemblera 40dzia anie

DMA 255komparatora 280timeroacutew 400

d wi k 443

EEBI External Bus Interface 361EEPROM 207eliminacja jitteru 24emulacja RS232 139

FFAT File Allocation Table 128 131FAT32 128FATFS 180filtr

dolnoprzepustowy 491drugiego rz du 470pierwszego rz du 469trzeciego rz du 471

filtrowanie sygna u PWM 468firmware 565FLASH 207format

odpowiedzi 159polecenia 158protoko u 157

funkcja_delay_ms 17 219c_zero 42callback 106 341callback() 99DataFLASH_CSEnable 100DF_FinishBufWrite() 269disk_initialize 136disk_ioctl 181disk_status 136disk_write 138DMA_SPI_init 104DTMF_GetCode 553free_re 65GPIOR0_init 507hd44780_outcmd 51hd44780_outnibble_nowait 65LCD_defchar_P 57

Kup książkę Poleć książkę

Skorowidz 577

Menu_Click_Func 515Menu_Free 516Menu_Recorder 532Menu_Run 527MS_CreateRegEntry 117MS_GetDirPos 125MS_GetRegItem 115MS_WritePages 116 118OSC_wait_for_rdy 473RecMenu_StartStop 532sprintf 142strtok 124sysclk_init() 200 209TMF_memcpy_PF 454udi_cdc_getc() 123udi_cdc_is_rx_ready() 123VS1003_Reset 506

funkcjeanalizuj ce 556biblioteczne 50biblioteki FATFS 143j zyka C 41kontrolera ST7565R 313opoacute niaj ce 17opoacute nie 219reentrant 524specjalne kontrolera 319steruj ce 314zapisu 133

fusebit 557BODACT 560BODLEVEL 560BOOTRST 559DVSDON 560EESAVE 561JTAGEN 558RSTDISBL 559SUT 559TOSCSEL 559

fusebity w AVR-libc 571

Ggenerator obrazu composite 426generowanie

d wi ku 461kolorowego obrazu 437obrazu wideo 391przebiegoacutew 301przerwa 285sygna u composite 409

g bia koloru 326gniazdo

karty SD 156VGA 396

Hhistereza 281

IIDE 11IMA ADPCM 483informacje

o kolorze 431o obrazie 434

inicjalizacjakarty 161karty SDHC 167karty SDSC 167karty SDXC 167licznika 419pami ci 119USART 505

instrukcjaicall 42movw 35nop 13 24

interfejsSCI 498SDI 498SPI 71 79RS232 120UART 123USART 71 73

interpolacja 259interpolacja w XMEGA 260inwersja obrazu 319

Jjednostki 12jitter 24 303 420

Kkalibracja

ADC 229DAC 306 564offsetu 237

kana DMA 82 522karta 154 158

mikroSD 152SD 151 152SDHC 151 152 160SDSC 160SDXC 151 160

Kup książkę Poleć książkę

578 AVR Uk ady peryferyjne

karty pami ci 151 152 157biblioteka FATFS 180budowa 152format polecenia 158inicjalizacja 161 167komunikacja 156odczyt danych 173opcje konfiguracyjne 181rejestry specjalne 169tryby pracy 153zapis danych 176zasilanie 154

kodasemblerowy 23 24C 23dost pu 24

kodowanieμ-law 481ADPCM 483Dialogic ADPCM 494informacji 166 426koloru 425znakoacutew 536

kodyformatoacutew audio 501zdarze 545

kolejno bajtoacutew 533kolor 424 430kolorowy obraz 437komparator 422

analogowy 279 280analogowy XMEGA 282okienkowy 284

kompilacja plikoacutew binarnych 350kompilator avr-gcc 11 359kompresja

ADPCM 482 486d wi ku 480IMA ADPCM 482

komunikacja z koprocesorem 504konfiguracja

4-portowa 364biblioteki 133debugera 185DMA 459 522fusebitoacutew 570kontrolera DMA 257 452komparatoroacutew 285lockbitoacutew 570LPC 371pami ci SDRAM 381PetitFS 149pinu IO 225portoacutew IO 362

preskalera 452projektu 186przerwa 219pu apki 203rejestru EVCTRL 248rejestru PER 67SPI 75sygna u CS 377typu czcionki 324urz dze IO 189USART 76zegara 383

konsolidacja 547kontroler

DMA 254 298 402 458 518 523KS108 310ST7565R 310ndash315 321

konwersjaDAC 305sygna oacutew 396wyzwalana 306

konwertercyfrowo-analogowy 426DAC 427

koprocesormp3 496VS1003B 10

korekcja fazy 466kwantyzacja 463

Llampa CCFL 44LE Latch Enable 433licznik 419

cykli 209TCC1 400timera 20

linie IO 50linie sygna owe

MISO 72 164MOSI 72SCK 72SS 72

linker 69lista

mnemonikoacutew 24modyfikowanych rejestroacutew 32

lockbity 557 561lockbity w AVR-libc 570LPC Low Pin Count 371LPCM 443 556LSB Least Significant Bit 228

Kup książkę Poleć książkę

Skorowidz 579

a cuchy formatuj ce 212czenie plikoacutew 352

Mmagistrala pami ci zewn trznej 361magnetofon cyfrowy 528makro _SFR_IO_ADDR() 39makrodefinicja

ASSERT 214HD44780_CGADDR() 53HD44780_CLR 53HD44780_DDADDR() 53HD44780_DISPCTL() 52HD44780_ENTMODE() 52HD44780_FNSET() 52HD44780_HOME 53HD44780_SHIFT() 51LOCKBITS 571

mapowanie sygna oacutew 366mapy bitowe 343marker czasowy 268maski bitowe 329matryce 49menu 335menu piktogramowe 342mierniki temperatury 262mikrokontroler

ARM 9AVR 9PIC 9XMEGA128A3U 10

MISO 72moc wydzielana 265model psychoakustyczny 495modu

alfanumeryczny 45NVM 568Xmega eXploreGO 10Xplained ATXMEGA A3BU 10Xplained ATXMEGA-A1 10Xplained XMEGA128A1 447Xplained XMEGA256A3 94Xplained XMEGA256A3BU 97 143 266

modyfikator 30const 85volatile 28 273

monitory CRT 395monochromatyczne wy wietlacze graficzne 309monochromatyczny

tryb graficzny 416tryb tekstowy 413

MOSI 72mp3 495Msps Megasamples per second 12multiplekser wej ciowy 226 283multipleksowanie adresoacutew 368 369muzyka 439

Nnadawanie kodoacutew DTMF 540nadproacutebkowanie 258nag oacutewek kontenera wav 500nagrywanie mowy 486najmniej znacz cy bit 228napi cie

offsetu 280referencyjne 223 295zasilania 239

Oobracanie obrazu 319obraz 319

composite 426kolorowy 430wideo 391

obroacutebka d wi ku 443 445obs uga

FAT 131 143klawiatury matrycowej 24LCD 58 63 67menu 337przerwania 37 38 458przerwania DMA 525przerwa w asemblerze 39przyciskoacutew 272wy wietlaczy alfanumerycznych 45

odczytblokowy 140danych 173 358

odpowied response 159R1 159R2 159R7 160

od wie anie pami ci 376odtwarzanie

d wi ku 472muzyki 447 513 518 521

offset 238offset ADC 230okno

Breakpoints 202Call stack 209dezasemblera 210

Kup książkę Poleć książkę

580 AVR Uk ady peryferyjne

oknoIO View 207podgl du zmiennych 211wyboru czcionek 324

OLED 46opcje

kompilatora 35zapisu d wi ku 445

operacjena buforach 91odczytu 173zapisu 176zapisu strony 92

operand 29operator

ascii 41

asciz 41

byte 41

section 41opoacute nienia 13 18opoacute nienie zmienne 16optymalizacja 16 68optymalizator 26organizacja pami ci 77organizacja pami ci VRAM 316oscylator 287OSD On-Screen Display 417ostrze enie 16oszcz dzanie energii 94

Ppakiet WinAVR 48pami

CGRAM 56 57 64DataFLASH 10 77 81 113 269DDRAM 49EEPROM 111FLASH 54 124 207RAM 49SDRAM 372SRAM 63 124 329 366 371VRAM 314 317

PCLK 421PCM 443PetitFS 144 149p tla

for 13while 201

pierwsza linia obrazu 321piksel 430piktogram 342pin IO 225

plikAlloc_safeh 65DataFLASHc 83DataFLASHIOc 136definesh 50delayh 14diskioh 132 136ffh 132ffconfh 132 181hd44780h 49integerh 132ioh 30LCD_transc 61LCD-transactc 66Makefile 14Menuc 19nothingo 541outfiletxt 547 551pffh 149SPIh 104stringh 113stymulacji 191 192

pliki mp3 495elf 351fon 323o 24S 24 34binarne 350 355csv 276d wi kowe 440obiektowe 352wav 500WMA 512z czcionkami 327z danymi 349

podbijacz napi cia 315podgl d

pami ci 207stosu wywo a 209zmiennych 211znakoacutew 325

pod czeniefototranzystora 262karty SD 155LCD z kontrolerem 311modu u 50pami ci 362 369 370 373termistora 262uk adu LM35 251wyj XMEGA 398

pod wietlenieCCFL 46OLED 46

Kup książkę Poleć książkę

Skorowidz 581

podwoacutejne buforowanie 255 332 457polecenia

kasowania strony 81konfiguracyjne pami ci 82kontrolera ST7565R 315odczytu bufora 82 89odczytu pami ci 81 88SDRAM 376transferu 91

polecenieACMD41 168cd 181CID 178CMD0 165CMD8 167CSD 178date 276dir 127 181dump 276erase 276get 276HD44780_CLR 51Init 178mkdir 181

po czenieDMA ze SPI 96dwoacutech komparatoroacutew 285koprocesora mp3 497LCD z mikrokontrolerem 48wyj cia XMEGA 411XMEGA z PC 121z telewizorem 431

pomiarnapi cia zasilania 239temperatury MCU 241

port IO 30 362pozycjonowanie grafik 345poacute obraz 410precyzja pomiaroacutew 260preskaler 478preskaler ADC 243program

Atmel Data Visualizer 275Audacity 443avr-objcopy 350dataloggera 265LCD Image Converter 323makeloadingtableexe 543Realterm 127 554riffstrip 483SoX 445Tracepoint 208

programowanie sygnatury u ytkownika 566protokoacute master-slave 157

prototypy 136proacutebki d wi kowe 447proacutebkowanie

8-bitowe 300nieliniowe 480

prymitywy graficzne 330przebieg PWM 468przebiegi 289 303przechwytywanie danych 276przemiatanie wej 253przerwanie 218 254 286 403

DMA 522komparatora 286

przestrze adresowa procesora 378przesy anie

danych 498polece 498

przetaktowanie procesora 436przetwornik

ADC 221analogowo-cyfrowy 221cykliczny 222potokowy 222

przyciski 272pseudooperatory 41pu apki breakpoints 197pu apki warunkowe 205punkty ledzenia 203PWM 461 462 472

RRAS Row Address Strobe 375redukcja poboru energii 242regulacja kontrastu 321rejestr 32 34rejestr AC 50

adresu wtyczki 513BASEADDR 377CID 169CMP 251CSD 172czasu utworu 512DATA 83EVCTRL 248formatu audio 512identyfikacyjny pami ci 87INTFLAGS 252kontroli basoacutew 510kontroli g o no ci 513MUXCTRL 227OCR 168PER 67poroacutewnania 249

Kup książkę Poleć książkę

582 AVR Uk ady peryferyjne

rejestr ACSCI_CLOCKF 511stanu komparatora 287stanu pami ci 86stanu uk adu 510trybu pracy 508WINCTRL 285

rejestrydost pu do pami ci RAM 513GPIOR 502IO procesora 36mikrokontrolera 25procesora 35specjalne 94specjalne karty 169uk adu VS1003B 508

relacja rodzic ndash dziecko 336reset uk adu 534rozdzielczo

LCD 329przetwornika 231PWM 463 477

rozszerzenie HiRes 477 479roacutewnanie Steinharta-Harta 263rysowanie map bitowych 343

Sschemat uk adu dataloggera 267SCI Serial Command Interface 498SCK 72SD Secure Digital 152SDI Serial Data Interface 498separator synchronizacji 422separowanie impulsoacutew synchronizacji 422shieldy 10skaler 422skaler napi cia 283skrypt makefile 353s owo kluczowe

asm 27extern 37static 68

specyfikatory lokalizacji zmiennej 213sps samples per second 12SS Slave Select 72standard PAL 410standard VGA 393sterowanie

dataloggerem 275sygna em 379

sterownik 121HD44780 49 56LCD 49 62

stos wywo a 209

strukturaFATFS 139Handle 118LCD_trans 60 63menu 338rejestru 86SimpleFSEntry 113 116SimpleFSHandle 113 118 140submenu 527systemu plikoacutew 112

sumabitowa 571kontrolna 178

sygnacomposite 409composite video output 430CS 377DREQ 497H-Sync 396synchronizacji 423V-Sync 396zegarowy CLK 374

sygna yinterfejsu EBI 363magistrali EBI 364steruj ce 375

sygnaturaprodukcyjna procesora 563u ytkownika 565

symbol__DELAY_ROUND_CLOSEST__ 17__DELAY_ROUND_DOWN__ 17_FS_FAT12 149_FS_FAT32 149_FS_MINIMIZE 133_FS_READONLY 133_FS_RPATH 135_FS_TINY 133_MAX_SS 135_MULTI_PARTITION 135_USE_DIR 149_USE_FASTSEEK 134_USE_FORWARD 134_USE_LABEL 134_USE_LFN 134_USE_LSEEK 149_USE_MKFS 134_USE_READ 149_USE_STRFUNC 134_USE_WRITE 149_VOLUMES 136F_CPU 14 15 18increment 36USE_BUSY_FLAG 50

Kup książkę Poleć książkę

Skorowidz 583

symboleglobalne 36w asemblerze 28zewn trzne 39

symulacja 198 209symulator 190synchronizacja

pami ci 331pionowa 395pozioma 394

systemplikoacutew 111 128przerwa 404zdarze 245

szablonfont_XMEGAtmpl 326image_XMEGAtmpl 343

szum 463szybko przesy ania danych 126

ledzenie wi zki 333rodowisko

graficzne 11programistyczne 11VSIDE 542WinAVR 47

Ttabela FAT 130tablica

framebuf 402 408plugintbl 552 555tekst 208z kodem wynikowym 543

taktowanieDAC 296mikrokontrolera 473

technologia OLED 44temperatura mikrokontrolera 239 241termistor 262 290

NTC 263PTC 263

termometrLM35 249 250z alarmem 251

termostat 290test uk adu VS1003B 503testowanie obrazu 319timer 16 62

TCC0 20

TCC1 399transakcja 59 62 65transakcje 17 103ndash107transakcyjna obs uga LCD 58transakcyjny dost p do SPI 95transfer 91

danych 97wynikoacutew 254

transmisja 72 83tryb

bez znaku 234ci g ej konwersji 252czterobitowy 153dwukana owy 301graficzny 416graficzny VGA 407idle 419jednobitowy 153LPC 371monochromatyczny 397 407oszcz dzania energii 94 306pracy multipleksera 226pracy SPI 157roacute nicowy 232single slope 312SPI 153tekstowy 413tekstowy VGA 397z pojedynczym wej ciem 234ze znakiem 235

trybygenerowania PWM 467pracy karty 153pracy przetwornika 231pracy SPI 74pracy uk adu 508

twierdzenie Nyquista 258tworzenie

adresu 84nak adek 417obrazu 335tablicy 543

typ__uint24 119karty 160niekompletny 60wyliczeniowy 114

typyoperandoacutew 29w AVR 34

Kup książkę Poleć książkę

584 AVR Uk ady peryferyjne

Uuchwyt handle 64 113uk ad

AD725 427 431buforowy 294CS 361DAC 284dataloggera 267detekcji awarii zasilania 559generuj cy obraz 393HiRes 477ICL7660 47LM35 250 251SampH 293sterowania sygna em 379USART 401VS1003B 496 503 508 530 538 556VS100XX 529wzmacniania sygna u 227

uk ady peryferyjne 9uruchomienie komparatora 287urz dzenie

master 72slave 72

u rednianie 259utrata danych 141u ycie wstawki asemblerowej 33

VVGA 393

Wwarto ci kalibracyjne

ADC 564oscylatoroacutew 564temperatury 564

warunkowa kompilacja 36WE Write Enable 375wej cie composite video input 425wektor przerwa 38 257wideo 391wielko pami ci 86 377w czenie DAC 299wska nik na struktur 27wska niki 32wstawki asemblerowe 24 33wtyczka 535 541 544

SineDTMF Generator 537VGA 396

wyboacuter cz stotliwo ci PWM 465 474wykorzystanie

DMA 254 518

EuroSCART 428PWM 461rejestroacutew 34

wyliczanie predyktora 489wy wietlacze

alfanumeryczne 43 45graficzne 43 309LCD 43OLED 46

wy wietlanielitera u 213map bitowych 344obrazu 333 346 406obrazu VGA 393

wywo ania zwrotne callbacks 98asynchroniczne 101synchroniczne 101

wyzwalanie konwersji 245wzmacniacz 446wzmacniacz operacyjny 279wzmacnianie sygna u 227

XXMEGA 9 18

Zzapis

bufora 269danych 176d wi ku 440 556

zasilaniekarty 154pami ci 109

zatrzask 368zatrzask 74HC573 433zatrza ni cie adresu 369zdarzenia 297zdarzenie compare match 399zegar 383 420 426zintegrowane rodowisko programistyczne 11z cze EuroSCART 425 428 429zmiana

g o no ci 527wielko ci strony 94

znaki 56

roacuted onapi cia odniesienia 284sygna u 240

Kup książkę Poleć książkę

Page 13: Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8 AVR. Ukäady peryferyjne Rejestry dost pu do pami ci RAM .....513 Rejestr adresu

48 AVR Uk ady peryferyjne

Mo emy te skorzysta z licznych przyk adoacutew dost pnych w internecie W dalszejcz ci rozdzia u zostan wykorzystane funkcje z pakietu WinAVR napisane przezJoerga Wunscha Pokazane przyk ady zak adaj e wy wietlacz jest po czonyz mikrokontrolerem tak jak na rysunku 222

Rysunek 222 Po czenie LCD z mikrokontrolerem Na goacuterze pod czenie do mikrokontroleraXMEGA na dole pod czenie do modu u Xplained Na schematach pokazano tak e opcjonalne sposobypod czenia pinu Vee odpowiedzialnego za regulacj kontrastu LCD

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 49

Zanim co wy wietlimy na LCD musimy pozna w jaki sposoacuteb s generowane znakiSterownik LCD zawiera w sobie niezale nie od typu u ytej matrycy 80 bajtoacutew pami ciDDRAM (ang Display Data RAM) Je li zastosowana matryca wy wietla mniejszliczb znakoacutew to cz komoacuterek pami ci jest nieu ywana Mo emy je wykorzystado innych celoacutew mdash np jako zwyk pami RAM Mo emy te u y jej do przesu-wania napisoacutew ktoacutere nie mieszcz si na wy wietlaczu Aby mo na by o umie ciznak na w a ciwej pozycji niezb dne jest poznanie organizacji pami ci kontrolera W za-le no ci od u ytej matrycy pami ta jest zorganizowana nast puj co

Dla matryc 16times1 mdash pami jest podzielona na dwa obszary ka dy zawieraj cypo 8 znakoacutew Obszar pierwszy (od lewej) ma adresy 0x00 do 0x07 a obszar drugi(prawy) adresy 0x40 do 0x47 St d te gdy wy wietla si tekst przekraczaj cygranic obszaroacutew nale y zadba aby poszczegoacutelne litery trafi y pod w a ciweadresy

Dla matryc 20times1 mdash adresy 0x00 do 0x13

Dla matryc 16times2 mdash adres pierwszej linii zaczyna si od 0x00 do 0x0f adresdrugiej linii od 0x40 do 0x4f

Dla matryc 20times2 mdash adresy pierwszej linii to 0x00 do 0x13 a drugiej 0x40 do 0x53

Dla matryc 40times2 mdash adresy pierwszej linii to 0x00 do 0x27 drugiej linii 0x40do 0x67

Dla matryc 20times4 mdash adresy pierwszej linii to 0x00 do 0x13 drugiej 0x40 do 0x53trzeciej 0x14 do 0x27 a czwartej 0x54 do 0x67

Jak wida w niektoacuterych typach wy wietlaczy po ka dej linii zostaje od kilku do kil-kunastu bajtoacutew ktoacuterych zawarto nie jest wy wietlana Ma to pewn zalet mdash mo-emy do pami ci modu u wpisywa teksty d u sze ni s wy wietlane na ekranie co

u atwia przewijanie tekstu Niestety ma to te pewn wad mdash funkcje wy wietlaj ceco na ekranie musz bdquowiedzie rdquo jak organizacj ma matryca W przeciwnym przy-padku nie ma mo liwo ci prawid owego wyliczenia adresu komoacuterki do ktoacuterej ma od-by si zapis

W dalszej cz ci rozdzia u zostanie wykorzystany modu LCD o organizacji 16times2(ale mo na te bez problemu wykorzysta dowolny inny)

Zanim b dzie mo na co wy wietli na ekranie modu musi zosta zainicjalizowanyW trakcie inicjalizacji ustawiane s podstawowe parametry pracy sterownika LCD mdashorganizacja matrycy (liczba linii) wielko czcionki (5times8 lub 8times11 pikseli) Wielkoczcionki zale y od typu pod czonej matrycy LCD Dla konkretnego modu u LCDtylko jedna z tych warto ci b dzie poprawna Oproacutecz inicjalizacji modu u nale y tak-e poprawnie ustawi stan pinoacutew IO wykorzystywanych do pod czenia modu u LCD

Wi kszo pracy zwi zanej z inicjalizacj modu u LCD odbieraniem i wysy aniemdo niego danych wykonuje biblioteka Joerga Wunscha Dostarcza ona niskopozio-mowe funkcje umo liwiaj ce komunikacj ze sterownikiem hd44780 i innymi kom-patybilnymi z nim sterownikami Wystarczy e do aplikacji w ktoacuterej planujemy wy-korzysta taki modu do czymy plik hd44780c oraz plik nag oacutewkowy hd44780h

Kup książkę Poleć książkę

50 AVR Uk ady peryferyjne

Oba pliki bdquozak adaj rdquo e istnieje plik nag oacutewkowy definesh zawieraj cy podstawo-we definicje zwi zane ze sposobem pod czenia modu u LCD z mikrokontroleremNa pocz tku nale y okre li ktoacutere linie IO zosta y wykorzystane do pod czenia modu u

define HD44780_RS A 4define HD44780_RW A 5define HD44780_E A 6define HD44780_D4 A 0

W powy szym przyk adzie do kolejnych linii portu A (A4 ndash A6) zosta y pod czonesygna y RS RW i E modu u natomiast do linii A0 ndash A3 linie D4 ndash D7 modu u LCD Wa nejest aby linie danych czy z pinami IO w kolejno ci rosn cej Biblioteka wykorzy-stuje do transmisji danych pomi dzy modu em a mikrokontrolerem tylko 4 linie danychmdash dzi ki temu mo emy zmniejszy liczb po cze a zwolnione linie IO wykorzystado innych celoacutew W pliku wyst puje jeszcze jedna definicja

define USE_BUSY_BIT 1

Okre la ona e biblioteka b dzie u ywa flagi Busy modu u LCD mdash umo liwia touzyskanie optymalnej szybko ci wspoacute dzia ania z modu em Zako czenie realizacjibie cej operacji modu sygnalizuje zmian stanu tej flagi co umo liwia niezw ocznewys anie kolejnej komendy Je li nie u ywamy flagi Busy program musi generowamaksymalne zalecane w nocie katalogowej opoacute nienia w efekcie ca a transmisja zwal-nia Po zdefiniowaniu u ywanych pinoacutew w pliku definesh mo emy rozpocz korzy-stanie z biblioteki

W pliku hd44780h s udost pnione prototypy funkcji odpowiedzialnych za wspoacute -prac z modu em LCD

Funkcje bibliotecznePodstaw modu u stanowi dwie funkcje umo liwiaj ce odpowiednio wys anie da-nych do modu u oraz ich odczytanie

void hd44780_outbyte(uint8_t b uint8_t rs)uint8_t hd44780_inbyte(uint8_t rs)

Obie funkcje wysy aj odczytuj 8-bitow dan w przypadku wykorzystania tylko4-bitowej szyny danych wysy anie i odczytywanie danych odbywa si w dwoacutech etapachDodatkowo zmienna rs okre la tryb dost pu W przypadku wysy ania danych do modu urs = 0 powoduje e dane zostan wys ane do rejestru komend a je li rs = 1 dane trafido rejestru danych Przy odczycie jest podobnie z tym e dla rs = 0 jest odczytywanaflaga Busy i rejestr AC (ang Address Counter)

Kolejna funkcja odpowiada za oczekiwanie na gotowo modu uvoid hd44780_wait_ready(bool islong)

W przypadku gdy w pliku definesh symbol USE_BUSY_FLAG ma warto 1 parametrislong jest ignorowany a optymalizator kompilatora usuwa go gdy nie jest on wy-korzystywany przez funkcj Kiedy warto USE_BUSY_FLAG jest roacute na od 1 parametr

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 51

ten okre la d ugo opoacute nienia Je li jest roacute na od 0 opoacute nienie wynosi 152 ms a je-eli jest roacutewna 0 opoacute nienie wynosi 37 s Poniewa lepiej jest u ywa flagi Busy

mo emy ten parametr ignorowa

Powy sze trzy funkcje wystarcz do komunikacji z modu em dla wygody zdefiniowanojednak kolejne Funkcje hd44780_outcmd(n) i hd44780_incmd() umo liwiaj odpowiedniowys anie polecenia do rejestru komend kontrolera lub odczytanie bitu Busy i licznikaAC Dwie kolejne mdash hd44780_outdata(n) oraz hd44780_indata() mdash umo liwiaj zapisi odczytanie rejestru danych

Oproacutecz funkcji odpowiedzialnych za komunikacj z modu em LCD zdefiniowano tak efunkcj przeprowadzaj c podstawow inicjalizacj modu u hd44780_init(void) orazfunkcj hd44780_powerdown(void) ustawiaj c wszystkie linie u yte do komunikacjiw stan 0 co umo liwia bezpieczne od czenie zasilania od modu u LCD W przypadkupozostawienia ktoacuterej z wy ej wymienionych linii w stanie 1 przy od czonym za-silaniu modu u stanowi ona jego zasilanie W efekcie mimo wy czenia modu mo epobiera znaczny pr d

Szerszego omoacutewienia wymaga funkcja hd44780_outcmd(cmd) ktoacutera umo liwia wys a-nie polecenia do rejestru polece sterownika LCD Dla wygody zdefiniowane zosta yroacute ne komendy u atwiaj ce wspoacute prac z modu em LCD Komendy te s przekazy-wane jako argument wywo ania funkcji hd44780_outcmd np

hd44780_outcmd(HD44780_CLR)

powoduje wys anie do sterownika polecenia HD44780_CLR czyszcz cego zawartopami ci DDRAM kontrolera

KomendyFunkcja hd44780_outcmd przyjmuje jako argument predefiniowane makrodefinicjeznacznie u atwiaj ce wspoacute prac z kontrolerem modu u LCD Poni ej zostan onepokroacutetce omoacutewione

HD44780_SHIFT(shift right)Ta makrodefinicja powoduje przesuni cie pozycji wy wietlanego tekstu (shift = 1)o jedn pozycj w lewo (argument right = 0) lub w prawo (argument right = 1)W przypadku gdy shift = 0 przesuwany w lewo lub prawo jest tylko kursor Wysy-aj c wielokrotnie to polecenie uzyskujemy kolejne przesuni cia o jedn pozycj

w lewo lub prawo Polecenie to s u y g oacutewnie do przesuwania tekstu Jednak ze wzgl duna du bezw adno tekstowych modu oacutew LCD nie nale y przesuwa liter cz ciej niok raz na sekund mdash cz stsze przesuwanie daje bardzo nieprzyjemne efekty wizual-ne Ka dy bufor linii jest bdquozawijanyrdquo to znaczy e po ostatnim znaku z prawej jestwy wietlany pierwszy znak z lewej i odwrotnie Nale y pami ta e d ugo buforajest sta a dla danego modelu matrycy Np dla modu oacutew 16times2 bufor jednej linii wyno-si dok adnie 40 bajtoacutew z czego 16 jest jednorazowo wy wietlanych Poni szy kodcyklicznie przewija wy wietlany tekst w lewo

lcd_puttext_P(PSTR(Test bufora i przewijania tekstunTen tekst przewija sie w lewo))while(1)

Kup książkę Poleć książkę

52 AVR Uk ady peryferyjne

hd44780_outcmd(HD44780_SHIFT(10)) _delay_ms(700)

HD44780_FNSET(if8bit twoline font5x10)Polecenie to wybiera typ interfejsu mdash 8-bitowy je li warto parametru if8bit jestroacutewna 1 lub 4-bitowy je li jest roacutewna 0 Typ interfejsu musi odpowiada sposobowipo czenia modu u z mikrokontrolerem Parametr twoline okre la czy pod czonamatryca LCD ma jedn lini znakoacutew czy dwie Matryce ktoacutere maj 4 linie tekstu straktowane przez kontroler jako matryce dwuliniowe mdash parametr twoline powinienmie warto 1 Je li dla matrycy zawieraj cej dwie lub wi cej linii ustawimy go na 0to wy wietlana b dzie tylko jedna linia (w przypadku matryc dwuliniowych goacuterna)a w przypadku matryc 4-liniowych b d wy wietlane dwie linie rozdzielone lini pust

Ostatni parametr okre la typ u ywanego generatora znakoacutew Powinien on odpowiadau ytej w module matrycy zwykle wi c jego warto wynosi 0

HD44780_DISPCTL(disp cursor blink)Ustawia roacute ne parametry pracy matrycy Je li parametr disp ma warto 1 to matrycajest w czona (wy wietla zawarto DDRAM) a je li 0 to matryca jest wy czonalecz stan pami ci DDRAM nie ulega zmianie Np kod

while(1) hd44780_outcmd(HD44780_DISPCTL(011)) _delay_ms(700) hd44780_outcmd(HD44780_DISPCTL(111)) _delay_ms(700)

powoduje naprzemienne w czanie i wy czanie matrycy w efekcie wy wietlany tekstmruga

Parametr cursor okre la czy sprz towo wy wietlany kursor ma by widoczny (war-to parametru 1) czy niewidoczny (warto parametru 0) Je li kursor jest widocznyto dodatkowo mo emy okre li czy ma miga (warto parametru blink roacutewna 1)czy nie (blink = 0) Je li kursor jest widoczny i nie miga jest wy wietlany w postacipoziomej kreski Wy wietlanie kursora mo e by u yteczne w sytuacji kiedy u yt-kownik wprowadza jakie dane W pozosta ych sytuacjach kursor mo emy wy czy

HD44780_ENTMODE(inc shift)Okre la sposoacuteb wprowadzania danych do pami ci Je li parametr inc ma warto 1 topo ka dej operacji zapisuodczytu adres pami ci jest automatycznie zwi kszany o je-den co przy piesza operacj zapisuodczytu kolejnych znakoacutew Je li warto inc jestroacutewna 0 to adres jest automatycznie zmniejszany o 1 Dodatkowo parametr shiftokre la czy wy wietlany obraz ma by automatycznie przesuwany tak aby wy wie-tla ostatnio wprowadzony znak (shift = 1) lub go nie wy wietla (shift = 0)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 53

HD44780_CLRPowoduje wyczyszczenie (wype nienie znakami o kodzie 32) ca ej zawarto ci pami ciDDRAM Jednocze nie kursor wraca do pozycji pierwszej (pierwsza linia pierwszyznak)

Niewy wietlane bajty pami ci DDRAM tak e s kasowane Je li s one u ywanedo przechowywania zmiennych programu to przed operacj kasowania nale y jeskopiowa w bezpieczne miejsce W przeciwnym przypadku zostan utracone

Wska nik adresu do pami ci DDRAM jest ustawiany na 0 zerowane jest tak e prze-suni cie

HD44780_HOMEPowoduje powroacutet kursora do pozycji pocz tkowej mdash pierwsza linia pierwszy znakWska nik adresu do pami ci DDRAM w efekcie zawiera 0 zerowane jest roacutewnieprzesuni cie wy wietlania znakoacutew w efekcie s one wy wietlane od pozycji 0

HD44780_DDADDR(addr)Ustawia nast pny adres zapisuodczytu w pami ci DDRAM na addr Tylko 7 bitoacutewargumentu addr jest branych pod uwag w zwi zku z czym mo na zaadresowa mak-symalnie 128 bajtoacutew pami ci (z czego sterownik ma tylko 80 pozosta e lokacje snieu ywane)

HD44780_CGADDR(addr)Ustawia nast pn operacj odczytuzapisu w pami ci CGRAM na addr Pod uwagbranych jest tylko 6 bitoacutew zmiennej addr w efekcie mo na zaadresowa maksymalnie64 bajty pami ci CGRAM

Przedstawione powy ej funkcje zapewniaj jedynie podstawow komunikacj z mo-du em LCD Potrzebujemy jednak ci gle funkcji odpowiedzialnej za jego inicjalizacjmdash funkcja biblioteczna przeprowadza ten proces tylko w podstawowym zakresie musi-my jeszcze zadba o w a ciwe ustawienie parametroacutew zwi zane z posiadan matryc Napiszmy wi c w asne rozwini cie funkcji inicjalizacyjnej

void lcd_init() hd44780_init() Podstawowa inicjalizacja modu u hd44780_outcmd(HD44780_CLR) Wyczy pami DDRAM hd44780_wait_ready(1000) hd44780_outcmd(HD44780_ENTMODE(1 0)) Tryb autoinkrementacji AC hd44780_wait_ready(1000) hd44780_outcmd(HD44780_DISPCTL(1 0 0)) W cz wy wietlacz wy cz kursor hd44780_wait_ready(1000)

Zauwa e po wys aniu ka dego polecenia do modu u jest wywo ywana funkcjahd44780_wait_ready(1000) odpowiedzialna za oczekiwanie a realizacja wys anego po-lecenia dobiegnie ko ca Jest to niezb dne gdy do czasu uko czenia bie cej

Kup książkę Poleć książkę

54 AVR Uk ady peryferyjne

operacji dalsze polecenia s ignorowane Jako argument podany jest parametr 1000mdash jest on bez znaczenia nasza biblioteka korzysta z flagi Busy i po prostu go ignorujePo wykonaniu powy szej funkcji modu LCD jest poprawnie zainicjalizowany a jegopami jest wyczyszczona (zawiera bajty 0x20) i w efekcie modu nic nie wy wietlaOd tej chwili mo emy wysy a znaki do wy wietlenia

Po wykonaniu inicjalizacji ekran mo e pozosta czysty lub wy wietla ca kowiciewype nione kwadraty (wszystkie piksele w czone) Je li po inicjalizacji wszystkiepiksele s w czone nale y nieco zmniejszy kontrast

Aby sobie u atwi to zadanie zdefiniujmy funkcj wysy aj c do modu u jeden znakvoid lcd_putchar(char c) static bool second_nl_seen static uint8_t line=0

if ((second_nl_seen) ampamp (c = n)ampamp(line==0)) Odebrano pierwszy znak hd44780_wait_ready(40) hd44780_outcmd(HD44780_CLR) hd44780_wait_ready(1600) second_nl_seen=false if (c == n) if (line==0) line++ hd44780_outcmd(HD44780_DDADDR(64)) Adres pierwszego znaku drugiej linii hd44780_wait_ready(1000) else second_nl_seen=true line=0 else hd44780_outdata(c) hd44780_wait_ready(40)

Funkcja ta ze wzgl du na skomplikowane adresowanie pami ci DDRAM jest zale naod konkretnego modelu modu u LCD B dzie prawid owo wspoacute pracowa z modu a-mi 2times16 2times20 i 2times40 znakoacutew W przypadku innych modu oacutew pozycje niektoacuterychznakoacutew mog by nieprawid owe

Mo emy ju wy wietla na LCD pojedyncze znaki czas na wy wietlanie tekstu Po-niewa teksty jako sta e dla zaoszcz dzenia cennej pami ci RAM przechowuje si za-zwyczaj w pami ci FLASH zdefiniujmy funkcj odczytuj c podany a cuch zna-kowy z pami ci FLASH a nast pnie umieszczaj c go na LCD

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 55

void lcd_puttext_P(prog_char txt) char ch while((ch=pgm_read_byte(txt))) lcd_putchar(ch) txt++

Powy sza funkcja wysy a kolejne znaki odczytane z pami ci FLASH na LCD za po-moc funkcji LCD_putchar Po napotkaniu znaku ko ca a cucha (0 nul) przerywa swojedzia anie

Pozostaje nam przetestowa dzia anie przedstawionych funkcjiint main() lcd_init() lcd_puttext_P(PSTR(Test LCDnDruga linia)) while(1)

Na ekranie modu u LCD powinien wy wietli si napisTest LCDDruga linia

Je li na LCD nic nie widzimy to w pierwszej kolejno ci powinni my sprawdzi kon-trast zmieniaj c napi cie na pinie Vee modu u LCD

Warto zdefiniowa jeszcze funkcj ustawiaj c pozycj od ktoacuterej b dzie wy wietlanynast pny znak

void lcd_goto(uint8_t x uint8_t y) hd44780_outcmd(HD44780_DDADDR(0x40y+x)) hd44780_wait_ready(1000)

Funkcja ta przyjmuje dwa parametry x i y okre laj ce pozycj na ktoacuterej zostaniewy wietlony nast pny znak wys any z mikrokontrolera do modu u LCD Dzi ki temuz atwo ci mo emy uaktualnia zawarto LCD bez konieczno ci ponownego prze-sy ania wszystkich danych Funkcja ta jest zale na od typu zastosowanego modu u

Ostatni funkcj jest funkcja umo liwiaj ca czyszczenie zawarto ci pami ci modu uOdpowiedzialne za to jest proste polecenie wysy ane do sterownika

void lcd_cls() hd44780_outcmd(HD44780_CLR) hd44780_wait_ready(false)

Oproacutecz czyszczenia zawarto ci pami ci modu u powoduje ono ustawienie kursoraw punkcie (00)

Kup książkę Poleć książkę

56 AVR Uk ady peryferyjne

Definiowanie w asnych znakoacutewUk ad HD44780 jest wyposa ony w 64 bajty pami ci CGRAM (ang Character Ge-nerator RAM) ktoacutera mo e przechowywa mapy bitowe 8 znakoacutew o matrycy 5times8 pikselilub 4 znakoacutew o matrycy 5times10 pikseli Przyk ad definicji znaku na matrycy 5times8 poka-zano na rysunku 223

Rysunek 223Przyk ad definicji w asnego znakuw pami ci CGRAM Znak rysujemyna matrycy 5times8 bitoacutew polazaciemnione odpowiadaj warto ci 1pola bia e warto ci 0 Wartowyliczon dla ka dej linii pikseliwpisujemy do pami ci CGRAMsterownika Najstarsze 3 bity ka degobajta (pola szare) s bez znaczeniamdash wy wietlacz pomija jeprzy wy wietlaniu obrazu

1

2

3

4

5

6

7

0 00100 = 4

01110 = 14

11111 = 31

00100 = 4

00100 = 4

00100 = 4

11111 = 31

01110 = 14

Adres Warto

Dost p do tej pami ci jest mo liwy dzi ki wys aniu polecenia ustawiaj cego adreszapisuodczytu pami ci CGRAM Po jego wys aniu wszystkie operacje zapisu i od-czytu dotycz tej pami ci a nie pami ci DDRAM Aby wroacuteci do adresowania pa-mi ci DDRAM nale y wybra jej adres lub dokona operacji wymagaj cej przesu-ni cia kursora

Pami CGRAM jest pami ci ulotn po ponownym w czeniu zasilania definicjeznakoacutew musz by ponownie przes ane przez procesor

Bity o warto ci 1 w definicji znaku odpowiadaj w czonym pikselom bity o warto-ci 0 pikselom wy czonym Najstarsze 3 bity ka dego bajta w pami ci CGRAM s

bez znaczenia mdash te pozycje nie s wy wietlane przez matryc Definiuj c znak nale-y tak e pami ta e ostatnia linia wy wietlana przez matryc (w zale no ci od wiel-

ko ci matrycy znaku linia 8 lub 10) powinna zawiera same zera mdash w tej linii b dziewy wietlany kursor

Najcz ciej matryce LCD pod czone do sterownika HD44780 maj organizacj 5times8czyli jeden znak jest definiowany przez 8 kolejnych bajtoacutew okre laj cych stan po-szczegoacutelnych linii tworz cych znak Stwoacuterzmy funkcj ktoacuterej zadaniem b dzie za a-dowanie definicji znakoacutew z pami ci FLASH mikrokontrolera do pami ci CGRAM

void lcd_defchar_P(uint8_t charno prog_uint8_t chardef) hd44780_outcmd(HD44780_CGADDR(charno8)) hd44780_wait_ready(40) for(uint8_t c=0clt8c++) hd44780_outdata(pgm_read_byte(chardef))

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 57

hd44780_wait_ready(40) chardef++

Funkcja LCD_defchar_P jako argumenty przyjmuje numer definiowanego znaku (0 ndash 7)oraz wska nik do obszaru pami ci FLASH zawieraj cego definicj znaku (obszarten zajmuje 8 nast puj cych po sobie bajtoacutew) Jak widzimy funkcja najpierw ustawiaw a ciwy adres pod ktoacuterym znajdzie si pocz tek definicji znaku w pami ci CGRAMmdash poniewa jeden znak jest opisywany za pomoc 8 bajtoacutew kolejne adresy znakoacutewto kod_znakutimes8 Nast pnie dane opisuj ce znak s adowane z pami ci mikrokontrolerai zapisywane w pami ci CGRAM sterownika Poni szy program ilustruje wykorzy-stanie funkcji LCD_defchar_P

prog_uint8_t char1[8][8]=0000000255 00000025525500000255255255 0000255255255255 00025525525525525500255255255255255255 0255255255255255255255255255255255255255255255

int main() for(uint8_t x=0xlt8x++) lcd_defchar_P(xampchar1[x][0]) Za aduj wzorce znakoacutew lcd_init() for(uint8_t x=0xlt8x++) lcd_putchar(x) Wy wietl znaki o kodach 0 ndash 7 while(1)

W pierwszej linii funkcji main nast puje za adowanie nowych definicji znakoacutew dopami ci CGRAM nast pnie inicjalizowany jest wy wietlacz po czym w pierwszejlinii s wy wietlane znaki o kodach 0 ndash 7 a wi c znaki ktoacuterych definicja zosta aprzes ana z mikrokontrolera

Zauwa e pami CGRAM podobnie jak DDRAM mo emy zapisywa i odczytywaprzed inicjalizacj modu u LCD Proces inicjalizacji jest potrzebny tylko do prawi-d owego wy wietlania na ekranie LCD

Poniewa dane potrzebne do wy wietlenia znaku s na bie co pobierane z pami cipodczas od wie ania matrycy LCD jakiekolwiek zmiany w definicji znaku kiedy jest onwidoczny na LCD poci gaj za sob natychmiastowe zmiany w wy wietlanym obrazieMo na t w a ciwo sterownika wykorzysta do stworzenia prostych animacji

void lcd_box(uint8_t y) hd44780_outcmd(HD44780_CGADDR(0)) Zaczynamy od znaku o kodzie 0 hd44780_wait_ready(40) for(uint8_t c=0cltyc++) Stwoacuterz linie z w czonymi pikselami hd44780_outdata(0xFF) hd44780_wait_ready(40) for(uint8_t c=yclt8c++) Stwoacuterz linie z wy czonymi pikselami hd44780_outdata(0x00) hd44780_wait_ready(40)

Kup książkę Poleć książkę

58 AVR Uk ady peryferyjne

int main() lcd_init() lcd_putchar(0) while(1) for(uint8_t x=0xlt8x++) lcd_box(x) _delay_ms(100) for(int8_t x=7xgt=0x--) lcd_box(x) _delay_ms(100)

Funkcja main wy wietla na LCD tylko jeden znak o kodzie 0 a nast pnie cykliczniezmienia jego definicj w pami ci CGRAM W efekcie posta znaku wy wietlana naekranie ci gle si zmienia

Transakcyjna obs uga LCDPokazana do tej pory obs uga LCD alfanumerycznego mia a pewne wady Jak wiemyoperacje odwo uj ce si do kontrolera LCD s niezwykle wolne cykl odczytuzapisudowolnego rejestru kontrolera trwa co najmniej 1600 ns co dla MCU taktowanegozegarem 32 MHz przek ada si na czas wykonania oko o 52 instrukcji asemblera Cogorsza wi kszo komend realizowanych przez kontroler jest wykonywana w czasieoko o 37 s co przek ada si na tysi ce zmarnowanych taktoacutew MCU St d te jaki-kolwiek zapisodczyt LCD to z perspektywy programu straszne marnotrawstwo czasu

Problem ten dotyczy ka dego urz dzenia IO ktoacutere dzia a wolniej ni procesor W takiejsytuacji warto napisa pewn warstw po redni mdash sterownik mdash ktoacuterego zada-niem b dzie buforowanie da dost pu do urz dzenia i rozstrzyganie konfliktoacutewdzi ki czemu roacute ne cz ci programu b d bdquomia y wra enierdquo e maj wy czny do-st p do urz dzenia

Pokazane wcze niej funkcje obs ugi LCD maj jeszcze jedn wad mdash nie s wspoacute bie -ne czyli nie mo na ich wykonywa jednocze nie w kilku miejscach programu w tymw szczegoacutelno ci w programie g oacutewnym i w funkcjach obs ugi przerwa W wielu przy-padkach ta wada jest bez znaczenia jednak czasami jest uci liwa mdash dla przyk adugdy na wy wietlany tekst chcieliby my na o y inne informacje np o dacie lub godzi-nie Oczywi cie wy wietlanie mo na zorganizowa tak aby nie by o potrzeby pisaniawspoacute bie nego kodu np poprzez zastosowanie bufora pami ci VRAM kontrolera LCDRodzi to jednak kolejne problemy i jest ma o eleganckie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 59

Zastanoacutewmy si w jaki sposoacuteb najlepiej jednocze nie rozwi za problem wolnegodost pu do urz dzenia i wspoacute bie no ci kodu Rozwi zaniem mo e by wprowadze-nie tzw transakcji Transakcj nazywamy zbioacuter operacji tworz cych pewn ca-o To co wyroacute nia tak wykonywany zestaw operacji to atomowo spoacutejno

izolacja i trwa o Pod tymi terminami kryje si istota wykonywanej operacji Ato-mowo transakcji zapewnia e jest ona wykonywana w sposoacuteb niepodzielny co gwa-rantuje nam prawid ow wspoacute prac z danym urz dzeniem IO w tym przypadku kon-trolerem LCD Wa na dla nas jest tak e izolacja mdash dzi ki temu inne operacje na LCD(inne transakcje) nie b d mia y wp ywu na wynik aktualnie wykonywanej transakcjimdash nie b d zak oacuteca y jej wykonania z drugiej strony nasza transakcja nie zak oacuteciwykonania innych Trwa o z kolei zagwarantuje nam e je li sterownik potwierdziwykonanie transakcji to znaczy e efekt jej dzia ania jest wy wietlony na LCD Tacecha nie jest nam a tak potrzebna mdash jest ona wydawa oby si oczywista Niemniej jestto pewna gwarancja e ca a operacja przebieg a poprawnie i w efekcie LCD znajdujesi w okre lonym przez nas stanie Tyle teorii przejd my do praktyki

Kody poni szego przyk adu znajduj si w katalogu PrzykladyLCD-alfaLCD-transact

Aby zapewni transakcyjny dost p do LCD musimy stworzy pewne struktury danychktoacuterych zadaniem b dzie przechowywanie informacji o operacjach sk adaj cych sina transakcje i stanie ich wykonania W tym celu pos u ymy si wiadomo ciami z roz-dzia u 5 bdquoJak uporz dkowa chaos czyli z o one typy danych i listyrdquo Do przecho-wywania oczekuj cych transakcji pos u ymy si buforem pier cieniowym zanimjednak go zaimplementujemy zastanoacutewmy si jak powinna wygl da struktura prze-chowuj ca informacje o transakcji Struktura ta powinna zawiera co najmniej

pole danych (data) z informacjami ktoacutere maj by przes ane do kontrolera LCD

pole okre laj ce liczb danych do wys ania (len)

pole okre laj ce realizowane polecenie dla LCD (cmd) mdash pole to pos u yprogramowi sterownika do w a ciwej interpretacji danych znajduj cych siw polu data

kilka poacutel kontrolnych przechowuj cych informacje potrzebne do realizacjisamej transakcji Jedno z nich mdash Ready mdash b dzie przyjmowa warto trueje li dana transakcja zosta a zrealizowana lub false w przeciwnym przypadkuZnaczenie drugiego pola mdash SelfDel mdash mo e wydawa si nieco enigmatycznepole to okre la czy pami przydzielona dla transakcji ma by zwolnionaw sterowniku LCD (warto true) czy te zostanie zwolniona w programie(warto false)

Oto jak mo e wygl da struktura definiuj ca transakcj typedef struct volatile bool Ready 1 true je li transakcja zosta a zrealizowana bool SelfDel 1 true je li pami przydzielona transakcji ma zosta zwolniona LCD_Cmd cmd 2 Polecenie do zrealizowania uint8_t len 6 D ugo polecenia

Kup książkę Poleć książkę

60 AVR Uk ady peryferyjne

unsigned 0 Wyroacutewnanie do granicy bajta uint8_t data[] Dane transakcji LCD_trans

Nale y zwroacuteci uwag na poleunsigned 0

Nie definiuje ono adnego pola struktury ale jedynie informuje kompilator e kolejnepole (w naszym przyk adzie o nazwie data) ma by wyroacutewnane do granicy bajta mdashdzi ki temu dost p do kolejnego pola b dzie odbywa si szybciej Z kolei samo poledata jest zadeklarowane jako tzw typ niekompletny

Typ niekompletny (ang incomplete type) to typ ktoacuterego rozmiaru nie da si okre li

W pokazanym przyk adzie rozmiaru pola data nie da si okre li gdy zosta on za-deklarowany jako typ tablicowy z tym e nie podano wielko ci tablicy Wielko ci niepodano gdy na etapie deklaracji struktury nie wiemy jakiej wielko ci dane b d w niejprzechowywane Tego typu deklaracja ma bardzo powa ne konsekwencje mdash skorowielko ci pola data nie da si okre li to jaki b dzie wynik dzia ania operatora sizeof(LCD_trans) Kompilator stara si jako wybrn z tej sytuacji w zwi zku z czym

zwroacuteci wielko struktury ale tak jakby pole data w ogoacutele nie istnia o mdash jego roz-miar b dzie wynosi 0 W ramach wiczenia zastanoacutew si ile bajtoacutew pami ci b dziezajmowa a struktura LCD_trans

Skoro dysponujemy ju struktur przechowuj c poszczegoacutelne transakcje pora nastworzenie obiektu przechowuj cego kolekcj transakcji Dodanie kolejnej strukturyb dzie polega o na dodaniu jej do takiego obiektu z drugiej strony program sterownikaLCD b dzie moacuteg z tej kolekcji pobiera kolejne transakcje do realizacji Opis ten przy-pomina opis dzia ania bufora pier cieniowego mdash z jednym wyj tkiem mdash po zape nie-niu ca ego bufora nie b dziemy usuwa niezrealizowanych transakcji lecz zabloku-jemy dodawanie kolejnych W tym celu pos u ymy si definicj nast pnej struktury

typedef struct LCD_trans elements[LCD_MAXTRANS] Wska niki do transakcji uint8_t Beg Pierwszy element bufora uint8_t Count Liczba elementoacutew w buforze CircBuffer

Struktura ta zawiera deklaracj tablicy wska nikoacutew na transakcje (pole elements)Poniewa jest to tablica musimy zna liczb jej elementoacutew mdash jest ona zadeklarowanaw sta ej LCD_MAXTRANS

define LCD_MAXTRANS 10 Maksymalna liczba pami tanych transakcji

Do realizacji bufora s potrzebne jeszcze dwa pola Beg wskazuj ce na pierwsztransakcj w buforze oraz pole Count okre laj ce liczb transakcji znajduj cych siw buforze Je li Count == 0 to znaczy e w buforze nie ma adnych oczekuj cychtransakcji a je li Count == LCD_MAXTRANS to znaczy e bufor jest pe ny i nie mo na

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 61

dodawa do niego kolejnych transakcji W a ciwo t wykorzystuj dwie zdefiniowanew pliku LCD_transc funkcje

static inline bool cbIsFull(CircBuffer cb) return cb-gtCount == LCD_MAXTRANS

static inline bool cbIsEmpty(CircBuffer cb) return cb-gtCount == 0

Jak pami tamy w przypadku funkcji modyfikatory static inline powoduj e danafunkcja nie b dzie istnie jako samodzielna lecz w ka dym miejscu w ktoacuterym jestwywo ywana jest wstawiany raczej jej kod a nie wywo anie Ma to znaczenie dlakroacutetkich funkcji (a wi c takich jak pokazane powy ej) dla ktoacuterych koszty wywo anias zazwyczaj wi ksze ni koszty umieszczenia cia a funkcji w miejscu jej wywo aniaTego typu funkcje zachowuj si w sposoacuteb zbli ony do makrodefinicji (z tym e re-spektuj wszystkie regu y j zyka C w szczegoacutelno ci kolejno operatoroacutew czy kon-trol typoacutew)

Takie funkcje jako argument pobieraj adres bufora na ktoacuterym maj operowa W na-szym przypadku bufor jest zdefiniowany nast puj co

static CircBuffer LCD_TransBuffer Bufor na transakcje

Nale y zauwa y e jest on zdefiniowany jako struktura globalna z modyfikatoremstatic Modyfikator ten ogranicza zasi g widoczno ci zmiennej LCD_TransBuffer dopliku w ktoacuterym zmienna ta zosta a zdefiniowana (w tym przypadku modyfikator staticjest niejako przeciwie stwem modyfikatora extern) Dzia anie to ma jedynie znaczeniekosmetyczne mdash uniemo liwia odwo anie si do bufora za pomoc funkcji ktoacutere niezosta y zdefiniowane w miejscu jego definicji Oproacutecz funkcji umo liwiaj cych okre-lenie stanu bufora potrzebne s jeszcze funkcje umo liwiaj ce dodanie i pobranie trans-

akcji Pierwsz funkcj b dzie funkcja dodaj ca transakcj do buforabool cbAdd(CircBuffer cb LCD_trans elem) ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsFull(cb)) return false Czy jest miejsce w kolejce uint8_t end = (cb-gtBeg + cb-gtCount) LCD_MAXTRANS cb-gtelements[end] = elem Dodaj transakcj ++cb-gtCount Liczba elementoacutew w buforze return true Wszystko OK

Funkcja ta dodaje transakcj (zmienna elem) do bufora ko owego Zanim transakcjazostanie dodana sprawdzane jest czy w buforze jest miejsce mdash je li nie funkcjazwroacuteci false Je li dodanie jest mo liwe warto licznika okre laj cego liczb trans-akcji przechowywana w buforze (Count) zwi ksza si o jeden Warto zastanowi si te dlaczego praktycznie ca e cia o tej funkcji jest zamkni te w sekcji atomowej (ATOMIC_BLOCK) Jedn z cech naszego sterownika ma by mo liwo wspoacute bie nego dost pu

Kup książkę Poleć książkę

62 AVR Uk ady peryferyjne

do LCD mdash to znaczy e danie np zapisu do LCD mo e wyst pi zaroacutewno w g oacutewnejp tli programu jak i asynchronicznie w przerwaniu St d te wynika e funkcja do-daj ca transakcj musi by napisana w sposoacuteb zapewniaj cy jej poprawn prac w sytu-acji gdy zostanie ona przerwana i ponownie wywo ana przed zako czeniem dzia aniajej poprzedniej instancji Umieszczenie cia a tej funkcji w sekcji atomowej nam to za-pewnia mdash dzi ki temu bufor transakcji zawsze b dzie spoacutejny Dla zaspokojenia cie-kawo ci warto usun sekcj atomow i sprawdzi jak wtedy b dzie zachowywa si tafunkcja i jak wp ynie to na spoacutejno przechowywanych danych

Drug niezb dn funkcj jest funkcja odczytuj ca bufor transakcji i zwracaj ca trans-akcj do zrealizowania (lub NULL je li adnej transakcji nie ma w buforze)

LCD_trans cbRead(CircBuffer cb) LCD_trans elem ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsEmpty(cb)) return NULL Bufor pusty nie mo na zwroacuteci elementu elem = cb-gtelements[cb-gtBeg] cb-gtBeg = (cb-gtBeg + 1) LCD_MAXTRANS -- cb-gtCount Zmniejszamy liczb elementoacutew pozosta ych w buforze return elem

Funkcja ta jest bardzo podobna do poprzedniej mdash najpierw sprawdza czy bufor za-wiera jak oczekuj c transakcj (cbIsEmpty(cb)) je li tak to zwraca adres opisuj -cej j struktury i zmniejsza liczb transakcji oczekuj cych (pole Count) W ten sposoacutebmamy zrealizowan ca funkcjonalno zwi zan z obs ug bufora pier cieniowegoPokazane funkcje s uniwersalne i z bardzo podobnych (lub wr cz tych samych) b -dziemy korzysta w kolejnych rozdzia ach w kontek cie np obs ugi transakcji zwi -zanych z interfejsami szeregowymi

Pora przej do samego sterownika LCD Jego zadaniem b dzie sprawdzenie czyw buforze oczekuj jakie transakcje do realizacji a je li tak to ich wykonanie Ponie-wa dane do LCD mog by wysy ane co okre lony minimalny czas znacznie d u -szy ni czas jakiego na to zadanie potrzebuje mikrokontroler do wysy ania kolejnychpaczek danych pos u ymy si timerem Timer b dzie generowa przerwanie nadmiaru(TCD0_OVF_vect) ktoacutere b dzie wyznacza o tempo w jakim kolejne porcje danych b -d trafia y do LCD Z noty katalogowej kontrolera wynika e minimalny czas trwa-nia wysokiego stanu sygna u Enable to 230 ns a okres tego sygna u nie powinien bykroacutetszy ni 500 ns Poniewa nasz dost p do LCD odbywa si w sposoacuteb nieblokuj cyMCU wi c szybko wysy ania danych do LCD jest bez znaczenia St d te w poka-zanym przyk adzie przyj to e dane b d wysy ane co 4 s co okre la sta a

define LCD_ACCESSTIME 0000004

Poniewa komunikacja z LCD odbywa si w sposoacuteb nieblokuj cy nie zale y nam tena czasie (i tak w stosunku do czasu od wie ania samego LCD jest on bardzo kroacutetki)w efekcie nie ma potrzeby odczytywania flagi busy kontrolera Dzi ki temu w cz ciprzypadkoacutew mo emy w ogoacutele zrezygnowa z sygna u wyboru RW i wymusi jego sta y

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 63

poziom logiczny umo liwiaj cy zapis do LCD Dzi ki temu mo na zaoszcz dzi do-datkowy pin IO1

Ca a logika naszego sterownika jest zawarta w funkcji obs ugi przerwania przepe nieniatimera (TCD0_OVF_vect) Poniewa LCD jest po czony z MCU w trybie 4-bitowym(dla zaoszcz dzenia liczby wykorzystanych pinoacutew IO) kolejne 8-bitowe dane muszby podzielone na dwie tetrady i wys ane do LCD w kolejno ci starszam odsza tetradaInformacja o aktualnie wysy anych danych jest umieszczona w zmiennej trans o typie

static struct uint8_t pos 6 Pozycja w polu danych aktualnej transakcji uint8_t nibble 1 Ktoacutera tetrada jest wysy ana seq

Dlaczego tak Dzi ki wykorzystaniu struktury i poacutel bitowych mo na zaoszcz dzi je-den bajt pami ci SRAM Ze wzgl du na wielko pami ci obs ugiwanej przez kon-troler LCD mo emy by pewni e transakcje zawieraj ce wi cej ni 63 bajty s ra-czej nierealne (nie mia yby wi kszego sensu) St d te do przechowywania informacjio aktualnie wysy anym bajcie danych wystarczy 6 bitoacutew mdash tyle samo zosta o wyko-rzystanych do okre lenia d ugo ci pola danych transakcji w strukturze LCD_trans Zaosz-cz dzony bit mo na po wi ci na flag nibble okre laj c ktoacutera tetrada (m odszastarsza)jest wysy ana Bez poacutel bitowych flaga ta zaj aby dodatkowy bajt pami ci

Przejd my do implementacji sterownika Pierwsz rzecz jak nale y sprawdzi jestto czy w buforze czeka jaka transakcja do zrealizowania Odpowiedzialny za to jestfragment kodu obs ugi przerwania nadmiaru timera

if(trans == NULL) Nic do zrobienia sprawd my czy jaka transakcja oczekuje trans=cbRead(ampLCD_TransBuffer) Czy jest jaka oczekuj ca transakcja seqpos=0 seqnibble=0 if(trans == NULL) TCD0_CTRLA=TC_CLKSEL_OFF_gc Nie ma adnych transakcji mdash wy cz timer

W przypadku gdy adna transakcja nie oczekuje na realizacj timer jest wy czanymdash dzi ki temu nie b d zg aszane kolejne przerwania przepe nienia i MCU nie b -dzie traci czasu na ich obs ug Co prawda wynikaj cy z tego zysk czasowy jest mar-ginalny lecz ma to istotniejsz konsekwencj mdash w przypadku usypiania MCU zb d-ne przerwanie timera nie b dzie niepotrzebnie wybudza o procesora W takiej sytuacjiponowne w czenie timera nast pi dopiero w funkcji dodaj cej transakcj do kolejkimdash a wi c w sytuacji gdy mamy pewno e istnieje oczekuj ca transakcja

Druga cz funkcji obs ugi przerwania jest zwi zana z realizacj samej transakcjiW pokazanym przyk adzie zaimplementowano tylko jeden typ transakcji mdash daniezapisu a cucha tekstowego pod wskazany adres VRAM (na okre lonej pozycji LCD)Je li zajdzie taka potrzeba programista mo e zaimplementowa inne polecenia i doda

1 Warto zauwa y e w bdquoklasycznejrdquo obs udze LCD te nie musimy czyta stanu flagi busy zamiast tego

wystarczy wprowadza p tle opoacute niaj ce Jednak poniewa taka obs uga blokuje MCU nie jest onazalecana Wady tej nie ma dost p transakcyjny co jest jego dodatkow zalet

Kup książkę Poleć książkę

64 AVR Uk ady peryferyjne

kod odpowiedzialny za ich obs ug Zauwa my e ka da transakcja musi zawieraadres pocz tku pami ci wideo od ktoacuterego b dzie zapisywany tekst Dzieje si takdlatego e transakcja wykonana wcze niej mo e ustawi wska nik zapisu na dowolnejkomoacuterce pami ci W efekcie tekst z kolejnej transakcji by by wy wietlany od komoacuterkina ktoacuterej zako czy si zapis poprzedniej transakcji Takie dzia anie oczywi cie jestniedopuszczalne st d te ka dy zapis do pami ci wideo poprzedza ustawienie rejestruindeksowego Problem ten mo na rozwi za tak e w inny sposoacuteb mdash poprzez wpro-wadzenie tzw uchwytoacutew (ang handlers) ktoacutere zawiera yby stan kontrolera LCDNiemniej to rozwi zanie dodatkowo komplikowa oby nasz sterownik Struktura danych(zawartych w polu data) ma wi c nast puj cy format

bajt nr 0 zawiera warto pozycji od ktoacuterej nale y dokonywa zapisu pami ciwideo mdash jest to warto przesy ana do rejestru okre laj cego adres zapisu

kolejne bajty zawieraj a cuch znakowy ktoacutery nale y umie ci w pami ciCGRAM

Poniewa bajt nr 0 zawsze zawiera warto wpisywan do rejestroacutew steruj cych kon-trolera podczas jego wysy ania jest ustawiana linia RS sygnalizuj ca zapis do rejestruPodczas wysy ania kolejnych bajtoacutew linia ta jest zerowana w zwi zku z czym zapisodbywa si do pami ci CGRAM

Kod obs uguj cy transakcj wygl da nast puj coif(trans) Jest transakcja do zrealizowania uint8_t dat=trans-gtdata[seqpos] if(seqnibble == 0) datgtgt=4 To trzeba zmieni je li linie danych nie s po czone z pinami 0 ndash 3 portu IO hd44780_outnibble_nowait(dat amp 0x0F seqpos = 0) Zapisujemy rejestr steruj cy lub dane ++seqnibble if(seqnibble == 0) ++seqpos Co drug tetrad zwi kszamy pozycj bufora if(seqpos gt= trans-gtlen) trans-gtReady=true Koniec transakcji if(trans-gtSelfDel) free_re(trans) Zwolnij pami transakcji je li tak sobie yczy programista trans=NULL Koniec transakcji CLR(OUT HD44780_E)

Ta cz przerwania wysy a kolejne tetrady do kontrolera LCD Warto zastanowi sinad dzia aniem sekwencji

++seqnibble

Poniewa pole nibble jest jednobitowe operacja inkrementacji prowadzi do zmianystanu tego pola na przeciwny (pole to ma warto 0 lub 1) Kiedy zostan wys anewszystkie dane przeznaczone dla kontrolera obs uga transakcji ko czy si Stan tensygnalizuje nadanie warto ci true polu Ready struktury LCD_trans Dzi ki temu pro-gram mo e sprawdzi asynchronicznie w stosunku do przerwania kiedy transakcjauleg a zako czeniu Opcjonalnie jest wykonywana jeszcze jedna funkcja mdash je li poleSelfDel ma warto true to pami zarezerwowana na transakcj jest automatycznie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 65

zwalniana W tym celu wykorzystuje si funkcj free_re ktoacuterej prototyp jest zade-klarowany w pliku Alloc_safeh Funkcja ta wywo uje funkcj biblioteczn free ktoacute-ra zwalnia pami przydzielon dynamicznie na stercie Poniewa funkcja ta nie jestfunkcj reentrant nale y stworzy odpowiedni bdquoprotez rdquo opakowuj c j w blokatomowy co zapewnia e nie zostanie ona ponownie wywo ana zanim jej poprzed-nia instancja nie zako czy dzia ania Oczywi cie lepszym rozwi zaniem by oby napi-sanie w asnych funkcji dynamicznej alokacji pami ci ktoacutere b d reentrant

Bardzo wa ne jest aby pole SelfDel mia o warto true wy cznie dla transakcjidla ktoacuterych pami zosta a przydzielona dynamicznie funkcj malloc (lub jej po-chodnymi) W pozosta ych przypadkach pole to musi mie warto false mdash nie-stosowanie si do tej regu y spowoduje b d mened era pami ci i najprawdopo-dobniej nieprzewidywalne dzia anie programu

Drug wa n zasad jest aby zmienna zawieraj ca dane transakcji nie by azmienn automatyczn mdash zmienne takie s automatycznie niszczone po opusz-czeniu zawieraj cej je funkcji W rezultacie obszar pami ci zawieraj cy danetransakcji mo e zosta wykorzystany przez inne zmienne co spowoduje uszkodzeniezawartych w nim danych

Pami przydzielona transakcji musi by alokowana w sposoacuteb dynamiczny (funkcjamalloc_re) ewentualnie mo e to by pami alokowana dla zmiennej globalnej lubstatycznej mdash zmienne tego typu istniej przez ca y czas ycia programu

Warto te zauwa y e instrukcje steruj ce stanem linii Enable kontrolera LCD(SET(OUT HD44780_E) i CLR(OUT HD44780_E)) s rozdzielone wieloma innymi in-strukcjami Dzi ki temu generowany impuls dodatni tego sygna u ma czas trwania gt230 ns wymagany w specyfikacji kontrolera Nawet dla XMEGA taktowanej zegarem32 MHz 230 ns przek ada si na oko o 7 instrukcji asemblera mdash czas jaki z pewno-ci up ynie pomi dzy wykonaniem obu powy szych instrukcji steruj cych

Do wysy ania danych do kontrolera zosta a wykorzystana nieco zmodyfikowanafunkcja hd44780_outnibble_nowait roacute ni ca si od jej protoplasty hd44780_outnibbletylko tym e nie czeka na sygna braku zaj to ci mikrokontrolera (nie realizuje teopoacute nie ) Nie jest to potrzebne gdy kolejne tetrady s wysy ane w odst pach cza-sowych okre lanych przez timer

Mamy wi c zapewnion obs ug transakcji i mo liwo transakcyjnego wy wietlaniadanych na LCD musimy jeszcze mie funkcj ktoacutera tworzy odpowiednie transakcjemdash jest odpowiednikiem funkcji bezpo rednio wysy aj cej dane znakowe do LCDOdpowiednikiem tym jest pokazana poni ej funkcja

bool LCD_PutText_B(uint8_t x uint8_t y char txt LCD_trans buf bool autodel) buf-gtcmd=LCD_Text buf-gtReady=false buf-gtSelfDel=autodel Czy zwolni pami po zako czeniu transakcji buf-gtdata[0]=HD44780_DDADDR(x+y0x40) Ustaw adres w DDRAM strcpy((char)ampbuf-gtdata[1] txt) Skopiuj dane tekstowe + NULL

Kup książkę Poleć książkę

66 AVR Uk ady peryferyjne

buf-gtlen=strlen(txt) + 1 D ugo tekstu + pozycji + NULL ndash 1 bool ret=cbAdd(ampLCD_TransBuffer buf) if((ret==false) ampamp (autodel)) free_re(buf) Brak miejsca w kolejce else TCD0_CTRLA=TC_CLKSEL_DIV1_gc Preskaler 1 mdash odblokuj timer return ret

Funkcja ta buduje transakcj odpowiedzialn za wy wietlenie napisu txt na wskaza-nej pozycji x y LCD Wszystkie dane o transakcji zostan umieszczone w buforzew pami ci ktoacuterej adres jest okre lany wska nikiem buf Pami w buforze musi bywystarczaj co du a aby pomie ci ca transakcj Dodatkowy parametr autodel okre laczy pami ta ma by automatycznie zwalniana po obs u eniu transakcji (true) czynie (false) Je li transakcj uda o si umie ci w kolejce funkcja zwraca true Wartozauwa y e w takim przypadku funkcja uruchamia te timer (w naszym przypadkujest to timer TCD0) odpowiedzialny za generowanie przerwania Funkcja obs ugi prze-rwania wysy a dane do LCD

Pewn odmian powy szej funkcji jest funkcjabool LCD_PutText(uint8_t x uint8_t y char txt) LCD_trans trans=malloc_re(sizeof(LCD_trans) + strlen(txt) + 2) bool ret=LCD_PutText_B(x y txt trans true) return ret

Wykorzystuje ona funkcj LCD_PutText_B z tym e najpierw alokuje dynamiczniepami potrzebn na przechowanie tworzonej transakcji

Mamy komplet potrzebnych funkcji a wi c sprawd my jak ca o sprawdza siw praktyce W pliku LCD-transactc znajduje si kod pokazuj cy jak dzia aj naszetransakcje Aby to by o mo liwe nale y zainicjalizowa kontroler LCD

LCD_init()

Wykorzystujemy tu znan ju funkcj inicjalizuj c mdash nie ma potrzeby jej zmienia gdy operacja inicjalizacji LCD jest jednorazowa i nie trzeba wykonywa jej w posta-ci transakcji W drugim kroku musimy zainicjalizowa wykorzystywany timer i systemprzerwa

LCD_Timer_init(ampTCD0)PMIC_CTRL|=PMIC_LOLVLEN_bm Odblokuj przerwania niskiego poziomusei()

Poniewa dost p do LCD z pewno ci nie jest czynno ci krytyczn czasowo prze-rwaniom timera nadano najni szy priorytet Dzi ki temu mo na innym bardziej kry-tycznym przerwaniom nada wy sze priorytety i uzyska w ten sposoacuteb zmniejszenieczasu latencji obs ugi przerwa Sama inicjalizacja timera jest niezwykle prosta

void LCD_Timer_init(TC0_t tc) tc-gtINTCTRLA=TC_OVFINTLVL_LO_gc Odblokuj przerwania nadmiaru timera i nadaj im niski priorytet tc-gtPER=F_CPULCD_ACCESSTIME Przerwanie co 4 us (niezale nie od F_CPU)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 67

Sprowadza si ona tylko do odblokowania mo liwo ci zg aszania przerwania nadmia-ru oraz konfiguracji rejestru PER tak aby przerwania by y generowane co ok 4 s mdashniezale nie od cz stotliwo ci taktowania CPU Mo emy wi c przyst pi do wy wie-tlenia pierwszego napisu

LCD_PutText(00 Numer)

Powy sza funkcja ma jedn wad mdash alokuje dynamicznie pami po ka dym wywo-aniu (pami ta jest automatycznie zwalniana po obs u eniu transakcji) niemniej

ca y proces jest czasoch onny Mo emy tego unikn alokuj c pami bdquor cznierdquo i wielo-krotnie wykorzystuj c zaalokowany blok pami ci Ilustruje to poni szy przyk ad

LCD_trans buf=malloc_re(sizeof(LCD_trans) + 7)

Zmienna buf wskazuje na obszar pami ci ktoacutery mo e pomie ci a cuch 5-znakowyTyle wystarczy na potrzeby tego przyk adu mdash na LCD b d wy wietlane kolejneliczby w zakresie 0 ndash 65 535 najd u sza ma 5 znakoacutew st d te nasz bufor ma tak a nieinn d ugo

while(1) utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(60 bufstr buf false) while(LCD_IsTransCompleted(buf))

Do konwersji liczby na a cuch u yto funkcji bibliotecznej utoa (nag oacutewek stdlibh)Poniewa d ugo a cucha po konwersji jest zmienna (co spowodowa oby pozosta-wianie na LCD bdquoduchoacutewrdquo po poprzednich konwersjach) w kolejnej linii brakuj ceznaki uzupe niono spacjami Nast pnie tworzona jest transakcja w obszarze pami ciprzydzielonym zmiennej buf Ostatnia p tla while jest odpowiedzialna za oczekiwa-nie na zako czenie realizacji transakcji Po jej zako czeniu p tla jest wykonywana odpocz tku

Uwa ny czytelnik z pewno ci zauwa y e pami przydzielana funkcj malloc_renie jest nigdzie zwalniana mdash w normalnej sytuacji spowodowa oby to wyciek pami -ci W naszym przyk adzie jednak program nigdy si nie ko czy nie ma wi c potrzebyzwalniania pami ci wskazywanej przez zmienn buf

Powy szy przyk ad pokazuje jak unikn blokowania CPU na czas dost pu do wolnodzia aj cego urz dzenia jakim jest LCD alfanumeryczny Jednak to nie wszystkiezalety wynikaj ce z zastosowania transakcji Drug wa n zalet naszego rozwi zaniailustruje przyk ad znajduj cy si w katalogu PrzykladyLCD-alfaLCD-transact-intPowa nym ograniczeniem funkcji odpowiedzialnych za dost p do LCD w sposoacutebklasyczny by a niemo no ich wywo ywania z funkcji obs ugi przerwa mdash funkcjeobs ugi LCD nie by y reentrant2 Nasz system oparty na transakcjach nie ma tychwad Aby to zilustrowa zosta stworzony prosty przyk ad mdash tak jak poprzedniow p tli g oacutewnej programu s wy wietlane stale kolejne liczby ale jednocze nie wyko-

2 Poza tym blokowa y CPU na d ugi czas a jak pami tamy funkcje obs ugi przerwa powinny by

wykonywane mo liwie kroacutetko

Kup książkę Poleć książkę

68 AVR Uk ady peryferyjne

rzystano drugi timer (TCD1) w ktoacuterego funkcji obs ugi przerwania przepe nienia jestwy wietlany licznik tych przerwa

ISR(TCD1_OVF_vect) static char int_buf[sizeof(LCD_trans) + 7] static uint16_t cnt char bufstr[6]

utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(61 bufstr (LCD_trans)ampint_buf false)

Jak widzimy w sposoacuteb asynchroniczny z dwoacutech miejsc w programie mo emy uzy-ska dost p do LCD a ka da funkcja bdquoma wra enierdquo e ma LCD na wy czno Przy okazji warto przeanalizowa sposoacuteb w jaki jest rezerwowana pami na trans-akcj w przerwaniu Oczywi cie mo na by wykorzysta dynamiczn alokacj pami cilecz jak wspomniano taka alokacja jest czasoch onna St d te w pokazanym przy-k adzie wykorzystano tablic statyczn int_buf o rozmiarze umo liwiaj cym prze-chowanie kompletnej transakcji Dzi ki temu e zmienna int_buf jest zmienn statycz-n nie jest ona niszczona po zako czeniu funkcji obs ugi przerwania Gdyby pomins owo kluczowe static zmienna ta by aby niszczona a na LCD najprawdopodobniejzacz yby si pojawia przypadkowe tre ci Poniewa pami naszego bufora nie by aalokowana dynamicznie nie mo e ona zosta zwolniona w naszym sterowniku LCDst d te ostatni parametr wywo ania funkcji LCD_PutText_B musi mie warto false

OptymalizacjaPrzy okazji tego i poprzedniego przyk adu warto zastanowi si jeszcze nad jednkwesti mdash optymalizacji W podanych przyk adach wykorzystano wcze niej omoacute-wione funkcje dost pu do wy wietlacza LCD znajduj ce si w plikach hd44780ci hd44780h Wi kszo z zawartych tam funkcji nie jest wykorzystywana jednakkompilator mimo wszystko umieszcza ich kod w pliku wynikowym mdash dzieje si takponiewa nie mo e on bdquostwierdzi rdquo czy funkcje te nie s wykorzystywane w innychfragmentach programu Pami tajmy e kompilator kompiluje poszczegoacutelne pliki roacute-d owe osobno i dana jego instancja nie bdquowierdquo co znajduje si w innych plikach (innychjednostkach kompilacji) Tak ca o ciow wiedz ma dopiero konsolidator (linker)ktoacutery czy stworzone przez kompilator pliki obiektowe (o rozszerzeniu o) w plikwynikowy Linker jednak bdquonie wierdquo ktoacutera z funkcji programu zosta a u yta a ktoacuteranie mdash informacje te ma wy cznie kompilator W ten sposoacuteb powstaje typowe b dneko o w efekcie nasze nieu ywane funkcje nie s usuwane (linker zostawia je bdquonawszelki wypadekrdquo) i zajmuj niepotrzebnie pami Czy mo na temu jako zaradzi Oczywi cie tak W tym celu trzeba po czy si y kompilatora i linkera co zapewniaj od-powiednie opcje kompilacji We w a ciwo ciach projektu (ProjectProperties lub Alt+F7)wybieramy zak adk Toolchain a nast pnie AVRGNU C Compiler i OptimizationZnajdziemy tam pole wyboru o nazwie Prepare functions for garbage collection (ry-sunek 224)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 69

Rysunek 224 Aby da linkerowi mo liwo usuwania nieu ywanych funkcji nale y skompilowaprogram z wybran opcj ndashffunction-sections ktoacutera spowoduje e ka da funkcja programu znajdzie siwe w asnej sekcji

Zaznaczenie tej funkcji spowoduje umieszczenie ka dej funkcji w osobnej sekcji mdashsamo w sobie nie wp ynie to na skroacutecenie kodu wynikowego ale jest warunkiem nie-zb dnym dla podj cia stosownych dzia a przez linker Aby wyeliminowa nieu y-wane funkcje nale y zaznaczy jeszcze w ga zi AVRGNU LinkerOptimization poleGarbage collect unused sections (rysunek 225)

Rysunek 225 Zaznaczenie opcji Garbage collect unused sections (-Wl--gc-sections) spowodujee nieu ywane funkcje zostan usuni te z kodu wynikowego w efekcie kod programu ulegnie skroacuteceniu

Po zaznaczeniu tych opcji program zostanie skroacutecony o kilkaset bajtoacutew Oczywi cieje li wszystkie funkcje by yby wykorzystane nie uzyskaliby my adnego skroacuteceniakodu Niemniej w sytuacji gdy u ywa si bibliotek zazwyczaj przynajmniej czfunkcji nie jest wykorzystywana warto wi c skorzysta z tej mo liwo ci optymalizacji

Kup książkę Poleć książkę

70 AVR Uk ady peryferyjne

Je li mamy do czynienia z prekompilowan bibliotek (lib) to musi ona by skom-pilowana z zaznaczon opcj Prepare functions for garbage collection (-ffunction-sections) Alternatyw jest umieszczenie ka dej funkcji biblioteki w osobnym pliku(tak jak w przypadku bibliotek AVR-libc)

Na ekranie wyboru opcji optymalizacji linkera mamy jeszcze jedn przydatn opcjmdash Relax Branches (-mrelax) Dla mikrokontroleroacutew ktoacutere maj ponad 8 kB pami ciFLASH instrukcje skokoacutew s generowane jako tzw instrukcje d ugie mdash umo liwiajone skok do komoacuterki pami ci FLASH o dowolnym adresie Jednak cen za to jestwyd u enie instrukcji mdash ich kod jest d u szy podobnie jak czas wykonania Nie zawszejednak takie d ugie instrukcje musz by wykonywane mdash je li miejsce docelowe skokule y blisko (w zasi gu instrukcji skokoacutew wzgl dnych) to mo na w kodzie wynikowymzamieni instrukcje d u sze na kroacutetsze co przynosi oszcz dno ci w postaci skroacuteceniakodu wynikowego Poniewa dopiero linker bdquowierdquo jak poszczegoacutelne fragmenty kodus rozmieszczone w pami ci takiej podmiany mo na dokona na etapie linkowaniaprogramu co zapewnia powy sza opcja St d te warto to pole wyboru zaznaczy

Kup książkę Poleć książkę

SkorowidzA

ABI Application Binary Interface 25AC Address Counter 50ADPCM 482adres

bazowy 377bufora 61komoacuterki 84pu apki 202

ALE Address Latch Enable 368alfanumeryczne wy wietlacze 43algorytm ADPCM 492algorytmy stratne 495animacje 57antyaliasing 325architektury procesoroacutew XMEGA 352asembler 23

dyrektywy 40funkcje j zyka C 41obs uga przerwa 39

asynchroniczne wywo anie funkcji 101Atmel Studio 15

Bbajty kalibracyjne 569biblioteka

FATFS 131 139 176 180 517libcallback-liba 99PetitFS 144 149

bitADC_CH0START_bm 236IMPMODE 244

bitrate 442 512blokowanie przerwa 219b d 16 19

kwantyzacji 463offsetu 230wzmocnienia ADC 230

BOD 223bps bits per second 12

budowakarty 152linii obrazu 394pami ci SDRAM 374pliku stymulacji 192ramki PAL 412sygna u PAL 411wtyczki 544 545

bufor 78FIFO 497na transakcje 61transakcji 62

buforowanie wyj cia 294

CCAS Column Address Strobe 375CCFL 44charakterystyka

przetwornikoacutew 222termistora 264tryboacutew pracy 232

CID Card Identification 169CKE Clock Enable 375CLKIN 421COG Chip on Glass 310CRC 158 178CRC16 178CRC7 164CS Chip Select 361 375CSD Card Specific Data 172czas

dost pu do SDRAM 424adowania kondensatora 244

propagacji 281proacutebkowania 260symulacji 209

czcionki 322cz stotliwo

odchylania pionowego 428proacutebkowania 244 441 444 530przebiegu 504

Kup książkę Poleć książkę

576 AVR Uk ady peryferyjne

cz stotliwoPWM 465taktowania koprocesora 549taktowania procesora 209taktowania rdzenia 18

czyszczenie pami ci 318

DDAC Digital to Analog Converter 293 447 451

buforowanie wyj cia 294generowanie przebiegoacutew 301jitter 303kalibracja 306napi cie referencyjne 295system zdarze 297taktowanie 296tryb dwukana owy 301wykorzystanie DMA 298wyzwalanie konwersji 305

datalogger 261 265 275DD Device Density 86debuger 183

programowy 190sprz towy 185 187

decymacja 259DEBUG 219XMEGA 260

definicja symboli globalnych 36definiowanie w asnych znakoacutew 56deklaracja zapowiadaj ca 103 337dekoder DTMF 548 556DMA 254 298 402 458 518 523dost p do

danych 358 359 568danych binarnych 356 360danych wielobajtowych 31DataFLASH 137EEPROM 128FAT 136komoacuterki 375LCD 59 62 66 68operandu 30pami ci 81 384 386 387 561pami ci SDRAM 424pliku blokowy 141portoacutew IO 30rejestroacutew IO procesora 36rejestroacutew uk adu 499SPI 95sygnatury u ytkownika 565 567wska nikoacutew 32

DQM Data Mask 375DSP Digital Signal Processor 535

DTMF 535 553dyktafon 529dynamiczna alokacja pami ci 516dyrektywa global 38dyrektywy asemblera 40dzia anie

DMA 255komparatora 280timeroacutew 400

d wi k 443

EEBI External Bus Interface 361EEPROM 207eliminacja jitteru 24emulacja RS232 139

FFAT File Allocation Table 128 131FAT32 128FATFS 180filtr

dolnoprzepustowy 491drugiego rz du 470pierwszego rz du 469trzeciego rz du 471

filtrowanie sygna u PWM 468firmware 565FLASH 207format

odpowiedzi 159polecenia 158protoko u 157

funkcja_delay_ms 17 219c_zero 42callback 106 341callback() 99DataFLASH_CSEnable 100DF_FinishBufWrite() 269disk_initialize 136disk_ioctl 181disk_status 136disk_write 138DMA_SPI_init 104DTMF_GetCode 553free_re 65GPIOR0_init 507hd44780_outcmd 51hd44780_outnibble_nowait 65LCD_defchar_P 57

Kup książkę Poleć książkę

Skorowidz 577

Menu_Click_Func 515Menu_Free 516Menu_Recorder 532Menu_Run 527MS_CreateRegEntry 117MS_GetDirPos 125MS_GetRegItem 115MS_WritePages 116 118OSC_wait_for_rdy 473RecMenu_StartStop 532sprintf 142strtok 124sysclk_init() 200 209TMF_memcpy_PF 454udi_cdc_getc() 123udi_cdc_is_rx_ready() 123VS1003_Reset 506

funkcjeanalizuj ce 556biblioteczne 50biblioteki FATFS 143j zyka C 41kontrolera ST7565R 313opoacute niaj ce 17opoacute nie 219reentrant 524specjalne kontrolera 319steruj ce 314zapisu 133

fusebit 557BODACT 560BODLEVEL 560BOOTRST 559DVSDON 560EESAVE 561JTAGEN 558RSTDISBL 559SUT 559TOSCSEL 559

fusebity w AVR-libc 571

Ggenerator obrazu composite 426generowanie

d wi ku 461kolorowego obrazu 437obrazu wideo 391przebiegoacutew 301przerwa 285sygna u composite 409

g bia koloru 326gniazdo

karty SD 156VGA 396

Hhistereza 281

IIDE 11IMA ADPCM 483informacje

o kolorze 431o obrazie 434

inicjalizacjakarty 161karty SDHC 167karty SDSC 167karty SDXC 167licznika 419pami ci 119USART 505

instrukcjaicall 42movw 35nop 13 24

interfejsSCI 498SDI 498SPI 71 79RS232 120UART 123USART 71 73

interpolacja 259interpolacja w XMEGA 260inwersja obrazu 319

Jjednostki 12jitter 24 303 420

Kkalibracja

ADC 229DAC 306 564offsetu 237

kana DMA 82 522karta 154 158

mikroSD 152SD 151 152SDHC 151 152 160SDSC 160SDXC 151 160

Kup książkę Poleć książkę

578 AVR Uk ady peryferyjne

karty pami ci 151 152 157biblioteka FATFS 180budowa 152format polecenia 158inicjalizacja 161 167komunikacja 156odczyt danych 173opcje konfiguracyjne 181rejestry specjalne 169tryby pracy 153zapis danych 176zasilanie 154

kodasemblerowy 23 24C 23dost pu 24

kodowanieμ-law 481ADPCM 483Dialogic ADPCM 494informacji 166 426koloru 425znakoacutew 536

kodyformatoacutew audio 501zdarze 545

kolejno bajtoacutew 533kolor 424 430kolorowy obraz 437komparator 422

analogowy 279 280analogowy XMEGA 282okienkowy 284

kompilacja plikoacutew binarnych 350kompilator avr-gcc 11 359kompresja

ADPCM 482 486d wi ku 480IMA ADPCM 482

komunikacja z koprocesorem 504konfiguracja

4-portowa 364biblioteki 133debugera 185DMA 459 522fusebitoacutew 570kontrolera DMA 257 452komparatoroacutew 285lockbitoacutew 570LPC 371pami ci SDRAM 381PetitFS 149pinu IO 225portoacutew IO 362

preskalera 452projektu 186przerwa 219pu apki 203rejestru EVCTRL 248rejestru PER 67SPI 75sygna u CS 377typu czcionki 324urz dze IO 189USART 76zegara 383

konsolidacja 547kontroler

DMA 254 298 402 458 518 523KS108 310ST7565R 310ndash315 321

konwersjaDAC 305sygna oacutew 396wyzwalana 306

konwertercyfrowo-analogowy 426DAC 427

koprocesormp3 496VS1003B 10

korekcja fazy 466kwantyzacja 463

Llampa CCFL 44LE Latch Enable 433licznik 419

cykli 209TCC1 400timera 20

linie IO 50linie sygna owe

MISO 72 164MOSI 72SCK 72SS 72

linker 69lista

mnemonikoacutew 24modyfikowanych rejestroacutew 32

lockbity 557 561lockbity w AVR-libc 570LPC Low Pin Count 371LPCM 443 556LSB Least Significant Bit 228

Kup książkę Poleć książkę

Skorowidz 579

a cuchy formatuj ce 212czenie plikoacutew 352

Mmagistrala pami ci zewn trznej 361magnetofon cyfrowy 528makro _SFR_IO_ADDR() 39makrodefinicja

ASSERT 214HD44780_CGADDR() 53HD44780_CLR 53HD44780_DDADDR() 53HD44780_DISPCTL() 52HD44780_ENTMODE() 52HD44780_FNSET() 52HD44780_HOME 53HD44780_SHIFT() 51LOCKBITS 571

mapowanie sygna oacutew 366mapy bitowe 343marker czasowy 268maski bitowe 329matryce 49menu 335menu piktogramowe 342mierniki temperatury 262mikrokontroler

ARM 9AVR 9PIC 9XMEGA128A3U 10

MISO 72moc wydzielana 265model psychoakustyczny 495modu

alfanumeryczny 45NVM 568Xmega eXploreGO 10Xplained ATXMEGA A3BU 10Xplained ATXMEGA-A1 10Xplained XMEGA128A1 447Xplained XMEGA256A3 94Xplained XMEGA256A3BU 97 143 266

modyfikator 30const 85volatile 28 273

monitory CRT 395monochromatyczne wy wietlacze graficzne 309monochromatyczny

tryb graficzny 416tryb tekstowy 413

MOSI 72mp3 495Msps Megasamples per second 12multiplekser wej ciowy 226 283multipleksowanie adresoacutew 368 369muzyka 439

Nnadawanie kodoacutew DTMF 540nadproacutebkowanie 258nag oacutewek kontenera wav 500nagrywanie mowy 486najmniej znacz cy bit 228napi cie

offsetu 280referencyjne 223 295zasilania 239

Oobracanie obrazu 319obraz 319

composite 426kolorowy 430wideo 391

obroacutebka d wi ku 443 445obs uga

FAT 131 143klawiatury matrycowej 24LCD 58 63 67menu 337przerwania 37 38 458przerwania DMA 525przerwa w asemblerze 39przyciskoacutew 272wy wietlaczy alfanumerycznych 45

odczytblokowy 140danych 173 358

odpowied response 159R1 159R2 159R7 160

od wie anie pami ci 376odtwarzanie

d wi ku 472muzyki 447 513 518 521

offset 238offset ADC 230okno

Breakpoints 202Call stack 209dezasemblera 210

Kup książkę Poleć książkę

580 AVR Uk ady peryferyjne

oknoIO View 207podgl du zmiennych 211wyboru czcionek 324

OLED 46opcje

kompilatora 35zapisu d wi ku 445

operacjena buforach 91odczytu 173zapisu 176zapisu strony 92

operand 29operator

ascii 41

asciz 41

byte 41

section 41opoacute nienia 13 18opoacute nienie zmienne 16optymalizacja 16 68optymalizator 26organizacja pami ci 77organizacja pami ci VRAM 316oscylator 287OSD On-Screen Display 417ostrze enie 16oszcz dzanie energii 94

Ppakiet WinAVR 48pami

CGRAM 56 57 64DataFLASH 10 77 81 113 269DDRAM 49EEPROM 111FLASH 54 124 207RAM 49SDRAM 372SRAM 63 124 329 366 371VRAM 314 317

PCLK 421PCM 443PetitFS 144 149p tla

for 13while 201

pierwsza linia obrazu 321piksel 430piktogram 342pin IO 225

plikAlloc_safeh 65DataFLASHc 83DataFLASHIOc 136definesh 50delayh 14diskioh 132 136ffh 132ffconfh 132 181hd44780h 49integerh 132ioh 30LCD_transc 61LCD-transactc 66Makefile 14Menuc 19nothingo 541outfiletxt 547 551pffh 149SPIh 104stringh 113stymulacji 191 192

pliki mp3 495elf 351fon 323o 24S 24 34binarne 350 355csv 276d wi kowe 440obiektowe 352wav 500WMA 512z czcionkami 327z danymi 349

podbijacz napi cia 315podgl d

pami ci 207stosu wywo a 209zmiennych 211znakoacutew 325

pod czeniefototranzystora 262karty SD 155LCD z kontrolerem 311modu u 50pami ci 362 369 370 373termistora 262uk adu LM35 251wyj XMEGA 398

pod wietlenieCCFL 46OLED 46

Kup książkę Poleć książkę

Skorowidz 581

podwoacutejne buforowanie 255 332 457polecenia

kasowania strony 81konfiguracyjne pami ci 82kontrolera ST7565R 315odczytu bufora 82 89odczytu pami ci 81 88SDRAM 376transferu 91

polecenieACMD41 168cd 181CID 178CMD0 165CMD8 167CSD 178date 276dir 127 181dump 276erase 276get 276HD44780_CLR 51Init 178mkdir 181

po czenieDMA ze SPI 96dwoacutech komparatoroacutew 285koprocesora mp3 497LCD z mikrokontrolerem 48wyj cia XMEGA 411XMEGA z PC 121z telewizorem 431

pomiarnapi cia zasilania 239temperatury MCU 241

port IO 30 362pozycjonowanie grafik 345poacute obraz 410precyzja pomiaroacutew 260preskaler 478preskaler ADC 243program

Atmel Data Visualizer 275Audacity 443avr-objcopy 350dataloggera 265LCD Image Converter 323makeloadingtableexe 543Realterm 127 554riffstrip 483SoX 445Tracepoint 208

programowanie sygnatury u ytkownika 566protokoacute master-slave 157

prototypy 136proacutebki d wi kowe 447proacutebkowanie

8-bitowe 300nieliniowe 480

prymitywy graficzne 330przebieg PWM 468przebiegi 289 303przechwytywanie danych 276przemiatanie wej 253przerwanie 218 254 286 403

DMA 522komparatora 286

przestrze adresowa procesora 378przesy anie

danych 498polece 498

przetaktowanie procesora 436przetwornik

ADC 221analogowo-cyfrowy 221cykliczny 222potokowy 222

przyciski 272pseudooperatory 41pu apki breakpoints 197pu apki warunkowe 205punkty ledzenia 203PWM 461 462 472

RRAS Row Address Strobe 375redukcja poboru energii 242regulacja kontrastu 321rejestr 32 34rejestr AC 50

adresu wtyczki 513BASEADDR 377CID 169CMP 251CSD 172czasu utworu 512DATA 83EVCTRL 248formatu audio 512identyfikacyjny pami ci 87INTFLAGS 252kontroli basoacutew 510kontroli g o no ci 513MUXCTRL 227OCR 168PER 67poroacutewnania 249

Kup książkę Poleć książkę

582 AVR Uk ady peryferyjne

rejestr ACSCI_CLOCKF 511stanu komparatora 287stanu pami ci 86stanu uk adu 510trybu pracy 508WINCTRL 285

rejestrydost pu do pami ci RAM 513GPIOR 502IO procesora 36mikrokontrolera 25procesora 35specjalne 94specjalne karty 169uk adu VS1003B 508

relacja rodzic ndash dziecko 336reset uk adu 534rozdzielczo

LCD 329przetwornika 231PWM 463 477

rozszerzenie HiRes 477 479roacutewnanie Steinharta-Harta 263rysowanie map bitowych 343

Sschemat uk adu dataloggera 267SCI Serial Command Interface 498SCK 72SD Secure Digital 152SDI Serial Data Interface 498separator synchronizacji 422separowanie impulsoacutew synchronizacji 422shieldy 10skaler 422skaler napi cia 283skrypt makefile 353s owo kluczowe

asm 27extern 37static 68

specyfikatory lokalizacji zmiennej 213sps samples per second 12SS Slave Select 72standard PAL 410standard VGA 393sterowanie

dataloggerem 275sygna em 379

sterownik 121HD44780 49 56LCD 49 62

stos wywo a 209

strukturaFATFS 139Handle 118LCD_trans 60 63menu 338rejestru 86SimpleFSEntry 113 116SimpleFSHandle 113 118 140submenu 527systemu plikoacutew 112

sumabitowa 571kontrolna 178

sygnacomposite 409composite video output 430CS 377DREQ 497H-Sync 396synchronizacji 423V-Sync 396zegarowy CLK 374

sygna yinterfejsu EBI 363magistrali EBI 364steruj ce 375

sygnaturaprodukcyjna procesora 563u ytkownika 565

symbol__DELAY_ROUND_CLOSEST__ 17__DELAY_ROUND_DOWN__ 17_FS_FAT12 149_FS_FAT32 149_FS_MINIMIZE 133_FS_READONLY 133_FS_RPATH 135_FS_TINY 133_MAX_SS 135_MULTI_PARTITION 135_USE_DIR 149_USE_FASTSEEK 134_USE_FORWARD 134_USE_LABEL 134_USE_LFN 134_USE_LSEEK 149_USE_MKFS 134_USE_READ 149_USE_STRFUNC 134_USE_WRITE 149_VOLUMES 136F_CPU 14 15 18increment 36USE_BUSY_FLAG 50

Kup książkę Poleć książkę

Skorowidz 583

symboleglobalne 36w asemblerze 28zewn trzne 39

symulacja 198 209symulator 190synchronizacja

pami ci 331pionowa 395pozioma 394

systemplikoacutew 111 128przerwa 404zdarze 245

szablonfont_XMEGAtmpl 326image_XMEGAtmpl 343

szum 463szybko przesy ania danych 126

ledzenie wi zki 333rodowisko

graficzne 11programistyczne 11VSIDE 542WinAVR 47

Ttabela FAT 130tablica

framebuf 402 408plugintbl 552 555tekst 208z kodem wynikowym 543

taktowanieDAC 296mikrokontrolera 473

technologia OLED 44temperatura mikrokontrolera 239 241termistor 262 290

NTC 263PTC 263

termometrLM35 249 250z alarmem 251

termostat 290test uk adu VS1003B 503testowanie obrazu 319timer 16 62

TCC0 20

TCC1 399transakcja 59 62 65transakcje 17 103ndash107transakcyjna obs uga LCD 58transakcyjny dost p do SPI 95transfer 91

danych 97wynikoacutew 254

transmisja 72 83tryb

bez znaku 234ci g ej konwersji 252czterobitowy 153dwukana owy 301graficzny 416graficzny VGA 407idle 419jednobitowy 153LPC 371monochromatyczny 397 407oszcz dzania energii 94 306pracy multipleksera 226pracy SPI 157roacute nicowy 232single slope 312SPI 153tekstowy 413tekstowy VGA 397z pojedynczym wej ciem 234ze znakiem 235

trybygenerowania PWM 467pracy karty 153pracy przetwornika 231pracy SPI 74pracy uk adu 508

twierdzenie Nyquista 258tworzenie

adresu 84nak adek 417obrazu 335tablicy 543

typ__uint24 119karty 160niekompletny 60wyliczeniowy 114

typyoperandoacutew 29w AVR 34

Kup książkę Poleć książkę

584 AVR Uk ady peryferyjne

Uuchwyt handle 64 113uk ad

AD725 427 431buforowy 294CS 361DAC 284dataloggera 267detekcji awarii zasilania 559generuj cy obraz 393HiRes 477ICL7660 47LM35 250 251SampH 293sterowania sygna em 379USART 401VS1003B 496 503 508 530 538 556VS100XX 529wzmacniania sygna u 227

uk ady peryferyjne 9uruchomienie komparatora 287urz dzenie

master 72slave 72

u rednianie 259utrata danych 141u ycie wstawki asemblerowej 33

VVGA 393

Wwarto ci kalibracyjne

ADC 564oscylatoroacutew 564temperatury 564

warunkowa kompilacja 36WE Write Enable 375wej cie composite video input 425wektor przerwa 38 257wideo 391wielko pami ci 86 377w czenie DAC 299wska nik na struktur 27wska niki 32wstawki asemblerowe 24 33wtyczka 535 541 544

SineDTMF Generator 537VGA 396

wyboacuter cz stotliwo ci PWM 465 474wykorzystanie

DMA 254 518

EuroSCART 428PWM 461rejestroacutew 34

wyliczanie predyktora 489wy wietlacze

alfanumeryczne 43 45graficzne 43 309LCD 43OLED 46

wy wietlanielitera u 213map bitowych 344obrazu 333 346 406obrazu VGA 393

wywo ania zwrotne callbacks 98asynchroniczne 101synchroniczne 101

wyzwalanie konwersji 245wzmacniacz 446wzmacniacz operacyjny 279wzmacnianie sygna u 227

XXMEGA 9 18

Zzapis

bufora 269danych 176d wi ku 440 556

zasilaniekarty 154pami ci 109

zatrzask 368zatrzask 74HC573 433zatrza ni cie adresu 369zdarzenia 297zdarzenie compare match 399zegar 383 420 426zintegrowane rodowisko programistyczne 11z cze EuroSCART 425 428 429zmiana

g o no ci 527wielko ci strony 94

znaki 56

roacuted onapi cia odniesienia 284sygna u 240

Kup książkę Poleć książkę

Page 14: Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8 AVR. Ukäady peryferyjne Rejestry dost pu do pami ci RAM .....513 Rejestr adresu

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 49

Zanim co wy wietlimy na LCD musimy pozna w jaki sposoacuteb s generowane znakiSterownik LCD zawiera w sobie niezale nie od typu u ytej matrycy 80 bajtoacutew pami ciDDRAM (ang Display Data RAM) Je li zastosowana matryca wy wietla mniejszliczb znakoacutew to cz komoacuterek pami ci jest nieu ywana Mo emy je wykorzystado innych celoacutew mdash np jako zwyk pami RAM Mo emy te u y jej do przesu-wania napisoacutew ktoacutere nie mieszcz si na wy wietlaczu Aby mo na by o umie ciznak na w a ciwej pozycji niezb dne jest poznanie organizacji pami ci kontrolera W za-le no ci od u ytej matrycy pami ta jest zorganizowana nast puj co

Dla matryc 16times1 mdash pami jest podzielona na dwa obszary ka dy zawieraj cypo 8 znakoacutew Obszar pierwszy (od lewej) ma adresy 0x00 do 0x07 a obszar drugi(prawy) adresy 0x40 do 0x47 St d te gdy wy wietla si tekst przekraczaj cygranic obszaroacutew nale y zadba aby poszczegoacutelne litery trafi y pod w a ciweadresy

Dla matryc 20times1 mdash adresy 0x00 do 0x13

Dla matryc 16times2 mdash adres pierwszej linii zaczyna si od 0x00 do 0x0f adresdrugiej linii od 0x40 do 0x4f

Dla matryc 20times2 mdash adresy pierwszej linii to 0x00 do 0x13 a drugiej 0x40 do 0x53

Dla matryc 40times2 mdash adresy pierwszej linii to 0x00 do 0x27 drugiej linii 0x40do 0x67

Dla matryc 20times4 mdash adresy pierwszej linii to 0x00 do 0x13 drugiej 0x40 do 0x53trzeciej 0x14 do 0x27 a czwartej 0x54 do 0x67

Jak wida w niektoacuterych typach wy wietlaczy po ka dej linii zostaje od kilku do kil-kunastu bajtoacutew ktoacuterych zawarto nie jest wy wietlana Ma to pewn zalet mdash mo-emy do pami ci modu u wpisywa teksty d u sze ni s wy wietlane na ekranie co

u atwia przewijanie tekstu Niestety ma to te pewn wad mdash funkcje wy wietlaj ceco na ekranie musz bdquowiedzie rdquo jak organizacj ma matryca W przeciwnym przy-padku nie ma mo liwo ci prawid owego wyliczenia adresu komoacuterki do ktoacuterej ma od-by si zapis

W dalszej cz ci rozdzia u zostanie wykorzystany modu LCD o organizacji 16times2(ale mo na te bez problemu wykorzysta dowolny inny)

Zanim b dzie mo na co wy wietli na ekranie modu musi zosta zainicjalizowanyW trakcie inicjalizacji ustawiane s podstawowe parametry pracy sterownika LCD mdashorganizacja matrycy (liczba linii) wielko czcionki (5times8 lub 8times11 pikseli) Wielkoczcionki zale y od typu pod czonej matrycy LCD Dla konkretnego modu u LCDtylko jedna z tych warto ci b dzie poprawna Oproacutecz inicjalizacji modu u nale y tak-e poprawnie ustawi stan pinoacutew IO wykorzystywanych do pod czenia modu u LCD

Wi kszo pracy zwi zanej z inicjalizacj modu u LCD odbieraniem i wysy aniemdo niego danych wykonuje biblioteka Joerga Wunscha Dostarcza ona niskopozio-mowe funkcje umo liwiaj ce komunikacj ze sterownikiem hd44780 i innymi kom-patybilnymi z nim sterownikami Wystarczy e do aplikacji w ktoacuterej planujemy wy-korzysta taki modu do czymy plik hd44780c oraz plik nag oacutewkowy hd44780h

Kup książkę Poleć książkę

50 AVR Uk ady peryferyjne

Oba pliki bdquozak adaj rdquo e istnieje plik nag oacutewkowy definesh zawieraj cy podstawo-we definicje zwi zane ze sposobem pod czenia modu u LCD z mikrokontroleremNa pocz tku nale y okre li ktoacutere linie IO zosta y wykorzystane do pod czenia modu u

define HD44780_RS A 4define HD44780_RW A 5define HD44780_E A 6define HD44780_D4 A 0

W powy szym przyk adzie do kolejnych linii portu A (A4 ndash A6) zosta y pod czonesygna y RS RW i E modu u natomiast do linii A0 ndash A3 linie D4 ndash D7 modu u LCD Wa nejest aby linie danych czy z pinami IO w kolejno ci rosn cej Biblioteka wykorzy-stuje do transmisji danych pomi dzy modu em a mikrokontrolerem tylko 4 linie danychmdash dzi ki temu mo emy zmniejszy liczb po cze a zwolnione linie IO wykorzystado innych celoacutew W pliku wyst puje jeszcze jedna definicja

define USE_BUSY_BIT 1

Okre la ona e biblioteka b dzie u ywa flagi Busy modu u LCD mdash umo liwia touzyskanie optymalnej szybko ci wspoacute dzia ania z modu em Zako czenie realizacjibie cej operacji modu sygnalizuje zmian stanu tej flagi co umo liwia niezw ocznewys anie kolejnej komendy Je li nie u ywamy flagi Busy program musi generowamaksymalne zalecane w nocie katalogowej opoacute nienia w efekcie ca a transmisja zwal-nia Po zdefiniowaniu u ywanych pinoacutew w pliku definesh mo emy rozpocz korzy-stanie z biblioteki

W pliku hd44780h s udost pnione prototypy funkcji odpowiedzialnych za wspoacute -prac z modu em LCD

Funkcje bibliotecznePodstaw modu u stanowi dwie funkcje umo liwiaj ce odpowiednio wys anie da-nych do modu u oraz ich odczytanie

void hd44780_outbyte(uint8_t b uint8_t rs)uint8_t hd44780_inbyte(uint8_t rs)

Obie funkcje wysy aj odczytuj 8-bitow dan w przypadku wykorzystania tylko4-bitowej szyny danych wysy anie i odczytywanie danych odbywa si w dwoacutech etapachDodatkowo zmienna rs okre la tryb dost pu W przypadku wysy ania danych do modu urs = 0 powoduje e dane zostan wys ane do rejestru komend a je li rs = 1 dane trafido rejestru danych Przy odczycie jest podobnie z tym e dla rs = 0 jest odczytywanaflaga Busy i rejestr AC (ang Address Counter)

Kolejna funkcja odpowiada za oczekiwanie na gotowo modu uvoid hd44780_wait_ready(bool islong)

W przypadku gdy w pliku definesh symbol USE_BUSY_FLAG ma warto 1 parametrislong jest ignorowany a optymalizator kompilatora usuwa go gdy nie jest on wy-korzystywany przez funkcj Kiedy warto USE_BUSY_FLAG jest roacute na od 1 parametr

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 51

ten okre la d ugo opoacute nienia Je li jest roacute na od 0 opoacute nienie wynosi 152 ms a je-eli jest roacutewna 0 opoacute nienie wynosi 37 s Poniewa lepiej jest u ywa flagi Busy

mo emy ten parametr ignorowa

Powy sze trzy funkcje wystarcz do komunikacji z modu em dla wygody zdefiniowanojednak kolejne Funkcje hd44780_outcmd(n) i hd44780_incmd() umo liwiaj odpowiedniowys anie polecenia do rejestru komend kontrolera lub odczytanie bitu Busy i licznikaAC Dwie kolejne mdash hd44780_outdata(n) oraz hd44780_indata() mdash umo liwiaj zapisi odczytanie rejestru danych

Oproacutecz funkcji odpowiedzialnych za komunikacj z modu em LCD zdefiniowano tak efunkcj przeprowadzaj c podstawow inicjalizacj modu u hd44780_init(void) orazfunkcj hd44780_powerdown(void) ustawiaj c wszystkie linie u yte do komunikacjiw stan 0 co umo liwia bezpieczne od czenie zasilania od modu u LCD W przypadkupozostawienia ktoacuterej z wy ej wymienionych linii w stanie 1 przy od czonym za-silaniu modu u stanowi ona jego zasilanie W efekcie mimo wy czenia modu mo epobiera znaczny pr d

Szerszego omoacutewienia wymaga funkcja hd44780_outcmd(cmd) ktoacutera umo liwia wys a-nie polecenia do rejestru polece sterownika LCD Dla wygody zdefiniowane zosta yroacute ne komendy u atwiaj ce wspoacute prac z modu em LCD Komendy te s przekazy-wane jako argument wywo ania funkcji hd44780_outcmd np

hd44780_outcmd(HD44780_CLR)

powoduje wys anie do sterownika polecenia HD44780_CLR czyszcz cego zawartopami ci DDRAM kontrolera

KomendyFunkcja hd44780_outcmd przyjmuje jako argument predefiniowane makrodefinicjeznacznie u atwiaj ce wspoacute prac z kontrolerem modu u LCD Poni ej zostan onepokroacutetce omoacutewione

HD44780_SHIFT(shift right)Ta makrodefinicja powoduje przesuni cie pozycji wy wietlanego tekstu (shift = 1)o jedn pozycj w lewo (argument right = 0) lub w prawo (argument right = 1)W przypadku gdy shift = 0 przesuwany w lewo lub prawo jest tylko kursor Wysy-aj c wielokrotnie to polecenie uzyskujemy kolejne przesuni cia o jedn pozycj

w lewo lub prawo Polecenie to s u y g oacutewnie do przesuwania tekstu Jednak ze wzgl duna du bezw adno tekstowych modu oacutew LCD nie nale y przesuwa liter cz ciej niok raz na sekund mdash cz stsze przesuwanie daje bardzo nieprzyjemne efekty wizual-ne Ka dy bufor linii jest bdquozawijanyrdquo to znaczy e po ostatnim znaku z prawej jestwy wietlany pierwszy znak z lewej i odwrotnie Nale y pami ta e d ugo buforajest sta a dla danego modelu matrycy Np dla modu oacutew 16times2 bufor jednej linii wyno-si dok adnie 40 bajtoacutew z czego 16 jest jednorazowo wy wietlanych Poni szy kodcyklicznie przewija wy wietlany tekst w lewo

lcd_puttext_P(PSTR(Test bufora i przewijania tekstunTen tekst przewija sie w lewo))while(1)

Kup książkę Poleć książkę

52 AVR Uk ady peryferyjne

hd44780_outcmd(HD44780_SHIFT(10)) _delay_ms(700)

HD44780_FNSET(if8bit twoline font5x10)Polecenie to wybiera typ interfejsu mdash 8-bitowy je li warto parametru if8bit jestroacutewna 1 lub 4-bitowy je li jest roacutewna 0 Typ interfejsu musi odpowiada sposobowipo czenia modu u z mikrokontrolerem Parametr twoline okre la czy pod czonamatryca LCD ma jedn lini znakoacutew czy dwie Matryce ktoacutere maj 4 linie tekstu straktowane przez kontroler jako matryce dwuliniowe mdash parametr twoline powinienmie warto 1 Je li dla matrycy zawieraj cej dwie lub wi cej linii ustawimy go na 0to wy wietlana b dzie tylko jedna linia (w przypadku matryc dwuliniowych goacuterna)a w przypadku matryc 4-liniowych b d wy wietlane dwie linie rozdzielone lini pust

Ostatni parametr okre la typ u ywanego generatora znakoacutew Powinien on odpowiadau ytej w module matrycy zwykle wi c jego warto wynosi 0

HD44780_DISPCTL(disp cursor blink)Ustawia roacute ne parametry pracy matrycy Je li parametr disp ma warto 1 to matrycajest w czona (wy wietla zawarto DDRAM) a je li 0 to matryca jest wy czonalecz stan pami ci DDRAM nie ulega zmianie Np kod

while(1) hd44780_outcmd(HD44780_DISPCTL(011)) _delay_ms(700) hd44780_outcmd(HD44780_DISPCTL(111)) _delay_ms(700)

powoduje naprzemienne w czanie i wy czanie matrycy w efekcie wy wietlany tekstmruga

Parametr cursor okre la czy sprz towo wy wietlany kursor ma by widoczny (war-to parametru 1) czy niewidoczny (warto parametru 0) Je li kursor jest widocznyto dodatkowo mo emy okre li czy ma miga (warto parametru blink roacutewna 1)czy nie (blink = 0) Je li kursor jest widoczny i nie miga jest wy wietlany w postacipoziomej kreski Wy wietlanie kursora mo e by u yteczne w sytuacji kiedy u yt-kownik wprowadza jakie dane W pozosta ych sytuacjach kursor mo emy wy czy

HD44780_ENTMODE(inc shift)Okre la sposoacuteb wprowadzania danych do pami ci Je li parametr inc ma warto 1 topo ka dej operacji zapisuodczytu adres pami ci jest automatycznie zwi kszany o je-den co przy piesza operacj zapisuodczytu kolejnych znakoacutew Je li warto inc jestroacutewna 0 to adres jest automatycznie zmniejszany o 1 Dodatkowo parametr shiftokre la czy wy wietlany obraz ma by automatycznie przesuwany tak aby wy wie-tla ostatnio wprowadzony znak (shift = 1) lub go nie wy wietla (shift = 0)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 53

HD44780_CLRPowoduje wyczyszczenie (wype nienie znakami o kodzie 32) ca ej zawarto ci pami ciDDRAM Jednocze nie kursor wraca do pozycji pierwszej (pierwsza linia pierwszyznak)

Niewy wietlane bajty pami ci DDRAM tak e s kasowane Je li s one u ywanedo przechowywania zmiennych programu to przed operacj kasowania nale y jeskopiowa w bezpieczne miejsce W przeciwnym przypadku zostan utracone

Wska nik adresu do pami ci DDRAM jest ustawiany na 0 zerowane jest tak e prze-suni cie

HD44780_HOMEPowoduje powroacutet kursora do pozycji pocz tkowej mdash pierwsza linia pierwszy znakWska nik adresu do pami ci DDRAM w efekcie zawiera 0 zerowane jest roacutewnieprzesuni cie wy wietlania znakoacutew w efekcie s one wy wietlane od pozycji 0

HD44780_DDADDR(addr)Ustawia nast pny adres zapisuodczytu w pami ci DDRAM na addr Tylko 7 bitoacutewargumentu addr jest branych pod uwag w zwi zku z czym mo na zaadresowa mak-symalnie 128 bajtoacutew pami ci (z czego sterownik ma tylko 80 pozosta e lokacje snieu ywane)

HD44780_CGADDR(addr)Ustawia nast pn operacj odczytuzapisu w pami ci CGRAM na addr Pod uwagbranych jest tylko 6 bitoacutew zmiennej addr w efekcie mo na zaadresowa maksymalnie64 bajty pami ci CGRAM

Przedstawione powy ej funkcje zapewniaj jedynie podstawow komunikacj z mo-du em LCD Potrzebujemy jednak ci gle funkcji odpowiedzialnej za jego inicjalizacjmdash funkcja biblioteczna przeprowadza ten proces tylko w podstawowym zakresie musi-my jeszcze zadba o w a ciwe ustawienie parametroacutew zwi zane z posiadan matryc Napiszmy wi c w asne rozwini cie funkcji inicjalizacyjnej

void lcd_init() hd44780_init() Podstawowa inicjalizacja modu u hd44780_outcmd(HD44780_CLR) Wyczy pami DDRAM hd44780_wait_ready(1000) hd44780_outcmd(HD44780_ENTMODE(1 0)) Tryb autoinkrementacji AC hd44780_wait_ready(1000) hd44780_outcmd(HD44780_DISPCTL(1 0 0)) W cz wy wietlacz wy cz kursor hd44780_wait_ready(1000)

Zauwa e po wys aniu ka dego polecenia do modu u jest wywo ywana funkcjahd44780_wait_ready(1000) odpowiedzialna za oczekiwanie a realizacja wys anego po-lecenia dobiegnie ko ca Jest to niezb dne gdy do czasu uko czenia bie cej

Kup książkę Poleć książkę

54 AVR Uk ady peryferyjne

operacji dalsze polecenia s ignorowane Jako argument podany jest parametr 1000mdash jest on bez znaczenia nasza biblioteka korzysta z flagi Busy i po prostu go ignorujePo wykonaniu powy szej funkcji modu LCD jest poprawnie zainicjalizowany a jegopami jest wyczyszczona (zawiera bajty 0x20) i w efekcie modu nic nie wy wietlaOd tej chwili mo emy wysy a znaki do wy wietlenia

Po wykonaniu inicjalizacji ekran mo e pozosta czysty lub wy wietla ca kowiciewype nione kwadraty (wszystkie piksele w czone) Je li po inicjalizacji wszystkiepiksele s w czone nale y nieco zmniejszy kontrast

Aby sobie u atwi to zadanie zdefiniujmy funkcj wysy aj c do modu u jeden znakvoid lcd_putchar(char c) static bool second_nl_seen static uint8_t line=0

if ((second_nl_seen) ampamp (c = n)ampamp(line==0)) Odebrano pierwszy znak hd44780_wait_ready(40) hd44780_outcmd(HD44780_CLR) hd44780_wait_ready(1600) second_nl_seen=false if (c == n) if (line==0) line++ hd44780_outcmd(HD44780_DDADDR(64)) Adres pierwszego znaku drugiej linii hd44780_wait_ready(1000) else second_nl_seen=true line=0 else hd44780_outdata(c) hd44780_wait_ready(40)

Funkcja ta ze wzgl du na skomplikowane adresowanie pami ci DDRAM jest zale naod konkretnego modelu modu u LCD B dzie prawid owo wspoacute pracowa z modu a-mi 2times16 2times20 i 2times40 znakoacutew W przypadku innych modu oacutew pozycje niektoacuterychznakoacutew mog by nieprawid owe

Mo emy ju wy wietla na LCD pojedyncze znaki czas na wy wietlanie tekstu Po-niewa teksty jako sta e dla zaoszcz dzenia cennej pami ci RAM przechowuje si za-zwyczaj w pami ci FLASH zdefiniujmy funkcj odczytuj c podany a cuch zna-kowy z pami ci FLASH a nast pnie umieszczaj c go na LCD

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 55

void lcd_puttext_P(prog_char txt) char ch while((ch=pgm_read_byte(txt))) lcd_putchar(ch) txt++

Powy sza funkcja wysy a kolejne znaki odczytane z pami ci FLASH na LCD za po-moc funkcji LCD_putchar Po napotkaniu znaku ko ca a cucha (0 nul) przerywa swojedzia anie

Pozostaje nam przetestowa dzia anie przedstawionych funkcjiint main() lcd_init() lcd_puttext_P(PSTR(Test LCDnDruga linia)) while(1)

Na ekranie modu u LCD powinien wy wietli si napisTest LCDDruga linia

Je li na LCD nic nie widzimy to w pierwszej kolejno ci powinni my sprawdzi kon-trast zmieniaj c napi cie na pinie Vee modu u LCD

Warto zdefiniowa jeszcze funkcj ustawiaj c pozycj od ktoacuterej b dzie wy wietlanynast pny znak

void lcd_goto(uint8_t x uint8_t y) hd44780_outcmd(HD44780_DDADDR(0x40y+x)) hd44780_wait_ready(1000)

Funkcja ta przyjmuje dwa parametry x i y okre laj ce pozycj na ktoacuterej zostaniewy wietlony nast pny znak wys any z mikrokontrolera do modu u LCD Dzi ki temuz atwo ci mo emy uaktualnia zawarto LCD bez konieczno ci ponownego prze-sy ania wszystkich danych Funkcja ta jest zale na od typu zastosowanego modu u

Ostatni funkcj jest funkcja umo liwiaj ca czyszczenie zawarto ci pami ci modu uOdpowiedzialne za to jest proste polecenie wysy ane do sterownika

void lcd_cls() hd44780_outcmd(HD44780_CLR) hd44780_wait_ready(false)

Oproacutecz czyszczenia zawarto ci pami ci modu u powoduje ono ustawienie kursoraw punkcie (00)

Kup książkę Poleć książkę

56 AVR Uk ady peryferyjne

Definiowanie w asnych znakoacutewUk ad HD44780 jest wyposa ony w 64 bajty pami ci CGRAM (ang Character Ge-nerator RAM) ktoacutera mo e przechowywa mapy bitowe 8 znakoacutew o matrycy 5times8 pikselilub 4 znakoacutew o matrycy 5times10 pikseli Przyk ad definicji znaku na matrycy 5times8 poka-zano na rysunku 223

Rysunek 223Przyk ad definicji w asnego znakuw pami ci CGRAM Znak rysujemyna matrycy 5times8 bitoacutew polazaciemnione odpowiadaj warto ci 1pola bia e warto ci 0 Wartowyliczon dla ka dej linii pikseliwpisujemy do pami ci CGRAMsterownika Najstarsze 3 bity ka degobajta (pola szare) s bez znaczeniamdash wy wietlacz pomija jeprzy wy wietlaniu obrazu

1

2

3

4

5

6

7

0 00100 = 4

01110 = 14

11111 = 31

00100 = 4

00100 = 4

00100 = 4

11111 = 31

01110 = 14

Adres Warto

Dost p do tej pami ci jest mo liwy dzi ki wys aniu polecenia ustawiaj cego adreszapisuodczytu pami ci CGRAM Po jego wys aniu wszystkie operacje zapisu i od-czytu dotycz tej pami ci a nie pami ci DDRAM Aby wroacuteci do adresowania pa-mi ci DDRAM nale y wybra jej adres lub dokona operacji wymagaj cej przesu-ni cia kursora

Pami CGRAM jest pami ci ulotn po ponownym w czeniu zasilania definicjeznakoacutew musz by ponownie przes ane przez procesor

Bity o warto ci 1 w definicji znaku odpowiadaj w czonym pikselom bity o warto-ci 0 pikselom wy czonym Najstarsze 3 bity ka dego bajta w pami ci CGRAM s

bez znaczenia mdash te pozycje nie s wy wietlane przez matryc Definiuj c znak nale-y tak e pami ta e ostatnia linia wy wietlana przez matryc (w zale no ci od wiel-

ko ci matrycy znaku linia 8 lub 10) powinna zawiera same zera mdash w tej linii b dziewy wietlany kursor

Najcz ciej matryce LCD pod czone do sterownika HD44780 maj organizacj 5times8czyli jeden znak jest definiowany przez 8 kolejnych bajtoacutew okre laj cych stan po-szczegoacutelnych linii tworz cych znak Stwoacuterzmy funkcj ktoacuterej zadaniem b dzie za a-dowanie definicji znakoacutew z pami ci FLASH mikrokontrolera do pami ci CGRAM

void lcd_defchar_P(uint8_t charno prog_uint8_t chardef) hd44780_outcmd(HD44780_CGADDR(charno8)) hd44780_wait_ready(40) for(uint8_t c=0clt8c++) hd44780_outdata(pgm_read_byte(chardef))

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 57

hd44780_wait_ready(40) chardef++

Funkcja LCD_defchar_P jako argumenty przyjmuje numer definiowanego znaku (0 ndash 7)oraz wska nik do obszaru pami ci FLASH zawieraj cego definicj znaku (obszarten zajmuje 8 nast puj cych po sobie bajtoacutew) Jak widzimy funkcja najpierw ustawiaw a ciwy adres pod ktoacuterym znajdzie si pocz tek definicji znaku w pami ci CGRAMmdash poniewa jeden znak jest opisywany za pomoc 8 bajtoacutew kolejne adresy znakoacutewto kod_znakutimes8 Nast pnie dane opisuj ce znak s adowane z pami ci mikrokontrolerai zapisywane w pami ci CGRAM sterownika Poni szy program ilustruje wykorzy-stanie funkcji LCD_defchar_P

prog_uint8_t char1[8][8]=0000000255 00000025525500000255255255 0000255255255255 00025525525525525500255255255255255255 0255255255255255255255255255255255255255255255

int main() for(uint8_t x=0xlt8x++) lcd_defchar_P(xampchar1[x][0]) Za aduj wzorce znakoacutew lcd_init() for(uint8_t x=0xlt8x++) lcd_putchar(x) Wy wietl znaki o kodach 0 ndash 7 while(1)

W pierwszej linii funkcji main nast puje za adowanie nowych definicji znakoacutew dopami ci CGRAM nast pnie inicjalizowany jest wy wietlacz po czym w pierwszejlinii s wy wietlane znaki o kodach 0 ndash 7 a wi c znaki ktoacuterych definicja zosta aprzes ana z mikrokontrolera

Zauwa e pami CGRAM podobnie jak DDRAM mo emy zapisywa i odczytywaprzed inicjalizacj modu u LCD Proces inicjalizacji jest potrzebny tylko do prawi-d owego wy wietlania na ekranie LCD

Poniewa dane potrzebne do wy wietlenia znaku s na bie co pobierane z pami cipodczas od wie ania matrycy LCD jakiekolwiek zmiany w definicji znaku kiedy jest onwidoczny na LCD poci gaj za sob natychmiastowe zmiany w wy wietlanym obrazieMo na t w a ciwo sterownika wykorzysta do stworzenia prostych animacji

void lcd_box(uint8_t y) hd44780_outcmd(HD44780_CGADDR(0)) Zaczynamy od znaku o kodzie 0 hd44780_wait_ready(40) for(uint8_t c=0cltyc++) Stwoacuterz linie z w czonymi pikselami hd44780_outdata(0xFF) hd44780_wait_ready(40) for(uint8_t c=yclt8c++) Stwoacuterz linie z wy czonymi pikselami hd44780_outdata(0x00) hd44780_wait_ready(40)

Kup książkę Poleć książkę

58 AVR Uk ady peryferyjne

int main() lcd_init() lcd_putchar(0) while(1) for(uint8_t x=0xlt8x++) lcd_box(x) _delay_ms(100) for(int8_t x=7xgt=0x--) lcd_box(x) _delay_ms(100)

Funkcja main wy wietla na LCD tylko jeden znak o kodzie 0 a nast pnie cykliczniezmienia jego definicj w pami ci CGRAM W efekcie posta znaku wy wietlana naekranie ci gle si zmienia

Transakcyjna obs uga LCDPokazana do tej pory obs uga LCD alfanumerycznego mia a pewne wady Jak wiemyoperacje odwo uj ce si do kontrolera LCD s niezwykle wolne cykl odczytuzapisudowolnego rejestru kontrolera trwa co najmniej 1600 ns co dla MCU taktowanegozegarem 32 MHz przek ada si na czas wykonania oko o 52 instrukcji asemblera Cogorsza wi kszo komend realizowanych przez kontroler jest wykonywana w czasieoko o 37 s co przek ada si na tysi ce zmarnowanych taktoacutew MCU St d te jaki-kolwiek zapisodczyt LCD to z perspektywy programu straszne marnotrawstwo czasu

Problem ten dotyczy ka dego urz dzenia IO ktoacutere dzia a wolniej ni procesor W takiejsytuacji warto napisa pewn warstw po redni mdash sterownik mdash ktoacuterego zada-niem b dzie buforowanie da dost pu do urz dzenia i rozstrzyganie konfliktoacutewdzi ki czemu roacute ne cz ci programu b d bdquomia y wra enierdquo e maj wy czny do-st p do urz dzenia

Pokazane wcze niej funkcje obs ugi LCD maj jeszcze jedn wad mdash nie s wspoacute bie -ne czyli nie mo na ich wykonywa jednocze nie w kilku miejscach programu w tymw szczegoacutelno ci w programie g oacutewnym i w funkcjach obs ugi przerwa W wielu przy-padkach ta wada jest bez znaczenia jednak czasami jest uci liwa mdash dla przyk adugdy na wy wietlany tekst chcieliby my na o y inne informacje np o dacie lub godzi-nie Oczywi cie wy wietlanie mo na zorganizowa tak aby nie by o potrzeby pisaniawspoacute bie nego kodu np poprzez zastosowanie bufora pami ci VRAM kontrolera LCDRodzi to jednak kolejne problemy i jest ma o eleganckie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 59

Zastanoacutewmy si w jaki sposoacuteb najlepiej jednocze nie rozwi za problem wolnegodost pu do urz dzenia i wspoacute bie no ci kodu Rozwi zaniem mo e by wprowadze-nie tzw transakcji Transakcj nazywamy zbioacuter operacji tworz cych pewn ca-o To co wyroacute nia tak wykonywany zestaw operacji to atomowo spoacutejno

izolacja i trwa o Pod tymi terminami kryje si istota wykonywanej operacji Ato-mowo transakcji zapewnia e jest ona wykonywana w sposoacuteb niepodzielny co gwa-rantuje nam prawid ow wspoacute prac z danym urz dzeniem IO w tym przypadku kon-trolerem LCD Wa na dla nas jest tak e izolacja mdash dzi ki temu inne operacje na LCD(inne transakcje) nie b d mia y wp ywu na wynik aktualnie wykonywanej transakcjimdash nie b d zak oacuteca y jej wykonania z drugiej strony nasza transakcja nie zak oacuteciwykonania innych Trwa o z kolei zagwarantuje nam e je li sterownik potwierdziwykonanie transakcji to znaczy e efekt jej dzia ania jest wy wietlony na LCD Tacecha nie jest nam a tak potrzebna mdash jest ona wydawa oby si oczywista Niemniej jestto pewna gwarancja e ca a operacja przebieg a poprawnie i w efekcie LCD znajdujesi w okre lonym przez nas stanie Tyle teorii przejd my do praktyki

Kody poni szego przyk adu znajduj si w katalogu PrzykladyLCD-alfaLCD-transact

Aby zapewni transakcyjny dost p do LCD musimy stworzy pewne struktury danychktoacuterych zadaniem b dzie przechowywanie informacji o operacjach sk adaj cych sina transakcje i stanie ich wykonania W tym celu pos u ymy si wiadomo ciami z roz-dzia u 5 bdquoJak uporz dkowa chaos czyli z o one typy danych i listyrdquo Do przecho-wywania oczekuj cych transakcji pos u ymy si buforem pier cieniowym zanimjednak go zaimplementujemy zastanoacutewmy si jak powinna wygl da struktura prze-chowuj ca informacje o transakcji Struktura ta powinna zawiera co najmniej

pole danych (data) z informacjami ktoacutere maj by przes ane do kontrolera LCD

pole okre laj ce liczb danych do wys ania (len)

pole okre laj ce realizowane polecenie dla LCD (cmd) mdash pole to pos u yprogramowi sterownika do w a ciwej interpretacji danych znajduj cych siw polu data

kilka poacutel kontrolnych przechowuj cych informacje potrzebne do realizacjisamej transakcji Jedno z nich mdash Ready mdash b dzie przyjmowa warto trueje li dana transakcja zosta a zrealizowana lub false w przeciwnym przypadkuZnaczenie drugiego pola mdash SelfDel mdash mo e wydawa si nieco enigmatycznepole to okre la czy pami przydzielona dla transakcji ma by zwolnionaw sterowniku LCD (warto true) czy te zostanie zwolniona w programie(warto false)

Oto jak mo e wygl da struktura definiuj ca transakcj typedef struct volatile bool Ready 1 true je li transakcja zosta a zrealizowana bool SelfDel 1 true je li pami przydzielona transakcji ma zosta zwolniona LCD_Cmd cmd 2 Polecenie do zrealizowania uint8_t len 6 D ugo polecenia

Kup książkę Poleć książkę

60 AVR Uk ady peryferyjne

unsigned 0 Wyroacutewnanie do granicy bajta uint8_t data[] Dane transakcji LCD_trans

Nale y zwroacuteci uwag na poleunsigned 0

Nie definiuje ono adnego pola struktury ale jedynie informuje kompilator e kolejnepole (w naszym przyk adzie o nazwie data) ma by wyroacutewnane do granicy bajta mdashdzi ki temu dost p do kolejnego pola b dzie odbywa si szybciej Z kolei samo poledata jest zadeklarowane jako tzw typ niekompletny

Typ niekompletny (ang incomplete type) to typ ktoacuterego rozmiaru nie da si okre li

W pokazanym przyk adzie rozmiaru pola data nie da si okre li gdy zosta on za-deklarowany jako typ tablicowy z tym e nie podano wielko ci tablicy Wielko ci niepodano gdy na etapie deklaracji struktury nie wiemy jakiej wielko ci dane b d w niejprzechowywane Tego typu deklaracja ma bardzo powa ne konsekwencje mdash skorowielko ci pola data nie da si okre li to jaki b dzie wynik dzia ania operatora sizeof(LCD_trans) Kompilator stara si jako wybrn z tej sytuacji w zwi zku z czym

zwroacuteci wielko struktury ale tak jakby pole data w ogoacutele nie istnia o mdash jego roz-miar b dzie wynosi 0 W ramach wiczenia zastanoacutew si ile bajtoacutew pami ci b dziezajmowa a struktura LCD_trans

Skoro dysponujemy ju struktur przechowuj c poszczegoacutelne transakcje pora nastworzenie obiektu przechowuj cego kolekcj transakcji Dodanie kolejnej strukturyb dzie polega o na dodaniu jej do takiego obiektu z drugiej strony program sterownikaLCD b dzie moacuteg z tej kolekcji pobiera kolejne transakcje do realizacji Opis ten przy-pomina opis dzia ania bufora pier cieniowego mdash z jednym wyj tkiem mdash po zape nie-niu ca ego bufora nie b dziemy usuwa niezrealizowanych transakcji lecz zabloku-jemy dodawanie kolejnych W tym celu pos u ymy si definicj nast pnej struktury

typedef struct LCD_trans elements[LCD_MAXTRANS] Wska niki do transakcji uint8_t Beg Pierwszy element bufora uint8_t Count Liczba elementoacutew w buforze CircBuffer

Struktura ta zawiera deklaracj tablicy wska nikoacutew na transakcje (pole elements)Poniewa jest to tablica musimy zna liczb jej elementoacutew mdash jest ona zadeklarowanaw sta ej LCD_MAXTRANS

define LCD_MAXTRANS 10 Maksymalna liczba pami tanych transakcji

Do realizacji bufora s potrzebne jeszcze dwa pola Beg wskazuj ce na pierwsztransakcj w buforze oraz pole Count okre laj ce liczb transakcji znajduj cych siw buforze Je li Count == 0 to znaczy e w buforze nie ma adnych oczekuj cychtransakcji a je li Count == LCD_MAXTRANS to znaczy e bufor jest pe ny i nie mo na

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 61

dodawa do niego kolejnych transakcji W a ciwo t wykorzystuj dwie zdefiniowanew pliku LCD_transc funkcje

static inline bool cbIsFull(CircBuffer cb) return cb-gtCount == LCD_MAXTRANS

static inline bool cbIsEmpty(CircBuffer cb) return cb-gtCount == 0

Jak pami tamy w przypadku funkcji modyfikatory static inline powoduj e danafunkcja nie b dzie istnie jako samodzielna lecz w ka dym miejscu w ktoacuterym jestwywo ywana jest wstawiany raczej jej kod a nie wywo anie Ma to znaczenie dlakroacutetkich funkcji (a wi c takich jak pokazane powy ej) dla ktoacuterych koszty wywo anias zazwyczaj wi ksze ni koszty umieszczenia cia a funkcji w miejscu jej wywo aniaTego typu funkcje zachowuj si w sposoacuteb zbli ony do makrodefinicji (z tym e re-spektuj wszystkie regu y j zyka C w szczegoacutelno ci kolejno operatoroacutew czy kon-trol typoacutew)

Takie funkcje jako argument pobieraj adres bufora na ktoacuterym maj operowa W na-szym przypadku bufor jest zdefiniowany nast puj co

static CircBuffer LCD_TransBuffer Bufor na transakcje

Nale y zauwa y e jest on zdefiniowany jako struktura globalna z modyfikatoremstatic Modyfikator ten ogranicza zasi g widoczno ci zmiennej LCD_TransBuffer dopliku w ktoacuterym zmienna ta zosta a zdefiniowana (w tym przypadku modyfikator staticjest niejako przeciwie stwem modyfikatora extern) Dzia anie to ma jedynie znaczeniekosmetyczne mdash uniemo liwia odwo anie si do bufora za pomoc funkcji ktoacutere niezosta y zdefiniowane w miejscu jego definicji Oproacutecz funkcji umo liwiaj cych okre-lenie stanu bufora potrzebne s jeszcze funkcje umo liwiaj ce dodanie i pobranie trans-

akcji Pierwsz funkcj b dzie funkcja dodaj ca transakcj do buforabool cbAdd(CircBuffer cb LCD_trans elem) ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsFull(cb)) return false Czy jest miejsce w kolejce uint8_t end = (cb-gtBeg + cb-gtCount) LCD_MAXTRANS cb-gtelements[end] = elem Dodaj transakcj ++cb-gtCount Liczba elementoacutew w buforze return true Wszystko OK

Funkcja ta dodaje transakcj (zmienna elem) do bufora ko owego Zanim transakcjazostanie dodana sprawdzane jest czy w buforze jest miejsce mdash je li nie funkcjazwroacuteci false Je li dodanie jest mo liwe warto licznika okre laj cego liczb trans-akcji przechowywana w buforze (Count) zwi ksza si o jeden Warto zastanowi si te dlaczego praktycznie ca e cia o tej funkcji jest zamkni te w sekcji atomowej (ATOMIC_BLOCK) Jedn z cech naszego sterownika ma by mo liwo wspoacute bie nego dost pu

Kup książkę Poleć książkę

62 AVR Uk ady peryferyjne

do LCD mdash to znaczy e danie np zapisu do LCD mo e wyst pi zaroacutewno w g oacutewnejp tli programu jak i asynchronicznie w przerwaniu St d te wynika e funkcja do-daj ca transakcj musi by napisana w sposoacuteb zapewniaj cy jej poprawn prac w sytu-acji gdy zostanie ona przerwana i ponownie wywo ana przed zako czeniem dzia aniajej poprzedniej instancji Umieszczenie cia a tej funkcji w sekcji atomowej nam to za-pewnia mdash dzi ki temu bufor transakcji zawsze b dzie spoacutejny Dla zaspokojenia cie-kawo ci warto usun sekcj atomow i sprawdzi jak wtedy b dzie zachowywa si tafunkcja i jak wp ynie to na spoacutejno przechowywanych danych

Drug niezb dn funkcj jest funkcja odczytuj ca bufor transakcji i zwracaj ca trans-akcj do zrealizowania (lub NULL je li adnej transakcji nie ma w buforze)

LCD_trans cbRead(CircBuffer cb) LCD_trans elem ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsEmpty(cb)) return NULL Bufor pusty nie mo na zwroacuteci elementu elem = cb-gtelements[cb-gtBeg] cb-gtBeg = (cb-gtBeg + 1) LCD_MAXTRANS -- cb-gtCount Zmniejszamy liczb elementoacutew pozosta ych w buforze return elem

Funkcja ta jest bardzo podobna do poprzedniej mdash najpierw sprawdza czy bufor za-wiera jak oczekuj c transakcj (cbIsEmpty(cb)) je li tak to zwraca adres opisuj -cej j struktury i zmniejsza liczb transakcji oczekuj cych (pole Count) W ten sposoacutebmamy zrealizowan ca funkcjonalno zwi zan z obs ug bufora pier cieniowegoPokazane funkcje s uniwersalne i z bardzo podobnych (lub wr cz tych samych) b -dziemy korzysta w kolejnych rozdzia ach w kontek cie np obs ugi transakcji zwi -zanych z interfejsami szeregowymi

Pora przej do samego sterownika LCD Jego zadaniem b dzie sprawdzenie czyw buforze oczekuj jakie transakcje do realizacji a je li tak to ich wykonanie Ponie-wa dane do LCD mog by wysy ane co okre lony minimalny czas znacznie d u -szy ni czas jakiego na to zadanie potrzebuje mikrokontroler do wysy ania kolejnychpaczek danych pos u ymy si timerem Timer b dzie generowa przerwanie nadmiaru(TCD0_OVF_vect) ktoacutere b dzie wyznacza o tempo w jakim kolejne porcje danych b -d trafia y do LCD Z noty katalogowej kontrolera wynika e minimalny czas trwa-nia wysokiego stanu sygna u Enable to 230 ns a okres tego sygna u nie powinien bykroacutetszy ni 500 ns Poniewa nasz dost p do LCD odbywa si w sposoacuteb nieblokuj cyMCU wi c szybko wysy ania danych do LCD jest bez znaczenia St d te w poka-zanym przyk adzie przyj to e dane b d wysy ane co 4 s co okre la sta a

define LCD_ACCESSTIME 0000004

Poniewa komunikacja z LCD odbywa si w sposoacuteb nieblokuj cy nie zale y nam tena czasie (i tak w stosunku do czasu od wie ania samego LCD jest on bardzo kroacutetki)w efekcie nie ma potrzeby odczytywania flagi busy kontrolera Dzi ki temu w cz ciprzypadkoacutew mo emy w ogoacutele zrezygnowa z sygna u wyboru RW i wymusi jego sta y

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 63

poziom logiczny umo liwiaj cy zapis do LCD Dzi ki temu mo na zaoszcz dzi do-datkowy pin IO1

Ca a logika naszego sterownika jest zawarta w funkcji obs ugi przerwania przepe nieniatimera (TCD0_OVF_vect) Poniewa LCD jest po czony z MCU w trybie 4-bitowym(dla zaoszcz dzenia liczby wykorzystanych pinoacutew IO) kolejne 8-bitowe dane muszby podzielone na dwie tetrady i wys ane do LCD w kolejno ci starszam odsza tetradaInformacja o aktualnie wysy anych danych jest umieszczona w zmiennej trans o typie

static struct uint8_t pos 6 Pozycja w polu danych aktualnej transakcji uint8_t nibble 1 Ktoacutera tetrada jest wysy ana seq

Dlaczego tak Dzi ki wykorzystaniu struktury i poacutel bitowych mo na zaoszcz dzi je-den bajt pami ci SRAM Ze wzgl du na wielko pami ci obs ugiwanej przez kon-troler LCD mo emy by pewni e transakcje zawieraj ce wi cej ni 63 bajty s ra-czej nierealne (nie mia yby wi kszego sensu) St d te do przechowywania informacjio aktualnie wysy anym bajcie danych wystarczy 6 bitoacutew mdash tyle samo zosta o wyko-rzystanych do okre lenia d ugo ci pola danych transakcji w strukturze LCD_trans Zaosz-cz dzony bit mo na po wi ci na flag nibble okre laj c ktoacutera tetrada (m odszastarsza)jest wysy ana Bez poacutel bitowych flaga ta zaj aby dodatkowy bajt pami ci

Przejd my do implementacji sterownika Pierwsz rzecz jak nale y sprawdzi jestto czy w buforze czeka jaka transakcja do zrealizowania Odpowiedzialny za to jestfragment kodu obs ugi przerwania nadmiaru timera

if(trans == NULL) Nic do zrobienia sprawd my czy jaka transakcja oczekuje trans=cbRead(ampLCD_TransBuffer) Czy jest jaka oczekuj ca transakcja seqpos=0 seqnibble=0 if(trans == NULL) TCD0_CTRLA=TC_CLKSEL_OFF_gc Nie ma adnych transakcji mdash wy cz timer

W przypadku gdy adna transakcja nie oczekuje na realizacj timer jest wy czanymdash dzi ki temu nie b d zg aszane kolejne przerwania przepe nienia i MCU nie b -dzie traci czasu na ich obs ug Co prawda wynikaj cy z tego zysk czasowy jest mar-ginalny lecz ma to istotniejsz konsekwencj mdash w przypadku usypiania MCU zb d-ne przerwanie timera nie b dzie niepotrzebnie wybudza o procesora W takiej sytuacjiponowne w czenie timera nast pi dopiero w funkcji dodaj cej transakcj do kolejkimdash a wi c w sytuacji gdy mamy pewno e istnieje oczekuj ca transakcja

Druga cz funkcji obs ugi przerwania jest zwi zana z realizacj samej transakcjiW pokazanym przyk adzie zaimplementowano tylko jeden typ transakcji mdash daniezapisu a cucha tekstowego pod wskazany adres VRAM (na okre lonej pozycji LCD)Je li zajdzie taka potrzeba programista mo e zaimplementowa inne polecenia i doda

1 Warto zauwa y e w bdquoklasycznejrdquo obs udze LCD te nie musimy czyta stanu flagi busy zamiast tego

wystarczy wprowadza p tle opoacute niaj ce Jednak poniewa taka obs uga blokuje MCU nie jest onazalecana Wady tej nie ma dost p transakcyjny co jest jego dodatkow zalet

Kup książkę Poleć książkę

64 AVR Uk ady peryferyjne

kod odpowiedzialny za ich obs ug Zauwa my e ka da transakcja musi zawieraadres pocz tku pami ci wideo od ktoacuterego b dzie zapisywany tekst Dzieje si takdlatego e transakcja wykonana wcze niej mo e ustawi wska nik zapisu na dowolnejkomoacuterce pami ci W efekcie tekst z kolejnej transakcji by by wy wietlany od komoacuterkina ktoacuterej zako czy si zapis poprzedniej transakcji Takie dzia anie oczywi cie jestniedopuszczalne st d te ka dy zapis do pami ci wideo poprzedza ustawienie rejestruindeksowego Problem ten mo na rozwi za tak e w inny sposoacuteb mdash poprzez wpro-wadzenie tzw uchwytoacutew (ang handlers) ktoacutere zawiera yby stan kontrolera LCDNiemniej to rozwi zanie dodatkowo komplikowa oby nasz sterownik Struktura danych(zawartych w polu data) ma wi c nast puj cy format

bajt nr 0 zawiera warto pozycji od ktoacuterej nale y dokonywa zapisu pami ciwideo mdash jest to warto przesy ana do rejestru okre laj cego adres zapisu

kolejne bajty zawieraj a cuch znakowy ktoacutery nale y umie ci w pami ciCGRAM

Poniewa bajt nr 0 zawsze zawiera warto wpisywan do rejestroacutew steruj cych kon-trolera podczas jego wysy ania jest ustawiana linia RS sygnalizuj ca zapis do rejestruPodczas wysy ania kolejnych bajtoacutew linia ta jest zerowana w zwi zku z czym zapisodbywa si do pami ci CGRAM

Kod obs uguj cy transakcj wygl da nast puj coif(trans) Jest transakcja do zrealizowania uint8_t dat=trans-gtdata[seqpos] if(seqnibble == 0) datgtgt=4 To trzeba zmieni je li linie danych nie s po czone z pinami 0 ndash 3 portu IO hd44780_outnibble_nowait(dat amp 0x0F seqpos = 0) Zapisujemy rejestr steruj cy lub dane ++seqnibble if(seqnibble == 0) ++seqpos Co drug tetrad zwi kszamy pozycj bufora if(seqpos gt= trans-gtlen) trans-gtReady=true Koniec transakcji if(trans-gtSelfDel) free_re(trans) Zwolnij pami transakcji je li tak sobie yczy programista trans=NULL Koniec transakcji CLR(OUT HD44780_E)

Ta cz przerwania wysy a kolejne tetrady do kontrolera LCD Warto zastanowi sinad dzia aniem sekwencji

++seqnibble

Poniewa pole nibble jest jednobitowe operacja inkrementacji prowadzi do zmianystanu tego pola na przeciwny (pole to ma warto 0 lub 1) Kiedy zostan wys anewszystkie dane przeznaczone dla kontrolera obs uga transakcji ko czy si Stan tensygnalizuje nadanie warto ci true polu Ready struktury LCD_trans Dzi ki temu pro-gram mo e sprawdzi asynchronicznie w stosunku do przerwania kiedy transakcjauleg a zako czeniu Opcjonalnie jest wykonywana jeszcze jedna funkcja mdash je li poleSelfDel ma warto true to pami zarezerwowana na transakcj jest automatycznie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 65

zwalniana W tym celu wykorzystuje si funkcj free_re ktoacuterej prototyp jest zade-klarowany w pliku Alloc_safeh Funkcja ta wywo uje funkcj biblioteczn free ktoacute-ra zwalnia pami przydzielon dynamicznie na stercie Poniewa funkcja ta nie jestfunkcj reentrant nale y stworzy odpowiedni bdquoprotez rdquo opakowuj c j w blokatomowy co zapewnia e nie zostanie ona ponownie wywo ana zanim jej poprzed-nia instancja nie zako czy dzia ania Oczywi cie lepszym rozwi zaniem by oby napi-sanie w asnych funkcji dynamicznej alokacji pami ci ktoacutere b d reentrant

Bardzo wa ne jest aby pole SelfDel mia o warto true wy cznie dla transakcjidla ktoacuterych pami zosta a przydzielona dynamicznie funkcj malloc (lub jej po-chodnymi) W pozosta ych przypadkach pole to musi mie warto false mdash nie-stosowanie si do tej regu y spowoduje b d mened era pami ci i najprawdopo-dobniej nieprzewidywalne dzia anie programu

Drug wa n zasad jest aby zmienna zawieraj ca dane transakcji nie by azmienn automatyczn mdash zmienne takie s automatycznie niszczone po opusz-czeniu zawieraj cej je funkcji W rezultacie obszar pami ci zawieraj cy danetransakcji mo e zosta wykorzystany przez inne zmienne co spowoduje uszkodzeniezawartych w nim danych

Pami przydzielona transakcji musi by alokowana w sposoacuteb dynamiczny (funkcjamalloc_re) ewentualnie mo e to by pami alokowana dla zmiennej globalnej lubstatycznej mdash zmienne tego typu istniej przez ca y czas ycia programu

Warto te zauwa y e instrukcje steruj ce stanem linii Enable kontrolera LCD(SET(OUT HD44780_E) i CLR(OUT HD44780_E)) s rozdzielone wieloma innymi in-strukcjami Dzi ki temu generowany impuls dodatni tego sygna u ma czas trwania gt230 ns wymagany w specyfikacji kontrolera Nawet dla XMEGA taktowanej zegarem32 MHz 230 ns przek ada si na oko o 7 instrukcji asemblera mdash czas jaki z pewno-ci up ynie pomi dzy wykonaniem obu powy szych instrukcji steruj cych

Do wysy ania danych do kontrolera zosta a wykorzystana nieco zmodyfikowanafunkcja hd44780_outnibble_nowait roacute ni ca si od jej protoplasty hd44780_outnibbletylko tym e nie czeka na sygna braku zaj to ci mikrokontrolera (nie realizuje teopoacute nie ) Nie jest to potrzebne gdy kolejne tetrady s wysy ane w odst pach cza-sowych okre lanych przez timer

Mamy wi c zapewnion obs ug transakcji i mo liwo transakcyjnego wy wietlaniadanych na LCD musimy jeszcze mie funkcj ktoacutera tworzy odpowiednie transakcjemdash jest odpowiednikiem funkcji bezpo rednio wysy aj cej dane znakowe do LCDOdpowiednikiem tym jest pokazana poni ej funkcja

bool LCD_PutText_B(uint8_t x uint8_t y char txt LCD_trans buf bool autodel) buf-gtcmd=LCD_Text buf-gtReady=false buf-gtSelfDel=autodel Czy zwolni pami po zako czeniu transakcji buf-gtdata[0]=HD44780_DDADDR(x+y0x40) Ustaw adres w DDRAM strcpy((char)ampbuf-gtdata[1] txt) Skopiuj dane tekstowe + NULL

Kup książkę Poleć książkę

66 AVR Uk ady peryferyjne

buf-gtlen=strlen(txt) + 1 D ugo tekstu + pozycji + NULL ndash 1 bool ret=cbAdd(ampLCD_TransBuffer buf) if((ret==false) ampamp (autodel)) free_re(buf) Brak miejsca w kolejce else TCD0_CTRLA=TC_CLKSEL_DIV1_gc Preskaler 1 mdash odblokuj timer return ret

Funkcja ta buduje transakcj odpowiedzialn za wy wietlenie napisu txt na wskaza-nej pozycji x y LCD Wszystkie dane o transakcji zostan umieszczone w buforzew pami ci ktoacuterej adres jest okre lany wska nikiem buf Pami w buforze musi bywystarczaj co du a aby pomie ci ca transakcj Dodatkowy parametr autodel okre laczy pami ta ma by automatycznie zwalniana po obs u eniu transakcji (true) czynie (false) Je li transakcj uda o si umie ci w kolejce funkcja zwraca true Wartozauwa y e w takim przypadku funkcja uruchamia te timer (w naszym przypadkujest to timer TCD0) odpowiedzialny za generowanie przerwania Funkcja obs ugi prze-rwania wysy a dane do LCD

Pewn odmian powy szej funkcji jest funkcjabool LCD_PutText(uint8_t x uint8_t y char txt) LCD_trans trans=malloc_re(sizeof(LCD_trans) + strlen(txt) + 2) bool ret=LCD_PutText_B(x y txt trans true) return ret

Wykorzystuje ona funkcj LCD_PutText_B z tym e najpierw alokuje dynamiczniepami potrzebn na przechowanie tworzonej transakcji

Mamy komplet potrzebnych funkcji a wi c sprawd my jak ca o sprawdza siw praktyce W pliku LCD-transactc znajduje si kod pokazuj cy jak dzia aj naszetransakcje Aby to by o mo liwe nale y zainicjalizowa kontroler LCD

LCD_init()

Wykorzystujemy tu znan ju funkcj inicjalizuj c mdash nie ma potrzeby jej zmienia gdy operacja inicjalizacji LCD jest jednorazowa i nie trzeba wykonywa jej w posta-ci transakcji W drugim kroku musimy zainicjalizowa wykorzystywany timer i systemprzerwa

LCD_Timer_init(ampTCD0)PMIC_CTRL|=PMIC_LOLVLEN_bm Odblokuj przerwania niskiego poziomusei()

Poniewa dost p do LCD z pewno ci nie jest czynno ci krytyczn czasowo prze-rwaniom timera nadano najni szy priorytet Dzi ki temu mo na innym bardziej kry-tycznym przerwaniom nada wy sze priorytety i uzyska w ten sposoacuteb zmniejszenieczasu latencji obs ugi przerwa Sama inicjalizacja timera jest niezwykle prosta

void LCD_Timer_init(TC0_t tc) tc-gtINTCTRLA=TC_OVFINTLVL_LO_gc Odblokuj przerwania nadmiaru timera i nadaj im niski priorytet tc-gtPER=F_CPULCD_ACCESSTIME Przerwanie co 4 us (niezale nie od F_CPU)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 67

Sprowadza si ona tylko do odblokowania mo liwo ci zg aszania przerwania nadmia-ru oraz konfiguracji rejestru PER tak aby przerwania by y generowane co ok 4 s mdashniezale nie od cz stotliwo ci taktowania CPU Mo emy wi c przyst pi do wy wie-tlenia pierwszego napisu

LCD_PutText(00 Numer)

Powy sza funkcja ma jedn wad mdash alokuje dynamicznie pami po ka dym wywo-aniu (pami ta jest automatycznie zwalniana po obs u eniu transakcji) niemniej

ca y proces jest czasoch onny Mo emy tego unikn alokuj c pami bdquor cznierdquo i wielo-krotnie wykorzystuj c zaalokowany blok pami ci Ilustruje to poni szy przyk ad

LCD_trans buf=malloc_re(sizeof(LCD_trans) + 7)

Zmienna buf wskazuje na obszar pami ci ktoacutery mo e pomie ci a cuch 5-znakowyTyle wystarczy na potrzeby tego przyk adu mdash na LCD b d wy wietlane kolejneliczby w zakresie 0 ndash 65 535 najd u sza ma 5 znakoacutew st d te nasz bufor ma tak a nieinn d ugo

while(1) utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(60 bufstr buf false) while(LCD_IsTransCompleted(buf))

Do konwersji liczby na a cuch u yto funkcji bibliotecznej utoa (nag oacutewek stdlibh)Poniewa d ugo a cucha po konwersji jest zmienna (co spowodowa oby pozosta-wianie na LCD bdquoduchoacutewrdquo po poprzednich konwersjach) w kolejnej linii brakuj ceznaki uzupe niono spacjami Nast pnie tworzona jest transakcja w obszarze pami ciprzydzielonym zmiennej buf Ostatnia p tla while jest odpowiedzialna za oczekiwa-nie na zako czenie realizacji transakcji Po jej zako czeniu p tla jest wykonywana odpocz tku

Uwa ny czytelnik z pewno ci zauwa y e pami przydzielana funkcj malloc_renie jest nigdzie zwalniana mdash w normalnej sytuacji spowodowa oby to wyciek pami -ci W naszym przyk adzie jednak program nigdy si nie ko czy nie ma wi c potrzebyzwalniania pami ci wskazywanej przez zmienn buf

Powy szy przyk ad pokazuje jak unikn blokowania CPU na czas dost pu do wolnodzia aj cego urz dzenia jakim jest LCD alfanumeryczny Jednak to nie wszystkiezalety wynikaj ce z zastosowania transakcji Drug wa n zalet naszego rozwi zaniailustruje przyk ad znajduj cy si w katalogu PrzykladyLCD-alfaLCD-transact-intPowa nym ograniczeniem funkcji odpowiedzialnych za dost p do LCD w sposoacutebklasyczny by a niemo no ich wywo ywania z funkcji obs ugi przerwa mdash funkcjeobs ugi LCD nie by y reentrant2 Nasz system oparty na transakcjach nie ma tychwad Aby to zilustrowa zosta stworzony prosty przyk ad mdash tak jak poprzedniow p tli g oacutewnej programu s wy wietlane stale kolejne liczby ale jednocze nie wyko-

2 Poza tym blokowa y CPU na d ugi czas a jak pami tamy funkcje obs ugi przerwa powinny by

wykonywane mo liwie kroacutetko

Kup książkę Poleć książkę

68 AVR Uk ady peryferyjne

rzystano drugi timer (TCD1) w ktoacuterego funkcji obs ugi przerwania przepe nienia jestwy wietlany licznik tych przerwa

ISR(TCD1_OVF_vect) static char int_buf[sizeof(LCD_trans) + 7] static uint16_t cnt char bufstr[6]

utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(61 bufstr (LCD_trans)ampint_buf false)

Jak widzimy w sposoacuteb asynchroniczny z dwoacutech miejsc w programie mo emy uzy-ska dost p do LCD a ka da funkcja bdquoma wra enierdquo e ma LCD na wy czno Przy okazji warto przeanalizowa sposoacuteb w jaki jest rezerwowana pami na trans-akcj w przerwaniu Oczywi cie mo na by wykorzysta dynamiczn alokacj pami cilecz jak wspomniano taka alokacja jest czasoch onna St d te w pokazanym przy-k adzie wykorzystano tablic statyczn int_buf o rozmiarze umo liwiaj cym prze-chowanie kompletnej transakcji Dzi ki temu e zmienna int_buf jest zmienn statycz-n nie jest ona niszczona po zako czeniu funkcji obs ugi przerwania Gdyby pomins owo kluczowe static zmienna ta by aby niszczona a na LCD najprawdopodobniejzacz yby si pojawia przypadkowe tre ci Poniewa pami naszego bufora nie by aalokowana dynamicznie nie mo e ona zosta zwolniona w naszym sterowniku LCDst d te ostatni parametr wywo ania funkcji LCD_PutText_B musi mie warto false

OptymalizacjaPrzy okazji tego i poprzedniego przyk adu warto zastanowi si jeszcze nad jednkwesti mdash optymalizacji W podanych przyk adach wykorzystano wcze niej omoacute-wione funkcje dost pu do wy wietlacza LCD znajduj ce si w plikach hd44780ci hd44780h Wi kszo z zawartych tam funkcji nie jest wykorzystywana jednakkompilator mimo wszystko umieszcza ich kod w pliku wynikowym mdash dzieje si takponiewa nie mo e on bdquostwierdzi rdquo czy funkcje te nie s wykorzystywane w innychfragmentach programu Pami tajmy e kompilator kompiluje poszczegoacutelne pliki roacute-d owe osobno i dana jego instancja nie bdquowierdquo co znajduje si w innych plikach (innychjednostkach kompilacji) Tak ca o ciow wiedz ma dopiero konsolidator (linker)ktoacutery czy stworzone przez kompilator pliki obiektowe (o rozszerzeniu o) w plikwynikowy Linker jednak bdquonie wierdquo ktoacutera z funkcji programu zosta a u yta a ktoacuteranie mdash informacje te ma wy cznie kompilator W ten sposoacuteb powstaje typowe b dneko o w efekcie nasze nieu ywane funkcje nie s usuwane (linker zostawia je bdquonawszelki wypadekrdquo) i zajmuj niepotrzebnie pami Czy mo na temu jako zaradzi Oczywi cie tak W tym celu trzeba po czy si y kompilatora i linkera co zapewniaj od-powiednie opcje kompilacji We w a ciwo ciach projektu (ProjectProperties lub Alt+F7)wybieramy zak adk Toolchain a nast pnie AVRGNU C Compiler i OptimizationZnajdziemy tam pole wyboru o nazwie Prepare functions for garbage collection (ry-sunek 224)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 69

Rysunek 224 Aby da linkerowi mo liwo usuwania nieu ywanych funkcji nale y skompilowaprogram z wybran opcj ndashffunction-sections ktoacutera spowoduje e ka da funkcja programu znajdzie siwe w asnej sekcji

Zaznaczenie tej funkcji spowoduje umieszczenie ka dej funkcji w osobnej sekcji mdashsamo w sobie nie wp ynie to na skroacutecenie kodu wynikowego ale jest warunkiem nie-zb dnym dla podj cia stosownych dzia a przez linker Aby wyeliminowa nieu y-wane funkcje nale y zaznaczy jeszcze w ga zi AVRGNU LinkerOptimization poleGarbage collect unused sections (rysunek 225)

Rysunek 225 Zaznaczenie opcji Garbage collect unused sections (-Wl--gc-sections) spowodujee nieu ywane funkcje zostan usuni te z kodu wynikowego w efekcie kod programu ulegnie skroacuteceniu

Po zaznaczeniu tych opcji program zostanie skroacutecony o kilkaset bajtoacutew Oczywi cieje li wszystkie funkcje by yby wykorzystane nie uzyskaliby my adnego skroacuteceniakodu Niemniej w sytuacji gdy u ywa si bibliotek zazwyczaj przynajmniej czfunkcji nie jest wykorzystywana warto wi c skorzysta z tej mo liwo ci optymalizacji

Kup książkę Poleć książkę

70 AVR Uk ady peryferyjne

Je li mamy do czynienia z prekompilowan bibliotek (lib) to musi ona by skom-pilowana z zaznaczon opcj Prepare functions for garbage collection (-ffunction-sections) Alternatyw jest umieszczenie ka dej funkcji biblioteki w osobnym pliku(tak jak w przypadku bibliotek AVR-libc)

Na ekranie wyboru opcji optymalizacji linkera mamy jeszcze jedn przydatn opcjmdash Relax Branches (-mrelax) Dla mikrokontroleroacutew ktoacutere maj ponad 8 kB pami ciFLASH instrukcje skokoacutew s generowane jako tzw instrukcje d ugie mdash umo liwiajone skok do komoacuterki pami ci FLASH o dowolnym adresie Jednak cen za to jestwyd u enie instrukcji mdash ich kod jest d u szy podobnie jak czas wykonania Nie zawszejednak takie d ugie instrukcje musz by wykonywane mdash je li miejsce docelowe skokule y blisko (w zasi gu instrukcji skokoacutew wzgl dnych) to mo na w kodzie wynikowymzamieni instrukcje d u sze na kroacutetsze co przynosi oszcz dno ci w postaci skroacuteceniakodu wynikowego Poniewa dopiero linker bdquowierdquo jak poszczegoacutelne fragmenty kodus rozmieszczone w pami ci takiej podmiany mo na dokona na etapie linkowaniaprogramu co zapewnia powy sza opcja St d te warto to pole wyboru zaznaczy

Kup książkę Poleć książkę

SkorowidzA

ABI Application Binary Interface 25AC Address Counter 50ADPCM 482adres

bazowy 377bufora 61komoacuterki 84pu apki 202

ALE Address Latch Enable 368alfanumeryczne wy wietlacze 43algorytm ADPCM 492algorytmy stratne 495animacje 57antyaliasing 325architektury procesoroacutew XMEGA 352asembler 23

dyrektywy 40funkcje j zyka C 41obs uga przerwa 39

asynchroniczne wywo anie funkcji 101Atmel Studio 15

Bbajty kalibracyjne 569biblioteka

FATFS 131 139 176 180 517libcallback-liba 99PetitFS 144 149

bitADC_CH0START_bm 236IMPMODE 244

bitrate 442 512blokowanie przerwa 219b d 16 19

kwantyzacji 463offsetu 230wzmocnienia ADC 230

BOD 223bps bits per second 12

budowakarty 152linii obrazu 394pami ci SDRAM 374pliku stymulacji 192ramki PAL 412sygna u PAL 411wtyczki 544 545

bufor 78FIFO 497na transakcje 61transakcji 62

buforowanie wyj cia 294

CCAS Column Address Strobe 375CCFL 44charakterystyka

przetwornikoacutew 222termistora 264tryboacutew pracy 232

CID Card Identification 169CKE Clock Enable 375CLKIN 421COG Chip on Glass 310CRC 158 178CRC16 178CRC7 164CS Chip Select 361 375CSD Card Specific Data 172czas

dost pu do SDRAM 424adowania kondensatora 244

propagacji 281proacutebkowania 260symulacji 209

czcionki 322cz stotliwo

odchylania pionowego 428proacutebkowania 244 441 444 530przebiegu 504

Kup książkę Poleć książkę

576 AVR Uk ady peryferyjne

cz stotliwoPWM 465taktowania koprocesora 549taktowania procesora 209taktowania rdzenia 18

czyszczenie pami ci 318

DDAC Digital to Analog Converter 293 447 451

buforowanie wyj cia 294generowanie przebiegoacutew 301jitter 303kalibracja 306napi cie referencyjne 295system zdarze 297taktowanie 296tryb dwukana owy 301wykorzystanie DMA 298wyzwalanie konwersji 305

datalogger 261 265 275DD Device Density 86debuger 183

programowy 190sprz towy 185 187

decymacja 259DEBUG 219XMEGA 260

definicja symboli globalnych 36definiowanie w asnych znakoacutew 56deklaracja zapowiadaj ca 103 337dekoder DTMF 548 556DMA 254 298 402 458 518 523dost p do

danych 358 359 568danych binarnych 356 360danych wielobajtowych 31DataFLASH 137EEPROM 128FAT 136komoacuterki 375LCD 59 62 66 68operandu 30pami ci 81 384 386 387 561pami ci SDRAM 424pliku blokowy 141portoacutew IO 30rejestroacutew IO procesora 36rejestroacutew uk adu 499SPI 95sygnatury u ytkownika 565 567wska nikoacutew 32

DQM Data Mask 375DSP Digital Signal Processor 535

DTMF 535 553dyktafon 529dynamiczna alokacja pami ci 516dyrektywa global 38dyrektywy asemblera 40dzia anie

DMA 255komparatora 280timeroacutew 400

d wi k 443

EEBI External Bus Interface 361EEPROM 207eliminacja jitteru 24emulacja RS232 139

FFAT File Allocation Table 128 131FAT32 128FATFS 180filtr

dolnoprzepustowy 491drugiego rz du 470pierwszego rz du 469trzeciego rz du 471

filtrowanie sygna u PWM 468firmware 565FLASH 207format

odpowiedzi 159polecenia 158protoko u 157

funkcja_delay_ms 17 219c_zero 42callback 106 341callback() 99DataFLASH_CSEnable 100DF_FinishBufWrite() 269disk_initialize 136disk_ioctl 181disk_status 136disk_write 138DMA_SPI_init 104DTMF_GetCode 553free_re 65GPIOR0_init 507hd44780_outcmd 51hd44780_outnibble_nowait 65LCD_defchar_P 57

Kup książkę Poleć książkę

Skorowidz 577

Menu_Click_Func 515Menu_Free 516Menu_Recorder 532Menu_Run 527MS_CreateRegEntry 117MS_GetDirPos 125MS_GetRegItem 115MS_WritePages 116 118OSC_wait_for_rdy 473RecMenu_StartStop 532sprintf 142strtok 124sysclk_init() 200 209TMF_memcpy_PF 454udi_cdc_getc() 123udi_cdc_is_rx_ready() 123VS1003_Reset 506

funkcjeanalizuj ce 556biblioteczne 50biblioteki FATFS 143j zyka C 41kontrolera ST7565R 313opoacute niaj ce 17opoacute nie 219reentrant 524specjalne kontrolera 319steruj ce 314zapisu 133

fusebit 557BODACT 560BODLEVEL 560BOOTRST 559DVSDON 560EESAVE 561JTAGEN 558RSTDISBL 559SUT 559TOSCSEL 559

fusebity w AVR-libc 571

Ggenerator obrazu composite 426generowanie

d wi ku 461kolorowego obrazu 437obrazu wideo 391przebiegoacutew 301przerwa 285sygna u composite 409

g bia koloru 326gniazdo

karty SD 156VGA 396

Hhistereza 281

IIDE 11IMA ADPCM 483informacje

o kolorze 431o obrazie 434

inicjalizacjakarty 161karty SDHC 167karty SDSC 167karty SDXC 167licznika 419pami ci 119USART 505

instrukcjaicall 42movw 35nop 13 24

interfejsSCI 498SDI 498SPI 71 79RS232 120UART 123USART 71 73

interpolacja 259interpolacja w XMEGA 260inwersja obrazu 319

Jjednostki 12jitter 24 303 420

Kkalibracja

ADC 229DAC 306 564offsetu 237

kana DMA 82 522karta 154 158

mikroSD 152SD 151 152SDHC 151 152 160SDSC 160SDXC 151 160

Kup książkę Poleć książkę

578 AVR Uk ady peryferyjne

karty pami ci 151 152 157biblioteka FATFS 180budowa 152format polecenia 158inicjalizacja 161 167komunikacja 156odczyt danych 173opcje konfiguracyjne 181rejestry specjalne 169tryby pracy 153zapis danych 176zasilanie 154

kodasemblerowy 23 24C 23dost pu 24

kodowanieμ-law 481ADPCM 483Dialogic ADPCM 494informacji 166 426koloru 425znakoacutew 536

kodyformatoacutew audio 501zdarze 545

kolejno bajtoacutew 533kolor 424 430kolorowy obraz 437komparator 422

analogowy 279 280analogowy XMEGA 282okienkowy 284

kompilacja plikoacutew binarnych 350kompilator avr-gcc 11 359kompresja

ADPCM 482 486d wi ku 480IMA ADPCM 482

komunikacja z koprocesorem 504konfiguracja

4-portowa 364biblioteki 133debugera 185DMA 459 522fusebitoacutew 570kontrolera DMA 257 452komparatoroacutew 285lockbitoacutew 570LPC 371pami ci SDRAM 381PetitFS 149pinu IO 225portoacutew IO 362

preskalera 452projektu 186przerwa 219pu apki 203rejestru EVCTRL 248rejestru PER 67SPI 75sygna u CS 377typu czcionki 324urz dze IO 189USART 76zegara 383

konsolidacja 547kontroler

DMA 254 298 402 458 518 523KS108 310ST7565R 310ndash315 321

konwersjaDAC 305sygna oacutew 396wyzwalana 306

konwertercyfrowo-analogowy 426DAC 427

koprocesormp3 496VS1003B 10

korekcja fazy 466kwantyzacja 463

Llampa CCFL 44LE Latch Enable 433licznik 419

cykli 209TCC1 400timera 20

linie IO 50linie sygna owe

MISO 72 164MOSI 72SCK 72SS 72

linker 69lista

mnemonikoacutew 24modyfikowanych rejestroacutew 32

lockbity 557 561lockbity w AVR-libc 570LPC Low Pin Count 371LPCM 443 556LSB Least Significant Bit 228

Kup książkę Poleć książkę

Skorowidz 579

a cuchy formatuj ce 212czenie plikoacutew 352

Mmagistrala pami ci zewn trznej 361magnetofon cyfrowy 528makro _SFR_IO_ADDR() 39makrodefinicja

ASSERT 214HD44780_CGADDR() 53HD44780_CLR 53HD44780_DDADDR() 53HD44780_DISPCTL() 52HD44780_ENTMODE() 52HD44780_FNSET() 52HD44780_HOME 53HD44780_SHIFT() 51LOCKBITS 571

mapowanie sygna oacutew 366mapy bitowe 343marker czasowy 268maski bitowe 329matryce 49menu 335menu piktogramowe 342mierniki temperatury 262mikrokontroler

ARM 9AVR 9PIC 9XMEGA128A3U 10

MISO 72moc wydzielana 265model psychoakustyczny 495modu

alfanumeryczny 45NVM 568Xmega eXploreGO 10Xplained ATXMEGA A3BU 10Xplained ATXMEGA-A1 10Xplained XMEGA128A1 447Xplained XMEGA256A3 94Xplained XMEGA256A3BU 97 143 266

modyfikator 30const 85volatile 28 273

monitory CRT 395monochromatyczne wy wietlacze graficzne 309monochromatyczny

tryb graficzny 416tryb tekstowy 413

MOSI 72mp3 495Msps Megasamples per second 12multiplekser wej ciowy 226 283multipleksowanie adresoacutew 368 369muzyka 439

Nnadawanie kodoacutew DTMF 540nadproacutebkowanie 258nag oacutewek kontenera wav 500nagrywanie mowy 486najmniej znacz cy bit 228napi cie

offsetu 280referencyjne 223 295zasilania 239

Oobracanie obrazu 319obraz 319

composite 426kolorowy 430wideo 391

obroacutebka d wi ku 443 445obs uga

FAT 131 143klawiatury matrycowej 24LCD 58 63 67menu 337przerwania 37 38 458przerwania DMA 525przerwa w asemblerze 39przyciskoacutew 272wy wietlaczy alfanumerycznych 45

odczytblokowy 140danych 173 358

odpowied response 159R1 159R2 159R7 160

od wie anie pami ci 376odtwarzanie

d wi ku 472muzyki 447 513 518 521

offset 238offset ADC 230okno

Breakpoints 202Call stack 209dezasemblera 210

Kup książkę Poleć książkę

580 AVR Uk ady peryferyjne

oknoIO View 207podgl du zmiennych 211wyboru czcionek 324

OLED 46opcje

kompilatora 35zapisu d wi ku 445

operacjena buforach 91odczytu 173zapisu 176zapisu strony 92

operand 29operator

ascii 41

asciz 41

byte 41

section 41opoacute nienia 13 18opoacute nienie zmienne 16optymalizacja 16 68optymalizator 26organizacja pami ci 77organizacja pami ci VRAM 316oscylator 287OSD On-Screen Display 417ostrze enie 16oszcz dzanie energii 94

Ppakiet WinAVR 48pami

CGRAM 56 57 64DataFLASH 10 77 81 113 269DDRAM 49EEPROM 111FLASH 54 124 207RAM 49SDRAM 372SRAM 63 124 329 366 371VRAM 314 317

PCLK 421PCM 443PetitFS 144 149p tla

for 13while 201

pierwsza linia obrazu 321piksel 430piktogram 342pin IO 225

plikAlloc_safeh 65DataFLASHc 83DataFLASHIOc 136definesh 50delayh 14diskioh 132 136ffh 132ffconfh 132 181hd44780h 49integerh 132ioh 30LCD_transc 61LCD-transactc 66Makefile 14Menuc 19nothingo 541outfiletxt 547 551pffh 149SPIh 104stringh 113stymulacji 191 192

pliki mp3 495elf 351fon 323o 24S 24 34binarne 350 355csv 276d wi kowe 440obiektowe 352wav 500WMA 512z czcionkami 327z danymi 349

podbijacz napi cia 315podgl d

pami ci 207stosu wywo a 209zmiennych 211znakoacutew 325

pod czeniefototranzystora 262karty SD 155LCD z kontrolerem 311modu u 50pami ci 362 369 370 373termistora 262uk adu LM35 251wyj XMEGA 398

pod wietlenieCCFL 46OLED 46

Kup książkę Poleć książkę

Skorowidz 581

podwoacutejne buforowanie 255 332 457polecenia

kasowania strony 81konfiguracyjne pami ci 82kontrolera ST7565R 315odczytu bufora 82 89odczytu pami ci 81 88SDRAM 376transferu 91

polecenieACMD41 168cd 181CID 178CMD0 165CMD8 167CSD 178date 276dir 127 181dump 276erase 276get 276HD44780_CLR 51Init 178mkdir 181

po czenieDMA ze SPI 96dwoacutech komparatoroacutew 285koprocesora mp3 497LCD z mikrokontrolerem 48wyj cia XMEGA 411XMEGA z PC 121z telewizorem 431

pomiarnapi cia zasilania 239temperatury MCU 241

port IO 30 362pozycjonowanie grafik 345poacute obraz 410precyzja pomiaroacutew 260preskaler 478preskaler ADC 243program

Atmel Data Visualizer 275Audacity 443avr-objcopy 350dataloggera 265LCD Image Converter 323makeloadingtableexe 543Realterm 127 554riffstrip 483SoX 445Tracepoint 208

programowanie sygnatury u ytkownika 566protokoacute master-slave 157

prototypy 136proacutebki d wi kowe 447proacutebkowanie

8-bitowe 300nieliniowe 480

prymitywy graficzne 330przebieg PWM 468przebiegi 289 303przechwytywanie danych 276przemiatanie wej 253przerwanie 218 254 286 403

DMA 522komparatora 286

przestrze adresowa procesora 378przesy anie

danych 498polece 498

przetaktowanie procesora 436przetwornik

ADC 221analogowo-cyfrowy 221cykliczny 222potokowy 222

przyciski 272pseudooperatory 41pu apki breakpoints 197pu apki warunkowe 205punkty ledzenia 203PWM 461 462 472

RRAS Row Address Strobe 375redukcja poboru energii 242regulacja kontrastu 321rejestr 32 34rejestr AC 50

adresu wtyczki 513BASEADDR 377CID 169CMP 251CSD 172czasu utworu 512DATA 83EVCTRL 248formatu audio 512identyfikacyjny pami ci 87INTFLAGS 252kontroli basoacutew 510kontroli g o no ci 513MUXCTRL 227OCR 168PER 67poroacutewnania 249

Kup książkę Poleć książkę

582 AVR Uk ady peryferyjne

rejestr ACSCI_CLOCKF 511stanu komparatora 287stanu pami ci 86stanu uk adu 510trybu pracy 508WINCTRL 285

rejestrydost pu do pami ci RAM 513GPIOR 502IO procesora 36mikrokontrolera 25procesora 35specjalne 94specjalne karty 169uk adu VS1003B 508

relacja rodzic ndash dziecko 336reset uk adu 534rozdzielczo

LCD 329przetwornika 231PWM 463 477

rozszerzenie HiRes 477 479roacutewnanie Steinharta-Harta 263rysowanie map bitowych 343

Sschemat uk adu dataloggera 267SCI Serial Command Interface 498SCK 72SD Secure Digital 152SDI Serial Data Interface 498separator synchronizacji 422separowanie impulsoacutew synchronizacji 422shieldy 10skaler 422skaler napi cia 283skrypt makefile 353s owo kluczowe

asm 27extern 37static 68

specyfikatory lokalizacji zmiennej 213sps samples per second 12SS Slave Select 72standard PAL 410standard VGA 393sterowanie

dataloggerem 275sygna em 379

sterownik 121HD44780 49 56LCD 49 62

stos wywo a 209

strukturaFATFS 139Handle 118LCD_trans 60 63menu 338rejestru 86SimpleFSEntry 113 116SimpleFSHandle 113 118 140submenu 527systemu plikoacutew 112

sumabitowa 571kontrolna 178

sygnacomposite 409composite video output 430CS 377DREQ 497H-Sync 396synchronizacji 423V-Sync 396zegarowy CLK 374

sygna yinterfejsu EBI 363magistrali EBI 364steruj ce 375

sygnaturaprodukcyjna procesora 563u ytkownika 565

symbol__DELAY_ROUND_CLOSEST__ 17__DELAY_ROUND_DOWN__ 17_FS_FAT12 149_FS_FAT32 149_FS_MINIMIZE 133_FS_READONLY 133_FS_RPATH 135_FS_TINY 133_MAX_SS 135_MULTI_PARTITION 135_USE_DIR 149_USE_FASTSEEK 134_USE_FORWARD 134_USE_LABEL 134_USE_LFN 134_USE_LSEEK 149_USE_MKFS 134_USE_READ 149_USE_STRFUNC 134_USE_WRITE 149_VOLUMES 136F_CPU 14 15 18increment 36USE_BUSY_FLAG 50

Kup książkę Poleć książkę

Skorowidz 583

symboleglobalne 36w asemblerze 28zewn trzne 39

symulacja 198 209symulator 190synchronizacja

pami ci 331pionowa 395pozioma 394

systemplikoacutew 111 128przerwa 404zdarze 245

szablonfont_XMEGAtmpl 326image_XMEGAtmpl 343

szum 463szybko przesy ania danych 126

ledzenie wi zki 333rodowisko

graficzne 11programistyczne 11VSIDE 542WinAVR 47

Ttabela FAT 130tablica

framebuf 402 408plugintbl 552 555tekst 208z kodem wynikowym 543

taktowanieDAC 296mikrokontrolera 473

technologia OLED 44temperatura mikrokontrolera 239 241termistor 262 290

NTC 263PTC 263

termometrLM35 249 250z alarmem 251

termostat 290test uk adu VS1003B 503testowanie obrazu 319timer 16 62

TCC0 20

TCC1 399transakcja 59 62 65transakcje 17 103ndash107transakcyjna obs uga LCD 58transakcyjny dost p do SPI 95transfer 91

danych 97wynikoacutew 254

transmisja 72 83tryb

bez znaku 234ci g ej konwersji 252czterobitowy 153dwukana owy 301graficzny 416graficzny VGA 407idle 419jednobitowy 153LPC 371monochromatyczny 397 407oszcz dzania energii 94 306pracy multipleksera 226pracy SPI 157roacute nicowy 232single slope 312SPI 153tekstowy 413tekstowy VGA 397z pojedynczym wej ciem 234ze znakiem 235

trybygenerowania PWM 467pracy karty 153pracy przetwornika 231pracy SPI 74pracy uk adu 508

twierdzenie Nyquista 258tworzenie

adresu 84nak adek 417obrazu 335tablicy 543

typ__uint24 119karty 160niekompletny 60wyliczeniowy 114

typyoperandoacutew 29w AVR 34

Kup książkę Poleć książkę

584 AVR Uk ady peryferyjne

Uuchwyt handle 64 113uk ad

AD725 427 431buforowy 294CS 361DAC 284dataloggera 267detekcji awarii zasilania 559generuj cy obraz 393HiRes 477ICL7660 47LM35 250 251SampH 293sterowania sygna em 379USART 401VS1003B 496 503 508 530 538 556VS100XX 529wzmacniania sygna u 227

uk ady peryferyjne 9uruchomienie komparatora 287urz dzenie

master 72slave 72

u rednianie 259utrata danych 141u ycie wstawki asemblerowej 33

VVGA 393

Wwarto ci kalibracyjne

ADC 564oscylatoroacutew 564temperatury 564

warunkowa kompilacja 36WE Write Enable 375wej cie composite video input 425wektor przerwa 38 257wideo 391wielko pami ci 86 377w czenie DAC 299wska nik na struktur 27wska niki 32wstawki asemblerowe 24 33wtyczka 535 541 544

SineDTMF Generator 537VGA 396

wyboacuter cz stotliwo ci PWM 465 474wykorzystanie

DMA 254 518

EuroSCART 428PWM 461rejestroacutew 34

wyliczanie predyktora 489wy wietlacze

alfanumeryczne 43 45graficzne 43 309LCD 43OLED 46

wy wietlanielitera u 213map bitowych 344obrazu 333 346 406obrazu VGA 393

wywo ania zwrotne callbacks 98asynchroniczne 101synchroniczne 101

wyzwalanie konwersji 245wzmacniacz 446wzmacniacz operacyjny 279wzmacnianie sygna u 227

XXMEGA 9 18

Zzapis

bufora 269danych 176d wi ku 440 556

zasilaniekarty 154pami ci 109

zatrzask 368zatrzask 74HC573 433zatrza ni cie adresu 369zdarzenia 297zdarzenie compare match 399zegar 383 420 426zintegrowane rodowisko programistyczne 11z cze EuroSCART 425 428 429zmiana

g o no ci 527wielko ci strony 94

znaki 56

roacuted onapi cia odniesienia 284sygna u 240

Kup książkę Poleć książkę

Page 15: Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8 AVR. Ukäady peryferyjne Rejestry dost pu do pami ci RAM .....513 Rejestr adresu

50 AVR Uk ady peryferyjne

Oba pliki bdquozak adaj rdquo e istnieje plik nag oacutewkowy definesh zawieraj cy podstawo-we definicje zwi zane ze sposobem pod czenia modu u LCD z mikrokontroleremNa pocz tku nale y okre li ktoacutere linie IO zosta y wykorzystane do pod czenia modu u

define HD44780_RS A 4define HD44780_RW A 5define HD44780_E A 6define HD44780_D4 A 0

W powy szym przyk adzie do kolejnych linii portu A (A4 ndash A6) zosta y pod czonesygna y RS RW i E modu u natomiast do linii A0 ndash A3 linie D4 ndash D7 modu u LCD Wa nejest aby linie danych czy z pinami IO w kolejno ci rosn cej Biblioteka wykorzy-stuje do transmisji danych pomi dzy modu em a mikrokontrolerem tylko 4 linie danychmdash dzi ki temu mo emy zmniejszy liczb po cze a zwolnione linie IO wykorzystado innych celoacutew W pliku wyst puje jeszcze jedna definicja

define USE_BUSY_BIT 1

Okre la ona e biblioteka b dzie u ywa flagi Busy modu u LCD mdash umo liwia touzyskanie optymalnej szybko ci wspoacute dzia ania z modu em Zako czenie realizacjibie cej operacji modu sygnalizuje zmian stanu tej flagi co umo liwia niezw ocznewys anie kolejnej komendy Je li nie u ywamy flagi Busy program musi generowamaksymalne zalecane w nocie katalogowej opoacute nienia w efekcie ca a transmisja zwal-nia Po zdefiniowaniu u ywanych pinoacutew w pliku definesh mo emy rozpocz korzy-stanie z biblioteki

W pliku hd44780h s udost pnione prototypy funkcji odpowiedzialnych za wspoacute -prac z modu em LCD

Funkcje bibliotecznePodstaw modu u stanowi dwie funkcje umo liwiaj ce odpowiednio wys anie da-nych do modu u oraz ich odczytanie

void hd44780_outbyte(uint8_t b uint8_t rs)uint8_t hd44780_inbyte(uint8_t rs)

Obie funkcje wysy aj odczytuj 8-bitow dan w przypadku wykorzystania tylko4-bitowej szyny danych wysy anie i odczytywanie danych odbywa si w dwoacutech etapachDodatkowo zmienna rs okre la tryb dost pu W przypadku wysy ania danych do modu urs = 0 powoduje e dane zostan wys ane do rejestru komend a je li rs = 1 dane trafido rejestru danych Przy odczycie jest podobnie z tym e dla rs = 0 jest odczytywanaflaga Busy i rejestr AC (ang Address Counter)

Kolejna funkcja odpowiada za oczekiwanie na gotowo modu uvoid hd44780_wait_ready(bool islong)

W przypadku gdy w pliku definesh symbol USE_BUSY_FLAG ma warto 1 parametrislong jest ignorowany a optymalizator kompilatora usuwa go gdy nie jest on wy-korzystywany przez funkcj Kiedy warto USE_BUSY_FLAG jest roacute na od 1 parametr

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 51

ten okre la d ugo opoacute nienia Je li jest roacute na od 0 opoacute nienie wynosi 152 ms a je-eli jest roacutewna 0 opoacute nienie wynosi 37 s Poniewa lepiej jest u ywa flagi Busy

mo emy ten parametr ignorowa

Powy sze trzy funkcje wystarcz do komunikacji z modu em dla wygody zdefiniowanojednak kolejne Funkcje hd44780_outcmd(n) i hd44780_incmd() umo liwiaj odpowiedniowys anie polecenia do rejestru komend kontrolera lub odczytanie bitu Busy i licznikaAC Dwie kolejne mdash hd44780_outdata(n) oraz hd44780_indata() mdash umo liwiaj zapisi odczytanie rejestru danych

Oproacutecz funkcji odpowiedzialnych za komunikacj z modu em LCD zdefiniowano tak efunkcj przeprowadzaj c podstawow inicjalizacj modu u hd44780_init(void) orazfunkcj hd44780_powerdown(void) ustawiaj c wszystkie linie u yte do komunikacjiw stan 0 co umo liwia bezpieczne od czenie zasilania od modu u LCD W przypadkupozostawienia ktoacuterej z wy ej wymienionych linii w stanie 1 przy od czonym za-silaniu modu u stanowi ona jego zasilanie W efekcie mimo wy czenia modu mo epobiera znaczny pr d

Szerszego omoacutewienia wymaga funkcja hd44780_outcmd(cmd) ktoacutera umo liwia wys a-nie polecenia do rejestru polece sterownika LCD Dla wygody zdefiniowane zosta yroacute ne komendy u atwiaj ce wspoacute prac z modu em LCD Komendy te s przekazy-wane jako argument wywo ania funkcji hd44780_outcmd np

hd44780_outcmd(HD44780_CLR)

powoduje wys anie do sterownika polecenia HD44780_CLR czyszcz cego zawartopami ci DDRAM kontrolera

KomendyFunkcja hd44780_outcmd przyjmuje jako argument predefiniowane makrodefinicjeznacznie u atwiaj ce wspoacute prac z kontrolerem modu u LCD Poni ej zostan onepokroacutetce omoacutewione

HD44780_SHIFT(shift right)Ta makrodefinicja powoduje przesuni cie pozycji wy wietlanego tekstu (shift = 1)o jedn pozycj w lewo (argument right = 0) lub w prawo (argument right = 1)W przypadku gdy shift = 0 przesuwany w lewo lub prawo jest tylko kursor Wysy-aj c wielokrotnie to polecenie uzyskujemy kolejne przesuni cia o jedn pozycj

w lewo lub prawo Polecenie to s u y g oacutewnie do przesuwania tekstu Jednak ze wzgl duna du bezw adno tekstowych modu oacutew LCD nie nale y przesuwa liter cz ciej niok raz na sekund mdash cz stsze przesuwanie daje bardzo nieprzyjemne efekty wizual-ne Ka dy bufor linii jest bdquozawijanyrdquo to znaczy e po ostatnim znaku z prawej jestwy wietlany pierwszy znak z lewej i odwrotnie Nale y pami ta e d ugo buforajest sta a dla danego modelu matrycy Np dla modu oacutew 16times2 bufor jednej linii wyno-si dok adnie 40 bajtoacutew z czego 16 jest jednorazowo wy wietlanych Poni szy kodcyklicznie przewija wy wietlany tekst w lewo

lcd_puttext_P(PSTR(Test bufora i przewijania tekstunTen tekst przewija sie w lewo))while(1)

Kup książkę Poleć książkę

52 AVR Uk ady peryferyjne

hd44780_outcmd(HD44780_SHIFT(10)) _delay_ms(700)

HD44780_FNSET(if8bit twoline font5x10)Polecenie to wybiera typ interfejsu mdash 8-bitowy je li warto parametru if8bit jestroacutewna 1 lub 4-bitowy je li jest roacutewna 0 Typ interfejsu musi odpowiada sposobowipo czenia modu u z mikrokontrolerem Parametr twoline okre la czy pod czonamatryca LCD ma jedn lini znakoacutew czy dwie Matryce ktoacutere maj 4 linie tekstu straktowane przez kontroler jako matryce dwuliniowe mdash parametr twoline powinienmie warto 1 Je li dla matrycy zawieraj cej dwie lub wi cej linii ustawimy go na 0to wy wietlana b dzie tylko jedna linia (w przypadku matryc dwuliniowych goacuterna)a w przypadku matryc 4-liniowych b d wy wietlane dwie linie rozdzielone lini pust

Ostatni parametr okre la typ u ywanego generatora znakoacutew Powinien on odpowiadau ytej w module matrycy zwykle wi c jego warto wynosi 0

HD44780_DISPCTL(disp cursor blink)Ustawia roacute ne parametry pracy matrycy Je li parametr disp ma warto 1 to matrycajest w czona (wy wietla zawarto DDRAM) a je li 0 to matryca jest wy czonalecz stan pami ci DDRAM nie ulega zmianie Np kod

while(1) hd44780_outcmd(HD44780_DISPCTL(011)) _delay_ms(700) hd44780_outcmd(HD44780_DISPCTL(111)) _delay_ms(700)

powoduje naprzemienne w czanie i wy czanie matrycy w efekcie wy wietlany tekstmruga

Parametr cursor okre la czy sprz towo wy wietlany kursor ma by widoczny (war-to parametru 1) czy niewidoczny (warto parametru 0) Je li kursor jest widocznyto dodatkowo mo emy okre li czy ma miga (warto parametru blink roacutewna 1)czy nie (blink = 0) Je li kursor jest widoczny i nie miga jest wy wietlany w postacipoziomej kreski Wy wietlanie kursora mo e by u yteczne w sytuacji kiedy u yt-kownik wprowadza jakie dane W pozosta ych sytuacjach kursor mo emy wy czy

HD44780_ENTMODE(inc shift)Okre la sposoacuteb wprowadzania danych do pami ci Je li parametr inc ma warto 1 topo ka dej operacji zapisuodczytu adres pami ci jest automatycznie zwi kszany o je-den co przy piesza operacj zapisuodczytu kolejnych znakoacutew Je li warto inc jestroacutewna 0 to adres jest automatycznie zmniejszany o 1 Dodatkowo parametr shiftokre la czy wy wietlany obraz ma by automatycznie przesuwany tak aby wy wie-tla ostatnio wprowadzony znak (shift = 1) lub go nie wy wietla (shift = 0)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 53

HD44780_CLRPowoduje wyczyszczenie (wype nienie znakami o kodzie 32) ca ej zawarto ci pami ciDDRAM Jednocze nie kursor wraca do pozycji pierwszej (pierwsza linia pierwszyznak)

Niewy wietlane bajty pami ci DDRAM tak e s kasowane Je li s one u ywanedo przechowywania zmiennych programu to przed operacj kasowania nale y jeskopiowa w bezpieczne miejsce W przeciwnym przypadku zostan utracone

Wska nik adresu do pami ci DDRAM jest ustawiany na 0 zerowane jest tak e prze-suni cie

HD44780_HOMEPowoduje powroacutet kursora do pozycji pocz tkowej mdash pierwsza linia pierwszy znakWska nik adresu do pami ci DDRAM w efekcie zawiera 0 zerowane jest roacutewnieprzesuni cie wy wietlania znakoacutew w efekcie s one wy wietlane od pozycji 0

HD44780_DDADDR(addr)Ustawia nast pny adres zapisuodczytu w pami ci DDRAM na addr Tylko 7 bitoacutewargumentu addr jest branych pod uwag w zwi zku z czym mo na zaadresowa mak-symalnie 128 bajtoacutew pami ci (z czego sterownik ma tylko 80 pozosta e lokacje snieu ywane)

HD44780_CGADDR(addr)Ustawia nast pn operacj odczytuzapisu w pami ci CGRAM na addr Pod uwagbranych jest tylko 6 bitoacutew zmiennej addr w efekcie mo na zaadresowa maksymalnie64 bajty pami ci CGRAM

Przedstawione powy ej funkcje zapewniaj jedynie podstawow komunikacj z mo-du em LCD Potrzebujemy jednak ci gle funkcji odpowiedzialnej za jego inicjalizacjmdash funkcja biblioteczna przeprowadza ten proces tylko w podstawowym zakresie musi-my jeszcze zadba o w a ciwe ustawienie parametroacutew zwi zane z posiadan matryc Napiszmy wi c w asne rozwini cie funkcji inicjalizacyjnej

void lcd_init() hd44780_init() Podstawowa inicjalizacja modu u hd44780_outcmd(HD44780_CLR) Wyczy pami DDRAM hd44780_wait_ready(1000) hd44780_outcmd(HD44780_ENTMODE(1 0)) Tryb autoinkrementacji AC hd44780_wait_ready(1000) hd44780_outcmd(HD44780_DISPCTL(1 0 0)) W cz wy wietlacz wy cz kursor hd44780_wait_ready(1000)

Zauwa e po wys aniu ka dego polecenia do modu u jest wywo ywana funkcjahd44780_wait_ready(1000) odpowiedzialna za oczekiwanie a realizacja wys anego po-lecenia dobiegnie ko ca Jest to niezb dne gdy do czasu uko czenia bie cej

Kup książkę Poleć książkę

54 AVR Uk ady peryferyjne

operacji dalsze polecenia s ignorowane Jako argument podany jest parametr 1000mdash jest on bez znaczenia nasza biblioteka korzysta z flagi Busy i po prostu go ignorujePo wykonaniu powy szej funkcji modu LCD jest poprawnie zainicjalizowany a jegopami jest wyczyszczona (zawiera bajty 0x20) i w efekcie modu nic nie wy wietlaOd tej chwili mo emy wysy a znaki do wy wietlenia

Po wykonaniu inicjalizacji ekran mo e pozosta czysty lub wy wietla ca kowiciewype nione kwadraty (wszystkie piksele w czone) Je li po inicjalizacji wszystkiepiksele s w czone nale y nieco zmniejszy kontrast

Aby sobie u atwi to zadanie zdefiniujmy funkcj wysy aj c do modu u jeden znakvoid lcd_putchar(char c) static bool second_nl_seen static uint8_t line=0

if ((second_nl_seen) ampamp (c = n)ampamp(line==0)) Odebrano pierwszy znak hd44780_wait_ready(40) hd44780_outcmd(HD44780_CLR) hd44780_wait_ready(1600) second_nl_seen=false if (c == n) if (line==0) line++ hd44780_outcmd(HD44780_DDADDR(64)) Adres pierwszego znaku drugiej linii hd44780_wait_ready(1000) else second_nl_seen=true line=0 else hd44780_outdata(c) hd44780_wait_ready(40)

Funkcja ta ze wzgl du na skomplikowane adresowanie pami ci DDRAM jest zale naod konkretnego modelu modu u LCD B dzie prawid owo wspoacute pracowa z modu a-mi 2times16 2times20 i 2times40 znakoacutew W przypadku innych modu oacutew pozycje niektoacuterychznakoacutew mog by nieprawid owe

Mo emy ju wy wietla na LCD pojedyncze znaki czas na wy wietlanie tekstu Po-niewa teksty jako sta e dla zaoszcz dzenia cennej pami ci RAM przechowuje si za-zwyczaj w pami ci FLASH zdefiniujmy funkcj odczytuj c podany a cuch zna-kowy z pami ci FLASH a nast pnie umieszczaj c go na LCD

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 55

void lcd_puttext_P(prog_char txt) char ch while((ch=pgm_read_byte(txt))) lcd_putchar(ch) txt++

Powy sza funkcja wysy a kolejne znaki odczytane z pami ci FLASH na LCD za po-moc funkcji LCD_putchar Po napotkaniu znaku ko ca a cucha (0 nul) przerywa swojedzia anie

Pozostaje nam przetestowa dzia anie przedstawionych funkcjiint main() lcd_init() lcd_puttext_P(PSTR(Test LCDnDruga linia)) while(1)

Na ekranie modu u LCD powinien wy wietli si napisTest LCDDruga linia

Je li na LCD nic nie widzimy to w pierwszej kolejno ci powinni my sprawdzi kon-trast zmieniaj c napi cie na pinie Vee modu u LCD

Warto zdefiniowa jeszcze funkcj ustawiaj c pozycj od ktoacuterej b dzie wy wietlanynast pny znak

void lcd_goto(uint8_t x uint8_t y) hd44780_outcmd(HD44780_DDADDR(0x40y+x)) hd44780_wait_ready(1000)

Funkcja ta przyjmuje dwa parametry x i y okre laj ce pozycj na ktoacuterej zostaniewy wietlony nast pny znak wys any z mikrokontrolera do modu u LCD Dzi ki temuz atwo ci mo emy uaktualnia zawarto LCD bez konieczno ci ponownego prze-sy ania wszystkich danych Funkcja ta jest zale na od typu zastosowanego modu u

Ostatni funkcj jest funkcja umo liwiaj ca czyszczenie zawarto ci pami ci modu uOdpowiedzialne za to jest proste polecenie wysy ane do sterownika

void lcd_cls() hd44780_outcmd(HD44780_CLR) hd44780_wait_ready(false)

Oproacutecz czyszczenia zawarto ci pami ci modu u powoduje ono ustawienie kursoraw punkcie (00)

Kup książkę Poleć książkę

56 AVR Uk ady peryferyjne

Definiowanie w asnych znakoacutewUk ad HD44780 jest wyposa ony w 64 bajty pami ci CGRAM (ang Character Ge-nerator RAM) ktoacutera mo e przechowywa mapy bitowe 8 znakoacutew o matrycy 5times8 pikselilub 4 znakoacutew o matrycy 5times10 pikseli Przyk ad definicji znaku na matrycy 5times8 poka-zano na rysunku 223

Rysunek 223Przyk ad definicji w asnego znakuw pami ci CGRAM Znak rysujemyna matrycy 5times8 bitoacutew polazaciemnione odpowiadaj warto ci 1pola bia e warto ci 0 Wartowyliczon dla ka dej linii pikseliwpisujemy do pami ci CGRAMsterownika Najstarsze 3 bity ka degobajta (pola szare) s bez znaczeniamdash wy wietlacz pomija jeprzy wy wietlaniu obrazu

1

2

3

4

5

6

7

0 00100 = 4

01110 = 14

11111 = 31

00100 = 4

00100 = 4

00100 = 4

11111 = 31

01110 = 14

Adres Warto

Dost p do tej pami ci jest mo liwy dzi ki wys aniu polecenia ustawiaj cego adreszapisuodczytu pami ci CGRAM Po jego wys aniu wszystkie operacje zapisu i od-czytu dotycz tej pami ci a nie pami ci DDRAM Aby wroacuteci do adresowania pa-mi ci DDRAM nale y wybra jej adres lub dokona operacji wymagaj cej przesu-ni cia kursora

Pami CGRAM jest pami ci ulotn po ponownym w czeniu zasilania definicjeznakoacutew musz by ponownie przes ane przez procesor

Bity o warto ci 1 w definicji znaku odpowiadaj w czonym pikselom bity o warto-ci 0 pikselom wy czonym Najstarsze 3 bity ka dego bajta w pami ci CGRAM s

bez znaczenia mdash te pozycje nie s wy wietlane przez matryc Definiuj c znak nale-y tak e pami ta e ostatnia linia wy wietlana przez matryc (w zale no ci od wiel-

ko ci matrycy znaku linia 8 lub 10) powinna zawiera same zera mdash w tej linii b dziewy wietlany kursor

Najcz ciej matryce LCD pod czone do sterownika HD44780 maj organizacj 5times8czyli jeden znak jest definiowany przez 8 kolejnych bajtoacutew okre laj cych stan po-szczegoacutelnych linii tworz cych znak Stwoacuterzmy funkcj ktoacuterej zadaniem b dzie za a-dowanie definicji znakoacutew z pami ci FLASH mikrokontrolera do pami ci CGRAM

void lcd_defchar_P(uint8_t charno prog_uint8_t chardef) hd44780_outcmd(HD44780_CGADDR(charno8)) hd44780_wait_ready(40) for(uint8_t c=0clt8c++) hd44780_outdata(pgm_read_byte(chardef))

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 57

hd44780_wait_ready(40) chardef++

Funkcja LCD_defchar_P jako argumenty przyjmuje numer definiowanego znaku (0 ndash 7)oraz wska nik do obszaru pami ci FLASH zawieraj cego definicj znaku (obszarten zajmuje 8 nast puj cych po sobie bajtoacutew) Jak widzimy funkcja najpierw ustawiaw a ciwy adres pod ktoacuterym znajdzie si pocz tek definicji znaku w pami ci CGRAMmdash poniewa jeden znak jest opisywany za pomoc 8 bajtoacutew kolejne adresy znakoacutewto kod_znakutimes8 Nast pnie dane opisuj ce znak s adowane z pami ci mikrokontrolerai zapisywane w pami ci CGRAM sterownika Poni szy program ilustruje wykorzy-stanie funkcji LCD_defchar_P

prog_uint8_t char1[8][8]=0000000255 00000025525500000255255255 0000255255255255 00025525525525525500255255255255255255 0255255255255255255255255255255255255255255255

int main() for(uint8_t x=0xlt8x++) lcd_defchar_P(xampchar1[x][0]) Za aduj wzorce znakoacutew lcd_init() for(uint8_t x=0xlt8x++) lcd_putchar(x) Wy wietl znaki o kodach 0 ndash 7 while(1)

W pierwszej linii funkcji main nast puje za adowanie nowych definicji znakoacutew dopami ci CGRAM nast pnie inicjalizowany jest wy wietlacz po czym w pierwszejlinii s wy wietlane znaki o kodach 0 ndash 7 a wi c znaki ktoacuterych definicja zosta aprzes ana z mikrokontrolera

Zauwa e pami CGRAM podobnie jak DDRAM mo emy zapisywa i odczytywaprzed inicjalizacj modu u LCD Proces inicjalizacji jest potrzebny tylko do prawi-d owego wy wietlania na ekranie LCD

Poniewa dane potrzebne do wy wietlenia znaku s na bie co pobierane z pami cipodczas od wie ania matrycy LCD jakiekolwiek zmiany w definicji znaku kiedy jest onwidoczny na LCD poci gaj za sob natychmiastowe zmiany w wy wietlanym obrazieMo na t w a ciwo sterownika wykorzysta do stworzenia prostych animacji

void lcd_box(uint8_t y) hd44780_outcmd(HD44780_CGADDR(0)) Zaczynamy od znaku o kodzie 0 hd44780_wait_ready(40) for(uint8_t c=0cltyc++) Stwoacuterz linie z w czonymi pikselami hd44780_outdata(0xFF) hd44780_wait_ready(40) for(uint8_t c=yclt8c++) Stwoacuterz linie z wy czonymi pikselami hd44780_outdata(0x00) hd44780_wait_ready(40)

Kup książkę Poleć książkę

58 AVR Uk ady peryferyjne

int main() lcd_init() lcd_putchar(0) while(1) for(uint8_t x=0xlt8x++) lcd_box(x) _delay_ms(100) for(int8_t x=7xgt=0x--) lcd_box(x) _delay_ms(100)

Funkcja main wy wietla na LCD tylko jeden znak o kodzie 0 a nast pnie cykliczniezmienia jego definicj w pami ci CGRAM W efekcie posta znaku wy wietlana naekranie ci gle si zmienia

Transakcyjna obs uga LCDPokazana do tej pory obs uga LCD alfanumerycznego mia a pewne wady Jak wiemyoperacje odwo uj ce si do kontrolera LCD s niezwykle wolne cykl odczytuzapisudowolnego rejestru kontrolera trwa co najmniej 1600 ns co dla MCU taktowanegozegarem 32 MHz przek ada si na czas wykonania oko o 52 instrukcji asemblera Cogorsza wi kszo komend realizowanych przez kontroler jest wykonywana w czasieoko o 37 s co przek ada si na tysi ce zmarnowanych taktoacutew MCU St d te jaki-kolwiek zapisodczyt LCD to z perspektywy programu straszne marnotrawstwo czasu

Problem ten dotyczy ka dego urz dzenia IO ktoacutere dzia a wolniej ni procesor W takiejsytuacji warto napisa pewn warstw po redni mdash sterownik mdash ktoacuterego zada-niem b dzie buforowanie da dost pu do urz dzenia i rozstrzyganie konfliktoacutewdzi ki czemu roacute ne cz ci programu b d bdquomia y wra enierdquo e maj wy czny do-st p do urz dzenia

Pokazane wcze niej funkcje obs ugi LCD maj jeszcze jedn wad mdash nie s wspoacute bie -ne czyli nie mo na ich wykonywa jednocze nie w kilku miejscach programu w tymw szczegoacutelno ci w programie g oacutewnym i w funkcjach obs ugi przerwa W wielu przy-padkach ta wada jest bez znaczenia jednak czasami jest uci liwa mdash dla przyk adugdy na wy wietlany tekst chcieliby my na o y inne informacje np o dacie lub godzi-nie Oczywi cie wy wietlanie mo na zorganizowa tak aby nie by o potrzeby pisaniawspoacute bie nego kodu np poprzez zastosowanie bufora pami ci VRAM kontrolera LCDRodzi to jednak kolejne problemy i jest ma o eleganckie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 59

Zastanoacutewmy si w jaki sposoacuteb najlepiej jednocze nie rozwi za problem wolnegodost pu do urz dzenia i wspoacute bie no ci kodu Rozwi zaniem mo e by wprowadze-nie tzw transakcji Transakcj nazywamy zbioacuter operacji tworz cych pewn ca-o To co wyroacute nia tak wykonywany zestaw operacji to atomowo spoacutejno

izolacja i trwa o Pod tymi terminami kryje si istota wykonywanej operacji Ato-mowo transakcji zapewnia e jest ona wykonywana w sposoacuteb niepodzielny co gwa-rantuje nam prawid ow wspoacute prac z danym urz dzeniem IO w tym przypadku kon-trolerem LCD Wa na dla nas jest tak e izolacja mdash dzi ki temu inne operacje na LCD(inne transakcje) nie b d mia y wp ywu na wynik aktualnie wykonywanej transakcjimdash nie b d zak oacuteca y jej wykonania z drugiej strony nasza transakcja nie zak oacuteciwykonania innych Trwa o z kolei zagwarantuje nam e je li sterownik potwierdziwykonanie transakcji to znaczy e efekt jej dzia ania jest wy wietlony na LCD Tacecha nie jest nam a tak potrzebna mdash jest ona wydawa oby si oczywista Niemniej jestto pewna gwarancja e ca a operacja przebieg a poprawnie i w efekcie LCD znajdujesi w okre lonym przez nas stanie Tyle teorii przejd my do praktyki

Kody poni szego przyk adu znajduj si w katalogu PrzykladyLCD-alfaLCD-transact

Aby zapewni transakcyjny dost p do LCD musimy stworzy pewne struktury danychktoacuterych zadaniem b dzie przechowywanie informacji o operacjach sk adaj cych sina transakcje i stanie ich wykonania W tym celu pos u ymy si wiadomo ciami z roz-dzia u 5 bdquoJak uporz dkowa chaos czyli z o one typy danych i listyrdquo Do przecho-wywania oczekuj cych transakcji pos u ymy si buforem pier cieniowym zanimjednak go zaimplementujemy zastanoacutewmy si jak powinna wygl da struktura prze-chowuj ca informacje o transakcji Struktura ta powinna zawiera co najmniej

pole danych (data) z informacjami ktoacutere maj by przes ane do kontrolera LCD

pole okre laj ce liczb danych do wys ania (len)

pole okre laj ce realizowane polecenie dla LCD (cmd) mdash pole to pos u yprogramowi sterownika do w a ciwej interpretacji danych znajduj cych siw polu data

kilka poacutel kontrolnych przechowuj cych informacje potrzebne do realizacjisamej transakcji Jedno z nich mdash Ready mdash b dzie przyjmowa warto trueje li dana transakcja zosta a zrealizowana lub false w przeciwnym przypadkuZnaczenie drugiego pola mdash SelfDel mdash mo e wydawa si nieco enigmatycznepole to okre la czy pami przydzielona dla transakcji ma by zwolnionaw sterowniku LCD (warto true) czy te zostanie zwolniona w programie(warto false)

Oto jak mo e wygl da struktura definiuj ca transakcj typedef struct volatile bool Ready 1 true je li transakcja zosta a zrealizowana bool SelfDel 1 true je li pami przydzielona transakcji ma zosta zwolniona LCD_Cmd cmd 2 Polecenie do zrealizowania uint8_t len 6 D ugo polecenia

Kup książkę Poleć książkę

60 AVR Uk ady peryferyjne

unsigned 0 Wyroacutewnanie do granicy bajta uint8_t data[] Dane transakcji LCD_trans

Nale y zwroacuteci uwag na poleunsigned 0

Nie definiuje ono adnego pola struktury ale jedynie informuje kompilator e kolejnepole (w naszym przyk adzie o nazwie data) ma by wyroacutewnane do granicy bajta mdashdzi ki temu dost p do kolejnego pola b dzie odbywa si szybciej Z kolei samo poledata jest zadeklarowane jako tzw typ niekompletny

Typ niekompletny (ang incomplete type) to typ ktoacuterego rozmiaru nie da si okre li

W pokazanym przyk adzie rozmiaru pola data nie da si okre li gdy zosta on za-deklarowany jako typ tablicowy z tym e nie podano wielko ci tablicy Wielko ci niepodano gdy na etapie deklaracji struktury nie wiemy jakiej wielko ci dane b d w niejprzechowywane Tego typu deklaracja ma bardzo powa ne konsekwencje mdash skorowielko ci pola data nie da si okre li to jaki b dzie wynik dzia ania operatora sizeof(LCD_trans) Kompilator stara si jako wybrn z tej sytuacji w zwi zku z czym

zwroacuteci wielko struktury ale tak jakby pole data w ogoacutele nie istnia o mdash jego roz-miar b dzie wynosi 0 W ramach wiczenia zastanoacutew si ile bajtoacutew pami ci b dziezajmowa a struktura LCD_trans

Skoro dysponujemy ju struktur przechowuj c poszczegoacutelne transakcje pora nastworzenie obiektu przechowuj cego kolekcj transakcji Dodanie kolejnej strukturyb dzie polega o na dodaniu jej do takiego obiektu z drugiej strony program sterownikaLCD b dzie moacuteg z tej kolekcji pobiera kolejne transakcje do realizacji Opis ten przy-pomina opis dzia ania bufora pier cieniowego mdash z jednym wyj tkiem mdash po zape nie-niu ca ego bufora nie b dziemy usuwa niezrealizowanych transakcji lecz zabloku-jemy dodawanie kolejnych W tym celu pos u ymy si definicj nast pnej struktury

typedef struct LCD_trans elements[LCD_MAXTRANS] Wska niki do transakcji uint8_t Beg Pierwszy element bufora uint8_t Count Liczba elementoacutew w buforze CircBuffer

Struktura ta zawiera deklaracj tablicy wska nikoacutew na transakcje (pole elements)Poniewa jest to tablica musimy zna liczb jej elementoacutew mdash jest ona zadeklarowanaw sta ej LCD_MAXTRANS

define LCD_MAXTRANS 10 Maksymalna liczba pami tanych transakcji

Do realizacji bufora s potrzebne jeszcze dwa pola Beg wskazuj ce na pierwsztransakcj w buforze oraz pole Count okre laj ce liczb transakcji znajduj cych siw buforze Je li Count == 0 to znaczy e w buforze nie ma adnych oczekuj cychtransakcji a je li Count == LCD_MAXTRANS to znaczy e bufor jest pe ny i nie mo na

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 61

dodawa do niego kolejnych transakcji W a ciwo t wykorzystuj dwie zdefiniowanew pliku LCD_transc funkcje

static inline bool cbIsFull(CircBuffer cb) return cb-gtCount == LCD_MAXTRANS

static inline bool cbIsEmpty(CircBuffer cb) return cb-gtCount == 0

Jak pami tamy w przypadku funkcji modyfikatory static inline powoduj e danafunkcja nie b dzie istnie jako samodzielna lecz w ka dym miejscu w ktoacuterym jestwywo ywana jest wstawiany raczej jej kod a nie wywo anie Ma to znaczenie dlakroacutetkich funkcji (a wi c takich jak pokazane powy ej) dla ktoacuterych koszty wywo anias zazwyczaj wi ksze ni koszty umieszczenia cia a funkcji w miejscu jej wywo aniaTego typu funkcje zachowuj si w sposoacuteb zbli ony do makrodefinicji (z tym e re-spektuj wszystkie regu y j zyka C w szczegoacutelno ci kolejno operatoroacutew czy kon-trol typoacutew)

Takie funkcje jako argument pobieraj adres bufora na ktoacuterym maj operowa W na-szym przypadku bufor jest zdefiniowany nast puj co

static CircBuffer LCD_TransBuffer Bufor na transakcje

Nale y zauwa y e jest on zdefiniowany jako struktura globalna z modyfikatoremstatic Modyfikator ten ogranicza zasi g widoczno ci zmiennej LCD_TransBuffer dopliku w ktoacuterym zmienna ta zosta a zdefiniowana (w tym przypadku modyfikator staticjest niejako przeciwie stwem modyfikatora extern) Dzia anie to ma jedynie znaczeniekosmetyczne mdash uniemo liwia odwo anie si do bufora za pomoc funkcji ktoacutere niezosta y zdefiniowane w miejscu jego definicji Oproacutecz funkcji umo liwiaj cych okre-lenie stanu bufora potrzebne s jeszcze funkcje umo liwiaj ce dodanie i pobranie trans-

akcji Pierwsz funkcj b dzie funkcja dodaj ca transakcj do buforabool cbAdd(CircBuffer cb LCD_trans elem) ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsFull(cb)) return false Czy jest miejsce w kolejce uint8_t end = (cb-gtBeg + cb-gtCount) LCD_MAXTRANS cb-gtelements[end] = elem Dodaj transakcj ++cb-gtCount Liczba elementoacutew w buforze return true Wszystko OK

Funkcja ta dodaje transakcj (zmienna elem) do bufora ko owego Zanim transakcjazostanie dodana sprawdzane jest czy w buforze jest miejsce mdash je li nie funkcjazwroacuteci false Je li dodanie jest mo liwe warto licznika okre laj cego liczb trans-akcji przechowywana w buforze (Count) zwi ksza si o jeden Warto zastanowi si te dlaczego praktycznie ca e cia o tej funkcji jest zamkni te w sekcji atomowej (ATOMIC_BLOCK) Jedn z cech naszego sterownika ma by mo liwo wspoacute bie nego dost pu

Kup książkę Poleć książkę

62 AVR Uk ady peryferyjne

do LCD mdash to znaczy e danie np zapisu do LCD mo e wyst pi zaroacutewno w g oacutewnejp tli programu jak i asynchronicznie w przerwaniu St d te wynika e funkcja do-daj ca transakcj musi by napisana w sposoacuteb zapewniaj cy jej poprawn prac w sytu-acji gdy zostanie ona przerwana i ponownie wywo ana przed zako czeniem dzia aniajej poprzedniej instancji Umieszczenie cia a tej funkcji w sekcji atomowej nam to za-pewnia mdash dzi ki temu bufor transakcji zawsze b dzie spoacutejny Dla zaspokojenia cie-kawo ci warto usun sekcj atomow i sprawdzi jak wtedy b dzie zachowywa si tafunkcja i jak wp ynie to na spoacutejno przechowywanych danych

Drug niezb dn funkcj jest funkcja odczytuj ca bufor transakcji i zwracaj ca trans-akcj do zrealizowania (lub NULL je li adnej transakcji nie ma w buforze)

LCD_trans cbRead(CircBuffer cb) LCD_trans elem ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsEmpty(cb)) return NULL Bufor pusty nie mo na zwroacuteci elementu elem = cb-gtelements[cb-gtBeg] cb-gtBeg = (cb-gtBeg + 1) LCD_MAXTRANS -- cb-gtCount Zmniejszamy liczb elementoacutew pozosta ych w buforze return elem

Funkcja ta jest bardzo podobna do poprzedniej mdash najpierw sprawdza czy bufor za-wiera jak oczekuj c transakcj (cbIsEmpty(cb)) je li tak to zwraca adres opisuj -cej j struktury i zmniejsza liczb transakcji oczekuj cych (pole Count) W ten sposoacutebmamy zrealizowan ca funkcjonalno zwi zan z obs ug bufora pier cieniowegoPokazane funkcje s uniwersalne i z bardzo podobnych (lub wr cz tych samych) b -dziemy korzysta w kolejnych rozdzia ach w kontek cie np obs ugi transakcji zwi -zanych z interfejsami szeregowymi

Pora przej do samego sterownika LCD Jego zadaniem b dzie sprawdzenie czyw buforze oczekuj jakie transakcje do realizacji a je li tak to ich wykonanie Ponie-wa dane do LCD mog by wysy ane co okre lony minimalny czas znacznie d u -szy ni czas jakiego na to zadanie potrzebuje mikrokontroler do wysy ania kolejnychpaczek danych pos u ymy si timerem Timer b dzie generowa przerwanie nadmiaru(TCD0_OVF_vect) ktoacutere b dzie wyznacza o tempo w jakim kolejne porcje danych b -d trafia y do LCD Z noty katalogowej kontrolera wynika e minimalny czas trwa-nia wysokiego stanu sygna u Enable to 230 ns a okres tego sygna u nie powinien bykroacutetszy ni 500 ns Poniewa nasz dost p do LCD odbywa si w sposoacuteb nieblokuj cyMCU wi c szybko wysy ania danych do LCD jest bez znaczenia St d te w poka-zanym przyk adzie przyj to e dane b d wysy ane co 4 s co okre la sta a

define LCD_ACCESSTIME 0000004

Poniewa komunikacja z LCD odbywa si w sposoacuteb nieblokuj cy nie zale y nam tena czasie (i tak w stosunku do czasu od wie ania samego LCD jest on bardzo kroacutetki)w efekcie nie ma potrzeby odczytywania flagi busy kontrolera Dzi ki temu w cz ciprzypadkoacutew mo emy w ogoacutele zrezygnowa z sygna u wyboru RW i wymusi jego sta y

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 63

poziom logiczny umo liwiaj cy zapis do LCD Dzi ki temu mo na zaoszcz dzi do-datkowy pin IO1

Ca a logika naszego sterownika jest zawarta w funkcji obs ugi przerwania przepe nieniatimera (TCD0_OVF_vect) Poniewa LCD jest po czony z MCU w trybie 4-bitowym(dla zaoszcz dzenia liczby wykorzystanych pinoacutew IO) kolejne 8-bitowe dane muszby podzielone na dwie tetrady i wys ane do LCD w kolejno ci starszam odsza tetradaInformacja o aktualnie wysy anych danych jest umieszczona w zmiennej trans o typie

static struct uint8_t pos 6 Pozycja w polu danych aktualnej transakcji uint8_t nibble 1 Ktoacutera tetrada jest wysy ana seq

Dlaczego tak Dzi ki wykorzystaniu struktury i poacutel bitowych mo na zaoszcz dzi je-den bajt pami ci SRAM Ze wzgl du na wielko pami ci obs ugiwanej przez kon-troler LCD mo emy by pewni e transakcje zawieraj ce wi cej ni 63 bajty s ra-czej nierealne (nie mia yby wi kszego sensu) St d te do przechowywania informacjio aktualnie wysy anym bajcie danych wystarczy 6 bitoacutew mdash tyle samo zosta o wyko-rzystanych do okre lenia d ugo ci pola danych transakcji w strukturze LCD_trans Zaosz-cz dzony bit mo na po wi ci na flag nibble okre laj c ktoacutera tetrada (m odszastarsza)jest wysy ana Bez poacutel bitowych flaga ta zaj aby dodatkowy bajt pami ci

Przejd my do implementacji sterownika Pierwsz rzecz jak nale y sprawdzi jestto czy w buforze czeka jaka transakcja do zrealizowania Odpowiedzialny za to jestfragment kodu obs ugi przerwania nadmiaru timera

if(trans == NULL) Nic do zrobienia sprawd my czy jaka transakcja oczekuje trans=cbRead(ampLCD_TransBuffer) Czy jest jaka oczekuj ca transakcja seqpos=0 seqnibble=0 if(trans == NULL) TCD0_CTRLA=TC_CLKSEL_OFF_gc Nie ma adnych transakcji mdash wy cz timer

W przypadku gdy adna transakcja nie oczekuje na realizacj timer jest wy czanymdash dzi ki temu nie b d zg aszane kolejne przerwania przepe nienia i MCU nie b -dzie traci czasu na ich obs ug Co prawda wynikaj cy z tego zysk czasowy jest mar-ginalny lecz ma to istotniejsz konsekwencj mdash w przypadku usypiania MCU zb d-ne przerwanie timera nie b dzie niepotrzebnie wybudza o procesora W takiej sytuacjiponowne w czenie timera nast pi dopiero w funkcji dodaj cej transakcj do kolejkimdash a wi c w sytuacji gdy mamy pewno e istnieje oczekuj ca transakcja

Druga cz funkcji obs ugi przerwania jest zwi zana z realizacj samej transakcjiW pokazanym przyk adzie zaimplementowano tylko jeden typ transakcji mdash daniezapisu a cucha tekstowego pod wskazany adres VRAM (na okre lonej pozycji LCD)Je li zajdzie taka potrzeba programista mo e zaimplementowa inne polecenia i doda

1 Warto zauwa y e w bdquoklasycznejrdquo obs udze LCD te nie musimy czyta stanu flagi busy zamiast tego

wystarczy wprowadza p tle opoacute niaj ce Jednak poniewa taka obs uga blokuje MCU nie jest onazalecana Wady tej nie ma dost p transakcyjny co jest jego dodatkow zalet

Kup książkę Poleć książkę

64 AVR Uk ady peryferyjne

kod odpowiedzialny za ich obs ug Zauwa my e ka da transakcja musi zawieraadres pocz tku pami ci wideo od ktoacuterego b dzie zapisywany tekst Dzieje si takdlatego e transakcja wykonana wcze niej mo e ustawi wska nik zapisu na dowolnejkomoacuterce pami ci W efekcie tekst z kolejnej transakcji by by wy wietlany od komoacuterkina ktoacuterej zako czy si zapis poprzedniej transakcji Takie dzia anie oczywi cie jestniedopuszczalne st d te ka dy zapis do pami ci wideo poprzedza ustawienie rejestruindeksowego Problem ten mo na rozwi za tak e w inny sposoacuteb mdash poprzez wpro-wadzenie tzw uchwytoacutew (ang handlers) ktoacutere zawiera yby stan kontrolera LCDNiemniej to rozwi zanie dodatkowo komplikowa oby nasz sterownik Struktura danych(zawartych w polu data) ma wi c nast puj cy format

bajt nr 0 zawiera warto pozycji od ktoacuterej nale y dokonywa zapisu pami ciwideo mdash jest to warto przesy ana do rejestru okre laj cego adres zapisu

kolejne bajty zawieraj a cuch znakowy ktoacutery nale y umie ci w pami ciCGRAM

Poniewa bajt nr 0 zawsze zawiera warto wpisywan do rejestroacutew steruj cych kon-trolera podczas jego wysy ania jest ustawiana linia RS sygnalizuj ca zapis do rejestruPodczas wysy ania kolejnych bajtoacutew linia ta jest zerowana w zwi zku z czym zapisodbywa si do pami ci CGRAM

Kod obs uguj cy transakcj wygl da nast puj coif(trans) Jest transakcja do zrealizowania uint8_t dat=trans-gtdata[seqpos] if(seqnibble == 0) datgtgt=4 To trzeba zmieni je li linie danych nie s po czone z pinami 0 ndash 3 portu IO hd44780_outnibble_nowait(dat amp 0x0F seqpos = 0) Zapisujemy rejestr steruj cy lub dane ++seqnibble if(seqnibble == 0) ++seqpos Co drug tetrad zwi kszamy pozycj bufora if(seqpos gt= trans-gtlen) trans-gtReady=true Koniec transakcji if(trans-gtSelfDel) free_re(trans) Zwolnij pami transakcji je li tak sobie yczy programista trans=NULL Koniec transakcji CLR(OUT HD44780_E)

Ta cz przerwania wysy a kolejne tetrady do kontrolera LCD Warto zastanowi sinad dzia aniem sekwencji

++seqnibble

Poniewa pole nibble jest jednobitowe operacja inkrementacji prowadzi do zmianystanu tego pola na przeciwny (pole to ma warto 0 lub 1) Kiedy zostan wys anewszystkie dane przeznaczone dla kontrolera obs uga transakcji ko czy si Stan tensygnalizuje nadanie warto ci true polu Ready struktury LCD_trans Dzi ki temu pro-gram mo e sprawdzi asynchronicznie w stosunku do przerwania kiedy transakcjauleg a zako czeniu Opcjonalnie jest wykonywana jeszcze jedna funkcja mdash je li poleSelfDel ma warto true to pami zarezerwowana na transakcj jest automatycznie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 65

zwalniana W tym celu wykorzystuje si funkcj free_re ktoacuterej prototyp jest zade-klarowany w pliku Alloc_safeh Funkcja ta wywo uje funkcj biblioteczn free ktoacute-ra zwalnia pami przydzielon dynamicznie na stercie Poniewa funkcja ta nie jestfunkcj reentrant nale y stworzy odpowiedni bdquoprotez rdquo opakowuj c j w blokatomowy co zapewnia e nie zostanie ona ponownie wywo ana zanim jej poprzed-nia instancja nie zako czy dzia ania Oczywi cie lepszym rozwi zaniem by oby napi-sanie w asnych funkcji dynamicznej alokacji pami ci ktoacutere b d reentrant

Bardzo wa ne jest aby pole SelfDel mia o warto true wy cznie dla transakcjidla ktoacuterych pami zosta a przydzielona dynamicznie funkcj malloc (lub jej po-chodnymi) W pozosta ych przypadkach pole to musi mie warto false mdash nie-stosowanie si do tej regu y spowoduje b d mened era pami ci i najprawdopo-dobniej nieprzewidywalne dzia anie programu

Drug wa n zasad jest aby zmienna zawieraj ca dane transakcji nie by azmienn automatyczn mdash zmienne takie s automatycznie niszczone po opusz-czeniu zawieraj cej je funkcji W rezultacie obszar pami ci zawieraj cy danetransakcji mo e zosta wykorzystany przez inne zmienne co spowoduje uszkodzeniezawartych w nim danych

Pami przydzielona transakcji musi by alokowana w sposoacuteb dynamiczny (funkcjamalloc_re) ewentualnie mo e to by pami alokowana dla zmiennej globalnej lubstatycznej mdash zmienne tego typu istniej przez ca y czas ycia programu

Warto te zauwa y e instrukcje steruj ce stanem linii Enable kontrolera LCD(SET(OUT HD44780_E) i CLR(OUT HD44780_E)) s rozdzielone wieloma innymi in-strukcjami Dzi ki temu generowany impuls dodatni tego sygna u ma czas trwania gt230 ns wymagany w specyfikacji kontrolera Nawet dla XMEGA taktowanej zegarem32 MHz 230 ns przek ada si na oko o 7 instrukcji asemblera mdash czas jaki z pewno-ci up ynie pomi dzy wykonaniem obu powy szych instrukcji steruj cych

Do wysy ania danych do kontrolera zosta a wykorzystana nieco zmodyfikowanafunkcja hd44780_outnibble_nowait roacute ni ca si od jej protoplasty hd44780_outnibbletylko tym e nie czeka na sygna braku zaj to ci mikrokontrolera (nie realizuje teopoacute nie ) Nie jest to potrzebne gdy kolejne tetrady s wysy ane w odst pach cza-sowych okre lanych przez timer

Mamy wi c zapewnion obs ug transakcji i mo liwo transakcyjnego wy wietlaniadanych na LCD musimy jeszcze mie funkcj ktoacutera tworzy odpowiednie transakcjemdash jest odpowiednikiem funkcji bezpo rednio wysy aj cej dane znakowe do LCDOdpowiednikiem tym jest pokazana poni ej funkcja

bool LCD_PutText_B(uint8_t x uint8_t y char txt LCD_trans buf bool autodel) buf-gtcmd=LCD_Text buf-gtReady=false buf-gtSelfDel=autodel Czy zwolni pami po zako czeniu transakcji buf-gtdata[0]=HD44780_DDADDR(x+y0x40) Ustaw adres w DDRAM strcpy((char)ampbuf-gtdata[1] txt) Skopiuj dane tekstowe + NULL

Kup książkę Poleć książkę

66 AVR Uk ady peryferyjne

buf-gtlen=strlen(txt) + 1 D ugo tekstu + pozycji + NULL ndash 1 bool ret=cbAdd(ampLCD_TransBuffer buf) if((ret==false) ampamp (autodel)) free_re(buf) Brak miejsca w kolejce else TCD0_CTRLA=TC_CLKSEL_DIV1_gc Preskaler 1 mdash odblokuj timer return ret

Funkcja ta buduje transakcj odpowiedzialn za wy wietlenie napisu txt na wskaza-nej pozycji x y LCD Wszystkie dane o transakcji zostan umieszczone w buforzew pami ci ktoacuterej adres jest okre lany wska nikiem buf Pami w buforze musi bywystarczaj co du a aby pomie ci ca transakcj Dodatkowy parametr autodel okre laczy pami ta ma by automatycznie zwalniana po obs u eniu transakcji (true) czynie (false) Je li transakcj uda o si umie ci w kolejce funkcja zwraca true Wartozauwa y e w takim przypadku funkcja uruchamia te timer (w naszym przypadkujest to timer TCD0) odpowiedzialny za generowanie przerwania Funkcja obs ugi prze-rwania wysy a dane do LCD

Pewn odmian powy szej funkcji jest funkcjabool LCD_PutText(uint8_t x uint8_t y char txt) LCD_trans trans=malloc_re(sizeof(LCD_trans) + strlen(txt) + 2) bool ret=LCD_PutText_B(x y txt trans true) return ret

Wykorzystuje ona funkcj LCD_PutText_B z tym e najpierw alokuje dynamiczniepami potrzebn na przechowanie tworzonej transakcji

Mamy komplet potrzebnych funkcji a wi c sprawd my jak ca o sprawdza siw praktyce W pliku LCD-transactc znajduje si kod pokazuj cy jak dzia aj naszetransakcje Aby to by o mo liwe nale y zainicjalizowa kontroler LCD

LCD_init()

Wykorzystujemy tu znan ju funkcj inicjalizuj c mdash nie ma potrzeby jej zmienia gdy operacja inicjalizacji LCD jest jednorazowa i nie trzeba wykonywa jej w posta-ci transakcji W drugim kroku musimy zainicjalizowa wykorzystywany timer i systemprzerwa

LCD_Timer_init(ampTCD0)PMIC_CTRL|=PMIC_LOLVLEN_bm Odblokuj przerwania niskiego poziomusei()

Poniewa dost p do LCD z pewno ci nie jest czynno ci krytyczn czasowo prze-rwaniom timera nadano najni szy priorytet Dzi ki temu mo na innym bardziej kry-tycznym przerwaniom nada wy sze priorytety i uzyska w ten sposoacuteb zmniejszenieczasu latencji obs ugi przerwa Sama inicjalizacja timera jest niezwykle prosta

void LCD_Timer_init(TC0_t tc) tc-gtINTCTRLA=TC_OVFINTLVL_LO_gc Odblokuj przerwania nadmiaru timera i nadaj im niski priorytet tc-gtPER=F_CPULCD_ACCESSTIME Przerwanie co 4 us (niezale nie od F_CPU)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 67

Sprowadza si ona tylko do odblokowania mo liwo ci zg aszania przerwania nadmia-ru oraz konfiguracji rejestru PER tak aby przerwania by y generowane co ok 4 s mdashniezale nie od cz stotliwo ci taktowania CPU Mo emy wi c przyst pi do wy wie-tlenia pierwszego napisu

LCD_PutText(00 Numer)

Powy sza funkcja ma jedn wad mdash alokuje dynamicznie pami po ka dym wywo-aniu (pami ta jest automatycznie zwalniana po obs u eniu transakcji) niemniej

ca y proces jest czasoch onny Mo emy tego unikn alokuj c pami bdquor cznierdquo i wielo-krotnie wykorzystuj c zaalokowany blok pami ci Ilustruje to poni szy przyk ad

LCD_trans buf=malloc_re(sizeof(LCD_trans) + 7)

Zmienna buf wskazuje na obszar pami ci ktoacutery mo e pomie ci a cuch 5-znakowyTyle wystarczy na potrzeby tego przyk adu mdash na LCD b d wy wietlane kolejneliczby w zakresie 0 ndash 65 535 najd u sza ma 5 znakoacutew st d te nasz bufor ma tak a nieinn d ugo

while(1) utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(60 bufstr buf false) while(LCD_IsTransCompleted(buf))

Do konwersji liczby na a cuch u yto funkcji bibliotecznej utoa (nag oacutewek stdlibh)Poniewa d ugo a cucha po konwersji jest zmienna (co spowodowa oby pozosta-wianie na LCD bdquoduchoacutewrdquo po poprzednich konwersjach) w kolejnej linii brakuj ceznaki uzupe niono spacjami Nast pnie tworzona jest transakcja w obszarze pami ciprzydzielonym zmiennej buf Ostatnia p tla while jest odpowiedzialna za oczekiwa-nie na zako czenie realizacji transakcji Po jej zako czeniu p tla jest wykonywana odpocz tku

Uwa ny czytelnik z pewno ci zauwa y e pami przydzielana funkcj malloc_renie jest nigdzie zwalniana mdash w normalnej sytuacji spowodowa oby to wyciek pami -ci W naszym przyk adzie jednak program nigdy si nie ko czy nie ma wi c potrzebyzwalniania pami ci wskazywanej przez zmienn buf

Powy szy przyk ad pokazuje jak unikn blokowania CPU na czas dost pu do wolnodzia aj cego urz dzenia jakim jest LCD alfanumeryczny Jednak to nie wszystkiezalety wynikaj ce z zastosowania transakcji Drug wa n zalet naszego rozwi zaniailustruje przyk ad znajduj cy si w katalogu PrzykladyLCD-alfaLCD-transact-intPowa nym ograniczeniem funkcji odpowiedzialnych za dost p do LCD w sposoacutebklasyczny by a niemo no ich wywo ywania z funkcji obs ugi przerwa mdash funkcjeobs ugi LCD nie by y reentrant2 Nasz system oparty na transakcjach nie ma tychwad Aby to zilustrowa zosta stworzony prosty przyk ad mdash tak jak poprzedniow p tli g oacutewnej programu s wy wietlane stale kolejne liczby ale jednocze nie wyko-

2 Poza tym blokowa y CPU na d ugi czas a jak pami tamy funkcje obs ugi przerwa powinny by

wykonywane mo liwie kroacutetko

Kup książkę Poleć książkę

68 AVR Uk ady peryferyjne

rzystano drugi timer (TCD1) w ktoacuterego funkcji obs ugi przerwania przepe nienia jestwy wietlany licznik tych przerwa

ISR(TCD1_OVF_vect) static char int_buf[sizeof(LCD_trans) + 7] static uint16_t cnt char bufstr[6]

utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(61 bufstr (LCD_trans)ampint_buf false)

Jak widzimy w sposoacuteb asynchroniczny z dwoacutech miejsc w programie mo emy uzy-ska dost p do LCD a ka da funkcja bdquoma wra enierdquo e ma LCD na wy czno Przy okazji warto przeanalizowa sposoacuteb w jaki jest rezerwowana pami na trans-akcj w przerwaniu Oczywi cie mo na by wykorzysta dynamiczn alokacj pami cilecz jak wspomniano taka alokacja jest czasoch onna St d te w pokazanym przy-k adzie wykorzystano tablic statyczn int_buf o rozmiarze umo liwiaj cym prze-chowanie kompletnej transakcji Dzi ki temu e zmienna int_buf jest zmienn statycz-n nie jest ona niszczona po zako czeniu funkcji obs ugi przerwania Gdyby pomins owo kluczowe static zmienna ta by aby niszczona a na LCD najprawdopodobniejzacz yby si pojawia przypadkowe tre ci Poniewa pami naszego bufora nie by aalokowana dynamicznie nie mo e ona zosta zwolniona w naszym sterowniku LCDst d te ostatni parametr wywo ania funkcji LCD_PutText_B musi mie warto false

OptymalizacjaPrzy okazji tego i poprzedniego przyk adu warto zastanowi si jeszcze nad jednkwesti mdash optymalizacji W podanych przyk adach wykorzystano wcze niej omoacute-wione funkcje dost pu do wy wietlacza LCD znajduj ce si w plikach hd44780ci hd44780h Wi kszo z zawartych tam funkcji nie jest wykorzystywana jednakkompilator mimo wszystko umieszcza ich kod w pliku wynikowym mdash dzieje si takponiewa nie mo e on bdquostwierdzi rdquo czy funkcje te nie s wykorzystywane w innychfragmentach programu Pami tajmy e kompilator kompiluje poszczegoacutelne pliki roacute-d owe osobno i dana jego instancja nie bdquowierdquo co znajduje si w innych plikach (innychjednostkach kompilacji) Tak ca o ciow wiedz ma dopiero konsolidator (linker)ktoacutery czy stworzone przez kompilator pliki obiektowe (o rozszerzeniu o) w plikwynikowy Linker jednak bdquonie wierdquo ktoacutera z funkcji programu zosta a u yta a ktoacuteranie mdash informacje te ma wy cznie kompilator W ten sposoacuteb powstaje typowe b dneko o w efekcie nasze nieu ywane funkcje nie s usuwane (linker zostawia je bdquonawszelki wypadekrdquo) i zajmuj niepotrzebnie pami Czy mo na temu jako zaradzi Oczywi cie tak W tym celu trzeba po czy si y kompilatora i linkera co zapewniaj od-powiednie opcje kompilacji We w a ciwo ciach projektu (ProjectProperties lub Alt+F7)wybieramy zak adk Toolchain a nast pnie AVRGNU C Compiler i OptimizationZnajdziemy tam pole wyboru o nazwie Prepare functions for garbage collection (ry-sunek 224)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 69

Rysunek 224 Aby da linkerowi mo liwo usuwania nieu ywanych funkcji nale y skompilowaprogram z wybran opcj ndashffunction-sections ktoacutera spowoduje e ka da funkcja programu znajdzie siwe w asnej sekcji

Zaznaczenie tej funkcji spowoduje umieszczenie ka dej funkcji w osobnej sekcji mdashsamo w sobie nie wp ynie to na skroacutecenie kodu wynikowego ale jest warunkiem nie-zb dnym dla podj cia stosownych dzia a przez linker Aby wyeliminowa nieu y-wane funkcje nale y zaznaczy jeszcze w ga zi AVRGNU LinkerOptimization poleGarbage collect unused sections (rysunek 225)

Rysunek 225 Zaznaczenie opcji Garbage collect unused sections (-Wl--gc-sections) spowodujee nieu ywane funkcje zostan usuni te z kodu wynikowego w efekcie kod programu ulegnie skroacuteceniu

Po zaznaczeniu tych opcji program zostanie skroacutecony o kilkaset bajtoacutew Oczywi cieje li wszystkie funkcje by yby wykorzystane nie uzyskaliby my adnego skroacuteceniakodu Niemniej w sytuacji gdy u ywa si bibliotek zazwyczaj przynajmniej czfunkcji nie jest wykorzystywana warto wi c skorzysta z tej mo liwo ci optymalizacji

Kup książkę Poleć książkę

70 AVR Uk ady peryferyjne

Je li mamy do czynienia z prekompilowan bibliotek (lib) to musi ona by skom-pilowana z zaznaczon opcj Prepare functions for garbage collection (-ffunction-sections) Alternatyw jest umieszczenie ka dej funkcji biblioteki w osobnym pliku(tak jak w przypadku bibliotek AVR-libc)

Na ekranie wyboru opcji optymalizacji linkera mamy jeszcze jedn przydatn opcjmdash Relax Branches (-mrelax) Dla mikrokontroleroacutew ktoacutere maj ponad 8 kB pami ciFLASH instrukcje skokoacutew s generowane jako tzw instrukcje d ugie mdash umo liwiajone skok do komoacuterki pami ci FLASH o dowolnym adresie Jednak cen za to jestwyd u enie instrukcji mdash ich kod jest d u szy podobnie jak czas wykonania Nie zawszejednak takie d ugie instrukcje musz by wykonywane mdash je li miejsce docelowe skokule y blisko (w zasi gu instrukcji skokoacutew wzgl dnych) to mo na w kodzie wynikowymzamieni instrukcje d u sze na kroacutetsze co przynosi oszcz dno ci w postaci skroacuteceniakodu wynikowego Poniewa dopiero linker bdquowierdquo jak poszczegoacutelne fragmenty kodus rozmieszczone w pami ci takiej podmiany mo na dokona na etapie linkowaniaprogramu co zapewnia powy sza opcja St d te warto to pole wyboru zaznaczy

Kup książkę Poleć książkę

SkorowidzA

ABI Application Binary Interface 25AC Address Counter 50ADPCM 482adres

bazowy 377bufora 61komoacuterki 84pu apki 202

ALE Address Latch Enable 368alfanumeryczne wy wietlacze 43algorytm ADPCM 492algorytmy stratne 495animacje 57antyaliasing 325architektury procesoroacutew XMEGA 352asembler 23

dyrektywy 40funkcje j zyka C 41obs uga przerwa 39

asynchroniczne wywo anie funkcji 101Atmel Studio 15

Bbajty kalibracyjne 569biblioteka

FATFS 131 139 176 180 517libcallback-liba 99PetitFS 144 149

bitADC_CH0START_bm 236IMPMODE 244

bitrate 442 512blokowanie przerwa 219b d 16 19

kwantyzacji 463offsetu 230wzmocnienia ADC 230

BOD 223bps bits per second 12

budowakarty 152linii obrazu 394pami ci SDRAM 374pliku stymulacji 192ramki PAL 412sygna u PAL 411wtyczki 544 545

bufor 78FIFO 497na transakcje 61transakcji 62

buforowanie wyj cia 294

CCAS Column Address Strobe 375CCFL 44charakterystyka

przetwornikoacutew 222termistora 264tryboacutew pracy 232

CID Card Identification 169CKE Clock Enable 375CLKIN 421COG Chip on Glass 310CRC 158 178CRC16 178CRC7 164CS Chip Select 361 375CSD Card Specific Data 172czas

dost pu do SDRAM 424adowania kondensatora 244

propagacji 281proacutebkowania 260symulacji 209

czcionki 322cz stotliwo

odchylania pionowego 428proacutebkowania 244 441 444 530przebiegu 504

Kup książkę Poleć książkę

576 AVR Uk ady peryferyjne

cz stotliwoPWM 465taktowania koprocesora 549taktowania procesora 209taktowania rdzenia 18

czyszczenie pami ci 318

DDAC Digital to Analog Converter 293 447 451

buforowanie wyj cia 294generowanie przebiegoacutew 301jitter 303kalibracja 306napi cie referencyjne 295system zdarze 297taktowanie 296tryb dwukana owy 301wykorzystanie DMA 298wyzwalanie konwersji 305

datalogger 261 265 275DD Device Density 86debuger 183

programowy 190sprz towy 185 187

decymacja 259DEBUG 219XMEGA 260

definicja symboli globalnych 36definiowanie w asnych znakoacutew 56deklaracja zapowiadaj ca 103 337dekoder DTMF 548 556DMA 254 298 402 458 518 523dost p do

danych 358 359 568danych binarnych 356 360danych wielobajtowych 31DataFLASH 137EEPROM 128FAT 136komoacuterki 375LCD 59 62 66 68operandu 30pami ci 81 384 386 387 561pami ci SDRAM 424pliku blokowy 141portoacutew IO 30rejestroacutew IO procesora 36rejestroacutew uk adu 499SPI 95sygnatury u ytkownika 565 567wska nikoacutew 32

DQM Data Mask 375DSP Digital Signal Processor 535

DTMF 535 553dyktafon 529dynamiczna alokacja pami ci 516dyrektywa global 38dyrektywy asemblera 40dzia anie

DMA 255komparatora 280timeroacutew 400

d wi k 443

EEBI External Bus Interface 361EEPROM 207eliminacja jitteru 24emulacja RS232 139

FFAT File Allocation Table 128 131FAT32 128FATFS 180filtr

dolnoprzepustowy 491drugiego rz du 470pierwszego rz du 469trzeciego rz du 471

filtrowanie sygna u PWM 468firmware 565FLASH 207format

odpowiedzi 159polecenia 158protoko u 157

funkcja_delay_ms 17 219c_zero 42callback 106 341callback() 99DataFLASH_CSEnable 100DF_FinishBufWrite() 269disk_initialize 136disk_ioctl 181disk_status 136disk_write 138DMA_SPI_init 104DTMF_GetCode 553free_re 65GPIOR0_init 507hd44780_outcmd 51hd44780_outnibble_nowait 65LCD_defchar_P 57

Kup książkę Poleć książkę

Skorowidz 577

Menu_Click_Func 515Menu_Free 516Menu_Recorder 532Menu_Run 527MS_CreateRegEntry 117MS_GetDirPos 125MS_GetRegItem 115MS_WritePages 116 118OSC_wait_for_rdy 473RecMenu_StartStop 532sprintf 142strtok 124sysclk_init() 200 209TMF_memcpy_PF 454udi_cdc_getc() 123udi_cdc_is_rx_ready() 123VS1003_Reset 506

funkcjeanalizuj ce 556biblioteczne 50biblioteki FATFS 143j zyka C 41kontrolera ST7565R 313opoacute niaj ce 17opoacute nie 219reentrant 524specjalne kontrolera 319steruj ce 314zapisu 133

fusebit 557BODACT 560BODLEVEL 560BOOTRST 559DVSDON 560EESAVE 561JTAGEN 558RSTDISBL 559SUT 559TOSCSEL 559

fusebity w AVR-libc 571

Ggenerator obrazu composite 426generowanie

d wi ku 461kolorowego obrazu 437obrazu wideo 391przebiegoacutew 301przerwa 285sygna u composite 409

g bia koloru 326gniazdo

karty SD 156VGA 396

Hhistereza 281

IIDE 11IMA ADPCM 483informacje

o kolorze 431o obrazie 434

inicjalizacjakarty 161karty SDHC 167karty SDSC 167karty SDXC 167licznika 419pami ci 119USART 505

instrukcjaicall 42movw 35nop 13 24

interfejsSCI 498SDI 498SPI 71 79RS232 120UART 123USART 71 73

interpolacja 259interpolacja w XMEGA 260inwersja obrazu 319

Jjednostki 12jitter 24 303 420

Kkalibracja

ADC 229DAC 306 564offsetu 237

kana DMA 82 522karta 154 158

mikroSD 152SD 151 152SDHC 151 152 160SDSC 160SDXC 151 160

Kup książkę Poleć książkę

578 AVR Uk ady peryferyjne

karty pami ci 151 152 157biblioteka FATFS 180budowa 152format polecenia 158inicjalizacja 161 167komunikacja 156odczyt danych 173opcje konfiguracyjne 181rejestry specjalne 169tryby pracy 153zapis danych 176zasilanie 154

kodasemblerowy 23 24C 23dost pu 24

kodowanieμ-law 481ADPCM 483Dialogic ADPCM 494informacji 166 426koloru 425znakoacutew 536

kodyformatoacutew audio 501zdarze 545

kolejno bajtoacutew 533kolor 424 430kolorowy obraz 437komparator 422

analogowy 279 280analogowy XMEGA 282okienkowy 284

kompilacja plikoacutew binarnych 350kompilator avr-gcc 11 359kompresja

ADPCM 482 486d wi ku 480IMA ADPCM 482

komunikacja z koprocesorem 504konfiguracja

4-portowa 364biblioteki 133debugera 185DMA 459 522fusebitoacutew 570kontrolera DMA 257 452komparatoroacutew 285lockbitoacutew 570LPC 371pami ci SDRAM 381PetitFS 149pinu IO 225portoacutew IO 362

preskalera 452projektu 186przerwa 219pu apki 203rejestru EVCTRL 248rejestru PER 67SPI 75sygna u CS 377typu czcionki 324urz dze IO 189USART 76zegara 383

konsolidacja 547kontroler

DMA 254 298 402 458 518 523KS108 310ST7565R 310ndash315 321

konwersjaDAC 305sygna oacutew 396wyzwalana 306

konwertercyfrowo-analogowy 426DAC 427

koprocesormp3 496VS1003B 10

korekcja fazy 466kwantyzacja 463

Llampa CCFL 44LE Latch Enable 433licznik 419

cykli 209TCC1 400timera 20

linie IO 50linie sygna owe

MISO 72 164MOSI 72SCK 72SS 72

linker 69lista

mnemonikoacutew 24modyfikowanych rejestroacutew 32

lockbity 557 561lockbity w AVR-libc 570LPC Low Pin Count 371LPCM 443 556LSB Least Significant Bit 228

Kup książkę Poleć książkę

Skorowidz 579

a cuchy formatuj ce 212czenie plikoacutew 352

Mmagistrala pami ci zewn trznej 361magnetofon cyfrowy 528makro _SFR_IO_ADDR() 39makrodefinicja

ASSERT 214HD44780_CGADDR() 53HD44780_CLR 53HD44780_DDADDR() 53HD44780_DISPCTL() 52HD44780_ENTMODE() 52HD44780_FNSET() 52HD44780_HOME 53HD44780_SHIFT() 51LOCKBITS 571

mapowanie sygna oacutew 366mapy bitowe 343marker czasowy 268maski bitowe 329matryce 49menu 335menu piktogramowe 342mierniki temperatury 262mikrokontroler

ARM 9AVR 9PIC 9XMEGA128A3U 10

MISO 72moc wydzielana 265model psychoakustyczny 495modu

alfanumeryczny 45NVM 568Xmega eXploreGO 10Xplained ATXMEGA A3BU 10Xplained ATXMEGA-A1 10Xplained XMEGA128A1 447Xplained XMEGA256A3 94Xplained XMEGA256A3BU 97 143 266

modyfikator 30const 85volatile 28 273

monitory CRT 395monochromatyczne wy wietlacze graficzne 309monochromatyczny

tryb graficzny 416tryb tekstowy 413

MOSI 72mp3 495Msps Megasamples per second 12multiplekser wej ciowy 226 283multipleksowanie adresoacutew 368 369muzyka 439

Nnadawanie kodoacutew DTMF 540nadproacutebkowanie 258nag oacutewek kontenera wav 500nagrywanie mowy 486najmniej znacz cy bit 228napi cie

offsetu 280referencyjne 223 295zasilania 239

Oobracanie obrazu 319obraz 319

composite 426kolorowy 430wideo 391

obroacutebka d wi ku 443 445obs uga

FAT 131 143klawiatury matrycowej 24LCD 58 63 67menu 337przerwania 37 38 458przerwania DMA 525przerwa w asemblerze 39przyciskoacutew 272wy wietlaczy alfanumerycznych 45

odczytblokowy 140danych 173 358

odpowied response 159R1 159R2 159R7 160

od wie anie pami ci 376odtwarzanie

d wi ku 472muzyki 447 513 518 521

offset 238offset ADC 230okno

Breakpoints 202Call stack 209dezasemblera 210

Kup książkę Poleć książkę

580 AVR Uk ady peryferyjne

oknoIO View 207podgl du zmiennych 211wyboru czcionek 324

OLED 46opcje

kompilatora 35zapisu d wi ku 445

operacjena buforach 91odczytu 173zapisu 176zapisu strony 92

operand 29operator

ascii 41

asciz 41

byte 41

section 41opoacute nienia 13 18opoacute nienie zmienne 16optymalizacja 16 68optymalizator 26organizacja pami ci 77organizacja pami ci VRAM 316oscylator 287OSD On-Screen Display 417ostrze enie 16oszcz dzanie energii 94

Ppakiet WinAVR 48pami

CGRAM 56 57 64DataFLASH 10 77 81 113 269DDRAM 49EEPROM 111FLASH 54 124 207RAM 49SDRAM 372SRAM 63 124 329 366 371VRAM 314 317

PCLK 421PCM 443PetitFS 144 149p tla

for 13while 201

pierwsza linia obrazu 321piksel 430piktogram 342pin IO 225

plikAlloc_safeh 65DataFLASHc 83DataFLASHIOc 136definesh 50delayh 14diskioh 132 136ffh 132ffconfh 132 181hd44780h 49integerh 132ioh 30LCD_transc 61LCD-transactc 66Makefile 14Menuc 19nothingo 541outfiletxt 547 551pffh 149SPIh 104stringh 113stymulacji 191 192

pliki mp3 495elf 351fon 323o 24S 24 34binarne 350 355csv 276d wi kowe 440obiektowe 352wav 500WMA 512z czcionkami 327z danymi 349

podbijacz napi cia 315podgl d

pami ci 207stosu wywo a 209zmiennych 211znakoacutew 325

pod czeniefototranzystora 262karty SD 155LCD z kontrolerem 311modu u 50pami ci 362 369 370 373termistora 262uk adu LM35 251wyj XMEGA 398

pod wietlenieCCFL 46OLED 46

Kup książkę Poleć książkę

Skorowidz 581

podwoacutejne buforowanie 255 332 457polecenia

kasowania strony 81konfiguracyjne pami ci 82kontrolera ST7565R 315odczytu bufora 82 89odczytu pami ci 81 88SDRAM 376transferu 91

polecenieACMD41 168cd 181CID 178CMD0 165CMD8 167CSD 178date 276dir 127 181dump 276erase 276get 276HD44780_CLR 51Init 178mkdir 181

po czenieDMA ze SPI 96dwoacutech komparatoroacutew 285koprocesora mp3 497LCD z mikrokontrolerem 48wyj cia XMEGA 411XMEGA z PC 121z telewizorem 431

pomiarnapi cia zasilania 239temperatury MCU 241

port IO 30 362pozycjonowanie grafik 345poacute obraz 410precyzja pomiaroacutew 260preskaler 478preskaler ADC 243program

Atmel Data Visualizer 275Audacity 443avr-objcopy 350dataloggera 265LCD Image Converter 323makeloadingtableexe 543Realterm 127 554riffstrip 483SoX 445Tracepoint 208

programowanie sygnatury u ytkownika 566protokoacute master-slave 157

prototypy 136proacutebki d wi kowe 447proacutebkowanie

8-bitowe 300nieliniowe 480

prymitywy graficzne 330przebieg PWM 468przebiegi 289 303przechwytywanie danych 276przemiatanie wej 253przerwanie 218 254 286 403

DMA 522komparatora 286

przestrze adresowa procesora 378przesy anie

danych 498polece 498

przetaktowanie procesora 436przetwornik

ADC 221analogowo-cyfrowy 221cykliczny 222potokowy 222

przyciski 272pseudooperatory 41pu apki breakpoints 197pu apki warunkowe 205punkty ledzenia 203PWM 461 462 472

RRAS Row Address Strobe 375redukcja poboru energii 242regulacja kontrastu 321rejestr 32 34rejestr AC 50

adresu wtyczki 513BASEADDR 377CID 169CMP 251CSD 172czasu utworu 512DATA 83EVCTRL 248formatu audio 512identyfikacyjny pami ci 87INTFLAGS 252kontroli basoacutew 510kontroli g o no ci 513MUXCTRL 227OCR 168PER 67poroacutewnania 249

Kup książkę Poleć książkę

582 AVR Uk ady peryferyjne

rejestr ACSCI_CLOCKF 511stanu komparatora 287stanu pami ci 86stanu uk adu 510trybu pracy 508WINCTRL 285

rejestrydost pu do pami ci RAM 513GPIOR 502IO procesora 36mikrokontrolera 25procesora 35specjalne 94specjalne karty 169uk adu VS1003B 508

relacja rodzic ndash dziecko 336reset uk adu 534rozdzielczo

LCD 329przetwornika 231PWM 463 477

rozszerzenie HiRes 477 479roacutewnanie Steinharta-Harta 263rysowanie map bitowych 343

Sschemat uk adu dataloggera 267SCI Serial Command Interface 498SCK 72SD Secure Digital 152SDI Serial Data Interface 498separator synchronizacji 422separowanie impulsoacutew synchronizacji 422shieldy 10skaler 422skaler napi cia 283skrypt makefile 353s owo kluczowe

asm 27extern 37static 68

specyfikatory lokalizacji zmiennej 213sps samples per second 12SS Slave Select 72standard PAL 410standard VGA 393sterowanie

dataloggerem 275sygna em 379

sterownik 121HD44780 49 56LCD 49 62

stos wywo a 209

strukturaFATFS 139Handle 118LCD_trans 60 63menu 338rejestru 86SimpleFSEntry 113 116SimpleFSHandle 113 118 140submenu 527systemu plikoacutew 112

sumabitowa 571kontrolna 178

sygnacomposite 409composite video output 430CS 377DREQ 497H-Sync 396synchronizacji 423V-Sync 396zegarowy CLK 374

sygna yinterfejsu EBI 363magistrali EBI 364steruj ce 375

sygnaturaprodukcyjna procesora 563u ytkownika 565

symbol__DELAY_ROUND_CLOSEST__ 17__DELAY_ROUND_DOWN__ 17_FS_FAT12 149_FS_FAT32 149_FS_MINIMIZE 133_FS_READONLY 133_FS_RPATH 135_FS_TINY 133_MAX_SS 135_MULTI_PARTITION 135_USE_DIR 149_USE_FASTSEEK 134_USE_FORWARD 134_USE_LABEL 134_USE_LFN 134_USE_LSEEK 149_USE_MKFS 134_USE_READ 149_USE_STRFUNC 134_USE_WRITE 149_VOLUMES 136F_CPU 14 15 18increment 36USE_BUSY_FLAG 50

Kup książkę Poleć książkę

Skorowidz 583

symboleglobalne 36w asemblerze 28zewn trzne 39

symulacja 198 209symulator 190synchronizacja

pami ci 331pionowa 395pozioma 394

systemplikoacutew 111 128przerwa 404zdarze 245

szablonfont_XMEGAtmpl 326image_XMEGAtmpl 343

szum 463szybko przesy ania danych 126

ledzenie wi zki 333rodowisko

graficzne 11programistyczne 11VSIDE 542WinAVR 47

Ttabela FAT 130tablica

framebuf 402 408plugintbl 552 555tekst 208z kodem wynikowym 543

taktowanieDAC 296mikrokontrolera 473

technologia OLED 44temperatura mikrokontrolera 239 241termistor 262 290

NTC 263PTC 263

termometrLM35 249 250z alarmem 251

termostat 290test uk adu VS1003B 503testowanie obrazu 319timer 16 62

TCC0 20

TCC1 399transakcja 59 62 65transakcje 17 103ndash107transakcyjna obs uga LCD 58transakcyjny dost p do SPI 95transfer 91

danych 97wynikoacutew 254

transmisja 72 83tryb

bez znaku 234ci g ej konwersji 252czterobitowy 153dwukana owy 301graficzny 416graficzny VGA 407idle 419jednobitowy 153LPC 371monochromatyczny 397 407oszcz dzania energii 94 306pracy multipleksera 226pracy SPI 157roacute nicowy 232single slope 312SPI 153tekstowy 413tekstowy VGA 397z pojedynczym wej ciem 234ze znakiem 235

trybygenerowania PWM 467pracy karty 153pracy przetwornika 231pracy SPI 74pracy uk adu 508

twierdzenie Nyquista 258tworzenie

adresu 84nak adek 417obrazu 335tablicy 543

typ__uint24 119karty 160niekompletny 60wyliczeniowy 114

typyoperandoacutew 29w AVR 34

Kup książkę Poleć książkę

584 AVR Uk ady peryferyjne

Uuchwyt handle 64 113uk ad

AD725 427 431buforowy 294CS 361DAC 284dataloggera 267detekcji awarii zasilania 559generuj cy obraz 393HiRes 477ICL7660 47LM35 250 251SampH 293sterowania sygna em 379USART 401VS1003B 496 503 508 530 538 556VS100XX 529wzmacniania sygna u 227

uk ady peryferyjne 9uruchomienie komparatora 287urz dzenie

master 72slave 72

u rednianie 259utrata danych 141u ycie wstawki asemblerowej 33

VVGA 393

Wwarto ci kalibracyjne

ADC 564oscylatoroacutew 564temperatury 564

warunkowa kompilacja 36WE Write Enable 375wej cie composite video input 425wektor przerwa 38 257wideo 391wielko pami ci 86 377w czenie DAC 299wska nik na struktur 27wska niki 32wstawki asemblerowe 24 33wtyczka 535 541 544

SineDTMF Generator 537VGA 396

wyboacuter cz stotliwo ci PWM 465 474wykorzystanie

DMA 254 518

EuroSCART 428PWM 461rejestroacutew 34

wyliczanie predyktora 489wy wietlacze

alfanumeryczne 43 45graficzne 43 309LCD 43OLED 46

wy wietlanielitera u 213map bitowych 344obrazu 333 346 406obrazu VGA 393

wywo ania zwrotne callbacks 98asynchroniczne 101synchroniczne 101

wyzwalanie konwersji 245wzmacniacz 446wzmacniacz operacyjny 279wzmacnianie sygna u 227

XXMEGA 9 18

Zzapis

bufora 269danych 176d wi ku 440 556

zasilaniekarty 154pami ci 109

zatrzask 368zatrzask 74HC573 433zatrza ni cie adresu 369zdarzenia 297zdarzenie compare match 399zegar 383 420 426zintegrowane rodowisko programistyczne 11z cze EuroSCART 425 428 429zmiana

g o no ci 527wielko ci strony 94

znaki 56

roacuted onapi cia odniesienia 284sygna u 240

Kup książkę Poleć książkę

Page 16: Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8 AVR. Ukäady peryferyjne Rejestry dost pu do pami ci RAM .....513 Rejestr adresu

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 51

ten okre la d ugo opoacute nienia Je li jest roacute na od 0 opoacute nienie wynosi 152 ms a je-eli jest roacutewna 0 opoacute nienie wynosi 37 s Poniewa lepiej jest u ywa flagi Busy

mo emy ten parametr ignorowa

Powy sze trzy funkcje wystarcz do komunikacji z modu em dla wygody zdefiniowanojednak kolejne Funkcje hd44780_outcmd(n) i hd44780_incmd() umo liwiaj odpowiedniowys anie polecenia do rejestru komend kontrolera lub odczytanie bitu Busy i licznikaAC Dwie kolejne mdash hd44780_outdata(n) oraz hd44780_indata() mdash umo liwiaj zapisi odczytanie rejestru danych

Oproacutecz funkcji odpowiedzialnych za komunikacj z modu em LCD zdefiniowano tak efunkcj przeprowadzaj c podstawow inicjalizacj modu u hd44780_init(void) orazfunkcj hd44780_powerdown(void) ustawiaj c wszystkie linie u yte do komunikacjiw stan 0 co umo liwia bezpieczne od czenie zasilania od modu u LCD W przypadkupozostawienia ktoacuterej z wy ej wymienionych linii w stanie 1 przy od czonym za-silaniu modu u stanowi ona jego zasilanie W efekcie mimo wy czenia modu mo epobiera znaczny pr d

Szerszego omoacutewienia wymaga funkcja hd44780_outcmd(cmd) ktoacutera umo liwia wys a-nie polecenia do rejestru polece sterownika LCD Dla wygody zdefiniowane zosta yroacute ne komendy u atwiaj ce wspoacute prac z modu em LCD Komendy te s przekazy-wane jako argument wywo ania funkcji hd44780_outcmd np

hd44780_outcmd(HD44780_CLR)

powoduje wys anie do sterownika polecenia HD44780_CLR czyszcz cego zawartopami ci DDRAM kontrolera

KomendyFunkcja hd44780_outcmd przyjmuje jako argument predefiniowane makrodefinicjeznacznie u atwiaj ce wspoacute prac z kontrolerem modu u LCD Poni ej zostan onepokroacutetce omoacutewione

HD44780_SHIFT(shift right)Ta makrodefinicja powoduje przesuni cie pozycji wy wietlanego tekstu (shift = 1)o jedn pozycj w lewo (argument right = 0) lub w prawo (argument right = 1)W przypadku gdy shift = 0 przesuwany w lewo lub prawo jest tylko kursor Wysy-aj c wielokrotnie to polecenie uzyskujemy kolejne przesuni cia o jedn pozycj

w lewo lub prawo Polecenie to s u y g oacutewnie do przesuwania tekstu Jednak ze wzgl duna du bezw adno tekstowych modu oacutew LCD nie nale y przesuwa liter cz ciej niok raz na sekund mdash cz stsze przesuwanie daje bardzo nieprzyjemne efekty wizual-ne Ka dy bufor linii jest bdquozawijanyrdquo to znaczy e po ostatnim znaku z prawej jestwy wietlany pierwszy znak z lewej i odwrotnie Nale y pami ta e d ugo buforajest sta a dla danego modelu matrycy Np dla modu oacutew 16times2 bufor jednej linii wyno-si dok adnie 40 bajtoacutew z czego 16 jest jednorazowo wy wietlanych Poni szy kodcyklicznie przewija wy wietlany tekst w lewo

lcd_puttext_P(PSTR(Test bufora i przewijania tekstunTen tekst przewija sie w lewo))while(1)

Kup książkę Poleć książkę

52 AVR Uk ady peryferyjne

hd44780_outcmd(HD44780_SHIFT(10)) _delay_ms(700)

HD44780_FNSET(if8bit twoline font5x10)Polecenie to wybiera typ interfejsu mdash 8-bitowy je li warto parametru if8bit jestroacutewna 1 lub 4-bitowy je li jest roacutewna 0 Typ interfejsu musi odpowiada sposobowipo czenia modu u z mikrokontrolerem Parametr twoline okre la czy pod czonamatryca LCD ma jedn lini znakoacutew czy dwie Matryce ktoacutere maj 4 linie tekstu straktowane przez kontroler jako matryce dwuliniowe mdash parametr twoline powinienmie warto 1 Je li dla matrycy zawieraj cej dwie lub wi cej linii ustawimy go na 0to wy wietlana b dzie tylko jedna linia (w przypadku matryc dwuliniowych goacuterna)a w przypadku matryc 4-liniowych b d wy wietlane dwie linie rozdzielone lini pust

Ostatni parametr okre la typ u ywanego generatora znakoacutew Powinien on odpowiadau ytej w module matrycy zwykle wi c jego warto wynosi 0

HD44780_DISPCTL(disp cursor blink)Ustawia roacute ne parametry pracy matrycy Je li parametr disp ma warto 1 to matrycajest w czona (wy wietla zawarto DDRAM) a je li 0 to matryca jest wy czonalecz stan pami ci DDRAM nie ulega zmianie Np kod

while(1) hd44780_outcmd(HD44780_DISPCTL(011)) _delay_ms(700) hd44780_outcmd(HD44780_DISPCTL(111)) _delay_ms(700)

powoduje naprzemienne w czanie i wy czanie matrycy w efekcie wy wietlany tekstmruga

Parametr cursor okre la czy sprz towo wy wietlany kursor ma by widoczny (war-to parametru 1) czy niewidoczny (warto parametru 0) Je li kursor jest widocznyto dodatkowo mo emy okre li czy ma miga (warto parametru blink roacutewna 1)czy nie (blink = 0) Je li kursor jest widoczny i nie miga jest wy wietlany w postacipoziomej kreski Wy wietlanie kursora mo e by u yteczne w sytuacji kiedy u yt-kownik wprowadza jakie dane W pozosta ych sytuacjach kursor mo emy wy czy

HD44780_ENTMODE(inc shift)Okre la sposoacuteb wprowadzania danych do pami ci Je li parametr inc ma warto 1 topo ka dej operacji zapisuodczytu adres pami ci jest automatycznie zwi kszany o je-den co przy piesza operacj zapisuodczytu kolejnych znakoacutew Je li warto inc jestroacutewna 0 to adres jest automatycznie zmniejszany o 1 Dodatkowo parametr shiftokre la czy wy wietlany obraz ma by automatycznie przesuwany tak aby wy wie-tla ostatnio wprowadzony znak (shift = 1) lub go nie wy wietla (shift = 0)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 53

HD44780_CLRPowoduje wyczyszczenie (wype nienie znakami o kodzie 32) ca ej zawarto ci pami ciDDRAM Jednocze nie kursor wraca do pozycji pierwszej (pierwsza linia pierwszyznak)

Niewy wietlane bajty pami ci DDRAM tak e s kasowane Je li s one u ywanedo przechowywania zmiennych programu to przed operacj kasowania nale y jeskopiowa w bezpieczne miejsce W przeciwnym przypadku zostan utracone

Wska nik adresu do pami ci DDRAM jest ustawiany na 0 zerowane jest tak e prze-suni cie

HD44780_HOMEPowoduje powroacutet kursora do pozycji pocz tkowej mdash pierwsza linia pierwszy znakWska nik adresu do pami ci DDRAM w efekcie zawiera 0 zerowane jest roacutewnieprzesuni cie wy wietlania znakoacutew w efekcie s one wy wietlane od pozycji 0

HD44780_DDADDR(addr)Ustawia nast pny adres zapisuodczytu w pami ci DDRAM na addr Tylko 7 bitoacutewargumentu addr jest branych pod uwag w zwi zku z czym mo na zaadresowa mak-symalnie 128 bajtoacutew pami ci (z czego sterownik ma tylko 80 pozosta e lokacje snieu ywane)

HD44780_CGADDR(addr)Ustawia nast pn operacj odczytuzapisu w pami ci CGRAM na addr Pod uwagbranych jest tylko 6 bitoacutew zmiennej addr w efekcie mo na zaadresowa maksymalnie64 bajty pami ci CGRAM

Przedstawione powy ej funkcje zapewniaj jedynie podstawow komunikacj z mo-du em LCD Potrzebujemy jednak ci gle funkcji odpowiedzialnej za jego inicjalizacjmdash funkcja biblioteczna przeprowadza ten proces tylko w podstawowym zakresie musi-my jeszcze zadba o w a ciwe ustawienie parametroacutew zwi zane z posiadan matryc Napiszmy wi c w asne rozwini cie funkcji inicjalizacyjnej

void lcd_init() hd44780_init() Podstawowa inicjalizacja modu u hd44780_outcmd(HD44780_CLR) Wyczy pami DDRAM hd44780_wait_ready(1000) hd44780_outcmd(HD44780_ENTMODE(1 0)) Tryb autoinkrementacji AC hd44780_wait_ready(1000) hd44780_outcmd(HD44780_DISPCTL(1 0 0)) W cz wy wietlacz wy cz kursor hd44780_wait_ready(1000)

Zauwa e po wys aniu ka dego polecenia do modu u jest wywo ywana funkcjahd44780_wait_ready(1000) odpowiedzialna za oczekiwanie a realizacja wys anego po-lecenia dobiegnie ko ca Jest to niezb dne gdy do czasu uko czenia bie cej

Kup książkę Poleć książkę

54 AVR Uk ady peryferyjne

operacji dalsze polecenia s ignorowane Jako argument podany jest parametr 1000mdash jest on bez znaczenia nasza biblioteka korzysta z flagi Busy i po prostu go ignorujePo wykonaniu powy szej funkcji modu LCD jest poprawnie zainicjalizowany a jegopami jest wyczyszczona (zawiera bajty 0x20) i w efekcie modu nic nie wy wietlaOd tej chwili mo emy wysy a znaki do wy wietlenia

Po wykonaniu inicjalizacji ekran mo e pozosta czysty lub wy wietla ca kowiciewype nione kwadraty (wszystkie piksele w czone) Je li po inicjalizacji wszystkiepiksele s w czone nale y nieco zmniejszy kontrast

Aby sobie u atwi to zadanie zdefiniujmy funkcj wysy aj c do modu u jeden znakvoid lcd_putchar(char c) static bool second_nl_seen static uint8_t line=0

if ((second_nl_seen) ampamp (c = n)ampamp(line==0)) Odebrano pierwszy znak hd44780_wait_ready(40) hd44780_outcmd(HD44780_CLR) hd44780_wait_ready(1600) second_nl_seen=false if (c == n) if (line==0) line++ hd44780_outcmd(HD44780_DDADDR(64)) Adres pierwszego znaku drugiej linii hd44780_wait_ready(1000) else second_nl_seen=true line=0 else hd44780_outdata(c) hd44780_wait_ready(40)

Funkcja ta ze wzgl du na skomplikowane adresowanie pami ci DDRAM jest zale naod konkretnego modelu modu u LCD B dzie prawid owo wspoacute pracowa z modu a-mi 2times16 2times20 i 2times40 znakoacutew W przypadku innych modu oacutew pozycje niektoacuterychznakoacutew mog by nieprawid owe

Mo emy ju wy wietla na LCD pojedyncze znaki czas na wy wietlanie tekstu Po-niewa teksty jako sta e dla zaoszcz dzenia cennej pami ci RAM przechowuje si za-zwyczaj w pami ci FLASH zdefiniujmy funkcj odczytuj c podany a cuch zna-kowy z pami ci FLASH a nast pnie umieszczaj c go na LCD

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 55

void lcd_puttext_P(prog_char txt) char ch while((ch=pgm_read_byte(txt))) lcd_putchar(ch) txt++

Powy sza funkcja wysy a kolejne znaki odczytane z pami ci FLASH na LCD za po-moc funkcji LCD_putchar Po napotkaniu znaku ko ca a cucha (0 nul) przerywa swojedzia anie

Pozostaje nam przetestowa dzia anie przedstawionych funkcjiint main() lcd_init() lcd_puttext_P(PSTR(Test LCDnDruga linia)) while(1)

Na ekranie modu u LCD powinien wy wietli si napisTest LCDDruga linia

Je li na LCD nic nie widzimy to w pierwszej kolejno ci powinni my sprawdzi kon-trast zmieniaj c napi cie na pinie Vee modu u LCD

Warto zdefiniowa jeszcze funkcj ustawiaj c pozycj od ktoacuterej b dzie wy wietlanynast pny znak

void lcd_goto(uint8_t x uint8_t y) hd44780_outcmd(HD44780_DDADDR(0x40y+x)) hd44780_wait_ready(1000)

Funkcja ta przyjmuje dwa parametry x i y okre laj ce pozycj na ktoacuterej zostaniewy wietlony nast pny znak wys any z mikrokontrolera do modu u LCD Dzi ki temuz atwo ci mo emy uaktualnia zawarto LCD bez konieczno ci ponownego prze-sy ania wszystkich danych Funkcja ta jest zale na od typu zastosowanego modu u

Ostatni funkcj jest funkcja umo liwiaj ca czyszczenie zawarto ci pami ci modu uOdpowiedzialne za to jest proste polecenie wysy ane do sterownika

void lcd_cls() hd44780_outcmd(HD44780_CLR) hd44780_wait_ready(false)

Oproacutecz czyszczenia zawarto ci pami ci modu u powoduje ono ustawienie kursoraw punkcie (00)

Kup książkę Poleć książkę

56 AVR Uk ady peryferyjne

Definiowanie w asnych znakoacutewUk ad HD44780 jest wyposa ony w 64 bajty pami ci CGRAM (ang Character Ge-nerator RAM) ktoacutera mo e przechowywa mapy bitowe 8 znakoacutew o matrycy 5times8 pikselilub 4 znakoacutew o matrycy 5times10 pikseli Przyk ad definicji znaku na matrycy 5times8 poka-zano na rysunku 223

Rysunek 223Przyk ad definicji w asnego znakuw pami ci CGRAM Znak rysujemyna matrycy 5times8 bitoacutew polazaciemnione odpowiadaj warto ci 1pola bia e warto ci 0 Wartowyliczon dla ka dej linii pikseliwpisujemy do pami ci CGRAMsterownika Najstarsze 3 bity ka degobajta (pola szare) s bez znaczeniamdash wy wietlacz pomija jeprzy wy wietlaniu obrazu

1

2

3

4

5

6

7

0 00100 = 4

01110 = 14

11111 = 31

00100 = 4

00100 = 4

00100 = 4

11111 = 31

01110 = 14

Adres Warto

Dost p do tej pami ci jest mo liwy dzi ki wys aniu polecenia ustawiaj cego adreszapisuodczytu pami ci CGRAM Po jego wys aniu wszystkie operacje zapisu i od-czytu dotycz tej pami ci a nie pami ci DDRAM Aby wroacuteci do adresowania pa-mi ci DDRAM nale y wybra jej adres lub dokona operacji wymagaj cej przesu-ni cia kursora

Pami CGRAM jest pami ci ulotn po ponownym w czeniu zasilania definicjeznakoacutew musz by ponownie przes ane przez procesor

Bity o warto ci 1 w definicji znaku odpowiadaj w czonym pikselom bity o warto-ci 0 pikselom wy czonym Najstarsze 3 bity ka dego bajta w pami ci CGRAM s

bez znaczenia mdash te pozycje nie s wy wietlane przez matryc Definiuj c znak nale-y tak e pami ta e ostatnia linia wy wietlana przez matryc (w zale no ci od wiel-

ko ci matrycy znaku linia 8 lub 10) powinna zawiera same zera mdash w tej linii b dziewy wietlany kursor

Najcz ciej matryce LCD pod czone do sterownika HD44780 maj organizacj 5times8czyli jeden znak jest definiowany przez 8 kolejnych bajtoacutew okre laj cych stan po-szczegoacutelnych linii tworz cych znak Stwoacuterzmy funkcj ktoacuterej zadaniem b dzie za a-dowanie definicji znakoacutew z pami ci FLASH mikrokontrolera do pami ci CGRAM

void lcd_defchar_P(uint8_t charno prog_uint8_t chardef) hd44780_outcmd(HD44780_CGADDR(charno8)) hd44780_wait_ready(40) for(uint8_t c=0clt8c++) hd44780_outdata(pgm_read_byte(chardef))

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 57

hd44780_wait_ready(40) chardef++

Funkcja LCD_defchar_P jako argumenty przyjmuje numer definiowanego znaku (0 ndash 7)oraz wska nik do obszaru pami ci FLASH zawieraj cego definicj znaku (obszarten zajmuje 8 nast puj cych po sobie bajtoacutew) Jak widzimy funkcja najpierw ustawiaw a ciwy adres pod ktoacuterym znajdzie si pocz tek definicji znaku w pami ci CGRAMmdash poniewa jeden znak jest opisywany za pomoc 8 bajtoacutew kolejne adresy znakoacutewto kod_znakutimes8 Nast pnie dane opisuj ce znak s adowane z pami ci mikrokontrolerai zapisywane w pami ci CGRAM sterownika Poni szy program ilustruje wykorzy-stanie funkcji LCD_defchar_P

prog_uint8_t char1[8][8]=0000000255 00000025525500000255255255 0000255255255255 00025525525525525500255255255255255255 0255255255255255255255255255255255255255255255

int main() for(uint8_t x=0xlt8x++) lcd_defchar_P(xampchar1[x][0]) Za aduj wzorce znakoacutew lcd_init() for(uint8_t x=0xlt8x++) lcd_putchar(x) Wy wietl znaki o kodach 0 ndash 7 while(1)

W pierwszej linii funkcji main nast puje za adowanie nowych definicji znakoacutew dopami ci CGRAM nast pnie inicjalizowany jest wy wietlacz po czym w pierwszejlinii s wy wietlane znaki o kodach 0 ndash 7 a wi c znaki ktoacuterych definicja zosta aprzes ana z mikrokontrolera

Zauwa e pami CGRAM podobnie jak DDRAM mo emy zapisywa i odczytywaprzed inicjalizacj modu u LCD Proces inicjalizacji jest potrzebny tylko do prawi-d owego wy wietlania na ekranie LCD

Poniewa dane potrzebne do wy wietlenia znaku s na bie co pobierane z pami cipodczas od wie ania matrycy LCD jakiekolwiek zmiany w definicji znaku kiedy jest onwidoczny na LCD poci gaj za sob natychmiastowe zmiany w wy wietlanym obrazieMo na t w a ciwo sterownika wykorzysta do stworzenia prostych animacji

void lcd_box(uint8_t y) hd44780_outcmd(HD44780_CGADDR(0)) Zaczynamy od znaku o kodzie 0 hd44780_wait_ready(40) for(uint8_t c=0cltyc++) Stwoacuterz linie z w czonymi pikselami hd44780_outdata(0xFF) hd44780_wait_ready(40) for(uint8_t c=yclt8c++) Stwoacuterz linie z wy czonymi pikselami hd44780_outdata(0x00) hd44780_wait_ready(40)

Kup książkę Poleć książkę

58 AVR Uk ady peryferyjne

int main() lcd_init() lcd_putchar(0) while(1) for(uint8_t x=0xlt8x++) lcd_box(x) _delay_ms(100) for(int8_t x=7xgt=0x--) lcd_box(x) _delay_ms(100)

Funkcja main wy wietla na LCD tylko jeden znak o kodzie 0 a nast pnie cykliczniezmienia jego definicj w pami ci CGRAM W efekcie posta znaku wy wietlana naekranie ci gle si zmienia

Transakcyjna obs uga LCDPokazana do tej pory obs uga LCD alfanumerycznego mia a pewne wady Jak wiemyoperacje odwo uj ce si do kontrolera LCD s niezwykle wolne cykl odczytuzapisudowolnego rejestru kontrolera trwa co najmniej 1600 ns co dla MCU taktowanegozegarem 32 MHz przek ada si na czas wykonania oko o 52 instrukcji asemblera Cogorsza wi kszo komend realizowanych przez kontroler jest wykonywana w czasieoko o 37 s co przek ada si na tysi ce zmarnowanych taktoacutew MCU St d te jaki-kolwiek zapisodczyt LCD to z perspektywy programu straszne marnotrawstwo czasu

Problem ten dotyczy ka dego urz dzenia IO ktoacutere dzia a wolniej ni procesor W takiejsytuacji warto napisa pewn warstw po redni mdash sterownik mdash ktoacuterego zada-niem b dzie buforowanie da dost pu do urz dzenia i rozstrzyganie konfliktoacutewdzi ki czemu roacute ne cz ci programu b d bdquomia y wra enierdquo e maj wy czny do-st p do urz dzenia

Pokazane wcze niej funkcje obs ugi LCD maj jeszcze jedn wad mdash nie s wspoacute bie -ne czyli nie mo na ich wykonywa jednocze nie w kilku miejscach programu w tymw szczegoacutelno ci w programie g oacutewnym i w funkcjach obs ugi przerwa W wielu przy-padkach ta wada jest bez znaczenia jednak czasami jest uci liwa mdash dla przyk adugdy na wy wietlany tekst chcieliby my na o y inne informacje np o dacie lub godzi-nie Oczywi cie wy wietlanie mo na zorganizowa tak aby nie by o potrzeby pisaniawspoacute bie nego kodu np poprzez zastosowanie bufora pami ci VRAM kontrolera LCDRodzi to jednak kolejne problemy i jest ma o eleganckie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 59

Zastanoacutewmy si w jaki sposoacuteb najlepiej jednocze nie rozwi za problem wolnegodost pu do urz dzenia i wspoacute bie no ci kodu Rozwi zaniem mo e by wprowadze-nie tzw transakcji Transakcj nazywamy zbioacuter operacji tworz cych pewn ca-o To co wyroacute nia tak wykonywany zestaw operacji to atomowo spoacutejno

izolacja i trwa o Pod tymi terminami kryje si istota wykonywanej operacji Ato-mowo transakcji zapewnia e jest ona wykonywana w sposoacuteb niepodzielny co gwa-rantuje nam prawid ow wspoacute prac z danym urz dzeniem IO w tym przypadku kon-trolerem LCD Wa na dla nas jest tak e izolacja mdash dzi ki temu inne operacje na LCD(inne transakcje) nie b d mia y wp ywu na wynik aktualnie wykonywanej transakcjimdash nie b d zak oacuteca y jej wykonania z drugiej strony nasza transakcja nie zak oacuteciwykonania innych Trwa o z kolei zagwarantuje nam e je li sterownik potwierdziwykonanie transakcji to znaczy e efekt jej dzia ania jest wy wietlony na LCD Tacecha nie jest nam a tak potrzebna mdash jest ona wydawa oby si oczywista Niemniej jestto pewna gwarancja e ca a operacja przebieg a poprawnie i w efekcie LCD znajdujesi w okre lonym przez nas stanie Tyle teorii przejd my do praktyki

Kody poni szego przyk adu znajduj si w katalogu PrzykladyLCD-alfaLCD-transact

Aby zapewni transakcyjny dost p do LCD musimy stworzy pewne struktury danychktoacuterych zadaniem b dzie przechowywanie informacji o operacjach sk adaj cych sina transakcje i stanie ich wykonania W tym celu pos u ymy si wiadomo ciami z roz-dzia u 5 bdquoJak uporz dkowa chaos czyli z o one typy danych i listyrdquo Do przecho-wywania oczekuj cych transakcji pos u ymy si buforem pier cieniowym zanimjednak go zaimplementujemy zastanoacutewmy si jak powinna wygl da struktura prze-chowuj ca informacje o transakcji Struktura ta powinna zawiera co najmniej

pole danych (data) z informacjami ktoacutere maj by przes ane do kontrolera LCD

pole okre laj ce liczb danych do wys ania (len)

pole okre laj ce realizowane polecenie dla LCD (cmd) mdash pole to pos u yprogramowi sterownika do w a ciwej interpretacji danych znajduj cych siw polu data

kilka poacutel kontrolnych przechowuj cych informacje potrzebne do realizacjisamej transakcji Jedno z nich mdash Ready mdash b dzie przyjmowa warto trueje li dana transakcja zosta a zrealizowana lub false w przeciwnym przypadkuZnaczenie drugiego pola mdash SelfDel mdash mo e wydawa si nieco enigmatycznepole to okre la czy pami przydzielona dla transakcji ma by zwolnionaw sterowniku LCD (warto true) czy te zostanie zwolniona w programie(warto false)

Oto jak mo e wygl da struktura definiuj ca transakcj typedef struct volatile bool Ready 1 true je li transakcja zosta a zrealizowana bool SelfDel 1 true je li pami przydzielona transakcji ma zosta zwolniona LCD_Cmd cmd 2 Polecenie do zrealizowania uint8_t len 6 D ugo polecenia

Kup książkę Poleć książkę

60 AVR Uk ady peryferyjne

unsigned 0 Wyroacutewnanie do granicy bajta uint8_t data[] Dane transakcji LCD_trans

Nale y zwroacuteci uwag na poleunsigned 0

Nie definiuje ono adnego pola struktury ale jedynie informuje kompilator e kolejnepole (w naszym przyk adzie o nazwie data) ma by wyroacutewnane do granicy bajta mdashdzi ki temu dost p do kolejnego pola b dzie odbywa si szybciej Z kolei samo poledata jest zadeklarowane jako tzw typ niekompletny

Typ niekompletny (ang incomplete type) to typ ktoacuterego rozmiaru nie da si okre li

W pokazanym przyk adzie rozmiaru pola data nie da si okre li gdy zosta on za-deklarowany jako typ tablicowy z tym e nie podano wielko ci tablicy Wielko ci niepodano gdy na etapie deklaracji struktury nie wiemy jakiej wielko ci dane b d w niejprzechowywane Tego typu deklaracja ma bardzo powa ne konsekwencje mdash skorowielko ci pola data nie da si okre li to jaki b dzie wynik dzia ania operatora sizeof(LCD_trans) Kompilator stara si jako wybrn z tej sytuacji w zwi zku z czym

zwroacuteci wielko struktury ale tak jakby pole data w ogoacutele nie istnia o mdash jego roz-miar b dzie wynosi 0 W ramach wiczenia zastanoacutew si ile bajtoacutew pami ci b dziezajmowa a struktura LCD_trans

Skoro dysponujemy ju struktur przechowuj c poszczegoacutelne transakcje pora nastworzenie obiektu przechowuj cego kolekcj transakcji Dodanie kolejnej strukturyb dzie polega o na dodaniu jej do takiego obiektu z drugiej strony program sterownikaLCD b dzie moacuteg z tej kolekcji pobiera kolejne transakcje do realizacji Opis ten przy-pomina opis dzia ania bufora pier cieniowego mdash z jednym wyj tkiem mdash po zape nie-niu ca ego bufora nie b dziemy usuwa niezrealizowanych transakcji lecz zabloku-jemy dodawanie kolejnych W tym celu pos u ymy si definicj nast pnej struktury

typedef struct LCD_trans elements[LCD_MAXTRANS] Wska niki do transakcji uint8_t Beg Pierwszy element bufora uint8_t Count Liczba elementoacutew w buforze CircBuffer

Struktura ta zawiera deklaracj tablicy wska nikoacutew na transakcje (pole elements)Poniewa jest to tablica musimy zna liczb jej elementoacutew mdash jest ona zadeklarowanaw sta ej LCD_MAXTRANS

define LCD_MAXTRANS 10 Maksymalna liczba pami tanych transakcji

Do realizacji bufora s potrzebne jeszcze dwa pola Beg wskazuj ce na pierwsztransakcj w buforze oraz pole Count okre laj ce liczb transakcji znajduj cych siw buforze Je li Count == 0 to znaczy e w buforze nie ma adnych oczekuj cychtransakcji a je li Count == LCD_MAXTRANS to znaczy e bufor jest pe ny i nie mo na

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 61

dodawa do niego kolejnych transakcji W a ciwo t wykorzystuj dwie zdefiniowanew pliku LCD_transc funkcje

static inline bool cbIsFull(CircBuffer cb) return cb-gtCount == LCD_MAXTRANS

static inline bool cbIsEmpty(CircBuffer cb) return cb-gtCount == 0

Jak pami tamy w przypadku funkcji modyfikatory static inline powoduj e danafunkcja nie b dzie istnie jako samodzielna lecz w ka dym miejscu w ktoacuterym jestwywo ywana jest wstawiany raczej jej kod a nie wywo anie Ma to znaczenie dlakroacutetkich funkcji (a wi c takich jak pokazane powy ej) dla ktoacuterych koszty wywo anias zazwyczaj wi ksze ni koszty umieszczenia cia a funkcji w miejscu jej wywo aniaTego typu funkcje zachowuj si w sposoacuteb zbli ony do makrodefinicji (z tym e re-spektuj wszystkie regu y j zyka C w szczegoacutelno ci kolejno operatoroacutew czy kon-trol typoacutew)

Takie funkcje jako argument pobieraj adres bufora na ktoacuterym maj operowa W na-szym przypadku bufor jest zdefiniowany nast puj co

static CircBuffer LCD_TransBuffer Bufor na transakcje

Nale y zauwa y e jest on zdefiniowany jako struktura globalna z modyfikatoremstatic Modyfikator ten ogranicza zasi g widoczno ci zmiennej LCD_TransBuffer dopliku w ktoacuterym zmienna ta zosta a zdefiniowana (w tym przypadku modyfikator staticjest niejako przeciwie stwem modyfikatora extern) Dzia anie to ma jedynie znaczeniekosmetyczne mdash uniemo liwia odwo anie si do bufora za pomoc funkcji ktoacutere niezosta y zdefiniowane w miejscu jego definicji Oproacutecz funkcji umo liwiaj cych okre-lenie stanu bufora potrzebne s jeszcze funkcje umo liwiaj ce dodanie i pobranie trans-

akcji Pierwsz funkcj b dzie funkcja dodaj ca transakcj do buforabool cbAdd(CircBuffer cb LCD_trans elem) ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsFull(cb)) return false Czy jest miejsce w kolejce uint8_t end = (cb-gtBeg + cb-gtCount) LCD_MAXTRANS cb-gtelements[end] = elem Dodaj transakcj ++cb-gtCount Liczba elementoacutew w buforze return true Wszystko OK

Funkcja ta dodaje transakcj (zmienna elem) do bufora ko owego Zanim transakcjazostanie dodana sprawdzane jest czy w buforze jest miejsce mdash je li nie funkcjazwroacuteci false Je li dodanie jest mo liwe warto licznika okre laj cego liczb trans-akcji przechowywana w buforze (Count) zwi ksza si o jeden Warto zastanowi si te dlaczego praktycznie ca e cia o tej funkcji jest zamkni te w sekcji atomowej (ATOMIC_BLOCK) Jedn z cech naszego sterownika ma by mo liwo wspoacute bie nego dost pu

Kup książkę Poleć książkę

62 AVR Uk ady peryferyjne

do LCD mdash to znaczy e danie np zapisu do LCD mo e wyst pi zaroacutewno w g oacutewnejp tli programu jak i asynchronicznie w przerwaniu St d te wynika e funkcja do-daj ca transakcj musi by napisana w sposoacuteb zapewniaj cy jej poprawn prac w sytu-acji gdy zostanie ona przerwana i ponownie wywo ana przed zako czeniem dzia aniajej poprzedniej instancji Umieszczenie cia a tej funkcji w sekcji atomowej nam to za-pewnia mdash dzi ki temu bufor transakcji zawsze b dzie spoacutejny Dla zaspokojenia cie-kawo ci warto usun sekcj atomow i sprawdzi jak wtedy b dzie zachowywa si tafunkcja i jak wp ynie to na spoacutejno przechowywanych danych

Drug niezb dn funkcj jest funkcja odczytuj ca bufor transakcji i zwracaj ca trans-akcj do zrealizowania (lub NULL je li adnej transakcji nie ma w buforze)

LCD_trans cbRead(CircBuffer cb) LCD_trans elem ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsEmpty(cb)) return NULL Bufor pusty nie mo na zwroacuteci elementu elem = cb-gtelements[cb-gtBeg] cb-gtBeg = (cb-gtBeg + 1) LCD_MAXTRANS -- cb-gtCount Zmniejszamy liczb elementoacutew pozosta ych w buforze return elem

Funkcja ta jest bardzo podobna do poprzedniej mdash najpierw sprawdza czy bufor za-wiera jak oczekuj c transakcj (cbIsEmpty(cb)) je li tak to zwraca adres opisuj -cej j struktury i zmniejsza liczb transakcji oczekuj cych (pole Count) W ten sposoacutebmamy zrealizowan ca funkcjonalno zwi zan z obs ug bufora pier cieniowegoPokazane funkcje s uniwersalne i z bardzo podobnych (lub wr cz tych samych) b -dziemy korzysta w kolejnych rozdzia ach w kontek cie np obs ugi transakcji zwi -zanych z interfejsami szeregowymi

Pora przej do samego sterownika LCD Jego zadaniem b dzie sprawdzenie czyw buforze oczekuj jakie transakcje do realizacji a je li tak to ich wykonanie Ponie-wa dane do LCD mog by wysy ane co okre lony minimalny czas znacznie d u -szy ni czas jakiego na to zadanie potrzebuje mikrokontroler do wysy ania kolejnychpaczek danych pos u ymy si timerem Timer b dzie generowa przerwanie nadmiaru(TCD0_OVF_vect) ktoacutere b dzie wyznacza o tempo w jakim kolejne porcje danych b -d trafia y do LCD Z noty katalogowej kontrolera wynika e minimalny czas trwa-nia wysokiego stanu sygna u Enable to 230 ns a okres tego sygna u nie powinien bykroacutetszy ni 500 ns Poniewa nasz dost p do LCD odbywa si w sposoacuteb nieblokuj cyMCU wi c szybko wysy ania danych do LCD jest bez znaczenia St d te w poka-zanym przyk adzie przyj to e dane b d wysy ane co 4 s co okre la sta a

define LCD_ACCESSTIME 0000004

Poniewa komunikacja z LCD odbywa si w sposoacuteb nieblokuj cy nie zale y nam tena czasie (i tak w stosunku do czasu od wie ania samego LCD jest on bardzo kroacutetki)w efekcie nie ma potrzeby odczytywania flagi busy kontrolera Dzi ki temu w cz ciprzypadkoacutew mo emy w ogoacutele zrezygnowa z sygna u wyboru RW i wymusi jego sta y

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 63

poziom logiczny umo liwiaj cy zapis do LCD Dzi ki temu mo na zaoszcz dzi do-datkowy pin IO1

Ca a logika naszego sterownika jest zawarta w funkcji obs ugi przerwania przepe nieniatimera (TCD0_OVF_vect) Poniewa LCD jest po czony z MCU w trybie 4-bitowym(dla zaoszcz dzenia liczby wykorzystanych pinoacutew IO) kolejne 8-bitowe dane muszby podzielone na dwie tetrady i wys ane do LCD w kolejno ci starszam odsza tetradaInformacja o aktualnie wysy anych danych jest umieszczona w zmiennej trans o typie

static struct uint8_t pos 6 Pozycja w polu danych aktualnej transakcji uint8_t nibble 1 Ktoacutera tetrada jest wysy ana seq

Dlaczego tak Dzi ki wykorzystaniu struktury i poacutel bitowych mo na zaoszcz dzi je-den bajt pami ci SRAM Ze wzgl du na wielko pami ci obs ugiwanej przez kon-troler LCD mo emy by pewni e transakcje zawieraj ce wi cej ni 63 bajty s ra-czej nierealne (nie mia yby wi kszego sensu) St d te do przechowywania informacjio aktualnie wysy anym bajcie danych wystarczy 6 bitoacutew mdash tyle samo zosta o wyko-rzystanych do okre lenia d ugo ci pola danych transakcji w strukturze LCD_trans Zaosz-cz dzony bit mo na po wi ci na flag nibble okre laj c ktoacutera tetrada (m odszastarsza)jest wysy ana Bez poacutel bitowych flaga ta zaj aby dodatkowy bajt pami ci

Przejd my do implementacji sterownika Pierwsz rzecz jak nale y sprawdzi jestto czy w buforze czeka jaka transakcja do zrealizowania Odpowiedzialny za to jestfragment kodu obs ugi przerwania nadmiaru timera

if(trans == NULL) Nic do zrobienia sprawd my czy jaka transakcja oczekuje trans=cbRead(ampLCD_TransBuffer) Czy jest jaka oczekuj ca transakcja seqpos=0 seqnibble=0 if(trans == NULL) TCD0_CTRLA=TC_CLKSEL_OFF_gc Nie ma adnych transakcji mdash wy cz timer

W przypadku gdy adna transakcja nie oczekuje na realizacj timer jest wy czanymdash dzi ki temu nie b d zg aszane kolejne przerwania przepe nienia i MCU nie b -dzie traci czasu na ich obs ug Co prawda wynikaj cy z tego zysk czasowy jest mar-ginalny lecz ma to istotniejsz konsekwencj mdash w przypadku usypiania MCU zb d-ne przerwanie timera nie b dzie niepotrzebnie wybudza o procesora W takiej sytuacjiponowne w czenie timera nast pi dopiero w funkcji dodaj cej transakcj do kolejkimdash a wi c w sytuacji gdy mamy pewno e istnieje oczekuj ca transakcja

Druga cz funkcji obs ugi przerwania jest zwi zana z realizacj samej transakcjiW pokazanym przyk adzie zaimplementowano tylko jeden typ transakcji mdash daniezapisu a cucha tekstowego pod wskazany adres VRAM (na okre lonej pozycji LCD)Je li zajdzie taka potrzeba programista mo e zaimplementowa inne polecenia i doda

1 Warto zauwa y e w bdquoklasycznejrdquo obs udze LCD te nie musimy czyta stanu flagi busy zamiast tego

wystarczy wprowadza p tle opoacute niaj ce Jednak poniewa taka obs uga blokuje MCU nie jest onazalecana Wady tej nie ma dost p transakcyjny co jest jego dodatkow zalet

Kup książkę Poleć książkę

64 AVR Uk ady peryferyjne

kod odpowiedzialny za ich obs ug Zauwa my e ka da transakcja musi zawieraadres pocz tku pami ci wideo od ktoacuterego b dzie zapisywany tekst Dzieje si takdlatego e transakcja wykonana wcze niej mo e ustawi wska nik zapisu na dowolnejkomoacuterce pami ci W efekcie tekst z kolejnej transakcji by by wy wietlany od komoacuterkina ktoacuterej zako czy si zapis poprzedniej transakcji Takie dzia anie oczywi cie jestniedopuszczalne st d te ka dy zapis do pami ci wideo poprzedza ustawienie rejestruindeksowego Problem ten mo na rozwi za tak e w inny sposoacuteb mdash poprzez wpro-wadzenie tzw uchwytoacutew (ang handlers) ktoacutere zawiera yby stan kontrolera LCDNiemniej to rozwi zanie dodatkowo komplikowa oby nasz sterownik Struktura danych(zawartych w polu data) ma wi c nast puj cy format

bajt nr 0 zawiera warto pozycji od ktoacuterej nale y dokonywa zapisu pami ciwideo mdash jest to warto przesy ana do rejestru okre laj cego adres zapisu

kolejne bajty zawieraj a cuch znakowy ktoacutery nale y umie ci w pami ciCGRAM

Poniewa bajt nr 0 zawsze zawiera warto wpisywan do rejestroacutew steruj cych kon-trolera podczas jego wysy ania jest ustawiana linia RS sygnalizuj ca zapis do rejestruPodczas wysy ania kolejnych bajtoacutew linia ta jest zerowana w zwi zku z czym zapisodbywa si do pami ci CGRAM

Kod obs uguj cy transakcj wygl da nast puj coif(trans) Jest transakcja do zrealizowania uint8_t dat=trans-gtdata[seqpos] if(seqnibble == 0) datgtgt=4 To trzeba zmieni je li linie danych nie s po czone z pinami 0 ndash 3 portu IO hd44780_outnibble_nowait(dat amp 0x0F seqpos = 0) Zapisujemy rejestr steruj cy lub dane ++seqnibble if(seqnibble == 0) ++seqpos Co drug tetrad zwi kszamy pozycj bufora if(seqpos gt= trans-gtlen) trans-gtReady=true Koniec transakcji if(trans-gtSelfDel) free_re(trans) Zwolnij pami transakcji je li tak sobie yczy programista trans=NULL Koniec transakcji CLR(OUT HD44780_E)

Ta cz przerwania wysy a kolejne tetrady do kontrolera LCD Warto zastanowi sinad dzia aniem sekwencji

++seqnibble

Poniewa pole nibble jest jednobitowe operacja inkrementacji prowadzi do zmianystanu tego pola na przeciwny (pole to ma warto 0 lub 1) Kiedy zostan wys anewszystkie dane przeznaczone dla kontrolera obs uga transakcji ko czy si Stan tensygnalizuje nadanie warto ci true polu Ready struktury LCD_trans Dzi ki temu pro-gram mo e sprawdzi asynchronicznie w stosunku do przerwania kiedy transakcjauleg a zako czeniu Opcjonalnie jest wykonywana jeszcze jedna funkcja mdash je li poleSelfDel ma warto true to pami zarezerwowana na transakcj jest automatycznie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 65

zwalniana W tym celu wykorzystuje si funkcj free_re ktoacuterej prototyp jest zade-klarowany w pliku Alloc_safeh Funkcja ta wywo uje funkcj biblioteczn free ktoacute-ra zwalnia pami przydzielon dynamicznie na stercie Poniewa funkcja ta nie jestfunkcj reentrant nale y stworzy odpowiedni bdquoprotez rdquo opakowuj c j w blokatomowy co zapewnia e nie zostanie ona ponownie wywo ana zanim jej poprzed-nia instancja nie zako czy dzia ania Oczywi cie lepszym rozwi zaniem by oby napi-sanie w asnych funkcji dynamicznej alokacji pami ci ktoacutere b d reentrant

Bardzo wa ne jest aby pole SelfDel mia o warto true wy cznie dla transakcjidla ktoacuterych pami zosta a przydzielona dynamicznie funkcj malloc (lub jej po-chodnymi) W pozosta ych przypadkach pole to musi mie warto false mdash nie-stosowanie si do tej regu y spowoduje b d mened era pami ci i najprawdopo-dobniej nieprzewidywalne dzia anie programu

Drug wa n zasad jest aby zmienna zawieraj ca dane transakcji nie by azmienn automatyczn mdash zmienne takie s automatycznie niszczone po opusz-czeniu zawieraj cej je funkcji W rezultacie obszar pami ci zawieraj cy danetransakcji mo e zosta wykorzystany przez inne zmienne co spowoduje uszkodzeniezawartych w nim danych

Pami przydzielona transakcji musi by alokowana w sposoacuteb dynamiczny (funkcjamalloc_re) ewentualnie mo e to by pami alokowana dla zmiennej globalnej lubstatycznej mdash zmienne tego typu istniej przez ca y czas ycia programu

Warto te zauwa y e instrukcje steruj ce stanem linii Enable kontrolera LCD(SET(OUT HD44780_E) i CLR(OUT HD44780_E)) s rozdzielone wieloma innymi in-strukcjami Dzi ki temu generowany impuls dodatni tego sygna u ma czas trwania gt230 ns wymagany w specyfikacji kontrolera Nawet dla XMEGA taktowanej zegarem32 MHz 230 ns przek ada si na oko o 7 instrukcji asemblera mdash czas jaki z pewno-ci up ynie pomi dzy wykonaniem obu powy szych instrukcji steruj cych

Do wysy ania danych do kontrolera zosta a wykorzystana nieco zmodyfikowanafunkcja hd44780_outnibble_nowait roacute ni ca si od jej protoplasty hd44780_outnibbletylko tym e nie czeka na sygna braku zaj to ci mikrokontrolera (nie realizuje teopoacute nie ) Nie jest to potrzebne gdy kolejne tetrady s wysy ane w odst pach cza-sowych okre lanych przez timer

Mamy wi c zapewnion obs ug transakcji i mo liwo transakcyjnego wy wietlaniadanych na LCD musimy jeszcze mie funkcj ktoacutera tworzy odpowiednie transakcjemdash jest odpowiednikiem funkcji bezpo rednio wysy aj cej dane znakowe do LCDOdpowiednikiem tym jest pokazana poni ej funkcja

bool LCD_PutText_B(uint8_t x uint8_t y char txt LCD_trans buf bool autodel) buf-gtcmd=LCD_Text buf-gtReady=false buf-gtSelfDel=autodel Czy zwolni pami po zako czeniu transakcji buf-gtdata[0]=HD44780_DDADDR(x+y0x40) Ustaw adres w DDRAM strcpy((char)ampbuf-gtdata[1] txt) Skopiuj dane tekstowe + NULL

Kup książkę Poleć książkę

66 AVR Uk ady peryferyjne

buf-gtlen=strlen(txt) + 1 D ugo tekstu + pozycji + NULL ndash 1 bool ret=cbAdd(ampLCD_TransBuffer buf) if((ret==false) ampamp (autodel)) free_re(buf) Brak miejsca w kolejce else TCD0_CTRLA=TC_CLKSEL_DIV1_gc Preskaler 1 mdash odblokuj timer return ret

Funkcja ta buduje transakcj odpowiedzialn za wy wietlenie napisu txt na wskaza-nej pozycji x y LCD Wszystkie dane o transakcji zostan umieszczone w buforzew pami ci ktoacuterej adres jest okre lany wska nikiem buf Pami w buforze musi bywystarczaj co du a aby pomie ci ca transakcj Dodatkowy parametr autodel okre laczy pami ta ma by automatycznie zwalniana po obs u eniu transakcji (true) czynie (false) Je li transakcj uda o si umie ci w kolejce funkcja zwraca true Wartozauwa y e w takim przypadku funkcja uruchamia te timer (w naszym przypadkujest to timer TCD0) odpowiedzialny za generowanie przerwania Funkcja obs ugi prze-rwania wysy a dane do LCD

Pewn odmian powy szej funkcji jest funkcjabool LCD_PutText(uint8_t x uint8_t y char txt) LCD_trans trans=malloc_re(sizeof(LCD_trans) + strlen(txt) + 2) bool ret=LCD_PutText_B(x y txt trans true) return ret

Wykorzystuje ona funkcj LCD_PutText_B z tym e najpierw alokuje dynamiczniepami potrzebn na przechowanie tworzonej transakcji

Mamy komplet potrzebnych funkcji a wi c sprawd my jak ca o sprawdza siw praktyce W pliku LCD-transactc znajduje si kod pokazuj cy jak dzia aj naszetransakcje Aby to by o mo liwe nale y zainicjalizowa kontroler LCD

LCD_init()

Wykorzystujemy tu znan ju funkcj inicjalizuj c mdash nie ma potrzeby jej zmienia gdy operacja inicjalizacji LCD jest jednorazowa i nie trzeba wykonywa jej w posta-ci transakcji W drugim kroku musimy zainicjalizowa wykorzystywany timer i systemprzerwa

LCD_Timer_init(ampTCD0)PMIC_CTRL|=PMIC_LOLVLEN_bm Odblokuj przerwania niskiego poziomusei()

Poniewa dost p do LCD z pewno ci nie jest czynno ci krytyczn czasowo prze-rwaniom timera nadano najni szy priorytet Dzi ki temu mo na innym bardziej kry-tycznym przerwaniom nada wy sze priorytety i uzyska w ten sposoacuteb zmniejszenieczasu latencji obs ugi przerwa Sama inicjalizacja timera jest niezwykle prosta

void LCD_Timer_init(TC0_t tc) tc-gtINTCTRLA=TC_OVFINTLVL_LO_gc Odblokuj przerwania nadmiaru timera i nadaj im niski priorytet tc-gtPER=F_CPULCD_ACCESSTIME Przerwanie co 4 us (niezale nie od F_CPU)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 67

Sprowadza si ona tylko do odblokowania mo liwo ci zg aszania przerwania nadmia-ru oraz konfiguracji rejestru PER tak aby przerwania by y generowane co ok 4 s mdashniezale nie od cz stotliwo ci taktowania CPU Mo emy wi c przyst pi do wy wie-tlenia pierwszego napisu

LCD_PutText(00 Numer)

Powy sza funkcja ma jedn wad mdash alokuje dynamicznie pami po ka dym wywo-aniu (pami ta jest automatycznie zwalniana po obs u eniu transakcji) niemniej

ca y proces jest czasoch onny Mo emy tego unikn alokuj c pami bdquor cznierdquo i wielo-krotnie wykorzystuj c zaalokowany blok pami ci Ilustruje to poni szy przyk ad

LCD_trans buf=malloc_re(sizeof(LCD_trans) + 7)

Zmienna buf wskazuje na obszar pami ci ktoacutery mo e pomie ci a cuch 5-znakowyTyle wystarczy na potrzeby tego przyk adu mdash na LCD b d wy wietlane kolejneliczby w zakresie 0 ndash 65 535 najd u sza ma 5 znakoacutew st d te nasz bufor ma tak a nieinn d ugo

while(1) utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(60 bufstr buf false) while(LCD_IsTransCompleted(buf))

Do konwersji liczby na a cuch u yto funkcji bibliotecznej utoa (nag oacutewek stdlibh)Poniewa d ugo a cucha po konwersji jest zmienna (co spowodowa oby pozosta-wianie na LCD bdquoduchoacutewrdquo po poprzednich konwersjach) w kolejnej linii brakuj ceznaki uzupe niono spacjami Nast pnie tworzona jest transakcja w obszarze pami ciprzydzielonym zmiennej buf Ostatnia p tla while jest odpowiedzialna za oczekiwa-nie na zako czenie realizacji transakcji Po jej zako czeniu p tla jest wykonywana odpocz tku

Uwa ny czytelnik z pewno ci zauwa y e pami przydzielana funkcj malloc_renie jest nigdzie zwalniana mdash w normalnej sytuacji spowodowa oby to wyciek pami -ci W naszym przyk adzie jednak program nigdy si nie ko czy nie ma wi c potrzebyzwalniania pami ci wskazywanej przez zmienn buf

Powy szy przyk ad pokazuje jak unikn blokowania CPU na czas dost pu do wolnodzia aj cego urz dzenia jakim jest LCD alfanumeryczny Jednak to nie wszystkiezalety wynikaj ce z zastosowania transakcji Drug wa n zalet naszego rozwi zaniailustruje przyk ad znajduj cy si w katalogu PrzykladyLCD-alfaLCD-transact-intPowa nym ograniczeniem funkcji odpowiedzialnych za dost p do LCD w sposoacutebklasyczny by a niemo no ich wywo ywania z funkcji obs ugi przerwa mdash funkcjeobs ugi LCD nie by y reentrant2 Nasz system oparty na transakcjach nie ma tychwad Aby to zilustrowa zosta stworzony prosty przyk ad mdash tak jak poprzedniow p tli g oacutewnej programu s wy wietlane stale kolejne liczby ale jednocze nie wyko-

2 Poza tym blokowa y CPU na d ugi czas a jak pami tamy funkcje obs ugi przerwa powinny by

wykonywane mo liwie kroacutetko

Kup książkę Poleć książkę

68 AVR Uk ady peryferyjne

rzystano drugi timer (TCD1) w ktoacuterego funkcji obs ugi przerwania przepe nienia jestwy wietlany licznik tych przerwa

ISR(TCD1_OVF_vect) static char int_buf[sizeof(LCD_trans) + 7] static uint16_t cnt char bufstr[6]

utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(61 bufstr (LCD_trans)ampint_buf false)

Jak widzimy w sposoacuteb asynchroniczny z dwoacutech miejsc w programie mo emy uzy-ska dost p do LCD a ka da funkcja bdquoma wra enierdquo e ma LCD na wy czno Przy okazji warto przeanalizowa sposoacuteb w jaki jest rezerwowana pami na trans-akcj w przerwaniu Oczywi cie mo na by wykorzysta dynamiczn alokacj pami cilecz jak wspomniano taka alokacja jest czasoch onna St d te w pokazanym przy-k adzie wykorzystano tablic statyczn int_buf o rozmiarze umo liwiaj cym prze-chowanie kompletnej transakcji Dzi ki temu e zmienna int_buf jest zmienn statycz-n nie jest ona niszczona po zako czeniu funkcji obs ugi przerwania Gdyby pomins owo kluczowe static zmienna ta by aby niszczona a na LCD najprawdopodobniejzacz yby si pojawia przypadkowe tre ci Poniewa pami naszego bufora nie by aalokowana dynamicznie nie mo e ona zosta zwolniona w naszym sterowniku LCDst d te ostatni parametr wywo ania funkcji LCD_PutText_B musi mie warto false

OptymalizacjaPrzy okazji tego i poprzedniego przyk adu warto zastanowi si jeszcze nad jednkwesti mdash optymalizacji W podanych przyk adach wykorzystano wcze niej omoacute-wione funkcje dost pu do wy wietlacza LCD znajduj ce si w plikach hd44780ci hd44780h Wi kszo z zawartych tam funkcji nie jest wykorzystywana jednakkompilator mimo wszystko umieszcza ich kod w pliku wynikowym mdash dzieje si takponiewa nie mo e on bdquostwierdzi rdquo czy funkcje te nie s wykorzystywane w innychfragmentach programu Pami tajmy e kompilator kompiluje poszczegoacutelne pliki roacute-d owe osobno i dana jego instancja nie bdquowierdquo co znajduje si w innych plikach (innychjednostkach kompilacji) Tak ca o ciow wiedz ma dopiero konsolidator (linker)ktoacutery czy stworzone przez kompilator pliki obiektowe (o rozszerzeniu o) w plikwynikowy Linker jednak bdquonie wierdquo ktoacutera z funkcji programu zosta a u yta a ktoacuteranie mdash informacje te ma wy cznie kompilator W ten sposoacuteb powstaje typowe b dneko o w efekcie nasze nieu ywane funkcje nie s usuwane (linker zostawia je bdquonawszelki wypadekrdquo) i zajmuj niepotrzebnie pami Czy mo na temu jako zaradzi Oczywi cie tak W tym celu trzeba po czy si y kompilatora i linkera co zapewniaj od-powiednie opcje kompilacji We w a ciwo ciach projektu (ProjectProperties lub Alt+F7)wybieramy zak adk Toolchain a nast pnie AVRGNU C Compiler i OptimizationZnajdziemy tam pole wyboru o nazwie Prepare functions for garbage collection (ry-sunek 224)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 69

Rysunek 224 Aby da linkerowi mo liwo usuwania nieu ywanych funkcji nale y skompilowaprogram z wybran opcj ndashffunction-sections ktoacutera spowoduje e ka da funkcja programu znajdzie siwe w asnej sekcji

Zaznaczenie tej funkcji spowoduje umieszczenie ka dej funkcji w osobnej sekcji mdashsamo w sobie nie wp ynie to na skroacutecenie kodu wynikowego ale jest warunkiem nie-zb dnym dla podj cia stosownych dzia a przez linker Aby wyeliminowa nieu y-wane funkcje nale y zaznaczy jeszcze w ga zi AVRGNU LinkerOptimization poleGarbage collect unused sections (rysunek 225)

Rysunek 225 Zaznaczenie opcji Garbage collect unused sections (-Wl--gc-sections) spowodujee nieu ywane funkcje zostan usuni te z kodu wynikowego w efekcie kod programu ulegnie skroacuteceniu

Po zaznaczeniu tych opcji program zostanie skroacutecony o kilkaset bajtoacutew Oczywi cieje li wszystkie funkcje by yby wykorzystane nie uzyskaliby my adnego skroacuteceniakodu Niemniej w sytuacji gdy u ywa si bibliotek zazwyczaj przynajmniej czfunkcji nie jest wykorzystywana warto wi c skorzysta z tej mo liwo ci optymalizacji

Kup książkę Poleć książkę

70 AVR Uk ady peryferyjne

Je li mamy do czynienia z prekompilowan bibliotek (lib) to musi ona by skom-pilowana z zaznaczon opcj Prepare functions for garbage collection (-ffunction-sections) Alternatyw jest umieszczenie ka dej funkcji biblioteki w osobnym pliku(tak jak w przypadku bibliotek AVR-libc)

Na ekranie wyboru opcji optymalizacji linkera mamy jeszcze jedn przydatn opcjmdash Relax Branches (-mrelax) Dla mikrokontroleroacutew ktoacutere maj ponad 8 kB pami ciFLASH instrukcje skokoacutew s generowane jako tzw instrukcje d ugie mdash umo liwiajone skok do komoacuterki pami ci FLASH o dowolnym adresie Jednak cen za to jestwyd u enie instrukcji mdash ich kod jest d u szy podobnie jak czas wykonania Nie zawszejednak takie d ugie instrukcje musz by wykonywane mdash je li miejsce docelowe skokule y blisko (w zasi gu instrukcji skokoacutew wzgl dnych) to mo na w kodzie wynikowymzamieni instrukcje d u sze na kroacutetsze co przynosi oszcz dno ci w postaci skroacuteceniakodu wynikowego Poniewa dopiero linker bdquowierdquo jak poszczegoacutelne fragmenty kodus rozmieszczone w pami ci takiej podmiany mo na dokona na etapie linkowaniaprogramu co zapewnia powy sza opcja St d te warto to pole wyboru zaznaczy

Kup książkę Poleć książkę

SkorowidzA

ABI Application Binary Interface 25AC Address Counter 50ADPCM 482adres

bazowy 377bufora 61komoacuterki 84pu apki 202

ALE Address Latch Enable 368alfanumeryczne wy wietlacze 43algorytm ADPCM 492algorytmy stratne 495animacje 57antyaliasing 325architektury procesoroacutew XMEGA 352asembler 23

dyrektywy 40funkcje j zyka C 41obs uga przerwa 39

asynchroniczne wywo anie funkcji 101Atmel Studio 15

Bbajty kalibracyjne 569biblioteka

FATFS 131 139 176 180 517libcallback-liba 99PetitFS 144 149

bitADC_CH0START_bm 236IMPMODE 244

bitrate 442 512blokowanie przerwa 219b d 16 19

kwantyzacji 463offsetu 230wzmocnienia ADC 230

BOD 223bps bits per second 12

budowakarty 152linii obrazu 394pami ci SDRAM 374pliku stymulacji 192ramki PAL 412sygna u PAL 411wtyczki 544 545

bufor 78FIFO 497na transakcje 61transakcji 62

buforowanie wyj cia 294

CCAS Column Address Strobe 375CCFL 44charakterystyka

przetwornikoacutew 222termistora 264tryboacutew pracy 232

CID Card Identification 169CKE Clock Enable 375CLKIN 421COG Chip on Glass 310CRC 158 178CRC16 178CRC7 164CS Chip Select 361 375CSD Card Specific Data 172czas

dost pu do SDRAM 424adowania kondensatora 244

propagacji 281proacutebkowania 260symulacji 209

czcionki 322cz stotliwo

odchylania pionowego 428proacutebkowania 244 441 444 530przebiegu 504

Kup książkę Poleć książkę

576 AVR Uk ady peryferyjne

cz stotliwoPWM 465taktowania koprocesora 549taktowania procesora 209taktowania rdzenia 18

czyszczenie pami ci 318

DDAC Digital to Analog Converter 293 447 451

buforowanie wyj cia 294generowanie przebiegoacutew 301jitter 303kalibracja 306napi cie referencyjne 295system zdarze 297taktowanie 296tryb dwukana owy 301wykorzystanie DMA 298wyzwalanie konwersji 305

datalogger 261 265 275DD Device Density 86debuger 183

programowy 190sprz towy 185 187

decymacja 259DEBUG 219XMEGA 260

definicja symboli globalnych 36definiowanie w asnych znakoacutew 56deklaracja zapowiadaj ca 103 337dekoder DTMF 548 556DMA 254 298 402 458 518 523dost p do

danych 358 359 568danych binarnych 356 360danych wielobajtowych 31DataFLASH 137EEPROM 128FAT 136komoacuterki 375LCD 59 62 66 68operandu 30pami ci 81 384 386 387 561pami ci SDRAM 424pliku blokowy 141portoacutew IO 30rejestroacutew IO procesora 36rejestroacutew uk adu 499SPI 95sygnatury u ytkownika 565 567wska nikoacutew 32

DQM Data Mask 375DSP Digital Signal Processor 535

DTMF 535 553dyktafon 529dynamiczna alokacja pami ci 516dyrektywa global 38dyrektywy asemblera 40dzia anie

DMA 255komparatora 280timeroacutew 400

d wi k 443

EEBI External Bus Interface 361EEPROM 207eliminacja jitteru 24emulacja RS232 139

FFAT File Allocation Table 128 131FAT32 128FATFS 180filtr

dolnoprzepustowy 491drugiego rz du 470pierwszego rz du 469trzeciego rz du 471

filtrowanie sygna u PWM 468firmware 565FLASH 207format

odpowiedzi 159polecenia 158protoko u 157

funkcja_delay_ms 17 219c_zero 42callback 106 341callback() 99DataFLASH_CSEnable 100DF_FinishBufWrite() 269disk_initialize 136disk_ioctl 181disk_status 136disk_write 138DMA_SPI_init 104DTMF_GetCode 553free_re 65GPIOR0_init 507hd44780_outcmd 51hd44780_outnibble_nowait 65LCD_defchar_P 57

Kup książkę Poleć książkę

Skorowidz 577

Menu_Click_Func 515Menu_Free 516Menu_Recorder 532Menu_Run 527MS_CreateRegEntry 117MS_GetDirPos 125MS_GetRegItem 115MS_WritePages 116 118OSC_wait_for_rdy 473RecMenu_StartStop 532sprintf 142strtok 124sysclk_init() 200 209TMF_memcpy_PF 454udi_cdc_getc() 123udi_cdc_is_rx_ready() 123VS1003_Reset 506

funkcjeanalizuj ce 556biblioteczne 50biblioteki FATFS 143j zyka C 41kontrolera ST7565R 313opoacute niaj ce 17opoacute nie 219reentrant 524specjalne kontrolera 319steruj ce 314zapisu 133

fusebit 557BODACT 560BODLEVEL 560BOOTRST 559DVSDON 560EESAVE 561JTAGEN 558RSTDISBL 559SUT 559TOSCSEL 559

fusebity w AVR-libc 571

Ggenerator obrazu composite 426generowanie

d wi ku 461kolorowego obrazu 437obrazu wideo 391przebiegoacutew 301przerwa 285sygna u composite 409

g bia koloru 326gniazdo

karty SD 156VGA 396

Hhistereza 281

IIDE 11IMA ADPCM 483informacje

o kolorze 431o obrazie 434

inicjalizacjakarty 161karty SDHC 167karty SDSC 167karty SDXC 167licznika 419pami ci 119USART 505

instrukcjaicall 42movw 35nop 13 24

interfejsSCI 498SDI 498SPI 71 79RS232 120UART 123USART 71 73

interpolacja 259interpolacja w XMEGA 260inwersja obrazu 319

Jjednostki 12jitter 24 303 420

Kkalibracja

ADC 229DAC 306 564offsetu 237

kana DMA 82 522karta 154 158

mikroSD 152SD 151 152SDHC 151 152 160SDSC 160SDXC 151 160

Kup książkę Poleć książkę

578 AVR Uk ady peryferyjne

karty pami ci 151 152 157biblioteka FATFS 180budowa 152format polecenia 158inicjalizacja 161 167komunikacja 156odczyt danych 173opcje konfiguracyjne 181rejestry specjalne 169tryby pracy 153zapis danych 176zasilanie 154

kodasemblerowy 23 24C 23dost pu 24

kodowanieμ-law 481ADPCM 483Dialogic ADPCM 494informacji 166 426koloru 425znakoacutew 536

kodyformatoacutew audio 501zdarze 545

kolejno bajtoacutew 533kolor 424 430kolorowy obraz 437komparator 422

analogowy 279 280analogowy XMEGA 282okienkowy 284

kompilacja plikoacutew binarnych 350kompilator avr-gcc 11 359kompresja

ADPCM 482 486d wi ku 480IMA ADPCM 482

komunikacja z koprocesorem 504konfiguracja

4-portowa 364biblioteki 133debugera 185DMA 459 522fusebitoacutew 570kontrolera DMA 257 452komparatoroacutew 285lockbitoacutew 570LPC 371pami ci SDRAM 381PetitFS 149pinu IO 225portoacutew IO 362

preskalera 452projektu 186przerwa 219pu apki 203rejestru EVCTRL 248rejestru PER 67SPI 75sygna u CS 377typu czcionki 324urz dze IO 189USART 76zegara 383

konsolidacja 547kontroler

DMA 254 298 402 458 518 523KS108 310ST7565R 310ndash315 321

konwersjaDAC 305sygna oacutew 396wyzwalana 306

konwertercyfrowo-analogowy 426DAC 427

koprocesormp3 496VS1003B 10

korekcja fazy 466kwantyzacja 463

Llampa CCFL 44LE Latch Enable 433licznik 419

cykli 209TCC1 400timera 20

linie IO 50linie sygna owe

MISO 72 164MOSI 72SCK 72SS 72

linker 69lista

mnemonikoacutew 24modyfikowanych rejestroacutew 32

lockbity 557 561lockbity w AVR-libc 570LPC Low Pin Count 371LPCM 443 556LSB Least Significant Bit 228

Kup książkę Poleć książkę

Skorowidz 579

a cuchy formatuj ce 212czenie plikoacutew 352

Mmagistrala pami ci zewn trznej 361magnetofon cyfrowy 528makro _SFR_IO_ADDR() 39makrodefinicja

ASSERT 214HD44780_CGADDR() 53HD44780_CLR 53HD44780_DDADDR() 53HD44780_DISPCTL() 52HD44780_ENTMODE() 52HD44780_FNSET() 52HD44780_HOME 53HD44780_SHIFT() 51LOCKBITS 571

mapowanie sygna oacutew 366mapy bitowe 343marker czasowy 268maski bitowe 329matryce 49menu 335menu piktogramowe 342mierniki temperatury 262mikrokontroler

ARM 9AVR 9PIC 9XMEGA128A3U 10

MISO 72moc wydzielana 265model psychoakustyczny 495modu

alfanumeryczny 45NVM 568Xmega eXploreGO 10Xplained ATXMEGA A3BU 10Xplained ATXMEGA-A1 10Xplained XMEGA128A1 447Xplained XMEGA256A3 94Xplained XMEGA256A3BU 97 143 266

modyfikator 30const 85volatile 28 273

monitory CRT 395monochromatyczne wy wietlacze graficzne 309monochromatyczny

tryb graficzny 416tryb tekstowy 413

MOSI 72mp3 495Msps Megasamples per second 12multiplekser wej ciowy 226 283multipleksowanie adresoacutew 368 369muzyka 439

Nnadawanie kodoacutew DTMF 540nadproacutebkowanie 258nag oacutewek kontenera wav 500nagrywanie mowy 486najmniej znacz cy bit 228napi cie

offsetu 280referencyjne 223 295zasilania 239

Oobracanie obrazu 319obraz 319

composite 426kolorowy 430wideo 391

obroacutebka d wi ku 443 445obs uga

FAT 131 143klawiatury matrycowej 24LCD 58 63 67menu 337przerwania 37 38 458przerwania DMA 525przerwa w asemblerze 39przyciskoacutew 272wy wietlaczy alfanumerycznych 45

odczytblokowy 140danych 173 358

odpowied response 159R1 159R2 159R7 160

od wie anie pami ci 376odtwarzanie

d wi ku 472muzyki 447 513 518 521

offset 238offset ADC 230okno

Breakpoints 202Call stack 209dezasemblera 210

Kup książkę Poleć książkę

580 AVR Uk ady peryferyjne

oknoIO View 207podgl du zmiennych 211wyboru czcionek 324

OLED 46opcje

kompilatora 35zapisu d wi ku 445

operacjena buforach 91odczytu 173zapisu 176zapisu strony 92

operand 29operator

ascii 41

asciz 41

byte 41

section 41opoacute nienia 13 18opoacute nienie zmienne 16optymalizacja 16 68optymalizator 26organizacja pami ci 77organizacja pami ci VRAM 316oscylator 287OSD On-Screen Display 417ostrze enie 16oszcz dzanie energii 94

Ppakiet WinAVR 48pami

CGRAM 56 57 64DataFLASH 10 77 81 113 269DDRAM 49EEPROM 111FLASH 54 124 207RAM 49SDRAM 372SRAM 63 124 329 366 371VRAM 314 317

PCLK 421PCM 443PetitFS 144 149p tla

for 13while 201

pierwsza linia obrazu 321piksel 430piktogram 342pin IO 225

plikAlloc_safeh 65DataFLASHc 83DataFLASHIOc 136definesh 50delayh 14diskioh 132 136ffh 132ffconfh 132 181hd44780h 49integerh 132ioh 30LCD_transc 61LCD-transactc 66Makefile 14Menuc 19nothingo 541outfiletxt 547 551pffh 149SPIh 104stringh 113stymulacji 191 192

pliki mp3 495elf 351fon 323o 24S 24 34binarne 350 355csv 276d wi kowe 440obiektowe 352wav 500WMA 512z czcionkami 327z danymi 349

podbijacz napi cia 315podgl d

pami ci 207stosu wywo a 209zmiennych 211znakoacutew 325

pod czeniefototranzystora 262karty SD 155LCD z kontrolerem 311modu u 50pami ci 362 369 370 373termistora 262uk adu LM35 251wyj XMEGA 398

pod wietlenieCCFL 46OLED 46

Kup książkę Poleć książkę

Skorowidz 581

podwoacutejne buforowanie 255 332 457polecenia

kasowania strony 81konfiguracyjne pami ci 82kontrolera ST7565R 315odczytu bufora 82 89odczytu pami ci 81 88SDRAM 376transferu 91

polecenieACMD41 168cd 181CID 178CMD0 165CMD8 167CSD 178date 276dir 127 181dump 276erase 276get 276HD44780_CLR 51Init 178mkdir 181

po czenieDMA ze SPI 96dwoacutech komparatoroacutew 285koprocesora mp3 497LCD z mikrokontrolerem 48wyj cia XMEGA 411XMEGA z PC 121z telewizorem 431

pomiarnapi cia zasilania 239temperatury MCU 241

port IO 30 362pozycjonowanie grafik 345poacute obraz 410precyzja pomiaroacutew 260preskaler 478preskaler ADC 243program

Atmel Data Visualizer 275Audacity 443avr-objcopy 350dataloggera 265LCD Image Converter 323makeloadingtableexe 543Realterm 127 554riffstrip 483SoX 445Tracepoint 208

programowanie sygnatury u ytkownika 566protokoacute master-slave 157

prototypy 136proacutebki d wi kowe 447proacutebkowanie

8-bitowe 300nieliniowe 480

prymitywy graficzne 330przebieg PWM 468przebiegi 289 303przechwytywanie danych 276przemiatanie wej 253przerwanie 218 254 286 403

DMA 522komparatora 286

przestrze adresowa procesora 378przesy anie

danych 498polece 498

przetaktowanie procesora 436przetwornik

ADC 221analogowo-cyfrowy 221cykliczny 222potokowy 222

przyciski 272pseudooperatory 41pu apki breakpoints 197pu apki warunkowe 205punkty ledzenia 203PWM 461 462 472

RRAS Row Address Strobe 375redukcja poboru energii 242regulacja kontrastu 321rejestr 32 34rejestr AC 50

adresu wtyczki 513BASEADDR 377CID 169CMP 251CSD 172czasu utworu 512DATA 83EVCTRL 248formatu audio 512identyfikacyjny pami ci 87INTFLAGS 252kontroli basoacutew 510kontroli g o no ci 513MUXCTRL 227OCR 168PER 67poroacutewnania 249

Kup książkę Poleć książkę

582 AVR Uk ady peryferyjne

rejestr ACSCI_CLOCKF 511stanu komparatora 287stanu pami ci 86stanu uk adu 510trybu pracy 508WINCTRL 285

rejestrydost pu do pami ci RAM 513GPIOR 502IO procesora 36mikrokontrolera 25procesora 35specjalne 94specjalne karty 169uk adu VS1003B 508

relacja rodzic ndash dziecko 336reset uk adu 534rozdzielczo

LCD 329przetwornika 231PWM 463 477

rozszerzenie HiRes 477 479roacutewnanie Steinharta-Harta 263rysowanie map bitowych 343

Sschemat uk adu dataloggera 267SCI Serial Command Interface 498SCK 72SD Secure Digital 152SDI Serial Data Interface 498separator synchronizacji 422separowanie impulsoacutew synchronizacji 422shieldy 10skaler 422skaler napi cia 283skrypt makefile 353s owo kluczowe

asm 27extern 37static 68

specyfikatory lokalizacji zmiennej 213sps samples per second 12SS Slave Select 72standard PAL 410standard VGA 393sterowanie

dataloggerem 275sygna em 379

sterownik 121HD44780 49 56LCD 49 62

stos wywo a 209

strukturaFATFS 139Handle 118LCD_trans 60 63menu 338rejestru 86SimpleFSEntry 113 116SimpleFSHandle 113 118 140submenu 527systemu plikoacutew 112

sumabitowa 571kontrolna 178

sygnacomposite 409composite video output 430CS 377DREQ 497H-Sync 396synchronizacji 423V-Sync 396zegarowy CLK 374

sygna yinterfejsu EBI 363magistrali EBI 364steruj ce 375

sygnaturaprodukcyjna procesora 563u ytkownika 565

symbol__DELAY_ROUND_CLOSEST__ 17__DELAY_ROUND_DOWN__ 17_FS_FAT12 149_FS_FAT32 149_FS_MINIMIZE 133_FS_READONLY 133_FS_RPATH 135_FS_TINY 133_MAX_SS 135_MULTI_PARTITION 135_USE_DIR 149_USE_FASTSEEK 134_USE_FORWARD 134_USE_LABEL 134_USE_LFN 134_USE_LSEEK 149_USE_MKFS 134_USE_READ 149_USE_STRFUNC 134_USE_WRITE 149_VOLUMES 136F_CPU 14 15 18increment 36USE_BUSY_FLAG 50

Kup książkę Poleć książkę

Skorowidz 583

symboleglobalne 36w asemblerze 28zewn trzne 39

symulacja 198 209symulator 190synchronizacja

pami ci 331pionowa 395pozioma 394

systemplikoacutew 111 128przerwa 404zdarze 245

szablonfont_XMEGAtmpl 326image_XMEGAtmpl 343

szum 463szybko przesy ania danych 126

ledzenie wi zki 333rodowisko

graficzne 11programistyczne 11VSIDE 542WinAVR 47

Ttabela FAT 130tablica

framebuf 402 408plugintbl 552 555tekst 208z kodem wynikowym 543

taktowanieDAC 296mikrokontrolera 473

technologia OLED 44temperatura mikrokontrolera 239 241termistor 262 290

NTC 263PTC 263

termometrLM35 249 250z alarmem 251

termostat 290test uk adu VS1003B 503testowanie obrazu 319timer 16 62

TCC0 20

TCC1 399transakcja 59 62 65transakcje 17 103ndash107transakcyjna obs uga LCD 58transakcyjny dost p do SPI 95transfer 91

danych 97wynikoacutew 254

transmisja 72 83tryb

bez znaku 234ci g ej konwersji 252czterobitowy 153dwukana owy 301graficzny 416graficzny VGA 407idle 419jednobitowy 153LPC 371monochromatyczny 397 407oszcz dzania energii 94 306pracy multipleksera 226pracy SPI 157roacute nicowy 232single slope 312SPI 153tekstowy 413tekstowy VGA 397z pojedynczym wej ciem 234ze znakiem 235

trybygenerowania PWM 467pracy karty 153pracy przetwornika 231pracy SPI 74pracy uk adu 508

twierdzenie Nyquista 258tworzenie

adresu 84nak adek 417obrazu 335tablicy 543

typ__uint24 119karty 160niekompletny 60wyliczeniowy 114

typyoperandoacutew 29w AVR 34

Kup książkę Poleć książkę

584 AVR Uk ady peryferyjne

Uuchwyt handle 64 113uk ad

AD725 427 431buforowy 294CS 361DAC 284dataloggera 267detekcji awarii zasilania 559generuj cy obraz 393HiRes 477ICL7660 47LM35 250 251SampH 293sterowania sygna em 379USART 401VS1003B 496 503 508 530 538 556VS100XX 529wzmacniania sygna u 227

uk ady peryferyjne 9uruchomienie komparatora 287urz dzenie

master 72slave 72

u rednianie 259utrata danych 141u ycie wstawki asemblerowej 33

VVGA 393

Wwarto ci kalibracyjne

ADC 564oscylatoroacutew 564temperatury 564

warunkowa kompilacja 36WE Write Enable 375wej cie composite video input 425wektor przerwa 38 257wideo 391wielko pami ci 86 377w czenie DAC 299wska nik na struktur 27wska niki 32wstawki asemblerowe 24 33wtyczka 535 541 544

SineDTMF Generator 537VGA 396

wyboacuter cz stotliwo ci PWM 465 474wykorzystanie

DMA 254 518

EuroSCART 428PWM 461rejestroacutew 34

wyliczanie predyktora 489wy wietlacze

alfanumeryczne 43 45graficzne 43 309LCD 43OLED 46

wy wietlanielitera u 213map bitowych 344obrazu 333 346 406obrazu VGA 393

wywo ania zwrotne callbacks 98asynchroniczne 101synchroniczne 101

wyzwalanie konwersji 245wzmacniacz 446wzmacniacz operacyjny 279wzmacnianie sygna u 227

XXMEGA 9 18

Zzapis

bufora 269danych 176d wi ku 440 556

zasilaniekarty 154pami ci 109

zatrzask 368zatrzask 74HC573 433zatrza ni cie adresu 369zdarzenia 297zdarzenie compare match 399zegar 383 420 426zintegrowane rodowisko programistyczne 11z cze EuroSCART 425 428 429zmiana

g o no ci 527wielko ci strony 94

znaki 56

roacuted onapi cia odniesienia 284sygna u 240

Kup książkę Poleć książkę

Page 17: Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8 AVR. Ukäady peryferyjne Rejestry dost pu do pami ci RAM .....513 Rejestr adresu

52 AVR Uk ady peryferyjne

hd44780_outcmd(HD44780_SHIFT(10)) _delay_ms(700)

HD44780_FNSET(if8bit twoline font5x10)Polecenie to wybiera typ interfejsu mdash 8-bitowy je li warto parametru if8bit jestroacutewna 1 lub 4-bitowy je li jest roacutewna 0 Typ interfejsu musi odpowiada sposobowipo czenia modu u z mikrokontrolerem Parametr twoline okre la czy pod czonamatryca LCD ma jedn lini znakoacutew czy dwie Matryce ktoacutere maj 4 linie tekstu straktowane przez kontroler jako matryce dwuliniowe mdash parametr twoline powinienmie warto 1 Je li dla matrycy zawieraj cej dwie lub wi cej linii ustawimy go na 0to wy wietlana b dzie tylko jedna linia (w przypadku matryc dwuliniowych goacuterna)a w przypadku matryc 4-liniowych b d wy wietlane dwie linie rozdzielone lini pust

Ostatni parametr okre la typ u ywanego generatora znakoacutew Powinien on odpowiadau ytej w module matrycy zwykle wi c jego warto wynosi 0

HD44780_DISPCTL(disp cursor blink)Ustawia roacute ne parametry pracy matrycy Je li parametr disp ma warto 1 to matrycajest w czona (wy wietla zawarto DDRAM) a je li 0 to matryca jest wy czonalecz stan pami ci DDRAM nie ulega zmianie Np kod

while(1) hd44780_outcmd(HD44780_DISPCTL(011)) _delay_ms(700) hd44780_outcmd(HD44780_DISPCTL(111)) _delay_ms(700)

powoduje naprzemienne w czanie i wy czanie matrycy w efekcie wy wietlany tekstmruga

Parametr cursor okre la czy sprz towo wy wietlany kursor ma by widoczny (war-to parametru 1) czy niewidoczny (warto parametru 0) Je li kursor jest widocznyto dodatkowo mo emy okre li czy ma miga (warto parametru blink roacutewna 1)czy nie (blink = 0) Je li kursor jest widoczny i nie miga jest wy wietlany w postacipoziomej kreski Wy wietlanie kursora mo e by u yteczne w sytuacji kiedy u yt-kownik wprowadza jakie dane W pozosta ych sytuacjach kursor mo emy wy czy

HD44780_ENTMODE(inc shift)Okre la sposoacuteb wprowadzania danych do pami ci Je li parametr inc ma warto 1 topo ka dej operacji zapisuodczytu adres pami ci jest automatycznie zwi kszany o je-den co przy piesza operacj zapisuodczytu kolejnych znakoacutew Je li warto inc jestroacutewna 0 to adres jest automatycznie zmniejszany o 1 Dodatkowo parametr shiftokre la czy wy wietlany obraz ma by automatycznie przesuwany tak aby wy wie-tla ostatnio wprowadzony znak (shift = 1) lub go nie wy wietla (shift = 0)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 53

HD44780_CLRPowoduje wyczyszczenie (wype nienie znakami o kodzie 32) ca ej zawarto ci pami ciDDRAM Jednocze nie kursor wraca do pozycji pierwszej (pierwsza linia pierwszyznak)

Niewy wietlane bajty pami ci DDRAM tak e s kasowane Je li s one u ywanedo przechowywania zmiennych programu to przed operacj kasowania nale y jeskopiowa w bezpieczne miejsce W przeciwnym przypadku zostan utracone

Wska nik adresu do pami ci DDRAM jest ustawiany na 0 zerowane jest tak e prze-suni cie

HD44780_HOMEPowoduje powroacutet kursora do pozycji pocz tkowej mdash pierwsza linia pierwszy znakWska nik adresu do pami ci DDRAM w efekcie zawiera 0 zerowane jest roacutewnieprzesuni cie wy wietlania znakoacutew w efekcie s one wy wietlane od pozycji 0

HD44780_DDADDR(addr)Ustawia nast pny adres zapisuodczytu w pami ci DDRAM na addr Tylko 7 bitoacutewargumentu addr jest branych pod uwag w zwi zku z czym mo na zaadresowa mak-symalnie 128 bajtoacutew pami ci (z czego sterownik ma tylko 80 pozosta e lokacje snieu ywane)

HD44780_CGADDR(addr)Ustawia nast pn operacj odczytuzapisu w pami ci CGRAM na addr Pod uwagbranych jest tylko 6 bitoacutew zmiennej addr w efekcie mo na zaadresowa maksymalnie64 bajty pami ci CGRAM

Przedstawione powy ej funkcje zapewniaj jedynie podstawow komunikacj z mo-du em LCD Potrzebujemy jednak ci gle funkcji odpowiedzialnej za jego inicjalizacjmdash funkcja biblioteczna przeprowadza ten proces tylko w podstawowym zakresie musi-my jeszcze zadba o w a ciwe ustawienie parametroacutew zwi zane z posiadan matryc Napiszmy wi c w asne rozwini cie funkcji inicjalizacyjnej

void lcd_init() hd44780_init() Podstawowa inicjalizacja modu u hd44780_outcmd(HD44780_CLR) Wyczy pami DDRAM hd44780_wait_ready(1000) hd44780_outcmd(HD44780_ENTMODE(1 0)) Tryb autoinkrementacji AC hd44780_wait_ready(1000) hd44780_outcmd(HD44780_DISPCTL(1 0 0)) W cz wy wietlacz wy cz kursor hd44780_wait_ready(1000)

Zauwa e po wys aniu ka dego polecenia do modu u jest wywo ywana funkcjahd44780_wait_ready(1000) odpowiedzialna za oczekiwanie a realizacja wys anego po-lecenia dobiegnie ko ca Jest to niezb dne gdy do czasu uko czenia bie cej

Kup książkę Poleć książkę

54 AVR Uk ady peryferyjne

operacji dalsze polecenia s ignorowane Jako argument podany jest parametr 1000mdash jest on bez znaczenia nasza biblioteka korzysta z flagi Busy i po prostu go ignorujePo wykonaniu powy szej funkcji modu LCD jest poprawnie zainicjalizowany a jegopami jest wyczyszczona (zawiera bajty 0x20) i w efekcie modu nic nie wy wietlaOd tej chwili mo emy wysy a znaki do wy wietlenia

Po wykonaniu inicjalizacji ekran mo e pozosta czysty lub wy wietla ca kowiciewype nione kwadraty (wszystkie piksele w czone) Je li po inicjalizacji wszystkiepiksele s w czone nale y nieco zmniejszy kontrast

Aby sobie u atwi to zadanie zdefiniujmy funkcj wysy aj c do modu u jeden znakvoid lcd_putchar(char c) static bool second_nl_seen static uint8_t line=0

if ((second_nl_seen) ampamp (c = n)ampamp(line==0)) Odebrano pierwszy znak hd44780_wait_ready(40) hd44780_outcmd(HD44780_CLR) hd44780_wait_ready(1600) second_nl_seen=false if (c == n) if (line==0) line++ hd44780_outcmd(HD44780_DDADDR(64)) Adres pierwszego znaku drugiej linii hd44780_wait_ready(1000) else second_nl_seen=true line=0 else hd44780_outdata(c) hd44780_wait_ready(40)

Funkcja ta ze wzgl du na skomplikowane adresowanie pami ci DDRAM jest zale naod konkretnego modelu modu u LCD B dzie prawid owo wspoacute pracowa z modu a-mi 2times16 2times20 i 2times40 znakoacutew W przypadku innych modu oacutew pozycje niektoacuterychznakoacutew mog by nieprawid owe

Mo emy ju wy wietla na LCD pojedyncze znaki czas na wy wietlanie tekstu Po-niewa teksty jako sta e dla zaoszcz dzenia cennej pami ci RAM przechowuje si za-zwyczaj w pami ci FLASH zdefiniujmy funkcj odczytuj c podany a cuch zna-kowy z pami ci FLASH a nast pnie umieszczaj c go na LCD

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 55

void lcd_puttext_P(prog_char txt) char ch while((ch=pgm_read_byte(txt))) lcd_putchar(ch) txt++

Powy sza funkcja wysy a kolejne znaki odczytane z pami ci FLASH na LCD za po-moc funkcji LCD_putchar Po napotkaniu znaku ko ca a cucha (0 nul) przerywa swojedzia anie

Pozostaje nam przetestowa dzia anie przedstawionych funkcjiint main() lcd_init() lcd_puttext_P(PSTR(Test LCDnDruga linia)) while(1)

Na ekranie modu u LCD powinien wy wietli si napisTest LCDDruga linia

Je li na LCD nic nie widzimy to w pierwszej kolejno ci powinni my sprawdzi kon-trast zmieniaj c napi cie na pinie Vee modu u LCD

Warto zdefiniowa jeszcze funkcj ustawiaj c pozycj od ktoacuterej b dzie wy wietlanynast pny znak

void lcd_goto(uint8_t x uint8_t y) hd44780_outcmd(HD44780_DDADDR(0x40y+x)) hd44780_wait_ready(1000)

Funkcja ta przyjmuje dwa parametry x i y okre laj ce pozycj na ktoacuterej zostaniewy wietlony nast pny znak wys any z mikrokontrolera do modu u LCD Dzi ki temuz atwo ci mo emy uaktualnia zawarto LCD bez konieczno ci ponownego prze-sy ania wszystkich danych Funkcja ta jest zale na od typu zastosowanego modu u

Ostatni funkcj jest funkcja umo liwiaj ca czyszczenie zawarto ci pami ci modu uOdpowiedzialne za to jest proste polecenie wysy ane do sterownika

void lcd_cls() hd44780_outcmd(HD44780_CLR) hd44780_wait_ready(false)

Oproacutecz czyszczenia zawarto ci pami ci modu u powoduje ono ustawienie kursoraw punkcie (00)

Kup książkę Poleć książkę

56 AVR Uk ady peryferyjne

Definiowanie w asnych znakoacutewUk ad HD44780 jest wyposa ony w 64 bajty pami ci CGRAM (ang Character Ge-nerator RAM) ktoacutera mo e przechowywa mapy bitowe 8 znakoacutew o matrycy 5times8 pikselilub 4 znakoacutew o matrycy 5times10 pikseli Przyk ad definicji znaku na matrycy 5times8 poka-zano na rysunku 223

Rysunek 223Przyk ad definicji w asnego znakuw pami ci CGRAM Znak rysujemyna matrycy 5times8 bitoacutew polazaciemnione odpowiadaj warto ci 1pola bia e warto ci 0 Wartowyliczon dla ka dej linii pikseliwpisujemy do pami ci CGRAMsterownika Najstarsze 3 bity ka degobajta (pola szare) s bez znaczeniamdash wy wietlacz pomija jeprzy wy wietlaniu obrazu

1

2

3

4

5

6

7

0 00100 = 4

01110 = 14

11111 = 31

00100 = 4

00100 = 4

00100 = 4

11111 = 31

01110 = 14

Adres Warto

Dost p do tej pami ci jest mo liwy dzi ki wys aniu polecenia ustawiaj cego adreszapisuodczytu pami ci CGRAM Po jego wys aniu wszystkie operacje zapisu i od-czytu dotycz tej pami ci a nie pami ci DDRAM Aby wroacuteci do adresowania pa-mi ci DDRAM nale y wybra jej adres lub dokona operacji wymagaj cej przesu-ni cia kursora

Pami CGRAM jest pami ci ulotn po ponownym w czeniu zasilania definicjeznakoacutew musz by ponownie przes ane przez procesor

Bity o warto ci 1 w definicji znaku odpowiadaj w czonym pikselom bity o warto-ci 0 pikselom wy czonym Najstarsze 3 bity ka dego bajta w pami ci CGRAM s

bez znaczenia mdash te pozycje nie s wy wietlane przez matryc Definiuj c znak nale-y tak e pami ta e ostatnia linia wy wietlana przez matryc (w zale no ci od wiel-

ko ci matrycy znaku linia 8 lub 10) powinna zawiera same zera mdash w tej linii b dziewy wietlany kursor

Najcz ciej matryce LCD pod czone do sterownika HD44780 maj organizacj 5times8czyli jeden znak jest definiowany przez 8 kolejnych bajtoacutew okre laj cych stan po-szczegoacutelnych linii tworz cych znak Stwoacuterzmy funkcj ktoacuterej zadaniem b dzie za a-dowanie definicji znakoacutew z pami ci FLASH mikrokontrolera do pami ci CGRAM

void lcd_defchar_P(uint8_t charno prog_uint8_t chardef) hd44780_outcmd(HD44780_CGADDR(charno8)) hd44780_wait_ready(40) for(uint8_t c=0clt8c++) hd44780_outdata(pgm_read_byte(chardef))

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 57

hd44780_wait_ready(40) chardef++

Funkcja LCD_defchar_P jako argumenty przyjmuje numer definiowanego znaku (0 ndash 7)oraz wska nik do obszaru pami ci FLASH zawieraj cego definicj znaku (obszarten zajmuje 8 nast puj cych po sobie bajtoacutew) Jak widzimy funkcja najpierw ustawiaw a ciwy adres pod ktoacuterym znajdzie si pocz tek definicji znaku w pami ci CGRAMmdash poniewa jeden znak jest opisywany za pomoc 8 bajtoacutew kolejne adresy znakoacutewto kod_znakutimes8 Nast pnie dane opisuj ce znak s adowane z pami ci mikrokontrolerai zapisywane w pami ci CGRAM sterownika Poni szy program ilustruje wykorzy-stanie funkcji LCD_defchar_P

prog_uint8_t char1[8][8]=0000000255 00000025525500000255255255 0000255255255255 00025525525525525500255255255255255255 0255255255255255255255255255255255255255255255

int main() for(uint8_t x=0xlt8x++) lcd_defchar_P(xampchar1[x][0]) Za aduj wzorce znakoacutew lcd_init() for(uint8_t x=0xlt8x++) lcd_putchar(x) Wy wietl znaki o kodach 0 ndash 7 while(1)

W pierwszej linii funkcji main nast puje za adowanie nowych definicji znakoacutew dopami ci CGRAM nast pnie inicjalizowany jest wy wietlacz po czym w pierwszejlinii s wy wietlane znaki o kodach 0 ndash 7 a wi c znaki ktoacuterych definicja zosta aprzes ana z mikrokontrolera

Zauwa e pami CGRAM podobnie jak DDRAM mo emy zapisywa i odczytywaprzed inicjalizacj modu u LCD Proces inicjalizacji jest potrzebny tylko do prawi-d owego wy wietlania na ekranie LCD

Poniewa dane potrzebne do wy wietlenia znaku s na bie co pobierane z pami cipodczas od wie ania matrycy LCD jakiekolwiek zmiany w definicji znaku kiedy jest onwidoczny na LCD poci gaj za sob natychmiastowe zmiany w wy wietlanym obrazieMo na t w a ciwo sterownika wykorzysta do stworzenia prostych animacji

void lcd_box(uint8_t y) hd44780_outcmd(HD44780_CGADDR(0)) Zaczynamy od znaku o kodzie 0 hd44780_wait_ready(40) for(uint8_t c=0cltyc++) Stwoacuterz linie z w czonymi pikselami hd44780_outdata(0xFF) hd44780_wait_ready(40) for(uint8_t c=yclt8c++) Stwoacuterz linie z wy czonymi pikselami hd44780_outdata(0x00) hd44780_wait_ready(40)

Kup książkę Poleć książkę

58 AVR Uk ady peryferyjne

int main() lcd_init() lcd_putchar(0) while(1) for(uint8_t x=0xlt8x++) lcd_box(x) _delay_ms(100) for(int8_t x=7xgt=0x--) lcd_box(x) _delay_ms(100)

Funkcja main wy wietla na LCD tylko jeden znak o kodzie 0 a nast pnie cykliczniezmienia jego definicj w pami ci CGRAM W efekcie posta znaku wy wietlana naekranie ci gle si zmienia

Transakcyjna obs uga LCDPokazana do tej pory obs uga LCD alfanumerycznego mia a pewne wady Jak wiemyoperacje odwo uj ce si do kontrolera LCD s niezwykle wolne cykl odczytuzapisudowolnego rejestru kontrolera trwa co najmniej 1600 ns co dla MCU taktowanegozegarem 32 MHz przek ada si na czas wykonania oko o 52 instrukcji asemblera Cogorsza wi kszo komend realizowanych przez kontroler jest wykonywana w czasieoko o 37 s co przek ada si na tysi ce zmarnowanych taktoacutew MCU St d te jaki-kolwiek zapisodczyt LCD to z perspektywy programu straszne marnotrawstwo czasu

Problem ten dotyczy ka dego urz dzenia IO ktoacutere dzia a wolniej ni procesor W takiejsytuacji warto napisa pewn warstw po redni mdash sterownik mdash ktoacuterego zada-niem b dzie buforowanie da dost pu do urz dzenia i rozstrzyganie konfliktoacutewdzi ki czemu roacute ne cz ci programu b d bdquomia y wra enierdquo e maj wy czny do-st p do urz dzenia

Pokazane wcze niej funkcje obs ugi LCD maj jeszcze jedn wad mdash nie s wspoacute bie -ne czyli nie mo na ich wykonywa jednocze nie w kilku miejscach programu w tymw szczegoacutelno ci w programie g oacutewnym i w funkcjach obs ugi przerwa W wielu przy-padkach ta wada jest bez znaczenia jednak czasami jest uci liwa mdash dla przyk adugdy na wy wietlany tekst chcieliby my na o y inne informacje np o dacie lub godzi-nie Oczywi cie wy wietlanie mo na zorganizowa tak aby nie by o potrzeby pisaniawspoacute bie nego kodu np poprzez zastosowanie bufora pami ci VRAM kontrolera LCDRodzi to jednak kolejne problemy i jest ma o eleganckie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 59

Zastanoacutewmy si w jaki sposoacuteb najlepiej jednocze nie rozwi za problem wolnegodost pu do urz dzenia i wspoacute bie no ci kodu Rozwi zaniem mo e by wprowadze-nie tzw transakcji Transakcj nazywamy zbioacuter operacji tworz cych pewn ca-o To co wyroacute nia tak wykonywany zestaw operacji to atomowo spoacutejno

izolacja i trwa o Pod tymi terminami kryje si istota wykonywanej operacji Ato-mowo transakcji zapewnia e jest ona wykonywana w sposoacuteb niepodzielny co gwa-rantuje nam prawid ow wspoacute prac z danym urz dzeniem IO w tym przypadku kon-trolerem LCD Wa na dla nas jest tak e izolacja mdash dzi ki temu inne operacje na LCD(inne transakcje) nie b d mia y wp ywu na wynik aktualnie wykonywanej transakcjimdash nie b d zak oacuteca y jej wykonania z drugiej strony nasza transakcja nie zak oacuteciwykonania innych Trwa o z kolei zagwarantuje nam e je li sterownik potwierdziwykonanie transakcji to znaczy e efekt jej dzia ania jest wy wietlony na LCD Tacecha nie jest nam a tak potrzebna mdash jest ona wydawa oby si oczywista Niemniej jestto pewna gwarancja e ca a operacja przebieg a poprawnie i w efekcie LCD znajdujesi w okre lonym przez nas stanie Tyle teorii przejd my do praktyki

Kody poni szego przyk adu znajduj si w katalogu PrzykladyLCD-alfaLCD-transact

Aby zapewni transakcyjny dost p do LCD musimy stworzy pewne struktury danychktoacuterych zadaniem b dzie przechowywanie informacji o operacjach sk adaj cych sina transakcje i stanie ich wykonania W tym celu pos u ymy si wiadomo ciami z roz-dzia u 5 bdquoJak uporz dkowa chaos czyli z o one typy danych i listyrdquo Do przecho-wywania oczekuj cych transakcji pos u ymy si buforem pier cieniowym zanimjednak go zaimplementujemy zastanoacutewmy si jak powinna wygl da struktura prze-chowuj ca informacje o transakcji Struktura ta powinna zawiera co najmniej

pole danych (data) z informacjami ktoacutere maj by przes ane do kontrolera LCD

pole okre laj ce liczb danych do wys ania (len)

pole okre laj ce realizowane polecenie dla LCD (cmd) mdash pole to pos u yprogramowi sterownika do w a ciwej interpretacji danych znajduj cych siw polu data

kilka poacutel kontrolnych przechowuj cych informacje potrzebne do realizacjisamej transakcji Jedno z nich mdash Ready mdash b dzie przyjmowa warto trueje li dana transakcja zosta a zrealizowana lub false w przeciwnym przypadkuZnaczenie drugiego pola mdash SelfDel mdash mo e wydawa si nieco enigmatycznepole to okre la czy pami przydzielona dla transakcji ma by zwolnionaw sterowniku LCD (warto true) czy te zostanie zwolniona w programie(warto false)

Oto jak mo e wygl da struktura definiuj ca transakcj typedef struct volatile bool Ready 1 true je li transakcja zosta a zrealizowana bool SelfDel 1 true je li pami przydzielona transakcji ma zosta zwolniona LCD_Cmd cmd 2 Polecenie do zrealizowania uint8_t len 6 D ugo polecenia

Kup książkę Poleć książkę

60 AVR Uk ady peryferyjne

unsigned 0 Wyroacutewnanie do granicy bajta uint8_t data[] Dane transakcji LCD_trans

Nale y zwroacuteci uwag na poleunsigned 0

Nie definiuje ono adnego pola struktury ale jedynie informuje kompilator e kolejnepole (w naszym przyk adzie o nazwie data) ma by wyroacutewnane do granicy bajta mdashdzi ki temu dost p do kolejnego pola b dzie odbywa si szybciej Z kolei samo poledata jest zadeklarowane jako tzw typ niekompletny

Typ niekompletny (ang incomplete type) to typ ktoacuterego rozmiaru nie da si okre li

W pokazanym przyk adzie rozmiaru pola data nie da si okre li gdy zosta on za-deklarowany jako typ tablicowy z tym e nie podano wielko ci tablicy Wielko ci niepodano gdy na etapie deklaracji struktury nie wiemy jakiej wielko ci dane b d w niejprzechowywane Tego typu deklaracja ma bardzo powa ne konsekwencje mdash skorowielko ci pola data nie da si okre li to jaki b dzie wynik dzia ania operatora sizeof(LCD_trans) Kompilator stara si jako wybrn z tej sytuacji w zwi zku z czym

zwroacuteci wielko struktury ale tak jakby pole data w ogoacutele nie istnia o mdash jego roz-miar b dzie wynosi 0 W ramach wiczenia zastanoacutew si ile bajtoacutew pami ci b dziezajmowa a struktura LCD_trans

Skoro dysponujemy ju struktur przechowuj c poszczegoacutelne transakcje pora nastworzenie obiektu przechowuj cego kolekcj transakcji Dodanie kolejnej strukturyb dzie polega o na dodaniu jej do takiego obiektu z drugiej strony program sterownikaLCD b dzie moacuteg z tej kolekcji pobiera kolejne transakcje do realizacji Opis ten przy-pomina opis dzia ania bufora pier cieniowego mdash z jednym wyj tkiem mdash po zape nie-niu ca ego bufora nie b dziemy usuwa niezrealizowanych transakcji lecz zabloku-jemy dodawanie kolejnych W tym celu pos u ymy si definicj nast pnej struktury

typedef struct LCD_trans elements[LCD_MAXTRANS] Wska niki do transakcji uint8_t Beg Pierwszy element bufora uint8_t Count Liczba elementoacutew w buforze CircBuffer

Struktura ta zawiera deklaracj tablicy wska nikoacutew na transakcje (pole elements)Poniewa jest to tablica musimy zna liczb jej elementoacutew mdash jest ona zadeklarowanaw sta ej LCD_MAXTRANS

define LCD_MAXTRANS 10 Maksymalna liczba pami tanych transakcji

Do realizacji bufora s potrzebne jeszcze dwa pola Beg wskazuj ce na pierwsztransakcj w buforze oraz pole Count okre laj ce liczb transakcji znajduj cych siw buforze Je li Count == 0 to znaczy e w buforze nie ma adnych oczekuj cychtransakcji a je li Count == LCD_MAXTRANS to znaczy e bufor jest pe ny i nie mo na

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 61

dodawa do niego kolejnych transakcji W a ciwo t wykorzystuj dwie zdefiniowanew pliku LCD_transc funkcje

static inline bool cbIsFull(CircBuffer cb) return cb-gtCount == LCD_MAXTRANS

static inline bool cbIsEmpty(CircBuffer cb) return cb-gtCount == 0

Jak pami tamy w przypadku funkcji modyfikatory static inline powoduj e danafunkcja nie b dzie istnie jako samodzielna lecz w ka dym miejscu w ktoacuterym jestwywo ywana jest wstawiany raczej jej kod a nie wywo anie Ma to znaczenie dlakroacutetkich funkcji (a wi c takich jak pokazane powy ej) dla ktoacuterych koszty wywo anias zazwyczaj wi ksze ni koszty umieszczenia cia a funkcji w miejscu jej wywo aniaTego typu funkcje zachowuj si w sposoacuteb zbli ony do makrodefinicji (z tym e re-spektuj wszystkie regu y j zyka C w szczegoacutelno ci kolejno operatoroacutew czy kon-trol typoacutew)

Takie funkcje jako argument pobieraj adres bufora na ktoacuterym maj operowa W na-szym przypadku bufor jest zdefiniowany nast puj co

static CircBuffer LCD_TransBuffer Bufor na transakcje

Nale y zauwa y e jest on zdefiniowany jako struktura globalna z modyfikatoremstatic Modyfikator ten ogranicza zasi g widoczno ci zmiennej LCD_TransBuffer dopliku w ktoacuterym zmienna ta zosta a zdefiniowana (w tym przypadku modyfikator staticjest niejako przeciwie stwem modyfikatora extern) Dzia anie to ma jedynie znaczeniekosmetyczne mdash uniemo liwia odwo anie si do bufora za pomoc funkcji ktoacutere niezosta y zdefiniowane w miejscu jego definicji Oproacutecz funkcji umo liwiaj cych okre-lenie stanu bufora potrzebne s jeszcze funkcje umo liwiaj ce dodanie i pobranie trans-

akcji Pierwsz funkcj b dzie funkcja dodaj ca transakcj do buforabool cbAdd(CircBuffer cb LCD_trans elem) ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsFull(cb)) return false Czy jest miejsce w kolejce uint8_t end = (cb-gtBeg + cb-gtCount) LCD_MAXTRANS cb-gtelements[end] = elem Dodaj transakcj ++cb-gtCount Liczba elementoacutew w buforze return true Wszystko OK

Funkcja ta dodaje transakcj (zmienna elem) do bufora ko owego Zanim transakcjazostanie dodana sprawdzane jest czy w buforze jest miejsce mdash je li nie funkcjazwroacuteci false Je li dodanie jest mo liwe warto licznika okre laj cego liczb trans-akcji przechowywana w buforze (Count) zwi ksza si o jeden Warto zastanowi si te dlaczego praktycznie ca e cia o tej funkcji jest zamkni te w sekcji atomowej (ATOMIC_BLOCK) Jedn z cech naszego sterownika ma by mo liwo wspoacute bie nego dost pu

Kup książkę Poleć książkę

62 AVR Uk ady peryferyjne

do LCD mdash to znaczy e danie np zapisu do LCD mo e wyst pi zaroacutewno w g oacutewnejp tli programu jak i asynchronicznie w przerwaniu St d te wynika e funkcja do-daj ca transakcj musi by napisana w sposoacuteb zapewniaj cy jej poprawn prac w sytu-acji gdy zostanie ona przerwana i ponownie wywo ana przed zako czeniem dzia aniajej poprzedniej instancji Umieszczenie cia a tej funkcji w sekcji atomowej nam to za-pewnia mdash dzi ki temu bufor transakcji zawsze b dzie spoacutejny Dla zaspokojenia cie-kawo ci warto usun sekcj atomow i sprawdzi jak wtedy b dzie zachowywa si tafunkcja i jak wp ynie to na spoacutejno przechowywanych danych

Drug niezb dn funkcj jest funkcja odczytuj ca bufor transakcji i zwracaj ca trans-akcj do zrealizowania (lub NULL je li adnej transakcji nie ma w buforze)

LCD_trans cbRead(CircBuffer cb) LCD_trans elem ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsEmpty(cb)) return NULL Bufor pusty nie mo na zwroacuteci elementu elem = cb-gtelements[cb-gtBeg] cb-gtBeg = (cb-gtBeg + 1) LCD_MAXTRANS -- cb-gtCount Zmniejszamy liczb elementoacutew pozosta ych w buforze return elem

Funkcja ta jest bardzo podobna do poprzedniej mdash najpierw sprawdza czy bufor za-wiera jak oczekuj c transakcj (cbIsEmpty(cb)) je li tak to zwraca adres opisuj -cej j struktury i zmniejsza liczb transakcji oczekuj cych (pole Count) W ten sposoacutebmamy zrealizowan ca funkcjonalno zwi zan z obs ug bufora pier cieniowegoPokazane funkcje s uniwersalne i z bardzo podobnych (lub wr cz tych samych) b -dziemy korzysta w kolejnych rozdzia ach w kontek cie np obs ugi transakcji zwi -zanych z interfejsami szeregowymi

Pora przej do samego sterownika LCD Jego zadaniem b dzie sprawdzenie czyw buforze oczekuj jakie transakcje do realizacji a je li tak to ich wykonanie Ponie-wa dane do LCD mog by wysy ane co okre lony minimalny czas znacznie d u -szy ni czas jakiego na to zadanie potrzebuje mikrokontroler do wysy ania kolejnychpaczek danych pos u ymy si timerem Timer b dzie generowa przerwanie nadmiaru(TCD0_OVF_vect) ktoacutere b dzie wyznacza o tempo w jakim kolejne porcje danych b -d trafia y do LCD Z noty katalogowej kontrolera wynika e minimalny czas trwa-nia wysokiego stanu sygna u Enable to 230 ns a okres tego sygna u nie powinien bykroacutetszy ni 500 ns Poniewa nasz dost p do LCD odbywa si w sposoacuteb nieblokuj cyMCU wi c szybko wysy ania danych do LCD jest bez znaczenia St d te w poka-zanym przyk adzie przyj to e dane b d wysy ane co 4 s co okre la sta a

define LCD_ACCESSTIME 0000004

Poniewa komunikacja z LCD odbywa si w sposoacuteb nieblokuj cy nie zale y nam tena czasie (i tak w stosunku do czasu od wie ania samego LCD jest on bardzo kroacutetki)w efekcie nie ma potrzeby odczytywania flagi busy kontrolera Dzi ki temu w cz ciprzypadkoacutew mo emy w ogoacutele zrezygnowa z sygna u wyboru RW i wymusi jego sta y

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 63

poziom logiczny umo liwiaj cy zapis do LCD Dzi ki temu mo na zaoszcz dzi do-datkowy pin IO1

Ca a logika naszego sterownika jest zawarta w funkcji obs ugi przerwania przepe nieniatimera (TCD0_OVF_vect) Poniewa LCD jest po czony z MCU w trybie 4-bitowym(dla zaoszcz dzenia liczby wykorzystanych pinoacutew IO) kolejne 8-bitowe dane muszby podzielone na dwie tetrady i wys ane do LCD w kolejno ci starszam odsza tetradaInformacja o aktualnie wysy anych danych jest umieszczona w zmiennej trans o typie

static struct uint8_t pos 6 Pozycja w polu danych aktualnej transakcji uint8_t nibble 1 Ktoacutera tetrada jest wysy ana seq

Dlaczego tak Dzi ki wykorzystaniu struktury i poacutel bitowych mo na zaoszcz dzi je-den bajt pami ci SRAM Ze wzgl du na wielko pami ci obs ugiwanej przez kon-troler LCD mo emy by pewni e transakcje zawieraj ce wi cej ni 63 bajty s ra-czej nierealne (nie mia yby wi kszego sensu) St d te do przechowywania informacjio aktualnie wysy anym bajcie danych wystarczy 6 bitoacutew mdash tyle samo zosta o wyko-rzystanych do okre lenia d ugo ci pola danych transakcji w strukturze LCD_trans Zaosz-cz dzony bit mo na po wi ci na flag nibble okre laj c ktoacutera tetrada (m odszastarsza)jest wysy ana Bez poacutel bitowych flaga ta zaj aby dodatkowy bajt pami ci

Przejd my do implementacji sterownika Pierwsz rzecz jak nale y sprawdzi jestto czy w buforze czeka jaka transakcja do zrealizowania Odpowiedzialny za to jestfragment kodu obs ugi przerwania nadmiaru timera

if(trans == NULL) Nic do zrobienia sprawd my czy jaka transakcja oczekuje trans=cbRead(ampLCD_TransBuffer) Czy jest jaka oczekuj ca transakcja seqpos=0 seqnibble=0 if(trans == NULL) TCD0_CTRLA=TC_CLKSEL_OFF_gc Nie ma adnych transakcji mdash wy cz timer

W przypadku gdy adna transakcja nie oczekuje na realizacj timer jest wy czanymdash dzi ki temu nie b d zg aszane kolejne przerwania przepe nienia i MCU nie b -dzie traci czasu na ich obs ug Co prawda wynikaj cy z tego zysk czasowy jest mar-ginalny lecz ma to istotniejsz konsekwencj mdash w przypadku usypiania MCU zb d-ne przerwanie timera nie b dzie niepotrzebnie wybudza o procesora W takiej sytuacjiponowne w czenie timera nast pi dopiero w funkcji dodaj cej transakcj do kolejkimdash a wi c w sytuacji gdy mamy pewno e istnieje oczekuj ca transakcja

Druga cz funkcji obs ugi przerwania jest zwi zana z realizacj samej transakcjiW pokazanym przyk adzie zaimplementowano tylko jeden typ transakcji mdash daniezapisu a cucha tekstowego pod wskazany adres VRAM (na okre lonej pozycji LCD)Je li zajdzie taka potrzeba programista mo e zaimplementowa inne polecenia i doda

1 Warto zauwa y e w bdquoklasycznejrdquo obs udze LCD te nie musimy czyta stanu flagi busy zamiast tego

wystarczy wprowadza p tle opoacute niaj ce Jednak poniewa taka obs uga blokuje MCU nie jest onazalecana Wady tej nie ma dost p transakcyjny co jest jego dodatkow zalet

Kup książkę Poleć książkę

64 AVR Uk ady peryferyjne

kod odpowiedzialny za ich obs ug Zauwa my e ka da transakcja musi zawieraadres pocz tku pami ci wideo od ktoacuterego b dzie zapisywany tekst Dzieje si takdlatego e transakcja wykonana wcze niej mo e ustawi wska nik zapisu na dowolnejkomoacuterce pami ci W efekcie tekst z kolejnej transakcji by by wy wietlany od komoacuterkina ktoacuterej zako czy si zapis poprzedniej transakcji Takie dzia anie oczywi cie jestniedopuszczalne st d te ka dy zapis do pami ci wideo poprzedza ustawienie rejestruindeksowego Problem ten mo na rozwi za tak e w inny sposoacuteb mdash poprzez wpro-wadzenie tzw uchwytoacutew (ang handlers) ktoacutere zawiera yby stan kontrolera LCDNiemniej to rozwi zanie dodatkowo komplikowa oby nasz sterownik Struktura danych(zawartych w polu data) ma wi c nast puj cy format

bajt nr 0 zawiera warto pozycji od ktoacuterej nale y dokonywa zapisu pami ciwideo mdash jest to warto przesy ana do rejestru okre laj cego adres zapisu

kolejne bajty zawieraj a cuch znakowy ktoacutery nale y umie ci w pami ciCGRAM

Poniewa bajt nr 0 zawsze zawiera warto wpisywan do rejestroacutew steruj cych kon-trolera podczas jego wysy ania jest ustawiana linia RS sygnalizuj ca zapis do rejestruPodczas wysy ania kolejnych bajtoacutew linia ta jest zerowana w zwi zku z czym zapisodbywa si do pami ci CGRAM

Kod obs uguj cy transakcj wygl da nast puj coif(trans) Jest transakcja do zrealizowania uint8_t dat=trans-gtdata[seqpos] if(seqnibble == 0) datgtgt=4 To trzeba zmieni je li linie danych nie s po czone z pinami 0 ndash 3 portu IO hd44780_outnibble_nowait(dat amp 0x0F seqpos = 0) Zapisujemy rejestr steruj cy lub dane ++seqnibble if(seqnibble == 0) ++seqpos Co drug tetrad zwi kszamy pozycj bufora if(seqpos gt= trans-gtlen) trans-gtReady=true Koniec transakcji if(trans-gtSelfDel) free_re(trans) Zwolnij pami transakcji je li tak sobie yczy programista trans=NULL Koniec transakcji CLR(OUT HD44780_E)

Ta cz przerwania wysy a kolejne tetrady do kontrolera LCD Warto zastanowi sinad dzia aniem sekwencji

++seqnibble

Poniewa pole nibble jest jednobitowe operacja inkrementacji prowadzi do zmianystanu tego pola na przeciwny (pole to ma warto 0 lub 1) Kiedy zostan wys anewszystkie dane przeznaczone dla kontrolera obs uga transakcji ko czy si Stan tensygnalizuje nadanie warto ci true polu Ready struktury LCD_trans Dzi ki temu pro-gram mo e sprawdzi asynchronicznie w stosunku do przerwania kiedy transakcjauleg a zako czeniu Opcjonalnie jest wykonywana jeszcze jedna funkcja mdash je li poleSelfDel ma warto true to pami zarezerwowana na transakcj jest automatycznie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 65

zwalniana W tym celu wykorzystuje si funkcj free_re ktoacuterej prototyp jest zade-klarowany w pliku Alloc_safeh Funkcja ta wywo uje funkcj biblioteczn free ktoacute-ra zwalnia pami przydzielon dynamicznie na stercie Poniewa funkcja ta nie jestfunkcj reentrant nale y stworzy odpowiedni bdquoprotez rdquo opakowuj c j w blokatomowy co zapewnia e nie zostanie ona ponownie wywo ana zanim jej poprzed-nia instancja nie zako czy dzia ania Oczywi cie lepszym rozwi zaniem by oby napi-sanie w asnych funkcji dynamicznej alokacji pami ci ktoacutere b d reentrant

Bardzo wa ne jest aby pole SelfDel mia o warto true wy cznie dla transakcjidla ktoacuterych pami zosta a przydzielona dynamicznie funkcj malloc (lub jej po-chodnymi) W pozosta ych przypadkach pole to musi mie warto false mdash nie-stosowanie si do tej regu y spowoduje b d mened era pami ci i najprawdopo-dobniej nieprzewidywalne dzia anie programu

Drug wa n zasad jest aby zmienna zawieraj ca dane transakcji nie by azmienn automatyczn mdash zmienne takie s automatycznie niszczone po opusz-czeniu zawieraj cej je funkcji W rezultacie obszar pami ci zawieraj cy danetransakcji mo e zosta wykorzystany przez inne zmienne co spowoduje uszkodzeniezawartych w nim danych

Pami przydzielona transakcji musi by alokowana w sposoacuteb dynamiczny (funkcjamalloc_re) ewentualnie mo e to by pami alokowana dla zmiennej globalnej lubstatycznej mdash zmienne tego typu istniej przez ca y czas ycia programu

Warto te zauwa y e instrukcje steruj ce stanem linii Enable kontrolera LCD(SET(OUT HD44780_E) i CLR(OUT HD44780_E)) s rozdzielone wieloma innymi in-strukcjami Dzi ki temu generowany impuls dodatni tego sygna u ma czas trwania gt230 ns wymagany w specyfikacji kontrolera Nawet dla XMEGA taktowanej zegarem32 MHz 230 ns przek ada si na oko o 7 instrukcji asemblera mdash czas jaki z pewno-ci up ynie pomi dzy wykonaniem obu powy szych instrukcji steruj cych

Do wysy ania danych do kontrolera zosta a wykorzystana nieco zmodyfikowanafunkcja hd44780_outnibble_nowait roacute ni ca si od jej protoplasty hd44780_outnibbletylko tym e nie czeka na sygna braku zaj to ci mikrokontrolera (nie realizuje teopoacute nie ) Nie jest to potrzebne gdy kolejne tetrady s wysy ane w odst pach cza-sowych okre lanych przez timer

Mamy wi c zapewnion obs ug transakcji i mo liwo transakcyjnego wy wietlaniadanych na LCD musimy jeszcze mie funkcj ktoacutera tworzy odpowiednie transakcjemdash jest odpowiednikiem funkcji bezpo rednio wysy aj cej dane znakowe do LCDOdpowiednikiem tym jest pokazana poni ej funkcja

bool LCD_PutText_B(uint8_t x uint8_t y char txt LCD_trans buf bool autodel) buf-gtcmd=LCD_Text buf-gtReady=false buf-gtSelfDel=autodel Czy zwolni pami po zako czeniu transakcji buf-gtdata[0]=HD44780_DDADDR(x+y0x40) Ustaw adres w DDRAM strcpy((char)ampbuf-gtdata[1] txt) Skopiuj dane tekstowe + NULL

Kup książkę Poleć książkę

66 AVR Uk ady peryferyjne

buf-gtlen=strlen(txt) + 1 D ugo tekstu + pozycji + NULL ndash 1 bool ret=cbAdd(ampLCD_TransBuffer buf) if((ret==false) ampamp (autodel)) free_re(buf) Brak miejsca w kolejce else TCD0_CTRLA=TC_CLKSEL_DIV1_gc Preskaler 1 mdash odblokuj timer return ret

Funkcja ta buduje transakcj odpowiedzialn za wy wietlenie napisu txt na wskaza-nej pozycji x y LCD Wszystkie dane o transakcji zostan umieszczone w buforzew pami ci ktoacuterej adres jest okre lany wska nikiem buf Pami w buforze musi bywystarczaj co du a aby pomie ci ca transakcj Dodatkowy parametr autodel okre laczy pami ta ma by automatycznie zwalniana po obs u eniu transakcji (true) czynie (false) Je li transakcj uda o si umie ci w kolejce funkcja zwraca true Wartozauwa y e w takim przypadku funkcja uruchamia te timer (w naszym przypadkujest to timer TCD0) odpowiedzialny za generowanie przerwania Funkcja obs ugi prze-rwania wysy a dane do LCD

Pewn odmian powy szej funkcji jest funkcjabool LCD_PutText(uint8_t x uint8_t y char txt) LCD_trans trans=malloc_re(sizeof(LCD_trans) + strlen(txt) + 2) bool ret=LCD_PutText_B(x y txt trans true) return ret

Wykorzystuje ona funkcj LCD_PutText_B z tym e najpierw alokuje dynamiczniepami potrzebn na przechowanie tworzonej transakcji

Mamy komplet potrzebnych funkcji a wi c sprawd my jak ca o sprawdza siw praktyce W pliku LCD-transactc znajduje si kod pokazuj cy jak dzia aj naszetransakcje Aby to by o mo liwe nale y zainicjalizowa kontroler LCD

LCD_init()

Wykorzystujemy tu znan ju funkcj inicjalizuj c mdash nie ma potrzeby jej zmienia gdy operacja inicjalizacji LCD jest jednorazowa i nie trzeba wykonywa jej w posta-ci transakcji W drugim kroku musimy zainicjalizowa wykorzystywany timer i systemprzerwa

LCD_Timer_init(ampTCD0)PMIC_CTRL|=PMIC_LOLVLEN_bm Odblokuj przerwania niskiego poziomusei()

Poniewa dost p do LCD z pewno ci nie jest czynno ci krytyczn czasowo prze-rwaniom timera nadano najni szy priorytet Dzi ki temu mo na innym bardziej kry-tycznym przerwaniom nada wy sze priorytety i uzyska w ten sposoacuteb zmniejszenieczasu latencji obs ugi przerwa Sama inicjalizacja timera jest niezwykle prosta

void LCD_Timer_init(TC0_t tc) tc-gtINTCTRLA=TC_OVFINTLVL_LO_gc Odblokuj przerwania nadmiaru timera i nadaj im niski priorytet tc-gtPER=F_CPULCD_ACCESSTIME Przerwanie co 4 us (niezale nie od F_CPU)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 67

Sprowadza si ona tylko do odblokowania mo liwo ci zg aszania przerwania nadmia-ru oraz konfiguracji rejestru PER tak aby przerwania by y generowane co ok 4 s mdashniezale nie od cz stotliwo ci taktowania CPU Mo emy wi c przyst pi do wy wie-tlenia pierwszego napisu

LCD_PutText(00 Numer)

Powy sza funkcja ma jedn wad mdash alokuje dynamicznie pami po ka dym wywo-aniu (pami ta jest automatycznie zwalniana po obs u eniu transakcji) niemniej

ca y proces jest czasoch onny Mo emy tego unikn alokuj c pami bdquor cznierdquo i wielo-krotnie wykorzystuj c zaalokowany blok pami ci Ilustruje to poni szy przyk ad

LCD_trans buf=malloc_re(sizeof(LCD_trans) + 7)

Zmienna buf wskazuje na obszar pami ci ktoacutery mo e pomie ci a cuch 5-znakowyTyle wystarczy na potrzeby tego przyk adu mdash na LCD b d wy wietlane kolejneliczby w zakresie 0 ndash 65 535 najd u sza ma 5 znakoacutew st d te nasz bufor ma tak a nieinn d ugo

while(1) utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(60 bufstr buf false) while(LCD_IsTransCompleted(buf))

Do konwersji liczby na a cuch u yto funkcji bibliotecznej utoa (nag oacutewek stdlibh)Poniewa d ugo a cucha po konwersji jest zmienna (co spowodowa oby pozosta-wianie na LCD bdquoduchoacutewrdquo po poprzednich konwersjach) w kolejnej linii brakuj ceznaki uzupe niono spacjami Nast pnie tworzona jest transakcja w obszarze pami ciprzydzielonym zmiennej buf Ostatnia p tla while jest odpowiedzialna za oczekiwa-nie na zako czenie realizacji transakcji Po jej zako czeniu p tla jest wykonywana odpocz tku

Uwa ny czytelnik z pewno ci zauwa y e pami przydzielana funkcj malloc_renie jest nigdzie zwalniana mdash w normalnej sytuacji spowodowa oby to wyciek pami -ci W naszym przyk adzie jednak program nigdy si nie ko czy nie ma wi c potrzebyzwalniania pami ci wskazywanej przez zmienn buf

Powy szy przyk ad pokazuje jak unikn blokowania CPU na czas dost pu do wolnodzia aj cego urz dzenia jakim jest LCD alfanumeryczny Jednak to nie wszystkiezalety wynikaj ce z zastosowania transakcji Drug wa n zalet naszego rozwi zaniailustruje przyk ad znajduj cy si w katalogu PrzykladyLCD-alfaLCD-transact-intPowa nym ograniczeniem funkcji odpowiedzialnych za dost p do LCD w sposoacutebklasyczny by a niemo no ich wywo ywania z funkcji obs ugi przerwa mdash funkcjeobs ugi LCD nie by y reentrant2 Nasz system oparty na transakcjach nie ma tychwad Aby to zilustrowa zosta stworzony prosty przyk ad mdash tak jak poprzedniow p tli g oacutewnej programu s wy wietlane stale kolejne liczby ale jednocze nie wyko-

2 Poza tym blokowa y CPU na d ugi czas a jak pami tamy funkcje obs ugi przerwa powinny by

wykonywane mo liwie kroacutetko

Kup książkę Poleć książkę

68 AVR Uk ady peryferyjne

rzystano drugi timer (TCD1) w ktoacuterego funkcji obs ugi przerwania przepe nienia jestwy wietlany licznik tych przerwa

ISR(TCD1_OVF_vect) static char int_buf[sizeof(LCD_trans) + 7] static uint16_t cnt char bufstr[6]

utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(61 bufstr (LCD_trans)ampint_buf false)

Jak widzimy w sposoacuteb asynchroniczny z dwoacutech miejsc w programie mo emy uzy-ska dost p do LCD a ka da funkcja bdquoma wra enierdquo e ma LCD na wy czno Przy okazji warto przeanalizowa sposoacuteb w jaki jest rezerwowana pami na trans-akcj w przerwaniu Oczywi cie mo na by wykorzysta dynamiczn alokacj pami cilecz jak wspomniano taka alokacja jest czasoch onna St d te w pokazanym przy-k adzie wykorzystano tablic statyczn int_buf o rozmiarze umo liwiaj cym prze-chowanie kompletnej transakcji Dzi ki temu e zmienna int_buf jest zmienn statycz-n nie jest ona niszczona po zako czeniu funkcji obs ugi przerwania Gdyby pomins owo kluczowe static zmienna ta by aby niszczona a na LCD najprawdopodobniejzacz yby si pojawia przypadkowe tre ci Poniewa pami naszego bufora nie by aalokowana dynamicznie nie mo e ona zosta zwolniona w naszym sterowniku LCDst d te ostatni parametr wywo ania funkcji LCD_PutText_B musi mie warto false

OptymalizacjaPrzy okazji tego i poprzedniego przyk adu warto zastanowi si jeszcze nad jednkwesti mdash optymalizacji W podanych przyk adach wykorzystano wcze niej omoacute-wione funkcje dost pu do wy wietlacza LCD znajduj ce si w plikach hd44780ci hd44780h Wi kszo z zawartych tam funkcji nie jest wykorzystywana jednakkompilator mimo wszystko umieszcza ich kod w pliku wynikowym mdash dzieje si takponiewa nie mo e on bdquostwierdzi rdquo czy funkcje te nie s wykorzystywane w innychfragmentach programu Pami tajmy e kompilator kompiluje poszczegoacutelne pliki roacute-d owe osobno i dana jego instancja nie bdquowierdquo co znajduje si w innych plikach (innychjednostkach kompilacji) Tak ca o ciow wiedz ma dopiero konsolidator (linker)ktoacutery czy stworzone przez kompilator pliki obiektowe (o rozszerzeniu o) w plikwynikowy Linker jednak bdquonie wierdquo ktoacutera z funkcji programu zosta a u yta a ktoacuteranie mdash informacje te ma wy cznie kompilator W ten sposoacuteb powstaje typowe b dneko o w efekcie nasze nieu ywane funkcje nie s usuwane (linker zostawia je bdquonawszelki wypadekrdquo) i zajmuj niepotrzebnie pami Czy mo na temu jako zaradzi Oczywi cie tak W tym celu trzeba po czy si y kompilatora i linkera co zapewniaj od-powiednie opcje kompilacji We w a ciwo ciach projektu (ProjectProperties lub Alt+F7)wybieramy zak adk Toolchain a nast pnie AVRGNU C Compiler i OptimizationZnajdziemy tam pole wyboru o nazwie Prepare functions for garbage collection (ry-sunek 224)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 69

Rysunek 224 Aby da linkerowi mo liwo usuwania nieu ywanych funkcji nale y skompilowaprogram z wybran opcj ndashffunction-sections ktoacutera spowoduje e ka da funkcja programu znajdzie siwe w asnej sekcji

Zaznaczenie tej funkcji spowoduje umieszczenie ka dej funkcji w osobnej sekcji mdashsamo w sobie nie wp ynie to na skroacutecenie kodu wynikowego ale jest warunkiem nie-zb dnym dla podj cia stosownych dzia a przez linker Aby wyeliminowa nieu y-wane funkcje nale y zaznaczy jeszcze w ga zi AVRGNU LinkerOptimization poleGarbage collect unused sections (rysunek 225)

Rysunek 225 Zaznaczenie opcji Garbage collect unused sections (-Wl--gc-sections) spowodujee nieu ywane funkcje zostan usuni te z kodu wynikowego w efekcie kod programu ulegnie skroacuteceniu

Po zaznaczeniu tych opcji program zostanie skroacutecony o kilkaset bajtoacutew Oczywi cieje li wszystkie funkcje by yby wykorzystane nie uzyskaliby my adnego skroacuteceniakodu Niemniej w sytuacji gdy u ywa si bibliotek zazwyczaj przynajmniej czfunkcji nie jest wykorzystywana warto wi c skorzysta z tej mo liwo ci optymalizacji

Kup książkę Poleć książkę

70 AVR Uk ady peryferyjne

Je li mamy do czynienia z prekompilowan bibliotek (lib) to musi ona by skom-pilowana z zaznaczon opcj Prepare functions for garbage collection (-ffunction-sections) Alternatyw jest umieszczenie ka dej funkcji biblioteki w osobnym pliku(tak jak w przypadku bibliotek AVR-libc)

Na ekranie wyboru opcji optymalizacji linkera mamy jeszcze jedn przydatn opcjmdash Relax Branches (-mrelax) Dla mikrokontroleroacutew ktoacutere maj ponad 8 kB pami ciFLASH instrukcje skokoacutew s generowane jako tzw instrukcje d ugie mdash umo liwiajone skok do komoacuterki pami ci FLASH o dowolnym adresie Jednak cen za to jestwyd u enie instrukcji mdash ich kod jest d u szy podobnie jak czas wykonania Nie zawszejednak takie d ugie instrukcje musz by wykonywane mdash je li miejsce docelowe skokule y blisko (w zasi gu instrukcji skokoacutew wzgl dnych) to mo na w kodzie wynikowymzamieni instrukcje d u sze na kroacutetsze co przynosi oszcz dno ci w postaci skroacuteceniakodu wynikowego Poniewa dopiero linker bdquowierdquo jak poszczegoacutelne fragmenty kodus rozmieszczone w pami ci takiej podmiany mo na dokona na etapie linkowaniaprogramu co zapewnia powy sza opcja St d te warto to pole wyboru zaznaczy

Kup książkę Poleć książkę

SkorowidzA

ABI Application Binary Interface 25AC Address Counter 50ADPCM 482adres

bazowy 377bufora 61komoacuterki 84pu apki 202

ALE Address Latch Enable 368alfanumeryczne wy wietlacze 43algorytm ADPCM 492algorytmy stratne 495animacje 57antyaliasing 325architektury procesoroacutew XMEGA 352asembler 23

dyrektywy 40funkcje j zyka C 41obs uga przerwa 39

asynchroniczne wywo anie funkcji 101Atmel Studio 15

Bbajty kalibracyjne 569biblioteka

FATFS 131 139 176 180 517libcallback-liba 99PetitFS 144 149

bitADC_CH0START_bm 236IMPMODE 244

bitrate 442 512blokowanie przerwa 219b d 16 19

kwantyzacji 463offsetu 230wzmocnienia ADC 230

BOD 223bps bits per second 12

budowakarty 152linii obrazu 394pami ci SDRAM 374pliku stymulacji 192ramki PAL 412sygna u PAL 411wtyczki 544 545

bufor 78FIFO 497na transakcje 61transakcji 62

buforowanie wyj cia 294

CCAS Column Address Strobe 375CCFL 44charakterystyka

przetwornikoacutew 222termistora 264tryboacutew pracy 232

CID Card Identification 169CKE Clock Enable 375CLKIN 421COG Chip on Glass 310CRC 158 178CRC16 178CRC7 164CS Chip Select 361 375CSD Card Specific Data 172czas

dost pu do SDRAM 424adowania kondensatora 244

propagacji 281proacutebkowania 260symulacji 209

czcionki 322cz stotliwo

odchylania pionowego 428proacutebkowania 244 441 444 530przebiegu 504

Kup książkę Poleć książkę

576 AVR Uk ady peryferyjne

cz stotliwoPWM 465taktowania koprocesora 549taktowania procesora 209taktowania rdzenia 18

czyszczenie pami ci 318

DDAC Digital to Analog Converter 293 447 451

buforowanie wyj cia 294generowanie przebiegoacutew 301jitter 303kalibracja 306napi cie referencyjne 295system zdarze 297taktowanie 296tryb dwukana owy 301wykorzystanie DMA 298wyzwalanie konwersji 305

datalogger 261 265 275DD Device Density 86debuger 183

programowy 190sprz towy 185 187

decymacja 259DEBUG 219XMEGA 260

definicja symboli globalnych 36definiowanie w asnych znakoacutew 56deklaracja zapowiadaj ca 103 337dekoder DTMF 548 556DMA 254 298 402 458 518 523dost p do

danych 358 359 568danych binarnych 356 360danych wielobajtowych 31DataFLASH 137EEPROM 128FAT 136komoacuterki 375LCD 59 62 66 68operandu 30pami ci 81 384 386 387 561pami ci SDRAM 424pliku blokowy 141portoacutew IO 30rejestroacutew IO procesora 36rejestroacutew uk adu 499SPI 95sygnatury u ytkownika 565 567wska nikoacutew 32

DQM Data Mask 375DSP Digital Signal Processor 535

DTMF 535 553dyktafon 529dynamiczna alokacja pami ci 516dyrektywa global 38dyrektywy asemblera 40dzia anie

DMA 255komparatora 280timeroacutew 400

d wi k 443

EEBI External Bus Interface 361EEPROM 207eliminacja jitteru 24emulacja RS232 139

FFAT File Allocation Table 128 131FAT32 128FATFS 180filtr

dolnoprzepustowy 491drugiego rz du 470pierwszego rz du 469trzeciego rz du 471

filtrowanie sygna u PWM 468firmware 565FLASH 207format

odpowiedzi 159polecenia 158protoko u 157

funkcja_delay_ms 17 219c_zero 42callback 106 341callback() 99DataFLASH_CSEnable 100DF_FinishBufWrite() 269disk_initialize 136disk_ioctl 181disk_status 136disk_write 138DMA_SPI_init 104DTMF_GetCode 553free_re 65GPIOR0_init 507hd44780_outcmd 51hd44780_outnibble_nowait 65LCD_defchar_P 57

Kup książkę Poleć książkę

Skorowidz 577

Menu_Click_Func 515Menu_Free 516Menu_Recorder 532Menu_Run 527MS_CreateRegEntry 117MS_GetDirPos 125MS_GetRegItem 115MS_WritePages 116 118OSC_wait_for_rdy 473RecMenu_StartStop 532sprintf 142strtok 124sysclk_init() 200 209TMF_memcpy_PF 454udi_cdc_getc() 123udi_cdc_is_rx_ready() 123VS1003_Reset 506

funkcjeanalizuj ce 556biblioteczne 50biblioteki FATFS 143j zyka C 41kontrolera ST7565R 313opoacute niaj ce 17opoacute nie 219reentrant 524specjalne kontrolera 319steruj ce 314zapisu 133

fusebit 557BODACT 560BODLEVEL 560BOOTRST 559DVSDON 560EESAVE 561JTAGEN 558RSTDISBL 559SUT 559TOSCSEL 559

fusebity w AVR-libc 571

Ggenerator obrazu composite 426generowanie

d wi ku 461kolorowego obrazu 437obrazu wideo 391przebiegoacutew 301przerwa 285sygna u composite 409

g bia koloru 326gniazdo

karty SD 156VGA 396

Hhistereza 281

IIDE 11IMA ADPCM 483informacje

o kolorze 431o obrazie 434

inicjalizacjakarty 161karty SDHC 167karty SDSC 167karty SDXC 167licznika 419pami ci 119USART 505

instrukcjaicall 42movw 35nop 13 24

interfejsSCI 498SDI 498SPI 71 79RS232 120UART 123USART 71 73

interpolacja 259interpolacja w XMEGA 260inwersja obrazu 319

Jjednostki 12jitter 24 303 420

Kkalibracja

ADC 229DAC 306 564offsetu 237

kana DMA 82 522karta 154 158

mikroSD 152SD 151 152SDHC 151 152 160SDSC 160SDXC 151 160

Kup książkę Poleć książkę

578 AVR Uk ady peryferyjne

karty pami ci 151 152 157biblioteka FATFS 180budowa 152format polecenia 158inicjalizacja 161 167komunikacja 156odczyt danych 173opcje konfiguracyjne 181rejestry specjalne 169tryby pracy 153zapis danych 176zasilanie 154

kodasemblerowy 23 24C 23dost pu 24

kodowanieμ-law 481ADPCM 483Dialogic ADPCM 494informacji 166 426koloru 425znakoacutew 536

kodyformatoacutew audio 501zdarze 545

kolejno bajtoacutew 533kolor 424 430kolorowy obraz 437komparator 422

analogowy 279 280analogowy XMEGA 282okienkowy 284

kompilacja plikoacutew binarnych 350kompilator avr-gcc 11 359kompresja

ADPCM 482 486d wi ku 480IMA ADPCM 482

komunikacja z koprocesorem 504konfiguracja

4-portowa 364biblioteki 133debugera 185DMA 459 522fusebitoacutew 570kontrolera DMA 257 452komparatoroacutew 285lockbitoacutew 570LPC 371pami ci SDRAM 381PetitFS 149pinu IO 225portoacutew IO 362

preskalera 452projektu 186przerwa 219pu apki 203rejestru EVCTRL 248rejestru PER 67SPI 75sygna u CS 377typu czcionki 324urz dze IO 189USART 76zegara 383

konsolidacja 547kontroler

DMA 254 298 402 458 518 523KS108 310ST7565R 310ndash315 321

konwersjaDAC 305sygna oacutew 396wyzwalana 306

konwertercyfrowo-analogowy 426DAC 427

koprocesormp3 496VS1003B 10

korekcja fazy 466kwantyzacja 463

Llampa CCFL 44LE Latch Enable 433licznik 419

cykli 209TCC1 400timera 20

linie IO 50linie sygna owe

MISO 72 164MOSI 72SCK 72SS 72

linker 69lista

mnemonikoacutew 24modyfikowanych rejestroacutew 32

lockbity 557 561lockbity w AVR-libc 570LPC Low Pin Count 371LPCM 443 556LSB Least Significant Bit 228

Kup książkę Poleć książkę

Skorowidz 579

a cuchy formatuj ce 212czenie plikoacutew 352

Mmagistrala pami ci zewn trznej 361magnetofon cyfrowy 528makro _SFR_IO_ADDR() 39makrodefinicja

ASSERT 214HD44780_CGADDR() 53HD44780_CLR 53HD44780_DDADDR() 53HD44780_DISPCTL() 52HD44780_ENTMODE() 52HD44780_FNSET() 52HD44780_HOME 53HD44780_SHIFT() 51LOCKBITS 571

mapowanie sygna oacutew 366mapy bitowe 343marker czasowy 268maski bitowe 329matryce 49menu 335menu piktogramowe 342mierniki temperatury 262mikrokontroler

ARM 9AVR 9PIC 9XMEGA128A3U 10

MISO 72moc wydzielana 265model psychoakustyczny 495modu

alfanumeryczny 45NVM 568Xmega eXploreGO 10Xplained ATXMEGA A3BU 10Xplained ATXMEGA-A1 10Xplained XMEGA128A1 447Xplained XMEGA256A3 94Xplained XMEGA256A3BU 97 143 266

modyfikator 30const 85volatile 28 273

monitory CRT 395monochromatyczne wy wietlacze graficzne 309monochromatyczny

tryb graficzny 416tryb tekstowy 413

MOSI 72mp3 495Msps Megasamples per second 12multiplekser wej ciowy 226 283multipleksowanie adresoacutew 368 369muzyka 439

Nnadawanie kodoacutew DTMF 540nadproacutebkowanie 258nag oacutewek kontenera wav 500nagrywanie mowy 486najmniej znacz cy bit 228napi cie

offsetu 280referencyjne 223 295zasilania 239

Oobracanie obrazu 319obraz 319

composite 426kolorowy 430wideo 391

obroacutebka d wi ku 443 445obs uga

FAT 131 143klawiatury matrycowej 24LCD 58 63 67menu 337przerwania 37 38 458przerwania DMA 525przerwa w asemblerze 39przyciskoacutew 272wy wietlaczy alfanumerycznych 45

odczytblokowy 140danych 173 358

odpowied response 159R1 159R2 159R7 160

od wie anie pami ci 376odtwarzanie

d wi ku 472muzyki 447 513 518 521

offset 238offset ADC 230okno

Breakpoints 202Call stack 209dezasemblera 210

Kup książkę Poleć książkę

580 AVR Uk ady peryferyjne

oknoIO View 207podgl du zmiennych 211wyboru czcionek 324

OLED 46opcje

kompilatora 35zapisu d wi ku 445

operacjena buforach 91odczytu 173zapisu 176zapisu strony 92

operand 29operator

ascii 41

asciz 41

byte 41

section 41opoacute nienia 13 18opoacute nienie zmienne 16optymalizacja 16 68optymalizator 26organizacja pami ci 77organizacja pami ci VRAM 316oscylator 287OSD On-Screen Display 417ostrze enie 16oszcz dzanie energii 94

Ppakiet WinAVR 48pami

CGRAM 56 57 64DataFLASH 10 77 81 113 269DDRAM 49EEPROM 111FLASH 54 124 207RAM 49SDRAM 372SRAM 63 124 329 366 371VRAM 314 317

PCLK 421PCM 443PetitFS 144 149p tla

for 13while 201

pierwsza linia obrazu 321piksel 430piktogram 342pin IO 225

plikAlloc_safeh 65DataFLASHc 83DataFLASHIOc 136definesh 50delayh 14diskioh 132 136ffh 132ffconfh 132 181hd44780h 49integerh 132ioh 30LCD_transc 61LCD-transactc 66Makefile 14Menuc 19nothingo 541outfiletxt 547 551pffh 149SPIh 104stringh 113stymulacji 191 192

pliki mp3 495elf 351fon 323o 24S 24 34binarne 350 355csv 276d wi kowe 440obiektowe 352wav 500WMA 512z czcionkami 327z danymi 349

podbijacz napi cia 315podgl d

pami ci 207stosu wywo a 209zmiennych 211znakoacutew 325

pod czeniefototranzystora 262karty SD 155LCD z kontrolerem 311modu u 50pami ci 362 369 370 373termistora 262uk adu LM35 251wyj XMEGA 398

pod wietlenieCCFL 46OLED 46

Kup książkę Poleć książkę

Skorowidz 581

podwoacutejne buforowanie 255 332 457polecenia

kasowania strony 81konfiguracyjne pami ci 82kontrolera ST7565R 315odczytu bufora 82 89odczytu pami ci 81 88SDRAM 376transferu 91

polecenieACMD41 168cd 181CID 178CMD0 165CMD8 167CSD 178date 276dir 127 181dump 276erase 276get 276HD44780_CLR 51Init 178mkdir 181

po czenieDMA ze SPI 96dwoacutech komparatoroacutew 285koprocesora mp3 497LCD z mikrokontrolerem 48wyj cia XMEGA 411XMEGA z PC 121z telewizorem 431

pomiarnapi cia zasilania 239temperatury MCU 241

port IO 30 362pozycjonowanie grafik 345poacute obraz 410precyzja pomiaroacutew 260preskaler 478preskaler ADC 243program

Atmel Data Visualizer 275Audacity 443avr-objcopy 350dataloggera 265LCD Image Converter 323makeloadingtableexe 543Realterm 127 554riffstrip 483SoX 445Tracepoint 208

programowanie sygnatury u ytkownika 566protokoacute master-slave 157

prototypy 136proacutebki d wi kowe 447proacutebkowanie

8-bitowe 300nieliniowe 480

prymitywy graficzne 330przebieg PWM 468przebiegi 289 303przechwytywanie danych 276przemiatanie wej 253przerwanie 218 254 286 403

DMA 522komparatora 286

przestrze adresowa procesora 378przesy anie

danych 498polece 498

przetaktowanie procesora 436przetwornik

ADC 221analogowo-cyfrowy 221cykliczny 222potokowy 222

przyciski 272pseudooperatory 41pu apki breakpoints 197pu apki warunkowe 205punkty ledzenia 203PWM 461 462 472

RRAS Row Address Strobe 375redukcja poboru energii 242regulacja kontrastu 321rejestr 32 34rejestr AC 50

adresu wtyczki 513BASEADDR 377CID 169CMP 251CSD 172czasu utworu 512DATA 83EVCTRL 248formatu audio 512identyfikacyjny pami ci 87INTFLAGS 252kontroli basoacutew 510kontroli g o no ci 513MUXCTRL 227OCR 168PER 67poroacutewnania 249

Kup książkę Poleć książkę

582 AVR Uk ady peryferyjne

rejestr ACSCI_CLOCKF 511stanu komparatora 287stanu pami ci 86stanu uk adu 510trybu pracy 508WINCTRL 285

rejestrydost pu do pami ci RAM 513GPIOR 502IO procesora 36mikrokontrolera 25procesora 35specjalne 94specjalne karty 169uk adu VS1003B 508

relacja rodzic ndash dziecko 336reset uk adu 534rozdzielczo

LCD 329przetwornika 231PWM 463 477

rozszerzenie HiRes 477 479roacutewnanie Steinharta-Harta 263rysowanie map bitowych 343

Sschemat uk adu dataloggera 267SCI Serial Command Interface 498SCK 72SD Secure Digital 152SDI Serial Data Interface 498separator synchronizacji 422separowanie impulsoacutew synchronizacji 422shieldy 10skaler 422skaler napi cia 283skrypt makefile 353s owo kluczowe

asm 27extern 37static 68

specyfikatory lokalizacji zmiennej 213sps samples per second 12SS Slave Select 72standard PAL 410standard VGA 393sterowanie

dataloggerem 275sygna em 379

sterownik 121HD44780 49 56LCD 49 62

stos wywo a 209

strukturaFATFS 139Handle 118LCD_trans 60 63menu 338rejestru 86SimpleFSEntry 113 116SimpleFSHandle 113 118 140submenu 527systemu plikoacutew 112

sumabitowa 571kontrolna 178

sygnacomposite 409composite video output 430CS 377DREQ 497H-Sync 396synchronizacji 423V-Sync 396zegarowy CLK 374

sygna yinterfejsu EBI 363magistrali EBI 364steruj ce 375

sygnaturaprodukcyjna procesora 563u ytkownika 565

symbol__DELAY_ROUND_CLOSEST__ 17__DELAY_ROUND_DOWN__ 17_FS_FAT12 149_FS_FAT32 149_FS_MINIMIZE 133_FS_READONLY 133_FS_RPATH 135_FS_TINY 133_MAX_SS 135_MULTI_PARTITION 135_USE_DIR 149_USE_FASTSEEK 134_USE_FORWARD 134_USE_LABEL 134_USE_LFN 134_USE_LSEEK 149_USE_MKFS 134_USE_READ 149_USE_STRFUNC 134_USE_WRITE 149_VOLUMES 136F_CPU 14 15 18increment 36USE_BUSY_FLAG 50

Kup książkę Poleć książkę

Skorowidz 583

symboleglobalne 36w asemblerze 28zewn trzne 39

symulacja 198 209symulator 190synchronizacja

pami ci 331pionowa 395pozioma 394

systemplikoacutew 111 128przerwa 404zdarze 245

szablonfont_XMEGAtmpl 326image_XMEGAtmpl 343

szum 463szybko przesy ania danych 126

ledzenie wi zki 333rodowisko

graficzne 11programistyczne 11VSIDE 542WinAVR 47

Ttabela FAT 130tablica

framebuf 402 408plugintbl 552 555tekst 208z kodem wynikowym 543

taktowanieDAC 296mikrokontrolera 473

technologia OLED 44temperatura mikrokontrolera 239 241termistor 262 290

NTC 263PTC 263

termometrLM35 249 250z alarmem 251

termostat 290test uk adu VS1003B 503testowanie obrazu 319timer 16 62

TCC0 20

TCC1 399transakcja 59 62 65transakcje 17 103ndash107transakcyjna obs uga LCD 58transakcyjny dost p do SPI 95transfer 91

danych 97wynikoacutew 254

transmisja 72 83tryb

bez znaku 234ci g ej konwersji 252czterobitowy 153dwukana owy 301graficzny 416graficzny VGA 407idle 419jednobitowy 153LPC 371monochromatyczny 397 407oszcz dzania energii 94 306pracy multipleksera 226pracy SPI 157roacute nicowy 232single slope 312SPI 153tekstowy 413tekstowy VGA 397z pojedynczym wej ciem 234ze znakiem 235

trybygenerowania PWM 467pracy karty 153pracy przetwornika 231pracy SPI 74pracy uk adu 508

twierdzenie Nyquista 258tworzenie

adresu 84nak adek 417obrazu 335tablicy 543

typ__uint24 119karty 160niekompletny 60wyliczeniowy 114

typyoperandoacutew 29w AVR 34

Kup książkę Poleć książkę

584 AVR Uk ady peryferyjne

Uuchwyt handle 64 113uk ad

AD725 427 431buforowy 294CS 361DAC 284dataloggera 267detekcji awarii zasilania 559generuj cy obraz 393HiRes 477ICL7660 47LM35 250 251SampH 293sterowania sygna em 379USART 401VS1003B 496 503 508 530 538 556VS100XX 529wzmacniania sygna u 227

uk ady peryferyjne 9uruchomienie komparatora 287urz dzenie

master 72slave 72

u rednianie 259utrata danych 141u ycie wstawki asemblerowej 33

VVGA 393

Wwarto ci kalibracyjne

ADC 564oscylatoroacutew 564temperatury 564

warunkowa kompilacja 36WE Write Enable 375wej cie composite video input 425wektor przerwa 38 257wideo 391wielko pami ci 86 377w czenie DAC 299wska nik na struktur 27wska niki 32wstawki asemblerowe 24 33wtyczka 535 541 544

SineDTMF Generator 537VGA 396

wyboacuter cz stotliwo ci PWM 465 474wykorzystanie

DMA 254 518

EuroSCART 428PWM 461rejestroacutew 34

wyliczanie predyktora 489wy wietlacze

alfanumeryczne 43 45graficzne 43 309LCD 43OLED 46

wy wietlanielitera u 213map bitowych 344obrazu 333 346 406obrazu VGA 393

wywo ania zwrotne callbacks 98asynchroniczne 101synchroniczne 101

wyzwalanie konwersji 245wzmacniacz 446wzmacniacz operacyjny 279wzmacnianie sygna u 227

XXMEGA 9 18

Zzapis

bufora 269danych 176d wi ku 440 556

zasilaniekarty 154pami ci 109

zatrzask 368zatrzask 74HC573 433zatrza ni cie adresu 369zdarzenia 297zdarzenie compare match 399zegar 383 420 426zintegrowane rodowisko programistyczne 11z cze EuroSCART 425 428 429zmiana

g o no ci 527wielko ci strony 94

znaki 56

roacuted onapi cia odniesienia 284sygna u 240

Kup książkę Poleć książkę

Page 18: Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8 AVR. Ukäady peryferyjne Rejestry dost pu do pami ci RAM .....513 Rejestr adresu

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 53

HD44780_CLRPowoduje wyczyszczenie (wype nienie znakami o kodzie 32) ca ej zawarto ci pami ciDDRAM Jednocze nie kursor wraca do pozycji pierwszej (pierwsza linia pierwszyznak)

Niewy wietlane bajty pami ci DDRAM tak e s kasowane Je li s one u ywanedo przechowywania zmiennych programu to przed operacj kasowania nale y jeskopiowa w bezpieczne miejsce W przeciwnym przypadku zostan utracone

Wska nik adresu do pami ci DDRAM jest ustawiany na 0 zerowane jest tak e prze-suni cie

HD44780_HOMEPowoduje powroacutet kursora do pozycji pocz tkowej mdash pierwsza linia pierwszy znakWska nik adresu do pami ci DDRAM w efekcie zawiera 0 zerowane jest roacutewnieprzesuni cie wy wietlania znakoacutew w efekcie s one wy wietlane od pozycji 0

HD44780_DDADDR(addr)Ustawia nast pny adres zapisuodczytu w pami ci DDRAM na addr Tylko 7 bitoacutewargumentu addr jest branych pod uwag w zwi zku z czym mo na zaadresowa mak-symalnie 128 bajtoacutew pami ci (z czego sterownik ma tylko 80 pozosta e lokacje snieu ywane)

HD44780_CGADDR(addr)Ustawia nast pn operacj odczytuzapisu w pami ci CGRAM na addr Pod uwagbranych jest tylko 6 bitoacutew zmiennej addr w efekcie mo na zaadresowa maksymalnie64 bajty pami ci CGRAM

Przedstawione powy ej funkcje zapewniaj jedynie podstawow komunikacj z mo-du em LCD Potrzebujemy jednak ci gle funkcji odpowiedzialnej za jego inicjalizacjmdash funkcja biblioteczna przeprowadza ten proces tylko w podstawowym zakresie musi-my jeszcze zadba o w a ciwe ustawienie parametroacutew zwi zane z posiadan matryc Napiszmy wi c w asne rozwini cie funkcji inicjalizacyjnej

void lcd_init() hd44780_init() Podstawowa inicjalizacja modu u hd44780_outcmd(HD44780_CLR) Wyczy pami DDRAM hd44780_wait_ready(1000) hd44780_outcmd(HD44780_ENTMODE(1 0)) Tryb autoinkrementacji AC hd44780_wait_ready(1000) hd44780_outcmd(HD44780_DISPCTL(1 0 0)) W cz wy wietlacz wy cz kursor hd44780_wait_ready(1000)

Zauwa e po wys aniu ka dego polecenia do modu u jest wywo ywana funkcjahd44780_wait_ready(1000) odpowiedzialna za oczekiwanie a realizacja wys anego po-lecenia dobiegnie ko ca Jest to niezb dne gdy do czasu uko czenia bie cej

Kup książkę Poleć książkę

54 AVR Uk ady peryferyjne

operacji dalsze polecenia s ignorowane Jako argument podany jest parametr 1000mdash jest on bez znaczenia nasza biblioteka korzysta z flagi Busy i po prostu go ignorujePo wykonaniu powy szej funkcji modu LCD jest poprawnie zainicjalizowany a jegopami jest wyczyszczona (zawiera bajty 0x20) i w efekcie modu nic nie wy wietlaOd tej chwili mo emy wysy a znaki do wy wietlenia

Po wykonaniu inicjalizacji ekran mo e pozosta czysty lub wy wietla ca kowiciewype nione kwadraty (wszystkie piksele w czone) Je li po inicjalizacji wszystkiepiksele s w czone nale y nieco zmniejszy kontrast

Aby sobie u atwi to zadanie zdefiniujmy funkcj wysy aj c do modu u jeden znakvoid lcd_putchar(char c) static bool second_nl_seen static uint8_t line=0

if ((second_nl_seen) ampamp (c = n)ampamp(line==0)) Odebrano pierwszy znak hd44780_wait_ready(40) hd44780_outcmd(HD44780_CLR) hd44780_wait_ready(1600) second_nl_seen=false if (c == n) if (line==0) line++ hd44780_outcmd(HD44780_DDADDR(64)) Adres pierwszego znaku drugiej linii hd44780_wait_ready(1000) else second_nl_seen=true line=0 else hd44780_outdata(c) hd44780_wait_ready(40)

Funkcja ta ze wzgl du na skomplikowane adresowanie pami ci DDRAM jest zale naod konkretnego modelu modu u LCD B dzie prawid owo wspoacute pracowa z modu a-mi 2times16 2times20 i 2times40 znakoacutew W przypadku innych modu oacutew pozycje niektoacuterychznakoacutew mog by nieprawid owe

Mo emy ju wy wietla na LCD pojedyncze znaki czas na wy wietlanie tekstu Po-niewa teksty jako sta e dla zaoszcz dzenia cennej pami ci RAM przechowuje si za-zwyczaj w pami ci FLASH zdefiniujmy funkcj odczytuj c podany a cuch zna-kowy z pami ci FLASH a nast pnie umieszczaj c go na LCD

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 55

void lcd_puttext_P(prog_char txt) char ch while((ch=pgm_read_byte(txt))) lcd_putchar(ch) txt++

Powy sza funkcja wysy a kolejne znaki odczytane z pami ci FLASH na LCD za po-moc funkcji LCD_putchar Po napotkaniu znaku ko ca a cucha (0 nul) przerywa swojedzia anie

Pozostaje nam przetestowa dzia anie przedstawionych funkcjiint main() lcd_init() lcd_puttext_P(PSTR(Test LCDnDruga linia)) while(1)

Na ekranie modu u LCD powinien wy wietli si napisTest LCDDruga linia

Je li na LCD nic nie widzimy to w pierwszej kolejno ci powinni my sprawdzi kon-trast zmieniaj c napi cie na pinie Vee modu u LCD

Warto zdefiniowa jeszcze funkcj ustawiaj c pozycj od ktoacuterej b dzie wy wietlanynast pny znak

void lcd_goto(uint8_t x uint8_t y) hd44780_outcmd(HD44780_DDADDR(0x40y+x)) hd44780_wait_ready(1000)

Funkcja ta przyjmuje dwa parametry x i y okre laj ce pozycj na ktoacuterej zostaniewy wietlony nast pny znak wys any z mikrokontrolera do modu u LCD Dzi ki temuz atwo ci mo emy uaktualnia zawarto LCD bez konieczno ci ponownego prze-sy ania wszystkich danych Funkcja ta jest zale na od typu zastosowanego modu u

Ostatni funkcj jest funkcja umo liwiaj ca czyszczenie zawarto ci pami ci modu uOdpowiedzialne za to jest proste polecenie wysy ane do sterownika

void lcd_cls() hd44780_outcmd(HD44780_CLR) hd44780_wait_ready(false)

Oproacutecz czyszczenia zawarto ci pami ci modu u powoduje ono ustawienie kursoraw punkcie (00)

Kup książkę Poleć książkę

56 AVR Uk ady peryferyjne

Definiowanie w asnych znakoacutewUk ad HD44780 jest wyposa ony w 64 bajty pami ci CGRAM (ang Character Ge-nerator RAM) ktoacutera mo e przechowywa mapy bitowe 8 znakoacutew o matrycy 5times8 pikselilub 4 znakoacutew o matrycy 5times10 pikseli Przyk ad definicji znaku na matrycy 5times8 poka-zano na rysunku 223

Rysunek 223Przyk ad definicji w asnego znakuw pami ci CGRAM Znak rysujemyna matrycy 5times8 bitoacutew polazaciemnione odpowiadaj warto ci 1pola bia e warto ci 0 Wartowyliczon dla ka dej linii pikseliwpisujemy do pami ci CGRAMsterownika Najstarsze 3 bity ka degobajta (pola szare) s bez znaczeniamdash wy wietlacz pomija jeprzy wy wietlaniu obrazu

1

2

3

4

5

6

7

0 00100 = 4

01110 = 14

11111 = 31

00100 = 4

00100 = 4

00100 = 4

11111 = 31

01110 = 14

Adres Warto

Dost p do tej pami ci jest mo liwy dzi ki wys aniu polecenia ustawiaj cego adreszapisuodczytu pami ci CGRAM Po jego wys aniu wszystkie operacje zapisu i od-czytu dotycz tej pami ci a nie pami ci DDRAM Aby wroacuteci do adresowania pa-mi ci DDRAM nale y wybra jej adres lub dokona operacji wymagaj cej przesu-ni cia kursora

Pami CGRAM jest pami ci ulotn po ponownym w czeniu zasilania definicjeznakoacutew musz by ponownie przes ane przez procesor

Bity o warto ci 1 w definicji znaku odpowiadaj w czonym pikselom bity o warto-ci 0 pikselom wy czonym Najstarsze 3 bity ka dego bajta w pami ci CGRAM s

bez znaczenia mdash te pozycje nie s wy wietlane przez matryc Definiuj c znak nale-y tak e pami ta e ostatnia linia wy wietlana przez matryc (w zale no ci od wiel-

ko ci matrycy znaku linia 8 lub 10) powinna zawiera same zera mdash w tej linii b dziewy wietlany kursor

Najcz ciej matryce LCD pod czone do sterownika HD44780 maj organizacj 5times8czyli jeden znak jest definiowany przez 8 kolejnych bajtoacutew okre laj cych stan po-szczegoacutelnych linii tworz cych znak Stwoacuterzmy funkcj ktoacuterej zadaniem b dzie za a-dowanie definicji znakoacutew z pami ci FLASH mikrokontrolera do pami ci CGRAM

void lcd_defchar_P(uint8_t charno prog_uint8_t chardef) hd44780_outcmd(HD44780_CGADDR(charno8)) hd44780_wait_ready(40) for(uint8_t c=0clt8c++) hd44780_outdata(pgm_read_byte(chardef))

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 57

hd44780_wait_ready(40) chardef++

Funkcja LCD_defchar_P jako argumenty przyjmuje numer definiowanego znaku (0 ndash 7)oraz wska nik do obszaru pami ci FLASH zawieraj cego definicj znaku (obszarten zajmuje 8 nast puj cych po sobie bajtoacutew) Jak widzimy funkcja najpierw ustawiaw a ciwy adres pod ktoacuterym znajdzie si pocz tek definicji znaku w pami ci CGRAMmdash poniewa jeden znak jest opisywany za pomoc 8 bajtoacutew kolejne adresy znakoacutewto kod_znakutimes8 Nast pnie dane opisuj ce znak s adowane z pami ci mikrokontrolerai zapisywane w pami ci CGRAM sterownika Poni szy program ilustruje wykorzy-stanie funkcji LCD_defchar_P

prog_uint8_t char1[8][8]=0000000255 00000025525500000255255255 0000255255255255 00025525525525525500255255255255255255 0255255255255255255255255255255255255255255255

int main() for(uint8_t x=0xlt8x++) lcd_defchar_P(xampchar1[x][0]) Za aduj wzorce znakoacutew lcd_init() for(uint8_t x=0xlt8x++) lcd_putchar(x) Wy wietl znaki o kodach 0 ndash 7 while(1)

W pierwszej linii funkcji main nast puje za adowanie nowych definicji znakoacutew dopami ci CGRAM nast pnie inicjalizowany jest wy wietlacz po czym w pierwszejlinii s wy wietlane znaki o kodach 0 ndash 7 a wi c znaki ktoacuterych definicja zosta aprzes ana z mikrokontrolera

Zauwa e pami CGRAM podobnie jak DDRAM mo emy zapisywa i odczytywaprzed inicjalizacj modu u LCD Proces inicjalizacji jest potrzebny tylko do prawi-d owego wy wietlania na ekranie LCD

Poniewa dane potrzebne do wy wietlenia znaku s na bie co pobierane z pami cipodczas od wie ania matrycy LCD jakiekolwiek zmiany w definicji znaku kiedy jest onwidoczny na LCD poci gaj za sob natychmiastowe zmiany w wy wietlanym obrazieMo na t w a ciwo sterownika wykorzysta do stworzenia prostych animacji

void lcd_box(uint8_t y) hd44780_outcmd(HD44780_CGADDR(0)) Zaczynamy od znaku o kodzie 0 hd44780_wait_ready(40) for(uint8_t c=0cltyc++) Stwoacuterz linie z w czonymi pikselami hd44780_outdata(0xFF) hd44780_wait_ready(40) for(uint8_t c=yclt8c++) Stwoacuterz linie z wy czonymi pikselami hd44780_outdata(0x00) hd44780_wait_ready(40)

Kup książkę Poleć książkę

58 AVR Uk ady peryferyjne

int main() lcd_init() lcd_putchar(0) while(1) for(uint8_t x=0xlt8x++) lcd_box(x) _delay_ms(100) for(int8_t x=7xgt=0x--) lcd_box(x) _delay_ms(100)

Funkcja main wy wietla na LCD tylko jeden znak o kodzie 0 a nast pnie cykliczniezmienia jego definicj w pami ci CGRAM W efekcie posta znaku wy wietlana naekranie ci gle si zmienia

Transakcyjna obs uga LCDPokazana do tej pory obs uga LCD alfanumerycznego mia a pewne wady Jak wiemyoperacje odwo uj ce si do kontrolera LCD s niezwykle wolne cykl odczytuzapisudowolnego rejestru kontrolera trwa co najmniej 1600 ns co dla MCU taktowanegozegarem 32 MHz przek ada si na czas wykonania oko o 52 instrukcji asemblera Cogorsza wi kszo komend realizowanych przez kontroler jest wykonywana w czasieoko o 37 s co przek ada si na tysi ce zmarnowanych taktoacutew MCU St d te jaki-kolwiek zapisodczyt LCD to z perspektywy programu straszne marnotrawstwo czasu

Problem ten dotyczy ka dego urz dzenia IO ktoacutere dzia a wolniej ni procesor W takiejsytuacji warto napisa pewn warstw po redni mdash sterownik mdash ktoacuterego zada-niem b dzie buforowanie da dost pu do urz dzenia i rozstrzyganie konfliktoacutewdzi ki czemu roacute ne cz ci programu b d bdquomia y wra enierdquo e maj wy czny do-st p do urz dzenia

Pokazane wcze niej funkcje obs ugi LCD maj jeszcze jedn wad mdash nie s wspoacute bie -ne czyli nie mo na ich wykonywa jednocze nie w kilku miejscach programu w tymw szczegoacutelno ci w programie g oacutewnym i w funkcjach obs ugi przerwa W wielu przy-padkach ta wada jest bez znaczenia jednak czasami jest uci liwa mdash dla przyk adugdy na wy wietlany tekst chcieliby my na o y inne informacje np o dacie lub godzi-nie Oczywi cie wy wietlanie mo na zorganizowa tak aby nie by o potrzeby pisaniawspoacute bie nego kodu np poprzez zastosowanie bufora pami ci VRAM kontrolera LCDRodzi to jednak kolejne problemy i jest ma o eleganckie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 59

Zastanoacutewmy si w jaki sposoacuteb najlepiej jednocze nie rozwi za problem wolnegodost pu do urz dzenia i wspoacute bie no ci kodu Rozwi zaniem mo e by wprowadze-nie tzw transakcji Transakcj nazywamy zbioacuter operacji tworz cych pewn ca-o To co wyroacute nia tak wykonywany zestaw operacji to atomowo spoacutejno

izolacja i trwa o Pod tymi terminami kryje si istota wykonywanej operacji Ato-mowo transakcji zapewnia e jest ona wykonywana w sposoacuteb niepodzielny co gwa-rantuje nam prawid ow wspoacute prac z danym urz dzeniem IO w tym przypadku kon-trolerem LCD Wa na dla nas jest tak e izolacja mdash dzi ki temu inne operacje na LCD(inne transakcje) nie b d mia y wp ywu na wynik aktualnie wykonywanej transakcjimdash nie b d zak oacuteca y jej wykonania z drugiej strony nasza transakcja nie zak oacuteciwykonania innych Trwa o z kolei zagwarantuje nam e je li sterownik potwierdziwykonanie transakcji to znaczy e efekt jej dzia ania jest wy wietlony na LCD Tacecha nie jest nam a tak potrzebna mdash jest ona wydawa oby si oczywista Niemniej jestto pewna gwarancja e ca a operacja przebieg a poprawnie i w efekcie LCD znajdujesi w okre lonym przez nas stanie Tyle teorii przejd my do praktyki

Kody poni szego przyk adu znajduj si w katalogu PrzykladyLCD-alfaLCD-transact

Aby zapewni transakcyjny dost p do LCD musimy stworzy pewne struktury danychktoacuterych zadaniem b dzie przechowywanie informacji o operacjach sk adaj cych sina transakcje i stanie ich wykonania W tym celu pos u ymy si wiadomo ciami z roz-dzia u 5 bdquoJak uporz dkowa chaos czyli z o one typy danych i listyrdquo Do przecho-wywania oczekuj cych transakcji pos u ymy si buforem pier cieniowym zanimjednak go zaimplementujemy zastanoacutewmy si jak powinna wygl da struktura prze-chowuj ca informacje o transakcji Struktura ta powinna zawiera co najmniej

pole danych (data) z informacjami ktoacutere maj by przes ane do kontrolera LCD

pole okre laj ce liczb danych do wys ania (len)

pole okre laj ce realizowane polecenie dla LCD (cmd) mdash pole to pos u yprogramowi sterownika do w a ciwej interpretacji danych znajduj cych siw polu data

kilka poacutel kontrolnych przechowuj cych informacje potrzebne do realizacjisamej transakcji Jedno z nich mdash Ready mdash b dzie przyjmowa warto trueje li dana transakcja zosta a zrealizowana lub false w przeciwnym przypadkuZnaczenie drugiego pola mdash SelfDel mdash mo e wydawa si nieco enigmatycznepole to okre la czy pami przydzielona dla transakcji ma by zwolnionaw sterowniku LCD (warto true) czy te zostanie zwolniona w programie(warto false)

Oto jak mo e wygl da struktura definiuj ca transakcj typedef struct volatile bool Ready 1 true je li transakcja zosta a zrealizowana bool SelfDel 1 true je li pami przydzielona transakcji ma zosta zwolniona LCD_Cmd cmd 2 Polecenie do zrealizowania uint8_t len 6 D ugo polecenia

Kup książkę Poleć książkę

60 AVR Uk ady peryferyjne

unsigned 0 Wyroacutewnanie do granicy bajta uint8_t data[] Dane transakcji LCD_trans

Nale y zwroacuteci uwag na poleunsigned 0

Nie definiuje ono adnego pola struktury ale jedynie informuje kompilator e kolejnepole (w naszym przyk adzie o nazwie data) ma by wyroacutewnane do granicy bajta mdashdzi ki temu dost p do kolejnego pola b dzie odbywa si szybciej Z kolei samo poledata jest zadeklarowane jako tzw typ niekompletny

Typ niekompletny (ang incomplete type) to typ ktoacuterego rozmiaru nie da si okre li

W pokazanym przyk adzie rozmiaru pola data nie da si okre li gdy zosta on za-deklarowany jako typ tablicowy z tym e nie podano wielko ci tablicy Wielko ci niepodano gdy na etapie deklaracji struktury nie wiemy jakiej wielko ci dane b d w niejprzechowywane Tego typu deklaracja ma bardzo powa ne konsekwencje mdash skorowielko ci pola data nie da si okre li to jaki b dzie wynik dzia ania operatora sizeof(LCD_trans) Kompilator stara si jako wybrn z tej sytuacji w zwi zku z czym

zwroacuteci wielko struktury ale tak jakby pole data w ogoacutele nie istnia o mdash jego roz-miar b dzie wynosi 0 W ramach wiczenia zastanoacutew si ile bajtoacutew pami ci b dziezajmowa a struktura LCD_trans

Skoro dysponujemy ju struktur przechowuj c poszczegoacutelne transakcje pora nastworzenie obiektu przechowuj cego kolekcj transakcji Dodanie kolejnej strukturyb dzie polega o na dodaniu jej do takiego obiektu z drugiej strony program sterownikaLCD b dzie moacuteg z tej kolekcji pobiera kolejne transakcje do realizacji Opis ten przy-pomina opis dzia ania bufora pier cieniowego mdash z jednym wyj tkiem mdash po zape nie-niu ca ego bufora nie b dziemy usuwa niezrealizowanych transakcji lecz zabloku-jemy dodawanie kolejnych W tym celu pos u ymy si definicj nast pnej struktury

typedef struct LCD_trans elements[LCD_MAXTRANS] Wska niki do transakcji uint8_t Beg Pierwszy element bufora uint8_t Count Liczba elementoacutew w buforze CircBuffer

Struktura ta zawiera deklaracj tablicy wska nikoacutew na transakcje (pole elements)Poniewa jest to tablica musimy zna liczb jej elementoacutew mdash jest ona zadeklarowanaw sta ej LCD_MAXTRANS

define LCD_MAXTRANS 10 Maksymalna liczba pami tanych transakcji

Do realizacji bufora s potrzebne jeszcze dwa pola Beg wskazuj ce na pierwsztransakcj w buforze oraz pole Count okre laj ce liczb transakcji znajduj cych siw buforze Je li Count == 0 to znaczy e w buforze nie ma adnych oczekuj cychtransakcji a je li Count == LCD_MAXTRANS to znaczy e bufor jest pe ny i nie mo na

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 61

dodawa do niego kolejnych transakcji W a ciwo t wykorzystuj dwie zdefiniowanew pliku LCD_transc funkcje

static inline bool cbIsFull(CircBuffer cb) return cb-gtCount == LCD_MAXTRANS

static inline bool cbIsEmpty(CircBuffer cb) return cb-gtCount == 0

Jak pami tamy w przypadku funkcji modyfikatory static inline powoduj e danafunkcja nie b dzie istnie jako samodzielna lecz w ka dym miejscu w ktoacuterym jestwywo ywana jest wstawiany raczej jej kod a nie wywo anie Ma to znaczenie dlakroacutetkich funkcji (a wi c takich jak pokazane powy ej) dla ktoacuterych koszty wywo anias zazwyczaj wi ksze ni koszty umieszczenia cia a funkcji w miejscu jej wywo aniaTego typu funkcje zachowuj si w sposoacuteb zbli ony do makrodefinicji (z tym e re-spektuj wszystkie regu y j zyka C w szczegoacutelno ci kolejno operatoroacutew czy kon-trol typoacutew)

Takie funkcje jako argument pobieraj adres bufora na ktoacuterym maj operowa W na-szym przypadku bufor jest zdefiniowany nast puj co

static CircBuffer LCD_TransBuffer Bufor na transakcje

Nale y zauwa y e jest on zdefiniowany jako struktura globalna z modyfikatoremstatic Modyfikator ten ogranicza zasi g widoczno ci zmiennej LCD_TransBuffer dopliku w ktoacuterym zmienna ta zosta a zdefiniowana (w tym przypadku modyfikator staticjest niejako przeciwie stwem modyfikatora extern) Dzia anie to ma jedynie znaczeniekosmetyczne mdash uniemo liwia odwo anie si do bufora za pomoc funkcji ktoacutere niezosta y zdefiniowane w miejscu jego definicji Oproacutecz funkcji umo liwiaj cych okre-lenie stanu bufora potrzebne s jeszcze funkcje umo liwiaj ce dodanie i pobranie trans-

akcji Pierwsz funkcj b dzie funkcja dodaj ca transakcj do buforabool cbAdd(CircBuffer cb LCD_trans elem) ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsFull(cb)) return false Czy jest miejsce w kolejce uint8_t end = (cb-gtBeg + cb-gtCount) LCD_MAXTRANS cb-gtelements[end] = elem Dodaj transakcj ++cb-gtCount Liczba elementoacutew w buforze return true Wszystko OK

Funkcja ta dodaje transakcj (zmienna elem) do bufora ko owego Zanim transakcjazostanie dodana sprawdzane jest czy w buforze jest miejsce mdash je li nie funkcjazwroacuteci false Je li dodanie jest mo liwe warto licznika okre laj cego liczb trans-akcji przechowywana w buforze (Count) zwi ksza si o jeden Warto zastanowi si te dlaczego praktycznie ca e cia o tej funkcji jest zamkni te w sekcji atomowej (ATOMIC_BLOCK) Jedn z cech naszego sterownika ma by mo liwo wspoacute bie nego dost pu

Kup książkę Poleć książkę

62 AVR Uk ady peryferyjne

do LCD mdash to znaczy e danie np zapisu do LCD mo e wyst pi zaroacutewno w g oacutewnejp tli programu jak i asynchronicznie w przerwaniu St d te wynika e funkcja do-daj ca transakcj musi by napisana w sposoacuteb zapewniaj cy jej poprawn prac w sytu-acji gdy zostanie ona przerwana i ponownie wywo ana przed zako czeniem dzia aniajej poprzedniej instancji Umieszczenie cia a tej funkcji w sekcji atomowej nam to za-pewnia mdash dzi ki temu bufor transakcji zawsze b dzie spoacutejny Dla zaspokojenia cie-kawo ci warto usun sekcj atomow i sprawdzi jak wtedy b dzie zachowywa si tafunkcja i jak wp ynie to na spoacutejno przechowywanych danych

Drug niezb dn funkcj jest funkcja odczytuj ca bufor transakcji i zwracaj ca trans-akcj do zrealizowania (lub NULL je li adnej transakcji nie ma w buforze)

LCD_trans cbRead(CircBuffer cb) LCD_trans elem ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsEmpty(cb)) return NULL Bufor pusty nie mo na zwroacuteci elementu elem = cb-gtelements[cb-gtBeg] cb-gtBeg = (cb-gtBeg + 1) LCD_MAXTRANS -- cb-gtCount Zmniejszamy liczb elementoacutew pozosta ych w buforze return elem

Funkcja ta jest bardzo podobna do poprzedniej mdash najpierw sprawdza czy bufor za-wiera jak oczekuj c transakcj (cbIsEmpty(cb)) je li tak to zwraca adres opisuj -cej j struktury i zmniejsza liczb transakcji oczekuj cych (pole Count) W ten sposoacutebmamy zrealizowan ca funkcjonalno zwi zan z obs ug bufora pier cieniowegoPokazane funkcje s uniwersalne i z bardzo podobnych (lub wr cz tych samych) b -dziemy korzysta w kolejnych rozdzia ach w kontek cie np obs ugi transakcji zwi -zanych z interfejsami szeregowymi

Pora przej do samego sterownika LCD Jego zadaniem b dzie sprawdzenie czyw buforze oczekuj jakie transakcje do realizacji a je li tak to ich wykonanie Ponie-wa dane do LCD mog by wysy ane co okre lony minimalny czas znacznie d u -szy ni czas jakiego na to zadanie potrzebuje mikrokontroler do wysy ania kolejnychpaczek danych pos u ymy si timerem Timer b dzie generowa przerwanie nadmiaru(TCD0_OVF_vect) ktoacutere b dzie wyznacza o tempo w jakim kolejne porcje danych b -d trafia y do LCD Z noty katalogowej kontrolera wynika e minimalny czas trwa-nia wysokiego stanu sygna u Enable to 230 ns a okres tego sygna u nie powinien bykroacutetszy ni 500 ns Poniewa nasz dost p do LCD odbywa si w sposoacuteb nieblokuj cyMCU wi c szybko wysy ania danych do LCD jest bez znaczenia St d te w poka-zanym przyk adzie przyj to e dane b d wysy ane co 4 s co okre la sta a

define LCD_ACCESSTIME 0000004

Poniewa komunikacja z LCD odbywa si w sposoacuteb nieblokuj cy nie zale y nam tena czasie (i tak w stosunku do czasu od wie ania samego LCD jest on bardzo kroacutetki)w efekcie nie ma potrzeby odczytywania flagi busy kontrolera Dzi ki temu w cz ciprzypadkoacutew mo emy w ogoacutele zrezygnowa z sygna u wyboru RW i wymusi jego sta y

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 63

poziom logiczny umo liwiaj cy zapis do LCD Dzi ki temu mo na zaoszcz dzi do-datkowy pin IO1

Ca a logika naszego sterownika jest zawarta w funkcji obs ugi przerwania przepe nieniatimera (TCD0_OVF_vect) Poniewa LCD jest po czony z MCU w trybie 4-bitowym(dla zaoszcz dzenia liczby wykorzystanych pinoacutew IO) kolejne 8-bitowe dane muszby podzielone na dwie tetrady i wys ane do LCD w kolejno ci starszam odsza tetradaInformacja o aktualnie wysy anych danych jest umieszczona w zmiennej trans o typie

static struct uint8_t pos 6 Pozycja w polu danych aktualnej transakcji uint8_t nibble 1 Ktoacutera tetrada jest wysy ana seq

Dlaczego tak Dzi ki wykorzystaniu struktury i poacutel bitowych mo na zaoszcz dzi je-den bajt pami ci SRAM Ze wzgl du na wielko pami ci obs ugiwanej przez kon-troler LCD mo emy by pewni e transakcje zawieraj ce wi cej ni 63 bajty s ra-czej nierealne (nie mia yby wi kszego sensu) St d te do przechowywania informacjio aktualnie wysy anym bajcie danych wystarczy 6 bitoacutew mdash tyle samo zosta o wyko-rzystanych do okre lenia d ugo ci pola danych transakcji w strukturze LCD_trans Zaosz-cz dzony bit mo na po wi ci na flag nibble okre laj c ktoacutera tetrada (m odszastarsza)jest wysy ana Bez poacutel bitowych flaga ta zaj aby dodatkowy bajt pami ci

Przejd my do implementacji sterownika Pierwsz rzecz jak nale y sprawdzi jestto czy w buforze czeka jaka transakcja do zrealizowania Odpowiedzialny za to jestfragment kodu obs ugi przerwania nadmiaru timera

if(trans == NULL) Nic do zrobienia sprawd my czy jaka transakcja oczekuje trans=cbRead(ampLCD_TransBuffer) Czy jest jaka oczekuj ca transakcja seqpos=0 seqnibble=0 if(trans == NULL) TCD0_CTRLA=TC_CLKSEL_OFF_gc Nie ma adnych transakcji mdash wy cz timer

W przypadku gdy adna transakcja nie oczekuje na realizacj timer jest wy czanymdash dzi ki temu nie b d zg aszane kolejne przerwania przepe nienia i MCU nie b -dzie traci czasu na ich obs ug Co prawda wynikaj cy z tego zysk czasowy jest mar-ginalny lecz ma to istotniejsz konsekwencj mdash w przypadku usypiania MCU zb d-ne przerwanie timera nie b dzie niepotrzebnie wybudza o procesora W takiej sytuacjiponowne w czenie timera nast pi dopiero w funkcji dodaj cej transakcj do kolejkimdash a wi c w sytuacji gdy mamy pewno e istnieje oczekuj ca transakcja

Druga cz funkcji obs ugi przerwania jest zwi zana z realizacj samej transakcjiW pokazanym przyk adzie zaimplementowano tylko jeden typ transakcji mdash daniezapisu a cucha tekstowego pod wskazany adres VRAM (na okre lonej pozycji LCD)Je li zajdzie taka potrzeba programista mo e zaimplementowa inne polecenia i doda

1 Warto zauwa y e w bdquoklasycznejrdquo obs udze LCD te nie musimy czyta stanu flagi busy zamiast tego

wystarczy wprowadza p tle opoacute niaj ce Jednak poniewa taka obs uga blokuje MCU nie jest onazalecana Wady tej nie ma dost p transakcyjny co jest jego dodatkow zalet

Kup książkę Poleć książkę

64 AVR Uk ady peryferyjne

kod odpowiedzialny za ich obs ug Zauwa my e ka da transakcja musi zawieraadres pocz tku pami ci wideo od ktoacuterego b dzie zapisywany tekst Dzieje si takdlatego e transakcja wykonana wcze niej mo e ustawi wska nik zapisu na dowolnejkomoacuterce pami ci W efekcie tekst z kolejnej transakcji by by wy wietlany od komoacuterkina ktoacuterej zako czy si zapis poprzedniej transakcji Takie dzia anie oczywi cie jestniedopuszczalne st d te ka dy zapis do pami ci wideo poprzedza ustawienie rejestruindeksowego Problem ten mo na rozwi za tak e w inny sposoacuteb mdash poprzez wpro-wadzenie tzw uchwytoacutew (ang handlers) ktoacutere zawiera yby stan kontrolera LCDNiemniej to rozwi zanie dodatkowo komplikowa oby nasz sterownik Struktura danych(zawartych w polu data) ma wi c nast puj cy format

bajt nr 0 zawiera warto pozycji od ktoacuterej nale y dokonywa zapisu pami ciwideo mdash jest to warto przesy ana do rejestru okre laj cego adres zapisu

kolejne bajty zawieraj a cuch znakowy ktoacutery nale y umie ci w pami ciCGRAM

Poniewa bajt nr 0 zawsze zawiera warto wpisywan do rejestroacutew steruj cych kon-trolera podczas jego wysy ania jest ustawiana linia RS sygnalizuj ca zapis do rejestruPodczas wysy ania kolejnych bajtoacutew linia ta jest zerowana w zwi zku z czym zapisodbywa si do pami ci CGRAM

Kod obs uguj cy transakcj wygl da nast puj coif(trans) Jest transakcja do zrealizowania uint8_t dat=trans-gtdata[seqpos] if(seqnibble == 0) datgtgt=4 To trzeba zmieni je li linie danych nie s po czone z pinami 0 ndash 3 portu IO hd44780_outnibble_nowait(dat amp 0x0F seqpos = 0) Zapisujemy rejestr steruj cy lub dane ++seqnibble if(seqnibble == 0) ++seqpos Co drug tetrad zwi kszamy pozycj bufora if(seqpos gt= trans-gtlen) trans-gtReady=true Koniec transakcji if(trans-gtSelfDel) free_re(trans) Zwolnij pami transakcji je li tak sobie yczy programista trans=NULL Koniec transakcji CLR(OUT HD44780_E)

Ta cz przerwania wysy a kolejne tetrady do kontrolera LCD Warto zastanowi sinad dzia aniem sekwencji

++seqnibble

Poniewa pole nibble jest jednobitowe operacja inkrementacji prowadzi do zmianystanu tego pola na przeciwny (pole to ma warto 0 lub 1) Kiedy zostan wys anewszystkie dane przeznaczone dla kontrolera obs uga transakcji ko czy si Stan tensygnalizuje nadanie warto ci true polu Ready struktury LCD_trans Dzi ki temu pro-gram mo e sprawdzi asynchronicznie w stosunku do przerwania kiedy transakcjauleg a zako czeniu Opcjonalnie jest wykonywana jeszcze jedna funkcja mdash je li poleSelfDel ma warto true to pami zarezerwowana na transakcj jest automatycznie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 65

zwalniana W tym celu wykorzystuje si funkcj free_re ktoacuterej prototyp jest zade-klarowany w pliku Alloc_safeh Funkcja ta wywo uje funkcj biblioteczn free ktoacute-ra zwalnia pami przydzielon dynamicznie na stercie Poniewa funkcja ta nie jestfunkcj reentrant nale y stworzy odpowiedni bdquoprotez rdquo opakowuj c j w blokatomowy co zapewnia e nie zostanie ona ponownie wywo ana zanim jej poprzed-nia instancja nie zako czy dzia ania Oczywi cie lepszym rozwi zaniem by oby napi-sanie w asnych funkcji dynamicznej alokacji pami ci ktoacutere b d reentrant

Bardzo wa ne jest aby pole SelfDel mia o warto true wy cznie dla transakcjidla ktoacuterych pami zosta a przydzielona dynamicznie funkcj malloc (lub jej po-chodnymi) W pozosta ych przypadkach pole to musi mie warto false mdash nie-stosowanie si do tej regu y spowoduje b d mened era pami ci i najprawdopo-dobniej nieprzewidywalne dzia anie programu

Drug wa n zasad jest aby zmienna zawieraj ca dane transakcji nie by azmienn automatyczn mdash zmienne takie s automatycznie niszczone po opusz-czeniu zawieraj cej je funkcji W rezultacie obszar pami ci zawieraj cy danetransakcji mo e zosta wykorzystany przez inne zmienne co spowoduje uszkodzeniezawartych w nim danych

Pami przydzielona transakcji musi by alokowana w sposoacuteb dynamiczny (funkcjamalloc_re) ewentualnie mo e to by pami alokowana dla zmiennej globalnej lubstatycznej mdash zmienne tego typu istniej przez ca y czas ycia programu

Warto te zauwa y e instrukcje steruj ce stanem linii Enable kontrolera LCD(SET(OUT HD44780_E) i CLR(OUT HD44780_E)) s rozdzielone wieloma innymi in-strukcjami Dzi ki temu generowany impuls dodatni tego sygna u ma czas trwania gt230 ns wymagany w specyfikacji kontrolera Nawet dla XMEGA taktowanej zegarem32 MHz 230 ns przek ada si na oko o 7 instrukcji asemblera mdash czas jaki z pewno-ci up ynie pomi dzy wykonaniem obu powy szych instrukcji steruj cych

Do wysy ania danych do kontrolera zosta a wykorzystana nieco zmodyfikowanafunkcja hd44780_outnibble_nowait roacute ni ca si od jej protoplasty hd44780_outnibbletylko tym e nie czeka na sygna braku zaj to ci mikrokontrolera (nie realizuje teopoacute nie ) Nie jest to potrzebne gdy kolejne tetrady s wysy ane w odst pach cza-sowych okre lanych przez timer

Mamy wi c zapewnion obs ug transakcji i mo liwo transakcyjnego wy wietlaniadanych na LCD musimy jeszcze mie funkcj ktoacutera tworzy odpowiednie transakcjemdash jest odpowiednikiem funkcji bezpo rednio wysy aj cej dane znakowe do LCDOdpowiednikiem tym jest pokazana poni ej funkcja

bool LCD_PutText_B(uint8_t x uint8_t y char txt LCD_trans buf bool autodel) buf-gtcmd=LCD_Text buf-gtReady=false buf-gtSelfDel=autodel Czy zwolni pami po zako czeniu transakcji buf-gtdata[0]=HD44780_DDADDR(x+y0x40) Ustaw adres w DDRAM strcpy((char)ampbuf-gtdata[1] txt) Skopiuj dane tekstowe + NULL

Kup książkę Poleć książkę

66 AVR Uk ady peryferyjne

buf-gtlen=strlen(txt) + 1 D ugo tekstu + pozycji + NULL ndash 1 bool ret=cbAdd(ampLCD_TransBuffer buf) if((ret==false) ampamp (autodel)) free_re(buf) Brak miejsca w kolejce else TCD0_CTRLA=TC_CLKSEL_DIV1_gc Preskaler 1 mdash odblokuj timer return ret

Funkcja ta buduje transakcj odpowiedzialn za wy wietlenie napisu txt na wskaza-nej pozycji x y LCD Wszystkie dane o transakcji zostan umieszczone w buforzew pami ci ktoacuterej adres jest okre lany wska nikiem buf Pami w buforze musi bywystarczaj co du a aby pomie ci ca transakcj Dodatkowy parametr autodel okre laczy pami ta ma by automatycznie zwalniana po obs u eniu transakcji (true) czynie (false) Je li transakcj uda o si umie ci w kolejce funkcja zwraca true Wartozauwa y e w takim przypadku funkcja uruchamia te timer (w naszym przypadkujest to timer TCD0) odpowiedzialny za generowanie przerwania Funkcja obs ugi prze-rwania wysy a dane do LCD

Pewn odmian powy szej funkcji jest funkcjabool LCD_PutText(uint8_t x uint8_t y char txt) LCD_trans trans=malloc_re(sizeof(LCD_trans) + strlen(txt) + 2) bool ret=LCD_PutText_B(x y txt trans true) return ret

Wykorzystuje ona funkcj LCD_PutText_B z tym e najpierw alokuje dynamiczniepami potrzebn na przechowanie tworzonej transakcji

Mamy komplet potrzebnych funkcji a wi c sprawd my jak ca o sprawdza siw praktyce W pliku LCD-transactc znajduje si kod pokazuj cy jak dzia aj naszetransakcje Aby to by o mo liwe nale y zainicjalizowa kontroler LCD

LCD_init()

Wykorzystujemy tu znan ju funkcj inicjalizuj c mdash nie ma potrzeby jej zmienia gdy operacja inicjalizacji LCD jest jednorazowa i nie trzeba wykonywa jej w posta-ci transakcji W drugim kroku musimy zainicjalizowa wykorzystywany timer i systemprzerwa

LCD_Timer_init(ampTCD0)PMIC_CTRL|=PMIC_LOLVLEN_bm Odblokuj przerwania niskiego poziomusei()

Poniewa dost p do LCD z pewno ci nie jest czynno ci krytyczn czasowo prze-rwaniom timera nadano najni szy priorytet Dzi ki temu mo na innym bardziej kry-tycznym przerwaniom nada wy sze priorytety i uzyska w ten sposoacuteb zmniejszenieczasu latencji obs ugi przerwa Sama inicjalizacja timera jest niezwykle prosta

void LCD_Timer_init(TC0_t tc) tc-gtINTCTRLA=TC_OVFINTLVL_LO_gc Odblokuj przerwania nadmiaru timera i nadaj im niski priorytet tc-gtPER=F_CPULCD_ACCESSTIME Przerwanie co 4 us (niezale nie od F_CPU)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 67

Sprowadza si ona tylko do odblokowania mo liwo ci zg aszania przerwania nadmia-ru oraz konfiguracji rejestru PER tak aby przerwania by y generowane co ok 4 s mdashniezale nie od cz stotliwo ci taktowania CPU Mo emy wi c przyst pi do wy wie-tlenia pierwszego napisu

LCD_PutText(00 Numer)

Powy sza funkcja ma jedn wad mdash alokuje dynamicznie pami po ka dym wywo-aniu (pami ta jest automatycznie zwalniana po obs u eniu transakcji) niemniej

ca y proces jest czasoch onny Mo emy tego unikn alokuj c pami bdquor cznierdquo i wielo-krotnie wykorzystuj c zaalokowany blok pami ci Ilustruje to poni szy przyk ad

LCD_trans buf=malloc_re(sizeof(LCD_trans) + 7)

Zmienna buf wskazuje na obszar pami ci ktoacutery mo e pomie ci a cuch 5-znakowyTyle wystarczy na potrzeby tego przyk adu mdash na LCD b d wy wietlane kolejneliczby w zakresie 0 ndash 65 535 najd u sza ma 5 znakoacutew st d te nasz bufor ma tak a nieinn d ugo

while(1) utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(60 bufstr buf false) while(LCD_IsTransCompleted(buf))

Do konwersji liczby na a cuch u yto funkcji bibliotecznej utoa (nag oacutewek stdlibh)Poniewa d ugo a cucha po konwersji jest zmienna (co spowodowa oby pozosta-wianie na LCD bdquoduchoacutewrdquo po poprzednich konwersjach) w kolejnej linii brakuj ceznaki uzupe niono spacjami Nast pnie tworzona jest transakcja w obszarze pami ciprzydzielonym zmiennej buf Ostatnia p tla while jest odpowiedzialna za oczekiwa-nie na zako czenie realizacji transakcji Po jej zako czeniu p tla jest wykonywana odpocz tku

Uwa ny czytelnik z pewno ci zauwa y e pami przydzielana funkcj malloc_renie jest nigdzie zwalniana mdash w normalnej sytuacji spowodowa oby to wyciek pami -ci W naszym przyk adzie jednak program nigdy si nie ko czy nie ma wi c potrzebyzwalniania pami ci wskazywanej przez zmienn buf

Powy szy przyk ad pokazuje jak unikn blokowania CPU na czas dost pu do wolnodzia aj cego urz dzenia jakim jest LCD alfanumeryczny Jednak to nie wszystkiezalety wynikaj ce z zastosowania transakcji Drug wa n zalet naszego rozwi zaniailustruje przyk ad znajduj cy si w katalogu PrzykladyLCD-alfaLCD-transact-intPowa nym ograniczeniem funkcji odpowiedzialnych za dost p do LCD w sposoacutebklasyczny by a niemo no ich wywo ywania z funkcji obs ugi przerwa mdash funkcjeobs ugi LCD nie by y reentrant2 Nasz system oparty na transakcjach nie ma tychwad Aby to zilustrowa zosta stworzony prosty przyk ad mdash tak jak poprzedniow p tli g oacutewnej programu s wy wietlane stale kolejne liczby ale jednocze nie wyko-

2 Poza tym blokowa y CPU na d ugi czas a jak pami tamy funkcje obs ugi przerwa powinny by

wykonywane mo liwie kroacutetko

Kup książkę Poleć książkę

68 AVR Uk ady peryferyjne

rzystano drugi timer (TCD1) w ktoacuterego funkcji obs ugi przerwania przepe nienia jestwy wietlany licznik tych przerwa

ISR(TCD1_OVF_vect) static char int_buf[sizeof(LCD_trans) + 7] static uint16_t cnt char bufstr[6]

utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(61 bufstr (LCD_trans)ampint_buf false)

Jak widzimy w sposoacuteb asynchroniczny z dwoacutech miejsc w programie mo emy uzy-ska dost p do LCD a ka da funkcja bdquoma wra enierdquo e ma LCD na wy czno Przy okazji warto przeanalizowa sposoacuteb w jaki jest rezerwowana pami na trans-akcj w przerwaniu Oczywi cie mo na by wykorzysta dynamiczn alokacj pami cilecz jak wspomniano taka alokacja jest czasoch onna St d te w pokazanym przy-k adzie wykorzystano tablic statyczn int_buf o rozmiarze umo liwiaj cym prze-chowanie kompletnej transakcji Dzi ki temu e zmienna int_buf jest zmienn statycz-n nie jest ona niszczona po zako czeniu funkcji obs ugi przerwania Gdyby pomins owo kluczowe static zmienna ta by aby niszczona a na LCD najprawdopodobniejzacz yby si pojawia przypadkowe tre ci Poniewa pami naszego bufora nie by aalokowana dynamicznie nie mo e ona zosta zwolniona w naszym sterowniku LCDst d te ostatni parametr wywo ania funkcji LCD_PutText_B musi mie warto false

OptymalizacjaPrzy okazji tego i poprzedniego przyk adu warto zastanowi si jeszcze nad jednkwesti mdash optymalizacji W podanych przyk adach wykorzystano wcze niej omoacute-wione funkcje dost pu do wy wietlacza LCD znajduj ce si w plikach hd44780ci hd44780h Wi kszo z zawartych tam funkcji nie jest wykorzystywana jednakkompilator mimo wszystko umieszcza ich kod w pliku wynikowym mdash dzieje si takponiewa nie mo e on bdquostwierdzi rdquo czy funkcje te nie s wykorzystywane w innychfragmentach programu Pami tajmy e kompilator kompiluje poszczegoacutelne pliki roacute-d owe osobno i dana jego instancja nie bdquowierdquo co znajduje si w innych plikach (innychjednostkach kompilacji) Tak ca o ciow wiedz ma dopiero konsolidator (linker)ktoacutery czy stworzone przez kompilator pliki obiektowe (o rozszerzeniu o) w plikwynikowy Linker jednak bdquonie wierdquo ktoacutera z funkcji programu zosta a u yta a ktoacuteranie mdash informacje te ma wy cznie kompilator W ten sposoacuteb powstaje typowe b dneko o w efekcie nasze nieu ywane funkcje nie s usuwane (linker zostawia je bdquonawszelki wypadekrdquo) i zajmuj niepotrzebnie pami Czy mo na temu jako zaradzi Oczywi cie tak W tym celu trzeba po czy si y kompilatora i linkera co zapewniaj od-powiednie opcje kompilacji We w a ciwo ciach projektu (ProjectProperties lub Alt+F7)wybieramy zak adk Toolchain a nast pnie AVRGNU C Compiler i OptimizationZnajdziemy tam pole wyboru o nazwie Prepare functions for garbage collection (ry-sunek 224)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 69

Rysunek 224 Aby da linkerowi mo liwo usuwania nieu ywanych funkcji nale y skompilowaprogram z wybran opcj ndashffunction-sections ktoacutera spowoduje e ka da funkcja programu znajdzie siwe w asnej sekcji

Zaznaczenie tej funkcji spowoduje umieszczenie ka dej funkcji w osobnej sekcji mdashsamo w sobie nie wp ynie to na skroacutecenie kodu wynikowego ale jest warunkiem nie-zb dnym dla podj cia stosownych dzia a przez linker Aby wyeliminowa nieu y-wane funkcje nale y zaznaczy jeszcze w ga zi AVRGNU LinkerOptimization poleGarbage collect unused sections (rysunek 225)

Rysunek 225 Zaznaczenie opcji Garbage collect unused sections (-Wl--gc-sections) spowodujee nieu ywane funkcje zostan usuni te z kodu wynikowego w efekcie kod programu ulegnie skroacuteceniu

Po zaznaczeniu tych opcji program zostanie skroacutecony o kilkaset bajtoacutew Oczywi cieje li wszystkie funkcje by yby wykorzystane nie uzyskaliby my adnego skroacuteceniakodu Niemniej w sytuacji gdy u ywa si bibliotek zazwyczaj przynajmniej czfunkcji nie jest wykorzystywana warto wi c skorzysta z tej mo liwo ci optymalizacji

Kup książkę Poleć książkę

70 AVR Uk ady peryferyjne

Je li mamy do czynienia z prekompilowan bibliotek (lib) to musi ona by skom-pilowana z zaznaczon opcj Prepare functions for garbage collection (-ffunction-sections) Alternatyw jest umieszczenie ka dej funkcji biblioteki w osobnym pliku(tak jak w przypadku bibliotek AVR-libc)

Na ekranie wyboru opcji optymalizacji linkera mamy jeszcze jedn przydatn opcjmdash Relax Branches (-mrelax) Dla mikrokontroleroacutew ktoacutere maj ponad 8 kB pami ciFLASH instrukcje skokoacutew s generowane jako tzw instrukcje d ugie mdash umo liwiajone skok do komoacuterki pami ci FLASH o dowolnym adresie Jednak cen za to jestwyd u enie instrukcji mdash ich kod jest d u szy podobnie jak czas wykonania Nie zawszejednak takie d ugie instrukcje musz by wykonywane mdash je li miejsce docelowe skokule y blisko (w zasi gu instrukcji skokoacutew wzgl dnych) to mo na w kodzie wynikowymzamieni instrukcje d u sze na kroacutetsze co przynosi oszcz dno ci w postaci skroacuteceniakodu wynikowego Poniewa dopiero linker bdquowierdquo jak poszczegoacutelne fragmenty kodus rozmieszczone w pami ci takiej podmiany mo na dokona na etapie linkowaniaprogramu co zapewnia powy sza opcja St d te warto to pole wyboru zaznaczy

Kup książkę Poleć książkę

SkorowidzA

ABI Application Binary Interface 25AC Address Counter 50ADPCM 482adres

bazowy 377bufora 61komoacuterki 84pu apki 202

ALE Address Latch Enable 368alfanumeryczne wy wietlacze 43algorytm ADPCM 492algorytmy stratne 495animacje 57antyaliasing 325architektury procesoroacutew XMEGA 352asembler 23

dyrektywy 40funkcje j zyka C 41obs uga przerwa 39

asynchroniczne wywo anie funkcji 101Atmel Studio 15

Bbajty kalibracyjne 569biblioteka

FATFS 131 139 176 180 517libcallback-liba 99PetitFS 144 149

bitADC_CH0START_bm 236IMPMODE 244

bitrate 442 512blokowanie przerwa 219b d 16 19

kwantyzacji 463offsetu 230wzmocnienia ADC 230

BOD 223bps bits per second 12

budowakarty 152linii obrazu 394pami ci SDRAM 374pliku stymulacji 192ramki PAL 412sygna u PAL 411wtyczki 544 545

bufor 78FIFO 497na transakcje 61transakcji 62

buforowanie wyj cia 294

CCAS Column Address Strobe 375CCFL 44charakterystyka

przetwornikoacutew 222termistora 264tryboacutew pracy 232

CID Card Identification 169CKE Clock Enable 375CLKIN 421COG Chip on Glass 310CRC 158 178CRC16 178CRC7 164CS Chip Select 361 375CSD Card Specific Data 172czas

dost pu do SDRAM 424adowania kondensatora 244

propagacji 281proacutebkowania 260symulacji 209

czcionki 322cz stotliwo

odchylania pionowego 428proacutebkowania 244 441 444 530przebiegu 504

Kup książkę Poleć książkę

576 AVR Uk ady peryferyjne

cz stotliwoPWM 465taktowania koprocesora 549taktowania procesora 209taktowania rdzenia 18

czyszczenie pami ci 318

DDAC Digital to Analog Converter 293 447 451

buforowanie wyj cia 294generowanie przebiegoacutew 301jitter 303kalibracja 306napi cie referencyjne 295system zdarze 297taktowanie 296tryb dwukana owy 301wykorzystanie DMA 298wyzwalanie konwersji 305

datalogger 261 265 275DD Device Density 86debuger 183

programowy 190sprz towy 185 187

decymacja 259DEBUG 219XMEGA 260

definicja symboli globalnych 36definiowanie w asnych znakoacutew 56deklaracja zapowiadaj ca 103 337dekoder DTMF 548 556DMA 254 298 402 458 518 523dost p do

danych 358 359 568danych binarnych 356 360danych wielobajtowych 31DataFLASH 137EEPROM 128FAT 136komoacuterki 375LCD 59 62 66 68operandu 30pami ci 81 384 386 387 561pami ci SDRAM 424pliku blokowy 141portoacutew IO 30rejestroacutew IO procesora 36rejestroacutew uk adu 499SPI 95sygnatury u ytkownika 565 567wska nikoacutew 32

DQM Data Mask 375DSP Digital Signal Processor 535

DTMF 535 553dyktafon 529dynamiczna alokacja pami ci 516dyrektywa global 38dyrektywy asemblera 40dzia anie

DMA 255komparatora 280timeroacutew 400

d wi k 443

EEBI External Bus Interface 361EEPROM 207eliminacja jitteru 24emulacja RS232 139

FFAT File Allocation Table 128 131FAT32 128FATFS 180filtr

dolnoprzepustowy 491drugiego rz du 470pierwszego rz du 469trzeciego rz du 471

filtrowanie sygna u PWM 468firmware 565FLASH 207format

odpowiedzi 159polecenia 158protoko u 157

funkcja_delay_ms 17 219c_zero 42callback 106 341callback() 99DataFLASH_CSEnable 100DF_FinishBufWrite() 269disk_initialize 136disk_ioctl 181disk_status 136disk_write 138DMA_SPI_init 104DTMF_GetCode 553free_re 65GPIOR0_init 507hd44780_outcmd 51hd44780_outnibble_nowait 65LCD_defchar_P 57

Kup książkę Poleć książkę

Skorowidz 577

Menu_Click_Func 515Menu_Free 516Menu_Recorder 532Menu_Run 527MS_CreateRegEntry 117MS_GetDirPos 125MS_GetRegItem 115MS_WritePages 116 118OSC_wait_for_rdy 473RecMenu_StartStop 532sprintf 142strtok 124sysclk_init() 200 209TMF_memcpy_PF 454udi_cdc_getc() 123udi_cdc_is_rx_ready() 123VS1003_Reset 506

funkcjeanalizuj ce 556biblioteczne 50biblioteki FATFS 143j zyka C 41kontrolera ST7565R 313opoacute niaj ce 17opoacute nie 219reentrant 524specjalne kontrolera 319steruj ce 314zapisu 133

fusebit 557BODACT 560BODLEVEL 560BOOTRST 559DVSDON 560EESAVE 561JTAGEN 558RSTDISBL 559SUT 559TOSCSEL 559

fusebity w AVR-libc 571

Ggenerator obrazu composite 426generowanie

d wi ku 461kolorowego obrazu 437obrazu wideo 391przebiegoacutew 301przerwa 285sygna u composite 409

g bia koloru 326gniazdo

karty SD 156VGA 396

Hhistereza 281

IIDE 11IMA ADPCM 483informacje

o kolorze 431o obrazie 434

inicjalizacjakarty 161karty SDHC 167karty SDSC 167karty SDXC 167licznika 419pami ci 119USART 505

instrukcjaicall 42movw 35nop 13 24

interfejsSCI 498SDI 498SPI 71 79RS232 120UART 123USART 71 73

interpolacja 259interpolacja w XMEGA 260inwersja obrazu 319

Jjednostki 12jitter 24 303 420

Kkalibracja

ADC 229DAC 306 564offsetu 237

kana DMA 82 522karta 154 158

mikroSD 152SD 151 152SDHC 151 152 160SDSC 160SDXC 151 160

Kup książkę Poleć książkę

578 AVR Uk ady peryferyjne

karty pami ci 151 152 157biblioteka FATFS 180budowa 152format polecenia 158inicjalizacja 161 167komunikacja 156odczyt danych 173opcje konfiguracyjne 181rejestry specjalne 169tryby pracy 153zapis danych 176zasilanie 154

kodasemblerowy 23 24C 23dost pu 24

kodowanieμ-law 481ADPCM 483Dialogic ADPCM 494informacji 166 426koloru 425znakoacutew 536

kodyformatoacutew audio 501zdarze 545

kolejno bajtoacutew 533kolor 424 430kolorowy obraz 437komparator 422

analogowy 279 280analogowy XMEGA 282okienkowy 284

kompilacja plikoacutew binarnych 350kompilator avr-gcc 11 359kompresja

ADPCM 482 486d wi ku 480IMA ADPCM 482

komunikacja z koprocesorem 504konfiguracja

4-portowa 364biblioteki 133debugera 185DMA 459 522fusebitoacutew 570kontrolera DMA 257 452komparatoroacutew 285lockbitoacutew 570LPC 371pami ci SDRAM 381PetitFS 149pinu IO 225portoacutew IO 362

preskalera 452projektu 186przerwa 219pu apki 203rejestru EVCTRL 248rejestru PER 67SPI 75sygna u CS 377typu czcionki 324urz dze IO 189USART 76zegara 383

konsolidacja 547kontroler

DMA 254 298 402 458 518 523KS108 310ST7565R 310ndash315 321

konwersjaDAC 305sygna oacutew 396wyzwalana 306

konwertercyfrowo-analogowy 426DAC 427

koprocesormp3 496VS1003B 10

korekcja fazy 466kwantyzacja 463

Llampa CCFL 44LE Latch Enable 433licznik 419

cykli 209TCC1 400timera 20

linie IO 50linie sygna owe

MISO 72 164MOSI 72SCK 72SS 72

linker 69lista

mnemonikoacutew 24modyfikowanych rejestroacutew 32

lockbity 557 561lockbity w AVR-libc 570LPC Low Pin Count 371LPCM 443 556LSB Least Significant Bit 228

Kup książkę Poleć książkę

Skorowidz 579

a cuchy formatuj ce 212czenie plikoacutew 352

Mmagistrala pami ci zewn trznej 361magnetofon cyfrowy 528makro _SFR_IO_ADDR() 39makrodefinicja

ASSERT 214HD44780_CGADDR() 53HD44780_CLR 53HD44780_DDADDR() 53HD44780_DISPCTL() 52HD44780_ENTMODE() 52HD44780_FNSET() 52HD44780_HOME 53HD44780_SHIFT() 51LOCKBITS 571

mapowanie sygna oacutew 366mapy bitowe 343marker czasowy 268maski bitowe 329matryce 49menu 335menu piktogramowe 342mierniki temperatury 262mikrokontroler

ARM 9AVR 9PIC 9XMEGA128A3U 10

MISO 72moc wydzielana 265model psychoakustyczny 495modu

alfanumeryczny 45NVM 568Xmega eXploreGO 10Xplained ATXMEGA A3BU 10Xplained ATXMEGA-A1 10Xplained XMEGA128A1 447Xplained XMEGA256A3 94Xplained XMEGA256A3BU 97 143 266

modyfikator 30const 85volatile 28 273

monitory CRT 395monochromatyczne wy wietlacze graficzne 309monochromatyczny

tryb graficzny 416tryb tekstowy 413

MOSI 72mp3 495Msps Megasamples per second 12multiplekser wej ciowy 226 283multipleksowanie adresoacutew 368 369muzyka 439

Nnadawanie kodoacutew DTMF 540nadproacutebkowanie 258nag oacutewek kontenera wav 500nagrywanie mowy 486najmniej znacz cy bit 228napi cie

offsetu 280referencyjne 223 295zasilania 239

Oobracanie obrazu 319obraz 319

composite 426kolorowy 430wideo 391

obroacutebka d wi ku 443 445obs uga

FAT 131 143klawiatury matrycowej 24LCD 58 63 67menu 337przerwania 37 38 458przerwania DMA 525przerwa w asemblerze 39przyciskoacutew 272wy wietlaczy alfanumerycznych 45

odczytblokowy 140danych 173 358

odpowied response 159R1 159R2 159R7 160

od wie anie pami ci 376odtwarzanie

d wi ku 472muzyki 447 513 518 521

offset 238offset ADC 230okno

Breakpoints 202Call stack 209dezasemblera 210

Kup książkę Poleć książkę

580 AVR Uk ady peryferyjne

oknoIO View 207podgl du zmiennych 211wyboru czcionek 324

OLED 46opcje

kompilatora 35zapisu d wi ku 445

operacjena buforach 91odczytu 173zapisu 176zapisu strony 92

operand 29operator

ascii 41

asciz 41

byte 41

section 41opoacute nienia 13 18opoacute nienie zmienne 16optymalizacja 16 68optymalizator 26organizacja pami ci 77organizacja pami ci VRAM 316oscylator 287OSD On-Screen Display 417ostrze enie 16oszcz dzanie energii 94

Ppakiet WinAVR 48pami

CGRAM 56 57 64DataFLASH 10 77 81 113 269DDRAM 49EEPROM 111FLASH 54 124 207RAM 49SDRAM 372SRAM 63 124 329 366 371VRAM 314 317

PCLK 421PCM 443PetitFS 144 149p tla

for 13while 201

pierwsza linia obrazu 321piksel 430piktogram 342pin IO 225

plikAlloc_safeh 65DataFLASHc 83DataFLASHIOc 136definesh 50delayh 14diskioh 132 136ffh 132ffconfh 132 181hd44780h 49integerh 132ioh 30LCD_transc 61LCD-transactc 66Makefile 14Menuc 19nothingo 541outfiletxt 547 551pffh 149SPIh 104stringh 113stymulacji 191 192

pliki mp3 495elf 351fon 323o 24S 24 34binarne 350 355csv 276d wi kowe 440obiektowe 352wav 500WMA 512z czcionkami 327z danymi 349

podbijacz napi cia 315podgl d

pami ci 207stosu wywo a 209zmiennych 211znakoacutew 325

pod czeniefototranzystora 262karty SD 155LCD z kontrolerem 311modu u 50pami ci 362 369 370 373termistora 262uk adu LM35 251wyj XMEGA 398

pod wietlenieCCFL 46OLED 46

Kup książkę Poleć książkę

Skorowidz 581

podwoacutejne buforowanie 255 332 457polecenia

kasowania strony 81konfiguracyjne pami ci 82kontrolera ST7565R 315odczytu bufora 82 89odczytu pami ci 81 88SDRAM 376transferu 91

polecenieACMD41 168cd 181CID 178CMD0 165CMD8 167CSD 178date 276dir 127 181dump 276erase 276get 276HD44780_CLR 51Init 178mkdir 181

po czenieDMA ze SPI 96dwoacutech komparatoroacutew 285koprocesora mp3 497LCD z mikrokontrolerem 48wyj cia XMEGA 411XMEGA z PC 121z telewizorem 431

pomiarnapi cia zasilania 239temperatury MCU 241

port IO 30 362pozycjonowanie grafik 345poacute obraz 410precyzja pomiaroacutew 260preskaler 478preskaler ADC 243program

Atmel Data Visualizer 275Audacity 443avr-objcopy 350dataloggera 265LCD Image Converter 323makeloadingtableexe 543Realterm 127 554riffstrip 483SoX 445Tracepoint 208

programowanie sygnatury u ytkownika 566protokoacute master-slave 157

prototypy 136proacutebki d wi kowe 447proacutebkowanie

8-bitowe 300nieliniowe 480

prymitywy graficzne 330przebieg PWM 468przebiegi 289 303przechwytywanie danych 276przemiatanie wej 253przerwanie 218 254 286 403

DMA 522komparatora 286

przestrze adresowa procesora 378przesy anie

danych 498polece 498

przetaktowanie procesora 436przetwornik

ADC 221analogowo-cyfrowy 221cykliczny 222potokowy 222

przyciski 272pseudooperatory 41pu apki breakpoints 197pu apki warunkowe 205punkty ledzenia 203PWM 461 462 472

RRAS Row Address Strobe 375redukcja poboru energii 242regulacja kontrastu 321rejestr 32 34rejestr AC 50

adresu wtyczki 513BASEADDR 377CID 169CMP 251CSD 172czasu utworu 512DATA 83EVCTRL 248formatu audio 512identyfikacyjny pami ci 87INTFLAGS 252kontroli basoacutew 510kontroli g o no ci 513MUXCTRL 227OCR 168PER 67poroacutewnania 249

Kup książkę Poleć książkę

582 AVR Uk ady peryferyjne

rejestr ACSCI_CLOCKF 511stanu komparatora 287stanu pami ci 86stanu uk adu 510trybu pracy 508WINCTRL 285

rejestrydost pu do pami ci RAM 513GPIOR 502IO procesora 36mikrokontrolera 25procesora 35specjalne 94specjalne karty 169uk adu VS1003B 508

relacja rodzic ndash dziecko 336reset uk adu 534rozdzielczo

LCD 329przetwornika 231PWM 463 477

rozszerzenie HiRes 477 479roacutewnanie Steinharta-Harta 263rysowanie map bitowych 343

Sschemat uk adu dataloggera 267SCI Serial Command Interface 498SCK 72SD Secure Digital 152SDI Serial Data Interface 498separator synchronizacji 422separowanie impulsoacutew synchronizacji 422shieldy 10skaler 422skaler napi cia 283skrypt makefile 353s owo kluczowe

asm 27extern 37static 68

specyfikatory lokalizacji zmiennej 213sps samples per second 12SS Slave Select 72standard PAL 410standard VGA 393sterowanie

dataloggerem 275sygna em 379

sterownik 121HD44780 49 56LCD 49 62

stos wywo a 209

strukturaFATFS 139Handle 118LCD_trans 60 63menu 338rejestru 86SimpleFSEntry 113 116SimpleFSHandle 113 118 140submenu 527systemu plikoacutew 112

sumabitowa 571kontrolna 178

sygnacomposite 409composite video output 430CS 377DREQ 497H-Sync 396synchronizacji 423V-Sync 396zegarowy CLK 374

sygna yinterfejsu EBI 363magistrali EBI 364steruj ce 375

sygnaturaprodukcyjna procesora 563u ytkownika 565

symbol__DELAY_ROUND_CLOSEST__ 17__DELAY_ROUND_DOWN__ 17_FS_FAT12 149_FS_FAT32 149_FS_MINIMIZE 133_FS_READONLY 133_FS_RPATH 135_FS_TINY 133_MAX_SS 135_MULTI_PARTITION 135_USE_DIR 149_USE_FASTSEEK 134_USE_FORWARD 134_USE_LABEL 134_USE_LFN 134_USE_LSEEK 149_USE_MKFS 134_USE_READ 149_USE_STRFUNC 134_USE_WRITE 149_VOLUMES 136F_CPU 14 15 18increment 36USE_BUSY_FLAG 50

Kup książkę Poleć książkę

Skorowidz 583

symboleglobalne 36w asemblerze 28zewn trzne 39

symulacja 198 209symulator 190synchronizacja

pami ci 331pionowa 395pozioma 394

systemplikoacutew 111 128przerwa 404zdarze 245

szablonfont_XMEGAtmpl 326image_XMEGAtmpl 343

szum 463szybko przesy ania danych 126

ledzenie wi zki 333rodowisko

graficzne 11programistyczne 11VSIDE 542WinAVR 47

Ttabela FAT 130tablica

framebuf 402 408plugintbl 552 555tekst 208z kodem wynikowym 543

taktowanieDAC 296mikrokontrolera 473

technologia OLED 44temperatura mikrokontrolera 239 241termistor 262 290

NTC 263PTC 263

termometrLM35 249 250z alarmem 251

termostat 290test uk adu VS1003B 503testowanie obrazu 319timer 16 62

TCC0 20

TCC1 399transakcja 59 62 65transakcje 17 103ndash107transakcyjna obs uga LCD 58transakcyjny dost p do SPI 95transfer 91

danych 97wynikoacutew 254

transmisja 72 83tryb

bez znaku 234ci g ej konwersji 252czterobitowy 153dwukana owy 301graficzny 416graficzny VGA 407idle 419jednobitowy 153LPC 371monochromatyczny 397 407oszcz dzania energii 94 306pracy multipleksera 226pracy SPI 157roacute nicowy 232single slope 312SPI 153tekstowy 413tekstowy VGA 397z pojedynczym wej ciem 234ze znakiem 235

trybygenerowania PWM 467pracy karty 153pracy przetwornika 231pracy SPI 74pracy uk adu 508

twierdzenie Nyquista 258tworzenie

adresu 84nak adek 417obrazu 335tablicy 543

typ__uint24 119karty 160niekompletny 60wyliczeniowy 114

typyoperandoacutew 29w AVR 34

Kup książkę Poleć książkę

584 AVR Uk ady peryferyjne

Uuchwyt handle 64 113uk ad

AD725 427 431buforowy 294CS 361DAC 284dataloggera 267detekcji awarii zasilania 559generuj cy obraz 393HiRes 477ICL7660 47LM35 250 251SampH 293sterowania sygna em 379USART 401VS1003B 496 503 508 530 538 556VS100XX 529wzmacniania sygna u 227

uk ady peryferyjne 9uruchomienie komparatora 287urz dzenie

master 72slave 72

u rednianie 259utrata danych 141u ycie wstawki asemblerowej 33

VVGA 393

Wwarto ci kalibracyjne

ADC 564oscylatoroacutew 564temperatury 564

warunkowa kompilacja 36WE Write Enable 375wej cie composite video input 425wektor przerwa 38 257wideo 391wielko pami ci 86 377w czenie DAC 299wska nik na struktur 27wska niki 32wstawki asemblerowe 24 33wtyczka 535 541 544

SineDTMF Generator 537VGA 396

wyboacuter cz stotliwo ci PWM 465 474wykorzystanie

DMA 254 518

EuroSCART 428PWM 461rejestroacutew 34

wyliczanie predyktora 489wy wietlacze

alfanumeryczne 43 45graficzne 43 309LCD 43OLED 46

wy wietlanielitera u 213map bitowych 344obrazu 333 346 406obrazu VGA 393

wywo ania zwrotne callbacks 98asynchroniczne 101synchroniczne 101

wyzwalanie konwersji 245wzmacniacz 446wzmacniacz operacyjny 279wzmacnianie sygna u 227

XXMEGA 9 18

Zzapis

bufora 269danych 176d wi ku 440 556

zasilaniekarty 154pami ci 109

zatrzask 368zatrzask 74HC573 433zatrza ni cie adresu 369zdarzenia 297zdarzenie compare match 399zegar 383 420 426zintegrowane rodowisko programistyczne 11z cze EuroSCART 425 428 429zmiana

g o no ci 527wielko ci strony 94

znaki 56

roacuted onapi cia odniesienia 284sygna u 240

Kup książkę Poleć książkę

Page 19: Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8 AVR. Ukäady peryferyjne Rejestry dost pu do pami ci RAM .....513 Rejestr adresu

54 AVR Uk ady peryferyjne

operacji dalsze polecenia s ignorowane Jako argument podany jest parametr 1000mdash jest on bez znaczenia nasza biblioteka korzysta z flagi Busy i po prostu go ignorujePo wykonaniu powy szej funkcji modu LCD jest poprawnie zainicjalizowany a jegopami jest wyczyszczona (zawiera bajty 0x20) i w efekcie modu nic nie wy wietlaOd tej chwili mo emy wysy a znaki do wy wietlenia

Po wykonaniu inicjalizacji ekran mo e pozosta czysty lub wy wietla ca kowiciewype nione kwadraty (wszystkie piksele w czone) Je li po inicjalizacji wszystkiepiksele s w czone nale y nieco zmniejszy kontrast

Aby sobie u atwi to zadanie zdefiniujmy funkcj wysy aj c do modu u jeden znakvoid lcd_putchar(char c) static bool second_nl_seen static uint8_t line=0

if ((second_nl_seen) ampamp (c = n)ampamp(line==0)) Odebrano pierwszy znak hd44780_wait_ready(40) hd44780_outcmd(HD44780_CLR) hd44780_wait_ready(1600) second_nl_seen=false if (c == n) if (line==0) line++ hd44780_outcmd(HD44780_DDADDR(64)) Adres pierwszego znaku drugiej linii hd44780_wait_ready(1000) else second_nl_seen=true line=0 else hd44780_outdata(c) hd44780_wait_ready(40)

Funkcja ta ze wzgl du na skomplikowane adresowanie pami ci DDRAM jest zale naod konkretnego modelu modu u LCD B dzie prawid owo wspoacute pracowa z modu a-mi 2times16 2times20 i 2times40 znakoacutew W przypadku innych modu oacutew pozycje niektoacuterychznakoacutew mog by nieprawid owe

Mo emy ju wy wietla na LCD pojedyncze znaki czas na wy wietlanie tekstu Po-niewa teksty jako sta e dla zaoszcz dzenia cennej pami ci RAM przechowuje si za-zwyczaj w pami ci FLASH zdefiniujmy funkcj odczytuj c podany a cuch zna-kowy z pami ci FLASH a nast pnie umieszczaj c go na LCD

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 55

void lcd_puttext_P(prog_char txt) char ch while((ch=pgm_read_byte(txt))) lcd_putchar(ch) txt++

Powy sza funkcja wysy a kolejne znaki odczytane z pami ci FLASH na LCD za po-moc funkcji LCD_putchar Po napotkaniu znaku ko ca a cucha (0 nul) przerywa swojedzia anie

Pozostaje nam przetestowa dzia anie przedstawionych funkcjiint main() lcd_init() lcd_puttext_P(PSTR(Test LCDnDruga linia)) while(1)

Na ekranie modu u LCD powinien wy wietli si napisTest LCDDruga linia

Je li na LCD nic nie widzimy to w pierwszej kolejno ci powinni my sprawdzi kon-trast zmieniaj c napi cie na pinie Vee modu u LCD

Warto zdefiniowa jeszcze funkcj ustawiaj c pozycj od ktoacuterej b dzie wy wietlanynast pny znak

void lcd_goto(uint8_t x uint8_t y) hd44780_outcmd(HD44780_DDADDR(0x40y+x)) hd44780_wait_ready(1000)

Funkcja ta przyjmuje dwa parametry x i y okre laj ce pozycj na ktoacuterej zostaniewy wietlony nast pny znak wys any z mikrokontrolera do modu u LCD Dzi ki temuz atwo ci mo emy uaktualnia zawarto LCD bez konieczno ci ponownego prze-sy ania wszystkich danych Funkcja ta jest zale na od typu zastosowanego modu u

Ostatni funkcj jest funkcja umo liwiaj ca czyszczenie zawarto ci pami ci modu uOdpowiedzialne za to jest proste polecenie wysy ane do sterownika

void lcd_cls() hd44780_outcmd(HD44780_CLR) hd44780_wait_ready(false)

Oproacutecz czyszczenia zawarto ci pami ci modu u powoduje ono ustawienie kursoraw punkcie (00)

Kup książkę Poleć książkę

56 AVR Uk ady peryferyjne

Definiowanie w asnych znakoacutewUk ad HD44780 jest wyposa ony w 64 bajty pami ci CGRAM (ang Character Ge-nerator RAM) ktoacutera mo e przechowywa mapy bitowe 8 znakoacutew o matrycy 5times8 pikselilub 4 znakoacutew o matrycy 5times10 pikseli Przyk ad definicji znaku na matrycy 5times8 poka-zano na rysunku 223

Rysunek 223Przyk ad definicji w asnego znakuw pami ci CGRAM Znak rysujemyna matrycy 5times8 bitoacutew polazaciemnione odpowiadaj warto ci 1pola bia e warto ci 0 Wartowyliczon dla ka dej linii pikseliwpisujemy do pami ci CGRAMsterownika Najstarsze 3 bity ka degobajta (pola szare) s bez znaczeniamdash wy wietlacz pomija jeprzy wy wietlaniu obrazu

1

2

3

4

5

6

7

0 00100 = 4

01110 = 14

11111 = 31

00100 = 4

00100 = 4

00100 = 4

11111 = 31

01110 = 14

Adres Warto

Dost p do tej pami ci jest mo liwy dzi ki wys aniu polecenia ustawiaj cego adreszapisuodczytu pami ci CGRAM Po jego wys aniu wszystkie operacje zapisu i od-czytu dotycz tej pami ci a nie pami ci DDRAM Aby wroacuteci do adresowania pa-mi ci DDRAM nale y wybra jej adres lub dokona operacji wymagaj cej przesu-ni cia kursora

Pami CGRAM jest pami ci ulotn po ponownym w czeniu zasilania definicjeznakoacutew musz by ponownie przes ane przez procesor

Bity o warto ci 1 w definicji znaku odpowiadaj w czonym pikselom bity o warto-ci 0 pikselom wy czonym Najstarsze 3 bity ka dego bajta w pami ci CGRAM s

bez znaczenia mdash te pozycje nie s wy wietlane przez matryc Definiuj c znak nale-y tak e pami ta e ostatnia linia wy wietlana przez matryc (w zale no ci od wiel-

ko ci matrycy znaku linia 8 lub 10) powinna zawiera same zera mdash w tej linii b dziewy wietlany kursor

Najcz ciej matryce LCD pod czone do sterownika HD44780 maj organizacj 5times8czyli jeden znak jest definiowany przez 8 kolejnych bajtoacutew okre laj cych stan po-szczegoacutelnych linii tworz cych znak Stwoacuterzmy funkcj ktoacuterej zadaniem b dzie za a-dowanie definicji znakoacutew z pami ci FLASH mikrokontrolera do pami ci CGRAM

void lcd_defchar_P(uint8_t charno prog_uint8_t chardef) hd44780_outcmd(HD44780_CGADDR(charno8)) hd44780_wait_ready(40) for(uint8_t c=0clt8c++) hd44780_outdata(pgm_read_byte(chardef))

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 57

hd44780_wait_ready(40) chardef++

Funkcja LCD_defchar_P jako argumenty przyjmuje numer definiowanego znaku (0 ndash 7)oraz wska nik do obszaru pami ci FLASH zawieraj cego definicj znaku (obszarten zajmuje 8 nast puj cych po sobie bajtoacutew) Jak widzimy funkcja najpierw ustawiaw a ciwy adres pod ktoacuterym znajdzie si pocz tek definicji znaku w pami ci CGRAMmdash poniewa jeden znak jest opisywany za pomoc 8 bajtoacutew kolejne adresy znakoacutewto kod_znakutimes8 Nast pnie dane opisuj ce znak s adowane z pami ci mikrokontrolerai zapisywane w pami ci CGRAM sterownika Poni szy program ilustruje wykorzy-stanie funkcji LCD_defchar_P

prog_uint8_t char1[8][8]=0000000255 00000025525500000255255255 0000255255255255 00025525525525525500255255255255255255 0255255255255255255255255255255255255255255255

int main() for(uint8_t x=0xlt8x++) lcd_defchar_P(xampchar1[x][0]) Za aduj wzorce znakoacutew lcd_init() for(uint8_t x=0xlt8x++) lcd_putchar(x) Wy wietl znaki o kodach 0 ndash 7 while(1)

W pierwszej linii funkcji main nast puje za adowanie nowych definicji znakoacutew dopami ci CGRAM nast pnie inicjalizowany jest wy wietlacz po czym w pierwszejlinii s wy wietlane znaki o kodach 0 ndash 7 a wi c znaki ktoacuterych definicja zosta aprzes ana z mikrokontrolera

Zauwa e pami CGRAM podobnie jak DDRAM mo emy zapisywa i odczytywaprzed inicjalizacj modu u LCD Proces inicjalizacji jest potrzebny tylko do prawi-d owego wy wietlania na ekranie LCD

Poniewa dane potrzebne do wy wietlenia znaku s na bie co pobierane z pami cipodczas od wie ania matrycy LCD jakiekolwiek zmiany w definicji znaku kiedy jest onwidoczny na LCD poci gaj za sob natychmiastowe zmiany w wy wietlanym obrazieMo na t w a ciwo sterownika wykorzysta do stworzenia prostych animacji

void lcd_box(uint8_t y) hd44780_outcmd(HD44780_CGADDR(0)) Zaczynamy od znaku o kodzie 0 hd44780_wait_ready(40) for(uint8_t c=0cltyc++) Stwoacuterz linie z w czonymi pikselami hd44780_outdata(0xFF) hd44780_wait_ready(40) for(uint8_t c=yclt8c++) Stwoacuterz linie z wy czonymi pikselami hd44780_outdata(0x00) hd44780_wait_ready(40)

Kup książkę Poleć książkę

58 AVR Uk ady peryferyjne

int main() lcd_init() lcd_putchar(0) while(1) for(uint8_t x=0xlt8x++) lcd_box(x) _delay_ms(100) for(int8_t x=7xgt=0x--) lcd_box(x) _delay_ms(100)

Funkcja main wy wietla na LCD tylko jeden znak o kodzie 0 a nast pnie cykliczniezmienia jego definicj w pami ci CGRAM W efekcie posta znaku wy wietlana naekranie ci gle si zmienia

Transakcyjna obs uga LCDPokazana do tej pory obs uga LCD alfanumerycznego mia a pewne wady Jak wiemyoperacje odwo uj ce si do kontrolera LCD s niezwykle wolne cykl odczytuzapisudowolnego rejestru kontrolera trwa co najmniej 1600 ns co dla MCU taktowanegozegarem 32 MHz przek ada si na czas wykonania oko o 52 instrukcji asemblera Cogorsza wi kszo komend realizowanych przez kontroler jest wykonywana w czasieoko o 37 s co przek ada si na tysi ce zmarnowanych taktoacutew MCU St d te jaki-kolwiek zapisodczyt LCD to z perspektywy programu straszne marnotrawstwo czasu

Problem ten dotyczy ka dego urz dzenia IO ktoacutere dzia a wolniej ni procesor W takiejsytuacji warto napisa pewn warstw po redni mdash sterownik mdash ktoacuterego zada-niem b dzie buforowanie da dost pu do urz dzenia i rozstrzyganie konfliktoacutewdzi ki czemu roacute ne cz ci programu b d bdquomia y wra enierdquo e maj wy czny do-st p do urz dzenia

Pokazane wcze niej funkcje obs ugi LCD maj jeszcze jedn wad mdash nie s wspoacute bie -ne czyli nie mo na ich wykonywa jednocze nie w kilku miejscach programu w tymw szczegoacutelno ci w programie g oacutewnym i w funkcjach obs ugi przerwa W wielu przy-padkach ta wada jest bez znaczenia jednak czasami jest uci liwa mdash dla przyk adugdy na wy wietlany tekst chcieliby my na o y inne informacje np o dacie lub godzi-nie Oczywi cie wy wietlanie mo na zorganizowa tak aby nie by o potrzeby pisaniawspoacute bie nego kodu np poprzez zastosowanie bufora pami ci VRAM kontrolera LCDRodzi to jednak kolejne problemy i jest ma o eleganckie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 59

Zastanoacutewmy si w jaki sposoacuteb najlepiej jednocze nie rozwi za problem wolnegodost pu do urz dzenia i wspoacute bie no ci kodu Rozwi zaniem mo e by wprowadze-nie tzw transakcji Transakcj nazywamy zbioacuter operacji tworz cych pewn ca-o To co wyroacute nia tak wykonywany zestaw operacji to atomowo spoacutejno

izolacja i trwa o Pod tymi terminami kryje si istota wykonywanej operacji Ato-mowo transakcji zapewnia e jest ona wykonywana w sposoacuteb niepodzielny co gwa-rantuje nam prawid ow wspoacute prac z danym urz dzeniem IO w tym przypadku kon-trolerem LCD Wa na dla nas jest tak e izolacja mdash dzi ki temu inne operacje na LCD(inne transakcje) nie b d mia y wp ywu na wynik aktualnie wykonywanej transakcjimdash nie b d zak oacuteca y jej wykonania z drugiej strony nasza transakcja nie zak oacuteciwykonania innych Trwa o z kolei zagwarantuje nam e je li sterownik potwierdziwykonanie transakcji to znaczy e efekt jej dzia ania jest wy wietlony na LCD Tacecha nie jest nam a tak potrzebna mdash jest ona wydawa oby si oczywista Niemniej jestto pewna gwarancja e ca a operacja przebieg a poprawnie i w efekcie LCD znajdujesi w okre lonym przez nas stanie Tyle teorii przejd my do praktyki

Kody poni szego przyk adu znajduj si w katalogu PrzykladyLCD-alfaLCD-transact

Aby zapewni transakcyjny dost p do LCD musimy stworzy pewne struktury danychktoacuterych zadaniem b dzie przechowywanie informacji o operacjach sk adaj cych sina transakcje i stanie ich wykonania W tym celu pos u ymy si wiadomo ciami z roz-dzia u 5 bdquoJak uporz dkowa chaos czyli z o one typy danych i listyrdquo Do przecho-wywania oczekuj cych transakcji pos u ymy si buforem pier cieniowym zanimjednak go zaimplementujemy zastanoacutewmy si jak powinna wygl da struktura prze-chowuj ca informacje o transakcji Struktura ta powinna zawiera co najmniej

pole danych (data) z informacjami ktoacutere maj by przes ane do kontrolera LCD

pole okre laj ce liczb danych do wys ania (len)

pole okre laj ce realizowane polecenie dla LCD (cmd) mdash pole to pos u yprogramowi sterownika do w a ciwej interpretacji danych znajduj cych siw polu data

kilka poacutel kontrolnych przechowuj cych informacje potrzebne do realizacjisamej transakcji Jedno z nich mdash Ready mdash b dzie przyjmowa warto trueje li dana transakcja zosta a zrealizowana lub false w przeciwnym przypadkuZnaczenie drugiego pola mdash SelfDel mdash mo e wydawa si nieco enigmatycznepole to okre la czy pami przydzielona dla transakcji ma by zwolnionaw sterowniku LCD (warto true) czy te zostanie zwolniona w programie(warto false)

Oto jak mo e wygl da struktura definiuj ca transakcj typedef struct volatile bool Ready 1 true je li transakcja zosta a zrealizowana bool SelfDel 1 true je li pami przydzielona transakcji ma zosta zwolniona LCD_Cmd cmd 2 Polecenie do zrealizowania uint8_t len 6 D ugo polecenia

Kup książkę Poleć książkę

60 AVR Uk ady peryferyjne

unsigned 0 Wyroacutewnanie do granicy bajta uint8_t data[] Dane transakcji LCD_trans

Nale y zwroacuteci uwag na poleunsigned 0

Nie definiuje ono adnego pola struktury ale jedynie informuje kompilator e kolejnepole (w naszym przyk adzie o nazwie data) ma by wyroacutewnane do granicy bajta mdashdzi ki temu dost p do kolejnego pola b dzie odbywa si szybciej Z kolei samo poledata jest zadeklarowane jako tzw typ niekompletny

Typ niekompletny (ang incomplete type) to typ ktoacuterego rozmiaru nie da si okre li

W pokazanym przyk adzie rozmiaru pola data nie da si okre li gdy zosta on za-deklarowany jako typ tablicowy z tym e nie podano wielko ci tablicy Wielko ci niepodano gdy na etapie deklaracji struktury nie wiemy jakiej wielko ci dane b d w niejprzechowywane Tego typu deklaracja ma bardzo powa ne konsekwencje mdash skorowielko ci pola data nie da si okre li to jaki b dzie wynik dzia ania operatora sizeof(LCD_trans) Kompilator stara si jako wybrn z tej sytuacji w zwi zku z czym

zwroacuteci wielko struktury ale tak jakby pole data w ogoacutele nie istnia o mdash jego roz-miar b dzie wynosi 0 W ramach wiczenia zastanoacutew si ile bajtoacutew pami ci b dziezajmowa a struktura LCD_trans

Skoro dysponujemy ju struktur przechowuj c poszczegoacutelne transakcje pora nastworzenie obiektu przechowuj cego kolekcj transakcji Dodanie kolejnej strukturyb dzie polega o na dodaniu jej do takiego obiektu z drugiej strony program sterownikaLCD b dzie moacuteg z tej kolekcji pobiera kolejne transakcje do realizacji Opis ten przy-pomina opis dzia ania bufora pier cieniowego mdash z jednym wyj tkiem mdash po zape nie-niu ca ego bufora nie b dziemy usuwa niezrealizowanych transakcji lecz zabloku-jemy dodawanie kolejnych W tym celu pos u ymy si definicj nast pnej struktury

typedef struct LCD_trans elements[LCD_MAXTRANS] Wska niki do transakcji uint8_t Beg Pierwszy element bufora uint8_t Count Liczba elementoacutew w buforze CircBuffer

Struktura ta zawiera deklaracj tablicy wska nikoacutew na transakcje (pole elements)Poniewa jest to tablica musimy zna liczb jej elementoacutew mdash jest ona zadeklarowanaw sta ej LCD_MAXTRANS

define LCD_MAXTRANS 10 Maksymalna liczba pami tanych transakcji

Do realizacji bufora s potrzebne jeszcze dwa pola Beg wskazuj ce na pierwsztransakcj w buforze oraz pole Count okre laj ce liczb transakcji znajduj cych siw buforze Je li Count == 0 to znaczy e w buforze nie ma adnych oczekuj cychtransakcji a je li Count == LCD_MAXTRANS to znaczy e bufor jest pe ny i nie mo na

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 61

dodawa do niego kolejnych transakcji W a ciwo t wykorzystuj dwie zdefiniowanew pliku LCD_transc funkcje

static inline bool cbIsFull(CircBuffer cb) return cb-gtCount == LCD_MAXTRANS

static inline bool cbIsEmpty(CircBuffer cb) return cb-gtCount == 0

Jak pami tamy w przypadku funkcji modyfikatory static inline powoduj e danafunkcja nie b dzie istnie jako samodzielna lecz w ka dym miejscu w ktoacuterym jestwywo ywana jest wstawiany raczej jej kod a nie wywo anie Ma to znaczenie dlakroacutetkich funkcji (a wi c takich jak pokazane powy ej) dla ktoacuterych koszty wywo anias zazwyczaj wi ksze ni koszty umieszczenia cia a funkcji w miejscu jej wywo aniaTego typu funkcje zachowuj si w sposoacuteb zbli ony do makrodefinicji (z tym e re-spektuj wszystkie regu y j zyka C w szczegoacutelno ci kolejno operatoroacutew czy kon-trol typoacutew)

Takie funkcje jako argument pobieraj adres bufora na ktoacuterym maj operowa W na-szym przypadku bufor jest zdefiniowany nast puj co

static CircBuffer LCD_TransBuffer Bufor na transakcje

Nale y zauwa y e jest on zdefiniowany jako struktura globalna z modyfikatoremstatic Modyfikator ten ogranicza zasi g widoczno ci zmiennej LCD_TransBuffer dopliku w ktoacuterym zmienna ta zosta a zdefiniowana (w tym przypadku modyfikator staticjest niejako przeciwie stwem modyfikatora extern) Dzia anie to ma jedynie znaczeniekosmetyczne mdash uniemo liwia odwo anie si do bufora za pomoc funkcji ktoacutere niezosta y zdefiniowane w miejscu jego definicji Oproacutecz funkcji umo liwiaj cych okre-lenie stanu bufora potrzebne s jeszcze funkcje umo liwiaj ce dodanie i pobranie trans-

akcji Pierwsz funkcj b dzie funkcja dodaj ca transakcj do buforabool cbAdd(CircBuffer cb LCD_trans elem) ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsFull(cb)) return false Czy jest miejsce w kolejce uint8_t end = (cb-gtBeg + cb-gtCount) LCD_MAXTRANS cb-gtelements[end] = elem Dodaj transakcj ++cb-gtCount Liczba elementoacutew w buforze return true Wszystko OK

Funkcja ta dodaje transakcj (zmienna elem) do bufora ko owego Zanim transakcjazostanie dodana sprawdzane jest czy w buforze jest miejsce mdash je li nie funkcjazwroacuteci false Je li dodanie jest mo liwe warto licznika okre laj cego liczb trans-akcji przechowywana w buforze (Count) zwi ksza si o jeden Warto zastanowi si te dlaczego praktycznie ca e cia o tej funkcji jest zamkni te w sekcji atomowej (ATOMIC_BLOCK) Jedn z cech naszego sterownika ma by mo liwo wspoacute bie nego dost pu

Kup książkę Poleć książkę

62 AVR Uk ady peryferyjne

do LCD mdash to znaczy e danie np zapisu do LCD mo e wyst pi zaroacutewno w g oacutewnejp tli programu jak i asynchronicznie w przerwaniu St d te wynika e funkcja do-daj ca transakcj musi by napisana w sposoacuteb zapewniaj cy jej poprawn prac w sytu-acji gdy zostanie ona przerwana i ponownie wywo ana przed zako czeniem dzia aniajej poprzedniej instancji Umieszczenie cia a tej funkcji w sekcji atomowej nam to za-pewnia mdash dzi ki temu bufor transakcji zawsze b dzie spoacutejny Dla zaspokojenia cie-kawo ci warto usun sekcj atomow i sprawdzi jak wtedy b dzie zachowywa si tafunkcja i jak wp ynie to na spoacutejno przechowywanych danych

Drug niezb dn funkcj jest funkcja odczytuj ca bufor transakcji i zwracaj ca trans-akcj do zrealizowania (lub NULL je li adnej transakcji nie ma w buforze)

LCD_trans cbRead(CircBuffer cb) LCD_trans elem ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsEmpty(cb)) return NULL Bufor pusty nie mo na zwroacuteci elementu elem = cb-gtelements[cb-gtBeg] cb-gtBeg = (cb-gtBeg + 1) LCD_MAXTRANS -- cb-gtCount Zmniejszamy liczb elementoacutew pozosta ych w buforze return elem

Funkcja ta jest bardzo podobna do poprzedniej mdash najpierw sprawdza czy bufor za-wiera jak oczekuj c transakcj (cbIsEmpty(cb)) je li tak to zwraca adres opisuj -cej j struktury i zmniejsza liczb transakcji oczekuj cych (pole Count) W ten sposoacutebmamy zrealizowan ca funkcjonalno zwi zan z obs ug bufora pier cieniowegoPokazane funkcje s uniwersalne i z bardzo podobnych (lub wr cz tych samych) b -dziemy korzysta w kolejnych rozdzia ach w kontek cie np obs ugi transakcji zwi -zanych z interfejsami szeregowymi

Pora przej do samego sterownika LCD Jego zadaniem b dzie sprawdzenie czyw buforze oczekuj jakie transakcje do realizacji a je li tak to ich wykonanie Ponie-wa dane do LCD mog by wysy ane co okre lony minimalny czas znacznie d u -szy ni czas jakiego na to zadanie potrzebuje mikrokontroler do wysy ania kolejnychpaczek danych pos u ymy si timerem Timer b dzie generowa przerwanie nadmiaru(TCD0_OVF_vect) ktoacutere b dzie wyznacza o tempo w jakim kolejne porcje danych b -d trafia y do LCD Z noty katalogowej kontrolera wynika e minimalny czas trwa-nia wysokiego stanu sygna u Enable to 230 ns a okres tego sygna u nie powinien bykroacutetszy ni 500 ns Poniewa nasz dost p do LCD odbywa si w sposoacuteb nieblokuj cyMCU wi c szybko wysy ania danych do LCD jest bez znaczenia St d te w poka-zanym przyk adzie przyj to e dane b d wysy ane co 4 s co okre la sta a

define LCD_ACCESSTIME 0000004

Poniewa komunikacja z LCD odbywa si w sposoacuteb nieblokuj cy nie zale y nam tena czasie (i tak w stosunku do czasu od wie ania samego LCD jest on bardzo kroacutetki)w efekcie nie ma potrzeby odczytywania flagi busy kontrolera Dzi ki temu w cz ciprzypadkoacutew mo emy w ogoacutele zrezygnowa z sygna u wyboru RW i wymusi jego sta y

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 63

poziom logiczny umo liwiaj cy zapis do LCD Dzi ki temu mo na zaoszcz dzi do-datkowy pin IO1

Ca a logika naszego sterownika jest zawarta w funkcji obs ugi przerwania przepe nieniatimera (TCD0_OVF_vect) Poniewa LCD jest po czony z MCU w trybie 4-bitowym(dla zaoszcz dzenia liczby wykorzystanych pinoacutew IO) kolejne 8-bitowe dane muszby podzielone na dwie tetrady i wys ane do LCD w kolejno ci starszam odsza tetradaInformacja o aktualnie wysy anych danych jest umieszczona w zmiennej trans o typie

static struct uint8_t pos 6 Pozycja w polu danych aktualnej transakcji uint8_t nibble 1 Ktoacutera tetrada jest wysy ana seq

Dlaczego tak Dzi ki wykorzystaniu struktury i poacutel bitowych mo na zaoszcz dzi je-den bajt pami ci SRAM Ze wzgl du na wielko pami ci obs ugiwanej przez kon-troler LCD mo emy by pewni e transakcje zawieraj ce wi cej ni 63 bajty s ra-czej nierealne (nie mia yby wi kszego sensu) St d te do przechowywania informacjio aktualnie wysy anym bajcie danych wystarczy 6 bitoacutew mdash tyle samo zosta o wyko-rzystanych do okre lenia d ugo ci pola danych transakcji w strukturze LCD_trans Zaosz-cz dzony bit mo na po wi ci na flag nibble okre laj c ktoacutera tetrada (m odszastarsza)jest wysy ana Bez poacutel bitowych flaga ta zaj aby dodatkowy bajt pami ci

Przejd my do implementacji sterownika Pierwsz rzecz jak nale y sprawdzi jestto czy w buforze czeka jaka transakcja do zrealizowania Odpowiedzialny za to jestfragment kodu obs ugi przerwania nadmiaru timera

if(trans == NULL) Nic do zrobienia sprawd my czy jaka transakcja oczekuje trans=cbRead(ampLCD_TransBuffer) Czy jest jaka oczekuj ca transakcja seqpos=0 seqnibble=0 if(trans == NULL) TCD0_CTRLA=TC_CLKSEL_OFF_gc Nie ma adnych transakcji mdash wy cz timer

W przypadku gdy adna transakcja nie oczekuje na realizacj timer jest wy czanymdash dzi ki temu nie b d zg aszane kolejne przerwania przepe nienia i MCU nie b -dzie traci czasu na ich obs ug Co prawda wynikaj cy z tego zysk czasowy jest mar-ginalny lecz ma to istotniejsz konsekwencj mdash w przypadku usypiania MCU zb d-ne przerwanie timera nie b dzie niepotrzebnie wybudza o procesora W takiej sytuacjiponowne w czenie timera nast pi dopiero w funkcji dodaj cej transakcj do kolejkimdash a wi c w sytuacji gdy mamy pewno e istnieje oczekuj ca transakcja

Druga cz funkcji obs ugi przerwania jest zwi zana z realizacj samej transakcjiW pokazanym przyk adzie zaimplementowano tylko jeden typ transakcji mdash daniezapisu a cucha tekstowego pod wskazany adres VRAM (na okre lonej pozycji LCD)Je li zajdzie taka potrzeba programista mo e zaimplementowa inne polecenia i doda

1 Warto zauwa y e w bdquoklasycznejrdquo obs udze LCD te nie musimy czyta stanu flagi busy zamiast tego

wystarczy wprowadza p tle opoacute niaj ce Jednak poniewa taka obs uga blokuje MCU nie jest onazalecana Wady tej nie ma dost p transakcyjny co jest jego dodatkow zalet

Kup książkę Poleć książkę

64 AVR Uk ady peryferyjne

kod odpowiedzialny za ich obs ug Zauwa my e ka da transakcja musi zawieraadres pocz tku pami ci wideo od ktoacuterego b dzie zapisywany tekst Dzieje si takdlatego e transakcja wykonana wcze niej mo e ustawi wska nik zapisu na dowolnejkomoacuterce pami ci W efekcie tekst z kolejnej transakcji by by wy wietlany od komoacuterkina ktoacuterej zako czy si zapis poprzedniej transakcji Takie dzia anie oczywi cie jestniedopuszczalne st d te ka dy zapis do pami ci wideo poprzedza ustawienie rejestruindeksowego Problem ten mo na rozwi za tak e w inny sposoacuteb mdash poprzez wpro-wadzenie tzw uchwytoacutew (ang handlers) ktoacutere zawiera yby stan kontrolera LCDNiemniej to rozwi zanie dodatkowo komplikowa oby nasz sterownik Struktura danych(zawartych w polu data) ma wi c nast puj cy format

bajt nr 0 zawiera warto pozycji od ktoacuterej nale y dokonywa zapisu pami ciwideo mdash jest to warto przesy ana do rejestru okre laj cego adres zapisu

kolejne bajty zawieraj a cuch znakowy ktoacutery nale y umie ci w pami ciCGRAM

Poniewa bajt nr 0 zawsze zawiera warto wpisywan do rejestroacutew steruj cych kon-trolera podczas jego wysy ania jest ustawiana linia RS sygnalizuj ca zapis do rejestruPodczas wysy ania kolejnych bajtoacutew linia ta jest zerowana w zwi zku z czym zapisodbywa si do pami ci CGRAM

Kod obs uguj cy transakcj wygl da nast puj coif(trans) Jest transakcja do zrealizowania uint8_t dat=trans-gtdata[seqpos] if(seqnibble == 0) datgtgt=4 To trzeba zmieni je li linie danych nie s po czone z pinami 0 ndash 3 portu IO hd44780_outnibble_nowait(dat amp 0x0F seqpos = 0) Zapisujemy rejestr steruj cy lub dane ++seqnibble if(seqnibble == 0) ++seqpos Co drug tetrad zwi kszamy pozycj bufora if(seqpos gt= trans-gtlen) trans-gtReady=true Koniec transakcji if(trans-gtSelfDel) free_re(trans) Zwolnij pami transakcji je li tak sobie yczy programista trans=NULL Koniec transakcji CLR(OUT HD44780_E)

Ta cz przerwania wysy a kolejne tetrady do kontrolera LCD Warto zastanowi sinad dzia aniem sekwencji

++seqnibble

Poniewa pole nibble jest jednobitowe operacja inkrementacji prowadzi do zmianystanu tego pola na przeciwny (pole to ma warto 0 lub 1) Kiedy zostan wys anewszystkie dane przeznaczone dla kontrolera obs uga transakcji ko czy si Stan tensygnalizuje nadanie warto ci true polu Ready struktury LCD_trans Dzi ki temu pro-gram mo e sprawdzi asynchronicznie w stosunku do przerwania kiedy transakcjauleg a zako czeniu Opcjonalnie jest wykonywana jeszcze jedna funkcja mdash je li poleSelfDel ma warto true to pami zarezerwowana na transakcj jest automatycznie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 65

zwalniana W tym celu wykorzystuje si funkcj free_re ktoacuterej prototyp jest zade-klarowany w pliku Alloc_safeh Funkcja ta wywo uje funkcj biblioteczn free ktoacute-ra zwalnia pami przydzielon dynamicznie na stercie Poniewa funkcja ta nie jestfunkcj reentrant nale y stworzy odpowiedni bdquoprotez rdquo opakowuj c j w blokatomowy co zapewnia e nie zostanie ona ponownie wywo ana zanim jej poprzed-nia instancja nie zako czy dzia ania Oczywi cie lepszym rozwi zaniem by oby napi-sanie w asnych funkcji dynamicznej alokacji pami ci ktoacutere b d reentrant

Bardzo wa ne jest aby pole SelfDel mia o warto true wy cznie dla transakcjidla ktoacuterych pami zosta a przydzielona dynamicznie funkcj malloc (lub jej po-chodnymi) W pozosta ych przypadkach pole to musi mie warto false mdash nie-stosowanie si do tej regu y spowoduje b d mened era pami ci i najprawdopo-dobniej nieprzewidywalne dzia anie programu

Drug wa n zasad jest aby zmienna zawieraj ca dane transakcji nie by azmienn automatyczn mdash zmienne takie s automatycznie niszczone po opusz-czeniu zawieraj cej je funkcji W rezultacie obszar pami ci zawieraj cy danetransakcji mo e zosta wykorzystany przez inne zmienne co spowoduje uszkodzeniezawartych w nim danych

Pami przydzielona transakcji musi by alokowana w sposoacuteb dynamiczny (funkcjamalloc_re) ewentualnie mo e to by pami alokowana dla zmiennej globalnej lubstatycznej mdash zmienne tego typu istniej przez ca y czas ycia programu

Warto te zauwa y e instrukcje steruj ce stanem linii Enable kontrolera LCD(SET(OUT HD44780_E) i CLR(OUT HD44780_E)) s rozdzielone wieloma innymi in-strukcjami Dzi ki temu generowany impuls dodatni tego sygna u ma czas trwania gt230 ns wymagany w specyfikacji kontrolera Nawet dla XMEGA taktowanej zegarem32 MHz 230 ns przek ada si na oko o 7 instrukcji asemblera mdash czas jaki z pewno-ci up ynie pomi dzy wykonaniem obu powy szych instrukcji steruj cych

Do wysy ania danych do kontrolera zosta a wykorzystana nieco zmodyfikowanafunkcja hd44780_outnibble_nowait roacute ni ca si od jej protoplasty hd44780_outnibbletylko tym e nie czeka na sygna braku zaj to ci mikrokontrolera (nie realizuje teopoacute nie ) Nie jest to potrzebne gdy kolejne tetrady s wysy ane w odst pach cza-sowych okre lanych przez timer

Mamy wi c zapewnion obs ug transakcji i mo liwo transakcyjnego wy wietlaniadanych na LCD musimy jeszcze mie funkcj ktoacutera tworzy odpowiednie transakcjemdash jest odpowiednikiem funkcji bezpo rednio wysy aj cej dane znakowe do LCDOdpowiednikiem tym jest pokazana poni ej funkcja

bool LCD_PutText_B(uint8_t x uint8_t y char txt LCD_trans buf bool autodel) buf-gtcmd=LCD_Text buf-gtReady=false buf-gtSelfDel=autodel Czy zwolni pami po zako czeniu transakcji buf-gtdata[0]=HD44780_DDADDR(x+y0x40) Ustaw adres w DDRAM strcpy((char)ampbuf-gtdata[1] txt) Skopiuj dane tekstowe + NULL

Kup książkę Poleć książkę

66 AVR Uk ady peryferyjne

buf-gtlen=strlen(txt) + 1 D ugo tekstu + pozycji + NULL ndash 1 bool ret=cbAdd(ampLCD_TransBuffer buf) if((ret==false) ampamp (autodel)) free_re(buf) Brak miejsca w kolejce else TCD0_CTRLA=TC_CLKSEL_DIV1_gc Preskaler 1 mdash odblokuj timer return ret

Funkcja ta buduje transakcj odpowiedzialn za wy wietlenie napisu txt na wskaza-nej pozycji x y LCD Wszystkie dane o transakcji zostan umieszczone w buforzew pami ci ktoacuterej adres jest okre lany wska nikiem buf Pami w buforze musi bywystarczaj co du a aby pomie ci ca transakcj Dodatkowy parametr autodel okre laczy pami ta ma by automatycznie zwalniana po obs u eniu transakcji (true) czynie (false) Je li transakcj uda o si umie ci w kolejce funkcja zwraca true Wartozauwa y e w takim przypadku funkcja uruchamia te timer (w naszym przypadkujest to timer TCD0) odpowiedzialny za generowanie przerwania Funkcja obs ugi prze-rwania wysy a dane do LCD

Pewn odmian powy szej funkcji jest funkcjabool LCD_PutText(uint8_t x uint8_t y char txt) LCD_trans trans=malloc_re(sizeof(LCD_trans) + strlen(txt) + 2) bool ret=LCD_PutText_B(x y txt trans true) return ret

Wykorzystuje ona funkcj LCD_PutText_B z tym e najpierw alokuje dynamiczniepami potrzebn na przechowanie tworzonej transakcji

Mamy komplet potrzebnych funkcji a wi c sprawd my jak ca o sprawdza siw praktyce W pliku LCD-transactc znajduje si kod pokazuj cy jak dzia aj naszetransakcje Aby to by o mo liwe nale y zainicjalizowa kontroler LCD

LCD_init()

Wykorzystujemy tu znan ju funkcj inicjalizuj c mdash nie ma potrzeby jej zmienia gdy operacja inicjalizacji LCD jest jednorazowa i nie trzeba wykonywa jej w posta-ci transakcji W drugim kroku musimy zainicjalizowa wykorzystywany timer i systemprzerwa

LCD_Timer_init(ampTCD0)PMIC_CTRL|=PMIC_LOLVLEN_bm Odblokuj przerwania niskiego poziomusei()

Poniewa dost p do LCD z pewno ci nie jest czynno ci krytyczn czasowo prze-rwaniom timera nadano najni szy priorytet Dzi ki temu mo na innym bardziej kry-tycznym przerwaniom nada wy sze priorytety i uzyska w ten sposoacuteb zmniejszenieczasu latencji obs ugi przerwa Sama inicjalizacja timera jest niezwykle prosta

void LCD_Timer_init(TC0_t tc) tc-gtINTCTRLA=TC_OVFINTLVL_LO_gc Odblokuj przerwania nadmiaru timera i nadaj im niski priorytet tc-gtPER=F_CPULCD_ACCESSTIME Przerwanie co 4 us (niezale nie od F_CPU)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 67

Sprowadza si ona tylko do odblokowania mo liwo ci zg aszania przerwania nadmia-ru oraz konfiguracji rejestru PER tak aby przerwania by y generowane co ok 4 s mdashniezale nie od cz stotliwo ci taktowania CPU Mo emy wi c przyst pi do wy wie-tlenia pierwszego napisu

LCD_PutText(00 Numer)

Powy sza funkcja ma jedn wad mdash alokuje dynamicznie pami po ka dym wywo-aniu (pami ta jest automatycznie zwalniana po obs u eniu transakcji) niemniej

ca y proces jest czasoch onny Mo emy tego unikn alokuj c pami bdquor cznierdquo i wielo-krotnie wykorzystuj c zaalokowany blok pami ci Ilustruje to poni szy przyk ad

LCD_trans buf=malloc_re(sizeof(LCD_trans) + 7)

Zmienna buf wskazuje na obszar pami ci ktoacutery mo e pomie ci a cuch 5-znakowyTyle wystarczy na potrzeby tego przyk adu mdash na LCD b d wy wietlane kolejneliczby w zakresie 0 ndash 65 535 najd u sza ma 5 znakoacutew st d te nasz bufor ma tak a nieinn d ugo

while(1) utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(60 bufstr buf false) while(LCD_IsTransCompleted(buf))

Do konwersji liczby na a cuch u yto funkcji bibliotecznej utoa (nag oacutewek stdlibh)Poniewa d ugo a cucha po konwersji jest zmienna (co spowodowa oby pozosta-wianie na LCD bdquoduchoacutewrdquo po poprzednich konwersjach) w kolejnej linii brakuj ceznaki uzupe niono spacjami Nast pnie tworzona jest transakcja w obszarze pami ciprzydzielonym zmiennej buf Ostatnia p tla while jest odpowiedzialna za oczekiwa-nie na zako czenie realizacji transakcji Po jej zako czeniu p tla jest wykonywana odpocz tku

Uwa ny czytelnik z pewno ci zauwa y e pami przydzielana funkcj malloc_renie jest nigdzie zwalniana mdash w normalnej sytuacji spowodowa oby to wyciek pami -ci W naszym przyk adzie jednak program nigdy si nie ko czy nie ma wi c potrzebyzwalniania pami ci wskazywanej przez zmienn buf

Powy szy przyk ad pokazuje jak unikn blokowania CPU na czas dost pu do wolnodzia aj cego urz dzenia jakim jest LCD alfanumeryczny Jednak to nie wszystkiezalety wynikaj ce z zastosowania transakcji Drug wa n zalet naszego rozwi zaniailustruje przyk ad znajduj cy si w katalogu PrzykladyLCD-alfaLCD-transact-intPowa nym ograniczeniem funkcji odpowiedzialnych za dost p do LCD w sposoacutebklasyczny by a niemo no ich wywo ywania z funkcji obs ugi przerwa mdash funkcjeobs ugi LCD nie by y reentrant2 Nasz system oparty na transakcjach nie ma tychwad Aby to zilustrowa zosta stworzony prosty przyk ad mdash tak jak poprzedniow p tli g oacutewnej programu s wy wietlane stale kolejne liczby ale jednocze nie wyko-

2 Poza tym blokowa y CPU na d ugi czas a jak pami tamy funkcje obs ugi przerwa powinny by

wykonywane mo liwie kroacutetko

Kup książkę Poleć książkę

68 AVR Uk ady peryferyjne

rzystano drugi timer (TCD1) w ktoacuterego funkcji obs ugi przerwania przepe nienia jestwy wietlany licznik tych przerwa

ISR(TCD1_OVF_vect) static char int_buf[sizeof(LCD_trans) + 7] static uint16_t cnt char bufstr[6]

utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(61 bufstr (LCD_trans)ampint_buf false)

Jak widzimy w sposoacuteb asynchroniczny z dwoacutech miejsc w programie mo emy uzy-ska dost p do LCD a ka da funkcja bdquoma wra enierdquo e ma LCD na wy czno Przy okazji warto przeanalizowa sposoacuteb w jaki jest rezerwowana pami na trans-akcj w przerwaniu Oczywi cie mo na by wykorzysta dynamiczn alokacj pami cilecz jak wspomniano taka alokacja jest czasoch onna St d te w pokazanym przy-k adzie wykorzystano tablic statyczn int_buf o rozmiarze umo liwiaj cym prze-chowanie kompletnej transakcji Dzi ki temu e zmienna int_buf jest zmienn statycz-n nie jest ona niszczona po zako czeniu funkcji obs ugi przerwania Gdyby pomins owo kluczowe static zmienna ta by aby niszczona a na LCD najprawdopodobniejzacz yby si pojawia przypadkowe tre ci Poniewa pami naszego bufora nie by aalokowana dynamicznie nie mo e ona zosta zwolniona w naszym sterowniku LCDst d te ostatni parametr wywo ania funkcji LCD_PutText_B musi mie warto false

OptymalizacjaPrzy okazji tego i poprzedniego przyk adu warto zastanowi si jeszcze nad jednkwesti mdash optymalizacji W podanych przyk adach wykorzystano wcze niej omoacute-wione funkcje dost pu do wy wietlacza LCD znajduj ce si w plikach hd44780ci hd44780h Wi kszo z zawartych tam funkcji nie jest wykorzystywana jednakkompilator mimo wszystko umieszcza ich kod w pliku wynikowym mdash dzieje si takponiewa nie mo e on bdquostwierdzi rdquo czy funkcje te nie s wykorzystywane w innychfragmentach programu Pami tajmy e kompilator kompiluje poszczegoacutelne pliki roacute-d owe osobno i dana jego instancja nie bdquowierdquo co znajduje si w innych plikach (innychjednostkach kompilacji) Tak ca o ciow wiedz ma dopiero konsolidator (linker)ktoacutery czy stworzone przez kompilator pliki obiektowe (o rozszerzeniu o) w plikwynikowy Linker jednak bdquonie wierdquo ktoacutera z funkcji programu zosta a u yta a ktoacuteranie mdash informacje te ma wy cznie kompilator W ten sposoacuteb powstaje typowe b dneko o w efekcie nasze nieu ywane funkcje nie s usuwane (linker zostawia je bdquonawszelki wypadekrdquo) i zajmuj niepotrzebnie pami Czy mo na temu jako zaradzi Oczywi cie tak W tym celu trzeba po czy si y kompilatora i linkera co zapewniaj od-powiednie opcje kompilacji We w a ciwo ciach projektu (ProjectProperties lub Alt+F7)wybieramy zak adk Toolchain a nast pnie AVRGNU C Compiler i OptimizationZnajdziemy tam pole wyboru o nazwie Prepare functions for garbage collection (ry-sunek 224)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 69

Rysunek 224 Aby da linkerowi mo liwo usuwania nieu ywanych funkcji nale y skompilowaprogram z wybran opcj ndashffunction-sections ktoacutera spowoduje e ka da funkcja programu znajdzie siwe w asnej sekcji

Zaznaczenie tej funkcji spowoduje umieszczenie ka dej funkcji w osobnej sekcji mdashsamo w sobie nie wp ynie to na skroacutecenie kodu wynikowego ale jest warunkiem nie-zb dnym dla podj cia stosownych dzia a przez linker Aby wyeliminowa nieu y-wane funkcje nale y zaznaczy jeszcze w ga zi AVRGNU LinkerOptimization poleGarbage collect unused sections (rysunek 225)

Rysunek 225 Zaznaczenie opcji Garbage collect unused sections (-Wl--gc-sections) spowodujee nieu ywane funkcje zostan usuni te z kodu wynikowego w efekcie kod programu ulegnie skroacuteceniu

Po zaznaczeniu tych opcji program zostanie skroacutecony o kilkaset bajtoacutew Oczywi cieje li wszystkie funkcje by yby wykorzystane nie uzyskaliby my adnego skroacuteceniakodu Niemniej w sytuacji gdy u ywa si bibliotek zazwyczaj przynajmniej czfunkcji nie jest wykorzystywana warto wi c skorzysta z tej mo liwo ci optymalizacji

Kup książkę Poleć książkę

70 AVR Uk ady peryferyjne

Je li mamy do czynienia z prekompilowan bibliotek (lib) to musi ona by skom-pilowana z zaznaczon opcj Prepare functions for garbage collection (-ffunction-sections) Alternatyw jest umieszczenie ka dej funkcji biblioteki w osobnym pliku(tak jak w przypadku bibliotek AVR-libc)

Na ekranie wyboru opcji optymalizacji linkera mamy jeszcze jedn przydatn opcjmdash Relax Branches (-mrelax) Dla mikrokontroleroacutew ktoacutere maj ponad 8 kB pami ciFLASH instrukcje skokoacutew s generowane jako tzw instrukcje d ugie mdash umo liwiajone skok do komoacuterki pami ci FLASH o dowolnym adresie Jednak cen za to jestwyd u enie instrukcji mdash ich kod jest d u szy podobnie jak czas wykonania Nie zawszejednak takie d ugie instrukcje musz by wykonywane mdash je li miejsce docelowe skokule y blisko (w zasi gu instrukcji skokoacutew wzgl dnych) to mo na w kodzie wynikowymzamieni instrukcje d u sze na kroacutetsze co przynosi oszcz dno ci w postaci skroacuteceniakodu wynikowego Poniewa dopiero linker bdquowierdquo jak poszczegoacutelne fragmenty kodus rozmieszczone w pami ci takiej podmiany mo na dokona na etapie linkowaniaprogramu co zapewnia powy sza opcja St d te warto to pole wyboru zaznaczy

Kup książkę Poleć książkę

SkorowidzA

ABI Application Binary Interface 25AC Address Counter 50ADPCM 482adres

bazowy 377bufora 61komoacuterki 84pu apki 202

ALE Address Latch Enable 368alfanumeryczne wy wietlacze 43algorytm ADPCM 492algorytmy stratne 495animacje 57antyaliasing 325architektury procesoroacutew XMEGA 352asembler 23

dyrektywy 40funkcje j zyka C 41obs uga przerwa 39

asynchroniczne wywo anie funkcji 101Atmel Studio 15

Bbajty kalibracyjne 569biblioteka

FATFS 131 139 176 180 517libcallback-liba 99PetitFS 144 149

bitADC_CH0START_bm 236IMPMODE 244

bitrate 442 512blokowanie przerwa 219b d 16 19

kwantyzacji 463offsetu 230wzmocnienia ADC 230

BOD 223bps bits per second 12

budowakarty 152linii obrazu 394pami ci SDRAM 374pliku stymulacji 192ramki PAL 412sygna u PAL 411wtyczki 544 545

bufor 78FIFO 497na transakcje 61transakcji 62

buforowanie wyj cia 294

CCAS Column Address Strobe 375CCFL 44charakterystyka

przetwornikoacutew 222termistora 264tryboacutew pracy 232

CID Card Identification 169CKE Clock Enable 375CLKIN 421COG Chip on Glass 310CRC 158 178CRC16 178CRC7 164CS Chip Select 361 375CSD Card Specific Data 172czas

dost pu do SDRAM 424adowania kondensatora 244

propagacji 281proacutebkowania 260symulacji 209

czcionki 322cz stotliwo

odchylania pionowego 428proacutebkowania 244 441 444 530przebiegu 504

Kup książkę Poleć książkę

576 AVR Uk ady peryferyjne

cz stotliwoPWM 465taktowania koprocesora 549taktowania procesora 209taktowania rdzenia 18

czyszczenie pami ci 318

DDAC Digital to Analog Converter 293 447 451

buforowanie wyj cia 294generowanie przebiegoacutew 301jitter 303kalibracja 306napi cie referencyjne 295system zdarze 297taktowanie 296tryb dwukana owy 301wykorzystanie DMA 298wyzwalanie konwersji 305

datalogger 261 265 275DD Device Density 86debuger 183

programowy 190sprz towy 185 187

decymacja 259DEBUG 219XMEGA 260

definicja symboli globalnych 36definiowanie w asnych znakoacutew 56deklaracja zapowiadaj ca 103 337dekoder DTMF 548 556DMA 254 298 402 458 518 523dost p do

danych 358 359 568danych binarnych 356 360danych wielobajtowych 31DataFLASH 137EEPROM 128FAT 136komoacuterki 375LCD 59 62 66 68operandu 30pami ci 81 384 386 387 561pami ci SDRAM 424pliku blokowy 141portoacutew IO 30rejestroacutew IO procesora 36rejestroacutew uk adu 499SPI 95sygnatury u ytkownika 565 567wska nikoacutew 32

DQM Data Mask 375DSP Digital Signal Processor 535

DTMF 535 553dyktafon 529dynamiczna alokacja pami ci 516dyrektywa global 38dyrektywy asemblera 40dzia anie

DMA 255komparatora 280timeroacutew 400

d wi k 443

EEBI External Bus Interface 361EEPROM 207eliminacja jitteru 24emulacja RS232 139

FFAT File Allocation Table 128 131FAT32 128FATFS 180filtr

dolnoprzepustowy 491drugiego rz du 470pierwszego rz du 469trzeciego rz du 471

filtrowanie sygna u PWM 468firmware 565FLASH 207format

odpowiedzi 159polecenia 158protoko u 157

funkcja_delay_ms 17 219c_zero 42callback 106 341callback() 99DataFLASH_CSEnable 100DF_FinishBufWrite() 269disk_initialize 136disk_ioctl 181disk_status 136disk_write 138DMA_SPI_init 104DTMF_GetCode 553free_re 65GPIOR0_init 507hd44780_outcmd 51hd44780_outnibble_nowait 65LCD_defchar_P 57

Kup książkę Poleć książkę

Skorowidz 577

Menu_Click_Func 515Menu_Free 516Menu_Recorder 532Menu_Run 527MS_CreateRegEntry 117MS_GetDirPos 125MS_GetRegItem 115MS_WritePages 116 118OSC_wait_for_rdy 473RecMenu_StartStop 532sprintf 142strtok 124sysclk_init() 200 209TMF_memcpy_PF 454udi_cdc_getc() 123udi_cdc_is_rx_ready() 123VS1003_Reset 506

funkcjeanalizuj ce 556biblioteczne 50biblioteki FATFS 143j zyka C 41kontrolera ST7565R 313opoacute niaj ce 17opoacute nie 219reentrant 524specjalne kontrolera 319steruj ce 314zapisu 133

fusebit 557BODACT 560BODLEVEL 560BOOTRST 559DVSDON 560EESAVE 561JTAGEN 558RSTDISBL 559SUT 559TOSCSEL 559

fusebity w AVR-libc 571

Ggenerator obrazu composite 426generowanie

d wi ku 461kolorowego obrazu 437obrazu wideo 391przebiegoacutew 301przerwa 285sygna u composite 409

g bia koloru 326gniazdo

karty SD 156VGA 396

Hhistereza 281

IIDE 11IMA ADPCM 483informacje

o kolorze 431o obrazie 434

inicjalizacjakarty 161karty SDHC 167karty SDSC 167karty SDXC 167licznika 419pami ci 119USART 505

instrukcjaicall 42movw 35nop 13 24

interfejsSCI 498SDI 498SPI 71 79RS232 120UART 123USART 71 73

interpolacja 259interpolacja w XMEGA 260inwersja obrazu 319

Jjednostki 12jitter 24 303 420

Kkalibracja

ADC 229DAC 306 564offsetu 237

kana DMA 82 522karta 154 158

mikroSD 152SD 151 152SDHC 151 152 160SDSC 160SDXC 151 160

Kup książkę Poleć książkę

578 AVR Uk ady peryferyjne

karty pami ci 151 152 157biblioteka FATFS 180budowa 152format polecenia 158inicjalizacja 161 167komunikacja 156odczyt danych 173opcje konfiguracyjne 181rejestry specjalne 169tryby pracy 153zapis danych 176zasilanie 154

kodasemblerowy 23 24C 23dost pu 24

kodowanieμ-law 481ADPCM 483Dialogic ADPCM 494informacji 166 426koloru 425znakoacutew 536

kodyformatoacutew audio 501zdarze 545

kolejno bajtoacutew 533kolor 424 430kolorowy obraz 437komparator 422

analogowy 279 280analogowy XMEGA 282okienkowy 284

kompilacja plikoacutew binarnych 350kompilator avr-gcc 11 359kompresja

ADPCM 482 486d wi ku 480IMA ADPCM 482

komunikacja z koprocesorem 504konfiguracja

4-portowa 364biblioteki 133debugera 185DMA 459 522fusebitoacutew 570kontrolera DMA 257 452komparatoroacutew 285lockbitoacutew 570LPC 371pami ci SDRAM 381PetitFS 149pinu IO 225portoacutew IO 362

preskalera 452projektu 186przerwa 219pu apki 203rejestru EVCTRL 248rejestru PER 67SPI 75sygna u CS 377typu czcionki 324urz dze IO 189USART 76zegara 383

konsolidacja 547kontroler

DMA 254 298 402 458 518 523KS108 310ST7565R 310ndash315 321

konwersjaDAC 305sygna oacutew 396wyzwalana 306

konwertercyfrowo-analogowy 426DAC 427

koprocesormp3 496VS1003B 10

korekcja fazy 466kwantyzacja 463

Llampa CCFL 44LE Latch Enable 433licznik 419

cykli 209TCC1 400timera 20

linie IO 50linie sygna owe

MISO 72 164MOSI 72SCK 72SS 72

linker 69lista

mnemonikoacutew 24modyfikowanych rejestroacutew 32

lockbity 557 561lockbity w AVR-libc 570LPC Low Pin Count 371LPCM 443 556LSB Least Significant Bit 228

Kup książkę Poleć książkę

Skorowidz 579

a cuchy formatuj ce 212czenie plikoacutew 352

Mmagistrala pami ci zewn trznej 361magnetofon cyfrowy 528makro _SFR_IO_ADDR() 39makrodefinicja

ASSERT 214HD44780_CGADDR() 53HD44780_CLR 53HD44780_DDADDR() 53HD44780_DISPCTL() 52HD44780_ENTMODE() 52HD44780_FNSET() 52HD44780_HOME 53HD44780_SHIFT() 51LOCKBITS 571

mapowanie sygna oacutew 366mapy bitowe 343marker czasowy 268maski bitowe 329matryce 49menu 335menu piktogramowe 342mierniki temperatury 262mikrokontroler

ARM 9AVR 9PIC 9XMEGA128A3U 10

MISO 72moc wydzielana 265model psychoakustyczny 495modu

alfanumeryczny 45NVM 568Xmega eXploreGO 10Xplained ATXMEGA A3BU 10Xplained ATXMEGA-A1 10Xplained XMEGA128A1 447Xplained XMEGA256A3 94Xplained XMEGA256A3BU 97 143 266

modyfikator 30const 85volatile 28 273

monitory CRT 395monochromatyczne wy wietlacze graficzne 309monochromatyczny

tryb graficzny 416tryb tekstowy 413

MOSI 72mp3 495Msps Megasamples per second 12multiplekser wej ciowy 226 283multipleksowanie adresoacutew 368 369muzyka 439

Nnadawanie kodoacutew DTMF 540nadproacutebkowanie 258nag oacutewek kontenera wav 500nagrywanie mowy 486najmniej znacz cy bit 228napi cie

offsetu 280referencyjne 223 295zasilania 239

Oobracanie obrazu 319obraz 319

composite 426kolorowy 430wideo 391

obroacutebka d wi ku 443 445obs uga

FAT 131 143klawiatury matrycowej 24LCD 58 63 67menu 337przerwania 37 38 458przerwania DMA 525przerwa w asemblerze 39przyciskoacutew 272wy wietlaczy alfanumerycznych 45

odczytblokowy 140danych 173 358

odpowied response 159R1 159R2 159R7 160

od wie anie pami ci 376odtwarzanie

d wi ku 472muzyki 447 513 518 521

offset 238offset ADC 230okno

Breakpoints 202Call stack 209dezasemblera 210

Kup książkę Poleć książkę

580 AVR Uk ady peryferyjne

oknoIO View 207podgl du zmiennych 211wyboru czcionek 324

OLED 46opcje

kompilatora 35zapisu d wi ku 445

operacjena buforach 91odczytu 173zapisu 176zapisu strony 92

operand 29operator

ascii 41

asciz 41

byte 41

section 41opoacute nienia 13 18opoacute nienie zmienne 16optymalizacja 16 68optymalizator 26organizacja pami ci 77organizacja pami ci VRAM 316oscylator 287OSD On-Screen Display 417ostrze enie 16oszcz dzanie energii 94

Ppakiet WinAVR 48pami

CGRAM 56 57 64DataFLASH 10 77 81 113 269DDRAM 49EEPROM 111FLASH 54 124 207RAM 49SDRAM 372SRAM 63 124 329 366 371VRAM 314 317

PCLK 421PCM 443PetitFS 144 149p tla

for 13while 201

pierwsza linia obrazu 321piksel 430piktogram 342pin IO 225

plikAlloc_safeh 65DataFLASHc 83DataFLASHIOc 136definesh 50delayh 14diskioh 132 136ffh 132ffconfh 132 181hd44780h 49integerh 132ioh 30LCD_transc 61LCD-transactc 66Makefile 14Menuc 19nothingo 541outfiletxt 547 551pffh 149SPIh 104stringh 113stymulacji 191 192

pliki mp3 495elf 351fon 323o 24S 24 34binarne 350 355csv 276d wi kowe 440obiektowe 352wav 500WMA 512z czcionkami 327z danymi 349

podbijacz napi cia 315podgl d

pami ci 207stosu wywo a 209zmiennych 211znakoacutew 325

pod czeniefototranzystora 262karty SD 155LCD z kontrolerem 311modu u 50pami ci 362 369 370 373termistora 262uk adu LM35 251wyj XMEGA 398

pod wietlenieCCFL 46OLED 46

Kup książkę Poleć książkę

Skorowidz 581

podwoacutejne buforowanie 255 332 457polecenia

kasowania strony 81konfiguracyjne pami ci 82kontrolera ST7565R 315odczytu bufora 82 89odczytu pami ci 81 88SDRAM 376transferu 91

polecenieACMD41 168cd 181CID 178CMD0 165CMD8 167CSD 178date 276dir 127 181dump 276erase 276get 276HD44780_CLR 51Init 178mkdir 181

po czenieDMA ze SPI 96dwoacutech komparatoroacutew 285koprocesora mp3 497LCD z mikrokontrolerem 48wyj cia XMEGA 411XMEGA z PC 121z telewizorem 431

pomiarnapi cia zasilania 239temperatury MCU 241

port IO 30 362pozycjonowanie grafik 345poacute obraz 410precyzja pomiaroacutew 260preskaler 478preskaler ADC 243program

Atmel Data Visualizer 275Audacity 443avr-objcopy 350dataloggera 265LCD Image Converter 323makeloadingtableexe 543Realterm 127 554riffstrip 483SoX 445Tracepoint 208

programowanie sygnatury u ytkownika 566protokoacute master-slave 157

prototypy 136proacutebki d wi kowe 447proacutebkowanie

8-bitowe 300nieliniowe 480

prymitywy graficzne 330przebieg PWM 468przebiegi 289 303przechwytywanie danych 276przemiatanie wej 253przerwanie 218 254 286 403

DMA 522komparatora 286

przestrze adresowa procesora 378przesy anie

danych 498polece 498

przetaktowanie procesora 436przetwornik

ADC 221analogowo-cyfrowy 221cykliczny 222potokowy 222

przyciski 272pseudooperatory 41pu apki breakpoints 197pu apki warunkowe 205punkty ledzenia 203PWM 461 462 472

RRAS Row Address Strobe 375redukcja poboru energii 242regulacja kontrastu 321rejestr 32 34rejestr AC 50

adresu wtyczki 513BASEADDR 377CID 169CMP 251CSD 172czasu utworu 512DATA 83EVCTRL 248formatu audio 512identyfikacyjny pami ci 87INTFLAGS 252kontroli basoacutew 510kontroli g o no ci 513MUXCTRL 227OCR 168PER 67poroacutewnania 249

Kup książkę Poleć książkę

582 AVR Uk ady peryferyjne

rejestr ACSCI_CLOCKF 511stanu komparatora 287stanu pami ci 86stanu uk adu 510trybu pracy 508WINCTRL 285

rejestrydost pu do pami ci RAM 513GPIOR 502IO procesora 36mikrokontrolera 25procesora 35specjalne 94specjalne karty 169uk adu VS1003B 508

relacja rodzic ndash dziecko 336reset uk adu 534rozdzielczo

LCD 329przetwornika 231PWM 463 477

rozszerzenie HiRes 477 479roacutewnanie Steinharta-Harta 263rysowanie map bitowych 343

Sschemat uk adu dataloggera 267SCI Serial Command Interface 498SCK 72SD Secure Digital 152SDI Serial Data Interface 498separator synchronizacji 422separowanie impulsoacutew synchronizacji 422shieldy 10skaler 422skaler napi cia 283skrypt makefile 353s owo kluczowe

asm 27extern 37static 68

specyfikatory lokalizacji zmiennej 213sps samples per second 12SS Slave Select 72standard PAL 410standard VGA 393sterowanie

dataloggerem 275sygna em 379

sterownik 121HD44780 49 56LCD 49 62

stos wywo a 209

strukturaFATFS 139Handle 118LCD_trans 60 63menu 338rejestru 86SimpleFSEntry 113 116SimpleFSHandle 113 118 140submenu 527systemu plikoacutew 112

sumabitowa 571kontrolna 178

sygnacomposite 409composite video output 430CS 377DREQ 497H-Sync 396synchronizacji 423V-Sync 396zegarowy CLK 374

sygna yinterfejsu EBI 363magistrali EBI 364steruj ce 375

sygnaturaprodukcyjna procesora 563u ytkownika 565

symbol__DELAY_ROUND_CLOSEST__ 17__DELAY_ROUND_DOWN__ 17_FS_FAT12 149_FS_FAT32 149_FS_MINIMIZE 133_FS_READONLY 133_FS_RPATH 135_FS_TINY 133_MAX_SS 135_MULTI_PARTITION 135_USE_DIR 149_USE_FASTSEEK 134_USE_FORWARD 134_USE_LABEL 134_USE_LFN 134_USE_LSEEK 149_USE_MKFS 134_USE_READ 149_USE_STRFUNC 134_USE_WRITE 149_VOLUMES 136F_CPU 14 15 18increment 36USE_BUSY_FLAG 50

Kup książkę Poleć książkę

Skorowidz 583

symboleglobalne 36w asemblerze 28zewn trzne 39

symulacja 198 209symulator 190synchronizacja

pami ci 331pionowa 395pozioma 394

systemplikoacutew 111 128przerwa 404zdarze 245

szablonfont_XMEGAtmpl 326image_XMEGAtmpl 343

szum 463szybko przesy ania danych 126

ledzenie wi zki 333rodowisko

graficzne 11programistyczne 11VSIDE 542WinAVR 47

Ttabela FAT 130tablica

framebuf 402 408plugintbl 552 555tekst 208z kodem wynikowym 543

taktowanieDAC 296mikrokontrolera 473

technologia OLED 44temperatura mikrokontrolera 239 241termistor 262 290

NTC 263PTC 263

termometrLM35 249 250z alarmem 251

termostat 290test uk adu VS1003B 503testowanie obrazu 319timer 16 62

TCC0 20

TCC1 399transakcja 59 62 65transakcje 17 103ndash107transakcyjna obs uga LCD 58transakcyjny dost p do SPI 95transfer 91

danych 97wynikoacutew 254

transmisja 72 83tryb

bez znaku 234ci g ej konwersji 252czterobitowy 153dwukana owy 301graficzny 416graficzny VGA 407idle 419jednobitowy 153LPC 371monochromatyczny 397 407oszcz dzania energii 94 306pracy multipleksera 226pracy SPI 157roacute nicowy 232single slope 312SPI 153tekstowy 413tekstowy VGA 397z pojedynczym wej ciem 234ze znakiem 235

trybygenerowania PWM 467pracy karty 153pracy przetwornika 231pracy SPI 74pracy uk adu 508

twierdzenie Nyquista 258tworzenie

adresu 84nak adek 417obrazu 335tablicy 543

typ__uint24 119karty 160niekompletny 60wyliczeniowy 114

typyoperandoacutew 29w AVR 34

Kup książkę Poleć książkę

584 AVR Uk ady peryferyjne

Uuchwyt handle 64 113uk ad

AD725 427 431buforowy 294CS 361DAC 284dataloggera 267detekcji awarii zasilania 559generuj cy obraz 393HiRes 477ICL7660 47LM35 250 251SampH 293sterowania sygna em 379USART 401VS1003B 496 503 508 530 538 556VS100XX 529wzmacniania sygna u 227

uk ady peryferyjne 9uruchomienie komparatora 287urz dzenie

master 72slave 72

u rednianie 259utrata danych 141u ycie wstawki asemblerowej 33

VVGA 393

Wwarto ci kalibracyjne

ADC 564oscylatoroacutew 564temperatury 564

warunkowa kompilacja 36WE Write Enable 375wej cie composite video input 425wektor przerwa 38 257wideo 391wielko pami ci 86 377w czenie DAC 299wska nik na struktur 27wska niki 32wstawki asemblerowe 24 33wtyczka 535 541 544

SineDTMF Generator 537VGA 396

wyboacuter cz stotliwo ci PWM 465 474wykorzystanie

DMA 254 518

EuroSCART 428PWM 461rejestroacutew 34

wyliczanie predyktora 489wy wietlacze

alfanumeryczne 43 45graficzne 43 309LCD 43OLED 46

wy wietlanielitera u 213map bitowych 344obrazu 333 346 406obrazu VGA 393

wywo ania zwrotne callbacks 98asynchroniczne 101synchroniczne 101

wyzwalanie konwersji 245wzmacniacz 446wzmacniacz operacyjny 279wzmacnianie sygna u 227

XXMEGA 9 18

Zzapis

bufora 269danych 176d wi ku 440 556

zasilaniekarty 154pami ci 109

zatrzask 368zatrzask 74HC573 433zatrza ni cie adresu 369zdarzenia 297zdarzenie compare match 399zegar 383 420 426zintegrowane rodowisko programistyczne 11z cze EuroSCART 425 428 429zmiana

g o no ci 527wielko ci strony 94

znaki 56

roacuted onapi cia odniesienia 284sygna u 240

Kup książkę Poleć książkę

Page 20: Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8 AVR. Ukäady peryferyjne Rejestry dost pu do pami ci RAM .....513 Rejestr adresu

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 55

void lcd_puttext_P(prog_char txt) char ch while((ch=pgm_read_byte(txt))) lcd_putchar(ch) txt++

Powy sza funkcja wysy a kolejne znaki odczytane z pami ci FLASH na LCD za po-moc funkcji LCD_putchar Po napotkaniu znaku ko ca a cucha (0 nul) przerywa swojedzia anie

Pozostaje nam przetestowa dzia anie przedstawionych funkcjiint main() lcd_init() lcd_puttext_P(PSTR(Test LCDnDruga linia)) while(1)

Na ekranie modu u LCD powinien wy wietli si napisTest LCDDruga linia

Je li na LCD nic nie widzimy to w pierwszej kolejno ci powinni my sprawdzi kon-trast zmieniaj c napi cie na pinie Vee modu u LCD

Warto zdefiniowa jeszcze funkcj ustawiaj c pozycj od ktoacuterej b dzie wy wietlanynast pny znak

void lcd_goto(uint8_t x uint8_t y) hd44780_outcmd(HD44780_DDADDR(0x40y+x)) hd44780_wait_ready(1000)

Funkcja ta przyjmuje dwa parametry x i y okre laj ce pozycj na ktoacuterej zostaniewy wietlony nast pny znak wys any z mikrokontrolera do modu u LCD Dzi ki temuz atwo ci mo emy uaktualnia zawarto LCD bez konieczno ci ponownego prze-sy ania wszystkich danych Funkcja ta jest zale na od typu zastosowanego modu u

Ostatni funkcj jest funkcja umo liwiaj ca czyszczenie zawarto ci pami ci modu uOdpowiedzialne za to jest proste polecenie wysy ane do sterownika

void lcd_cls() hd44780_outcmd(HD44780_CLR) hd44780_wait_ready(false)

Oproacutecz czyszczenia zawarto ci pami ci modu u powoduje ono ustawienie kursoraw punkcie (00)

Kup książkę Poleć książkę

56 AVR Uk ady peryferyjne

Definiowanie w asnych znakoacutewUk ad HD44780 jest wyposa ony w 64 bajty pami ci CGRAM (ang Character Ge-nerator RAM) ktoacutera mo e przechowywa mapy bitowe 8 znakoacutew o matrycy 5times8 pikselilub 4 znakoacutew o matrycy 5times10 pikseli Przyk ad definicji znaku na matrycy 5times8 poka-zano na rysunku 223

Rysunek 223Przyk ad definicji w asnego znakuw pami ci CGRAM Znak rysujemyna matrycy 5times8 bitoacutew polazaciemnione odpowiadaj warto ci 1pola bia e warto ci 0 Wartowyliczon dla ka dej linii pikseliwpisujemy do pami ci CGRAMsterownika Najstarsze 3 bity ka degobajta (pola szare) s bez znaczeniamdash wy wietlacz pomija jeprzy wy wietlaniu obrazu

1

2

3

4

5

6

7

0 00100 = 4

01110 = 14

11111 = 31

00100 = 4

00100 = 4

00100 = 4

11111 = 31

01110 = 14

Adres Warto

Dost p do tej pami ci jest mo liwy dzi ki wys aniu polecenia ustawiaj cego adreszapisuodczytu pami ci CGRAM Po jego wys aniu wszystkie operacje zapisu i od-czytu dotycz tej pami ci a nie pami ci DDRAM Aby wroacuteci do adresowania pa-mi ci DDRAM nale y wybra jej adres lub dokona operacji wymagaj cej przesu-ni cia kursora

Pami CGRAM jest pami ci ulotn po ponownym w czeniu zasilania definicjeznakoacutew musz by ponownie przes ane przez procesor

Bity o warto ci 1 w definicji znaku odpowiadaj w czonym pikselom bity o warto-ci 0 pikselom wy czonym Najstarsze 3 bity ka dego bajta w pami ci CGRAM s

bez znaczenia mdash te pozycje nie s wy wietlane przez matryc Definiuj c znak nale-y tak e pami ta e ostatnia linia wy wietlana przez matryc (w zale no ci od wiel-

ko ci matrycy znaku linia 8 lub 10) powinna zawiera same zera mdash w tej linii b dziewy wietlany kursor

Najcz ciej matryce LCD pod czone do sterownika HD44780 maj organizacj 5times8czyli jeden znak jest definiowany przez 8 kolejnych bajtoacutew okre laj cych stan po-szczegoacutelnych linii tworz cych znak Stwoacuterzmy funkcj ktoacuterej zadaniem b dzie za a-dowanie definicji znakoacutew z pami ci FLASH mikrokontrolera do pami ci CGRAM

void lcd_defchar_P(uint8_t charno prog_uint8_t chardef) hd44780_outcmd(HD44780_CGADDR(charno8)) hd44780_wait_ready(40) for(uint8_t c=0clt8c++) hd44780_outdata(pgm_read_byte(chardef))

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 57

hd44780_wait_ready(40) chardef++

Funkcja LCD_defchar_P jako argumenty przyjmuje numer definiowanego znaku (0 ndash 7)oraz wska nik do obszaru pami ci FLASH zawieraj cego definicj znaku (obszarten zajmuje 8 nast puj cych po sobie bajtoacutew) Jak widzimy funkcja najpierw ustawiaw a ciwy adres pod ktoacuterym znajdzie si pocz tek definicji znaku w pami ci CGRAMmdash poniewa jeden znak jest opisywany za pomoc 8 bajtoacutew kolejne adresy znakoacutewto kod_znakutimes8 Nast pnie dane opisuj ce znak s adowane z pami ci mikrokontrolerai zapisywane w pami ci CGRAM sterownika Poni szy program ilustruje wykorzy-stanie funkcji LCD_defchar_P

prog_uint8_t char1[8][8]=0000000255 00000025525500000255255255 0000255255255255 00025525525525525500255255255255255255 0255255255255255255255255255255255255255255255

int main() for(uint8_t x=0xlt8x++) lcd_defchar_P(xampchar1[x][0]) Za aduj wzorce znakoacutew lcd_init() for(uint8_t x=0xlt8x++) lcd_putchar(x) Wy wietl znaki o kodach 0 ndash 7 while(1)

W pierwszej linii funkcji main nast puje za adowanie nowych definicji znakoacutew dopami ci CGRAM nast pnie inicjalizowany jest wy wietlacz po czym w pierwszejlinii s wy wietlane znaki o kodach 0 ndash 7 a wi c znaki ktoacuterych definicja zosta aprzes ana z mikrokontrolera

Zauwa e pami CGRAM podobnie jak DDRAM mo emy zapisywa i odczytywaprzed inicjalizacj modu u LCD Proces inicjalizacji jest potrzebny tylko do prawi-d owego wy wietlania na ekranie LCD

Poniewa dane potrzebne do wy wietlenia znaku s na bie co pobierane z pami cipodczas od wie ania matrycy LCD jakiekolwiek zmiany w definicji znaku kiedy jest onwidoczny na LCD poci gaj za sob natychmiastowe zmiany w wy wietlanym obrazieMo na t w a ciwo sterownika wykorzysta do stworzenia prostych animacji

void lcd_box(uint8_t y) hd44780_outcmd(HD44780_CGADDR(0)) Zaczynamy od znaku o kodzie 0 hd44780_wait_ready(40) for(uint8_t c=0cltyc++) Stwoacuterz linie z w czonymi pikselami hd44780_outdata(0xFF) hd44780_wait_ready(40) for(uint8_t c=yclt8c++) Stwoacuterz linie z wy czonymi pikselami hd44780_outdata(0x00) hd44780_wait_ready(40)

Kup książkę Poleć książkę

58 AVR Uk ady peryferyjne

int main() lcd_init() lcd_putchar(0) while(1) for(uint8_t x=0xlt8x++) lcd_box(x) _delay_ms(100) for(int8_t x=7xgt=0x--) lcd_box(x) _delay_ms(100)

Funkcja main wy wietla na LCD tylko jeden znak o kodzie 0 a nast pnie cykliczniezmienia jego definicj w pami ci CGRAM W efekcie posta znaku wy wietlana naekranie ci gle si zmienia

Transakcyjna obs uga LCDPokazana do tej pory obs uga LCD alfanumerycznego mia a pewne wady Jak wiemyoperacje odwo uj ce si do kontrolera LCD s niezwykle wolne cykl odczytuzapisudowolnego rejestru kontrolera trwa co najmniej 1600 ns co dla MCU taktowanegozegarem 32 MHz przek ada si na czas wykonania oko o 52 instrukcji asemblera Cogorsza wi kszo komend realizowanych przez kontroler jest wykonywana w czasieoko o 37 s co przek ada si na tysi ce zmarnowanych taktoacutew MCU St d te jaki-kolwiek zapisodczyt LCD to z perspektywy programu straszne marnotrawstwo czasu

Problem ten dotyczy ka dego urz dzenia IO ktoacutere dzia a wolniej ni procesor W takiejsytuacji warto napisa pewn warstw po redni mdash sterownik mdash ktoacuterego zada-niem b dzie buforowanie da dost pu do urz dzenia i rozstrzyganie konfliktoacutewdzi ki czemu roacute ne cz ci programu b d bdquomia y wra enierdquo e maj wy czny do-st p do urz dzenia

Pokazane wcze niej funkcje obs ugi LCD maj jeszcze jedn wad mdash nie s wspoacute bie -ne czyli nie mo na ich wykonywa jednocze nie w kilku miejscach programu w tymw szczegoacutelno ci w programie g oacutewnym i w funkcjach obs ugi przerwa W wielu przy-padkach ta wada jest bez znaczenia jednak czasami jest uci liwa mdash dla przyk adugdy na wy wietlany tekst chcieliby my na o y inne informacje np o dacie lub godzi-nie Oczywi cie wy wietlanie mo na zorganizowa tak aby nie by o potrzeby pisaniawspoacute bie nego kodu np poprzez zastosowanie bufora pami ci VRAM kontrolera LCDRodzi to jednak kolejne problemy i jest ma o eleganckie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 59

Zastanoacutewmy si w jaki sposoacuteb najlepiej jednocze nie rozwi za problem wolnegodost pu do urz dzenia i wspoacute bie no ci kodu Rozwi zaniem mo e by wprowadze-nie tzw transakcji Transakcj nazywamy zbioacuter operacji tworz cych pewn ca-o To co wyroacute nia tak wykonywany zestaw operacji to atomowo spoacutejno

izolacja i trwa o Pod tymi terminami kryje si istota wykonywanej operacji Ato-mowo transakcji zapewnia e jest ona wykonywana w sposoacuteb niepodzielny co gwa-rantuje nam prawid ow wspoacute prac z danym urz dzeniem IO w tym przypadku kon-trolerem LCD Wa na dla nas jest tak e izolacja mdash dzi ki temu inne operacje na LCD(inne transakcje) nie b d mia y wp ywu na wynik aktualnie wykonywanej transakcjimdash nie b d zak oacuteca y jej wykonania z drugiej strony nasza transakcja nie zak oacuteciwykonania innych Trwa o z kolei zagwarantuje nam e je li sterownik potwierdziwykonanie transakcji to znaczy e efekt jej dzia ania jest wy wietlony na LCD Tacecha nie jest nam a tak potrzebna mdash jest ona wydawa oby si oczywista Niemniej jestto pewna gwarancja e ca a operacja przebieg a poprawnie i w efekcie LCD znajdujesi w okre lonym przez nas stanie Tyle teorii przejd my do praktyki

Kody poni szego przyk adu znajduj si w katalogu PrzykladyLCD-alfaLCD-transact

Aby zapewni transakcyjny dost p do LCD musimy stworzy pewne struktury danychktoacuterych zadaniem b dzie przechowywanie informacji o operacjach sk adaj cych sina transakcje i stanie ich wykonania W tym celu pos u ymy si wiadomo ciami z roz-dzia u 5 bdquoJak uporz dkowa chaos czyli z o one typy danych i listyrdquo Do przecho-wywania oczekuj cych transakcji pos u ymy si buforem pier cieniowym zanimjednak go zaimplementujemy zastanoacutewmy si jak powinna wygl da struktura prze-chowuj ca informacje o transakcji Struktura ta powinna zawiera co najmniej

pole danych (data) z informacjami ktoacutere maj by przes ane do kontrolera LCD

pole okre laj ce liczb danych do wys ania (len)

pole okre laj ce realizowane polecenie dla LCD (cmd) mdash pole to pos u yprogramowi sterownika do w a ciwej interpretacji danych znajduj cych siw polu data

kilka poacutel kontrolnych przechowuj cych informacje potrzebne do realizacjisamej transakcji Jedno z nich mdash Ready mdash b dzie przyjmowa warto trueje li dana transakcja zosta a zrealizowana lub false w przeciwnym przypadkuZnaczenie drugiego pola mdash SelfDel mdash mo e wydawa si nieco enigmatycznepole to okre la czy pami przydzielona dla transakcji ma by zwolnionaw sterowniku LCD (warto true) czy te zostanie zwolniona w programie(warto false)

Oto jak mo e wygl da struktura definiuj ca transakcj typedef struct volatile bool Ready 1 true je li transakcja zosta a zrealizowana bool SelfDel 1 true je li pami przydzielona transakcji ma zosta zwolniona LCD_Cmd cmd 2 Polecenie do zrealizowania uint8_t len 6 D ugo polecenia

Kup książkę Poleć książkę

60 AVR Uk ady peryferyjne

unsigned 0 Wyroacutewnanie do granicy bajta uint8_t data[] Dane transakcji LCD_trans

Nale y zwroacuteci uwag na poleunsigned 0

Nie definiuje ono adnego pola struktury ale jedynie informuje kompilator e kolejnepole (w naszym przyk adzie o nazwie data) ma by wyroacutewnane do granicy bajta mdashdzi ki temu dost p do kolejnego pola b dzie odbywa si szybciej Z kolei samo poledata jest zadeklarowane jako tzw typ niekompletny

Typ niekompletny (ang incomplete type) to typ ktoacuterego rozmiaru nie da si okre li

W pokazanym przyk adzie rozmiaru pola data nie da si okre li gdy zosta on za-deklarowany jako typ tablicowy z tym e nie podano wielko ci tablicy Wielko ci niepodano gdy na etapie deklaracji struktury nie wiemy jakiej wielko ci dane b d w niejprzechowywane Tego typu deklaracja ma bardzo powa ne konsekwencje mdash skorowielko ci pola data nie da si okre li to jaki b dzie wynik dzia ania operatora sizeof(LCD_trans) Kompilator stara si jako wybrn z tej sytuacji w zwi zku z czym

zwroacuteci wielko struktury ale tak jakby pole data w ogoacutele nie istnia o mdash jego roz-miar b dzie wynosi 0 W ramach wiczenia zastanoacutew si ile bajtoacutew pami ci b dziezajmowa a struktura LCD_trans

Skoro dysponujemy ju struktur przechowuj c poszczegoacutelne transakcje pora nastworzenie obiektu przechowuj cego kolekcj transakcji Dodanie kolejnej strukturyb dzie polega o na dodaniu jej do takiego obiektu z drugiej strony program sterownikaLCD b dzie moacuteg z tej kolekcji pobiera kolejne transakcje do realizacji Opis ten przy-pomina opis dzia ania bufora pier cieniowego mdash z jednym wyj tkiem mdash po zape nie-niu ca ego bufora nie b dziemy usuwa niezrealizowanych transakcji lecz zabloku-jemy dodawanie kolejnych W tym celu pos u ymy si definicj nast pnej struktury

typedef struct LCD_trans elements[LCD_MAXTRANS] Wska niki do transakcji uint8_t Beg Pierwszy element bufora uint8_t Count Liczba elementoacutew w buforze CircBuffer

Struktura ta zawiera deklaracj tablicy wska nikoacutew na transakcje (pole elements)Poniewa jest to tablica musimy zna liczb jej elementoacutew mdash jest ona zadeklarowanaw sta ej LCD_MAXTRANS

define LCD_MAXTRANS 10 Maksymalna liczba pami tanych transakcji

Do realizacji bufora s potrzebne jeszcze dwa pola Beg wskazuj ce na pierwsztransakcj w buforze oraz pole Count okre laj ce liczb transakcji znajduj cych siw buforze Je li Count == 0 to znaczy e w buforze nie ma adnych oczekuj cychtransakcji a je li Count == LCD_MAXTRANS to znaczy e bufor jest pe ny i nie mo na

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 61

dodawa do niego kolejnych transakcji W a ciwo t wykorzystuj dwie zdefiniowanew pliku LCD_transc funkcje

static inline bool cbIsFull(CircBuffer cb) return cb-gtCount == LCD_MAXTRANS

static inline bool cbIsEmpty(CircBuffer cb) return cb-gtCount == 0

Jak pami tamy w przypadku funkcji modyfikatory static inline powoduj e danafunkcja nie b dzie istnie jako samodzielna lecz w ka dym miejscu w ktoacuterym jestwywo ywana jest wstawiany raczej jej kod a nie wywo anie Ma to znaczenie dlakroacutetkich funkcji (a wi c takich jak pokazane powy ej) dla ktoacuterych koszty wywo anias zazwyczaj wi ksze ni koszty umieszczenia cia a funkcji w miejscu jej wywo aniaTego typu funkcje zachowuj si w sposoacuteb zbli ony do makrodefinicji (z tym e re-spektuj wszystkie regu y j zyka C w szczegoacutelno ci kolejno operatoroacutew czy kon-trol typoacutew)

Takie funkcje jako argument pobieraj adres bufora na ktoacuterym maj operowa W na-szym przypadku bufor jest zdefiniowany nast puj co

static CircBuffer LCD_TransBuffer Bufor na transakcje

Nale y zauwa y e jest on zdefiniowany jako struktura globalna z modyfikatoremstatic Modyfikator ten ogranicza zasi g widoczno ci zmiennej LCD_TransBuffer dopliku w ktoacuterym zmienna ta zosta a zdefiniowana (w tym przypadku modyfikator staticjest niejako przeciwie stwem modyfikatora extern) Dzia anie to ma jedynie znaczeniekosmetyczne mdash uniemo liwia odwo anie si do bufora za pomoc funkcji ktoacutere niezosta y zdefiniowane w miejscu jego definicji Oproacutecz funkcji umo liwiaj cych okre-lenie stanu bufora potrzebne s jeszcze funkcje umo liwiaj ce dodanie i pobranie trans-

akcji Pierwsz funkcj b dzie funkcja dodaj ca transakcj do buforabool cbAdd(CircBuffer cb LCD_trans elem) ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsFull(cb)) return false Czy jest miejsce w kolejce uint8_t end = (cb-gtBeg + cb-gtCount) LCD_MAXTRANS cb-gtelements[end] = elem Dodaj transakcj ++cb-gtCount Liczba elementoacutew w buforze return true Wszystko OK

Funkcja ta dodaje transakcj (zmienna elem) do bufora ko owego Zanim transakcjazostanie dodana sprawdzane jest czy w buforze jest miejsce mdash je li nie funkcjazwroacuteci false Je li dodanie jest mo liwe warto licznika okre laj cego liczb trans-akcji przechowywana w buforze (Count) zwi ksza si o jeden Warto zastanowi si te dlaczego praktycznie ca e cia o tej funkcji jest zamkni te w sekcji atomowej (ATOMIC_BLOCK) Jedn z cech naszego sterownika ma by mo liwo wspoacute bie nego dost pu

Kup książkę Poleć książkę

62 AVR Uk ady peryferyjne

do LCD mdash to znaczy e danie np zapisu do LCD mo e wyst pi zaroacutewno w g oacutewnejp tli programu jak i asynchronicznie w przerwaniu St d te wynika e funkcja do-daj ca transakcj musi by napisana w sposoacuteb zapewniaj cy jej poprawn prac w sytu-acji gdy zostanie ona przerwana i ponownie wywo ana przed zako czeniem dzia aniajej poprzedniej instancji Umieszczenie cia a tej funkcji w sekcji atomowej nam to za-pewnia mdash dzi ki temu bufor transakcji zawsze b dzie spoacutejny Dla zaspokojenia cie-kawo ci warto usun sekcj atomow i sprawdzi jak wtedy b dzie zachowywa si tafunkcja i jak wp ynie to na spoacutejno przechowywanych danych

Drug niezb dn funkcj jest funkcja odczytuj ca bufor transakcji i zwracaj ca trans-akcj do zrealizowania (lub NULL je li adnej transakcji nie ma w buforze)

LCD_trans cbRead(CircBuffer cb) LCD_trans elem ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsEmpty(cb)) return NULL Bufor pusty nie mo na zwroacuteci elementu elem = cb-gtelements[cb-gtBeg] cb-gtBeg = (cb-gtBeg + 1) LCD_MAXTRANS -- cb-gtCount Zmniejszamy liczb elementoacutew pozosta ych w buforze return elem

Funkcja ta jest bardzo podobna do poprzedniej mdash najpierw sprawdza czy bufor za-wiera jak oczekuj c transakcj (cbIsEmpty(cb)) je li tak to zwraca adres opisuj -cej j struktury i zmniejsza liczb transakcji oczekuj cych (pole Count) W ten sposoacutebmamy zrealizowan ca funkcjonalno zwi zan z obs ug bufora pier cieniowegoPokazane funkcje s uniwersalne i z bardzo podobnych (lub wr cz tych samych) b -dziemy korzysta w kolejnych rozdzia ach w kontek cie np obs ugi transakcji zwi -zanych z interfejsami szeregowymi

Pora przej do samego sterownika LCD Jego zadaniem b dzie sprawdzenie czyw buforze oczekuj jakie transakcje do realizacji a je li tak to ich wykonanie Ponie-wa dane do LCD mog by wysy ane co okre lony minimalny czas znacznie d u -szy ni czas jakiego na to zadanie potrzebuje mikrokontroler do wysy ania kolejnychpaczek danych pos u ymy si timerem Timer b dzie generowa przerwanie nadmiaru(TCD0_OVF_vect) ktoacutere b dzie wyznacza o tempo w jakim kolejne porcje danych b -d trafia y do LCD Z noty katalogowej kontrolera wynika e minimalny czas trwa-nia wysokiego stanu sygna u Enable to 230 ns a okres tego sygna u nie powinien bykroacutetszy ni 500 ns Poniewa nasz dost p do LCD odbywa si w sposoacuteb nieblokuj cyMCU wi c szybko wysy ania danych do LCD jest bez znaczenia St d te w poka-zanym przyk adzie przyj to e dane b d wysy ane co 4 s co okre la sta a

define LCD_ACCESSTIME 0000004

Poniewa komunikacja z LCD odbywa si w sposoacuteb nieblokuj cy nie zale y nam tena czasie (i tak w stosunku do czasu od wie ania samego LCD jest on bardzo kroacutetki)w efekcie nie ma potrzeby odczytywania flagi busy kontrolera Dzi ki temu w cz ciprzypadkoacutew mo emy w ogoacutele zrezygnowa z sygna u wyboru RW i wymusi jego sta y

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 63

poziom logiczny umo liwiaj cy zapis do LCD Dzi ki temu mo na zaoszcz dzi do-datkowy pin IO1

Ca a logika naszego sterownika jest zawarta w funkcji obs ugi przerwania przepe nieniatimera (TCD0_OVF_vect) Poniewa LCD jest po czony z MCU w trybie 4-bitowym(dla zaoszcz dzenia liczby wykorzystanych pinoacutew IO) kolejne 8-bitowe dane muszby podzielone na dwie tetrady i wys ane do LCD w kolejno ci starszam odsza tetradaInformacja o aktualnie wysy anych danych jest umieszczona w zmiennej trans o typie

static struct uint8_t pos 6 Pozycja w polu danych aktualnej transakcji uint8_t nibble 1 Ktoacutera tetrada jest wysy ana seq

Dlaczego tak Dzi ki wykorzystaniu struktury i poacutel bitowych mo na zaoszcz dzi je-den bajt pami ci SRAM Ze wzgl du na wielko pami ci obs ugiwanej przez kon-troler LCD mo emy by pewni e transakcje zawieraj ce wi cej ni 63 bajty s ra-czej nierealne (nie mia yby wi kszego sensu) St d te do przechowywania informacjio aktualnie wysy anym bajcie danych wystarczy 6 bitoacutew mdash tyle samo zosta o wyko-rzystanych do okre lenia d ugo ci pola danych transakcji w strukturze LCD_trans Zaosz-cz dzony bit mo na po wi ci na flag nibble okre laj c ktoacutera tetrada (m odszastarsza)jest wysy ana Bez poacutel bitowych flaga ta zaj aby dodatkowy bajt pami ci

Przejd my do implementacji sterownika Pierwsz rzecz jak nale y sprawdzi jestto czy w buforze czeka jaka transakcja do zrealizowania Odpowiedzialny za to jestfragment kodu obs ugi przerwania nadmiaru timera

if(trans == NULL) Nic do zrobienia sprawd my czy jaka transakcja oczekuje trans=cbRead(ampLCD_TransBuffer) Czy jest jaka oczekuj ca transakcja seqpos=0 seqnibble=0 if(trans == NULL) TCD0_CTRLA=TC_CLKSEL_OFF_gc Nie ma adnych transakcji mdash wy cz timer

W przypadku gdy adna transakcja nie oczekuje na realizacj timer jest wy czanymdash dzi ki temu nie b d zg aszane kolejne przerwania przepe nienia i MCU nie b -dzie traci czasu na ich obs ug Co prawda wynikaj cy z tego zysk czasowy jest mar-ginalny lecz ma to istotniejsz konsekwencj mdash w przypadku usypiania MCU zb d-ne przerwanie timera nie b dzie niepotrzebnie wybudza o procesora W takiej sytuacjiponowne w czenie timera nast pi dopiero w funkcji dodaj cej transakcj do kolejkimdash a wi c w sytuacji gdy mamy pewno e istnieje oczekuj ca transakcja

Druga cz funkcji obs ugi przerwania jest zwi zana z realizacj samej transakcjiW pokazanym przyk adzie zaimplementowano tylko jeden typ transakcji mdash daniezapisu a cucha tekstowego pod wskazany adres VRAM (na okre lonej pozycji LCD)Je li zajdzie taka potrzeba programista mo e zaimplementowa inne polecenia i doda

1 Warto zauwa y e w bdquoklasycznejrdquo obs udze LCD te nie musimy czyta stanu flagi busy zamiast tego

wystarczy wprowadza p tle opoacute niaj ce Jednak poniewa taka obs uga blokuje MCU nie jest onazalecana Wady tej nie ma dost p transakcyjny co jest jego dodatkow zalet

Kup książkę Poleć książkę

64 AVR Uk ady peryferyjne

kod odpowiedzialny za ich obs ug Zauwa my e ka da transakcja musi zawieraadres pocz tku pami ci wideo od ktoacuterego b dzie zapisywany tekst Dzieje si takdlatego e transakcja wykonana wcze niej mo e ustawi wska nik zapisu na dowolnejkomoacuterce pami ci W efekcie tekst z kolejnej transakcji by by wy wietlany od komoacuterkina ktoacuterej zako czy si zapis poprzedniej transakcji Takie dzia anie oczywi cie jestniedopuszczalne st d te ka dy zapis do pami ci wideo poprzedza ustawienie rejestruindeksowego Problem ten mo na rozwi za tak e w inny sposoacuteb mdash poprzez wpro-wadzenie tzw uchwytoacutew (ang handlers) ktoacutere zawiera yby stan kontrolera LCDNiemniej to rozwi zanie dodatkowo komplikowa oby nasz sterownik Struktura danych(zawartych w polu data) ma wi c nast puj cy format

bajt nr 0 zawiera warto pozycji od ktoacuterej nale y dokonywa zapisu pami ciwideo mdash jest to warto przesy ana do rejestru okre laj cego adres zapisu

kolejne bajty zawieraj a cuch znakowy ktoacutery nale y umie ci w pami ciCGRAM

Poniewa bajt nr 0 zawsze zawiera warto wpisywan do rejestroacutew steruj cych kon-trolera podczas jego wysy ania jest ustawiana linia RS sygnalizuj ca zapis do rejestruPodczas wysy ania kolejnych bajtoacutew linia ta jest zerowana w zwi zku z czym zapisodbywa si do pami ci CGRAM

Kod obs uguj cy transakcj wygl da nast puj coif(trans) Jest transakcja do zrealizowania uint8_t dat=trans-gtdata[seqpos] if(seqnibble == 0) datgtgt=4 To trzeba zmieni je li linie danych nie s po czone z pinami 0 ndash 3 portu IO hd44780_outnibble_nowait(dat amp 0x0F seqpos = 0) Zapisujemy rejestr steruj cy lub dane ++seqnibble if(seqnibble == 0) ++seqpos Co drug tetrad zwi kszamy pozycj bufora if(seqpos gt= trans-gtlen) trans-gtReady=true Koniec transakcji if(trans-gtSelfDel) free_re(trans) Zwolnij pami transakcji je li tak sobie yczy programista trans=NULL Koniec transakcji CLR(OUT HD44780_E)

Ta cz przerwania wysy a kolejne tetrady do kontrolera LCD Warto zastanowi sinad dzia aniem sekwencji

++seqnibble

Poniewa pole nibble jest jednobitowe operacja inkrementacji prowadzi do zmianystanu tego pola na przeciwny (pole to ma warto 0 lub 1) Kiedy zostan wys anewszystkie dane przeznaczone dla kontrolera obs uga transakcji ko czy si Stan tensygnalizuje nadanie warto ci true polu Ready struktury LCD_trans Dzi ki temu pro-gram mo e sprawdzi asynchronicznie w stosunku do przerwania kiedy transakcjauleg a zako czeniu Opcjonalnie jest wykonywana jeszcze jedna funkcja mdash je li poleSelfDel ma warto true to pami zarezerwowana na transakcj jest automatycznie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 65

zwalniana W tym celu wykorzystuje si funkcj free_re ktoacuterej prototyp jest zade-klarowany w pliku Alloc_safeh Funkcja ta wywo uje funkcj biblioteczn free ktoacute-ra zwalnia pami przydzielon dynamicznie na stercie Poniewa funkcja ta nie jestfunkcj reentrant nale y stworzy odpowiedni bdquoprotez rdquo opakowuj c j w blokatomowy co zapewnia e nie zostanie ona ponownie wywo ana zanim jej poprzed-nia instancja nie zako czy dzia ania Oczywi cie lepszym rozwi zaniem by oby napi-sanie w asnych funkcji dynamicznej alokacji pami ci ktoacutere b d reentrant

Bardzo wa ne jest aby pole SelfDel mia o warto true wy cznie dla transakcjidla ktoacuterych pami zosta a przydzielona dynamicznie funkcj malloc (lub jej po-chodnymi) W pozosta ych przypadkach pole to musi mie warto false mdash nie-stosowanie si do tej regu y spowoduje b d mened era pami ci i najprawdopo-dobniej nieprzewidywalne dzia anie programu

Drug wa n zasad jest aby zmienna zawieraj ca dane transakcji nie by azmienn automatyczn mdash zmienne takie s automatycznie niszczone po opusz-czeniu zawieraj cej je funkcji W rezultacie obszar pami ci zawieraj cy danetransakcji mo e zosta wykorzystany przez inne zmienne co spowoduje uszkodzeniezawartych w nim danych

Pami przydzielona transakcji musi by alokowana w sposoacuteb dynamiczny (funkcjamalloc_re) ewentualnie mo e to by pami alokowana dla zmiennej globalnej lubstatycznej mdash zmienne tego typu istniej przez ca y czas ycia programu

Warto te zauwa y e instrukcje steruj ce stanem linii Enable kontrolera LCD(SET(OUT HD44780_E) i CLR(OUT HD44780_E)) s rozdzielone wieloma innymi in-strukcjami Dzi ki temu generowany impuls dodatni tego sygna u ma czas trwania gt230 ns wymagany w specyfikacji kontrolera Nawet dla XMEGA taktowanej zegarem32 MHz 230 ns przek ada si na oko o 7 instrukcji asemblera mdash czas jaki z pewno-ci up ynie pomi dzy wykonaniem obu powy szych instrukcji steruj cych

Do wysy ania danych do kontrolera zosta a wykorzystana nieco zmodyfikowanafunkcja hd44780_outnibble_nowait roacute ni ca si od jej protoplasty hd44780_outnibbletylko tym e nie czeka na sygna braku zaj to ci mikrokontrolera (nie realizuje teopoacute nie ) Nie jest to potrzebne gdy kolejne tetrady s wysy ane w odst pach cza-sowych okre lanych przez timer

Mamy wi c zapewnion obs ug transakcji i mo liwo transakcyjnego wy wietlaniadanych na LCD musimy jeszcze mie funkcj ktoacutera tworzy odpowiednie transakcjemdash jest odpowiednikiem funkcji bezpo rednio wysy aj cej dane znakowe do LCDOdpowiednikiem tym jest pokazana poni ej funkcja

bool LCD_PutText_B(uint8_t x uint8_t y char txt LCD_trans buf bool autodel) buf-gtcmd=LCD_Text buf-gtReady=false buf-gtSelfDel=autodel Czy zwolni pami po zako czeniu transakcji buf-gtdata[0]=HD44780_DDADDR(x+y0x40) Ustaw adres w DDRAM strcpy((char)ampbuf-gtdata[1] txt) Skopiuj dane tekstowe + NULL

Kup książkę Poleć książkę

66 AVR Uk ady peryferyjne

buf-gtlen=strlen(txt) + 1 D ugo tekstu + pozycji + NULL ndash 1 bool ret=cbAdd(ampLCD_TransBuffer buf) if((ret==false) ampamp (autodel)) free_re(buf) Brak miejsca w kolejce else TCD0_CTRLA=TC_CLKSEL_DIV1_gc Preskaler 1 mdash odblokuj timer return ret

Funkcja ta buduje transakcj odpowiedzialn za wy wietlenie napisu txt na wskaza-nej pozycji x y LCD Wszystkie dane o transakcji zostan umieszczone w buforzew pami ci ktoacuterej adres jest okre lany wska nikiem buf Pami w buforze musi bywystarczaj co du a aby pomie ci ca transakcj Dodatkowy parametr autodel okre laczy pami ta ma by automatycznie zwalniana po obs u eniu transakcji (true) czynie (false) Je li transakcj uda o si umie ci w kolejce funkcja zwraca true Wartozauwa y e w takim przypadku funkcja uruchamia te timer (w naszym przypadkujest to timer TCD0) odpowiedzialny za generowanie przerwania Funkcja obs ugi prze-rwania wysy a dane do LCD

Pewn odmian powy szej funkcji jest funkcjabool LCD_PutText(uint8_t x uint8_t y char txt) LCD_trans trans=malloc_re(sizeof(LCD_trans) + strlen(txt) + 2) bool ret=LCD_PutText_B(x y txt trans true) return ret

Wykorzystuje ona funkcj LCD_PutText_B z tym e najpierw alokuje dynamiczniepami potrzebn na przechowanie tworzonej transakcji

Mamy komplet potrzebnych funkcji a wi c sprawd my jak ca o sprawdza siw praktyce W pliku LCD-transactc znajduje si kod pokazuj cy jak dzia aj naszetransakcje Aby to by o mo liwe nale y zainicjalizowa kontroler LCD

LCD_init()

Wykorzystujemy tu znan ju funkcj inicjalizuj c mdash nie ma potrzeby jej zmienia gdy operacja inicjalizacji LCD jest jednorazowa i nie trzeba wykonywa jej w posta-ci transakcji W drugim kroku musimy zainicjalizowa wykorzystywany timer i systemprzerwa

LCD_Timer_init(ampTCD0)PMIC_CTRL|=PMIC_LOLVLEN_bm Odblokuj przerwania niskiego poziomusei()

Poniewa dost p do LCD z pewno ci nie jest czynno ci krytyczn czasowo prze-rwaniom timera nadano najni szy priorytet Dzi ki temu mo na innym bardziej kry-tycznym przerwaniom nada wy sze priorytety i uzyska w ten sposoacuteb zmniejszenieczasu latencji obs ugi przerwa Sama inicjalizacja timera jest niezwykle prosta

void LCD_Timer_init(TC0_t tc) tc-gtINTCTRLA=TC_OVFINTLVL_LO_gc Odblokuj przerwania nadmiaru timera i nadaj im niski priorytet tc-gtPER=F_CPULCD_ACCESSTIME Przerwanie co 4 us (niezale nie od F_CPU)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 67

Sprowadza si ona tylko do odblokowania mo liwo ci zg aszania przerwania nadmia-ru oraz konfiguracji rejestru PER tak aby przerwania by y generowane co ok 4 s mdashniezale nie od cz stotliwo ci taktowania CPU Mo emy wi c przyst pi do wy wie-tlenia pierwszego napisu

LCD_PutText(00 Numer)

Powy sza funkcja ma jedn wad mdash alokuje dynamicznie pami po ka dym wywo-aniu (pami ta jest automatycznie zwalniana po obs u eniu transakcji) niemniej

ca y proces jest czasoch onny Mo emy tego unikn alokuj c pami bdquor cznierdquo i wielo-krotnie wykorzystuj c zaalokowany blok pami ci Ilustruje to poni szy przyk ad

LCD_trans buf=malloc_re(sizeof(LCD_trans) + 7)

Zmienna buf wskazuje na obszar pami ci ktoacutery mo e pomie ci a cuch 5-znakowyTyle wystarczy na potrzeby tego przyk adu mdash na LCD b d wy wietlane kolejneliczby w zakresie 0 ndash 65 535 najd u sza ma 5 znakoacutew st d te nasz bufor ma tak a nieinn d ugo

while(1) utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(60 bufstr buf false) while(LCD_IsTransCompleted(buf))

Do konwersji liczby na a cuch u yto funkcji bibliotecznej utoa (nag oacutewek stdlibh)Poniewa d ugo a cucha po konwersji jest zmienna (co spowodowa oby pozosta-wianie na LCD bdquoduchoacutewrdquo po poprzednich konwersjach) w kolejnej linii brakuj ceznaki uzupe niono spacjami Nast pnie tworzona jest transakcja w obszarze pami ciprzydzielonym zmiennej buf Ostatnia p tla while jest odpowiedzialna za oczekiwa-nie na zako czenie realizacji transakcji Po jej zako czeniu p tla jest wykonywana odpocz tku

Uwa ny czytelnik z pewno ci zauwa y e pami przydzielana funkcj malloc_renie jest nigdzie zwalniana mdash w normalnej sytuacji spowodowa oby to wyciek pami -ci W naszym przyk adzie jednak program nigdy si nie ko czy nie ma wi c potrzebyzwalniania pami ci wskazywanej przez zmienn buf

Powy szy przyk ad pokazuje jak unikn blokowania CPU na czas dost pu do wolnodzia aj cego urz dzenia jakim jest LCD alfanumeryczny Jednak to nie wszystkiezalety wynikaj ce z zastosowania transakcji Drug wa n zalet naszego rozwi zaniailustruje przyk ad znajduj cy si w katalogu PrzykladyLCD-alfaLCD-transact-intPowa nym ograniczeniem funkcji odpowiedzialnych za dost p do LCD w sposoacutebklasyczny by a niemo no ich wywo ywania z funkcji obs ugi przerwa mdash funkcjeobs ugi LCD nie by y reentrant2 Nasz system oparty na transakcjach nie ma tychwad Aby to zilustrowa zosta stworzony prosty przyk ad mdash tak jak poprzedniow p tli g oacutewnej programu s wy wietlane stale kolejne liczby ale jednocze nie wyko-

2 Poza tym blokowa y CPU na d ugi czas a jak pami tamy funkcje obs ugi przerwa powinny by

wykonywane mo liwie kroacutetko

Kup książkę Poleć książkę

68 AVR Uk ady peryferyjne

rzystano drugi timer (TCD1) w ktoacuterego funkcji obs ugi przerwania przepe nienia jestwy wietlany licznik tych przerwa

ISR(TCD1_OVF_vect) static char int_buf[sizeof(LCD_trans) + 7] static uint16_t cnt char bufstr[6]

utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(61 bufstr (LCD_trans)ampint_buf false)

Jak widzimy w sposoacuteb asynchroniczny z dwoacutech miejsc w programie mo emy uzy-ska dost p do LCD a ka da funkcja bdquoma wra enierdquo e ma LCD na wy czno Przy okazji warto przeanalizowa sposoacuteb w jaki jest rezerwowana pami na trans-akcj w przerwaniu Oczywi cie mo na by wykorzysta dynamiczn alokacj pami cilecz jak wspomniano taka alokacja jest czasoch onna St d te w pokazanym przy-k adzie wykorzystano tablic statyczn int_buf o rozmiarze umo liwiaj cym prze-chowanie kompletnej transakcji Dzi ki temu e zmienna int_buf jest zmienn statycz-n nie jest ona niszczona po zako czeniu funkcji obs ugi przerwania Gdyby pomins owo kluczowe static zmienna ta by aby niszczona a na LCD najprawdopodobniejzacz yby si pojawia przypadkowe tre ci Poniewa pami naszego bufora nie by aalokowana dynamicznie nie mo e ona zosta zwolniona w naszym sterowniku LCDst d te ostatni parametr wywo ania funkcji LCD_PutText_B musi mie warto false

OptymalizacjaPrzy okazji tego i poprzedniego przyk adu warto zastanowi si jeszcze nad jednkwesti mdash optymalizacji W podanych przyk adach wykorzystano wcze niej omoacute-wione funkcje dost pu do wy wietlacza LCD znajduj ce si w plikach hd44780ci hd44780h Wi kszo z zawartych tam funkcji nie jest wykorzystywana jednakkompilator mimo wszystko umieszcza ich kod w pliku wynikowym mdash dzieje si takponiewa nie mo e on bdquostwierdzi rdquo czy funkcje te nie s wykorzystywane w innychfragmentach programu Pami tajmy e kompilator kompiluje poszczegoacutelne pliki roacute-d owe osobno i dana jego instancja nie bdquowierdquo co znajduje si w innych plikach (innychjednostkach kompilacji) Tak ca o ciow wiedz ma dopiero konsolidator (linker)ktoacutery czy stworzone przez kompilator pliki obiektowe (o rozszerzeniu o) w plikwynikowy Linker jednak bdquonie wierdquo ktoacutera z funkcji programu zosta a u yta a ktoacuteranie mdash informacje te ma wy cznie kompilator W ten sposoacuteb powstaje typowe b dneko o w efekcie nasze nieu ywane funkcje nie s usuwane (linker zostawia je bdquonawszelki wypadekrdquo) i zajmuj niepotrzebnie pami Czy mo na temu jako zaradzi Oczywi cie tak W tym celu trzeba po czy si y kompilatora i linkera co zapewniaj od-powiednie opcje kompilacji We w a ciwo ciach projektu (ProjectProperties lub Alt+F7)wybieramy zak adk Toolchain a nast pnie AVRGNU C Compiler i OptimizationZnajdziemy tam pole wyboru o nazwie Prepare functions for garbage collection (ry-sunek 224)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 69

Rysunek 224 Aby da linkerowi mo liwo usuwania nieu ywanych funkcji nale y skompilowaprogram z wybran opcj ndashffunction-sections ktoacutera spowoduje e ka da funkcja programu znajdzie siwe w asnej sekcji

Zaznaczenie tej funkcji spowoduje umieszczenie ka dej funkcji w osobnej sekcji mdashsamo w sobie nie wp ynie to na skroacutecenie kodu wynikowego ale jest warunkiem nie-zb dnym dla podj cia stosownych dzia a przez linker Aby wyeliminowa nieu y-wane funkcje nale y zaznaczy jeszcze w ga zi AVRGNU LinkerOptimization poleGarbage collect unused sections (rysunek 225)

Rysunek 225 Zaznaczenie opcji Garbage collect unused sections (-Wl--gc-sections) spowodujee nieu ywane funkcje zostan usuni te z kodu wynikowego w efekcie kod programu ulegnie skroacuteceniu

Po zaznaczeniu tych opcji program zostanie skroacutecony o kilkaset bajtoacutew Oczywi cieje li wszystkie funkcje by yby wykorzystane nie uzyskaliby my adnego skroacuteceniakodu Niemniej w sytuacji gdy u ywa si bibliotek zazwyczaj przynajmniej czfunkcji nie jest wykorzystywana warto wi c skorzysta z tej mo liwo ci optymalizacji

Kup książkę Poleć książkę

70 AVR Uk ady peryferyjne

Je li mamy do czynienia z prekompilowan bibliotek (lib) to musi ona by skom-pilowana z zaznaczon opcj Prepare functions for garbage collection (-ffunction-sections) Alternatyw jest umieszczenie ka dej funkcji biblioteki w osobnym pliku(tak jak w przypadku bibliotek AVR-libc)

Na ekranie wyboru opcji optymalizacji linkera mamy jeszcze jedn przydatn opcjmdash Relax Branches (-mrelax) Dla mikrokontroleroacutew ktoacutere maj ponad 8 kB pami ciFLASH instrukcje skokoacutew s generowane jako tzw instrukcje d ugie mdash umo liwiajone skok do komoacuterki pami ci FLASH o dowolnym adresie Jednak cen za to jestwyd u enie instrukcji mdash ich kod jest d u szy podobnie jak czas wykonania Nie zawszejednak takie d ugie instrukcje musz by wykonywane mdash je li miejsce docelowe skokule y blisko (w zasi gu instrukcji skokoacutew wzgl dnych) to mo na w kodzie wynikowymzamieni instrukcje d u sze na kroacutetsze co przynosi oszcz dno ci w postaci skroacuteceniakodu wynikowego Poniewa dopiero linker bdquowierdquo jak poszczegoacutelne fragmenty kodus rozmieszczone w pami ci takiej podmiany mo na dokona na etapie linkowaniaprogramu co zapewnia powy sza opcja St d te warto to pole wyboru zaznaczy

Kup książkę Poleć książkę

SkorowidzA

ABI Application Binary Interface 25AC Address Counter 50ADPCM 482adres

bazowy 377bufora 61komoacuterki 84pu apki 202

ALE Address Latch Enable 368alfanumeryczne wy wietlacze 43algorytm ADPCM 492algorytmy stratne 495animacje 57antyaliasing 325architektury procesoroacutew XMEGA 352asembler 23

dyrektywy 40funkcje j zyka C 41obs uga przerwa 39

asynchroniczne wywo anie funkcji 101Atmel Studio 15

Bbajty kalibracyjne 569biblioteka

FATFS 131 139 176 180 517libcallback-liba 99PetitFS 144 149

bitADC_CH0START_bm 236IMPMODE 244

bitrate 442 512blokowanie przerwa 219b d 16 19

kwantyzacji 463offsetu 230wzmocnienia ADC 230

BOD 223bps bits per second 12

budowakarty 152linii obrazu 394pami ci SDRAM 374pliku stymulacji 192ramki PAL 412sygna u PAL 411wtyczki 544 545

bufor 78FIFO 497na transakcje 61transakcji 62

buforowanie wyj cia 294

CCAS Column Address Strobe 375CCFL 44charakterystyka

przetwornikoacutew 222termistora 264tryboacutew pracy 232

CID Card Identification 169CKE Clock Enable 375CLKIN 421COG Chip on Glass 310CRC 158 178CRC16 178CRC7 164CS Chip Select 361 375CSD Card Specific Data 172czas

dost pu do SDRAM 424adowania kondensatora 244

propagacji 281proacutebkowania 260symulacji 209

czcionki 322cz stotliwo

odchylania pionowego 428proacutebkowania 244 441 444 530przebiegu 504

Kup książkę Poleć książkę

576 AVR Uk ady peryferyjne

cz stotliwoPWM 465taktowania koprocesora 549taktowania procesora 209taktowania rdzenia 18

czyszczenie pami ci 318

DDAC Digital to Analog Converter 293 447 451

buforowanie wyj cia 294generowanie przebiegoacutew 301jitter 303kalibracja 306napi cie referencyjne 295system zdarze 297taktowanie 296tryb dwukana owy 301wykorzystanie DMA 298wyzwalanie konwersji 305

datalogger 261 265 275DD Device Density 86debuger 183

programowy 190sprz towy 185 187

decymacja 259DEBUG 219XMEGA 260

definicja symboli globalnych 36definiowanie w asnych znakoacutew 56deklaracja zapowiadaj ca 103 337dekoder DTMF 548 556DMA 254 298 402 458 518 523dost p do

danych 358 359 568danych binarnych 356 360danych wielobajtowych 31DataFLASH 137EEPROM 128FAT 136komoacuterki 375LCD 59 62 66 68operandu 30pami ci 81 384 386 387 561pami ci SDRAM 424pliku blokowy 141portoacutew IO 30rejestroacutew IO procesora 36rejestroacutew uk adu 499SPI 95sygnatury u ytkownika 565 567wska nikoacutew 32

DQM Data Mask 375DSP Digital Signal Processor 535

DTMF 535 553dyktafon 529dynamiczna alokacja pami ci 516dyrektywa global 38dyrektywy asemblera 40dzia anie

DMA 255komparatora 280timeroacutew 400

d wi k 443

EEBI External Bus Interface 361EEPROM 207eliminacja jitteru 24emulacja RS232 139

FFAT File Allocation Table 128 131FAT32 128FATFS 180filtr

dolnoprzepustowy 491drugiego rz du 470pierwszego rz du 469trzeciego rz du 471

filtrowanie sygna u PWM 468firmware 565FLASH 207format

odpowiedzi 159polecenia 158protoko u 157

funkcja_delay_ms 17 219c_zero 42callback 106 341callback() 99DataFLASH_CSEnable 100DF_FinishBufWrite() 269disk_initialize 136disk_ioctl 181disk_status 136disk_write 138DMA_SPI_init 104DTMF_GetCode 553free_re 65GPIOR0_init 507hd44780_outcmd 51hd44780_outnibble_nowait 65LCD_defchar_P 57

Kup książkę Poleć książkę

Skorowidz 577

Menu_Click_Func 515Menu_Free 516Menu_Recorder 532Menu_Run 527MS_CreateRegEntry 117MS_GetDirPos 125MS_GetRegItem 115MS_WritePages 116 118OSC_wait_for_rdy 473RecMenu_StartStop 532sprintf 142strtok 124sysclk_init() 200 209TMF_memcpy_PF 454udi_cdc_getc() 123udi_cdc_is_rx_ready() 123VS1003_Reset 506

funkcjeanalizuj ce 556biblioteczne 50biblioteki FATFS 143j zyka C 41kontrolera ST7565R 313opoacute niaj ce 17opoacute nie 219reentrant 524specjalne kontrolera 319steruj ce 314zapisu 133

fusebit 557BODACT 560BODLEVEL 560BOOTRST 559DVSDON 560EESAVE 561JTAGEN 558RSTDISBL 559SUT 559TOSCSEL 559

fusebity w AVR-libc 571

Ggenerator obrazu composite 426generowanie

d wi ku 461kolorowego obrazu 437obrazu wideo 391przebiegoacutew 301przerwa 285sygna u composite 409

g bia koloru 326gniazdo

karty SD 156VGA 396

Hhistereza 281

IIDE 11IMA ADPCM 483informacje

o kolorze 431o obrazie 434

inicjalizacjakarty 161karty SDHC 167karty SDSC 167karty SDXC 167licznika 419pami ci 119USART 505

instrukcjaicall 42movw 35nop 13 24

interfejsSCI 498SDI 498SPI 71 79RS232 120UART 123USART 71 73

interpolacja 259interpolacja w XMEGA 260inwersja obrazu 319

Jjednostki 12jitter 24 303 420

Kkalibracja

ADC 229DAC 306 564offsetu 237

kana DMA 82 522karta 154 158

mikroSD 152SD 151 152SDHC 151 152 160SDSC 160SDXC 151 160

Kup książkę Poleć książkę

578 AVR Uk ady peryferyjne

karty pami ci 151 152 157biblioteka FATFS 180budowa 152format polecenia 158inicjalizacja 161 167komunikacja 156odczyt danych 173opcje konfiguracyjne 181rejestry specjalne 169tryby pracy 153zapis danych 176zasilanie 154

kodasemblerowy 23 24C 23dost pu 24

kodowanieμ-law 481ADPCM 483Dialogic ADPCM 494informacji 166 426koloru 425znakoacutew 536

kodyformatoacutew audio 501zdarze 545

kolejno bajtoacutew 533kolor 424 430kolorowy obraz 437komparator 422

analogowy 279 280analogowy XMEGA 282okienkowy 284

kompilacja plikoacutew binarnych 350kompilator avr-gcc 11 359kompresja

ADPCM 482 486d wi ku 480IMA ADPCM 482

komunikacja z koprocesorem 504konfiguracja

4-portowa 364biblioteki 133debugera 185DMA 459 522fusebitoacutew 570kontrolera DMA 257 452komparatoroacutew 285lockbitoacutew 570LPC 371pami ci SDRAM 381PetitFS 149pinu IO 225portoacutew IO 362

preskalera 452projektu 186przerwa 219pu apki 203rejestru EVCTRL 248rejestru PER 67SPI 75sygna u CS 377typu czcionki 324urz dze IO 189USART 76zegara 383

konsolidacja 547kontroler

DMA 254 298 402 458 518 523KS108 310ST7565R 310ndash315 321

konwersjaDAC 305sygna oacutew 396wyzwalana 306

konwertercyfrowo-analogowy 426DAC 427

koprocesormp3 496VS1003B 10

korekcja fazy 466kwantyzacja 463

Llampa CCFL 44LE Latch Enable 433licznik 419

cykli 209TCC1 400timera 20

linie IO 50linie sygna owe

MISO 72 164MOSI 72SCK 72SS 72

linker 69lista

mnemonikoacutew 24modyfikowanych rejestroacutew 32

lockbity 557 561lockbity w AVR-libc 570LPC Low Pin Count 371LPCM 443 556LSB Least Significant Bit 228

Kup książkę Poleć książkę

Skorowidz 579

a cuchy formatuj ce 212czenie plikoacutew 352

Mmagistrala pami ci zewn trznej 361magnetofon cyfrowy 528makro _SFR_IO_ADDR() 39makrodefinicja

ASSERT 214HD44780_CGADDR() 53HD44780_CLR 53HD44780_DDADDR() 53HD44780_DISPCTL() 52HD44780_ENTMODE() 52HD44780_FNSET() 52HD44780_HOME 53HD44780_SHIFT() 51LOCKBITS 571

mapowanie sygna oacutew 366mapy bitowe 343marker czasowy 268maski bitowe 329matryce 49menu 335menu piktogramowe 342mierniki temperatury 262mikrokontroler

ARM 9AVR 9PIC 9XMEGA128A3U 10

MISO 72moc wydzielana 265model psychoakustyczny 495modu

alfanumeryczny 45NVM 568Xmega eXploreGO 10Xplained ATXMEGA A3BU 10Xplained ATXMEGA-A1 10Xplained XMEGA128A1 447Xplained XMEGA256A3 94Xplained XMEGA256A3BU 97 143 266

modyfikator 30const 85volatile 28 273

monitory CRT 395monochromatyczne wy wietlacze graficzne 309monochromatyczny

tryb graficzny 416tryb tekstowy 413

MOSI 72mp3 495Msps Megasamples per second 12multiplekser wej ciowy 226 283multipleksowanie adresoacutew 368 369muzyka 439

Nnadawanie kodoacutew DTMF 540nadproacutebkowanie 258nag oacutewek kontenera wav 500nagrywanie mowy 486najmniej znacz cy bit 228napi cie

offsetu 280referencyjne 223 295zasilania 239

Oobracanie obrazu 319obraz 319

composite 426kolorowy 430wideo 391

obroacutebka d wi ku 443 445obs uga

FAT 131 143klawiatury matrycowej 24LCD 58 63 67menu 337przerwania 37 38 458przerwania DMA 525przerwa w asemblerze 39przyciskoacutew 272wy wietlaczy alfanumerycznych 45

odczytblokowy 140danych 173 358

odpowied response 159R1 159R2 159R7 160

od wie anie pami ci 376odtwarzanie

d wi ku 472muzyki 447 513 518 521

offset 238offset ADC 230okno

Breakpoints 202Call stack 209dezasemblera 210

Kup książkę Poleć książkę

580 AVR Uk ady peryferyjne

oknoIO View 207podgl du zmiennych 211wyboru czcionek 324

OLED 46opcje

kompilatora 35zapisu d wi ku 445

operacjena buforach 91odczytu 173zapisu 176zapisu strony 92

operand 29operator

ascii 41

asciz 41

byte 41

section 41opoacute nienia 13 18opoacute nienie zmienne 16optymalizacja 16 68optymalizator 26organizacja pami ci 77organizacja pami ci VRAM 316oscylator 287OSD On-Screen Display 417ostrze enie 16oszcz dzanie energii 94

Ppakiet WinAVR 48pami

CGRAM 56 57 64DataFLASH 10 77 81 113 269DDRAM 49EEPROM 111FLASH 54 124 207RAM 49SDRAM 372SRAM 63 124 329 366 371VRAM 314 317

PCLK 421PCM 443PetitFS 144 149p tla

for 13while 201

pierwsza linia obrazu 321piksel 430piktogram 342pin IO 225

plikAlloc_safeh 65DataFLASHc 83DataFLASHIOc 136definesh 50delayh 14diskioh 132 136ffh 132ffconfh 132 181hd44780h 49integerh 132ioh 30LCD_transc 61LCD-transactc 66Makefile 14Menuc 19nothingo 541outfiletxt 547 551pffh 149SPIh 104stringh 113stymulacji 191 192

pliki mp3 495elf 351fon 323o 24S 24 34binarne 350 355csv 276d wi kowe 440obiektowe 352wav 500WMA 512z czcionkami 327z danymi 349

podbijacz napi cia 315podgl d

pami ci 207stosu wywo a 209zmiennych 211znakoacutew 325

pod czeniefototranzystora 262karty SD 155LCD z kontrolerem 311modu u 50pami ci 362 369 370 373termistora 262uk adu LM35 251wyj XMEGA 398

pod wietlenieCCFL 46OLED 46

Kup książkę Poleć książkę

Skorowidz 581

podwoacutejne buforowanie 255 332 457polecenia

kasowania strony 81konfiguracyjne pami ci 82kontrolera ST7565R 315odczytu bufora 82 89odczytu pami ci 81 88SDRAM 376transferu 91

polecenieACMD41 168cd 181CID 178CMD0 165CMD8 167CSD 178date 276dir 127 181dump 276erase 276get 276HD44780_CLR 51Init 178mkdir 181

po czenieDMA ze SPI 96dwoacutech komparatoroacutew 285koprocesora mp3 497LCD z mikrokontrolerem 48wyj cia XMEGA 411XMEGA z PC 121z telewizorem 431

pomiarnapi cia zasilania 239temperatury MCU 241

port IO 30 362pozycjonowanie grafik 345poacute obraz 410precyzja pomiaroacutew 260preskaler 478preskaler ADC 243program

Atmel Data Visualizer 275Audacity 443avr-objcopy 350dataloggera 265LCD Image Converter 323makeloadingtableexe 543Realterm 127 554riffstrip 483SoX 445Tracepoint 208

programowanie sygnatury u ytkownika 566protokoacute master-slave 157

prototypy 136proacutebki d wi kowe 447proacutebkowanie

8-bitowe 300nieliniowe 480

prymitywy graficzne 330przebieg PWM 468przebiegi 289 303przechwytywanie danych 276przemiatanie wej 253przerwanie 218 254 286 403

DMA 522komparatora 286

przestrze adresowa procesora 378przesy anie

danych 498polece 498

przetaktowanie procesora 436przetwornik

ADC 221analogowo-cyfrowy 221cykliczny 222potokowy 222

przyciski 272pseudooperatory 41pu apki breakpoints 197pu apki warunkowe 205punkty ledzenia 203PWM 461 462 472

RRAS Row Address Strobe 375redukcja poboru energii 242regulacja kontrastu 321rejestr 32 34rejestr AC 50

adresu wtyczki 513BASEADDR 377CID 169CMP 251CSD 172czasu utworu 512DATA 83EVCTRL 248formatu audio 512identyfikacyjny pami ci 87INTFLAGS 252kontroli basoacutew 510kontroli g o no ci 513MUXCTRL 227OCR 168PER 67poroacutewnania 249

Kup książkę Poleć książkę

582 AVR Uk ady peryferyjne

rejestr ACSCI_CLOCKF 511stanu komparatora 287stanu pami ci 86stanu uk adu 510trybu pracy 508WINCTRL 285

rejestrydost pu do pami ci RAM 513GPIOR 502IO procesora 36mikrokontrolera 25procesora 35specjalne 94specjalne karty 169uk adu VS1003B 508

relacja rodzic ndash dziecko 336reset uk adu 534rozdzielczo

LCD 329przetwornika 231PWM 463 477

rozszerzenie HiRes 477 479roacutewnanie Steinharta-Harta 263rysowanie map bitowych 343

Sschemat uk adu dataloggera 267SCI Serial Command Interface 498SCK 72SD Secure Digital 152SDI Serial Data Interface 498separator synchronizacji 422separowanie impulsoacutew synchronizacji 422shieldy 10skaler 422skaler napi cia 283skrypt makefile 353s owo kluczowe

asm 27extern 37static 68

specyfikatory lokalizacji zmiennej 213sps samples per second 12SS Slave Select 72standard PAL 410standard VGA 393sterowanie

dataloggerem 275sygna em 379

sterownik 121HD44780 49 56LCD 49 62

stos wywo a 209

strukturaFATFS 139Handle 118LCD_trans 60 63menu 338rejestru 86SimpleFSEntry 113 116SimpleFSHandle 113 118 140submenu 527systemu plikoacutew 112

sumabitowa 571kontrolna 178

sygnacomposite 409composite video output 430CS 377DREQ 497H-Sync 396synchronizacji 423V-Sync 396zegarowy CLK 374

sygna yinterfejsu EBI 363magistrali EBI 364steruj ce 375

sygnaturaprodukcyjna procesora 563u ytkownika 565

symbol__DELAY_ROUND_CLOSEST__ 17__DELAY_ROUND_DOWN__ 17_FS_FAT12 149_FS_FAT32 149_FS_MINIMIZE 133_FS_READONLY 133_FS_RPATH 135_FS_TINY 133_MAX_SS 135_MULTI_PARTITION 135_USE_DIR 149_USE_FASTSEEK 134_USE_FORWARD 134_USE_LABEL 134_USE_LFN 134_USE_LSEEK 149_USE_MKFS 134_USE_READ 149_USE_STRFUNC 134_USE_WRITE 149_VOLUMES 136F_CPU 14 15 18increment 36USE_BUSY_FLAG 50

Kup książkę Poleć książkę

Skorowidz 583

symboleglobalne 36w asemblerze 28zewn trzne 39

symulacja 198 209symulator 190synchronizacja

pami ci 331pionowa 395pozioma 394

systemplikoacutew 111 128przerwa 404zdarze 245

szablonfont_XMEGAtmpl 326image_XMEGAtmpl 343

szum 463szybko przesy ania danych 126

ledzenie wi zki 333rodowisko

graficzne 11programistyczne 11VSIDE 542WinAVR 47

Ttabela FAT 130tablica

framebuf 402 408plugintbl 552 555tekst 208z kodem wynikowym 543

taktowanieDAC 296mikrokontrolera 473

technologia OLED 44temperatura mikrokontrolera 239 241termistor 262 290

NTC 263PTC 263

termometrLM35 249 250z alarmem 251

termostat 290test uk adu VS1003B 503testowanie obrazu 319timer 16 62

TCC0 20

TCC1 399transakcja 59 62 65transakcje 17 103ndash107transakcyjna obs uga LCD 58transakcyjny dost p do SPI 95transfer 91

danych 97wynikoacutew 254

transmisja 72 83tryb

bez znaku 234ci g ej konwersji 252czterobitowy 153dwukana owy 301graficzny 416graficzny VGA 407idle 419jednobitowy 153LPC 371monochromatyczny 397 407oszcz dzania energii 94 306pracy multipleksera 226pracy SPI 157roacute nicowy 232single slope 312SPI 153tekstowy 413tekstowy VGA 397z pojedynczym wej ciem 234ze znakiem 235

trybygenerowania PWM 467pracy karty 153pracy przetwornika 231pracy SPI 74pracy uk adu 508

twierdzenie Nyquista 258tworzenie

adresu 84nak adek 417obrazu 335tablicy 543

typ__uint24 119karty 160niekompletny 60wyliczeniowy 114

typyoperandoacutew 29w AVR 34

Kup książkę Poleć książkę

584 AVR Uk ady peryferyjne

Uuchwyt handle 64 113uk ad

AD725 427 431buforowy 294CS 361DAC 284dataloggera 267detekcji awarii zasilania 559generuj cy obraz 393HiRes 477ICL7660 47LM35 250 251SampH 293sterowania sygna em 379USART 401VS1003B 496 503 508 530 538 556VS100XX 529wzmacniania sygna u 227

uk ady peryferyjne 9uruchomienie komparatora 287urz dzenie

master 72slave 72

u rednianie 259utrata danych 141u ycie wstawki asemblerowej 33

VVGA 393

Wwarto ci kalibracyjne

ADC 564oscylatoroacutew 564temperatury 564

warunkowa kompilacja 36WE Write Enable 375wej cie composite video input 425wektor przerwa 38 257wideo 391wielko pami ci 86 377w czenie DAC 299wska nik na struktur 27wska niki 32wstawki asemblerowe 24 33wtyczka 535 541 544

SineDTMF Generator 537VGA 396

wyboacuter cz stotliwo ci PWM 465 474wykorzystanie

DMA 254 518

EuroSCART 428PWM 461rejestroacutew 34

wyliczanie predyktora 489wy wietlacze

alfanumeryczne 43 45graficzne 43 309LCD 43OLED 46

wy wietlanielitera u 213map bitowych 344obrazu 333 346 406obrazu VGA 393

wywo ania zwrotne callbacks 98asynchroniczne 101synchroniczne 101

wyzwalanie konwersji 245wzmacniacz 446wzmacniacz operacyjny 279wzmacnianie sygna u 227

XXMEGA 9 18

Zzapis

bufora 269danych 176d wi ku 440 556

zasilaniekarty 154pami ci 109

zatrzask 368zatrzask 74HC573 433zatrza ni cie adresu 369zdarzenia 297zdarzenie compare match 399zegar 383 420 426zintegrowane rodowisko programistyczne 11z cze EuroSCART 425 428 429zmiana

g o no ci 527wielko ci strony 94

znaki 56

roacuted onapi cia odniesienia 284sygna u 240

Kup książkę Poleć książkę

Page 21: Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8 AVR. Ukäady peryferyjne Rejestry dost pu do pami ci RAM .....513 Rejestr adresu

56 AVR Uk ady peryferyjne

Definiowanie w asnych znakoacutewUk ad HD44780 jest wyposa ony w 64 bajty pami ci CGRAM (ang Character Ge-nerator RAM) ktoacutera mo e przechowywa mapy bitowe 8 znakoacutew o matrycy 5times8 pikselilub 4 znakoacutew o matrycy 5times10 pikseli Przyk ad definicji znaku na matrycy 5times8 poka-zano na rysunku 223

Rysunek 223Przyk ad definicji w asnego znakuw pami ci CGRAM Znak rysujemyna matrycy 5times8 bitoacutew polazaciemnione odpowiadaj warto ci 1pola bia e warto ci 0 Wartowyliczon dla ka dej linii pikseliwpisujemy do pami ci CGRAMsterownika Najstarsze 3 bity ka degobajta (pola szare) s bez znaczeniamdash wy wietlacz pomija jeprzy wy wietlaniu obrazu

1

2

3

4

5

6

7

0 00100 = 4

01110 = 14

11111 = 31

00100 = 4

00100 = 4

00100 = 4

11111 = 31

01110 = 14

Adres Warto

Dost p do tej pami ci jest mo liwy dzi ki wys aniu polecenia ustawiaj cego adreszapisuodczytu pami ci CGRAM Po jego wys aniu wszystkie operacje zapisu i od-czytu dotycz tej pami ci a nie pami ci DDRAM Aby wroacuteci do adresowania pa-mi ci DDRAM nale y wybra jej adres lub dokona operacji wymagaj cej przesu-ni cia kursora

Pami CGRAM jest pami ci ulotn po ponownym w czeniu zasilania definicjeznakoacutew musz by ponownie przes ane przez procesor

Bity o warto ci 1 w definicji znaku odpowiadaj w czonym pikselom bity o warto-ci 0 pikselom wy czonym Najstarsze 3 bity ka dego bajta w pami ci CGRAM s

bez znaczenia mdash te pozycje nie s wy wietlane przez matryc Definiuj c znak nale-y tak e pami ta e ostatnia linia wy wietlana przez matryc (w zale no ci od wiel-

ko ci matrycy znaku linia 8 lub 10) powinna zawiera same zera mdash w tej linii b dziewy wietlany kursor

Najcz ciej matryce LCD pod czone do sterownika HD44780 maj organizacj 5times8czyli jeden znak jest definiowany przez 8 kolejnych bajtoacutew okre laj cych stan po-szczegoacutelnych linii tworz cych znak Stwoacuterzmy funkcj ktoacuterej zadaniem b dzie za a-dowanie definicji znakoacutew z pami ci FLASH mikrokontrolera do pami ci CGRAM

void lcd_defchar_P(uint8_t charno prog_uint8_t chardef) hd44780_outcmd(HD44780_CGADDR(charno8)) hd44780_wait_ready(40) for(uint8_t c=0clt8c++) hd44780_outdata(pgm_read_byte(chardef))

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 57

hd44780_wait_ready(40) chardef++

Funkcja LCD_defchar_P jako argumenty przyjmuje numer definiowanego znaku (0 ndash 7)oraz wska nik do obszaru pami ci FLASH zawieraj cego definicj znaku (obszarten zajmuje 8 nast puj cych po sobie bajtoacutew) Jak widzimy funkcja najpierw ustawiaw a ciwy adres pod ktoacuterym znajdzie si pocz tek definicji znaku w pami ci CGRAMmdash poniewa jeden znak jest opisywany za pomoc 8 bajtoacutew kolejne adresy znakoacutewto kod_znakutimes8 Nast pnie dane opisuj ce znak s adowane z pami ci mikrokontrolerai zapisywane w pami ci CGRAM sterownika Poni szy program ilustruje wykorzy-stanie funkcji LCD_defchar_P

prog_uint8_t char1[8][8]=0000000255 00000025525500000255255255 0000255255255255 00025525525525525500255255255255255255 0255255255255255255255255255255255255255255255

int main() for(uint8_t x=0xlt8x++) lcd_defchar_P(xampchar1[x][0]) Za aduj wzorce znakoacutew lcd_init() for(uint8_t x=0xlt8x++) lcd_putchar(x) Wy wietl znaki o kodach 0 ndash 7 while(1)

W pierwszej linii funkcji main nast puje za adowanie nowych definicji znakoacutew dopami ci CGRAM nast pnie inicjalizowany jest wy wietlacz po czym w pierwszejlinii s wy wietlane znaki o kodach 0 ndash 7 a wi c znaki ktoacuterych definicja zosta aprzes ana z mikrokontrolera

Zauwa e pami CGRAM podobnie jak DDRAM mo emy zapisywa i odczytywaprzed inicjalizacj modu u LCD Proces inicjalizacji jest potrzebny tylko do prawi-d owego wy wietlania na ekranie LCD

Poniewa dane potrzebne do wy wietlenia znaku s na bie co pobierane z pami cipodczas od wie ania matrycy LCD jakiekolwiek zmiany w definicji znaku kiedy jest onwidoczny na LCD poci gaj za sob natychmiastowe zmiany w wy wietlanym obrazieMo na t w a ciwo sterownika wykorzysta do stworzenia prostych animacji

void lcd_box(uint8_t y) hd44780_outcmd(HD44780_CGADDR(0)) Zaczynamy od znaku o kodzie 0 hd44780_wait_ready(40) for(uint8_t c=0cltyc++) Stwoacuterz linie z w czonymi pikselami hd44780_outdata(0xFF) hd44780_wait_ready(40) for(uint8_t c=yclt8c++) Stwoacuterz linie z wy czonymi pikselami hd44780_outdata(0x00) hd44780_wait_ready(40)

Kup książkę Poleć książkę

58 AVR Uk ady peryferyjne

int main() lcd_init() lcd_putchar(0) while(1) for(uint8_t x=0xlt8x++) lcd_box(x) _delay_ms(100) for(int8_t x=7xgt=0x--) lcd_box(x) _delay_ms(100)

Funkcja main wy wietla na LCD tylko jeden znak o kodzie 0 a nast pnie cykliczniezmienia jego definicj w pami ci CGRAM W efekcie posta znaku wy wietlana naekranie ci gle si zmienia

Transakcyjna obs uga LCDPokazana do tej pory obs uga LCD alfanumerycznego mia a pewne wady Jak wiemyoperacje odwo uj ce si do kontrolera LCD s niezwykle wolne cykl odczytuzapisudowolnego rejestru kontrolera trwa co najmniej 1600 ns co dla MCU taktowanegozegarem 32 MHz przek ada si na czas wykonania oko o 52 instrukcji asemblera Cogorsza wi kszo komend realizowanych przez kontroler jest wykonywana w czasieoko o 37 s co przek ada si na tysi ce zmarnowanych taktoacutew MCU St d te jaki-kolwiek zapisodczyt LCD to z perspektywy programu straszne marnotrawstwo czasu

Problem ten dotyczy ka dego urz dzenia IO ktoacutere dzia a wolniej ni procesor W takiejsytuacji warto napisa pewn warstw po redni mdash sterownik mdash ktoacuterego zada-niem b dzie buforowanie da dost pu do urz dzenia i rozstrzyganie konfliktoacutewdzi ki czemu roacute ne cz ci programu b d bdquomia y wra enierdquo e maj wy czny do-st p do urz dzenia

Pokazane wcze niej funkcje obs ugi LCD maj jeszcze jedn wad mdash nie s wspoacute bie -ne czyli nie mo na ich wykonywa jednocze nie w kilku miejscach programu w tymw szczegoacutelno ci w programie g oacutewnym i w funkcjach obs ugi przerwa W wielu przy-padkach ta wada jest bez znaczenia jednak czasami jest uci liwa mdash dla przyk adugdy na wy wietlany tekst chcieliby my na o y inne informacje np o dacie lub godzi-nie Oczywi cie wy wietlanie mo na zorganizowa tak aby nie by o potrzeby pisaniawspoacute bie nego kodu np poprzez zastosowanie bufora pami ci VRAM kontrolera LCDRodzi to jednak kolejne problemy i jest ma o eleganckie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 59

Zastanoacutewmy si w jaki sposoacuteb najlepiej jednocze nie rozwi za problem wolnegodost pu do urz dzenia i wspoacute bie no ci kodu Rozwi zaniem mo e by wprowadze-nie tzw transakcji Transakcj nazywamy zbioacuter operacji tworz cych pewn ca-o To co wyroacute nia tak wykonywany zestaw operacji to atomowo spoacutejno

izolacja i trwa o Pod tymi terminami kryje si istota wykonywanej operacji Ato-mowo transakcji zapewnia e jest ona wykonywana w sposoacuteb niepodzielny co gwa-rantuje nam prawid ow wspoacute prac z danym urz dzeniem IO w tym przypadku kon-trolerem LCD Wa na dla nas jest tak e izolacja mdash dzi ki temu inne operacje na LCD(inne transakcje) nie b d mia y wp ywu na wynik aktualnie wykonywanej transakcjimdash nie b d zak oacuteca y jej wykonania z drugiej strony nasza transakcja nie zak oacuteciwykonania innych Trwa o z kolei zagwarantuje nam e je li sterownik potwierdziwykonanie transakcji to znaczy e efekt jej dzia ania jest wy wietlony na LCD Tacecha nie jest nam a tak potrzebna mdash jest ona wydawa oby si oczywista Niemniej jestto pewna gwarancja e ca a operacja przebieg a poprawnie i w efekcie LCD znajdujesi w okre lonym przez nas stanie Tyle teorii przejd my do praktyki

Kody poni szego przyk adu znajduj si w katalogu PrzykladyLCD-alfaLCD-transact

Aby zapewni transakcyjny dost p do LCD musimy stworzy pewne struktury danychktoacuterych zadaniem b dzie przechowywanie informacji o operacjach sk adaj cych sina transakcje i stanie ich wykonania W tym celu pos u ymy si wiadomo ciami z roz-dzia u 5 bdquoJak uporz dkowa chaos czyli z o one typy danych i listyrdquo Do przecho-wywania oczekuj cych transakcji pos u ymy si buforem pier cieniowym zanimjednak go zaimplementujemy zastanoacutewmy si jak powinna wygl da struktura prze-chowuj ca informacje o transakcji Struktura ta powinna zawiera co najmniej

pole danych (data) z informacjami ktoacutere maj by przes ane do kontrolera LCD

pole okre laj ce liczb danych do wys ania (len)

pole okre laj ce realizowane polecenie dla LCD (cmd) mdash pole to pos u yprogramowi sterownika do w a ciwej interpretacji danych znajduj cych siw polu data

kilka poacutel kontrolnych przechowuj cych informacje potrzebne do realizacjisamej transakcji Jedno z nich mdash Ready mdash b dzie przyjmowa warto trueje li dana transakcja zosta a zrealizowana lub false w przeciwnym przypadkuZnaczenie drugiego pola mdash SelfDel mdash mo e wydawa si nieco enigmatycznepole to okre la czy pami przydzielona dla transakcji ma by zwolnionaw sterowniku LCD (warto true) czy te zostanie zwolniona w programie(warto false)

Oto jak mo e wygl da struktura definiuj ca transakcj typedef struct volatile bool Ready 1 true je li transakcja zosta a zrealizowana bool SelfDel 1 true je li pami przydzielona transakcji ma zosta zwolniona LCD_Cmd cmd 2 Polecenie do zrealizowania uint8_t len 6 D ugo polecenia

Kup książkę Poleć książkę

60 AVR Uk ady peryferyjne

unsigned 0 Wyroacutewnanie do granicy bajta uint8_t data[] Dane transakcji LCD_trans

Nale y zwroacuteci uwag na poleunsigned 0

Nie definiuje ono adnego pola struktury ale jedynie informuje kompilator e kolejnepole (w naszym przyk adzie o nazwie data) ma by wyroacutewnane do granicy bajta mdashdzi ki temu dost p do kolejnego pola b dzie odbywa si szybciej Z kolei samo poledata jest zadeklarowane jako tzw typ niekompletny

Typ niekompletny (ang incomplete type) to typ ktoacuterego rozmiaru nie da si okre li

W pokazanym przyk adzie rozmiaru pola data nie da si okre li gdy zosta on za-deklarowany jako typ tablicowy z tym e nie podano wielko ci tablicy Wielko ci niepodano gdy na etapie deklaracji struktury nie wiemy jakiej wielko ci dane b d w niejprzechowywane Tego typu deklaracja ma bardzo powa ne konsekwencje mdash skorowielko ci pola data nie da si okre li to jaki b dzie wynik dzia ania operatora sizeof(LCD_trans) Kompilator stara si jako wybrn z tej sytuacji w zwi zku z czym

zwroacuteci wielko struktury ale tak jakby pole data w ogoacutele nie istnia o mdash jego roz-miar b dzie wynosi 0 W ramach wiczenia zastanoacutew si ile bajtoacutew pami ci b dziezajmowa a struktura LCD_trans

Skoro dysponujemy ju struktur przechowuj c poszczegoacutelne transakcje pora nastworzenie obiektu przechowuj cego kolekcj transakcji Dodanie kolejnej strukturyb dzie polega o na dodaniu jej do takiego obiektu z drugiej strony program sterownikaLCD b dzie moacuteg z tej kolekcji pobiera kolejne transakcje do realizacji Opis ten przy-pomina opis dzia ania bufora pier cieniowego mdash z jednym wyj tkiem mdash po zape nie-niu ca ego bufora nie b dziemy usuwa niezrealizowanych transakcji lecz zabloku-jemy dodawanie kolejnych W tym celu pos u ymy si definicj nast pnej struktury

typedef struct LCD_trans elements[LCD_MAXTRANS] Wska niki do transakcji uint8_t Beg Pierwszy element bufora uint8_t Count Liczba elementoacutew w buforze CircBuffer

Struktura ta zawiera deklaracj tablicy wska nikoacutew na transakcje (pole elements)Poniewa jest to tablica musimy zna liczb jej elementoacutew mdash jest ona zadeklarowanaw sta ej LCD_MAXTRANS

define LCD_MAXTRANS 10 Maksymalna liczba pami tanych transakcji

Do realizacji bufora s potrzebne jeszcze dwa pola Beg wskazuj ce na pierwsztransakcj w buforze oraz pole Count okre laj ce liczb transakcji znajduj cych siw buforze Je li Count == 0 to znaczy e w buforze nie ma adnych oczekuj cychtransakcji a je li Count == LCD_MAXTRANS to znaczy e bufor jest pe ny i nie mo na

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 61

dodawa do niego kolejnych transakcji W a ciwo t wykorzystuj dwie zdefiniowanew pliku LCD_transc funkcje

static inline bool cbIsFull(CircBuffer cb) return cb-gtCount == LCD_MAXTRANS

static inline bool cbIsEmpty(CircBuffer cb) return cb-gtCount == 0

Jak pami tamy w przypadku funkcji modyfikatory static inline powoduj e danafunkcja nie b dzie istnie jako samodzielna lecz w ka dym miejscu w ktoacuterym jestwywo ywana jest wstawiany raczej jej kod a nie wywo anie Ma to znaczenie dlakroacutetkich funkcji (a wi c takich jak pokazane powy ej) dla ktoacuterych koszty wywo anias zazwyczaj wi ksze ni koszty umieszczenia cia a funkcji w miejscu jej wywo aniaTego typu funkcje zachowuj si w sposoacuteb zbli ony do makrodefinicji (z tym e re-spektuj wszystkie regu y j zyka C w szczegoacutelno ci kolejno operatoroacutew czy kon-trol typoacutew)

Takie funkcje jako argument pobieraj adres bufora na ktoacuterym maj operowa W na-szym przypadku bufor jest zdefiniowany nast puj co

static CircBuffer LCD_TransBuffer Bufor na transakcje

Nale y zauwa y e jest on zdefiniowany jako struktura globalna z modyfikatoremstatic Modyfikator ten ogranicza zasi g widoczno ci zmiennej LCD_TransBuffer dopliku w ktoacuterym zmienna ta zosta a zdefiniowana (w tym przypadku modyfikator staticjest niejako przeciwie stwem modyfikatora extern) Dzia anie to ma jedynie znaczeniekosmetyczne mdash uniemo liwia odwo anie si do bufora za pomoc funkcji ktoacutere niezosta y zdefiniowane w miejscu jego definicji Oproacutecz funkcji umo liwiaj cych okre-lenie stanu bufora potrzebne s jeszcze funkcje umo liwiaj ce dodanie i pobranie trans-

akcji Pierwsz funkcj b dzie funkcja dodaj ca transakcj do buforabool cbAdd(CircBuffer cb LCD_trans elem) ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsFull(cb)) return false Czy jest miejsce w kolejce uint8_t end = (cb-gtBeg + cb-gtCount) LCD_MAXTRANS cb-gtelements[end] = elem Dodaj transakcj ++cb-gtCount Liczba elementoacutew w buforze return true Wszystko OK

Funkcja ta dodaje transakcj (zmienna elem) do bufora ko owego Zanim transakcjazostanie dodana sprawdzane jest czy w buforze jest miejsce mdash je li nie funkcjazwroacuteci false Je li dodanie jest mo liwe warto licznika okre laj cego liczb trans-akcji przechowywana w buforze (Count) zwi ksza si o jeden Warto zastanowi si te dlaczego praktycznie ca e cia o tej funkcji jest zamkni te w sekcji atomowej (ATOMIC_BLOCK) Jedn z cech naszego sterownika ma by mo liwo wspoacute bie nego dost pu

Kup książkę Poleć książkę

62 AVR Uk ady peryferyjne

do LCD mdash to znaczy e danie np zapisu do LCD mo e wyst pi zaroacutewno w g oacutewnejp tli programu jak i asynchronicznie w przerwaniu St d te wynika e funkcja do-daj ca transakcj musi by napisana w sposoacuteb zapewniaj cy jej poprawn prac w sytu-acji gdy zostanie ona przerwana i ponownie wywo ana przed zako czeniem dzia aniajej poprzedniej instancji Umieszczenie cia a tej funkcji w sekcji atomowej nam to za-pewnia mdash dzi ki temu bufor transakcji zawsze b dzie spoacutejny Dla zaspokojenia cie-kawo ci warto usun sekcj atomow i sprawdzi jak wtedy b dzie zachowywa si tafunkcja i jak wp ynie to na spoacutejno przechowywanych danych

Drug niezb dn funkcj jest funkcja odczytuj ca bufor transakcji i zwracaj ca trans-akcj do zrealizowania (lub NULL je li adnej transakcji nie ma w buforze)

LCD_trans cbRead(CircBuffer cb) LCD_trans elem ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsEmpty(cb)) return NULL Bufor pusty nie mo na zwroacuteci elementu elem = cb-gtelements[cb-gtBeg] cb-gtBeg = (cb-gtBeg + 1) LCD_MAXTRANS -- cb-gtCount Zmniejszamy liczb elementoacutew pozosta ych w buforze return elem

Funkcja ta jest bardzo podobna do poprzedniej mdash najpierw sprawdza czy bufor za-wiera jak oczekuj c transakcj (cbIsEmpty(cb)) je li tak to zwraca adres opisuj -cej j struktury i zmniejsza liczb transakcji oczekuj cych (pole Count) W ten sposoacutebmamy zrealizowan ca funkcjonalno zwi zan z obs ug bufora pier cieniowegoPokazane funkcje s uniwersalne i z bardzo podobnych (lub wr cz tych samych) b -dziemy korzysta w kolejnych rozdzia ach w kontek cie np obs ugi transakcji zwi -zanych z interfejsami szeregowymi

Pora przej do samego sterownika LCD Jego zadaniem b dzie sprawdzenie czyw buforze oczekuj jakie transakcje do realizacji a je li tak to ich wykonanie Ponie-wa dane do LCD mog by wysy ane co okre lony minimalny czas znacznie d u -szy ni czas jakiego na to zadanie potrzebuje mikrokontroler do wysy ania kolejnychpaczek danych pos u ymy si timerem Timer b dzie generowa przerwanie nadmiaru(TCD0_OVF_vect) ktoacutere b dzie wyznacza o tempo w jakim kolejne porcje danych b -d trafia y do LCD Z noty katalogowej kontrolera wynika e minimalny czas trwa-nia wysokiego stanu sygna u Enable to 230 ns a okres tego sygna u nie powinien bykroacutetszy ni 500 ns Poniewa nasz dost p do LCD odbywa si w sposoacuteb nieblokuj cyMCU wi c szybko wysy ania danych do LCD jest bez znaczenia St d te w poka-zanym przyk adzie przyj to e dane b d wysy ane co 4 s co okre la sta a

define LCD_ACCESSTIME 0000004

Poniewa komunikacja z LCD odbywa si w sposoacuteb nieblokuj cy nie zale y nam tena czasie (i tak w stosunku do czasu od wie ania samego LCD jest on bardzo kroacutetki)w efekcie nie ma potrzeby odczytywania flagi busy kontrolera Dzi ki temu w cz ciprzypadkoacutew mo emy w ogoacutele zrezygnowa z sygna u wyboru RW i wymusi jego sta y

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 63

poziom logiczny umo liwiaj cy zapis do LCD Dzi ki temu mo na zaoszcz dzi do-datkowy pin IO1

Ca a logika naszego sterownika jest zawarta w funkcji obs ugi przerwania przepe nieniatimera (TCD0_OVF_vect) Poniewa LCD jest po czony z MCU w trybie 4-bitowym(dla zaoszcz dzenia liczby wykorzystanych pinoacutew IO) kolejne 8-bitowe dane muszby podzielone na dwie tetrady i wys ane do LCD w kolejno ci starszam odsza tetradaInformacja o aktualnie wysy anych danych jest umieszczona w zmiennej trans o typie

static struct uint8_t pos 6 Pozycja w polu danych aktualnej transakcji uint8_t nibble 1 Ktoacutera tetrada jest wysy ana seq

Dlaczego tak Dzi ki wykorzystaniu struktury i poacutel bitowych mo na zaoszcz dzi je-den bajt pami ci SRAM Ze wzgl du na wielko pami ci obs ugiwanej przez kon-troler LCD mo emy by pewni e transakcje zawieraj ce wi cej ni 63 bajty s ra-czej nierealne (nie mia yby wi kszego sensu) St d te do przechowywania informacjio aktualnie wysy anym bajcie danych wystarczy 6 bitoacutew mdash tyle samo zosta o wyko-rzystanych do okre lenia d ugo ci pola danych transakcji w strukturze LCD_trans Zaosz-cz dzony bit mo na po wi ci na flag nibble okre laj c ktoacutera tetrada (m odszastarsza)jest wysy ana Bez poacutel bitowych flaga ta zaj aby dodatkowy bajt pami ci

Przejd my do implementacji sterownika Pierwsz rzecz jak nale y sprawdzi jestto czy w buforze czeka jaka transakcja do zrealizowania Odpowiedzialny za to jestfragment kodu obs ugi przerwania nadmiaru timera

if(trans == NULL) Nic do zrobienia sprawd my czy jaka transakcja oczekuje trans=cbRead(ampLCD_TransBuffer) Czy jest jaka oczekuj ca transakcja seqpos=0 seqnibble=0 if(trans == NULL) TCD0_CTRLA=TC_CLKSEL_OFF_gc Nie ma adnych transakcji mdash wy cz timer

W przypadku gdy adna transakcja nie oczekuje na realizacj timer jest wy czanymdash dzi ki temu nie b d zg aszane kolejne przerwania przepe nienia i MCU nie b -dzie traci czasu na ich obs ug Co prawda wynikaj cy z tego zysk czasowy jest mar-ginalny lecz ma to istotniejsz konsekwencj mdash w przypadku usypiania MCU zb d-ne przerwanie timera nie b dzie niepotrzebnie wybudza o procesora W takiej sytuacjiponowne w czenie timera nast pi dopiero w funkcji dodaj cej transakcj do kolejkimdash a wi c w sytuacji gdy mamy pewno e istnieje oczekuj ca transakcja

Druga cz funkcji obs ugi przerwania jest zwi zana z realizacj samej transakcjiW pokazanym przyk adzie zaimplementowano tylko jeden typ transakcji mdash daniezapisu a cucha tekstowego pod wskazany adres VRAM (na okre lonej pozycji LCD)Je li zajdzie taka potrzeba programista mo e zaimplementowa inne polecenia i doda

1 Warto zauwa y e w bdquoklasycznejrdquo obs udze LCD te nie musimy czyta stanu flagi busy zamiast tego

wystarczy wprowadza p tle opoacute niaj ce Jednak poniewa taka obs uga blokuje MCU nie jest onazalecana Wady tej nie ma dost p transakcyjny co jest jego dodatkow zalet

Kup książkę Poleć książkę

64 AVR Uk ady peryferyjne

kod odpowiedzialny za ich obs ug Zauwa my e ka da transakcja musi zawieraadres pocz tku pami ci wideo od ktoacuterego b dzie zapisywany tekst Dzieje si takdlatego e transakcja wykonana wcze niej mo e ustawi wska nik zapisu na dowolnejkomoacuterce pami ci W efekcie tekst z kolejnej transakcji by by wy wietlany od komoacuterkina ktoacuterej zako czy si zapis poprzedniej transakcji Takie dzia anie oczywi cie jestniedopuszczalne st d te ka dy zapis do pami ci wideo poprzedza ustawienie rejestruindeksowego Problem ten mo na rozwi za tak e w inny sposoacuteb mdash poprzez wpro-wadzenie tzw uchwytoacutew (ang handlers) ktoacutere zawiera yby stan kontrolera LCDNiemniej to rozwi zanie dodatkowo komplikowa oby nasz sterownik Struktura danych(zawartych w polu data) ma wi c nast puj cy format

bajt nr 0 zawiera warto pozycji od ktoacuterej nale y dokonywa zapisu pami ciwideo mdash jest to warto przesy ana do rejestru okre laj cego adres zapisu

kolejne bajty zawieraj a cuch znakowy ktoacutery nale y umie ci w pami ciCGRAM

Poniewa bajt nr 0 zawsze zawiera warto wpisywan do rejestroacutew steruj cych kon-trolera podczas jego wysy ania jest ustawiana linia RS sygnalizuj ca zapis do rejestruPodczas wysy ania kolejnych bajtoacutew linia ta jest zerowana w zwi zku z czym zapisodbywa si do pami ci CGRAM

Kod obs uguj cy transakcj wygl da nast puj coif(trans) Jest transakcja do zrealizowania uint8_t dat=trans-gtdata[seqpos] if(seqnibble == 0) datgtgt=4 To trzeba zmieni je li linie danych nie s po czone z pinami 0 ndash 3 portu IO hd44780_outnibble_nowait(dat amp 0x0F seqpos = 0) Zapisujemy rejestr steruj cy lub dane ++seqnibble if(seqnibble == 0) ++seqpos Co drug tetrad zwi kszamy pozycj bufora if(seqpos gt= trans-gtlen) trans-gtReady=true Koniec transakcji if(trans-gtSelfDel) free_re(trans) Zwolnij pami transakcji je li tak sobie yczy programista trans=NULL Koniec transakcji CLR(OUT HD44780_E)

Ta cz przerwania wysy a kolejne tetrady do kontrolera LCD Warto zastanowi sinad dzia aniem sekwencji

++seqnibble

Poniewa pole nibble jest jednobitowe operacja inkrementacji prowadzi do zmianystanu tego pola na przeciwny (pole to ma warto 0 lub 1) Kiedy zostan wys anewszystkie dane przeznaczone dla kontrolera obs uga transakcji ko czy si Stan tensygnalizuje nadanie warto ci true polu Ready struktury LCD_trans Dzi ki temu pro-gram mo e sprawdzi asynchronicznie w stosunku do przerwania kiedy transakcjauleg a zako czeniu Opcjonalnie jest wykonywana jeszcze jedna funkcja mdash je li poleSelfDel ma warto true to pami zarezerwowana na transakcj jest automatycznie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 65

zwalniana W tym celu wykorzystuje si funkcj free_re ktoacuterej prototyp jest zade-klarowany w pliku Alloc_safeh Funkcja ta wywo uje funkcj biblioteczn free ktoacute-ra zwalnia pami przydzielon dynamicznie na stercie Poniewa funkcja ta nie jestfunkcj reentrant nale y stworzy odpowiedni bdquoprotez rdquo opakowuj c j w blokatomowy co zapewnia e nie zostanie ona ponownie wywo ana zanim jej poprzed-nia instancja nie zako czy dzia ania Oczywi cie lepszym rozwi zaniem by oby napi-sanie w asnych funkcji dynamicznej alokacji pami ci ktoacutere b d reentrant

Bardzo wa ne jest aby pole SelfDel mia o warto true wy cznie dla transakcjidla ktoacuterych pami zosta a przydzielona dynamicznie funkcj malloc (lub jej po-chodnymi) W pozosta ych przypadkach pole to musi mie warto false mdash nie-stosowanie si do tej regu y spowoduje b d mened era pami ci i najprawdopo-dobniej nieprzewidywalne dzia anie programu

Drug wa n zasad jest aby zmienna zawieraj ca dane transakcji nie by azmienn automatyczn mdash zmienne takie s automatycznie niszczone po opusz-czeniu zawieraj cej je funkcji W rezultacie obszar pami ci zawieraj cy danetransakcji mo e zosta wykorzystany przez inne zmienne co spowoduje uszkodzeniezawartych w nim danych

Pami przydzielona transakcji musi by alokowana w sposoacuteb dynamiczny (funkcjamalloc_re) ewentualnie mo e to by pami alokowana dla zmiennej globalnej lubstatycznej mdash zmienne tego typu istniej przez ca y czas ycia programu

Warto te zauwa y e instrukcje steruj ce stanem linii Enable kontrolera LCD(SET(OUT HD44780_E) i CLR(OUT HD44780_E)) s rozdzielone wieloma innymi in-strukcjami Dzi ki temu generowany impuls dodatni tego sygna u ma czas trwania gt230 ns wymagany w specyfikacji kontrolera Nawet dla XMEGA taktowanej zegarem32 MHz 230 ns przek ada si na oko o 7 instrukcji asemblera mdash czas jaki z pewno-ci up ynie pomi dzy wykonaniem obu powy szych instrukcji steruj cych

Do wysy ania danych do kontrolera zosta a wykorzystana nieco zmodyfikowanafunkcja hd44780_outnibble_nowait roacute ni ca si od jej protoplasty hd44780_outnibbletylko tym e nie czeka na sygna braku zaj to ci mikrokontrolera (nie realizuje teopoacute nie ) Nie jest to potrzebne gdy kolejne tetrady s wysy ane w odst pach cza-sowych okre lanych przez timer

Mamy wi c zapewnion obs ug transakcji i mo liwo transakcyjnego wy wietlaniadanych na LCD musimy jeszcze mie funkcj ktoacutera tworzy odpowiednie transakcjemdash jest odpowiednikiem funkcji bezpo rednio wysy aj cej dane znakowe do LCDOdpowiednikiem tym jest pokazana poni ej funkcja

bool LCD_PutText_B(uint8_t x uint8_t y char txt LCD_trans buf bool autodel) buf-gtcmd=LCD_Text buf-gtReady=false buf-gtSelfDel=autodel Czy zwolni pami po zako czeniu transakcji buf-gtdata[0]=HD44780_DDADDR(x+y0x40) Ustaw adres w DDRAM strcpy((char)ampbuf-gtdata[1] txt) Skopiuj dane tekstowe + NULL

Kup książkę Poleć książkę

66 AVR Uk ady peryferyjne

buf-gtlen=strlen(txt) + 1 D ugo tekstu + pozycji + NULL ndash 1 bool ret=cbAdd(ampLCD_TransBuffer buf) if((ret==false) ampamp (autodel)) free_re(buf) Brak miejsca w kolejce else TCD0_CTRLA=TC_CLKSEL_DIV1_gc Preskaler 1 mdash odblokuj timer return ret

Funkcja ta buduje transakcj odpowiedzialn za wy wietlenie napisu txt na wskaza-nej pozycji x y LCD Wszystkie dane o transakcji zostan umieszczone w buforzew pami ci ktoacuterej adres jest okre lany wska nikiem buf Pami w buforze musi bywystarczaj co du a aby pomie ci ca transakcj Dodatkowy parametr autodel okre laczy pami ta ma by automatycznie zwalniana po obs u eniu transakcji (true) czynie (false) Je li transakcj uda o si umie ci w kolejce funkcja zwraca true Wartozauwa y e w takim przypadku funkcja uruchamia te timer (w naszym przypadkujest to timer TCD0) odpowiedzialny za generowanie przerwania Funkcja obs ugi prze-rwania wysy a dane do LCD

Pewn odmian powy szej funkcji jest funkcjabool LCD_PutText(uint8_t x uint8_t y char txt) LCD_trans trans=malloc_re(sizeof(LCD_trans) + strlen(txt) + 2) bool ret=LCD_PutText_B(x y txt trans true) return ret

Wykorzystuje ona funkcj LCD_PutText_B z tym e najpierw alokuje dynamiczniepami potrzebn na przechowanie tworzonej transakcji

Mamy komplet potrzebnych funkcji a wi c sprawd my jak ca o sprawdza siw praktyce W pliku LCD-transactc znajduje si kod pokazuj cy jak dzia aj naszetransakcje Aby to by o mo liwe nale y zainicjalizowa kontroler LCD

LCD_init()

Wykorzystujemy tu znan ju funkcj inicjalizuj c mdash nie ma potrzeby jej zmienia gdy operacja inicjalizacji LCD jest jednorazowa i nie trzeba wykonywa jej w posta-ci transakcji W drugim kroku musimy zainicjalizowa wykorzystywany timer i systemprzerwa

LCD_Timer_init(ampTCD0)PMIC_CTRL|=PMIC_LOLVLEN_bm Odblokuj przerwania niskiego poziomusei()

Poniewa dost p do LCD z pewno ci nie jest czynno ci krytyczn czasowo prze-rwaniom timera nadano najni szy priorytet Dzi ki temu mo na innym bardziej kry-tycznym przerwaniom nada wy sze priorytety i uzyska w ten sposoacuteb zmniejszenieczasu latencji obs ugi przerwa Sama inicjalizacja timera jest niezwykle prosta

void LCD_Timer_init(TC0_t tc) tc-gtINTCTRLA=TC_OVFINTLVL_LO_gc Odblokuj przerwania nadmiaru timera i nadaj im niski priorytet tc-gtPER=F_CPULCD_ACCESSTIME Przerwanie co 4 us (niezale nie od F_CPU)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 67

Sprowadza si ona tylko do odblokowania mo liwo ci zg aszania przerwania nadmia-ru oraz konfiguracji rejestru PER tak aby przerwania by y generowane co ok 4 s mdashniezale nie od cz stotliwo ci taktowania CPU Mo emy wi c przyst pi do wy wie-tlenia pierwszego napisu

LCD_PutText(00 Numer)

Powy sza funkcja ma jedn wad mdash alokuje dynamicznie pami po ka dym wywo-aniu (pami ta jest automatycznie zwalniana po obs u eniu transakcji) niemniej

ca y proces jest czasoch onny Mo emy tego unikn alokuj c pami bdquor cznierdquo i wielo-krotnie wykorzystuj c zaalokowany blok pami ci Ilustruje to poni szy przyk ad

LCD_trans buf=malloc_re(sizeof(LCD_trans) + 7)

Zmienna buf wskazuje na obszar pami ci ktoacutery mo e pomie ci a cuch 5-znakowyTyle wystarczy na potrzeby tego przyk adu mdash na LCD b d wy wietlane kolejneliczby w zakresie 0 ndash 65 535 najd u sza ma 5 znakoacutew st d te nasz bufor ma tak a nieinn d ugo

while(1) utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(60 bufstr buf false) while(LCD_IsTransCompleted(buf))

Do konwersji liczby na a cuch u yto funkcji bibliotecznej utoa (nag oacutewek stdlibh)Poniewa d ugo a cucha po konwersji jest zmienna (co spowodowa oby pozosta-wianie na LCD bdquoduchoacutewrdquo po poprzednich konwersjach) w kolejnej linii brakuj ceznaki uzupe niono spacjami Nast pnie tworzona jest transakcja w obszarze pami ciprzydzielonym zmiennej buf Ostatnia p tla while jest odpowiedzialna za oczekiwa-nie na zako czenie realizacji transakcji Po jej zako czeniu p tla jest wykonywana odpocz tku

Uwa ny czytelnik z pewno ci zauwa y e pami przydzielana funkcj malloc_renie jest nigdzie zwalniana mdash w normalnej sytuacji spowodowa oby to wyciek pami -ci W naszym przyk adzie jednak program nigdy si nie ko czy nie ma wi c potrzebyzwalniania pami ci wskazywanej przez zmienn buf

Powy szy przyk ad pokazuje jak unikn blokowania CPU na czas dost pu do wolnodzia aj cego urz dzenia jakim jest LCD alfanumeryczny Jednak to nie wszystkiezalety wynikaj ce z zastosowania transakcji Drug wa n zalet naszego rozwi zaniailustruje przyk ad znajduj cy si w katalogu PrzykladyLCD-alfaLCD-transact-intPowa nym ograniczeniem funkcji odpowiedzialnych za dost p do LCD w sposoacutebklasyczny by a niemo no ich wywo ywania z funkcji obs ugi przerwa mdash funkcjeobs ugi LCD nie by y reentrant2 Nasz system oparty na transakcjach nie ma tychwad Aby to zilustrowa zosta stworzony prosty przyk ad mdash tak jak poprzedniow p tli g oacutewnej programu s wy wietlane stale kolejne liczby ale jednocze nie wyko-

2 Poza tym blokowa y CPU na d ugi czas a jak pami tamy funkcje obs ugi przerwa powinny by

wykonywane mo liwie kroacutetko

Kup książkę Poleć książkę

68 AVR Uk ady peryferyjne

rzystano drugi timer (TCD1) w ktoacuterego funkcji obs ugi przerwania przepe nienia jestwy wietlany licznik tych przerwa

ISR(TCD1_OVF_vect) static char int_buf[sizeof(LCD_trans) + 7] static uint16_t cnt char bufstr[6]

utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(61 bufstr (LCD_trans)ampint_buf false)

Jak widzimy w sposoacuteb asynchroniczny z dwoacutech miejsc w programie mo emy uzy-ska dost p do LCD a ka da funkcja bdquoma wra enierdquo e ma LCD na wy czno Przy okazji warto przeanalizowa sposoacuteb w jaki jest rezerwowana pami na trans-akcj w przerwaniu Oczywi cie mo na by wykorzysta dynamiczn alokacj pami cilecz jak wspomniano taka alokacja jest czasoch onna St d te w pokazanym przy-k adzie wykorzystano tablic statyczn int_buf o rozmiarze umo liwiaj cym prze-chowanie kompletnej transakcji Dzi ki temu e zmienna int_buf jest zmienn statycz-n nie jest ona niszczona po zako czeniu funkcji obs ugi przerwania Gdyby pomins owo kluczowe static zmienna ta by aby niszczona a na LCD najprawdopodobniejzacz yby si pojawia przypadkowe tre ci Poniewa pami naszego bufora nie by aalokowana dynamicznie nie mo e ona zosta zwolniona w naszym sterowniku LCDst d te ostatni parametr wywo ania funkcji LCD_PutText_B musi mie warto false

OptymalizacjaPrzy okazji tego i poprzedniego przyk adu warto zastanowi si jeszcze nad jednkwesti mdash optymalizacji W podanych przyk adach wykorzystano wcze niej omoacute-wione funkcje dost pu do wy wietlacza LCD znajduj ce si w plikach hd44780ci hd44780h Wi kszo z zawartych tam funkcji nie jest wykorzystywana jednakkompilator mimo wszystko umieszcza ich kod w pliku wynikowym mdash dzieje si takponiewa nie mo e on bdquostwierdzi rdquo czy funkcje te nie s wykorzystywane w innychfragmentach programu Pami tajmy e kompilator kompiluje poszczegoacutelne pliki roacute-d owe osobno i dana jego instancja nie bdquowierdquo co znajduje si w innych plikach (innychjednostkach kompilacji) Tak ca o ciow wiedz ma dopiero konsolidator (linker)ktoacutery czy stworzone przez kompilator pliki obiektowe (o rozszerzeniu o) w plikwynikowy Linker jednak bdquonie wierdquo ktoacutera z funkcji programu zosta a u yta a ktoacuteranie mdash informacje te ma wy cznie kompilator W ten sposoacuteb powstaje typowe b dneko o w efekcie nasze nieu ywane funkcje nie s usuwane (linker zostawia je bdquonawszelki wypadekrdquo) i zajmuj niepotrzebnie pami Czy mo na temu jako zaradzi Oczywi cie tak W tym celu trzeba po czy si y kompilatora i linkera co zapewniaj od-powiednie opcje kompilacji We w a ciwo ciach projektu (ProjectProperties lub Alt+F7)wybieramy zak adk Toolchain a nast pnie AVRGNU C Compiler i OptimizationZnajdziemy tam pole wyboru o nazwie Prepare functions for garbage collection (ry-sunek 224)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 69

Rysunek 224 Aby da linkerowi mo liwo usuwania nieu ywanych funkcji nale y skompilowaprogram z wybran opcj ndashffunction-sections ktoacutera spowoduje e ka da funkcja programu znajdzie siwe w asnej sekcji

Zaznaczenie tej funkcji spowoduje umieszczenie ka dej funkcji w osobnej sekcji mdashsamo w sobie nie wp ynie to na skroacutecenie kodu wynikowego ale jest warunkiem nie-zb dnym dla podj cia stosownych dzia a przez linker Aby wyeliminowa nieu y-wane funkcje nale y zaznaczy jeszcze w ga zi AVRGNU LinkerOptimization poleGarbage collect unused sections (rysunek 225)

Rysunek 225 Zaznaczenie opcji Garbage collect unused sections (-Wl--gc-sections) spowodujee nieu ywane funkcje zostan usuni te z kodu wynikowego w efekcie kod programu ulegnie skroacuteceniu

Po zaznaczeniu tych opcji program zostanie skroacutecony o kilkaset bajtoacutew Oczywi cieje li wszystkie funkcje by yby wykorzystane nie uzyskaliby my adnego skroacuteceniakodu Niemniej w sytuacji gdy u ywa si bibliotek zazwyczaj przynajmniej czfunkcji nie jest wykorzystywana warto wi c skorzysta z tej mo liwo ci optymalizacji

Kup książkę Poleć książkę

70 AVR Uk ady peryferyjne

Je li mamy do czynienia z prekompilowan bibliotek (lib) to musi ona by skom-pilowana z zaznaczon opcj Prepare functions for garbage collection (-ffunction-sections) Alternatyw jest umieszczenie ka dej funkcji biblioteki w osobnym pliku(tak jak w przypadku bibliotek AVR-libc)

Na ekranie wyboru opcji optymalizacji linkera mamy jeszcze jedn przydatn opcjmdash Relax Branches (-mrelax) Dla mikrokontroleroacutew ktoacutere maj ponad 8 kB pami ciFLASH instrukcje skokoacutew s generowane jako tzw instrukcje d ugie mdash umo liwiajone skok do komoacuterki pami ci FLASH o dowolnym adresie Jednak cen za to jestwyd u enie instrukcji mdash ich kod jest d u szy podobnie jak czas wykonania Nie zawszejednak takie d ugie instrukcje musz by wykonywane mdash je li miejsce docelowe skokule y blisko (w zasi gu instrukcji skokoacutew wzgl dnych) to mo na w kodzie wynikowymzamieni instrukcje d u sze na kroacutetsze co przynosi oszcz dno ci w postaci skroacuteceniakodu wynikowego Poniewa dopiero linker bdquowierdquo jak poszczegoacutelne fragmenty kodus rozmieszczone w pami ci takiej podmiany mo na dokona na etapie linkowaniaprogramu co zapewnia powy sza opcja St d te warto to pole wyboru zaznaczy

Kup książkę Poleć książkę

SkorowidzA

ABI Application Binary Interface 25AC Address Counter 50ADPCM 482adres

bazowy 377bufora 61komoacuterki 84pu apki 202

ALE Address Latch Enable 368alfanumeryczne wy wietlacze 43algorytm ADPCM 492algorytmy stratne 495animacje 57antyaliasing 325architektury procesoroacutew XMEGA 352asembler 23

dyrektywy 40funkcje j zyka C 41obs uga przerwa 39

asynchroniczne wywo anie funkcji 101Atmel Studio 15

Bbajty kalibracyjne 569biblioteka

FATFS 131 139 176 180 517libcallback-liba 99PetitFS 144 149

bitADC_CH0START_bm 236IMPMODE 244

bitrate 442 512blokowanie przerwa 219b d 16 19

kwantyzacji 463offsetu 230wzmocnienia ADC 230

BOD 223bps bits per second 12

budowakarty 152linii obrazu 394pami ci SDRAM 374pliku stymulacji 192ramki PAL 412sygna u PAL 411wtyczki 544 545

bufor 78FIFO 497na transakcje 61transakcji 62

buforowanie wyj cia 294

CCAS Column Address Strobe 375CCFL 44charakterystyka

przetwornikoacutew 222termistora 264tryboacutew pracy 232

CID Card Identification 169CKE Clock Enable 375CLKIN 421COG Chip on Glass 310CRC 158 178CRC16 178CRC7 164CS Chip Select 361 375CSD Card Specific Data 172czas

dost pu do SDRAM 424adowania kondensatora 244

propagacji 281proacutebkowania 260symulacji 209

czcionki 322cz stotliwo

odchylania pionowego 428proacutebkowania 244 441 444 530przebiegu 504

Kup książkę Poleć książkę

576 AVR Uk ady peryferyjne

cz stotliwoPWM 465taktowania koprocesora 549taktowania procesora 209taktowania rdzenia 18

czyszczenie pami ci 318

DDAC Digital to Analog Converter 293 447 451

buforowanie wyj cia 294generowanie przebiegoacutew 301jitter 303kalibracja 306napi cie referencyjne 295system zdarze 297taktowanie 296tryb dwukana owy 301wykorzystanie DMA 298wyzwalanie konwersji 305

datalogger 261 265 275DD Device Density 86debuger 183

programowy 190sprz towy 185 187

decymacja 259DEBUG 219XMEGA 260

definicja symboli globalnych 36definiowanie w asnych znakoacutew 56deklaracja zapowiadaj ca 103 337dekoder DTMF 548 556DMA 254 298 402 458 518 523dost p do

danych 358 359 568danych binarnych 356 360danych wielobajtowych 31DataFLASH 137EEPROM 128FAT 136komoacuterki 375LCD 59 62 66 68operandu 30pami ci 81 384 386 387 561pami ci SDRAM 424pliku blokowy 141portoacutew IO 30rejestroacutew IO procesora 36rejestroacutew uk adu 499SPI 95sygnatury u ytkownika 565 567wska nikoacutew 32

DQM Data Mask 375DSP Digital Signal Processor 535

DTMF 535 553dyktafon 529dynamiczna alokacja pami ci 516dyrektywa global 38dyrektywy asemblera 40dzia anie

DMA 255komparatora 280timeroacutew 400

d wi k 443

EEBI External Bus Interface 361EEPROM 207eliminacja jitteru 24emulacja RS232 139

FFAT File Allocation Table 128 131FAT32 128FATFS 180filtr

dolnoprzepustowy 491drugiego rz du 470pierwszego rz du 469trzeciego rz du 471

filtrowanie sygna u PWM 468firmware 565FLASH 207format

odpowiedzi 159polecenia 158protoko u 157

funkcja_delay_ms 17 219c_zero 42callback 106 341callback() 99DataFLASH_CSEnable 100DF_FinishBufWrite() 269disk_initialize 136disk_ioctl 181disk_status 136disk_write 138DMA_SPI_init 104DTMF_GetCode 553free_re 65GPIOR0_init 507hd44780_outcmd 51hd44780_outnibble_nowait 65LCD_defchar_P 57

Kup książkę Poleć książkę

Skorowidz 577

Menu_Click_Func 515Menu_Free 516Menu_Recorder 532Menu_Run 527MS_CreateRegEntry 117MS_GetDirPos 125MS_GetRegItem 115MS_WritePages 116 118OSC_wait_for_rdy 473RecMenu_StartStop 532sprintf 142strtok 124sysclk_init() 200 209TMF_memcpy_PF 454udi_cdc_getc() 123udi_cdc_is_rx_ready() 123VS1003_Reset 506

funkcjeanalizuj ce 556biblioteczne 50biblioteki FATFS 143j zyka C 41kontrolera ST7565R 313opoacute niaj ce 17opoacute nie 219reentrant 524specjalne kontrolera 319steruj ce 314zapisu 133

fusebit 557BODACT 560BODLEVEL 560BOOTRST 559DVSDON 560EESAVE 561JTAGEN 558RSTDISBL 559SUT 559TOSCSEL 559

fusebity w AVR-libc 571

Ggenerator obrazu composite 426generowanie

d wi ku 461kolorowego obrazu 437obrazu wideo 391przebiegoacutew 301przerwa 285sygna u composite 409

g bia koloru 326gniazdo

karty SD 156VGA 396

Hhistereza 281

IIDE 11IMA ADPCM 483informacje

o kolorze 431o obrazie 434

inicjalizacjakarty 161karty SDHC 167karty SDSC 167karty SDXC 167licznika 419pami ci 119USART 505

instrukcjaicall 42movw 35nop 13 24

interfejsSCI 498SDI 498SPI 71 79RS232 120UART 123USART 71 73

interpolacja 259interpolacja w XMEGA 260inwersja obrazu 319

Jjednostki 12jitter 24 303 420

Kkalibracja

ADC 229DAC 306 564offsetu 237

kana DMA 82 522karta 154 158

mikroSD 152SD 151 152SDHC 151 152 160SDSC 160SDXC 151 160

Kup książkę Poleć książkę

578 AVR Uk ady peryferyjne

karty pami ci 151 152 157biblioteka FATFS 180budowa 152format polecenia 158inicjalizacja 161 167komunikacja 156odczyt danych 173opcje konfiguracyjne 181rejestry specjalne 169tryby pracy 153zapis danych 176zasilanie 154

kodasemblerowy 23 24C 23dost pu 24

kodowanieμ-law 481ADPCM 483Dialogic ADPCM 494informacji 166 426koloru 425znakoacutew 536

kodyformatoacutew audio 501zdarze 545

kolejno bajtoacutew 533kolor 424 430kolorowy obraz 437komparator 422

analogowy 279 280analogowy XMEGA 282okienkowy 284

kompilacja plikoacutew binarnych 350kompilator avr-gcc 11 359kompresja

ADPCM 482 486d wi ku 480IMA ADPCM 482

komunikacja z koprocesorem 504konfiguracja

4-portowa 364biblioteki 133debugera 185DMA 459 522fusebitoacutew 570kontrolera DMA 257 452komparatoroacutew 285lockbitoacutew 570LPC 371pami ci SDRAM 381PetitFS 149pinu IO 225portoacutew IO 362

preskalera 452projektu 186przerwa 219pu apki 203rejestru EVCTRL 248rejestru PER 67SPI 75sygna u CS 377typu czcionki 324urz dze IO 189USART 76zegara 383

konsolidacja 547kontroler

DMA 254 298 402 458 518 523KS108 310ST7565R 310ndash315 321

konwersjaDAC 305sygna oacutew 396wyzwalana 306

konwertercyfrowo-analogowy 426DAC 427

koprocesormp3 496VS1003B 10

korekcja fazy 466kwantyzacja 463

Llampa CCFL 44LE Latch Enable 433licznik 419

cykli 209TCC1 400timera 20

linie IO 50linie sygna owe

MISO 72 164MOSI 72SCK 72SS 72

linker 69lista

mnemonikoacutew 24modyfikowanych rejestroacutew 32

lockbity 557 561lockbity w AVR-libc 570LPC Low Pin Count 371LPCM 443 556LSB Least Significant Bit 228

Kup książkę Poleć książkę

Skorowidz 579

a cuchy formatuj ce 212czenie plikoacutew 352

Mmagistrala pami ci zewn trznej 361magnetofon cyfrowy 528makro _SFR_IO_ADDR() 39makrodefinicja

ASSERT 214HD44780_CGADDR() 53HD44780_CLR 53HD44780_DDADDR() 53HD44780_DISPCTL() 52HD44780_ENTMODE() 52HD44780_FNSET() 52HD44780_HOME 53HD44780_SHIFT() 51LOCKBITS 571

mapowanie sygna oacutew 366mapy bitowe 343marker czasowy 268maski bitowe 329matryce 49menu 335menu piktogramowe 342mierniki temperatury 262mikrokontroler

ARM 9AVR 9PIC 9XMEGA128A3U 10

MISO 72moc wydzielana 265model psychoakustyczny 495modu

alfanumeryczny 45NVM 568Xmega eXploreGO 10Xplained ATXMEGA A3BU 10Xplained ATXMEGA-A1 10Xplained XMEGA128A1 447Xplained XMEGA256A3 94Xplained XMEGA256A3BU 97 143 266

modyfikator 30const 85volatile 28 273

monitory CRT 395monochromatyczne wy wietlacze graficzne 309monochromatyczny

tryb graficzny 416tryb tekstowy 413

MOSI 72mp3 495Msps Megasamples per second 12multiplekser wej ciowy 226 283multipleksowanie adresoacutew 368 369muzyka 439

Nnadawanie kodoacutew DTMF 540nadproacutebkowanie 258nag oacutewek kontenera wav 500nagrywanie mowy 486najmniej znacz cy bit 228napi cie

offsetu 280referencyjne 223 295zasilania 239

Oobracanie obrazu 319obraz 319

composite 426kolorowy 430wideo 391

obroacutebka d wi ku 443 445obs uga

FAT 131 143klawiatury matrycowej 24LCD 58 63 67menu 337przerwania 37 38 458przerwania DMA 525przerwa w asemblerze 39przyciskoacutew 272wy wietlaczy alfanumerycznych 45

odczytblokowy 140danych 173 358

odpowied response 159R1 159R2 159R7 160

od wie anie pami ci 376odtwarzanie

d wi ku 472muzyki 447 513 518 521

offset 238offset ADC 230okno

Breakpoints 202Call stack 209dezasemblera 210

Kup książkę Poleć książkę

580 AVR Uk ady peryferyjne

oknoIO View 207podgl du zmiennych 211wyboru czcionek 324

OLED 46opcje

kompilatora 35zapisu d wi ku 445

operacjena buforach 91odczytu 173zapisu 176zapisu strony 92

operand 29operator

ascii 41

asciz 41

byte 41

section 41opoacute nienia 13 18opoacute nienie zmienne 16optymalizacja 16 68optymalizator 26organizacja pami ci 77organizacja pami ci VRAM 316oscylator 287OSD On-Screen Display 417ostrze enie 16oszcz dzanie energii 94

Ppakiet WinAVR 48pami

CGRAM 56 57 64DataFLASH 10 77 81 113 269DDRAM 49EEPROM 111FLASH 54 124 207RAM 49SDRAM 372SRAM 63 124 329 366 371VRAM 314 317

PCLK 421PCM 443PetitFS 144 149p tla

for 13while 201

pierwsza linia obrazu 321piksel 430piktogram 342pin IO 225

plikAlloc_safeh 65DataFLASHc 83DataFLASHIOc 136definesh 50delayh 14diskioh 132 136ffh 132ffconfh 132 181hd44780h 49integerh 132ioh 30LCD_transc 61LCD-transactc 66Makefile 14Menuc 19nothingo 541outfiletxt 547 551pffh 149SPIh 104stringh 113stymulacji 191 192

pliki mp3 495elf 351fon 323o 24S 24 34binarne 350 355csv 276d wi kowe 440obiektowe 352wav 500WMA 512z czcionkami 327z danymi 349

podbijacz napi cia 315podgl d

pami ci 207stosu wywo a 209zmiennych 211znakoacutew 325

pod czeniefototranzystora 262karty SD 155LCD z kontrolerem 311modu u 50pami ci 362 369 370 373termistora 262uk adu LM35 251wyj XMEGA 398

pod wietlenieCCFL 46OLED 46

Kup książkę Poleć książkę

Skorowidz 581

podwoacutejne buforowanie 255 332 457polecenia

kasowania strony 81konfiguracyjne pami ci 82kontrolera ST7565R 315odczytu bufora 82 89odczytu pami ci 81 88SDRAM 376transferu 91

polecenieACMD41 168cd 181CID 178CMD0 165CMD8 167CSD 178date 276dir 127 181dump 276erase 276get 276HD44780_CLR 51Init 178mkdir 181

po czenieDMA ze SPI 96dwoacutech komparatoroacutew 285koprocesora mp3 497LCD z mikrokontrolerem 48wyj cia XMEGA 411XMEGA z PC 121z telewizorem 431

pomiarnapi cia zasilania 239temperatury MCU 241

port IO 30 362pozycjonowanie grafik 345poacute obraz 410precyzja pomiaroacutew 260preskaler 478preskaler ADC 243program

Atmel Data Visualizer 275Audacity 443avr-objcopy 350dataloggera 265LCD Image Converter 323makeloadingtableexe 543Realterm 127 554riffstrip 483SoX 445Tracepoint 208

programowanie sygnatury u ytkownika 566protokoacute master-slave 157

prototypy 136proacutebki d wi kowe 447proacutebkowanie

8-bitowe 300nieliniowe 480

prymitywy graficzne 330przebieg PWM 468przebiegi 289 303przechwytywanie danych 276przemiatanie wej 253przerwanie 218 254 286 403

DMA 522komparatora 286

przestrze adresowa procesora 378przesy anie

danych 498polece 498

przetaktowanie procesora 436przetwornik

ADC 221analogowo-cyfrowy 221cykliczny 222potokowy 222

przyciski 272pseudooperatory 41pu apki breakpoints 197pu apki warunkowe 205punkty ledzenia 203PWM 461 462 472

RRAS Row Address Strobe 375redukcja poboru energii 242regulacja kontrastu 321rejestr 32 34rejestr AC 50

adresu wtyczki 513BASEADDR 377CID 169CMP 251CSD 172czasu utworu 512DATA 83EVCTRL 248formatu audio 512identyfikacyjny pami ci 87INTFLAGS 252kontroli basoacutew 510kontroli g o no ci 513MUXCTRL 227OCR 168PER 67poroacutewnania 249

Kup książkę Poleć książkę

582 AVR Uk ady peryferyjne

rejestr ACSCI_CLOCKF 511stanu komparatora 287stanu pami ci 86stanu uk adu 510trybu pracy 508WINCTRL 285

rejestrydost pu do pami ci RAM 513GPIOR 502IO procesora 36mikrokontrolera 25procesora 35specjalne 94specjalne karty 169uk adu VS1003B 508

relacja rodzic ndash dziecko 336reset uk adu 534rozdzielczo

LCD 329przetwornika 231PWM 463 477

rozszerzenie HiRes 477 479roacutewnanie Steinharta-Harta 263rysowanie map bitowych 343

Sschemat uk adu dataloggera 267SCI Serial Command Interface 498SCK 72SD Secure Digital 152SDI Serial Data Interface 498separator synchronizacji 422separowanie impulsoacutew synchronizacji 422shieldy 10skaler 422skaler napi cia 283skrypt makefile 353s owo kluczowe

asm 27extern 37static 68

specyfikatory lokalizacji zmiennej 213sps samples per second 12SS Slave Select 72standard PAL 410standard VGA 393sterowanie

dataloggerem 275sygna em 379

sterownik 121HD44780 49 56LCD 49 62

stos wywo a 209

strukturaFATFS 139Handle 118LCD_trans 60 63menu 338rejestru 86SimpleFSEntry 113 116SimpleFSHandle 113 118 140submenu 527systemu plikoacutew 112

sumabitowa 571kontrolna 178

sygnacomposite 409composite video output 430CS 377DREQ 497H-Sync 396synchronizacji 423V-Sync 396zegarowy CLK 374

sygna yinterfejsu EBI 363magistrali EBI 364steruj ce 375

sygnaturaprodukcyjna procesora 563u ytkownika 565

symbol__DELAY_ROUND_CLOSEST__ 17__DELAY_ROUND_DOWN__ 17_FS_FAT12 149_FS_FAT32 149_FS_MINIMIZE 133_FS_READONLY 133_FS_RPATH 135_FS_TINY 133_MAX_SS 135_MULTI_PARTITION 135_USE_DIR 149_USE_FASTSEEK 134_USE_FORWARD 134_USE_LABEL 134_USE_LFN 134_USE_LSEEK 149_USE_MKFS 134_USE_READ 149_USE_STRFUNC 134_USE_WRITE 149_VOLUMES 136F_CPU 14 15 18increment 36USE_BUSY_FLAG 50

Kup książkę Poleć książkę

Skorowidz 583

symboleglobalne 36w asemblerze 28zewn trzne 39

symulacja 198 209symulator 190synchronizacja

pami ci 331pionowa 395pozioma 394

systemplikoacutew 111 128przerwa 404zdarze 245

szablonfont_XMEGAtmpl 326image_XMEGAtmpl 343

szum 463szybko przesy ania danych 126

ledzenie wi zki 333rodowisko

graficzne 11programistyczne 11VSIDE 542WinAVR 47

Ttabela FAT 130tablica

framebuf 402 408plugintbl 552 555tekst 208z kodem wynikowym 543

taktowanieDAC 296mikrokontrolera 473

technologia OLED 44temperatura mikrokontrolera 239 241termistor 262 290

NTC 263PTC 263

termometrLM35 249 250z alarmem 251

termostat 290test uk adu VS1003B 503testowanie obrazu 319timer 16 62

TCC0 20

TCC1 399transakcja 59 62 65transakcje 17 103ndash107transakcyjna obs uga LCD 58transakcyjny dost p do SPI 95transfer 91

danych 97wynikoacutew 254

transmisja 72 83tryb

bez znaku 234ci g ej konwersji 252czterobitowy 153dwukana owy 301graficzny 416graficzny VGA 407idle 419jednobitowy 153LPC 371monochromatyczny 397 407oszcz dzania energii 94 306pracy multipleksera 226pracy SPI 157roacute nicowy 232single slope 312SPI 153tekstowy 413tekstowy VGA 397z pojedynczym wej ciem 234ze znakiem 235

trybygenerowania PWM 467pracy karty 153pracy przetwornika 231pracy SPI 74pracy uk adu 508

twierdzenie Nyquista 258tworzenie

adresu 84nak adek 417obrazu 335tablicy 543

typ__uint24 119karty 160niekompletny 60wyliczeniowy 114

typyoperandoacutew 29w AVR 34

Kup książkę Poleć książkę

584 AVR Uk ady peryferyjne

Uuchwyt handle 64 113uk ad

AD725 427 431buforowy 294CS 361DAC 284dataloggera 267detekcji awarii zasilania 559generuj cy obraz 393HiRes 477ICL7660 47LM35 250 251SampH 293sterowania sygna em 379USART 401VS1003B 496 503 508 530 538 556VS100XX 529wzmacniania sygna u 227

uk ady peryferyjne 9uruchomienie komparatora 287urz dzenie

master 72slave 72

u rednianie 259utrata danych 141u ycie wstawki asemblerowej 33

VVGA 393

Wwarto ci kalibracyjne

ADC 564oscylatoroacutew 564temperatury 564

warunkowa kompilacja 36WE Write Enable 375wej cie composite video input 425wektor przerwa 38 257wideo 391wielko pami ci 86 377w czenie DAC 299wska nik na struktur 27wska niki 32wstawki asemblerowe 24 33wtyczka 535 541 544

SineDTMF Generator 537VGA 396

wyboacuter cz stotliwo ci PWM 465 474wykorzystanie

DMA 254 518

EuroSCART 428PWM 461rejestroacutew 34

wyliczanie predyktora 489wy wietlacze

alfanumeryczne 43 45graficzne 43 309LCD 43OLED 46

wy wietlanielitera u 213map bitowych 344obrazu 333 346 406obrazu VGA 393

wywo ania zwrotne callbacks 98asynchroniczne 101synchroniczne 101

wyzwalanie konwersji 245wzmacniacz 446wzmacniacz operacyjny 279wzmacnianie sygna u 227

XXMEGA 9 18

Zzapis

bufora 269danych 176d wi ku 440 556

zasilaniekarty 154pami ci 109

zatrzask 368zatrzask 74HC573 433zatrza ni cie adresu 369zdarzenia 297zdarzenie compare match 399zegar 383 420 426zintegrowane rodowisko programistyczne 11z cze EuroSCART 425 428 429zmiana

g o no ci 527wielko ci strony 94

znaki 56

roacuted onapi cia odniesienia 284sygna u 240

Kup książkę Poleć książkę

Page 22: Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8 AVR. Ukäady peryferyjne Rejestry dost pu do pami ci RAM .....513 Rejestr adresu

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 57

hd44780_wait_ready(40) chardef++

Funkcja LCD_defchar_P jako argumenty przyjmuje numer definiowanego znaku (0 ndash 7)oraz wska nik do obszaru pami ci FLASH zawieraj cego definicj znaku (obszarten zajmuje 8 nast puj cych po sobie bajtoacutew) Jak widzimy funkcja najpierw ustawiaw a ciwy adres pod ktoacuterym znajdzie si pocz tek definicji znaku w pami ci CGRAMmdash poniewa jeden znak jest opisywany za pomoc 8 bajtoacutew kolejne adresy znakoacutewto kod_znakutimes8 Nast pnie dane opisuj ce znak s adowane z pami ci mikrokontrolerai zapisywane w pami ci CGRAM sterownika Poni szy program ilustruje wykorzy-stanie funkcji LCD_defchar_P

prog_uint8_t char1[8][8]=0000000255 00000025525500000255255255 0000255255255255 00025525525525525500255255255255255255 0255255255255255255255255255255255255255255255

int main() for(uint8_t x=0xlt8x++) lcd_defchar_P(xampchar1[x][0]) Za aduj wzorce znakoacutew lcd_init() for(uint8_t x=0xlt8x++) lcd_putchar(x) Wy wietl znaki o kodach 0 ndash 7 while(1)

W pierwszej linii funkcji main nast puje za adowanie nowych definicji znakoacutew dopami ci CGRAM nast pnie inicjalizowany jest wy wietlacz po czym w pierwszejlinii s wy wietlane znaki o kodach 0 ndash 7 a wi c znaki ktoacuterych definicja zosta aprzes ana z mikrokontrolera

Zauwa e pami CGRAM podobnie jak DDRAM mo emy zapisywa i odczytywaprzed inicjalizacj modu u LCD Proces inicjalizacji jest potrzebny tylko do prawi-d owego wy wietlania na ekranie LCD

Poniewa dane potrzebne do wy wietlenia znaku s na bie co pobierane z pami cipodczas od wie ania matrycy LCD jakiekolwiek zmiany w definicji znaku kiedy jest onwidoczny na LCD poci gaj za sob natychmiastowe zmiany w wy wietlanym obrazieMo na t w a ciwo sterownika wykorzysta do stworzenia prostych animacji

void lcd_box(uint8_t y) hd44780_outcmd(HD44780_CGADDR(0)) Zaczynamy od znaku o kodzie 0 hd44780_wait_ready(40) for(uint8_t c=0cltyc++) Stwoacuterz linie z w czonymi pikselami hd44780_outdata(0xFF) hd44780_wait_ready(40) for(uint8_t c=yclt8c++) Stwoacuterz linie z wy czonymi pikselami hd44780_outdata(0x00) hd44780_wait_ready(40)

Kup książkę Poleć książkę

58 AVR Uk ady peryferyjne

int main() lcd_init() lcd_putchar(0) while(1) for(uint8_t x=0xlt8x++) lcd_box(x) _delay_ms(100) for(int8_t x=7xgt=0x--) lcd_box(x) _delay_ms(100)

Funkcja main wy wietla na LCD tylko jeden znak o kodzie 0 a nast pnie cykliczniezmienia jego definicj w pami ci CGRAM W efekcie posta znaku wy wietlana naekranie ci gle si zmienia

Transakcyjna obs uga LCDPokazana do tej pory obs uga LCD alfanumerycznego mia a pewne wady Jak wiemyoperacje odwo uj ce si do kontrolera LCD s niezwykle wolne cykl odczytuzapisudowolnego rejestru kontrolera trwa co najmniej 1600 ns co dla MCU taktowanegozegarem 32 MHz przek ada si na czas wykonania oko o 52 instrukcji asemblera Cogorsza wi kszo komend realizowanych przez kontroler jest wykonywana w czasieoko o 37 s co przek ada si na tysi ce zmarnowanych taktoacutew MCU St d te jaki-kolwiek zapisodczyt LCD to z perspektywy programu straszne marnotrawstwo czasu

Problem ten dotyczy ka dego urz dzenia IO ktoacutere dzia a wolniej ni procesor W takiejsytuacji warto napisa pewn warstw po redni mdash sterownik mdash ktoacuterego zada-niem b dzie buforowanie da dost pu do urz dzenia i rozstrzyganie konfliktoacutewdzi ki czemu roacute ne cz ci programu b d bdquomia y wra enierdquo e maj wy czny do-st p do urz dzenia

Pokazane wcze niej funkcje obs ugi LCD maj jeszcze jedn wad mdash nie s wspoacute bie -ne czyli nie mo na ich wykonywa jednocze nie w kilku miejscach programu w tymw szczegoacutelno ci w programie g oacutewnym i w funkcjach obs ugi przerwa W wielu przy-padkach ta wada jest bez znaczenia jednak czasami jest uci liwa mdash dla przyk adugdy na wy wietlany tekst chcieliby my na o y inne informacje np o dacie lub godzi-nie Oczywi cie wy wietlanie mo na zorganizowa tak aby nie by o potrzeby pisaniawspoacute bie nego kodu np poprzez zastosowanie bufora pami ci VRAM kontrolera LCDRodzi to jednak kolejne problemy i jest ma o eleganckie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 59

Zastanoacutewmy si w jaki sposoacuteb najlepiej jednocze nie rozwi za problem wolnegodost pu do urz dzenia i wspoacute bie no ci kodu Rozwi zaniem mo e by wprowadze-nie tzw transakcji Transakcj nazywamy zbioacuter operacji tworz cych pewn ca-o To co wyroacute nia tak wykonywany zestaw operacji to atomowo spoacutejno

izolacja i trwa o Pod tymi terminami kryje si istota wykonywanej operacji Ato-mowo transakcji zapewnia e jest ona wykonywana w sposoacuteb niepodzielny co gwa-rantuje nam prawid ow wspoacute prac z danym urz dzeniem IO w tym przypadku kon-trolerem LCD Wa na dla nas jest tak e izolacja mdash dzi ki temu inne operacje na LCD(inne transakcje) nie b d mia y wp ywu na wynik aktualnie wykonywanej transakcjimdash nie b d zak oacuteca y jej wykonania z drugiej strony nasza transakcja nie zak oacuteciwykonania innych Trwa o z kolei zagwarantuje nam e je li sterownik potwierdziwykonanie transakcji to znaczy e efekt jej dzia ania jest wy wietlony na LCD Tacecha nie jest nam a tak potrzebna mdash jest ona wydawa oby si oczywista Niemniej jestto pewna gwarancja e ca a operacja przebieg a poprawnie i w efekcie LCD znajdujesi w okre lonym przez nas stanie Tyle teorii przejd my do praktyki

Kody poni szego przyk adu znajduj si w katalogu PrzykladyLCD-alfaLCD-transact

Aby zapewni transakcyjny dost p do LCD musimy stworzy pewne struktury danychktoacuterych zadaniem b dzie przechowywanie informacji o operacjach sk adaj cych sina transakcje i stanie ich wykonania W tym celu pos u ymy si wiadomo ciami z roz-dzia u 5 bdquoJak uporz dkowa chaos czyli z o one typy danych i listyrdquo Do przecho-wywania oczekuj cych transakcji pos u ymy si buforem pier cieniowym zanimjednak go zaimplementujemy zastanoacutewmy si jak powinna wygl da struktura prze-chowuj ca informacje o transakcji Struktura ta powinna zawiera co najmniej

pole danych (data) z informacjami ktoacutere maj by przes ane do kontrolera LCD

pole okre laj ce liczb danych do wys ania (len)

pole okre laj ce realizowane polecenie dla LCD (cmd) mdash pole to pos u yprogramowi sterownika do w a ciwej interpretacji danych znajduj cych siw polu data

kilka poacutel kontrolnych przechowuj cych informacje potrzebne do realizacjisamej transakcji Jedno z nich mdash Ready mdash b dzie przyjmowa warto trueje li dana transakcja zosta a zrealizowana lub false w przeciwnym przypadkuZnaczenie drugiego pola mdash SelfDel mdash mo e wydawa si nieco enigmatycznepole to okre la czy pami przydzielona dla transakcji ma by zwolnionaw sterowniku LCD (warto true) czy te zostanie zwolniona w programie(warto false)

Oto jak mo e wygl da struktura definiuj ca transakcj typedef struct volatile bool Ready 1 true je li transakcja zosta a zrealizowana bool SelfDel 1 true je li pami przydzielona transakcji ma zosta zwolniona LCD_Cmd cmd 2 Polecenie do zrealizowania uint8_t len 6 D ugo polecenia

Kup książkę Poleć książkę

60 AVR Uk ady peryferyjne

unsigned 0 Wyroacutewnanie do granicy bajta uint8_t data[] Dane transakcji LCD_trans

Nale y zwroacuteci uwag na poleunsigned 0

Nie definiuje ono adnego pola struktury ale jedynie informuje kompilator e kolejnepole (w naszym przyk adzie o nazwie data) ma by wyroacutewnane do granicy bajta mdashdzi ki temu dost p do kolejnego pola b dzie odbywa si szybciej Z kolei samo poledata jest zadeklarowane jako tzw typ niekompletny

Typ niekompletny (ang incomplete type) to typ ktoacuterego rozmiaru nie da si okre li

W pokazanym przyk adzie rozmiaru pola data nie da si okre li gdy zosta on za-deklarowany jako typ tablicowy z tym e nie podano wielko ci tablicy Wielko ci niepodano gdy na etapie deklaracji struktury nie wiemy jakiej wielko ci dane b d w niejprzechowywane Tego typu deklaracja ma bardzo powa ne konsekwencje mdash skorowielko ci pola data nie da si okre li to jaki b dzie wynik dzia ania operatora sizeof(LCD_trans) Kompilator stara si jako wybrn z tej sytuacji w zwi zku z czym

zwroacuteci wielko struktury ale tak jakby pole data w ogoacutele nie istnia o mdash jego roz-miar b dzie wynosi 0 W ramach wiczenia zastanoacutew si ile bajtoacutew pami ci b dziezajmowa a struktura LCD_trans

Skoro dysponujemy ju struktur przechowuj c poszczegoacutelne transakcje pora nastworzenie obiektu przechowuj cego kolekcj transakcji Dodanie kolejnej strukturyb dzie polega o na dodaniu jej do takiego obiektu z drugiej strony program sterownikaLCD b dzie moacuteg z tej kolekcji pobiera kolejne transakcje do realizacji Opis ten przy-pomina opis dzia ania bufora pier cieniowego mdash z jednym wyj tkiem mdash po zape nie-niu ca ego bufora nie b dziemy usuwa niezrealizowanych transakcji lecz zabloku-jemy dodawanie kolejnych W tym celu pos u ymy si definicj nast pnej struktury

typedef struct LCD_trans elements[LCD_MAXTRANS] Wska niki do transakcji uint8_t Beg Pierwszy element bufora uint8_t Count Liczba elementoacutew w buforze CircBuffer

Struktura ta zawiera deklaracj tablicy wska nikoacutew na transakcje (pole elements)Poniewa jest to tablica musimy zna liczb jej elementoacutew mdash jest ona zadeklarowanaw sta ej LCD_MAXTRANS

define LCD_MAXTRANS 10 Maksymalna liczba pami tanych transakcji

Do realizacji bufora s potrzebne jeszcze dwa pola Beg wskazuj ce na pierwsztransakcj w buforze oraz pole Count okre laj ce liczb transakcji znajduj cych siw buforze Je li Count == 0 to znaczy e w buforze nie ma adnych oczekuj cychtransakcji a je li Count == LCD_MAXTRANS to znaczy e bufor jest pe ny i nie mo na

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 61

dodawa do niego kolejnych transakcji W a ciwo t wykorzystuj dwie zdefiniowanew pliku LCD_transc funkcje

static inline bool cbIsFull(CircBuffer cb) return cb-gtCount == LCD_MAXTRANS

static inline bool cbIsEmpty(CircBuffer cb) return cb-gtCount == 0

Jak pami tamy w przypadku funkcji modyfikatory static inline powoduj e danafunkcja nie b dzie istnie jako samodzielna lecz w ka dym miejscu w ktoacuterym jestwywo ywana jest wstawiany raczej jej kod a nie wywo anie Ma to znaczenie dlakroacutetkich funkcji (a wi c takich jak pokazane powy ej) dla ktoacuterych koszty wywo anias zazwyczaj wi ksze ni koszty umieszczenia cia a funkcji w miejscu jej wywo aniaTego typu funkcje zachowuj si w sposoacuteb zbli ony do makrodefinicji (z tym e re-spektuj wszystkie regu y j zyka C w szczegoacutelno ci kolejno operatoroacutew czy kon-trol typoacutew)

Takie funkcje jako argument pobieraj adres bufora na ktoacuterym maj operowa W na-szym przypadku bufor jest zdefiniowany nast puj co

static CircBuffer LCD_TransBuffer Bufor na transakcje

Nale y zauwa y e jest on zdefiniowany jako struktura globalna z modyfikatoremstatic Modyfikator ten ogranicza zasi g widoczno ci zmiennej LCD_TransBuffer dopliku w ktoacuterym zmienna ta zosta a zdefiniowana (w tym przypadku modyfikator staticjest niejako przeciwie stwem modyfikatora extern) Dzia anie to ma jedynie znaczeniekosmetyczne mdash uniemo liwia odwo anie si do bufora za pomoc funkcji ktoacutere niezosta y zdefiniowane w miejscu jego definicji Oproacutecz funkcji umo liwiaj cych okre-lenie stanu bufora potrzebne s jeszcze funkcje umo liwiaj ce dodanie i pobranie trans-

akcji Pierwsz funkcj b dzie funkcja dodaj ca transakcj do buforabool cbAdd(CircBuffer cb LCD_trans elem) ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsFull(cb)) return false Czy jest miejsce w kolejce uint8_t end = (cb-gtBeg + cb-gtCount) LCD_MAXTRANS cb-gtelements[end] = elem Dodaj transakcj ++cb-gtCount Liczba elementoacutew w buforze return true Wszystko OK

Funkcja ta dodaje transakcj (zmienna elem) do bufora ko owego Zanim transakcjazostanie dodana sprawdzane jest czy w buforze jest miejsce mdash je li nie funkcjazwroacuteci false Je li dodanie jest mo liwe warto licznika okre laj cego liczb trans-akcji przechowywana w buforze (Count) zwi ksza si o jeden Warto zastanowi si te dlaczego praktycznie ca e cia o tej funkcji jest zamkni te w sekcji atomowej (ATOMIC_BLOCK) Jedn z cech naszego sterownika ma by mo liwo wspoacute bie nego dost pu

Kup książkę Poleć książkę

62 AVR Uk ady peryferyjne

do LCD mdash to znaczy e danie np zapisu do LCD mo e wyst pi zaroacutewno w g oacutewnejp tli programu jak i asynchronicznie w przerwaniu St d te wynika e funkcja do-daj ca transakcj musi by napisana w sposoacuteb zapewniaj cy jej poprawn prac w sytu-acji gdy zostanie ona przerwana i ponownie wywo ana przed zako czeniem dzia aniajej poprzedniej instancji Umieszczenie cia a tej funkcji w sekcji atomowej nam to za-pewnia mdash dzi ki temu bufor transakcji zawsze b dzie spoacutejny Dla zaspokojenia cie-kawo ci warto usun sekcj atomow i sprawdzi jak wtedy b dzie zachowywa si tafunkcja i jak wp ynie to na spoacutejno przechowywanych danych

Drug niezb dn funkcj jest funkcja odczytuj ca bufor transakcji i zwracaj ca trans-akcj do zrealizowania (lub NULL je li adnej transakcji nie ma w buforze)

LCD_trans cbRead(CircBuffer cb) LCD_trans elem ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsEmpty(cb)) return NULL Bufor pusty nie mo na zwroacuteci elementu elem = cb-gtelements[cb-gtBeg] cb-gtBeg = (cb-gtBeg + 1) LCD_MAXTRANS -- cb-gtCount Zmniejszamy liczb elementoacutew pozosta ych w buforze return elem

Funkcja ta jest bardzo podobna do poprzedniej mdash najpierw sprawdza czy bufor za-wiera jak oczekuj c transakcj (cbIsEmpty(cb)) je li tak to zwraca adres opisuj -cej j struktury i zmniejsza liczb transakcji oczekuj cych (pole Count) W ten sposoacutebmamy zrealizowan ca funkcjonalno zwi zan z obs ug bufora pier cieniowegoPokazane funkcje s uniwersalne i z bardzo podobnych (lub wr cz tych samych) b -dziemy korzysta w kolejnych rozdzia ach w kontek cie np obs ugi transakcji zwi -zanych z interfejsami szeregowymi

Pora przej do samego sterownika LCD Jego zadaniem b dzie sprawdzenie czyw buforze oczekuj jakie transakcje do realizacji a je li tak to ich wykonanie Ponie-wa dane do LCD mog by wysy ane co okre lony minimalny czas znacznie d u -szy ni czas jakiego na to zadanie potrzebuje mikrokontroler do wysy ania kolejnychpaczek danych pos u ymy si timerem Timer b dzie generowa przerwanie nadmiaru(TCD0_OVF_vect) ktoacutere b dzie wyznacza o tempo w jakim kolejne porcje danych b -d trafia y do LCD Z noty katalogowej kontrolera wynika e minimalny czas trwa-nia wysokiego stanu sygna u Enable to 230 ns a okres tego sygna u nie powinien bykroacutetszy ni 500 ns Poniewa nasz dost p do LCD odbywa si w sposoacuteb nieblokuj cyMCU wi c szybko wysy ania danych do LCD jest bez znaczenia St d te w poka-zanym przyk adzie przyj to e dane b d wysy ane co 4 s co okre la sta a

define LCD_ACCESSTIME 0000004

Poniewa komunikacja z LCD odbywa si w sposoacuteb nieblokuj cy nie zale y nam tena czasie (i tak w stosunku do czasu od wie ania samego LCD jest on bardzo kroacutetki)w efekcie nie ma potrzeby odczytywania flagi busy kontrolera Dzi ki temu w cz ciprzypadkoacutew mo emy w ogoacutele zrezygnowa z sygna u wyboru RW i wymusi jego sta y

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 63

poziom logiczny umo liwiaj cy zapis do LCD Dzi ki temu mo na zaoszcz dzi do-datkowy pin IO1

Ca a logika naszego sterownika jest zawarta w funkcji obs ugi przerwania przepe nieniatimera (TCD0_OVF_vect) Poniewa LCD jest po czony z MCU w trybie 4-bitowym(dla zaoszcz dzenia liczby wykorzystanych pinoacutew IO) kolejne 8-bitowe dane muszby podzielone na dwie tetrady i wys ane do LCD w kolejno ci starszam odsza tetradaInformacja o aktualnie wysy anych danych jest umieszczona w zmiennej trans o typie

static struct uint8_t pos 6 Pozycja w polu danych aktualnej transakcji uint8_t nibble 1 Ktoacutera tetrada jest wysy ana seq

Dlaczego tak Dzi ki wykorzystaniu struktury i poacutel bitowych mo na zaoszcz dzi je-den bajt pami ci SRAM Ze wzgl du na wielko pami ci obs ugiwanej przez kon-troler LCD mo emy by pewni e transakcje zawieraj ce wi cej ni 63 bajty s ra-czej nierealne (nie mia yby wi kszego sensu) St d te do przechowywania informacjio aktualnie wysy anym bajcie danych wystarczy 6 bitoacutew mdash tyle samo zosta o wyko-rzystanych do okre lenia d ugo ci pola danych transakcji w strukturze LCD_trans Zaosz-cz dzony bit mo na po wi ci na flag nibble okre laj c ktoacutera tetrada (m odszastarsza)jest wysy ana Bez poacutel bitowych flaga ta zaj aby dodatkowy bajt pami ci

Przejd my do implementacji sterownika Pierwsz rzecz jak nale y sprawdzi jestto czy w buforze czeka jaka transakcja do zrealizowania Odpowiedzialny za to jestfragment kodu obs ugi przerwania nadmiaru timera

if(trans == NULL) Nic do zrobienia sprawd my czy jaka transakcja oczekuje trans=cbRead(ampLCD_TransBuffer) Czy jest jaka oczekuj ca transakcja seqpos=0 seqnibble=0 if(trans == NULL) TCD0_CTRLA=TC_CLKSEL_OFF_gc Nie ma adnych transakcji mdash wy cz timer

W przypadku gdy adna transakcja nie oczekuje na realizacj timer jest wy czanymdash dzi ki temu nie b d zg aszane kolejne przerwania przepe nienia i MCU nie b -dzie traci czasu na ich obs ug Co prawda wynikaj cy z tego zysk czasowy jest mar-ginalny lecz ma to istotniejsz konsekwencj mdash w przypadku usypiania MCU zb d-ne przerwanie timera nie b dzie niepotrzebnie wybudza o procesora W takiej sytuacjiponowne w czenie timera nast pi dopiero w funkcji dodaj cej transakcj do kolejkimdash a wi c w sytuacji gdy mamy pewno e istnieje oczekuj ca transakcja

Druga cz funkcji obs ugi przerwania jest zwi zana z realizacj samej transakcjiW pokazanym przyk adzie zaimplementowano tylko jeden typ transakcji mdash daniezapisu a cucha tekstowego pod wskazany adres VRAM (na okre lonej pozycji LCD)Je li zajdzie taka potrzeba programista mo e zaimplementowa inne polecenia i doda

1 Warto zauwa y e w bdquoklasycznejrdquo obs udze LCD te nie musimy czyta stanu flagi busy zamiast tego

wystarczy wprowadza p tle opoacute niaj ce Jednak poniewa taka obs uga blokuje MCU nie jest onazalecana Wady tej nie ma dost p transakcyjny co jest jego dodatkow zalet

Kup książkę Poleć książkę

64 AVR Uk ady peryferyjne

kod odpowiedzialny za ich obs ug Zauwa my e ka da transakcja musi zawieraadres pocz tku pami ci wideo od ktoacuterego b dzie zapisywany tekst Dzieje si takdlatego e transakcja wykonana wcze niej mo e ustawi wska nik zapisu na dowolnejkomoacuterce pami ci W efekcie tekst z kolejnej transakcji by by wy wietlany od komoacuterkina ktoacuterej zako czy si zapis poprzedniej transakcji Takie dzia anie oczywi cie jestniedopuszczalne st d te ka dy zapis do pami ci wideo poprzedza ustawienie rejestruindeksowego Problem ten mo na rozwi za tak e w inny sposoacuteb mdash poprzez wpro-wadzenie tzw uchwytoacutew (ang handlers) ktoacutere zawiera yby stan kontrolera LCDNiemniej to rozwi zanie dodatkowo komplikowa oby nasz sterownik Struktura danych(zawartych w polu data) ma wi c nast puj cy format

bajt nr 0 zawiera warto pozycji od ktoacuterej nale y dokonywa zapisu pami ciwideo mdash jest to warto przesy ana do rejestru okre laj cego adres zapisu

kolejne bajty zawieraj a cuch znakowy ktoacutery nale y umie ci w pami ciCGRAM

Poniewa bajt nr 0 zawsze zawiera warto wpisywan do rejestroacutew steruj cych kon-trolera podczas jego wysy ania jest ustawiana linia RS sygnalizuj ca zapis do rejestruPodczas wysy ania kolejnych bajtoacutew linia ta jest zerowana w zwi zku z czym zapisodbywa si do pami ci CGRAM

Kod obs uguj cy transakcj wygl da nast puj coif(trans) Jest transakcja do zrealizowania uint8_t dat=trans-gtdata[seqpos] if(seqnibble == 0) datgtgt=4 To trzeba zmieni je li linie danych nie s po czone z pinami 0 ndash 3 portu IO hd44780_outnibble_nowait(dat amp 0x0F seqpos = 0) Zapisujemy rejestr steruj cy lub dane ++seqnibble if(seqnibble == 0) ++seqpos Co drug tetrad zwi kszamy pozycj bufora if(seqpos gt= trans-gtlen) trans-gtReady=true Koniec transakcji if(trans-gtSelfDel) free_re(trans) Zwolnij pami transakcji je li tak sobie yczy programista trans=NULL Koniec transakcji CLR(OUT HD44780_E)

Ta cz przerwania wysy a kolejne tetrady do kontrolera LCD Warto zastanowi sinad dzia aniem sekwencji

++seqnibble

Poniewa pole nibble jest jednobitowe operacja inkrementacji prowadzi do zmianystanu tego pola na przeciwny (pole to ma warto 0 lub 1) Kiedy zostan wys anewszystkie dane przeznaczone dla kontrolera obs uga transakcji ko czy si Stan tensygnalizuje nadanie warto ci true polu Ready struktury LCD_trans Dzi ki temu pro-gram mo e sprawdzi asynchronicznie w stosunku do przerwania kiedy transakcjauleg a zako czeniu Opcjonalnie jest wykonywana jeszcze jedna funkcja mdash je li poleSelfDel ma warto true to pami zarezerwowana na transakcj jest automatycznie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 65

zwalniana W tym celu wykorzystuje si funkcj free_re ktoacuterej prototyp jest zade-klarowany w pliku Alloc_safeh Funkcja ta wywo uje funkcj biblioteczn free ktoacute-ra zwalnia pami przydzielon dynamicznie na stercie Poniewa funkcja ta nie jestfunkcj reentrant nale y stworzy odpowiedni bdquoprotez rdquo opakowuj c j w blokatomowy co zapewnia e nie zostanie ona ponownie wywo ana zanim jej poprzed-nia instancja nie zako czy dzia ania Oczywi cie lepszym rozwi zaniem by oby napi-sanie w asnych funkcji dynamicznej alokacji pami ci ktoacutere b d reentrant

Bardzo wa ne jest aby pole SelfDel mia o warto true wy cznie dla transakcjidla ktoacuterych pami zosta a przydzielona dynamicznie funkcj malloc (lub jej po-chodnymi) W pozosta ych przypadkach pole to musi mie warto false mdash nie-stosowanie si do tej regu y spowoduje b d mened era pami ci i najprawdopo-dobniej nieprzewidywalne dzia anie programu

Drug wa n zasad jest aby zmienna zawieraj ca dane transakcji nie by azmienn automatyczn mdash zmienne takie s automatycznie niszczone po opusz-czeniu zawieraj cej je funkcji W rezultacie obszar pami ci zawieraj cy danetransakcji mo e zosta wykorzystany przez inne zmienne co spowoduje uszkodzeniezawartych w nim danych

Pami przydzielona transakcji musi by alokowana w sposoacuteb dynamiczny (funkcjamalloc_re) ewentualnie mo e to by pami alokowana dla zmiennej globalnej lubstatycznej mdash zmienne tego typu istniej przez ca y czas ycia programu

Warto te zauwa y e instrukcje steruj ce stanem linii Enable kontrolera LCD(SET(OUT HD44780_E) i CLR(OUT HD44780_E)) s rozdzielone wieloma innymi in-strukcjami Dzi ki temu generowany impuls dodatni tego sygna u ma czas trwania gt230 ns wymagany w specyfikacji kontrolera Nawet dla XMEGA taktowanej zegarem32 MHz 230 ns przek ada si na oko o 7 instrukcji asemblera mdash czas jaki z pewno-ci up ynie pomi dzy wykonaniem obu powy szych instrukcji steruj cych

Do wysy ania danych do kontrolera zosta a wykorzystana nieco zmodyfikowanafunkcja hd44780_outnibble_nowait roacute ni ca si od jej protoplasty hd44780_outnibbletylko tym e nie czeka na sygna braku zaj to ci mikrokontrolera (nie realizuje teopoacute nie ) Nie jest to potrzebne gdy kolejne tetrady s wysy ane w odst pach cza-sowych okre lanych przez timer

Mamy wi c zapewnion obs ug transakcji i mo liwo transakcyjnego wy wietlaniadanych na LCD musimy jeszcze mie funkcj ktoacutera tworzy odpowiednie transakcjemdash jest odpowiednikiem funkcji bezpo rednio wysy aj cej dane znakowe do LCDOdpowiednikiem tym jest pokazana poni ej funkcja

bool LCD_PutText_B(uint8_t x uint8_t y char txt LCD_trans buf bool autodel) buf-gtcmd=LCD_Text buf-gtReady=false buf-gtSelfDel=autodel Czy zwolni pami po zako czeniu transakcji buf-gtdata[0]=HD44780_DDADDR(x+y0x40) Ustaw adres w DDRAM strcpy((char)ampbuf-gtdata[1] txt) Skopiuj dane tekstowe + NULL

Kup książkę Poleć książkę

66 AVR Uk ady peryferyjne

buf-gtlen=strlen(txt) + 1 D ugo tekstu + pozycji + NULL ndash 1 bool ret=cbAdd(ampLCD_TransBuffer buf) if((ret==false) ampamp (autodel)) free_re(buf) Brak miejsca w kolejce else TCD0_CTRLA=TC_CLKSEL_DIV1_gc Preskaler 1 mdash odblokuj timer return ret

Funkcja ta buduje transakcj odpowiedzialn za wy wietlenie napisu txt na wskaza-nej pozycji x y LCD Wszystkie dane o transakcji zostan umieszczone w buforzew pami ci ktoacuterej adres jest okre lany wska nikiem buf Pami w buforze musi bywystarczaj co du a aby pomie ci ca transakcj Dodatkowy parametr autodel okre laczy pami ta ma by automatycznie zwalniana po obs u eniu transakcji (true) czynie (false) Je li transakcj uda o si umie ci w kolejce funkcja zwraca true Wartozauwa y e w takim przypadku funkcja uruchamia te timer (w naszym przypadkujest to timer TCD0) odpowiedzialny za generowanie przerwania Funkcja obs ugi prze-rwania wysy a dane do LCD

Pewn odmian powy szej funkcji jest funkcjabool LCD_PutText(uint8_t x uint8_t y char txt) LCD_trans trans=malloc_re(sizeof(LCD_trans) + strlen(txt) + 2) bool ret=LCD_PutText_B(x y txt trans true) return ret

Wykorzystuje ona funkcj LCD_PutText_B z tym e najpierw alokuje dynamiczniepami potrzebn na przechowanie tworzonej transakcji

Mamy komplet potrzebnych funkcji a wi c sprawd my jak ca o sprawdza siw praktyce W pliku LCD-transactc znajduje si kod pokazuj cy jak dzia aj naszetransakcje Aby to by o mo liwe nale y zainicjalizowa kontroler LCD

LCD_init()

Wykorzystujemy tu znan ju funkcj inicjalizuj c mdash nie ma potrzeby jej zmienia gdy operacja inicjalizacji LCD jest jednorazowa i nie trzeba wykonywa jej w posta-ci transakcji W drugim kroku musimy zainicjalizowa wykorzystywany timer i systemprzerwa

LCD_Timer_init(ampTCD0)PMIC_CTRL|=PMIC_LOLVLEN_bm Odblokuj przerwania niskiego poziomusei()

Poniewa dost p do LCD z pewno ci nie jest czynno ci krytyczn czasowo prze-rwaniom timera nadano najni szy priorytet Dzi ki temu mo na innym bardziej kry-tycznym przerwaniom nada wy sze priorytety i uzyska w ten sposoacuteb zmniejszenieczasu latencji obs ugi przerwa Sama inicjalizacja timera jest niezwykle prosta

void LCD_Timer_init(TC0_t tc) tc-gtINTCTRLA=TC_OVFINTLVL_LO_gc Odblokuj przerwania nadmiaru timera i nadaj im niski priorytet tc-gtPER=F_CPULCD_ACCESSTIME Przerwanie co 4 us (niezale nie od F_CPU)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 67

Sprowadza si ona tylko do odblokowania mo liwo ci zg aszania przerwania nadmia-ru oraz konfiguracji rejestru PER tak aby przerwania by y generowane co ok 4 s mdashniezale nie od cz stotliwo ci taktowania CPU Mo emy wi c przyst pi do wy wie-tlenia pierwszego napisu

LCD_PutText(00 Numer)

Powy sza funkcja ma jedn wad mdash alokuje dynamicznie pami po ka dym wywo-aniu (pami ta jest automatycznie zwalniana po obs u eniu transakcji) niemniej

ca y proces jest czasoch onny Mo emy tego unikn alokuj c pami bdquor cznierdquo i wielo-krotnie wykorzystuj c zaalokowany blok pami ci Ilustruje to poni szy przyk ad

LCD_trans buf=malloc_re(sizeof(LCD_trans) + 7)

Zmienna buf wskazuje na obszar pami ci ktoacutery mo e pomie ci a cuch 5-znakowyTyle wystarczy na potrzeby tego przyk adu mdash na LCD b d wy wietlane kolejneliczby w zakresie 0 ndash 65 535 najd u sza ma 5 znakoacutew st d te nasz bufor ma tak a nieinn d ugo

while(1) utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(60 bufstr buf false) while(LCD_IsTransCompleted(buf))

Do konwersji liczby na a cuch u yto funkcji bibliotecznej utoa (nag oacutewek stdlibh)Poniewa d ugo a cucha po konwersji jest zmienna (co spowodowa oby pozosta-wianie na LCD bdquoduchoacutewrdquo po poprzednich konwersjach) w kolejnej linii brakuj ceznaki uzupe niono spacjami Nast pnie tworzona jest transakcja w obszarze pami ciprzydzielonym zmiennej buf Ostatnia p tla while jest odpowiedzialna za oczekiwa-nie na zako czenie realizacji transakcji Po jej zako czeniu p tla jest wykonywana odpocz tku

Uwa ny czytelnik z pewno ci zauwa y e pami przydzielana funkcj malloc_renie jest nigdzie zwalniana mdash w normalnej sytuacji spowodowa oby to wyciek pami -ci W naszym przyk adzie jednak program nigdy si nie ko czy nie ma wi c potrzebyzwalniania pami ci wskazywanej przez zmienn buf

Powy szy przyk ad pokazuje jak unikn blokowania CPU na czas dost pu do wolnodzia aj cego urz dzenia jakim jest LCD alfanumeryczny Jednak to nie wszystkiezalety wynikaj ce z zastosowania transakcji Drug wa n zalet naszego rozwi zaniailustruje przyk ad znajduj cy si w katalogu PrzykladyLCD-alfaLCD-transact-intPowa nym ograniczeniem funkcji odpowiedzialnych za dost p do LCD w sposoacutebklasyczny by a niemo no ich wywo ywania z funkcji obs ugi przerwa mdash funkcjeobs ugi LCD nie by y reentrant2 Nasz system oparty na transakcjach nie ma tychwad Aby to zilustrowa zosta stworzony prosty przyk ad mdash tak jak poprzedniow p tli g oacutewnej programu s wy wietlane stale kolejne liczby ale jednocze nie wyko-

2 Poza tym blokowa y CPU na d ugi czas a jak pami tamy funkcje obs ugi przerwa powinny by

wykonywane mo liwie kroacutetko

Kup książkę Poleć książkę

68 AVR Uk ady peryferyjne

rzystano drugi timer (TCD1) w ktoacuterego funkcji obs ugi przerwania przepe nienia jestwy wietlany licznik tych przerwa

ISR(TCD1_OVF_vect) static char int_buf[sizeof(LCD_trans) + 7] static uint16_t cnt char bufstr[6]

utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(61 bufstr (LCD_trans)ampint_buf false)

Jak widzimy w sposoacuteb asynchroniczny z dwoacutech miejsc w programie mo emy uzy-ska dost p do LCD a ka da funkcja bdquoma wra enierdquo e ma LCD na wy czno Przy okazji warto przeanalizowa sposoacuteb w jaki jest rezerwowana pami na trans-akcj w przerwaniu Oczywi cie mo na by wykorzysta dynamiczn alokacj pami cilecz jak wspomniano taka alokacja jest czasoch onna St d te w pokazanym przy-k adzie wykorzystano tablic statyczn int_buf o rozmiarze umo liwiaj cym prze-chowanie kompletnej transakcji Dzi ki temu e zmienna int_buf jest zmienn statycz-n nie jest ona niszczona po zako czeniu funkcji obs ugi przerwania Gdyby pomins owo kluczowe static zmienna ta by aby niszczona a na LCD najprawdopodobniejzacz yby si pojawia przypadkowe tre ci Poniewa pami naszego bufora nie by aalokowana dynamicznie nie mo e ona zosta zwolniona w naszym sterowniku LCDst d te ostatni parametr wywo ania funkcji LCD_PutText_B musi mie warto false

OptymalizacjaPrzy okazji tego i poprzedniego przyk adu warto zastanowi si jeszcze nad jednkwesti mdash optymalizacji W podanych przyk adach wykorzystano wcze niej omoacute-wione funkcje dost pu do wy wietlacza LCD znajduj ce si w plikach hd44780ci hd44780h Wi kszo z zawartych tam funkcji nie jest wykorzystywana jednakkompilator mimo wszystko umieszcza ich kod w pliku wynikowym mdash dzieje si takponiewa nie mo e on bdquostwierdzi rdquo czy funkcje te nie s wykorzystywane w innychfragmentach programu Pami tajmy e kompilator kompiluje poszczegoacutelne pliki roacute-d owe osobno i dana jego instancja nie bdquowierdquo co znajduje si w innych plikach (innychjednostkach kompilacji) Tak ca o ciow wiedz ma dopiero konsolidator (linker)ktoacutery czy stworzone przez kompilator pliki obiektowe (o rozszerzeniu o) w plikwynikowy Linker jednak bdquonie wierdquo ktoacutera z funkcji programu zosta a u yta a ktoacuteranie mdash informacje te ma wy cznie kompilator W ten sposoacuteb powstaje typowe b dneko o w efekcie nasze nieu ywane funkcje nie s usuwane (linker zostawia je bdquonawszelki wypadekrdquo) i zajmuj niepotrzebnie pami Czy mo na temu jako zaradzi Oczywi cie tak W tym celu trzeba po czy si y kompilatora i linkera co zapewniaj od-powiednie opcje kompilacji We w a ciwo ciach projektu (ProjectProperties lub Alt+F7)wybieramy zak adk Toolchain a nast pnie AVRGNU C Compiler i OptimizationZnajdziemy tam pole wyboru o nazwie Prepare functions for garbage collection (ry-sunek 224)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 69

Rysunek 224 Aby da linkerowi mo liwo usuwania nieu ywanych funkcji nale y skompilowaprogram z wybran opcj ndashffunction-sections ktoacutera spowoduje e ka da funkcja programu znajdzie siwe w asnej sekcji

Zaznaczenie tej funkcji spowoduje umieszczenie ka dej funkcji w osobnej sekcji mdashsamo w sobie nie wp ynie to na skroacutecenie kodu wynikowego ale jest warunkiem nie-zb dnym dla podj cia stosownych dzia a przez linker Aby wyeliminowa nieu y-wane funkcje nale y zaznaczy jeszcze w ga zi AVRGNU LinkerOptimization poleGarbage collect unused sections (rysunek 225)

Rysunek 225 Zaznaczenie opcji Garbage collect unused sections (-Wl--gc-sections) spowodujee nieu ywane funkcje zostan usuni te z kodu wynikowego w efekcie kod programu ulegnie skroacuteceniu

Po zaznaczeniu tych opcji program zostanie skroacutecony o kilkaset bajtoacutew Oczywi cieje li wszystkie funkcje by yby wykorzystane nie uzyskaliby my adnego skroacuteceniakodu Niemniej w sytuacji gdy u ywa si bibliotek zazwyczaj przynajmniej czfunkcji nie jest wykorzystywana warto wi c skorzysta z tej mo liwo ci optymalizacji

Kup książkę Poleć książkę

70 AVR Uk ady peryferyjne

Je li mamy do czynienia z prekompilowan bibliotek (lib) to musi ona by skom-pilowana z zaznaczon opcj Prepare functions for garbage collection (-ffunction-sections) Alternatyw jest umieszczenie ka dej funkcji biblioteki w osobnym pliku(tak jak w przypadku bibliotek AVR-libc)

Na ekranie wyboru opcji optymalizacji linkera mamy jeszcze jedn przydatn opcjmdash Relax Branches (-mrelax) Dla mikrokontroleroacutew ktoacutere maj ponad 8 kB pami ciFLASH instrukcje skokoacutew s generowane jako tzw instrukcje d ugie mdash umo liwiajone skok do komoacuterki pami ci FLASH o dowolnym adresie Jednak cen za to jestwyd u enie instrukcji mdash ich kod jest d u szy podobnie jak czas wykonania Nie zawszejednak takie d ugie instrukcje musz by wykonywane mdash je li miejsce docelowe skokule y blisko (w zasi gu instrukcji skokoacutew wzgl dnych) to mo na w kodzie wynikowymzamieni instrukcje d u sze na kroacutetsze co przynosi oszcz dno ci w postaci skroacuteceniakodu wynikowego Poniewa dopiero linker bdquowierdquo jak poszczegoacutelne fragmenty kodus rozmieszczone w pami ci takiej podmiany mo na dokona na etapie linkowaniaprogramu co zapewnia powy sza opcja St d te warto to pole wyboru zaznaczy

Kup książkę Poleć książkę

SkorowidzA

ABI Application Binary Interface 25AC Address Counter 50ADPCM 482adres

bazowy 377bufora 61komoacuterki 84pu apki 202

ALE Address Latch Enable 368alfanumeryczne wy wietlacze 43algorytm ADPCM 492algorytmy stratne 495animacje 57antyaliasing 325architektury procesoroacutew XMEGA 352asembler 23

dyrektywy 40funkcje j zyka C 41obs uga przerwa 39

asynchroniczne wywo anie funkcji 101Atmel Studio 15

Bbajty kalibracyjne 569biblioteka

FATFS 131 139 176 180 517libcallback-liba 99PetitFS 144 149

bitADC_CH0START_bm 236IMPMODE 244

bitrate 442 512blokowanie przerwa 219b d 16 19

kwantyzacji 463offsetu 230wzmocnienia ADC 230

BOD 223bps bits per second 12

budowakarty 152linii obrazu 394pami ci SDRAM 374pliku stymulacji 192ramki PAL 412sygna u PAL 411wtyczki 544 545

bufor 78FIFO 497na transakcje 61transakcji 62

buforowanie wyj cia 294

CCAS Column Address Strobe 375CCFL 44charakterystyka

przetwornikoacutew 222termistora 264tryboacutew pracy 232

CID Card Identification 169CKE Clock Enable 375CLKIN 421COG Chip on Glass 310CRC 158 178CRC16 178CRC7 164CS Chip Select 361 375CSD Card Specific Data 172czas

dost pu do SDRAM 424adowania kondensatora 244

propagacji 281proacutebkowania 260symulacji 209

czcionki 322cz stotliwo

odchylania pionowego 428proacutebkowania 244 441 444 530przebiegu 504

Kup książkę Poleć książkę

576 AVR Uk ady peryferyjne

cz stotliwoPWM 465taktowania koprocesora 549taktowania procesora 209taktowania rdzenia 18

czyszczenie pami ci 318

DDAC Digital to Analog Converter 293 447 451

buforowanie wyj cia 294generowanie przebiegoacutew 301jitter 303kalibracja 306napi cie referencyjne 295system zdarze 297taktowanie 296tryb dwukana owy 301wykorzystanie DMA 298wyzwalanie konwersji 305

datalogger 261 265 275DD Device Density 86debuger 183

programowy 190sprz towy 185 187

decymacja 259DEBUG 219XMEGA 260

definicja symboli globalnych 36definiowanie w asnych znakoacutew 56deklaracja zapowiadaj ca 103 337dekoder DTMF 548 556DMA 254 298 402 458 518 523dost p do

danych 358 359 568danych binarnych 356 360danych wielobajtowych 31DataFLASH 137EEPROM 128FAT 136komoacuterki 375LCD 59 62 66 68operandu 30pami ci 81 384 386 387 561pami ci SDRAM 424pliku blokowy 141portoacutew IO 30rejestroacutew IO procesora 36rejestroacutew uk adu 499SPI 95sygnatury u ytkownika 565 567wska nikoacutew 32

DQM Data Mask 375DSP Digital Signal Processor 535

DTMF 535 553dyktafon 529dynamiczna alokacja pami ci 516dyrektywa global 38dyrektywy asemblera 40dzia anie

DMA 255komparatora 280timeroacutew 400

d wi k 443

EEBI External Bus Interface 361EEPROM 207eliminacja jitteru 24emulacja RS232 139

FFAT File Allocation Table 128 131FAT32 128FATFS 180filtr

dolnoprzepustowy 491drugiego rz du 470pierwszego rz du 469trzeciego rz du 471

filtrowanie sygna u PWM 468firmware 565FLASH 207format

odpowiedzi 159polecenia 158protoko u 157

funkcja_delay_ms 17 219c_zero 42callback 106 341callback() 99DataFLASH_CSEnable 100DF_FinishBufWrite() 269disk_initialize 136disk_ioctl 181disk_status 136disk_write 138DMA_SPI_init 104DTMF_GetCode 553free_re 65GPIOR0_init 507hd44780_outcmd 51hd44780_outnibble_nowait 65LCD_defchar_P 57

Kup książkę Poleć książkę

Skorowidz 577

Menu_Click_Func 515Menu_Free 516Menu_Recorder 532Menu_Run 527MS_CreateRegEntry 117MS_GetDirPos 125MS_GetRegItem 115MS_WritePages 116 118OSC_wait_for_rdy 473RecMenu_StartStop 532sprintf 142strtok 124sysclk_init() 200 209TMF_memcpy_PF 454udi_cdc_getc() 123udi_cdc_is_rx_ready() 123VS1003_Reset 506

funkcjeanalizuj ce 556biblioteczne 50biblioteki FATFS 143j zyka C 41kontrolera ST7565R 313opoacute niaj ce 17opoacute nie 219reentrant 524specjalne kontrolera 319steruj ce 314zapisu 133

fusebit 557BODACT 560BODLEVEL 560BOOTRST 559DVSDON 560EESAVE 561JTAGEN 558RSTDISBL 559SUT 559TOSCSEL 559

fusebity w AVR-libc 571

Ggenerator obrazu composite 426generowanie

d wi ku 461kolorowego obrazu 437obrazu wideo 391przebiegoacutew 301przerwa 285sygna u composite 409

g bia koloru 326gniazdo

karty SD 156VGA 396

Hhistereza 281

IIDE 11IMA ADPCM 483informacje

o kolorze 431o obrazie 434

inicjalizacjakarty 161karty SDHC 167karty SDSC 167karty SDXC 167licznika 419pami ci 119USART 505

instrukcjaicall 42movw 35nop 13 24

interfejsSCI 498SDI 498SPI 71 79RS232 120UART 123USART 71 73

interpolacja 259interpolacja w XMEGA 260inwersja obrazu 319

Jjednostki 12jitter 24 303 420

Kkalibracja

ADC 229DAC 306 564offsetu 237

kana DMA 82 522karta 154 158

mikroSD 152SD 151 152SDHC 151 152 160SDSC 160SDXC 151 160

Kup książkę Poleć książkę

578 AVR Uk ady peryferyjne

karty pami ci 151 152 157biblioteka FATFS 180budowa 152format polecenia 158inicjalizacja 161 167komunikacja 156odczyt danych 173opcje konfiguracyjne 181rejestry specjalne 169tryby pracy 153zapis danych 176zasilanie 154

kodasemblerowy 23 24C 23dost pu 24

kodowanieμ-law 481ADPCM 483Dialogic ADPCM 494informacji 166 426koloru 425znakoacutew 536

kodyformatoacutew audio 501zdarze 545

kolejno bajtoacutew 533kolor 424 430kolorowy obraz 437komparator 422

analogowy 279 280analogowy XMEGA 282okienkowy 284

kompilacja plikoacutew binarnych 350kompilator avr-gcc 11 359kompresja

ADPCM 482 486d wi ku 480IMA ADPCM 482

komunikacja z koprocesorem 504konfiguracja

4-portowa 364biblioteki 133debugera 185DMA 459 522fusebitoacutew 570kontrolera DMA 257 452komparatoroacutew 285lockbitoacutew 570LPC 371pami ci SDRAM 381PetitFS 149pinu IO 225portoacutew IO 362

preskalera 452projektu 186przerwa 219pu apki 203rejestru EVCTRL 248rejestru PER 67SPI 75sygna u CS 377typu czcionki 324urz dze IO 189USART 76zegara 383

konsolidacja 547kontroler

DMA 254 298 402 458 518 523KS108 310ST7565R 310ndash315 321

konwersjaDAC 305sygna oacutew 396wyzwalana 306

konwertercyfrowo-analogowy 426DAC 427

koprocesormp3 496VS1003B 10

korekcja fazy 466kwantyzacja 463

Llampa CCFL 44LE Latch Enable 433licznik 419

cykli 209TCC1 400timera 20

linie IO 50linie sygna owe

MISO 72 164MOSI 72SCK 72SS 72

linker 69lista

mnemonikoacutew 24modyfikowanych rejestroacutew 32

lockbity 557 561lockbity w AVR-libc 570LPC Low Pin Count 371LPCM 443 556LSB Least Significant Bit 228

Kup książkę Poleć książkę

Skorowidz 579

a cuchy formatuj ce 212czenie plikoacutew 352

Mmagistrala pami ci zewn trznej 361magnetofon cyfrowy 528makro _SFR_IO_ADDR() 39makrodefinicja

ASSERT 214HD44780_CGADDR() 53HD44780_CLR 53HD44780_DDADDR() 53HD44780_DISPCTL() 52HD44780_ENTMODE() 52HD44780_FNSET() 52HD44780_HOME 53HD44780_SHIFT() 51LOCKBITS 571

mapowanie sygna oacutew 366mapy bitowe 343marker czasowy 268maski bitowe 329matryce 49menu 335menu piktogramowe 342mierniki temperatury 262mikrokontroler

ARM 9AVR 9PIC 9XMEGA128A3U 10

MISO 72moc wydzielana 265model psychoakustyczny 495modu

alfanumeryczny 45NVM 568Xmega eXploreGO 10Xplained ATXMEGA A3BU 10Xplained ATXMEGA-A1 10Xplained XMEGA128A1 447Xplained XMEGA256A3 94Xplained XMEGA256A3BU 97 143 266

modyfikator 30const 85volatile 28 273

monitory CRT 395monochromatyczne wy wietlacze graficzne 309monochromatyczny

tryb graficzny 416tryb tekstowy 413

MOSI 72mp3 495Msps Megasamples per second 12multiplekser wej ciowy 226 283multipleksowanie adresoacutew 368 369muzyka 439

Nnadawanie kodoacutew DTMF 540nadproacutebkowanie 258nag oacutewek kontenera wav 500nagrywanie mowy 486najmniej znacz cy bit 228napi cie

offsetu 280referencyjne 223 295zasilania 239

Oobracanie obrazu 319obraz 319

composite 426kolorowy 430wideo 391

obroacutebka d wi ku 443 445obs uga

FAT 131 143klawiatury matrycowej 24LCD 58 63 67menu 337przerwania 37 38 458przerwania DMA 525przerwa w asemblerze 39przyciskoacutew 272wy wietlaczy alfanumerycznych 45

odczytblokowy 140danych 173 358

odpowied response 159R1 159R2 159R7 160

od wie anie pami ci 376odtwarzanie

d wi ku 472muzyki 447 513 518 521

offset 238offset ADC 230okno

Breakpoints 202Call stack 209dezasemblera 210

Kup książkę Poleć książkę

580 AVR Uk ady peryferyjne

oknoIO View 207podgl du zmiennych 211wyboru czcionek 324

OLED 46opcje

kompilatora 35zapisu d wi ku 445

operacjena buforach 91odczytu 173zapisu 176zapisu strony 92

operand 29operator

ascii 41

asciz 41

byte 41

section 41opoacute nienia 13 18opoacute nienie zmienne 16optymalizacja 16 68optymalizator 26organizacja pami ci 77organizacja pami ci VRAM 316oscylator 287OSD On-Screen Display 417ostrze enie 16oszcz dzanie energii 94

Ppakiet WinAVR 48pami

CGRAM 56 57 64DataFLASH 10 77 81 113 269DDRAM 49EEPROM 111FLASH 54 124 207RAM 49SDRAM 372SRAM 63 124 329 366 371VRAM 314 317

PCLK 421PCM 443PetitFS 144 149p tla

for 13while 201

pierwsza linia obrazu 321piksel 430piktogram 342pin IO 225

plikAlloc_safeh 65DataFLASHc 83DataFLASHIOc 136definesh 50delayh 14diskioh 132 136ffh 132ffconfh 132 181hd44780h 49integerh 132ioh 30LCD_transc 61LCD-transactc 66Makefile 14Menuc 19nothingo 541outfiletxt 547 551pffh 149SPIh 104stringh 113stymulacji 191 192

pliki mp3 495elf 351fon 323o 24S 24 34binarne 350 355csv 276d wi kowe 440obiektowe 352wav 500WMA 512z czcionkami 327z danymi 349

podbijacz napi cia 315podgl d

pami ci 207stosu wywo a 209zmiennych 211znakoacutew 325

pod czeniefototranzystora 262karty SD 155LCD z kontrolerem 311modu u 50pami ci 362 369 370 373termistora 262uk adu LM35 251wyj XMEGA 398

pod wietlenieCCFL 46OLED 46

Kup książkę Poleć książkę

Skorowidz 581

podwoacutejne buforowanie 255 332 457polecenia

kasowania strony 81konfiguracyjne pami ci 82kontrolera ST7565R 315odczytu bufora 82 89odczytu pami ci 81 88SDRAM 376transferu 91

polecenieACMD41 168cd 181CID 178CMD0 165CMD8 167CSD 178date 276dir 127 181dump 276erase 276get 276HD44780_CLR 51Init 178mkdir 181

po czenieDMA ze SPI 96dwoacutech komparatoroacutew 285koprocesora mp3 497LCD z mikrokontrolerem 48wyj cia XMEGA 411XMEGA z PC 121z telewizorem 431

pomiarnapi cia zasilania 239temperatury MCU 241

port IO 30 362pozycjonowanie grafik 345poacute obraz 410precyzja pomiaroacutew 260preskaler 478preskaler ADC 243program

Atmel Data Visualizer 275Audacity 443avr-objcopy 350dataloggera 265LCD Image Converter 323makeloadingtableexe 543Realterm 127 554riffstrip 483SoX 445Tracepoint 208

programowanie sygnatury u ytkownika 566protokoacute master-slave 157

prototypy 136proacutebki d wi kowe 447proacutebkowanie

8-bitowe 300nieliniowe 480

prymitywy graficzne 330przebieg PWM 468przebiegi 289 303przechwytywanie danych 276przemiatanie wej 253przerwanie 218 254 286 403

DMA 522komparatora 286

przestrze adresowa procesora 378przesy anie

danych 498polece 498

przetaktowanie procesora 436przetwornik

ADC 221analogowo-cyfrowy 221cykliczny 222potokowy 222

przyciski 272pseudooperatory 41pu apki breakpoints 197pu apki warunkowe 205punkty ledzenia 203PWM 461 462 472

RRAS Row Address Strobe 375redukcja poboru energii 242regulacja kontrastu 321rejestr 32 34rejestr AC 50

adresu wtyczki 513BASEADDR 377CID 169CMP 251CSD 172czasu utworu 512DATA 83EVCTRL 248formatu audio 512identyfikacyjny pami ci 87INTFLAGS 252kontroli basoacutew 510kontroli g o no ci 513MUXCTRL 227OCR 168PER 67poroacutewnania 249

Kup książkę Poleć książkę

582 AVR Uk ady peryferyjne

rejestr ACSCI_CLOCKF 511stanu komparatora 287stanu pami ci 86stanu uk adu 510trybu pracy 508WINCTRL 285

rejestrydost pu do pami ci RAM 513GPIOR 502IO procesora 36mikrokontrolera 25procesora 35specjalne 94specjalne karty 169uk adu VS1003B 508

relacja rodzic ndash dziecko 336reset uk adu 534rozdzielczo

LCD 329przetwornika 231PWM 463 477

rozszerzenie HiRes 477 479roacutewnanie Steinharta-Harta 263rysowanie map bitowych 343

Sschemat uk adu dataloggera 267SCI Serial Command Interface 498SCK 72SD Secure Digital 152SDI Serial Data Interface 498separator synchronizacji 422separowanie impulsoacutew synchronizacji 422shieldy 10skaler 422skaler napi cia 283skrypt makefile 353s owo kluczowe

asm 27extern 37static 68

specyfikatory lokalizacji zmiennej 213sps samples per second 12SS Slave Select 72standard PAL 410standard VGA 393sterowanie

dataloggerem 275sygna em 379

sterownik 121HD44780 49 56LCD 49 62

stos wywo a 209

strukturaFATFS 139Handle 118LCD_trans 60 63menu 338rejestru 86SimpleFSEntry 113 116SimpleFSHandle 113 118 140submenu 527systemu plikoacutew 112

sumabitowa 571kontrolna 178

sygnacomposite 409composite video output 430CS 377DREQ 497H-Sync 396synchronizacji 423V-Sync 396zegarowy CLK 374

sygna yinterfejsu EBI 363magistrali EBI 364steruj ce 375

sygnaturaprodukcyjna procesora 563u ytkownika 565

symbol__DELAY_ROUND_CLOSEST__ 17__DELAY_ROUND_DOWN__ 17_FS_FAT12 149_FS_FAT32 149_FS_MINIMIZE 133_FS_READONLY 133_FS_RPATH 135_FS_TINY 133_MAX_SS 135_MULTI_PARTITION 135_USE_DIR 149_USE_FASTSEEK 134_USE_FORWARD 134_USE_LABEL 134_USE_LFN 134_USE_LSEEK 149_USE_MKFS 134_USE_READ 149_USE_STRFUNC 134_USE_WRITE 149_VOLUMES 136F_CPU 14 15 18increment 36USE_BUSY_FLAG 50

Kup książkę Poleć książkę

Skorowidz 583

symboleglobalne 36w asemblerze 28zewn trzne 39

symulacja 198 209symulator 190synchronizacja

pami ci 331pionowa 395pozioma 394

systemplikoacutew 111 128przerwa 404zdarze 245

szablonfont_XMEGAtmpl 326image_XMEGAtmpl 343

szum 463szybko przesy ania danych 126

ledzenie wi zki 333rodowisko

graficzne 11programistyczne 11VSIDE 542WinAVR 47

Ttabela FAT 130tablica

framebuf 402 408plugintbl 552 555tekst 208z kodem wynikowym 543

taktowanieDAC 296mikrokontrolera 473

technologia OLED 44temperatura mikrokontrolera 239 241termistor 262 290

NTC 263PTC 263

termometrLM35 249 250z alarmem 251

termostat 290test uk adu VS1003B 503testowanie obrazu 319timer 16 62

TCC0 20

TCC1 399transakcja 59 62 65transakcje 17 103ndash107transakcyjna obs uga LCD 58transakcyjny dost p do SPI 95transfer 91

danych 97wynikoacutew 254

transmisja 72 83tryb

bez znaku 234ci g ej konwersji 252czterobitowy 153dwukana owy 301graficzny 416graficzny VGA 407idle 419jednobitowy 153LPC 371monochromatyczny 397 407oszcz dzania energii 94 306pracy multipleksera 226pracy SPI 157roacute nicowy 232single slope 312SPI 153tekstowy 413tekstowy VGA 397z pojedynczym wej ciem 234ze znakiem 235

trybygenerowania PWM 467pracy karty 153pracy przetwornika 231pracy SPI 74pracy uk adu 508

twierdzenie Nyquista 258tworzenie

adresu 84nak adek 417obrazu 335tablicy 543

typ__uint24 119karty 160niekompletny 60wyliczeniowy 114

typyoperandoacutew 29w AVR 34

Kup książkę Poleć książkę

584 AVR Uk ady peryferyjne

Uuchwyt handle 64 113uk ad

AD725 427 431buforowy 294CS 361DAC 284dataloggera 267detekcji awarii zasilania 559generuj cy obraz 393HiRes 477ICL7660 47LM35 250 251SampH 293sterowania sygna em 379USART 401VS1003B 496 503 508 530 538 556VS100XX 529wzmacniania sygna u 227

uk ady peryferyjne 9uruchomienie komparatora 287urz dzenie

master 72slave 72

u rednianie 259utrata danych 141u ycie wstawki asemblerowej 33

VVGA 393

Wwarto ci kalibracyjne

ADC 564oscylatoroacutew 564temperatury 564

warunkowa kompilacja 36WE Write Enable 375wej cie composite video input 425wektor przerwa 38 257wideo 391wielko pami ci 86 377w czenie DAC 299wska nik na struktur 27wska niki 32wstawki asemblerowe 24 33wtyczka 535 541 544

SineDTMF Generator 537VGA 396

wyboacuter cz stotliwo ci PWM 465 474wykorzystanie

DMA 254 518

EuroSCART 428PWM 461rejestroacutew 34

wyliczanie predyktora 489wy wietlacze

alfanumeryczne 43 45graficzne 43 309LCD 43OLED 46

wy wietlanielitera u 213map bitowych 344obrazu 333 346 406obrazu VGA 393

wywo ania zwrotne callbacks 98asynchroniczne 101synchroniczne 101

wyzwalanie konwersji 245wzmacniacz 446wzmacniacz operacyjny 279wzmacnianie sygna u 227

XXMEGA 9 18

Zzapis

bufora 269danych 176d wi ku 440 556

zasilaniekarty 154pami ci 109

zatrzask 368zatrzask 74HC573 433zatrza ni cie adresu 369zdarzenia 297zdarzenie compare match 399zegar 383 420 426zintegrowane rodowisko programistyczne 11z cze EuroSCART 425 428 429zmiana

g o no ci 527wielko ci strony 94

znaki 56

roacuted onapi cia odniesienia 284sygna u 240

Kup książkę Poleć książkę

Page 23: Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8 AVR. Ukäady peryferyjne Rejestry dost pu do pami ci RAM .....513 Rejestr adresu

58 AVR Uk ady peryferyjne

int main() lcd_init() lcd_putchar(0) while(1) for(uint8_t x=0xlt8x++) lcd_box(x) _delay_ms(100) for(int8_t x=7xgt=0x--) lcd_box(x) _delay_ms(100)

Funkcja main wy wietla na LCD tylko jeden znak o kodzie 0 a nast pnie cykliczniezmienia jego definicj w pami ci CGRAM W efekcie posta znaku wy wietlana naekranie ci gle si zmienia

Transakcyjna obs uga LCDPokazana do tej pory obs uga LCD alfanumerycznego mia a pewne wady Jak wiemyoperacje odwo uj ce si do kontrolera LCD s niezwykle wolne cykl odczytuzapisudowolnego rejestru kontrolera trwa co najmniej 1600 ns co dla MCU taktowanegozegarem 32 MHz przek ada si na czas wykonania oko o 52 instrukcji asemblera Cogorsza wi kszo komend realizowanych przez kontroler jest wykonywana w czasieoko o 37 s co przek ada si na tysi ce zmarnowanych taktoacutew MCU St d te jaki-kolwiek zapisodczyt LCD to z perspektywy programu straszne marnotrawstwo czasu

Problem ten dotyczy ka dego urz dzenia IO ktoacutere dzia a wolniej ni procesor W takiejsytuacji warto napisa pewn warstw po redni mdash sterownik mdash ktoacuterego zada-niem b dzie buforowanie da dost pu do urz dzenia i rozstrzyganie konfliktoacutewdzi ki czemu roacute ne cz ci programu b d bdquomia y wra enierdquo e maj wy czny do-st p do urz dzenia

Pokazane wcze niej funkcje obs ugi LCD maj jeszcze jedn wad mdash nie s wspoacute bie -ne czyli nie mo na ich wykonywa jednocze nie w kilku miejscach programu w tymw szczegoacutelno ci w programie g oacutewnym i w funkcjach obs ugi przerwa W wielu przy-padkach ta wada jest bez znaczenia jednak czasami jest uci liwa mdash dla przyk adugdy na wy wietlany tekst chcieliby my na o y inne informacje np o dacie lub godzi-nie Oczywi cie wy wietlanie mo na zorganizowa tak aby nie by o potrzeby pisaniawspoacute bie nego kodu np poprzez zastosowanie bufora pami ci VRAM kontrolera LCDRodzi to jednak kolejne problemy i jest ma o eleganckie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 59

Zastanoacutewmy si w jaki sposoacuteb najlepiej jednocze nie rozwi za problem wolnegodost pu do urz dzenia i wspoacute bie no ci kodu Rozwi zaniem mo e by wprowadze-nie tzw transakcji Transakcj nazywamy zbioacuter operacji tworz cych pewn ca-o To co wyroacute nia tak wykonywany zestaw operacji to atomowo spoacutejno

izolacja i trwa o Pod tymi terminami kryje si istota wykonywanej operacji Ato-mowo transakcji zapewnia e jest ona wykonywana w sposoacuteb niepodzielny co gwa-rantuje nam prawid ow wspoacute prac z danym urz dzeniem IO w tym przypadku kon-trolerem LCD Wa na dla nas jest tak e izolacja mdash dzi ki temu inne operacje na LCD(inne transakcje) nie b d mia y wp ywu na wynik aktualnie wykonywanej transakcjimdash nie b d zak oacuteca y jej wykonania z drugiej strony nasza transakcja nie zak oacuteciwykonania innych Trwa o z kolei zagwarantuje nam e je li sterownik potwierdziwykonanie transakcji to znaczy e efekt jej dzia ania jest wy wietlony na LCD Tacecha nie jest nam a tak potrzebna mdash jest ona wydawa oby si oczywista Niemniej jestto pewna gwarancja e ca a operacja przebieg a poprawnie i w efekcie LCD znajdujesi w okre lonym przez nas stanie Tyle teorii przejd my do praktyki

Kody poni szego przyk adu znajduj si w katalogu PrzykladyLCD-alfaLCD-transact

Aby zapewni transakcyjny dost p do LCD musimy stworzy pewne struktury danychktoacuterych zadaniem b dzie przechowywanie informacji o operacjach sk adaj cych sina transakcje i stanie ich wykonania W tym celu pos u ymy si wiadomo ciami z roz-dzia u 5 bdquoJak uporz dkowa chaos czyli z o one typy danych i listyrdquo Do przecho-wywania oczekuj cych transakcji pos u ymy si buforem pier cieniowym zanimjednak go zaimplementujemy zastanoacutewmy si jak powinna wygl da struktura prze-chowuj ca informacje o transakcji Struktura ta powinna zawiera co najmniej

pole danych (data) z informacjami ktoacutere maj by przes ane do kontrolera LCD

pole okre laj ce liczb danych do wys ania (len)

pole okre laj ce realizowane polecenie dla LCD (cmd) mdash pole to pos u yprogramowi sterownika do w a ciwej interpretacji danych znajduj cych siw polu data

kilka poacutel kontrolnych przechowuj cych informacje potrzebne do realizacjisamej transakcji Jedno z nich mdash Ready mdash b dzie przyjmowa warto trueje li dana transakcja zosta a zrealizowana lub false w przeciwnym przypadkuZnaczenie drugiego pola mdash SelfDel mdash mo e wydawa si nieco enigmatycznepole to okre la czy pami przydzielona dla transakcji ma by zwolnionaw sterowniku LCD (warto true) czy te zostanie zwolniona w programie(warto false)

Oto jak mo e wygl da struktura definiuj ca transakcj typedef struct volatile bool Ready 1 true je li transakcja zosta a zrealizowana bool SelfDel 1 true je li pami przydzielona transakcji ma zosta zwolniona LCD_Cmd cmd 2 Polecenie do zrealizowania uint8_t len 6 D ugo polecenia

Kup książkę Poleć książkę

60 AVR Uk ady peryferyjne

unsigned 0 Wyroacutewnanie do granicy bajta uint8_t data[] Dane transakcji LCD_trans

Nale y zwroacuteci uwag na poleunsigned 0

Nie definiuje ono adnego pola struktury ale jedynie informuje kompilator e kolejnepole (w naszym przyk adzie o nazwie data) ma by wyroacutewnane do granicy bajta mdashdzi ki temu dost p do kolejnego pola b dzie odbywa si szybciej Z kolei samo poledata jest zadeklarowane jako tzw typ niekompletny

Typ niekompletny (ang incomplete type) to typ ktoacuterego rozmiaru nie da si okre li

W pokazanym przyk adzie rozmiaru pola data nie da si okre li gdy zosta on za-deklarowany jako typ tablicowy z tym e nie podano wielko ci tablicy Wielko ci niepodano gdy na etapie deklaracji struktury nie wiemy jakiej wielko ci dane b d w niejprzechowywane Tego typu deklaracja ma bardzo powa ne konsekwencje mdash skorowielko ci pola data nie da si okre li to jaki b dzie wynik dzia ania operatora sizeof(LCD_trans) Kompilator stara si jako wybrn z tej sytuacji w zwi zku z czym

zwroacuteci wielko struktury ale tak jakby pole data w ogoacutele nie istnia o mdash jego roz-miar b dzie wynosi 0 W ramach wiczenia zastanoacutew si ile bajtoacutew pami ci b dziezajmowa a struktura LCD_trans

Skoro dysponujemy ju struktur przechowuj c poszczegoacutelne transakcje pora nastworzenie obiektu przechowuj cego kolekcj transakcji Dodanie kolejnej strukturyb dzie polega o na dodaniu jej do takiego obiektu z drugiej strony program sterownikaLCD b dzie moacuteg z tej kolekcji pobiera kolejne transakcje do realizacji Opis ten przy-pomina opis dzia ania bufora pier cieniowego mdash z jednym wyj tkiem mdash po zape nie-niu ca ego bufora nie b dziemy usuwa niezrealizowanych transakcji lecz zabloku-jemy dodawanie kolejnych W tym celu pos u ymy si definicj nast pnej struktury

typedef struct LCD_trans elements[LCD_MAXTRANS] Wska niki do transakcji uint8_t Beg Pierwszy element bufora uint8_t Count Liczba elementoacutew w buforze CircBuffer

Struktura ta zawiera deklaracj tablicy wska nikoacutew na transakcje (pole elements)Poniewa jest to tablica musimy zna liczb jej elementoacutew mdash jest ona zadeklarowanaw sta ej LCD_MAXTRANS

define LCD_MAXTRANS 10 Maksymalna liczba pami tanych transakcji

Do realizacji bufora s potrzebne jeszcze dwa pola Beg wskazuj ce na pierwsztransakcj w buforze oraz pole Count okre laj ce liczb transakcji znajduj cych siw buforze Je li Count == 0 to znaczy e w buforze nie ma adnych oczekuj cychtransakcji a je li Count == LCD_MAXTRANS to znaczy e bufor jest pe ny i nie mo na

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 61

dodawa do niego kolejnych transakcji W a ciwo t wykorzystuj dwie zdefiniowanew pliku LCD_transc funkcje

static inline bool cbIsFull(CircBuffer cb) return cb-gtCount == LCD_MAXTRANS

static inline bool cbIsEmpty(CircBuffer cb) return cb-gtCount == 0

Jak pami tamy w przypadku funkcji modyfikatory static inline powoduj e danafunkcja nie b dzie istnie jako samodzielna lecz w ka dym miejscu w ktoacuterym jestwywo ywana jest wstawiany raczej jej kod a nie wywo anie Ma to znaczenie dlakroacutetkich funkcji (a wi c takich jak pokazane powy ej) dla ktoacuterych koszty wywo anias zazwyczaj wi ksze ni koszty umieszczenia cia a funkcji w miejscu jej wywo aniaTego typu funkcje zachowuj si w sposoacuteb zbli ony do makrodefinicji (z tym e re-spektuj wszystkie regu y j zyka C w szczegoacutelno ci kolejno operatoroacutew czy kon-trol typoacutew)

Takie funkcje jako argument pobieraj adres bufora na ktoacuterym maj operowa W na-szym przypadku bufor jest zdefiniowany nast puj co

static CircBuffer LCD_TransBuffer Bufor na transakcje

Nale y zauwa y e jest on zdefiniowany jako struktura globalna z modyfikatoremstatic Modyfikator ten ogranicza zasi g widoczno ci zmiennej LCD_TransBuffer dopliku w ktoacuterym zmienna ta zosta a zdefiniowana (w tym przypadku modyfikator staticjest niejako przeciwie stwem modyfikatora extern) Dzia anie to ma jedynie znaczeniekosmetyczne mdash uniemo liwia odwo anie si do bufora za pomoc funkcji ktoacutere niezosta y zdefiniowane w miejscu jego definicji Oproacutecz funkcji umo liwiaj cych okre-lenie stanu bufora potrzebne s jeszcze funkcje umo liwiaj ce dodanie i pobranie trans-

akcji Pierwsz funkcj b dzie funkcja dodaj ca transakcj do buforabool cbAdd(CircBuffer cb LCD_trans elem) ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsFull(cb)) return false Czy jest miejsce w kolejce uint8_t end = (cb-gtBeg + cb-gtCount) LCD_MAXTRANS cb-gtelements[end] = elem Dodaj transakcj ++cb-gtCount Liczba elementoacutew w buforze return true Wszystko OK

Funkcja ta dodaje transakcj (zmienna elem) do bufora ko owego Zanim transakcjazostanie dodana sprawdzane jest czy w buforze jest miejsce mdash je li nie funkcjazwroacuteci false Je li dodanie jest mo liwe warto licznika okre laj cego liczb trans-akcji przechowywana w buforze (Count) zwi ksza si o jeden Warto zastanowi si te dlaczego praktycznie ca e cia o tej funkcji jest zamkni te w sekcji atomowej (ATOMIC_BLOCK) Jedn z cech naszego sterownika ma by mo liwo wspoacute bie nego dost pu

Kup książkę Poleć książkę

62 AVR Uk ady peryferyjne

do LCD mdash to znaczy e danie np zapisu do LCD mo e wyst pi zaroacutewno w g oacutewnejp tli programu jak i asynchronicznie w przerwaniu St d te wynika e funkcja do-daj ca transakcj musi by napisana w sposoacuteb zapewniaj cy jej poprawn prac w sytu-acji gdy zostanie ona przerwana i ponownie wywo ana przed zako czeniem dzia aniajej poprzedniej instancji Umieszczenie cia a tej funkcji w sekcji atomowej nam to za-pewnia mdash dzi ki temu bufor transakcji zawsze b dzie spoacutejny Dla zaspokojenia cie-kawo ci warto usun sekcj atomow i sprawdzi jak wtedy b dzie zachowywa si tafunkcja i jak wp ynie to na spoacutejno przechowywanych danych

Drug niezb dn funkcj jest funkcja odczytuj ca bufor transakcji i zwracaj ca trans-akcj do zrealizowania (lub NULL je li adnej transakcji nie ma w buforze)

LCD_trans cbRead(CircBuffer cb) LCD_trans elem ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsEmpty(cb)) return NULL Bufor pusty nie mo na zwroacuteci elementu elem = cb-gtelements[cb-gtBeg] cb-gtBeg = (cb-gtBeg + 1) LCD_MAXTRANS -- cb-gtCount Zmniejszamy liczb elementoacutew pozosta ych w buforze return elem

Funkcja ta jest bardzo podobna do poprzedniej mdash najpierw sprawdza czy bufor za-wiera jak oczekuj c transakcj (cbIsEmpty(cb)) je li tak to zwraca adres opisuj -cej j struktury i zmniejsza liczb transakcji oczekuj cych (pole Count) W ten sposoacutebmamy zrealizowan ca funkcjonalno zwi zan z obs ug bufora pier cieniowegoPokazane funkcje s uniwersalne i z bardzo podobnych (lub wr cz tych samych) b -dziemy korzysta w kolejnych rozdzia ach w kontek cie np obs ugi transakcji zwi -zanych z interfejsami szeregowymi

Pora przej do samego sterownika LCD Jego zadaniem b dzie sprawdzenie czyw buforze oczekuj jakie transakcje do realizacji a je li tak to ich wykonanie Ponie-wa dane do LCD mog by wysy ane co okre lony minimalny czas znacznie d u -szy ni czas jakiego na to zadanie potrzebuje mikrokontroler do wysy ania kolejnychpaczek danych pos u ymy si timerem Timer b dzie generowa przerwanie nadmiaru(TCD0_OVF_vect) ktoacutere b dzie wyznacza o tempo w jakim kolejne porcje danych b -d trafia y do LCD Z noty katalogowej kontrolera wynika e minimalny czas trwa-nia wysokiego stanu sygna u Enable to 230 ns a okres tego sygna u nie powinien bykroacutetszy ni 500 ns Poniewa nasz dost p do LCD odbywa si w sposoacuteb nieblokuj cyMCU wi c szybko wysy ania danych do LCD jest bez znaczenia St d te w poka-zanym przyk adzie przyj to e dane b d wysy ane co 4 s co okre la sta a

define LCD_ACCESSTIME 0000004

Poniewa komunikacja z LCD odbywa si w sposoacuteb nieblokuj cy nie zale y nam tena czasie (i tak w stosunku do czasu od wie ania samego LCD jest on bardzo kroacutetki)w efekcie nie ma potrzeby odczytywania flagi busy kontrolera Dzi ki temu w cz ciprzypadkoacutew mo emy w ogoacutele zrezygnowa z sygna u wyboru RW i wymusi jego sta y

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 63

poziom logiczny umo liwiaj cy zapis do LCD Dzi ki temu mo na zaoszcz dzi do-datkowy pin IO1

Ca a logika naszego sterownika jest zawarta w funkcji obs ugi przerwania przepe nieniatimera (TCD0_OVF_vect) Poniewa LCD jest po czony z MCU w trybie 4-bitowym(dla zaoszcz dzenia liczby wykorzystanych pinoacutew IO) kolejne 8-bitowe dane muszby podzielone na dwie tetrady i wys ane do LCD w kolejno ci starszam odsza tetradaInformacja o aktualnie wysy anych danych jest umieszczona w zmiennej trans o typie

static struct uint8_t pos 6 Pozycja w polu danych aktualnej transakcji uint8_t nibble 1 Ktoacutera tetrada jest wysy ana seq

Dlaczego tak Dzi ki wykorzystaniu struktury i poacutel bitowych mo na zaoszcz dzi je-den bajt pami ci SRAM Ze wzgl du na wielko pami ci obs ugiwanej przez kon-troler LCD mo emy by pewni e transakcje zawieraj ce wi cej ni 63 bajty s ra-czej nierealne (nie mia yby wi kszego sensu) St d te do przechowywania informacjio aktualnie wysy anym bajcie danych wystarczy 6 bitoacutew mdash tyle samo zosta o wyko-rzystanych do okre lenia d ugo ci pola danych transakcji w strukturze LCD_trans Zaosz-cz dzony bit mo na po wi ci na flag nibble okre laj c ktoacutera tetrada (m odszastarsza)jest wysy ana Bez poacutel bitowych flaga ta zaj aby dodatkowy bajt pami ci

Przejd my do implementacji sterownika Pierwsz rzecz jak nale y sprawdzi jestto czy w buforze czeka jaka transakcja do zrealizowania Odpowiedzialny za to jestfragment kodu obs ugi przerwania nadmiaru timera

if(trans == NULL) Nic do zrobienia sprawd my czy jaka transakcja oczekuje trans=cbRead(ampLCD_TransBuffer) Czy jest jaka oczekuj ca transakcja seqpos=0 seqnibble=0 if(trans == NULL) TCD0_CTRLA=TC_CLKSEL_OFF_gc Nie ma adnych transakcji mdash wy cz timer

W przypadku gdy adna transakcja nie oczekuje na realizacj timer jest wy czanymdash dzi ki temu nie b d zg aszane kolejne przerwania przepe nienia i MCU nie b -dzie traci czasu na ich obs ug Co prawda wynikaj cy z tego zysk czasowy jest mar-ginalny lecz ma to istotniejsz konsekwencj mdash w przypadku usypiania MCU zb d-ne przerwanie timera nie b dzie niepotrzebnie wybudza o procesora W takiej sytuacjiponowne w czenie timera nast pi dopiero w funkcji dodaj cej transakcj do kolejkimdash a wi c w sytuacji gdy mamy pewno e istnieje oczekuj ca transakcja

Druga cz funkcji obs ugi przerwania jest zwi zana z realizacj samej transakcjiW pokazanym przyk adzie zaimplementowano tylko jeden typ transakcji mdash daniezapisu a cucha tekstowego pod wskazany adres VRAM (na okre lonej pozycji LCD)Je li zajdzie taka potrzeba programista mo e zaimplementowa inne polecenia i doda

1 Warto zauwa y e w bdquoklasycznejrdquo obs udze LCD te nie musimy czyta stanu flagi busy zamiast tego

wystarczy wprowadza p tle opoacute niaj ce Jednak poniewa taka obs uga blokuje MCU nie jest onazalecana Wady tej nie ma dost p transakcyjny co jest jego dodatkow zalet

Kup książkę Poleć książkę

64 AVR Uk ady peryferyjne

kod odpowiedzialny za ich obs ug Zauwa my e ka da transakcja musi zawieraadres pocz tku pami ci wideo od ktoacuterego b dzie zapisywany tekst Dzieje si takdlatego e transakcja wykonana wcze niej mo e ustawi wska nik zapisu na dowolnejkomoacuterce pami ci W efekcie tekst z kolejnej transakcji by by wy wietlany od komoacuterkina ktoacuterej zako czy si zapis poprzedniej transakcji Takie dzia anie oczywi cie jestniedopuszczalne st d te ka dy zapis do pami ci wideo poprzedza ustawienie rejestruindeksowego Problem ten mo na rozwi za tak e w inny sposoacuteb mdash poprzez wpro-wadzenie tzw uchwytoacutew (ang handlers) ktoacutere zawiera yby stan kontrolera LCDNiemniej to rozwi zanie dodatkowo komplikowa oby nasz sterownik Struktura danych(zawartych w polu data) ma wi c nast puj cy format

bajt nr 0 zawiera warto pozycji od ktoacuterej nale y dokonywa zapisu pami ciwideo mdash jest to warto przesy ana do rejestru okre laj cego adres zapisu

kolejne bajty zawieraj a cuch znakowy ktoacutery nale y umie ci w pami ciCGRAM

Poniewa bajt nr 0 zawsze zawiera warto wpisywan do rejestroacutew steruj cych kon-trolera podczas jego wysy ania jest ustawiana linia RS sygnalizuj ca zapis do rejestruPodczas wysy ania kolejnych bajtoacutew linia ta jest zerowana w zwi zku z czym zapisodbywa si do pami ci CGRAM

Kod obs uguj cy transakcj wygl da nast puj coif(trans) Jest transakcja do zrealizowania uint8_t dat=trans-gtdata[seqpos] if(seqnibble == 0) datgtgt=4 To trzeba zmieni je li linie danych nie s po czone z pinami 0 ndash 3 portu IO hd44780_outnibble_nowait(dat amp 0x0F seqpos = 0) Zapisujemy rejestr steruj cy lub dane ++seqnibble if(seqnibble == 0) ++seqpos Co drug tetrad zwi kszamy pozycj bufora if(seqpos gt= trans-gtlen) trans-gtReady=true Koniec transakcji if(trans-gtSelfDel) free_re(trans) Zwolnij pami transakcji je li tak sobie yczy programista trans=NULL Koniec transakcji CLR(OUT HD44780_E)

Ta cz przerwania wysy a kolejne tetrady do kontrolera LCD Warto zastanowi sinad dzia aniem sekwencji

++seqnibble

Poniewa pole nibble jest jednobitowe operacja inkrementacji prowadzi do zmianystanu tego pola na przeciwny (pole to ma warto 0 lub 1) Kiedy zostan wys anewszystkie dane przeznaczone dla kontrolera obs uga transakcji ko czy si Stan tensygnalizuje nadanie warto ci true polu Ready struktury LCD_trans Dzi ki temu pro-gram mo e sprawdzi asynchronicznie w stosunku do przerwania kiedy transakcjauleg a zako czeniu Opcjonalnie jest wykonywana jeszcze jedna funkcja mdash je li poleSelfDel ma warto true to pami zarezerwowana na transakcj jest automatycznie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 65

zwalniana W tym celu wykorzystuje si funkcj free_re ktoacuterej prototyp jest zade-klarowany w pliku Alloc_safeh Funkcja ta wywo uje funkcj biblioteczn free ktoacute-ra zwalnia pami przydzielon dynamicznie na stercie Poniewa funkcja ta nie jestfunkcj reentrant nale y stworzy odpowiedni bdquoprotez rdquo opakowuj c j w blokatomowy co zapewnia e nie zostanie ona ponownie wywo ana zanim jej poprzed-nia instancja nie zako czy dzia ania Oczywi cie lepszym rozwi zaniem by oby napi-sanie w asnych funkcji dynamicznej alokacji pami ci ktoacutere b d reentrant

Bardzo wa ne jest aby pole SelfDel mia o warto true wy cznie dla transakcjidla ktoacuterych pami zosta a przydzielona dynamicznie funkcj malloc (lub jej po-chodnymi) W pozosta ych przypadkach pole to musi mie warto false mdash nie-stosowanie si do tej regu y spowoduje b d mened era pami ci i najprawdopo-dobniej nieprzewidywalne dzia anie programu

Drug wa n zasad jest aby zmienna zawieraj ca dane transakcji nie by azmienn automatyczn mdash zmienne takie s automatycznie niszczone po opusz-czeniu zawieraj cej je funkcji W rezultacie obszar pami ci zawieraj cy danetransakcji mo e zosta wykorzystany przez inne zmienne co spowoduje uszkodzeniezawartych w nim danych

Pami przydzielona transakcji musi by alokowana w sposoacuteb dynamiczny (funkcjamalloc_re) ewentualnie mo e to by pami alokowana dla zmiennej globalnej lubstatycznej mdash zmienne tego typu istniej przez ca y czas ycia programu

Warto te zauwa y e instrukcje steruj ce stanem linii Enable kontrolera LCD(SET(OUT HD44780_E) i CLR(OUT HD44780_E)) s rozdzielone wieloma innymi in-strukcjami Dzi ki temu generowany impuls dodatni tego sygna u ma czas trwania gt230 ns wymagany w specyfikacji kontrolera Nawet dla XMEGA taktowanej zegarem32 MHz 230 ns przek ada si na oko o 7 instrukcji asemblera mdash czas jaki z pewno-ci up ynie pomi dzy wykonaniem obu powy szych instrukcji steruj cych

Do wysy ania danych do kontrolera zosta a wykorzystana nieco zmodyfikowanafunkcja hd44780_outnibble_nowait roacute ni ca si od jej protoplasty hd44780_outnibbletylko tym e nie czeka na sygna braku zaj to ci mikrokontrolera (nie realizuje teopoacute nie ) Nie jest to potrzebne gdy kolejne tetrady s wysy ane w odst pach cza-sowych okre lanych przez timer

Mamy wi c zapewnion obs ug transakcji i mo liwo transakcyjnego wy wietlaniadanych na LCD musimy jeszcze mie funkcj ktoacutera tworzy odpowiednie transakcjemdash jest odpowiednikiem funkcji bezpo rednio wysy aj cej dane znakowe do LCDOdpowiednikiem tym jest pokazana poni ej funkcja

bool LCD_PutText_B(uint8_t x uint8_t y char txt LCD_trans buf bool autodel) buf-gtcmd=LCD_Text buf-gtReady=false buf-gtSelfDel=autodel Czy zwolni pami po zako czeniu transakcji buf-gtdata[0]=HD44780_DDADDR(x+y0x40) Ustaw adres w DDRAM strcpy((char)ampbuf-gtdata[1] txt) Skopiuj dane tekstowe + NULL

Kup książkę Poleć książkę

66 AVR Uk ady peryferyjne

buf-gtlen=strlen(txt) + 1 D ugo tekstu + pozycji + NULL ndash 1 bool ret=cbAdd(ampLCD_TransBuffer buf) if((ret==false) ampamp (autodel)) free_re(buf) Brak miejsca w kolejce else TCD0_CTRLA=TC_CLKSEL_DIV1_gc Preskaler 1 mdash odblokuj timer return ret

Funkcja ta buduje transakcj odpowiedzialn za wy wietlenie napisu txt na wskaza-nej pozycji x y LCD Wszystkie dane o transakcji zostan umieszczone w buforzew pami ci ktoacuterej adres jest okre lany wska nikiem buf Pami w buforze musi bywystarczaj co du a aby pomie ci ca transakcj Dodatkowy parametr autodel okre laczy pami ta ma by automatycznie zwalniana po obs u eniu transakcji (true) czynie (false) Je li transakcj uda o si umie ci w kolejce funkcja zwraca true Wartozauwa y e w takim przypadku funkcja uruchamia te timer (w naszym przypadkujest to timer TCD0) odpowiedzialny za generowanie przerwania Funkcja obs ugi prze-rwania wysy a dane do LCD

Pewn odmian powy szej funkcji jest funkcjabool LCD_PutText(uint8_t x uint8_t y char txt) LCD_trans trans=malloc_re(sizeof(LCD_trans) + strlen(txt) + 2) bool ret=LCD_PutText_B(x y txt trans true) return ret

Wykorzystuje ona funkcj LCD_PutText_B z tym e najpierw alokuje dynamiczniepami potrzebn na przechowanie tworzonej transakcji

Mamy komplet potrzebnych funkcji a wi c sprawd my jak ca o sprawdza siw praktyce W pliku LCD-transactc znajduje si kod pokazuj cy jak dzia aj naszetransakcje Aby to by o mo liwe nale y zainicjalizowa kontroler LCD

LCD_init()

Wykorzystujemy tu znan ju funkcj inicjalizuj c mdash nie ma potrzeby jej zmienia gdy operacja inicjalizacji LCD jest jednorazowa i nie trzeba wykonywa jej w posta-ci transakcji W drugim kroku musimy zainicjalizowa wykorzystywany timer i systemprzerwa

LCD_Timer_init(ampTCD0)PMIC_CTRL|=PMIC_LOLVLEN_bm Odblokuj przerwania niskiego poziomusei()

Poniewa dost p do LCD z pewno ci nie jest czynno ci krytyczn czasowo prze-rwaniom timera nadano najni szy priorytet Dzi ki temu mo na innym bardziej kry-tycznym przerwaniom nada wy sze priorytety i uzyska w ten sposoacuteb zmniejszenieczasu latencji obs ugi przerwa Sama inicjalizacja timera jest niezwykle prosta

void LCD_Timer_init(TC0_t tc) tc-gtINTCTRLA=TC_OVFINTLVL_LO_gc Odblokuj przerwania nadmiaru timera i nadaj im niski priorytet tc-gtPER=F_CPULCD_ACCESSTIME Przerwanie co 4 us (niezale nie od F_CPU)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 67

Sprowadza si ona tylko do odblokowania mo liwo ci zg aszania przerwania nadmia-ru oraz konfiguracji rejestru PER tak aby przerwania by y generowane co ok 4 s mdashniezale nie od cz stotliwo ci taktowania CPU Mo emy wi c przyst pi do wy wie-tlenia pierwszego napisu

LCD_PutText(00 Numer)

Powy sza funkcja ma jedn wad mdash alokuje dynamicznie pami po ka dym wywo-aniu (pami ta jest automatycznie zwalniana po obs u eniu transakcji) niemniej

ca y proces jest czasoch onny Mo emy tego unikn alokuj c pami bdquor cznierdquo i wielo-krotnie wykorzystuj c zaalokowany blok pami ci Ilustruje to poni szy przyk ad

LCD_trans buf=malloc_re(sizeof(LCD_trans) + 7)

Zmienna buf wskazuje na obszar pami ci ktoacutery mo e pomie ci a cuch 5-znakowyTyle wystarczy na potrzeby tego przyk adu mdash na LCD b d wy wietlane kolejneliczby w zakresie 0 ndash 65 535 najd u sza ma 5 znakoacutew st d te nasz bufor ma tak a nieinn d ugo

while(1) utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(60 bufstr buf false) while(LCD_IsTransCompleted(buf))

Do konwersji liczby na a cuch u yto funkcji bibliotecznej utoa (nag oacutewek stdlibh)Poniewa d ugo a cucha po konwersji jest zmienna (co spowodowa oby pozosta-wianie na LCD bdquoduchoacutewrdquo po poprzednich konwersjach) w kolejnej linii brakuj ceznaki uzupe niono spacjami Nast pnie tworzona jest transakcja w obszarze pami ciprzydzielonym zmiennej buf Ostatnia p tla while jest odpowiedzialna za oczekiwa-nie na zako czenie realizacji transakcji Po jej zako czeniu p tla jest wykonywana odpocz tku

Uwa ny czytelnik z pewno ci zauwa y e pami przydzielana funkcj malloc_renie jest nigdzie zwalniana mdash w normalnej sytuacji spowodowa oby to wyciek pami -ci W naszym przyk adzie jednak program nigdy si nie ko czy nie ma wi c potrzebyzwalniania pami ci wskazywanej przez zmienn buf

Powy szy przyk ad pokazuje jak unikn blokowania CPU na czas dost pu do wolnodzia aj cego urz dzenia jakim jest LCD alfanumeryczny Jednak to nie wszystkiezalety wynikaj ce z zastosowania transakcji Drug wa n zalet naszego rozwi zaniailustruje przyk ad znajduj cy si w katalogu PrzykladyLCD-alfaLCD-transact-intPowa nym ograniczeniem funkcji odpowiedzialnych za dost p do LCD w sposoacutebklasyczny by a niemo no ich wywo ywania z funkcji obs ugi przerwa mdash funkcjeobs ugi LCD nie by y reentrant2 Nasz system oparty na transakcjach nie ma tychwad Aby to zilustrowa zosta stworzony prosty przyk ad mdash tak jak poprzedniow p tli g oacutewnej programu s wy wietlane stale kolejne liczby ale jednocze nie wyko-

2 Poza tym blokowa y CPU na d ugi czas a jak pami tamy funkcje obs ugi przerwa powinny by

wykonywane mo liwie kroacutetko

Kup książkę Poleć książkę

68 AVR Uk ady peryferyjne

rzystano drugi timer (TCD1) w ktoacuterego funkcji obs ugi przerwania przepe nienia jestwy wietlany licznik tych przerwa

ISR(TCD1_OVF_vect) static char int_buf[sizeof(LCD_trans) + 7] static uint16_t cnt char bufstr[6]

utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(61 bufstr (LCD_trans)ampint_buf false)

Jak widzimy w sposoacuteb asynchroniczny z dwoacutech miejsc w programie mo emy uzy-ska dost p do LCD a ka da funkcja bdquoma wra enierdquo e ma LCD na wy czno Przy okazji warto przeanalizowa sposoacuteb w jaki jest rezerwowana pami na trans-akcj w przerwaniu Oczywi cie mo na by wykorzysta dynamiczn alokacj pami cilecz jak wspomniano taka alokacja jest czasoch onna St d te w pokazanym przy-k adzie wykorzystano tablic statyczn int_buf o rozmiarze umo liwiaj cym prze-chowanie kompletnej transakcji Dzi ki temu e zmienna int_buf jest zmienn statycz-n nie jest ona niszczona po zako czeniu funkcji obs ugi przerwania Gdyby pomins owo kluczowe static zmienna ta by aby niszczona a na LCD najprawdopodobniejzacz yby si pojawia przypadkowe tre ci Poniewa pami naszego bufora nie by aalokowana dynamicznie nie mo e ona zosta zwolniona w naszym sterowniku LCDst d te ostatni parametr wywo ania funkcji LCD_PutText_B musi mie warto false

OptymalizacjaPrzy okazji tego i poprzedniego przyk adu warto zastanowi si jeszcze nad jednkwesti mdash optymalizacji W podanych przyk adach wykorzystano wcze niej omoacute-wione funkcje dost pu do wy wietlacza LCD znajduj ce si w plikach hd44780ci hd44780h Wi kszo z zawartych tam funkcji nie jest wykorzystywana jednakkompilator mimo wszystko umieszcza ich kod w pliku wynikowym mdash dzieje si takponiewa nie mo e on bdquostwierdzi rdquo czy funkcje te nie s wykorzystywane w innychfragmentach programu Pami tajmy e kompilator kompiluje poszczegoacutelne pliki roacute-d owe osobno i dana jego instancja nie bdquowierdquo co znajduje si w innych plikach (innychjednostkach kompilacji) Tak ca o ciow wiedz ma dopiero konsolidator (linker)ktoacutery czy stworzone przez kompilator pliki obiektowe (o rozszerzeniu o) w plikwynikowy Linker jednak bdquonie wierdquo ktoacutera z funkcji programu zosta a u yta a ktoacuteranie mdash informacje te ma wy cznie kompilator W ten sposoacuteb powstaje typowe b dneko o w efekcie nasze nieu ywane funkcje nie s usuwane (linker zostawia je bdquonawszelki wypadekrdquo) i zajmuj niepotrzebnie pami Czy mo na temu jako zaradzi Oczywi cie tak W tym celu trzeba po czy si y kompilatora i linkera co zapewniaj od-powiednie opcje kompilacji We w a ciwo ciach projektu (ProjectProperties lub Alt+F7)wybieramy zak adk Toolchain a nast pnie AVRGNU C Compiler i OptimizationZnajdziemy tam pole wyboru o nazwie Prepare functions for garbage collection (ry-sunek 224)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 69

Rysunek 224 Aby da linkerowi mo liwo usuwania nieu ywanych funkcji nale y skompilowaprogram z wybran opcj ndashffunction-sections ktoacutera spowoduje e ka da funkcja programu znajdzie siwe w asnej sekcji

Zaznaczenie tej funkcji spowoduje umieszczenie ka dej funkcji w osobnej sekcji mdashsamo w sobie nie wp ynie to na skroacutecenie kodu wynikowego ale jest warunkiem nie-zb dnym dla podj cia stosownych dzia a przez linker Aby wyeliminowa nieu y-wane funkcje nale y zaznaczy jeszcze w ga zi AVRGNU LinkerOptimization poleGarbage collect unused sections (rysunek 225)

Rysunek 225 Zaznaczenie opcji Garbage collect unused sections (-Wl--gc-sections) spowodujee nieu ywane funkcje zostan usuni te z kodu wynikowego w efekcie kod programu ulegnie skroacuteceniu

Po zaznaczeniu tych opcji program zostanie skroacutecony o kilkaset bajtoacutew Oczywi cieje li wszystkie funkcje by yby wykorzystane nie uzyskaliby my adnego skroacuteceniakodu Niemniej w sytuacji gdy u ywa si bibliotek zazwyczaj przynajmniej czfunkcji nie jest wykorzystywana warto wi c skorzysta z tej mo liwo ci optymalizacji

Kup książkę Poleć książkę

70 AVR Uk ady peryferyjne

Je li mamy do czynienia z prekompilowan bibliotek (lib) to musi ona by skom-pilowana z zaznaczon opcj Prepare functions for garbage collection (-ffunction-sections) Alternatyw jest umieszczenie ka dej funkcji biblioteki w osobnym pliku(tak jak w przypadku bibliotek AVR-libc)

Na ekranie wyboru opcji optymalizacji linkera mamy jeszcze jedn przydatn opcjmdash Relax Branches (-mrelax) Dla mikrokontroleroacutew ktoacutere maj ponad 8 kB pami ciFLASH instrukcje skokoacutew s generowane jako tzw instrukcje d ugie mdash umo liwiajone skok do komoacuterki pami ci FLASH o dowolnym adresie Jednak cen za to jestwyd u enie instrukcji mdash ich kod jest d u szy podobnie jak czas wykonania Nie zawszejednak takie d ugie instrukcje musz by wykonywane mdash je li miejsce docelowe skokule y blisko (w zasi gu instrukcji skokoacutew wzgl dnych) to mo na w kodzie wynikowymzamieni instrukcje d u sze na kroacutetsze co przynosi oszcz dno ci w postaci skroacuteceniakodu wynikowego Poniewa dopiero linker bdquowierdquo jak poszczegoacutelne fragmenty kodus rozmieszczone w pami ci takiej podmiany mo na dokona na etapie linkowaniaprogramu co zapewnia powy sza opcja St d te warto to pole wyboru zaznaczy

Kup książkę Poleć książkę

SkorowidzA

ABI Application Binary Interface 25AC Address Counter 50ADPCM 482adres

bazowy 377bufora 61komoacuterki 84pu apki 202

ALE Address Latch Enable 368alfanumeryczne wy wietlacze 43algorytm ADPCM 492algorytmy stratne 495animacje 57antyaliasing 325architektury procesoroacutew XMEGA 352asembler 23

dyrektywy 40funkcje j zyka C 41obs uga przerwa 39

asynchroniczne wywo anie funkcji 101Atmel Studio 15

Bbajty kalibracyjne 569biblioteka

FATFS 131 139 176 180 517libcallback-liba 99PetitFS 144 149

bitADC_CH0START_bm 236IMPMODE 244

bitrate 442 512blokowanie przerwa 219b d 16 19

kwantyzacji 463offsetu 230wzmocnienia ADC 230

BOD 223bps bits per second 12

budowakarty 152linii obrazu 394pami ci SDRAM 374pliku stymulacji 192ramki PAL 412sygna u PAL 411wtyczki 544 545

bufor 78FIFO 497na transakcje 61transakcji 62

buforowanie wyj cia 294

CCAS Column Address Strobe 375CCFL 44charakterystyka

przetwornikoacutew 222termistora 264tryboacutew pracy 232

CID Card Identification 169CKE Clock Enable 375CLKIN 421COG Chip on Glass 310CRC 158 178CRC16 178CRC7 164CS Chip Select 361 375CSD Card Specific Data 172czas

dost pu do SDRAM 424adowania kondensatora 244

propagacji 281proacutebkowania 260symulacji 209

czcionki 322cz stotliwo

odchylania pionowego 428proacutebkowania 244 441 444 530przebiegu 504

Kup książkę Poleć książkę

576 AVR Uk ady peryferyjne

cz stotliwoPWM 465taktowania koprocesora 549taktowania procesora 209taktowania rdzenia 18

czyszczenie pami ci 318

DDAC Digital to Analog Converter 293 447 451

buforowanie wyj cia 294generowanie przebiegoacutew 301jitter 303kalibracja 306napi cie referencyjne 295system zdarze 297taktowanie 296tryb dwukana owy 301wykorzystanie DMA 298wyzwalanie konwersji 305

datalogger 261 265 275DD Device Density 86debuger 183

programowy 190sprz towy 185 187

decymacja 259DEBUG 219XMEGA 260

definicja symboli globalnych 36definiowanie w asnych znakoacutew 56deklaracja zapowiadaj ca 103 337dekoder DTMF 548 556DMA 254 298 402 458 518 523dost p do

danych 358 359 568danych binarnych 356 360danych wielobajtowych 31DataFLASH 137EEPROM 128FAT 136komoacuterki 375LCD 59 62 66 68operandu 30pami ci 81 384 386 387 561pami ci SDRAM 424pliku blokowy 141portoacutew IO 30rejestroacutew IO procesora 36rejestroacutew uk adu 499SPI 95sygnatury u ytkownika 565 567wska nikoacutew 32

DQM Data Mask 375DSP Digital Signal Processor 535

DTMF 535 553dyktafon 529dynamiczna alokacja pami ci 516dyrektywa global 38dyrektywy asemblera 40dzia anie

DMA 255komparatora 280timeroacutew 400

d wi k 443

EEBI External Bus Interface 361EEPROM 207eliminacja jitteru 24emulacja RS232 139

FFAT File Allocation Table 128 131FAT32 128FATFS 180filtr

dolnoprzepustowy 491drugiego rz du 470pierwszego rz du 469trzeciego rz du 471

filtrowanie sygna u PWM 468firmware 565FLASH 207format

odpowiedzi 159polecenia 158protoko u 157

funkcja_delay_ms 17 219c_zero 42callback 106 341callback() 99DataFLASH_CSEnable 100DF_FinishBufWrite() 269disk_initialize 136disk_ioctl 181disk_status 136disk_write 138DMA_SPI_init 104DTMF_GetCode 553free_re 65GPIOR0_init 507hd44780_outcmd 51hd44780_outnibble_nowait 65LCD_defchar_P 57

Kup książkę Poleć książkę

Skorowidz 577

Menu_Click_Func 515Menu_Free 516Menu_Recorder 532Menu_Run 527MS_CreateRegEntry 117MS_GetDirPos 125MS_GetRegItem 115MS_WritePages 116 118OSC_wait_for_rdy 473RecMenu_StartStop 532sprintf 142strtok 124sysclk_init() 200 209TMF_memcpy_PF 454udi_cdc_getc() 123udi_cdc_is_rx_ready() 123VS1003_Reset 506

funkcjeanalizuj ce 556biblioteczne 50biblioteki FATFS 143j zyka C 41kontrolera ST7565R 313opoacute niaj ce 17opoacute nie 219reentrant 524specjalne kontrolera 319steruj ce 314zapisu 133

fusebit 557BODACT 560BODLEVEL 560BOOTRST 559DVSDON 560EESAVE 561JTAGEN 558RSTDISBL 559SUT 559TOSCSEL 559

fusebity w AVR-libc 571

Ggenerator obrazu composite 426generowanie

d wi ku 461kolorowego obrazu 437obrazu wideo 391przebiegoacutew 301przerwa 285sygna u composite 409

g bia koloru 326gniazdo

karty SD 156VGA 396

Hhistereza 281

IIDE 11IMA ADPCM 483informacje

o kolorze 431o obrazie 434

inicjalizacjakarty 161karty SDHC 167karty SDSC 167karty SDXC 167licznika 419pami ci 119USART 505

instrukcjaicall 42movw 35nop 13 24

interfejsSCI 498SDI 498SPI 71 79RS232 120UART 123USART 71 73

interpolacja 259interpolacja w XMEGA 260inwersja obrazu 319

Jjednostki 12jitter 24 303 420

Kkalibracja

ADC 229DAC 306 564offsetu 237

kana DMA 82 522karta 154 158

mikroSD 152SD 151 152SDHC 151 152 160SDSC 160SDXC 151 160

Kup książkę Poleć książkę

578 AVR Uk ady peryferyjne

karty pami ci 151 152 157biblioteka FATFS 180budowa 152format polecenia 158inicjalizacja 161 167komunikacja 156odczyt danych 173opcje konfiguracyjne 181rejestry specjalne 169tryby pracy 153zapis danych 176zasilanie 154

kodasemblerowy 23 24C 23dost pu 24

kodowanieμ-law 481ADPCM 483Dialogic ADPCM 494informacji 166 426koloru 425znakoacutew 536

kodyformatoacutew audio 501zdarze 545

kolejno bajtoacutew 533kolor 424 430kolorowy obraz 437komparator 422

analogowy 279 280analogowy XMEGA 282okienkowy 284

kompilacja plikoacutew binarnych 350kompilator avr-gcc 11 359kompresja

ADPCM 482 486d wi ku 480IMA ADPCM 482

komunikacja z koprocesorem 504konfiguracja

4-portowa 364biblioteki 133debugera 185DMA 459 522fusebitoacutew 570kontrolera DMA 257 452komparatoroacutew 285lockbitoacutew 570LPC 371pami ci SDRAM 381PetitFS 149pinu IO 225portoacutew IO 362

preskalera 452projektu 186przerwa 219pu apki 203rejestru EVCTRL 248rejestru PER 67SPI 75sygna u CS 377typu czcionki 324urz dze IO 189USART 76zegara 383

konsolidacja 547kontroler

DMA 254 298 402 458 518 523KS108 310ST7565R 310ndash315 321

konwersjaDAC 305sygna oacutew 396wyzwalana 306

konwertercyfrowo-analogowy 426DAC 427

koprocesormp3 496VS1003B 10

korekcja fazy 466kwantyzacja 463

Llampa CCFL 44LE Latch Enable 433licznik 419

cykli 209TCC1 400timera 20

linie IO 50linie sygna owe

MISO 72 164MOSI 72SCK 72SS 72

linker 69lista

mnemonikoacutew 24modyfikowanych rejestroacutew 32

lockbity 557 561lockbity w AVR-libc 570LPC Low Pin Count 371LPCM 443 556LSB Least Significant Bit 228

Kup książkę Poleć książkę

Skorowidz 579

a cuchy formatuj ce 212czenie plikoacutew 352

Mmagistrala pami ci zewn trznej 361magnetofon cyfrowy 528makro _SFR_IO_ADDR() 39makrodefinicja

ASSERT 214HD44780_CGADDR() 53HD44780_CLR 53HD44780_DDADDR() 53HD44780_DISPCTL() 52HD44780_ENTMODE() 52HD44780_FNSET() 52HD44780_HOME 53HD44780_SHIFT() 51LOCKBITS 571

mapowanie sygna oacutew 366mapy bitowe 343marker czasowy 268maski bitowe 329matryce 49menu 335menu piktogramowe 342mierniki temperatury 262mikrokontroler

ARM 9AVR 9PIC 9XMEGA128A3U 10

MISO 72moc wydzielana 265model psychoakustyczny 495modu

alfanumeryczny 45NVM 568Xmega eXploreGO 10Xplained ATXMEGA A3BU 10Xplained ATXMEGA-A1 10Xplained XMEGA128A1 447Xplained XMEGA256A3 94Xplained XMEGA256A3BU 97 143 266

modyfikator 30const 85volatile 28 273

monitory CRT 395monochromatyczne wy wietlacze graficzne 309monochromatyczny

tryb graficzny 416tryb tekstowy 413

MOSI 72mp3 495Msps Megasamples per second 12multiplekser wej ciowy 226 283multipleksowanie adresoacutew 368 369muzyka 439

Nnadawanie kodoacutew DTMF 540nadproacutebkowanie 258nag oacutewek kontenera wav 500nagrywanie mowy 486najmniej znacz cy bit 228napi cie

offsetu 280referencyjne 223 295zasilania 239

Oobracanie obrazu 319obraz 319

composite 426kolorowy 430wideo 391

obroacutebka d wi ku 443 445obs uga

FAT 131 143klawiatury matrycowej 24LCD 58 63 67menu 337przerwania 37 38 458przerwania DMA 525przerwa w asemblerze 39przyciskoacutew 272wy wietlaczy alfanumerycznych 45

odczytblokowy 140danych 173 358

odpowied response 159R1 159R2 159R7 160

od wie anie pami ci 376odtwarzanie

d wi ku 472muzyki 447 513 518 521

offset 238offset ADC 230okno

Breakpoints 202Call stack 209dezasemblera 210

Kup książkę Poleć książkę

580 AVR Uk ady peryferyjne

oknoIO View 207podgl du zmiennych 211wyboru czcionek 324

OLED 46opcje

kompilatora 35zapisu d wi ku 445

operacjena buforach 91odczytu 173zapisu 176zapisu strony 92

operand 29operator

ascii 41

asciz 41

byte 41

section 41opoacute nienia 13 18opoacute nienie zmienne 16optymalizacja 16 68optymalizator 26organizacja pami ci 77organizacja pami ci VRAM 316oscylator 287OSD On-Screen Display 417ostrze enie 16oszcz dzanie energii 94

Ppakiet WinAVR 48pami

CGRAM 56 57 64DataFLASH 10 77 81 113 269DDRAM 49EEPROM 111FLASH 54 124 207RAM 49SDRAM 372SRAM 63 124 329 366 371VRAM 314 317

PCLK 421PCM 443PetitFS 144 149p tla

for 13while 201

pierwsza linia obrazu 321piksel 430piktogram 342pin IO 225

plikAlloc_safeh 65DataFLASHc 83DataFLASHIOc 136definesh 50delayh 14diskioh 132 136ffh 132ffconfh 132 181hd44780h 49integerh 132ioh 30LCD_transc 61LCD-transactc 66Makefile 14Menuc 19nothingo 541outfiletxt 547 551pffh 149SPIh 104stringh 113stymulacji 191 192

pliki mp3 495elf 351fon 323o 24S 24 34binarne 350 355csv 276d wi kowe 440obiektowe 352wav 500WMA 512z czcionkami 327z danymi 349

podbijacz napi cia 315podgl d

pami ci 207stosu wywo a 209zmiennych 211znakoacutew 325

pod czeniefototranzystora 262karty SD 155LCD z kontrolerem 311modu u 50pami ci 362 369 370 373termistora 262uk adu LM35 251wyj XMEGA 398

pod wietlenieCCFL 46OLED 46

Kup książkę Poleć książkę

Skorowidz 581

podwoacutejne buforowanie 255 332 457polecenia

kasowania strony 81konfiguracyjne pami ci 82kontrolera ST7565R 315odczytu bufora 82 89odczytu pami ci 81 88SDRAM 376transferu 91

polecenieACMD41 168cd 181CID 178CMD0 165CMD8 167CSD 178date 276dir 127 181dump 276erase 276get 276HD44780_CLR 51Init 178mkdir 181

po czenieDMA ze SPI 96dwoacutech komparatoroacutew 285koprocesora mp3 497LCD z mikrokontrolerem 48wyj cia XMEGA 411XMEGA z PC 121z telewizorem 431

pomiarnapi cia zasilania 239temperatury MCU 241

port IO 30 362pozycjonowanie grafik 345poacute obraz 410precyzja pomiaroacutew 260preskaler 478preskaler ADC 243program

Atmel Data Visualizer 275Audacity 443avr-objcopy 350dataloggera 265LCD Image Converter 323makeloadingtableexe 543Realterm 127 554riffstrip 483SoX 445Tracepoint 208

programowanie sygnatury u ytkownika 566protokoacute master-slave 157

prototypy 136proacutebki d wi kowe 447proacutebkowanie

8-bitowe 300nieliniowe 480

prymitywy graficzne 330przebieg PWM 468przebiegi 289 303przechwytywanie danych 276przemiatanie wej 253przerwanie 218 254 286 403

DMA 522komparatora 286

przestrze adresowa procesora 378przesy anie

danych 498polece 498

przetaktowanie procesora 436przetwornik

ADC 221analogowo-cyfrowy 221cykliczny 222potokowy 222

przyciski 272pseudooperatory 41pu apki breakpoints 197pu apki warunkowe 205punkty ledzenia 203PWM 461 462 472

RRAS Row Address Strobe 375redukcja poboru energii 242regulacja kontrastu 321rejestr 32 34rejestr AC 50

adresu wtyczki 513BASEADDR 377CID 169CMP 251CSD 172czasu utworu 512DATA 83EVCTRL 248formatu audio 512identyfikacyjny pami ci 87INTFLAGS 252kontroli basoacutew 510kontroli g o no ci 513MUXCTRL 227OCR 168PER 67poroacutewnania 249

Kup książkę Poleć książkę

582 AVR Uk ady peryferyjne

rejestr ACSCI_CLOCKF 511stanu komparatora 287stanu pami ci 86stanu uk adu 510trybu pracy 508WINCTRL 285

rejestrydost pu do pami ci RAM 513GPIOR 502IO procesora 36mikrokontrolera 25procesora 35specjalne 94specjalne karty 169uk adu VS1003B 508

relacja rodzic ndash dziecko 336reset uk adu 534rozdzielczo

LCD 329przetwornika 231PWM 463 477

rozszerzenie HiRes 477 479roacutewnanie Steinharta-Harta 263rysowanie map bitowych 343

Sschemat uk adu dataloggera 267SCI Serial Command Interface 498SCK 72SD Secure Digital 152SDI Serial Data Interface 498separator synchronizacji 422separowanie impulsoacutew synchronizacji 422shieldy 10skaler 422skaler napi cia 283skrypt makefile 353s owo kluczowe

asm 27extern 37static 68

specyfikatory lokalizacji zmiennej 213sps samples per second 12SS Slave Select 72standard PAL 410standard VGA 393sterowanie

dataloggerem 275sygna em 379

sterownik 121HD44780 49 56LCD 49 62

stos wywo a 209

strukturaFATFS 139Handle 118LCD_trans 60 63menu 338rejestru 86SimpleFSEntry 113 116SimpleFSHandle 113 118 140submenu 527systemu plikoacutew 112

sumabitowa 571kontrolna 178

sygnacomposite 409composite video output 430CS 377DREQ 497H-Sync 396synchronizacji 423V-Sync 396zegarowy CLK 374

sygna yinterfejsu EBI 363magistrali EBI 364steruj ce 375

sygnaturaprodukcyjna procesora 563u ytkownika 565

symbol__DELAY_ROUND_CLOSEST__ 17__DELAY_ROUND_DOWN__ 17_FS_FAT12 149_FS_FAT32 149_FS_MINIMIZE 133_FS_READONLY 133_FS_RPATH 135_FS_TINY 133_MAX_SS 135_MULTI_PARTITION 135_USE_DIR 149_USE_FASTSEEK 134_USE_FORWARD 134_USE_LABEL 134_USE_LFN 134_USE_LSEEK 149_USE_MKFS 134_USE_READ 149_USE_STRFUNC 134_USE_WRITE 149_VOLUMES 136F_CPU 14 15 18increment 36USE_BUSY_FLAG 50

Kup książkę Poleć książkę

Skorowidz 583

symboleglobalne 36w asemblerze 28zewn trzne 39

symulacja 198 209symulator 190synchronizacja

pami ci 331pionowa 395pozioma 394

systemplikoacutew 111 128przerwa 404zdarze 245

szablonfont_XMEGAtmpl 326image_XMEGAtmpl 343

szum 463szybko przesy ania danych 126

ledzenie wi zki 333rodowisko

graficzne 11programistyczne 11VSIDE 542WinAVR 47

Ttabela FAT 130tablica

framebuf 402 408plugintbl 552 555tekst 208z kodem wynikowym 543

taktowanieDAC 296mikrokontrolera 473

technologia OLED 44temperatura mikrokontrolera 239 241termistor 262 290

NTC 263PTC 263

termometrLM35 249 250z alarmem 251

termostat 290test uk adu VS1003B 503testowanie obrazu 319timer 16 62

TCC0 20

TCC1 399transakcja 59 62 65transakcje 17 103ndash107transakcyjna obs uga LCD 58transakcyjny dost p do SPI 95transfer 91

danych 97wynikoacutew 254

transmisja 72 83tryb

bez znaku 234ci g ej konwersji 252czterobitowy 153dwukana owy 301graficzny 416graficzny VGA 407idle 419jednobitowy 153LPC 371monochromatyczny 397 407oszcz dzania energii 94 306pracy multipleksera 226pracy SPI 157roacute nicowy 232single slope 312SPI 153tekstowy 413tekstowy VGA 397z pojedynczym wej ciem 234ze znakiem 235

trybygenerowania PWM 467pracy karty 153pracy przetwornika 231pracy SPI 74pracy uk adu 508

twierdzenie Nyquista 258tworzenie

adresu 84nak adek 417obrazu 335tablicy 543

typ__uint24 119karty 160niekompletny 60wyliczeniowy 114

typyoperandoacutew 29w AVR 34

Kup książkę Poleć książkę

584 AVR Uk ady peryferyjne

Uuchwyt handle 64 113uk ad

AD725 427 431buforowy 294CS 361DAC 284dataloggera 267detekcji awarii zasilania 559generuj cy obraz 393HiRes 477ICL7660 47LM35 250 251SampH 293sterowania sygna em 379USART 401VS1003B 496 503 508 530 538 556VS100XX 529wzmacniania sygna u 227

uk ady peryferyjne 9uruchomienie komparatora 287urz dzenie

master 72slave 72

u rednianie 259utrata danych 141u ycie wstawki asemblerowej 33

VVGA 393

Wwarto ci kalibracyjne

ADC 564oscylatoroacutew 564temperatury 564

warunkowa kompilacja 36WE Write Enable 375wej cie composite video input 425wektor przerwa 38 257wideo 391wielko pami ci 86 377w czenie DAC 299wska nik na struktur 27wska niki 32wstawki asemblerowe 24 33wtyczka 535 541 544

SineDTMF Generator 537VGA 396

wyboacuter cz stotliwo ci PWM 465 474wykorzystanie

DMA 254 518

EuroSCART 428PWM 461rejestroacutew 34

wyliczanie predyktora 489wy wietlacze

alfanumeryczne 43 45graficzne 43 309LCD 43OLED 46

wy wietlanielitera u 213map bitowych 344obrazu 333 346 406obrazu VGA 393

wywo ania zwrotne callbacks 98asynchroniczne 101synchroniczne 101

wyzwalanie konwersji 245wzmacniacz 446wzmacniacz operacyjny 279wzmacnianie sygna u 227

XXMEGA 9 18

Zzapis

bufora 269danych 176d wi ku 440 556

zasilaniekarty 154pami ci 109

zatrzask 368zatrzask 74HC573 433zatrza ni cie adresu 369zdarzenia 297zdarzenie compare match 399zegar 383 420 426zintegrowane rodowisko programistyczne 11z cze EuroSCART 425 428 429zmiana

g o no ci 527wielko ci strony 94

znaki 56

roacuted onapi cia odniesienia 284sygna u 240

Kup książkę Poleć książkę

Page 24: Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8 AVR. Ukäady peryferyjne Rejestry dost pu do pami ci RAM .....513 Rejestr adresu

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 59

Zastanoacutewmy si w jaki sposoacuteb najlepiej jednocze nie rozwi za problem wolnegodost pu do urz dzenia i wspoacute bie no ci kodu Rozwi zaniem mo e by wprowadze-nie tzw transakcji Transakcj nazywamy zbioacuter operacji tworz cych pewn ca-o To co wyroacute nia tak wykonywany zestaw operacji to atomowo spoacutejno

izolacja i trwa o Pod tymi terminami kryje si istota wykonywanej operacji Ato-mowo transakcji zapewnia e jest ona wykonywana w sposoacuteb niepodzielny co gwa-rantuje nam prawid ow wspoacute prac z danym urz dzeniem IO w tym przypadku kon-trolerem LCD Wa na dla nas jest tak e izolacja mdash dzi ki temu inne operacje na LCD(inne transakcje) nie b d mia y wp ywu na wynik aktualnie wykonywanej transakcjimdash nie b d zak oacuteca y jej wykonania z drugiej strony nasza transakcja nie zak oacuteciwykonania innych Trwa o z kolei zagwarantuje nam e je li sterownik potwierdziwykonanie transakcji to znaczy e efekt jej dzia ania jest wy wietlony na LCD Tacecha nie jest nam a tak potrzebna mdash jest ona wydawa oby si oczywista Niemniej jestto pewna gwarancja e ca a operacja przebieg a poprawnie i w efekcie LCD znajdujesi w okre lonym przez nas stanie Tyle teorii przejd my do praktyki

Kody poni szego przyk adu znajduj si w katalogu PrzykladyLCD-alfaLCD-transact

Aby zapewni transakcyjny dost p do LCD musimy stworzy pewne struktury danychktoacuterych zadaniem b dzie przechowywanie informacji o operacjach sk adaj cych sina transakcje i stanie ich wykonania W tym celu pos u ymy si wiadomo ciami z roz-dzia u 5 bdquoJak uporz dkowa chaos czyli z o one typy danych i listyrdquo Do przecho-wywania oczekuj cych transakcji pos u ymy si buforem pier cieniowym zanimjednak go zaimplementujemy zastanoacutewmy si jak powinna wygl da struktura prze-chowuj ca informacje o transakcji Struktura ta powinna zawiera co najmniej

pole danych (data) z informacjami ktoacutere maj by przes ane do kontrolera LCD

pole okre laj ce liczb danych do wys ania (len)

pole okre laj ce realizowane polecenie dla LCD (cmd) mdash pole to pos u yprogramowi sterownika do w a ciwej interpretacji danych znajduj cych siw polu data

kilka poacutel kontrolnych przechowuj cych informacje potrzebne do realizacjisamej transakcji Jedno z nich mdash Ready mdash b dzie przyjmowa warto trueje li dana transakcja zosta a zrealizowana lub false w przeciwnym przypadkuZnaczenie drugiego pola mdash SelfDel mdash mo e wydawa si nieco enigmatycznepole to okre la czy pami przydzielona dla transakcji ma by zwolnionaw sterowniku LCD (warto true) czy te zostanie zwolniona w programie(warto false)

Oto jak mo e wygl da struktura definiuj ca transakcj typedef struct volatile bool Ready 1 true je li transakcja zosta a zrealizowana bool SelfDel 1 true je li pami przydzielona transakcji ma zosta zwolniona LCD_Cmd cmd 2 Polecenie do zrealizowania uint8_t len 6 D ugo polecenia

Kup książkę Poleć książkę

60 AVR Uk ady peryferyjne

unsigned 0 Wyroacutewnanie do granicy bajta uint8_t data[] Dane transakcji LCD_trans

Nale y zwroacuteci uwag na poleunsigned 0

Nie definiuje ono adnego pola struktury ale jedynie informuje kompilator e kolejnepole (w naszym przyk adzie o nazwie data) ma by wyroacutewnane do granicy bajta mdashdzi ki temu dost p do kolejnego pola b dzie odbywa si szybciej Z kolei samo poledata jest zadeklarowane jako tzw typ niekompletny

Typ niekompletny (ang incomplete type) to typ ktoacuterego rozmiaru nie da si okre li

W pokazanym przyk adzie rozmiaru pola data nie da si okre li gdy zosta on za-deklarowany jako typ tablicowy z tym e nie podano wielko ci tablicy Wielko ci niepodano gdy na etapie deklaracji struktury nie wiemy jakiej wielko ci dane b d w niejprzechowywane Tego typu deklaracja ma bardzo powa ne konsekwencje mdash skorowielko ci pola data nie da si okre li to jaki b dzie wynik dzia ania operatora sizeof(LCD_trans) Kompilator stara si jako wybrn z tej sytuacji w zwi zku z czym

zwroacuteci wielko struktury ale tak jakby pole data w ogoacutele nie istnia o mdash jego roz-miar b dzie wynosi 0 W ramach wiczenia zastanoacutew si ile bajtoacutew pami ci b dziezajmowa a struktura LCD_trans

Skoro dysponujemy ju struktur przechowuj c poszczegoacutelne transakcje pora nastworzenie obiektu przechowuj cego kolekcj transakcji Dodanie kolejnej strukturyb dzie polega o na dodaniu jej do takiego obiektu z drugiej strony program sterownikaLCD b dzie moacuteg z tej kolekcji pobiera kolejne transakcje do realizacji Opis ten przy-pomina opis dzia ania bufora pier cieniowego mdash z jednym wyj tkiem mdash po zape nie-niu ca ego bufora nie b dziemy usuwa niezrealizowanych transakcji lecz zabloku-jemy dodawanie kolejnych W tym celu pos u ymy si definicj nast pnej struktury

typedef struct LCD_trans elements[LCD_MAXTRANS] Wska niki do transakcji uint8_t Beg Pierwszy element bufora uint8_t Count Liczba elementoacutew w buforze CircBuffer

Struktura ta zawiera deklaracj tablicy wska nikoacutew na transakcje (pole elements)Poniewa jest to tablica musimy zna liczb jej elementoacutew mdash jest ona zadeklarowanaw sta ej LCD_MAXTRANS

define LCD_MAXTRANS 10 Maksymalna liczba pami tanych transakcji

Do realizacji bufora s potrzebne jeszcze dwa pola Beg wskazuj ce na pierwsztransakcj w buforze oraz pole Count okre laj ce liczb transakcji znajduj cych siw buforze Je li Count == 0 to znaczy e w buforze nie ma adnych oczekuj cychtransakcji a je li Count == LCD_MAXTRANS to znaczy e bufor jest pe ny i nie mo na

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 61

dodawa do niego kolejnych transakcji W a ciwo t wykorzystuj dwie zdefiniowanew pliku LCD_transc funkcje

static inline bool cbIsFull(CircBuffer cb) return cb-gtCount == LCD_MAXTRANS

static inline bool cbIsEmpty(CircBuffer cb) return cb-gtCount == 0

Jak pami tamy w przypadku funkcji modyfikatory static inline powoduj e danafunkcja nie b dzie istnie jako samodzielna lecz w ka dym miejscu w ktoacuterym jestwywo ywana jest wstawiany raczej jej kod a nie wywo anie Ma to znaczenie dlakroacutetkich funkcji (a wi c takich jak pokazane powy ej) dla ktoacuterych koszty wywo anias zazwyczaj wi ksze ni koszty umieszczenia cia a funkcji w miejscu jej wywo aniaTego typu funkcje zachowuj si w sposoacuteb zbli ony do makrodefinicji (z tym e re-spektuj wszystkie regu y j zyka C w szczegoacutelno ci kolejno operatoroacutew czy kon-trol typoacutew)

Takie funkcje jako argument pobieraj adres bufora na ktoacuterym maj operowa W na-szym przypadku bufor jest zdefiniowany nast puj co

static CircBuffer LCD_TransBuffer Bufor na transakcje

Nale y zauwa y e jest on zdefiniowany jako struktura globalna z modyfikatoremstatic Modyfikator ten ogranicza zasi g widoczno ci zmiennej LCD_TransBuffer dopliku w ktoacuterym zmienna ta zosta a zdefiniowana (w tym przypadku modyfikator staticjest niejako przeciwie stwem modyfikatora extern) Dzia anie to ma jedynie znaczeniekosmetyczne mdash uniemo liwia odwo anie si do bufora za pomoc funkcji ktoacutere niezosta y zdefiniowane w miejscu jego definicji Oproacutecz funkcji umo liwiaj cych okre-lenie stanu bufora potrzebne s jeszcze funkcje umo liwiaj ce dodanie i pobranie trans-

akcji Pierwsz funkcj b dzie funkcja dodaj ca transakcj do buforabool cbAdd(CircBuffer cb LCD_trans elem) ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsFull(cb)) return false Czy jest miejsce w kolejce uint8_t end = (cb-gtBeg + cb-gtCount) LCD_MAXTRANS cb-gtelements[end] = elem Dodaj transakcj ++cb-gtCount Liczba elementoacutew w buforze return true Wszystko OK

Funkcja ta dodaje transakcj (zmienna elem) do bufora ko owego Zanim transakcjazostanie dodana sprawdzane jest czy w buforze jest miejsce mdash je li nie funkcjazwroacuteci false Je li dodanie jest mo liwe warto licznika okre laj cego liczb trans-akcji przechowywana w buforze (Count) zwi ksza si o jeden Warto zastanowi si te dlaczego praktycznie ca e cia o tej funkcji jest zamkni te w sekcji atomowej (ATOMIC_BLOCK) Jedn z cech naszego sterownika ma by mo liwo wspoacute bie nego dost pu

Kup książkę Poleć książkę

62 AVR Uk ady peryferyjne

do LCD mdash to znaczy e danie np zapisu do LCD mo e wyst pi zaroacutewno w g oacutewnejp tli programu jak i asynchronicznie w przerwaniu St d te wynika e funkcja do-daj ca transakcj musi by napisana w sposoacuteb zapewniaj cy jej poprawn prac w sytu-acji gdy zostanie ona przerwana i ponownie wywo ana przed zako czeniem dzia aniajej poprzedniej instancji Umieszczenie cia a tej funkcji w sekcji atomowej nam to za-pewnia mdash dzi ki temu bufor transakcji zawsze b dzie spoacutejny Dla zaspokojenia cie-kawo ci warto usun sekcj atomow i sprawdzi jak wtedy b dzie zachowywa si tafunkcja i jak wp ynie to na spoacutejno przechowywanych danych

Drug niezb dn funkcj jest funkcja odczytuj ca bufor transakcji i zwracaj ca trans-akcj do zrealizowania (lub NULL je li adnej transakcji nie ma w buforze)

LCD_trans cbRead(CircBuffer cb) LCD_trans elem ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsEmpty(cb)) return NULL Bufor pusty nie mo na zwroacuteci elementu elem = cb-gtelements[cb-gtBeg] cb-gtBeg = (cb-gtBeg + 1) LCD_MAXTRANS -- cb-gtCount Zmniejszamy liczb elementoacutew pozosta ych w buforze return elem

Funkcja ta jest bardzo podobna do poprzedniej mdash najpierw sprawdza czy bufor za-wiera jak oczekuj c transakcj (cbIsEmpty(cb)) je li tak to zwraca adres opisuj -cej j struktury i zmniejsza liczb transakcji oczekuj cych (pole Count) W ten sposoacutebmamy zrealizowan ca funkcjonalno zwi zan z obs ug bufora pier cieniowegoPokazane funkcje s uniwersalne i z bardzo podobnych (lub wr cz tych samych) b -dziemy korzysta w kolejnych rozdzia ach w kontek cie np obs ugi transakcji zwi -zanych z interfejsami szeregowymi

Pora przej do samego sterownika LCD Jego zadaniem b dzie sprawdzenie czyw buforze oczekuj jakie transakcje do realizacji a je li tak to ich wykonanie Ponie-wa dane do LCD mog by wysy ane co okre lony minimalny czas znacznie d u -szy ni czas jakiego na to zadanie potrzebuje mikrokontroler do wysy ania kolejnychpaczek danych pos u ymy si timerem Timer b dzie generowa przerwanie nadmiaru(TCD0_OVF_vect) ktoacutere b dzie wyznacza o tempo w jakim kolejne porcje danych b -d trafia y do LCD Z noty katalogowej kontrolera wynika e minimalny czas trwa-nia wysokiego stanu sygna u Enable to 230 ns a okres tego sygna u nie powinien bykroacutetszy ni 500 ns Poniewa nasz dost p do LCD odbywa si w sposoacuteb nieblokuj cyMCU wi c szybko wysy ania danych do LCD jest bez znaczenia St d te w poka-zanym przyk adzie przyj to e dane b d wysy ane co 4 s co okre la sta a

define LCD_ACCESSTIME 0000004

Poniewa komunikacja z LCD odbywa si w sposoacuteb nieblokuj cy nie zale y nam tena czasie (i tak w stosunku do czasu od wie ania samego LCD jest on bardzo kroacutetki)w efekcie nie ma potrzeby odczytywania flagi busy kontrolera Dzi ki temu w cz ciprzypadkoacutew mo emy w ogoacutele zrezygnowa z sygna u wyboru RW i wymusi jego sta y

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 63

poziom logiczny umo liwiaj cy zapis do LCD Dzi ki temu mo na zaoszcz dzi do-datkowy pin IO1

Ca a logika naszego sterownika jest zawarta w funkcji obs ugi przerwania przepe nieniatimera (TCD0_OVF_vect) Poniewa LCD jest po czony z MCU w trybie 4-bitowym(dla zaoszcz dzenia liczby wykorzystanych pinoacutew IO) kolejne 8-bitowe dane muszby podzielone na dwie tetrady i wys ane do LCD w kolejno ci starszam odsza tetradaInformacja o aktualnie wysy anych danych jest umieszczona w zmiennej trans o typie

static struct uint8_t pos 6 Pozycja w polu danych aktualnej transakcji uint8_t nibble 1 Ktoacutera tetrada jest wysy ana seq

Dlaczego tak Dzi ki wykorzystaniu struktury i poacutel bitowych mo na zaoszcz dzi je-den bajt pami ci SRAM Ze wzgl du na wielko pami ci obs ugiwanej przez kon-troler LCD mo emy by pewni e transakcje zawieraj ce wi cej ni 63 bajty s ra-czej nierealne (nie mia yby wi kszego sensu) St d te do przechowywania informacjio aktualnie wysy anym bajcie danych wystarczy 6 bitoacutew mdash tyle samo zosta o wyko-rzystanych do okre lenia d ugo ci pola danych transakcji w strukturze LCD_trans Zaosz-cz dzony bit mo na po wi ci na flag nibble okre laj c ktoacutera tetrada (m odszastarsza)jest wysy ana Bez poacutel bitowych flaga ta zaj aby dodatkowy bajt pami ci

Przejd my do implementacji sterownika Pierwsz rzecz jak nale y sprawdzi jestto czy w buforze czeka jaka transakcja do zrealizowania Odpowiedzialny za to jestfragment kodu obs ugi przerwania nadmiaru timera

if(trans == NULL) Nic do zrobienia sprawd my czy jaka transakcja oczekuje trans=cbRead(ampLCD_TransBuffer) Czy jest jaka oczekuj ca transakcja seqpos=0 seqnibble=0 if(trans == NULL) TCD0_CTRLA=TC_CLKSEL_OFF_gc Nie ma adnych transakcji mdash wy cz timer

W przypadku gdy adna transakcja nie oczekuje na realizacj timer jest wy czanymdash dzi ki temu nie b d zg aszane kolejne przerwania przepe nienia i MCU nie b -dzie traci czasu na ich obs ug Co prawda wynikaj cy z tego zysk czasowy jest mar-ginalny lecz ma to istotniejsz konsekwencj mdash w przypadku usypiania MCU zb d-ne przerwanie timera nie b dzie niepotrzebnie wybudza o procesora W takiej sytuacjiponowne w czenie timera nast pi dopiero w funkcji dodaj cej transakcj do kolejkimdash a wi c w sytuacji gdy mamy pewno e istnieje oczekuj ca transakcja

Druga cz funkcji obs ugi przerwania jest zwi zana z realizacj samej transakcjiW pokazanym przyk adzie zaimplementowano tylko jeden typ transakcji mdash daniezapisu a cucha tekstowego pod wskazany adres VRAM (na okre lonej pozycji LCD)Je li zajdzie taka potrzeba programista mo e zaimplementowa inne polecenia i doda

1 Warto zauwa y e w bdquoklasycznejrdquo obs udze LCD te nie musimy czyta stanu flagi busy zamiast tego

wystarczy wprowadza p tle opoacute niaj ce Jednak poniewa taka obs uga blokuje MCU nie jest onazalecana Wady tej nie ma dost p transakcyjny co jest jego dodatkow zalet

Kup książkę Poleć książkę

64 AVR Uk ady peryferyjne

kod odpowiedzialny za ich obs ug Zauwa my e ka da transakcja musi zawieraadres pocz tku pami ci wideo od ktoacuterego b dzie zapisywany tekst Dzieje si takdlatego e transakcja wykonana wcze niej mo e ustawi wska nik zapisu na dowolnejkomoacuterce pami ci W efekcie tekst z kolejnej transakcji by by wy wietlany od komoacuterkina ktoacuterej zako czy si zapis poprzedniej transakcji Takie dzia anie oczywi cie jestniedopuszczalne st d te ka dy zapis do pami ci wideo poprzedza ustawienie rejestruindeksowego Problem ten mo na rozwi za tak e w inny sposoacuteb mdash poprzez wpro-wadzenie tzw uchwytoacutew (ang handlers) ktoacutere zawiera yby stan kontrolera LCDNiemniej to rozwi zanie dodatkowo komplikowa oby nasz sterownik Struktura danych(zawartych w polu data) ma wi c nast puj cy format

bajt nr 0 zawiera warto pozycji od ktoacuterej nale y dokonywa zapisu pami ciwideo mdash jest to warto przesy ana do rejestru okre laj cego adres zapisu

kolejne bajty zawieraj a cuch znakowy ktoacutery nale y umie ci w pami ciCGRAM

Poniewa bajt nr 0 zawsze zawiera warto wpisywan do rejestroacutew steruj cych kon-trolera podczas jego wysy ania jest ustawiana linia RS sygnalizuj ca zapis do rejestruPodczas wysy ania kolejnych bajtoacutew linia ta jest zerowana w zwi zku z czym zapisodbywa si do pami ci CGRAM

Kod obs uguj cy transakcj wygl da nast puj coif(trans) Jest transakcja do zrealizowania uint8_t dat=trans-gtdata[seqpos] if(seqnibble == 0) datgtgt=4 To trzeba zmieni je li linie danych nie s po czone z pinami 0 ndash 3 portu IO hd44780_outnibble_nowait(dat amp 0x0F seqpos = 0) Zapisujemy rejestr steruj cy lub dane ++seqnibble if(seqnibble == 0) ++seqpos Co drug tetrad zwi kszamy pozycj bufora if(seqpos gt= trans-gtlen) trans-gtReady=true Koniec transakcji if(trans-gtSelfDel) free_re(trans) Zwolnij pami transakcji je li tak sobie yczy programista trans=NULL Koniec transakcji CLR(OUT HD44780_E)

Ta cz przerwania wysy a kolejne tetrady do kontrolera LCD Warto zastanowi sinad dzia aniem sekwencji

++seqnibble

Poniewa pole nibble jest jednobitowe operacja inkrementacji prowadzi do zmianystanu tego pola na przeciwny (pole to ma warto 0 lub 1) Kiedy zostan wys anewszystkie dane przeznaczone dla kontrolera obs uga transakcji ko czy si Stan tensygnalizuje nadanie warto ci true polu Ready struktury LCD_trans Dzi ki temu pro-gram mo e sprawdzi asynchronicznie w stosunku do przerwania kiedy transakcjauleg a zako czeniu Opcjonalnie jest wykonywana jeszcze jedna funkcja mdash je li poleSelfDel ma warto true to pami zarezerwowana na transakcj jest automatycznie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 65

zwalniana W tym celu wykorzystuje si funkcj free_re ktoacuterej prototyp jest zade-klarowany w pliku Alloc_safeh Funkcja ta wywo uje funkcj biblioteczn free ktoacute-ra zwalnia pami przydzielon dynamicznie na stercie Poniewa funkcja ta nie jestfunkcj reentrant nale y stworzy odpowiedni bdquoprotez rdquo opakowuj c j w blokatomowy co zapewnia e nie zostanie ona ponownie wywo ana zanim jej poprzed-nia instancja nie zako czy dzia ania Oczywi cie lepszym rozwi zaniem by oby napi-sanie w asnych funkcji dynamicznej alokacji pami ci ktoacutere b d reentrant

Bardzo wa ne jest aby pole SelfDel mia o warto true wy cznie dla transakcjidla ktoacuterych pami zosta a przydzielona dynamicznie funkcj malloc (lub jej po-chodnymi) W pozosta ych przypadkach pole to musi mie warto false mdash nie-stosowanie si do tej regu y spowoduje b d mened era pami ci i najprawdopo-dobniej nieprzewidywalne dzia anie programu

Drug wa n zasad jest aby zmienna zawieraj ca dane transakcji nie by azmienn automatyczn mdash zmienne takie s automatycznie niszczone po opusz-czeniu zawieraj cej je funkcji W rezultacie obszar pami ci zawieraj cy danetransakcji mo e zosta wykorzystany przez inne zmienne co spowoduje uszkodzeniezawartych w nim danych

Pami przydzielona transakcji musi by alokowana w sposoacuteb dynamiczny (funkcjamalloc_re) ewentualnie mo e to by pami alokowana dla zmiennej globalnej lubstatycznej mdash zmienne tego typu istniej przez ca y czas ycia programu

Warto te zauwa y e instrukcje steruj ce stanem linii Enable kontrolera LCD(SET(OUT HD44780_E) i CLR(OUT HD44780_E)) s rozdzielone wieloma innymi in-strukcjami Dzi ki temu generowany impuls dodatni tego sygna u ma czas trwania gt230 ns wymagany w specyfikacji kontrolera Nawet dla XMEGA taktowanej zegarem32 MHz 230 ns przek ada si na oko o 7 instrukcji asemblera mdash czas jaki z pewno-ci up ynie pomi dzy wykonaniem obu powy szych instrukcji steruj cych

Do wysy ania danych do kontrolera zosta a wykorzystana nieco zmodyfikowanafunkcja hd44780_outnibble_nowait roacute ni ca si od jej protoplasty hd44780_outnibbletylko tym e nie czeka na sygna braku zaj to ci mikrokontrolera (nie realizuje teopoacute nie ) Nie jest to potrzebne gdy kolejne tetrady s wysy ane w odst pach cza-sowych okre lanych przez timer

Mamy wi c zapewnion obs ug transakcji i mo liwo transakcyjnego wy wietlaniadanych na LCD musimy jeszcze mie funkcj ktoacutera tworzy odpowiednie transakcjemdash jest odpowiednikiem funkcji bezpo rednio wysy aj cej dane znakowe do LCDOdpowiednikiem tym jest pokazana poni ej funkcja

bool LCD_PutText_B(uint8_t x uint8_t y char txt LCD_trans buf bool autodel) buf-gtcmd=LCD_Text buf-gtReady=false buf-gtSelfDel=autodel Czy zwolni pami po zako czeniu transakcji buf-gtdata[0]=HD44780_DDADDR(x+y0x40) Ustaw adres w DDRAM strcpy((char)ampbuf-gtdata[1] txt) Skopiuj dane tekstowe + NULL

Kup książkę Poleć książkę

66 AVR Uk ady peryferyjne

buf-gtlen=strlen(txt) + 1 D ugo tekstu + pozycji + NULL ndash 1 bool ret=cbAdd(ampLCD_TransBuffer buf) if((ret==false) ampamp (autodel)) free_re(buf) Brak miejsca w kolejce else TCD0_CTRLA=TC_CLKSEL_DIV1_gc Preskaler 1 mdash odblokuj timer return ret

Funkcja ta buduje transakcj odpowiedzialn za wy wietlenie napisu txt na wskaza-nej pozycji x y LCD Wszystkie dane o transakcji zostan umieszczone w buforzew pami ci ktoacuterej adres jest okre lany wska nikiem buf Pami w buforze musi bywystarczaj co du a aby pomie ci ca transakcj Dodatkowy parametr autodel okre laczy pami ta ma by automatycznie zwalniana po obs u eniu transakcji (true) czynie (false) Je li transakcj uda o si umie ci w kolejce funkcja zwraca true Wartozauwa y e w takim przypadku funkcja uruchamia te timer (w naszym przypadkujest to timer TCD0) odpowiedzialny za generowanie przerwania Funkcja obs ugi prze-rwania wysy a dane do LCD

Pewn odmian powy szej funkcji jest funkcjabool LCD_PutText(uint8_t x uint8_t y char txt) LCD_trans trans=malloc_re(sizeof(LCD_trans) + strlen(txt) + 2) bool ret=LCD_PutText_B(x y txt trans true) return ret

Wykorzystuje ona funkcj LCD_PutText_B z tym e najpierw alokuje dynamiczniepami potrzebn na przechowanie tworzonej transakcji

Mamy komplet potrzebnych funkcji a wi c sprawd my jak ca o sprawdza siw praktyce W pliku LCD-transactc znajduje si kod pokazuj cy jak dzia aj naszetransakcje Aby to by o mo liwe nale y zainicjalizowa kontroler LCD

LCD_init()

Wykorzystujemy tu znan ju funkcj inicjalizuj c mdash nie ma potrzeby jej zmienia gdy operacja inicjalizacji LCD jest jednorazowa i nie trzeba wykonywa jej w posta-ci transakcji W drugim kroku musimy zainicjalizowa wykorzystywany timer i systemprzerwa

LCD_Timer_init(ampTCD0)PMIC_CTRL|=PMIC_LOLVLEN_bm Odblokuj przerwania niskiego poziomusei()

Poniewa dost p do LCD z pewno ci nie jest czynno ci krytyczn czasowo prze-rwaniom timera nadano najni szy priorytet Dzi ki temu mo na innym bardziej kry-tycznym przerwaniom nada wy sze priorytety i uzyska w ten sposoacuteb zmniejszenieczasu latencji obs ugi przerwa Sama inicjalizacja timera jest niezwykle prosta

void LCD_Timer_init(TC0_t tc) tc-gtINTCTRLA=TC_OVFINTLVL_LO_gc Odblokuj przerwania nadmiaru timera i nadaj im niski priorytet tc-gtPER=F_CPULCD_ACCESSTIME Przerwanie co 4 us (niezale nie od F_CPU)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 67

Sprowadza si ona tylko do odblokowania mo liwo ci zg aszania przerwania nadmia-ru oraz konfiguracji rejestru PER tak aby przerwania by y generowane co ok 4 s mdashniezale nie od cz stotliwo ci taktowania CPU Mo emy wi c przyst pi do wy wie-tlenia pierwszego napisu

LCD_PutText(00 Numer)

Powy sza funkcja ma jedn wad mdash alokuje dynamicznie pami po ka dym wywo-aniu (pami ta jest automatycznie zwalniana po obs u eniu transakcji) niemniej

ca y proces jest czasoch onny Mo emy tego unikn alokuj c pami bdquor cznierdquo i wielo-krotnie wykorzystuj c zaalokowany blok pami ci Ilustruje to poni szy przyk ad

LCD_trans buf=malloc_re(sizeof(LCD_trans) + 7)

Zmienna buf wskazuje na obszar pami ci ktoacutery mo e pomie ci a cuch 5-znakowyTyle wystarczy na potrzeby tego przyk adu mdash na LCD b d wy wietlane kolejneliczby w zakresie 0 ndash 65 535 najd u sza ma 5 znakoacutew st d te nasz bufor ma tak a nieinn d ugo

while(1) utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(60 bufstr buf false) while(LCD_IsTransCompleted(buf))

Do konwersji liczby na a cuch u yto funkcji bibliotecznej utoa (nag oacutewek stdlibh)Poniewa d ugo a cucha po konwersji jest zmienna (co spowodowa oby pozosta-wianie na LCD bdquoduchoacutewrdquo po poprzednich konwersjach) w kolejnej linii brakuj ceznaki uzupe niono spacjami Nast pnie tworzona jest transakcja w obszarze pami ciprzydzielonym zmiennej buf Ostatnia p tla while jest odpowiedzialna za oczekiwa-nie na zako czenie realizacji transakcji Po jej zako czeniu p tla jest wykonywana odpocz tku

Uwa ny czytelnik z pewno ci zauwa y e pami przydzielana funkcj malloc_renie jest nigdzie zwalniana mdash w normalnej sytuacji spowodowa oby to wyciek pami -ci W naszym przyk adzie jednak program nigdy si nie ko czy nie ma wi c potrzebyzwalniania pami ci wskazywanej przez zmienn buf

Powy szy przyk ad pokazuje jak unikn blokowania CPU na czas dost pu do wolnodzia aj cego urz dzenia jakim jest LCD alfanumeryczny Jednak to nie wszystkiezalety wynikaj ce z zastosowania transakcji Drug wa n zalet naszego rozwi zaniailustruje przyk ad znajduj cy si w katalogu PrzykladyLCD-alfaLCD-transact-intPowa nym ograniczeniem funkcji odpowiedzialnych za dost p do LCD w sposoacutebklasyczny by a niemo no ich wywo ywania z funkcji obs ugi przerwa mdash funkcjeobs ugi LCD nie by y reentrant2 Nasz system oparty na transakcjach nie ma tychwad Aby to zilustrowa zosta stworzony prosty przyk ad mdash tak jak poprzedniow p tli g oacutewnej programu s wy wietlane stale kolejne liczby ale jednocze nie wyko-

2 Poza tym blokowa y CPU na d ugi czas a jak pami tamy funkcje obs ugi przerwa powinny by

wykonywane mo liwie kroacutetko

Kup książkę Poleć książkę

68 AVR Uk ady peryferyjne

rzystano drugi timer (TCD1) w ktoacuterego funkcji obs ugi przerwania przepe nienia jestwy wietlany licznik tych przerwa

ISR(TCD1_OVF_vect) static char int_buf[sizeof(LCD_trans) + 7] static uint16_t cnt char bufstr[6]

utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(61 bufstr (LCD_trans)ampint_buf false)

Jak widzimy w sposoacuteb asynchroniczny z dwoacutech miejsc w programie mo emy uzy-ska dost p do LCD a ka da funkcja bdquoma wra enierdquo e ma LCD na wy czno Przy okazji warto przeanalizowa sposoacuteb w jaki jest rezerwowana pami na trans-akcj w przerwaniu Oczywi cie mo na by wykorzysta dynamiczn alokacj pami cilecz jak wspomniano taka alokacja jest czasoch onna St d te w pokazanym przy-k adzie wykorzystano tablic statyczn int_buf o rozmiarze umo liwiaj cym prze-chowanie kompletnej transakcji Dzi ki temu e zmienna int_buf jest zmienn statycz-n nie jest ona niszczona po zako czeniu funkcji obs ugi przerwania Gdyby pomins owo kluczowe static zmienna ta by aby niszczona a na LCD najprawdopodobniejzacz yby si pojawia przypadkowe tre ci Poniewa pami naszego bufora nie by aalokowana dynamicznie nie mo e ona zosta zwolniona w naszym sterowniku LCDst d te ostatni parametr wywo ania funkcji LCD_PutText_B musi mie warto false

OptymalizacjaPrzy okazji tego i poprzedniego przyk adu warto zastanowi si jeszcze nad jednkwesti mdash optymalizacji W podanych przyk adach wykorzystano wcze niej omoacute-wione funkcje dost pu do wy wietlacza LCD znajduj ce si w plikach hd44780ci hd44780h Wi kszo z zawartych tam funkcji nie jest wykorzystywana jednakkompilator mimo wszystko umieszcza ich kod w pliku wynikowym mdash dzieje si takponiewa nie mo e on bdquostwierdzi rdquo czy funkcje te nie s wykorzystywane w innychfragmentach programu Pami tajmy e kompilator kompiluje poszczegoacutelne pliki roacute-d owe osobno i dana jego instancja nie bdquowierdquo co znajduje si w innych plikach (innychjednostkach kompilacji) Tak ca o ciow wiedz ma dopiero konsolidator (linker)ktoacutery czy stworzone przez kompilator pliki obiektowe (o rozszerzeniu o) w plikwynikowy Linker jednak bdquonie wierdquo ktoacutera z funkcji programu zosta a u yta a ktoacuteranie mdash informacje te ma wy cznie kompilator W ten sposoacuteb powstaje typowe b dneko o w efekcie nasze nieu ywane funkcje nie s usuwane (linker zostawia je bdquonawszelki wypadekrdquo) i zajmuj niepotrzebnie pami Czy mo na temu jako zaradzi Oczywi cie tak W tym celu trzeba po czy si y kompilatora i linkera co zapewniaj od-powiednie opcje kompilacji We w a ciwo ciach projektu (ProjectProperties lub Alt+F7)wybieramy zak adk Toolchain a nast pnie AVRGNU C Compiler i OptimizationZnajdziemy tam pole wyboru o nazwie Prepare functions for garbage collection (ry-sunek 224)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 69

Rysunek 224 Aby da linkerowi mo liwo usuwania nieu ywanych funkcji nale y skompilowaprogram z wybran opcj ndashffunction-sections ktoacutera spowoduje e ka da funkcja programu znajdzie siwe w asnej sekcji

Zaznaczenie tej funkcji spowoduje umieszczenie ka dej funkcji w osobnej sekcji mdashsamo w sobie nie wp ynie to na skroacutecenie kodu wynikowego ale jest warunkiem nie-zb dnym dla podj cia stosownych dzia a przez linker Aby wyeliminowa nieu y-wane funkcje nale y zaznaczy jeszcze w ga zi AVRGNU LinkerOptimization poleGarbage collect unused sections (rysunek 225)

Rysunek 225 Zaznaczenie opcji Garbage collect unused sections (-Wl--gc-sections) spowodujee nieu ywane funkcje zostan usuni te z kodu wynikowego w efekcie kod programu ulegnie skroacuteceniu

Po zaznaczeniu tych opcji program zostanie skroacutecony o kilkaset bajtoacutew Oczywi cieje li wszystkie funkcje by yby wykorzystane nie uzyskaliby my adnego skroacuteceniakodu Niemniej w sytuacji gdy u ywa si bibliotek zazwyczaj przynajmniej czfunkcji nie jest wykorzystywana warto wi c skorzysta z tej mo liwo ci optymalizacji

Kup książkę Poleć książkę

70 AVR Uk ady peryferyjne

Je li mamy do czynienia z prekompilowan bibliotek (lib) to musi ona by skom-pilowana z zaznaczon opcj Prepare functions for garbage collection (-ffunction-sections) Alternatyw jest umieszczenie ka dej funkcji biblioteki w osobnym pliku(tak jak w przypadku bibliotek AVR-libc)

Na ekranie wyboru opcji optymalizacji linkera mamy jeszcze jedn przydatn opcjmdash Relax Branches (-mrelax) Dla mikrokontroleroacutew ktoacutere maj ponad 8 kB pami ciFLASH instrukcje skokoacutew s generowane jako tzw instrukcje d ugie mdash umo liwiajone skok do komoacuterki pami ci FLASH o dowolnym adresie Jednak cen za to jestwyd u enie instrukcji mdash ich kod jest d u szy podobnie jak czas wykonania Nie zawszejednak takie d ugie instrukcje musz by wykonywane mdash je li miejsce docelowe skokule y blisko (w zasi gu instrukcji skokoacutew wzgl dnych) to mo na w kodzie wynikowymzamieni instrukcje d u sze na kroacutetsze co przynosi oszcz dno ci w postaci skroacuteceniakodu wynikowego Poniewa dopiero linker bdquowierdquo jak poszczegoacutelne fragmenty kodus rozmieszczone w pami ci takiej podmiany mo na dokona na etapie linkowaniaprogramu co zapewnia powy sza opcja St d te warto to pole wyboru zaznaczy

Kup książkę Poleć książkę

SkorowidzA

ABI Application Binary Interface 25AC Address Counter 50ADPCM 482adres

bazowy 377bufora 61komoacuterki 84pu apki 202

ALE Address Latch Enable 368alfanumeryczne wy wietlacze 43algorytm ADPCM 492algorytmy stratne 495animacje 57antyaliasing 325architektury procesoroacutew XMEGA 352asembler 23

dyrektywy 40funkcje j zyka C 41obs uga przerwa 39

asynchroniczne wywo anie funkcji 101Atmel Studio 15

Bbajty kalibracyjne 569biblioteka

FATFS 131 139 176 180 517libcallback-liba 99PetitFS 144 149

bitADC_CH0START_bm 236IMPMODE 244

bitrate 442 512blokowanie przerwa 219b d 16 19

kwantyzacji 463offsetu 230wzmocnienia ADC 230

BOD 223bps bits per second 12

budowakarty 152linii obrazu 394pami ci SDRAM 374pliku stymulacji 192ramki PAL 412sygna u PAL 411wtyczki 544 545

bufor 78FIFO 497na transakcje 61transakcji 62

buforowanie wyj cia 294

CCAS Column Address Strobe 375CCFL 44charakterystyka

przetwornikoacutew 222termistora 264tryboacutew pracy 232

CID Card Identification 169CKE Clock Enable 375CLKIN 421COG Chip on Glass 310CRC 158 178CRC16 178CRC7 164CS Chip Select 361 375CSD Card Specific Data 172czas

dost pu do SDRAM 424adowania kondensatora 244

propagacji 281proacutebkowania 260symulacji 209

czcionki 322cz stotliwo

odchylania pionowego 428proacutebkowania 244 441 444 530przebiegu 504

Kup książkę Poleć książkę

576 AVR Uk ady peryferyjne

cz stotliwoPWM 465taktowania koprocesora 549taktowania procesora 209taktowania rdzenia 18

czyszczenie pami ci 318

DDAC Digital to Analog Converter 293 447 451

buforowanie wyj cia 294generowanie przebiegoacutew 301jitter 303kalibracja 306napi cie referencyjne 295system zdarze 297taktowanie 296tryb dwukana owy 301wykorzystanie DMA 298wyzwalanie konwersji 305

datalogger 261 265 275DD Device Density 86debuger 183

programowy 190sprz towy 185 187

decymacja 259DEBUG 219XMEGA 260

definicja symboli globalnych 36definiowanie w asnych znakoacutew 56deklaracja zapowiadaj ca 103 337dekoder DTMF 548 556DMA 254 298 402 458 518 523dost p do

danych 358 359 568danych binarnych 356 360danych wielobajtowych 31DataFLASH 137EEPROM 128FAT 136komoacuterki 375LCD 59 62 66 68operandu 30pami ci 81 384 386 387 561pami ci SDRAM 424pliku blokowy 141portoacutew IO 30rejestroacutew IO procesora 36rejestroacutew uk adu 499SPI 95sygnatury u ytkownika 565 567wska nikoacutew 32

DQM Data Mask 375DSP Digital Signal Processor 535

DTMF 535 553dyktafon 529dynamiczna alokacja pami ci 516dyrektywa global 38dyrektywy asemblera 40dzia anie

DMA 255komparatora 280timeroacutew 400

d wi k 443

EEBI External Bus Interface 361EEPROM 207eliminacja jitteru 24emulacja RS232 139

FFAT File Allocation Table 128 131FAT32 128FATFS 180filtr

dolnoprzepustowy 491drugiego rz du 470pierwszego rz du 469trzeciego rz du 471

filtrowanie sygna u PWM 468firmware 565FLASH 207format

odpowiedzi 159polecenia 158protoko u 157

funkcja_delay_ms 17 219c_zero 42callback 106 341callback() 99DataFLASH_CSEnable 100DF_FinishBufWrite() 269disk_initialize 136disk_ioctl 181disk_status 136disk_write 138DMA_SPI_init 104DTMF_GetCode 553free_re 65GPIOR0_init 507hd44780_outcmd 51hd44780_outnibble_nowait 65LCD_defchar_P 57

Kup książkę Poleć książkę

Skorowidz 577

Menu_Click_Func 515Menu_Free 516Menu_Recorder 532Menu_Run 527MS_CreateRegEntry 117MS_GetDirPos 125MS_GetRegItem 115MS_WritePages 116 118OSC_wait_for_rdy 473RecMenu_StartStop 532sprintf 142strtok 124sysclk_init() 200 209TMF_memcpy_PF 454udi_cdc_getc() 123udi_cdc_is_rx_ready() 123VS1003_Reset 506

funkcjeanalizuj ce 556biblioteczne 50biblioteki FATFS 143j zyka C 41kontrolera ST7565R 313opoacute niaj ce 17opoacute nie 219reentrant 524specjalne kontrolera 319steruj ce 314zapisu 133

fusebit 557BODACT 560BODLEVEL 560BOOTRST 559DVSDON 560EESAVE 561JTAGEN 558RSTDISBL 559SUT 559TOSCSEL 559

fusebity w AVR-libc 571

Ggenerator obrazu composite 426generowanie

d wi ku 461kolorowego obrazu 437obrazu wideo 391przebiegoacutew 301przerwa 285sygna u composite 409

g bia koloru 326gniazdo

karty SD 156VGA 396

Hhistereza 281

IIDE 11IMA ADPCM 483informacje

o kolorze 431o obrazie 434

inicjalizacjakarty 161karty SDHC 167karty SDSC 167karty SDXC 167licznika 419pami ci 119USART 505

instrukcjaicall 42movw 35nop 13 24

interfejsSCI 498SDI 498SPI 71 79RS232 120UART 123USART 71 73

interpolacja 259interpolacja w XMEGA 260inwersja obrazu 319

Jjednostki 12jitter 24 303 420

Kkalibracja

ADC 229DAC 306 564offsetu 237

kana DMA 82 522karta 154 158

mikroSD 152SD 151 152SDHC 151 152 160SDSC 160SDXC 151 160

Kup książkę Poleć książkę

578 AVR Uk ady peryferyjne

karty pami ci 151 152 157biblioteka FATFS 180budowa 152format polecenia 158inicjalizacja 161 167komunikacja 156odczyt danych 173opcje konfiguracyjne 181rejestry specjalne 169tryby pracy 153zapis danych 176zasilanie 154

kodasemblerowy 23 24C 23dost pu 24

kodowanieμ-law 481ADPCM 483Dialogic ADPCM 494informacji 166 426koloru 425znakoacutew 536

kodyformatoacutew audio 501zdarze 545

kolejno bajtoacutew 533kolor 424 430kolorowy obraz 437komparator 422

analogowy 279 280analogowy XMEGA 282okienkowy 284

kompilacja plikoacutew binarnych 350kompilator avr-gcc 11 359kompresja

ADPCM 482 486d wi ku 480IMA ADPCM 482

komunikacja z koprocesorem 504konfiguracja

4-portowa 364biblioteki 133debugera 185DMA 459 522fusebitoacutew 570kontrolera DMA 257 452komparatoroacutew 285lockbitoacutew 570LPC 371pami ci SDRAM 381PetitFS 149pinu IO 225portoacutew IO 362

preskalera 452projektu 186przerwa 219pu apki 203rejestru EVCTRL 248rejestru PER 67SPI 75sygna u CS 377typu czcionki 324urz dze IO 189USART 76zegara 383

konsolidacja 547kontroler

DMA 254 298 402 458 518 523KS108 310ST7565R 310ndash315 321

konwersjaDAC 305sygna oacutew 396wyzwalana 306

konwertercyfrowo-analogowy 426DAC 427

koprocesormp3 496VS1003B 10

korekcja fazy 466kwantyzacja 463

Llampa CCFL 44LE Latch Enable 433licznik 419

cykli 209TCC1 400timera 20

linie IO 50linie sygna owe

MISO 72 164MOSI 72SCK 72SS 72

linker 69lista

mnemonikoacutew 24modyfikowanych rejestroacutew 32

lockbity 557 561lockbity w AVR-libc 570LPC Low Pin Count 371LPCM 443 556LSB Least Significant Bit 228

Kup książkę Poleć książkę

Skorowidz 579

a cuchy formatuj ce 212czenie plikoacutew 352

Mmagistrala pami ci zewn trznej 361magnetofon cyfrowy 528makro _SFR_IO_ADDR() 39makrodefinicja

ASSERT 214HD44780_CGADDR() 53HD44780_CLR 53HD44780_DDADDR() 53HD44780_DISPCTL() 52HD44780_ENTMODE() 52HD44780_FNSET() 52HD44780_HOME 53HD44780_SHIFT() 51LOCKBITS 571

mapowanie sygna oacutew 366mapy bitowe 343marker czasowy 268maski bitowe 329matryce 49menu 335menu piktogramowe 342mierniki temperatury 262mikrokontroler

ARM 9AVR 9PIC 9XMEGA128A3U 10

MISO 72moc wydzielana 265model psychoakustyczny 495modu

alfanumeryczny 45NVM 568Xmega eXploreGO 10Xplained ATXMEGA A3BU 10Xplained ATXMEGA-A1 10Xplained XMEGA128A1 447Xplained XMEGA256A3 94Xplained XMEGA256A3BU 97 143 266

modyfikator 30const 85volatile 28 273

monitory CRT 395monochromatyczne wy wietlacze graficzne 309monochromatyczny

tryb graficzny 416tryb tekstowy 413

MOSI 72mp3 495Msps Megasamples per second 12multiplekser wej ciowy 226 283multipleksowanie adresoacutew 368 369muzyka 439

Nnadawanie kodoacutew DTMF 540nadproacutebkowanie 258nag oacutewek kontenera wav 500nagrywanie mowy 486najmniej znacz cy bit 228napi cie

offsetu 280referencyjne 223 295zasilania 239

Oobracanie obrazu 319obraz 319

composite 426kolorowy 430wideo 391

obroacutebka d wi ku 443 445obs uga

FAT 131 143klawiatury matrycowej 24LCD 58 63 67menu 337przerwania 37 38 458przerwania DMA 525przerwa w asemblerze 39przyciskoacutew 272wy wietlaczy alfanumerycznych 45

odczytblokowy 140danych 173 358

odpowied response 159R1 159R2 159R7 160

od wie anie pami ci 376odtwarzanie

d wi ku 472muzyki 447 513 518 521

offset 238offset ADC 230okno

Breakpoints 202Call stack 209dezasemblera 210

Kup książkę Poleć książkę

580 AVR Uk ady peryferyjne

oknoIO View 207podgl du zmiennych 211wyboru czcionek 324

OLED 46opcje

kompilatora 35zapisu d wi ku 445

operacjena buforach 91odczytu 173zapisu 176zapisu strony 92

operand 29operator

ascii 41

asciz 41

byte 41

section 41opoacute nienia 13 18opoacute nienie zmienne 16optymalizacja 16 68optymalizator 26organizacja pami ci 77organizacja pami ci VRAM 316oscylator 287OSD On-Screen Display 417ostrze enie 16oszcz dzanie energii 94

Ppakiet WinAVR 48pami

CGRAM 56 57 64DataFLASH 10 77 81 113 269DDRAM 49EEPROM 111FLASH 54 124 207RAM 49SDRAM 372SRAM 63 124 329 366 371VRAM 314 317

PCLK 421PCM 443PetitFS 144 149p tla

for 13while 201

pierwsza linia obrazu 321piksel 430piktogram 342pin IO 225

plikAlloc_safeh 65DataFLASHc 83DataFLASHIOc 136definesh 50delayh 14diskioh 132 136ffh 132ffconfh 132 181hd44780h 49integerh 132ioh 30LCD_transc 61LCD-transactc 66Makefile 14Menuc 19nothingo 541outfiletxt 547 551pffh 149SPIh 104stringh 113stymulacji 191 192

pliki mp3 495elf 351fon 323o 24S 24 34binarne 350 355csv 276d wi kowe 440obiektowe 352wav 500WMA 512z czcionkami 327z danymi 349

podbijacz napi cia 315podgl d

pami ci 207stosu wywo a 209zmiennych 211znakoacutew 325

pod czeniefototranzystora 262karty SD 155LCD z kontrolerem 311modu u 50pami ci 362 369 370 373termistora 262uk adu LM35 251wyj XMEGA 398

pod wietlenieCCFL 46OLED 46

Kup książkę Poleć książkę

Skorowidz 581

podwoacutejne buforowanie 255 332 457polecenia

kasowania strony 81konfiguracyjne pami ci 82kontrolera ST7565R 315odczytu bufora 82 89odczytu pami ci 81 88SDRAM 376transferu 91

polecenieACMD41 168cd 181CID 178CMD0 165CMD8 167CSD 178date 276dir 127 181dump 276erase 276get 276HD44780_CLR 51Init 178mkdir 181

po czenieDMA ze SPI 96dwoacutech komparatoroacutew 285koprocesora mp3 497LCD z mikrokontrolerem 48wyj cia XMEGA 411XMEGA z PC 121z telewizorem 431

pomiarnapi cia zasilania 239temperatury MCU 241

port IO 30 362pozycjonowanie grafik 345poacute obraz 410precyzja pomiaroacutew 260preskaler 478preskaler ADC 243program

Atmel Data Visualizer 275Audacity 443avr-objcopy 350dataloggera 265LCD Image Converter 323makeloadingtableexe 543Realterm 127 554riffstrip 483SoX 445Tracepoint 208

programowanie sygnatury u ytkownika 566protokoacute master-slave 157

prototypy 136proacutebki d wi kowe 447proacutebkowanie

8-bitowe 300nieliniowe 480

prymitywy graficzne 330przebieg PWM 468przebiegi 289 303przechwytywanie danych 276przemiatanie wej 253przerwanie 218 254 286 403

DMA 522komparatora 286

przestrze adresowa procesora 378przesy anie

danych 498polece 498

przetaktowanie procesora 436przetwornik

ADC 221analogowo-cyfrowy 221cykliczny 222potokowy 222

przyciski 272pseudooperatory 41pu apki breakpoints 197pu apki warunkowe 205punkty ledzenia 203PWM 461 462 472

RRAS Row Address Strobe 375redukcja poboru energii 242regulacja kontrastu 321rejestr 32 34rejestr AC 50

adresu wtyczki 513BASEADDR 377CID 169CMP 251CSD 172czasu utworu 512DATA 83EVCTRL 248formatu audio 512identyfikacyjny pami ci 87INTFLAGS 252kontroli basoacutew 510kontroli g o no ci 513MUXCTRL 227OCR 168PER 67poroacutewnania 249

Kup książkę Poleć książkę

582 AVR Uk ady peryferyjne

rejestr ACSCI_CLOCKF 511stanu komparatora 287stanu pami ci 86stanu uk adu 510trybu pracy 508WINCTRL 285

rejestrydost pu do pami ci RAM 513GPIOR 502IO procesora 36mikrokontrolera 25procesora 35specjalne 94specjalne karty 169uk adu VS1003B 508

relacja rodzic ndash dziecko 336reset uk adu 534rozdzielczo

LCD 329przetwornika 231PWM 463 477

rozszerzenie HiRes 477 479roacutewnanie Steinharta-Harta 263rysowanie map bitowych 343

Sschemat uk adu dataloggera 267SCI Serial Command Interface 498SCK 72SD Secure Digital 152SDI Serial Data Interface 498separator synchronizacji 422separowanie impulsoacutew synchronizacji 422shieldy 10skaler 422skaler napi cia 283skrypt makefile 353s owo kluczowe

asm 27extern 37static 68

specyfikatory lokalizacji zmiennej 213sps samples per second 12SS Slave Select 72standard PAL 410standard VGA 393sterowanie

dataloggerem 275sygna em 379

sterownik 121HD44780 49 56LCD 49 62

stos wywo a 209

strukturaFATFS 139Handle 118LCD_trans 60 63menu 338rejestru 86SimpleFSEntry 113 116SimpleFSHandle 113 118 140submenu 527systemu plikoacutew 112

sumabitowa 571kontrolna 178

sygnacomposite 409composite video output 430CS 377DREQ 497H-Sync 396synchronizacji 423V-Sync 396zegarowy CLK 374

sygna yinterfejsu EBI 363magistrali EBI 364steruj ce 375

sygnaturaprodukcyjna procesora 563u ytkownika 565

symbol__DELAY_ROUND_CLOSEST__ 17__DELAY_ROUND_DOWN__ 17_FS_FAT12 149_FS_FAT32 149_FS_MINIMIZE 133_FS_READONLY 133_FS_RPATH 135_FS_TINY 133_MAX_SS 135_MULTI_PARTITION 135_USE_DIR 149_USE_FASTSEEK 134_USE_FORWARD 134_USE_LABEL 134_USE_LFN 134_USE_LSEEK 149_USE_MKFS 134_USE_READ 149_USE_STRFUNC 134_USE_WRITE 149_VOLUMES 136F_CPU 14 15 18increment 36USE_BUSY_FLAG 50

Kup książkę Poleć książkę

Skorowidz 583

symboleglobalne 36w asemblerze 28zewn trzne 39

symulacja 198 209symulator 190synchronizacja

pami ci 331pionowa 395pozioma 394

systemplikoacutew 111 128przerwa 404zdarze 245

szablonfont_XMEGAtmpl 326image_XMEGAtmpl 343

szum 463szybko przesy ania danych 126

ledzenie wi zki 333rodowisko

graficzne 11programistyczne 11VSIDE 542WinAVR 47

Ttabela FAT 130tablica

framebuf 402 408plugintbl 552 555tekst 208z kodem wynikowym 543

taktowanieDAC 296mikrokontrolera 473

technologia OLED 44temperatura mikrokontrolera 239 241termistor 262 290

NTC 263PTC 263

termometrLM35 249 250z alarmem 251

termostat 290test uk adu VS1003B 503testowanie obrazu 319timer 16 62

TCC0 20

TCC1 399transakcja 59 62 65transakcje 17 103ndash107transakcyjna obs uga LCD 58transakcyjny dost p do SPI 95transfer 91

danych 97wynikoacutew 254

transmisja 72 83tryb

bez znaku 234ci g ej konwersji 252czterobitowy 153dwukana owy 301graficzny 416graficzny VGA 407idle 419jednobitowy 153LPC 371monochromatyczny 397 407oszcz dzania energii 94 306pracy multipleksera 226pracy SPI 157roacute nicowy 232single slope 312SPI 153tekstowy 413tekstowy VGA 397z pojedynczym wej ciem 234ze znakiem 235

trybygenerowania PWM 467pracy karty 153pracy przetwornika 231pracy SPI 74pracy uk adu 508

twierdzenie Nyquista 258tworzenie

adresu 84nak adek 417obrazu 335tablicy 543

typ__uint24 119karty 160niekompletny 60wyliczeniowy 114

typyoperandoacutew 29w AVR 34

Kup książkę Poleć książkę

584 AVR Uk ady peryferyjne

Uuchwyt handle 64 113uk ad

AD725 427 431buforowy 294CS 361DAC 284dataloggera 267detekcji awarii zasilania 559generuj cy obraz 393HiRes 477ICL7660 47LM35 250 251SampH 293sterowania sygna em 379USART 401VS1003B 496 503 508 530 538 556VS100XX 529wzmacniania sygna u 227

uk ady peryferyjne 9uruchomienie komparatora 287urz dzenie

master 72slave 72

u rednianie 259utrata danych 141u ycie wstawki asemblerowej 33

VVGA 393

Wwarto ci kalibracyjne

ADC 564oscylatoroacutew 564temperatury 564

warunkowa kompilacja 36WE Write Enable 375wej cie composite video input 425wektor przerwa 38 257wideo 391wielko pami ci 86 377w czenie DAC 299wska nik na struktur 27wska niki 32wstawki asemblerowe 24 33wtyczka 535 541 544

SineDTMF Generator 537VGA 396

wyboacuter cz stotliwo ci PWM 465 474wykorzystanie

DMA 254 518

EuroSCART 428PWM 461rejestroacutew 34

wyliczanie predyktora 489wy wietlacze

alfanumeryczne 43 45graficzne 43 309LCD 43OLED 46

wy wietlanielitera u 213map bitowych 344obrazu 333 346 406obrazu VGA 393

wywo ania zwrotne callbacks 98asynchroniczne 101synchroniczne 101

wyzwalanie konwersji 245wzmacniacz 446wzmacniacz operacyjny 279wzmacnianie sygna u 227

XXMEGA 9 18

Zzapis

bufora 269danych 176d wi ku 440 556

zasilaniekarty 154pami ci 109

zatrzask 368zatrzask 74HC573 433zatrza ni cie adresu 369zdarzenia 297zdarzenie compare match 399zegar 383 420 426zintegrowane rodowisko programistyczne 11z cze EuroSCART 425 428 429zmiana

g o no ci 527wielko ci strony 94

znaki 56

roacuted onapi cia odniesienia 284sygna u 240

Kup książkę Poleć książkę

Page 25: Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8 AVR. Ukäady peryferyjne Rejestry dost pu do pami ci RAM .....513 Rejestr adresu

60 AVR Uk ady peryferyjne

unsigned 0 Wyroacutewnanie do granicy bajta uint8_t data[] Dane transakcji LCD_trans

Nale y zwroacuteci uwag na poleunsigned 0

Nie definiuje ono adnego pola struktury ale jedynie informuje kompilator e kolejnepole (w naszym przyk adzie o nazwie data) ma by wyroacutewnane do granicy bajta mdashdzi ki temu dost p do kolejnego pola b dzie odbywa si szybciej Z kolei samo poledata jest zadeklarowane jako tzw typ niekompletny

Typ niekompletny (ang incomplete type) to typ ktoacuterego rozmiaru nie da si okre li

W pokazanym przyk adzie rozmiaru pola data nie da si okre li gdy zosta on za-deklarowany jako typ tablicowy z tym e nie podano wielko ci tablicy Wielko ci niepodano gdy na etapie deklaracji struktury nie wiemy jakiej wielko ci dane b d w niejprzechowywane Tego typu deklaracja ma bardzo powa ne konsekwencje mdash skorowielko ci pola data nie da si okre li to jaki b dzie wynik dzia ania operatora sizeof(LCD_trans) Kompilator stara si jako wybrn z tej sytuacji w zwi zku z czym

zwroacuteci wielko struktury ale tak jakby pole data w ogoacutele nie istnia o mdash jego roz-miar b dzie wynosi 0 W ramach wiczenia zastanoacutew si ile bajtoacutew pami ci b dziezajmowa a struktura LCD_trans

Skoro dysponujemy ju struktur przechowuj c poszczegoacutelne transakcje pora nastworzenie obiektu przechowuj cego kolekcj transakcji Dodanie kolejnej strukturyb dzie polega o na dodaniu jej do takiego obiektu z drugiej strony program sterownikaLCD b dzie moacuteg z tej kolekcji pobiera kolejne transakcje do realizacji Opis ten przy-pomina opis dzia ania bufora pier cieniowego mdash z jednym wyj tkiem mdash po zape nie-niu ca ego bufora nie b dziemy usuwa niezrealizowanych transakcji lecz zabloku-jemy dodawanie kolejnych W tym celu pos u ymy si definicj nast pnej struktury

typedef struct LCD_trans elements[LCD_MAXTRANS] Wska niki do transakcji uint8_t Beg Pierwszy element bufora uint8_t Count Liczba elementoacutew w buforze CircBuffer

Struktura ta zawiera deklaracj tablicy wska nikoacutew na transakcje (pole elements)Poniewa jest to tablica musimy zna liczb jej elementoacutew mdash jest ona zadeklarowanaw sta ej LCD_MAXTRANS

define LCD_MAXTRANS 10 Maksymalna liczba pami tanych transakcji

Do realizacji bufora s potrzebne jeszcze dwa pola Beg wskazuj ce na pierwsztransakcj w buforze oraz pole Count okre laj ce liczb transakcji znajduj cych siw buforze Je li Count == 0 to znaczy e w buforze nie ma adnych oczekuj cychtransakcji a je li Count == LCD_MAXTRANS to znaczy e bufor jest pe ny i nie mo na

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 61

dodawa do niego kolejnych transakcji W a ciwo t wykorzystuj dwie zdefiniowanew pliku LCD_transc funkcje

static inline bool cbIsFull(CircBuffer cb) return cb-gtCount == LCD_MAXTRANS

static inline bool cbIsEmpty(CircBuffer cb) return cb-gtCount == 0

Jak pami tamy w przypadku funkcji modyfikatory static inline powoduj e danafunkcja nie b dzie istnie jako samodzielna lecz w ka dym miejscu w ktoacuterym jestwywo ywana jest wstawiany raczej jej kod a nie wywo anie Ma to znaczenie dlakroacutetkich funkcji (a wi c takich jak pokazane powy ej) dla ktoacuterych koszty wywo anias zazwyczaj wi ksze ni koszty umieszczenia cia a funkcji w miejscu jej wywo aniaTego typu funkcje zachowuj si w sposoacuteb zbli ony do makrodefinicji (z tym e re-spektuj wszystkie regu y j zyka C w szczegoacutelno ci kolejno operatoroacutew czy kon-trol typoacutew)

Takie funkcje jako argument pobieraj adres bufora na ktoacuterym maj operowa W na-szym przypadku bufor jest zdefiniowany nast puj co

static CircBuffer LCD_TransBuffer Bufor na transakcje

Nale y zauwa y e jest on zdefiniowany jako struktura globalna z modyfikatoremstatic Modyfikator ten ogranicza zasi g widoczno ci zmiennej LCD_TransBuffer dopliku w ktoacuterym zmienna ta zosta a zdefiniowana (w tym przypadku modyfikator staticjest niejako przeciwie stwem modyfikatora extern) Dzia anie to ma jedynie znaczeniekosmetyczne mdash uniemo liwia odwo anie si do bufora za pomoc funkcji ktoacutere niezosta y zdefiniowane w miejscu jego definicji Oproacutecz funkcji umo liwiaj cych okre-lenie stanu bufora potrzebne s jeszcze funkcje umo liwiaj ce dodanie i pobranie trans-

akcji Pierwsz funkcj b dzie funkcja dodaj ca transakcj do buforabool cbAdd(CircBuffer cb LCD_trans elem) ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsFull(cb)) return false Czy jest miejsce w kolejce uint8_t end = (cb-gtBeg + cb-gtCount) LCD_MAXTRANS cb-gtelements[end] = elem Dodaj transakcj ++cb-gtCount Liczba elementoacutew w buforze return true Wszystko OK

Funkcja ta dodaje transakcj (zmienna elem) do bufora ko owego Zanim transakcjazostanie dodana sprawdzane jest czy w buforze jest miejsce mdash je li nie funkcjazwroacuteci false Je li dodanie jest mo liwe warto licznika okre laj cego liczb trans-akcji przechowywana w buforze (Count) zwi ksza si o jeden Warto zastanowi si te dlaczego praktycznie ca e cia o tej funkcji jest zamkni te w sekcji atomowej (ATOMIC_BLOCK) Jedn z cech naszego sterownika ma by mo liwo wspoacute bie nego dost pu

Kup książkę Poleć książkę

62 AVR Uk ady peryferyjne

do LCD mdash to znaczy e danie np zapisu do LCD mo e wyst pi zaroacutewno w g oacutewnejp tli programu jak i asynchronicznie w przerwaniu St d te wynika e funkcja do-daj ca transakcj musi by napisana w sposoacuteb zapewniaj cy jej poprawn prac w sytu-acji gdy zostanie ona przerwana i ponownie wywo ana przed zako czeniem dzia aniajej poprzedniej instancji Umieszczenie cia a tej funkcji w sekcji atomowej nam to za-pewnia mdash dzi ki temu bufor transakcji zawsze b dzie spoacutejny Dla zaspokojenia cie-kawo ci warto usun sekcj atomow i sprawdzi jak wtedy b dzie zachowywa si tafunkcja i jak wp ynie to na spoacutejno przechowywanych danych

Drug niezb dn funkcj jest funkcja odczytuj ca bufor transakcji i zwracaj ca trans-akcj do zrealizowania (lub NULL je li adnej transakcji nie ma w buforze)

LCD_trans cbRead(CircBuffer cb) LCD_trans elem ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsEmpty(cb)) return NULL Bufor pusty nie mo na zwroacuteci elementu elem = cb-gtelements[cb-gtBeg] cb-gtBeg = (cb-gtBeg + 1) LCD_MAXTRANS -- cb-gtCount Zmniejszamy liczb elementoacutew pozosta ych w buforze return elem

Funkcja ta jest bardzo podobna do poprzedniej mdash najpierw sprawdza czy bufor za-wiera jak oczekuj c transakcj (cbIsEmpty(cb)) je li tak to zwraca adres opisuj -cej j struktury i zmniejsza liczb transakcji oczekuj cych (pole Count) W ten sposoacutebmamy zrealizowan ca funkcjonalno zwi zan z obs ug bufora pier cieniowegoPokazane funkcje s uniwersalne i z bardzo podobnych (lub wr cz tych samych) b -dziemy korzysta w kolejnych rozdzia ach w kontek cie np obs ugi transakcji zwi -zanych z interfejsami szeregowymi

Pora przej do samego sterownika LCD Jego zadaniem b dzie sprawdzenie czyw buforze oczekuj jakie transakcje do realizacji a je li tak to ich wykonanie Ponie-wa dane do LCD mog by wysy ane co okre lony minimalny czas znacznie d u -szy ni czas jakiego na to zadanie potrzebuje mikrokontroler do wysy ania kolejnychpaczek danych pos u ymy si timerem Timer b dzie generowa przerwanie nadmiaru(TCD0_OVF_vect) ktoacutere b dzie wyznacza o tempo w jakim kolejne porcje danych b -d trafia y do LCD Z noty katalogowej kontrolera wynika e minimalny czas trwa-nia wysokiego stanu sygna u Enable to 230 ns a okres tego sygna u nie powinien bykroacutetszy ni 500 ns Poniewa nasz dost p do LCD odbywa si w sposoacuteb nieblokuj cyMCU wi c szybko wysy ania danych do LCD jest bez znaczenia St d te w poka-zanym przyk adzie przyj to e dane b d wysy ane co 4 s co okre la sta a

define LCD_ACCESSTIME 0000004

Poniewa komunikacja z LCD odbywa si w sposoacuteb nieblokuj cy nie zale y nam tena czasie (i tak w stosunku do czasu od wie ania samego LCD jest on bardzo kroacutetki)w efekcie nie ma potrzeby odczytywania flagi busy kontrolera Dzi ki temu w cz ciprzypadkoacutew mo emy w ogoacutele zrezygnowa z sygna u wyboru RW i wymusi jego sta y

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 63

poziom logiczny umo liwiaj cy zapis do LCD Dzi ki temu mo na zaoszcz dzi do-datkowy pin IO1

Ca a logika naszego sterownika jest zawarta w funkcji obs ugi przerwania przepe nieniatimera (TCD0_OVF_vect) Poniewa LCD jest po czony z MCU w trybie 4-bitowym(dla zaoszcz dzenia liczby wykorzystanych pinoacutew IO) kolejne 8-bitowe dane muszby podzielone na dwie tetrady i wys ane do LCD w kolejno ci starszam odsza tetradaInformacja o aktualnie wysy anych danych jest umieszczona w zmiennej trans o typie

static struct uint8_t pos 6 Pozycja w polu danych aktualnej transakcji uint8_t nibble 1 Ktoacutera tetrada jest wysy ana seq

Dlaczego tak Dzi ki wykorzystaniu struktury i poacutel bitowych mo na zaoszcz dzi je-den bajt pami ci SRAM Ze wzgl du na wielko pami ci obs ugiwanej przez kon-troler LCD mo emy by pewni e transakcje zawieraj ce wi cej ni 63 bajty s ra-czej nierealne (nie mia yby wi kszego sensu) St d te do przechowywania informacjio aktualnie wysy anym bajcie danych wystarczy 6 bitoacutew mdash tyle samo zosta o wyko-rzystanych do okre lenia d ugo ci pola danych transakcji w strukturze LCD_trans Zaosz-cz dzony bit mo na po wi ci na flag nibble okre laj c ktoacutera tetrada (m odszastarsza)jest wysy ana Bez poacutel bitowych flaga ta zaj aby dodatkowy bajt pami ci

Przejd my do implementacji sterownika Pierwsz rzecz jak nale y sprawdzi jestto czy w buforze czeka jaka transakcja do zrealizowania Odpowiedzialny za to jestfragment kodu obs ugi przerwania nadmiaru timera

if(trans == NULL) Nic do zrobienia sprawd my czy jaka transakcja oczekuje trans=cbRead(ampLCD_TransBuffer) Czy jest jaka oczekuj ca transakcja seqpos=0 seqnibble=0 if(trans == NULL) TCD0_CTRLA=TC_CLKSEL_OFF_gc Nie ma adnych transakcji mdash wy cz timer

W przypadku gdy adna transakcja nie oczekuje na realizacj timer jest wy czanymdash dzi ki temu nie b d zg aszane kolejne przerwania przepe nienia i MCU nie b -dzie traci czasu na ich obs ug Co prawda wynikaj cy z tego zysk czasowy jest mar-ginalny lecz ma to istotniejsz konsekwencj mdash w przypadku usypiania MCU zb d-ne przerwanie timera nie b dzie niepotrzebnie wybudza o procesora W takiej sytuacjiponowne w czenie timera nast pi dopiero w funkcji dodaj cej transakcj do kolejkimdash a wi c w sytuacji gdy mamy pewno e istnieje oczekuj ca transakcja

Druga cz funkcji obs ugi przerwania jest zwi zana z realizacj samej transakcjiW pokazanym przyk adzie zaimplementowano tylko jeden typ transakcji mdash daniezapisu a cucha tekstowego pod wskazany adres VRAM (na okre lonej pozycji LCD)Je li zajdzie taka potrzeba programista mo e zaimplementowa inne polecenia i doda

1 Warto zauwa y e w bdquoklasycznejrdquo obs udze LCD te nie musimy czyta stanu flagi busy zamiast tego

wystarczy wprowadza p tle opoacute niaj ce Jednak poniewa taka obs uga blokuje MCU nie jest onazalecana Wady tej nie ma dost p transakcyjny co jest jego dodatkow zalet

Kup książkę Poleć książkę

64 AVR Uk ady peryferyjne

kod odpowiedzialny za ich obs ug Zauwa my e ka da transakcja musi zawieraadres pocz tku pami ci wideo od ktoacuterego b dzie zapisywany tekst Dzieje si takdlatego e transakcja wykonana wcze niej mo e ustawi wska nik zapisu na dowolnejkomoacuterce pami ci W efekcie tekst z kolejnej transakcji by by wy wietlany od komoacuterkina ktoacuterej zako czy si zapis poprzedniej transakcji Takie dzia anie oczywi cie jestniedopuszczalne st d te ka dy zapis do pami ci wideo poprzedza ustawienie rejestruindeksowego Problem ten mo na rozwi za tak e w inny sposoacuteb mdash poprzez wpro-wadzenie tzw uchwytoacutew (ang handlers) ktoacutere zawiera yby stan kontrolera LCDNiemniej to rozwi zanie dodatkowo komplikowa oby nasz sterownik Struktura danych(zawartych w polu data) ma wi c nast puj cy format

bajt nr 0 zawiera warto pozycji od ktoacuterej nale y dokonywa zapisu pami ciwideo mdash jest to warto przesy ana do rejestru okre laj cego adres zapisu

kolejne bajty zawieraj a cuch znakowy ktoacutery nale y umie ci w pami ciCGRAM

Poniewa bajt nr 0 zawsze zawiera warto wpisywan do rejestroacutew steruj cych kon-trolera podczas jego wysy ania jest ustawiana linia RS sygnalizuj ca zapis do rejestruPodczas wysy ania kolejnych bajtoacutew linia ta jest zerowana w zwi zku z czym zapisodbywa si do pami ci CGRAM

Kod obs uguj cy transakcj wygl da nast puj coif(trans) Jest transakcja do zrealizowania uint8_t dat=trans-gtdata[seqpos] if(seqnibble == 0) datgtgt=4 To trzeba zmieni je li linie danych nie s po czone z pinami 0 ndash 3 portu IO hd44780_outnibble_nowait(dat amp 0x0F seqpos = 0) Zapisujemy rejestr steruj cy lub dane ++seqnibble if(seqnibble == 0) ++seqpos Co drug tetrad zwi kszamy pozycj bufora if(seqpos gt= trans-gtlen) trans-gtReady=true Koniec transakcji if(trans-gtSelfDel) free_re(trans) Zwolnij pami transakcji je li tak sobie yczy programista trans=NULL Koniec transakcji CLR(OUT HD44780_E)

Ta cz przerwania wysy a kolejne tetrady do kontrolera LCD Warto zastanowi sinad dzia aniem sekwencji

++seqnibble

Poniewa pole nibble jest jednobitowe operacja inkrementacji prowadzi do zmianystanu tego pola na przeciwny (pole to ma warto 0 lub 1) Kiedy zostan wys anewszystkie dane przeznaczone dla kontrolera obs uga transakcji ko czy si Stan tensygnalizuje nadanie warto ci true polu Ready struktury LCD_trans Dzi ki temu pro-gram mo e sprawdzi asynchronicznie w stosunku do przerwania kiedy transakcjauleg a zako czeniu Opcjonalnie jest wykonywana jeszcze jedna funkcja mdash je li poleSelfDel ma warto true to pami zarezerwowana na transakcj jest automatycznie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 65

zwalniana W tym celu wykorzystuje si funkcj free_re ktoacuterej prototyp jest zade-klarowany w pliku Alloc_safeh Funkcja ta wywo uje funkcj biblioteczn free ktoacute-ra zwalnia pami przydzielon dynamicznie na stercie Poniewa funkcja ta nie jestfunkcj reentrant nale y stworzy odpowiedni bdquoprotez rdquo opakowuj c j w blokatomowy co zapewnia e nie zostanie ona ponownie wywo ana zanim jej poprzed-nia instancja nie zako czy dzia ania Oczywi cie lepszym rozwi zaniem by oby napi-sanie w asnych funkcji dynamicznej alokacji pami ci ktoacutere b d reentrant

Bardzo wa ne jest aby pole SelfDel mia o warto true wy cznie dla transakcjidla ktoacuterych pami zosta a przydzielona dynamicznie funkcj malloc (lub jej po-chodnymi) W pozosta ych przypadkach pole to musi mie warto false mdash nie-stosowanie si do tej regu y spowoduje b d mened era pami ci i najprawdopo-dobniej nieprzewidywalne dzia anie programu

Drug wa n zasad jest aby zmienna zawieraj ca dane transakcji nie by azmienn automatyczn mdash zmienne takie s automatycznie niszczone po opusz-czeniu zawieraj cej je funkcji W rezultacie obszar pami ci zawieraj cy danetransakcji mo e zosta wykorzystany przez inne zmienne co spowoduje uszkodzeniezawartych w nim danych

Pami przydzielona transakcji musi by alokowana w sposoacuteb dynamiczny (funkcjamalloc_re) ewentualnie mo e to by pami alokowana dla zmiennej globalnej lubstatycznej mdash zmienne tego typu istniej przez ca y czas ycia programu

Warto te zauwa y e instrukcje steruj ce stanem linii Enable kontrolera LCD(SET(OUT HD44780_E) i CLR(OUT HD44780_E)) s rozdzielone wieloma innymi in-strukcjami Dzi ki temu generowany impuls dodatni tego sygna u ma czas trwania gt230 ns wymagany w specyfikacji kontrolera Nawet dla XMEGA taktowanej zegarem32 MHz 230 ns przek ada si na oko o 7 instrukcji asemblera mdash czas jaki z pewno-ci up ynie pomi dzy wykonaniem obu powy szych instrukcji steruj cych

Do wysy ania danych do kontrolera zosta a wykorzystana nieco zmodyfikowanafunkcja hd44780_outnibble_nowait roacute ni ca si od jej protoplasty hd44780_outnibbletylko tym e nie czeka na sygna braku zaj to ci mikrokontrolera (nie realizuje teopoacute nie ) Nie jest to potrzebne gdy kolejne tetrady s wysy ane w odst pach cza-sowych okre lanych przez timer

Mamy wi c zapewnion obs ug transakcji i mo liwo transakcyjnego wy wietlaniadanych na LCD musimy jeszcze mie funkcj ktoacutera tworzy odpowiednie transakcjemdash jest odpowiednikiem funkcji bezpo rednio wysy aj cej dane znakowe do LCDOdpowiednikiem tym jest pokazana poni ej funkcja

bool LCD_PutText_B(uint8_t x uint8_t y char txt LCD_trans buf bool autodel) buf-gtcmd=LCD_Text buf-gtReady=false buf-gtSelfDel=autodel Czy zwolni pami po zako czeniu transakcji buf-gtdata[0]=HD44780_DDADDR(x+y0x40) Ustaw adres w DDRAM strcpy((char)ampbuf-gtdata[1] txt) Skopiuj dane tekstowe + NULL

Kup książkę Poleć książkę

66 AVR Uk ady peryferyjne

buf-gtlen=strlen(txt) + 1 D ugo tekstu + pozycji + NULL ndash 1 bool ret=cbAdd(ampLCD_TransBuffer buf) if((ret==false) ampamp (autodel)) free_re(buf) Brak miejsca w kolejce else TCD0_CTRLA=TC_CLKSEL_DIV1_gc Preskaler 1 mdash odblokuj timer return ret

Funkcja ta buduje transakcj odpowiedzialn za wy wietlenie napisu txt na wskaza-nej pozycji x y LCD Wszystkie dane o transakcji zostan umieszczone w buforzew pami ci ktoacuterej adres jest okre lany wska nikiem buf Pami w buforze musi bywystarczaj co du a aby pomie ci ca transakcj Dodatkowy parametr autodel okre laczy pami ta ma by automatycznie zwalniana po obs u eniu transakcji (true) czynie (false) Je li transakcj uda o si umie ci w kolejce funkcja zwraca true Wartozauwa y e w takim przypadku funkcja uruchamia te timer (w naszym przypadkujest to timer TCD0) odpowiedzialny za generowanie przerwania Funkcja obs ugi prze-rwania wysy a dane do LCD

Pewn odmian powy szej funkcji jest funkcjabool LCD_PutText(uint8_t x uint8_t y char txt) LCD_trans trans=malloc_re(sizeof(LCD_trans) + strlen(txt) + 2) bool ret=LCD_PutText_B(x y txt trans true) return ret

Wykorzystuje ona funkcj LCD_PutText_B z tym e najpierw alokuje dynamiczniepami potrzebn na przechowanie tworzonej transakcji

Mamy komplet potrzebnych funkcji a wi c sprawd my jak ca o sprawdza siw praktyce W pliku LCD-transactc znajduje si kod pokazuj cy jak dzia aj naszetransakcje Aby to by o mo liwe nale y zainicjalizowa kontroler LCD

LCD_init()

Wykorzystujemy tu znan ju funkcj inicjalizuj c mdash nie ma potrzeby jej zmienia gdy operacja inicjalizacji LCD jest jednorazowa i nie trzeba wykonywa jej w posta-ci transakcji W drugim kroku musimy zainicjalizowa wykorzystywany timer i systemprzerwa

LCD_Timer_init(ampTCD0)PMIC_CTRL|=PMIC_LOLVLEN_bm Odblokuj przerwania niskiego poziomusei()

Poniewa dost p do LCD z pewno ci nie jest czynno ci krytyczn czasowo prze-rwaniom timera nadano najni szy priorytet Dzi ki temu mo na innym bardziej kry-tycznym przerwaniom nada wy sze priorytety i uzyska w ten sposoacuteb zmniejszenieczasu latencji obs ugi przerwa Sama inicjalizacja timera jest niezwykle prosta

void LCD_Timer_init(TC0_t tc) tc-gtINTCTRLA=TC_OVFINTLVL_LO_gc Odblokuj przerwania nadmiaru timera i nadaj im niski priorytet tc-gtPER=F_CPULCD_ACCESSTIME Przerwanie co 4 us (niezale nie od F_CPU)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 67

Sprowadza si ona tylko do odblokowania mo liwo ci zg aszania przerwania nadmia-ru oraz konfiguracji rejestru PER tak aby przerwania by y generowane co ok 4 s mdashniezale nie od cz stotliwo ci taktowania CPU Mo emy wi c przyst pi do wy wie-tlenia pierwszego napisu

LCD_PutText(00 Numer)

Powy sza funkcja ma jedn wad mdash alokuje dynamicznie pami po ka dym wywo-aniu (pami ta jest automatycznie zwalniana po obs u eniu transakcji) niemniej

ca y proces jest czasoch onny Mo emy tego unikn alokuj c pami bdquor cznierdquo i wielo-krotnie wykorzystuj c zaalokowany blok pami ci Ilustruje to poni szy przyk ad

LCD_trans buf=malloc_re(sizeof(LCD_trans) + 7)

Zmienna buf wskazuje na obszar pami ci ktoacutery mo e pomie ci a cuch 5-znakowyTyle wystarczy na potrzeby tego przyk adu mdash na LCD b d wy wietlane kolejneliczby w zakresie 0 ndash 65 535 najd u sza ma 5 znakoacutew st d te nasz bufor ma tak a nieinn d ugo

while(1) utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(60 bufstr buf false) while(LCD_IsTransCompleted(buf))

Do konwersji liczby na a cuch u yto funkcji bibliotecznej utoa (nag oacutewek stdlibh)Poniewa d ugo a cucha po konwersji jest zmienna (co spowodowa oby pozosta-wianie na LCD bdquoduchoacutewrdquo po poprzednich konwersjach) w kolejnej linii brakuj ceznaki uzupe niono spacjami Nast pnie tworzona jest transakcja w obszarze pami ciprzydzielonym zmiennej buf Ostatnia p tla while jest odpowiedzialna za oczekiwa-nie na zako czenie realizacji transakcji Po jej zako czeniu p tla jest wykonywana odpocz tku

Uwa ny czytelnik z pewno ci zauwa y e pami przydzielana funkcj malloc_renie jest nigdzie zwalniana mdash w normalnej sytuacji spowodowa oby to wyciek pami -ci W naszym przyk adzie jednak program nigdy si nie ko czy nie ma wi c potrzebyzwalniania pami ci wskazywanej przez zmienn buf

Powy szy przyk ad pokazuje jak unikn blokowania CPU na czas dost pu do wolnodzia aj cego urz dzenia jakim jest LCD alfanumeryczny Jednak to nie wszystkiezalety wynikaj ce z zastosowania transakcji Drug wa n zalet naszego rozwi zaniailustruje przyk ad znajduj cy si w katalogu PrzykladyLCD-alfaLCD-transact-intPowa nym ograniczeniem funkcji odpowiedzialnych za dost p do LCD w sposoacutebklasyczny by a niemo no ich wywo ywania z funkcji obs ugi przerwa mdash funkcjeobs ugi LCD nie by y reentrant2 Nasz system oparty na transakcjach nie ma tychwad Aby to zilustrowa zosta stworzony prosty przyk ad mdash tak jak poprzedniow p tli g oacutewnej programu s wy wietlane stale kolejne liczby ale jednocze nie wyko-

2 Poza tym blokowa y CPU na d ugi czas a jak pami tamy funkcje obs ugi przerwa powinny by

wykonywane mo liwie kroacutetko

Kup książkę Poleć książkę

68 AVR Uk ady peryferyjne

rzystano drugi timer (TCD1) w ktoacuterego funkcji obs ugi przerwania przepe nienia jestwy wietlany licznik tych przerwa

ISR(TCD1_OVF_vect) static char int_buf[sizeof(LCD_trans) + 7] static uint16_t cnt char bufstr[6]

utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(61 bufstr (LCD_trans)ampint_buf false)

Jak widzimy w sposoacuteb asynchroniczny z dwoacutech miejsc w programie mo emy uzy-ska dost p do LCD a ka da funkcja bdquoma wra enierdquo e ma LCD na wy czno Przy okazji warto przeanalizowa sposoacuteb w jaki jest rezerwowana pami na trans-akcj w przerwaniu Oczywi cie mo na by wykorzysta dynamiczn alokacj pami cilecz jak wspomniano taka alokacja jest czasoch onna St d te w pokazanym przy-k adzie wykorzystano tablic statyczn int_buf o rozmiarze umo liwiaj cym prze-chowanie kompletnej transakcji Dzi ki temu e zmienna int_buf jest zmienn statycz-n nie jest ona niszczona po zako czeniu funkcji obs ugi przerwania Gdyby pomins owo kluczowe static zmienna ta by aby niszczona a na LCD najprawdopodobniejzacz yby si pojawia przypadkowe tre ci Poniewa pami naszego bufora nie by aalokowana dynamicznie nie mo e ona zosta zwolniona w naszym sterowniku LCDst d te ostatni parametr wywo ania funkcji LCD_PutText_B musi mie warto false

OptymalizacjaPrzy okazji tego i poprzedniego przyk adu warto zastanowi si jeszcze nad jednkwesti mdash optymalizacji W podanych przyk adach wykorzystano wcze niej omoacute-wione funkcje dost pu do wy wietlacza LCD znajduj ce si w plikach hd44780ci hd44780h Wi kszo z zawartych tam funkcji nie jest wykorzystywana jednakkompilator mimo wszystko umieszcza ich kod w pliku wynikowym mdash dzieje si takponiewa nie mo e on bdquostwierdzi rdquo czy funkcje te nie s wykorzystywane w innychfragmentach programu Pami tajmy e kompilator kompiluje poszczegoacutelne pliki roacute-d owe osobno i dana jego instancja nie bdquowierdquo co znajduje si w innych plikach (innychjednostkach kompilacji) Tak ca o ciow wiedz ma dopiero konsolidator (linker)ktoacutery czy stworzone przez kompilator pliki obiektowe (o rozszerzeniu o) w plikwynikowy Linker jednak bdquonie wierdquo ktoacutera z funkcji programu zosta a u yta a ktoacuteranie mdash informacje te ma wy cznie kompilator W ten sposoacuteb powstaje typowe b dneko o w efekcie nasze nieu ywane funkcje nie s usuwane (linker zostawia je bdquonawszelki wypadekrdquo) i zajmuj niepotrzebnie pami Czy mo na temu jako zaradzi Oczywi cie tak W tym celu trzeba po czy si y kompilatora i linkera co zapewniaj od-powiednie opcje kompilacji We w a ciwo ciach projektu (ProjectProperties lub Alt+F7)wybieramy zak adk Toolchain a nast pnie AVRGNU C Compiler i OptimizationZnajdziemy tam pole wyboru o nazwie Prepare functions for garbage collection (ry-sunek 224)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 69

Rysunek 224 Aby da linkerowi mo liwo usuwania nieu ywanych funkcji nale y skompilowaprogram z wybran opcj ndashffunction-sections ktoacutera spowoduje e ka da funkcja programu znajdzie siwe w asnej sekcji

Zaznaczenie tej funkcji spowoduje umieszczenie ka dej funkcji w osobnej sekcji mdashsamo w sobie nie wp ynie to na skroacutecenie kodu wynikowego ale jest warunkiem nie-zb dnym dla podj cia stosownych dzia a przez linker Aby wyeliminowa nieu y-wane funkcje nale y zaznaczy jeszcze w ga zi AVRGNU LinkerOptimization poleGarbage collect unused sections (rysunek 225)

Rysunek 225 Zaznaczenie opcji Garbage collect unused sections (-Wl--gc-sections) spowodujee nieu ywane funkcje zostan usuni te z kodu wynikowego w efekcie kod programu ulegnie skroacuteceniu

Po zaznaczeniu tych opcji program zostanie skroacutecony o kilkaset bajtoacutew Oczywi cieje li wszystkie funkcje by yby wykorzystane nie uzyskaliby my adnego skroacuteceniakodu Niemniej w sytuacji gdy u ywa si bibliotek zazwyczaj przynajmniej czfunkcji nie jest wykorzystywana warto wi c skorzysta z tej mo liwo ci optymalizacji

Kup książkę Poleć książkę

70 AVR Uk ady peryferyjne

Je li mamy do czynienia z prekompilowan bibliotek (lib) to musi ona by skom-pilowana z zaznaczon opcj Prepare functions for garbage collection (-ffunction-sections) Alternatyw jest umieszczenie ka dej funkcji biblioteki w osobnym pliku(tak jak w przypadku bibliotek AVR-libc)

Na ekranie wyboru opcji optymalizacji linkera mamy jeszcze jedn przydatn opcjmdash Relax Branches (-mrelax) Dla mikrokontroleroacutew ktoacutere maj ponad 8 kB pami ciFLASH instrukcje skokoacutew s generowane jako tzw instrukcje d ugie mdash umo liwiajone skok do komoacuterki pami ci FLASH o dowolnym adresie Jednak cen za to jestwyd u enie instrukcji mdash ich kod jest d u szy podobnie jak czas wykonania Nie zawszejednak takie d ugie instrukcje musz by wykonywane mdash je li miejsce docelowe skokule y blisko (w zasi gu instrukcji skokoacutew wzgl dnych) to mo na w kodzie wynikowymzamieni instrukcje d u sze na kroacutetsze co przynosi oszcz dno ci w postaci skroacuteceniakodu wynikowego Poniewa dopiero linker bdquowierdquo jak poszczegoacutelne fragmenty kodus rozmieszczone w pami ci takiej podmiany mo na dokona na etapie linkowaniaprogramu co zapewnia powy sza opcja St d te warto to pole wyboru zaznaczy

Kup książkę Poleć książkę

SkorowidzA

ABI Application Binary Interface 25AC Address Counter 50ADPCM 482adres

bazowy 377bufora 61komoacuterki 84pu apki 202

ALE Address Latch Enable 368alfanumeryczne wy wietlacze 43algorytm ADPCM 492algorytmy stratne 495animacje 57antyaliasing 325architektury procesoroacutew XMEGA 352asembler 23

dyrektywy 40funkcje j zyka C 41obs uga przerwa 39

asynchroniczne wywo anie funkcji 101Atmel Studio 15

Bbajty kalibracyjne 569biblioteka

FATFS 131 139 176 180 517libcallback-liba 99PetitFS 144 149

bitADC_CH0START_bm 236IMPMODE 244

bitrate 442 512blokowanie przerwa 219b d 16 19

kwantyzacji 463offsetu 230wzmocnienia ADC 230

BOD 223bps bits per second 12

budowakarty 152linii obrazu 394pami ci SDRAM 374pliku stymulacji 192ramki PAL 412sygna u PAL 411wtyczki 544 545

bufor 78FIFO 497na transakcje 61transakcji 62

buforowanie wyj cia 294

CCAS Column Address Strobe 375CCFL 44charakterystyka

przetwornikoacutew 222termistora 264tryboacutew pracy 232

CID Card Identification 169CKE Clock Enable 375CLKIN 421COG Chip on Glass 310CRC 158 178CRC16 178CRC7 164CS Chip Select 361 375CSD Card Specific Data 172czas

dost pu do SDRAM 424adowania kondensatora 244

propagacji 281proacutebkowania 260symulacji 209

czcionki 322cz stotliwo

odchylania pionowego 428proacutebkowania 244 441 444 530przebiegu 504

Kup książkę Poleć książkę

576 AVR Uk ady peryferyjne

cz stotliwoPWM 465taktowania koprocesora 549taktowania procesora 209taktowania rdzenia 18

czyszczenie pami ci 318

DDAC Digital to Analog Converter 293 447 451

buforowanie wyj cia 294generowanie przebiegoacutew 301jitter 303kalibracja 306napi cie referencyjne 295system zdarze 297taktowanie 296tryb dwukana owy 301wykorzystanie DMA 298wyzwalanie konwersji 305

datalogger 261 265 275DD Device Density 86debuger 183

programowy 190sprz towy 185 187

decymacja 259DEBUG 219XMEGA 260

definicja symboli globalnych 36definiowanie w asnych znakoacutew 56deklaracja zapowiadaj ca 103 337dekoder DTMF 548 556DMA 254 298 402 458 518 523dost p do

danych 358 359 568danych binarnych 356 360danych wielobajtowych 31DataFLASH 137EEPROM 128FAT 136komoacuterki 375LCD 59 62 66 68operandu 30pami ci 81 384 386 387 561pami ci SDRAM 424pliku blokowy 141portoacutew IO 30rejestroacutew IO procesora 36rejestroacutew uk adu 499SPI 95sygnatury u ytkownika 565 567wska nikoacutew 32

DQM Data Mask 375DSP Digital Signal Processor 535

DTMF 535 553dyktafon 529dynamiczna alokacja pami ci 516dyrektywa global 38dyrektywy asemblera 40dzia anie

DMA 255komparatora 280timeroacutew 400

d wi k 443

EEBI External Bus Interface 361EEPROM 207eliminacja jitteru 24emulacja RS232 139

FFAT File Allocation Table 128 131FAT32 128FATFS 180filtr

dolnoprzepustowy 491drugiego rz du 470pierwszego rz du 469trzeciego rz du 471

filtrowanie sygna u PWM 468firmware 565FLASH 207format

odpowiedzi 159polecenia 158protoko u 157

funkcja_delay_ms 17 219c_zero 42callback 106 341callback() 99DataFLASH_CSEnable 100DF_FinishBufWrite() 269disk_initialize 136disk_ioctl 181disk_status 136disk_write 138DMA_SPI_init 104DTMF_GetCode 553free_re 65GPIOR0_init 507hd44780_outcmd 51hd44780_outnibble_nowait 65LCD_defchar_P 57

Kup książkę Poleć książkę

Skorowidz 577

Menu_Click_Func 515Menu_Free 516Menu_Recorder 532Menu_Run 527MS_CreateRegEntry 117MS_GetDirPos 125MS_GetRegItem 115MS_WritePages 116 118OSC_wait_for_rdy 473RecMenu_StartStop 532sprintf 142strtok 124sysclk_init() 200 209TMF_memcpy_PF 454udi_cdc_getc() 123udi_cdc_is_rx_ready() 123VS1003_Reset 506

funkcjeanalizuj ce 556biblioteczne 50biblioteki FATFS 143j zyka C 41kontrolera ST7565R 313opoacute niaj ce 17opoacute nie 219reentrant 524specjalne kontrolera 319steruj ce 314zapisu 133

fusebit 557BODACT 560BODLEVEL 560BOOTRST 559DVSDON 560EESAVE 561JTAGEN 558RSTDISBL 559SUT 559TOSCSEL 559

fusebity w AVR-libc 571

Ggenerator obrazu composite 426generowanie

d wi ku 461kolorowego obrazu 437obrazu wideo 391przebiegoacutew 301przerwa 285sygna u composite 409

g bia koloru 326gniazdo

karty SD 156VGA 396

Hhistereza 281

IIDE 11IMA ADPCM 483informacje

o kolorze 431o obrazie 434

inicjalizacjakarty 161karty SDHC 167karty SDSC 167karty SDXC 167licznika 419pami ci 119USART 505

instrukcjaicall 42movw 35nop 13 24

interfejsSCI 498SDI 498SPI 71 79RS232 120UART 123USART 71 73

interpolacja 259interpolacja w XMEGA 260inwersja obrazu 319

Jjednostki 12jitter 24 303 420

Kkalibracja

ADC 229DAC 306 564offsetu 237

kana DMA 82 522karta 154 158

mikroSD 152SD 151 152SDHC 151 152 160SDSC 160SDXC 151 160

Kup książkę Poleć książkę

578 AVR Uk ady peryferyjne

karty pami ci 151 152 157biblioteka FATFS 180budowa 152format polecenia 158inicjalizacja 161 167komunikacja 156odczyt danych 173opcje konfiguracyjne 181rejestry specjalne 169tryby pracy 153zapis danych 176zasilanie 154

kodasemblerowy 23 24C 23dost pu 24

kodowanieμ-law 481ADPCM 483Dialogic ADPCM 494informacji 166 426koloru 425znakoacutew 536

kodyformatoacutew audio 501zdarze 545

kolejno bajtoacutew 533kolor 424 430kolorowy obraz 437komparator 422

analogowy 279 280analogowy XMEGA 282okienkowy 284

kompilacja plikoacutew binarnych 350kompilator avr-gcc 11 359kompresja

ADPCM 482 486d wi ku 480IMA ADPCM 482

komunikacja z koprocesorem 504konfiguracja

4-portowa 364biblioteki 133debugera 185DMA 459 522fusebitoacutew 570kontrolera DMA 257 452komparatoroacutew 285lockbitoacutew 570LPC 371pami ci SDRAM 381PetitFS 149pinu IO 225portoacutew IO 362

preskalera 452projektu 186przerwa 219pu apki 203rejestru EVCTRL 248rejestru PER 67SPI 75sygna u CS 377typu czcionki 324urz dze IO 189USART 76zegara 383

konsolidacja 547kontroler

DMA 254 298 402 458 518 523KS108 310ST7565R 310ndash315 321

konwersjaDAC 305sygna oacutew 396wyzwalana 306

konwertercyfrowo-analogowy 426DAC 427

koprocesormp3 496VS1003B 10

korekcja fazy 466kwantyzacja 463

Llampa CCFL 44LE Latch Enable 433licznik 419

cykli 209TCC1 400timera 20

linie IO 50linie sygna owe

MISO 72 164MOSI 72SCK 72SS 72

linker 69lista

mnemonikoacutew 24modyfikowanych rejestroacutew 32

lockbity 557 561lockbity w AVR-libc 570LPC Low Pin Count 371LPCM 443 556LSB Least Significant Bit 228

Kup książkę Poleć książkę

Skorowidz 579

a cuchy formatuj ce 212czenie plikoacutew 352

Mmagistrala pami ci zewn trznej 361magnetofon cyfrowy 528makro _SFR_IO_ADDR() 39makrodefinicja

ASSERT 214HD44780_CGADDR() 53HD44780_CLR 53HD44780_DDADDR() 53HD44780_DISPCTL() 52HD44780_ENTMODE() 52HD44780_FNSET() 52HD44780_HOME 53HD44780_SHIFT() 51LOCKBITS 571

mapowanie sygna oacutew 366mapy bitowe 343marker czasowy 268maski bitowe 329matryce 49menu 335menu piktogramowe 342mierniki temperatury 262mikrokontroler

ARM 9AVR 9PIC 9XMEGA128A3U 10

MISO 72moc wydzielana 265model psychoakustyczny 495modu

alfanumeryczny 45NVM 568Xmega eXploreGO 10Xplained ATXMEGA A3BU 10Xplained ATXMEGA-A1 10Xplained XMEGA128A1 447Xplained XMEGA256A3 94Xplained XMEGA256A3BU 97 143 266

modyfikator 30const 85volatile 28 273

monitory CRT 395monochromatyczne wy wietlacze graficzne 309monochromatyczny

tryb graficzny 416tryb tekstowy 413

MOSI 72mp3 495Msps Megasamples per second 12multiplekser wej ciowy 226 283multipleksowanie adresoacutew 368 369muzyka 439

Nnadawanie kodoacutew DTMF 540nadproacutebkowanie 258nag oacutewek kontenera wav 500nagrywanie mowy 486najmniej znacz cy bit 228napi cie

offsetu 280referencyjne 223 295zasilania 239

Oobracanie obrazu 319obraz 319

composite 426kolorowy 430wideo 391

obroacutebka d wi ku 443 445obs uga

FAT 131 143klawiatury matrycowej 24LCD 58 63 67menu 337przerwania 37 38 458przerwania DMA 525przerwa w asemblerze 39przyciskoacutew 272wy wietlaczy alfanumerycznych 45

odczytblokowy 140danych 173 358

odpowied response 159R1 159R2 159R7 160

od wie anie pami ci 376odtwarzanie

d wi ku 472muzyki 447 513 518 521

offset 238offset ADC 230okno

Breakpoints 202Call stack 209dezasemblera 210

Kup książkę Poleć książkę

580 AVR Uk ady peryferyjne

oknoIO View 207podgl du zmiennych 211wyboru czcionek 324

OLED 46opcje

kompilatora 35zapisu d wi ku 445

operacjena buforach 91odczytu 173zapisu 176zapisu strony 92

operand 29operator

ascii 41

asciz 41

byte 41

section 41opoacute nienia 13 18opoacute nienie zmienne 16optymalizacja 16 68optymalizator 26organizacja pami ci 77organizacja pami ci VRAM 316oscylator 287OSD On-Screen Display 417ostrze enie 16oszcz dzanie energii 94

Ppakiet WinAVR 48pami

CGRAM 56 57 64DataFLASH 10 77 81 113 269DDRAM 49EEPROM 111FLASH 54 124 207RAM 49SDRAM 372SRAM 63 124 329 366 371VRAM 314 317

PCLK 421PCM 443PetitFS 144 149p tla

for 13while 201

pierwsza linia obrazu 321piksel 430piktogram 342pin IO 225

plikAlloc_safeh 65DataFLASHc 83DataFLASHIOc 136definesh 50delayh 14diskioh 132 136ffh 132ffconfh 132 181hd44780h 49integerh 132ioh 30LCD_transc 61LCD-transactc 66Makefile 14Menuc 19nothingo 541outfiletxt 547 551pffh 149SPIh 104stringh 113stymulacji 191 192

pliki mp3 495elf 351fon 323o 24S 24 34binarne 350 355csv 276d wi kowe 440obiektowe 352wav 500WMA 512z czcionkami 327z danymi 349

podbijacz napi cia 315podgl d

pami ci 207stosu wywo a 209zmiennych 211znakoacutew 325

pod czeniefototranzystora 262karty SD 155LCD z kontrolerem 311modu u 50pami ci 362 369 370 373termistora 262uk adu LM35 251wyj XMEGA 398

pod wietlenieCCFL 46OLED 46

Kup książkę Poleć książkę

Skorowidz 581

podwoacutejne buforowanie 255 332 457polecenia

kasowania strony 81konfiguracyjne pami ci 82kontrolera ST7565R 315odczytu bufora 82 89odczytu pami ci 81 88SDRAM 376transferu 91

polecenieACMD41 168cd 181CID 178CMD0 165CMD8 167CSD 178date 276dir 127 181dump 276erase 276get 276HD44780_CLR 51Init 178mkdir 181

po czenieDMA ze SPI 96dwoacutech komparatoroacutew 285koprocesora mp3 497LCD z mikrokontrolerem 48wyj cia XMEGA 411XMEGA z PC 121z telewizorem 431

pomiarnapi cia zasilania 239temperatury MCU 241

port IO 30 362pozycjonowanie grafik 345poacute obraz 410precyzja pomiaroacutew 260preskaler 478preskaler ADC 243program

Atmel Data Visualizer 275Audacity 443avr-objcopy 350dataloggera 265LCD Image Converter 323makeloadingtableexe 543Realterm 127 554riffstrip 483SoX 445Tracepoint 208

programowanie sygnatury u ytkownika 566protokoacute master-slave 157

prototypy 136proacutebki d wi kowe 447proacutebkowanie

8-bitowe 300nieliniowe 480

prymitywy graficzne 330przebieg PWM 468przebiegi 289 303przechwytywanie danych 276przemiatanie wej 253przerwanie 218 254 286 403

DMA 522komparatora 286

przestrze adresowa procesora 378przesy anie

danych 498polece 498

przetaktowanie procesora 436przetwornik

ADC 221analogowo-cyfrowy 221cykliczny 222potokowy 222

przyciski 272pseudooperatory 41pu apki breakpoints 197pu apki warunkowe 205punkty ledzenia 203PWM 461 462 472

RRAS Row Address Strobe 375redukcja poboru energii 242regulacja kontrastu 321rejestr 32 34rejestr AC 50

adresu wtyczki 513BASEADDR 377CID 169CMP 251CSD 172czasu utworu 512DATA 83EVCTRL 248formatu audio 512identyfikacyjny pami ci 87INTFLAGS 252kontroli basoacutew 510kontroli g o no ci 513MUXCTRL 227OCR 168PER 67poroacutewnania 249

Kup książkę Poleć książkę

582 AVR Uk ady peryferyjne

rejestr ACSCI_CLOCKF 511stanu komparatora 287stanu pami ci 86stanu uk adu 510trybu pracy 508WINCTRL 285

rejestrydost pu do pami ci RAM 513GPIOR 502IO procesora 36mikrokontrolera 25procesora 35specjalne 94specjalne karty 169uk adu VS1003B 508

relacja rodzic ndash dziecko 336reset uk adu 534rozdzielczo

LCD 329przetwornika 231PWM 463 477

rozszerzenie HiRes 477 479roacutewnanie Steinharta-Harta 263rysowanie map bitowych 343

Sschemat uk adu dataloggera 267SCI Serial Command Interface 498SCK 72SD Secure Digital 152SDI Serial Data Interface 498separator synchronizacji 422separowanie impulsoacutew synchronizacji 422shieldy 10skaler 422skaler napi cia 283skrypt makefile 353s owo kluczowe

asm 27extern 37static 68

specyfikatory lokalizacji zmiennej 213sps samples per second 12SS Slave Select 72standard PAL 410standard VGA 393sterowanie

dataloggerem 275sygna em 379

sterownik 121HD44780 49 56LCD 49 62

stos wywo a 209

strukturaFATFS 139Handle 118LCD_trans 60 63menu 338rejestru 86SimpleFSEntry 113 116SimpleFSHandle 113 118 140submenu 527systemu plikoacutew 112

sumabitowa 571kontrolna 178

sygnacomposite 409composite video output 430CS 377DREQ 497H-Sync 396synchronizacji 423V-Sync 396zegarowy CLK 374

sygna yinterfejsu EBI 363magistrali EBI 364steruj ce 375

sygnaturaprodukcyjna procesora 563u ytkownika 565

symbol__DELAY_ROUND_CLOSEST__ 17__DELAY_ROUND_DOWN__ 17_FS_FAT12 149_FS_FAT32 149_FS_MINIMIZE 133_FS_READONLY 133_FS_RPATH 135_FS_TINY 133_MAX_SS 135_MULTI_PARTITION 135_USE_DIR 149_USE_FASTSEEK 134_USE_FORWARD 134_USE_LABEL 134_USE_LFN 134_USE_LSEEK 149_USE_MKFS 134_USE_READ 149_USE_STRFUNC 134_USE_WRITE 149_VOLUMES 136F_CPU 14 15 18increment 36USE_BUSY_FLAG 50

Kup książkę Poleć książkę

Skorowidz 583

symboleglobalne 36w asemblerze 28zewn trzne 39

symulacja 198 209symulator 190synchronizacja

pami ci 331pionowa 395pozioma 394

systemplikoacutew 111 128przerwa 404zdarze 245

szablonfont_XMEGAtmpl 326image_XMEGAtmpl 343

szum 463szybko przesy ania danych 126

ledzenie wi zki 333rodowisko

graficzne 11programistyczne 11VSIDE 542WinAVR 47

Ttabela FAT 130tablica

framebuf 402 408plugintbl 552 555tekst 208z kodem wynikowym 543

taktowanieDAC 296mikrokontrolera 473

technologia OLED 44temperatura mikrokontrolera 239 241termistor 262 290

NTC 263PTC 263

termometrLM35 249 250z alarmem 251

termostat 290test uk adu VS1003B 503testowanie obrazu 319timer 16 62

TCC0 20

TCC1 399transakcja 59 62 65transakcje 17 103ndash107transakcyjna obs uga LCD 58transakcyjny dost p do SPI 95transfer 91

danych 97wynikoacutew 254

transmisja 72 83tryb

bez znaku 234ci g ej konwersji 252czterobitowy 153dwukana owy 301graficzny 416graficzny VGA 407idle 419jednobitowy 153LPC 371monochromatyczny 397 407oszcz dzania energii 94 306pracy multipleksera 226pracy SPI 157roacute nicowy 232single slope 312SPI 153tekstowy 413tekstowy VGA 397z pojedynczym wej ciem 234ze znakiem 235

trybygenerowania PWM 467pracy karty 153pracy przetwornika 231pracy SPI 74pracy uk adu 508

twierdzenie Nyquista 258tworzenie

adresu 84nak adek 417obrazu 335tablicy 543

typ__uint24 119karty 160niekompletny 60wyliczeniowy 114

typyoperandoacutew 29w AVR 34

Kup książkę Poleć książkę

584 AVR Uk ady peryferyjne

Uuchwyt handle 64 113uk ad

AD725 427 431buforowy 294CS 361DAC 284dataloggera 267detekcji awarii zasilania 559generuj cy obraz 393HiRes 477ICL7660 47LM35 250 251SampH 293sterowania sygna em 379USART 401VS1003B 496 503 508 530 538 556VS100XX 529wzmacniania sygna u 227

uk ady peryferyjne 9uruchomienie komparatora 287urz dzenie

master 72slave 72

u rednianie 259utrata danych 141u ycie wstawki asemblerowej 33

VVGA 393

Wwarto ci kalibracyjne

ADC 564oscylatoroacutew 564temperatury 564

warunkowa kompilacja 36WE Write Enable 375wej cie composite video input 425wektor przerwa 38 257wideo 391wielko pami ci 86 377w czenie DAC 299wska nik na struktur 27wska niki 32wstawki asemblerowe 24 33wtyczka 535 541 544

SineDTMF Generator 537VGA 396

wyboacuter cz stotliwo ci PWM 465 474wykorzystanie

DMA 254 518

EuroSCART 428PWM 461rejestroacutew 34

wyliczanie predyktora 489wy wietlacze

alfanumeryczne 43 45graficzne 43 309LCD 43OLED 46

wy wietlanielitera u 213map bitowych 344obrazu 333 346 406obrazu VGA 393

wywo ania zwrotne callbacks 98asynchroniczne 101synchroniczne 101

wyzwalanie konwersji 245wzmacniacz 446wzmacniacz operacyjny 279wzmacnianie sygna u 227

XXMEGA 9 18

Zzapis

bufora 269danych 176d wi ku 440 556

zasilaniekarty 154pami ci 109

zatrzask 368zatrzask 74HC573 433zatrza ni cie adresu 369zdarzenia 297zdarzenie compare match 399zegar 383 420 426zintegrowane rodowisko programistyczne 11z cze EuroSCART 425 428 429zmiana

g o no ci 527wielko ci strony 94

znaki 56

roacuted onapi cia odniesienia 284sygna u 240

Kup książkę Poleć książkę

Page 26: Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8 AVR. Ukäady peryferyjne Rejestry dost pu do pami ci RAM .....513 Rejestr adresu

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 61

dodawa do niego kolejnych transakcji W a ciwo t wykorzystuj dwie zdefiniowanew pliku LCD_transc funkcje

static inline bool cbIsFull(CircBuffer cb) return cb-gtCount == LCD_MAXTRANS

static inline bool cbIsEmpty(CircBuffer cb) return cb-gtCount == 0

Jak pami tamy w przypadku funkcji modyfikatory static inline powoduj e danafunkcja nie b dzie istnie jako samodzielna lecz w ka dym miejscu w ktoacuterym jestwywo ywana jest wstawiany raczej jej kod a nie wywo anie Ma to znaczenie dlakroacutetkich funkcji (a wi c takich jak pokazane powy ej) dla ktoacuterych koszty wywo anias zazwyczaj wi ksze ni koszty umieszczenia cia a funkcji w miejscu jej wywo aniaTego typu funkcje zachowuj si w sposoacuteb zbli ony do makrodefinicji (z tym e re-spektuj wszystkie regu y j zyka C w szczegoacutelno ci kolejno operatoroacutew czy kon-trol typoacutew)

Takie funkcje jako argument pobieraj adres bufora na ktoacuterym maj operowa W na-szym przypadku bufor jest zdefiniowany nast puj co

static CircBuffer LCD_TransBuffer Bufor na transakcje

Nale y zauwa y e jest on zdefiniowany jako struktura globalna z modyfikatoremstatic Modyfikator ten ogranicza zasi g widoczno ci zmiennej LCD_TransBuffer dopliku w ktoacuterym zmienna ta zosta a zdefiniowana (w tym przypadku modyfikator staticjest niejako przeciwie stwem modyfikatora extern) Dzia anie to ma jedynie znaczeniekosmetyczne mdash uniemo liwia odwo anie si do bufora za pomoc funkcji ktoacutere niezosta y zdefiniowane w miejscu jego definicji Oproacutecz funkcji umo liwiaj cych okre-lenie stanu bufora potrzebne s jeszcze funkcje umo liwiaj ce dodanie i pobranie trans-

akcji Pierwsz funkcj b dzie funkcja dodaj ca transakcj do buforabool cbAdd(CircBuffer cb LCD_trans elem) ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsFull(cb)) return false Czy jest miejsce w kolejce uint8_t end = (cb-gtBeg + cb-gtCount) LCD_MAXTRANS cb-gtelements[end] = elem Dodaj transakcj ++cb-gtCount Liczba elementoacutew w buforze return true Wszystko OK

Funkcja ta dodaje transakcj (zmienna elem) do bufora ko owego Zanim transakcjazostanie dodana sprawdzane jest czy w buforze jest miejsce mdash je li nie funkcjazwroacuteci false Je li dodanie jest mo liwe warto licznika okre laj cego liczb trans-akcji przechowywana w buforze (Count) zwi ksza si o jeden Warto zastanowi si te dlaczego praktycznie ca e cia o tej funkcji jest zamkni te w sekcji atomowej (ATOMIC_BLOCK) Jedn z cech naszego sterownika ma by mo liwo wspoacute bie nego dost pu

Kup książkę Poleć książkę

62 AVR Uk ady peryferyjne

do LCD mdash to znaczy e danie np zapisu do LCD mo e wyst pi zaroacutewno w g oacutewnejp tli programu jak i asynchronicznie w przerwaniu St d te wynika e funkcja do-daj ca transakcj musi by napisana w sposoacuteb zapewniaj cy jej poprawn prac w sytu-acji gdy zostanie ona przerwana i ponownie wywo ana przed zako czeniem dzia aniajej poprzedniej instancji Umieszczenie cia a tej funkcji w sekcji atomowej nam to za-pewnia mdash dzi ki temu bufor transakcji zawsze b dzie spoacutejny Dla zaspokojenia cie-kawo ci warto usun sekcj atomow i sprawdzi jak wtedy b dzie zachowywa si tafunkcja i jak wp ynie to na spoacutejno przechowywanych danych

Drug niezb dn funkcj jest funkcja odczytuj ca bufor transakcji i zwracaj ca trans-akcj do zrealizowania (lub NULL je li adnej transakcji nie ma w buforze)

LCD_trans cbRead(CircBuffer cb) LCD_trans elem ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsEmpty(cb)) return NULL Bufor pusty nie mo na zwroacuteci elementu elem = cb-gtelements[cb-gtBeg] cb-gtBeg = (cb-gtBeg + 1) LCD_MAXTRANS -- cb-gtCount Zmniejszamy liczb elementoacutew pozosta ych w buforze return elem

Funkcja ta jest bardzo podobna do poprzedniej mdash najpierw sprawdza czy bufor za-wiera jak oczekuj c transakcj (cbIsEmpty(cb)) je li tak to zwraca adres opisuj -cej j struktury i zmniejsza liczb transakcji oczekuj cych (pole Count) W ten sposoacutebmamy zrealizowan ca funkcjonalno zwi zan z obs ug bufora pier cieniowegoPokazane funkcje s uniwersalne i z bardzo podobnych (lub wr cz tych samych) b -dziemy korzysta w kolejnych rozdzia ach w kontek cie np obs ugi transakcji zwi -zanych z interfejsami szeregowymi

Pora przej do samego sterownika LCD Jego zadaniem b dzie sprawdzenie czyw buforze oczekuj jakie transakcje do realizacji a je li tak to ich wykonanie Ponie-wa dane do LCD mog by wysy ane co okre lony minimalny czas znacznie d u -szy ni czas jakiego na to zadanie potrzebuje mikrokontroler do wysy ania kolejnychpaczek danych pos u ymy si timerem Timer b dzie generowa przerwanie nadmiaru(TCD0_OVF_vect) ktoacutere b dzie wyznacza o tempo w jakim kolejne porcje danych b -d trafia y do LCD Z noty katalogowej kontrolera wynika e minimalny czas trwa-nia wysokiego stanu sygna u Enable to 230 ns a okres tego sygna u nie powinien bykroacutetszy ni 500 ns Poniewa nasz dost p do LCD odbywa si w sposoacuteb nieblokuj cyMCU wi c szybko wysy ania danych do LCD jest bez znaczenia St d te w poka-zanym przyk adzie przyj to e dane b d wysy ane co 4 s co okre la sta a

define LCD_ACCESSTIME 0000004

Poniewa komunikacja z LCD odbywa si w sposoacuteb nieblokuj cy nie zale y nam tena czasie (i tak w stosunku do czasu od wie ania samego LCD jest on bardzo kroacutetki)w efekcie nie ma potrzeby odczytywania flagi busy kontrolera Dzi ki temu w cz ciprzypadkoacutew mo emy w ogoacutele zrezygnowa z sygna u wyboru RW i wymusi jego sta y

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 63

poziom logiczny umo liwiaj cy zapis do LCD Dzi ki temu mo na zaoszcz dzi do-datkowy pin IO1

Ca a logika naszego sterownika jest zawarta w funkcji obs ugi przerwania przepe nieniatimera (TCD0_OVF_vect) Poniewa LCD jest po czony z MCU w trybie 4-bitowym(dla zaoszcz dzenia liczby wykorzystanych pinoacutew IO) kolejne 8-bitowe dane muszby podzielone na dwie tetrady i wys ane do LCD w kolejno ci starszam odsza tetradaInformacja o aktualnie wysy anych danych jest umieszczona w zmiennej trans o typie

static struct uint8_t pos 6 Pozycja w polu danych aktualnej transakcji uint8_t nibble 1 Ktoacutera tetrada jest wysy ana seq

Dlaczego tak Dzi ki wykorzystaniu struktury i poacutel bitowych mo na zaoszcz dzi je-den bajt pami ci SRAM Ze wzgl du na wielko pami ci obs ugiwanej przez kon-troler LCD mo emy by pewni e transakcje zawieraj ce wi cej ni 63 bajty s ra-czej nierealne (nie mia yby wi kszego sensu) St d te do przechowywania informacjio aktualnie wysy anym bajcie danych wystarczy 6 bitoacutew mdash tyle samo zosta o wyko-rzystanych do okre lenia d ugo ci pola danych transakcji w strukturze LCD_trans Zaosz-cz dzony bit mo na po wi ci na flag nibble okre laj c ktoacutera tetrada (m odszastarsza)jest wysy ana Bez poacutel bitowych flaga ta zaj aby dodatkowy bajt pami ci

Przejd my do implementacji sterownika Pierwsz rzecz jak nale y sprawdzi jestto czy w buforze czeka jaka transakcja do zrealizowania Odpowiedzialny za to jestfragment kodu obs ugi przerwania nadmiaru timera

if(trans == NULL) Nic do zrobienia sprawd my czy jaka transakcja oczekuje trans=cbRead(ampLCD_TransBuffer) Czy jest jaka oczekuj ca transakcja seqpos=0 seqnibble=0 if(trans == NULL) TCD0_CTRLA=TC_CLKSEL_OFF_gc Nie ma adnych transakcji mdash wy cz timer

W przypadku gdy adna transakcja nie oczekuje na realizacj timer jest wy czanymdash dzi ki temu nie b d zg aszane kolejne przerwania przepe nienia i MCU nie b -dzie traci czasu na ich obs ug Co prawda wynikaj cy z tego zysk czasowy jest mar-ginalny lecz ma to istotniejsz konsekwencj mdash w przypadku usypiania MCU zb d-ne przerwanie timera nie b dzie niepotrzebnie wybudza o procesora W takiej sytuacjiponowne w czenie timera nast pi dopiero w funkcji dodaj cej transakcj do kolejkimdash a wi c w sytuacji gdy mamy pewno e istnieje oczekuj ca transakcja

Druga cz funkcji obs ugi przerwania jest zwi zana z realizacj samej transakcjiW pokazanym przyk adzie zaimplementowano tylko jeden typ transakcji mdash daniezapisu a cucha tekstowego pod wskazany adres VRAM (na okre lonej pozycji LCD)Je li zajdzie taka potrzeba programista mo e zaimplementowa inne polecenia i doda

1 Warto zauwa y e w bdquoklasycznejrdquo obs udze LCD te nie musimy czyta stanu flagi busy zamiast tego

wystarczy wprowadza p tle opoacute niaj ce Jednak poniewa taka obs uga blokuje MCU nie jest onazalecana Wady tej nie ma dost p transakcyjny co jest jego dodatkow zalet

Kup książkę Poleć książkę

64 AVR Uk ady peryferyjne

kod odpowiedzialny za ich obs ug Zauwa my e ka da transakcja musi zawieraadres pocz tku pami ci wideo od ktoacuterego b dzie zapisywany tekst Dzieje si takdlatego e transakcja wykonana wcze niej mo e ustawi wska nik zapisu na dowolnejkomoacuterce pami ci W efekcie tekst z kolejnej transakcji by by wy wietlany od komoacuterkina ktoacuterej zako czy si zapis poprzedniej transakcji Takie dzia anie oczywi cie jestniedopuszczalne st d te ka dy zapis do pami ci wideo poprzedza ustawienie rejestruindeksowego Problem ten mo na rozwi za tak e w inny sposoacuteb mdash poprzez wpro-wadzenie tzw uchwytoacutew (ang handlers) ktoacutere zawiera yby stan kontrolera LCDNiemniej to rozwi zanie dodatkowo komplikowa oby nasz sterownik Struktura danych(zawartych w polu data) ma wi c nast puj cy format

bajt nr 0 zawiera warto pozycji od ktoacuterej nale y dokonywa zapisu pami ciwideo mdash jest to warto przesy ana do rejestru okre laj cego adres zapisu

kolejne bajty zawieraj a cuch znakowy ktoacutery nale y umie ci w pami ciCGRAM

Poniewa bajt nr 0 zawsze zawiera warto wpisywan do rejestroacutew steruj cych kon-trolera podczas jego wysy ania jest ustawiana linia RS sygnalizuj ca zapis do rejestruPodczas wysy ania kolejnych bajtoacutew linia ta jest zerowana w zwi zku z czym zapisodbywa si do pami ci CGRAM

Kod obs uguj cy transakcj wygl da nast puj coif(trans) Jest transakcja do zrealizowania uint8_t dat=trans-gtdata[seqpos] if(seqnibble == 0) datgtgt=4 To trzeba zmieni je li linie danych nie s po czone z pinami 0 ndash 3 portu IO hd44780_outnibble_nowait(dat amp 0x0F seqpos = 0) Zapisujemy rejestr steruj cy lub dane ++seqnibble if(seqnibble == 0) ++seqpos Co drug tetrad zwi kszamy pozycj bufora if(seqpos gt= trans-gtlen) trans-gtReady=true Koniec transakcji if(trans-gtSelfDel) free_re(trans) Zwolnij pami transakcji je li tak sobie yczy programista trans=NULL Koniec transakcji CLR(OUT HD44780_E)

Ta cz przerwania wysy a kolejne tetrady do kontrolera LCD Warto zastanowi sinad dzia aniem sekwencji

++seqnibble

Poniewa pole nibble jest jednobitowe operacja inkrementacji prowadzi do zmianystanu tego pola na przeciwny (pole to ma warto 0 lub 1) Kiedy zostan wys anewszystkie dane przeznaczone dla kontrolera obs uga transakcji ko czy si Stan tensygnalizuje nadanie warto ci true polu Ready struktury LCD_trans Dzi ki temu pro-gram mo e sprawdzi asynchronicznie w stosunku do przerwania kiedy transakcjauleg a zako czeniu Opcjonalnie jest wykonywana jeszcze jedna funkcja mdash je li poleSelfDel ma warto true to pami zarezerwowana na transakcj jest automatycznie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 65

zwalniana W tym celu wykorzystuje si funkcj free_re ktoacuterej prototyp jest zade-klarowany w pliku Alloc_safeh Funkcja ta wywo uje funkcj biblioteczn free ktoacute-ra zwalnia pami przydzielon dynamicznie na stercie Poniewa funkcja ta nie jestfunkcj reentrant nale y stworzy odpowiedni bdquoprotez rdquo opakowuj c j w blokatomowy co zapewnia e nie zostanie ona ponownie wywo ana zanim jej poprzed-nia instancja nie zako czy dzia ania Oczywi cie lepszym rozwi zaniem by oby napi-sanie w asnych funkcji dynamicznej alokacji pami ci ktoacutere b d reentrant

Bardzo wa ne jest aby pole SelfDel mia o warto true wy cznie dla transakcjidla ktoacuterych pami zosta a przydzielona dynamicznie funkcj malloc (lub jej po-chodnymi) W pozosta ych przypadkach pole to musi mie warto false mdash nie-stosowanie si do tej regu y spowoduje b d mened era pami ci i najprawdopo-dobniej nieprzewidywalne dzia anie programu

Drug wa n zasad jest aby zmienna zawieraj ca dane transakcji nie by azmienn automatyczn mdash zmienne takie s automatycznie niszczone po opusz-czeniu zawieraj cej je funkcji W rezultacie obszar pami ci zawieraj cy danetransakcji mo e zosta wykorzystany przez inne zmienne co spowoduje uszkodzeniezawartych w nim danych

Pami przydzielona transakcji musi by alokowana w sposoacuteb dynamiczny (funkcjamalloc_re) ewentualnie mo e to by pami alokowana dla zmiennej globalnej lubstatycznej mdash zmienne tego typu istniej przez ca y czas ycia programu

Warto te zauwa y e instrukcje steruj ce stanem linii Enable kontrolera LCD(SET(OUT HD44780_E) i CLR(OUT HD44780_E)) s rozdzielone wieloma innymi in-strukcjami Dzi ki temu generowany impuls dodatni tego sygna u ma czas trwania gt230 ns wymagany w specyfikacji kontrolera Nawet dla XMEGA taktowanej zegarem32 MHz 230 ns przek ada si na oko o 7 instrukcji asemblera mdash czas jaki z pewno-ci up ynie pomi dzy wykonaniem obu powy szych instrukcji steruj cych

Do wysy ania danych do kontrolera zosta a wykorzystana nieco zmodyfikowanafunkcja hd44780_outnibble_nowait roacute ni ca si od jej protoplasty hd44780_outnibbletylko tym e nie czeka na sygna braku zaj to ci mikrokontrolera (nie realizuje teopoacute nie ) Nie jest to potrzebne gdy kolejne tetrady s wysy ane w odst pach cza-sowych okre lanych przez timer

Mamy wi c zapewnion obs ug transakcji i mo liwo transakcyjnego wy wietlaniadanych na LCD musimy jeszcze mie funkcj ktoacutera tworzy odpowiednie transakcjemdash jest odpowiednikiem funkcji bezpo rednio wysy aj cej dane znakowe do LCDOdpowiednikiem tym jest pokazana poni ej funkcja

bool LCD_PutText_B(uint8_t x uint8_t y char txt LCD_trans buf bool autodel) buf-gtcmd=LCD_Text buf-gtReady=false buf-gtSelfDel=autodel Czy zwolni pami po zako czeniu transakcji buf-gtdata[0]=HD44780_DDADDR(x+y0x40) Ustaw adres w DDRAM strcpy((char)ampbuf-gtdata[1] txt) Skopiuj dane tekstowe + NULL

Kup książkę Poleć książkę

66 AVR Uk ady peryferyjne

buf-gtlen=strlen(txt) + 1 D ugo tekstu + pozycji + NULL ndash 1 bool ret=cbAdd(ampLCD_TransBuffer buf) if((ret==false) ampamp (autodel)) free_re(buf) Brak miejsca w kolejce else TCD0_CTRLA=TC_CLKSEL_DIV1_gc Preskaler 1 mdash odblokuj timer return ret

Funkcja ta buduje transakcj odpowiedzialn za wy wietlenie napisu txt na wskaza-nej pozycji x y LCD Wszystkie dane o transakcji zostan umieszczone w buforzew pami ci ktoacuterej adres jest okre lany wska nikiem buf Pami w buforze musi bywystarczaj co du a aby pomie ci ca transakcj Dodatkowy parametr autodel okre laczy pami ta ma by automatycznie zwalniana po obs u eniu transakcji (true) czynie (false) Je li transakcj uda o si umie ci w kolejce funkcja zwraca true Wartozauwa y e w takim przypadku funkcja uruchamia te timer (w naszym przypadkujest to timer TCD0) odpowiedzialny za generowanie przerwania Funkcja obs ugi prze-rwania wysy a dane do LCD

Pewn odmian powy szej funkcji jest funkcjabool LCD_PutText(uint8_t x uint8_t y char txt) LCD_trans trans=malloc_re(sizeof(LCD_trans) + strlen(txt) + 2) bool ret=LCD_PutText_B(x y txt trans true) return ret

Wykorzystuje ona funkcj LCD_PutText_B z tym e najpierw alokuje dynamiczniepami potrzebn na przechowanie tworzonej transakcji

Mamy komplet potrzebnych funkcji a wi c sprawd my jak ca o sprawdza siw praktyce W pliku LCD-transactc znajduje si kod pokazuj cy jak dzia aj naszetransakcje Aby to by o mo liwe nale y zainicjalizowa kontroler LCD

LCD_init()

Wykorzystujemy tu znan ju funkcj inicjalizuj c mdash nie ma potrzeby jej zmienia gdy operacja inicjalizacji LCD jest jednorazowa i nie trzeba wykonywa jej w posta-ci transakcji W drugim kroku musimy zainicjalizowa wykorzystywany timer i systemprzerwa

LCD_Timer_init(ampTCD0)PMIC_CTRL|=PMIC_LOLVLEN_bm Odblokuj przerwania niskiego poziomusei()

Poniewa dost p do LCD z pewno ci nie jest czynno ci krytyczn czasowo prze-rwaniom timera nadano najni szy priorytet Dzi ki temu mo na innym bardziej kry-tycznym przerwaniom nada wy sze priorytety i uzyska w ten sposoacuteb zmniejszenieczasu latencji obs ugi przerwa Sama inicjalizacja timera jest niezwykle prosta

void LCD_Timer_init(TC0_t tc) tc-gtINTCTRLA=TC_OVFINTLVL_LO_gc Odblokuj przerwania nadmiaru timera i nadaj im niski priorytet tc-gtPER=F_CPULCD_ACCESSTIME Przerwanie co 4 us (niezale nie od F_CPU)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 67

Sprowadza si ona tylko do odblokowania mo liwo ci zg aszania przerwania nadmia-ru oraz konfiguracji rejestru PER tak aby przerwania by y generowane co ok 4 s mdashniezale nie od cz stotliwo ci taktowania CPU Mo emy wi c przyst pi do wy wie-tlenia pierwszego napisu

LCD_PutText(00 Numer)

Powy sza funkcja ma jedn wad mdash alokuje dynamicznie pami po ka dym wywo-aniu (pami ta jest automatycznie zwalniana po obs u eniu transakcji) niemniej

ca y proces jest czasoch onny Mo emy tego unikn alokuj c pami bdquor cznierdquo i wielo-krotnie wykorzystuj c zaalokowany blok pami ci Ilustruje to poni szy przyk ad

LCD_trans buf=malloc_re(sizeof(LCD_trans) + 7)

Zmienna buf wskazuje na obszar pami ci ktoacutery mo e pomie ci a cuch 5-znakowyTyle wystarczy na potrzeby tego przyk adu mdash na LCD b d wy wietlane kolejneliczby w zakresie 0 ndash 65 535 najd u sza ma 5 znakoacutew st d te nasz bufor ma tak a nieinn d ugo

while(1) utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(60 bufstr buf false) while(LCD_IsTransCompleted(buf))

Do konwersji liczby na a cuch u yto funkcji bibliotecznej utoa (nag oacutewek stdlibh)Poniewa d ugo a cucha po konwersji jest zmienna (co spowodowa oby pozosta-wianie na LCD bdquoduchoacutewrdquo po poprzednich konwersjach) w kolejnej linii brakuj ceznaki uzupe niono spacjami Nast pnie tworzona jest transakcja w obszarze pami ciprzydzielonym zmiennej buf Ostatnia p tla while jest odpowiedzialna za oczekiwa-nie na zako czenie realizacji transakcji Po jej zako czeniu p tla jest wykonywana odpocz tku

Uwa ny czytelnik z pewno ci zauwa y e pami przydzielana funkcj malloc_renie jest nigdzie zwalniana mdash w normalnej sytuacji spowodowa oby to wyciek pami -ci W naszym przyk adzie jednak program nigdy si nie ko czy nie ma wi c potrzebyzwalniania pami ci wskazywanej przez zmienn buf

Powy szy przyk ad pokazuje jak unikn blokowania CPU na czas dost pu do wolnodzia aj cego urz dzenia jakim jest LCD alfanumeryczny Jednak to nie wszystkiezalety wynikaj ce z zastosowania transakcji Drug wa n zalet naszego rozwi zaniailustruje przyk ad znajduj cy si w katalogu PrzykladyLCD-alfaLCD-transact-intPowa nym ograniczeniem funkcji odpowiedzialnych za dost p do LCD w sposoacutebklasyczny by a niemo no ich wywo ywania z funkcji obs ugi przerwa mdash funkcjeobs ugi LCD nie by y reentrant2 Nasz system oparty na transakcjach nie ma tychwad Aby to zilustrowa zosta stworzony prosty przyk ad mdash tak jak poprzedniow p tli g oacutewnej programu s wy wietlane stale kolejne liczby ale jednocze nie wyko-

2 Poza tym blokowa y CPU na d ugi czas a jak pami tamy funkcje obs ugi przerwa powinny by

wykonywane mo liwie kroacutetko

Kup książkę Poleć książkę

68 AVR Uk ady peryferyjne

rzystano drugi timer (TCD1) w ktoacuterego funkcji obs ugi przerwania przepe nienia jestwy wietlany licznik tych przerwa

ISR(TCD1_OVF_vect) static char int_buf[sizeof(LCD_trans) + 7] static uint16_t cnt char bufstr[6]

utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(61 bufstr (LCD_trans)ampint_buf false)

Jak widzimy w sposoacuteb asynchroniczny z dwoacutech miejsc w programie mo emy uzy-ska dost p do LCD a ka da funkcja bdquoma wra enierdquo e ma LCD na wy czno Przy okazji warto przeanalizowa sposoacuteb w jaki jest rezerwowana pami na trans-akcj w przerwaniu Oczywi cie mo na by wykorzysta dynamiczn alokacj pami cilecz jak wspomniano taka alokacja jest czasoch onna St d te w pokazanym przy-k adzie wykorzystano tablic statyczn int_buf o rozmiarze umo liwiaj cym prze-chowanie kompletnej transakcji Dzi ki temu e zmienna int_buf jest zmienn statycz-n nie jest ona niszczona po zako czeniu funkcji obs ugi przerwania Gdyby pomins owo kluczowe static zmienna ta by aby niszczona a na LCD najprawdopodobniejzacz yby si pojawia przypadkowe tre ci Poniewa pami naszego bufora nie by aalokowana dynamicznie nie mo e ona zosta zwolniona w naszym sterowniku LCDst d te ostatni parametr wywo ania funkcji LCD_PutText_B musi mie warto false

OptymalizacjaPrzy okazji tego i poprzedniego przyk adu warto zastanowi si jeszcze nad jednkwesti mdash optymalizacji W podanych przyk adach wykorzystano wcze niej omoacute-wione funkcje dost pu do wy wietlacza LCD znajduj ce si w plikach hd44780ci hd44780h Wi kszo z zawartych tam funkcji nie jest wykorzystywana jednakkompilator mimo wszystko umieszcza ich kod w pliku wynikowym mdash dzieje si takponiewa nie mo e on bdquostwierdzi rdquo czy funkcje te nie s wykorzystywane w innychfragmentach programu Pami tajmy e kompilator kompiluje poszczegoacutelne pliki roacute-d owe osobno i dana jego instancja nie bdquowierdquo co znajduje si w innych plikach (innychjednostkach kompilacji) Tak ca o ciow wiedz ma dopiero konsolidator (linker)ktoacutery czy stworzone przez kompilator pliki obiektowe (o rozszerzeniu o) w plikwynikowy Linker jednak bdquonie wierdquo ktoacutera z funkcji programu zosta a u yta a ktoacuteranie mdash informacje te ma wy cznie kompilator W ten sposoacuteb powstaje typowe b dneko o w efekcie nasze nieu ywane funkcje nie s usuwane (linker zostawia je bdquonawszelki wypadekrdquo) i zajmuj niepotrzebnie pami Czy mo na temu jako zaradzi Oczywi cie tak W tym celu trzeba po czy si y kompilatora i linkera co zapewniaj od-powiednie opcje kompilacji We w a ciwo ciach projektu (ProjectProperties lub Alt+F7)wybieramy zak adk Toolchain a nast pnie AVRGNU C Compiler i OptimizationZnajdziemy tam pole wyboru o nazwie Prepare functions for garbage collection (ry-sunek 224)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 69

Rysunek 224 Aby da linkerowi mo liwo usuwania nieu ywanych funkcji nale y skompilowaprogram z wybran opcj ndashffunction-sections ktoacutera spowoduje e ka da funkcja programu znajdzie siwe w asnej sekcji

Zaznaczenie tej funkcji spowoduje umieszczenie ka dej funkcji w osobnej sekcji mdashsamo w sobie nie wp ynie to na skroacutecenie kodu wynikowego ale jest warunkiem nie-zb dnym dla podj cia stosownych dzia a przez linker Aby wyeliminowa nieu y-wane funkcje nale y zaznaczy jeszcze w ga zi AVRGNU LinkerOptimization poleGarbage collect unused sections (rysunek 225)

Rysunek 225 Zaznaczenie opcji Garbage collect unused sections (-Wl--gc-sections) spowodujee nieu ywane funkcje zostan usuni te z kodu wynikowego w efekcie kod programu ulegnie skroacuteceniu

Po zaznaczeniu tych opcji program zostanie skroacutecony o kilkaset bajtoacutew Oczywi cieje li wszystkie funkcje by yby wykorzystane nie uzyskaliby my adnego skroacuteceniakodu Niemniej w sytuacji gdy u ywa si bibliotek zazwyczaj przynajmniej czfunkcji nie jest wykorzystywana warto wi c skorzysta z tej mo liwo ci optymalizacji

Kup książkę Poleć książkę

70 AVR Uk ady peryferyjne

Je li mamy do czynienia z prekompilowan bibliotek (lib) to musi ona by skom-pilowana z zaznaczon opcj Prepare functions for garbage collection (-ffunction-sections) Alternatyw jest umieszczenie ka dej funkcji biblioteki w osobnym pliku(tak jak w przypadku bibliotek AVR-libc)

Na ekranie wyboru opcji optymalizacji linkera mamy jeszcze jedn przydatn opcjmdash Relax Branches (-mrelax) Dla mikrokontroleroacutew ktoacutere maj ponad 8 kB pami ciFLASH instrukcje skokoacutew s generowane jako tzw instrukcje d ugie mdash umo liwiajone skok do komoacuterki pami ci FLASH o dowolnym adresie Jednak cen za to jestwyd u enie instrukcji mdash ich kod jest d u szy podobnie jak czas wykonania Nie zawszejednak takie d ugie instrukcje musz by wykonywane mdash je li miejsce docelowe skokule y blisko (w zasi gu instrukcji skokoacutew wzgl dnych) to mo na w kodzie wynikowymzamieni instrukcje d u sze na kroacutetsze co przynosi oszcz dno ci w postaci skroacuteceniakodu wynikowego Poniewa dopiero linker bdquowierdquo jak poszczegoacutelne fragmenty kodus rozmieszczone w pami ci takiej podmiany mo na dokona na etapie linkowaniaprogramu co zapewnia powy sza opcja St d te warto to pole wyboru zaznaczy

Kup książkę Poleć książkę

SkorowidzA

ABI Application Binary Interface 25AC Address Counter 50ADPCM 482adres

bazowy 377bufora 61komoacuterki 84pu apki 202

ALE Address Latch Enable 368alfanumeryczne wy wietlacze 43algorytm ADPCM 492algorytmy stratne 495animacje 57antyaliasing 325architektury procesoroacutew XMEGA 352asembler 23

dyrektywy 40funkcje j zyka C 41obs uga przerwa 39

asynchroniczne wywo anie funkcji 101Atmel Studio 15

Bbajty kalibracyjne 569biblioteka

FATFS 131 139 176 180 517libcallback-liba 99PetitFS 144 149

bitADC_CH0START_bm 236IMPMODE 244

bitrate 442 512blokowanie przerwa 219b d 16 19

kwantyzacji 463offsetu 230wzmocnienia ADC 230

BOD 223bps bits per second 12

budowakarty 152linii obrazu 394pami ci SDRAM 374pliku stymulacji 192ramki PAL 412sygna u PAL 411wtyczki 544 545

bufor 78FIFO 497na transakcje 61transakcji 62

buforowanie wyj cia 294

CCAS Column Address Strobe 375CCFL 44charakterystyka

przetwornikoacutew 222termistora 264tryboacutew pracy 232

CID Card Identification 169CKE Clock Enable 375CLKIN 421COG Chip on Glass 310CRC 158 178CRC16 178CRC7 164CS Chip Select 361 375CSD Card Specific Data 172czas

dost pu do SDRAM 424adowania kondensatora 244

propagacji 281proacutebkowania 260symulacji 209

czcionki 322cz stotliwo

odchylania pionowego 428proacutebkowania 244 441 444 530przebiegu 504

Kup książkę Poleć książkę

576 AVR Uk ady peryferyjne

cz stotliwoPWM 465taktowania koprocesora 549taktowania procesora 209taktowania rdzenia 18

czyszczenie pami ci 318

DDAC Digital to Analog Converter 293 447 451

buforowanie wyj cia 294generowanie przebiegoacutew 301jitter 303kalibracja 306napi cie referencyjne 295system zdarze 297taktowanie 296tryb dwukana owy 301wykorzystanie DMA 298wyzwalanie konwersji 305

datalogger 261 265 275DD Device Density 86debuger 183

programowy 190sprz towy 185 187

decymacja 259DEBUG 219XMEGA 260

definicja symboli globalnych 36definiowanie w asnych znakoacutew 56deklaracja zapowiadaj ca 103 337dekoder DTMF 548 556DMA 254 298 402 458 518 523dost p do

danych 358 359 568danych binarnych 356 360danych wielobajtowych 31DataFLASH 137EEPROM 128FAT 136komoacuterki 375LCD 59 62 66 68operandu 30pami ci 81 384 386 387 561pami ci SDRAM 424pliku blokowy 141portoacutew IO 30rejestroacutew IO procesora 36rejestroacutew uk adu 499SPI 95sygnatury u ytkownika 565 567wska nikoacutew 32

DQM Data Mask 375DSP Digital Signal Processor 535

DTMF 535 553dyktafon 529dynamiczna alokacja pami ci 516dyrektywa global 38dyrektywy asemblera 40dzia anie

DMA 255komparatora 280timeroacutew 400

d wi k 443

EEBI External Bus Interface 361EEPROM 207eliminacja jitteru 24emulacja RS232 139

FFAT File Allocation Table 128 131FAT32 128FATFS 180filtr

dolnoprzepustowy 491drugiego rz du 470pierwszego rz du 469trzeciego rz du 471

filtrowanie sygna u PWM 468firmware 565FLASH 207format

odpowiedzi 159polecenia 158protoko u 157

funkcja_delay_ms 17 219c_zero 42callback 106 341callback() 99DataFLASH_CSEnable 100DF_FinishBufWrite() 269disk_initialize 136disk_ioctl 181disk_status 136disk_write 138DMA_SPI_init 104DTMF_GetCode 553free_re 65GPIOR0_init 507hd44780_outcmd 51hd44780_outnibble_nowait 65LCD_defchar_P 57

Kup książkę Poleć książkę

Skorowidz 577

Menu_Click_Func 515Menu_Free 516Menu_Recorder 532Menu_Run 527MS_CreateRegEntry 117MS_GetDirPos 125MS_GetRegItem 115MS_WritePages 116 118OSC_wait_for_rdy 473RecMenu_StartStop 532sprintf 142strtok 124sysclk_init() 200 209TMF_memcpy_PF 454udi_cdc_getc() 123udi_cdc_is_rx_ready() 123VS1003_Reset 506

funkcjeanalizuj ce 556biblioteczne 50biblioteki FATFS 143j zyka C 41kontrolera ST7565R 313opoacute niaj ce 17opoacute nie 219reentrant 524specjalne kontrolera 319steruj ce 314zapisu 133

fusebit 557BODACT 560BODLEVEL 560BOOTRST 559DVSDON 560EESAVE 561JTAGEN 558RSTDISBL 559SUT 559TOSCSEL 559

fusebity w AVR-libc 571

Ggenerator obrazu composite 426generowanie

d wi ku 461kolorowego obrazu 437obrazu wideo 391przebiegoacutew 301przerwa 285sygna u composite 409

g bia koloru 326gniazdo

karty SD 156VGA 396

Hhistereza 281

IIDE 11IMA ADPCM 483informacje

o kolorze 431o obrazie 434

inicjalizacjakarty 161karty SDHC 167karty SDSC 167karty SDXC 167licznika 419pami ci 119USART 505

instrukcjaicall 42movw 35nop 13 24

interfejsSCI 498SDI 498SPI 71 79RS232 120UART 123USART 71 73

interpolacja 259interpolacja w XMEGA 260inwersja obrazu 319

Jjednostki 12jitter 24 303 420

Kkalibracja

ADC 229DAC 306 564offsetu 237

kana DMA 82 522karta 154 158

mikroSD 152SD 151 152SDHC 151 152 160SDSC 160SDXC 151 160

Kup książkę Poleć książkę

578 AVR Uk ady peryferyjne

karty pami ci 151 152 157biblioteka FATFS 180budowa 152format polecenia 158inicjalizacja 161 167komunikacja 156odczyt danych 173opcje konfiguracyjne 181rejestry specjalne 169tryby pracy 153zapis danych 176zasilanie 154

kodasemblerowy 23 24C 23dost pu 24

kodowanieμ-law 481ADPCM 483Dialogic ADPCM 494informacji 166 426koloru 425znakoacutew 536

kodyformatoacutew audio 501zdarze 545

kolejno bajtoacutew 533kolor 424 430kolorowy obraz 437komparator 422

analogowy 279 280analogowy XMEGA 282okienkowy 284

kompilacja plikoacutew binarnych 350kompilator avr-gcc 11 359kompresja

ADPCM 482 486d wi ku 480IMA ADPCM 482

komunikacja z koprocesorem 504konfiguracja

4-portowa 364biblioteki 133debugera 185DMA 459 522fusebitoacutew 570kontrolera DMA 257 452komparatoroacutew 285lockbitoacutew 570LPC 371pami ci SDRAM 381PetitFS 149pinu IO 225portoacutew IO 362

preskalera 452projektu 186przerwa 219pu apki 203rejestru EVCTRL 248rejestru PER 67SPI 75sygna u CS 377typu czcionki 324urz dze IO 189USART 76zegara 383

konsolidacja 547kontroler

DMA 254 298 402 458 518 523KS108 310ST7565R 310ndash315 321

konwersjaDAC 305sygna oacutew 396wyzwalana 306

konwertercyfrowo-analogowy 426DAC 427

koprocesormp3 496VS1003B 10

korekcja fazy 466kwantyzacja 463

Llampa CCFL 44LE Latch Enable 433licznik 419

cykli 209TCC1 400timera 20

linie IO 50linie sygna owe

MISO 72 164MOSI 72SCK 72SS 72

linker 69lista

mnemonikoacutew 24modyfikowanych rejestroacutew 32

lockbity 557 561lockbity w AVR-libc 570LPC Low Pin Count 371LPCM 443 556LSB Least Significant Bit 228

Kup książkę Poleć książkę

Skorowidz 579

a cuchy formatuj ce 212czenie plikoacutew 352

Mmagistrala pami ci zewn trznej 361magnetofon cyfrowy 528makro _SFR_IO_ADDR() 39makrodefinicja

ASSERT 214HD44780_CGADDR() 53HD44780_CLR 53HD44780_DDADDR() 53HD44780_DISPCTL() 52HD44780_ENTMODE() 52HD44780_FNSET() 52HD44780_HOME 53HD44780_SHIFT() 51LOCKBITS 571

mapowanie sygna oacutew 366mapy bitowe 343marker czasowy 268maski bitowe 329matryce 49menu 335menu piktogramowe 342mierniki temperatury 262mikrokontroler

ARM 9AVR 9PIC 9XMEGA128A3U 10

MISO 72moc wydzielana 265model psychoakustyczny 495modu

alfanumeryczny 45NVM 568Xmega eXploreGO 10Xplained ATXMEGA A3BU 10Xplained ATXMEGA-A1 10Xplained XMEGA128A1 447Xplained XMEGA256A3 94Xplained XMEGA256A3BU 97 143 266

modyfikator 30const 85volatile 28 273

monitory CRT 395monochromatyczne wy wietlacze graficzne 309monochromatyczny

tryb graficzny 416tryb tekstowy 413

MOSI 72mp3 495Msps Megasamples per second 12multiplekser wej ciowy 226 283multipleksowanie adresoacutew 368 369muzyka 439

Nnadawanie kodoacutew DTMF 540nadproacutebkowanie 258nag oacutewek kontenera wav 500nagrywanie mowy 486najmniej znacz cy bit 228napi cie

offsetu 280referencyjne 223 295zasilania 239

Oobracanie obrazu 319obraz 319

composite 426kolorowy 430wideo 391

obroacutebka d wi ku 443 445obs uga

FAT 131 143klawiatury matrycowej 24LCD 58 63 67menu 337przerwania 37 38 458przerwania DMA 525przerwa w asemblerze 39przyciskoacutew 272wy wietlaczy alfanumerycznych 45

odczytblokowy 140danych 173 358

odpowied response 159R1 159R2 159R7 160

od wie anie pami ci 376odtwarzanie

d wi ku 472muzyki 447 513 518 521

offset 238offset ADC 230okno

Breakpoints 202Call stack 209dezasemblera 210

Kup książkę Poleć książkę

580 AVR Uk ady peryferyjne

oknoIO View 207podgl du zmiennych 211wyboru czcionek 324

OLED 46opcje

kompilatora 35zapisu d wi ku 445

operacjena buforach 91odczytu 173zapisu 176zapisu strony 92

operand 29operator

ascii 41

asciz 41

byte 41

section 41opoacute nienia 13 18opoacute nienie zmienne 16optymalizacja 16 68optymalizator 26organizacja pami ci 77organizacja pami ci VRAM 316oscylator 287OSD On-Screen Display 417ostrze enie 16oszcz dzanie energii 94

Ppakiet WinAVR 48pami

CGRAM 56 57 64DataFLASH 10 77 81 113 269DDRAM 49EEPROM 111FLASH 54 124 207RAM 49SDRAM 372SRAM 63 124 329 366 371VRAM 314 317

PCLK 421PCM 443PetitFS 144 149p tla

for 13while 201

pierwsza linia obrazu 321piksel 430piktogram 342pin IO 225

plikAlloc_safeh 65DataFLASHc 83DataFLASHIOc 136definesh 50delayh 14diskioh 132 136ffh 132ffconfh 132 181hd44780h 49integerh 132ioh 30LCD_transc 61LCD-transactc 66Makefile 14Menuc 19nothingo 541outfiletxt 547 551pffh 149SPIh 104stringh 113stymulacji 191 192

pliki mp3 495elf 351fon 323o 24S 24 34binarne 350 355csv 276d wi kowe 440obiektowe 352wav 500WMA 512z czcionkami 327z danymi 349

podbijacz napi cia 315podgl d

pami ci 207stosu wywo a 209zmiennych 211znakoacutew 325

pod czeniefototranzystora 262karty SD 155LCD z kontrolerem 311modu u 50pami ci 362 369 370 373termistora 262uk adu LM35 251wyj XMEGA 398

pod wietlenieCCFL 46OLED 46

Kup książkę Poleć książkę

Skorowidz 581

podwoacutejne buforowanie 255 332 457polecenia

kasowania strony 81konfiguracyjne pami ci 82kontrolera ST7565R 315odczytu bufora 82 89odczytu pami ci 81 88SDRAM 376transferu 91

polecenieACMD41 168cd 181CID 178CMD0 165CMD8 167CSD 178date 276dir 127 181dump 276erase 276get 276HD44780_CLR 51Init 178mkdir 181

po czenieDMA ze SPI 96dwoacutech komparatoroacutew 285koprocesora mp3 497LCD z mikrokontrolerem 48wyj cia XMEGA 411XMEGA z PC 121z telewizorem 431

pomiarnapi cia zasilania 239temperatury MCU 241

port IO 30 362pozycjonowanie grafik 345poacute obraz 410precyzja pomiaroacutew 260preskaler 478preskaler ADC 243program

Atmel Data Visualizer 275Audacity 443avr-objcopy 350dataloggera 265LCD Image Converter 323makeloadingtableexe 543Realterm 127 554riffstrip 483SoX 445Tracepoint 208

programowanie sygnatury u ytkownika 566protokoacute master-slave 157

prototypy 136proacutebki d wi kowe 447proacutebkowanie

8-bitowe 300nieliniowe 480

prymitywy graficzne 330przebieg PWM 468przebiegi 289 303przechwytywanie danych 276przemiatanie wej 253przerwanie 218 254 286 403

DMA 522komparatora 286

przestrze adresowa procesora 378przesy anie

danych 498polece 498

przetaktowanie procesora 436przetwornik

ADC 221analogowo-cyfrowy 221cykliczny 222potokowy 222

przyciski 272pseudooperatory 41pu apki breakpoints 197pu apki warunkowe 205punkty ledzenia 203PWM 461 462 472

RRAS Row Address Strobe 375redukcja poboru energii 242regulacja kontrastu 321rejestr 32 34rejestr AC 50

adresu wtyczki 513BASEADDR 377CID 169CMP 251CSD 172czasu utworu 512DATA 83EVCTRL 248formatu audio 512identyfikacyjny pami ci 87INTFLAGS 252kontroli basoacutew 510kontroli g o no ci 513MUXCTRL 227OCR 168PER 67poroacutewnania 249

Kup książkę Poleć książkę

582 AVR Uk ady peryferyjne

rejestr ACSCI_CLOCKF 511stanu komparatora 287stanu pami ci 86stanu uk adu 510trybu pracy 508WINCTRL 285

rejestrydost pu do pami ci RAM 513GPIOR 502IO procesora 36mikrokontrolera 25procesora 35specjalne 94specjalne karty 169uk adu VS1003B 508

relacja rodzic ndash dziecko 336reset uk adu 534rozdzielczo

LCD 329przetwornika 231PWM 463 477

rozszerzenie HiRes 477 479roacutewnanie Steinharta-Harta 263rysowanie map bitowych 343

Sschemat uk adu dataloggera 267SCI Serial Command Interface 498SCK 72SD Secure Digital 152SDI Serial Data Interface 498separator synchronizacji 422separowanie impulsoacutew synchronizacji 422shieldy 10skaler 422skaler napi cia 283skrypt makefile 353s owo kluczowe

asm 27extern 37static 68

specyfikatory lokalizacji zmiennej 213sps samples per second 12SS Slave Select 72standard PAL 410standard VGA 393sterowanie

dataloggerem 275sygna em 379

sterownik 121HD44780 49 56LCD 49 62

stos wywo a 209

strukturaFATFS 139Handle 118LCD_trans 60 63menu 338rejestru 86SimpleFSEntry 113 116SimpleFSHandle 113 118 140submenu 527systemu plikoacutew 112

sumabitowa 571kontrolna 178

sygnacomposite 409composite video output 430CS 377DREQ 497H-Sync 396synchronizacji 423V-Sync 396zegarowy CLK 374

sygna yinterfejsu EBI 363magistrali EBI 364steruj ce 375

sygnaturaprodukcyjna procesora 563u ytkownika 565

symbol__DELAY_ROUND_CLOSEST__ 17__DELAY_ROUND_DOWN__ 17_FS_FAT12 149_FS_FAT32 149_FS_MINIMIZE 133_FS_READONLY 133_FS_RPATH 135_FS_TINY 133_MAX_SS 135_MULTI_PARTITION 135_USE_DIR 149_USE_FASTSEEK 134_USE_FORWARD 134_USE_LABEL 134_USE_LFN 134_USE_LSEEK 149_USE_MKFS 134_USE_READ 149_USE_STRFUNC 134_USE_WRITE 149_VOLUMES 136F_CPU 14 15 18increment 36USE_BUSY_FLAG 50

Kup książkę Poleć książkę

Skorowidz 583

symboleglobalne 36w asemblerze 28zewn trzne 39

symulacja 198 209symulator 190synchronizacja

pami ci 331pionowa 395pozioma 394

systemplikoacutew 111 128przerwa 404zdarze 245

szablonfont_XMEGAtmpl 326image_XMEGAtmpl 343

szum 463szybko przesy ania danych 126

ledzenie wi zki 333rodowisko

graficzne 11programistyczne 11VSIDE 542WinAVR 47

Ttabela FAT 130tablica

framebuf 402 408plugintbl 552 555tekst 208z kodem wynikowym 543

taktowanieDAC 296mikrokontrolera 473

technologia OLED 44temperatura mikrokontrolera 239 241termistor 262 290

NTC 263PTC 263

termometrLM35 249 250z alarmem 251

termostat 290test uk adu VS1003B 503testowanie obrazu 319timer 16 62

TCC0 20

TCC1 399transakcja 59 62 65transakcje 17 103ndash107transakcyjna obs uga LCD 58transakcyjny dost p do SPI 95transfer 91

danych 97wynikoacutew 254

transmisja 72 83tryb

bez znaku 234ci g ej konwersji 252czterobitowy 153dwukana owy 301graficzny 416graficzny VGA 407idle 419jednobitowy 153LPC 371monochromatyczny 397 407oszcz dzania energii 94 306pracy multipleksera 226pracy SPI 157roacute nicowy 232single slope 312SPI 153tekstowy 413tekstowy VGA 397z pojedynczym wej ciem 234ze znakiem 235

trybygenerowania PWM 467pracy karty 153pracy przetwornika 231pracy SPI 74pracy uk adu 508

twierdzenie Nyquista 258tworzenie

adresu 84nak adek 417obrazu 335tablicy 543

typ__uint24 119karty 160niekompletny 60wyliczeniowy 114

typyoperandoacutew 29w AVR 34

Kup książkę Poleć książkę

584 AVR Uk ady peryferyjne

Uuchwyt handle 64 113uk ad

AD725 427 431buforowy 294CS 361DAC 284dataloggera 267detekcji awarii zasilania 559generuj cy obraz 393HiRes 477ICL7660 47LM35 250 251SampH 293sterowania sygna em 379USART 401VS1003B 496 503 508 530 538 556VS100XX 529wzmacniania sygna u 227

uk ady peryferyjne 9uruchomienie komparatora 287urz dzenie

master 72slave 72

u rednianie 259utrata danych 141u ycie wstawki asemblerowej 33

VVGA 393

Wwarto ci kalibracyjne

ADC 564oscylatoroacutew 564temperatury 564

warunkowa kompilacja 36WE Write Enable 375wej cie composite video input 425wektor przerwa 38 257wideo 391wielko pami ci 86 377w czenie DAC 299wska nik na struktur 27wska niki 32wstawki asemblerowe 24 33wtyczka 535 541 544

SineDTMF Generator 537VGA 396

wyboacuter cz stotliwo ci PWM 465 474wykorzystanie

DMA 254 518

EuroSCART 428PWM 461rejestroacutew 34

wyliczanie predyktora 489wy wietlacze

alfanumeryczne 43 45graficzne 43 309LCD 43OLED 46

wy wietlanielitera u 213map bitowych 344obrazu 333 346 406obrazu VGA 393

wywo ania zwrotne callbacks 98asynchroniczne 101synchroniczne 101

wyzwalanie konwersji 245wzmacniacz 446wzmacniacz operacyjny 279wzmacnianie sygna u 227

XXMEGA 9 18

Zzapis

bufora 269danych 176d wi ku 440 556

zasilaniekarty 154pami ci 109

zatrzask 368zatrzask 74HC573 433zatrza ni cie adresu 369zdarzenia 297zdarzenie compare match 399zegar 383 420 426zintegrowane rodowisko programistyczne 11z cze EuroSCART 425 428 429zmiana

g o no ci 527wielko ci strony 94

znaki 56

roacuted onapi cia odniesienia 284sygna u 240

Kup książkę Poleć książkę

Page 27: Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8 AVR. Ukäady peryferyjne Rejestry dost pu do pami ci RAM .....513 Rejestr adresu

62 AVR Uk ady peryferyjne

do LCD mdash to znaczy e danie np zapisu do LCD mo e wyst pi zaroacutewno w g oacutewnejp tli programu jak i asynchronicznie w przerwaniu St d te wynika e funkcja do-daj ca transakcj musi by napisana w sposoacuteb zapewniaj cy jej poprawn prac w sytu-acji gdy zostanie ona przerwana i ponownie wywo ana przed zako czeniem dzia aniajej poprzedniej instancji Umieszczenie cia a tej funkcji w sekcji atomowej nam to za-pewnia mdash dzi ki temu bufor transakcji zawsze b dzie spoacutejny Dla zaspokojenia cie-kawo ci warto usun sekcj atomow i sprawdzi jak wtedy b dzie zachowywa si tafunkcja i jak wp ynie to na spoacutejno przechowywanych danych

Drug niezb dn funkcj jest funkcja odczytuj ca bufor transakcji i zwracaj ca trans-akcj do zrealizowania (lub NULL je li adnej transakcji nie ma w buforze)

LCD_trans cbRead(CircBuffer cb) LCD_trans elem ATOMIC_BLOCK(ATOMIC_RESTORESTATE) if(cbIsEmpty(cb)) return NULL Bufor pusty nie mo na zwroacuteci elementu elem = cb-gtelements[cb-gtBeg] cb-gtBeg = (cb-gtBeg + 1) LCD_MAXTRANS -- cb-gtCount Zmniejszamy liczb elementoacutew pozosta ych w buforze return elem

Funkcja ta jest bardzo podobna do poprzedniej mdash najpierw sprawdza czy bufor za-wiera jak oczekuj c transakcj (cbIsEmpty(cb)) je li tak to zwraca adres opisuj -cej j struktury i zmniejsza liczb transakcji oczekuj cych (pole Count) W ten sposoacutebmamy zrealizowan ca funkcjonalno zwi zan z obs ug bufora pier cieniowegoPokazane funkcje s uniwersalne i z bardzo podobnych (lub wr cz tych samych) b -dziemy korzysta w kolejnych rozdzia ach w kontek cie np obs ugi transakcji zwi -zanych z interfejsami szeregowymi

Pora przej do samego sterownika LCD Jego zadaniem b dzie sprawdzenie czyw buforze oczekuj jakie transakcje do realizacji a je li tak to ich wykonanie Ponie-wa dane do LCD mog by wysy ane co okre lony minimalny czas znacznie d u -szy ni czas jakiego na to zadanie potrzebuje mikrokontroler do wysy ania kolejnychpaczek danych pos u ymy si timerem Timer b dzie generowa przerwanie nadmiaru(TCD0_OVF_vect) ktoacutere b dzie wyznacza o tempo w jakim kolejne porcje danych b -d trafia y do LCD Z noty katalogowej kontrolera wynika e minimalny czas trwa-nia wysokiego stanu sygna u Enable to 230 ns a okres tego sygna u nie powinien bykroacutetszy ni 500 ns Poniewa nasz dost p do LCD odbywa si w sposoacuteb nieblokuj cyMCU wi c szybko wysy ania danych do LCD jest bez znaczenia St d te w poka-zanym przyk adzie przyj to e dane b d wysy ane co 4 s co okre la sta a

define LCD_ACCESSTIME 0000004

Poniewa komunikacja z LCD odbywa si w sposoacuteb nieblokuj cy nie zale y nam tena czasie (i tak w stosunku do czasu od wie ania samego LCD jest on bardzo kroacutetki)w efekcie nie ma potrzeby odczytywania flagi busy kontrolera Dzi ki temu w cz ciprzypadkoacutew mo emy w ogoacutele zrezygnowa z sygna u wyboru RW i wymusi jego sta y

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 63

poziom logiczny umo liwiaj cy zapis do LCD Dzi ki temu mo na zaoszcz dzi do-datkowy pin IO1

Ca a logika naszego sterownika jest zawarta w funkcji obs ugi przerwania przepe nieniatimera (TCD0_OVF_vect) Poniewa LCD jest po czony z MCU w trybie 4-bitowym(dla zaoszcz dzenia liczby wykorzystanych pinoacutew IO) kolejne 8-bitowe dane muszby podzielone na dwie tetrady i wys ane do LCD w kolejno ci starszam odsza tetradaInformacja o aktualnie wysy anych danych jest umieszczona w zmiennej trans o typie

static struct uint8_t pos 6 Pozycja w polu danych aktualnej transakcji uint8_t nibble 1 Ktoacutera tetrada jest wysy ana seq

Dlaczego tak Dzi ki wykorzystaniu struktury i poacutel bitowych mo na zaoszcz dzi je-den bajt pami ci SRAM Ze wzgl du na wielko pami ci obs ugiwanej przez kon-troler LCD mo emy by pewni e transakcje zawieraj ce wi cej ni 63 bajty s ra-czej nierealne (nie mia yby wi kszego sensu) St d te do przechowywania informacjio aktualnie wysy anym bajcie danych wystarczy 6 bitoacutew mdash tyle samo zosta o wyko-rzystanych do okre lenia d ugo ci pola danych transakcji w strukturze LCD_trans Zaosz-cz dzony bit mo na po wi ci na flag nibble okre laj c ktoacutera tetrada (m odszastarsza)jest wysy ana Bez poacutel bitowych flaga ta zaj aby dodatkowy bajt pami ci

Przejd my do implementacji sterownika Pierwsz rzecz jak nale y sprawdzi jestto czy w buforze czeka jaka transakcja do zrealizowania Odpowiedzialny za to jestfragment kodu obs ugi przerwania nadmiaru timera

if(trans == NULL) Nic do zrobienia sprawd my czy jaka transakcja oczekuje trans=cbRead(ampLCD_TransBuffer) Czy jest jaka oczekuj ca transakcja seqpos=0 seqnibble=0 if(trans == NULL) TCD0_CTRLA=TC_CLKSEL_OFF_gc Nie ma adnych transakcji mdash wy cz timer

W przypadku gdy adna transakcja nie oczekuje na realizacj timer jest wy czanymdash dzi ki temu nie b d zg aszane kolejne przerwania przepe nienia i MCU nie b -dzie traci czasu na ich obs ug Co prawda wynikaj cy z tego zysk czasowy jest mar-ginalny lecz ma to istotniejsz konsekwencj mdash w przypadku usypiania MCU zb d-ne przerwanie timera nie b dzie niepotrzebnie wybudza o procesora W takiej sytuacjiponowne w czenie timera nast pi dopiero w funkcji dodaj cej transakcj do kolejkimdash a wi c w sytuacji gdy mamy pewno e istnieje oczekuj ca transakcja

Druga cz funkcji obs ugi przerwania jest zwi zana z realizacj samej transakcjiW pokazanym przyk adzie zaimplementowano tylko jeden typ transakcji mdash daniezapisu a cucha tekstowego pod wskazany adres VRAM (na okre lonej pozycji LCD)Je li zajdzie taka potrzeba programista mo e zaimplementowa inne polecenia i doda

1 Warto zauwa y e w bdquoklasycznejrdquo obs udze LCD te nie musimy czyta stanu flagi busy zamiast tego

wystarczy wprowadza p tle opoacute niaj ce Jednak poniewa taka obs uga blokuje MCU nie jest onazalecana Wady tej nie ma dost p transakcyjny co jest jego dodatkow zalet

Kup książkę Poleć książkę

64 AVR Uk ady peryferyjne

kod odpowiedzialny za ich obs ug Zauwa my e ka da transakcja musi zawieraadres pocz tku pami ci wideo od ktoacuterego b dzie zapisywany tekst Dzieje si takdlatego e transakcja wykonana wcze niej mo e ustawi wska nik zapisu na dowolnejkomoacuterce pami ci W efekcie tekst z kolejnej transakcji by by wy wietlany od komoacuterkina ktoacuterej zako czy si zapis poprzedniej transakcji Takie dzia anie oczywi cie jestniedopuszczalne st d te ka dy zapis do pami ci wideo poprzedza ustawienie rejestruindeksowego Problem ten mo na rozwi za tak e w inny sposoacuteb mdash poprzez wpro-wadzenie tzw uchwytoacutew (ang handlers) ktoacutere zawiera yby stan kontrolera LCDNiemniej to rozwi zanie dodatkowo komplikowa oby nasz sterownik Struktura danych(zawartych w polu data) ma wi c nast puj cy format

bajt nr 0 zawiera warto pozycji od ktoacuterej nale y dokonywa zapisu pami ciwideo mdash jest to warto przesy ana do rejestru okre laj cego adres zapisu

kolejne bajty zawieraj a cuch znakowy ktoacutery nale y umie ci w pami ciCGRAM

Poniewa bajt nr 0 zawsze zawiera warto wpisywan do rejestroacutew steruj cych kon-trolera podczas jego wysy ania jest ustawiana linia RS sygnalizuj ca zapis do rejestruPodczas wysy ania kolejnych bajtoacutew linia ta jest zerowana w zwi zku z czym zapisodbywa si do pami ci CGRAM

Kod obs uguj cy transakcj wygl da nast puj coif(trans) Jest transakcja do zrealizowania uint8_t dat=trans-gtdata[seqpos] if(seqnibble == 0) datgtgt=4 To trzeba zmieni je li linie danych nie s po czone z pinami 0 ndash 3 portu IO hd44780_outnibble_nowait(dat amp 0x0F seqpos = 0) Zapisujemy rejestr steruj cy lub dane ++seqnibble if(seqnibble == 0) ++seqpos Co drug tetrad zwi kszamy pozycj bufora if(seqpos gt= trans-gtlen) trans-gtReady=true Koniec transakcji if(trans-gtSelfDel) free_re(trans) Zwolnij pami transakcji je li tak sobie yczy programista trans=NULL Koniec transakcji CLR(OUT HD44780_E)

Ta cz przerwania wysy a kolejne tetrady do kontrolera LCD Warto zastanowi sinad dzia aniem sekwencji

++seqnibble

Poniewa pole nibble jest jednobitowe operacja inkrementacji prowadzi do zmianystanu tego pola na przeciwny (pole to ma warto 0 lub 1) Kiedy zostan wys anewszystkie dane przeznaczone dla kontrolera obs uga transakcji ko czy si Stan tensygnalizuje nadanie warto ci true polu Ready struktury LCD_trans Dzi ki temu pro-gram mo e sprawdzi asynchronicznie w stosunku do przerwania kiedy transakcjauleg a zako czeniu Opcjonalnie jest wykonywana jeszcze jedna funkcja mdash je li poleSelfDel ma warto true to pami zarezerwowana na transakcj jest automatycznie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 65

zwalniana W tym celu wykorzystuje si funkcj free_re ktoacuterej prototyp jest zade-klarowany w pliku Alloc_safeh Funkcja ta wywo uje funkcj biblioteczn free ktoacute-ra zwalnia pami przydzielon dynamicznie na stercie Poniewa funkcja ta nie jestfunkcj reentrant nale y stworzy odpowiedni bdquoprotez rdquo opakowuj c j w blokatomowy co zapewnia e nie zostanie ona ponownie wywo ana zanim jej poprzed-nia instancja nie zako czy dzia ania Oczywi cie lepszym rozwi zaniem by oby napi-sanie w asnych funkcji dynamicznej alokacji pami ci ktoacutere b d reentrant

Bardzo wa ne jest aby pole SelfDel mia o warto true wy cznie dla transakcjidla ktoacuterych pami zosta a przydzielona dynamicznie funkcj malloc (lub jej po-chodnymi) W pozosta ych przypadkach pole to musi mie warto false mdash nie-stosowanie si do tej regu y spowoduje b d mened era pami ci i najprawdopo-dobniej nieprzewidywalne dzia anie programu

Drug wa n zasad jest aby zmienna zawieraj ca dane transakcji nie by azmienn automatyczn mdash zmienne takie s automatycznie niszczone po opusz-czeniu zawieraj cej je funkcji W rezultacie obszar pami ci zawieraj cy danetransakcji mo e zosta wykorzystany przez inne zmienne co spowoduje uszkodzeniezawartych w nim danych

Pami przydzielona transakcji musi by alokowana w sposoacuteb dynamiczny (funkcjamalloc_re) ewentualnie mo e to by pami alokowana dla zmiennej globalnej lubstatycznej mdash zmienne tego typu istniej przez ca y czas ycia programu

Warto te zauwa y e instrukcje steruj ce stanem linii Enable kontrolera LCD(SET(OUT HD44780_E) i CLR(OUT HD44780_E)) s rozdzielone wieloma innymi in-strukcjami Dzi ki temu generowany impuls dodatni tego sygna u ma czas trwania gt230 ns wymagany w specyfikacji kontrolera Nawet dla XMEGA taktowanej zegarem32 MHz 230 ns przek ada si na oko o 7 instrukcji asemblera mdash czas jaki z pewno-ci up ynie pomi dzy wykonaniem obu powy szych instrukcji steruj cych

Do wysy ania danych do kontrolera zosta a wykorzystana nieco zmodyfikowanafunkcja hd44780_outnibble_nowait roacute ni ca si od jej protoplasty hd44780_outnibbletylko tym e nie czeka na sygna braku zaj to ci mikrokontrolera (nie realizuje teopoacute nie ) Nie jest to potrzebne gdy kolejne tetrady s wysy ane w odst pach cza-sowych okre lanych przez timer

Mamy wi c zapewnion obs ug transakcji i mo liwo transakcyjnego wy wietlaniadanych na LCD musimy jeszcze mie funkcj ktoacutera tworzy odpowiednie transakcjemdash jest odpowiednikiem funkcji bezpo rednio wysy aj cej dane znakowe do LCDOdpowiednikiem tym jest pokazana poni ej funkcja

bool LCD_PutText_B(uint8_t x uint8_t y char txt LCD_trans buf bool autodel) buf-gtcmd=LCD_Text buf-gtReady=false buf-gtSelfDel=autodel Czy zwolni pami po zako czeniu transakcji buf-gtdata[0]=HD44780_DDADDR(x+y0x40) Ustaw adres w DDRAM strcpy((char)ampbuf-gtdata[1] txt) Skopiuj dane tekstowe + NULL

Kup książkę Poleć książkę

66 AVR Uk ady peryferyjne

buf-gtlen=strlen(txt) + 1 D ugo tekstu + pozycji + NULL ndash 1 bool ret=cbAdd(ampLCD_TransBuffer buf) if((ret==false) ampamp (autodel)) free_re(buf) Brak miejsca w kolejce else TCD0_CTRLA=TC_CLKSEL_DIV1_gc Preskaler 1 mdash odblokuj timer return ret

Funkcja ta buduje transakcj odpowiedzialn za wy wietlenie napisu txt na wskaza-nej pozycji x y LCD Wszystkie dane o transakcji zostan umieszczone w buforzew pami ci ktoacuterej adres jest okre lany wska nikiem buf Pami w buforze musi bywystarczaj co du a aby pomie ci ca transakcj Dodatkowy parametr autodel okre laczy pami ta ma by automatycznie zwalniana po obs u eniu transakcji (true) czynie (false) Je li transakcj uda o si umie ci w kolejce funkcja zwraca true Wartozauwa y e w takim przypadku funkcja uruchamia te timer (w naszym przypadkujest to timer TCD0) odpowiedzialny za generowanie przerwania Funkcja obs ugi prze-rwania wysy a dane do LCD

Pewn odmian powy szej funkcji jest funkcjabool LCD_PutText(uint8_t x uint8_t y char txt) LCD_trans trans=malloc_re(sizeof(LCD_trans) + strlen(txt) + 2) bool ret=LCD_PutText_B(x y txt trans true) return ret

Wykorzystuje ona funkcj LCD_PutText_B z tym e najpierw alokuje dynamiczniepami potrzebn na przechowanie tworzonej transakcji

Mamy komplet potrzebnych funkcji a wi c sprawd my jak ca o sprawdza siw praktyce W pliku LCD-transactc znajduje si kod pokazuj cy jak dzia aj naszetransakcje Aby to by o mo liwe nale y zainicjalizowa kontroler LCD

LCD_init()

Wykorzystujemy tu znan ju funkcj inicjalizuj c mdash nie ma potrzeby jej zmienia gdy operacja inicjalizacji LCD jest jednorazowa i nie trzeba wykonywa jej w posta-ci transakcji W drugim kroku musimy zainicjalizowa wykorzystywany timer i systemprzerwa

LCD_Timer_init(ampTCD0)PMIC_CTRL|=PMIC_LOLVLEN_bm Odblokuj przerwania niskiego poziomusei()

Poniewa dost p do LCD z pewno ci nie jest czynno ci krytyczn czasowo prze-rwaniom timera nadano najni szy priorytet Dzi ki temu mo na innym bardziej kry-tycznym przerwaniom nada wy sze priorytety i uzyska w ten sposoacuteb zmniejszenieczasu latencji obs ugi przerwa Sama inicjalizacja timera jest niezwykle prosta

void LCD_Timer_init(TC0_t tc) tc-gtINTCTRLA=TC_OVFINTLVL_LO_gc Odblokuj przerwania nadmiaru timera i nadaj im niski priorytet tc-gtPER=F_CPULCD_ACCESSTIME Przerwanie co 4 us (niezale nie od F_CPU)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 67

Sprowadza si ona tylko do odblokowania mo liwo ci zg aszania przerwania nadmia-ru oraz konfiguracji rejestru PER tak aby przerwania by y generowane co ok 4 s mdashniezale nie od cz stotliwo ci taktowania CPU Mo emy wi c przyst pi do wy wie-tlenia pierwszego napisu

LCD_PutText(00 Numer)

Powy sza funkcja ma jedn wad mdash alokuje dynamicznie pami po ka dym wywo-aniu (pami ta jest automatycznie zwalniana po obs u eniu transakcji) niemniej

ca y proces jest czasoch onny Mo emy tego unikn alokuj c pami bdquor cznierdquo i wielo-krotnie wykorzystuj c zaalokowany blok pami ci Ilustruje to poni szy przyk ad

LCD_trans buf=malloc_re(sizeof(LCD_trans) + 7)

Zmienna buf wskazuje na obszar pami ci ktoacutery mo e pomie ci a cuch 5-znakowyTyle wystarczy na potrzeby tego przyk adu mdash na LCD b d wy wietlane kolejneliczby w zakresie 0 ndash 65 535 najd u sza ma 5 znakoacutew st d te nasz bufor ma tak a nieinn d ugo

while(1) utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(60 bufstr buf false) while(LCD_IsTransCompleted(buf))

Do konwersji liczby na a cuch u yto funkcji bibliotecznej utoa (nag oacutewek stdlibh)Poniewa d ugo a cucha po konwersji jest zmienna (co spowodowa oby pozosta-wianie na LCD bdquoduchoacutewrdquo po poprzednich konwersjach) w kolejnej linii brakuj ceznaki uzupe niono spacjami Nast pnie tworzona jest transakcja w obszarze pami ciprzydzielonym zmiennej buf Ostatnia p tla while jest odpowiedzialna za oczekiwa-nie na zako czenie realizacji transakcji Po jej zako czeniu p tla jest wykonywana odpocz tku

Uwa ny czytelnik z pewno ci zauwa y e pami przydzielana funkcj malloc_renie jest nigdzie zwalniana mdash w normalnej sytuacji spowodowa oby to wyciek pami -ci W naszym przyk adzie jednak program nigdy si nie ko czy nie ma wi c potrzebyzwalniania pami ci wskazywanej przez zmienn buf

Powy szy przyk ad pokazuje jak unikn blokowania CPU na czas dost pu do wolnodzia aj cego urz dzenia jakim jest LCD alfanumeryczny Jednak to nie wszystkiezalety wynikaj ce z zastosowania transakcji Drug wa n zalet naszego rozwi zaniailustruje przyk ad znajduj cy si w katalogu PrzykladyLCD-alfaLCD-transact-intPowa nym ograniczeniem funkcji odpowiedzialnych za dost p do LCD w sposoacutebklasyczny by a niemo no ich wywo ywania z funkcji obs ugi przerwa mdash funkcjeobs ugi LCD nie by y reentrant2 Nasz system oparty na transakcjach nie ma tychwad Aby to zilustrowa zosta stworzony prosty przyk ad mdash tak jak poprzedniow p tli g oacutewnej programu s wy wietlane stale kolejne liczby ale jednocze nie wyko-

2 Poza tym blokowa y CPU na d ugi czas a jak pami tamy funkcje obs ugi przerwa powinny by

wykonywane mo liwie kroacutetko

Kup książkę Poleć książkę

68 AVR Uk ady peryferyjne

rzystano drugi timer (TCD1) w ktoacuterego funkcji obs ugi przerwania przepe nienia jestwy wietlany licznik tych przerwa

ISR(TCD1_OVF_vect) static char int_buf[sizeof(LCD_trans) + 7] static uint16_t cnt char bufstr[6]

utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(61 bufstr (LCD_trans)ampint_buf false)

Jak widzimy w sposoacuteb asynchroniczny z dwoacutech miejsc w programie mo emy uzy-ska dost p do LCD a ka da funkcja bdquoma wra enierdquo e ma LCD na wy czno Przy okazji warto przeanalizowa sposoacuteb w jaki jest rezerwowana pami na trans-akcj w przerwaniu Oczywi cie mo na by wykorzysta dynamiczn alokacj pami cilecz jak wspomniano taka alokacja jest czasoch onna St d te w pokazanym przy-k adzie wykorzystano tablic statyczn int_buf o rozmiarze umo liwiaj cym prze-chowanie kompletnej transakcji Dzi ki temu e zmienna int_buf jest zmienn statycz-n nie jest ona niszczona po zako czeniu funkcji obs ugi przerwania Gdyby pomins owo kluczowe static zmienna ta by aby niszczona a na LCD najprawdopodobniejzacz yby si pojawia przypadkowe tre ci Poniewa pami naszego bufora nie by aalokowana dynamicznie nie mo e ona zosta zwolniona w naszym sterowniku LCDst d te ostatni parametr wywo ania funkcji LCD_PutText_B musi mie warto false

OptymalizacjaPrzy okazji tego i poprzedniego przyk adu warto zastanowi si jeszcze nad jednkwesti mdash optymalizacji W podanych przyk adach wykorzystano wcze niej omoacute-wione funkcje dost pu do wy wietlacza LCD znajduj ce si w plikach hd44780ci hd44780h Wi kszo z zawartych tam funkcji nie jest wykorzystywana jednakkompilator mimo wszystko umieszcza ich kod w pliku wynikowym mdash dzieje si takponiewa nie mo e on bdquostwierdzi rdquo czy funkcje te nie s wykorzystywane w innychfragmentach programu Pami tajmy e kompilator kompiluje poszczegoacutelne pliki roacute-d owe osobno i dana jego instancja nie bdquowierdquo co znajduje si w innych plikach (innychjednostkach kompilacji) Tak ca o ciow wiedz ma dopiero konsolidator (linker)ktoacutery czy stworzone przez kompilator pliki obiektowe (o rozszerzeniu o) w plikwynikowy Linker jednak bdquonie wierdquo ktoacutera z funkcji programu zosta a u yta a ktoacuteranie mdash informacje te ma wy cznie kompilator W ten sposoacuteb powstaje typowe b dneko o w efekcie nasze nieu ywane funkcje nie s usuwane (linker zostawia je bdquonawszelki wypadekrdquo) i zajmuj niepotrzebnie pami Czy mo na temu jako zaradzi Oczywi cie tak W tym celu trzeba po czy si y kompilatora i linkera co zapewniaj od-powiednie opcje kompilacji We w a ciwo ciach projektu (ProjectProperties lub Alt+F7)wybieramy zak adk Toolchain a nast pnie AVRGNU C Compiler i OptimizationZnajdziemy tam pole wyboru o nazwie Prepare functions for garbage collection (ry-sunek 224)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 69

Rysunek 224 Aby da linkerowi mo liwo usuwania nieu ywanych funkcji nale y skompilowaprogram z wybran opcj ndashffunction-sections ktoacutera spowoduje e ka da funkcja programu znajdzie siwe w asnej sekcji

Zaznaczenie tej funkcji spowoduje umieszczenie ka dej funkcji w osobnej sekcji mdashsamo w sobie nie wp ynie to na skroacutecenie kodu wynikowego ale jest warunkiem nie-zb dnym dla podj cia stosownych dzia a przez linker Aby wyeliminowa nieu y-wane funkcje nale y zaznaczy jeszcze w ga zi AVRGNU LinkerOptimization poleGarbage collect unused sections (rysunek 225)

Rysunek 225 Zaznaczenie opcji Garbage collect unused sections (-Wl--gc-sections) spowodujee nieu ywane funkcje zostan usuni te z kodu wynikowego w efekcie kod programu ulegnie skroacuteceniu

Po zaznaczeniu tych opcji program zostanie skroacutecony o kilkaset bajtoacutew Oczywi cieje li wszystkie funkcje by yby wykorzystane nie uzyskaliby my adnego skroacuteceniakodu Niemniej w sytuacji gdy u ywa si bibliotek zazwyczaj przynajmniej czfunkcji nie jest wykorzystywana warto wi c skorzysta z tej mo liwo ci optymalizacji

Kup książkę Poleć książkę

70 AVR Uk ady peryferyjne

Je li mamy do czynienia z prekompilowan bibliotek (lib) to musi ona by skom-pilowana z zaznaczon opcj Prepare functions for garbage collection (-ffunction-sections) Alternatyw jest umieszczenie ka dej funkcji biblioteki w osobnym pliku(tak jak w przypadku bibliotek AVR-libc)

Na ekranie wyboru opcji optymalizacji linkera mamy jeszcze jedn przydatn opcjmdash Relax Branches (-mrelax) Dla mikrokontroleroacutew ktoacutere maj ponad 8 kB pami ciFLASH instrukcje skokoacutew s generowane jako tzw instrukcje d ugie mdash umo liwiajone skok do komoacuterki pami ci FLASH o dowolnym adresie Jednak cen za to jestwyd u enie instrukcji mdash ich kod jest d u szy podobnie jak czas wykonania Nie zawszejednak takie d ugie instrukcje musz by wykonywane mdash je li miejsce docelowe skokule y blisko (w zasi gu instrukcji skokoacutew wzgl dnych) to mo na w kodzie wynikowymzamieni instrukcje d u sze na kroacutetsze co przynosi oszcz dno ci w postaci skroacuteceniakodu wynikowego Poniewa dopiero linker bdquowierdquo jak poszczegoacutelne fragmenty kodus rozmieszczone w pami ci takiej podmiany mo na dokona na etapie linkowaniaprogramu co zapewnia powy sza opcja St d te warto to pole wyboru zaznaczy

Kup książkę Poleć książkę

SkorowidzA

ABI Application Binary Interface 25AC Address Counter 50ADPCM 482adres

bazowy 377bufora 61komoacuterki 84pu apki 202

ALE Address Latch Enable 368alfanumeryczne wy wietlacze 43algorytm ADPCM 492algorytmy stratne 495animacje 57antyaliasing 325architektury procesoroacutew XMEGA 352asembler 23

dyrektywy 40funkcje j zyka C 41obs uga przerwa 39

asynchroniczne wywo anie funkcji 101Atmel Studio 15

Bbajty kalibracyjne 569biblioteka

FATFS 131 139 176 180 517libcallback-liba 99PetitFS 144 149

bitADC_CH0START_bm 236IMPMODE 244

bitrate 442 512blokowanie przerwa 219b d 16 19

kwantyzacji 463offsetu 230wzmocnienia ADC 230

BOD 223bps bits per second 12

budowakarty 152linii obrazu 394pami ci SDRAM 374pliku stymulacji 192ramki PAL 412sygna u PAL 411wtyczki 544 545

bufor 78FIFO 497na transakcje 61transakcji 62

buforowanie wyj cia 294

CCAS Column Address Strobe 375CCFL 44charakterystyka

przetwornikoacutew 222termistora 264tryboacutew pracy 232

CID Card Identification 169CKE Clock Enable 375CLKIN 421COG Chip on Glass 310CRC 158 178CRC16 178CRC7 164CS Chip Select 361 375CSD Card Specific Data 172czas

dost pu do SDRAM 424adowania kondensatora 244

propagacji 281proacutebkowania 260symulacji 209

czcionki 322cz stotliwo

odchylania pionowego 428proacutebkowania 244 441 444 530przebiegu 504

Kup książkę Poleć książkę

576 AVR Uk ady peryferyjne

cz stotliwoPWM 465taktowania koprocesora 549taktowania procesora 209taktowania rdzenia 18

czyszczenie pami ci 318

DDAC Digital to Analog Converter 293 447 451

buforowanie wyj cia 294generowanie przebiegoacutew 301jitter 303kalibracja 306napi cie referencyjne 295system zdarze 297taktowanie 296tryb dwukana owy 301wykorzystanie DMA 298wyzwalanie konwersji 305

datalogger 261 265 275DD Device Density 86debuger 183

programowy 190sprz towy 185 187

decymacja 259DEBUG 219XMEGA 260

definicja symboli globalnych 36definiowanie w asnych znakoacutew 56deklaracja zapowiadaj ca 103 337dekoder DTMF 548 556DMA 254 298 402 458 518 523dost p do

danych 358 359 568danych binarnych 356 360danych wielobajtowych 31DataFLASH 137EEPROM 128FAT 136komoacuterki 375LCD 59 62 66 68operandu 30pami ci 81 384 386 387 561pami ci SDRAM 424pliku blokowy 141portoacutew IO 30rejestroacutew IO procesora 36rejestroacutew uk adu 499SPI 95sygnatury u ytkownika 565 567wska nikoacutew 32

DQM Data Mask 375DSP Digital Signal Processor 535

DTMF 535 553dyktafon 529dynamiczna alokacja pami ci 516dyrektywa global 38dyrektywy asemblera 40dzia anie

DMA 255komparatora 280timeroacutew 400

d wi k 443

EEBI External Bus Interface 361EEPROM 207eliminacja jitteru 24emulacja RS232 139

FFAT File Allocation Table 128 131FAT32 128FATFS 180filtr

dolnoprzepustowy 491drugiego rz du 470pierwszego rz du 469trzeciego rz du 471

filtrowanie sygna u PWM 468firmware 565FLASH 207format

odpowiedzi 159polecenia 158protoko u 157

funkcja_delay_ms 17 219c_zero 42callback 106 341callback() 99DataFLASH_CSEnable 100DF_FinishBufWrite() 269disk_initialize 136disk_ioctl 181disk_status 136disk_write 138DMA_SPI_init 104DTMF_GetCode 553free_re 65GPIOR0_init 507hd44780_outcmd 51hd44780_outnibble_nowait 65LCD_defchar_P 57

Kup książkę Poleć książkę

Skorowidz 577

Menu_Click_Func 515Menu_Free 516Menu_Recorder 532Menu_Run 527MS_CreateRegEntry 117MS_GetDirPos 125MS_GetRegItem 115MS_WritePages 116 118OSC_wait_for_rdy 473RecMenu_StartStop 532sprintf 142strtok 124sysclk_init() 200 209TMF_memcpy_PF 454udi_cdc_getc() 123udi_cdc_is_rx_ready() 123VS1003_Reset 506

funkcjeanalizuj ce 556biblioteczne 50biblioteki FATFS 143j zyka C 41kontrolera ST7565R 313opoacute niaj ce 17opoacute nie 219reentrant 524specjalne kontrolera 319steruj ce 314zapisu 133

fusebit 557BODACT 560BODLEVEL 560BOOTRST 559DVSDON 560EESAVE 561JTAGEN 558RSTDISBL 559SUT 559TOSCSEL 559

fusebity w AVR-libc 571

Ggenerator obrazu composite 426generowanie

d wi ku 461kolorowego obrazu 437obrazu wideo 391przebiegoacutew 301przerwa 285sygna u composite 409

g bia koloru 326gniazdo

karty SD 156VGA 396

Hhistereza 281

IIDE 11IMA ADPCM 483informacje

o kolorze 431o obrazie 434

inicjalizacjakarty 161karty SDHC 167karty SDSC 167karty SDXC 167licznika 419pami ci 119USART 505

instrukcjaicall 42movw 35nop 13 24

interfejsSCI 498SDI 498SPI 71 79RS232 120UART 123USART 71 73

interpolacja 259interpolacja w XMEGA 260inwersja obrazu 319

Jjednostki 12jitter 24 303 420

Kkalibracja

ADC 229DAC 306 564offsetu 237

kana DMA 82 522karta 154 158

mikroSD 152SD 151 152SDHC 151 152 160SDSC 160SDXC 151 160

Kup książkę Poleć książkę

578 AVR Uk ady peryferyjne

karty pami ci 151 152 157biblioteka FATFS 180budowa 152format polecenia 158inicjalizacja 161 167komunikacja 156odczyt danych 173opcje konfiguracyjne 181rejestry specjalne 169tryby pracy 153zapis danych 176zasilanie 154

kodasemblerowy 23 24C 23dost pu 24

kodowanieμ-law 481ADPCM 483Dialogic ADPCM 494informacji 166 426koloru 425znakoacutew 536

kodyformatoacutew audio 501zdarze 545

kolejno bajtoacutew 533kolor 424 430kolorowy obraz 437komparator 422

analogowy 279 280analogowy XMEGA 282okienkowy 284

kompilacja plikoacutew binarnych 350kompilator avr-gcc 11 359kompresja

ADPCM 482 486d wi ku 480IMA ADPCM 482

komunikacja z koprocesorem 504konfiguracja

4-portowa 364biblioteki 133debugera 185DMA 459 522fusebitoacutew 570kontrolera DMA 257 452komparatoroacutew 285lockbitoacutew 570LPC 371pami ci SDRAM 381PetitFS 149pinu IO 225portoacutew IO 362

preskalera 452projektu 186przerwa 219pu apki 203rejestru EVCTRL 248rejestru PER 67SPI 75sygna u CS 377typu czcionki 324urz dze IO 189USART 76zegara 383

konsolidacja 547kontroler

DMA 254 298 402 458 518 523KS108 310ST7565R 310ndash315 321

konwersjaDAC 305sygna oacutew 396wyzwalana 306

konwertercyfrowo-analogowy 426DAC 427

koprocesormp3 496VS1003B 10

korekcja fazy 466kwantyzacja 463

Llampa CCFL 44LE Latch Enable 433licznik 419

cykli 209TCC1 400timera 20

linie IO 50linie sygna owe

MISO 72 164MOSI 72SCK 72SS 72

linker 69lista

mnemonikoacutew 24modyfikowanych rejestroacutew 32

lockbity 557 561lockbity w AVR-libc 570LPC Low Pin Count 371LPCM 443 556LSB Least Significant Bit 228

Kup książkę Poleć książkę

Skorowidz 579

a cuchy formatuj ce 212czenie plikoacutew 352

Mmagistrala pami ci zewn trznej 361magnetofon cyfrowy 528makro _SFR_IO_ADDR() 39makrodefinicja

ASSERT 214HD44780_CGADDR() 53HD44780_CLR 53HD44780_DDADDR() 53HD44780_DISPCTL() 52HD44780_ENTMODE() 52HD44780_FNSET() 52HD44780_HOME 53HD44780_SHIFT() 51LOCKBITS 571

mapowanie sygna oacutew 366mapy bitowe 343marker czasowy 268maski bitowe 329matryce 49menu 335menu piktogramowe 342mierniki temperatury 262mikrokontroler

ARM 9AVR 9PIC 9XMEGA128A3U 10

MISO 72moc wydzielana 265model psychoakustyczny 495modu

alfanumeryczny 45NVM 568Xmega eXploreGO 10Xplained ATXMEGA A3BU 10Xplained ATXMEGA-A1 10Xplained XMEGA128A1 447Xplained XMEGA256A3 94Xplained XMEGA256A3BU 97 143 266

modyfikator 30const 85volatile 28 273

monitory CRT 395monochromatyczne wy wietlacze graficzne 309monochromatyczny

tryb graficzny 416tryb tekstowy 413

MOSI 72mp3 495Msps Megasamples per second 12multiplekser wej ciowy 226 283multipleksowanie adresoacutew 368 369muzyka 439

Nnadawanie kodoacutew DTMF 540nadproacutebkowanie 258nag oacutewek kontenera wav 500nagrywanie mowy 486najmniej znacz cy bit 228napi cie

offsetu 280referencyjne 223 295zasilania 239

Oobracanie obrazu 319obraz 319

composite 426kolorowy 430wideo 391

obroacutebka d wi ku 443 445obs uga

FAT 131 143klawiatury matrycowej 24LCD 58 63 67menu 337przerwania 37 38 458przerwania DMA 525przerwa w asemblerze 39przyciskoacutew 272wy wietlaczy alfanumerycznych 45

odczytblokowy 140danych 173 358

odpowied response 159R1 159R2 159R7 160

od wie anie pami ci 376odtwarzanie

d wi ku 472muzyki 447 513 518 521

offset 238offset ADC 230okno

Breakpoints 202Call stack 209dezasemblera 210

Kup książkę Poleć książkę

580 AVR Uk ady peryferyjne

oknoIO View 207podgl du zmiennych 211wyboru czcionek 324

OLED 46opcje

kompilatora 35zapisu d wi ku 445

operacjena buforach 91odczytu 173zapisu 176zapisu strony 92

operand 29operator

ascii 41

asciz 41

byte 41

section 41opoacute nienia 13 18opoacute nienie zmienne 16optymalizacja 16 68optymalizator 26organizacja pami ci 77organizacja pami ci VRAM 316oscylator 287OSD On-Screen Display 417ostrze enie 16oszcz dzanie energii 94

Ppakiet WinAVR 48pami

CGRAM 56 57 64DataFLASH 10 77 81 113 269DDRAM 49EEPROM 111FLASH 54 124 207RAM 49SDRAM 372SRAM 63 124 329 366 371VRAM 314 317

PCLK 421PCM 443PetitFS 144 149p tla

for 13while 201

pierwsza linia obrazu 321piksel 430piktogram 342pin IO 225

plikAlloc_safeh 65DataFLASHc 83DataFLASHIOc 136definesh 50delayh 14diskioh 132 136ffh 132ffconfh 132 181hd44780h 49integerh 132ioh 30LCD_transc 61LCD-transactc 66Makefile 14Menuc 19nothingo 541outfiletxt 547 551pffh 149SPIh 104stringh 113stymulacji 191 192

pliki mp3 495elf 351fon 323o 24S 24 34binarne 350 355csv 276d wi kowe 440obiektowe 352wav 500WMA 512z czcionkami 327z danymi 349

podbijacz napi cia 315podgl d

pami ci 207stosu wywo a 209zmiennych 211znakoacutew 325

pod czeniefototranzystora 262karty SD 155LCD z kontrolerem 311modu u 50pami ci 362 369 370 373termistora 262uk adu LM35 251wyj XMEGA 398

pod wietlenieCCFL 46OLED 46

Kup książkę Poleć książkę

Skorowidz 581

podwoacutejne buforowanie 255 332 457polecenia

kasowania strony 81konfiguracyjne pami ci 82kontrolera ST7565R 315odczytu bufora 82 89odczytu pami ci 81 88SDRAM 376transferu 91

polecenieACMD41 168cd 181CID 178CMD0 165CMD8 167CSD 178date 276dir 127 181dump 276erase 276get 276HD44780_CLR 51Init 178mkdir 181

po czenieDMA ze SPI 96dwoacutech komparatoroacutew 285koprocesora mp3 497LCD z mikrokontrolerem 48wyj cia XMEGA 411XMEGA z PC 121z telewizorem 431

pomiarnapi cia zasilania 239temperatury MCU 241

port IO 30 362pozycjonowanie grafik 345poacute obraz 410precyzja pomiaroacutew 260preskaler 478preskaler ADC 243program

Atmel Data Visualizer 275Audacity 443avr-objcopy 350dataloggera 265LCD Image Converter 323makeloadingtableexe 543Realterm 127 554riffstrip 483SoX 445Tracepoint 208

programowanie sygnatury u ytkownika 566protokoacute master-slave 157

prototypy 136proacutebki d wi kowe 447proacutebkowanie

8-bitowe 300nieliniowe 480

prymitywy graficzne 330przebieg PWM 468przebiegi 289 303przechwytywanie danych 276przemiatanie wej 253przerwanie 218 254 286 403

DMA 522komparatora 286

przestrze adresowa procesora 378przesy anie

danych 498polece 498

przetaktowanie procesora 436przetwornik

ADC 221analogowo-cyfrowy 221cykliczny 222potokowy 222

przyciski 272pseudooperatory 41pu apki breakpoints 197pu apki warunkowe 205punkty ledzenia 203PWM 461 462 472

RRAS Row Address Strobe 375redukcja poboru energii 242regulacja kontrastu 321rejestr 32 34rejestr AC 50

adresu wtyczki 513BASEADDR 377CID 169CMP 251CSD 172czasu utworu 512DATA 83EVCTRL 248formatu audio 512identyfikacyjny pami ci 87INTFLAGS 252kontroli basoacutew 510kontroli g o no ci 513MUXCTRL 227OCR 168PER 67poroacutewnania 249

Kup książkę Poleć książkę

582 AVR Uk ady peryferyjne

rejestr ACSCI_CLOCKF 511stanu komparatora 287stanu pami ci 86stanu uk adu 510trybu pracy 508WINCTRL 285

rejestrydost pu do pami ci RAM 513GPIOR 502IO procesora 36mikrokontrolera 25procesora 35specjalne 94specjalne karty 169uk adu VS1003B 508

relacja rodzic ndash dziecko 336reset uk adu 534rozdzielczo

LCD 329przetwornika 231PWM 463 477

rozszerzenie HiRes 477 479roacutewnanie Steinharta-Harta 263rysowanie map bitowych 343

Sschemat uk adu dataloggera 267SCI Serial Command Interface 498SCK 72SD Secure Digital 152SDI Serial Data Interface 498separator synchronizacji 422separowanie impulsoacutew synchronizacji 422shieldy 10skaler 422skaler napi cia 283skrypt makefile 353s owo kluczowe

asm 27extern 37static 68

specyfikatory lokalizacji zmiennej 213sps samples per second 12SS Slave Select 72standard PAL 410standard VGA 393sterowanie

dataloggerem 275sygna em 379

sterownik 121HD44780 49 56LCD 49 62

stos wywo a 209

strukturaFATFS 139Handle 118LCD_trans 60 63menu 338rejestru 86SimpleFSEntry 113 116SimpleFSHandle 113 118 140submenu 527systemu plikoacutew 112

sumabitowa 571kontrolna 178

sygnacomposite 409composite video output 430CS 377DREQ 497H-Sync 396synchronizacji 423V-Sync 396zegarowy CLK 374

sygna yinterfejsu EBI 363magistrali EBI 364steruj ce 375

sygnaturaprodukcyjna procesora 563u ytkownika 565

symbol__DELAY_ROUND_CLOSEST__ 17__DELAY_ROUND_DOWN__ 17_FS_FAT12 149_FS_FAT32 149_FS_MINIMIZE 133_FS_READONLY 133_FS_RPATH 135_FS_TINY 133_MAX_SS 135_MULTI_PARTITION 135_USE_DIR 149_USE_FASTSEEK 134_USE_FORWARD 134_USE_LABEL 134_USE_LFN 134_USE_LSEEK 149_USE_MKFS 134_USE_READ 149_USE_STRFUNC 134_USE_WRITE 149_VOLUMES 136F_CPU 14 15 18increment 36USE_BUSY_FLAG 50

Kup książkę Poleć książkę

Skorowidz 583

symboleglobalne 36w asemblerze 28zewn trzne 39

symulacja 198 209symulator 190synchronizacja

pami ci 331pionowa 395pozioma 394

systemplikoacutew 111 128przerwa 404zdarze 245

szablonfont_XMEGAtmpl 326image_XMEGAtmpl 343

szum 463szybko przesy ania danych 126

ledzenie wi zki 333rodowisko

graficzne 11programistyczne 11VSIDE 542WinAVR 47

Ttabela FAT 130tablica

framebuf 402 408plugintbl 552 555tekst 208z kodem wynikowym 543

taktowanieDAC 296mikrokontrolera 473

technologia OLED 44temperatura mikrokontrolera 239 241termistor 262 290

NTC 263PTC 263

termometrLM35 249 250z alarmem 251

termostat 290test uk adu VS1003B 503testowanie obrazu 319timer 16 62

TCC0 20

TCC1 399transakcja 59 62 65transakcje 17 103ndash107transakcyjna obs uga LCD 58transakcyjny dost p do SPI 95transfer 91

danych 97wynikoacutew 254

transmisja 72 83tryb

bez znaku 234ci g ej konwersji 252czterobitowy 153dwukana owy 301graficzny 416graficzny VGA 407idle 419jednobitowy 153LPC 371monochromatyczny 397 407oszcz dzania energii 94 306pracy multipleksera 226pracy SPI 157roacute nicowy 232single slope 312SPI 153tekstowy 413tekstowy VGA 397z pojedynczym wej ciem 234ze znakiem 235

trybygenerowania PWM 467pracy karty 153pracy przetwornika 231pracy SPI 74pracy uk adu 508

twierdzenie Nyquista 258tworzenie

adresu 84nak adek 417obrazu 335tablicy 543

typ__uint24 119karty 160niekompletny 60wyliczeniowy 114

typyoperandoacutew 29w AVR 34

Kup książkę Poleć książkę

584 AVR Uk ady peryferyjne

Uuchwyt handle 64 113uk ad

AD725 427 431buforowy 294CS 361DAC 284dataloggera 267detekcji awarii zasilania 559generuj cy obraz 393HiRes 477ICL7660 47LM35 250 251SampH 293sterowania sygna em 379USART 401VS1003B 496 503 508 530 538 556VS100XX 529wzmacniania sygna u 227

uk ady peryferyjne 9uruchomienie komparatora 287urz dzenie

master 72slave 72

u rednianie 259utrata danych 141u ycie wstawki asemblerowej 33

VVGA 393

Wwarto ci kalibracyjne

ADC 564oscylatoroacutew 564temperatury 564

warunkowa kompilacja 36WE Write Enable 375wej cie composite video input 425wektor przerwa 38 257wideo 391wielko pami ci 86 377w czenie DAC 299wska nik na struktur 27wska niki 32wstawki asemblerowe 24 33wtyczka 535 541 544

SineDTMF Generator 537VGA 396

wyboacuter cz stotliwo ci PWM 465 474wykorzystanie

DMA 254 518

EuroSCART 428PWM 461rejestroacutew 34

wyliczanie predyktora 489wy wietlacze

alfanumeryczne 43 45graficzne 43 309LCD 43OLED 46

wy wietlanielitera u 213map bitowych 344obrazu 333 346 406obrazu VGA 393

wywo ania zwrotne callbacks 98asynchroniczne 101synchroniczne 101

wyzwalanie konwersji 245wzmacniacz 446wzmacniacz operacyjny 279wzmacnianie sygna u 227

XXMEGA 9 18

Zzapis

bufora 269danych 176d wi ku 440 556

zasilaniekarty 154pami ci 109

zatrzask 368zatrzask 74HC573 433zatrza ni cie adresu 369zdarzenia 297zdarzenie compare match 399zegar 383 420 426zintegrowane rodowisko programistyczne 11z cze EuroSCART 425 428 429zmiana

g o no ci 527wielko ci strony 94

znaki 56

roacuted onapi cia odniesienia 284sygna u 240

Kup książkę Poleć książkę

Page 28: Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8 AVR. Ukäady peryferyjne Rejestry dost pu do pami ci RAM .....513 Rejestr adresu

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 63

poziom logiczny umo liwiaj cy zapis do LCD Dzi ki temu mo na zaoszcz dzi do-datkowy pin IO1

Ca a logika naszego sterownika jest zawarta w funkcji obs ugi przerwania przepe nieniatimera (TCD0_OVF_vect) Poniewa LCD jest po czony z MCU w trybie 4-bitowym(dla zaoszcz dzenia liczby wykorzystanych pinoacutew IO) kolejne 8-bitowe dane muszby podzielone na dwie tetrady i wys ane do LCD w kolejno ci starszam odsza tetradaInformacja o aktualnie wysy anych danych jest umieszczona w zmiennej trans o typie

static struct uint8_t pos 6 Pozycja w polu danych aktualnej transakcji uint8_t nibble 1 Ktoacutera tetrada jest wysy ana seq

Dlaczego tak Dzi ki wykorzystaniu struktury i poacutel bitowych mo na zaoszcz dzi je-den bajt pami ci SRAM Ze wzgl du na wielko pami ci obs ugiwanej przez kon-troler LCD mo emy by pewni e transakcje zawieraj ce wi cej ni 63 bajty s ra-czej nierealne (nie mia yby wi kszego sensu) St d te do przechowywania informacjio aktualnie wysy anym bajcie danych wystarczy 6 bitoacutew mdash tyle samo zosta o wyko-rzystanych do okre lenia d ugo ci pola danych transakcji w strukturze LCD_trans Zaosz-cz dzony bit mo na po wi ci na flag nibble okre laj c ktoacutera tetrada (m odszastarsza)jest wysy ana Bez poacutel bitowych flaga ta zaj aby dodatkowy bajt pami ci

Przejd my do implementacji sterownika Pierwsz rzecz jak nale y sprawdzi jestto czy w buforze czeka jaka transakcja do zrealizowania Odpowiedzialny za to jestfragment kodu obs ugi przerwania nadmiaru timera

if(trans == NULL) Nic do zrobienia sprawd my czy jaka transakcja oczekuje trans=cbRead(ampLCD_TransBuffer) Czy jest jaka oczekuj ca transakcja seqpos=0 seqnibble=0 if(trans == NULL) TCD0_CTRLA=TC_CLKSEL_OFF_gc Nie ma adnych transakcji mdash wy cz timer

W przypadku gdy adna transakcja nie oczekuje na realizacj timer jest wy czanymdash dzi ki temu nie b d zg aszane kolejne przerwania przepe nienia i MCU nie b -dzie traci czasu na ich obs ug Co prawda wynikaj cy z tego zysk czasowy jest mar-ginalny lecz ma to istotniejsz konsekwencj mdash w przypadku usypiania MCU zb d-ne przerwanie timera nie b dzie niepotrzebnie wybudza o procesora W takiej sytuacjiponowne w czenie timera nast pi dopiero w funkcji dodaj cej transakcj do kolejkimdash a wi c w sytuacji gdy mamy pewno e istnieje oczekuj ca transakcja

Druga cz funkcji obs ugi przerwania jest zwi zana z realizacj samej transakcjiW pokazanym przyk adzie zaimplementowano tylko jeden typ transakcji mdash daniezapisu a cucha tekstowego pod wskazany adres VRAM (na okre lonej pozycji LCD)Je li zajdzie taka potrzeba programista mo e zaimplementowa inne polecenia i doda

1 Warto zauwa y e w bdquoklasycznejrdquo obs udze LCD te nie musimy czyta stanu flagi busy zamiast tego

wystarczy wprowadza p tle opoacute niaj ce Jednak poniewa taka obs uga blokuje MCU nie jest onazalecana Wady tej nie ma dost p transakcyjny co jest jego dodatkow zalet

Kup książkę Poleć książkę

64 AVR Uk ady peryferyjne

kod odpowiedzialny za ich obs ug Zauwa my e ka da transakcja musi zawieraadres pocz tku pami ci wideo od ktoacuterego b dzie zapisywany tekst Dzieje si takdlatego e transakcja wykonana wcze niej mo e ustawi wska nik zapisu na dowolnejkomoacuterce pami ci W efekcie tekst z kolejnej transakcji by by wy wietlany od komoacuterkina ktoacuterej zako czy si zapis poprzedniej transakcji Takie dzia anie oczywi cie jestniedopuszczalne st d te ka dy zapis do pami ci wideo poprzedza ustawienie rejestruindeksowego Problem ten mo na rozwi za tak e w inny sposoacuteb mdash poprzez wpro-wadzenie tzw uchwytoacutew (ang handlers) ktoacutere zawiera yby stan kontrolera LCDNiemniej to rozwi zanie dodatkowo komplikowa oby nasz sterownik Struktura danych(zawartych w polu data) ma wi c nast puj cy format

bajt nr 0 zawiera warto pozycji od ktoacuterej nale y dokonywa zapisu pami ciwideo mdash jest to warto przesy ana do rejestru okre laj cego adres zapisu

kolejne bajty zawieraj a cuch znakowy ktoacutery nale y umie ci w pami ciCGRAM

Poniewa bajt nr 0 zawsze zawiera warto wpisywan do rejestroacutew steruj cych kon-trolera podczas jego wysy ania jest ustawiana linia RS sygnalizuj ca zapis do rejestruPodczas wysy ania kolejnych bajtoacutew linia ta jest zerowana w zwi zku z czym zapisodbywa si do pami ci CGRAM

Kod obs uguj cy transakcj wygl da nast puj coif(trans) Jest transakcja do zrealizowania uint8_t dat=trans-gtdata[seqpos] if(seqnibble == 0) datgtgt=4 To trzeba zmieni je li linie danych nie s po czone z pinami 0 ndash 3 portu IO hd44780_outnibble_nowait(dat amp 0x0F seqpos = 0) Zapisujemy rejestr steruj cy lub dane ++seqnibble if(seqnibble == 0) ++seqpos Co drug tetrad zwi kszamy pozycj bufora if(seqpos gt= trans-gtlen) trans-gtReady=true Koniec transakcji if(trans-gtSelfDel) free_re(trans) Zwolnij pami transakcji je li tak sobie yczy programista trans=NULL Koniec transakcji CLR(OUT HD44780_E)

Ta cz przerwania wysy a kolejne tetrady do kontrolera LCD Warto zastanowi sinad dzia aniem sekwencji

++seqnibble

Poniewa pole nibble jest jednobitowe operacja inkrementacji prowadzi do zmianystanu tego pola na przeciwny (pole to ma warto 0 lub 1) Kiedy zostan wys anewszystkie dane przeznaczone dla kontrolera obs uga transakcji ko czy si Stan tensygnalizuje nadanie warto ci true polu Ready struktury LCD_trans Dzi ki temu pro-gram mo e sprawdzi asynchronicznie w stosunku do przerwania kiedy transakcjauleg a zako czeniu Opcjonalnie jest wykonywana jeszcze jedna funkcja mdash je li poleSelfDel ma warto true to pami zarezerwowana na transakcj jest automatycznie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 65

zwalniana W tym celu wykorzystuje si funkcj free_re ktoacuterej prototyp jest zade-klarowany w pliku Alloc_safeh Funkcja ta wywo uje funkcj biblioteczn free ktoacute-ra zwalnia pami przydzielon dynamicznie na stercie Poniewa funkcja ta nie jestfunkcj reentrant nale y stworzy odpowiedni bdquoprotez rdquo opakowuj c j w blokatomowy co zapewnia e nie zostanie ona ponownie wywo ana zanim jej poprzed-nia instancja nie zako czy dzia ania Oczywi cie lepszym rozwi zaniem by oby napi-sanie w asnych funkcji dynamicznej alokacji pami ci ktoacutere b d reentrant

Bardzo wa ne jest aby pole SelfDel mia o warto true wy cznie dla transakcjidla ktoacuterych pami zosta a przydzielona dynamicznie funkcj malloc (lub jej po-chodnymi) W pozosta ych przypadkach pole to musi mie warto false mdash nie-stosowanie si do tej regu y spowoduje b d mened era pami ci i najprawdopo-dobniej nieprzewidywalne dzia anie programu

Drug wa n zasad jest aby zmienna zawieraj ca dane transakcji nie by azmienn automatyczn mdash zmienne takie s automatycznie niszczone po opusz-czeniu zawieraj cej je funkcji W rezultacie obszar pami ci zawieraj cy danetransakcji mo e zosta wykorzystany przez inne zmienne co spowoduje uszkodzeniezawartych w nim danych

Pami przydzielona transakcji musi by alokowana w sposoacuteb dynamiczny (funkcjamalloc_re) ewentualnie mo e to by pami alokowana dla zmiennej globalnej lubstatycznej mdash zmienne tego typu istniej przez ca y czas ycia programu

Warto te zauwa y e instrukcje steruj ce stanem linii Enable kontrolera LCD(SET(OUT HD44780_E) i CLR(OUT HD44780_E)) s rozdzielone wieloma innymi in-strukcjami Dzi ki temu generowany impuls dodatni tego sygna u ma czas trwania gt230 ns wymagany w specyfikacji kontrolera Nawet dla XMEGA taktowanej zegarem32 MHz 230 ns przek ada si na oko o 7 instrukcji asemblera mdash czas jaki z pewno-ci up ynie pomi dzy wykonaniem obu powy szych instrukcji steruj cych

Do wysy ania danych do kontrolera zosta a wykorzystana nieco zmodyfikowanafunkcja hd44780_outnibble_nowait roacute ni ca si od jej protoplasty hd44780_outnibbletylko tym e nie czeka na sygna braku zaj to ci mikrokontrolera (nie realizuje teopoacute nie ) Nie jest to potrzebne gdy kolejne tetrady s wysy ane w odst pach cza-sowych okre lanych przez timer

Mamy wi c zapewnion obs ug transakcji i mo liwo transakcyjnego wy wietlaniadanych na LCD musimy jeszcze mie funkcj ktoacutera tworzy odpowiednie transakcjemdash jest odpowiednikiem funkcji bezpo rednio wysy aj cej dane znakowe do LCDOdpowiednikiem tym jest pokazana poni ej funkcja

bool LCD_PutText_B(uint8_t x uint8_t y char txt LCD_trans buf bool autodel) buf-gtcmd=LCD_Text buf-gtReady=false buf-gtSelfDel=autodel Czy zwolni pami po zako czeniu transakcji buf-gtdata[0]=HD44780_DDADDR(x+y0x40) Ustaw adres w DDRAM strcpy((char)ampbuf-gtdata[1] txt) Skopiuj dane tekstowe + NULL

Kup książkę Poleć książkę

66 AVR Uk ady peryferyjne

buf-gtlen=strlen(txt) + 1 D ugo tekstu + pozycji + NULL ndash 1 bool ret=cbAdd(ampLCD_TransBuffer buf) if((ret==false) ampamp (autodel)) free_re(buf) Brak miejsca w kolejce else TCD0_CTRLA=TC_CLKSEL_DIV1_gc Preskaler 1 mdash odblokuj timer return ret

Funkcja ta buduje transakcj odpowiedzialn za wy wietlenie napisu txt na wskaza-nej pozycji x y LCD Wszystkie dane o transakcji zostan umieszczone w buforzew pami ci ktoacuterej adres jest okre lany wska nikiem buf Pami w buforze musi bywystarczaj co du a aby pomie ci ca transakcj Dodatkowy parametr autodel okre laczy pami ta ma by automatycznie zwalniana po obs u eniu transakcji (true) czynie (false) Je li transakcj uda o si umie ci w kolejce funkcja zwraca true Wartozauwa y e w takim przypadku funkcja uruchamia te timer (w naszym przypadkujest to timer TCD0) odpowiedzialny za generowanie przerwania Funkcja obs ugi prze-rwania wysy a dane do LCD

Pewn odmian powy szej funkcji jest funkcjabool LCD_PutText(uint8_t x uint8_t y char txt) LCD_trans trans=malloc_re(sizeof(LCD_trans) + strlen(txt) + 2) bool ret=LCD_PutText_B(x y txt trans true) return ret

Wykorzystuje ona funkcj LCD_PutText_B z tym e najpierw alokuje dynamiczniepami potrzebn na przechowanie tworzonej transakcji

Mamy komplet potrzebnych funkcji a wi c sprawd my jak ca o sprawdza siw praktyce W pliku LCD-transactc znajduje si kod pokazuj cy jak dzia aj naszetransakcje Aby to by o mo liwe nale y zainicjalizowa kontroler LCD

LCD_init()

Wykorzystujemy tu znan ju funkcj inicjalizuj c mdash nie ma potrzeby jej zmienia gdy operacja inicjalizacji LCD jest jednorazowa i nie trzeba wykonywa jej w posta-ci transakcji W drugim kroku musimy zainicjalizowa wykorzystywany timer i systemprzerwa

LCD_Timer_init(ampTCD0)PMIC_CTRL|=PMIC_LOLVLEN_bm Odblokuj przerwania niskiego poziomusei()

Poniewa dost p do LCD z pewno ci nie jest czynno ci krytyczn czasowo prze-rwaniom timera nadano najni szy priorytet Dzi ki temu mo na innym bardziej kry-tycznym przerwaniom nada wy sze priorytety i uzyska w ten sposoacuteb zmniejszenieczasu latencji obs ugi przerwa Sama inicjalizacja timera jest niezwykle prosta

void LCD_Timer_init(TC0_t tc) tc-gtINTCTRLA=TC_OVFINTLVL_LO_gc Odblokuj przerwania nadmiaru timera i nadaj im niski priorytet tc-gtPER=F_CPULCD_ACCESSTIME Przerwanie co 4 us (niezale nie od F_CPU)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 67

Sprowadza si ona tylko do odblokowania mo liwo ci zg aszania przerwania nadmia-ru oraz konfiguracji rejestru PER tak aby przerwania by y generowane co ok 4 s mdashniezale nie od cz stotliwo ci taktowania CPU Mo emy wi c przyst pi do wy wie-tlenia pierwszego napisu

LCD_PutText(00 Numer)

Powy sza funkcja ma jedn wad mdash alokuje dynamicznie pami po ka dym wywo-aniu (pami ta jest automatycznie zwalniana po obs u eniu transakcji) niemniej

ca y proces jest czasoch onny Mo emy tego unikn alokuj c pami bdquor cznierdquo i wielo-krotnie wykorzystuj c zaalokowany blok pami ci Ilustruje to poni szy przyk ad

LCD_trans buf=malloc_re(sizeof(LCD_trans) + 7)

Zmienna buf wskazuje na obszar pami ci ktoacutery mo e pomie ci a cuch 5-znakowyTyle wystarczy na potrzeby tego przyk adu mdash na LCD b d wy wietlane kolejneliczby w zakresie 0 ndash 65 535 najd u sza ma 5 znakoacutew st d te nasz bufor ma tak a nieinn d ugo

while(1) utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(60 bufstr buf false) while(LCD_IsTransCompleted(buf))

Do konwersji liczby na a cuch u yto funkcji bibliotecznej utoa (nag oacutewek stdlibh)Poniewa d ugo a cucha po konwersji jest zmienna (co spowodowa oby pozosta-wianie na LCD bdquoduchoacutewrdquo po poprzednich konwersjach) w kolejnej linii brakuj ceznaki uzupe niono spacjami Nast pnie tworzona jest transakcja w obszarze pami ciprzydzielonym zmiennej buf Ostatnia p tla while jest odpowiedzialna za oczekiwa-nie na zako czenie realizacji transakcji Po jej zako czeniu p tla jest wykonywana odpocz tku

Uwa ny czytelnik z pewno ci zauwa y e pami przydzielana funkcj malloc_renie jest nigdzie zwalniana mdash w normalnej sytuacji spowodowa oby to wyciek pami -ci W naszym przyk adzie jednak program nigdy si nie ko czy nie ma wi c potrzebyzwalniania pami ci wskazywanej przez zmienn buf

Powy szy przyk ad pokazuje jak unikn blokowania CPU na czas dost pu do wolnodzia aj cego urz dzenia jakim jest LCD alfanumeryczny Jednak to nie wszystkiezalety wynikaj ce z zastosowania transakcji Drug wa n zalet naszego rozwi zaniailustruje przyk ad znajduj cy si w katalogu PrzykladyLCD-alfaLCD-transact-intPowa nym ograniczeniem funkcji odpowiedzialnych za dost p do LCD w sposoacutebklasyczny by a niemo no ich wywo ywania z funkcji obs ugi przerwa mdash funkcjeobs ugi LCD nie by y reentrant2 Nasz system oparty na transakcjach nie ma tychwad Aby to zilustrowa zosta stworzony prosty przyk ad mdash tak jak poprzedniow p tli g oacutewnej programu s wy wietlane stale kolejne liczby ale jednocze nie wyko-

2 Poza tym blokowa y CPU na d ugi czas a jak pami tamy funkcje obs ugi przerwa powinny by

wykonywane mo liwie kroacutetko

Kup książkę Poleć książkę

68 AVR Uk ady peryferyjne

rzystano drugi timer (TCD1) w ktoacuterego funkcji obs ugi przerwania przepe nienia jestwy wietlany licznik tych przerwa

ISR(TCD1_OVF_vect) static char int_buf[sizeof(LCD_trans) + 7] static uint16_t cnt char bufstr[6]

utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(61 bufstr (LCD_trans)ampint_buf false)

Jak widzimy w sposoacuteb asynchroniczny z dwoacutech miejsc w programie mo emy uzy-ska dost p do LCD a ka da funkcja bdquoma wra enierdquo e ma LCD na wy czno Przy okazji warto przeanalizowa sposoacuteb w jaki jest rezerwowana pami na trans-akcj w przerwaniu Oczywi cie mo na by wykorzysta dynamiczn alokacj pami cilecz jak wspomniano taka alokacja jest czasoch onna St d te w pokazanym przy-k adzie wykorzystano tablic statyczn int_buf o rozmiarze umo liwiaj cym prze-chowanie kompletnej transakcji Dzi ki temu e zmienna int_buf jest zmienn statycz-n nie jest ona niszczona po zako czeniu funkcji obs ugi przerwania Gdyby pomins owo kluczowe static zmienna ta by aby niszczona a na LCD najprawdopodobniejzacz yby si pojawia przypadkowe tre ci Poniewa pami naszego bufora nie by aalokowana dynamicznie nie mo e ona zosta zwolniona w naszym sterowniku LCDst d te ostatni parametr wywo ania funkcji LCD_PutText_B musi mie warto false

OptymalizacjaPrzy okazji tego i poprzedniego przyk adu warto zastanowi si jeszcze nad jednkwesti mdash optymalizacji W podanych przyk adach wykorzystano wcze niej omoacute-wione funkcje dost pu do wy wietlacza LCD znajduj ce si w plikach hd44780ci hd44780h Wi kszo z zawartych tam funkcji nie jest wykorzystywana jednakkompilator mimo wszystko umieszcza ich kod w pliku wynikowym mdash dzieje si takponiewa nie mo e on bdquostwierdzi rdquo czy funkcje te nie s wykorzystywane w innychfragmentach programu Pami tajmy e kompilator kompiluje poszczegoacutelne pliki roacute-d owe osobno i dana jego instancja nie bdquowierdquo co znajduje si w innych plikach (innychjednostkach kompilacji) Tak ca o ciow wiedz ma dopiero konsolidator (linker)ktoacutery czy stworzone przez kompilator pliki obiektowe (o rozszerzeniu o) w plikwynikowy Linker jednak bdquonie wierdquo ktoacutera z funkcji programu zosta a u yta a ktoacuteranie mdash informacje te ma wy cznie kompilator W ten sposoacuteb powstaje typowe b dneko o w efekcie nasze nieu ywane funkcje nie s usuwane (linker zostawia je bdquonawszelki wypadekrdquo) i zajmuj niepotrzebnie pami Czy mo na temu jako zaradzi Oczywi cie tak W tym celu trzeba po czy si y kompilatora i linkera co zapewniaj od-powiednie opcje kompilacji We w a ciwo ciach projektu (ProjectProperties lub Alt+F7)wybieramy zak adk Toolchain a nast pnie AVRGNU C Compiler i OptimizationZnajdziemy tam pole wyboru o nazwie Prepare functions for garbage collection (ry-sunek 224)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 69

Rysunek 224 Aby da linkerowi mo liwo usuwania nieu ywanych funkcji nale y skompilowaprogram z wybran opcj ndashffunction-sections ktoacutera spowoduje e ka da funkcja programu znajdzie siwe w asnej sekcji

Zaznaczenie tej funkcji spowoduje umieszczenie ka dej funkcji w osobnej sekcji mdashsamo w sobie nie wp ynie to na skroacutecenie kodu wynikowego ale jest warunkiem nie-zb dnym dla podj cia stosownych dzia a przez linker Aby wyeliminowa nieu y-wane funkcje nale y zaznaczy jeszcze w ga zi AVRGNU LinkerOptimization poleGarbage collect unused sections (rysunek 225)

Rysunek 225 Zaznaczenie opcji Garbage collect unused sections (-Wl--gc-sections) spowodujee nieu ywane funkcje zostan usuni te z kodu wynikowego w efekcie kod programu ulegnie skroacuteceniu

Po zaznaczeniu tych opcji program zostanie skroacutecony o kilkaset bajtoacutew Oczywi cieje li wszystkie funkcje by yby wykorzystane nie uzyskaliby my adnego skroacuteceniakodu Niemniej w sytuacji gdy u ywa si bibliotek zazwyczaj przynajmniej czfunkcji nie jest wykorzystywana warto wi c skorzysta z tej mo liwo ci optymalizacji

Kup książkę Poleć książkę

70 AVR Uk ady peryferyjne

Je li mamy do czynienia z prekompilowan bibliotek (lib) to musi ona by skom-pilowana z zaznaczon opcj Prepare functions for garbage collection (-ffunction-sections) Alternatyw jest umieszczenie ka dej funkcji biblioteki w osobnym pliku(tak jak w przypadku bibliotek AVR-libc)

Na ekranie wyboru opcji optymalizacji linkera mamy jeszcze jedn przydatn opcjmdash Relax Branches (-mrelax) Dla mikrokontroleroacutew ktoacutere maj ponad 8 kB pami ciFLASH instrukcje skokoacutew s generowane jako tzw instrukcje d ugie mdash umo liwiajone skok do komoacuterki pami ci FLASH o dowolnym adresie Jednak cen za to jestwyd u enie instrukcji mdash ich kod jest d u szy podobnie jak czas wykonania Nie zawszejednak takie d ugie instrukcje musz by wykonywane mdash je li miejsce docelowe skokule y blisko (w zasi gu instrukcji skokoacutew wzgl dnych) to mo na w kodzie wynikowymzamieni instrukcje d u sze na kroacutetsze co przynosi oszcz dno ci w postaci skroacuteceniakodu wynikowego Poniewa dopiero linker bdquowierdquo jak poszczegoacutelne fragmenty kodus rozmieszczone w pami ci takiej podmiany mo na dokona na etapie linkowaniaprogramu co zapewnia powy sza opcja St d te warto to pole wyboru zaznaczy

Kup książkę Poleć książkę

SkorowidzA

ABI Application Binary Interface 25AC Address Counter 50ADPCM 482adres

bazowy 377bufora 61komoacuterki 84pu apki 202

ALE Address Latch Enable 368alfanumeryczne wy wietlacze 43algorytm ADPCM 492algorytmy stratne 495animacje 57antyaliasing 325architektury procesoroacutew XMEGA 352asembler 23

dyrektywy 40funkcje j zyka C 41obs uga przerwa 39

asynchroniczne wywo anie funkcji 101Atmel Studio 15

Bbajty kalibracyjne 569biblioteka

FATFS 131 139 176 180 517libcallback-liba 99PetitFS 144 149

bitADC_CH0START_bm 236IMPMODE 244

bitrate 442 512blokowanie przerwa 219b d 16 19

kwantyzacji 463offsetu 230wzmocnienia ADC 230

BOD 223bps bits per second 12

budowakarty 152linii obrazu 394pami ci SDRAM 374pliku stymulacji 192ramki PAL 412sygna u PAL 411wtyczki 544 545

bufor 78FIFO 497na transakcje 61transakcji 62

buforowanie wyj cia 294

CCAS Column Address Strobe 375CCFL 44charakterystyka

przetwornikoacutew 222termistora 264tryboacutew pracy 232

CID Card Identification 169CKE Clock Enable 375CLKIN 421COG Chip on Glass 310CRC 158 178CRC16 178CRC7 164CS Chip Select 361 375CSD Card Specific Data 172czas

dost pu do SDRAM 424adowania kondensatora 244

propagacji 281proacutebkowania 260symulacji 209

czcionki 322cz stotliwo

odchylania pionowego 428proacutebkowania 244 441 444 530przebiegu 504

Kup książkę Poleć książkę

576 AVR Uk ady peryferyjne

cz stotliwoPWM 465taktowania koprocesora 549taktowania procesora 209taktowania rdzenia 18

czyszczenie pami ci 318

DDAC Digital to Analog Converter 293 447 451

buforowanie wyj cia 294generowanie przebiegoacutew 301jitter 303kalibracja 306napi cie referencyjne 295system zdarze 297taktowanie 296tryb dwukana owy 301wykorzystanie DMA 298wyzwalanie konwersji 305

datalogger 261 265 275DD Device Density 86debuger 183

programowy 190sprz towy 185 187

decymacja 259DEBUG 219XMEGA 260

definicja symboli globalnych 36definiowanie w asnych znakoacutew 56deklaracja zapowiadaj ca 103 337dekoder DTMF 548 556DMA 254 298 402 458 518 523dost p do

danych 358 359 568danych binarnych 356 360danych wielobajtowych 31DataFLASH 137EEPROM 128FAT 136komoacuterki 375LCD 59 62 66 68operandu 30pami ci 81 384 386 387 561pami ci SDRAM 424pliku blokowy 141portoacutew IO 30rejestroacutew IO procesora 36rejestroacutew uk adu 499SPI 95sygnatury u ytkownika 565 567wska nikoacutew 32

DQM Data Mask 375DSP Digital Signal Processor 535

DTMF 535 553dyktafon 529dynamiczna alokacja pami ci 516dyrektywa global 38dyrektywy asemblera 40dzia anie

DMA 255komparatora 280timeroacutew 400

d wi k 443

EEBI External Bus Interface 361EEPROM 207eliminacja jitteru 24emulacja RS232 139

FFAT File Allocation Table 128 131FAT32 128FATFS 180filtr

dolnoprzepustowy 491drugiego rz du 470pierwszego rz du 469trzeciego rz du 471

filtrowanie sygna u PWM 468firmware 565FLASH 207format

odpowiedzi 159polecenia 158protoko u 157

funkcja_delay_ms 17 219c_zero 42callback 106 341callback() 99DataFLASH_CSEnable 100DF_FinishBufWrite() 269disk_initialize 136disk_ioctl 181disk_status 136disk_write 138DMA_SPI_init 104DTMF_GetCode 553free_re 65GPIOR0_init 507hd44780_outcmd 51hd44780_outnibble_nowait 65LCD_defchar_P 57

Kup książkę Poleć książkę

Skorowidz 577

Menu_Click_Func 515Menu_Free 516Menu_Recorder 532Menu_Run 527MS_CreateRegEntry 117MS_GetDirPos 125MS_GetRegItem 115MS_WritePages 116 118OSC_wait_for_rdy 473RecMenu_StartStop 532sprintf 142strtok 124sysclk_init() 200 209TMF_memcpy_PF 454udi_cdc_getc() 123udi_cdc_is_rx_ready() 123VS1003_Reset 506

funkcjeanalizuj ce 556biblioteczne 50biblioteki FATFS 143j zyka C 41kontrolera ST7565R 313opoacute niaj ce 17opoacute nie 219reentrant 524specjalne kontrolera 319steruj ce 314zapisu 133

fusebit 557BODACT 560BODLEVEL 560BOOTRST 559DVSDON 560EESAVE 561JTAGEN 558RSTDISBL 559SUT 559TOSCSEL 559

fusebity w AVR-libc 571

Ggenerator obrazu composite 426generowanie

d wi ku 461kolorowego obrazu 437obrazu wideo 391przebiegoacutew 301przerwa 285sygna u composite 409

g bia koloru 326gniazdo

karty SD 156VGA 396

Hhistereza 281

IIDE 11IMA ADPCM 483informacje

o kolorze 431o obrazie 434

inicjalizacjakarty 161karty SDHC 167karty SDSC 167karty SDXC 167licznika 419pami ci 119USART 505

instrukcjaicall 42movw 35nop 13 24

interfejsSCI 498SDI 498SPI 71 79RS232 120UART 123USART 71 73

interpolacja 259interpolacja w XMEGA 260inwersja obrazu 319

Jjednostki 12jitter 24 303 420

Kkalibracja

ADC 229DAC 306 564offsetu 237

kana DMA 82 522karta 154 158

mikroSD 152SD 151 152SDHC 151 152 160SDSC 160SDXC 151 160

Kup książkę Poleć książkę

578 AVR Uk ady peryferyjne

karty pami ci 151 152 157biblioteka FATFS 180budowa 152format polecenia 158inicjalizacja 161 167komunikacja 156odczyt danych 173opcje konfiguracyjne 181rejestry specjalne 169tryby pracy 153zapis danych 176zasilanie 154

kodasemblerowy 23 24C 23dost pu 24

kodowanieμ-law 481ADPCM 483Dialogic ADPCM 494informacji 166 426koloru 425znakoacutew 536

kodyformatoacutew audio 501zdarze 545

kolejno bajtoacutew 533kolor 424 430kolorowy obraz 437komparator 422

analogowy 279 280analogowy XMEGA 282okienkowy 284

kompilacja plikoacutew binarnych 350kompilator avr-gcc 11 359kompresja

ADPCM 482 486d wi ku 480IMA ADPCM 482

komunikacja z koprocesorem 504konfiguracja

4-portowa 364biblioteki 133debugera 185DMA 459 522fusebitoacutew 570kontrolera DMA 257 452komparatoroacutew 285lockbitoacutew 570LPC 371pami ci SDRAM 381PetitFS 149pinu IO 225portoacutew IO 362

preskalera 452projektu 186przerwa 219pu apki 203rejestru EVCTRL 248rejestru PER 67SPI 75sygna u CS 377typu czcionki 324urz dze IO 189USART 76zegara 383

konsolidacja 547kontroler

DMA 254 298 402 458 518 523KS108 310ST7565R 310ndash315 321

konwersjaDAC 305sygna oacutew 396wyzwalana 306

konwertercyfrowo-analogowy 426DAC 427

koprocesormp3 496VS1003B 10

korekcja fazy 466kwantyzacja 463

Llampa CCFL 44LE Latch Enable 433licznik 419

cykli 209TCC1 400timera 20

linie IO 50linie sygna owe

MISO 72 164MOSI 72SCK 72SS 72

linker 69lista

mnemonikoacutew 24modyfikowanych rejestroacutew 32

lockbity 557 561lockbity w AVR-libc 570LPC Low Pin Count 371LPCM 443 556LSB Least Significant Bit 228

Kup książkę Poleć książkę

Skorowidz 579

a cuchy formatuj ce 212czenie plikoacutew 352

Mmagistrala pami ci zewn trznej 361magnetofon cyfrowy 528makro _SFR_IO_ADDR() 39makrodefinicja

ASSERT 214HD44780_CGADDR() 53HD44780_CLR 53HD44780_DDADDR() 53HD44780_DISPCTL() 52HD44780_ENTMODE() 52HD44780_FNSET() 52HD44780_HOME 53HD44780_SHIFT() 51LOCKBITS 571

mapowanie sygna oacutew 366mapy bitowe 343marker czasowy 268maski bitowe 329matryce 49menu 335menu piktogramowe 342mierniki temperatury 262mikrokontroler

ARM 9AVR 9PIC 9XMEGA128A3U 10

MISO 72moc wydzielana 265model psychoakustyczny 495modu

alfanumeryczny 45NVM 568Xmega eXploreGO 10Xplained ATXMEGA A3BU 10Xplained ATXMEGA-A1 10Xplained XMEGA128A1 447Xplained XMEGA256A3 94Xplained XMEGA256A3BU 97 143 266

modyfikator 30const 85volatile 28 273

monitory CRT 395monochromatyczne wy wietlacze graficzne 309monochromatyczny

tryb graficzny 416tryb tekstowy 413

MOSI 72mp3 495Msps Megasamples per second 12multiplekser wej ciowy 226 283multipleksowanie adresoacutew 368 369muzyka 439

Nnadawanie kodoacutew DTMF 540nadproacutebkowanie 258nag oacutewek kontenera wav 500nagrywanie mowy 486najmniej znacz cy bit 228napi cie

offsetu 280referencyjne 223 295zasilania 239

Oobracanie obrazu 319obraz 319

composite 426kolorowy 430wideo 391

obroacutebka d wi ku 443 445obs uga

FAT 131 143klawiatury matrycowej 24LCD 58 63 67menu 337przerwania 37 38 458przerwania DMA 525przerwa w asemblerze 39przyciskoacutew 272wy wietlaczy alfanumerycznych 45

odczytblokowy 140danych 173 358

odpowied response 159R1 159R2 159R7 160

od wie anie pami ci 376odtwarzanie

d wi ku 472muzyki 447 513 518 521

offset 238offset ADC 230okno

Breakpoints 202Call stack 209dezasemblera 210

Kup książkę Poleć książkę

580 AVR Uk ady peryferyjne

oknoIO View 207podgl du zmiennych 211wyboru czcionek 324

OLED 46opcje

kompilatora 35zapisu d wi ku 445

operacjena buforach 91odczytu 173zapisu 176zapisu strony 92

operand 29operator

ascii 41

asciz 41

byte 41

section 41opoacute nienia 13 18opoacute nienie zmienne 16optymalizacja 16 68optymalizator 26organizacja pami ci 77organizacja pami ci VRAM 316oscylator 287OSD On-Screen Display 417ostrze enie 16oszcz dzanie energii 94

Ppakiet WinAVR 48pami

CGRAM 56 57 64DataFLASH 10 77 81 113 269DDRAM 49EEPROM 111FLASH 54 124 207RAM 49SDRAM 372SRAM 63 124 329 366 371VRAM 314 317

PCLK 421PCM 443PetitFS 144 149p tla

for 13while 201

pierwsza linia obrazu 321piksel 430piktogram 342pin IO 225

plikAlloc_safeh 65DataFLASHc 83DataFLASHIOc 136definesh 50delayh 14diskioh 132 136ffh 132ffconfh 132 181hd44780h 49integerh 132ioh 30LCD_transc 61LCD-transactc 66Makefile 14Menuc 19nothingo 541outfiletxt 547 551pffh 149SPIh 104stringh 113stymulacji 191 192

pliki mp3 495elf 351fon 323o 24S 24 34binarne 350 355csv 276d wi kowe 440obiektowe 352wav 500WMA 512z czcionkami 327z danymi 349

podbijacz napi cia 315podgl d

pami ci 207stosu wywo a 209zmiennych 211znakoacutew 325

pod czeniefototranzystora 262karty SD 155LCD z kontrolerem 311modu u 50pami ci 362 369 370 373termistora 262uk adu LM35 251wyj XMEGA 398

pod wietlenieCCFL 46OLED 46

Kup książkę Poleć książkę

Skorowidz 581

podwoacutejne buforowanie 255 332 457polecenia

kasowania strony 81konfiguracyjne pami ci 82kontrolera ST7565R 315odczytu bufora 82 89odczytu pami ci 81 88SDRAM 376transferu 91

polecenieACMD41 168cd 181CID 178CMD0 165CMD8 167CSD 178date 276dir 127 181dump 276erase 276get 276HD44780_CLR 51Init 178mkdir 181

po czenieDMA ze SPI 96dwoacutech komparatoroacutew 285koprocesora mp3 497LCD z mikrokontrolerem 48wyj cia XMEGA 411XMEGA z PC 121z telewizorem 431

pomiarnapi cia zasilania 239temperatury MCU 241

port IO 30 362pozycjonowanie grafik 345poacute obraz 410precyzja pomiaroacutew 260preskaler 478preskaler ADC 243program

Atmel Data Visualizer 275Audacity 443avr-objcopy 350dataloggera 265LCD Image Converter 323makeloadingtableexe 543Realterm 127 554riffstrip 483SoX 445Tracepoint 208

programowanie sygnatury u ytkownika 566protokoacute master-slave 157

prototypy 136proacutebki d wi kowe 447proacutebkowanie

8-bitowe 300nieliniowe 480

prymitywy graficzne 330przebieg PWM 468przebiegi 289 303przechwytywanie danych 276przemiatanie wej 253przerwanie 218 254 286 403

DMA 522komparatora 286

przestrze adresowa procesora 378przesy anie

danych 498polece 498

przetaktowanie procesora 436przetwornik

ADC 221analogowo-cyfrowy 221cykliczny 222potokowy 222

przyciski 272pseudooperatory 41pu apki breakpoints 197pu apki warunkowe 205punkty ledzenia 203PWM 461 462 472

RRAS Row Address Strobe 375redukcja poboru energii 242regulacja kontrastu 321rejestr 32 34rejestr AC 50

adresu wtyczki 513BASEADDR 377CID 169CMP 251CSD 172czasu utworu 512DATA 83EVCTRL 248formatu audio 512identyfikacyjny pami ci 87INTFLAGS 252kontroli basoacutew 510kontroli g o no ci 513MUXCTRL 227OCR 168PER 67poroacutewnania 249

Kup książkę Poleć książkę

582 AVR Uk ady peryferyjne

rejestr ACSCI_CLOCKF 511stanu komparatora 287stanu pami ci 86stanu uk adu 510trybu pracy 508WINCTRL 285

rejestrydost pu do pami ci RAM 513GPIOR 502IO procesora 36mikrokontrolera 25procesora 35specjalne 94specjalne karty 169uk adu VS1003B 508

relacja rodzic ndash dziecko 336reset uk adu 534rozdzielczo

LCD 329przetwornika 231PWM 463 477

rozszerzenie HiRes 477 479roacutewnanie Steinharta-Harta 263rysowanie map bitowych 343

Sschemat uk adu dataloggera 267SCI Serial Command Interface 498SCK 72SD Secure Digital 152SDI Serial Data Interface 498separator synchronizacji 422separowanie impulsoacutew synchronizacji 422shieldy 10skaler 422skaler napi cia 283skrypt makefile 353s owo kluczowe

asm 27extern 37static 68

specyfikatory lokalizacji zmiennej 213sps samples per second 12SS Slave Select 72standard PAL 410standard VGA 393sterowanie

dataloggerem 275sygna em 379

sterownik 121HD44780 49 56LCD 49 62

stos wywo a 209

strukturaFATFS 139Handle 118LCD_trans 60 63menu 338rejestru 86SimpleFSEntry 113 116SimpleFSHandle 113 118 140submenu 527systemu plikoacutew 112

sumabitowa 571kontrolna 178

sygnacomposite 409composite video output 430CS 377DREQ 497H-Sync 396synchronizacji 423V-Sync 396zegarowy CLK 374

sygna yinterfejsu EBI 363magistrali EBI 364steruj ce 375

sygnaturaprodukcyjna procesora 563u ytkownika 565

symbol__DELAY_ROUND_CLOSEST__ 17__DELAY_ROUND_DOWN__ 17_FS_FAT12 149_FS_FAT32 149_FS_MINIMIZE 133_FS_READONLY 133_FS_RPATH 135_FS_TINY 133_MAX_SS 135_MULTI_PARTITION 135_USE_DIR 149_USE_FASTSEEK 134_USE_FORWARD 134_USE_LABEL 134_USE_LFN 134_USE_LSEEK 149_USE_MKFS 134_USE_READ 149_USE_STRFUNC 134_USE_WRITE 149_VOLUMES 136F_CPU 14 15 18increment 36USE_BUSY_FLAG 50

Kup książkę Poleć książkę

Skorowidz 583

symboleglobalne 36w asemblerze 28zewn trzne 39

symulacja 198 209symulator 190synchronizacja

pami ci 331pionowa 395pozioma 394

systemplikoacutew 111 128przerwa 404zdarze 245

szablonfont_XMEGAtmpl 326image_XMEGAtmpl 343

szum 463szybko przesy ania danych 126

ledzenie wi zki 333rodowisko

graficzne 11programistyczne 11VSIDE 542WinAVR 47

Ttabela FAT 130tablica

framebuf 402 408plugintbl 552 555tekst 208z kodem wynikowym 543

taktowanieDAC 296mikrokontrolera 473

technologia OLED 44temperatura mikrokontrolera 239 241termistor 262 290

NTC 263PTC 263

termometrLM35 249 250z alarmem 251

termostat 290test uk adu VS1003B 503testowanie obrazu 319timer 16 62

TCC0 20

TCC1 399transakcja 59 62 65transakcje 17 103ndash107transakcyjna obs uga LCD 58transakcyjny dost p do SPI 95transfer 91

danych 97wynikoacutew 254

transmisja 72 83tryb

bez znaku 234ci g ej konwersji 252czterobitowy 153dwukana owy 301graficzny 416graficzny VGA 407idle 419jednobitowy 153LPC 371monochromatyczny 397 407oszcz dzania energii 94 306pracy multipleksera 226pracy SPI 157roacute nicowy 232single slope 312SPI 153tekstowy 413tekstowy VGA 397z pojedynczym wej ciem 234ze znakiem 235

trybygenerowania PWM 467pracy karty 153pracy przetwornika 231pracy SPI 74pracy uk adu 508

twierdzenie Nyquista 258tworzenie

adresu 84nak adek 417obrazu 335tablicy 543

typ__uint24 119karty 160niekompletny 60wyliczeniowy 114

typyoperandoacutew 29w AVR 34

Kup książkę Poleć książkę

584 AVR Uk ady peryferyjne

Uuchwyt handle 64 113uk ad

AD725 427 431buforowy 294CS 361DAC 284dataloggera 267detekcji awarii zasilania 559generuj cy obraz 393HiRes 477ICL7660 47LM35 250 251SampH 293sterowania sygna em 379USART 401VS1003B 496 503 508 530 538 556VS100XX 529wzmacniania sygna u 227

uk ady peryferyjne 9uruchomienie komparatora 287urz dzenie

master 72slave 72

u rednianie 259utrata danych 141u ycie wstawki asemblerowej 33

VVGA 393

Wwarto ci kalibracyjne

ADC 564oscylatoroacutew 564temperatury 564

warunkowa kompilacja 36WE Write Enable 375wej cie composite video input 425wektor przerwa 38 257wideo 391wielko pami ci 86 377w czenie DAC 299wska nik na struktur 27wska niki 32wstawki asemblerowe 24 33wtyczka 535 541 544

SineDTMF Generator 537VGA 396

wyboacuter cz stotliwo ci PWM 465 474wykorzystanie

DMA 254 518

EuroSCART 428PWM 461rejestroacutew 34

wyliczanie predyktora 489wy wietlacze

alfanumeryczne 43 45graficzne 43 309LCD 43OLED 46

wy wietlanielitera u 213map bitowych 344obrazu 333 346 406obrazu VGA 393

wywo ania zwrotne callbacks 98asynchroniczne 101synchroniczne 101

wyzwalanie konwersji 245wzmacniacz 446wzmacniacz operacyjny 279wzmacnianie sygna u 227

XXMEGA 9 18

Zzapis

bufora 269danych 176d wi ku 440 556

zasilaniekarty 154pami ci 109

zatrzask 368zatrzask 74HC573 433zatrza ni cie adresu 369zdarzenia 297zdarzenie compare match 399zegar 383 420 426zintegrowane rodowisko programistyczne 11z cze EuroSCART 425 428 429zmiana

g o no ci 527wielko ci strony 94

znaki 56

roacuted onapi cia odniesienia 284sygna u 240

Kup książkę Poleć książkę

Page 29: Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8 AVR. Ukäady peryferyjne Rejestry dost pu do pami ci RAM .....513 Rejestr adresu

64 AVR Uk ady peryferyjne

kod odpowiedzialny za ich obs ug Zauwa my e ka da transakcja musi zawieraadres pocz tku pami ci wideo od ktoacuterego b dzie zapisywany tekst Dzieje si takdlatego e transakcja wykonana wcze niej mo e ustawi wska nik zapisu na dowolnejkomoacuterce pami ci W efekcie tekst z kolejnej transakcji by by wy wietlany od komoacuterkina ktoacuterej zako czy si zapis poprzedniej transakcji Takie dzia anie oczywi cie jestniedopuszczalne st d te ka dy zapis do pami ci wideo poprzedza ustawienie rejestruindeksowego Problem ten mo na rozwi za tak e w inny sposoacuteb mdash poprzez wpro-wadzenie tzw uchwytoacutew (ang handlers) ktoacutere zawiera yby stan kontrolera LCDNiemniej to rozwi zanie dodatkowo komplikowa oby nasz sterownik Struktura danych(zawartych w polu data) ma wi c nast puj cy format

bajt nr 0 zawiera warto pozycji od ktoacuterej nale y dokonywa zapisu pami ciwideo mdash jest to warto przesy ana do rejestru okre laj cego adres zapisu

kolejne bajty zawieraj a cuch znakowy ktoacutery nale y umie ci w pami ciCGRAM

Poniewa bajt nr 0 zawsze zawiera warto wpisywan do rejestroacutew steruj cych kon-trolera podczas jego wysy ania jest ustawiana linia RS sygnalizuj ca zapis do rejestruPodczas wysy ania kolejnych bajtoacutew linia ta jest zerowana w zwi zku z czym zapisodbywa si do pami ci CGRAM

Kod obs uguj cy transakcj wygl da nast puj coif(trans) Jest transakcja do zrealizowania uint8_t dat=trans-gtdata[seqpos] if(seqnibble == 0) datgtgt=4 To trzeba zmieni je li linie danych nie s po czone z pinami 0 ndash 3 portu IO hd44780_outnibble_nowait(dat amp 0x0F seqpos = 0) Zapisujemy rejestr steruj cy lub dane ++seqnibble if(seqnibble == 0) ++seqpos Co drug tetrad zwi kszamy pozycj bufora if(seqpos gt= trans-gtlen) trans-gtReady=true Koniec transakcji if(trans-gtSelfDel) free_re(trans) Zwolnij pami transakcji je li tak sobie yczy programista trans=NULL Koniec transakcji CLR(OUT HD44780_E)

Ta cz przerwania wysy a kolejne tetrady do kontrolera LCD Warto zastanowi sinad dzia aniem sekwencji

++seqnibble

Poniewa pole nibble jest jednobitowe operacja inkrementacji prowadzi do zmianystanu tego pola na przeciwny (pole to ma warto 0 lub 1) Kiedy zostan wys anewszystkie dane przeznaczone dla kontrolera obs uga transakcji ko czy si Stan tensygnalizuje nadanie warto ci true polu Ready struktury LCD_trans Dzi ki temu pro-gram mo e sprawdzi asynchronicznie w stosunku do przerwania kiedy transakcjauleg a zako czeniu Opcjonalnie jest wykonywana jeszcze jedna funkcja mdash je li poleSelfDel ma warto true to pami zarezerwowana na transakcj jest automatycznie

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 65

zwalniana W tym celu wykorzystuje si funkcj free_re ktoacuterej prototyp jest zade-klarowany w pliku Alloc_safeh Funkcja ta wywo uje funkcj biblioteczn free ktoacute-ra zwalnia pami przydzielon dynamicznie na stercie Poniewa funkcja ta nie jestfunkcj reentrant nale y stworzy odpowiedni bdquoprotez rdquo opakowuj c j w blokatomowy co zapewnia e nie zostanie ona ponownie wywo ana zanim jej poprzed-nia instancja nie zako czy dzia ania Oczywi cie lepszym rozwi zaniem by oby napi-sanie w asnych funkcji dynamicznej alokacji pami ci ktoacutere b d reentrant

Bardzo wa ne jest aby pole SelfDel mia o warto true wy cznie dla transakcjidla ktoacuterych pami zosta a przydzielona dynamicznie funkcj malloc (lub jej po-chodnymi) W pozosta ych przypadkach pole to musi mie warto false mdash nie-stosowanie si do tej regu y spowoduje b d mened era pami ci i najprawdopo-dobniej nieprzewidywalne dzia anie programu

Drug wa n zasad jest aby zmienna zawieraj ca dane transakcji nie by azmienn automatyczn mdash zmienne takie s automatycznie niszczone po opusz-czeniu zawieraj cej je funkcji W rezultacie obszar pami ci zawieraj cy danetransakcji mo e zosta wykorzystany przez inne zmienne co spowoduje uszkodzeniezawartych w nim danych

Pami przydzielona transakcji musi by alokowana w sposoacuteb dynamiczny (funkcjamalloc_re) ewentualnie mo e to by pami alokowana dla zmiennej globalnej lubstatycznej mdash zmienne tego typu istniej przez ca y czas ycia programu

Warto te zauwa y e instrukcje steruj ce stanem linii Enable kontrolera LCD(SET(OUT HD44780_E) i CLR(OUT HD44780_E)) s rozdzielone wieloma innymi in-strukcjami Dzi ki temu generowany impuls dodatni tego sygna u ma czas trwania gt230 ns wymagany w specyfikacji kontrolera Nawet dla XMEGA taktowanej zegarem32 MHz 230 ns przek ada si na oko o 7 instrukcji asemblera mdash czas jaki z pewno-ci up ynie pomi dzy wykonaniem obu powy szych instrukcji steruj cych

Do wysy ania danych do kontrolera zosta a wykorzystana nieco zmodyfikowanafunkcja hd44780_outnibble_nowait roacute ni ca si od jej protoplasty hd44780_outnibbletylko tym e nie czeka na sygna braku zaj to ci mikrokontrolera (nie realizuje teopoacute nie ) Nie jest to potrzebne gdy kolejne tetrady s wysy ane w odst pach cza-sowych okre lanych przez timer

Mamy wi c zapewnion obs ug transakcji i mo liwo transakcyjnego wy wietlaniadanych na LCD musimy jeszcze mie funkcj ktoacutera tworzy odpowiednie transakcjemdash jest odpowiednikiem funkcji bezpo rednio wysy aj cej dane znakowe do LCDOdpowiednikiem tym jest pokazana poni ej funkcja

bool LCD_PutText_B(uint8_t x uint8_t y char txt LCD_trans buf bool autodel) buf-gtcmd=LCD_Text buf-gtReady=false buf-gtSelfDel=autodel Czy zwolni pami po zako czeniu transakcji buf-gtdata[0]=HD44780_DDADDR(x+y0x40) Ustaw adres w DDRAM strcpy((char)ampbuf-gtdata[1] txt) Skopiuj dane tekstowe + NULL

Kup książkę Poleć książkę

66 AVR Uk ady peryferyjne

buf-gtlen=strlen(txt) + 1 D ugo tekstu + pozycji + NULL ndash 1 bool ret=cbAdd(ampLCD_TransBuffer buf) if((ret==false) ampamp (autodel)) free_re(buf) Brak miejsca w kolejce else TCD0_CTRLA=TC_CLKSEL_DIV1_gc Preskaler 1 mdash odblokuj timer return ret

Funkcja ta buduje transakcj odpowiedzialn za wy wietlenie napisu txt na wskaza-nej pozycji x y LCD Wszystkie dane o transakcji zostan umieszczone w buforzew pami ci ktoacuterej adres jest okre lany wska nikiem buf Pami w buforze musi bywystarczaj co du a aby pomie ci ca transakcj Dodatkowy parametr autodel okre laczy pami ta ma by automatycznie zwalniana po obs u eniu transakcji (true) czynie (false) Je li transakcj uda o si umie ci w kolejce funkcja zwraca true Wartozauwa y e w takim przypadku funkcja uruchamia te timer (w naszym przypadkujest to timer TCD0) odpowiedzialny za generowanie przerwania Funkcja obs ugi prze-rwania wysy a dane do LCD

Pewn odmian powy szej funkcji jest funkcjabool LCD_PutText(uint8_t x uint8_t y char txt) LCD_trans trans=malloc_re(sizeof(LCD_trans) + strlen(txt) + 2) bool ret=LCD_PutText_B(x y txt trans true) return ret

Wykorzystuje ona funkcj LCD_PutText_B z tym e najpierw alokuje dynamiczniepami potrzebn na przechowanie tworzonej transakcji

Mamy komplet potrzebnych funkcji a wi c sprawd my jak ca o sprawdza siw praktyce W pliku LCD-transactc znajduje si kod pokazuj cy jak dzia aj naszetransakcje Aby to by o mo liwe nale y zainicjalizowa kontroler LCD

LCD_init()

Wykorzystujemy tu znan ju funkcj inicjalizuj c mdash nie ma potrzeby jej zmienia gdy operacja inicjalizacji LCD jest jednorazowa i nie trzeba wykonywa jej w posta-ci transakcji W drugim kroku musimy zainicjalizowa wykorzystywany timer i systemprzerwa

LCD_Timer_init(ampTCD0)PMIC_CTRL|=PMIC_LOLVLEN_bm Odblokuj przerwania niskiego poziomusei()

Poniewa dost p do LCD z pewno ci nie jest czynno ci krytyczn czasowo prze-rwaniom timera nadano najni szy priorytet Dzi ki temu mo na innym bardziej kry-tycznym przerwaniom nada wy sze priorytety i uzyska w ten sposoacuteb zmniejszenieczasu latencji obs ugi przerwa Sama inicjalizacja timera jest niezwykle prosta

void LCD_Timer_init(TC0_t tc) tc-gtINTCTRLA=TC_OVFINTLVL_LO_gc Odblokuj przerwania nadmiaru timera i nadaj im niski priorytet tc-gtPER=F_CPULCD_ACCESSTIME Przerwanie co 4 us (niezale nie od F_CPU)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 67

Sprowadza si ona tylko do odblokowania mo liwo ci zg aszania przerwania nadmia-ru oraz konfiguracji rejestru PER tak aby przerwania by y generowane co ok 4 s mdashniezale nie od cz stotliwo ci taktowania CPU Mo emy wi c przyst pi do wy wie-tlenia pierwszego napisu

LCD_PutText(00 Numer)

Powy sza funkcja ma jedn wad mdash alokuje dynamicznie pami po ka dym wywo-aniu (pami ta jest automatycznie zwalniana po obs u eniu transakcji) niemniej

ca y proces jest czasoch onny Mo emy tego unikn alokuj c pami bdquor cznierdquo i wielo-krotnie wykorzystuj c zaalokowany blok pami ci Ilustruje to poni szy przyk ad

LCD_trans buf=malloc_re(sizeof(LCD_trans) + 7)

Zmienna buf wskazuje na obszar pami ci ktoacutery mo e pomie ci a cuch 5-znakowyTyle wystarczy na potrzeby tego przyk adu mdash na LCD b d wy wietlane kolejneliczby w zakresie 0 ndash 65 535 najd u sza ma 5 znakoacutew st d te nasz bufor ma tak a nieinn d ugo

while(1) utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(60 bufstr buf false) while(LCD_IsTransCompleted(buf))

Do konwersji liczby na a cuch u yto funkcji bibliotecznej utoa (nag oacutewek stdlibh)Poniewa d ugo a cucha po konwersji jest zmienna (co spowodowa oby pozosta-wianie na LCD bdquoduchoacutewrdquo po poprzednich konwersjach) w kolejnej linii brakuj ceznaki uzupe niono spacjami Nast pnie tworzona jest transakcja w obszarze pami ciprzydzielonym zmiennej buf Ostatnia p tla while jest odpowiedzialna za oczekiwa-nie na zako czenie realizacji transakcji Po jej zako czeniu p tla jest wykonywana odpocz tku

Uwa ny czytelnik z pewno ci zauwa y e pami przydzielana funkcj malloc_renie jest nigdzie zwalniana mdash w normalnej sytuacji spowodowa oby to wyciek pami -ci W naszym przyk adzie jednak program nigdy si nie ko czy nie ma wi c potrzebyzwalniania pami ci wskazywanej przez zmienn buf

Powy szy przyk ad pokazuje jak unikn blokowania CPU na czas dost pu do wolnodzia aj cego urz dzenia jakim jest LCD alfanumeryczny Jednak to nie wszystkiezalety wynikaj ce z zastosowania transakcji Drug wa n zalet naszego rozwi zaniailustruje przyk ad znajduj cy si w katalogu PrzykladyLCD-alfaLCD-transact-intPowa nym ograniczeniem funkcji odpowiedzialnych za dost p do LCD w sposoacutebklasyczny by a niemo no ich wywo ywania z funkcji obs ugi przerwa mdash funkcjeobs ugi LCD nie by y reentrant2 Nasz system oparty na transakcjach nie ma tychwad Aby to zilustrowa zosta stworzony prosty przyk ad mdash tak jak poprzedniow p tli g oacutewnej programu s wy wietlane stale kolejne liczby ale jednocze nie wyko-

2 Poza tym blokowa y CPU na d ugi czas a jak pami tamy funkcje obs ugi przerwa powinny by

wykonywane mo liwie kroacutetko

Kup książkę Poleć książkę

68 AVR Uk ady peryferyjne

rzystano drugi timer (TCD1) w ktoacuterego funkcji obs ugi przerwania przepe nienia jestwy wietlany licznik tych przerwa

ISR(TCD1_OVF_vect) static char int_buf[sizeof(LCD_trans) + 7] static uint16_t cnt char bufstr[6]

utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(61 bufstr (LCD_trans)ampint_buf false)

Jak widzimy w sposoacuteb asynchroniczny z dwoacutech miejsc w programie mo emy uzy-ska dost p do LCD a ka da funkcja bdquoma wra enierdquo e ma LCD na wy czno Przy okazji warto przeanalizowa sposoacuteb w jaki jest rezerwowana pami na trans-akcj w przerwaniu Oczywi cie mo na by wykorzysta dynamiczn alokacj pami cilecz jak wspomniano taka alokacja jest czasoch onna St d te w pokazanym przy-k adzie wykorzystano tablic statyczn int_buf o rozmiarze umo liwiaj cym prze-chowanie kompletnej transakcji Dzi ki temu e zmienna int_buf jest zmienn statycz-n nie jest ona niszczona po zako czeniu funkcji obs ugi przerwania Gdyby pomins owo kluczowe static zmienna ta by aby niszczona a na LCD najprawdopodobniejzacz yby si pojawia przypadkowe tre ci Poniewa pami naszego bufora nie by aalokowana dynamicznie nie mo e ona zosta zwolniona w naszym sterowniku LCDst d te ostatni parametr wywo ania funkcji LCD_PutText_B musi mie warto false

OptymalizacjaPrzy okazji tego i poprzedniego przyk adu warto zastanowi si jeszcze nad jednkwesti mdash optymalizacji W podanych przyk adach wykorzystano wcze niej omoacute-wione funkcje dost pu do wy wietlacza LCD znajduj ce si w plikach hd44780ci hd44780h Wi kszo z zawartych tam funkcji nie jest wykorzystywana jednakkompilator mimo wszystko umieszcza ich kod w pliku wynikowym mdash dzieje si takponiewa nie mo e on bdquostwierdzi rdquo czy funkcje te nie s wykorzystywane w innychfragmentach programu Pami tajmy e kompilator kompiluje poszczegoacutelne pliki roacute-d owe osobno i dana jego instancja nie bdquowierdquo co znajduje si w innych plikach (innychjednostkach kompilacji) Tak ca o ciow wiedz ma dopiero konsolidator (linker)ktoacutery czy stworzone przez kompilator pliki obiektowe (o rozszerzeniu o) w plikwynikowy Linker jednak bdquonie wierdquo ktoacutera z funkcji programu zosta a u yta a ktoacuteranie mdash informacje te ma wy cznie kompilator W ten sposoacuteb powstaje typowe b dneko o w efekcie nasze nieu ywane funkcje nie s usuwane (linker zostawia je bdquonawszelki wypadekrdquo) i zajmuj niepotrzebnie pami Czy mo na temu jako zaradzi Oczywi cie tak W tym celu trzeba po czy si y kompilatora i linkera co zapewniaj od-powiednie opcje kompilacji We w a ciwo ciach projektu (ProjectProperties lub Alt+F7)wybieramy zak adk Toolchain a nast pnie AVRGNU C Compiler i OptimizationZnajdziemy tam pole wyboru o nazwie Prepare functions for garbage collection (ry-sunek 224)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 69

Rysunek 224 Aby da linkerowi mo liwo usuwania nieu ywanych funkcji nale y skompilowaprogram z wybran opcj ndashffunction-sections ktoacutera spowoduje e ka da funkcja programu znajdzie siwe w asnej sekcji

Zaznaczenie tej funkcji spowoduje umieszczenie ka dej funkcji w osobnej sekcji mdashsamo w sobie nie wp ynie to na skroacutecenie kodu wynikowego ale jest warunkiem nie-zb dnym dla podj cia stosownych dzia a przez linker Aby wyeliminowa nieu y-wane funkcje nale y zaznaczy jeszcze w ga zi AVRGNU LinkerOptimization poleGarbage collect unused sections (rysunek 225)

Rysunek 225 Zaznaczenie opcji Garbage collect unused sections (-Wl--gc-sections) spowodujee nieu ywane funkcje zostan usuni te z kodu wynikowego w efekcie kod programu ulegnie skroacuteceniu

Po zaznaczeniu tych opcji program zostanie skroacutecony o kilkaset bajtoacutew Oczywi cieje li wszystkie funkcje by yby wykorzystane nie uzyskaliby my adnego skroacuteceniakodu Niemniej w sytuacji gdy u ywa si bibliotek zazwyczaj przynajmniej czfunkcji nie jest wykorzystywana warto wi c skorzysta z tej mo liwo ci optymalizacji

Kup książkę Poleć książkę

70 AVR Uk ady peryferyjne

Je li mamy do czynienia z prekompilowan bibliotek (lib) to musi ona by skom-pilowana z zaznaczon opcj Prepare functions for garbage collection (-ffunction-sections) Alternatyw jest umieszczenie ka dej funkcji biblioteki w osobnym pliku(tak jak w przypadku bibliotek AVR-libc)

Na ekranie wyboru opcji optymalizacji linkera mamy jeszcze jedn przydatn opcjmdash Relax Branches (-mrelax) Dla mikrokontroleroacutew ktoacutere maj ponad 8 kB pami ciFLASH instrukcje skokoacutew s generowane jako tzw instrukcje d ugie mdash umo liwiajone skok do komoacuterki pami ci FLASH o dowolnym adresie Jednak cen za to jestwyd u enie instrukcji mdash ich kod jest d u szy podobnie jak czas wykonania Nie zawszejednak takie d ugie instrukcje musz by wykonywane mdash je li miejsce docelowe skokule y blisko (w zasi gu instrukcji skokoacutew wzgl dnych) to mo na w kodzie wynikowymzamieni instrukcje d u sze na kroacutetsze co przynosi oszcz dno ci w postaci skroacuteceniakodu wynikowego Poniewa dopiero linker bdquowierdquo jak poszczegoacutelne fragmenty kodus rozmieszczone w pami ci takiej podmiany mo na dokona na etapie linkowaniaprogramu co zapewnia powy sza opcja St d te warto to pole wyboru zaznaczy

Kup książkę Poleć książkę

SkorowidzA

ABI Application Binary Interface 25AC Address Counter 50ADPCM 482adres

bazowy 377bufora 61komoacuterki 84pu apki 202

ALE Address Latch Enable 368alfanumeryczne wy wietlacze 43algorytm ADPCM 492algorytmy stratne 495animacje 57antyaliasing 325architektury procesoroacutew XMEGA 352asembler 23

dyrektywy 40funkcje j zyka C 41obs uga przerwa 39

asynchroniczne wywo anie funkcji 101Atmel Studio 15

Bbajty kalibracyjne 569biblioteka

FATFS 131 139 176 180 517libcallback-liba 99PetitFS 144 149

bitADC_CH0START_bm 236IMPMODE 244

bitrate 442 512blokowanie przerwa 219b d 16 19

kwantyzacji 463offsetu 230wzmocnienia ADC 230

BOD 223bps bits per second 12

budowakarty 152linii obrazu 394pami ci SDRAM 374pliku stymulacji 192ramki PAL 412sygna u PAL 411wtyczki 544 545

bufor 78FIFO 497na transakcje 61transakcji 62

buforowanie wyj cia 294

CCAS Column Address Strobe 375CCFL 44charakterystyka

przetwornikoacutew 222termistora 264tryboacutew pracy 232

CID Card Identification 169CKE Clock Enable 375CLKIN 421COG Chip on Glass 310CRC 158 178CRC16 178CRC7 164CS Chip Select 361 375CSD Card Specific Data 172czas

dost pu do SDRAM 424adowania kondensatora 244

propagacji 281proacutebkowania 260symulacji 209

czcionki 322cz stotliwo

odchylania pionowego 428proacutebkowania 244 441 444 530przebiegu 504

Kup książkę Poleć książkę

576 AVR Uk ady peryferyjne

cz stotliwoPWM 465taktowania koprocesora 549taktowania procesora 209taktowania rdzenia 18

czyszczenie pami ci 318

DDAC Digital to Analog Converter 293 447 451

buforowanie wyj cia 294generowanie przebiegoacutew 301jitter 303kalibracja 306napi cie referencyjne 295system zdarze 297taktowanie 296tryb dwukana owy 301wykorzystanie DMA 298wyzwalanie konwersji 305

datalogger 261 265 275DD Device Density 86debuger 183

programowy 190sprz towy 185 187

decymacja 259DEBUG 219XMEGA 260

definicja symboli globalnych 36definiowanie w asnych znakoacutew 56deklaracja zapowiadaj ca 103 337dekoder DTMF 548 556DMA 254 298 402 458 518 523dost p do

danych 358 359 568danych binarnych 356 360danych wielobajtowych 31DataFLASH 137EEPROM 128FAT 136komoacuterki 375LCD 59 62 66 68operandu 30pami ci 81 384 386 387 561pami ci SDRAM 424pliku blokowy 141portoacutew IO 30rejestroacutew IO procesora 36rejestroacutew uk adu 499SPI 95sygnatury u ytkownika 565 567wska nikoacutew 32

DQM Data Mask 375DSP Digital Signal Processor 535

DTMF 535 553dyktafon 529dynamiczna alokacja pami ci 516dyrektywa global 38dyrektywy asemblera 40dzia anie

DMA 255komparatora 280timeroacutew 400

d wi k 443

EEBI External Bus Interface 361EEPROM 207eliminacja jitteru 24emulacja RS232 139

FFAT File Allocation Table 128 131FAT32 128FATFS 180filtr

dolnoprzepustowy 491drugiego rz du 470pierwszego rz du 469trzeciego rz du 471

filtrowanie sygna u PWM 468firmware 565FLASH 207format

odpowiedzi 159polecenia 158protoko u 157

funkcja_delay_ms 17 219c_zero 42callback 106 341callback() 99DataFLASH_CSEnable 100DF_FinishBufWrite() 269disk_initialize 136disk_ioctl 181disk_status 136disk_write 138DMA_SPI_init 104DTMF_GetCode 553free_re 65GPIOR0_init 507hd44780_outcmd 51hd44780_outnibble_nowait 65LCD_defchar_P 57

Kup książkę Poleć książkę

Skorowidz 577

Menu_Click_Func 515Menu_Free 516Menu_Recorder 532Menu_Run 527MS_CreateRegEntry 117MS_GetDirPos 125MS_GetRegItem 115MS_WritePages 116 118OSC_wait_for_rdy 473RecMenu_StartStop 532sprintf 142strtok 124sysclk_init() 200 209TMF_memcpy_PF 454udi_cdc_getc() 123udi_cdc_is_rx_ready() 123VS1003_Reset 506

funkcjeanalizuj ce 556biblioteczne 50biblioteki FATFS 143j zyka C 41kontrolera ST7565R 313opoacute niaj ce 17opoacute nie 219reentrant 524specjalne kontrolera 319steruj ce 314zapisu 133

fusebit 557BODACT 560BODLEVEL 560BOOTRST 559DVSDON 560EESAVE 561JTAGEN 558RSTDISBL 559SUT 559TOSCSEL 559

fusebity w AVR-libc 571

Ggenerator obrazu composite 426generowanie

d wi ku 461kolorowego obrazu 437obrazu wideo 391przebiegoacutew 301przerwa 285sygna u composite 409

g bia koloru 326gniazdo

karty SD 156VGA 396

Hhistereza 281

IIDE 11IMA ADPCM 483informacje

o kolorze 431o obrazie 434

inicjalizacjakarty 161karty SDHC 167karty SDSC 167karty SDXC 167licznika 419pami ci 119USART 505

instrukcjaicall 42movw 35nop 13 24

interfejsSCI 498SDI 498SPI 71 79RS232 120UART 123USART 71 73

interpolacja 259interpolacja w XMEGA 260inwersja obrazu 319

Jjednostki 12jitter 24 303 420

Kkalibracja

ADC 229DAC 306 564offsetu 237

kana DMA 82 522karta 154 158

mikroSD 152SD 151 152SDHC 151 152 160SDSC 160SDXC 151 160

Kup książkę Poleć książkę

578 AVR Uk ady peryferyjne

karty pami ci 151 152 157biblioteka FATFS 180budowa 152format polecenia 158inicjalizacja 161 167komunikacja 156odczyt danych 173opcje konfiguracyjne 181rejestry specjalne 169tryby pracy 153zapis danych 176zasilanie 154

kodasemblerowy 23 24C 23dost pu 24

kodowanieμ-law 481ADPCM 483Dialogic ADPCM 494informacji 166 426koloru 425znakoacutew 536

kodyformatoacutew audio 501zdarze 545

kolejno bajtoacutew 533kolor 424 430kolorowy obraz 437komparator 422

analogowy 279 280analogowy XMEGA 282okienkowy 284

kompilacja plikoacutew binarnych 350kompilator avr-gcc 11 359kompresja

ADPCM 482 486d wi ku 480IMA ADPCM 482

komunikacja z koprocesorem 504konfiguracja

4-portowa 364biblioteki 133debugera 185DMA 459 522fusebitoacutew 570kontrolera DMA 257 452komparatoroacutew 285lockbitoacutew 570LPC 371pami ci SDRAM 381PetitFS 149pinu IO 225portoacutew IO 362

preskalera 452projektu 186przerwa 219pu apki 203rejestru EVCTRL 248rejestru PER 67SPI 75sygna u CS 377typu czcionki 324urz dze IO 189USART 76zegara 383

konsolidacja 547kontroler

DMA 254 298 402 458 518 523KS108 310ST7565R 310ndash315 321

konwersjaDAC 305sygna oacutew 396wyzwalana 306

konwertercyfrowo-analogowy 426DAC 427

koprocesormp3 496VS1003B 10

korekcja fazy 466kwantyzacja 463

Llampa CCFL 44LE Latch Enable 433licznik 419

cykli 209TCC1 400timera 20

linie IO 50linie sygna owe

MISO 72 164MOSI 72SCK 72SS 72

linker 69lista

mnemonikoacutew 24modyfikowanych rejestroacutew 32

lockbity 557 561lockbity w AVR-libc 570LPC Low Pin Count 371LPCM 443 556LSB Least Significant Bit 228

Kup książkę Poleć książkę

Skorowidz 579

a cuchy formatuj ce 212czenie plikoacutew 352

Mmagistrala pami ci zewn trznej 361magnetofon cyfrowy 528makro _SFR_IO_ADDR() 39makrodefinicja

ASSERT 214HD44780_CGADDR() 53HD44780_CLR 53HD44780_DDADDR() 53HD44780_DISPCTL() 52HD44780_ENTMODE() 52HD44780_FNSET() 52HD44780_HOME 53HD44780_SHIFT() 51LOCKBITS 571

mapowanie sygna oacutew 366mapy bitowe 343marker czasowy 268maski bitowe 329matryce 49menu 335menu piktogramowe 342mierniki temperatury 262mikrokontroler

ARM 9AVR 9PIC 9XMEGA128A3U 10

MISO 72moc wydzielana 265model psychoakustyczny 495modu

alfanumeryczny 45NVM 568Xmega eXploreGO 10Xplained ATXMEGA A3BU 10Xplained ATXMEGA-A1 10Xplained XMEGA128A1 447Xplained XMEGA256A3 94Xplained XMEGA256A3BU 97 143 266

modyfikator 30const 85volatile 28 273

monitory CRT 395monochromatyczne wy wietlacze graficzne 309monochromatyczny

tryb graficzny 416tryb tekstowy 413

MOSI 72mp3 495Msps Megasamples per second 12multiplekser wej ciowy 226 283multipleksowanie adresoacutew 368 369muzyka 439

Nnadawanie kodoacutew DTMF 540nadproacutebkowanie 258nag oacutewek kontenera wav 500nagrywanie mowy 486najmniej znacz cy bit 228napi cie

offsetu 280referencyjne 223 295zasilania 239

Oobracanie obrazu 319obraz 319

composite 426kolorowy 430wideo 391

obroacutebka d wi ku 443 445obs uga

FAT 131 143klawiatury matrycowej 24LCD 58 63 67menu 337przerwania 37 38 458przerwania DMA 525przerwa w asemblerze 39przyciskoacutew 272wy wietlaczy alfanumerycznych 45

odczytblokowy 140danych 173 358

odpowied response 159R1 159R2 159R7 160

od wie anie pami ci 376odtwarzanie

d wi ku 472muzyki 447 513 518 521

offset 238offset ADC 230okno

Breakpoints 202Call stack 209dezasemblera 210

Kup książkę Poleć książkę

580 AVR Uk ady peryferyjne

oknoIO View 207podgl du zmiennych 211wyboru czcionek 324

OLED 46opcje

kompilatora 35zapisu d wi ku 445

operacjena buforach 91odczytu 173zapisu 176zapisu strony 92

operand 29operator

ascii 41

asciz 41

byte 41

section 41opoacute nienia 13 18opoacute nienie zmienne 16optymalizacja 16 68optymalizator 26organizacja pami ci 77organizacja pami ci VRAM 316oscylator 287OSD On-Screen Display 417ostrze enie 16oszcz dzanie energii 94

Ppakiet WinAVR 48pami

CGRAM 56 57 64DataFLASH 10 77 81 113 269DDRAM 49EEPROM 111FLASH 54 124 207RAM 49SDRAM 372SRAM 63 124 329 366 371VRAM 314 317

PCLK 421PCM 443PetitFS 144 149p tla

for 13while 201

pierwsza linia obrazu 321piksel 430piktogram 342pin IO 225

plikAlloc_safeh 65DataFLASHc 83DataFLASHIOc 136definesh 50delayh 14diskioh 132 136ffh 132ffconfh 132 181hd44780h 49integerh 132ioh 30LCD_transc 61LCD-transactc 66Makefile 14Menuc 19nothingo 541outfiletxt 547 551pffh 149SPIh 104stringh 113stymulacji 191 192

pliki mp3 495elf 351fon 323o 24S 24 34binarne 350 355csv 276d wi kowe 440obiektowe 352wav 500WMA 512z czcionkami 327z danymi 349

podbijacz napi cia 315podgl d

pami ci 207stosu wywo a 209zmiennych 211znakoacutew 325

pod czeniefototranzystora 262karty SD 155LCD z kontrolerem 311modu u 50pami ci 362 369 370 373termistora 262uk adu LM35 251wyj XMEGA 398

pod wietlenieCCFL 46OLED 46

Kup książkę Poleć książkę

Skorowidz 581

podwoacutejne buforowanie 255 332 457polecenia

kasowania strony 81konfiguracyjne pami ci 82kontrolera ST7565R 315odczytu bufora 82 89odczytu pami ci 81 88SDRAM 376transferu 91

polecenieACMD41 168cd 181CID 178CMD0 165CMD8 167CSD 178date 276dir 127 181dump 276erase 276get 276HD44780_CLR 51Init 178mkdir 181

po czenieDMA ze SPI 96dwoacutech komparatoroacutew 285koprocesora mp3 497LCD z mikrokontrolerem 48wyj cia XMEGA 411XMEGA z PC 121z telewizorem 431

pomiarnapi cia zasilania 239temperatury MCU 241

port IO 30 362pozycjonowanie grafik 345poacute obraz 410precyzja pomiaroacutew 260preskaler 478preskaler ADC 243program

Atmel Data Visualizer 275Audacity 443avr-objcopy 350dataloggera 265LCD Image Converter 323makeloadingtableexe 543Realterm 127 554riffstrip 483SoX 445Tracepoint 208

programowanie sygnatury u ytkownika 566protokoacute master-slave 157

prototypy 136proacutebki d wi kowe 447proacutebkowanie

8-bitowe 300nieliniowe 480

prymitywy graficzne 330przebieg PWM 468przebiegi 289 303przechwytywanie danych 276przemiatanie wej 253przerwanie 218 254 286 403

DMA 522komparatora 286

przestrze adresowa procesora 378przesy anie

danych 498polece 498

przetaktowanie procesora 436przetwornik

ADC 221analogowo-cyfrowy 221cykliczny 222potokowy 222

przyciski 272pseudooperatory 41pu apki breakpoints 197pu apki warunkowe 205punkty ledzenia 203PWM 461 462 472

RRAS Row Address Strobe 375redukcja poboru energii 242regulacja kontrastu 321rejestr 32 34rejestr AC 50

adresu wtyczki 513BASEADDR 377CID 169CMP 251CSD 172czasu utworu 512DATA 83EVCTRL 248formatu audio 512identyfikacyjny pami ci 87INTFLAGS 252kontroli basoacutew 510kontroli g o no ci 513MUXCTRL 227OCR 168PER 67poroacutewnania 249

Kup książkę Poleć książkę

582 AVR Uk ady peryferyjne

rejestr ACSCI_CLOCKF 511stanu komparatora 287stanu pami ci 86stanu uk adu 510trybu pracy 508WINCTRL 285

rejestrydost pu do pami ci RAM 513GPIOR 502IO procesora 36mikrokontrolera 25procesora 35specjalne 94specjalne karty 169uk adu VS1003B 508

relacja rodzic ndash dziecko 336reset uk adu 534rozdzielczo

LCD 329przetwornika 231PWM 463 477

rozszerzenie HiRes 477 479roacutewnanie Steinharta-Harta 263rysowanie map bitowych 343

Sschemat uk adu dataloggera 267SCI Serial Command Interface 498SCK 72SD Secure Digital 152SDI Serial Data Interface 498separator synchronizacji 422separowanie impulsoacutew synchronizacji 422shieldy 10skaler 422skaler napi cia 283skrypt makefile 353s owo kluczowe

asm 27extern 37static 68

specyfikatory lokalizacji zmiennej 213sps samples per second 12SS Slave Select 72standard PAL 410standard VGA 393sterowanie

dataloggerem 275sygna em 379

sterownik 121HD44780 49 56LCD 49 62

stos wywo a 209

strukturaFATFS 139Handle 118LCD_trans 60 63menu 338rejestru 86SimpleFSEntry 113 116SimpleFSHandle 113 118 140submenu 527systemu plikoacutew 112

sumabitowa 571kontrolna 178

sygnacomposite 409composite video output 430CS 377DREQ 497H-Sync 396synchronizacji 423V-Sync 396zegarowy CLK 374

sygna yinterfejsu EBI 363magistrali EBI 364steruj ce 375

sygnaturaprodukcyjna procesora 563u ytkownika 565

symbol__DELAY_ROUND_CLOSEST__ 17__DELAY_ROUND_DOWN__ 17_FS_FAT12 149_FS_FAT32 149_FS_MINIMIZE 133_FS_READONLY 133_FS_RPATH 135_FS_TINY 133_MAX_SS 135_MULTI_PARTITION 135_USE_DIR 149_USE_FASTSEEK 134_USE_FORWARD 134_USE_LABEL 134_USE_LFN 134_USE_LSEEK 149_USE_MKFS 134_USE_READ 149_USE_STRFUNC 134_USE_WRITE 149_VOLUMES 136F_CPU 14 15 18increment 36USE_BUSY_FLAG 50

Kup książkę Poleć książkę

Skorowidz 583

symboleglobalne 36w asemblerze 28zewn trzne 39

symulacja 198 209symulator 190synchronizacja

pami ci 331pionowa 395pozioma 394

systemplikoacutew 111 128przerwa 404zdarze 245

szablonfont_XMEGAtmpl 326image_XMEGAtmpl 343

szum 463szybko przesy ania danych 126

ledzenie wi zki 333rodowisko

graficzne 11programistyczne 11VSIDE 542WinAVR 47

Ttabela FAT 130tablica

framebuf 402 408plugintbl 552 555tekst 208z kodem wynikowym 543

taktowanieDAC 296mikrokontrolera 473

technologia OLED 44temperatura mikrokontrolera 239 241termistor 262 290

NTC 263PTC 263

termometrLM35 249 250z alarmem 251

termostat 290test uk adu VS1003B 503testowanie obrazu 319timer 16 62

TCC0 20

TCC1 399transakcja 59 62 65transakcje 17 103ndash107transakcyjna obs uga LCD 58transakcyjny dost p do SPI 95transfer 91

danych 97wynikoacutew 254

transmisja 72 83tryb

bez znaku 234ci g ej konwersji 252czterobitowy 153dwukana owy 301graficzny 416graficzny VGA 407idle 419jednobitowy 153LPC 371monochromatyczny 397 407oszcz dzania energii 94 306pracy multipleksera 226pracy SPI 157roacute nicowy 232single slope 312SPI 153tekstowy 413tekstowy VGA 397z pojedynczym wej ciem 234ze znakiem 235

trybygenerowania PWM 467pracy karty 153pracy przetwornika 231pracy SPI 74pracy uk adu 508

twierdzenie Nyquista 258tworzenie

adresu 84nak adek 417obrazu 335tablicy 543

typ__uint24 119karty 160niekompletny 60wyliczeniowy 114

typyoperandoacutew 29w AVR 34

Kup książkę Poleć książkę

584 AVR Uk ady peryferyjne

Uuchwyt handle 64 113uk ad

AD725 427 431buforowy 294CS 361DAC 284dataloggera 267detekcji awarii zasilania 559generuj cy obraz 393HiRes 477ICL7660 47LM35 250 251SampH 293sterowania sygna em 379USART 401VS1003B 496 503 508 530 538 556VS100XX 529wzmacniania sygna u 227

uk ady peryferyjne 9uruchomienie komparatora 287urz dzenie

master 72slave 72

u rednianie 259utrata danych 141u ycie wstawki asemblerowej 33

VVGA 393

Wwarto ci kalibracyjne

ADC 564oscylatoroacutew 564temperatury 564

warunkowa kompilacja 36WE Write Enable 375wej cie composite video input 425wektor przerwa 38 257wideo 391wielko pami ci 86 377w czenie DAC 299wska nik na struktur 27wska niki 32wstawki asemblerowe 24 33wtyczka 535 541 544

SineDTMF Generator 537VGA 396

wyboacuter cz stotliwo ci PWM 465 474wykorzystanie

DMA 254 518

EuroSCART 428PWM 461rejestroacutew 34

wyliczanie predyktora 489wy wietlacze

alfanumeryczne 43 45graficzne 43 309LCD 43OLED 46

wy wietlanielitera u 213map bitowych 344obrazu 333 346 406obrazu VGA 393

wywo ania zwrotne callbacks 98asynchroniczne 101synchroniczne 101

wyzwalanie konwersji 245wzmacniacz 446wzmacniacz operacyjny 279wzmacnianie sygna u 227

XXMEGA 9 18

Zzapis

bufora 269danych 176d wi ku 440 556

zasilaniekarty 154pami ci 109

zatrzask 368zatrzask 74HC573 433zatrza ni cie adresu 369zdarzenia 297zdarzenie compare match 399zegar 383 420 426zintegrowane rodowisko programistyczne 11z cze EuroSCART 425 428 429zmiana

g o no ci 527wielko ci strony 94

znaki 56

roacuted onapi cia odniesienia 284sygna u 240

Kup książkę Poleć książkę

Page 30: Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8 AVR. Ukäady peryferyjne Rejestry dost pu do pami ci RAM .....513 Rejestr adresu

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 65

zwalniana W tym celu wykorzystuje si funkcj free_re ktoacuterej prototyp jest zade-klarowany w pliku Alloc_safeh Funkcja ta wywo uje funkcj biblioteczn free ktoacute-ra zwalnia pami przydzielon dynamicznie na stercie Poniewa funkcja ta nie jestfunkcj reentrant nale y stworzy odpowiedni bdquoprotez rdquo opakowuj c j w blokatomowy co zapewnia e nie zostanie ona ponownie wywo ana zanim jej poprzed-nia instancja nie zako czy dzia ania Oczywi cie lepszym rozwi zaniem by oby napi-sanie w asnych funkcji dynamicznej alokacji pami ci ktoacutere b d reentrant

Bardzo wa ne jest aby pole SelfDel mia o warto true wy cznie dla transakcjidla ktoacuterych pami zosta a przydzielona dynamicznie funkcj malloc (lub jej po-chodnymi) W pozosta ych przypadkach pole to musi mie warto false mdash nie-stosowanie si do tej regu y spowoduje b d mened era pami ci i najprawdopo-dobniej nieprzewidywalne dzia anie programu

Drug wa n zasad jest aby zmienna zawieraj ca dane transakcji nie by azmienn automatyczn mdash zmienne takie s automatycznie niszczone po opusz-czeniu zawieraj cej je funkcji W rezultacie obszar pami ci zawieraj cy danetransakcji mo e zosta wykorzystany przez inne zmienne co spowoduje uszkodzeniezawartych w nim danych

Pami przydzielona transakcji musi by alokowana w sposoacuteb dynamiczny (funkcjamalloc_re) ewentualnie mo e to by pami alokowana dla zmiennej globalnej lubstatycznej mdash zmienne tego typu istniej przez ca y czas ycia programu

Warto te zauwa y e instrukcje steruj ce stanem linii Enable kontrolera LCD(SET(OUT HD44780_E) i CLR(OUT HD44780_E)) s rozdzielone wieloma innymi in-strukcjami Dzi ki temu generowany impuls dodatni tego sygna u ma czas trwania gt230 ns wymagany w specyfikacji kontrolera Nawet dla XMEGA taktowanej zegarem32 MHz 230 ns przek ada si na oko o 7 instrukcji asemblera mdash czas jaki z pewno-ci up ynie pomi dzy wykonaniem obu powy szych instrukcji steruj cych

Do wysy ania danych do kontrolera zosta a wykorzystana nieco zmodyfikowanafunkcja hd44780_outnibble_nowait roacute ni ca si od jej protoplasty hd44780_outnibbletylko tym e nie czeka na sygna braku zaj to ci mikrokontrolera (nie realizuje teopoacute nie ) Nie jest to potrzebne gdy kolejne tetrady s wysy ane w odst pach cza-sowych okre lanych przez timer

Mamy wi c zapewnion obs ug transakcji i mo liwo transakcyjnego wy wietlaniadanych na LCD musimy jeszcze mie funkcj ktoacutera tworzy odpowiednie transakcjemdash jest odpowiednikiem funkcji bezpo rednio wysy aj cej dane znakowe do LCDOdpowiednikiem tym jest pokazana poni ej funkcja

bool LCD_PutText_B(uint8_t x uint8_t y char txt LCD_trans buf bool autodel) buf-gtcmd=LCD_Text buf-gtReady=false buf-gtSelfDel=autodel Czy zwolni pami po zako czeniu transakcji buf-gtdata[0]=HD44780_DDADDR(x+y0x40) Ustaw adres w DDRAM strcpy((char)ampbuf-gtdata[1] txt) Skopiuj dane tekstowe + NULL

Kup książkę Poleć książkę

66 AVR Uk ady peryferyjne

buf-gtlen=strlen(txt) + 1 D ugo tekstu + pozycji + NULL ndash 1 bool ret=cbAdd(ampLCD_TransBuffer buf) if((ret==false) ampamp (autodel)) free_re(buf) Brak miejsca w kolejce else TCD0_CTRLA=TC_CLKSEL_DIV1_gc Preskaler 1 mdash odblokuj timer return ret

Funkcja ta buduje transakcj odpowiedzialn za wy wietlenie napisu txt na wskaza-nej pozycji x y LCD Wszystkie dane o transakcji zostan umieszczone w buforzew pami ci ktoacuterej adres jest okre lany wska nikiem buf Pami w buforze musi bywystarczaj co du a aby pomie ci ca transakcj Dodatkowy parametr autodel okre laczy pami ta ma by automatycznie zwalniana po obs u eniu transakcji (true) czynie (false) Je li transakcj uda o si umie ci w kolejce funkcja zwraca true Wartozauwa y e w takim przypadku funkcja uruchamia te timer (w naszym przypadkujest to timer TCD0) odpowiedzialny za generowanie przerwania Funkcja obs ugi prze-rwania wysy a dane do LCD

Pewn odmian powy szej funkcji jest funkcjabool LCD_PutText(uint8_t x uint8_t y char txt) LCD_trans trans=malloc_re(sizeof(LCD_trans) + strlen(txt) + 2) bool ret=LCD_PutText_B(x y txt trans true) return ret

Wykorzystuje ona funkcj LCD_PutText_B z tym e najpierw alokuje dynamiczniepami potrzebn na przechowanie tworzonej transakcji

Mamy komplet potrzebnych funkcji a wi c sprawd my jak ca o sprawdza siw praktyce W pliku LCD-transactc znajduje si kod pokazuj cy jak dzia aj naszetransakcje Aby to by o mo liwe nale y zainicjalizowa kontroler LCD

LCD_init()

Wykorzystujemy tu znan ju funkcj inicjalizuj c mdash nie ma potrzeby jej zmienia gdy operacja inicjalizacji LCD jest jednorazowa i nie trzeba wykonywa jej w posta-ci transakcji W drugim kroku musimy zainicjalizowa wykorzystywany timer i systemprzerwa

LCD_Timer_init(ampTCD0)PMIC_CTRL|=PMIC_LOLVLEN_bm Odblokuj przerwania niskiego poziomusei()

Poniewa dost p do LCD z pewno ci nie jest czynno ci krytyczn czasowo prze-rwaniom timera nadano najni szy priorytet Dzi ki temu mo na innym bardziej kry-tycznym przerwaniom nada wy sze priorytety i uzyska w ten sposoacuteb zmniejszenieczasu latencji obs ugi przerwa Sama inicjalizacja timera jest niezwykle prosta

void LCD_Timer_init(TC0_t tc) tc-gtINTCTRLA=TC_OVFINTLVL_LO_gc Odblokuj przerwania nadmiaru timera i nadaj im niski priorytet tc-gtPER=F_CPULCD_ACCESSTIME Przerwanie co 4 us (niezale nie od F_CPU)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 67

Sprowadza si ona tylko do odblokowania mo liwo ci zg aszania przerwania nadmia-ru oraz konfiguracji rejestru PER tak aby przerwania by y generowane co ok 4 s mdashniezale nie od cz stotliwo ci taktowania CPU Mo emy wi c przyst pi do wy wie-tlenia pierwszego napisu

LCD_PutText(00 Numer)

Powy sza funkcja ma jedn wad mdash alokuje dynamicznie pami po ka dym wywo-aniu (pami ta jest automatycznie zwalniana po obs u eniu transakcji) niemniej

ca y proces jest czasoch onny Mo emy tego unikn alokuj c pami bdquor cznierdquo i wielo-krotnie wykorzystuj c zaalokowany blok pami ci Ilustruje to poni szy przyk ad

LCD_trans buf=malloc_re(sizeof(LCD_trans) + 7)

Zmienna buf wskazuje na obszar pami ci ktoacutery mo e pomie ci a cuch 5-znakowyTyle wystarczy na potrzeby tego przyk adu mdash na LCD b d wy wietlane kolejneliczby w zakresie 0 ndash 65 535 najd u sza ma 5 znakoacutew st d te nasz bufor ma tak a nieinn d ugo

while(1) utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(60 bufstr buf false) while(LCD_IsTransCompleted(buf))

Do konwersji liczby na a cuch u yto funkcji bibliotecznej utoa (nag oacutewek stdlibh)Poniewa d ugo a cucha po konwersji jest zmienna (co spowodowa oby pozosta-wianie na LCD bdquoduchoacutewrdquo po poprzednich konwersjach) w kolejnej linii brakuj ceznaki uzupe niono spacjami Nast pnie tworzona jest transakcja w obszarze pami ciprzydzielonym zmiennej buf Ostatnia p tla while jest odpowiedzialna za oczekiwa-nie na zako czenie realizacji transakcji Po jej zako czeniu p tla jest wykonywana odpocz tku

Uwa ny czytelnik z pewno ci zauwa y e pami przydzielana funkcj malloc_renie jest nigdzie zwalniana mdash w normalnej sytuacji spowodowa oby to wyciek pami -ci W naszym przyk adzie jednak program nigdy si nie ko czy nie ma wi c potrzebyzwalniania pami ci wskazywanej przez zmienn buf

Powy szy przyk ad pokazuje jak unikn blokowania CPU na czas dost pu do wolnodzia aj cego urz dzenia jakim jest LCD alfanumeryczny Jednak to nie wszystkiezalety wynikaj ce z zastosowania transakcji Drug wa n zalet naszego rozwi zaniailustruje przyk ad znajduj cy si w katalogu PrzykladyLCD-alfaLCD-transact-intPowa nym ograniczeniem funkcji odpowiedzialnych za dost p do LCD w sposoacutebklasyczny by a niemo no ich wywo ywania z funkcji obs ugi przerwa mdash funkcjeobs ugi LCD nie by y reentrant2 Nasz system oparty na transakcjach nie ma tychwad Aby to zilustrowa zosta stworzony prosty przyk ad mdash tak jak poprzedniow p tli g oacutewnej programu s wy wietlane stale kolejne liczby ale jednocze nie wyko-

2 Poza tym blokowa y CPU na d ugi czas a jak pami tamy funkcje obs ugi przerwa powinny by

wykonywane mo liwie kroacutetko

Kup książkę Poleć książkę

68 AVR Uk ady peryferyjne

rzystano drugi timer (TCD1) w ktoacuterego funkcji obs ugi przerwania przepe nienia jestwy wietlany licznik tych przerwa

ISR(TCD1_OVF_vect) static char int_buf[sizeof(LCD_trans) + 7] static uint16_t cnt char bufstr[6]

utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(61 bufstr (LCD_trans)ampint_buf false)

Jak widzimy w sposoacuteb asynchroniczny z dwoacutech miejsc w programie mo emy uzy-ska dost p do LCD a ka da funkcja bdquoma wra enierdquo e ma LCD na wy czno Przy okazji warto przeanalizowa sposoacuteb w jaki jest rezerwowana pami na trans-akcj w przerwaniu Oczywi cie mo na by wykorzysta dynamiczn alokacj pami cilecz jak wspomniano taka alokacja jest czasoch onna St d te w pokazanym przy-k adzie wykorzystano tablic statyczn int_buf o rozmiarze umo liwiaj cym prze-chowanie kompletnej transakcji Dzi ki temu e zmienna int_buf jest zmienn statycz-n nie jest ona niszczona po zako czeniu funkcji obs ugi przerwania Gdyby pomins owo kluczowe static zmienna ta by aby niszczona a na LCD najprawdopodobniejzacz yby si pojawia przypadkowe tre ci Poniewa pami naszego bufora nie by aalokowana dynamicznie nie mo e ona zosta zwolniona w naszym sterowniku LCDst d te ostatni parametr wywo ania funkcji LCD_PutText_B musi mie warto false

OptymalizacjaPrzy okazji tego i poprzedniego przyk adu warto zastanowi si jeszcze nad jednkwesti mdash optymalizacji W podanych przyk adach wykorzystano wcze niej omoacute-wione funkcje dost pu do wy wietlacza LCD znajduj ce si w plikach hd44780ci hd44780h Wi kszo z zawartych tam funkcji nie jest wykorzystywana jednakkompilator mimo wszystko umieszcza ich kod w pliku wynikowym mdash dzieje si takponiewa nie mo e on bdquostwierdzi rdquo czy funkcje te nie s wykorzystywane w innychfragmentach programu Pami tajmy e kompilator kompiluje poszczegoacutelne pliki roacute-d owe osobno i dana jego instancja nie bdquowierdquo co znajduje si w innych plikach (innychjednostkach kompilacji) Tak ca o ciow wiedz ma dopiero konsolidator (linker)ktoacutery czy stworzone przez kompilator pliki obiektowe (o rozszerzeniu o) w plikwynikowy Linker jednak bdquonie wierdquo ktoacutera z funkcji programu zosta a u yta a ktoacuteranie mdash informacje te ma wy cznie kompilator W ten sposoacuteb powstaje typowe b dneko o w efekcie nasze nieu ywane funkcje nie s usuwane (linker zostawia je bdquonawszelki wypadekrdquo) i zajmuj niepotrzebnie pami Czy mo na temu jako zaradzi Oczywi cie tak W tym celu trzeba po czy si y kompilatora i linkera co zapewniaj od-powiednie opcje kompilacji We w a ciwo ciach projektu (ProjectProperties lub Alt+F7)wybieramy zak adk Toolchain a nast pnie AVRGNU C Compiler i OptimizationZnajdziemy tam pole wyboru o nazwie Prepare functions for garbage collection (ry-sunek 224)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 69

Rysunek 224 Aby da linkerowi mo liwo usuwania nieu ywanych funkcji nale y skompilowaprogram z wybran opcj ndashffunction-sections ktoacutera spowoduje e ka da funkcja programu znajdzie siwe w asnej sekcji

Zaznaczenie tej funkcji spowoduje umieszczenie ka dej funkcji w osobnej sekcji mdashsamo w sobie nie wp ynie to na skroacutecenie kodu wynikowego ale jest warunkiem nie-zb dnym dla podj cia stosownych dzia a przez linker Aby wyeliminowa nieu y-wane funkcje nale y zaznaczy jeszcze w ga zi AVRGNU LinkerOptimization poleGarbage collect unused sections (rysunek 225)

Rysunek 225 Zaznaczenie opcji Garbage collect unused sections (-Wl--gc-sections) spowodujee nieu ywane funkcje zostan usuni te z kodu wynikowego w efekcie kod programu ulegnie skroacuteceniu

Po zaznaczeniu tych opcji program zostanie skroacutecony o kilkaset bajtoacutew Oczywi cieje li wszystkie funkcje by yby wykorzystane nie uzyskaliby my adnego skroacuteceniakodu Niemniej w sytuacji gdy u ywa si bibliotek zazwyczaj przynajmniej czfunkcji nie jest wykorzystywana warto wi c skorzysta z tej mo liwo ci optymalizacji

Kup książkę Poleć książkę

70 AVR Uk ady peryferyjne

Je li mamy do czynienia z prekompilowan bibliotek (lib) to musi ona by skom-pilowana z zaznaczon opcj Prepare functions for garbage collection (-ffunction-sections) Alternatyw jest umieszczenie ka dej funkcji biblioteki w osobnym pliku(tak jak w przypadku bibliotek AVR-libc)

Na ekranie wyboru opcji optymalizacji linkera mamy jeszcze jedn przydatn opcjmdash Relax Branches (-mrelax) Dla mikrokontroleroacutew ktoacutere maj ponad 8 kB pami ciFLASH instrukcje skokoacutew s generowane jako tzw instrukcje d ugie mdash umo liwiajone skok do komoacuterki pami ci FLASH o dowolnym adresie Jednak cen za to jestwyd u enie instrukcji mdash ich kod jest d u szy podobnie jak czas wykonania Nie zawszejednak takie d ugie instrukcje musz by wykonywane mdash je li miejsce docelowe skokule y blisko (w zasi gu instrukcji skokoacutew wzgl dnych) to mo na w kodzie wynikowymzamieni instrukcje d u sze na kroacutetsze co przynosi oszcz dno ci w postaci skroacuteceniakodu wynikowego Poniewa dopiero linker bdquowierdquo jak poszczegoacutelne fragmenty kodus rozmieszczone w pami ci takiej podmiany mo na dokona na etapie linkowaniaprogramu co zapewnia powy sza opcja St d te warto to pole wyboru zaznaczy

Kup książkę Poleć książkę

SkorowidzA

ABI Application Binary Interface 25AC Address Counter 50ADPCM 482adres

bazowy 377bufora 61komoacuterki 84pu apki 202

ALE Address Latch Enable 368alfanumeryczne wy wietlacze 43algorytm ADPCM 492algorytmy stratne 495animacje 57antyaliasing 325architektury procesoroacutew XMEGA 352asembler 23

dyrektywy 40funkcje j zyka C 41obs uga przerwa 39

asynchroniczne wywo anie funkcji 101Atmel Studio 15

Bbajty kalibracyjne 569biblioteka

FATFS 131 139 176 180 517libcallback-liba 99PetitFS 144 149

bitADC_CH0START_bm 236IMPMODE 244

bitrate 442 512blokowanie przerwa 219b d 16 19

kwantyzacji 463offsetu 230wzmocnienia ADC 230

BOD 223bps bits per second 12

budowakarty 152linii obrazu 394pami ci SDRAM 374pliku stymulacji 192ramki PAL 412sygna u PAL 411wtyczki 544 545

bufor 78FIFO 497na transakcje 61transakcji 62

buforowanie wyj cia 294

CCAS Column Address Strobe 375CCFL 44charakterystyka

przetwornikoacutew 222termistora 264tryboacutew pracy 232

CID Card Identification 169CKE Clock Enable 375CLKIN 421COG Chip on Glass 310CRC 158 178CRC16 178CRC7 164CS Chip Select 361 375CSD Card Specific Data 172czas

dost pu do SDRAM 424adowania kondensatora 244

propagacji 281proacutebkowania 260symulacji 209

czcionki 322cz stotliwo

odchylania pionowego 428proacutebkowania 244 441 444 530przebiegu 504

Kup książkę Poleć książkę

576 AVR Uk ady peryferyjne

cz stotliwoPWM 465taktowania koprocesora 549taktowania procesora 209taktowania rdzenia 18

czyszczenie pami ci 318

DDAC Digital to Analog Converter 293 447 451

buforowanie wyj cia 294generowanie przebiegoacutew 301jitter 303kalibracja 306napi cie referencyjne 295system zdarze 297taktowanie 296tryb dwukana owy 301wykorzystanie DMA 298wyzwalanie konwersji 305

datalogger 261 265 275DD Device Density 86debuger 183

programowy 190sprz towy 185 187

decymacja 259DEBUG 219XMEGA 260

definicja symboli globalnych 36definiowanie w asnych znakoacutew 56deklaracja zapowiadaj ca 103 337dekoder DTMF 548 556DMA 254 298 402 458 518 523dost p do

danych 358 359 568danych binarnych 356 360danych wielobajtowych 31DataFLASH 137EEPROM 128FAT 136komoacuterki 375LCD 59 62 66 68operandu 30pami ci 81 384 386 387 561pami ci SDRAM 424pliku blokowy 141portoacutew IO 30rejestroacutew IO procesora 36rejestroacutew uk adu 499SPI 95sygnatury u ytkownika 565 567wska nikoacutew 32

DQM Data Mask 375DSP Digital Signal Processor 535

DTMF 535 553dyktafon 529dynamiczna alokacja pami ci 516dyrektywa global 38dyrektywy asemblera 40dzia anie

DMA 255komparatora 280timeroacutew 400

d wi k 443

EEBI External Bus Interface 361EEPROM 207eliminacja jitteru 24emulacja RS232 139

FFAT File Allocation Table 128 131FAT32 128FATFS 180filtr

dolnoprzepustowy 491drugiego rz du 470pierwszego rz du 469trzeciego rz du 471

filtrowanie sygna u PWM 468firmware 565FLASH 207format

odpowiedzi 159polecenia 158protoko u 157

funkcja_delay_ms 17 219c_zero 42callback 106 341callback() 99DataFLASH_CSEnable 100DF_FinishBufWrite() 269disk_initialize 136disk_ioctl 181disk_status 136disk_write 138DMA_SPI_init 104DTMF_GetCode 553free_re 65GPIOR0_init 507hd44780_outcmd 51hd44780_outnibble_nowait 65LCD_defchar_P 57

Kup książkę Poleć książkę

Skorowidz 577

Menu_Click_Func 515Menu_Free 516Menu_Recorder 532Menu_Run 527MS_CreateRegEntry 117MS_GetDirPos 125MS_GetRegItem 115MS_WritePages 116 118OSC_wait_for_rdy 473RecMenu_StartStop 532sprintf 142strtok 124sysclk_init() 200 209TMF_memcpy_PF 454udi_cdc_getc() 123udi_cdc_is_rx_ready() 123VS1003_Reset 506

funkcjeanalizuj ce 556biblioteczne 50biblioteki FATFS 143j zyka C 41kontrolera ST7565R 313opoacute niaj ce 17opoacute nie 219reentrant 524specjalne kontrolera 319steruj ce 314zapisu 133

fusebit 557BODACT 560BODLEVEL 560BOOTRST 559DVSDON 560EESAVE 561JTAGEN 558RSTDISBL 559SUT 559TOSCSEL 559

fusebity w AVR-libc 571

Ggenerator obrazu composite 426generowanie

d wi ku 461kolorowego obrazu 437obrazu wideo 391przebiegoacutew 301przerwa 285sygna u composite 409

g bia koloru 326gniazdo

karty SD 156VGA 396

Hhistereza 281

IIDE 11IMA ADPCM 483informacje

o kolorze 431o obrazie 434

inicjalizacjakarty 161karty SDHC 167karty SDSC 167karty SDXC 167licznika 419pami ci 119USART 505

instrukcjaicall 42movw 35nop 13 24

interfejsSCI 498SDI 498SPI 71 79RS232 120UART 123USART 71 73

interpolacja 259interpolacja w XMEGA 260inwersja obrazu 319

Jjednostki 12jitter 24 303 420

Kkalibracja

ADC 229DAC 306 564offsetu 237

kana DMA 82 522karta 154 158

mikroSD 152SD 151 152SDHC 151 152 160SDSC 160SDXC 151 160

Kup książkę Poleć książkę

578 AVR Uk ady peryferyjne

karty pami ci 151 152 157biblioteka FATFS 180budowa 152format polecenia 158inicjalizacja 161 167komunikacja 156odczyt danych 173opcje konfiguracyjne 181rejestry specjalne 169tryby pracy 153zapis danych 176zasilanie 154

kodasemblerowy 23 24C 23dost pu 24

kodowanieμ-law 481ADPCM 483Dialogic ADPCM 494informacji 166 426koloru 425znakoacutew 536

kodyformatoacutew audio 501zdarze 545

kolejno bajtoacutew 533kolor 424 430kolorowy obraz 437komparator 422

analogowy 279 280analogowy XMEGA 282okienkowy 284

kompilacja plikoacutew binarnych 350kompilator avr-gcc 11 359kompresja

ADPCM 482 486d wi ku 480IMA ADPCM 482

komunikacja z koprocesorem 504konfiguracja

4-portowa 364biblioteki 133debugera 185DMA 459 522fusebitoacutew 570kontrolera DMA 257 452komparatoroacutew 285lockbitoacutew 570LPC 371pami ci SDRAM 381PetitFS 149pinu IO 225portoacutew IO 362

preskalera 452projektu 186przerwa 219pu apki 203rejestru EVCTRL 248rejestru PER 67SPI 75sygna u CS 377typu czcionki 324urz dze IO 189USART 76zegara 383

konsolidacja 547kontroler

DMA 254 298 402 458 518 523KS108 310ST7565R 310ndash315 321

konwersjaDAC 305sygna oacutew 396wyzwalana 306

konwertercyfrowo-analogowy 426DAC 427

koprocesormp3 496VS1003B 10

korekcja fazy 466kwantyzacja 463

Llampa CCFL 44LE Latch Enable 433licznik 419

cykli 209TCC1 400timera 20

linie IO 50linie sygna owe

MISO 72 164MOSI 72SCK 72SS 72

linker 69lista

mnemonikoacutew 24modyfikowanych rejestroacutew 32

lockbity 557 561lockbity w AVR-libc 570LPC Low Pin Count 371LPCM 443 556LSB Least Significant Bit 228

Kup książkę Poleć książkę

Skorowidz 579

a cuchy formatuj ce 212czenie plikoacutew 352

Mmagistrala pami ci zewn trznej 361magnetofon cyfrowy 528makro _SFR_IO_ADDR() 39makrodefinicja

ASSERT 214HD44780_CGADDR() 53HD44780_CLR 53HD44780_DDADDR() 53HD44780_DISPCTL() 52HD44780_ENTMODE() 52HD44780_FNSET() 52HD44780_HOME 53HD44780_SHIFT() 51LOCKBITS 571

mapowanie sygna oacutew 366mapy bitowe 343marker czasowy 268maski bitowe 329matryce 49menu 335menu piktogramowe 342mierniki temperatury 262mikrokontroler

ARM 9AVR 9PIC 9XMEGA128A3U 10

MISO 72moc wydzielana 265model psychoakustyczny 495modu

alfanumeryczny 45NVM 568Xmega eXploreGO 10Xplained ATXMEGA A3BU 10Xplained ATXMEGA-A1 10Xplained XMEGA128A1 447Xplained XMEGA256A3 94Xplained XMEGA256A3BU 97 143 266

modyfikator 30const 85volatile 28 273

monitory CRT 395monochromatyczne wy wietlacze graficzne 309monochromatyczny

tryb graficzny 416tryb tekstowy 413

MOSI 72mp3 495Msps Megasamples per second 12multiplekser wej ciowy 226 283multipleksowanie adresoacutew 368 369muzyka 439

Nnadawanie kodoacutew DTMF 540nadproacutebkowanie 258nag oacutewek kontenera wav 500nagrywanie mowy 486najmniej znacz cy bit 228napi cie

offsetu 280referencyjne 223 295zasilania 239

Oobracanie obrazu 319obraz 319

composite 426kolorowy 430wideo 391

obroacutebka d wi ku 443 445obs uga

FAT 131 143klawiatury matrycowej 24LCD 58 63 67menu 337przerwania 37 38 458przerwania DMA 525przerwa w asemblerze 39przyciskoacutew 272wy wietlaczy alfanumerycznych 45

odczytblokowy 140danych 173 358

odpowied response 159R1 159R2 159R7 160

od wie anie pami ci 376odtwarzanie

d wi ku 472muzyki 447 513 518 521

offset 238offset ADC 230okno

Breakpoints 202Call stack 209dezasemblera 210

Kup książkę Poleć książkę

580 AVR Uk ady peryferyjne

oknoIO View 207podgl du zmiennych 211wyboru czcionek 324

OLED 46opcje

kompilatora 35zapisu d wi ku 445

operacjena buforach 91odczytu 173zapisu 176zapisu strony 92

operand 29operator

ascii 41

asciz 41

byte 41

section 41opoacute nienia 13 18opoacute nienie zmienne 16optymalizacja 16 68optymalizator 26organizacja pami ci 77organizacja pami ci VRAM 316oscylator 287OSD On-Screen Display 417ostrze enie 16oszcz dzanie energii 94

Ppakiet WinAVR 48pami

CGRAM 56 57 64DataFLASH 10 77 81 113 269DDRAM 49EEPROM 111FLASH 54 124 207RAM 49SDRAM 372SRAM 63 124 329 366 371VRAM 314 317

PCLK 421PCM 443PetitFS 144 149p tla

for 13while 201

pierwsza linia obrazu 321piksel 430piktogram 342pin IO 225

plikAlloc_safeh 65DataFLASHc 83DataFLASHIOc 136definesh 50delayh 14diskioh 132 136ffh 132ffconfh 132 181hd44780h 49integerh 132ioh 30LCD_transc 61LCD-transactc 66Makefile 14Menuc 19nothingo 541outfiletxt 547 551pffh 149SPIh 104stringh 113stymulacji 191 192

pliki mp3 495elf 351fon 323o 24S 24 34binarne 350 355csv 276d wi kowe 440obiektowe 352wav 500WMA 512z czcionkami 327z danymi 349

podbijacz napi cia 315podgl d

pami ci 207stosu wywo a 209zmiennych 211znakoacutew 325

pod czeniefototranzystora 262karty SD 155LCD z kontrolerem 311modu u 50pami ci 362 369 370 373termistora 262uk adu LM35 251wyj XMEGA 398

pod wietlenieCCFL 46OLED 46

Kup książkę Poleć książkę

Skorowidz 581

podwoacutejne buforowanie 255 332 457polecenia

kasowania strony 81konfiguracyjne pami ci 82kontrolera ST7565R 315odczytu bufora 82 89odczytu pami ci 81 88SDRAM 376transferu 91

polecenieACMD41 168cd 181CID 178CMD0 165CMD8 167CSD 178date 276dir 127 181dump 276erase 276get 276HD44780_CLR 51Init 178mkdir 181

po czenieDMA ze SPI 96dwoacutech komparatoroacutew 285koprocesora mp3 497LCD z mikrokontrolerem 48wyj cia XMEGA 411XMEGA z PC 121z telewizorem 431

pomiarnapi cia zasilania 239temperatury MCU 241

port IO 30 362pozycjonowanie grafik 345poacute obraz 410precyzja pomiaroacutew 260preskaler 478preskaler ADC 243program

Atmel Data Visualizer 275Audacity 443avr-objcopy 350dataloggera 265LCD Image Converter 323makeloadingtableexe 543Realterm 127 554riffstrip 483SoX 445Tracepoint 208

programowanie sygnatury u ytkownika 566protokoacute master-slave 157

prototypy 136proacutebki d wi kowe 447proacutebkowanie

8-bitowe 300nieliniowe 480

prymitywy graficzne 330przebieg PWM 468przebiegi 289 303przechwytywanie danych 276przemiatanie wej 253przerwanie 218 254 286 403

DMA 522komparatora 286

przestrze adresowa procesora 378przesy anie

danych 498polece 498

przetaktowanie procesora 436przetwornik

ADC 221analogowo-cyfrowy 221cykliczny 222potokowy 222

przyciski 272pseudooperatory 41pu apki breakpoints 197pu apki warunkowe 205punkty ledzenia 203PWM 461 462 472

RRAS Row Address Strobe 375redukcja poboru energii 242regulacja kontrastu 321rejestr 32 34rejestr AC 50

adresu wtyczki 513BASEADDR 377CID 169CMP 251CSD 172czasu utworu 512DATA 83EVCTRL 248formatu audio 512identyfikacyjny pami ci 87INTFLAGS 252kontroli basoacutew 510kontroli g o no ci 513MUXCTRL 227OCR 168PER 67poroacutewnania 249

Kup książkę Poleć książkę

582 AVR Uk ady peryferyjne

rejestr ACSCI_CLOCKF 511stanu komparatora 287stanu pami ci 86stanu uk adu 510trybu pracy 508WINCTRL 285

rejestrydost pu do pami ci RAM 513GPIOR 502IO procesora 36mikrokontrolera 25procesora 35specjalne 94specjalne karty 169uk adu VS1003B 508

relacja rodzic ndash dziecko 336reset uk adu 534rozdzielczo

LCD 329przetwornika 231PWM 463 477

rozszerzenie HiRes 477 479roacutewnanie Steinharta-Harta 263rysowanie map bitowych 343

Sschemat uk adu dataloggera 267SCI Serial Command Interface 498SCK 72SD Secure Digital 152SDI Serial Data Interface 498separator synchronizacji 422separowanie impulsoacutew synchronizacji 422shieldy 10skaler 422skaler napi cia 283skrypt makefile 353s owo kluczowe

asm 27extern 37static 68

specyfikatory lokalizacji zmiennej 213sps samples per second 12SS Slave Select 72standard PAL 410standard VGA 393sterowanie

dataloggerem 275sygna em 379

sterownik 121HD44780 49 56LCD 49 62

stos wywo a 209

strukturaFATFS 139Handle 118LCD_trans 60 63menu 338rejestru 86SimpleFSEntry 113 116SimpleFSHandle 113 118 140submenu 527systemu plikoacutew 112

sumabitowa 571kontrolna 178

sygnacomposite 409composite video output 430CS 377DREQ 497H-Sync 396synchronizacji 423V-Sync 396zegarowy CLK 374

sygna yinterfejsu EBI 363magistrali EBI 364steruj ce 375

sygnaturaprodukcyjna procesora 563u ytkownika 565

symbol__DELAY_ROUND_CLOSEST__ 17__DELAY_ROUND_DOWN__ 17_FS_FAT12 149_FS_FAT32 149_FS_MINIMIZE 133_FS_READONLY 133_FS_RPATH 135_FS_TINY 133_MAX_SS 135_MULTI_PARTITION 135_USE_DIR 149_USE_FASTSEEK 134_USE_FORWARD 134_USE_LABEL 134_USE_LFN 134_USE_LSEEK 149_USE_MKFS 134_USE_READ 149_USE_STRFUNC 134_USE_WRITE 149_VOLUMES 136F_CPU 14 15 18increment 36USE_BUSY_FLAG 50

Kup książkę Poleć książkę

Skorowidz 583

symboleglobalne 36w asemblerze 28zewn trzne 39

symulacja 198 209symulator 190synchronizacja

pami ci 331pionowa 395pozioma 394

systemplikoacutew 111 128przerwa 404zdarze 245

szablonfont_XMEGAtmpl 326image_XMEGAtmpl 343

szum 463szybko przesy ania danych 126

ledzenie wi zki 333rodowisko

graficzne 11programistyczne 11VSIDE 542WinAVR 47

Ttabela FAT 130tablica

framebuf 402 408plugintbl 552 555tekst 208z kodem wynikowym 543

taktowanieDAC 296mikrokontrolera 473

technologia OLED 44temperatura mikrokontrolera 239 241termistor 262 290

NTC 263PTC 263

termometrLM35 249 250z alarmem 251

termostat 290test uk adu VS1003B 503testowanie obrazu 319timer 16 62

TCC0 20

TCC1 399transakcja 59 62 65transakcje 17 103ndash107transakcyjna obs uga LCD 58transakcyjny dost p do SPI 95transfer 91

danych 97wynikoacutew 254

transmisja 72 83tryb

bez znaku 234ci g ej konwersji 252czterobitowy 153dwukana owy 301graficzny 416graficzny VGA 407idle 419jednobitowy 153LPC 371monochromatyczny 397 407oszcz dzania energii 94 306pracy multipleksera 226pracy SPI 157roacute nicowy 232single slope 312SPI 153tekstowy 413tekstowy VGA 397z pojedynczym wej ciem 234ze znakiem 235

trybygenerowania PWM 467pracy karty 153pracy przetwornika 231pracy SPI 74pracy uk adu 508

twierdzenie Nyquista 258tworzenie

adresu 84nak adek 417obrazu 335tablicy 543

typ__uint24 119karty 160niekompletny 60wyliczeniowy 114

typyoperandoacutew 29w AVR 34

Kup książkę Poleć książkę

584 AVR Uk ady peryferyjne

Uuchwyt handle 64 113uk ad

AD725 427 431buforowy 294CS 361DAC 284dataloggera 267detekcji awarii zasilania 559generuj cy obraz 393HiRes 477ICL7660 47LM35 250 251SampH 293sterowania sygna em 379USART 401VS1003B 496 503 508 530 538 556VS100XX 529wzmacniania sygna u 227

uk ady peryferyjne 9uruchomienie komparatora 287urz dzenie

master 72slave 72

u rednianie 259utrata danych 141u ycie wstawki asemblerowej 33

VVGA 393

Wwarto ci kalibracyjne

ADC 564oscylatoroacutew 564temperatury 564

warunkowa kompilacja 36WE Write Enable 375wej cie composite video input 425wektor przerwa 38 257wideo 391wielko pami ci 86 377w czenie DAC 299wska nik na struktur 27wska niki 32wstawki asemblerowe 24 33wtyczka 535 541 544

SineDTMF Generator 537VGA 396

wyboacuter cz stotliwo ci PWM 465 474wykorzystanie

DMA 254 518

EuroSCART 428PWM 461rejestroacutew 34

wyliczanie predyktora 489wy wietlacze

alfanumeryczne 43 45graficzne 43 309LCD 43OLED 46

wy wietlanielitera u 213map bitowych 344obrazu 333 346 406obrazu VGA 393

wywo ania zwrotne callbacks 98asynchroniczne 101synchroniczne 101

wyzwalanie konwersji 245wzmacniacz 446wzmacniacz operacyjny 279wzmacnianie sygna u 227

XXMEGA 9 18

Zzapis

bufora 269danych 176d wi ku 440 556

zasilaniekarty 154pami ci 109

zatrzask 368zatrzask 74HC573 433zatrza ni cie adresu 369zdarzenia 297zdarzenie compare match 399zegar 383 420 426zintegrowane rodowisko programistyczne 11z cze EuroSCART 425 428 429zmiana

g o no ci 527wielko ci strony 94

znaki 56

roacuted onapi cia odniesienia 284sygna u 240

Kup książkę Poleć książkę

Page 31: Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8 AVR. Ukäady peryferyjne Rejestry dost pu do pami ci RAM .....513 Rejestr adresu

66 AVR Uk ady peryferyjne

buf-gtlen=strlen(txt) + 1 D ugo tekstu + pozycji + NULL ndash 1 bool ret=cbAdd(ampLCD_TransBuffer buf) if((ret==false) ampamp (autodel)) free_re(buf) Brak miejsca w kolejce else TCD0_CTRLA=TC_CLKSEL_DIV1_gc Preskaler 1 mdash odblokuj timer return ret

Funkcja ta buduje transakcj odpowiedzialn za wy wietlenie napisu txt na wskaza-nej pozycji x y LCD Wszystkie dane o transakcji zostan umieszczone w buforzew pami ci ktoacuterej adres jest okre lany wska nikiem buf Pami w buforze musi bywystarczaj co du a aby pomie ci ca transakcj Dodatkowy parametr autodel okre laczy pami ta ma by automatycznie zwalniana po obs u eniu transakcji (true) czynie (false) Je li transakcj uda o si umie ci w kolejce funkcja zwraca true Wartozauwa y e w takim przypadku funkcja uruchamia te timer (w naszym przypadkujest to timer TCD0) odpowiedzialny za generowanie przerwania Funkcja obs ugi prze-rwania wysy a dane do LCD

Pewn odmian powy szej funkcji jest funkcjabool LCD_PutText(uint8_t x uint8_t y char txt) LCD_trans trans=malloc_re(sizeof(LCD_trans) + strlen(txt) + 2) bool ret=LCD_PutText_B(x y txt trans true) return ret

Wykorzystuje ona funkcj LCD_PutText_B z tym e najpierw alokuje dynamiczniepami potrzebn na przechowanie tworzonej transakcji

Mamy komplet potrzebnych funkcji a wi c sprawd my jak ca o sprawdza siw praktyce W pliku LCD-transactc znajduje si kod pokazuj cy jak dzia aj naszetransakcje Aby to by o mo liwe nale y zainicjalizowa kontroler LCD

LCD_init()

Wykorzystujemy tu znan ju funkcj inicjalizuj c mdash nie ma potrzeby jej zmienia gdy operacja inicjalizacji LCD jest jednorazowa i nie trzeba wykonywa jej w posta-ci transakcji W drugim kroku musimy zainicjalizowa wykorzystywany timer i systemprzerwa

LCD_Timer_init(ampTCD0)PMIC_CTRL|=PMIC_LOLVLEN_bm Odblokuj przerwania niskiego poziomusei()

Poniewa dost p do LCD z pewno ci nie jest czynno ci krytyczn czasowo prze-rwaniom timera nadano najni szy priorytet Dzi ki temu mo na innym bardziej kry-tycznym przerwaniom nada wy sze priorytety i uzyska w ten sposoacuteb zmniejszenieczasu latencji obs ugi przerwa Sama inicjalizacja timera jest niezwykle prosta

void LCD_Timer_init(TC0_t tc) tc-gtINTCTRLA=TC_OVFINTLVL_LO_gc Odblokuj przerwania nadmiaru timera i nadaj im niski priorytet tc-gtPER=F_CPULCD_ACCESSTIME Przerwanie co 4 us (niezale nie od F_CPU)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 67

Sprowadza si ona tylko do odblokowania mo liwo ci zg aszania przerwania nadmia-ru oraz konfiguracji rejestru PER tak aby przerwania by y generowane co ok 4 s mdashniezale nie od cz stotliwo ci taktowania CPU Mo emy wi c przyst pi do wy wie-tlenia pierwszego napisu

LCD_PutText(00 Numer)

Powy sza funkcja ma jedn wad mdash alokuje dynamicznie pami po ka dym wywo-aniu (pami ta jest automatycznie zwalniana po obs u eniu transakcji) niemniej

ca y proces jest czasoch onny Mo emy tego unikn alokuj c pami bdquor cznierdquo i wielo-krotnie wykorzystuj c zaalokowany blok pami ci Ilustruje to poni szy przyk ad

LCD_trans buf=malloc_re(sizeof(LCD_trans) + 7)

Zmienna buf wskazuje na obszar pami ci ktoacutery mo e pomie ci a cuch 5-znakowyTyle wystarczy na potrzeby tego przyk adu mdash na LCD b d wy wietlane kolejneliczby w zakresie 0 ndash 65 535 najd u sza ma 5 znakoacutew st d te nasz bufor ma tak a nieinn d ugo

while(1) utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(60 bufstr buf false) while(LCD_IsTransCompleted(buf))

Do konwersji liczby na a cuch u yto funkcji bibliotecznej utoa (nag oacutewek stdlibh)Poniewa d ugo a cucha po konwersji jest zmienna (co spowodowa oby pozosta-wianie na LCD bdquoduchoacutewrdquo po poprzednich konwersjach) w kolejnej linii brakuj ceznaki uzupe niono spacjami Nast pnie tworzona jest transakcja w obszarze pami ciprzydzielonym zmiennej buf Ostatnia p tla while jest odpowiedzialna za oczekiwa-nie na zako czenie realizacji transakcji Po jej zako czeniu p tla jest wykonywana odpocz tku

Uwa ny czytelnik z pewno ci zauwa y e pami przydzielana funkcj malloc_renie jest nigdzie zwalniana mdash w normalnej sytuacji spowodowa oby to wyciek pami -ci W naszym przyk adzie jednak program nigdy si nie ko czy nie ma wi c potrzebyzwalniania pami ci wskazywanej przez zmienn buf

Powy szy przyk ad pokazuje jak unikn blokowania CPU na czas dost pu do wolnodzia aj cego urz dzenia jakim jest LCD alfanumeryczny Jednak to nie wszystkiezalety wynikaj ce z zastosowania transakcji Drug wa n zalet naszego rozwi zaniailustruje przyk ad znajduj cy si w katalogu PrzykladyLCD-alfaLCD-transact-intPowa nym ograniczeniem funkcji odpowiedzialnych za dost p do LCD w sposoacutebklasyczny by a niemo no ich wywo ywania z funkcji obs ugi przerwa mdash funkcjeobs ugi LCD nie by y reentrant2 Nasz system oparty na transakcjach nie ma tychwad Aby to zilustrowa zosta stworzony prosty przyk ad mdash tak jak poprzedniow p tli g oacutewnej programu s wy wietlane stale kolejne liczby ale jednocze nie wyko-

2 Poza tym blokowa y CPU na d ugi czas a jak pami tamy funkcje obs ugi przerwa powinny by

wykonywane mo liwie kroacutetko

Kup książkę Poleć książkę

68 AVR Uk ady peryferyjne

rzystano drugi timer (TCD1) w ktoacuterego funkcji obs ugi przerwania przepe nienia jestwy wietlany licznik tych przerwa

ISR(TCD1_OVF_vect) static char int_buf[sizeof(LCD_trans) + 7] static uint16_t cnt char bufstr[6]

utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(61 bufstr (LCD_trans)ampint_buf false)

Jak widzimy w sposoacuteb asynchroniczny z dwoacutech miejsc w programie mo emy uzy-ska dost p do LCD a ka da funkcja bdquoma wra enierdquo e ma LCD na wy czno Przy okazji warto przeanalizowa sposoacuteb w jaki jest rezerwowana pami na trans-akcj w przerwaniu Oczywi cie mo na by wykorzysta dynamiczn alokacj pami cilecz jak wspomniano taka alokacja jest czasoch onna St d te w pokazanym przy-k adzie wykorzystano tablic statyczn int_buf o rozmiarze umo liwiaj cym prze-chowanie kompletnej transakcji Dzi ki temu e zmienna int_buf jest zmienn statycz-n nie jest ona niszczona po zako czeniu funkcji obs ugi przerwania Gdyby pomins owo kluczowe static zmienna ta by aby niszczona a na LCD najprawdopodobniejzacz yby si pojawia przypadkowe tre ci Poniewa pami naszego bufora nie by aalokowana dynamicznie nie mo e ona zosta zwolniona w naszym sterowniku LCDst d te ostatni parametr wywo ania funkcji LCD_PutText_B musi mie warto false

OptymalizacjaPrzy okazji tego i poprzedniego przyk adu warto zastanowi si jeszcze nad jednkwesti mdash optymalizacji W podanych przyk adach wykorzystano wcze niej omoacute-wione funkcje dost pu do wy wietlacza LCD znajduj ce si w plikach hd44780ci hd44780h Wi kszo z zawartych tam funkcji nie jest wykorzystywana jednakkompilator mimo wszystko umieszcza ich kod w pliku wynikowym mdash dzieje si takponiewa nie mo e on bdquostwierdzi rdquo czy funkcje te nie s wykorzystywane w innychfragmentach programu Pami tajmy e kompilator kompiluje poszczegoacutelne pliki roacute-d owe osobno i dana jego instancja nie bdquowierdquo co znajduje si w innych plikach (innychjednostkach kompilacji) Tak ca o ciow wiedz ma dopiero konsolidator (linker)ktoacutery czy stworzone przez kompilator pliki obiektowe (o rozszerzeniu o) w plikwynikowy Linker jednak bdquonie wierdquo ktoacutera z funkcji programu zosta a u yta a ktoacuteranie mdash informacje te ma wy cznie kompilator W ten sposoacuteb powstaje typowe b dneko o w efekcie nasze nieu ywane funkcje nie s usuwane (linker zostawia je bdquonawszelki wypadekrdquo) i zajmuj niepotrzebnie pami Czy mo na temu jako zaradzi Oczywi cie tak W tym celu trzeba po czy si y kompilatora i linkera co zapewniaj od-powiednie opcje kompilacji We w a ciwo ciach projektu (ProjectProperties lub Alt+F7)wybieramy zak adk Toolchain a nast pnie AVRGNU C Compiler i OptimizationZnajdziemy tam pole wyboru o nazwie Prepare functions for garbage collection (ry-sunek 224)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 69

Rysunek 224 Aby da linkerowi mo liwo usuwania nieu ywanych funkcji nale y skompilowaprogram z wybran opcj ndashffunction-sections ktoacutera spowoduje e ka da funkcja programu znajdzie siwe w asnej sekcji

Zaznaczenie tej funkcji spowoduje umieszczenie ka dej funkcji w osobnej sekcji mdashsamo w sobie nie wp ynie to na skroacutecenie kodu wynikowego ale jest warunkiem nie-zb dnym dla podj cia stosownych dzia a przez linker Aby wyeliminowa nieu y-wane funkcje nale y zaznaczy jeszcze w ga zi AVRGNU LinkerOptimization poleGarbage collect unused sections (rysunek 225)

Rysunek 225 Zaznaczenie opcji Garbage collect unused sections (-Wl--gc-sections) spowodujee nieu ywane funkcje zostan usuni te z kodu wynikowego w efekcie kod programu ulegnie skroacuteceniu

Po zaznaczeniu tych opcji program zostanie skroacutecony o kilkaset bajtoacutew Oczywi cieje li wszystkie funkcje by yby wykorzystane nie uzyskaliby my adnego skroacuteceniakodu Niemniej w sytuacji gdy u ywa si bibliotek zazwyczaj przynajmniej czfunkcji nie jest wykorzystywana warto wi c skorzysta z tej mo liwo ci optymalizacji

Kup książkę Poleć książkę

70 AVR Uk ady peryferyjne

Je li mamy do czynienia z prekompilowan bibliotek (lib) to musi ona by skom-pilowana z zaznaczon opcj Prepare functions for garbage collection (-ffunction-sections) Alternatyw jest umieszczenie ka dej funkcji biblioteki w osobnym pliku(tak jak w przypadku bibliotek AVR-libc)

Na ekranie wyboru opcji optymalizacji linkera mamy jeszcze jedn przydatn opcjmdash Relax Branches (-mrelax) Dla mikrokontroleroacutew ktoacutere maj ponad 8 kB pami ciFLASH instrukcje skokoacutew s generowane jako tzw instrukcje d ugie mdash umo liwiajone skok do komoacuterki pami ci FLASH o dowolnym adresie Jednak cen za to jestwyd u enie instrukcji mdash ich kod jest d u szy podobnie jak czas wykonania Nie zawszejednak takie d ugie instrukcje musz by wykonywane mdash je li miejsce docelowe skokule y blisko (w zasi gu instrukcji skokoacutew wzgl dnych) to mo na w kodzie wynikowymzamieni instrukcje d u sze na kroacutetsze co przynosi oszcz dno ci w postaci skroacuteceniakodu wynikowego Poniewa dopiero linker bdquowierdquo jak poszczegoacutelne fragmenty kodus rozmieszczone w pami ci takiej podmiany mo na dokona na etapie linkowaniaprogramu co zapewnia powy sza opcja St d te warto to pole wyboru zaznaczy

Kup książkę Poleć książkę

SkorowidzA

ABI Application Binary Interface 25AC Address Counter 50ADPCM 482adres

bazowy 377bufora 61komoacuterki 84pu apki 202

ALE Address Latch Enable 368alfanumeryczne wy wietlacze 43algorytm ADPCM 492algorytmy stratne 495animacje 57antyaliasing 325architektury procesoroacutew XMEGA 352asembler 23

dyrektywy 40funkcje j zyka C 41obs uga przerwa 39

asynchroniczne wywo anie funkcji 101Atmel Studio 15

Bbajty kalibracyjne 569biblioteka

FATFS 131 139 176 180 517libcallback-liba 99PetitFS 144 149

bitADC_CH0START_bm 236IMPMODE 244

bitrate 442 512blokowanie przerwa 219b d 16 19

kwantyzacji 463offsetu 230wzmocnienia ADC 230

BOD 223bps bits per second 12

budowakarty 152linii obrazu 394pami ci SDRAM 374pliku stymulacji 192ramki PAL 412sygna u PAL 411wtyczki 544 545

bufor 78FIFO 497na transakcje 61transakcji 62

buforowanie wyj cia 294

CCAS Column Address Strobe 375CCFL 44charakterystyka

przetwornikoacutew 222termistora 264tryboacutew pracy 232

CID Card Identification 169CKE Clock Enable 375CLKIN 421COG Chip on Glass 310CRC 158 178CRC16 178CRC7 164CS Chip Select 361 375CSD Card Specific Data 172czas

dost pu do SDRAM 424adowania kondensatora 244

propagacji 281proacutebkowania 260symulacji 209

czcionki 322cz stotliwo

odchylania pionowego 428proacutebkowania 244 441 444 530przebiegu 504

Kup książkę Poleć książkę

576 AVR Uk ady peryferyjne

cz stotliwoPWM 465taktowania koprocesora 549taktowania procesora 209taktowania rdzenia 18

czyszczenie pami ci 318

DDAC Digital to Analog Converter 293 447 451

buforowanie wyj cia 294generowanie przebiegoacutew 301jitter 303kalibracja 306napi cie referencyjne 295system zdarze 297taktowanie 296tryb dwukana owy 301wykorzystanie DMA 298wyzwalanie konwersji 305

datalogger 261 265 275DD Device Density 86debuger 183

programowy 190sprz towy 185 187

decymacja 259DEBUG 219XMEGA 260

definicja symboli globalnych 36definiowanie w asnych znakoacutew 56deklaracja zapowiadaj ca 103 337dekoder DTMF 548 556DMA 254 298 402 458 518 523dost p do

danych 358 359 568danych binarnych 356 360danych wielobajtowych 31DataFLASH 137EEPROM 128FAT 136komoacuterki 375LCD 59 62 66 68operandu 30pami ci 81 384 386 387 561pami ci SDRAM 424pliku blokowy 141portoacutew IO 30rejestroacutew IO procesora 36rejestroacutew uk adu 499SPI 95sygnatury u ytkownika 565 567wska nikoacutew 32

DQM Data Mask 375DSP Digital Signal Processor 535

DTMF 535 553dyktafon 529dynamiczna alokacja pami ci 516dyrektywa global 38dyrektywy asemblera 40dzia anie

DMA 255komparatora 280timeroacutew 400

d wi k 443

EEBI External Bus Interface 361EEPROM 207eliminacja jitteru 24emulacja RS232 139

FFAT File Allocation Table 128 131FAT32 128FATFS 180filtr

dolnoprzepustowy 491drugiego rz du 470pierwszego rz du 469trzeciego rz du 471

filtrowanie sygna u PWM 468firmware 565FLASH 207format

odpowiedzi 159polecenia 158protoko u 157

funkcja_delay_ms 17 219c_zero 42callback 106 341callback() 99DataFLASH_CSEnable 100DF_FinishBufWrite() 269disk_initialize 136disk_ioctl 181disk_status 136disk_write 138DMA_SPI_init 104DTMF_GetCode 553free_re 65GPIOR0_init 507hd44780_outcmd 51hd44780_outnibble_nowait 65LCD_defchar_P 57

Kup książkę Poleć książkę

Skorowidz 577

Menu_Click_Func 515Menu_Free 516Menu_Recorder 532Menu_Run 527MS_CreateRegEntry 117MS_GetDirPos 125MS_GetRegItem 115MS_WritePages 116 118OSC_wait_for_rdy 473RecMenu_StartStop 532sprintf 142strtok 124sysclk_init() 200 209TMF_memcpy_PF 454udi_cdc_getc() 123udi_cdc_is_rx_ready() 123VS1003_Reset 506

funkcjeanalizuj ce 556biblioteczne 50biblioteki FATFS 143j zyka C 41kontrolera ST7565R 313opoacute niaj ce 17opoacute nie 219reentrant 524specjalne kontrolera 319steruj ce 314zapisu 133

fusebit 557BODACT 560BODLEVEL 560BOOTRST 559DVSDON 560EESAVE 561JTAGEN 558RSTDISBL 559SUT 559TOSCSEL 559

fusebity w AVR-libc 571

Ggenerator obrazu composite 426generowanie

d wi ku 461kolorowego obrazu 437obrazu wideo 391przebiegoacutew 301przerwa 285sygna u composite 409

g bia koloru 326gniazdo

karty SD 156VGA 396

Hhistereza 281

IIDE 11IMA ADPCM 483informacje

o kolorze 431o obrazie 434

inicjalizacjakarty 161karty SDHC 167karty SDSC 167karty SDXC 167licznika 419pami ci 119USART 505

instrukcjaicall 42movw 35nop 13 24

interfejsSCI 498SDI 498SPI 71 79RS232 120UART 123USART 71 73

interpolacja 259interpolacja w XMEGA 260inwersja obrazu 319

Jjednostki 12jitter 24 303 420

Kkalibracja

ADC 229DAC 306 564offsetu 237

kana DMA 82 522karta 154 158

mikroSD 152SD 151 152SDHC 151 152 160SDSC 160SDXC 151 160

Kup książkę Poleć książkę

578 AVR Uk ady peryferyjne

karty pami ci 151 152 157biblioteka FATFS 180budowa 152format polecenia 158inicjalizacja 161 167komunikacja 156odczyt danych 173opcje konfiguracyjne 181rejestry specjalne 169tryby pracy 153zapis danych 176zasilanie 154

kodasemblerowy 23 24C 23dost pu 24

kodowanieμ-law 481ADPCM 483Dialogic ADPCM 494informacji 166 426koloru 425znakoacutew 536

kodyformatoacutew audio 501zdarze 545

kolejno bajtoacutew 533kolor 424 430kolorowy obraz 437komparator 422

analogowy 279 280analogowy XMEGA 282okienkowy 284

kompilacja plikoacutew binarnych 350kompilator avr-gcc 11 359kompresja

ADPCM 482 486d wi ku 480IMA ADPCM 482

komunikacja z koprocesorem 504konfiguracja

4-portowa 364biblioteki 133debugera 185DMA 459 522fusebitoacutew 570kontrolera DMA 257 452komparatoroacutew 285lockbitoacutew 570LPC 371pami ci SDRAM 381PetitFS 149pinu IO 225portoacutew IO 362

preskalera 452projektu 186przerwa 219pu apki 203rejestru EVCTRL 248rejestru PER 67SPI 75sygna u CS 377typu czcionki 324urz dze IO 189USART 76zegara 383

konsolidacja 547kontroler

DMA 254 298 402 458 518 523KS108 310ST7565R 310ndash315 321

konwersjaDAC 305sygna oacutew 396wyzwalana 306

konwertercyfrowo-analogowy 426DAC 427

koprocesormp3 496VS1003B 10

korekcja fazy 466kwantyzacja 463

Llampa CCFL 44LE Latch Enable 433licznik 419

cykli 209TCC1 400timera 20

linie IO 50linie sygna owe

MISO 72 164MOSI 72SCK 72SS 72

linker 69lista

mnemonikoacutew 24modyfikowanych rejestroacutew 32

lockbity 557 561lockbity w AVR-libc 570LPC Low Pin Count 371LPCM 443 556LSB Least Significant Bit 228

Kup książkę Poleć książkę

Skorowidz 579

a cuchy formatuj ce 212czenie plikoacutew 352

Mmagistrala pami ci zewn trznej 361magnetofon cyfrowy 528makro _SFR_IO_ADDR() 39makrodefinicja

ASSERT 214HD44780_CGADDR() 53HD44780_CLR 53HD44780_DDADDR() 53HD44780_DISPCTL() 52HD44780_ENTMODE() 52HD44780_FNSET() 52HD44780_HOME 53HD44780_SHIFT() 51LOCKBITS 571

mapowanie sygna oacutew 366mapy bitowe 343marker czasowy 268maski bitowe 329matryce 49menu 335menu piktogramowe 342mierniki temperatury 262mikrokontroler

ARM 9AVR 9PIC 9XMEGA128A3U 10

MISO 72moc wydzielana 265model psychoakustyczny 495modu

alfanumeryczny 45NVM 568Xmega eXploreGO 10Xplained ATXMEGA A3BU 10Xplained ATXMEGA-A1 10Xplained XMEGA128A1 447Xplained XMEGA256A3 94Xplained XMEGA256A3BU 97 143 266

modyfikator 30const 85volatile 28 273

monitory CRT 395monochromatyczne wy wietlacze graficzne 309monochromatyczny

tryb graficzny 416tryb tekstowy 413

MOSI 72mp3 495Msps Megasamples per second 12multiplekser wej ciowy 226 283multipleksowanie adresoacutew 368 369muzyka 439

Nnadawanie kodoacutew DTMF 540nadproacutebkowanie 258nag oacutewek kontenera wav 500nagrywanie mowy 486najmniej znacz cy bit 228napi cie

offsetu 280referencyjne 223 295zasilania 239

Oobracanie obrazu 319obraz 319

composite 426kolorowy 430wideo 391

obroacutebka d wi ku 443 445obs uga

FAT 131 143klawiatury matrycowej 24LCD 58 63 67menu 337przerwania 37 38 458przerwania DMA 525przerwa w asemblerze 39przyciskoacutew 272wy wietlaczy alfanumerycznych 45

odczytblokowy 140danych 173 358

odpowied response 159R1 159R2 159R7 160

od wie anie pami ci 376odtwarzanie

d wi ku 472muzyki 447 513 518 521

offset 238offset ADC 230okno

Breakpoints 202Call stack 209dezasemblera 210

Kup książkę Poleć książkę

580 AVR Uk ady peryferyjne

oknoIO View 207podgl du zmiennych 211wyboru czcionek 324

OLED 46opcje

kompilatora 35zapisu d wi ku 445

operacjena buforach 91odczytu 173zapisu 176zapisu strony 92

operand 29operator

ascii 41

asciz 41

byte 41

section 41opoacute nienia 13 18opoacute nienie zmienne 16optymalizacja 16 68optymalizator 26organizacja pami ci 77organizacja pami ci VRAM 316oscylator 287OSD On-Screen Display 417ostrze enie 16oszcz dzanie energii 94

Ppakiet WinAVR 48pami

CGRAM 56 57 64DataFLASH 10 77 81 113 269DDRAM 49EEPROM 111FLASH 54 124 207RAM 49SDRAM 372SRAM 63 124 329 366 371VRAM 314 317

PCLK 421PCM 443PetitFS 144 149p tla

for 13while 201

pierwsza linia obrazu 321piksel 430piktogram 342pin IO 225

plikAlloc_safeh 65DataFLASHc 83DataFLASHIOc 136definesh 50delayh 14diskioh 132 136ffh 132ffconfh 132 181hd44780h 49integerh 132ioh 30LCD_transc 61LCD-transactc 66Makefile 14Menuc 19nothingo 541outfiletxt 547 551pffh 149SPIh 104stringh 113stymulacji 191 192

pliki mp3 495elf 351fon 323o 24S 24 34binarne 350 355csv 276d wi kowe 440obiektowe 352wav 500WMA 512z czcionkami 327z danymi 349

podbijacz napi cia 315podgl d

pami ci 207stosu wywo a 209zmiennych 211znakoacutew 325

pod czeniefototranzystora 262karty SD 155LCD z kontrolerem 311modu u 50pami ci 362 369 370 373termistora 262uk adu LM35 251wyj XMEGA 398

pod wietlenieCCFL 46OLED 46

Kup książkę Poleć książkę

Skorowidz 581

podwoacutejne buforowanie 255 332 457polecenia

kasowania strony 81konfiguracyjne pami ci 82kontrolera ST7565R 315odczytu bufora 82 89odczytu pami ci 81 88SDRAM 376transferu 91

polecenieACMD41 168cd 181CID 178CMD0 165CMD8 167CSD 178date 276dir 127 181dump 276erase 276get 276HD44780_CLR 51Init 178mkdir 181

po czenieDMA ze SPI 96dwoacutech komparatoroacutew 285koprocesora mp3 497LCD z mikrokontrolerem 48wyj cia XMEGA 411XMEGA z PC 121z telewizorem 431

pomiarnapi cia zasilania 239temperatury MCU 241

port IO 30 362pozycjonowanie grafik 345poacute obraz 410precyzja pomiaroacutew 260preskaler 478preskaler ADC 243program

Atmel Data Visualizer 275Audacity 443avr-objcopy 350dataloggera 265LCD Image Converter 323makeloadingtableexe 543Realterm 127 554riffstrip 483SoX 445Tracepoint 208

programowanie sygnatury u ytkownika 566protokoacute master-slave 157

prototypy 136proacutebki d wi kowe 447proacutebkowanie

8-bitowe 300nieliniowe 480

prymitywy graficzne 330przebieg PWM 468przebiegi 289 303przechwytywanie danych 276przemiatanie wej 253przerwanie 218 254 286 403

DMA 522komparatora 286

przestrze adresowa procesora 378przesy anie

danych 498polece 498

przetaktowanie procesora 436przetwornik

ADC 221analogowo-cyfrowy 221cykliczny 222potokowy 222

przyciski 272pseudooperatory 41pu apki breakpoints 197pu apki warunkowe 205punkty ledzenia 203PWM 461 462 472

RRAS Row Address Strobe 375redukcja poboru energii 242regulacja kontrastu 321rejestr 32 34rejestr AC 50

adresu wtyczki 513BASEADDR 377CID 169CMP 251CSD 172czasu utworu 512DATA 83EVCTRL 248formatu audio 512identyfikacyjny pami ci 87INTFLAGS 252kontroli basoacutew 510kontroli g o no ci 513MUXCTRL 227OCR 168PER 67poroacutewnania 249

Kup książkę Poleć książkę

582 AVR Uk ady peryferyjne

rejestr ACSCI_CLOCKF 511stanu komparatora 287stanu pami ci 86stanu uk adu 510trybu pracy 508WINCTRL 285

rejestrydost pu do pami ci RAM 513GPIOR 502IO procesora 36mikrokontrolera 25procesora 35specjalne 94specjalne karty 169uk adu VS1003B 508

relacja rodzic ndash dziecko 336reset uk adu 534rozdzielczo

LCD 329przetwornika 231PWM 463 477

rozszerzenie HiRes 477 479roacutewnanie Steinharta-Harta 263rysowanie map bitowych 343

Sschemat uk adu dataloggera 267SCI Serial Command Interface 498SCK 72SD Secure Digital 152SDI Serial Data Interface 498separator synchronizacji 422separowanie impulsoacutew synchronizacji 422shieldy 10skaler 422skaler napi cia 283skrypt makefile 353s owo kluczowe

asm 27extern 37static 68

specyfikatory lokalizacji zmiennej 213sps samples per second 12SS Slave Select 72standard PAL 410standard VGA 393sterowanie

dataloggerem 275sygna em 379

sterownik 121HD44780 49 56LCD 49 62

stos wywo a 209

strukturaFATFS 139Handle 118LCD_trans 60 63menu 338rejestru 86SimpleFSEntry 113 116SimpleFSHandle 113 118 140submenu 527systemu plikoacutew 112

sumabitowa 571kontrolna 178

sygnacomposite 409composite video output 430CS 377DREQ 497H-Sync 396synchronizacji 423V-Sync 396zegarowy CLK 374

sygna yinterfejsu EBI 363magistrali EBI 364steruj ce 375

sygnaturaprodukcyjna procesora 563u ytkownika 565

symbol__DELAY_ROUND_CLOSEST__ 17__DELAY_ROUND_DOWN__ 17_FS_FAT12 149_FS_FAT32 149_FS_MINIMIZE 133_FS_READONLY 133_FS_RPATH 135_FS_TINY 133_MAX_SS 135_MULTI_PARTITION 135_USE_DIR 149_USE_FASTSEEK 134_USE_FORWARD 134_USE_LABEL 134_USE_LFN 134_USE_LSEEK 149_USE_MKFS 134_USE_READ 149_USE_STRFUNC 134_USE_WRITE 149_VOLUMES 136F_CPU 14 15 18increment 36USE_BUSY_FLAG 50

Kup książkę Poleć książkę

Skorowidz 583

symboleglobalne 36w asemblerze 28zewn trzne 39

symulacja 198 209symulator 190synchronizacja

pami ci 331pionowa 395pozioma 394

systemplikoacutew 111 128przerwa 404zdarze 245

szablonfont_XMEGAtmpl 326image_XMEGAtmpl 343

szum 463szybko przesy ania danych 126

ledzenie wi zki 333rodowisko

graficzne 11programistyczne 11VSIDE 542WinAVR 47

Ttabela FAT 130tablica

framebuf 402 408plugintbl 552 555tekst 208z kodem wynikowym 543

taktowanieDAC 296mikrokontrolera 473

technologia OLED 44temperatura mikrokontrolera 239 241termistor 262 290

NTC 263PTC 263

termometrLM35 249 250z alarmem 251

termostat 290test uk adu VS1003B 503testowanie obrazu 319timer 16 62

TCC0 20

TCC1 399transakcja 59 62 65transakcje 17 103ndash107transakcyjna obs uga LCD 58transakcyjny dost p do SPI 95transfer 91

danych 97wynikoacutew 254

transmisja 72 83tryb

bez znaku 234ci g ej konwersji 252czterobitowy 153dwukana owy 301graficzny 416graficzny VGA 407idle 419jednobitowy 153LPC 371monochromatyczny 397 407oszcz dzania energii 94 306pracy multipleksera 226pracy SPI 157roacute nicowy 232single slope 312SPI 153tekstowy 413tekstowy VGA 397z pojedynczym wej ciem 234ze znakiem 235

trybygenerowania PWM 467pracy karty 153pracy przetwornika 231pracy SPI 74pracy uk adu 508

twierdzenie Nyquista 258tworzenie

adresu 84nak adek 417obrazu 335tablicy 543

typ__uint24 119karty 160niekompletny 60wyliczeniowy 114

typyoperandoacutew 29w AVR 34

Kup książkę Poleć książkę

584 AVR Uk ady peryferyjne

Uuchwyt handle 64 113uk ad

AD725 427 431buforowy 294CS 361DAC 284dataloggera 267detekcji awarii zasilania 559generuj cy obraz 393HiRes 477ICL7660 47LM35 250 251SampH 293sterowania sygna em 379USART 401VS1003B 496 503 508 530 538 556VS100XX 529wzmacniania sygna u 227

uk ady peryferyjne 9uruchomienie komparatora 287urz dzenie

master 72slave 72

u rednianie 259utrata danych 141u ycie wstawki asemblerowej 33

VVGA 393

Wwarto ci kalibracyjne

ADC 564oscylatoroacutew 564temperatury 564

warunkowa kompilacja 36WE Write Enable 375wej cie composite video input 425wektor przerwa 38 257wideo 391wielko pami ci 86 377w czenie DAC 299wska nik na struktur 27wska niki 32wstawki asemblerowe 24 33wtyczka 535 541 544

SineDTMF Generator 537VGA 396

wyboacuter cz stotliwo ci PWM 465 474wykorzystanie

DMA 254 518

EuroSCART 428PWM 461rejestroacutew 34

wyliczanie predyktora 489wy wietlacze

alfanumeryczne 43 45graficzne 43 309LCD 43OLED 46

wy wietlanielitera u 213map bitowych 344obrazu 333 346 406obrazu VGA 393

wywo ania zwrotne callbacks 98asynchroniczne 101synchroniczne 101

wyzwalanie konwersji 245wzmacniacz 446wzmacniacz operacyjny 279wzmacnianie sygna u 227

XXMEGA 9 18

Zzapis

bufora 269danych 176d wi ku 440 556

zasilaniekarty 154pami ci 109

zatrzask 368zatrzask 74HC573 433zatrza ni cie adresu 369zdarzenia 297zdarzenie compare match 399zegar 383 420 426zintegrowane rodowisko programistyczne 11z cze EuroSCART 425 428 429zmiana

g o no ci 527wielko ci strony 94

znaki 56

roacuted onapi cia odniesienia 284sygna u 240

Kup książkę Poleć książkę

Page 32: Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8 AVR. Ukäady peryferyjne Rejestry dost pu do pami ci RAM .....513 Rejestr adresu

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 67

Sprowadza si ona tylko do odblokowania mo liwo ci zg aszania przerwania nadmia-ru oraz konfiguracji rejestru PER tak aby przerwania by y generowane co ok 4 s mdashniezale nie od cz stotliwo ci taktowania CPU Mo emy wi c przyst pi do wy wie-tlenia pierwszego napisu

LCD_PutText(00 Numer)

Powy sza funkcja ma jedn wad mdash alokuje dynamicznie pami po ka dym wywo-aniu (pami ta jest automatycznie zwalniana po obs u eniu transakcji) niemniej

ca y proces jest czasoch onny Mo emy tego unikn alokuj c pami bdquor cznierdquo i wielo-krotnie wykorzystuj c zaalokowany blok pami ci Ilustruje to poni szy przyk ad

LCD_trans buf=malloc_re(sizeof(LCD_trans) + 7)

Zmienna buf wskazuje na obszar pami ci ktoacutery mo e pomie ci a cuch 5-znakowyTyle wystarczy na potrzeby tego przyk adu mdash na LCD b d wy wietlane kolejneliczby w zakresie 0 ndash 65 535 najd u sza ma 5 znakoacutew st d te nasz bufor ma tak a nieinn d ugo

while(1) utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(60 bufstr buf false) while(LCD_IsTransCompleted(buf))

Do konwersji liczby na a cuch u yto funkcji bibliotecznej utoa (nag oacutewek stdlibh)Poniewa d ugo a cucha po konwersji jest zmienna (co spowodowa oby pozosta-wianie na LCD bdquoduchoacutewrdquo po poprzednich konwersjach) w kolejnej linii brakuj ceznaki uzupe niono spacjami Nast pnie tworzona jest transakcja w obszarze pami ciprzydzielonym zmiennej buf Ostatnia p tla while jest odpowiedzialna za oczekiwa-nie na zako czenie realizacji transakcji Po jej zako czeniu p tla jest wykonywana odpocz tku

Uwa ny czytelnik z pewno ci zauwa y e pami przydzielana funkcj malloc_renie jest nigdzie zwalniana mdash w normalnej sytuacji spowodowa oby to wyciek pami -ci W naszym przyk adzie jednak program nigdy si nie ko czy nie ma wi c potrzebyzwalniania pami ci wskazywanej przez zmienn buf

Powy szy przyk ad pokazuje jak unikn blokowania CPU na czas dost pu do wolnodzia aj cego urz dzenia jakim jest LCD alfanumeryczny Jednak to nie wszystkiezalety wynikaj ce z zastosowania transakcji Drug wa n zalet naszego rozwi zaniailustruje przyk ad znajduj cy si w katalogu PrzykladyLCD-alfaLCD-transact-intPowa nym ograniczeniem funkcji odpowiedzialnych za dost p do LCD w sposoacutebklasyczny by a niemo no ich wywo ywania z funkcji obs ugi przerwa mdash funkcjeobs ugi LCD nie by y reentrant2 Nasz system oparty na transakcjach nie ma tychwad Aby to zilustrowa zosta stworzony prosty przyk ad mdash tak jak poprzedniow p tli g oacutewnej programu s wy wietlane stale kolejne liczby ale jednocze nie wyko-

2 Poza tym blokowa y CPU na d ugi czas a jak pami tamy funkcje obs ugi przerwa powinny by

wykonywane mo liwie kroacutetko

Kup książkę Poleć książkę

68 AVR Uk ady peryferyjne

rzystano drugi timer (TCD1) w ktoacuterego funkcji obs ugi przerwania przepe nienia jestwy wietlany licznik tych przerwa

ISR(TCD1_OVF_vect) static char int_buf[sizeof(LCD_trans) + 7] static uint16_t cnt char bufstr[6]

utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(61 bufstr (LCD_trans)ampint_buf false)

Jak widzimy w sposoacuteb asynchroniczny z dwoacutech miejsc w programie mo emy uzy-ska dost p do LCD a ka da funkcja bdquoma wra enierdquo e ma LCD na wy czno Przy okazji warto przeanalizowa sposoacuteb w jaki jest rezerwowana pami na trans-akcj w przerwaniu Oczywi cie mo na by wykorzysta dynamiczn alokacj pami cilecz jak wspomniano taka alokacja jest czasoch onna St d te w pokazanym przy-k adzie wykorzystano tablic statyczn int_buf o rozmiarze umo liwiaj cym prze-chowanie kompletnej transakcji Dzi ki temu e zmienna int_buf jest zmienn statycz-n nie jest ona niszczona po zako czeniu funkcji obs ugi przerwania Gdyby pomins owo kluczowe static zmienna ta by aby niszczona a na LCD najprawdopodobniejzacz yby si pojawia przypadkowe tre ci Poniewa pami naszego bufora nie by aalokowana dynamicznie nie mo e ona zosta zwolniona w naszym sterowniku LCDst d te ostatni parametr wywo ania funkcji LCD_PutText_B musi mie warto false

OptymalizacjaPrzy okazji tego i poprzedniego przyk adu warto zastanowi si jeszcze nad jednkwesti mdash optymalizacji W podanych przyk adach wykorzystano wcze niej omoacute-wione funkcje dost pu do wy wietlacza LCD znajduj ce si w plikach hd44780ci hd44780h Wi kszo z zawartych tam funkcji nie jest wykorzystywana jednakkompilator mimo wszystko umieszcza ich kod w pliku wynikowym mdash dzieje si takponiewa nie mo e on bdquostwierdzi rdquo czy funkcje te nie s wykorzystywane w innychfragmentach programu Pami tajmy e kompilator kompiluje poszczegoacutelne pliki roacute-d owe osobno i dana jego instancja nie bdquowierdquo co znajduje si w innych plikach (innychjednostkach kompilacji) Tak ca o ciow wiedz ma dopiero konsolidator (linker)ktoacutery czy stworzone przez kompilator pliki obiektowe (o rozszerzeniu o) w plikwynikowy Linker jednak bdquonie wierdquo ktoacutera z funkcji programu zosta a u yta a ktoacuteranie mdash informacje te ma wy cznie kompilator W ten sposoacuteb powstaje typowe b dneko o w efekcie nasze nieu ywane funkcje nie s usuwane (linker zostawia je bdquonawszelki wypadekrdquo) i zajmuj niepotrzebnie pami Czy mo na temu jako zaradzi Oczywi cie tak W tym celu trzeba po czy si y kompilatora i linkera co zapewniaj od-powiednie opcje kompilacji We w a ciwo ciach projektu (ProjectProperties lub Alt+F7)wybieramy zak adk Toolchain a nast pnie AVRGNU C Compiler i OptimizationZnajdziemy tam pole wyboru o nazwie Prepare functions for garbage collection (ry-sunek 224)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 69

Rysunek 224 Aby da linkerowi mo liwo usuwania nieu ywanych funkcji nale y skompilowaprogram z wybran opcj ndashffunction-sections ktoacutera spowoduje e ka da funkcja programu znajdzie siwe w asnej sekcji

Zaznaczenie tej funkcji spowoduje umieszczenie ka dej funkcji w osobnej sekcji mdashsamo w sobie nie wp ynie to na skroacutecenie kodu wynikowego ale jest warunkiem nie-zb dnym dla podj cia stosownych dzia a przez linker Aby wyeliminowa nieu y-wane funkcje nale y zaznaczy jeszcze w ga zi AVRGNU LinkerOptimization poleGarbage collect unused sections (rysunek 225)

Rysunek 225 Zaznaczenie opcji Garbage collect unused sections (-Wl--gc-sections) spowodujee nieu ywane funkcje zostan usuni te z kodu wynikowego w efekcie kod programu ulegnie skroacuteceniu

Po zaznaczeniu tych opcji program zostanie skroacutecony o kilkaset bajtoacutew Oczywi cieje li wszystkie funkcje by yby wykorzystane nie uzyskaliby my adnego skroacuteceniakodu Niemniej w sytuacji gdy u ywa si bibliotek zazwyczaj przynajmniej czfunkcji nie jest wykorzystywana warto wi c skorzysta z tej mo liwo ci optymalizacji

Kup książkę Poleć książkę

70 AVR Uk ady peryferyjne

Je li mamy do czynienia z prekompilowan bibliotek (lib) to musi ona by skom-pilowana z zaznaczon opcj Prepare functions for garbage collection (-ffunction-sections) Alternatyw jest umieszczenie ka dej funkcji biblioteki w osobnym pliku(tak jak w przypadku bibliotek AVR-libc)

Na ekranie wyboru opcji optymalizacji linkera mamy jeszcze jedn przydatn opcjmdash Relax Branches (-mrelax) Dla mikrokontroleroacutew ktoacutere maj ponad 8 kB pami ciFLASH instrukcje skokoacutew s generowane jako tzw instrukcje d ugie mdash umo liwiajone skok do komoacuterki pami ci FLASH o dowolnym adresie Jednak cen za to jestwyd u enie instrukcji mdash ich kod jest d u szy podobnie jak czas wykonania Nie zawszejednak takie d ugie instrukcje musz by wykonywane mdash je li miejsce docelowe skokule y blisko (w zasi gu instrukcji skokoacutew wzgl dnych) to mo na w kodzie wynikowymzamieni instrukcje d u sze na kroacutetsze co przynosi oszcz dno ci w postaci skroacuteceniakodu wynikowego Poniewa dopiero linker bdquowierdquo jak poszczegoacutelne fragmenty kodus rozmieszczone w pami ci takiej podmiany mo na dokona na etapie linkowaniaprogramu co zapewnia powy sza opcja St d te warto to pole wyboru zaznaczy

Kup książkę Poleć książkę

SkorowidzA

ABI Application Binary Interface 25AC Address Counter 50ADPCM 482adres

bazowy 377bufora 61komoacuterki 84pu apki 202

ALE Address Latch Enable 368alfanumeryczne wy wietlacze 43algorytm ADPCM 492algorytmy stratne 495animacje 57antyaliasing 325architektury procesoroacutew XMEGA 352asembler 23

dyrektywy 40funkcje j zyka C 41obs uga przerwa 39

asynchroniczne wywo anie funkcji 101Atmel Studio 15

Bbajty kalibracyjne 569biblioteka

FATFS 131 139 176 180 517libcallback-liba 99PetitFS 144 149

bitADC_CH0START_bm 236IMPMODE 244

bitrate 442 512blokowanie przerwa 219b d 16 19

kwantyzacji 463offsetu 230wzmocnienia ADC 230

BOD 223bps bits per second 12

budowakarty 152linii obrazu 394pami ci SDRAM 374pliku stymulacji 192ramki PAL 412sygna u PAL 411wtyczki 544 545

bufor 78FIFO 497na transakcje 61transakcji 62

buforowanie wyj cia 294

CCAS Column Address Strobe 375CCFL 44charakterystyka

przetwornikoacutew 222termistora 264tryboacutew pracy 232

CID Card Identification 169CKE Clock Enable 375CLKIN 421COG Chip on Glass 310CRC 158 178CRC16 178CRC7 164CS Chip Select 361 375CSD Card Specific Data 172czas

dost pu do SDRAM 424adowania kondensatora 244

propagacji 281proacutebkowania 260symulacji 209

czcionki 322cz stotliwo

odchylania pionowego 428proacutebkowania 244 441 444 530przebiegu 504

Kup książkę Poleć książkę

576 AVR Uk ady peryferyjne

cz stotliwoPWM 465taktowania koprocesora 549taktowania procesora 209taktowania rdzenia 18

czyszczenie pami ci 318

DDAC Digital to Analog Converter 293 447 451

buforowanie wyj cia 294generowanie przebiegoacutew 301jitter 303kalibracja 306napi cie referencyjne 295system zdarze 297taktowanie 296tryb dwukana owy 301wykorzystanie DMA 298wyzwalanie konwersji 305

datalogger 261 265 275DD Device Density 86debuger 183

programowy 190sprz towy 185 187

decymacja 259DEBUG 219XMEGA 260

definicja symboli globalnych 36definiowanie w asnych znakoacutew 56deklaracja zapowiadaj ca 103 337dekoder DTMF 548 556DMA 254 298 402 458 518 523dost p do

danych 358 359 568danych binarnych 356 360danych wielobajtowych 31DataFLASH 137EEPROM 128FAT 136komoacuterki 375LCD 59 62 66 68operandu 30pami ci 81 384 386 387 561pami ci SDRAM 424pliku blokowy 141portoacutew IO 30rejestroacutew IO procesora 36rejestroacutew uk adu 499SPI 95sygnatury u ytkownika 565 567wska nikoacutew 32

DQM Data Mask 375DSP Digital Signal Processor 535

DTMF 535 553dyktafon 529dynamiczna alokacja pami ci 516dyrektywa global 38dyrektywy asemblera 40dzia anie

DMA 255komparatora 280timeroacutew 400

d wi k 443

EEBI External Bus Interface 361EEPROM 207eliminacja jitteru 24emulacja RS232 139

FFAT File Allocation Table 128 131FAT32 128FATFS 180filtr

dolnoprzepustowy 491drugiego rz du 470pierwszego rz du 469trzeciego rz du 471

filtrowanie sygna u PWM 468firmware 565FLASH 207format

odpowiedzi 159polecenia 158protoko u 157

funkcja_delay_ms 17 219c_zero 42callback 106 341callback() 99DataFLASH_CSEnable 100DF_FinishBufWrite() 269disk_initialize 136disk_ioctl 181disk_status 136disk_write 138DMA_SPI_init 104DTMF_GetCode 553free_re 65GPIOR0_init 507hd44780_outcmd 51hd44780_outnibble_nowait 65LCD_defchar_P 57

Kup książkę Poleć książkę

Skorowidz 577

Menu_Click_Func 515Menu_Free 516Menu_Recorder 532Menu_Run 527MS_CreateRegEntry 117MS_GetDirPos 125MS_GetRegItem 115MS_WritePages 116 118OSC_wait_for_rdy 473RecMenu_StartStop 532sprintf 142strtok 124sysclk_init() 200 209TMF_memcpy_PF 454udi_cdc_getc() 123udi_cdc_is_rx_ready() 123VS1003_Reset 506

funkcjeanalizuj ce 556biblioteczne 50biblioteki FATFS 143j zyka C 41kontrolera ST7565R 313opoacute niaj ce 17opoacute nie 219reentrant 524specjalne kontrolera 319steruj ce 314zapisu 133

fusebit 557BODACT 560BODLEVEL 560BOOTRST 559DVSDON 560EESAVE 561JTAGEN 558RSTDISBL 559SUT 559TOSCSEL 559

fusebity w AVR-libc 571

Ggenerator obrazu composite 426generowanie

d wi ku 461kolorowego obrazu 437obrazu wideo 391przebiegoacutew 301przerwa 285sygna u composite 409

g bia koloru 326gniazdo

karty SD 156VGA 396

Hhistereza 281

IIDE 11IMA ADPCM 483informacje

o kolorze 431o obrazie 434

inicjalizacjakarty 161karty SDHC 167karty SDSC 167karty SDXC 167licznika 419pami ci 119USART 505

instrukcjaicall 42movw 35nop 13 24

interfejsSCI 498SDI 498SPI 71 79RS232 120UART 123USART 71 73

interpolacja 259interpolacja w XMEGA 260inwersja obrazu 319

Jjednostki 12jitter 24 303 420

Kkalibracja

ADC 229DAC 306 564offsetu 237

kana DMA 82 522karta 154 158

mikroSD 152SD 151 152SDHC 151 152 160SDSC 160SDXC 151 160

Kup książkę Poleć książkę

578 AVR Uk ady peryferyjne

karty pami ci 151 152 157biblioteka FATFS 180budowa 152format polecenia 158inicjalizacja 161 167komunikacja 156odczyt danych 173opcje konfiguracyjne 181rejestry specjalne 169tryby pracy 153zapis danych 176zasilanie 154

kodasemblerowy 23 24C 23dost pu 24

kodowanieμ-law 481ADPCM 483Dialogic ADPCM 494informacji 166 426koloru 425znakoacutew 536

kodyformatoacutew audio 501zdarze 545

kolejno bajtoacutew 533kolor 424 430kolorowy obraz 437komparator 422

analogowy 279 280analogowy XMEGA 282okienkowy 284

kompilacja plikoacutew binarnych 350kompilator avr-gcc 11 359kompresja

ADPCM 482 486d wi ku 480IMA ADPCM 482

komunikacja z koprocesorem 504konfiguracja

4-portowa 364biblioteki 133debugera 185DMA 459 522fusebitoacutew 570kontrolera DMA 257 452komparatoroacutew 285lockbitoacutew 570LPC 371pami ci SDRAM 381PetitFS 149pinu IO 225portoacutew IO 362

preskalera 452projektu 186przerwa 219pu apki 203rejestru EVCTRL 248rejestru PER 67SPI 75sygna u CS 377typu czcionki 324urz dze IO 189USART 76zegara 383

konsolidacja 547kontroler

DMA 254 298 402 458 518 523KS108 310ST7565R 310ndash315 321

konwersjaDAC 305sygna oacutew 396wyzwalana 306

konwertercyfrowo-analogowy 426DAC 427

koprocesormp3 496VS1003B 10

korekcja fazy 466kwantyzacja 463

Llampa CCFL 44LE Latch Enable 433licznik 419

cykli 209TCC1 400timera 20

linie IO 50linie sygna owe

MISO 72 164MOSI 72SCK 72SS 72

linker 69lista

mnemonikoacutew 24modyfikowanych rejestroacutew 32

lockbity 557 561lockbity w AVR-libc 570LPC Low Pin Count 371LPCM 443 556LSB Least Significant Bit 228

Kup książkę Poleć książkę

Skorowidz 579

a cuchy formatuj ce 212czenie plikoacutew 352

Mmagistrala pami ci zewn trznej 361magnetofon cyfrowy 528makro _SFR_IO_ADDR() 39makrodefinicja

ASSERT 214HD44780_CGADDR() 53HD44780_CLR 53HD44780_DDADDR() 53HD44780_DISPCTL() 52HD44780_ENTMODE() 52HD44780_FNSET() 52HD44780_HOME 53HD44780_SHIFT() 51LOCKBITS 571

mapowanie sygna oacutew 366mapy bitowe 343marker czasowy 268maski bitowe 329matryce 49menu 335menu piktogramowe 342mierniki temperatury 262mikrokontroler

ARM 9AVR 9PIC 9XMEGA128A3U 10

MISO 72moc wydzielana 265model psychoakustyczny 495modu

alfanumeryczny 45NVM 568Xmega eXploreGO 10Xplained ATXMEGA A3BU 10Xplained ATXMEGA-A1 10Xplained XMEGA128A1 447Xplained XMEGA256A3 94Xplained XMEGA256A3BU 97 143 266

modyfikator 30const 85volatile 28 273

monitory CRT 395monochromatyczne wy wietlacze graficzne 309monochromatyczny

tryb graficzny 416tryb tekstowy 413

MOSI 72mp3 495Msps Megasamples per second 12multiplekser wej ciowy 226 283multipleksowanie adresoacutew 368 369muzyka 439

Nnadawanie kodoacutew DTMF 540nadproacutebkowanie 258nag oacutewek kontenera wav 500nagrywanie mowy 486najmniej znacz cy bit 228napi cie

offsetu 280referencyjne 223 295zasilania 239

Oobracanie obrazu 319obraz 319

composite 426kolorowy 430wideo 391

obroacutebka d wi ku 443 445obs uga

FAT 131 143klawiatury matrycowej 24LCD 58 63 67menu 337przerwania 37 38 458przerwania DMA 525przerwa w asemblerze 39przyciskoacutew 272wy wietlaczy alfanumerycznych 45

odczytblokowy 140danych 173 358

odpowied response 159R1 159R2 159R7 160

od wie anie pami ci 376odtwarzanie

d wi ku 472muzyki 447 513 518 521

offset 238offset ADC 230okno

Breakpoints 202Call stack 209dezasemblera 210

Kup książkę Poleć książkę

580 AVR Uk ady peryferyjne

oknoIO View 207podgl du zmiennych 211wyboru czcionek 324

OLED 46opcje

kompilatora 35zapisu d wi ku 445

operacjena buforach 91odczytu 173zapisu 176zapisu strony 92

operand 29operator

ascii 41

asciz 41

byte 41

section 41opoacute nienia 13 18opoacute nienie zmienne 16optymalizacja 16 68optymalizator 26organizacja pami ci 77organizacja pami ci VRAM 316oscylator 287OSD On-Screen Display 417ostrze enie 16oszcz dzanie energii 94

Ppakiet WinAVR 48pami

CGRAM 56 57 64DataFLASH 10 77 81 113 269DDRAM 49EEPROM 111FLASH 54 124 207RAM 49SDRAM 372SRAM 63 124 329 366 371VRAM 314 317

PCLK 421PCM 443PetitFS 144 149p tla

for 13while 201

pierwsza linia obrazu 321piksel 430piktogram 342pin IO 225

plikAlloc_safeh 65DataFLASHc 83DataFLASHIOc 136definesh 50delayh 14diskioh 132 136ffh 132ffconfh 132 181hd44780h 49integerh 132ioh 30LCD_transc 61LCD-transactc 66Makefile 14Menuc 19nothingo 541outfiletxt 547 551pffh 149SPIh 104stringh 113stymulacji 191 192

pliki mp3 495elf 351fon 323o 24S 24 34binarne 350 355csv 276d wi kowe 440obiektowe 352wav 500WMA 512z czcionkami 327z danymi 349

podbijacz napi cia 315podgl d

pami ci 207stosu wywo a 209zmiennych 211znakoacutew 325

pod czeniefototranzystora 262karty SD 155LCD z kontrolerem 311modu u 50pami ci 362 369 370 373termistora 262uk adu LM35 251wyj XMEGA 398

pod wietlenieCCFL 46OLED 46

Kup książkę Poleć książkę

Skorowidz 581

podwoacutejne buforowanie 255 332 457polecenia

kasowania strony 81konfiguracyjne pami ci 82kontrolera ST7565R 315odczytu bufora 82 89odczytu pami ci 81 88SDRAM 376transferu 91

polecenieACMD41 168cd 181CID 178CMD0 165CMD8 167CSD 178date 276dir 127 181dump 276erase 276get 276HD44780_CLR 51Init 178mkdir 181

po czenieDMA ze SPI 96dwoacutech komparatoroacutew 285koprocesora mp3 497LCD z mikrokontrolerem 48wyj cia XMEGA 411XMEGA z PC 121z telewizorem 431

pomiarnapi cia zasilania 239temperatury MCU 241

port IO 30 362pozycjonowanie grafik 345poacute obraz 410precyzja pomiaroacutew 260preskaler 478preskaler ADC 243program

Atmel Data Visualizer 275Audacity 443avr-objcopy 350dataloggera 265LCD Image Converter 323makeloadingtableexe 543Realterm 127 554riffstrip 483SoX 445Tracepoint 208

programowanie sygnatury u ytkownika 566protokoacute master-slave 157

prototypy 136proacutebki d wi kowe 447proacutebkowanie

8-bitowe 300nieliniowe 480

prymitywy graficzne 330przebieg PWM 468przebiegi 289 303przechwytywanie danych 276przemiatanie wej 253przerwanie 218 254 286 403

DMA 522komparatora 286

przestrze adresowa procesora 378przesy anie

danych 498polece 498

przetaktowanie procesora 436przetwornik

ADC 221analogowo-cyfrowy 221cykliczny 222potokowy 222

przyciski 272pseudooperatory 41pu apki breakpoints 197pu apki warunkowe 205punkty ledzenia 203PWM 461 462 472

RRAS Row Address Strobe 375redukcja poboru energii 242regulacja kontrastu 321rejestr 32 34rejestr AC 50

adresu wtyczki 513BASEADDR 377CID 169CMP 251CSD 172czasu utworu 512DATA 83EVCTRL 248formatu audio 512identyfikacyjny pami ci 87INTFLAGS 252kontroli basoacutew 510kontroli g o no ci 513MUXCTRL 227OCR 168PER 67poroacutewnania 249

Kup książkę Poleć książkę

582 AVR Uk ady peryferyjne

rejestr ACSCI_CLOCKF 511stanu komparatora 287stanu pami ci 86stanu uk adu 510trybu pracy 508WINCTRL 285

rejestrydost pu do pami ci RAM 513GPIOR 502IO procesora 36mikrokontrolera 25procesora 35specjalne 94specjalne karty 169uk adu VS1003B 508

relacja rodzic ndash dziecko 336reset uk adu 534rozdzielczo

LCD 329przetwornika 231PWM 463 477

rozszerzenie HiRes 477 479roacutewnanie Steinharta-Harta 263rysowanie map bitowych 343

Sschemat uk adu dataloggera 267SCI Serial Command Interface 498SCK 72SD Secure Digital 152SDI Serial Data Interface 498separator synchronizacji 422separowanie impulsoacutew synchronizacji 422shieldy 10skaler 422skaler napi cia 283skrypt makefile 353s owo kluczowe

asm 27extern 37static 68

specyfikatory lokalizacji zmiennej 213sps samples per second 12SS Slave Select 72standard PAL 410standard VGA 393sterowanie

dataloggerem 275sygna em 379

sterownik 121HD44780 49 56LCD 49 62

stos wywo a 209

strukturaFATFS 139Handle 118LCD_trans 60 63menu 338rejestru 86SimpleFSEntry 113 116SimpleFSHandle 113 118 140submenu 527systemu plikoacutew 112

sumabitowa 571kontrolna 178

sygnacomposite 409composite video output 430CS 377DREQ 497H-Sync 396synchronizacji 423V-Sync 396zegarowy CLK 374

sygna yinterfejsu EBI 363magistrali EBI 364steruj ce 375

sygnaturaprodukcyjna procesora 563u ytkownika 565

symbol__DELAY_ROUND_CLOSEST__ 17__DELAY_ROUND_DOWN__ 17_FS_FAT12 149_FS_FAT32 149_FS_MINIMIZE 133_FS_READONLY 133_FS_RPATH 135_FS_TINY 133_MAX_SS 135_MULTI_PARTITION 135_USE_DIR 149_USE_FASTSEEK 134_USE_FORWARD 134_USE_LABEL 134_USE_LFN 134_USE_LSEEK 149_USE_MKFS 134_USE_READ 149_USE_STRFUNC 134_USE_WRITE 149_VOLUMES 136F_CPU 14 15 18increment 36USE_BUSY_FLAG 50

Kup książkę Poleć książkę

Skorowidz 583

symboleglobalne 36w asemblerze 28zewn trzne 39

symulacja 198 209symulator 190synchronizacja

pami ci 331pionowa 395pozioma 394

systemplikoacutew 111 128przerwa 404zdarze 245

szablonfont_XMEGAtmpl 326image_XMEGAtmpl 343

szum 463szybko przesy ania danych 126

ledzenie wi zki 333rodowisko

graficzne 11programistyczne 11VSIDE 542WinAVR 47

Ttabela FAT 130tablica

framebuf 402 408plugintbl 552 555tekst 208z kodem wynikowym 543

taktowanieDAC 296mikrokontrolera 473

technologia OLED 44temperatura mikrokontrolera 239 241termistor 262 290

NTC 263PTC 263

termometrLM35 249 250z alarmem 251

termostat 290test uk adu VS1003B 503testowanie obrazu 319timer 16 62

TCC0 20

TCC1 399transakcja 59 62 65transakcje 17 103ndash107transakcyjna obs uga LCD 58transakcyjny dost p do SPI 95transfer 91

danych 97wynikoacutew 254

transmisja 72 83tryb

bez znaku 234ci g ej konwersji 252czterobitowy 153dwukana owy 301graficzny 416graficzny VGA 407idle 419jednobitowy 153LPC 371monochromatyczny 397 407oszcz dzania energii 94 306pracy multipleksera 226pracy SPI 157roacute nicowy 232single slope 312SPI 153tekstowy 413tekstowy VGA 397z pojedynczym wej ciem 234ze znakiem 235

trybygenerowania PWM 467pracy karty 153pracy przetwornika 231pracy SPI 74pracy uk adu 508

twierdzenie Nyquista 258tworzenie

adresu 84nak adek 417obrazu 335tablicy 543

typ__uint24 119karty 160niekompletny 60wyliczeniowy 114

typyoperandoacutew 29w AVR 34

Kup książkę Poleć książkę

584 AVR Uk ady peryferyjne

Uuchwyt handle 64 113uk ad

AD725 427 431buforowy 294CS 361DAC 284dataloggera 267detekcji awarii zasilania 559generuj cy obraz 393HiRes 477ICL7660 47LM35 250 251SampH 293sterowania sygna em 379USART 401VS1003B 496 503 508 530 538 556VS100XX 529wzmacniania sygna u 227

uk ady peryferyjne 9uruchomienie komparatora 287urz dzenie

master 72slave 72

u rednianie 259utrata danych 141u ycie wstawki asemblerowej 33

VVGA 393

Wwarto ci kalibracyjne

ADC 564oscylatoroacutew 564temperatury 564

warunkowa kompilacja 36WE Write Enable 375wej cie composite video input 425wektor przerwa 38 257wideo 391wielko pami ci 86 377w czenie DAC 299wska nik na struktur 27wska niki 32wstawki asemblerowe 24 33wtyczka 535 541 544

SineDTMF Generator 537VGA 396

wyboacuter cz stotliwo ci PWM 465 474wykorzystanie

DMA 254 518

EuroSCART 428PWM 461rejestroacutew 34

wyliczanie predyktora 489wy wietlacze

alfanumeryczne 43 45graficzne 43 309LCD 43OLED 46

wy wietlanielitera u 213map bitowych 344obrazu 333 346 406obrazu VGA 393

wywo ania zwrotne callbacks 98asynchroniczne 101synchroniczne 101

wyzwalanie konwersji 245wzmacniacz 446wzmacniacz operacyjny 279wzmacnianie sygna u 227

XXMEGA 9 18

Zzapis

bufora 269danych 176d wi ku 440 556

zasilaniekarty 154pami ci 109

zatrzask 368zatrzask 74HC573 433zatrza ni cie adresu 369zdarzenia 297zdarzenie compare match 399zegar 383 420 426zintegrowane rodowisko programistyczne 11z cze EuroSCART 425 428 429zmiana

g o no ci 527wielko ci strony 94

znaki 56

roacuted onapi cia odniesienia 284sygna u 240

Kup książkę Poleć książkę

Page 33: Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8 AVR. Ukäady peryferyjne Rejestry dost pu do pami ci RAM .....513 Rejestr adresu

68 AVR Uk ady peryferyjne

rzystano drugi timer (TCD1) w ktoacuterego funkcji obs ugi przerwania przepe nienia jestwy wietlany licznik tych przerwa

ISR(TCD1_OVF_vect) static char int_buf[sizeof(LCD_trans) + 7] static uint16_t cnt char bufstr[6]

utoa(cnt++ bufstr 10) while(strlen(bufstr)lt6) strcat(bufstr ) LCD_PutText_B(61 bufstr (LCD_trans)ampint_buf false)

Jak widzimy w sposoacuteb asynchroniczny z dwoacutech miejsc w programie mo emy uzy-ska dost p do LCD a ka da funkcja bdquoma wra enierdquo e ma LCD na wy czno Przy okazji warto przeanalizowa sposoacuteb w jaki jest rezerwowana pami na trans-akcj w przerwaniu Oczywi cie mo na by wykorzysta dynamiczn alokacj pami cilecz jak wspomniano taka alokacja jest czasoch onna St d te w pokazanym przy-k adzie wykorzystano tablic statyczn int_buf o rozmiarze umo liwiaj cym prze-chowanie kompletnej transakcji Dzi ki temu e zmienna int_buf jest zmienn statycz-n nie jest ona niszczona po zako czeniu funkcji obs ugi przerwania Gdyby pomins owo kluczowe static zmienna ta by aby niszczona a na LCD najprawdopodobniejzacz yby si pojawia przypadkowe tre ci Poniewa pami naszego bufora nie by aalokowana dynamicznie nie mo e ona zosta zwolniona w naszym sterowniku LCDst d te ostatni parametr wywo ania funkcji LCD_PutText_B musi mie warto false

OptymalizacjaPrzy okazji tego i poprzedniego przyk adu warto zastanowi si jeszcze nad jednkwesti mdash optymalizacji W podanych przyk adach wykorzystano wcze niej omoacute-wione funkcje dost pu do wy wietlacza LCD znajduj ce si w plikach hd44780ci hd44780h Wi kszo z zawartych tam funkcji nie jest wykorzystywana jednakkompilator mimo wszystko umieszcza ich kod w pliku wynikowym mdash dzieje si takponiewa nie mo e on bdquostwierdzi rdquo czy funkcje te nie s wykorzystywane w innychfragmentach programu Pami tajmy e kompilator kompiluje poszczegoacutelne pliki roacute-d owe osobno i dana jego instancja nie bdquowierdquo co znajduje si w innych plikach (innychjednostkach kompilacji) Tak ca o ciow wiedz ma dopiero konsolidator (linker)ktoacutery czy stworzone przez kompilator pliki obiektowe (o rozszerzeniu o) w plikwynikowy Linker jednak bdquonie wierdquo ktoacutera z funkcji programu zosta a u yta a ktoacuteranie mdash informacje te ma wy cznie kompilator W ten sposoacuteb powstaje typowe b dneko o w efekcie nasze nieu ywane funkcje nie s usuwane (linker zostawia je bdquonawszelki wypadekrdquo) i zajmuj niepotrzebnie pami Czy mo na temu jako zaradzi Oczywi cie tak W tym celu trzeba po czy si y kompilatora i linkera co zapewniaj od-powiednie opcje kompilacji We w a ciwo ciach projektu (ProjectProperties lub Alt+F7)wybieramy zak adk Toolchain a nast pnie AVRGNU C Compiler i OptimizationZnajdziemy tam pole wyboru o nazwie Prepare functions for garbage collection (ry-sunek 224)

Kup książkę Poleć książkę

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 69

Rysunek 224 Aby da linkerowi mo liwo usuwania nieu ywanych funkcji nale y skompilowaprogram z wybran opcj ndashffunction-sections ktoacutera spowoduje e ka da funkcja programu znajdzie siwe w asnej sekcji

Zaznaczenie tej funkcji spowoduje umieszczenie ka dej funkcji w osobnej sekcji mdashsamo w sobie nie wp ynie to na skroacutecenie kodu wynikowego ale jest warunkiem nie-zb dnym dla podj cia stosownych dzia a przez linker Aby wyeliminowa nieu y-wane funkcje nale y zaznaczy jeszcze w ga zi AVRGNU LinkerOptimization poleGarbage collect unused sections (rysunek 225)

Rysunek 225 Zaznaczenie opcji Garbage collect unused sections (-Wl--gc-sections) spowodujee nieu ywane funkcje zostan usuni te z kodu wynikowego w efekcie kod programu ulegnie skroacuteceniu

Po zaznaczeniu tych opcji program zostanie skroacutecony o kilkaset bajtoacutew Oczywi cieje li wszystkie funkcje by yby wykorzystane nie uzyskaliby my adnego skroacuteceniakodu Niemniej w sytuacji gdy u ywa si bibliotek zazwyczaj przynajmniej czfunkcji nie jest wykorzystywana warto wi c skorzysta z tej mo liwo ci optymalizacji

Kup książkę Poleć książkę

70 AVR Uk ady peryferyjne

Je li mamy do czynienia z prekompilowan bibliotek (lib) to musi ona by skom-pilowana z zaznaczon opcj Prepare functions for garbage collection (-ffunction-sections) Alternatyw jest umieszczenie ka dej funkcji biblioteki w osobnym pliku(tak jak w przypadku bibliotek AVR-libc)

Na ekranie wyboru opcji optymalizacji linkera mamy jeszcze jedn przydatn opcjmdash Relax Branches (-mrelax) Dla mikrokontroleroacutew ktoacutere maj ponad 8 kB pami ciFLASH instrukcje skokoacutew s generowane jako tzw instrukcje d ugie mdash umo liwiajone skok do komoacuterki pami ci FLASH o dowolnym adresie Jednak cen za to jestwyd u enie instrukcji mdash ich kod jest d u szy podobnie jak czas wykonania Nie zawszejednak takie d ugie instrukcje musz by wykonywane mdash je li miejsce docelowe skokule y blisko (w zasi gu instrukcji skokoacutew wzgl dnych) to mo na w kodzie wynikowymzamieni instrukcje d u sze na kroacutetsze co przynosi oszcz dno ci w postaci skroacuteceniakodu wynikowego Poniewa dopiero linker bdquowierdquo jak poszczegoacutelne fragmenty kodus rozmieszczone w pami ci takiej podmiany mo na dokona na etapie linkowaniaprogramu co zapewnia powy sza opcja St d te warto to pole wyboru zaznaczy

Kup książkę Poleć książkę

SkorowidzA

ABI Application Binary Interface 25AC Address Counter 50ADPCM 482adres

bazowy 377bufora 61komoacuterki 84pu apki 202

ALE Address Latch Enable 368alfanumeryczne wy wietlacze 43algorytm ADPCM 492algorytmy stratne 495animacje 57antyaliasing 325architektury procesoroacutew XMEGA 352asembler 23

dyrektywy 40funkcje j zyka C 41obs uga przerwa 39

asynchroniczne wywo anie funkcji 101Atmel Studio 15

Bbajty kalibracyjne 569biblioteka

FATFS 131 139 176 180 517libcallback-liba 99PetitFS 144 149

bitADC_CH0START_bm 236IMPMODE 244

bitrate 442 512blokowanie przerwa 219b d 16 19

kwantyzacji 463offsetu 230wzmocnienia ADC 230

BOD 223bps bits per second 12

budowakarty 152linii obrazu 394pami ci SDRAM 374pliku stymulacji 192ramki PAL 412sygna u PAL 411wtyczki 544 545

bufor 78FIFO 497na transakcje 61transakcji 62

buforowanie wyj cia 294

CCAS Column Address Strobe 375CCFL 44charakterystyka

przetwornikoacutew 222termistora 264tryboacutew pracy 232

CID Card Identification 169CKE Clock Enable 375CLKIN 421COG Chip on Glass 310CRC 158 178CRC16 178CRC7 164CS Chip Select 361 375CSD Card Specific Data 172czas

dost pu do SDRAM 424adowania kondensatora 244

propagacji 281proacutebkowania 260symulacji 209

czcionki 322cz stotliwo

odchylania pionowego 428proacutebkowania 244 441 444 530przebiegu 504

Kup książkę Poleć książkę

576 AVR Uk ady peryferyjne

cz stotliwoPWM 465taktowania koprocesora 549taktowania procesora 209taktowania rdzenia 18

czyszczenie pami ci 318

DDAC Digital to Analog Converter 293 447 451

buforowanie wyj cia 294generowanie przebiegoacutew 301jitter 303kalibracja 306napi cie referencyjne 295system zdarze 297taktowanie 296tryb dwukana owy 301wykorzystanie DMA 298wyzwalanie konwersji 305

datalogger 261 265 275DD Device Density 86debuger 183

programowy 190sprz towy 185 187

decymacja 259DEBUG 219XMEGA 260

definicja symboli globalnych 36definiowanie w asnych znakoacutew 56deklaracja zapowiadaj ca 103 337dekoder DTMF 548 556DMA 254 298 402 458 518 523dost p do

danych 358 359 568danych binarnych 356 360danych wielobajtowych 31DataFLASH 137EEPROM 128FAT 136komoacuterki 375LCD 59 62 66 68operandu 30pami ci 81 384 386 387 561pami ci SDRAM 424pliku blokowy 141portoacutew IO 30rejestroacutew IO procesora 36rejestroacutew uk adu 499SPI 95sygnatury u ytkownika 565 567wska nikoacutew 32

DQM Data Mask 375DSP Digital Signal Processor 535

DTMF 535 553dyktafon 529dynamiczna alokacja pami ci 516dyrektywa global 38dyrektywy asemblera 40dzia anie

DMA 255komparatora 280timeroacutew 400

d wi k 443

EEBI External Bus Interface 361EEPROM 207eliminacja jitteru 24emulacja RS232 139

FFAT File Allocation Table 128 131FAT32 128FATFS 180filtr

dolnoprzepustowy 491drugiego rz du 470pierwszego rz du 469trzeciego rz du 471

filtrowanie sygna u PWM 468firmware 565FLASH 207format

odpowiedzi 159polecenia 158protoko u 157

funkcja_delay_ms 17 219c_zero 42callback 106 341callback() 99DataFLASH_CSEnable 100DF_FinishBufWrite() 269disk_initialize 136disk_ioctl 181disk_status 136disk_write 138DMA_SPI_init 104DTMF_GetCode 553free_re 65GPIOR0_init 507hd44780_outcmd 51hd44780_outnibble_nowait 65LCD_defchar_P 57

Kup książkę Poleć książkę

Skorowidz 577

Menu_Click_Func 515Menu_Free 516Menu_Recorder 532Menu_Run 527MS_CreateRegEntry 117MS_GetDirPos 125MS_GetRegItem 115MS_WritePages 116 118OSC_wait_for_rdy 473RecMenu_StartStop 532sprintf 142strtok 124sysclk_init() 200 209TMF_memcpy_PF 454udi_cdc_getc() 123udi_cdc_is_rx_ready() 123VS1003_Reset 506

funkcjeanalizuj ce 556biblioteczne 50biblioteki FATFS 143j zyka C 41kontrolera ST7565R 313opoacute niaj ce 17opoacute nie 219reentrant 524specjalne kontrolera 319steruj ce 314zapisu 133

fusebit 557BODACT 560BODLEVEL 560BOOTRST 559DVSDON 560EESAVE 561JTAGEN 558RSTDISBL 559SUT 559TOSCSEL 559

fusebity w AVR-libc 571

Ggenerator obrazu composite 426generowanie

d wi ku 461kolorowego obrazu 437obrazu wideo 391przebiegoacutew 301przerwa 285sygna u composite 409

g bia koloru 326gniazdo

karty SD 156VGA 396

Hhistereza 281

IIDE 11IMA ADPCM 483informacje

o kolorze 431o obrazie 434

inicjalizacjakarty 161karty SDHC 167karty SDSC 167karty SDXC 167licznika 419pami ci 119USART 505

instrukcjaicall 42movw 35nop 13 24

interfejsSCI 498SDI 498SPI 71 79RS232 120UART 123USART 71 73

interpolacja 259interpolacja w XMEGA 260inwersja obrazu 319

Jjednostki 12jitter 24 303 420

Kkalibracja

ADC 229DAC 306 564offsetu 237

kana DMA 82 522karta 154 158

mikroSD 152SD 151 152SDHC 151 152 160SDSC 160SDXC 151 160

Kup książkę Poleć książkę

578 AVR Uk ady peryferyjne

karty pami ci 151 152 157biblioteka FATFS 180budowa 152format polecenia 158inicjalizacja 161 167komunikacja 156odczyt danych 173opcje konfiguracyjne 181rejestry specjalne 169tryby pracy 153zapis danych 176zasilanie 154

kodasemblerowy 23 24C 23dost pu 24

kodowanieμ-law 481ADPCM 483Dialogic ADPCM 494informacji 166 426koloru 425znakoacutew 536

kodyformatoacutew audio 501zdarze 545

kolejno bajtoacutew 533kolor 424 430kolorowy obraz 437komparator 422

analogowy 279 280analogowy XMEGA 282okienkowy 284

kompilacja plikoacutew binarnych 350kompilator avr-gcc 11 359kompresja

ADPCM 482 486d wi ku 480IMA ADPCM 482

komunikacja z koprocesorem 504konfiguracja

4-portowa 364biblioteki 133debugera 185DMA 459 522fusebitoacutew 570kontrolera DMA 257 452komparatoroacutew 285lockbitoacutew 570LPC 371pami ci SDRAM 381PetitFS 149pinu IO 225portoacutew IO 362

preskalera 452projektu 186przerwa 219pu apki 203rejestru EVCTRL 248rejestru PER 67SPI 75sygna u CS 377typu czcionki 324urz dze IO 189USART 76zegara 383

konsolidacja 547kontroler

DMA 254 298 402 458 518 523KS108 310ST7565R 310ndash315 321

konwersjaDAC 305sygna oacutew 396wyzwalana 306

konwertercyfrowo-analogowy 426DAC 427

koprocesormp3 496VS1003B 10

korekcja fazy 466kwantyzacja 463

Llampa CCFL 44LE Latch Enable 433licznik 419

cykli 209TCC1 400timera 20

linie IO 50linie sygna owe

MISO 72 164MOSI 72SCK 72SS 72

linker 69lista

mnemonikoacutew 24modyfikowanych rejestroacutew 32

lockbity 557 561lockbity w AVR-libc 570LPC Low Pin Count 371LPCM 443 556LSB Least Significant Bit 228

Kup książkę Poleć książkę

Skorowidz 579

a cuchy formatuj ce 212czenie plikoacutew 352

Mmagistrala pami ci zewn trznej 361magnetofon cyfrowy 528makro _SFR_IO_ADDR() 39makrodefinicja

ASSERT 214HD44780_CGADDR() 53HD44780_CLR 53HD44780_DDADDR() 53HD44780_DISPCTL() 52HD44780_ENTMODE() 52HD44780_FNSET() 52HD44780_HOME 53HD44780_SHIFT() 51LOCKBITS 571

mapowanie sygna oacutew 366mapy bitowe 343marker czasowy 268maski bitowe 329matryce 49menu 335menu piktogramowe 342mierniki temperatury 262mikrokontroler

ARM 9AVR 9PIC 9XMEGA128A3U 10

MISO 72moc wydzielana 265model psychoakustyczny 495modu

alfanumeryczny 45NVM 568Xmega eXploreGO 10Xplained ATXMEGA A3BU 10Xplained ATXMEGA-A1 10Xplained XMEGA128A1 447Xplained XMEGA256A3 94Xplained XMEGA256A3BU 97 143 266

modyfikator 30const 85volatile 28 273

monitory CRT 395monochromatyczne wy wietlacze graficzne 309monochromatyczny

tryb graficzny 416tryb tekstowy 413

MOSI 72mp3 495Msps Megasamples per second 12multiplekser wej ciowy 226 283multipleksowanie adresoacutew 368 369muzyka 439

Nnadawanie kodoacutew DTMF 540nadproacutebkowanie 258nag oacutewek kontenera wav 500nagrywanie mowy 486najmniej znacz cy bit 228napi cie

offsetu 280referencyjne 223 295zasilania 239

Oobracanie obrazu 319obraz 319

composite 426kolorowy 430wideo 391

obroacutebka d wi ku 443 445obs uga

FAT 131 143klawiatury matrycowej 24LCD 58 63 67menu 337przerwania 37 38 458przerwania DMA 525przerwa w asemblerze 39przyciskoacutew 272wy wietlaczy alfanumerycznych 45

odczytblokowy 140danych 173 358

odpowied response 159R1 159R2 159R7 160

od wie anie pami ci 376odtwarzanie

d wi ku 472muzyki 447 513 518 521

offset 238offset ADC 230okno

Breakpoints 202Call stack 209dezasemblera 210

Kup książkę Poleć książkę

580 AVR Uk ady peryferyjne

oknoIO View 207podgl du zmiennych 211wyboru czcionek 324

OLED 46opcje

kompilatora 35zapisu d wi ku 445

operacjena buforach 91odczytu 173zapisu 176zapisu strony 92

operand 29operator

ascii 41

asciz 41

byte 41

section 41opoacute nienia 13 18opoacute nienie zmienne 16optymalizacja 16 68optymalizator 26organizacja pami ci 77organizacja pami ci VRAM 316oscylator 287OSD On-Screen Display 417ostrze enie 16oszcz dzanie energii 94

Ppakiet WinAVR 48pami

CGRAM 56 57 64DataFLASH 10 77 81 113 269DDRAM 49EEPROM 111FLASH 54 124 207RAM 49SDRAM 372SRAM 63 124 329 366 371VRAM 314 317

PCLK 421PCM 443PetitFS 144 149p tla

for 13while 201

pierwsza linia obrazu 321piksel 430piktogram 342pin IO 225

plikAlloc_safeh 65DataFLASHc 83DataFLASHIOc 136definesh 50delayh 14diskioh 132 136ffh 132ffconfh 132 181hd44780h 49integerh 132ioh 30LCD_transc 61LCD-transactc 66Makefile 14Menuc 19nothingo 541outfiletxt 547 551pffh 149SPIh 104stringh 113stymulacji 191 192

pliki mp3 495elf 351fon 323o 24S 24 34binarne 350 355csv 276d wi kowe 440obiektowe 352wav 500WMA 512z czcionkami 327z danymi 349

podbijacz napi cia 315podgl d

pami ci 207stosu wywo a 209zmiennych 211znakoacutew 325

pod czeniefototranzystora 262karty SD 155LCD z kontrolerem 311modu u 50pami ci 362 369 370 373termistora 262uk adu LM35 251wyj XMEGA 398

pod wietlenieCCFL 46OLED 46

Kup książkę Poleć książkę

Skorowidz 581

podwoacutejne buforowanie 255 332 457polecenia

kasowania strony 81konfiguracyjne pami ci 82kontrolera ST7565R 315odczytu bufora 82 89odczytu pami ci 81 88SDRAM 376transferu 91

polecenieACMD41 168cd 181CID 178CMD0 165CMD8 167CSD 178date 276dir 127 181dump 276erase 276get 276HD44780_CLR 51Init 178mkdir 181

po czenieDMA ze SPI 96dwoacutech komparatoroacutew 285koprocesora mp3 497LCD z mikrokontrolerem 48wyj cia XMEGA 411XMEGA z PC 121z telewizorem 431

pomiarnapi cia zasilania 239temperatury MCU 241

port IO 30 362pozycjonowanie grafik 345poacute obraz 410precyzja pomiaroacutew 260preskaler 478preskaler ADC 243program

Atmel Data Visualizer 275Audacity 443avr-objcopy 350dataloggera 265LCD Image Converter 323makeloadingtableexe 543Realterm 127 554riffstrip 483SoX 445Tracepoint 208

programowanie sygnatury u ytkownika 566protokoacute master-slave 157

prototypy 136proacutebki d wi kowe 447proacutebkowanie

8-bitowe 300nieliniowe 480

prymitywy graficzne 330przebieg PWM 468przebiegi 289 303przechwytywanie danych 276przemiatanie wej 253przerwanie 218 254 286 403

DMA 522komparatora 286

przestrze adresowa procesora 378przesy anie

danych 498polece 498

przetaktowanie procesora 436przetwornik

ADC 221analogowo-cyfrowy 221cykliczny 222potokowy 222

przyciski 272pseudooperatory 41pu apki breakpoints 197pu apki warunkowe 205punkty ledzenia 203PWM 461 462 472

RRAS Row Address Strobe 375redukcja poboru energii 242regulacja kontrastu 321rejestr 32 34rejestr AC 50

adresu wtyczki 513BASEADDR 377CID 169CMP 251CSD 172czasu utworu 512DATA 83EVCTRL 248formatu audio 512identyfikacyjny pami ci 87INTFLAGS 252kontroli basoacutew 510kontroli g o no ci 513MUXCTRL 227OCR 168PER 67poroacutewnania 249

Kup książkę Poleć książkę

582 AVR Uk ady peryferyjne

rejestr ACSCI_CLOCKF 511stanu komparatora 287stanu pami ci 86stanu uk adu 510trybu pracy 508WINCTRL 285

rejestrydost pu do pami ci RAM 513GPIOR 502IO procesora 36mikrokontrolera 25procesora 35specjalne 94specjalne karty 169uk adu VS1003B 508

relacja rodzic ndash dziecko 336reset uk adu 534rozdzielczo

LCD 329przetwornika 231PWM 463 477

rozszerzenie HiRes 477 479roacutewnanie Steinharta-Harta 263rysowanie map bitowych 343

Sschemat uk adu dataloggera 267SCI Serial Command Interface 498SCK 72SD Secure Digital 152SDI Serial Data Interface 498separator synchronizacji 422separowanie impulsoacutew synchronizacji 422shieldy 10skaler 422skaler napi cia 283skrypt makefile 353s owo kluczowe

asm 27extern 37static 68

specyfikatory lokalizacji zmiennej 213sps samples per second 12SS Slave Select 72standard PAL 410standard VGA 393sterowanie

dataloggerem 275sygna em 379

sterownik 121HD44780 49 56LCD 49 62

stos wywo a 209

strukturaFATFS 139Handle 118LCD_trans 60 63menu 338rejestru 86SimpleFSEntry 113 116SimpleFSHandle 113 118 140submenu 527systemu plikoacutew 112

sumabitowa 571kontrolna 178

sygnacomposite 409composite video output 430CS 377DREQ 497H-Sync 396synchronizacji 423V-Sync 396zegarowy CLK 374

sygna yinterfejsu EBI 363magistrali EBI 364steruj ce 375

sygnaturaprodukcyjna procesora 563u ytkownika 565

symbol__DELAY_ROUND_CLOSEST__ 17__DELAY_ROUND_DOWN__ 17_FS_FAT12 149_FS_FAT32 149_FS_MINIMIZE 133_FS_READONLY 133_FS_RPATH 135_FS_TINY 133_MAX_SS 135_MULTI_PARTITION 135_USE_DIR 149_USE_FASTSEEK 134_USE_FORWARD 134_USE_LABEL 134_USE_LFN 134_USE_LSEEK 149_USE_MKFS 134_USE_READ 149_USE_STRFUNC 134_USE_WRITE 149_VOLUMES 136F_CPU 14 15 18increment 36USE_BUSY_FLAG 50

Kup książkę Poleć książkę

Skorowidz 583

symboleglobalne 36w asemblerze 28zewn trzne 39

symulacja 198 209symulator 190synchronizacja

pami ci 331pionowa 395pozioma 394

systemplikoacutew 111 128przerwa 404zdarze 245

szablonfont_XMEGAtmpl 326image_XMEGAtmpl 343

szum 463szybko przesy ania danych 126

ledzenie wi zki 333rodowisko

graficzne 11programistyczne 11VSIDE 542WinAVR 47

Ttabela FAT 130tablica

framebuf 402 408plugintbl 552 555tekst 208z kodem wynikowym 543

taktowanieDAC 296mikrokontrolera 473

technologia OLED 44temperatura mikrokontrolera 239 241termistor 262 290

NTC 263PTC 263

termometrLM35 249 250z alarmem 251

termostat 290test uk adu VS1003B 503testowanie obrazu 319timer 16 62

TCC0 20

TCC1 399transakcja 59 62 65transakcje 17 103ndash107transakcyjna obs uga LCD 58transakcyjny dost p do SPI 95transfer 91

danych 97wynikoacutew 254

transmisja 72 83tryb

bez znaku 234ci g ej konwersji 252czterobitowy 153dwukana owy 301graficzny 416graficzny VGA 407idle 419jednobitowy 153LPC 371monochromatyczny 397 407oszcz dzania energii 94 306pracy multipleksera 226pracy SPI 157roacute nicowy 232single slope 312SPI 153tekstowy 413tekstowy VGA 397z pojedynczym wej ciem 234ze znakiem 235

trybygenerowania PWM 467pracy karty 153pracy przetwornika 231pracy SPI 74pracy uk adu 508

twierdzenie Nyquista 258tworzenie

adresu 84nak adek 417obrazu 335tablicy 543

typ__uint24 119karty 160niekompletny 60wyliczeniowy 114

typyoperandoacutew 29w AVR 34

Kup książkę Poleć książkę

584 AVR Uk ady peryferyjne

Uuchwyt handle 64 113uk ad

AD725 427 431buforowy 294CS 361DAC 284dataloggera 267detekcji awarii zasilania 559generuj cy obraz 393HiRes 477ICL7660 47LM35 250 251SampH 293sterowania sygna em 379USART 401VS1003B 496 503 508 530 538 556VS100XX 529wzmacniania sygna u 227

uk ady peryferyjne 9uruchomienie komparatora 287urz dzenie

master 72slave 72

u rednianie 259utrata danych 141u ycie wstawki asemblerowej 33

VVGA 393

Wwarto ci kalibracyjne

ADC 564oscylatoroacutew 564temperatury 564

warunkowa kompilacja 36WE Write Enable 375wej cie composite video input 425wektor przerwa 38 257wideo 391wielko pami ci 86 377w czenie DAC 299wska nik na struktur 27wska niki 32wstawki asemblerowe 24 33wtyczka 535 541 544

SineDTMF Generator 537VGA 396

wyboacuter cz stotliwo ci PWM 465 474wykorzystanie

DMA 254 518

EuroSCART 428PWM 461rejestroacutew 34

wyliczanie predyktora 489wy wietlacze

alfanumeryczne 43 45graficzne 43 309LCD 43OLED 46

wy wietlanielitera u 213map bitowych 344obrazu 333 346 406obrazu VGA 393

wywo ania zwrotne callbacks 98asynchroniczne 101synchroniczne 101

wyzwalanie konwersji 245wzmacniacz 446wzmacniacz operacyjny 279wzmacnianie sygna u 227

XXMEGA 9 18

Zzapis

bufora 269danych 176d wi ku 440 556

zasilaniekarty 154pami ci 109

zatrzask 368zatrzask 74HC573 433zatrza ni cie adresu 369zdarzenia 297zdarzenie compare match 399zegar 383 420 426zintegrowane rodowisko programistyczne 11z cze EuroSCART 425 428 429zmiana

g o no ci 527wielko ci strony 94

znaki 56

roacuted onapi cia odniesienia 284sygna u 240

Kup książkę Poleć książkę

Page 34: Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8 AVR. Ukäady peryferyjne Rejestry dost pu do pami ci RAM .....513 Rejestr adresu

Rozdzia 22 Wy wietlacze LCD alfanumeryczne 69

Rysunek 224 Aby da linkerowi mo liwo usuwania nieu ywanych funkcji nale y skompilowaprogram z wybran opcj ndashffunction-sections ktoacutera spowoduje e ka da funkcja programu znajdzie siwe w asnej sekcji

Zaznaczenie tej funkcji spowoduje umieszczenie ka dej funkcji w osobnej sekcji mdashsamo w sobie nie wp ynie to na skroacutecenie kodu wynikowego ale jest warunkiem nie-zb dnym dla podj cia stosownych dzia a przez linker Aby wyeliminowa nieu y-wane funkcje nale y zaznaczy jeszcze w ga zi AVRGNU LinkerOptimization poleGarbage collect unused sections (rysunek 225)

Rysunek 225 Zaznaczenie opcji Garbage collect unused sections (-Wl--gc-sections) spowodujee nieu ywane funkcje zostan usuni te z kodu wynikowego w efekcie kod programu ulegnie skroacuteceniu

Po zaznaczeniu tych opcji program zostanie skroacutecony o kilkaset bajtoacutew Oczywi cieje li wszystkie funkcje by yby wykorzystane nie uzyskaliby my adnego skroacuteceniakodu Niemniej w sytuacji gdy u ywa si bibliotek zazwyczaj przynajmniej czfunkcji nie jest wykorzystywana warto wi c skorzysta z tej mo liwo ci optymalizacji

Kup książkę Poleć książkę

70 AVR Uk ady peryferyjne

Je li mamy do czynienia z prekompilowan bibliotek (lib) to musi ona by skom-pilowana z zaznaczon opcj Prepare functions for garbage collection (-ffunction-sections) Alternatyw jest umieszczenie ka dej funkcji biblioteki w osobnym pliku(tak jak w przypadku bibliotek AVR-libc)

Na ekranie wyboru opcji optymalizacji linkera mamy jeszcze jedn przydatn opcjmdash Relax Branches (-mrelax) Dla mikrokontroleroacutew ktoacutere maj ponad 8 kB pami ciFLASH instrukcje skokoacutew s generowane jako tzw instrukcje d ugie mdash umo liwiajone skok do komoacuterki pami ci FLASH o dowolnym adresie Jednak cen za to jestwyd u enie instrukcji mdash ich kod jest d u szy podobnie jak czas wykonania Nie zawszejednak takie d ugie instrukcje musz by wykonywane mdash je li miejsce docelowe skokule y blisko (w zasi gu instrukcji skokoacutew wzgl dnych) to mo na w kodzie wynikowymzamieni instrukcje d u sze na kroacutetsze co przynosi oszcz dno ci w postaci skroacuteceniakodu wynikowego Poniewa dopiero linker bdquowierdquo jak poszczegoacutelne fragmenty kodus rozmieszczone w pami ci takiej podmiany mo na dokona na etapie linkowaniaprogramu co zapewnia powy sza opcja St d te warto to pole wyboru zaznaczy

Kup książkę Poleć książkę

SkorowidzA

ABI Application Binary Interface 25AC Address Counter 50ADPCM 482adres

bazowy 377bufora 61komoacuterki 84pu apki 202

ALE Address Latch Enable 368alfanumeryczne wy wietlacze 43algorytm ADPCM 492algorytmy stratne 495animacje 57antyaliasing 325architektury procesoroacutew XMEGA 352asembler 23

dyrektywy 40funkcje j zyka C 41obs uga przerwa 39

asynchroniczne wywo anie funkcji 101Atmel Studio 15

Bbajty kalibracyjne 569biblioteka

FATFS 131 139 176 180 517libcallback-liba 99PetitFS 144 149

bitADC_CH0START_bm 236IMPMODE 244

bitrate 442 512blokowanie przerwa 219b d 16 19

kwantyzacji 463offsetu 230wzmocnienia ADC 230

BOD 223bps bits per second 12

budowakarty 152linii obrazu 394pami ci SDRAM 374pliku stymulacji 192ramki PAL 412sygna u PAL 411wtyczki 544 545

bufor 78FIFO 497na transakcje 61transakcji 62

buforowanie wyj cia 294

CCAS Column Address Strobe 375CCFL 44charakterystyka

przetwornikoacutew 222termistora 264tryboacutew pracy 232

CID Card Identification 169CKE Clock Enable 375CLKIN 421COG Chip on Glass 310CRC 158 178CRC16 178CRC7 164CS Chip Select 361 375CSD Card Specific Data 172czas

dost pu do SDRAM 424adowania kondensatora 244

propagacji 281proacutebkowania 260symulacji 209

czcionki 322cz stotliwo

odchylania pionowego 428proacutebkowania 244 441 444 530przebiegu 504

Kup książkę Poleć książkę

576 AVR Uk ady peryferyjne

cz stotliwoPWM 465taktowania koprocesora 549taktowania procesora 209taktowania rdzenia 18

czyszczenie pami ci 318

DDAC Digital to Analog Converter 293 447 451

buforowanie wyj cia 294generowanie przebiegoacutew 301jitter 303kalibracja 306napi cie referencyjne 295system zdarze 297taktowanie 296tryb dwukana owy 301wykorzystanie DMA 298wyzwalanie konwersji 305

datalogger 261 265 275DD Device Density 86debuger 183

programowy 190sprz towy 185 187

decymacja 259DEBUG 219XMEGA 260

definicja symboli globalnych 36definiowanie w asnych znakoacutew 56deklaracja zapowiadaj ca 103 337dekoder DTMF 548 556DMA 254 298 402 458 518 523dost p do

danych 358 359 568danych binarnych 356 360danych wielobajtowych 31DataFLASH 137EEPROM 128FAT 136komoacuterki 375LCD 59 62 66 68operandu 30pami ci 81 384 386 387 561pami ci SDRAM 424pliku blokowy 141portoacutew IO 30rejestroacutew IO procesora 36rejestroacutew uk adu 499SPI 95sygnatury u ytkownika 565 567wska nikoacutew 32

DQM Data Mask 375DSP Digital Signal Processor 535

DTMF 535 553dyktafon 529dynamiczna alokacja pami ci 516dyrektywa global 38dyrektywy asemblera 40dzia anie

DMA 255komparatora 280timeroacutew 400

d wi k 443

EEBI External Bus Interface 361EEPROM 207eliminacja jitteru 24emulacja RS232 139

FFAT File Allocation Table 128 131FAT32 128FATFS 180filtr

dolnoprzepustowy 491drugiego rz du 470pierwszego rz du 469trzeciego rz du 471

filtrowanie sygna u PWM 468firmware 565FLASH 207format

odpowiedzi 159polecenia 158protoko u 157

funkcja_delay_ms 17 219c_zero 42callback 106 341callback() 99DataFLASH_CSEnable 100DF_FinishBufWrite() 269disk_initialize 136disk_ioctl 181disk_status 136disk_write 138DMA_SPI_init 104DTMF_GetCode 553free_re 65GPIOR0_init 507hd44780_outcmd 51hd44780_outnibble_nowait 65LCD_defchar_P 57

Kup książkę Poleć książkę

Skorowidz 577

Menu_Click_Func 515Menu_Free 516Menu_Recorder 532Menu_Run 527MS_CreateRegEntry 117MS_GetDirPos 125MS_GetRegItem 115MS_WritePages 116 118OSC_wait_for_rdy 473RecMenu_StartStop 532sprintf 142strtok 124sysclk_init() 200 209TMF_memcpy_PF 454udi_cdc_getc() 123udi_cdc_is_rx_ready() 123VS1003_Reset 506

funkcjeanalizuj ce 556biblioteczne 50biblioteki FATFS 143j zyka C 41kontrolera ST7565R 313opoacute niaj ce 17opoacute nie 219reentrant 524specjalne kontrolera 319steruj ce 314zapisu 133

fusebit 557BODACT 560BODLEVEL 560BOOTRST 559DVSDON 560EESAVE 561JTAGEN 558RSTDISBL 559SUT 559TOSCSEL 559

fusebity w AVR-libc 571

Ggenerator obrazu composite 426generowanie

d wi ku 461kolorowego obrazu 437obrazu wideo 391przebiegoacutew 301przerwa 285sygna u composite 409

g bia koloru 326gniazdo

karty SD 156VGA 396

Hhistereza 281

IIDE 11IMA ADPCM 483informacje

o kolorze 431o obrazie 434

inicjalizacjakarty 161karty SDHC 167karty SDSC 167karty SDXC 167licznika 419pami ci 119USART 505

instrukcjaicall 42movw 35nop 13 24

interfejsSCI 498SDI 498SPI 71 79RS232 120UART 123USART 71 73

interpolacja 259interpolacja w XMEGA 260inwersja obrazu 319

Jjednostki 12jitter 24 303 420

Kkalibracja

ADC 229DAC 306 564offsetu 237

kana DMA 82 522karta 154 158

mikroSD 152SD 151 152SDHC 151 152 160SDSC 160SDXC 151 160

Kup książkę Poleć książkę

578 AVR Uk ady peryferyjne

karty pami ci 151 152 157biblioteka FATFS 180budowa 152format polecenia 158inicjalizacja 161 167komunikacja 156odczyt danych 173opcje konfiguracyjne 181rejestry specjalne 169tryby pracy 153zapis danych 176zasilanie 154

kodasemblerowy 23 24C 23dost pu 24

kodowanieμ-law 481ADPCM 483Dialogic ADPCM 494informacji 166 426koloru 425znakoacutew 536

kodyformatoacutew audio 501zdarze 545

kolejno bajtoacutew 533kolor 424 430kolorowy obraz 437komparator 422

analogowy 279 280analogowy XMEGA 282okienkowy 284

kompilacja plikoacutew binarnych 350kompilator avr-gcc 11 359kompresja

ADPCM 482 486d wi ku 480IMA ADPCM 482

komunikacja z koprocesorem 504konfiguracja

4-portowa 364biblioteki 133debugera 185DMA 459 522fusebitoacutew 570kontrolera DMA 257 452komparatoroacutew 285lockbitoacutew 570LPC 371pami ci SDRAM 381PetitFS 149pinu IO 225portoacutew IO 362

preskalera 452projektu 186przerwa 219pu apki 203rejestru EVCTRL 248rejestru PER 67SPI 75sygna u CS 377typu czcionki 324urz dze IO 189USART 76zegara 383

konsolidacja 547kontroler

DMA 254 298 402 458 518 523KS108 310ST7565R 310ndash315 321

konwersjaDAC 305sygna oacutew 396wyzwalana 306

konwertercyfrowo-analogowy 426DAC 427

koprocesormp3 496VS1003B 10

korekcja fazy 466kwantyzacja 463

Llampa CCFL 44LE Latch Enable 433licznik 419

cykli 209TCC1 400timera 20

linie IO 50linie sygna owe

MISO 72 164MOSI 72SCK 72SS 72

linker 69lista

mnemonikoacutew 24modyfikowanych rejestroacutew 32

lockbity 557 561lockbity w AVR-libc 570LPC Low Pin Count 371LPCM 443 556LSB Least Significant Bit 228

Kup książkę Poleć książkę

Skorowidz 579

a cuchy formatuj ce 212czenie plikoacutew 352

Mmagistrala pami ci zewn trznej 361magnetofon cyfrowy 528makro _SFR_IO_ADDR() 39makrodefinicja

ASSERT 214HD44780_CGADDR() 53HD44780_CLR 53HD44780_DDADDR() 53HD44780_DISPCTL() 52HD44780_ENTMODE() 52HD44780_FNSET() 52HD44780_HOME 53HD44780_SHIFT() 51LOCKBITS 571

mapowanie sygna oacutew 366mapy bitowe 343marker czasowy 268maski bitowe 329matryce 49menu 335menu piktogramowe 342mierniki temperatury 262mikrokontroler

ARM 9AVR 9PIC 9XMEGA128A3U 10

MISO 72moc wydzielana 265model psychoakustyczny 495modu

alfanumeryczny 45NVM 568Xmega eXploreGO 10Xplained ATXMEGA A3BU 10Xplained ATXMEGA-A1 10Xplained XMEGA128A1 447Xplained XMEGA256A3 94Xplained XMEGA256A3BU 97 143 266

modyfikator 30const 85volatile 28 273

monitory CRT 395monochromatyczne wy wietlacze graficzne 309monochromatyczny

tryb graficzny 416tryb tekstowy 413

MOSI 72mp3 495Msps Megasamples per second 12multiplekser wej ciowy 226 283multipleksowanie adresoacutew 368 369muzyka 439

Nnadawanie kodoacutew DTMF 540nadproacutebkowanie 258nag oacutewek kontenera wav 500nagrywanie mowy 486najmniej znacz cy bit 228napi cie

offsetu 280referencyjne 223 295zasilania 239

Oobracanie obrazu 319obraz 319

composite 426kolorowy 430wideo 391

obroacutebka d wi ku 443 445obs uga

FAT 131 143klawiatury matrycowej 24LCD 58 63 67menu 337przerwania 37 38 458przerwania DMA 525przerwa w asemblerze 39przyciskoacutew 272wy wietlaczy alfanumerycznych 45

odczytblokowy 140danych 173 358

odpowied response 159R1 159R2 159R7 160

od wie anie pami ci 376odtwarzanie

d wi ku 472muzyki 447 513 518 521

offset 238offset ADC 230okno

Breakpoints 202Call stack 209dezasemblera 210

Kup książkę Poleć książkę

580 AVR Uk ady peryferyjne

oknoIO View 207podgl du zmiennych 211wyboru czcionek 324

OLED 46opcje

kompilatora 35zapisu d wi ku 445

operacjena buforach 91odczytu 173zapisu 176zapisu strony 92

operand 29operator

ascii 41

asciz 41

byte 41

section 41opoacute nienia 13 18opoacute nienie zmienne 16optymalizacja 16 68optymalizator 26organizacja pami ci 77organizacja pami ci VRAM 316oscylator 287OSD On-Screen Display 417ostrze enie 16oszcz dzanie energii 94

Ppakiet WinAVR 48pami

CGRAM 56 57 64DataFLASH 10 77 81 113 269DDRAM 49EEPROM 111FLASH 54 124 207RAM 49SDRAM 372SRAM 63 124 329 366 371VRAM 314 317

PCLK 421PCM 443PetitFS 144 149p tla

for 13while 201

pierwsza linia obrazu 321piksel 430piktogram 342pin IO 225

plikAlloc_safeh 65DataFLASHc 83DataFLASHIOc 136definesh 50delayh 14diskioh 132 136ffh 132ffconfh 132 181hd44780h 49integerh 132ioh 30LCD_transc 61LCD-transactc 66Makefile 14Menuc 19nothingo 541outfiletxt 547 551pffh 149SPIh 104stringh 113stymulacji 191 192

pliki mp3 495elf 351fon 323o 24S 24 34binarne 350 355csv 276d wi kowe 440obiektowe 352wav 500WMA 512z czcionkami 327z danymi 349

podbijacz napi cia 315podgl d

pami ci 207stosu wywo a 209zmiennych 211znakoacutew 325

pod czeniefototranzystora 262karty SD 155LCD z kontrolerem 311modu u 50pami ci 362 369 370 373termistora 262uk adu LM35 251wyj XMEGA 398

pod wietlenieCCFL 46OLED 46

Kup książkę Poleć książkę

Skorowidz 581

podwoacutejne buforowanie 255 332 457polecenia

kasowania strony 81konfiguracyjne pami ci 82kontrolera ST7565R 315odczytu bufora 82 89odczytu pami ci 81 88SDRAM 376transferu 91

polecenieACMD41 168cd 181CID 178CMD0 165CMD8 167CSD 178date 276dir 127 181dump 276erase 276get 276HD44780_CLR 51Init 178mkdir 181

po czenieDMA ze SPI 96dwoacutech komparatoroacutew 285koprocesora mp3 497LCD z mikrokontrolerem 48wyj cia XMEGA 411XMEGA z PC 121z telewizorem 431

pomiarnapi cia zasilania 239temperatury MCU 241

port IO 30 362pozycjonowanie grafik 345poacute obraz 410precyzja pomiaroacutew 260preskaler 478preskaler ADC 243program

Atmel Data Visualizer 275Audacity 443avr-objcopy 350dataloggera 265LCD Image Converter 323makeloadingtableexe 543Realterm 127 554riffstrip 483SoX 445Tracepoint 208

programowanie sygnatury u ytkownika 566protokoacute master-slave 157

prototypy 136proacutebki d wi kowe 447proacutebkowanie

8-bitowe 300nieliniowe 480

prymitywy graficzne 330przebieg PWM 468przebiegi 289 303przechwytywanie danych 276przemiatanie wej 253przerwanie 218 254 286 403

DMA 522komparatora 286

przestrze adresowa procesora 378przesy anie

danych 498polece 498

przetaktowanie procesora 436przetwornik

ADC 221analogowo-cyfrowy 221cykliczny 222potokowy 222

przyciski 272pseudooperatory 41pu apki breakpoints 197pu apki warunkowe 205punkty ledzenia 203PWM 461 462 472

RRAS Row Address Strobe 375redukcja poboru energii 242regulacja kontrastu 321rejestr 32 34rejestr AC 50

adresu wtyczki 513BASEADDR 377CID 169CMP 251CSD 172czasu utworu 512DATA 83EVCTRL 248formatu audio 512identyfikacyjny pami ci 87INTFLAGS 252kontroli basoacutew 510kontroli g o no ci 513MUXCTRL 227OCR 168PER 67poroacutewnania 249

Kup książkę Poleć książkę

582 AVR Uk ady peryferyjne

rejestr ACSCI_CLOCKF 511stanu komparatora 287stanu pami ci 86stanu uk adu 510trybu pracy 508WINCTRL 285

rejestrydost pu do pami ci RAM 513GPIOR 502IO procesora 36mikrokontrolera 25procesora 35specjalne 94specjalne karty 169uk adu VS1003B 508

relacja rodzic ndash dziecko 336reset uk adu 534rozdzielczo

LCD 329przetwornika 231PWM 463 477

rozszerzenie HiRes 477 479roacutewnanie Steinharta-Harta 263rysowanie map bitowych 343

Sschemat uk adu dataloggera 267SCI Serial Command Interface 498SCK 72SD Secure Digital 152SDI Serial Data Interface 498separator synchronizacji 422separowanie impulsoacutew synchronizacji 422shieldy 10skaler 422skaler napi cia 283skrypt makefile 353s owo kluczowe

asm 27extern 37static 68

specyfikatory lokalizacji zmiennej 213sps samples per second 12SS Slave Select 72standard PAL 410standard VGA 393sterowanie

dataloggerem 275sygna em 379

sterownik 121HD44780 49 56LCD 49 62

stos wywo a 209

strukturaFATFS 139Handle 118LCD_trans 60 63menu 338rejestru 86SimpleFSEntry 113 116SimpleFSHandle 113 118 140submenu 527systemu plikoacutew 112

sumabitowa 571kontrolna 178

sygnacomposite 409composite video output 430CS 377DREQ 497H-Sync 396synchronizacji 423V-Sync 396zegarowy CLK 374

sygna yinterfejsu EBI 363magistrali EBI 364steruj ce 375

sygnaturaprodukcyjna procesora 563u ytkownika 565

symbol__DELAY_ROUND_CLOSEST__ 17__DELAY_ROUND_DOWN__ 17_FS_FAT12 149_FS_FAT32 149_FS_MINIMIZE 133_FS_READONLY 133_FS_RPATH 135_FS_TINY 133_MAX_SS 135_MULTI_PARTITION 135_USE_DIR 149_USE_FASTSEEK 134_USE_FORWARD 134_USE_LABEL 134_USE_LFN 134_USE_LSEEK 149_USE_MKFS 134_USE_READ 149_USE_STRFUNC 134_USE_WRITE 149_VOLUMES 136F_CPU 14 15 18increment 36USE_BUSY_FLAG 50

Kup książkę Poleć książkę

Skorowidz 583

symboleglobalne 36w asemblerze 28zewn trzne 39

symulacja 198 209symulator 190synchronizacja

pami ci 331pionowa 395pozioma 394

systemplikoacutew 111 128przerwa 404zdarze 245

szablonfont_XMEGAtmpl 326image_XMEGAtmpl 343

szum 463szybko przesy ania danych 126

ledzenie wi zki 333rodowisko

graficzne 11programistyczne 11VSIDE 542WinAVR 47

Ttabela FAT 130tablica

framebuf 402 408plugintbl 552 555tekst 208z kodem wynikowym 543

taktowanieDAC 296mikrokontrolera 473

technologia OLED 44temperatura mikrokontrolera 239 241termistor 262 290

NTC 263PTC 263

termometrLM35 249 250z alarmem 251

termostat 290test uk adu VS1003B 503testowanie obrazu 319timer 16 62

TCC0 20

TCC1 399transakcja 59 62 65transakcje 17 103ndash107transakcyjna obs uga LCD 58transakcyjny dost p do SPI 95transfer 91

danych 97wynikoacutew 254

transmisja 72 83tryb

bez znaku 234ci g ej konwersji 252czterobitowy 153dwukana owy 301graficzny 416graficzny VGA 407idle 419jednobitowy 153LPC 371monochromatyczny 397 407oszcz dzania energii 94 306pracy multipleksera 226pracy SPI 157roacute nicowy 232single slope 312SPI 153tekstowy 413tekstowy VGA 397z pojedynczym wej ciem 234ze znakiem 235

trybygenerowania PWM 467pracy karty 153pracy przetwornika 231pracy SPI 74pracy uk adu 508

twierdzenie Nyquista 258tworzenie

adresu 84nak adek 417obrazu 335tablicy 543

typ__uint24 119karty 160niekompletny 60wyliczeniowy 114

typyoperandoacutew 29w AVR 34

Kup książkę Poleć książkę

584 AVR Uk ady peryferyjne

Uuchwyt handle 64 113uk ad

AD725 427 431buforowy 294CS 361DAC 284dataloggera 267detekcji awarii zasilania 559generuj cy obraz 393HiRes 477ICL7660 47LM35 250 251SampH 293sterowania sygna em 379USART 401VS1003B 496 503 508 530 538 556VS100XX 529wzmacniania sygna u 227

uk ady peryferyjne 9uruchomienie komparatora 287urz dzenie

master 72slave 72

u rednianie 259utrata danych 141u ycie wstawki asemblerowej 33

VVGA 393

Wwarto ci kalibracyjne

ADC 564oscylatoroacutew 564temperatury 564

warunkowa kompilacja 36WE Write Enable 375wej cie composite video input 425wektor przerwa 38 257wideo 391wielko pami ci 86 377w czenie DAC 299wska nik na struktur 27wska niki 32wstawki asemblerowe 24 33wtyczka 535 541 544

SineDTMF Generator 537VGA 396

wyboacuter cz stotliwo ci PWM 465 474wykorzystanie

DMA 254 518

EuroSCART 428PWM 461rejestroacutew 34

wyliczanie predyktora 489wy wietlacze

alfanumeryczne 43 45graficzne 43 309LCD 43OLED 46

wy wietlanielitera u 213map bitowych 344obrazu 333 346 406obrazu VGA 393

wywo ania zwrotne callbacks 98asynchroniczne 101synchroniczne 101

wyzwalanie konwersji 245wzmacniacz 446wzmacniacz operacyjny 279wzmacnianie sygna u 227

XXMEGA 9 18

Zzapis

bufora 269danych 176d wi ku 440 556

zasilaniekarty 154pami ci 109

zatrzask 368zatrzask 74HC573 433zatrza ni cie adresu 369zdarzenia 297zdarzenie compare match 399zegar 383 420 426zintegrowane rodowisko programistyczne 11z cze EuroSCART 425 428 429zmiana

g o no ci 527wielko ci strony 94

znaki 56

roacuted onapi cia odniesienia 284sygna u 240

Kup książkę Poleć książkę

Page 35: Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8 AVR. Ukäady peryferyjne Rejestry dost pu do pami ci RAM .....513 Rejestr adresu

70 AVR Uk ady peryferyjne

Je li mamy do czynienia z prekompilowan bibliotek (lib) to musi ona by skom-pilowana z zaznaczon opcj Prepare functions for garbage collection (-ffunction-sections) Alternatyw jest umieszczenie ka dej funkcji biblioteki w osobnym pliku(tak jak w przypadku bibliotek AVR-libc)

Na ekranie wyboru opcji optymalizacji linkera mamy jeszcze jedn przydatn opcjmdash Relax Branches (-mrelax) Dla mikrokontroleroacutew ktoacutere maj ponad 8 kB pami ciFLASH instrukcje skokoacutew s generowane jako tzw instrukcje d ugie mdash umo liwiajone skok do komoacuterki pami ci FLASH o dowolnym adresie Jednak cen za to jestwyd u enie instrukcji mdash ich kod jest d u szy podobnie jak czas wykonania Nie zawszejednak takie d ugie instrukcje musz by wykonywane mdash je li miejsce docelowe skokule y blisko (w zasi gu instrukcji skokoacutew wzgl dnych) to mo na w kodzie wynikowymzamieni instrukcje d u sze na kroacutetsze co przynosi oszcz dno ci w postaci skroacuteceniakodu wynikowego Poniewa dopiero linker bdquowierdquo jak poszczegoacutelne fragmenty kodus rozmieszczone w pami ci takiej podmiany mo na dokona na etapie linkowaniaprogramu co zapewnia powy sza opcja St d te warto to pole wyboru zaznaczy

Kup książkę Poleć książkę

SkorowidzA

ABI Application Binary Interface 25AC Address Counter 50ADPCM 482adres

bazowy 377bufora 61komoacuterki 84pu apki 202

ALE Address Latch Enable 368alfanumeryczne wy wietlacze 43algorytm ADPCM 492algorytmy stratne 495animacje 57antyaliasing 325architektury procesoroacutew XMEGA 352asembler 23

dyrektywy 40funkcje j zyka C 41obs uga przerwa 39

asynchroniczne wywo anie funkcji 101Atmel Studio 15

Bbajty kalibracyjne 569biblioteka

FATFS 131 139 176 180 517libcallback-liba 99PetitFS 144 149

bitADC_CH0START_bm 236IMPMODE 244

bitrate 442 512blokowanie przerwa 219b d 16 19

kwantyzacji 463offsetu 230wzmocnienia ADC 230

BOD 223bps bits per second 12

budowakarty 152linii obrazu 394pami ci SDRAM 374pliku stymulacji 192ramki PAL 412sygna u PAL 411wtyczki 544 545

bufor 78FIFO 497na transakcje 61transakcji 62

buforowanie wyj cia 294

CCAS Column Address Strobe 375CCFL 44charakterystyka

przetwornikoacutew 222termistora 264tryboacutew pracy 232

CID Card Identification 169CKE Clock Enable 375CLKIN 421COG Chip on Glass 310CRC 158 178CRC16 178CRC7 164CS Chip Select 361 375CSD Card Specific Data 172czas

dost pu do SDRAM 424adowania kondensatora 244

propagacji 281proacutebkowania 260symulacji 209

czcionki 322cz stotliwo

odchylania pionowego 428proacutebkowania 244 441 444 530przebiegu 504

Kup książkę Poleć książkę

576 AVR Uk ady peryferyjne

cz stotliwoPWM 465taktowania koprocesora 549taktowania procesora 209taktowania rdzenia 18

czyszczenie pami ci 318

DDAC Digital to Analog Converter 293 447 451

buforowanie wyj cia 294generowanie przebiegoacutew 301jitter 303kalibracja 306napi cie referencyjne 295system zdarze 297taktowanie 296tryb dwukana owy 301wykorzystanie DMA 298wyzwalanie konwersji 305

datalogger 261 265 275DD Device Density 86debuger 183

programowy 190sprz towy 185 187

decymacja 259DEBUG 219XMEGA 260

definicja symboli globalnych 36definiowanie w asnych znakoacutew 56deklaracja zapowiadaj ca 103 337dekoder DTMF 548 556DMA 254 298 402 458 518 523dost p do

danych 358 359 568danych binarnych 356 360danych wielobajtowych 31DataFLASH 137EEPROM 128FAT 136komoacuterki 375LCD 59 62 66 68operandu 30pami ci 81 384 386 387 561pami ci SDRAM 424pliku blokowy 141portoacutew IO 30rejestroacutew IO procesora 36rejestroacutew uk adu 499SPI 95sygnatury u ytkownika 565 567wska nikoacutew 32

DQM Data Mask 375DSP Digital Signal Processor 535

DTMF 535 553dyktafon 529dynamiczna alokacja pami ci 516dyrektywa global 38dyrektywy asemblera 40dzia anie

DMA 255komparatora 280timeroacutew 400

d wi k 443

EEBI External Bus Interface 361EEPROM 207eliminacja jitteru 24emulacja RS232 139

FFAT File Allocation Table 128 131FAT32 128FATFS 180filtr

dolnoprzepustowy 491drugiego rz du 470pierwszego rz du 469trzeciego rz du 471

filtrowanie sygna u PWM 468firmware 565FLASH 207format

odpowiedzi 159polecenia 158protoko u 157

funkcja_delay_ms 17 219c_zero 42callback 106 341callback() 99DataFLASH_CSEnable 100DF_FinishBufWrite() 269disk_initialize 136disk_ioctl 181disk_status 136disk_write 138DMA_SPI_init 104DTMF_GetCode 553free_re 65GPIOR0_init 507hd44780_outcmd 51hd44780_outnibble_nowait 65LCD_defchar_P 57

Kup książkę Poleć książkę

Skorowidz 577

Menu_Click_Func 515Menu_Free 516Menu_Recorder 532Menu_Run 527MS_CreateRegEntry 117MS_GetDirPos 125MS_GetRegItem 115MS_WritePages 116 118OSC_wait_for_rdy 473RecMenu_StartStop 532sprintf 142strtok 124sysclk_init() 200 209TMF_memcpy_PF 454udi_cdc_getc() 123udi_cdc_is_rx_ready() 123VS1003_Reset 506

funkcjeanalizuj ce 556biblioteczne 50biblioteki FATFS 143j zyka C 41kontrolera ST7565R 313opoacute niaj ce 17opoacute nie 219reentrant 524specjalne kontrolera 319steruj ce 314zapisu 133

fusebit 557BODACT 560BODLEVEL 560BOOTRST 559DVSDON 560EESAVE 561JTAGEN 558RSTDISBL 559SUT 559TOSCSEL 559

fusebity w AVR-libc 571

Ggenerator obrazu composite 426generowanie

d wi ku 461kolorowego obrazu 437obrazu wideo 391przebiegoacutew 301przerwa 285sygna u composite 409

g bia koloru 326gniazdo

karty SD 156VGA 396

Hhistereza 281

IIDE 11IMA ADPCM 483informacje

o kolorze 431o obrazie 434

inicjalizacjakarty 161karty SDHC 167karty SDSC 167karty SDXC 167licznika 419pami ci 119USART 505

instrukcjaicall 42movw 35nop 13 24

interfejsSCI 498SDI 498SPI 71 79RS232 120UART 123USART 71 73

interpolacja 259interpolacja w XMEGA 260inwersja obrazu 319

Jjednostki 12jitter 24 303 420

Kkalibracja

ADC 229DAC 306 564offsetu 237

kana DMA 82 522karta 154 158

mikroSD 152SD 151 152SDHC 151 152 160SDSC 160SDXC 151 160

Kup książkę Poleć książkę

578 AVR Uk ady peryferyjne

karty pami ci 151 152 157biblioteka FATFS 180budowa 152format polecenia 158inicjalizacja 161 167komunikacja 156odczyt danych 173opcje konfiguracyjne 181rejestry specjalne 169tryby pracy 153zapis danych 176zasilanie 154

kodasemblerowy 23 24C 23dost pu 24

kodowanieμ-law 481ADPCM 483Dialogic ADPCM 494informacji 166 426koloru 425znakoacutew 536

kodyformatoacutew audio 501zdarze 545

kolejno bajtoacutew 533kolor 424 430kolorowy obraz 437komparator 422

analogowy 279 280analogowy XMEGA 282okienkowy 284

kompilacja plikoacutew binarnych 350kompilator avr-gcc 11 359kompresja

ADPCM 482 486d wi ku 480IMA ADPCM 482

komunikacja z koprocesorem 504konfiguracja

4-portowa 364biblioteki 133debugera 185DMA 459 522fusebitoacutew 570kontrolera DMA 257 452komparatoroacutew 285lockbitoacutew 570LPC 371pami ci SDRAM 381PetitFS 149pinu IO 225portoacutew IO 362

preskalera 452projektu 186przerwa 219pu apki 203rejestru EVCTRL 248rejestru PER 67SPI 75sygna u CS 377typu czcionki 324urz dze IO 189USART 76zegara 383

konsolidacja 547kontroler

DMA 254 298 402 458 518 523KS108 310ST7565R 310ndash315 321

konwersjaDAC 305sygna oacutew 396wyzwalana 306

konwertercyfrowo-analogowy 426DAC 427

koprocesormp3 496VS1003B 10

korekcja fazy 466kwantyzacja 463

Llampa CCFL 44LE Latch Enable 433licznik 419

cykli 209TCC1 400timera 20

linie IO 50linie sygna owe

MISO 72 164MOSI 72SCK 72SS 72

linker 69lista

mnemonikoacutew 24modyfikowanych rejestroacutew 32

lockbity 557 561lockbity w AVR-libc 570LPC Low Pin Count 371LPCM 443 556LSB Least Significant Bit 228

Kup książkę Poleć książkę

Skorowidz 579

a cuchy formatuj ce 212czenie plikoacutew 352

Mmagistrala pami ci zewn trznej 361magnetofon cyfrowy 528makro _SFR_IO_ADDR() 39makrodefinicja

ASSERT 214HD44780_CGADDR() 53HD44780_CLR 53HD44780_DDADDR() 53HD44780_DISPCTL() 52HD44780_ENTMODE() 52HD44780_FNSET() 52HD44780_HOME 53HD44780_SHIFT() 51LOCKBITS 571

mapowanie sygna oacutew 366mapy bitowe 343marker czasowy 268maski bitowe 329matryce 49menu 335menu piktogramowe 342mierniki temperatury 262mikrokontroler

ARM 9AVR 9PIC 9XMEGA128A3U 10

MISO 72moc wydzielana 265model psychoakustyczny 495modu

alfanumeryczny 45NVM 568Xmega eXploreGO 10Xplained ATXMEGA A3BU 10Xplained ATXMEGA-A1 10Xplained XMEGA128A1 447Xplained XMEGA256A3 94Xplained XMEGA256A3BU 97 143 266

modyfikator 30const 85volatile 28 273

monitory CRT 395monochromatyczne wy wietlacze graficzne 309monochromatyczny

tryb graficzny 416tryb tekstowy 413

MOSI 72mp3 495Msps Megasamples per second 12multiplekser wej ciowy 226 283multipleksowanie adresoacutew 368 369muzyka 439

Nnadawanie kodoacutew DTMF 540nadproacutebkowanie 258nag oacutewek kontenera wav 500nagrywanie mowy 486najmniej znacz cy bit 228napi cie

offsetu 280referencyjne 223 295zasilania 239

Oobracanie obrazu 319obraz 319

composite 426kolorowy 430wideo 391

obroacutebka d wi ku 443 445obs uga

FAT 131 143klawiatury matrycowej 24LCD 58 63 67menu 337przerwania 37 38 458przerwania DMA 525przerwa w asemblerze 39przyciskoacutew 272wy wietlaczy alfanumerycznych 45

odczytblokowy 140danych 173 358

odpowied response 159R1 159R2 159R7 160

od wie anie pami ci 376odtwarzanie

d wi ku 472muzyki 447 513 518 521

offset 238offset ADC 230okno

Breakpoints 202Call stack 209dezasemblera 210

Kup książkę Poleć książkę

580 AVR Uk ady peryferyjne

oknoIO View 207podgl du zmiennych 211wyboru czcionek 324

OLED 46opcje

kompilatora 35zapisu d wi ku 445

operacjena buforach 91odczytu 173zapisu 176zapisu strony 92

operand 29operator

ascii 41

asciz 41

byte 41

section 41opoacute nienia 13 18opoacute nienie zmienne 16optymalizacja 16 68optymalizator 26organizacja pami ci 77organizacja pami ci VRAM 316oscylator 287OSD On-Screen Display 417ostrze enie 16oszcz dzanie energii 94

Ppakiet WinAVR 48pami

CGRAM 56 57 64DataFLASH 10 77 81 113 269DDRAM 49EEPROM 111FLASH 54 124 207RAM 49SDRAM 372SRAM 63 124 329 366 371VRAM 314 317

PCLK 421PCM 443PetitFS 144 149p tla

for 13while 201

pierwsza linia obrazu 321piksel 430piktogram 342pin IO 225

plikAlloc_safeh 65DataFLASHc 83DataFLASHIOc 136definesh 50delayh 14diskioh 132 136ffh 132ffconfh 132 181hd44780h 49integerh 132ioh 30LCD_transc 61LCD-transactc 66Makefile 14Menuc 19nothingo 541outfiletxt 547 551pffh 149SPIh 104stringh 113stymulacji 191 192

pliki mp3 495elf 351fon 323o 24S 24 34binarne 350 355csv 276d wi kowe 440obiektowe 352wav 500WMA 512z czcionkami 327z danymi 349

podbijacz napi cia 315podgl d

pami ci 207stosu wywo a 209zmiennych 211znakoacutew 325

pod czeniefototranzystora 262karty SD 155LCD z kontrolerem 311modu u 50pami ci 362 369 370 373termistora 262uk adu LM35 251wyj XMEGA 398

pod wietlenieCCFL 46OLED 46

Kup książkę Poleć książkę

Skorowidz 581

podwoacutejne buforowanie 255 332 457polecenia

kasowania strony 81konfiguracyjne pami ci 82kontrolera ST7565R 315odczytu bufora 82 89odczytu pami ci 81 88SDRAM 376transferu 91

polecenieACMD41 168cd 181CID 178CMD0 165CMD8 167CSD 178date 276dir 127 181dump 276erase 276get 276HD44780_CLR 51Init 178mkdir 181

po czenieDMA ze SPI 96dwoacutech komparatoroacutew 285koprocesora mp3 497LCD z mikrokontrolerem 48wyj cia XMEGA 411XMEGA z PC 121z telewizorem 431

pomiarnapi cia zasilania 239temperatury MCU 241

port IO 30 362pozycjonowanie grafik 345poacute obraz 410precyzja pomiaroacutew 260preskaler 478preskaler ADC 243program

Atmel Data Visualizer 275Audacity 443avr-objcopy 350dataloggera 265LCD Image Converter 323makeloadingtableexe 543Realterm 127 554riffstrip 483SoX 445Tracepoint 208

programowanie sygnatury u ytkownika 566protokoacute master-slave 157

prototypy 136proacutebki d wi kowe 447proacutebkowanie

8-bitowe 300nieliniowe 480

prymitywy graficzne 330przebieg PWM 468przebiegi 289 303przechwytywanie danych 276przemiatanie wej 253przerwanie 218 254 286 403

DMA 522komparatora 286

przestrze adresowa procesora 378przesy anie

danych 498polece 498

przetaktowanie procesora 436przetwornik

ADC 221analogowo-cyfrowy 221cykliczny 222potokowy 222

przyciski 272pseudooperatory 41pu apki breakpoints 197pu apki warunkowe 205punkty ledzenia 203PWM 461 462 472

RRAS Row Address Strobe 375redukcja poboru energii 242regulacja kontrastu 321rejestr 32 34rejestr AC 50

adresu wtyczki 513BASEADDR 377CID 169CMP 251CSD 172czasu utworu 512DATA 83EVCTRL 248formatu audio 512identyfikacyjny pami ci 87INTFLAGS 252kontroli basoacutew 510kontroli g o no ci 513MUXCTRL 227OCR 168PER 67poroacutewnania 249

Kup książkę Poleć książkę

582 AVR Uk ady peryferyjne

rejestr ACSCI_CLOCKF 511stanu komparatora 287stanu pami ci 86stanu uk adu 510trybu pracy 508WINCTRL 285

rejestrydost pu do pami ci RAM 513GPIOR 502IO procesora 36mikrokontrolera 25procesora 35specjalne 94specjalne karty 169uk adu VS1003B 508

relacja rodzic ndash dziecko 336reset uk adu 534rozdzielczo

LCD 329przetwornika 231PWM 463 477

rozszerzenie HiRes 477 479roacutewnanie Steinharta-Harta 263rysowanie map bitowych 343

Sschemat uk adu dataloggera 267SCI Serial Command Interface 498SCK 72SD Secure Digital 152SDI Serial Data Interface 498separator synchronizacji 422separowanie impulsoacutew synchronizacji 422shieldy 10skaler 422skaler napi cia 283skrypt makefile 353s owo kluczowe

asm 27extern 37static 68

specyfikatory lokalizacji zmiennej 213sps samples per second 12SS Slave Select 72standard PAL 410standard VGA 393sterowanie

dataloggerem 275sygna em 379

sterownik 121HD44780 49 56LCD 49 62

stos wywo a 209

strukturaFATFS 139Handle 118LCD_trans 60 63menu 338rejestru 86SimpleFSEntry 113 116SimpleFSHandle 113 118 140submenu 527systemu plikoacutew 112

sumabitowa 571kontrolna 178

sygnacomposite 409composite video output 430CS 377DREQ 497H-Sync 396synchronizacji 423V-Sync 396zegarowy CLK 374

sygna yinterfejsu EBI 363magistrali EBI 364steruj ce 375

sygnaturaprodukcyjna procesora 563u ytkownika 565

symbol__DELAY_ROUND_CLOSEST__ 17__DELAY_ROUND_DOWN__ 17_FS_FAT12 149_FS_FAT32 149_FS_MINIMIZE 133_FS_READONLY 133_FS_RPATH 135_FS_TINY 133_MAX_SS 135_MULTI_PARTITION 135_USE_DIR 149_USE_FASTSEEK 134_USE_FORWARD 134_USE_LABEL 134_USE_LFN 134_USE_LSEEK 149_USE_MKFS 134_USE_READ 149_USE_STRFUNC 134_USE_WRITE 149_VOLUMES 136F_CPU 14 15 18increment 36USE_BUSY_FLAG 50

Kup książkę Poleć książkę

Skorowidz 583

symboleglobalne 36w asemblerze 28zewn trzne 39

symulacja 198 209symulator 190synchronizacja

pami ci 331pionowa 395pozioma 394

systemplikoacutew 111 128przerwa 404zdarze 245

szablonfont_XMEGAtmpl 326image_XMEGAtmpl 343

szum 463szybko przesy ania danych 126

ledzenie wi zki 333rodowisko

graficzne 11programistyczne 11VSIDE 542WinAVR 47

Ttabela FAT 130tablica

framebuf 402 408plugintbl 552 555tekst 208z kodem wynikowym 543

taktowanieDAC 296mikrokontrolera 473

technologia OLED 44temperatura mikrokontrolera 239 241termistor 262 290

NTC 263PTC 263

termometrLM35 249 250z alarmem 251

termostat 290test uk adu VS1003B 503testowanie obrazu 319timer 16 62

TCC0 20

TCC1 399transakcja 59 62 65transakcje 17 103ndash107transakcyjna obs uga LCD 58transakcyjny dost p do SPI 95transfer 91

danych 97wynikoacutew 254

transmisja 72 83tryb

bez znaku 234ci g ej konwersji 252czterobitowy 153dwukana owy 301graficzny 416graficzny VGA 407idle 419jednobitowy 153LPC 371monochromatyczny 397 407oszcz dzania energii 94 306pracy multipleksera 226pracy SPI 157roacute nicowy 232single slope 312SPI 153tekstowy 413tekstowy VGA 397z pojedynczym wej ciem 234ze znakiem 235

trybygenerowania PWM 467pracy karty 153pracy przetwornika 231pracy SPI 74pracy uk adu 508

twierdzenie Nyquista 258tworzenie

adresu 84nak adek 417obrazu 335tablicy 543

typ__uint24 119karty 160niekompletny 60wyliczeniowy 114

typyoperandoacutew 29w AVR 34

Kup książkę Poleć książkę

584 AVR Uk ady peryferyjne

Uuchwyt handle 64 113uk ad

AD725 427 431buforowy 294CS 361DAC 284dataloggera 267detekcji awarii zasilania 559generuj cy obraz 393HiRes 477ICL7660 47LM35 250 251SampH 293sterowania sygna em 379USART 401VS1003B 496 503 508 530 538 556VS100XX 529wzmacniania sygna u 227

uk ady peryferyjne 9uruchomienie komparatora 287urz dzenie

master 72slave 72

u rednianie 259utrata danych 141u ycie wstawki asemblerowej 33

VVGA 393

Wwarto ci kalibracyjne

ADC 564oscylatoroacutew 564temperatury 564

warunkowa kompilacja 36WE Write Enable 375wej cie composite video input 425wektor przerwa 38 257wideo 391wielko pami ci 86 377w czenie DAC 299wska nik na struktur 27wska niki 32wstawki asemblerowe 24 33wtyczka 535 541 544

SineDTMF Generator 537VGA 396

wyboacuter cz stotliwo ci PWM 465 474wykorzystanie

DMA 254 518

EuroSCART 428PWM 461rejestroacutew 34

wyliczanie predyktora 489wy wietlacze

alfanumeryczne 43 45graficzne 43 309LCD 43OLED 46

wy wietlanielitera u 213map bitowych 344obrazu 333 346 406obrazu VGA 393

wywo ania zwrotne callbacks 98asynchroniczne 101synchroniczne 101

wyzwalanie konwersji 245wzmacniacz 446wzmacniacz operacyjny 279wzmacnianie sygna u 227

XXMEGA 9 18

Zzapis

bufora 269danych 176d wi ku 440 556

zasilaniekarty 154pami ci 109

zatrzask 368zatrzask 74HC573 433zatrza ni cie adresu 369zdarzenia 297zdarzenie compare match 399zegar 383 420 426zintegrowane rodowisko programistyczne 11z cze EuroSCART 425 428 429zmiana

g o no ci 527wielko ci strony 94

znaki 56

roacuted onapi cia odniesienia 284sygna u 240

Kup książkę Poleć książkę

Page 36: Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8 AVR. Ukäady peryferyjne Rejestry dost pu do pami ci RAM .....513 Rejestr adresu

SkorowidzA

ABI Application Binary Interface 25AC Address Counter 50ADPCM 482adres

bazowy 377bufora 61komoacuterki 84pu apki 202

ALE Address Latch Enable 368alfanumeryczne wy wietlacze 43algorytm ADPCM 492algorytmy stratne 495animacje 57antyaliasing 325architektury procesoroacutew XMEGA 352asembler 23

dyrektywy 40funkcje j zyka C 41obs uga przerwa 39

asynchroniczne wywo anie funkcji 101Atmel Studio 15

Bbajty kalibracyjne 569biblioteka

FATFS 131 139 176 180 517libcallback-liba 99PetitFS 144 149

bitADC_CH0START_bm 236IMPMODE 244

bitrate 442 512blokowanie przerwa 219b d 16 19

kwantyzacji 463offsetu 230wzmocnienia ADC 230

BOD 223bps bits per second 12

budowakarty 152linii obrazu 394pami ci SDRAM 374pliku stymulacji 192ramki PAL 412sygna u PAL 411wtyczki 544 545

bufor 78FIFO 497na transakcje 61transakcji 62

buforowanie wyj cia 294

CCAS Column Address Strobe 375CCFL 44charakterystyka

przetwornikoacutew 222termistora 264tryboacutew pracy 232

CID Card Identification 169CKE Clock Enable 375CLKIN 421COG Chip on Glass 310CRC 158 178CRC16 178CRC7 164CS Chip Select 361 375CSD Card Specific Data 172czas

dost pu do SDRAM 424adowania kondensatora 244

propagacji 281proacutebkowania 260symulacji 209

czcionki 322cz stotliwo

odchylania pionowego 428proacutebkowania 244 441 444 530przebiegu 504

Kup książkę Poleć książkę

576 AVR Uk ady peryferyjne

cz stotliwoPWM 465taktowania koprocesora 549taktowania procesora 209taktowania rdzenia 18

czyszczenie pami ci 318

DDAC Digital to Analog Converter 293 447 451

buforowanie wyj cia 294generowanie przebiegoacutew 301jitter 303kalibracja 306napi cie referencyjne 295system zdarze 297taktowanie 296tryb dwukana owy 301wykorzystanie DMA 298wyzwalanie konwersji 305

datalogger 261 265 275DD Device Density 86debuger 183

programowy 190sprz towy 185 187

decymacja 259DEBUG 219XMEGA 260

definicja symboli globalnych 36definiowanie w asnych znakoacutew 56deklaracja zapowiadaj ca 103 337dekoder DTMF 548 556DMA 254 298 402 458 518 523dost p do

danych 358 359 568danych binarnych 356 360danych wielobajtowych 31DataFLASH 137EEPROM 128FAT 136komoacuterki 375LCD 59 62 66 68operandu 30pami ci 81 384 386 387 561pami ci SDRAM 424pliku blokowy 141portoacutew IO 30rejestroacutew IO procesora 36rejestroacutew uk adu 499SPI 95sygnatury u ytkownika 565 567wska nikoacutew 32

DQM Data Mask 375DSP Digital Signal Processor 535

DTMF 535 553dyktafon 529dynamiczna alokacja pami ci 516dyrektywa global 38dyrektywy asemblera 40dzia anie

DMA 255komparatora 280timeroacutew 400

d wi k 443

EEBI External Bus Interface 361EEPROM 207eliminacja jitteru 24emulacja RS232 139

FFAT File Allocation Table 128 131FAT32 128FATFS 180filtr

dolnoprzepustowy 491drugiego rz du 470pierwszego rz du 469trzeciego rz du 471

filtrowanie sygna u PWM 468firmware 565FLASH 207format

odpowiedzi 159polecenia 158protoko u 157

funkcja_delay_ms 17 219c_zero 42callback 106 341callback() 99DataFLASH_CSEnable 100DF_FinishBufWrite() 269disk_initialize 136disk_ioctl 181disk_status 136disk_write 138DMA_SPI_init 104DTMF_GetCode 553free_re 65GPIOR0_init 507hd44780_outcmd 51hd44780_outnibble_nowait 65LCD_defchar_P 57

Kup książkę Poleć książkę

Skorowidz 577

Menu_Click_Func 515Menu_Free 516Menu_Recorder 532Menu_Run 527MS_CreateRegEntry 117MS_GetDirPos 125MS_GetRegItem 115MS_WritePages 116 118OSC_wait_for_rdy 473RecMenu_StartStop 532sprintf 142strtok 124sysclk_init() 200 209TMF_memcpy_PF 454udi_cdc_getc() 123udi_cdc_is_rx_ready() 123VS1003_Reset 506

funkcjeanalizuj ce 556biblioteczne 50biblioteki FATFS 143j zyka C 41kontrolera ST7565R 313opoacute niaj ce 17opoacute nie 219reentrant 524specjalne kontrolera 319steruj ce 314zapisu 133

fusebit 557BODACT 560BODLEVEL 560BOOTRST 559DVSDON 560EESAVE 561JTAGEN 558RSTDISBL 559SUT 559TOSCSEL 559

fusebity w AVR-libc 571

Ggenerator obrazu composite 426generowanie

d wi ku 461kolorowego obrazu 437obrazu wideo 391przebiegoacutew 301przerwa 285sygna u composite 409

g bia koloru 326gniazdo

karty SD 156VGA 396

Hhistereza 281

IIDE 11IMA ADPCM 483informacje

o kolorze 431o obrazie 434

inicjalizacjakarty 161karty SDHC 167karty SDSC 167karty SDXC 167licznika 419pami ci 119USART 505

instrukcjaicall 42movw 35nop 13 24

interfejsSCI 498SDI 498SPI 71 79RS232 120UART 123USART 71 73

interpolacja 259interpolacja w XMEGA 260inwersja obrazu 319

Jjednostki 12jitter 24 303 420

Kkalibracja

ADC 229DAC 306 564offsetu 237

kana DMA 82 522karta 154 158

mikroSD 152SD 151 152SDHC 151 152 160SDSC 160SDXC 151 160

Kup książkę Poleć książkę

578 AVR Uk ady peryferyjne

karty pami ci 151 152 157biblioteka FATFS 180budowa 152format polecenia 158inicjalizacja 161 167komunikacja 156odczyt danych 173opcje konfiguracyjne 181rejestry specjalne 169tryby pracy 153zapis danych 176zasilanie 154

kodasemblerowy 23 24C 23dost pu 24

kodowanieμ-law 481ADPCM 483Dialogic ADPCM 494informacji 166 426koloru 425znakoacutew 536

kodyformatoacutew audio 501zdarze 545

kolejno bajtoacutew 533kolor 424 430kolorowy obraz 437komparator 422

analogowy 279 280analogowy XMEGA 282okienkowy 284

kompilacja plikoacutew binarnych 350kompilator avr-gcc 11 359kompresja

ADPCM 482 486d wi ku 480IMA ADPCM 482

komunikacja z koprocesorem 504konfiguracja

4-portowa 364biblioteki 133debugera 185DMA 459 522fusebitoacutew 570kontrolera DMA 257 452komparatoroacutew 285lockbitoacutew 570LPC 371pami ci SDRAM 381PetitFS 149pinu IO 225portoacutew IO 362

preskalera 452projektu 186przerwa 219pu apki 203rejestru EVCTRL 248rejestru PER 67SPI 75sygna u CS 377typu czcionki 324urz dze IO 189USART 76zegara 383

konsolidacja 547kontroler

DMA 254 298 402 458 518 523KS108 310ST7565R 310ndash315 321

konwersjaDAC 305sygna oacutew 396wyzwalana 306

konwertercyfrowo-analogowy 426DAC 427

koprocesormp3 496VS1003B 10

korekcja fazy 466kwantyzacja 463

Llampa CCFL 44LE Latch Enable 433licznik 419

cykli 209TCC1 400timera 20

linie IO 50linie sygna owe

MISO 72 164MOSI 72SCK 72SS 72

linker 69lista

mnemonikoacutew 24modyfikowanych rejestroacutew 32

lockbity 557 561lockbity w AVR-libc 570LPC Low Pin Count 371LPCM 443 556LSB Least Significant Bit 228

Kup książkę Poleć książkę

Skorowidz 579

a cuchy formatuj ce 212czenie plikoacutew 352

Mmagistrala pami ci zewn trznej 361magnetofon cyfrowy 528makro _SFR_IO_ADDR() 39makrodefinicja

ASSERT 214HD44780_CGADDR() 53HD44780_CLR 53HD44780_DDADDR() 53HD44780_DISPCTL() 52HD44780_ENTMODE() 52HD44780_FNSET() 52HD44780_HOME 53HD44780_SHIFT() 51LOCKBITS 571

mapowanie sygna oacutew 366mapy bitowe 343marker czasowy 268maski bitowe 329matryce 49menu 335menu piktogramowe 342mierniki temperatury 262mikrokontroler

ARM 9AVR 9PIC 9XMEGA128A3U 10

MISO 72moc wydzielana 265model psychoakustyczny 495modu

alfanumeryczny 45NVM 568Xmega eXploreGO 10Xplained ATXMEGA A3BU 10Xplained ATXMEGA-A1 10Xplained XMEGA128A1 447Xplained XMEGA256A3 94Xplained XMEGA256A3BU 97 143 266

modyfikator 30const 85volatile 28 273

monitory CRT 395monochromatyczne wy wietlacze graficzne 309monochromatyczny

tryb graficzny 416tryb tekstowy 413

MOSI 72mp3 495Msps Megasamples per second 12multiplekser wej ciowy 226 283multipleksowanie adresoacutew 368 369muzyka 439

Nnadawanie kodoacutew DTMF 540nadproacutebkowanie 258nag oacutewek kontenera wav 500nagrywanie mowy 486najmniej znacz cy bit 228napi cie

offsetu 280referencyjne 223 295zasilania 239

Oobracanie obrazu 319obraz 319

composite 426kolorowy 430wideo 391

obroacutebka d wi ku 443 445obs uga

FAT 131 143klawiatury matrycowej 24LCD 58 63 67menu 337przerwania 37 38 458przerwania DMA 525przerwa w asemblerze 39przyciskoacutew 272wy wietlaczy alfanumerycznych 45

odczytblokowy 140danych 173 358

odpowied response 159R1 159R2 159R7 160

od wie anie pami ci 376odtwarzanie

d wi ku 472muzyki 447 513 518 521

offset 238offset ADC 230okno

Breakpoints 202Call stack 209dezasemblera 210

Kup książkę Poleć książkę

580 AVR Uk ady peryferyjne

oknoIO View 207podgl du zmiennych 211wyboru czcionek 324

OLED 46opcje

kompilatora 35zapisu d wi ku 445

operacjena buforach 91odczytu 173zapisu 176zapisu strony 92

operand 29operator

ascii 41

asciz 41

byte 41

section 41opoacute nienia 13 18opoacute nienie zmienne 16optymalizacja 16 68optymalizator 26organizacja pami ci 77organizacja pami ci VRAM 316oscylator 287OSD On-Screen Display 417ostrze enie 16oszcz dzanie energii 94

Ppakiet WinAVR 48pami

CGRAM 56 57 64DataFLASH 10 77 81 113 269DDRAM 49EEPROM 111FLASH 54 124 207RAM 49SDRAM 372SRAM 63 124 329 366 371VRAM 314 317

PCLK 421PCM 443PetitFS 144 149p tla

for 13while 201

pierwsza linia obrazu 321piksel 430piktogram 342pin IO 225

plikAlloc_safeh 65DataFLASHc 83DataFLASHIOc 136definesh 50delayh 14diskioh 132 136ffh 132ffconfh 132 181hd44780h 49integerh 132ioh 30LCD_transc 61LCD-transactc 66Makefile 14Menuc 19nothingo 541outfiletxt 547 551pffh 149SPIh 104stringh 113stymulacji 191 192

pliki mp3 495elf 351fon 323o 24S 24 34binarne 350 355csv 276d wi kowe 440obiektowe 352wav 500WMA 512z czcionkami 327z danymi 349

podbijacz napi cia 315podgl d

pami ci 207stosu wywo a 209zmiennych 211znakoacutew 325

pod czeniefototranzystora 262karty SD 155LCD z kontrolerem 311modu u 50pami ci 362 369 370 373termistora 262uk adu LM35 251wyj XMEGA 398

pod wietlenieCCFL 46OLED 46

Kup książkę Poleć książkę

Skorowidz 581

podwoacutejne buforowanie 255 332 457polecenia

kasowania strony 81konfiguracyjne pami ci 82kontrolera ST7565R 315odczytu bufora 82 89odczytu pami ci 81 88SDRAM 376transferu 91

polecenieACMD41 168cd 181CID 178CMD0 165CMD8 167CSD 178date 276dir 127 181dump 276erase 276get 276HD44780_CLR 51Init 178mkdir 181

po czenieDMA ze SPI 96dwoacutech komparatoroacutew 285koprocesora mp3 497LCD z mikrokontrolerem 48wyj cia XMEGA 411XMEGA z PC 121z telewizorem 431

pomiarnapi cia zasilania 239temperatury MCU 241

port IO 30 362pozycjonowanie grafik 345poacute obraz 410precyzja pomiaroacutew 260preskaler 478preskaler ADC 243program

Atmel Data Visualizer 275Audacity 443avr-objcopy 350dataloggera 265LCD Image Converter 323makeloadingtableexe 543Realterm 127 554riffstrip 483SoX 445Tracepoint 208

programowanie sygnatury u ytkownika 566protokoacute master-slave 157

prototypy 136proacutebki d wi kowe 447proacutebkowanie

8-bitowe 300nieliniowe 480

prymitywy graficzne 330przebieg PWM 468przebiegi 289 303przechwytywanie danych 276przemiatanie wej 253przerwanie 218 254 286 403

DMA 522komparatora 286

przestrze adresowa procesora 378przesy anie

danych 498polece 498

przetaktowanie procesora 436przetwornik

ADC 221analogowo-cyfrowy 221cykliczny 222potokowy 222

przyciski 272pseudooperatory 41pu apki breakpoints 197pu apki warunkowe 205punkty ledzenia 203PWM 461 462 472

RRAS Row Address Strobe 375redukcja poboru energii 242regulacja kontrastu 321rejestr 32 34rejestr AC 50

adresu wtyczki 513BASEADDR 377CID 169CMP 251CSD 172czasu utworu 512DATA 83EVCTRL 248formatu audio 512identyfikacyjny pami ci 87INTFLAGS 252kontroli basoacutew 510kontroli g o no ci 513MUXCTRL 227OCR 168PER 67poroacutewnania 249

Kup książkę Poleć książkę

582 AVR Uk ady peryferyjne

rejestr ACSCI_CLOCKF 511stanu komparatora 287stanu pami ci 86stanu uk adu 510trybu pracy 508WINCTRL 285

rejestrydost pu do pami ci RAM 513GPIOR 502IO procesora 36mikrokontrolera 25procesora 35specjalne 94specjalne karty 169uk adu VS1003B 508

relacja rodzic ndash dziecko 336reset uk adu 534rozdzielczo

LCD 329przetwornika 231PWM 463 477

rozszerzenie HiRes 477 479roacutewnanie Steinharta-Harta 263rysowanie map bitowych 343

Sschemat uk adu dataloggera 267SCI Serial Command Interface 498SCK 72SD Secure Digital 152SDI Serial Data Interface 498separator synchronizacji 422separowanie impulsoacutew synchronizacji 422shieldy 10skaler 422skaler napi cia 283skrypt makefile 353s owo kluczowe

asm 27extern 37static 68

specyfikatory lokalizacji zmiennej 213sps samples per second 12SS Slave Select 72standard PAL 410standard VGA 393sterowanie

dataloggerem 275sygna em 379

sterownik 121HD44780 49 56LCD 49 62

stos wywo a 209

strukturaFATFS 139Handle 118LCD_trans 60 63menu 338rejestru 86SimpleFSEntry 113 116SimpleFSHandle 113 118 140submenu 527systemu plikoacutew 112

sumabitowa 571kontrolna 178

sygnacomposite 409composite video output 430CS 377DREQ 497H-Sync 396synchronizacji 423V-Sync 396zegarowy CLK 374

sygna yinterfejsu EBI 363magistrali EBI 364steruj ce 375

sygnaturaprodukcyjna procesora 563u ytkownika 565

symbol__DELAY_ROUND_CLOSEST__ 17__DELAY_ROUND_DOWN__ 17_FS_FAT12 149_FS_FAT32 149_FS_MINIMIZE 133_FS_READONLY 133_FS_RPATH 135_FS_TINY 133_MAX_SS 135_MULTI_PARTITION 135_USE_DIR 149_USE_FASTSEEK 134_USE_FORWARD 134_USE_LABEL 134_USE_LFN 134_USE_LSEEK 149_USE_MKFS 134_USE_READ 149_USE_STRFUNC 134_USE_WRITE 149_VOLUMES 136F_CPU 14 15 18increment 36USE_BUSY_FLAG 50

Kup książkę Poleć książkę

Skorowidz 583

symboleglobalne 36w asemblerze 28zewn trzne 39

symulacja 198 209symulator 190synchronizacja

pami ci 331pionowa 395pozioma 394

systemplikoacutew 111 128przerwa 404zdarze 245

szablonfont_XMEGAtmpl 326image_XMEGAtmpl 343

szum 463szybko przesy ania danych 126

ledzenie wi zki 333rodowisko

graficzne 11programistyczne 11VSIDE 542WinAVR 47

Ttabela FAT 130tablica

framebuf 402 408plugintbl 552 555tekst 208z kodem wynikowym 543

taktowanieDAC 296mikrokontrolera 473

technologia OLED 44temperatura mikrokontrolera 239 241termistor 262 290

NTC 263PTC 263

termometrLM35 249 250z alarmem 251

termostat 290test uk adu VS1003B 503testowanie obrazu 319timer 16 62

TCC0 20

TCC1 399transakcja 59 62 65transakcje 17 103ndash107transakcyjna obs uga LCD 58transakcyjny dost p do SPI 95transfer 91

danych 97wynikoacutew 254

transmisja 72 83tryb

bez znaku 234ci g ej konwersji 252czterobitowy 153dwukana owy 301graficzny 416graficzny VGA 407idle 419jednobitowy 153LPC 371monochromatyczny 397 407oszcz dzania energii 94 306pracy multipleksera 226pracy SPI 157roacute nicowy 232single slope 312SPI 153tekstowy 413tekstowy VGA 397z pojedynczym wej ciem 234ze znakiem 235

trybygenerowania PWM 467pracy karty 153pracy przetwornika 231pracy SPI 74pracy uk adu 508

twierdzenie Nyquista 258tworzenie

adresu 84nak adek 417obrazu 335tablicy 543

typ__uint24 119karty 160niekompletny 60wyliczeniowy 114

typyoperandoacutew 29w AVR 34

Kup książkę Poleć książkę

584 AVR Uk ady peryferyjne

Uuchwyt handle 64 113uk ad

AD725 427 431buforowy 294CS 361DAC 284dataloggera 267detekcji awarii zasilania 559generuj cy obraz 393HiRes 477ICL7660 47LM35 250 251SampH 293sterowania sygna em 379USART 401VS1003B 496 503 508 530 538 556VS100XX 529wzmacniania sygna u 227

uk ady peryferyjne 9uruchomienie komparatora 287urz dzenie

master 72slave 72

u rednianie 259utrata danych 141u ycie wstawki asemblerowej 33

VVGA 393

Wwarto ci kalibracyjne

ADC 564oscylatoroacutew 564temperatury 564

warunkowa kompilacja 36WE Write Enable 375wej cie composite video input 425wektor przerwa 38 257wideo 391wielko pami ci 86 377w czenie DAC 299wska nik na struktur 27wska niki 32wstawki asemblerowe 24 33wtyczka 535 541 544

SineDTMF Generator 537VGA 396

wyboacuter cz stotliwo ci PWM 465 474wykorzystanie

DMA 254 518

EuroSCART 428PWM 461rejestroacutew 34

wyliczanie predyktora 489wy wietlacze

alfanumeryczne 43 45graficzne 43 309LCD 43OLED 46

wy wietlanielitera u 213map bitowych 344obrazu 333 346 406obrazu VGA 393

wywo ania zwrotne callbacks 98asynchroniczne 101synchroniczne 101

wyzwalanie konwersji 245wzmacniacz 446wzmacniacz operacyjny 279wzmacnianie sygna u 227

XXMEGA 9 18

Zzapis

bufora 269danych 176d wi ku 440 556

zasilaniekarty 154pami ci 109

zatrzask 368zatrzask 74HC573 433zatrza ni cie adresu 369zdarzenia 297zdarzenie compare match 399zegar 383 420 426zintegrowane rodowisko programistyczne 11z cze EuroSCART 425 428 429zmiana

g o no ci 527wielko ci strony 94

znaki 56

roacuted onapi cia odniesienia 284sygna u 240

Kup książkę Poleć książkę

Page 37: Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8 AVR. Ukäady peryferyjne Rejestry dost pu do pami ci RAM .....513 Rejestr adresu

576 AVR Uk ady peryferyjne

cz stotliwoPWM 465taktowania koprocesora 549taktowania procesora 209taktowania rdzenia 18

czyszczenie pami ci 318

DDAC Digital to Analog Converter 293 447 451

buforowanie wyj cia 294generowanie przebiegoacutew 301jitter 303kalibracja 306napi cie referencyjne 295system zdarze 297taktowanie 296tryb dwukana owy 301wykorzystanie DMA 298wyzwalanie konwersji 305

datalogger 261 265 275DD Device Density 86debuger 183

programowy 190sprz towy 185 187

decymacja 259DEBUG 219XMEGA 260

definicja symboli globalnych 36definiowanie w asnych znakoacutew 56deklaracja zapowiadaj ca 103 337dekoder DTMF 548 556DMA 254 298 402 458 518 523dost p do

danych 358 359 568danych binarnych 356 360danych wielobajtowych 31DataFLASH 137EEPROM 128FAT 136komoacuterki 375LCD 59 62 66 68operandu 30pami ci 81 384 386 387 561pami ci SDRAM 424pliku blokowy 141portoacutew IO 30rejestroacutew IO procesora 36rejestroacutew uk adu 499SPI 95sygnatury u ytkownika 565 567wska nikoacutew 32

DQM Data Mask 375DSP Digital Signal Processor 535

DTMF 535 553dyktafon 529dynamiczna alokacja pami ci 516dyrektywa global 38dyrektywy asemblera 40dzia anie

DMA 255komparatora 280timeroacutew 400

d wi k 443

EEBI External Bus Interface 361EEPROM 207eliminacja jitteru 24emulacja RS232 139

FFAT File Allocation Table 128 131FAT32 128FATFS 180filtr

dolnoprzepustowy 491drugiego rz du 470pierwszego rz du 469trzeciego rz du 471

filtrowanie sygna u PWM 468firmware 565FLASH 207format

odpowiedzi 159polecenia 158protoko u 157

funkcja_delay_ms 17 219c_zero 42callback 106 341callback() 99DataFLASH_CSEnable 100DF_FinishBufWrite() 269disk_initialize 136disk_ioctl 181disk_status 136disk_write 138DMA_SPI_init 104DTMF_GetCode 553free_re 65GPIOR0_init 507hd44780_outcmd 51hd44780_outnibble_nowait 65LCD_defchar_P 57

Kup książkę Poleć książkę

Skorowidz 577

Menu_Click_Func 515Menu_Free 516Menu_Recorder 532Menu_Run 527MS_CreateRegEntry 117MS_GetDirPos 125MS_GetRegItem 115MS_WritePages 116 118OSC_wait_for_rdy 473RecMenu_StartStop 532sprintf 142strtok 124sysclk_init() 200 209TMF_memcpy_PF 454udi_cdc_getc() 123udi_cdc_is_rx_ready() 123VS1003_Reset 506

funkcjeanalizuj ce 556biblioteczne 50biblioteki FATFS 143j zyka C 41kontrolera ST7565R 313opoacute niaj ce 17opoacute nie 219reentrant 524specjalne kontrolera 319steruj ce 314zapisu 133

fusebit 557BODACT 560BODLEVEL 560BOOTRST 559DVSDON 560EESAVE 561JTAGEN 558RSTDISBL 559SUT 559TOSCSEL 559

fusebity w AVR-libc 571

Ggenerator obrazu composite 426generowanie

d wi ku 461kolorowego obrazu 437obrazu wideo 391przebiegoacutew 301przerwa 285sygna u composite 409

g bia koloru 326gniazdo

karty SD 156VGA 396

Hhistereza 281

IIDE 11IMA ADPCM 483informacje

o kolorze 431o obrazie 434

inicjalizacjakarty 161karty SDHC 167karty SDSC 167karty SDXC 167licznika 419pami ci 119USART 505

instrukcjaicall 42movw 35nop 13 24

interfejsSCI 498SDI 498SPI 71 79RS232 120UART 123USART 71 73

interpolacja 259interpolacja w XMEGA 260inwersja obrazu 319

Jjednostki 12jitter 24 303 420

Kkalibracja

ADC 229DAC 306 564offsetu 237

kana DMA 82 522karta 154 158

mikroSD 152SD 151 152SDHC 151 152 160SDSC 160SDXC 151 160

Kup książkę Poleć książkę

578 AVR Uk ady peryferyjne

karty pami ci 151 152 157biblioteka FATFS 180budowa 152format polecenia 158inicjalizacja 161 167komunikacja 156odczyt danych 173opcje konfiguracyjne 181rejestry specjalne 169tryby pracy 153zapis danych 176zasilanie 154

kodasemblerowy 23 24C 23dost pu 24

kodowanieμ-law 481ADPCM 483Dialogic ADPCM 494informacji 166 426koloru 425znakoacutew 536

kodyformatoacutew audio 501zdarze 545

kolejno bajtoacutew 533kolor 424 430kolorowy obraz 437komparator 422

analogowy 279 280analogowy XMEGA 282okienkowy 284

kompilacja plikoacutew binarnych 350kompilator avr-gcc 11 359kompresja

ADPCM 482 486d wi ku 480IMA ADPCM 482

komunikacja z koprocesorem 504konfiguracja

4-portowa 364biblioteki 133debugera 185DMA 459 522fusebitoacutew 570kontrolera DMA 257 452komparatoroacutew 285lockbitoacutew 570LPC 371pami ci SDRAM 381PetitFS 149pinu IO 225portoacutew IO 362

preskalera 452projektu 186przerwa 219pu apki 203rejestru EVCTRL 248rejestru PER 67SPI 75sygna u CS 377typu czcionki 324urz dze IO 189USART 76zegara 383

konsolidacja 547kontroler

DMA 254 298 402 458 518 523KS108 310ST7565R 310ndash315 321

konwersjaDAC 305sygna oacutew 396wyzwalana 306

konwertercyfrowo-analogowy 426DAC 427

koprocesormp3 496VS1003B 10

korekcja fazy 466kwantyzacja 463

Llampa CCFL 44LE Latch Enable 433licznik 419

cykli 209TCC1 400timera 20

linie IO 50linie sygna owe

MISO 72 164MOSI 72SCK 72SS 72

linker 69lista

mnemonikoacutew 24modyfikowanych rejestroacutew 32

lockbity 557 561lockbity w AVR-libc 570LPC Low Pin Count 371LPCM 443 556LSB Least Significant Bit 228

Kup książkę Poleć książkę

Skorowidz 579

a cuchy formatuj ce 212czenie plikoacutew 352

Mmagistrala pami ci zewn trznej 361magnetofon cyfrowy 528makro _SFR_IO_ADDR() 39makrodefinicja

ASSERT 214HD44780_CGADDR() 53HD44780_CLR 53HD44780_DDADDR() 53HD44780_DISPCTL() 52HD44780_ENTMODE() 52HD44780_FNSET() 52HD44780_HOME 53HD44780_SHIFT() 51LOCKBITS 571

mapowanie sygna oacutew 366mapy bitowe 343marker czasowy 268maski bitowe 329matryce 49menu 335menu piktogramowe 342mierniki temperatury 262mikrokontroler

ARM 9AVR 9PIC 9XMEGA128A3U 10

MISO 72moc wydzielana 265model psychoakustyczny 495modu

alfanumeryczny 45NVM 568Xmega eXploreGO 10Xplained ATXMEGA A3BU 10Xplained ATXMEGA-A1 10Xplained XMEGA128A1 447Xplained XMEGA256A3 94Xplained XMEGA256A3BU 97 143 266

modyfikator 30const 85volatile 28 273

monitory CRT 395monochromatyczne wy wietlacze graficzne 309monochromatyczny

tryb graficzny 416tryb tekstowy 413

MOSI 72mp3 495Msps Megasamples per second 12multiplekser wej ciowy 226 283multipleksowanie adresoacutew 368 369muzyka 439

Nnadawanie kodoacutew DTMF 540nadproacutebkowanie 258nag oacutewek kontenera wav 500nagrywanie mowy 486najmniej znacz cy bit 228napi cie

offsetu 280referencyjne 223 295zasilania 239

Oobracanie obrazu 319obraz 319

composite 426kolorowy 430wideo 391

obroacutebka d wi ku 443 445obs uga

FAT 131 143klawiatury matrycowej 24LCD 58 63 67menu 337przerwania 37 38 458przerwania DMA 525przerwa w asemblerze 39przyciskoacutew 272wy wietlaczy alfanumerycznych 45

odczytblokowy 140danych 173 358

odpowied response 159R1 159R2 159R7 160

od wie anie pami ci 376odtwarzanie

d wi ku 472muzyki 447 513 518 521

offset 238offset ADC 230okno

Breakpoints 202Call stack 209dezasemblera 210

Kup książkę Poleć książkę

580 AVR Uk ady peryferyjne

oknoIO View 207podgl du zmiennych 211wyboru czcionek 324

OLED 46opcje

kompilatora 35zapisu d wi ku 445

operacjena buforach 91odczytu 173zapisu 176zapisu strony 92

operand 29operator

ascii 41

asciz 41

byte 41

section 41opoacute nienia 13 18opoacute nienie zmienne 16optymalizacja 16 68optymalizator 26organizacja pami ci 77organizacja pami ci VRAM 316oscylator 287OSD On-Screen Display 417ostrze enie 16oszcz dzanie energii 94

Ppakiet WinAVR 48pami

CGRAM 56 57 64DataFLASH 10 77 81 113 269DDRAM 49EEPROM 111FLASH 54 124 207RAM 49SDRAM 372SRAM 63 124 329 366 371VRAM 314 317

PCLK 421PCM 443PetitFS 144 149p tla

for 13while 201

pierwsza linia obrazu 321piksel 430piktogram 342pin IO 225

plikAlloc_safeh 65DataFLASHc 83DataFLASHIOc 136definesh 50delayh 14diskioh 132 136ffh 132ffconfh 132 181hd44780h 49integerh 132ioh 30LCD_transc 61LCD-transactc 66Makefile 14Menuc 19nothingo 541outfiletxt 547 551pffh 149SPIh 104stringh 113stymulacji 191 192

pliki mp3 495elf 351fon 323o 24S 24 34binarne 350 355csv 276d wi kowe 440obiektowe 352wav 500WMA 512z czcionkami 327z danymi 349

podbijacz napi cia 315podgl d

pami ci 207stosu wywo a 209zmiennych 211znakoacutew 325

pod czeniefototranzystora 262karty SD 155LCD z kontrolerem 311modu u 50pami ci 362 369 370 373termistora 262uk adu LM35 251wyj XMEGA 398

pod wietlenieCCFL 46OLED 46

Kup książkę Poleć książkę

Skorowidz 581

podwoacutejne buforowanie 255 332 457polecenia

kasowania strony 81konfiguracyjne pami ci 82kontrolera ST7565R 315odczytu bufora 82 89odczytu pami ci 81 88SDRAM 376transferu 91

polecenieACMD41 168cd 181CID 178CMD0 165CMD8 167CSD 178date 276dir 127 181dump 276erase 276get 276HD44780_CLR 51Init 178mkdir 181

po czenieDMA ze SPI 96dwoacutech komparatoroacutew 285koprocesora mp3 497LCD z mikrokontrolerem 48wyj cia XMEGA 411XMEGA z PC 121z telewizorem 431

pomiarnapi cia zasilania 239temperatury MCU 241

port IO 30 362pozycjonowanie grafik 345poacute obraz 410precyzja pomiaroacutew 260preskaler 478preskaler ADC 243program

Atmel Data Visualizer 275Audacity 443avr-objcopy 350dataloggera 265LCD Image Converter 323makeloadingtableexe 543Realterm 127 554riffstrip 483SoX 445Tracepoint 208

programowanie sygnatury u ytkownika 566protokoacute master-slave 157

prototypy 136proacutebki d wi kowe 447proacutebkowanie

8-bitowe 300nieliniowe 480

prymitywy graficzne 330przebieg PWM 468przebiegi 289 303przechwytywanie danych 276przemiatanie wej 253przerwanie 218 254 286 403

DMA 522komparatora 286

przestrze adresowa procesora 378przesy anie

danych 498polece 498

przetaktowanie procesora 436przetwornik

ADC 221analogowo-cyfrowy 221cykliczny 222potokowy 222

przyciski 272pseudooperatory 41pu apki breakpoints 197pu apki warunkowe 205punkty ledzenia 203PWM 461 462 472

RRAS Row Address Strobe 375redukcja poboru energii 242regulacja kontrastu 321rejestr 32 34rejestr AC 50

adresu wtyczki 513BASEADDR 377CID 169CMP 251CSD 172czasu utworu 512DATA 83EVCTRL 248formatu audio 512identyfikacyjny pami ci 87INTFLAGS 252kontroli basoacutew 510kontroli g o no ci 513MUXCTRL 227OCR 168PER 67poroacutewnania 249

Kup książkę Poleć książkę

582 AVR Uk ady peryferyjne

rejestr ACSCI_CLOCKF 511stanu komparatora 287stanu pami ci 86stanu uk adu 510trybu pracy 508WINCTRL 285

rejestrydost pu do pami ci RAM 513GPIOR 502IO procesora 36mikrokontrolera 25procesora 35specjalne 94specjalne karty 169uk adu VS1003B 508

relacja rodzic ndash dziecko 336reset uk adu 534rozdzielczo

LCD 329przetwornika 231PWM 463 477

rozszerzenie HiRes 477 479roacutewnanie Steinharta-Harta 263rysowanie map bitowych 343

Sschemat uk adu dataloggera 267SCI Serial Command Interface 498SCK 72SD Secure Digital 152SDI Serial Data Interface 498separator synchronizacji 422separowanie impulsoacutew synchronizacji 422shieldy 10skaler 422skaler napi cia 283skrypt makefile 353s owo kluczowe

asm 27extern 37static 68

specyfikatory lokalizacji zmiennej 213sps samples per second 12SS Slave Select 72standard PAL 410standard VGA 393sterowanie

dataloggerem 275sygna em 379

sterownik 121HD44780 49 56LCD 49 62

stos wywo a 209

strukturaFATFS 139Handle 118LCD_trans 60 63menu 338rejestru 86SimpleFSEntry 113 116SimpleFSHandle 113 118 140submenu 527systemu plikoacutew 112

sumabitowa 571kontrolna 178

sygnacomposite 409composite video output 430CS 377DREQ 497H-Sync 396synchronizacji 423V-Sync 396zegarowy CLK 374

sygna yinterfejsu EBI 363magistrali EBI 364steruj ce 375

sygnaturaprodukcyjna procesora 563u ytkownika 565

symbol__DELAY_ROUND_CLOSEST__ 17__DELAY_ROUND_DOWN__ 17_FS_FAT12 149_FS_FAT32 149_FS_MINIMIZE 133_FS_READONLY 133_FS_RPATH 135_FS_TINY 133_MAX_SS 135_MULTI_PARTITION 135_USE_DIR 149_USE_FASTSEEK 134_USE_FORWARD 134_USE_LABEL 134_USE_LFN 134_USE_LSEEK 149_USE_MKFS 134_USE_READ 149_USE_STRFUNC 134_USE_WRITE 149_VOLUMES 136F_CPU 14 15 18increment 36USE_BUSY_FLAG 50

Kup książkę Poleć książkę

Skorowidz 583

symboleglobalne 36w asemblerze 28zewn trzne 39

symulacja 198 209symulator 190synchronizacja

pami ci 331pionowa 395pozioma 394

systemplikoacutew 111 128przerwa 404zdarze 245

szablonfont_XMEGAtmpl 326image_XMEGAtmpl 343

szum 463szybko przesy ania danych 126

ledzenie wi zki 333rodowisko

graficzne 11programistyczne 11VSIDE 542WinAVR 47

Ttabela FAT 130tablica

framebuf 402 408plugintbl 552 555tekst 208z kodem wynikowym 543

taktowanieDAC 296mikrokontrolera 473

technologia OLED 44temperatura mikrokontrolera 239 241termistor 262 290

NTC 263PTC 263

termometrLM35 249 250z alarmem 251

termostat 290test uk adu VS1003B 503testowanie obrazu 319timer 16 62

TCC0 20

TCC1 399transakcja 59 62 65transakcje 17 103ndash107transakcyjna obs uga LCD 58transakcyjny dost p do SPI 95transfer 91

danych 97wynikoacutew 254

transmisja 72 83tryb

bez znaku 234ci g ej konwersji 252czterobitowy 153dwukana owy 301graficzny 416graficzny VGA 407idle 419jednobitowy 153LPC 371monochromatyczny 397 407oszcz dzania energii 94 306pracy multipleksera 226pracy SPI 157roacute nicowy 232single slope 312SPI 153tekstowy 413tekstowy VGA 397z pojedynczym wej ciem 234ze znakiem 235

trybygenerowania PWM 467pracy karty 153pracy przetwornika 231pracy SPI 74pracy uk adu 508

twierdzenie Nyquista 258tworzenie

adresu 84nak adek 417obrazu 335tablicy 543

typ__uint24 119karty 160niekompletny 60wyliczeniowy 114

typyoperandoacutew 29w AVR 34

Kup książkę Poleć książkę

584 AVR Uk ady peryferyjne

Uuchwyt handle 64 113uk ad

AD725 427 431buforowy 294CS 361DAC 284dataloggera 267detekcji awarii zasilania 559generuj cy obraz 393HiRes 477ICL7660 47LM35 250 251SampH 293sterowania sygna em 379USART 401VS1003B 496 503 508 530 538 556VS100XX 529wzmacniania sygna u 227

uk ady peryferyjne 9uruchomienie komparatora 287urz dzenie

master 72slave 72

u rednianie 259utrata danych 141u ycie wstawki asemblerowej 33

VVGA 393

Wwarto ci kalibracyjne

ADC 564oscylatoroacutew 564temperatury 564

warunkowa kompilacja 36WE Write Enable 375wej cie composite video input 425wektor przerwa 38 257wideo 391wielko pami ci 86 377w czenie DAC 299wska nik na struktur 27wska niki 32wstawki asemblerowe 24 33wtyczka 535 541 544

SineDTMF Generator 537VGA 396

wyboacuter cz stotliwo ci PWM 465 474wykorzystanie

DMA 254 518

EuroSCART 428PWM 461rejestroacutew 34

wyliczanie predyktora 489wy wietlacze

alfanumeryczne 43 45graficzne 43 309LCD 43OLED 46

wy wietlanielitera u 213map bitowych 344obrazu 333 346 406obrazu VGA 393

wywo ania zwrotne callbacks 98asynchroniczne 101synchroniczne 101

wyzwalanie konwersji 245wzmacniacz 446wzmacniacz operacyjny 279wzmacnianie sygna u 227

XXMEGA 9 18

Zzapis

bufora 269danych 176d wi ku 440 556

zasilaniekarty 154pami ci 109

zatrzask 368zatrzask 74HC573 433zatrza ni cie adresu 369zdarzenia 297zdarzenie compare match 399zegar 383 420 426zintegrowane rodowisko programistyczne 11z cze EuroSCART 425 428 429zmiana

g o no ci 527wielko ci strony 94

znaki 56

roacuted onapi cia odniesienia 284sygna u 240

Kup książkę Poleć książkę

Page 38: Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8 AVR. Ukäady peryferyjne Rejestry dost pu do pami ci RAM .....513 Rejestr adresu

Skorowidz 577

Menu_Click_Func 515Menu_Free 516Menu_Recorder 532Menu_Run 527MS_CreateRegEntry 117MS_GetDirPos 125MS_GetRegItem 115MS_WritePages 116 118OSC_wait_for_rdy 473RecMenu_StartStop 532sprintf 142strtok 124sysclk_init() 200 209TMF_memcpy_PF 454udi_cdc_getc() 123udi_cdc_is_rx_ready() 123VS1003_Reset 506

funkcjeanalizuj ce 556biblioteczne 50biblioteki FATFS 143j zyka C 41kontrolera ST7565R 313opoacute niaj ce 17opoacute nie 219reentrant 524specjalne kontrolera 319steruj ce 314zapisu 133

fusebit 557BODACT 560BODLEVEL 560BOOTRST 559DVSDON 560EESAVE 561JTAGEN 558RSTDISBL 559SUT 559TOSCSEL 559

fusebity w AVR-libc 571

Ggenerator obrazu composite 426generowanie

d wi ku 461kolorowego obrazu 437obrazu wideo 391przebiegoacutew 301przerwa 285sygna u composite 409

g bia koloru 326gniazdo

karty SD 156VGA 396

Hhistereza 281

IIDE 11IMA ADPCM 483informacje

o kolorze 431o obrazie 434

inicjalizacjakarty 161karty SDHC 167karty SDSC 167karty SDXC 167licznika 419pami ci 119USART 505

instrukcjaicall 42movw 35nop 13 24

interfejsSCI 498SDI 498SPI 71 79RS232 120UART 123USART 71 73

interpolacja 259interpolacja w XMEGA 260inwersja obrazu 319

Jjednostki 12jitter 24 303 420

Kkalibracja

ADC 229DAC 306 564offsetu 237

kana DMA 82 522karta 154 158

mikroSD 152SD 151 152SDHC 151 152 160SDSC 160SDXC 151 160

Kup książkę Poleć książkę

578 AVR Uk ady peryferyjne

karty pami ci 151 152 157biblioteka FATFS 180budowa 152format polecenia 158inicjalizacja 161 167komunikacja 156odczyt danych 173opcje konfiguracyjne 181rejestry specjalne 169tryby pracy 153zapis danych 176zasilanie 154

kodasemblerowy 23 24C 23dost pu 24

kodowanieμ-law 481ADPCM 483Dialogic ADPCM 494informacji 166 426koloru 425znakoacutew 536

kodyformatoacutew audio 501zdarze 545

kolejno bajtoacutew 533kolor 424 430kolorowy obraz 437komparator 422

analogowy 279 280analogowy XMEGA 282okienkowy 284

kompilacja plikoacutew binarnych 350kompilator avr-gcc 11 359kompresja

ADPCM 482 486d wi ku 480IMA ADPCM 482

komunikacja z koprocesorem 504konfiguracja

4-portowa 364biblioteki 133debugera 185DMA 459 522fusebitoacutew 570kontrolera DMA 257 452komparatoroacutew 285lockbitoacutew 570LPC 371pami ci SDRAM 381PetitFS 149pinu IO 225portoacutew IO 362

preskalera 452projektu 186przerwa 219pu apki 203rejestru EVCTRL 248rejestru PER 67SPI 75sygna u CS 377typu czcionki 324urz dze IO 189USART 76zegara 383

konsolidacja 547kontroler

DMA 254 298 402 458 518 523KS108 310ST7565R 310ndash315 321

konwersjaDAC 305sygna oacutew 396wyzwalana 306

konwertercyfrowo-analogowy 426DAC 427

koprocesormp3 496VS1003B 10

korekcja fazy 466kwantyzacja 463

Llampa CCFL 44LE Latch Enable 433licznik 419

cykli 209TCC1 400timera 20

linie IO 50linie sygna owe

MISO 72 164MOSI 72SCK 72SS 72

linker 69lista

mnemonikoacutew 24modyfikowanych rejestroacutew 32

lockbity 557 561lockbity w AVR-libc 570LPC Low Pin Count 371LPCM 443 556LSB Least Significant Bit 228

Kup książkę Poleć książkę

Skorowidz 579

a cuchy formatuj ce 212czenie plikoacutew 352

Mmagistrala pami ci zewn trznej 361magnetofon cyfrowy 528makro _SFR_IO_ADDR() 39makrodefinicja

ASSERT 214HD44780_CGADDR() 53HD44780_CLR 53HD44780_DDADDR() 53HD44780_DISPCTL() 52HD44780_ENTMODE() 52HD44780_FNSET() 52HD44780_HOME 53HD44780_SHIFT() 51LOCKBITS 571

mapowanie sygna oacutew 366mapy bitowe 343marker czasowy 268maski bitowe 329matryce 49menu 335menu piktogramowe 342mierniki temperatury 262mikrokontroler

ARM 9AVR 9PIC 9XMEGA128A3U 10

MISO 72moc wydzielana 265model psychoakustyczny 495modu

alfanumeryczny 45NVM 568Xmega eXploreGO 10Xplained ATXMEGA A3BU 10Xplained ATXMEGA-A1 10Xplained XMEGA128A1 447Xplained XMEGA256A3 94Xplained XMEGA256A3BU 97 143 266

modyfikator 30const 85volatile 28 273

monitory CRT 395monochromatyczne wy wietlacze graficzne 309monochromatyczny

tryb graficzny 416tryb tekstowy 413

MOSI 72mp3 495Msps Megasamples per second 12multiplekser wej ciowy 226 283multipleksowanie adresoacutew 368 369muzyka 439

Nnadawanie kodoacutew DTMF 540nadproacutebkowanie 258nag oacutewek kontenera wav 500nagrywanie mowy 486najmniej znacz cy bit 228napi cie

offsetu 280referencyjne 223 295zasilania 239

Oobracanie obrazu 319obraz 319

composite 426kolorowy 430wideo 391

obroacutebka d wi ku 443 445obs uga

FAT 131 143klawiatury matrycowej 24LCD 58 63 67menu 337przerwania 37 38 458przerwania DMA 525przerwa w asemblerze 39przyciskoacutew 272wy wietlaczy alfanumerycznych 45

odczytblokowy 140danych 173 358

odpowied response 159R1 159R2 159R7 160

od wie anie pami ci 376odtwarzanie

d wi ku 472muzyki 447 513 518 521

offset 238offset ADC 230okno

Breakpoints 202Call stack 209dezasemblera 210

Kup książkę Poleć książkę

580 AVR Uk ady peryferyjne

oknoIO View 207podgl du zmiennych 211wyboru czcionek 324

OLED 46opcje

kompilatora 35zapisu d wi ku 445

operacjena buforach 91odczytu 173zapisu 176zapisu strony 92

operand 29operator

ascii 41

asciz 41

byte 41

section 41opoacute nienia 13 18opoacute nienie zmienne 16optymalizacja 16 68optymalizator 26organizacja pami ci 77organizacja pami ci VRAM 316oscylator 287OSD On-Screen Display 417ostrze enie 16oszcz dzanie energii 94

Ppakiet WinAVR 48pami

CGRAM 56 57 64DataFLASH 10 77 81 113 269DDRAM 49EEPROM 111FLASH 54 124 207RAM 49SDRAM 372SRAM 63 124 329 366 371VRAM 314 317

PCLK 421PCM 443PetitFS 144 149p tla

for 13while 201

pierwsza linia obrazu 321piksel 430piktogram 342pin IO 225

plikAlloc_safeh 65DataFLASHc 83DataFLASHIOc 136definesh 50delayh 14diskioh 132 136ffh 132ffconfh 132 181hd44780h 49integerh 132ioh 30LCD_transc 61LCD-transactc 66Makefile 14Menuc 19nothingo 541outfiletxt 547 551pffh 149SPIh 104stringh 113stymulacji 191 192

pliki mp3 495elf 351fon 323o 24S 24 34binarne 350 355csv 276d wi kowe 440obiektowe 352wav 500WMA 512z czcionkami 327z danymi 349

podbijacz napi cia 315podgl d

pami ci 207stosu wywo a 209zmiennych 211znakoacutew 325

pod czeniefototranzystora 262karty SD 155LCD z kontrolerem 311modu u 50pami ci 362 369 370 373termistora 262uk adu LM35 251wyj XMEGA 398

pod wietlenieCCFL 46OLED 46

Kup książkę Poleć książkę

Skorowidz 581

podwoacutejne buforowanie 255 332 457polecenia

kasowania strony 81konfiguracyjne pami ci 82kontrolera ST7565R 315odczytu bufora 82 89odczytu pami ci 81 88SDRAM 376transferu 91

polecenieACMD41 168cd 181CID 178CMD0 165CMD8 167CSD 178date 276dir 127 181dump 276erase 276get 276HD44780_CLR 51Init 178mkdir 181

po czenieDMA ze SPI 96dwoacutech komparatoroacutew 285koprocesora mp3 497LCD z mikrokontrolerem 48wyj cia XMEGA 411XMEGA z PC 121z telewizorem 431

pomiarnapi cia zasilania 239temperatury MCU 241

port IO 30 362pozycjonowanie grafik 345poacute obraz 410precyzja pomiaroacutew 260preskaler 478preskaler ADC 243program

Atmel Data Visualizer 275Audacity 443avr-objcopy 350dataloggera 265LCD Image Converter 323makeloadingtableexe 543Realterm 127 554riffstrip 483SoX 445Tracepoint 208

programowanie sygnatury u ytkownika 566protokoacute master-slave 157

prototypy 136proacutebki d wi kowe 447proacutebkowanie

8-bitowe 300nieliniowe 480

prymitywy graficzne 330przebieg PWM 468przebiegi 289 303przechwytywanie danych 276przemiatanie wej 253przerwanie 218 254 286 403

DMA 522komparatora 286

przestrze adresowa procesora 378przesy anie

danych 498polece 498

przetaktowanie procesora 436przetwornik

ADC 221analogowo-cyfrowy 221cykliczny 222potokowy 222

przyciski 272pseudooperatory 41pu apki breakpoints 197pu apki warunkowe 205punkty ledzenia 203PWM 461 462 472

RRAS Row Address Strobe 375redukcja poboru energii 242regulacja kontrastu 321rejestr 32 34rejestr AC 50

adresu wtyczki 513BASEADDR 377CID 169CMP 251CSD 172czasu utworu 512DATA 83EVCTRL 248formatu audio 512identyfikacyjny pami ci 87INTFLAGS 252kontroli basoacutew 510kontroli g o no ci 513MUXCTRL 227OCR 168PER 67poroacutewnania 249

Kup książkę Poleć książkę

582 AVR Uk ady peryferyjne

rejestr ACSCI_CLOCKF 511stanu komparatora 287stanu pami ci 86stanu uk adu 510trybu pracy 508WINCTRL 285

rejestrydost pu do pami ci RAM 513GPIOR 502IO procesora 36mikrokontrolera 25procesora 35specjalne 94specjalne karty 169uk adu VS1003B 508

relacja rodzic ndash dziecko 336reset uk adu 534rozdzielczo

LCD 329przetwornika 231PWM 463 477

rozszerzenie HiRes 477 479roacutewnanie Steinharta-Harta 263rysowanie map bitowych 343

Sschemat uk adu dataloggera 267SCI Serial Command Interface 498SCK 72SD Secure Digital 152SDI Serial Data Interface 498separator synchronizacji 422separowanie impulsoacutew synchronizacji 422shieldy 10skaler 422skaler napi cia 283skrypt makefile 353s owo kluczowe

asm 27extern 37static 68

specyfikatory lokalizacji zmiennej 213sps samples per second 12SS Slave Select 72standard PAL 410standard VGA 393sterowanie

dataloggerem 275sygna em 379

sterownik 121HD44780 49 56LCD 49 62

stos wywo a 209

strukturaFATFS 139Handle 118LCD_trans 60 63menu 338rejestru 86SimpleFSEntry 113 116SimpleFSHandle 113 118 140submenu 527systemu plikoacutew 112

sumabitowa 571kontrolna 178

sygnacomposite 409composite video output 430CS 377DREQ 497H-Sync 396synchronizacji 423V-Sync 396zegarowy CLK 374

sygna yinterfejsu EBI 363magistrali EBI 364steruj ce 375

sygnaturaprodukcyjna procesora 563u ytkownika 565

symbol__DELAY_ROUND_CLOSEST__ 17__DELAY_ROUND_DOWN__ 17_FS_FAT12 149_FS_FAT32 149_FS_MINIMIZE 133_FS_READONLY 133_FS_RPATH 135_FS_TINY 133_MAX_SS 135_MULTI_PARTITION 135_USE_DIR 149_USE_FASTSEEK 134_USE_FORWARD 134_USE_LABEL 134_USE_LFN 134_USE_LSEEK 149_USE_MKFS 134_USE_READ 149_USE_STRFUNC 134_USE_WRITE 149_VOLUMES 136F_CPU 14 15 18increment 36USE_BUSY_FLAG 50

Kup książkę Poleć książkę

Skorowidz 583

symboleglobalne 36w asemblerze 28zewn trzne 39

symulacja 198 209symulator 190synchronizacja

pami ci 331pionowa 395pozioma 394

systemplikoacutew 111 128przerwa 404zdarze 245

szablonfont_XMEGAtmpl 326image_XMEGAtmpl 343

szum 463szybko przesy ania danych 126

ledzenie wi zki 333rodowisko

graficzne 11programistyczne 11VSIDE 542WinAVR 47

Ttabela FAT 130tablica

framebuf 402 408plugintbl 552 555tekst 208z kodem wynikowym 543

taktowanieDAC 296mikrokontrolera 473

technologia OLED 44temperatura mikrokontrolera 239 241termistor 262 290

NTC 263PTC 263

termometrLM35 249 250z alarmem 251

termostat 290test uk adu VS1003B 503testowanie obrazu 319timer 16 62

TCC0 20

TCC1 399transakcja 59 62 65transakcje 17 103ndash107transakcyjna obs uga LCD 58transakcyjny dost p do SPI 95transfer 91

danych 97wynikoacutew 254

transmisja 72 83tryb

bez znaku 234ci g ej konwersji 252czterobitowy 153dwukana owy 301graficzny 416graficzny VGA 407idle 419jednobitowy 153LPC 371monochromatyczny 397 407oszcz dzania energii 94 306pracy multipleksera 226pracy SPI 157roacute nicowy 232single slope 312SPI 153tekstowy 413tekstowy VGA 397z pojedynczym wej ciem 234ze znakiem 235

trybygenerowania PWM 467pracy karty 153pracy przetwornika 231pracy SPI 74pracy uk adu 508

twierdzenie Nyquista 258tworzenie

adresu 84nak adek 417obrazu 335tablicy 543

typ__uint24 119karty 160niekompletny 60wyliczeniowy 114

typyoperandoacutew 29w AVR 34

Kup książkę Poleć książkę

584 AVR Uk ady peryferyjne

Uuchwyt handle 64 113uk ad

AD725 427 431buforowy 294CS 361DAC 284dataloggera 267detekcji awarii zasilania 559generuj cy obraz 393HiRes 477ICL7660 47LM35 250 251SampH 293sterowania sygna em 379USART 401VS1003B 496 503 508 530 538 556VS100XX 529wzmacniania sygna u 227

uk ady peryferyjne 9uruchomienie komparatora 287urz dzenie

master 72slave 72

u rednianie 259utrata danych 141u ycie wstawki asemblerowej 33

VVGA 393

Wwarto ci kalibracyjne

ADC 564oscylatoroacutew 564temperatury 564

warunkowa kompilacja 36WE Write Enable 375wej cie composite video input 425wektor przerwa 38 257wideo 391wielko pami ci 86 377w czenie DAC 299wska nik na struktur 27wska niki 32wstawki asemblerowe 24 33wtyczka 535 541 544

SineDTMF Generator 537VGA 396

wyboacuter cz stotliwo ci PWM 465 474wykorzystanie

DMA 254 518

EuroSCART 428PWM 461rejestroacutew 34

wyliczanie predyktora 489wy wietlacze

alfanumeryczne 43 45graficzne 43 309LCD 43OLED 46

wy wietlanielitera u 213map bitowych 344obrazu 333 346 406obrazu VGA 393

wywo ania zwrotne callbacks 98asynchroniczne 101synchroniczne 101

wyzwalanie konwersji 245wzmacniacz 446wzmacniacz operacyjny 279wzmacnianie sygna u 227

XXMEGA 9 18

Zzapis

bufora 269danych 176d wi ku 440 556

zasilaniekarty 154pami ci 109

zatrzask 368zatrzask 74HC573 433zatrza ni cie adresu 369zdarzenia 297zdarzenie compare match 399zegar 383 420 426zintegrowane rodowisko programistyczne 11z cze EuroSCART 425 428 429zmiana

g o no ci 527wielko ci strony 94

znaki 56

roacuted onapi cia odniesienia 284sygna u 240

Kup książkę Poleć książkę

Page 39: Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8 AVR. Ukäady peryferyjne Rejestry dost pu do pami ci RAM .....513 Rejestr adresu

578 AVR Uk ady peryferyjne

karty pami ci 151 152 157biblioteka FATFS 180budowa 152format polecenia 158inicjalizacja 161 167komunikacja 156odczyt danych 173opcje konfiguracyjne 181rejestry specjalne 169tryby pracy 153zapis danych 176zasilanie 154

kodasemblerowy 23 24C 23dost pu 24

kodowanieμ-law 481ADPCM 483Dialogic ADPCM 494informacji 166 426koloru 425znakoacutew 536

kodyformatoacutew audio 501zdarze 545

kolejno bajtoacutew 533kolor 424 430kolorowy obraz 437komparator 422

analogowy 279 280analogowy XMEGA 282okienkowy 284

kompilacja plikoacutew binarnych 350kompilator avr-gcc 11 359kompresja

ADPCM 482 486d wi ku 480IMA ADPCM 482

komunikacja z koprocesorem 504konfiguracja

4-portowa 364biblioteki 133debugera 185DMA 459 522fusebitoacutew 570kontrolera DMA 257 452komparatoroacutew 285lockbitoacutew 570LPC 371pami ci SDRAM 381PetitFS 149pinu IO 225portoacutew IO 362

preskalera 452projektu 186przerwa 219pu apki 203rejestru EVCTRL 248rejestru PER 67SPI 75sygna u CS 377typu czcionki 324urz dze IO 189USART 76zegara 383

konsolidacja 547kontroler

DMA 254 298 402 458 518 523KS108 310ST7565R 310ndash315 321

konwersjaDAC 305sygna oacutew 396wyzwalana 306

konwertercyfrowo-analogowy 426DAC 427

koprocesormp3 496VS1003B 10

korekcja fazy 466kwantyzacja 463

Llampa CCFL 44LE Latch Enable 433licznik 419

cykli 209TCC1 400timera 20

linie IO 50linie sygna owe

MISO 72 164MOSI 72SCK 72SS 72

linker 69lista

mnemonikoacutew 24modyfikowanych rejestroacutew 32

lockbity 557 561lockbity w AVR-libc 570LPC Low Pin Count 371LPCM 443 556LSB Least Significant Bit 228

Kup książkę Poleć książkę

Skorowidz 579

a cuchy formatuj ce 212czenie plikoacutew 352

Mmagistrala pami ci zewn trznej 361magnetofon cyfrowy 528makro _SFR_IO_ADDR() 39makrodefinicja

ASSERT 214HD44780_CGADDR() 53HD44780_CLR 53HD44780_DDADDR() 53HD44780_DISPCTL() 52HD44780_ENTMODE() 52HD44780_FNSET() 52HD44780_HOME 53HD44780_SHIFT() 51LOCKBITS 571

mapowanie sygna oacutew 366mapy bitowe 343marker czasowy 268maski bitowe 329matryce 49menu 335menu piktogramowe 342mierniki temperatury 262mikrokontroler

ARM 9AVR 9PIC 9XMEGA128A3U 10

MISO 72moc wydzielana 265model psychoakustyczny 495modu

alfanumeryczny 45NVM 568Xmega eXploreGO 10Xplained ATXMEGA A3BU 10Xplained ATXMEGA-A1 10Xplained XMEGA128A1 447Xplained XMEGA256A3 94Xplained XMEGA256A3BU 97 143 266

modyfikator 30const 85volatile 28 273

monitory CRT 395monochromatyczne wy wietlacze graficzne 309monochromatyczny

tryb graficzny 416tryb tekstowy 413

MOSI 72mp3 495Msps Megasamples per second 12multiplekser wej ciowy 226 283multipleksowanie adresoacutew 368 369muzyka 439

Nnadawanie kodoacutew DTMF 540nadproacutebkowanie 258nag oacutewek kontenera wav 500nagrywanie mowy 486najmniej znacz cy bit 228napi cie

offsetu 280referencyjne 223 295zasilania 239

Oobracanie obrazu 319obraz 319

composite 426kolorowy 430wideo 391

obroacutebka d wi ku 443 445obs uga

FAT 131 143klawiatury matrycowej 24LCD 58 63 67menu 337przerwania 37 38 458przerwania DMA 525przerwa w asemblerze 39przyciskoacutew 272wy wietlaczy alfanumerycznych 45

odczytblokowy 140danych 173 358

odpowied response 159R1 159R2 159R7 160

od wie anie pami ci 376odtwarzanie

d wi ku 472muzyki 447 513 518 521

offset 238offset ADC 230okno

Breakpoints 202Call stack 209dezasemblera 210

Kup książkę Poleć książkę

580 AVR Uk ady peryferyjne

oknoIO View 207podgl du zmiennych 211wyboru czcionek 324

OLED 46opcje

kompilatora 35zapisu d wi ku 445

operacjena buforach 91odczytu 173zapisu 176zapisu strony 92

operand 29operator

ascii 41

asciz 41

byte 41

section 41opoacute nienia 13 18opoacute nienie zmienne 16optymalizacja 16 68optymalizator 26organizacja pami ci 77organizacja pami ci VRAM 316oscylator 287OSD On-Screen Display 417ostrze enie 16oszcz dzanie energii 94

Ppakiet WinAVR 48pami

CGRAM 56 57 64DataFLASH 10 77 81 113 269DDRAM 49EEPROM 111FLASH 54 124 207RAM 49SDRAM 372SRAM 63 124 329 366 371VRAM 314 317

PCLK 421PCM 443PetitFS 144 149p tla

for 13while 201

pierwsza linia obrazu 321piksel 430piktogram 342pin IO 225

plikAlloc_safeh 65DataFLASHc 83DataFLASHIOc 136definesh 50delayh 14diskioh 132 136ffh 132ffconfh 132 181hd44780h 49integerh 132ioh 30LCD_transc 61LCD-transactc 66Makefile 14Menuc 19nothingo 541outfiletxt 547 551pffh 149SPIh 104stringh 113stymulacji 191 192

pliki mp3 495elf 351fon 323o 24S 24 34binarne 350 355csv 276d wi kowe 440obiektowe 352wav 500WMA 512z czcionkami 327z danymi 349

podbijacz napi cia 315podgl d

pami ci 207stosu wywo a 209zmiennych 211znakoacutew 325

pod czeniefototranzystora 262karty SD 155LCD z kontrolerem 311modu u 50pami ci 362 369 370 373termistora 262uk adu LM35 251wyj XMEGA 398

pod wietlenieCCFL 46OLED 46

Kup książkę Poleć książkę

Skorowidz 581

podwoacutejne buforowanie 255 332 457polecenia

kasowania strony 81konfiguracyjne pami ci 82kontrolera ST7565R 315odczytu bufora 82 89odczytu pami ci 81 88SDRAM 376transferu 91

polecenieACMD41 168cd 181CID 178CMD0 165CMD8 167CSD 178date 276dir 127 181dump 276erase 276get 276HD44780_CLR 51Init 178mkdir 181

po czenieDMA ze SPI 96dwoacutech komparatoroacutew 285koprocesora mp3 497LCD z mikrokontrolerem 48wyj cia XMEGA 411XMEGA z PC 121z telewizorem 431

pomiarnapi cia zasilania 239temperatury MCU 241

port IO 30 362pozycjonowanie grafik 345poacute obraz 410precyzja pomiaroacutew 260preskaler 478preskaler ADC 243program

Atmel Data Visualizer 275Audacity 443avr-objcopy 350dataloggera 265LCD Image Converter 323makeloadingtableexe 543Realterm 127 554riffstrip 483SoX 445Tracepoint 208

programowanie sygnatury u ytkownika 566protokoacute master-slave 157

prototypy 136proacutebki d wi kowe 447proacutebkowanie

8-bitowe 300nieliniowe 480

prymitywy graficzne 330przebieg PWM 468przebiegi 289 303przechwytywanie danych 276przemiatanie wej 253przerwanie 218 254 286 403

DMA 522komparatora 286

przestrze adresowa procesora 378przesy anie

danych 498polece 498

przetaktowanie procesora 436przetwornik

ADC 221analogowo-cyfrowy 221cykliczny 222potokowy 222

przyciski 272pseudooperatory 41pu apki breakpoints 197pu apki warunkowe 205punkty ledzenia 203PWM 461 462 472

RRAS Row Address Strobe 375redukcja poboru energii 242regulacja kontrastu 321rejestr 32 34rejestr AC 50

adresu wtyczki 513BASEADDR 377CID 169CMP 251CSD 172czasu utworu 512DATA 83EVCTRL 248formatu audio 512identyfikacyjny pami ci 87INTFLAGS 252kontroli basoacutew 510kontroli g o no ci 513MUXCTRL 227OCR 168PER 67poroacutewnania 249

Kup książkę Poleć książkę

582 AVR Uk ady peryferyjne

rejestr ACSCI_CLOCKF 511stanu komparatora 287stanu pami ci 86stanu uk adu 510trybu pracy 508WINCTRL 285

rejestrydost pu do pami ci RAM 513GPIOR 502IO procesora 36mikrokontrolera 25procesora 35specjalne 94specjalne karty 169uk adu VS1003B 508

relacja rodzic ndash dziecko 336reset uk adu 534rozdzielczo

LCD 329przetwornika 231PWM 463 477

rozszerzenie HiRes 477 479roacutewnanie Steinharta-Harta 263rysowanie map bitowych 343

Sschemat uk adu dataloggera 267SCI Serial Command Interface 498SCK 72SD Secure Digital 152SDI Serial Data Interface 498separator synchronizacji 422separowanie impulsoacutew synchronizacji 422shieldy 10skaler 422skaler napi cia 283skrypt makefile 353s owo kluczowe

asm 27extern 37static 68

specyfikatory lokalizacji zmiennej 213sps samples per second 12SS Slave Select 72standard PAL 410standard VGA 393sterowanie

dataloggerem 275sygna em 379

sterownik 121HD44780 49 56LCD 49 62

stos wywo a 209

strukturaFATFS 139Handle 118LCD_trans 60 63menu 338rejestru 86SimpleFSEntry 113 116SimpleFSHandle 113 118 140submenu 527systemu plikoacutew 112

sumabitowa 571kontrolna 178

sygnacomposite 409composite video output 430CS 377DREQ 497H-Sync 396synchronizacji 423V-Sync 396zegarowy CLK 374

sygna yinterfejsu EBI 363magistrali EBI 364steruj ce 375

sygnaturaprodukcyjna procesora 563u ytkownika 565

symbol__DELAY_ROUND_CLOSEST__ 17__DELAY_ROUND_DOWN__ 17_FS_FAT12 149_FS_FAT32 149_FS_MINIMIZE 133_FS_READONLY 133_FS_RPATH 135_FS_TINY 133_MAX_SS 135_MULTI_PARTITION 135_USE_DIR 149_USE_FASTSEEK 134_USE_FORWARD 134_USE_LABEL 134_USE_LFN 134_USE_LSEEK 149_USE_MKFS 134_USE_READ 149_USE_STRFUNC 134_USE_WRITE 149_VOLUMES 136F_CPU 14 15 18increment 36USE_BUSY_FLAG 50

Kup książkę Poleć książkę

Skorowidz 583

symboleglobalne 36w asemblerze 28zewn trzne 39

symulacja 198 209symulator 190synchronizacja

pami ci 331pionowa 395pozioma 394

systemplikoacutew 111 128przerwa 404zdarze 245

szablonfont_XMEGAtmpl 326image_XMEGAtmpl 343

szum 463szybko przesy ania danych 126

ledzenie wi zki 333rodowisko

graficzne 11programistyczne 11VSIDE 542WinAVR 47

Ttabela FAT 130tablica

framebuf 402 408plugintbl 552 555tekst 208z kodem wynikowym 543

taktowanieDAC 296mikrokontrolera 473

technologia OLED 44temperatura mikrokontrolera 239 241termistor 262 290

NTC 263PTC 263

termometrLM35 249 250z alarmem 251

termostat 290test uk adu VS1003B 503testowanie obrazu 319timer 16 62

TCC0 20

TCC1 399transakcja 59 62 65transakcje 17 103ndash107transakcyjna obs uga LCD 58transakcyjny dost p do SPI 95transfer 91

danych 97wynikoacutew 254

transmisja 72 83tryb

bez znaku 234ci g ej konwersji 252czterobitowy 153dwukana owy 301graficzny 416graficzny VGA 407idle 419jednobitowy 153LPC 371monochromatyczny 397 407oszcz dzania energii 94 306pracy multipleksera 226pracy SPI 157roacute nicowy 232single slope 312SPI 153tekstowy 413tekstowy VGA 397z pojedynczym wej ciem 234ze znakiem 235

trybygenerowania PWM 467pracy karty 153pracy przetwornika 231pracy SPI 74pracy uk adu 508

twierdzenie Nyquista 258tworzenie

adresu 84nak adek 417obrazu 335tablicy 543

typ__uint24 119karty 160niekompletny 60wyliczeniowy 114

typyoperandoacutew 29w AVR 34

Kup książkę Poleć książkę

584 AVR Uk ady peryferyjne

Uuchwyt handle 64 113uk ad

AD725 427 431buforowy 294CS 361DAC 284dataloggera 267detekcji awarii zasilania 559generuj cy obraz 393HiRes 477ICL7660 47LM35 250 251SampH 293sterowania sygna em 379USART 401VS1003B 496 503 508 530 538 556VS100XX 529wzmacniania sygna u 227

uk ady peryferyjne 9uruchomienie komparatora 287urz dzenie

master 72slave 72

u rednianie 259utrata danych 141u ycie wstawki asemblerowej 33

VVGA 393

Wwarto ci kalibracyjne

ADC 564oscylatoroacutew 564temperatury 564

warunkowa kompilacja 36WE Write Enable 375wej cie composite video input 425wektor przerwa 38 257wideo 391wielko pami ci 86 377w czenie DAC 299wska nik na struktur 27wska niki 32wstawki asemblerowe 24 33wtyczka 535 541 544

SineDTMF Generator 537VGA 396

wyboacuter cz stotliwo ci PWM 465 474wykorzystanie

DMA 254 518

EuroSCART 428PWM 461rejestroacutew 34

wyliczanie predyktora 489wy wietlacze

alfanumeryczne 43 45graficzne 43 309LCD 43OLED 46

wy wietlanielitera u 213map bitowych 344obrazu 333 346 406obrazu VGA 393

wywo ania zwrotne callbacks 98asynchroniczne 101synchroniczne 101

wyzwalanie konwersji 245wzmacniacz 446wzmacniacz operacyjny 279wzmacnianie sygna u 227

XXMEGA 9 18

Zzapis

bufora 269danych 176d wi ku 440 556

zasilaniekarty 154pami ci 109

zatrzask 368zatrzask 74HC573 433zatrza ni cie adresu 369zdarzenia 297zdarzenie compare match 399zegar 383 420 426zintegrowane rodowisko programistyczne 11z cze EuroSCART 425 428 429zmiana

g o no ci 527wielko ci strony 94

znaki 56

roacuted onapi cia odniesienia 284sygna u 240

Kup książkę Poleć książkę

Page 40: Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8 AVR. Ukäady peryferyjne Rejestry dost pu do pami ci RAM .....513 Rejestr adresu

Skorowidz 579

a cuchy formatuj ce 212czenie plikoacutew 352

Mmagistrala pami ci zewn trznej 361magnetofon cyfrowy 528makro _SFR_IO_ADDR() 39makrodefinicja

ASSERT 214HD44780_CGADDR() 53HD44780_CLR 53HD44780_DDADDR() 53HD44780_DISPCTL() 52HD44780_ENTMODE() 52HD44780_FNSET() 52HD44780_HOME 53HD44780_SHIFT() 51LOCKBITS 571

mapowanie sygna oacutew 366mapy bitowe 343marker czasowy 268maski bitowe 329matryce 49menu 335menu piktogramowe 342mierniki temperatury 262mikrokontroler

ARM 9AVR 9PIC 9XMEGA128A3U 10

MISO 72moc wydzielana 265model psychoakustyczny 495modu

alfanumeryczny 45NVM 568Xmega eXploreGO 10Xplained ATXMEGA A3BU 10Xplained ATXMEGA-A1 10Xplained XMEGA128A1 447Xplained XMEGA256A3 94Xplained XMEGA256A3BU 97 143 266

modyfikator 30const 85volatile 28 273

monitory CRT 395monochromatyczne wy wietlacze graficzne 309monochromatyczny

tryb graficzny 416tryb tekstowy 413

MOSI 72mp3 495Msps Megasamples per second 12multiplekser wej ciowy 226 283multipleksowanie adresoacutew 368 369muzyka 439

Nnadawanie kodoacutew DTMF 540nadproacutebkowanie 258nag oacutewek kontenera wav 500nagrywanie mowy 486najmniej znacz cy bit 228napi cie

offsetu 280referencyjne 223 295zasilania 239

Oobracanie obrazu 319obraz 319

composite 426kolorowy 430wideo 391

obroacutebka d wi ku 443 445obs uga

FAT 131 143klawiatury matrycowej 24LCD 58 63 67menu 337przerwania 37 38 458przerwania DMA 525przerwa w asemblerze 39przyciskoacutew 272wy wietlaczy alfanumerycznych 45

odczytblokowy 140danych 173 358

odpowied response 159R1 159R2 159R7 160

od wie anie pami ci 376odtwarzanie

d wi ku 472muzyki 447 513 518 521

offset 238offset ADC 230okno

Breakpoints 202Call stack 209dezasemblera 210

Kup książkę Poleć książkę

580 AVR Uk ady peryferyjne

oknoIO View 207podgl du zmiennych 211wyboru czcionek 324

OLED 46opcje

kompilatora 35zapisu d wi ku 445

operacjena buforach 91odczytu 173zapisu 176zapisu strony 92

operand 29operator

ascii 41

asciz 41

byte 41

section 41opoacute nienia 13 18opoacute nienie zmienne 16optymalizacja 16 68optymalizator 26organizacja pami ci 77organizacja pami ci VRAM 316oscylator 287OSD On-Screen Display 417ostrze enie 16oszcz dzanie energii 94

Ppakiet WinAVR 48pami

CGRAM 56 57 64DataFLASH 10 77 81 113 269DDRAM 49EEPROM 111FLASH 54 124 207RAM 49SDRAM 372SRAM 63 124 329 366 371VRAM 314 317

PCLK 421PCM 443PetitFS 144 149p tla

for 13while 201

pierwsza linia obrazu 321piksel 430piktogram 342pin IO 225

plikAlloc_safeh 65DataFLASHc 83DataFLASHIOc 136definesh 50delayh 14diskioh 132 136ffh 132ffconfh 132 181hd44780h 49integerh 132ioh 30LCD_transc 61LCD-transactc 66Makefile 14Menuc 19nothingo 541outfiletxt 547 551pffh 149SPIh 104stringh 113stymulacji 191 192

pliki mp3 495elf 351fon 323o 24S 24 34binarne 350 355csv 276d wi kowe 440obiektowe 352wav 500WMA 512z czcionkami 327z danymi 349

podbijacz napi cia 315podgl d

pami ci 207stosu wywo a 209zmiennych 211znakoacutew 325

pod czeniefototranzystora 262karty SD 155LCD z kontrolerem 311modu u 50pami ci 362 369 370 373termistora 262uk adu LM35 251wyj XMEGA 398

pod wietlenieCCFL 46OLED 46

Kup książkę Poleć książkę

Skorowidz 581

podwoacutejne buforowanie 255 332 457polecenia

kasowania strony 81konfiguracyjne pami ci 82kontrolera ST7565R 315odczytu bufora 82 89odczytu pami ci 81 88SDRAM 376transferu 91

polecenieACMD41 168cd 181CID 178CMD0 165CMD8 167CSD 178date 276dir 127 181dump 276erase 276get 276HD44780_CLR 51Init 178mkdir 181

po czenieDMA ze SPI 96dwoacutech komparatoroacutew 285koprocesora mp3 497LCD z mikrokontrolerem 48wyj cia XMEGA 411XMEGA z PC 121z telewizorem 431

pomiarnapi cia zasilania 239temperatury MCU 241

port IO 30 362pozycjonowanie grafik 345poacute obraz 410precyzja pomiaroacutew 260preskaler 478preskaler ADC 243program

Atmel Data Visualizer 275Audacity 443avr-objcopy 350dataloggera 265LCD Image Converter 323makeloadingtableexe 543Realterm 127 554riffstrip 483SoX 445Tracepoint 208

programowanie sygnatury u ytkownika 566protokoacute master-slave 157

prototypy 136proacutebki d wi kowe 447proacutebkowanie

8-bitowe 300nieliniowe 480

prymitywy graficzne 330przebieg PWM 468przebiegi 289 303przechwytywanie danych 276przemiatanie wej 253przerwanie 218 254 286 403

DMA 522komparatora 286

przestrze adresowa procesora 378przesy anie

danych 498polece 498

przetaktowanie procesora 436przetwornik

ADC 221analogowo-cyfrowy 221cykliczny 222potokowy 222

przyciski 272pseudooperatory 41pu apki breakpoints 197pu apki warunkowe 205punkty ledzenia 203PWM 461 462 472

RRAS Row Address Strobe 375redukcja poboru energii 242regulacja kontrastu 321rejestr 32 34rejestr AC 50

adresu wtyczki 513BASEADDR 377CID 169CMP 251CSD 172czasu utworu 512DATA 83EVCTRL 248formatu audio 512identyfikacyjny pami ci 87INTFLAGS 252kontroli basoacutew 510kontroli g o no ci 513MUXCTRL 227OCR 168PER 67poroacutewnania 249

Kup książkę Poleć książkę

582 AVR Uk ady peryferyjne

rejestr ACSCI_CLOCKF 511stanu komparatora 287stanu pami ci 86stanu uk adu 510trybu pracy 508WINCTRL 285

rejestrydost pu do pami ci RAM 513GPIOR 502IO procesora 36mikrokontrolera 25procesora 35specjalne 94specjalne karty 169uk adu VS1003B 508

relacja rodzic ndash dziecko 336reset uk adu 534rozdzielczo

LCD 329przetwornika 231PWM 463 477

rozszerzenie HiRes 477 479roacutewnanie Steinharta-Harta 263rysowanie map bitowych 343

Sschemat uk adu dataloggera 267SCI Serial Command Interface 498SCK 72SD Secure Digital 152SDI Serial Data Interface 498separator synchronizacji 422separowanie impulsoacutew synchronizacji 422shieldy 10skaler 422skaler napi cia 283skrypt makefile 353s owo kluczowe

asm 27extern 37static 68

specyfikatory lokalizacji zmiennej 213sps samples per second 12SS Slave Select 72standard PAL 410standard VGA 393sterowanie

dataloggerem 275sygna em 379

sterownik 121HD44780 49 56LCD 49 62

stos wywo a 209

strukturaFATFS 139Handle 118LCD_trans 60 63menu 338rejestru 86SimpleFSEntry 113 116SimpleFSHandle 113 118 140submenu 527systemu plikoacutew 112

sumabitowa 571kontrolna 178

sygnacomposite 409composite video output 430CS 377DREQ 497H-Sync 396synchronizacji 423V-Sync 396zegarowy CLK 374

sygna yinterfejsu EBI 363magistrali EBI 364steruj ce 375

sygnaturaprodukcyjna procesora 563u ytkownika 565

symbol__DELAY_ROUND_CLOSEST__ 17__DELAY_ROUND_DOWN__ 17_FS_FAT12 149_FS_FAT32 149_FS_MINIMIZE 133_FS_READONLY 133_FS_RPATH 135_FS_TINY 133_MAX_SS 135_MULTI_PARTITION 135_USE_DIR 149_USE_FASTSEEK 134_USE_FORWARD 134_USE_LABEL 134_USE_LFN 134_USE_LSEEK 149_USE_MKFS 134_USE_READ 149_USE_STRFUNC 134_USE_WRITE 149_VOLUMES 136F_CPU 14 15 18increment 36USE_BUSY_FLAG 50

Kup książkę Poleć książkę

Skorowidz 583

symboleglobalne 36w asemblerze 28zewn trzne 39

symulacja 198 209symulator 190synchronizacja

pami ci 331pionowa 395pozioma 394

systemplikoacutew 111 128przerwa 404zdarze 245

szablonfont_XMEGAtmpl 326image_XMEGAtmpl 343

szum 463szybko przesy ania danych 126

ledzenie wi zki 333rodowisko

graficzne 11programistyczne 11VSIDE 542WinAVR 47

Ttabela FAT 130tablica

framebuf 402 408plugintbl 552 555tekst 208z kodem wynikowym 543

taktowanieDAC 296mikrokontrolera 473

technologia OLED 44temperatura mikrokontrolera 239 241termistor 262 290

NTC 263PTC 263

termometrLM35 249 250z alarmem 251

termostat 290test uk adu VS1003B 503testowanie obrazu 319timer 16 62

TCC0 20

TCC1 399transakcja 59 62 65transakcje 17 103ndash107transakcyjna obs uga LCD 58transakcyjny dost p do SPI 95transfer 91

danych 97wynikoacutew 254

transmisja 72 83tryb

bez znaku 234ci g ej konwersji 252czterobitowy 153dwukana owy 301graficzny 416graficzny VGA 407idle 419jednobitowy 153LPC 371monochromatyczny 397 407oszcz dzania energii 94 306pracy multipleksera 226pracy SPI 157roacute nicowy 232single slope 312SPI 153tekstowy 413tekstowy VGA 397z pojedynczym wej ciem 234ze znakiem 235

trybygenerowania PWM 467pracy karty 153pracy przetwornika 231pracy SPI 74pracy uk adu 508

twierdzenie Nyquista 258tworzenie

adresu 84nak adek 417obrazu 335tablicy 543

typ__uint24 119karty 160niekompletny 60wyliczeniowy 114

typyoperandoacutew 29w AVR 34

Kup książkę Poleć książkę

584 AVR Uk ady peryferyjne

Uuchwyt handle 64 113uk ad

AD725 427 431buforowy 294CS 361DAC 284dataloggera 267detekcji awarii zasilania 559generuj cy obraz 393HiRes 477ICL7660 47LM35 250 251SampH 293sterowania sygna em 379USART 401VS1003B 496 503 508 530 538 556VS100XX 529wzmacniania sygna u 227

uk ady peryferyjne 9uruchomienie komparatora 287urz dzenie

master 72slave 72

u rednianie 259utrata danych 141u ycie wstawki asemblerowej 33

VVGA 393

Wwarto ci kalibracyjne

ADC 564oscylatoroacutew 564temperatury 564

warunkowa kompilacja 36WE Write Enable 375wej cie composite video input 425wektor przerwa 38 257wideo 391wielko pami ci 86 377w czenie DAC 299wska nik na struktur 27wska niki 32wstawki asemblerowe 24 33wtyczka 535 541 544

SineDTMF Generator 537VGA 396

wyboacuter cz stotliwo ci PWM 465 474wykorzystanie

DMA 254 518

EuroSCART 428PWM 461rejestroacutew 34

wyliczanie predyktora 489wy wietlacze

alfanumeryczne 43 45graficzne 43 309LCD 43OLED 46

wy wietlanielitera u 213map bitowych 344obrazu 333 346 406obrazu VGA 393

wywo ania zwrotne callbacks 98asynchroniczne 101synchroniczne 101

wyzwalanie konwersji 245wzmacniacz 446wzmacniacz operacyjny 279wzmacnianie sygna u 227

XXMEGA 9 18

Zzapis

bufora 269danych 176d wi ku 440 556

zasilaniekarty 154pami ci 109

zatrzask 368zatrzask 74HC573 433zatrza ni cie adresu 369zdarzenia 297zdarzenie compare match 399zegar 383 420 426zintegrowane rodowisko programistyczne 11z cze EuroSCART 425 428 429zmiana

g o no ci 527wielko ci strony 94

znaki 56

roacuted onapi cia odniesienia 284sygna u 240

Kup książkę Poleć książkę

Page 41: Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8 AVR. Ukäady peryferyjne Rejestry dost pu do pami ci RAM .....513 Rejestr adresu

580 AVR Uk ady peryferyjne

oknoIO View 207podgl du zmiennych 211wyboru czcionek 324

OLED 46opcje

kompilatora 35zapisu d wi ku 445

operacjena buforach 91odczytu 173zapisu 176zapisu strony 92

operand 29operator

ascii 41

asciz 41

byte 41

section 41opoacute nienia 13 18opoacute nienie zmienne 16optymalizacja 16 68optymalizator 26organizacja pami ci 77organizacja pami ci VRAM 316oscylator 287OSD On-Screen Display 417ostrze enie 16oszcz dzanie energii 94

Ppakiet WinAVR 48pami

CGRAM 56 57 64DataFLASH 10 77 81 113 269DDRAM 49EEPROM 111FLASH 54 124 207RAM 49SDRAM 372SRAM 63 124 329 366 371VRAM 314 317

PCLK 421PCM 443PetitFS 144 149p tla

for 13while 201

pierwsza linia obrazu 321piksel 430piktogram 342pin IO 225

plikAlloc_safeh 65DataFLASHc 83DataFLASHIOc 136definesh 50delayh 14diskioh 132 136ffh 132ffconfh 132 181hd44780h 49integerh 132ioh 30LCD_transc 61LCD-transactc 66Makefile 14Menuc 19nothingo 541outfiletxt 547 551pffh 149SPIh 104stringh 113stymulacji 191 192

pliki mp3 495elf 351fon 323o 24S 24 34binarne 350 355csv 276d wi kowe 440obiektowe 352wav 500WMA 512z czcionkami 327z danymi 349

podbijacz napi cia 315podgl d

pami ci 207stosu wywo a 209zmiennych 211znakoacutew 325

pod czeniefototranzystora 262karty SD 155LCD z kontrolerem 311modu u 50pami ci 362 369 370 373termistora 262uk adu LM35 251wyj XMEGA 398

pod wietlenieCCFL 46OLED 46

Kup książkę Poleć książkę

Skorowidz 581

podwoacutejne buforowanie 255 332 457polecenia

kasowania strony 81konfiguracyjne pami ci 82kontrolera ST7565R 315odczytu bufora 82 89odczytu pami ci 81 88SDRAM 376transferu 91

polecenieACMD41 168cd 181CID 178CMD0 165CMD8 167CSD 178date 276dir 127 181dump 276erase 276get 276HD44780_CLR 51Init 178mkdir 181

po czenieDMA ze SPI 96dwoacutech komparatoroacutew 285koprocesora mp3 497LCD z mikrokontrolerem 48wyj cia XMEGA 411XMEGA z PC 121z telewizorem 431

pomiarnapi cia zasilania 239temperatury MCU 241

port IO 30 362pozycjonowanie grafik 345poacute obraz 410precyzja pomiaroacutew 260preskaler 478preskaler ADC 243program

Atmel Data Visualizer 275Audacity 443avr-objcopy 350dataloggera 265LCD Image Converter 323makeloadingtableexe 543Realterm 127 554riffstrip 483SoX 445Tracepoint 208

programowanie sygnatury u ytkownika 566protokoacute master-slave 157

prototypy 136proacutebki d wi kowe 447proacutebkowanie

8-bitowe 300nieliniowe 480

prymitywy graficzne 330przebieg PWM 468przebiegi 289 303przechwytywanie danych 276przemiatanie wej 253przerwanie 218 254 286 403

DMA 522komparatora 286

przestrze adresowa procesora 378przesy anie

danych 498polece 498

przetaktowanie procesora 436przetwornik

ADC 221analogowo-cyfrowy 221cykliczny 222potokowy 222

przyciski 272pseudooperatory 41pu apki breakpoints 197pu apki warunkowe 205punkty ledzenia 203PWM 461 462 472

RRAS Row Address Strobe 375redukcja poboru energii 242regulacja kontrastu 321rejestr 32 34rejestr AC 50

adresu wtyczki 513BASEADDR 377CID 169CMP 251CSD 172czasu utworu 512DATA 83EVCTRL 248formatu audio 512identyfikacyjny pami ci 87INTFLAGS 252kontroli basoacutew 510kontroli g o no ci 513MUXCTRL 227OCR 168PER 67poroacutewnania 249

Kup książkę Poleć książkę

582 AVR Uk ady peryferyjne

rejestr ACSCI_CLOCKF 511stanu komparatora 287stanu pami ci 86stanu uk adu 510trybu pracy 508WINCTRL 285

rejestrydost pu do pami ci RAM 513GPIOR 502IO procesora 36mikrokontrolera 25procesora 35specjalne 94specjalne karty 169uk adu VS1003B 508

relacja rodzic ndash dziecko 336reset uk adu 534rozdzielczo

LCD 329przetwornika 231PWM 463 477

rozszerzenie HiRes 477 479roacutewnanie Steinharta-Harta 263rysowanie map bitowych 343

Sschemat uk adu dataloggera 267SCI Serial Command Interface 498SCK 72SD Secure Digital 152SDI Serial Data Interface 498separator synchronizacji 422separowanie impulsoacutew synchronizacji 422shieldy 10skaler 422skaler napi cia 283skrypt makefile 353s owo kluczowe

asm 27extern 37static 68

specyfikatory lokalizacji zmiennej 213sps samples per second 12SS Slave Select 72standard PAL 410standard VGA 393sterowanie

dataloggerem 275sygna em 379

sterownik 121HD44780 49 56LCD 49 62

stos wywo a 209

strukturaFATFS 139Handle 118LCD_trans 60 63menu 338rejestru 86SimpleFSEntry 113 116SimpleFSHandle 113 118 140submenu 527systemu plikoacutew 112

sumabitowa 571kontrolna 178

sygnacomposite 409composite video output 430CS 377DREQ 497H-Sync 396synchronizacji 423V-Sync 396zegarowy CLK 374

sygna yinterfejsu EBI 363magistrali EBI 364steruj ce 375

sygnaturaprodukcyjna procesora 563u ytkownika 565

symbol__DELAY_ROUND_CLOSEST__ 17__DELAY_ROUND_DOWN__ 17_FS_FAT12 149_FS_FAT32 149_FS_MINIMIZE 133_FS_READONLY 133_FS_RPATH 135_FS_TINY 133_MAX_SS 135_MULTI_PARTITION 135_USE_DIR 149_USE_FASTSEEK 134_USE_FORWARD 134_USE_LABEL 134_USE_LFN 134_USE_LSEEK 149_USE_MKFS 134_USE_READ 149_USE_STRFUNC 134_USE_WRITE 149_VOLUMES 136F_CPU 14 15 18increment 36USE_BUSY_FLAG 50

Kup książkę Poleć książkę

Skorowidz 583

symboleglobalne 36w asemblerze 28zewn trzne 39

symulacja 198 209symulator 190synchronizacja

pami ci 331pionowa 395pozioma 394

systemplikoacutew 111 128przerwa 404zdarze 245

szablonfont_XMEGAtmpl 326image_XMEGAtmpl 343

szum 463szybko przesy ania danych 126

ledzenie wi zki 333rodowisko

graficzne 11programistyczne 11VSIDE 542WinAVR 47

Ttabela FAT 130tablica

framebuf 402 408plugintbl 552 555tekst 208z kodem wynikowym 543

taktowanieDAC 296mikrokontrolera 473

technologia OLED 44temperatura mikrokontrolera 239 241termistor 262 290

NTC 263PTC 263

termometrLM35 249 250z alarmem 251

termostat 290test uk adu VS1003B 503testowanie obrazu 319timer 16 62

TCC0 20

TCC1 399transakcja 59 62 65transakcje 17 103ndash107transakcyjna obs uga LCD 58transakcyjny dost p do SPI 95transfer 91

danych 97wynikoacutew 254

transmisja 72 83tryb

bez znaku 234ci g ej konwersji 252czterobitowy 153dwukana owy 301graficzny 416graficzny VGA 407idle 419jednobitowy 153LPC 371monochromatyczny 397 407oszcz dzania energii 94 306pracy multipleksera 226pracy SPI 157roacute nicowy 232single slope 312SPI 153tekstowy 413tekstowy VGA 397z pojedynczym wej ciem 234ze znakiem 235

trybygenerowania PWM 467pracy karty 153pracy przetwornika 231pracy SPI 74pracy uk adu 508

twierdzenie Nyquista 258tworzenie

adresu 84nak adek 417obrazu 335tablicy 543

typ__uint24 119karty 160niekompletny 60wyliczeniowy 114

typyoperandoacutew 29w AVR 34

Kup książkę Poleć książkę

584 AVR Uk ady peryferyjne

Uuchwyt handle 64 113uk ad

AD725 427 431buforowy 294CS 361DAC 284dataloggera 267detekcji awarii zasilania 559generuj cy obraz 393HiRes 477ICL7660 47LM35 250 251SampH 293sterowania sygna em 379USART 401VS1003B 496 503 508 530 538 556VS100XX 529wzmacniania sygna u 227

uk ady peryferyjne 9uruchomienie komparatora 287urz dzenie

master 72slave 72

u rednianie 259utrata danych 141u ycie wstawki asemblerowej 33

VVGA 393

Wwarto ci kalibracyjne

ADC 564oscylatoroacutew 564temperatury 564

warunkowa kompilacja 36WE Write Enable 375wej cie composite video input 425wektor przerwa 38 257wideo 391wielko pami ci 86 377w czenie DAC 299wska nik na struktur 27wska niki 32wstawki asemblerowe 24 33wtyczka 535 541 544

SineDTMF Generator 537VGA 396

wyboacuter cz stotliwo ci PWM 465 474wykorzystanie

DMA 254 518

EuroSCART 428PWM 461rejestroacutew 34

wyliczanie predyktora 489wy wietlacze

alfanumeryczne 43 45graficzne 43 309LCD 43OLED 46

wy wietlanielitera u 213map bitowych 344obrazu 333 346 406obrazu VGA 393

wywo ania zwrotne callbacks 98asynchroniczne 101synchroniczne 101

wyzwalanie konwersji 245wzmacniacz 446wzmacniacz operacyjny 279wzmacnianie sygna u 227

XXMEGA 9 18

Zzapis

bufora 269danych 176d wi ku 440 556

zasilaniekarty 154pami ci 109

zatrzask 368zatrzask 74HC573 433zatrza ni cie adresu 369zdarzenia 297zdarzenie compare match 399zegar 383 420 426zintegrowane rodowisko programistyczne 11z cze EuroSCART 425 428 429zmiana

g o no ci 527wielko ci strony 94

znaki 56

roacuted onapi cia odniesienia 284sygna u 240

Kup książkę Poleć książkę

Page 42: Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8 AVR. Ukäady peryferyjne Rejestry dost pu do pami ci RAM .....513 Rejestr adresu

Skorowidz 581

podwoacutejne buforowanie 255 332 457polecenia

kasowania strony 81konfiguracyjne pami ci 82kontrolera ST7565R 315odczytu bufora 82 89odczytu pami ci 81 88SDRAM 376transferu 91

polecenieACMD41 168cd 181CID 178CMD0 165CMD8 167CSD 178date 276dir 127 181dump 276erase 276get 276HD44780_CLR 51Init 178mkdir 181

po czenieDMA ze SPI 96dwoacutech komparatoroacutew 285koprocesora mp3 497LCD z mikrokontrolerem 48wyj cia XMEGA 411XMEGA z PC 121z telewizorem 431

pomiarnapi cia zasilania 239temperatury MCU 241

port IO 30 362pozycjonowanie grafik 345poacute obraz 410precyzja pomiaroacutew 260preskaler 478preskaler ADC 243program

Atmel Data Visualizer 275Audacity 443avr-objcopy 350dataloggera 265LCD Image Converter 323makeloadingtableexe 543Realterm 127 554riffstrip 483SoX 445Tracepoint 208

programowanie sygnatury u ytkownika 566protokoacute master-slave 157

prototypy 136proacutebki d wi kowe 447proacutebkowanie

8-bitowe 300nieliniowe 480

prymitywy graficzne 330przebieg PWM 468przebiegi 289 303przechwytywanie danych 276przemiatanie wej 253przerwanie 218 254 286 403

DMA 522komparatora 286

przestrze adresowa procesora 378przesy anie

danych 498polece 498

przetaktowanie procesora 436przetwornik

ADC 221analogowo-cyfrowy 221cykliczny 222potokowy 222

przyciski 272pseudooperatory 41pu apki breakpoints 197pu apki warunkowe 205punkty ledzenia 203PWM 461 462 472

RRAS Row Address Strobe 375redukcja poboru energii 242regulacja kontrastu 321rejestr 32 34rejestr AC 50

adresu wtyczki 513BASEADDR 377CID 169CMP 251CSD 172czasu utworu 512DATA 83EVCTRL 248formatu audio 512identyfikacyjny pami ci 87INTFLAGS 252kontroli basoacutew 510kontroli g o no ci 513MUXCTRL 227OCR 168PER 67poroacutewnania 249

Kup książkę Poleć książkę

582 AVR Uk ady peryferyjne

rejestr ACSCI_CLOCKF 511stanu komparatora 287stanu pami ci 86stanu uk adu 510trybu pracy 508WINCTRL 285

rejestrydost pu do pami ci RAM 513GPIOR 502IO procesora 36mikrokontrolera 25procesora 35specjalne 94specjalne karty 169uk adu VS1003B 508

relacja rodzic ndash dziecko 336reset uk adu 534rozdzielczo

LCD 329przetwornika 231PWM 463 477

rozszerzenie HiRes 477 479roacutewnanie Steinharta-Harta 263rysowanie map bitowych 343

Sschemat uk adu dataloggera 267SCI Serial Command Interface 498SCK 72SD Secure Digital 152SDI Serial Data Interface 498separator synchronizacji 422separowanie impulsoacutew synchronizacji 422shieldy 10skaler 422skaler napi cia 283skrypt makefile 353s owo kluczowe

asm 27extern 37static 68

specyfikatory lokalizacji zmiennej 213sps samples per second 12SS Slave Select 72standard PAL 410standard VGA 393sterowanie

dataloggerem 275sygna em 379

sterownik 121HD44780 49 56LCD 49 62

stos wywo a 209

strukturaFATFS 139Handle 118LCD_trans 60 63menu 338rejestru 86SimpleFSEntry 113 116SimpleFSHandle 113 118 140submenu 527systemu plikoacutew 112

sumabitowa 571kontrolna 178

sygnacomposite 409composite video output 430CS 377DREQ 497H-Sync 396synchronizacji 423V-Sync 396zegarowy CLK 374

sygna yinterfejsu EBI 363magistrali EBI 364steruj ce 375

sygnaturaprodukcyjna procesora 563u ytkownika 565

symbol__DELAY_ROUND_CLOSEST__ 17__DELAY_ROUND_DOWN__ 17_FS_FAT12 149_FS_FAT32 149_FS_MINIMIZE 133_FS_READONLY 133_FS_RPATH 135_FS_TINY 133_MAX_SS 135_MULTI_PARTITION 135_USE_DIR 149_USE_FASTSEEK 134_USE_FORWARD 134_USE_LABEL 134_USE_LFN 134_USE_LSEEK 149_USE_MKFS 134_USE_READ 149_USE_STRFUNC 134_USE_WRITE 149_VOLUMES 136F_CPU 14 15 18increment 36USE_BUSY_FLAG 50

Kup książkę Poleć książkę

Skorowidz 583

symboleglobalne 36w asemblerze 28zewn trzne 39

symulacja 198 209symulator 190synchronizacja

pami ci 331pionowa 395pozioma 394

systemplikoacutew 111 128przerwa 404zdarze 245

szablonfont_XMEGAtmpl 326image_XMEGAtmpl 343

szum 463szybko przesy ania danych 126

ledzenie wi zki 333rodowisko

graficzne 11programistyczne 11VSIDE 542WinAVR 47

Ttabela FAT 130tablica

framebuf 402 408plugintbl 552 555tekst 208z kodem wynikowym 543

taktowanieDAC 296mikrokontrolera 473

technologia OLED 44temperatura mikrokontrolera 239 241termistor 262 290

NTC 263PTC 263

termometrLM35 249 250z alarmem 251

termostat 290test uk adu VS1003B 503testowanie obrazu 319timer 16 62

TCC0 20

TCC1 399transakcja 59 62 65transakcje 17 103ndash107transakcyjna obs uga LCD 58transakcyjny dost p do SPI 95transfer 91

danych 97wynikoacutew 254

transmisja 72 83tryb

bez znaku 234ci g ej konwersji 252czterobitowy 153dwukana owy 301graficzny 416graficzny VGA 407idle 419jednobitowy 153LPC 371monochromatyczny 397 407oszcz dzania energii 94 306pracy multipleksera 226pracy SPI 157roacute nicowy 232single slope 312SPI 153tekstowy 413tekstowy VGA 397z pojedynczym wej ciem 234ze znakiem 235

trybygenerowania PWM 467pracy karty 153pracy przetwornika 231pracy SPI 74pracy uk adu 508

twierdzenie Nyquista 258tworzenie

adresu 84nak adek 417obrazu 335tablicy 543

typ__uint24 119karty 160niekompletny 60wyliczeniowy 114

typyoperandoacutew 29w AVR 34

Kup książkę Poleć książkę

584 AVR Uk ady peryferyjne

Uuchwyt handle 64 113uk ad

AD725 427 431buforowy 294CS 361DAC 284dataloggera 267detekcji awarii zasilania 559generuj cy obraz 393HiRes 477ICL7660 47LM35 250 251SampH 293sterowania sygna em 379USART 401VS1003B 496 503 508 530 538 556VS100XX 529wzmacniania sygna u 227

uk ady peryferyjne 9uruchomienie komparatora 287urz dzenie

master 72slave 72

u rednianie 259utrata danych 141u ycie wstawki asemblerowej 33

VVGA 393

Wwarto ci kalibracyjne

ADC 564oscylatoroacutew 564temperatury 564

warunkowa kompilacja 36WE Write Enable 375wej cie composite video input 425wektor przerwa 38 257wideo 391wielko pami ci 86 377w czenie DAC 299wska nik na struktur 27wska niki 32wstawki asemblerowe 24 33wtyczka 535 541 544

SineDTMF Generator 537VGA 396

wyboacuter cz stotliwo ci PWM 465 474wykorzystanie

DMA 254 518

EuroSCART 428PWM 461rejestroacutew 34

wyliczanie predyktora 489wy wietlacze

alfanumeryczne 43 45graficzne 43 309LCD 43OLED 46

wy wietlanielitera u 213map bitowych 344obrazu 333 346 406obrazu VGA 393

wywo ania zwrotne callbacks 98asynchroniczne 101synchroniczne 101

wyzwalanie konwersji 245wzmacniacz 446wzmacniacz operacyjny 279wzmacnianie sygna u 227

XXMEGA 9 18

Zzapis

bufora 269danych 176d wi ku 440 556

zasilaniekarty 154pami ci 109

zatrzask 368zatrzask 74HC573 433zatrza ni cie adresu 369zdarzenia 297zdarzenie compare match 399zegar 383 420 426zintegrowane rodowisko programistyczne 11z cze EuroSCART 425 428 429zmiana

g o no ci 527wielko ci strony 94

znaki 56

roacuted onapi cia odniesienia 284sygna u 240

Kup książkę Poleć książkę

Page 43: Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8 AVR. Ukäady peryferyjne Rejestry dost pu do pami ci RAM .....513 Rejestr adresu

582 AVR Uk ady peryferyjne

rejestr ACSCI_CLOCKF 511stanu komparatora 287stanu pami ci 86stanu uk adu 510trybu pracy 508WINCTRL 285

rejestrydost pu do pami ci RAM 513GPIOR 502IO procesora 36mikrokontrolera 25procesora 35specjalne 94specjalne karty 169uk adu VS1003B 508

relacja rodzic ndash dziecko 336reset uk adu 534rozdzielczo

LCD 329przetwornika 231PWM 463 477

rozszerzenie HiRes 477 479roacutewnanie Steinharta-Harta 263rysowanie map bitowych 343

Sschemat uk adu dataloggera 267SCI Serial Command Interface 498SCK 72SD Secure Digital 152SDI Serial Data Interface 498separator synchronizacji 422separowanie impulsoacutew synchronizacji 422shieldy 10skaler 422skaler napi cia 283skrypt makefile 353s owo kluczowe

asm 27extern 37static 68

specyfikatory lokalizacji zmiennej 213sps samples per second 12SS Slave Select 72standard PAL 410standard VGA 393sterowanie

dataloggerem 275sygna em 379

sterownik 121HD44780 49 56LCD 49 62

stos wywo a 209

strukturaFATFS 139Handle 118LCD_trans 60 63menu 338rejestru 86SimpleFSEntry 113 116SimpleFSHandle 113 118 140submenu 527systemu plikoacutew 112

sumabitowa 571kontrolna 178

sygnacomposite 409composite video output 430CS 377DREQ 497H-Sync 396synchronizacji 423V-Sync 396zegarowy CLK 374

sygna yinterfejsu EBI 363magistrali EBI 364steruj ce 375

sygnaturaprodukcyjna procesora 563u ytkownika 565

symbol__DELAY_ROUND_CLOSEST__ 17__DELAY_ROUND_DOWN__ 17_FS_FAT12 149_FS_FAT32 149_FS_MINIMIZE 133_FS_READONLY 133_FS_RPATH 135_FS_TINY 133_MAX_SS 135_MULTI_PARTITION 135_USE_DIR 149_USE_FASTSEEK 134_USE_FORWARD 134_USE_LABEL 134_USE_LFN 134_USE_LSEEK 149_USE_MKFS 134_USE_READ 149_USE_STRFUNC 134_USE_WRITE 149_VOLUMES 136F_CPU 14 15 18increment 36USE_BUSY_FLAG 50

Kup książkę Poleć książkę

Skorowidz 583

symboleglobalne 36w asemblerze 28zewn trzne 39

symulacja 198 209symulator 190synchronizacja

pami ci 331pionowa 395pozioma 394

systemplikoacutew 111 128przerwa 404zdarze 245

szablonfont_XMEGAtmpl 326image_XMEGAtmpl 343

szum 463szybko przesy ania danych 126

ledzenie wi zki 333rodowisko

graficzne 11programistyczne 11VSIDE 542WinAVR 47

Ttabela FAT 130tablica

framebuf 402 408plugintbl 552 555tekst 208z kodem wynikowym 543

taktowanieDAC 296mikrokontrolera 473

technologia OLED 44temperatura mikrokontrolera 239 241termistor 262 290

NTC 263PTC 263

termometrLM35 249 250z alarmem 251

termostat 290test uk adu VS1003B 503testowanie obrazu 319timer 16 62

TCC0 20

TCC1 399transakcja 59 62 65transakcje 17 103ndash107transakcyjna obs uga LCD 58transakcyjny dost p do SPI 95transfer 91

danych 97wynikoacutew 254

transmisja 72 83tryb

bez znaku 234ci g ej konwersji 252czterobitowy 153dwukana owy 301graficzny 416graficzny VGA 407idle 419jednobitowy 153LPC 371monochromatyczny 397 407oszcz dzania energii 94 306pracy multipleksera 226pracy SPI 157roacute nicowy 232single slope 312SPI 153tekstowy 413tekstowy VGA 397z pojedynczym wej ciem 234ze znakiem 235

trybygenerowania PWM 467pracy karty 153pracy przetwornika 231pracy SPI 74pracy uk adu 508

twierdzenie Nyquista 258tworzenie

adresu 84nak adek 417obrazu 335tablicy 543

typ__uint24 119karty 160niekompletny 60wyliczeniowy 114

typyoperandoacutew 29w AVR 34

Kup książkę Poleć książkę

584 AVR Uk ady peryferyjne

Uuchwyt handle 64 113uk ad

AD725 427 431buforowy 294CS 361DAC 284dataloggera 267detekcji awarii zasilania 559generuj cy obraz 393HiRes 477ICL7660 47LM35 250 251SampH 293sterowania sygna em 379USART 401VS1003B 496 503 508 530 538 556VS100XX 529wzmacniania sygna u 227

uk ady peryferyjne 9uruchomienie komparatora 287urz dzenie

master 72slave 72

u rednianie 259utrata danych 141u ycie wstawki asemblerowej 33

VVGA 393

Wwarto ci kalibracyjne

ADC 564oscylatoroacutew 564temperatury 564

warunkowa kompilacja 36WE Write Enable 375wej cie composite video input 425wektor przerwa 38 257wideo 391wielko pami ci 86 377w czenie DAC 299wska nik na struktur 27wska niki 32wstawki asemblerowe 24 33wtyczka 535 541 544

SineDTMF Generator 537VGA 396

wyboacuter cz stotliwo ci PWM 465 474wykorzystanie

DMA 254 518

EuroSCART 428PWM 461rejestroacutew 34

wyliczanie predyktora 489wy wietlacze

alfanumeryczne 43 45graficzne 43 309LCD 43OLED 46

wy wietlanielitera u 213map bitowych 344obrazu 333 346 406obrazu VGA 393

wywo ania zwrotne callbacks 98asynchroniczne 101synchroniczne 101

wyzwalanie konwersji 245wzmacniacz 446wzmacniacz operacyjny 279wzmacnianie sygna u 227

XXMEGA 9 18

Zzapis

bufora 269danych 176d wi ku 440 556

zasilaniekarty 154pami ci 109

zatrzask 368zatrzask 74HC573 433zatrza ni cie adresu 369zdarzenia 297zdarzenie compare match 399zegar 383 420 426zintegrowane rodowisko programistyczne 11z cze EuroSCART 425 428 429zmiana

g o no ci 527wielko ci strony 94

znaki 56

roacuted onapi cia odniesienia 284sygna u 240

Kup książkę Poleć książkę

Page 44: Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8 AVR. Ukäady peryferyjne Rejestry dost pu do pami ci RAM .....513 Rejestr adresu

Skorowidz 583

symboleglobalne 36w asemblerze 28zewn trzne 39

symulacja 198 209symulator 190synchronizacja

pami ci 331pionowa 395pozioma 394

systemplikoacutew 111 128przerwa 404zdarze 245

szablonfont_XMEGAtmpl 326image_XMEGAtmpl 343

szum 463szybko przesy ania danych 126

ledzenie wi zki 333rodowisko

graficzne 11programistyczne 11VSIDE 542WinAVR 47

Ttabela FAT 130tablica

framebuf 402 408plugintbl 552 555tekst 208z kodem wynikowym 543

taktowanieDAC 296mikrokontrolera 473

technologia OLED 44temperatura mikrokontrolera 239 241termistor 262 290

NTC 263PTC 263

termometrLM35 249 250z alarmem 251

termostat 290test uk adu VS1003B 503testowanie obrazu 319timer 16 62

TCC0 20

TCC1 399transakcja 59 62 65transakcje 17 103ndash107transakcyjna obs uga LCD 58transakcyjny dost p do SPI 95transfer 91

danych 97wynikoacutew 254

transmisja 72 83tryb

bez znaku 234ci g ej konwersji 252czterobitowy 153dwukana owy 301graficzny 416graficzny VGA 407idle 419jednobitowy 153LPC 371monochromatyczny 397 407oszcz dzania energii 94 306pracy multipleksera 226pracy SPI 157roacute nicowy 232single slope 312SPI 153tekstowy 413tekstowy VGA 397z pojedynczym wej ciem 234ze znakiem 235

trybygenerowania PWM 467pracy karty 153pracy przetwornika 231pracy SPI 74pracy uk adu 508

twierdzenie Nyquista 258tworzenie

adresu 84nak adek 417obrazu 335tablicy 543

typ__uint24 119karty 160niekompletny 60wyliczeniowy 114

typyoperandoacutew 29w AVR 34

Kup książkę Poleć książkę

584 AVR Uk ady peryferyjne

Uuchwyt handle 64 113uk ad

AD725 427 431buforowy 294CS 361DAC 284dataloggera 267detekcji awarii zasilania 559generuj cy obraz 393HiRes 477ICL7660 47LM35 250 251SampH 293sterowania sygna em 379USART 401VS1003B 496 503 508 530 538 556VS100XX 529wzmacniania sygna u 227

uk ady peryferyjne 9uruchomienie komparatora 287urz dzenie

master 72slave 72

u rednianie 259utrata danych 141u ycie wstawki asemblerowej 33

VVGA 393

Wwarto ci kalibracyjne

ADC 564oscylatoroacutew 564temperatury 564

warunkowa kompilacja 36WE Write Enable 375wej cie composite video input 425wektor przerwa 38 257wideo 391wielko pami ci 86 377w czenie DAC 299wska nik na struktur 27wska niki 32wstawki asemblerowe 24 33wtyczka 535 541 544

SineDTMF Generator 537VGA 396

wyboacuter cz stotliwo ci PWM 465 474wykorzystanie

DMA 254 518

EuroSCART 428PWM 461rejestroacutew 34

wyliczanie predyktora 489wy wietlacze

alfanumeryczne 43 45graficzne 43 309LCD 43OLED 46

wy wietlanielitera u 213map bitowych 344obrazu 333 346 406obrazu VGA 393

wywo ania zwrotne callbacks 98asynchroniczne 101synchroniczne 101

wyzwalanie konwersji 245wzmacniacz 446wzmacniacz operacyjny 279wzmacnianie sygna u 227

XXMEGA 9 18

Zzapis

bufora 269danych 176d wi ku 440 556

zasilaniekarty 154pami ci 109

zatrzask 368zatrzask 74HC573 433zatrza ni cie adresu 369zdarzenia 297zdarzenie compare match 399zegar 383 420 426zintegrowane rodowisko programistyczne 11z cze EuroSCART 425 428 429zmiana

g o no ci 527wielko ci strony 94

znaki 56

roacuted onapi cia odniesienia 284sygna u 240

Kup książkę Poleć książkę

Page 45: Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8 AVR. Ukäady peryferyjne Rejestry dost pu do pami ci RAM .....513 Rejestr adresu

584 AVR Uk ady peryferyjne

Uuchwyt handle 64 113uk ad

AD725 427 431buforowy 294CS 361DAC 284dataloggera 267detekcji awarii zasilania 559generuj cy obraz 393HiRes 477ICL7660 47LM35 250 251SampH 293sterowania sygna em 379USART 401VS1003B 496 503 508 530 538 556VS100XX 529wzmacniania sygna u 227

uk ady peryferyjne 9uruchomienie komparatora 287urz dzenie

master 72slave 72

u rednianie 259utrata danych 141u ycie wstawki asemblerowej 33

VVGA 393

Wwarto ci kalibracyjne

ADC 564oscylatoroacutew 564temperatury 564

warunkowa kompilacja 36WE Write Enable 375wej cie composite video input 425wektor przerwa 38 257wideo 391wielko pami ci 86 377w czenie DAC 299wska nik na struktur 27wska niki 32wstawki asemblerowe 24 33wtyczka 535 541 544

SineDTMF Generator 537VGA 396

wyboacuter cz stotliwo ci PWM 465 474wykorzystanie

DMA 254 518

EuroSCART 428PWM 461rejestroacutew 34

wyliczanie predyktora 489wy wietlacze

alfanumeryczne 43 45graficzne 43 309LCD 43OLED 46

wy wietlanielitera u 213map bitowych 344obrazu 333 346 406obrazu VGA 393

wywo ania zwrotne callbacks 98asynchroniczne 101synchroniczne 101

wyzwalanie konwersji 245wzmacniacz 446wzmacniacz operacyjny 279wzmacnianie sygna u 227

XXMEGA 9 18

Zzapis

bufora 269danych 176d wi ku 440 556

zasilaniekarty 154pami ci 109

zatrzask 368zatrzask 74HC573 433zatrza ni cie adresu 369zdarzenia 297zdarzenie compare match 399zegar 383 420 426zintegrowane rodowisko programistyczne 11z cze EuroSCART 425 428 429zmiana

g o no ci 527wielko ci strony 94

znaki 56

roacuted onapi cia odniesienia 284sygna u 240

Kup książkę Poleć książkę

Page 46: Wszelkie prawa zastrzeżone. Nieautoryzowane …pdf.helion.pl/avrukp/avrukp.pdf · 2019-05-15 · 8 AVR. Ukäady peryferyjne Rejestry dost pu do pami ci RAM .....513 Rejestr adresu