Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00715 010508 11034280 na godz. na dobę w sumie
AVR. Praktyczne projekty - książka
AVR. Praktyczne projekty - książka
Autor: Liczba stron: 632
Wydawca: Helion Język publikacji: polski
ISBN: 978-83-246-7877-8 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> elektronika >> mikrokontrolery
Porównaj ceny (książka, ebook, audiobook).

Programowanie mikrokontrolerów to nic trudnego! Czas się o tym przekonać!

Układy AVR przebojem wdarły się na rynek mikrokontrolerów. Szybko zdobyły serca hobbystów i profesjonalistów - zdecydowały o tym niska cena, ogromne możliwości i wydajność obliczeniowa oraz prostota używania i dostępność darmowych narzędzi, które ułatwiają programowanie tych układów. Szczególnie dużym uznaniem wśród użytkowników mikrokontrolerów cieszą się układy należące do rodziny XMEGA, jednak do tej pory brak było na polskim rynku publikacji opisujących ich architekturę, programowanie i zastosowanie.

Lukę tę doskonale wypełnia książka „AVR. Praktyczne projekty ”, której autor postawił sobie za cel szczegółowe omówienie problemów związanych z programowaniem mikrokontrolerów XMEGA, z uwzględnieniem modułów, które nie występują w układach należących do innych rodzin AVR. Jeśli posiadasz już podstawowe umiejętności w zakresie programowania mikrokontrolerów, pozycja ta umożliwi Ci praktyczne rozwinięcie talentów w tej dziedzinie - samodzielnie zrealizujesz m.in. projekt zegara, analizatora logicznego i wiele innych!

To doskonała pozycja zarówno dla czytelników pierwszej książki Tomasza Francuza „Język C dla mikrokontrolerów AVR. Od podstaw do zaawansowanych aplikacji”, jak i dla osób, które opanowały podstawy programowania mikrokontrolerów we własnym zakresie.

Dowiedz się, co można osiągnąć za pomocą języka C i układów AVR!

 

Przeczytaj kompleksową recenzję książki na portalu Mikrokontrolery.blogspot.com >>

 

Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

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 wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Wydawnictwo HELION nie ponoszą również ż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 / Olsztyn Obarek, Pokoński, Pazdrijowski, Zaprucki Fotografia na okładce została wykorzystana za zgodą Shutterstock.com Wydawnictwo HELION ul. Kościuszki 1c, 44-100 GLIWICE tel. 32 231 22 19, 32 230 98 63 e-mail: helion@helion.pl WWW: http://helion.pl (księgarnia internetowa, katalog książek) Drogi Czytelniku! Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie?avrppr Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję. Kody źródłowe wybranych przykładów dostępne są pod adresem: ftp://ftp.helion.pl/przyklady/avrppr.zip ISBN: 978-83-246-7877-8 Copyright © Helion 2013 Printed in Poland. • Kup książkę • Poleć książkę • Oceń książkę • Księgarnia internetowa • Lubię to! » Nasza społeczność Spis treĈci Rozdziaä 1. Wstöp, czyli nowi czäonkowie rodziny AVR ....................................... 11 Przykáady do ksiąĪki ....................................................................................................... 12 Mikrokontrolery XMEGA .............................................................................................. 12 Errata ........................................................................................................................ 14 XMEGA a inne AVR-y .................................................................................................. 15 Kompilator ............................................................................................................... 15 Nowe peryferia ......................................................................................................... 16 Rozdziaä 2. Jak zaczñè, czyli instalacja Ĉrodowiska ........................................... 21 Xplained jako páyta rozwojowa ...................................................................................... 22 Instalacja Xplained w systemie ................................................................................ 22 Instalacja XMEGA z bootloaderem klasy DFU ....................................................... 25 Programowanie ukáadów XMEGA ................................................................................. 25 Wczytywanie firmware za pomocą FLIP ................................................................. 26 Bootloader firmy Atmel ........................................................................................... 28 Podstawowe opcje programu batchisp ...................................................................... 28 Interfejs JTAG .......................................................................................................... 32 Programowanie z wykorzystaniem interfejsu PDI ................................................... 34 Programatory .................................................................................................................. 34 AVRISP mkII ........................................................................................................... 35 JTAGICE mkII ......................................................................................................... 35 JTAGICEIII .............................................................................................................. 36 AVROne! ................................................................................................................. 36 AVR Dragon ............................................................................................................ 36 Programowanie i debugowanie procesorów XMEGA .................................................... 43 OdsprzĊganie zasilania ................................................................................................... 44 Instalacja potrzebnego oprogramowania ........................................................................ 44 Atmel Studio 6 — podstawy .................................................................................... 45 Programowanie z poziomu AS6 — dlaczego warto korzystaü z plików w formacie elf .................................................. 53 Rozdziaä 3. Organizacja i zarzñdzanie projektem ................................................ 55 Komentarze .................................................................................................................... 55 Nazewnictwo .................................................................................................................. 57 Literaáy ..................................................................................................................... 59 Podziaá kodu na pliki ...................................................................................................... 61 WidocznoĞü funkcji .................................................................................................. 66 WidocznoĞü zmiennych ............................................................................................ 66 Poleć książkęKup książkę 4 AVR. Praktyczne projekty Podkatalogi ............................................................................................................... 67 Podziaá funkcji ......................................................................................................... 69 Zmienne globalne ........................................................................................................... 70 Systemy wersjonowania ................................................................................................. 74 Serwer SVN na wáasnym komputerze ...................................................................... 75 Jak korzystaü z SVN ................................................................................................ 78 Praca z SVN ............................................................................................................. 81 Uwagi koĔcowe ........................................................................................................ 84 Inne uáatwienia ............................................................................................................... 85 Jak pisaü lepsze programy? ............................................................................................ 86 Rozdziaä 4. Jak tworzyè lepszy i efektywniejszy kod .......................................... 89 Wáączenie optymalizacji ................................................................................................. 90 DáugoĞü typów ................................................................................................................ 91 Zmienne globalne i zmienne lokalne .............................................................................. 93 Modyfikator register ....................................................................................................... 94 UĪycie globalnych rejestrów ogólnego przeznaczenia ................................................... 97 Wykorzystanie innych rejestrów jako GPIOR .......................................................... 99 Inicjalizacja zmiennych globalnych ................................................................................ 99 PoáoĪenie zmiennych w pamiĊci ..................................................................................... 99 Optymalizacja pĊtli ....................................................................................................... 100 Optymalizacja funkcji ................................................................................................... 101 Optymalizacja funkcji main ................................................................................... 101 Optymalizacja prologów i epilogów funkcji .......................................................... 101 Optymalizacja przekazywania parametrów funkcji ................................................ 102 Optymalizacja zwracania wyników funkcji ............................................................ 105 Dodatkowe atrybuty funkcji ................................................................................... 106 Inne ........................................................................................................................ 110 Eliminacja martwego kodu ........................................................................................... 111 Konstruktory i destruktory ............................................................................................ 114 Rozdziaä 5. Jak uporzñdkowaè chaos, czyli zäoĔone typy danych i listy ............. 117 Tablice .......................................................................................................................... 118 Struktury ....................................................................................................................... 119 Deep copy i shallow copy ...................................................................................... 123 WskaĨniki i struktury ............................................................................................. 126 Struktury anonimowe ............................................................................................. 127 Inicjalizacja pól struktury ....................................................................................... 128 Unie ........................................................................................................................ 129 Pola bitowe ............................................................................................................. 130 Struktury a optymalizacja programu ...................................................................... 131 Listy .............................................................................................................................. 135 Listy jednokierunkowe ........................................................................................... 136 Listy dwukierunkowe ............................................................................................. 140 Listy XOR .............................................................................................................. 142 Bufory ........................................................................................................................... 148 Bufor pierĞcieniowy ............................................................................................... 149 Kolejki FIFO/LIFO ................................................................................................ 152 Stos ......................................................................................................................... 152 Rozdziaä 6. Koniec baäaganu, czyli o nazwach rejestrów i ukäadów peryferyjnych ......................... 155 Struktury opisujące mikrokontrolery XMEGA ............................................................. 159 Nazwy rejestrów ........................................................................................................... 162 Nazwy bitów ................................................................................................................. 162 Poleć książkęKup książkę Spis treĈci 5 Rozdziaä 7. Lepiej i proĈciej, czyli porty IO procesora na sterydach .................. 167 Piny wejĞciowe i wyjĞciowe ......................................................................................... 168 Konwersja poziomów logicznych pomiĊdzy ukáadami pracującymi z róĪnymi napiĊciami zasilającymi ............................................................................ 171 àączenie wyjĞcia procesora z ukáadem pracującym z napiĊciem 5 V .................... 171 Zastosowanie aktywnego konwertera ..................................................................... 174 Konwersja z napiĊcia wyĪszego na niĪsze ............................................................. 174 Dzielnik rezystorowy ............................................................................................. 176 UĪycie do konwersji napiĊü buforów scalonych .................................................... 177 Bufor dwukierunkowy stosowany w magistralach typu open drain ....................... 178 Kontrola nad portami procesora ................................................................................... 181 Piny wejĞciowe i wyjĞciowe ......................................................................................... 182 Synchronizator .............................................................................................................. 184 Konfiguracja sterownika pinu ....................................................................................... 186 Konfiguracja totem-pole ......................................................................................... 186 Konfiguracja Pull up/down .................................................................................... 187 Konfiguracja bus keeper ......................................................................................... 188 Konfiguracja wired-AND ....................................................................................... 189 Konfiguracja wired-OR .......................................................................................... 191 Odwracanie wyjĞü IO ............................................................................................. 192 Kontrola szybkoĞci opadania i narastania zboczy .................................................. 193 Kontrola zdarzeĔ związanych z pinem ................................................................... 193 Rejestr kontrolny portu ........................................................................................... 194 Atomowa modyfikacja stanu pinów i wsparcie dla RMW ............................................ 196 Alternatywne funkcje pinu ........................................................................................... 199 Porty wirtualne ............................................................................................................. 200 Przekazywanie rejestru jako parametru funkcji ............................................................ 202 Remapowanie wyjĞü IO ................................................................................................ 203 Rozdziaä 8. Kontroler NVM — jak prosto i przyjemnie dobraè siö do pamiöci .... 205 PamiĊü EEPROM i związane z nią operacje ................................................................ 206 DostĊp do EEPROM z poziomu AVR-libc ............................................................ 208 DostĊp do EEPROM za pomocą bezpoĞredniego dostĊpu do kontrolera NVM ..... 213 Techniki wear leveling ................................................................................................. 219 Rozdzielenie kasowania i zapisu pamiĊci ............................................................... 221 DostĊp do EEPROM z wykorzystaniem tokenów .................................................. 224 EEPROM i awaria zasilania ................................................................................... 232 Problem atomowoĞci przy dostĊpie do EEPROM .................................................. 244 Zapis do EEPROM z uĪyciem przerwaĔ ................................................................ 244 Zapobieganie uszkodzeniu zawartoĞci pamiĊci EEPROM ........................................... 246 DostĊp do pamiĊci FLASH ........................................................................................... 246 Typy danych związane z pamiĊcią FLASH ............................................................ 248 Odczyt danych z pamiĊci FLASH .......................................................................... 250 DostĊp do FLASH w kompilatorze avr-gcc 4.7 i wyĪszych — named address spaces ............................................................................................ 252 WskaĨniki wykorzystujące przestrzenie adresowe ................................................. 254 Typy 24-bitowe ............................................................................................................ 258 Rozdziaä 9. Potrzebujö wiöcej mocy — säów kilka o konfiguracji zegara ........... 259 Rejestry kontrolne zegarów .......................................................................................... 260 Konfiguracja zegara ...................................................................................................... 262 ħródáa zegara .......................................................................................................... 263 Odblokowywanie Ĩródáa zegara ............................................................................. 270 Ukáad PLL .............................................................................................................. 270 Poleć książkęKup książkę 6 AVR. Praktyczne projekty DFLL ...................................................................................................................... 272 Ukáad monitorowania zegara zewnĊtrznego ........................................................... 275 Zmiana Ĩródáa zegara i jego czĊstotliwoĞci ............................................................ 277 Blokowanie ustawieĔ zegara .................................................................................. 277 Preskalery zegara .................................................................................................... 278 Uwagi ........................................................................................................................... 281 Kondensatory odsprzĊgające .................................................................................. 282 Rozdziaä 10. Przerwania i kontroler przerwaþ .................................................... 285 Przerwania .................................................................................................................... 285 Czym są przerwania? ............................................................................................. 285 Przerwania maskowalne ......................................................................................... 286 Przerwania niemaskowalne .................................................................................... 287 ħródáa przerwaĔ ..................................................................................................... 287 Konfiguracja i obsáuga przerwaĔ .................................................................................. 288 Czas odpowiedzi na Īądanie przerwania ................................................................ 288 Funkcja obsáugi przerwania .................................................................................... 289 Wektory przerwaĔ .................................................................................................. 290 Puste wektory przerwaĔ ......................................................................................... 292 Puste przerwania .................................................................................................... 293 Wspóádzielenie kodu przez przerwania .................................................................. 294 Atrybut naked i obsáuga przerwaĔ w asemblerze ................................................... 295 Poziomy przerwaĔ .................................................................................................. 297 Przerywanie przerwaĔ ............................................................................................ 300 Priorytety przerwaĔ ...................................................................................................... 302 Priorytet dynamiczny ............................................................................................. 302 Globalna flaga zezwolenia na przerwanie .............................................................. 303 Przerwanie niemaskowalne .......................................................................................... 304 Rejestr stanu kontrolera przerwaĔ ................................................................................ 304 Modyfikator volatile ..................................................................................................... 305 Zmiana kolejnoĞci instrukcji .................................................................................. 307 AtomowoĞü dostĊpu do danych .................................................................................... 308 Instrukcje atomowej modyfikacji pamiĊci .............................................................. 311 DostĊp do wielobajtowych rejestrów IO ................................................................ 314 Funkcje reentrant .......................................................................................................... 314 Rejestry IO ogólnego przeznaczenia ............................................................................ 316 Rozdziaä 11. System zdarzeþ ............................................................................ 319 Rejestr multipleksera kanaáu zdarzeĔ ........................................................................... 320 Zaawansowane funkcje kanaáu zdarzeĔ .......................................................................... 322 Filtr cyfrowy ........................................................................................................... 322 Dekoder kwadraturowy .......................................................................................... 322 Enkoder kwadraturowy z indeksem ....................................................................... 331 Programowe sterowanie zdarzeniami ..................................................................... 332 Zdarzenia jako sygnaáy sterujące ukáadami zewnĊtrznymi ........................................... 333 Inne funkcje rejestru ............................................................................................... 334 Rozdziaä 12. Timery i liczniki ............................................................................ 337 Co to jest licznik? ......................................................................................................... 337 ħródáa zegara i preskaler .............................................................................................. 338 Typy i funkcje liczników .............................................................................................. 340 Licznik typu 0/1 ..................................................................................................... 341 Piny wyjĞciowe licznika ............................................................................................... 350 Licznik typu 2 ........................................................................................................ 351 Timery typu 4/5 ...................................................................................................... 353 Poleć książkęKup książkę Spis treĈci 7 Buforowanie ................................................................................................................. 354 Kontrola nad licznikiem ............................................................................................... 357 Kaskadowe áączenie liczników ..................................................................................... 358 Rejestr tymczasowy TEMP .......................................................................................... 359 Wykorzystanie PWM do generowania sygnaáów analogowych ................................... 361 Przykáad — generowanie napiĊcia o zmiennej amplitudzie ................................... 363 Przykáad — generowanie dowolnego przebiegu .................................................... 364 PWM i przerwania ................................................................................................. 369 A moĪe DMA? ....................................................................................................... 371 Rozszerzenie zwiĊkszające rozdzielczoĞü .................................................................... 374 Tryb HiRes dla licznika typu 2 ............................................................................... 377 Rozdziaä 13. Kontroler DMA ............................................................................. 379 Przesyáanie pamiĊü-pamiĊü .......................................................................................... 383 Odwracanie danych ................................................................................................ 384 Przesyáanie nakáadających siĊ bloków pamiĊci ...................................................... 385 Wypeánianie pamiĊci wzorcem .............................................................................. 388 Przesyáanie pamiĊü-rejestr IO ....................................................................................... 389 Wyzwalacze .................................................................................................................. 392 Praca buforowa ............................................................................................................. 395 Priorytety kanaáów DMA ............................................................................................. 396 Przerwania DMA .......................................................................................................... 397 Báąd transmisji DMA ............................................................................................. 397 Przerwanie koĔca transakcji ................................................................................... 398 Rozdziaä 14. LED-y — co z nich moĔna wycisnñè? ............................................. 399 TaĞmy LED-owe .......................................................................................................... 399 TrochĊ o wáaĞciwoĞciach oka, czyli RGB w praktyce ............................................ 403 Program sterujący ................................................................................................... 404 WyĞwietlacze LED 7-segmentowe ............................................................................... 407 Licznik LED ........................................................................................................... 412 Matryce LED ................................................................................................................ 416 Projekt PCB i zasilanie ........................................................................................... 421 Dobór napiĊcia zasilającego matrycĊ ..................................................................... 422 Regulacja prądu diod .............................................................................................. 423 Ukáad z matrycą dwukolorową ............................................................................... 423 Sterowanie matrycą ................................................................................................ 425 PWM inaczej, czyli jak uzyskaü odcienie kolorów ................................................ 433 Rozdziaä 15. Ukäady zegarowe w praktyce ........................................................ 437 RTC czy... RTC? .......................................................................................................... 438 16-bitowy ukáad RTC ................................................................................................... 438 Synchronizacja dostĊpu do rejestrów RTC ............................................................. 441 Rejestry PER i COMP ............................................................................................ 442 RTC w trybie uĞpienia ............................................................................................ 445 32-bitowy ukáad RTC ................................................................................................... 445 Generator sygnaáu zegarowego .............................................................................. 445 Rejestry PER i COMP ............................................................................................ 445 Rejestr CNT ........................................................................................................... 446 Przykáadowy program kalendarzowy ........................................................................... 446 Linuksowy marker czasowy ................................................................................... 447 Konwersja czasu ..................................................................................................... 447 Czas drogą radiową, czyli DCF77 ................................................................................ 451 TrochĊ wiĊcej o DCF77 ......................................................................................... 452 Dekodowanie danych ............................................................................................. 454 Poleć książkęKup książkę 8 AVR. Praktyczne projekty Moduá odbiornika DCF77 ...................................................................................... 454 Przykáad ................................................................................................................. 455 Ukáad podtrzymywania zasilania .................................................................................. 462 Dobór Ĩródáa zasilania awaryjnego ........................................................................ 463 Wykorzystanie baterii ............................................................................................. 463 Superkondensatory ................................................................................................. 463 Akumulatory .......................................................................................................... 464 Podtrzymanie zasilania dla caáego procesora ......................................................... 465 Ukáad zapasowego zasilania bateryjnego ............................................................... 465 Rozdziaä 16. Budujemy zegar z budzikiem, czyli skoþczona maszyna stanów w praktyce ................................. 469 FSM oparta na switch/case ........................................................................................... 471 FSM oparta na tablicach ............................................................................................... 474 Zegar z alarmem ........................................................................................................... 477 Jeszcze o maszynach stanu ........................................................................................... 489 Rozdziaä 17. Komunikacja na róĔne sposoby, czyli USART w praktyce ............... 491 Elektryczna realizacja interfejsu USART ................................................................... 492 Format transmisji danych ............................................................................................. 494 SzybkoĞü transmisji ...................................................................................................... 496 Terminal ................................................................................................................. 496 Podgląd transmisji danych ...................................................................................... 497 Wirtualny port szeregowy ............................................................................................ 499 Konfiguracja interfejsu ................................................................................................. 500 Konfiguracja pinów IO ........................................................................................... 501 Konfiguracja formatu ramki danych ....................................................................... 502 Funkcje dodatkowe interfejsu ................................................................................. 502 Ustawienie szybkoĞci interfejsu ............................................................................. 503 Kontrola poprawnoĞci danych ................................................................................ 508 Transmisja danych ........................................................................................................ 509 Realizacja transmisji przez pooling ........................................................................ 509 Wykorzystanie przerwaĔ ........................................................................................ 512 Wykorzystanie DMA ............................................................................................. 517 Równoczesny dostĊp do USART z wielu „wątków” .............................................. 525 DostĊp do USART z wykorzystaniem strumieni .......................................................... 527 Metoda get .............................................................................................................. 528 Metoda put ............................................................................................................. 528 Otwieranie strumienia ............................................................................................ 529 Tryb MPCM ................................................................................................................. 530 Rozdziaä 18. Wizualizacja danych ..................................................................... 535 Atmel Data Visualizer .................................................................................................. 535 Format danych ........................................................................................................ 537 Struktury wykorzystywane przez ADV .................................................................. 540 UltradĨwiĊkowy pomiar odlegáoĞci .............................................................................. 543 Moduáy cyfrowe ..................................................................................................... 544 Wáasny moduá ........................................................................................................ 548 Budujemy analizator stanów logicznych ......................................................................... 550 SprzĊt ..................................................................................................................... 551 Protokóá komunikacji ............................................................................................. 553 Implementacja protokoáu ........................................................................................ 555 Jak szybko próbkowaü? .......................................................................................... 560 Klient ...................................................................................................................... 564 Uwagi praktyczne ................................................................................................... 566 Poleć książkęKup książkę Spis treĈci 9 Rozdziaä 19. Wykorzystanie podczerwieni do transmisji danych ............................ 569 Modulacja IR ................................................................................................................ 570 Porozmawiajmy z pilotem TV ...................................................................................... 572 CzĊĞü sprzĊtowa, czyli odbiornik IR ...................................................................... 572 CzĊĞü programowa, czyli standardy kodowania ..................................................... 574 Standard NEC i pokrewne ...................................................................................... 575 RC5 i Motorola ...................................................................................................... 581 Kod RC5 ................................................................................................................ 587 Inne standardy kodowania ...................................................................................... 592 Nadajnik IR .................................................................................................................. 592 InĪynieria odwrotna — dekodujemy sygnaá pilota aparatu Canon ......................... 595 Transmisja danych ........................................................................................................ 597 Budujemy pakiet danych ........................................................................................ 600 SprzĊtowy generator CRC ............................................................................................ 602 CRC liczone programowo ...................................................................................... 604 Transmisja pakietowa ................................................................................................... 605 Uniwersalny pilot ......................................................................................................... 608 Interfejs IrDA i IRCOM ............................................................................................... 613 Skorowidz .................................................................................... 615 Poleć książkęKup książkę 10 AVR. Praktyczne projekty Poleć książkęKup książkę Rozdziaä 10. Przerwania i kontroler przerwaþ Przerwania Przerwania są jednym z najwaĪniejszych elementów w Ğwiecie mikrokontrolerów, z dru- giej strony ich poprawne wykorzystanie i oprogramowanie nastrĊcza najwiĊcej trudnoĞci. Rozdziaá ten wiĊkszoĞü z nich powinien wyjaĞniü i zachĊciü nas do szerokiego stoso- wania narzĊdzia, które wáaĞciwie wykorzystane daje niesamowite moĪliwoĞci. Jest to o tyle istotne, Īe przykáady znajdujące siĊ w kolejnych rozdziaáach w znakomitej wiĊkszo- Ğci bazują na przerwaniach. Czym sñ przerwania? Na to pytanie najproĞciej odpowiedzieü, pokazując przykáad z Īycia codziennego. Wy- obraĨ sobie, Īe grasz w swoją ulubioną grĊ i nagle dzwoni telefon. W tym momencie istnieją dwie moĪliwoĞci: 1. Zignorowanie telefonu (brak odpowiedzi na przerwanie). 2. Odebranie telefonu (obsáuga przerwania). Jednak trudno jest jednoczeĞnie skupiü siĊ na dwóch róĪnych rzeczach (np. grze we wciągającą grĊ i rozmowie przez telefon). Trzeba wiĊc je zrobiü sekwencyjnie — prze- rwaü grĊ, zatrzymaü ją w pewnym punkcie (np. zapisaü stan gry), a nastĊpnie odebraü telefon i rozpocząü rozmowĊ. Po jej zakoĔczeniu moĪna wróciü do przerwanej gry, odtwarzając jej stan np. z zapisanego pliku na dysku. Dokáadnie tak samo wygląda obsáuga przerwaĔ w Ğwiecie mikrokontrolerów. PoniewaĪ CPU mikrokontrolera XMEGA w danym czasie potrafi realizowaü tylko jeden wątek, na czas przerwania jego wyko- nanie musi zostaü przerwane, a jego stan zapisany. DziĊki temu procesor bĊdzie mógá rozpocząü realizacjĊ innego wątku (obsáugi przerwania) — rysunek 10.1. Poleć książkęKup książkę 286 AVR. Praktyczne projekty Rysunek 10.1. Po otrzymaniu sygnaáu przerwania procesor przerywa bieĪący wątek i rozpoczyna funkcjĊ obsáugi przerwania. Po jej zakoĔczeniu wraca do przerwanego wczeĞniej wątku Program gųówny Funkcje obsųugi przerwaŷ IRQ1 ISR1 W prawdziwym Ğwiecie potrzebujemy na zmianĊ wykonywanego zadania pewien czas (zapisanie gry i podniesienie sáuchawki), takĪe mikrokontroler potrzebuje trochĊ czasu na obsáuĪenie przerwania. Czas ten — nazywany czasem latencji (ang. Latency time) — jest mu potrzebny na dokoĔczenie aktualnie wykonywanej instrukcji oraz zapisanie stanu bieĪącego wątku (automatycznie zapisywany jest wyáącznie rejestr stosu SP), dziĊki temu po zakoĔczeniu obsáugi przerwania bĊdzie mógá go wznowiü. Z drugiej strony funkcja obsáugi przerwania (ISR, ang. Interrupt handler/service routine) teĪ potrze- buje trochĊ czasu — w tak zwanym prologu funkcji (generowanym automatycznie przez kompilator) zapisywane są wszystkie rejestry procesora, które funkcja zmienia. Przed jej zakoĔczeniem ich stan jest odtwarzany w czasie wykonywania tzw. epilogu funkcji (on równieĪ jest generowany automatycznie przez kompilator). DziĊki temu przerwany wątek jest wznawiany w dokáadnie takim samym stanie, w jakim zostaá przerwany — a wiĊc z jego punktu widzenia procesor zachowuje siĊ tak, jakby prze- rwania w ogóle nie byáo. Pamiötaj, Ĕe kompilator generuje wyäñcznie kod zachowujñcy stan rejestrów proceso- ra. JeĈli funkcja zmieni stan tzw. rejestrów IO lub pamiöci, to nie zostanie on od- tworzony po wyjĈciu z funkcji obsäugi przerwania. Przerwania maskowalne Wróümy jeszcze do przedstawionej wczeĞniej analogii. W chwili zgáoszenia przerwa- nia (usáyszenia dzwonka telefonu) mamy moĪliwoĞü zignorowania tego sygnaáu (Īąda- nia przerwania, ang. Interrupt request) lub rozpoczĊcia czynnoĞci przygotowujących do obsáugi tego zdarzenia. Podobny wybór ma takĪe procesor. Przerwania moĪna za- blokowaü caákowicie, co jest realizowane poprzez wyzerowanie specjalnej flagi (I, ang. Interrupt) rejestru stanu procesora instrukcją CLI (w jĊzyku C jej odpowiednikiem jest makrodefinicja cli()); moĪna je takĪe odblokowaü instrukcją asemblera SEI (w C jej odpowiednikiem jest sei()). Przerwania, które moĪemy blokowaü, nazywane są prze- rwaniami maskowalnymi. Poleć książkęKup książkę Rozdziaä 10. i Przerwania i kontroler przerwaþ 287 Po zablokowaniu przerwaþ nie bödñ one obsäugiwane, lecz ciñgle procesor bödzie zapamiötywaä fakt, Ĕe odpowiednie Ĕñdania zostaäy zgäoszone, zostanñ one zrealizo- wane zaraz po odblokowaniu przerwaþ. Przypomina to trochĊ sytuacjĊ, w której grając, co prawda nie odebraliĞmy telefonu, ale zerknĊliĞmy, aby sprawdziü, kto dzwoniá. Po zakoĔczeniu gry (o ile bĊdziemy o tym ciągle pamiĊtaü) moĪemy do takiej osoby oddzwoniü. Dokáadnie tak samo zachowują siĊ Īądania przerwaĔ w sytuacji, gdy przerwania są zablokowane — zostaną one zreali- zowane w chwili, w której obsáuga przerwaĔ zostanie ponownie wáączona. Jednak pro- cesor ma ograniczone zdolnoĞci do zapamiĊtywania ĪądaĔ przerwaĔ. Zazwyczaj z kaĪ- dym Ĩródáem przerwaĔ związana jest flaga okreĞlająca, czy dane Īądanie wystąpiáo, czy nie. Jedna flaga przechowująca informacjĊ bitową nie jest w stanie zapamiĊtaü, ile ĪądaĔ przerwaĔ z danego Ĩródáa zostaáo zgáoszonych — w efekcie jeĞli ĪądaĔ byáo wiĊcej niĪ jedno, po odblokowaniu przerwaĔ zostanie zrealizowane wyáącznie jedno — o pozostaáych procesor „zapomni”. Wracając do naszej analogii, sytuacja wygląda tak, jakby osoba o danym numerze telefonu dzwoniáa do nas wielokrotnie. NiezaleĪnie od tego, ile razy zadzwoni, to i tak oddzwonimy wyáącznie raz. Przerwania niemaskowalne Jednak przerwania w Īyciu codziennym mają róĪną wagĊ. O ile moĪemy zignorowaü dzwoniący telefon, to nie powinniĞmy zignorowaü np. informacji z naszego UPS-a, Īe koĔczy siĊ zasilanie i komputer za chwilĊ zostanie wyáączony. Zignorowanie takiego ostrzeĪenia moĪe zakoĔczyü siĊ katastrofą (np. niezapisaniem stanu gry i utratą dotych- czasowych osiągniĊü). Mikrokontrolery XMEGA równieĪ dysponują taką „gorącą linią” — są to tak zwane przerwania niemaskowalne (NMI, ang. Non-maskable interrupts). Jak sama nazwa wskazuje, przerwaĔ tego typu nie da siĊ zablokowaü. Ich wystąpienie jest związane z zajĞciem jakichĞ krytycznych zdarzeĔ, które nie mogą pozostaü bez obsáugi. Dla XMEGA jedynym takim krytycznym zdarzeniem jest uszkodzenie ze- wnĊtrznego rezonatora kwarcowego, co powoduje utratĊ Ĩródáa sygnaáu zegarowego. Co prawda procesor XMEGA ciągle potrafi w takich okolicznoĞciach prawidáowo dziaáaü, lecz program powinien podjąü jakieĞ dziaáania — np. poinformowaü uĪyt- kownika o uszkodzeniu czĊĞci ukáadu elektronicznego. đródäa przerwaþ W mikrokontrolerach XMEGA kaĪdy ukáad peryferyjny moĪe byü Ĩródáem jednego lub wiĊcej przerwaĔ. NajczĊĞciej wykorzystywane są przerwania generowane przez:  porty IO (okreĞlony poziom logiczny na pinie IO lub jego zmiana);  ADC (zakoĔczenie konwersji, okreĞlony wynik porównania uzyskanej wartoĞci ze wzorcem);  timery (przerwania przepeánienia licznika, osiągniĊcie przez licznik okreĞlonej wartoĞci lub reakcja na zdarzenie zewnĊtrzne); Poleć książkęKup książkę 288 AVR. Praktyczne projekty  interfejsy komunikacyjne (USART, SPI, I2C) okreĞlające wysáanie lub odebranie porcji danych;  DMA — okreĞlające gotowoĞü na transfer kolejnej porcji danych. Inne ukáady peryferyjne, takie jak kontroler pamiĊci EEPROM, FLASH, moduá krypto- graficzny i inne, równieĪ mogą byü Ĩródáem przerwaĔ. Aby móc z nich skorzystaü, musimy przeprowadziü kilka etapów związanych z ich konfiguracją. Konfiguracja i obsäuga przerwaþ Podsystem przerwaĔ to ukáad, który w stosunku do innych rodzin AVR ulegá olbrzy- mim zmianom. DziĊki temu XMEGA dysponują uniwersalnym kontrolerem, zdolnym realizowaü przerwania o róĪnych priorytetach, a takĪe rozstrzygaü konflikty pomiĊdzy przerwaniami zgáaszanymi jednoczeĞnie. Dobre zapoznanie siĊ z podsystemem PMIC (ang. Programmable multi-level interrupt controller) i umiejĊtnoĞü wáaĞciwego wy- korzystania i zrozumienia przerwaĔ gwarantuje sukces w Ğwiecie mikrokontrolerów. Aby odblokowaü przerwania w XMEGA, musimy speániü kilka warunków:  naleĪy napisaü funkcjĊ obsáugi przerwania i powiązaü ja z odpowiednim wektorem przerwania;  naleĪy ustaliü poziom i odblokowaü moĪliwoĞü zgáaszania przerwania przez wybrany ukáad peryferyjny;  naleĪy zezwoliü na dany poziom przerwaĔ w kontrolerze PMIC;  naleĪy odblokowaü globalną flagĊ zezwolenia na przerwania. Widzimy, Īe procedura ta jest wieloetapowa i pozornie skomplikowana, jednak aby osiągnąü sukces z przerwaniami, naleĪy dobrze przemyĞleü kaĪdy z wymienionych kro- ków. W dalszej czĊĞci rozdziaáu zostaną szerzej omówione poszczególne punkty zwią- zane z konfiguracją i obsáugą przerwaĔ. W dalszej czĊĞci ksiąĪki zostaną teĪ pokazane liczne przykáady praktycznego uĪycia przerwaĔ. Czas odpowiedzi na Ĕñdanie przerwania PomiĊdzy zajĞciem zdarzenia wywoáującego przerwanie a jego obsáugą przez mikro- kontroler mija pewien czas. Jest on zaleĪny od aktualnego stanu mikrokontrolera (od tego, jaką realizuje instrukcjĊ). W związku z tym czas odpowiedzi nie jest staáy, co w pewnych zastosowaniach moĪe mieü znaczenie. JeĞli czas odpowiedzi musi byü staáy, musimy zastosowaü specjalne techniki. W XMEGA od chwili zgáoszenia prze- rwania do chwili wejĞcia do funkcji jego obsáugi mija co najmniej 8 cykli, z czego 5 cy- kli zajmuje odáoĪenie na stosie adresu powrotu, a kolejne 3 cykle zajmuje wykonanie instrukcji skoku znajdującej siĊ pod adresem danego wektora przerwania do funkcji Poleć książkęKup książkę Rozdziaä 10. i Przerwania i kontroler przerwaþ 289 obsáugi przerwania. Kiedy procesor w chwili zgáoszenia przerwania wykonuje in- strukcjĊ zajmującą wiĊcej niĪ jeden cykl, to przed wejĞciem w przerwanie instrukcja ta jest najpierw koĔczona, co wydáuĪa czas potrzebny do wejĞcia do funkcji obsáugi prze- rwania. KaĪda funkcja obsáugi przerwania musi koĔczyü siĊ specjalną instrukcją asemblera RETI — dziĊki temu PMIC wie, Īe realizacja odpowiedniej funkcji ulegáa zakoĔczeniu, i moĪe przygotowaü siĊ do obsáugi kolejnego przerwania. Kompilujñc kod obsäugi przerwania w jözyku C, kompilator sam zadba o wäaĈciwe zakoþczenie funkcji obsäugi przerwania. Jednak wymaga to uĔycia specjalnego makra ISR, informujñcego kompilator, Ĕe ma do czynienia z funkcjñ obsäugi przerwania. WyjĞcie z funkcji obsáugi przerwania trwa kolejne 5 cykli — w tym czasie procesor pobiera ze stosu adres powrotu i áaduje go do licznika rozkazów oraz odtwarza wartoĞü wskaĨnika stosu. Funkcja obsäugi przerwania Przed odblokowaniem danego przerwania musimy okreĞliü funkcjĊ, która bĊdzie odpo- wiadaü za jego obsáugĊ. Funkcje obsáugi przerwaĔ, tzw. handlery (ang. Interrupt service routines, interrupt handlers), muszą byü „opakowane” w specjalne atrybuty informujące kompilator, Īe jest to specjalna funkcja i naleĪy ją skompilowaü w inny sposób niĪ zwykáe funkcje jĊzyka C. PoniewaĪ standard jĊzyka C nie definiuje sposobu, w jaki mają byü przez kompilator traktowane takie funkcje, ani nawet nie okreĞla, w jaki sposób je wyróĪniü, kaĪdy kompilator cechuje siĊ nieco innym podejĞciem. Aby nie wchodziü w zbĊdne szczegóáy, wystarczy powiedzieü, Īe avr-gcc wymaga, aby funkcje obsáugi przerwaĔ byáy wyróĪnione atrybutem interrupt, wymagającym kilku parametrów, m.in. numeru wektora przerwaĔ, z którym dana funkcja zostanie powiązana. Jednak AVR-libc wprowadza wygodne makro o nazwie ISR. DziĊki temu w najprostszym przypadku funkcjĊ obsáugi przerwania definiuje siĊ poprzez podanie nazwy wektora przerwania, którego obsáugą ma zająü siĊ pisana funkcja: ISR(TCC0_OVF_vect) { if(ACA_STATUS AC_AC0STATE_bm) PORTA.OUTSET=0b01000000; else PORTA.OUTCLR=0b01000000; } PowyĪszy przykáadowy kod bĊdzie wywoáywany, zawsze kiedy wystąpi przerwanie nadmiaru timera TCC01. Pamiötaj, Ĕe funkcje obsäugi przerwaþ nie wymagajñ wczeĈniejszego utworzenia proto- typu funkcji. Nigdy wiöc ich prototypów nie umieszcza siö w plikach nagäówkowych. NaleĪy teĪ zawsze sprawdziü poprawnoĞü pisowni makra ISR — zamiana literek spo- woduje, Īe kompilator skompiluje kod, tworząc funkcjĊ domyĞlną, jednak nie bĊdzie to funkcja obsáugi przerwania i nie zostanie ona powiązana z odpowiednim wektorem. 1 O ile odblokujemy taką moĪliwoĞü. Poleć książkęKup książkę 290 AVR. Praktyczne projekty W efekcie program nie bĊdzie dziaáaá zgodnie z zaáoĪeniami. JeĞli na przykáad zmie- nimy pokazaną wczeĞniej funkcjĊ na: IRS(TCC0_OVF_vect) { if(ACA_STATUS AC_AC0STATE_bm) PORTA.OUTSET=0b01000000; else PORTA.OUTCLR=0b01000000; } to otrzymamy tylko ostrzeĪenia: Warning 1 return type defaults to int [enabled by default] Warning 2 type of __vector_14 defaults to int [enabled by default] Warning 3 control reaches end of non-void function [-Wreturn-type] Dzieje siĊ tak, poniewaĪ kompilator tworzy domyĞlną funkcjĊ, a funkcje takie w jĊzyku C zwracają jeden wynik o typie int. Takie ostrzeĪenia áatwo przegapiü, tym bardziej Īe jeĞli program skáada siĊ z wielu plików Ĩródáowych, zostaną one wygenerowane wy- áącznie w sytuacji, gdy kompilowany jest plik zawierający powyĪszą definicjĊ. Jest to jeszcze jeden powód, aby pisaè programy tak, aby po kompilacji byäo zawsze 0 bäödów i 0 ostrzeĔeþ. JeĈli nie bödziemy siö trzymaè tej zasady, to w gñszczu innych ostrzeĔeþ pojawienie siö takiego jak powyĔsze äatwo przeoczyè. Wykrycie miejsca bäödnego dziaäania programu bödzie ekstremalnie trudne. Jak widzimy, kaĪda funkcja obsáugi przerwania powiązana jest z tzw. wektorem prze- rwania. KaĪdy ukáad mogący generowaü przerwanie posiada przeznaczony wyáącznie dla niego wektor przerwania. JeĞli ukáad peryferyjny moĪe generowaü kilka typów przerwaĔ, to zazwyczaj posiada oddzielne wektory dla kaĪdego typu. Wektory przerwaþ Ukáady peryferyjne posiadają przypisane im tzw. wektory obsáugi przerwaĔ (ang. ISR vectors). KaĪdy podsystem posiada jeden lub wiĊcej takich wektorów. Zgáoszenie prze- rwania powoduje wywoáanie funkcji obsáugi przerwania (ISR) powiązanej z jego wektorem (rysunek 10.2). Rysunek 10.2. Zgáoszenie przerwania (IRQ2) powoduje przerwanie aktualnego wątku i odczytanie wektora przerwania z nim powiązanego (ISR2_vect). Wektor ten zawiera adres funkcji obsáugi przerwania (ISR2). Po jej zakoĔczeniu wznawiane jest wykonywanie przerwanego wątku IRQ2 Program gųówny Wektory funkcji obsųugi przerwaŷ Funkcje obsųugi przerwaŷ ISR1_vect ISR2_vect ... ISR(n-1)_vect ISR(n)_vect ISR2 Poleć książkęKup książkę Rozdziaä 10. i Przerwania i kontroler przerwaþ 291 Wszystkie wektory są zgrupowane razem, tworząc tzw. tablicĊ wektorów przerwaĔ (ang. Interrupt vector table, IVT). Tablica ta rozpoczyna siĊ na początku pamiĊci FLASH (od adresu 0x0002), ale jej początek moĪe byü zmieniony na początek sekcji tzw. bo- otloadera — wydzielonego obszaru pamiĊci, w którym rezyduje program umoĪliwiają- cy zmianĊ pozostaáej czĊĞci pamiĊci FLASH — w celu np. uaktualnienia znajdującej siĊ w niej aplikacji. TabelĊ wektorów przerwaĔ moĪemy przenieĞü do obszaru bootloadera, ustawiając bit IVSEL rejestru kontrolnego PMIC (PMIC_CTRL) — rysunek 10.3. FLASH 0x0000 0x0002 BOOTRST=1 IVSEL=0) IVT RESET_vect ISR1_vect ISR2_vect ... ISR(n-1)_vect ISR(n)_vect Bootloader Bootloader + 0x0002 BOOTRST=1 IVSEL=1) IVT RESET_vect BOOTRST=0 IVSEL=0) IVT BOOTRST=0 IVSEL=1) IVT ISR1_vect ISR2_vect ... ISR(n-1)_vect ISR(n)_vect RESET_vect RESET_vect ISR1_vect ISR2_vect ... ISR(n-1)_vect ISR(n)_vect ISR1_vect ISR2_vect ... ISR(n-1)_vect ISR(n)_vect Rysunek 10.3. PoáoĪenie wektora RESET i tablicy wektorów przerwaĔ (IVT) w zaleĪnoĞci od ustawienia fusebitu BOOTRST i bitu konfiguracyjnego IVSEL Tu jednak mogą kryü siĊ pewne problemy. OtóĪ bit konfiguracyjny IVSEL jest chroniony przed zmianą za pomocą znanego juĪ nam rejestru ochrony konfiguracji CCP. Aby go zmieniü, musimy wczeĞniej do rejestru CCP wpisaü odpowiedni kod odblokowujący — wartoĞü 0xD8 lub symbolicznie CPP_IOREG_gc. Jednak zmieniając bit IVSEL, nie chcemy zmieniaü stanu innych bitów tego rejestru. W tym celu naturalna wydaje siĊ byü sekwencja: CCP=CCP_IOREG_gc; //Odblokuj moĪliwoĞü zmiany IVSEL PMIC_CTRL|=PMIC_IVSEL_bm; //PrzenieĞ IVT w obszar normalnej pamiĊci FLASH Niestety powyĪszy kod, o czym áatwo moĪemy siĊ przekonaü w symulatorze, nie spowo- duje zmiany stanu bitu IVSEL. Przyczyna tego staje siĊ jaĞniejsza po przeanalizowaniu wygenerowanego dla powyĪszych instrukcji kodu asemblerowego: CCP=CCP_IOREG_gc; //Odblokuj moĪliwoĞü zmiany IVSEL 226: 94 bf out 0x34, r25 ; 52 PMIC_CTRL|=PMIC_IVSEL_bm; //PrzenieĞ IVT w obszar normalnej pamiĊci FLASH 228: 80 81 ld r24, Z 22a: 80 64 ori r24, 0x40 ; 64 22c: 80 83 st Z, r24 Rejestr CCP po odblokowaniu zezwala na zmianĊ konfiguracji rejestru IO w czasie mak- symalnie 4 kolejnych cykli zegara. Niestety kod zmieniający stan IVSEL trwa znacznie Poleć książkęKup książkę 292 AVR. Praktyczne projekty dáuĪej, w efekcie zmiana jest nieskuteczna. Musimy wiĊc nieco zmodyfikowaü sposób zmiany stanu IVSEL: uint8_t tmp=PMIC_CTRL | PMIC_IVSEL_bm; //PrzenieĞ IVT w obszar bootloadera CCP=CCP_IOREG_gc; //Odblokuj moĪliwoĞü zmiany IVSEL PMIC_CTRL=tmp; Tym razem nowa wartoĞü wpisywana do rejestru PMIC_CTRL zostaáa przygotowana przed wpisaniem zezwolenia na zmianĊ konfiguracji do rejestru CCP. W efekcie wygenerowany kod dziaáa prawidáowo i mieĞci siĊ w limicie czterech cykli: uint8_t tmp=PMIC_CTRL | PMIC_IVSEL_bm; //PrzenieĞ IVT w obszar bootloadera 218: e2 ea ldi r30, 0xA2 ; 162 21a: f0 e0 ldi r31, 0x00 ; 0 21c: 80 81 ld r24, Z 21e: 80 64 ori r24, 0x40 ; 64 CCP=CCP_IOREG_gc; //Odblokuj moĪliwoĞü zmiany IVSEL 220: 98 ed ldi r25, 0xD8 ; 216 222: 94 bf out 0x34, r25 ; 52 PMIC_CTRL=tmp; 224: 80 83 st Z, r24 W podobny sposób moĪemy takĪe skasowaü bit IVSEL: tmp=PMIC_CTRL ~PMIC_IVSEL_bm; //PrzenieĞ IVT w obszar normalnej pamiĊci FLASH CCP=CCP_IOREG_gc; //Odblokuj moĪliwoĞü zmiany IVSEL PMIC_CTRL=tmp; Powiązanie pomiĊdzy wektorem przerwania a funkcją obsáugi przerwania dokonywane jest na etapie konsolidacji programu. Aby to byáo moĪliwe, jako argument makra ISR musimy podaü poprawną nazwĊ wektora przerwania, dziĊki czemu linker wygeneruje kod odpowiedzialny za wywoáanie naszej funkcji. Puste wektory przerwaþ KaĔde odblokowane przerwanie musi posiadaè funkcjö je obsäugujñcñ. Stąd teĪ nigdy nie powinniĞmy odblokowywaü przerwania, jeĞli z jego wektorem nie jest powiązana Īadna funkcja obsáugi. DomyĞlnie AVR-libc dba, aby z kaĪdym niewy- korzystanym wektorem powiązana byáa prosta funkcja obsáugi. Funkcja ta o etykiecie __bad_interrupt ma prostą budowĊ: 0000023e __bad_interrupt : 23e: 0c 94 00 00 jmp 0 ; 0x0 __vectors Jak widzimy, jej zadaniem jest skok pod adres wektora resetu procesora. W efekcie jeĞli odblokujemy przerwanie, dla którego nie ma funkcji go obsáugującej, kontrolĊ przej- mie domyĞlna funkcja. Stąd teĪ jeĞli takie przerwanie zostanie obsáuĪone, to spowoduje ono reset procesora. Jest to jakieĞ rozwiązanie, lecz nie jest ono zbyt optymalne — ta- kie zachowanie tak naprawdĊ nie prowadzi do resetu, lecz do rozpoczĊcia wykonywania programu od nowa. Nie jest to w stanie rozwiązaü problemu, a nawet potencjalnie Poleć książkęKup książkę Rozdziaä 10. i Przerwania i kontroler przerwaþ 293 moĪe problem nasiliü — w wyniku takiej inicjalizacji nie jest przywracany stan po- czątkowy urządzeĔ peryferyjnych, w tym urządzeĔ mogących generowaü przerwania. W záoĪonych programach moĪe prowadziü to do kompletnej katastrofy. OczywiĞcie w poprawnie napisanym programie nigdy nie powinno dojĞü do sytuacji, w której od- blokowane jest przerwanie bez funkcji jego obsáugi. Lecz wystarczy pomyliü siĊ w nazwie wektora lub zastosowaü niewáaĞciwy wektor, aby popaĞü w problemy. Jak je rozwią- zaü? Tu znowu z pomocą przychodzi nam AVR-libc. UmoĪliwia ona implementacjĊ wáasnej domyĞlnej funkcji obsáugi przerwaĔ, w tym celu naleĪy ją tylko zdefiniowaü: ISR(BADISR_vect) { //Tu naleĪy umieĞciü wáasną domyĞlną obsáugĊ } Tak zdefiniowana funkcja bĊdzie wywoáywana w sytuacji, w której brakuje wáaĞciwej funkcji obsáugi przerwania. MoĪemy w niej zdefiniowaü sposób reakcji na taką báĊd- ną sytuacjĊ, np. zasygnalizowanie w jakiĞ sposób problemu lub wysáanie informacji do programisty o zaistniaáej sytuacji. Funkcja taka ma szczególne znaczenie na etapie debugowania kodu, kiedy tego typu báĊdy mogą siĊ zdarzyü. Jej wáaĞciwa implemen- tacja moĪe zaoszczĊdziü nam sporo czasu przy debugowaniu kodu stwarzającego problem na przykáad na skutek báĊdnie zapisanego wektora przerwania. Puste przerwania W pewnych sytuacjach odblokowujemy przerwanie, lecz wcale nie chcemy go obsáu- giwaü. Dlaczego? Wywoáanie przerwania ma zwykle jeden istotny skutek — wejĞcie do funkcji jego obsáugi kasuje flagĊ związaną z danym przerwaniem. I czasami ska- sowanie tej wáaĞnie flagi jest istotne. Oczywistym rozwiązaniem jest zdefiniowanie funkcji obsáugi niezawierającej Īadnych instrukcji: ISR(TCC0_CCA_vect) {}; Nie jest to jednak dobre rozwiązanie — kompilator dla tak zdefiniowanej funkcji ob- sáugi wygeneruje minimalny prolog i epilog: ISR(TCC0_CCA_vect) {}; 25c: 1f 92 push r1 25e: 0f 92 push r0 260: 0f b6 in r0, 0x3f ; 63 262: 0f 92 push r0 264: 11 24 eor r1, r1 266: 0f 90 pop r0 268: 0f be out 0x3f, r0 ; 63 26a: 0f 90 pop r0 26c: 1f 90 pop r1 26e: 18 95 reti Twórcy AVR-libc przewidzieli tĊ sytuacjĊ i zdefiniowali specjalne makro, które jako argument przyjmuje nazwĊ wektora: EMPTY_INTERRUPT(TCC0_CCA_vect); Poleć książkęKup książkę 294 AVR. Praktyczne projekty Tak wygenerowany kod ciągle nie jest optymalny, ale jest zdecydowanie lepszy niĪ poprzedni: EMPTY_INTERRUPT(TCC0_CCA_vect); 262: 18 95 reti W tym przypadku obsáuga przerwania skáada siĊ z dwóch instrukcji — jmp/rjmp umieszczonej pod adresem wektora oraz reti koĔczącej przerwanie. Dalsza optyma- lizacja wymagaáaby bezpoĞredniej ingerencji w podstawowe funkcje biblioteki i za- zwyczaj nie ma wiĊkszego sensu. Warto jednak pamiĊtaü, Īe wykonanie nawet pustej funkcji obsáugi przerwania zajmuje parĊ taktów procesora. Wspóädzielenie kodu przez przerwania Czasami zdarza siĊ, Īe ten sam kod obsáugi przerwania moĪemy wykorzystaü dla róĪnych przerwaĔ. W takiej sytuacji zgodnie z duchem jĊzyka C powinniĞmy wspóádzielony kod umieĞciü w zewnĊtrznej funkcji, którą bĊdziemy wywoáywaü z obu funkcji obsáugi przerwania, np.: void shared_code() //Kod wspóádzielony przez dwie funkcje { } ISR(TCC0_CCA_vect) { shared_code(); }; ISR(TCC0_CCB_vect) { shared_code(); }; Widzimy, Īe obie funkcje obsáugi wykorzystują ten sam kod. Rozwiązanie to jest jak najbardziej poprawne, lecz niezbyt optymalne. Dlaczego? Po pierwsze, nasza funkcja shared_code moĪe zostaü osadzona w miejscu wywoáania, co wydáuĪy wygenerowany kod. JeĞli z kolei nie zostanie osadzona, to zostanie wygenerowane jej wywoáanie ze wszystkimi tego konsekwencjami (czas potrzebny na skoki, koniecznoĞü zachowania stanu niektórych rejestrów). W obu sytuacjach zostaną wygenerowane osobne prologi i epilogi funkcji, które jak widzieliĞmy na poprzednich przykáadach, bywają dáugie. Czyli obie sytuacje nie są optymalne. Tu znowu mamy rozwiązanie eleganckie. Zakáa- dając, Īe mamy zdefiniowaną funkcjĊ obsáugi przerwania o wektorze TCC0_CCA_vect, a funkcja o wektorze TCC0_CCB_vect jest identyczna, moĪemy ją zdefiniowaü, wykorzy- stując moĪliwoĞü tworzenia aliasów: ISR(TCC0_CCB_vect, ISR_ALIASOF(TCC0_CCA_vect)); Alias powoduje, Īe dwa wektory przerwaĔ wskazują na tĊ samą funkcjĊ, nie są wiĊc generowane oddzielne prologi i epilogi, a powstaáy kod jest optymalny. W naszym przy- padku oba uĪyte wektory bĊdą wskazywaü na tĊ samą funkcjĊ obsáugi, dziĊki umiesz- czeniu w tabeli wektorów przerwaĔ instrukcji skoku do tego samego handlera: 40: 0c 94 31 01 jmp 0x262 ; 0x262 __vector_16 44: 0c 94 31 01 jmp 0x262 ; 0x262 __vector_16 Poleć książkęKup książkę Rozdziaä 10. i Przerwania i kontroler przerwaþ 295 Atrybut naked i obsäuga przerwaþ w asemblerze Procedura obsáugi przerwania powinna byü moĪliwie najkrótsza. Zapewnia to bez- problemową obsáugĊ przerwaĔ. Aby mieü peáną kontrolĊ nad kodem wygenerowanym przez kompilator, czasami trzeba napisaü procedurĊ obsáugi przerwania w asemblerze. Kod asemblerowy moĪemy dodaü jako krótką wstawkĊ w procedurze obsáugi prze- rwania napisanej w jĊzyku C lub moĪemy caáą funkcjĊ napisaü w asemblerze. Najpro- Ğciej w tym celu wykorzystaü wbudowany w kompilator jĊzyka C asembler. Napisanie ciaáa funkcji w asemblerze nie daje nam jednak kontroli nad tworzonym automatycz- nie prologiem i epilogiem funkcji, którego celem jest zachowanie stanu wszystkich uĪywanych rejestrów procesora, w tym szczególnie rejestru stanu procesora (ang. Flags). MoĪemy zabroniü kompilatorowi tworzenia prologu i epilogu, stosując atrybut ISR_NAKED, który jest zdefiniowany nastĊpująco: # define ISR_NAKED __attribute__((naked)) Po
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

AVR. Praktyczne projekty
Autor:

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: