Jarosław Doliński
Książka jest kompletnym przewodnikiem po rodzinie mikrokontrolerów AVR, ze szczególnym uwzględnieniem mikrokontrolera AT90S23I3. Czytelnik znajdzie w książce informacje o budowie i architekturze mikrokontrolerów AVR. sposobach ich programowania, zalecanych warunkach pra cy, budowie i działaniu modułów peryferyjnych, a także parametrach elektrycznych i czasowych. Szczegółowo przedstawiono listę rozkazów asemblera, programy narzędziowe (m.in. AVR Studio oraz VM Lab) i kompilatory (w tym bezpłatny kompilator języka C - AVR-GCC). Praktyków szczególnie zainteresują przykładowe projekty, opisane w ramach 11 ćwiczeń laboratoryjnych (wszystkie programy napisano w języku C). Oprócz przykładów klasycznych (jak np. obsługa alfa numerycznego wyświetlacza LCD, klawiatury, czy interfejsu RS232) przedstawiono także wiele przykładów nowoczesnych, jak choćby ilustrację sposobu dołączenia mikrokontrolera AVR do in terfejsu USB, współpracę mikrokontrolerów AVR z układami wyposażonymi w interfejs 1-Wire (iButtori), czy regulowanie obrotów silników DC za pomocą przebiegów PWM. W książce przedstawiono opis programatora ISP, który umożliwia programowanie pamięci mikro kontrolerów AVR po zainstalowaniu ich w docelowym urządzeniu oraz zestawu ewaluacyjnego, który służył do zweryfikowania wszystkich projektów opisanych w książce. Programy źródłowe do wszystkich przykładów opisanych w książce są dostępne na stronie interne towej http://wwwMc.pVindex.php?id-Qvr. Redaktor merytoryczny; Krzysztof Powala ISBN 83-910067-6-X © Copyright by Wydawnictwo BTC Warszawa 2003.
Wydawnictwo
V
btc
Wydawnictwo BTC ul. Inowłodzka 5 03-237 Warszawa fax: (22) 782-42-90 http://www.btc.pl e-mail:
[email protected] Wydanie 1. Warszawa 2003. Wszysikie znaki występujące w tekście są zaśnieżonymi znakami Firmowymi bądt towarowymi ich właścicieli. Autor oraz wydawnictwo BTC dołożyli wszelkich starań, by zawarte w lej książce informacje były kompletne i rzetelne. Nie biori| jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za zwiazune z lym ewentualne naruszenie praw patento wych lub autorskich. Aolor oraz wydawnictwo BTC nie ponoszi| również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce. Wszelkie pruwa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fnigmeitto* niniejszej publikacji w jakiej kolwiek postaci JCM zabronione. Wykonywanie kopii metoda, kserograficzna., fotograficzna, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji. Druk i oprawa: Lodzka Drukarnia Dziełowa S.A.
Spis treści C z ę ś ć 1. I n f o r m a c j e p o d s t a w o w e Wstęp
8
1.
Trochę historii
2.
Charakterystyka mikrokontrolerów AVR
11
Rodzina A V R - podstawy
13
3.
3.1.
Funkcje wyprowadzeń
9
16
Część 2 . B u d o w a i działanie m i k r o k o n t r o l e r ó w A V R 4.
Architektura mikrokontrolerów AVR
20
4.1.
Generator taktujący
23
4.2.
Rejestry ogólnego przeznaczenia
24
4.3.
Jednostka arytmetyczno-Iogiczna (ALU)
26
4.4.
Pamięć programu
26
4.5.
Nieulotna pamięć danych EEPROM
26
4.6.
Pamięć danych SRAM
27
4.7.
Tryby adresowania pamięci danych i pamięci programu 28 4.7.1. Tryb bezpośredniego adresowania rejestrów wykorzystujący pojedynczy rejestr 28 4.7.2. Tryb bezpośredniego adresowania rejestrów wykorzystujący dwa rejestry 29 4.7.3. Tryb bezpośredniego adresowania obszaru wejścia/wyjścia 30 4.7.4. Tryb bezpośredniego adresowania pamięci danych 30 4.7.5. Tryb pośredniego adresowania danych z przemieszczeniem 31 4.7.6. Tryb adresowania pośredniego 32 4.7.7. Tryb adresowania pośredniego danych z predekrementacją.... 32 4.7.8. Tryb adresowania pośredniego danych z postinkrementacją 33 4.7.9. Tryb adresowania stałych z użyciem rozkazu LPM 34 4.7.10. Tryb adresowania pośredniego pamięci programu (UMP, ICALL) 34 4.7.11. Tryb adresowania względnego pamięci programu (RJMP i RCALL) 35 4.8. Przebiegi czasowe podczas dostępu do pamięci i wykonywania rozkazów 36
4.9.
Przestrzeń we/wy 4.9.1. Funkcje bitów w rejestrach funkcyjnych.... 4.10. Zerowanie i wektory przerwali 4.10.1. 4.10.2. 4.10.3. 4.10.4.
Źródła sygnału zerującego Uchwyty przerwań Przerwania zewnętrzne Czas odpowiedzi na zgłoszenie przerwania
38 40 42 44 47 53 54
5 6
4.11. Tryby oszczędzania energii 4.11.1. 4.11.2. 5.
6. 7.
9.
Tryb Ule Tryb Power-Down
5 7
5 9
Timery/liczniki 5.1. 8-bitowy Timer/LicznikO 5.2. 16-bitowy Timer/Licznikl
60 62
5.3.
71
Timer/Licznikl w trybie PWM
7
Watchdog Pamięć danych EEPROM 7.1. 7.2.
8.
5 7
5
?9
Zapis i odczyt pamięci Zapewnienie prawidłowych warunków pracy pamięci EEPROM
Układ transmisji szeregowej (UART)
79 84 85
8.1.
Budowa i działanie nadajnika UART
86
8.2.
Budowa i działanie odbiornika UART
87
8.3.
Sterowanie transmisją
90
8.4.
Generator podstawy czasu transmisji {Baud Rate Generator)
93
Komparator analogowy
96
10. Porty wejścia-wyjścia (I/O)
99
10.1. Budowa portu B 10.1.1. Port B jako cyfrowy port we/wy ogólnego przeznaczenia .... 10.1.2. Funkcje alternatywne portu B 10.1.3. Budowa linii portu B 10.2. Budowa portu D 10.2.1. Port Djako cyfrowy port we/wy ogólnego przeznaczenia.... 10.2.2. Funkcje alternatywne portu D 10.2.3. Budowa linii portu D 11. Pamięci nieulotne w mikrokontrolerach AVR
99 101 102 103 106 108 108 110 113
11.1. Bity zabezpieczające pamięć programu i danych 11.2. Bity konfiguracyjne 11.3. Sygnatury
114 115 116
11.4. Programowanie pamięci Flash i EEPROM 11.4.1. Programowanie równoległe 11.4.2. Programowanie szeregowe
116 116 123
,
Część 3 . Lista rozkazów 12. Zestawienie rozkazów mikrokontrolera AT90S2313 12.1. Opis działania rozkazów _
128 ]36
Część 4. Narzędzia i projekty przykładowe 13. Narzędzia projektowe
278
13.1. AVR Assembler for Windows
279
13.2. Kompilator języka C - AVR-GCC wersja 3.2 13.2.1. Instalacja kompilatora
283 284
13.3. AVR Studio wersja 3.56 13.3.1. Przygotowanie programów pisanych w asemblerze do symulacji w A V R Studio 3.56 13.3.2. Integracja programu AVR Studio 3.56 z kompilatorem AVR-GCC 13.3.3. Symulacja programów w AVR Studio V. 3.56 13.4. Symulator Visual Micro Lab 3.56 13.5. Programowanie pamięci programu w systemie (ISP) 13.5.1. Programator ZL2PRG 14. Przykładowe aplikacje 14.1. Zestaw uruchomieniowy ZL1AVR
284 285 287 290 295 300 300 303 304
14.1.1. Zasilanie zestawu 307 14.1.2. Taktowanie i zerowanie mikrokontrolera 307 14.1.3. Wykorzystywanie portów mikrokontrolera 308 14.1.4. Klawiatura 309 14.1.5. Interfejs RS232 310 14.1.6. Diody L E D 310 14.1.7. Wyświetlacz alfanumeryczny LCD 311 14.1.8. Interfejsy P C i 1-Wire 311 14.1.9. Przetwornik analogowo-cyfrowy 312 14.1.10. Programowanie mikrokontrolera w systemie (ISP) 315 14.2. Ćwiczenia praktyczne 317 14.2.1. Ćwiczenie 1 317 Sterowanie portami mikrokontrolera w trybie wyjściowym • efekt węża świetlnego i biegnącego punktu na linijce diod LED 14.2.2. Ćwiczenie 2 320 Wykorzystanie timera do odmierzania czasu w trybie odpytywa nia (generator przebiegu prostokątnego o częstotliwości 1 kHz) 14.2.3. Ćwiczenie 3 323 Sterowanie portami mikrokontrolera w trybie wejściowym, wyko rzystanie timera do odmierzania czasu z wykorzystaniem przerwań - obsługa przycisków dołączonych do portów mikrokontrolera 14.2.4. Ćwiczenie 4 328 „Hello World!", czyli sterowanie wyświetlaczem alfanumerycz nym LCD 16x2 i 16x1. Obsługa pojedynczego przycisku J4.2.5. Ćwiczenie 5 343 „Łapanie muchy", czyli obsługa klawiatury matrycowej z wykorzystaniem przerwań timera, obsługa wyświetlacza alfanumerycznego LCD 16 x2 14.2.6. Ćwiczenie 6 351 6-bitowy, binarny wskaźnik napięcia. Zastosowanie komparato ra analogowego do budowy przetwornika analogowo-cyfrowego. Wyzwalanie funkcji przechwytywania Timeral za pomocą komparatora. Przerwanie od przechwytywania Timeral. Obsłu ga wewnętrznej pamięci EEPROM
14.2.7.
Ćwiczenie 7 Regulacja obrotów silnika DC. Wykorzystanie Timeral modulatora PWM. Obsługa pojedynczych klawiszy
357 jako
14.2.8.
Ćwiczenie 8 >3 Sterowanie obrotami silnika DC z komputera PC. Wykorzysta nie Timeral jako modulatora PWM. Wykorzystanie UART-a mikrokontrolera do prowadzenia transmisji szeregowej pomiędzy płytką ZUAVR a komputerem PC
3f
14.2.9.
Ćwiczenie 9 374 Obsługa interfejsu 1-Wire. Odczyt pastylki identyfikacyjnej Dallasa - DS1990A. Obsługa wyświetlacza LCD 16x2 14.2.10. Ćwiczenie 10 388 Obsługa interfejsu fiC. Obsługa przerwania zewnętrznego. Wykorzystanie układu PCF8583 (RTC - Real Time Clock) do bu dowy zegara 24-godzinnego. Obsługa wyświetlacza LCD 16x2 14.2.11. Ćwiczenie 11 408 Podłączenie mikrokontrolera AVR do komputera PC przez port USB. Obsługa nadajnika i odbiornika UART z wykorzystaniem systemu przerwań. Obsługa wyświetlacza LCD 16x2
Dodatki Dodatek A. Podstawowe parametry mikrokontrolerów z rodziny AVR
420
Dodatek B. Zestawienie rejestrów mikrokontrolera AT90S2313
422
Dodatek C. Wybrane charakterystyki elektryczne i czasowe mikrokontrolera AT90S2313 Dodatek D
424
D . l . Dopuszczalne parametry elektryczne mikrokontrolera AT90S2313 D.2. Parametry czasowe zewnętrznego sygnału zegarowego Dodatek E. Wyprowadzenia typowych wyświetlaczy LCD i VFD z interfejsem równoległym
428 430 431
Dodatek F. Instalacja sterowników dla układu FT8U232BM w systemie operacyjnym Windows 432 Dodatek G G.l. Płytka drukowana zestawu ZL1AVR G.2. Płytka drukowana programatora ZL2PRG Dodatek H. Wybrane adresy internetowe związane z mikrokontrolerami AVR Dodatek I 1.1. Tablica kodów ASCII 1.2. Znaki zawarte w generatorze znaków sterownika HD44870 Skorowidz
439 442 443 445 447
Wstęp Postęp techniczny i technologiczny, jaki obserwujemy od wielu lat na świe cie, wymusza na konstruktorach konieczność ciągłego śledzenia
pojawiają
cych się nowości i uwzględniania ich w swojej pracy. Ilość informacji, przez jaką powinien przebrnąć n a co dzień każdy inżynier, aby b y ć „na bieżąco", coraz częściej sięga granic możliwości. D o s t ę p d o literatury technicznej, bez porównania lepszy niż choćby dziesięć lat temu, w d a l s z y m ciągu wydaje się j e d n a k daleki od wystarczającego. Świadczą o tym c h o ć b y c z ę s t o spotykane pytania „od czego zacząć, gdzie zdobyć p o d s t a w o w e n a r z ę d z i a " itp., bez ustannie pojawiające się n a różnych internetowych g r u p a c h
dyskusyjnych
oraz w Ustach d o czasopism o tematyce elektronicznej. Książka powstała w nadziei, że przynajmniej c z ę ś c i o w o z a s p o k o i takie właś nie potrzeby. O m ó w i o n o w niej b u d o w ę m i k r o k o n t r o l e r ó w A V R , przedsta wiono listę rozkazów, a w s z y s t k o to zilustrowano w i e l o m a
przykładami
praktycznymi. Zdając sobie sprawę z o l b r z y m i e g o ich z n a c z e n i a dla zrozu mienia tematu, przykłady umieszczono wszędzie t a m , gdzie m o g ą się poja wić wątpliwości z interpretacją tekstu. Konstruktorzy stosujący mikrokontrolery podzielili się n a zwolenników pro gramowania w asemblerze i językach wysokiego poziomu, j a k n p . C lub Bascom. Zalety programowania wjczykach wysokiego p o z i o m u są bezsporne. Trzeba jednak pamiętać, że pewnych problemów nie da się rozwiązać bez sięg nięcia po wstawki asemblerowe. Uważam, że także ci projektanci, którzy nasta wiają się na programowanie w którymś z j ę z y k ó w wysokiego p o z i o m u , powin ni znać asembler wykorzystywanego przez nich mikrokontrolera. Znajomość ta z pewnością przyczyni się d o poznania budowy mikrokontrolera, ułatwi także zrozumienie sposobu j e g o działania. Z powyższych względów dla części przy kładów zamieszczono kody źródłowe w języku C, dla pozostałych z a ś w wersji asemblerowej. Zdecydowałem się na język C, chociaż budzi on nieuzasadnione obawy wśród początkojących programistów, gdyż niepodważalną zaletą prze mawiającą za takim właśnie wyborem jest dostępność bezpłatnego kompilatora jakim jest A V R - G C C . Narzędzie to nie jest pozbawione p e w n y c h
wad
i ułomności, co nie oznacza jednak, że nie można za j e g o pomocą stworzyć op rogramowania realizującego poważne zadania. Myślę, że w dobie walki z pi ractwem takie podejście d o sprawy znajdzie zrozumienie Czytelników. Sposób pobrania kompilatora A V R - G C C z Internetu i j e g o instalacji opisałem w odręb nym rozdziale. Jestem przekonany, że Czytelnicy, którzy zostaną „zmuszeni" w ten sposób do nauki języka C nie będą tego żałować.
Od momentu wyprodukowania pierwszego mikrokontrolera A V R minęło już kilka lat. D o d z i ś firma A t m e l rozwinęła tę r o d z i n ę n a tyle, że nie s p o s ó b w j e d n e j książce o m ó w i ć wszystkich d o s t ę p n y c h o d m i a n m i k r o k o n t r o l e r ó w . D o c e l ó w d e m o n s t r a c y j n y c h w y b r a ł e m układ A T 9 0 S 2 3 I 3 , n a bazie k t ó r e g o będą o m ó w i o n e bloki funkcjonalne występujące r ó w n i e ż w innych m i k r o kontroierach rodziny A V R . D o d a t k o w y m c z y n n i k i e m decydującym o w y b o rze j e s t s t o s u n k o w o niska c e n a t e g o mikrokontrolera. T e a r g u m e n t y p o w i n n y z a c h ę c i ć k o n s t r u k t o r ó w d o sięgnięcia p o ten układ, n a inne - bardziej r o z b u d o w a n e - przyjdzie c z a s , gdy okaże się, ż e z a s o b y 2 3 1 3 nie są wystarczające. J a k j u ż w s p o m n i a ł e m , p r z y k ł a d a m dużą w a g ę d o p r a k t y c z n e g o o d n o s z e n i a p o r u s z a n y c h w książce z a g a d n i e ń . A b y ułatwić start początkującym, wszyst kie e k s p e r y m e n t y w y k o n a ł e m n a uniwersalnej p ł y t c e u r u c h o m i e n i o w e j dla m i k r o k o n t r o l e r a A T 9 0 S 2 3 1 3 (oznaczenie Z L 1 A V R ) o p r a c o w a n e j specjalnie n a potrzeby tej książki. Jej b u d o w ę d o k ł a d n i e o p i s a ł e m w rozdziale 14.
1.
Trochę historii Elektronika o d początku s w o j e g o istnienia p r z e c h o d z i ł a wiele m o m e n t ó w p r z e ł o m o w y c h . M o ż n a p o w i e d z i e ć , że c z ę s t o d e c y d o w a ł y o n e o otaczającym nas świecie. D z i ś trudno p o w i e d z i e ć , czy w a ż n i e j s z e b y ł o w y n a l e z i e n i e l a m py e l e k t r o n o w e j , tranzystora, czy s k o n s t r u o w a n i e p i e r w s z e g o układu scalo n e g o . Niemniej w i e k o p o m n y m d z i e ł e m było niewątpliwie o p r a c o w a n i e pier w s z e g o m i k r o p r o c e s o r a . T o , c o się dzieje w e w s p ó ł c z e s n e j
elektronice,
w w i ę k s z o ś c i p r z y p a d k ó w obraca się w ł a ś n i e wokół t e g o elementu. A ż trud n o uwierzyć, że w s z y s t k o zaczęło się zupełnie n i e d a w n o , b o na początku lat 7 0 . N i e w i n n i e wyglądające z a m ó w i e n i e na specjalizowany układ, który miał b y ć z a s t o s o w a n y w elektronicznych kalkulatorach, w p ł y n ę ł o na losy świata. O d z i w o , zlecającym była j a p o ń s k a firma B u s i c o m , a w y k o n a w c ą a m e r y k a ń s k i Intel. Ja p o ń c z y c y p o s t r z e g a n i byli w t a m t y c h c z a s a c h , j a k o b a r d z o z d o l n y naród, który potrafi zrobić niemal w s z y s t k o . T o „ n i e m a l " z d e c y d o w a ł o , że dzisiaj nikt nie p a m i ę t a n a z w y B u s i c o m , a s ł o w o Intel odmieniają na c a ł y m ś w i e c i e nawet przedszkolaki. T a k powstał pierwszy m i k r o p r o c e s o r - Intel 4 0 0 4 (wygląd j e d n e j przez firmę Intel w 1971 roku z j e g o wersji p o k a z a n o n a fotografii 1.1). B y - mikroprocesora 14004 w obudoł o t o w 1971 roku, w i ę c nie jest t o historia wie ceramicznej F o t
l
t
W i d o k
o
p
r
a
c
o
m
n
e
g
o
bardzo odległa. N a obszarze 3 na 4 m m u m i e s z c z o n o 2 3 0 0 tranzystorów P - M O S Układ mógł w y k o n a ć 100 000 instrukcji w ciągu s e k u n d y , a j e g o lis ta rozkazów liczyła 45 pozycji. C h o c i a ż ż y w o t układu nie był zbyt długi (na stępca pojawił się j u ż w 1972 roku), j e g o w y p r o d u k o w a n i e s t a n o w i ł o praw dziwą „iskrę zapalną" dla prac konstrukcyjnych nad n o w y m i wersjami. Dalej wydarzenia potoczyły się bardzo szybko. W k r ó t k i m czasie powstało wiele różnych odmian mikroprocesorów, ale tym, który n a p r a w d ę rozpoczął podbój świata był Intel 8080. W a r t o p r z y p o m n i e ć , że b y ł o n p r o d u k o w a n y także w Polsce w zakładach C E M I p o d o z n a c z e n i e m M C Y 7 8 8 0 . Swoją drogą zastanawiające jest j a k to b y ł o m o ż l i w e , z w a ż y w s z y że w h a l a c h produkcyj nych dawało się w y c z u w a ć pod n o g a m i drżenia posadzki, w y w o ł y w a n e przez przejeżdżający przed fabryką t r a m w a j . Rewolucyjną rolę mikroprocesorów zauważyli też inni p r o d u c e n c i . Jednym z nich był Zilog, którego Z 8 0 przez długi c z a s skutecznie
konkurował
z 8080. Można obiektywnie stwierdzić, że w p r o c e s o r z e t y m w i e l e rzeczy unowocześniono i ulepszono. Był wygodniejszy w użyciu z a r ó w n o w trakcie projektowania części elektronicznej, j a k i w pisaniu o p r o g r a m o w a n i a . Cha rakteryzował się również większą niż 8 0 8 0 wydajnością. Jedną z cech ówcześnie p r o d u k o w a n y c h m i k r o p r o c e s o r ó w b y ł o to, że wyma gały stosunkowo r o z b u d o w a n e g o otoczenia, t w o r z o n e g o na b a z i e wyspecjali zowanych układów scalonych. Mikroprocesory były p o z b a w i o n e także ja kichkolwiek peryferiów (w postaci c h o ć b y interfejsu U A R T , wewnętrznej pamięci programu, niektóre wymagały nawet z e w n ę t r z n y c h
kontrolerów
przerwań). Dlatego właśnie kolejnym p r z e ł o m e m b y ł o o p r a c o w a n i e mikro kontrolera, czyli mikroprocesora zintegrowanego w j e d n e j o b u d o w i e z modu łami peryferyjnymi. W ten sposób powstała b a r d z o p o d o b n a d o pierwowzo ru, j e d n a k zupełnie n o w a klasa układów. N a z y w a n o j e p i e r w o t n i e mikrokom puterami j e d n o u k ł a d o w y m i , później przyjęła się n a z w a m i k r o k o n t r o l e r . Wbrew powszechnemu mniemaniu, twórcą p i e r w s z e g o na świecie mikrokon trolera jest firma T e x a s Instruments, która na początku 1975 r o k u wprowa dziła d o masowej produkcji 4-bitowe mikrokontrolery
TMS1000
(jedną
z wersji pokazano na fotografii 1.2). Z trudnych d o ustalenia o b e c n i e przy czyn mikrokontrolery te nie zdobyły wystarczająco d u ż e g o r y n k u , co - mię dzy innymi - spowodowało, że niedługo później zaczęły d o m i n o w a ć mikro kontrolery produkowane przez firmę Intel (8042, 8 0 4 8 ) . P r a w d z i w ą furorę zrobiły jednak mikrokontrolery 8051 i j e g o p o c h o d n e . U k i a d ten, c h o ć często krytykowany, niepodzielnie króluje na rynku d o dziś. N i e w ą t p l i w i e powo d e m tego jest fakt, że wielu producentów m i k r o k o n t r o l e r ó w p r o d u k u j e dzie siątki różnorodnych o d m i a n tego układu, dzięki c z e m u p r a k t y c z n i e d o każdej
aplikacji m o ż n a d o b r a ć układ z o d p o w i e d n i m i peryferiami. D o d a t k o w y m p o w o d e m p o p u l a r n o ś c i u k ł a d ó w z rodziny M C S - 5 1 j e s t to, że konstruktorzy znają architekturę zgromadzili
8051
„na
pamięć"
odpowiednie
oraz
narzędzia
sprzętowe i programowe. Co więcej, mi m o u p ł y w u wielu lat o d pojawienia się p i e r w s z y c h u k ł a d ó w z rodziny M C S - 5 1 , wciąż są o p r a c o w y w a n e n o w e , u d o s k o n a l o n e wersje 8 0 5 1 . Z p o w y ż s z y c h p o
Fot. 1.2. Jedna z wersji 4-bitowego
w o d ó w jest on często stosowany nawet
mikrokontrolera TMS1000 firmy Texas
w takich projektach, d o których m o ż n a
Instruments
znaleźć bardziej o d p o w i e d n i e o d m i a n y m i k r o k o n t r o l e r ó w , z 8 0 5 1 nie mają c y c h nic w s p ó l n e g o . Czy d o m i n a c j a ta będzie j e d n a k trwać w i e c z n i e ? Z a p e w n e nie. P o w a ż n y m k o n k u r e n t e m dla 8 0 5 1 stały się ostatnio m i k r o k o n t r o l e r y z rodziny A V R , o p r a c o w a n e zresztą przez firmę, która r o z p o c z y n a ł a swą karierę od produkcji „ k l o n ó w " 8 0 5 1 . W s z y s c y j u ż o c z y w i ś c i e wiedzą, że c h o d z i tu o firmę A t m e l , która t a k j a k Intel w latach 80., o b e c n i e staje się j e d n y m z największych n a świecie d o s t a w c ó w m i k r o k o n t r o l e r ó w 8-bitowych, a j u ż na p e w n o bije rekor dy p o p u l a r n o ś c i w P o l s c e .
2.
Charakterystyka mikrokontrolerów AVR B u d o w a m i k r o k o n t r o l e r ó w A V R opiera się na architekturze h a r w a r d z k i e j . Jedną z g ł ó w n y c h cech charakterystycznych architektury harwardzkiej j e s t rozdzielenie przestrzeni adresowej pamięci p r o g r a m u i przestrzeni adresowej p a m i ę c i d a n y c h , c o u z y s k a n o poprzez z a s t o s o w a n i e o d d z i e l n y c h magistrali a d r e s o w y c h . Dzięki t e m u m o ż l i w e było z a s t o s o w a n i e s ł o w a o różnej szero kości dla p a m i ę c i p r o g r a m u i pamięci d a n y c h , a t a k ż e uchronienie się o d p r z y p a d k ó w , w których dane m o g ł y b y b y ć interpretowane j a k o instrukcje. M i k r o k o n t r o l e r y A V R , w przeciwieństwie d o 8 0 5 1 , należą d o grupy u k ł a d ó w o architekturze R I S C (Reduced
Instruction
j e s t o k r e ś l a n a nazwą C I S C (Complex
Set Computer).
Instruction
Architektura 8051
Set Computer).
Wykonanie
j e d n e g o rozkazu C I S C w y m a g a zazwyczaj w y k o n a n i a wielu operacji, co zwykle trwa kilka taktów zegarowych. W i ę k s z o ś ć r o z k a z ó w R I S C j e s t reali z o w a n a w j e d n y m takcie zegara, co - p o m i m o krótszej listy r o z k a z ó w - za pewnia szybsze w y k o n y w a n i e programu. W b r e w p o z o r o m , p r o g r a m y pisane dla procesorów RISC charakteryzują się większą spójnością, a c o za tym idzie mniejszym kodem w y n i k o w y m . Cechą wyróżniającą
mikrokontrolery
A V R jest również to, że z a i m p l e m e n t o w a n o w nich wiele rejestrów wewnęt rznych, z których każdy m o ż e pełnić funkcję akumulatora p o d c z a s wykony wania operacji arytmetycznych i logicznych. Dzięki temu minimalizuje się liczbę wewnętrznych przesłań międzyrejestrowych, c o korzystnie w p ł y w a na szybkość wykonywania programu i j e g o wielkość. Projektanci rodziny A V R przewidzieli możliwość wykorzystywania trzech par rejestrów j a k o rejestrów indeksowych używanych w niektórych trybach adresowania. Na uwagę zasługuje j e s z c z e j e d e n fakt, który m o ż e na początku w y d a ć się nieco dziwny. Mikrokontrolery A V R są zaliczane d o grupy u k ł a d ó w 8-bitowych, lecz słowo instrukcji jest 16-bitowe. T a k a , a n i e i n n a klasyfikacja wy nika z długości rejestrów wewnętrznych i szerokości w e w n ę t r z n e j szyny da nych. Jeśli więc m ó w i m y , że np. A T 9 0 S 2 3 1 3 m a 2 kB pamięci w e w n ę t r z n e j , to oznacza, że m o ż e m y napisać p r o g r a m o wielkości 1 k s ł ó w . T y c h , u któ rych wystąpił w t y m m o m e n c i e g r y m a s na twarzy - p r z e d e w s z y s t k i m miłoś ników 8051 - pragnę uspokoić, że wszystkie w y m i e n i o n e c e c h y procesorów RISC powodują, że analogiczne programy p o w i n n y się z m i e ś c i ć b e z więk szych problemów zarówno w 8051 z pamięcią p r o g r a m u o pojemności 2 kB, j a k i w A V R z pamięcią programu o wielkości I k s l ó w . Z wymienionych p o w o d ó w , mikrokontrolery A V R nadają się d o s k o n a l e do pisania programów w j ę z y k a c h wysokiego p o z i o m u , szczególnie w j ę z y k u C. Korzyści z tego wynikające z pewnością docenią ci, którzy spróbują swych sił w tej dziedzinie. N i e j e s t j e d n a k bezzasadna opinia mówiąca, że d o wydaj nego pisania programów w C nieodzowne jest poznanie architektury używa n e g o mikrokontrolera oraz j e g o listy rozkazów. O c z y w i s t e jest, że przyjdzie to łatwiej t y m Czytelnikom, którzy do tej pory nie mieli d o c z y n i e n i a z mik rokontrolerami innych rodzin. Przyzwyczajenia nabyte p o d c z a s prac z nimi mogą czasami przeszkadzać w poznawaniu rodziny A V R . J u ż na wstępie wątpliwość mogą budzić obco brzmiące mnemoniki r o z k a z ó w . Są o n e - jak się bliżej przyjrzeć - logiczne i konsekwentne, nie mniej d o ś ć t r u d n e d o za pamiętania. W efekcie pisząc program w asemblerze c z ę s t o trzeba sięgać po jakąś „ściągawkę". Dużą pomocą powinna być dołączona d o książki wkładka zawierająca m i n . skrócony opis listy r o z k a z ó w .
3.
Rodzina AVR - podstawy W rodzinie A V R z a s t o s o w a n o klasyczny s p o s ó b b u d o w a n i a m i k r o k o n t r o l e r ó w o r ó ż n y c h m o ż l i w o ś c i a c h , które powstają w w y n i k u integrowania w s p ó l n e g o dla rodziny A V R rdzenia z r ó ż n y m i b l o k a m i peryferyjnymi. M i k r o k o n trolerem o najmniejszych m o ż l i w o ś c i a c h w tej r o d z i n i e j e s t A T 9 0 S 1 2 0 0 , k t ó ry m a ograniczoną d o 3 liczbę o b s ł u g i w a n y c h p r z e r w a ń i, p o z a j e d n y m 8-bit o w y m t i m e r e m i k o m p a r a t o r e m a n a l o g o w y m , nie m a w b u d o w a n y c h żad n y c h innych peryferii. P o m i m o prostej b u d o w y nadaje się o n d o s k o n a l e d o stosowania
w poważnych
aplikacjach
przemysłowych
(wbrew
w i ę k s z o ś ć aplikacji tego typu nie w y m a g a s t o s o w a n i a
pozorom
mikrokontrolerów
o o g r o m n y c h m o ż l i w o ś c i a c h i dużej wydajności), a szczególnie
atrakcyjny
j e s t dla początkujących, którzy - właśnie z e w z g l ę d u na j e g o prostotę - m o g ą szybko go poznać.
Zestawienie
najważniejszych
parametrów
mikrokontrolerów
z rodziny A V R znajduje się w dodatku A .
Ć w i c z e n i a p r e z e n t o w a n e w rozdziale 14 o p r a c o w a n o n a nieco bardziej roz b u d o w a n ą wersję mikrokontrolera - A T 9 0 S 2 3 1 3 - który w y p o s a ż o n o m i n . w s z e r e g o w y interfejs s p r z ę t o w y U A R T o r a z 128 B pamięci danych S R A M . Dzięki t e m u w przykładach zostaną p o k a z a n e także s p o s o b y
komunikacji
mikrokontrolera z k o m p u t e r e m P C ( m i n . p o p r z e z interfejs U S B ) . N i e b a g a telnym atutem mikrokontrolerów AT90S2313 jest zgodność rozmieszczenia ich w y p r o w a d z e ń z p r o d u k o w a n y m i przez A t m e l a m i k r o k o n t r o l e r a m i z ro dziny 8 0 5 1 : A T 8 9 C 1 0 5 1 / 1 0 5 1 U , A T 8 9 C 2 0 5 1 / 2 0 5 1 i A T 8 9 C 4 0 5 1 . Na
rysunku
3.1
przedstawiono
budowę
wewnętrzną
mikrokontrolera
A T 9 0 S 2 3 1 3 . Programista m a dostęp d o 3 2 rejestrów o g ó l n e g o przeznaczenia, w ś r ó d których występują m i n . trzy rejestry i n d e k s o w e . Są o n e w y k o r z y s t y w a n e w niektórych trybach a d r e s o w a n i a , w s p o m a g a j ą c operacje przesyłania d a n y c h . W s z y s t k i e rejestry są dołączone b e z p o ś r e d n i o d o j e d n o s t k i a r y t m e tyczno-logicznej A L U (Arithmetic
Logic Unit) i m o g ą pełnić funkcję a k u m u
latora. T a c e c h a znacząco w p ł y w a na z w i ę k s z e n i e wydajności m i k r o k o n t r o l e ra. Z w r ó ć m y u w a g ę na to, że znaczną część czasu pracy mikrokontrolera zaj muje w y k o n y w a n i e operacji logicznych lub a r y t m e t y c z n y c h . W tradycyjnych rozwiązaniach w s z y s t k i e operacje musiały b y ć w y k o n y w a n e w w y d z i e l o n y m
1
XTAL1 B-bitowa magistrala danych Wewn. generator taKtujący
Wskaźnik stosu
Watchdog
Pamięć programu Flash
SRAM
Blok sterowania MCU
Rejestr instrukcji
Rejestry ogólnego przeznaczenia
Linie sterujące
X
ALU
Wzmacniacz generatora zewn.
Blok generacji sygnałów zegar.
Licznik programu
Dekoder instrukcji
XTA XTAL2
'RESET
Timer/ liczniki
Blok obsługi przerwań
/
EEPROM
Rejestr statusu
Blok programowania pamięci Flash
Wzmacniacze PORT B
I
Wzmacniacze PORT D
L
I PB0...PB7
PD0...PD6
Rys. 3.1. Budowa wewnętrzna mikrokontrolera AT90S2313
akumulatorze dołączonym d o A L U , zatem jeśli p r o g r a m korzystał z wielu da nych, bezustannie musiał w y k o n y w a ć przesłania m i e d z y r e j e s t r o w e . Ilustruje to przykład 3.1.
Przykład 3.1. Porównanie operacji dodawania dwóch 2-bajtowych liczb, wykonywanej przez mikrokontrolery rodziny '51 iAVR ;Program dla mikrokontrolera '51 ;danal - R1R0, dana2 - R3R2, wynik R1R0 MOV A,R0 ADD A,R2 MOV RO,A MOV A,R1 ADDC A,R3 MOV Rl,A ;Program ;danal ADD ADDC
dla mikrokontrolera AVR R1R0, dana2 - R3R2, wynik R1R0 R0,R2 R1.R3
Z w r ó ć m y u w a g ę na to, że mikrokontroler '51 na wykonanie każdego z powyż szych rozkazów potrzebuje 12 cykli zegara, natomiast A V R wykonuje j e w jed n y m cyklu. Biorąc pod uwagę częstotliwości oscylatorów równe odpowiednio 12 M H z i 4 M H z , czas wykonania pierwszego fragmentu programu będzie rów ny 6 L I S , drugiego zaś tylko 0,5 us. Kod dla 8051 zajmie 6 bajtów pamięci pro gramu, dla A V R - a natomiast jedynie d w a słowa. Ten prosty przykład z całą bez względnością pokazuje przewagę wydajności rnikrokontrolera A V R nad 8 0 5 1 . J a k widać n a r y s u n k u 3.1, w i ę k s z o ś ć b l o k ó w funkcjonalnych m i k r o k o n t r o ł e r ó w A V R k o m u n i k u j e się między sobą za p o ś r e d n i c t w e m w e w n ę t r z n e j 8-bitowej magistrali. D o d a t k o w o p r o w a d z o n e są p o m i ę d z y n i m i n i e z b ę d n e syg nały sterujące. O p r ó c z t y p o w y c h i na ogół d o b r z e z n a n y c h u k ł a d ó w peryferyjnych
można
w y r ó ż n i ć b l o k i , d o których u ż y t k o w n i k nie m a b e z p o ś r e d n i e g o dostępu. Są to: rejestr instrukcji, d e k o d e r instrukcji, w e w n ę t r z n y oscylator i układ g e n e r u j ą c y w e w n ę t r z n e sygnały z e g a r o w e . Rejestr instrukcji p r z e c h o w u j e k o d aktu alnie w y k o n y w a n e g o r o z k a z u . Jest to w w i ę k s z o ś c i p r z y p a d k ó w
16-bitowa
liczba. W y j ą t k i e m są rozkazy w y m a g a j ą c e p o d a n i a a r g u m e n t u , n p . w y w o ł a nia p o d p r o g r a m ó w lub skoki. K o d y te są p o d a w a n e n a liście r o z k a z ó w , c h o ć w i ę k s z e g o z n a c z e n i a p r a k t y c z n e g o dla u ż y t k o w n i k a nie mają. N a p o d s t a w i e zawartości rejestru instrukcji, d e k o d e r instrukcji generuje o d p o w i e d n i e syg nały sterujące dla automatu realizującego funkcje p r o c e s o r a . A u t o m a t ten jest u k ł a d e m s y n c h r o n i c z n y m . D o pracy w y m a g a o d p o w i e d n i e g o przebiegu zega r o w e g o ( j e d n e g o lub wielu). O d strony w y p r o w a d z e ń (na styku m i k r o k o n t r o ler-otoczenie) niezbędny j e s t j e d y n i e zegar j e d n o f a z o w y . N a s c h e m a c i e z r y s u n k u 3.1 nie w i d a ć stosu j a k o w y d z i e l o n e g o bloku. W m i k r o k o n t r o l e r z e A T 9 0 S 2 3 1 3 stos został u m i e j s c o w i o n y w wewnętrznej p a m i ę c i d a n y c h ( S R A M ) . O z n a c z a to, że j e g o g ł ę b o k o ś ć j e s t u w a r u n k o w a n a
jedynie dostępnym obszarem tej pamięci. Pamiętajmy, że są tu lokowane również zmienne wykorzystywane przez program. N i e w y k o r z y s t a n y obszar pamięci S R A M kompilator przeznacza na stos. Większość aktualnie produkowanych mikrokontrolerów dysponuje mechani zmami oszczędzania energii. Wyposażono w nie również układ A T 9 0 S 2 3 1 3 . Podczas normalnej pracy wszystkie bloki mikrokontrolera pracują bez żad nych ograniczeń pobierając
ze źródła zasilającego
prąd
o wartości
ok.
2,8 rnA. W trybie Idle zostaje wstrzymana praca j e d n o s t k i centralnej (CPU Central
Processing
-
Unit), pozostałe bloki (pamięć S R A M , timery/Iiczniki,
port SPI, system przerwań) pracują normalnie. W t y m trybie układ pobiera prąd o wartości ok. 0,8 m A . Istnieje j e s z c z e trzeci tryb o s z c z ę d z a n i a energii power-down,
w którym wszystkie wewnętrzne bloki są w y ł ą c z o n e (łącznie
z generatorem taktującym). Zostają j e d n a k z a c h o w a n e stany rejestrów. Jedy ną metodą „obudzenia" mikrokontrolera jest w t y m p r z y p a d k u zgłoszenie przerwania zewnętrznego lub w y z e r o w a n i e mikrokontrolera. W t y m trybie prąd zasilający jest mniejszy od 1 u A . Firma Atmel była jedną z pierwszych, która o p a n o w a ł a t e c h n o l o g i ę wytwa rzania pamięci Flash i od s a m e g o początku stosowała ją j a k o p a m i ę ć progra mu w swoich mikrokontrolerach. M o ż n a wręcz p o w i e d z i e ć , że zrewolucjoni zowało to światowy rynek w tej branży. P a m i ę ć Flash m o ż n a wielokrotnie programować, d o tego j e s t możliwe jej p r o g r a m o w a n i e p o z a m o n t o w a n i u mikrokontrolera w systemie. Dzięki temu znacznie uprościły się p r a c e kon strukcyjne i s k o m p l i k o w a n e (drogie) programatory stały się z b ę d n e . D o za programowania pamięci wystarczy jedynie prosty interfejs. D l a amatorów jest to bardzo cenna cecha, gdyż wejście w świat m i k r o k o n t r o l e r ó w nie wy maga inwestowania dużych kwot w specjalistyczne o p r z y r z ą d o w a n i e . W In ternecie można znaleźć schematy wielu rozwiązań interfejsów
programują
cych możliwych do wykonania niemal w p r z y s ł o w i o w e „pięć m i n u t " , w do datku z elementów, jakich na ogół jest pełno w szufladzie. W dalszej części książki zostaną zaprezentowane adresy internetowe, pod k t ó r y m i m o ż n a zna leźć wiele bardzo pomocnych informacji, a nawet p o b r a ć d a r m o w e oprogra mowanie wspomagające projektowanie urządzeń z m i k r o k o n t r o l e r a m i A V R .
3.1.
Funkcje wyprowadzeń Na r y s u n k u 3.2 p r z e d s t a w i o n o r o z m i e s z c z e n i e w y p r o w a d z e ń m i k r o k o n t r o lera A T 9 0 S 2 3 1 3 w o b u d o w i e P D I P lub S O I C . F u n k c j e w y p r o w a d z e ń są na stępujące:
V C C - p l u s napięcia zasilającego.
AT90S2313 RESET
G N D - m a s a zasilania.
Wszystkie
[T
Tj>]
PB7(SCK)
\T
TTj
PB6 (MISO)
XTAI-2
fT
77]
PS5 (MOSI)
XTAL1
\T
7J]
PB4
plusa
(INTO) P D 2
fT
7s]
PB3(OC1)
13
PB2
linie
portu mają i n d y w i d u a l n i e konfigurowa n e w e w n ę t r z n e podciąganie d o napięcia zasilania (pull-up).
\iijj V C C
PDO
k i e r u n k o w y port wejścia/wyjścia ogól przeznaczenia.
^
(TXD)PD1
(BXD)
P o r t B ( P B 0 . . . P B 7 ) - 8-bitowy, d w u nego
I fT
Maksymal
(INT1)PD3
[T
ny prąd w e j ś c i o w y (w kierunku od plu
0*0) P D 4
[T
sa zasilania d o m a s y ) każdej linii w y n o
(T1)PD5
[T
Tf]
PBO(AINO)
fjo
TTJ
PD6(ICP)
si 2 0 m A , c o u m o ż l i w i a b e z p o ś r e d n i e
GND
sterowanie n p . d i o d a m i ś w i e c ą c y m i . P o zerowaniu m i k r o k o n t r o l e r a w y p r o w a dzenia portu B ustawiają się w stan w y -
7 5 ] PBl
(AIN1)
PDIP/SOIC
Rys. 3.2. Rozmieszczenie wyprowadzeń mikrokontrolera AT90S2313
sokiej impedancji, także w t e d y , gdy nie jest g e n e r o w a n y sygnał z e g a r o w y .
Jeśli linie p o r t ó w P B i P D są s k o n f i g u r o w a n e j a k o wejścia
ufGA
i z zewnątrz mają dołączone p o d c i ą g a n i e d o masy oraz w ł ą c z o n e w e w n ę t r z n e rezystory podciągające (pull-up),
t o stanowią
o n e źródła prądu.
N i e k t ó r e linie portu B mogą pełnić też d o d a t k o w e funkcje (będą o n e dokład nie o m ó w i o n e w rozdziale 10.): PBO (AINO) - wejście nieodwracąjące w e w n ę t r z n e g o k o m p a r a t o r a . P B l ( A I N 1 ) - wejście odwracające w e w n ę t r z n e g o k o m p a r a t o r a . P B 3 ( O C 1 ) - wyjście w y n i k u p o r ó w n a n i a T i m e r a / L i c z n i k a l . P B 5 ( M O S I ) - s z e r e g o w e wejście d a n y c h w trybie
programowania
i weryfikacji. P B 6 ( M I S O ) - s z e r e g o w e wyjście danych w trybie
programowania
i weryfikacji. P B 7 ( S C K ) - wejście z e g a r o w e dla trybu p r o g r a m o w a n i a i weryfikacji. P o r t D ( P D 6 . . . P D 0 ) - 7-bitowy, d w u k i e r u n k o w y p o r t wejścia/wyjścia ogól nego przeznaczenia. W s z y s t k i e linie portu mają i n d y w i d u a l n i e konfigurowa n e w e w n ę t r z n e podciąganie d o plusa zasilania (pulf-up).
M a k s y m a l n y prąd
wejściowy każdej linii wynosi 2 0 m A . Po zerowaniu mikrokontrolera w y p r o w a d z e n i a portu D ustawiają się w stan wysokiej i m p e d a n c j i , także wtedy, gdy nie j e s t g e n e r o w a n y sygnał z e g a r o w y .
Linie portu D mogą pełnić też d o d a t k o w e funkcje (będą o n e d o k ł a d n i e omó wione w rozdziale 10.): PDO ( R X D ) - wejście szeregowe układu U A R T . P D 1 ( T X D ) - wyjście szeregowe układu U A R T . P D 2 (INTO) - wejście przerwania z e w n ę t r z n e g o . P D 3 (INT1) - wejście przerwania z e w n ę t r z n e g o . P D 4 (TO) - wejście z e w n ę t r z n e g o przebiegu z e g a r o w e g o licznika TO. P D 5 ( T l ) - wejście z e w n ę t r z n e g o przebiegu z e g a r o w e g o licznika T l . P D 6 (ICP) - wejście przechwytywania zegara. R E S E T - wejście z e r o w a n i a mikrokontrolera. D o w y g e n e r o w a n i a prawidło wego sygnału zerującego konieczne jest, aby stan niski n a t y m w y p r o w a d z e niu trwał c o najmniej 5 0 n s . Sygnał zerowania wystąpi nawet, g d y nie pracu j e zegar. Impulsy krótsze niż 5 0 ns nie gwarantują w y g e n e r o w a n i a prawidło wego sygnału zerującego. X T A L 1 - wejście odwracające wzmacniacza oscylatora m o g ą c e p e ł n i ć funk cję wejścia zewnętrznego przebiegu z e g a r o w e g o . X T A L 2 - wyjście wzmacniacza oscylatora (odwracającego fazę).
Architektura mikrokontrolerów AVR Wszystkie bloki funkcjonalne mikrokontrolera A T 9 0 S 2 3 1 3 komunikują się z jednostką arytmetyczno-logiczną (ALU) za p o ś r e d n i c t w e m
wewnętrznej
8-bitowej magistrali danych. J e d n y m z ważniejszych e l e m e n t ó w architektury (rysunek 4.1) jest zestaw 3 2 8-bitowych rejestrów o g ó l n e g o przeznaczenia. Gwarantują one szybki dostęp d o podręcznych d a n y c h . W s z y s t k i e rejestry mają bezpośredni dostęp d o A L U , mogą więc pełnić rolę o p e r a n d ó w działań arytmetyczno-logicznych b e z pośrednictwa d o d a t k o w y c h rejestrów przejścio wych i specjalnego akumulatora. Rezultat wykonywanej operacji jest umieszczany w d o w o l n y m rejestrze, któ rym nie zawsze musi być akumulator, j a k ma to miejsce w n i e k t ó r y c h innych rodzinach mikrokontrolerów. Spośród 32 rejestrów, 6 w y d z i e l o n o d o specjal nych zadań, chociaż nada] pozostają
rejestrami o g ó l n e g o
przeznaczenia.
Tworzą one trzy 16-bitowe rejestry indeksowe, w y k o r z y s t y w a n e w trybach adresowania pośredniego, stanowiąc bardzo wydajny m e c h a n i z m obliczania adresu. Duża liczba rejestrów ułatwia pracę k o m p i l a t o r o m j ę z y k ó w wysokie.
8-t»itowa magistrala danych
Pamięć programu Flash Ikx16
Rejestr statusu i testowy
Rejestr instrukcji
Dekoder instrukcji
r ~ Unie sterujące
128 x a EEPROM
Rys. 4.1. Architektura rdzenia mikrokontrolerów A W?
g o p o z i o m u , umożliwiając przyspieszenie w y k o n y w a n i a p r o g r a m u . Jeden z rejestrów i n d e k s o w y c h m o ż e być w y k o r z y s t y w a n y j a k o w s k a ź n i k na stale u m i e s z c z o n e w tablicy t z w . look-up.
(pointer)
D o r o z r ó ż n i a n i a rejestrów sto
suje się o z n a c z e n i a od RO d o R 3 1 . Trzy 16-bitowe rejestry i n d e k s o w e zostały n a z w a n e : X~register,
Y-register
i Z-register.
Jednostka arytmetyczno-logicz-
na w y k o n u j e obliczenia na parze d a n y c h u m i e j s c o w i o n y c h w d w ó c h rejest rach lub n a danej umieszczonej w rejestrze i stałej umieszczonej w tablicy. M o ż l i w e są też operacje na j e d n y m rejestrze. T y p o w e tryby a d r e s o w a n i a pa mięci mogą b y ć s t o s o w a n e r ó w n i e ż d o a d r e s o w a n i a z e s t a w u rejestrów. D z i e j e się tak, g d y ż rejestry są u l o k o w a n e w j e d n e j przestrzeni adresowej z pa mięcią d a n y c h , zajmując najmłodsze adresy ($00...$ 1F). Kolejne 6 4 lokacje ($20...$5F) w m i k r o k o n t r o l e r a c h A V R p r z e z n a c z o n o dla urządzeń peryferyj nych:
rejestrów
sterujących,
timerów/liczników,
przetworników
A/C
(w A T 9 0 S 2 3 I 3 ich nie ma!) i innych. Będziemy j e n a z y w a ć obszarem we/wy.
W książce przyjęto k o n w e n c j ę zapisu liczb h e k s a d e c y m a l n y c h , z g o d n i e z którą są o n e p o p r z e d z a n e z n a k i e m dolara ($). Liczby dziesiętne są z a p i s y w a n e w sposób s t a n d a r d o w y . W przykła d a c h p r o g r a m ó w pisanych w j ę z y k u C , liczby h e k s a d e c y m a l n e są z a p i s y w a n e w obowiązującym w n i m formacie z przedrost k i e m 0x. N a przykład: 1 6 = $ 1 0 = 0 x l 0 .
M i k r o k o n t r o l e r y A V R mają architekturę harwardzką. Przestrzeń a d r e s o w a pamięci p r o g r a m u i pamięci d a n y c h j e s t w niej r o z d z i e l o n a ( r y s u n e k 4.2). W y k o n y w a n i e r o z k a z ó w j e s t r e a l i z o w a n e p o p r z e z 2 - s t o p n i o w e przetwarzanie potokowe
(pipeline).
Wykonanie
instrukcji
odbywa
się z j e d n o c z e s n y m
w s t ę p n y m p o b r a n i e m kodu następnej instrukcji. K o n c e p c j a ta u m o ż l i w i a w y k o n a n i e w k a ż d y m cyklu j e d n e g o rozkazu. P a m i ę ć p r o g r a m u to p r o g r a m o w a n a w systemie p a m i ę ć typu Flash. C a ł y o b szar 1 k s ł ó w jest dostępny b e z p o ś r e d n i o dla instrukcji s k o k ó w w z g l ę d n y c h i w y w o ł a ń p o d p r o g r a m ó w . W i ę k s z o ś ć instrukcji m i k r o k o n t r o l e r a A V R m i e ś ci się w 1 6 - b i t o w y m słowie, ale zdarzają się t a k ż e instrukcje 32-bitowe. W w y n i k u przyjęcia przerwania, a także p o d c z a s w y w o ł y w a n i a p o d p r o g r a m ó w , adres p o w r o t u , j a k i m jest aktualny stan licznika p r o g r a m u Counter
(Program
- PC) jest automatycznie z a c h o w y w a n y na stosie. Stos jest umiejs
c o w i o n y w o b s z a r z e pamięci d a n y c h S R A M , w związku z c z y m j e g o p o j e m n o ś ć j e s t l i m i t o w a n a tylko jej d o s t ę p n y m o b s z a r e m . D o s t ę p d o danych z a c h o w a n y c h na stosie j e s t m o ż l i w y za p o m o c ą w s k a ź n i k a stosu (Stack Pointer
-
Pamięć S R A M
Pamięć programu $000
32 rejestry ogólnego przeznaczenia
rejestry *>lne soo SOF
1
rejestry e*" *
JIF SCO
64 rejestry we/wy (dostęp za pomocą rozkazów IN i OUT)
rejestry dobie
rejestry górne Pamięć Flash (1kx16)
Pamięć danych (128 x 8)
Jeśli rejestry we/wy są adresowane jako pamięć SRAM należy do ich adresu dodać $20
$DF
J$3FF
Rys. 4.2. Mapa pamięci mikrokontrolera AT90S2313 (pamięć EEPROM leży poza standardo wym obszarem adresowym, dostęp do niej jest możliwy poprzez rejestry EEADR i EEDR)
SP). Należy bezwzględnie pamiętać o o d p o w i e d n i m ustawieniu j e g o wartoś ci, w przeciwnym przypadku może dojść d o nadpisania d a n y c h l u b utraty za wartości stosu przez nadpisanie g o d a n y m i , co w k o n s e k w e n c j i m o ż e dopro wadzić do błędnego działania programu. U s t a w i e n i e S P p o w i n n o odbywać się na s a m y m początku programu, j a k o j e d n a z p i e r w s z y c h c z y n n o ś c i , ko niecznie przed wywołaniami procedur i włączeniem p r z e r w a ń . W przypadku jednoczesnego wystąpienia d w ó c h przerwań, w pierwszej kolejności jest ob sługiwane to o wyższym priorytecie. Wskaźnik stosu w mikrokontrolerze A T 9 0 S 2 3 1 3 t o 8-bitowy rejestr dostępny w przestrzeni adresowej we/wy. Umiejscowienie stosu w obszarze pamięci da nych jest z jednej strony korzystne, b o nie ogranicza j e g o wielkości. Jednak przy rozrzutnym gospodarowaniu zmiennymi w y k o r z y s t y w a n y m i przez pro gram może się okazać, że na stos pozostaje mało miejsca. N a d o m i a r złego nie m a żadnego mechanizmu kontrolującego j e g o przekroczenie. M o ż e to prowa dzić do niełatwych w wykryciu błędów. Z drugiej strony dane odłożone na sto sie, j a k o dane w pamięci danych są również dostępne poprzez z w y k l e tryby ad resowania. Stwarza to możliwość wykorzystywania wyrafinowanych trików polegających na podmianie danych odłożonych na stosie z i n n y m i . Można w ten sposób przekazywać np. argumenty d o procedur.
Cała przestrzeń adresowa o d $00 d o $ D F , d o której należy 128 bajtów danych pamięci S R A M , 6 4 bajty przestrzeni w e / w y oraz zbiór rejestrów roboczych m o ż e być w prosty sposób udostępniona poprzez pięć trybów adresowania ob sługiwanych w architekturze mikrokontrolerów A V R . Jest to przestrzeń linio wa i regularna, czyli dostęp d o każdej z k o m ó r e k jest m o ż l i w y za p o m o c ą każ dego polecenia wykonującego operację na rejestrach (rysunek 4.2). System przerwań mikrokontrolera A V R wykorzystuje niektóre rejestry sterują c e znajdujące się w przestrzeni we/wy. Każde z przerwań m a indywidualny wektor przerwania, czyli adres skoku d o procedury obsługi przerwania. Tablica wektorów przerwań jest z a w s z e umieszczana na początku pamięci programu. Wszystkie przerwania charakteryzują się przypisanym priorytetem obsługi. I m jest niższy adres danego wektora przerwania, t y m w y ż s z y m a on priorytet.
4.1.
Generator taktujący W
mikrokontroler
wbudowano
wzmac
niacz odwracający fazę, przeznaczony d o g e n e r o w a n i a przebiegu z e g a r o w e g o chronizującego
pracę
syn
mikrokontrolera.
Maksymalne obciążenie odpowiada 1 wejściu bramki HC e HC C2
W y p r o w a d z e n i a X T A L I i X T A L 2 pełnią funkcje o d p o w i e d n i o j e g o wejścia i w y j ścia. Po dołączeniu z e w n ę t r z n e g o rezona tora w z m a c n i a c z pracuje j a k o
generator
T ci -II
-r i-
XTAL2
XTAL1
2 x 24...33pF
sygnału taktującego mikrokontroler. S p o
GND
s ó b dołączenia rezonatora p o k a z a n o na ry s u n k u 4 . 3 . M o ż n a stosować z a r ó w n o r e z o Rys. 4.3. Zalecany sposób dołączenia natory k w a r c o w e , j a k i c e r a m i c z n e . zewnętrznego rezonatora kwarcowego do wyprowadzeń mikrokontrolera AVR
Przewidziano także możliwość pracy mik (sygnat z wyjścia XTAL2 może być wy rokontrolera z z e w n ę t r z n y m przebiegiem korzystywany - po dodaniu bufora z e g a r o w y m . W y p r o w a d z e n i e X T A L 2 p o także przez obwody zewnętrzne) w i n n o w takim przypadku pozostać niepodNC-
łączone, natomiast d o X T A L 1 j e s t d o p r o wadzany sygnał zegarowy (rysunek 4.4). Bardzo w a ż n e dla p o p r a w n e g o
działania
mikrokontrolera jest, aby sygnał
zewnę
trzny
zawarte
spełniał
warunki c z a s o w e
Zewnętrzny sygnałtaktujący (parametry w tab. 4 . 1 }
XTAL2
XTAL1
GND
w tablicy 4.1 i miał amplitudę dostosowaną Rys. 4.4. Dołączenie zewnętrznego ge d o napięcia zasilającego mikrokontroler.
neratora taktującego do mikrokontrolera
Tab. 4.1. Zalecane przez producenta warunki czasowe wymagane od zewnętrznego sygnału taktującego We=2,7.-6,0 V
Parametr
Częstotliwość
Min.
Maks.
0
4
V =4,0...6,0 V cc
Min.
Maks.
0
10
Jednostka
MHz
Czas trwania poziomu H
100
40
ns
Czas trwania poziomu L
100
40
ns
Czas narastania
1.6
0,5
US
Czas opadania
1.6
0.5
JiS
Sygnał wytwarzany przez wewnętrzny generator m i k r o k o n t r o l e r a m o ż e być również wykorzystywany d o sterowania i n n y m i u k ł a d a m i
zewnętrznymi,
Wyjście X T A L 2 musi b y ć w ó w c z a s buforowane za p o m o c ą b r a m k i serii HC.
4.2.
Rejestry ogólnego przeznaczenia Prawie wszystkie rozkazy należące do listy o b s ł u g i w a n y c h p r z e z mikrokon trolery A V R umożliwiają w y k o n y w a n i e operacji na rejestrach o g ó l n e g o prze znaczenia. Zapewniają o n e bezpośredni dostęp d o k a ż d e g o z nich i są wyko nywane w j e d n y m cyklu. Wyjątkiem j e s t pięć r o z k a z ó w operacji arytmetyczo
7 RO
Adres $00
R1
$01
R2
$02
R13
SOD
R14
$0E
Rejestry ogólnego przeznaczenia
R15
SOF
R16
$10
R17
$11
R26
$1A Dolny rejestr X (mniej znaczący bajt)
R27 R28 R29 R30 R31
$1B Górny rejestr X (bardziej znaczący bajt) $1C Dolny rejestr Y (mniej znaczący bajt) $1D Gómy rejestr Y (bardziej znaczący bajt) $1E Dolny rejestr 2 (mniej znaczący bajt) $1F Górny rejestr Z (bardziej znaczący bajt)
Rys. 4.5. Rozmieszczenie rejestrów ogólnego przeznaczenia w mikrokontrolerze AVR
15 Rejestr X | 7
O °l
»l
|* R26 ($1A)
R27($1B) 15
0
Rejestr Y | ?
°l
°l R28 ($1C)
R29 ($10)
0
15 Rejestr Z | 7
°l R31 (S1F)
R30 ($1E)
°l
Rys. 4.6. Budowa logiczna rejestrów indeksowych X, YiZ
n o - l o g i c z n y c h wykorzystujących stałe j a k o p a r a m e t r y - SBCI, SUBI, CPI, ANDI i ORI o r a z rozkaz b e z p o ś r e d n i e g o ł a d o w a n i a stałej - LDI. T e rozkazy wykorzystują j e d y n i e drugą p o ł ó w k ę z e s t a w u rejestrów, czyli R 1 6 . . . R 3 1 . R o z k a z y SBC, SUB, CP, AND, OR i inne w y m a g a j ą c e j e d n e g o l u b d w ó c h ar g u m e n t ó w pracują n a c a ł y m zestawie rejestrów. W s z y s t k i e rejestry są w i d o c z n e w przestrzeni a d r e s o w e j pamięci S R A M zaj mując p i e r w s z e 3 2 lokacje. Dzieje się tak m i m o t e g o , że rejestry te nie są fi zycznie z a i m p l e m e n t o w a n e j a k o p a m i ę ć S R A M . T a k a organizacja pamięci p o z w a l a na b a r d z o elastyczny dostęp d o rejestrów, także p o p r z e z rejestry in d e k s o w e X, Y i 2 . Rejestry R 2 6 . . . R 3 1 są rejestrami o g ó l n e g o p r z e z n a c z e n i a , pełnią j e d n a k d o d a t k o w e funkcje. M o g ą b y ć w y k o r z y s t y w a n e j a k o l ó - b i t o w e rejestry indek s o w e (wskaźniki), pozwalające n a a d r e s o w a n i e p o ś r e d n i e pamięci d a n y c h . Umożliwiają
w i ę c a d r e s o w a n i e pośrednie rejestrów r o b o c z y c h ,
rejestrów
w e / w y , j a k i p a m i ę c i S R A M ( d a n y c h ) . Ich organizację p r z e d s t a w i o n o na r y
sunku 4,6. B a r d z o interesującym t r y b e m adresowania z w y k o r z y s t a n i e m rejestrów in d e k s o w y c h j e s t a d r e s o w a n i e r ó ż n i c o w e . Rejestry X , Y i Z pełnią w t y m przy padku rolę w s k a ź n i k ó w p r z e m i e s z c z e n i a w z g l ę d e m adresu b a z o w e g o , a i c h z a w a r t o ś ć m o ż e b y ć a u t o m a t y c z n i e d e k r e m e n t o w a n a lub i n k r e m e n t o w a n a przed lub p o w y k o n a n i u określonej operacji. Z a i m p l e m e n t o w a n i e kilku rejestrów i n d e k s o w y c h zostało p o d y k t o w a n e ukie r u n k o w a n i e m architektury rdzenia m i k r o k o n t r o l e r ó w A V R n a j ę z y k i w y s o k i e g o p o z i o m u . Rejestry te są i n t e n s y w n i e w y k o r z y s t y w a n e d o i n d e k s o w a n i a argumentów
i wyniku
operacji
arytmetyczno-logicznych
wykonywanych
przez A L U . D z i ę k i t a k i e m u rozwiązaniu uzyskuje się z n a c z n e przyspieszenie w y k o n y w a n i a obliczeń.
4.3.
Jednostka arytmetyczno-logiczna (ALU) Mikrokontrolery A V R są w y p o s a ż o n e w bardzo wydajną j e d n o s t k ę arytmetyczno-logiczną współpracującą bezpośrednio z 32 rejestrami o g ó l n e g o prze znaczenia. Operacje w y k o n y w a n e przez A L U m o ż n a podzielić na trzy kate gorie: arytmetyczne, logiczne i operacje b i t o w e . Listę r o z k a z ó w w r a z z ich dokładnym opisem przedstawiono w rozdziale 12.
4.4.
Pamięć programu Mikrokontroler A T 9 0 S 2 3 1 3 w y p o s a ż o n o w 2 k B pamięci Flash p r o g r a m o w a nej w systemie, która pełni funkcję pamięci programu. C h o c i a ż w danych technicznych jej wielkość jest określana j a k o 2 k B , t o trzeba pamiętać, że wszystkie instrukcje mikrokontrolera A T 9 0 S 2 3 1 3 są 16- lub 32-bitowe. Pa mięć programu ma organizację l k x 16 bitów. S z a c o w a n a w y t r z y m a ł o ś ć pa mięci wynosi 1000 cykli zapisu/kasowania. D o c a ł k o w i t e g o zaadresowania obszaru 1 ksłów jest potrzebny 10-bitowy licznik p r o g r a m u , taki też zaimple m e n t o w a n o w mikrokontrolerze A T 9 0 S 2 3 1 3 . D o k ł a d n i e j s z e informacje doty czące programowania pamięci Flash p o d a n o w rozdziale 1 1 .
4.5.
Nieulotna pamięć danych EEPROM Współczesne
urządzenia
budowane
w oparciu
o mikrokontrolery
bardzo
często wymagają przechowywania j a k i c h ś p a r a m e t r ó w t a k i e p o zaniku zasi lania. Najczęściej są t o dane określające konfigurację u k ł a d ó w peryferyjnych mikrokontrolera lub n p . ostatnią konfigurację c y f r o w y c h e l e m e n t ó w regula cyjnych. D o przechowywania danych tego typu p r z e w i d z i a n o
128-bajtową
p a m i ę ć typu E E P R O M . Jest ona widoczna j a k o w y d z i e l o n y o b s z a r adresowy, do którego można zapisywać lub odczytywać p o j e d y n c z e bajty. Żywotność pamięci E E P R O M jest szacowana na c o najmniej 100000 cykli zapisu/kaso wania. Dostęp d o niej j e s t realizowany p o p r z e z w y d z i e l o n e rejestry: adreso wy, danych i sterujący. Dokładniejsze informacje d o t y c z ą c e wykorzystywa nia pamięci E E P R O M p o d a n o w rozdziale 1 1 .
4.6.
Pamięć danych SRAM Na rysunku 4 . 7 przedstawiono organizację pamięci S R A M (Static Random cess Memory)
Ac
nioykrokontrolera A T 9 0 S 2 3 1 3 . Wewnętrzna pamięć danych S R A M
zajmuje lokacje od adresu $60 d o $DF. Łącznie jest więc d o wykorzystania 128 bajtów tej pamięci. Młodsze adresy zajmują: zestaw rejestrów roboczych (od $ 0 0 d o $ 1 F - 3 2 lokacje) oraz rejestry we/wy (od $20 d o $ 5 F - 6 4 lokacje). W y m i e n i o n e obszary tworzą przestrzeń adresową d a n y c h . Z a p i s lub o d c z y t tego obszaru m o ż e b y ć r e a l i z o w a n y w j e d n y m z pięciu t r y b ó w a d r e s o w a n i a : bezpośrednim, pośrednim z przemieszczeniem, pośrednim, pośrednim z predekrementacją, p o ś r e d n i m z postinkrementacją. Z o s t a n ą o n e d o k ł a d n i e o m ó Rejestry robocze
Pamiac SRAM
R0
$00
R1
SOI
R2
$02
R29
S1D
R30
$1E
R3I
$1F
Rejestry we/wy $00
$20
$01
$21
$02
$22
$3D
$50
$3E
$5E
$3F Adresowanie, gdy dostęp odbywa się z a pomocą r w z m m j w I I I i u u i Jeśli rejestry we/wy są adresowane jako pamięć SRAM należy do adresu dodać $20
$5F /
Wewnętrzna pamięć danych S60 "$61* $62
$DD SDE $DF
Rys. 4.7. Organizacja pamięci danych SRAM. Rejestry we/wy do których dostęp odbywa się za pomocą rozkazów IN i OUT muszą być określane adresami od $00 do $3F mimo tego, że w pamięci SRAM zajmują lokacje od $20 do $5F
wionę w dalszej części rozdziału. D o indeksowania d a n y c h w t r y b a c h pośred nich są wykorzystywane rejestry R 2 6 d o R 3 1 . W trybie a d r e s o w a n i a bezpo średniego jest dostępna cała przestrzeń adresowa d a n y c h . A d r e s u j ą c dane po średnio z przemieszczeniem uzyskuje się dostęp d o 6 3 lokacji począwszy od przyjętego adresu b a z o w e g o . D o indeksowania danych w t y m trybie wyko rzystywane są rejestry Y i Z. Tryby pośredni z predekrementacją i pośredni z postinkrementacją wykorzystują rejestry X, Y, i Z .
4.7.
Tryby adresowania pamięci danych i pamięci programu Mikrokontrolery A V R dysponują b o g a t y m z e s t a w e m t r y b ó w adresowania pa mięci programu oraz danych, gwarantując
t y m s a m y m dużą
wydajność
i efektywność dostępu d o obu rodzajów pamięci. W rozdziale t y m zostaną wyjaśnione szczegóły dotyczące zasad adresowania s t o s o w a n y c h w mikro kontrolerach A V R . Umieszczony na kilku kolejnych rysunkach s y m b o l OP o z n a c z a część kodu operacji słowa rozkazu.
W dalszej części rozdziału przyjęto następujące oznaczenia: Rd - rejestr źródłowy i przeznaczenia u l o k o w a n y w obszarze Register File, Rs - rejestr źródłowy ulokowany w o b s z a r z e R e g i s t e r File, n
- 6-bitowy adres rejestru ź r ó d ł o w e g o lub d o c e l o w e g o ,
a
- 6-bitowe przesunięcie,
k
- adres względny zapisany w kodzie u z u p e ł n i e n i a d o 2
P
- 6-bitowy adres d o c e l o w e g o rejestru w e / w y .
(U2), m o ż e przybierać wartości o d - 2 0 4 8 d o 2 0 4 7 ,
4.7.1. Tryb bezpośredniego adresowania rejestrów wykorzystujący pojedynczy rejestr Operand - rejestr Rd - j e s t wskazany b e z p o ś r e d n i o w k o d z i e rozkazu po przez podanie j e g o numeru d.
Rejestry robocze
Rys. 4.8. Bezpośrednie adresowanie pojedynczego rejestru
Przykład 4.1. Inkrementacja rejestru RB
INC
RO
4.7.2. Tryb bezpośredniego adresowania rejestrów wykorzystujący dwa rejestry Rejestry robocze
OP
Rys. 4.9. Bezpośrednie adresowanie dwóch rejestrów
O p e r a n d y znajdują się w rejestrach Rs i Rd, które są w s k a z y w a n e b e z p o ś r e d n i o w kodzie r o z k a z u (s i d). Rezultat operacji jest u m i e s z c z a n y w rejestrze Rd. Przykład 4.2. Suma logiczna rejestrów RO i R1. Wynik umieszczony w RO
OR
R0,R1
4,7.3, Tryb bezpośredniego adresowania obszaru wejścia/wyjścia Rejestry we/wy
n
OP
P
Reiestry we/wy 0
63
63
Rys. 4.10. Bezpośrednie adresowanie obszaru wejścia/wyjścia
Rezultat operacji j e s t u m i e s z c z a n y w rejestrze w e / w y , k t ó r e g o adres jest bezpośrednio w s k a z y w a n y w k o d z i e r o z k a z u . A d r e s o p e r a n d u ( P ) zajmuje 6 bitów słowa r o z k a z o w e g o . Pole n określa adres rejestru ź r ó d ł o w e g o lub docelowego. Przykład 4.3. Przepisanie zawartości rejestru RO do portu B
OUT
PORTB,R0
4.7,4. Tryb bezpośredniego adresowania pamięci danych Pamięć danych
soo OP
Rs/Rd
16-bitowy adres ts
0
Uwaga! W AT90S2313 osiem najstarszych bitów 16-bitowego adresu ma wartość "O"
$DF
Rys. 4.11. Bezpośrednie adresowanie pamięci danych
R o z k a z wykorzystujący a d r e s o w a n i e b e z p o ś r e d n i e s k ł a d a się z d w ó c h słów. Pierwsze słowo zawiera kod operacji i określenie rejestru źródłowego lub d o c e l o w e g o (RaYRs). Szesnastobitowy adres jest zawarty w drugim słowie rozkazu. Przykład 4.4. Przepisanie zawartości komórki pamięci danych o adresie $65 do rejestru RO
LDS
R0,$65 '
4.7.5. Tryb pośredniego adresowania danych z przemieszczeniem Pamięć danych
$DF
I
163 Rejestry robocze
Rys. 4.12. Adresowanie pośrednie z przemieszczeniem
A d r e s o p e r a n d u j e s t obliczany poprzez dodanie z a w a r t o ś c i rejestrów Y lub Z s t a n o w i ą c y c h adres b a z o w y oraz przesunięcia p o d a n e g o na sześciu bitach w słowie r o z k a z u . M e c h a n i z m ten p o z w a l a na w y d a j n e przetwarzania rekor d ó w i tablic. Jest w y k o r z y s t y w a n y przez kompilatory j ę z y k ó w w y s o k i e g o p o ziomu. Przykład 4.5. Umieszczenie w rejestrze RO danej z 8-bitowej tablicy zaczynającej się od adresu $65. Pobierany jest 6. element tablicy (przemieszczenie wskazuje przesunięcie względem pierwszego elementu o indeksie 0) LDI LDD
R28,$65 ;adres bazowy tablicy danych 8-bitowych R0,Y+5 /umieszczenie szóstego bajtu tablicy ;w rejestrze RO
4.7.6. Tryb adresowania pośredniego Pamięć danych
Rys. 4.13. Adresowanie pośrednie
A d r e s operandu jest u m i e s z c z o n y w rejestrze i n d e k s o w y m X , Y i u b Z. Rejes try te pełnią w i ę c funkcję w s k a ź n i k a n a o p e r a n d . M e c h a n i z m t e n j e s t po wszechnie wykorzystywany np. w języku C. Przykład 4.6. Umieszczenie zawartości rejestru R16w pamięci SRAM LDI ST
R28,$65 Y.R16
,-adres pośredni umieszczony w rejestrze indeksowym Y .•umieszczenie zawartości rejestru R16 w pamięci .-adresowanej przez rejestr Y (w tym przypadku ;w komórce o adresie $65)
4.7.7. Tryb adresowania pośredniego danych z predekrementacją
Pamięć danych $00 15
Rejestr X, Y lub Z
$DF
Rys. 4.14. Adresowanie pośrednie z predekrementacją
W t y m t r y b i e rejestry i n d e k s o w e X , Y i Z są d e k r e m e n t o w a n e p r z e d w y k o n a n i e m o p e r a c j i . T a k i e a d r e s o w a n i e d o s k o n a l e nadaje sie d o p r z e t w a r z a n i a d ł u gich struktur danych. Przykład 4.7. Fragment pętli zapełniającej tablicę danych zawartością rejestru R16. Do wskazywania elementów tablicy wykorzystywany jest rejestr X, do którego przed wejściem do pętli powinien być wpisany odpowiedni adres (następny po ostatnim elemencie tablicy)
ST
-X,R16
/wypełnianie kolejnych elementów tablicy
...
/ewentualne inne operacje i rozkazy realizujące pętlę
4.7.8. Tryb adresowania pośredniego danych z postinkrementacją Pamięć danych 15 r-*j
0 Rejestr X, Y lub Z
1
P $DF
Rys. 4.15. Adresowanie pośrednie z postinkrementacją Tryb adresowania z postinkrementacją
jest podobny
do opisanego
wyżej.
R ó ż n i c a p o l e g a n a t y m , ż e rejestry i n d e k s o w e X , Y , i Z są i n k r e m e n t o w a n e p o w y k o n a n i u operacji. Przykład 4.8. Pobieranie do rejestru RO kolejnych elementów z obszaru pamięci danych wskazywanych przez rejestr Z
LD ...
R0,z+
/pobranie elementu z automatycznym przesunięciem /wskaźnika na kolejny /ewentualne inne operacje i rozkazy realizujące
;pętle
4.7.9. Tryb adresowania stałych z użyciem rozkazu LPM Pamięć programu $000 1
15
O
Rejestr Z
I
1 $3FF
Rys. 4.76. Adresowanie statej umieszczonej w pamięci programu z użyciem rozkazu LMP
T e n tryb adresowania służy d o obsługi struktur zawierających stałe, umiesz czanych w pamięci programu. Adres statej j e s t u m i e s z c z a n y w rejestrze Z. Adres słowa pamięci p r o g r a m u (0...1023) jest w y b i e r a n y p r z e z piętnaście najstarszych bitów rejestru. Bit najmłodszy decyduje o t y m , c z y odczytywa ny jest młodszy ( L S B = 0 ) , czy starszy ( L S B = 1 ) bajt s ł o w a p r o g r a m u . Przykład 4.9. Pobranie do rejestru RO elementu tablicy umieszczonej w pamięci programu LDi
R30, (TAB<<1)
LDI LPM
R31.0
TAB:
. DB
,-umieszczenie w młodszej części rejestru Z adresu ;elementu tablicy przesuniętego o jedna, pozycje ;w lewo, by mógł być wykorzystany przez rozkaz LPM ,-pobranie do rejestru RO pierwszego elementu ;tabłicy TAB. Po wykonaniu rozkazu RO będzie miał ;wartość $55
$55
4.7.10. Tryb adresowania pośredniego pamięci programu (IJMP, ICALL) T r y b a d r e s o w a n i a p o ś r e d n i e g o p a m i ę c i p r o g r a m u j e s t w y k o r z y s t y w a n y do realizacji skoków i w y w o ł a ń p o d p r o g r a m ó w . P o w y k o n a n i u r o z k a z u IJMP lub ICALL p r o g r a m j e s t k o n t y n u o w a n y od adresu u m i e s z c z o n e g o w rejest rze Z.
Pamięć programu $000 15
0 Rejestr Z
1
-
S3FF
Rys. 4.17. Adresowanie pośrednie pamięci programu wykorzystywane przez rozkazy IJMP iCALL Przykład 4.10. Przeniesienie wykonania programu do adresu opatrzonego etykietą „dalej"
LDI LDI IJMP
LO:
R30,DALEJ R31.0 ;skok do rozkazu z etykieta DALEJ
DALEJ:
4.7.11. Tryb adresowania względnego pamięci programu (RJMP i RCALL)
Pamięć programu $000 15 PC
OP $3FF
Rys. 4.18. Adresowanie względne pamięci programu wykorzystywane przez rozkazy RJMP i RCALL
Adresowanie względne pamięci p r o g r a m u
u m o ż l i w i a realizację
skoków
względnych. Przeniesienie programu następuje d o adresu o b l i c z a n e g o formu łą PC=PC+k+l.
Parametr k jest zapisany w k o d z i e uzupełnienia d o 2 (U2),
m o ż e przybierać wartości od - 2 0 4 8 d o 2 0 4 7 . S k o k m o ż e b y ć w i ę c wykona ny zarówno do przodu j a k i d o tyłu w z g l ę d e m b i e ż ą c e g o stanu licznika pro gramu.
N a liście r o z k a z ó w mikrokontrolerów A V R w y s t ę p u j e skok b e z w a r u n k o w y JMP. N i e został on z a i m p l e m e n t o w a n y w mik rokontrolerze A T 9 0 S 2 3 1 3 .
Przykład 4.11. Przeniesienie wykonania programu przy wykorzystaniu skoku względnego
4.8.
BLIŻEJ; RJMP
DALEJ
,-skok względny do adresu opatrzonego /etykietą .DALEJ"
DALEJ:
BLIiEJ
;skok względny do adresu opatrzonego ,-etykietą .BLIŻEJ'
RJKP
Przebiegi czasowe podczas dostępu do pamięci i wykonywania rozkazów Mikrokontrolery A V R j a k o układy s y n c h r o n i c z n e
wymagają
taktowania
przebiegiem zegarowym. Odpowiedni j e d n o f a z o w y p r z e b i e g zegarowy jest wytwarzany przez wewnętrzny oscylator, którego c z ę s t o t l i w o ś ć pracy jest ustalana zewnętrznym rezonatorem k w a r c o w y m d o ł ą c z a n y m d o wyprowa dzeń X T A L 1 i X T A L 2 . Częstotliwość oscylatora nie j e s t d z i e l o n a tak, jak to m a miejsce w przypadku mikrokontrolerów rodziny 8 0 5 1 , ale czy nie jest wewnętrznie powielana? Wiele wskazuje na to, że układ t i m i n g u zawiera w sobie pętlę P L L lub j a k i ś inny układ powielania częstotliwości podstawo w e j . Świadczą o tym d o ś ć charakterystyczne przesunięcia c z a s o w e niektó rych sygnałów sterujących i w y s o k a szybkość działania mikrokontrolera. Je dyną wątpliwość może budzić deklarowana w pełni statyczna b u d o w a rdze nia. W oficjalnych danych katalogowych u d o s t ę p n i a n y c h p r z e z Atmela nie ma jednak ani słowa na ten temat. Z punktu widzenia u ż y t k o w n i k a nie jest to w sumie istotne, jeśli tylko spełnione są parametry p o d a w a n e w dokumenta cji układu.
Tl
T2
a
Zegar systemowy
T4
T3
r
Pobranie pierwszej instrukcji Wykonanie pierwszej Pobranie drugiej Wykonanie drugiej Pobranie trzeciej Wykonanie trzeciej Pobranie czwartej
instrukcji instrukcji instrukcji instrukcji instrukcji instrukcji
Rys. 4.19. Zasada równoległego pobierania i wykonywania rozkazów
Zegar systemowy Carkowity czas wykonywania rozkazu Pobranie operandów Wykonanie operacji przez ALU Wpis wyników do rejestrów
Rys. 4.20. Timing operacji wykonywanej w jednym cyklu zegarowym
N a r y s u n k u 4 . 1 9 przedstawiono zasadę p o t o k o w e g o przetwarzania rozkazów, zgodnie z którą pracują mikrokontrolery A V R . K a ż d y kolejny rozkaz jest p o bierany w t y m s a m y m czasie, kiedy w y k o n y w a n y jest poprzedni. Dzięki temu m e c h a n i z m o w i wydajność mikrokontrolerów A V R w y n o s i 1 M I R S / M H z . T i m i n g operacji w y k o n y w a n e j w j e d n y m cyklu z e g a r o w y m , wykorzystującej zestaw
rejestrów
przedstawiono
na
rysunku
4.20.
Dane
są
pobierane
z d w ó c h rejestrów, a p o w y k o n a n i u operacji jej rezultat j e s t u m i e s z c z a n y w rejestrze w y n i k o w y m . N i e c o inaczej wygląda t i m i n g dostępu d o w e w n ę t r z n e j pamięci
SRAM.
W t y m p r z y p a d k u d o w y k o n a n i a rozkazu n i e z b ę d n e są d w a c y k l e z e g a r o w e ( r y s u n e k 4.21).
Zegar systemowy
»
T1
j
T2
;
T3
\
t
\
>,
\
i
Adres Dane
i
Adres poprzedni IY Adres aktualny!
"
h •> i
iii*< r
WR
i
! I— i
Dane RD
\
(
!
S
ijj i\i
i
!\
U i
,\ \
i
Rys. 4.21. Cykle dostępu do wewnętrznej pamięci SRAM
T4
>
4.9.
Przestrzeń we/wy Wszystkie układy peryferyjne mikrokontrolera A T 9 0 S 2 3 1 3 są umiejscowio ne w obszarze we/wy pamięci S R A M . Lokacje te są d o s t ę p n e p o p r z e z rozka zy IN i OUT przekazujące dane p o m i ę d z y rejestrami o g ó l n e g o przeznaczenia, a obszarem we/wy. Rejestry należące d o obszaru od $ 0 0 d o $ 1 F charaktery zują się dostępem bitowym. Poszczególne ich bity mogą b y ć sprawdzane przy wykorzystaniu rozkazów SBIS i SBIC i w zależności o d i c h stanu prze nosić w y k o n y w a n i e programu w inne miejsce.
Rejestry w e / w y d o których dostęp o d b y w a się z a p o m o c ą roz kazów IN i OUT muszą b y ć określane adresami od $ 0 0 d o S3F, chociaż w pamięci S R A M zajmują lokacje od $ 2 0 d o $5F. Jeśli rejestry w e / w y są adresowane j a k o p a m i ę ć S R A M należy do adresu dodać wartość $ 2 0 .
Ul
W książce adresy rejestrów w e / w y p o d a w a n e j a k o adresy pa-
|Mn
mięci S R A M są ujmowane w nawiasy.
W celu zachowania kompatybilności p r o g r a m u z n o w y m i w e r s j a m i mikro kontrolerów, bity zarezerwowane p o w i n n y m i e ć wartość zero. Zarezerwowa nych adresów przestrzeni we/wy nie w o l n o u ż y w a ć w o g ó l e . Niektóre znaczniki (flags - w dalszej części książki będą w y m i e n n i e nazywa ne flagami) są z e r o w a n e poprzez wpisanie d o nich logicznej „ I " . Rozkazy CBI i SBI działają na wszystkich bitach rejestrów w e / w y . M o g ą być jednak wykorzystywane tylko rejestry o adresach od 0 0 d o $ 1 F . W tablicy 4.2 zesta w i o n o rejestry specjalne związane z o b s z a r e m w e / w y .
Niektóre wskaźniki są z e r o w a n e p o p r z e z w p i s a n i e d o nich logicznej „ 1 " .
Tab. 4.2. Rejestry przestrzeni we/wy mikrokontrolera AT90S2313 Adres
Nazwa
S3F(S5F)
SREG
Rejestr statusu
$3D($5D)
SPL
Wskaźnik stosu - rejestr mniej znaczący (w AT90S2313 występuje tylko SPL)
S3B(S5B)
GIMSK
Rejestr maskowania przerwań ogólnych
$3A($5A)
GIFR
Rejestr wskaźników przerwań ogólnych
S39($59)
TIMSK
Rejestr maskowania przerwań timera/licznika
$38($58)
TIFR
Rejestr wskaźników przerwań timera/licznika
S35(S55)
MCUCR
Rejestr sterowania MCU
S33(S53)
TCCRO
Rejestr sterujący Timera/LicznikaO
$32 ($52)
TCNTO
Timer/LicznikO (8-bitowy)
$2F{$4F)
TCCR1A
Rejestr sterujący A Timera/Licznikal
$2E($4E)
TCCR1B
Rejestr sterujący B Timera/Ucznikal
$2D($4D)
TCNT1H
Timer/Licznikl - starszy bajt
Funkcja
$2C(S4C)
TCNT1L
Timer/Licznikl - młodszy bajt
$2B(54B)
0CR1AH
Rejestr porównania - starszy bajt
$2A(S4A)
OCR1AL
Rejestr porównania - młodszy bajt
$25(345)
ICR1H
Rejestr przechwytywania Timera/Licznikal - starszy bajt
$24(S44)
ICR1L
Rejestr przechwytywania Timera/Licznikal - młodszy bajt
$21(541)
WDTCR
Rejestr sterujący watchdoga
$1E($3E)
EEAR
Rejestr adresowy pamięci EEPROM
$10(53D)
EEDR
Rejestr danych pamięci EEPROM
$1C(S3C)
EECR
Rejestr sterujący pamięci EEPROM
$18(538)
PORTB
Rejestr danych portu B
$17($37)
DDRB
Rejestr kierunku portu B
$16($36)
PINB
Rejestr linii wejściowych portu B
$12 ($32)
PORTD
Rejestr danych portu D
$11 ($31)
DDRD
Rejestr kierunku portu D
$10 ($30)
PINO
Rejestr linii wejściowych portu D
$0C($2C)
UDR
Rejestr danych UART-a
$0B($2B)
USR
Rejestr statusu UART-a
$OA($2A)
UCR
Rejestr sterujący UART-a
$09($29)
UBRR
Rejestr szybkości transmisji UART-a
$08{$28)
ACSR
Rejestr sterujący i statusu komparatora analogowego
4.9.1.
Funkcje bitów w rejestrach funkcyjnych
SREG
[Status Register) - rejestr statusu - $3F Bit %3f (S5F1 Odczyt/Zapis
(
7 i RW
e
5
4
T
s
R/W
H R/W
R/W
0
0
0
Wartość początkowa o
B 7 - 1 (Global tnterrupt
Enable):
1
0 c
R/W
2 N R/W
R/W
R/W
0
0
0
0
3
SREG
bit globalnego z e z w o l e n i a n a przerwania.
Bit ten musi być ustawiony ( „ i " ) w celu włączenia wszystkich przerwau. Jeś li jest wyzerowany, to niezależnie od ustawienia p o s z c z e g ó l n y c h bitów ze zwoleń żadne z przerwań nie będzie p r z y j m o w a n e d o o b s ł u g i . Indywidualne przerwania są kontrolowane przez wydzielone rejestry. Bit I j e s t zerowany sprzętowo w momencie przyjęcia obsługi przerwania i u s t a w i a n y w chwili zakończenia obsługi przerwania, p o d c z a s w y k o n a n i a r o z k a z u R E T I . Bit ten j e s t dostępny programowo do odczytu i zapisu. B 6 - T (Copy Storage);
bit z a c h o w a n i a kopii.
Rozkazy kopiowania bitów BLD (Bit LoaD) i BST (Bit STore)
wykorzystują
bit T j a k o źródło i przeznaczenie operacji b i t o w y c h . D a n y bit rejestru robo czego może być kopiowany do T r o z k a z e m BST i o d w r o t n i e - bit Tmoze być kopiowany d o rejestru roboczego r o z k a z e m BLD. B 5 - H (Half-Carry
Fłag):
wskaźnik przeniesienia p o ł ó w k o w e g o .
Wskaźnik H jest to bit przeniesienia p o ł ó w k o w e g o w n i e k t ó r y c h operacjach arytmetycznych. Jego ustawienie następuje w m o m e n c i e przeniesienia zjednej połówki bajtu do drugiej. Szczegóły w liście r o z k a z ó w . W s k a ź n i k Hjest przydamy podczas w y k o n y w a n i a arytmetyki na liczbach B C D . Przykład 4.12. Ustawienie flagi H podczas wystąpienia przeniesienia z młodszego pólbajtu na starszy LDI LDI ADD ADD
DAWA1.S0F DANA2,$01 D.4NA1, DANA2 DANA1,DANA2
H=0 DANA1=$10, H=l
(przeniesienie połówkowe)
B 4 - S (Sign Bit): bit z n a k u , S = N © V Bit S jest zawsze wyliczany przez funkcję E x - O R p o m i ę d z y bitami N (wskaźnik wartości ujemnej) i V (przepełnienie u z u p e ł n i e n i a d o dwóch). Szczegóły w liście rozkazów.
B 3 - V (Two's
Complement
Overflow
Flag)', w s k a ź n i k p r z e p e ł n i e n i a u z u
pełnienia d o d w ó c h . W s k a ź n i k V w s p o m a g a w y k o n y w a n i e operacji n a liczbach w k o d z i e uzupeł nień d o d w ó c h ( U 2 ) . Jest ustawiany w m o m e n c i e p r z e k r o c z e n i a d o p u s z c z a l nej wartości ujemnej w rejestrze. Przykład 4.13. Ustawienie flagi V po przekroczenia wartości-128 LDI DEC DEC
w rejestrze R16
R16, -127 ;V=0 R16 ;R16=-128, V=0 R16 ;R16 — 129, ale nie może przyjąć takiej wartości, ;wiec V=l
B 2 - N (Negotive
Fłag):
wskaźnik wartości ujemnej.
W s k a ź n i k N j e s t ustawiany, z a w s z e g d y w y n i k operacji arytmetycznej przyj m u j e wartość ujemną. Z n a k liczby zapisanej w k o d z i e U 2 j e s t zapisany n a najstarszym bicie, tak więc w s k a ź n i k N z a w s z e b ę d z i e kopią tego bitu. N i e dotyczy to sytuacji, w których zostanie on w s p o s ó b j a w n y z m i e n i o n y . B I - Z (Zero Flag):
w s k a ź n i k zera.
W s k a ź n i k Z j e s t ustawiany w t e d y , gdy w w y n i k u w y k o n a n i a operacji aryt metycznej lub logicznej w y n i k j e s t r ó w n y 0. BO - C (Carry
Fłag):
w s k a ź n i k przeniesienia.
W s k a ź n i k C sygnalizuje przeniesienie p o d c z a s operacji a r y t m e t y c z n y c h .
SPL
{Stack Pointer) - wskaźnik stosu - $3D 6it 7 S3D ($50) | SP7 R/W Odczyt/Zapis Wartość początkowa 0
l
6 SP6 R/W 0
!1
s SPS R/W 0
|,
4 SP4 R/W 0
1
3 2 SP3 11 SP2 R/W R/W 0
0
1,
1 SP1 R/W 0
|,
0 SPO R/W
| SPL
0
Jest t o 8-bitowy rejestr pełniący funkcję w s k a ź n i k a stosu. Z a j e g o p o m o c ą m o ż n a z a a d r e s o w a ć 128 bajtów p a m i ę c i S R A M o adresach od $ 6 0 d o $ D F . Programista powinien zapewnić odpowiednią wielkość pamięci przeznaczo nej na stos. Z a l e ż y ona od liczby zagnieżdżeń p o d p r o g r a m ó w i a r g u m e n t ó w p r z e k a z y w a n y c h przez stos (co jest często p r a k t y k o w a n e p r z e z k o m p i l a t o r y j ę z y k ó w w y s o k i e g o p o z i o m u ) . T r z e b a także p a m i ę t a ć , że pojawiające
się
a s y n c h r o n i c z n i e przerwania r ó w n i e ż wykorzystują stos. W s k a ź n i k stosu p o winien b y ć z a w s z e ustawiany na początku p r o g r a m u , w p r z e c i w n y m przy p a d k u n i e u c h r o n n i e dojdzie d o b ł ę d n e g o działania m i k r o k o n t r o l e r a lub cał k o w i t e g o z a w i e s z e n i a p r o g r a m u . S P L wskazuje na aktualnie z a p i s y w a n y ad res stosu. P o o d ł o ż e n i u danej na stosie r o z k a z e m PUSH, zawartość w s k a ź n i k a
S P L zostaje zmniejszona o 1. W p r z y p a d k u o d k ł a d a n i a adresu powrotu dla rozkazów wywołań p o d p r o g r a m ó w i procedur obsługi p r z e r w a ń zawartość rejestru S P L jest zmniejszana o 2. Po zdjęciu danej ze stosu r o z k a z e m POP zawartość rejestru S P L jest zwiększana o 1, a p o w y k o n a n i u p o w r o t u z pod programu (RET) lub obsługi przerwania (RETI) j e s t z w i ę k s z a n a o 2 . W „większych" odmianach mikrokontrolerów A V R w s k a ź n i k stosu jest re jestrem l ć - b i t o w y m , z ł o ż o n y m z d w ó c h rejestrów 8-bitowych: S P H i SPL.
4.10. Zerowanie i wektory przerwań Jednym z podstawowych zadań mikrokontrolera j e s t s t e r o w a n i e różnymi urządzeniami peryferyjnymi. Najczęściej - m o ż n a p o w i e d z i e ć , ż e prawie za wsze - pracują one asynchronicznie w stosunku d o p r o g r a m u realizowanego przez C P U . Mikrokontroler nie potrafi w d o s ł o w n y m z n a c z e n i u obsłużyć wszystkich zdarzeń j e d n o c z e ś n i e , chociaż o b s e r w a t o r przyglądający się jego pracy z zewnątrz może mieć takie wrażenie. Jedną z m e t o d „ p a n o w a n i a " nad systemem jest np. sekwencyjne przeglądanie stanu p o s z c z e g ó l n y c h urządzeń i w razie wystąpienia konieczności j e g o obsłużenia w y k o n a n i e odpowiedniej procedury. Takie rozwiązanie powoduje j e d n a k b e z p r o d u k t y w n e marnowanie czasu przez ciągle sprawdzanie urządzeń, k t ó r e w d a n y m m o m e n c i e nie wy magają obsługi. Sytuacja staje się dramatyczna, gdy urządzenia są uszerego wane według określonych priorytetów. A b y b y ł o m o ż l i w e zapewnienie wa runku obsługi priorytetowej należałoby w ó w c z a s b a r d z o r o z b u d o w a ć pro gram. Rozwiązaniem powyższych p r o b l e m ó w j e s t w y k o r z y s t a n i e systemu przerwań. Program mikrokontrolera w takim p r z y p a d k u s k ł a d a się z pętli, w której
wykonuje
zadania wynikające
z wymagań
konkretnej
aplikacji.
W chwili, gdy dane urządzenie peryferyjne w y m a g a o b s ł u g i , z g ł a s z a ten fakt d o mikrokontrolera poprzez przerwanie. W efekcie następuje
zawieszenie
wykonywania aktualnej operacji i przejście d o p r o c e d u r y obsługi tego prze rwania. Jeśli teraz nastąpi żądanie od innego urządzenia, t o gdy m a ono wyż szy priorytet od bieżącego może nastąpić kolejne z a w i e s z e n i e wykonywanej operacji i przejście d o obsługi przerwania o w y ż s z y m priorytecie. Jeśli prio rytet drugiego urządzenia jest niższy, to musi o n o c z e k a ć d o m o m e n t u zakoń czenia obsługi urządzenia o w y ż s z y m priorytecie. S k o k d o p r o c e d u r obsługi odbywa się zawsze ze śladem (adres powrotu o d k ł a d a n y na stosie). Po zakoń czeniu działań sterowanie jest przekazywane d o miejsca, w k t ó r y m wystąpiło żądanie obsługi. W ten sposób uzyskuje się wrażenie j e d n o c z e s n e g o , nieza kłóconego funkcjonowania wielu asynchronicznych urządzeń.
Tab. 4.3. Wektory obsługi przerwań Numer wektora
Adres
Źródło
Opis
1
$000
RESET
Zewnętrzne wejście zerujące, sygnału power-on reset i watchdoga
2
$001
INTO
Zewnętrzne przerwanie INTO
3
$002
INT1
Zewnętrzne przerwanie INT1
4
$003
TC1 CAPT
Przerwanie od TC1 - wystąpiło przechwycenie
5
$004
TC1 COMP
Przerwanie od TC1 - wykryto równość
6
$005
TC1 OVF
Przerwanie od TC1 - przepełnienie Timera/Licznikal
7
$006
TCO OVF
Przerwanie od TCO - przepełnienie Timera/LicznikaO
8
$007
UART RX
Przerwanie od układu UART - odebrano znak
9
$008
UART UDRE
Przerwanie od uktadu UART - rejestr nadajnika pusty
10
$009
UARTTX
Przerwanie od układu UART - wysiano znak
11
$00A
ANA_COMP
Przerwanie od komparatora analogowego
, J
W praktyce najczęściej nie j e s t tak „ r ó ż o w o " j a k p o d a n o w opisie. Pisząc p r o g r a m trzeba na ogół dbać o to, aby procedury obsługi p r z e r w a ń były bar d z o starannie o p t y m a l i z o w a n e p o d w z g l ę d e m c z a s o w y m . W s z y s t k i e urządzenia o b s ł u g i w a n e przez s y s t e m p r z e r w a ń mają przydzielone t z w . w e k t o r y p r z e r w a ń , czyli ściśle określone adresy pamięci p r o g r a m u , p o d którymi są u m i e s z c z a n e p r o c e d u r y obsługi. D o k ł a d n i e j p o d a d r e s e m t y m m u si się z a c z y n a ć taka procedura, najczęściej znajduje się t a m j e d e n r o z k a z s k o ku d o i n n e g o adresu pamięci p r o g r a m u , gdzie znajdują się dalsze instrukcje. Specjalny
wektor
przeznaczono
AT90S2313 przewidziano
dla
zerowania.
W mikrokontrolerze
11 r ó ż n y c h źródeł p r z e r w a ń . Są o n e
opisane
w tablicy 4.3. W s z y s t k i e przerwania mogą b y ć i n d y w i d u a l n i e o d b l o k o w y w a n e lub b l o k o w a n e poprzez ustawienie („1") lub z e r o w a n i e („0") o d p o w i e d n i e g o bitu z e z w o l e n i a znajdującego się w p r z y d z i e l o n y m d o d a n e g o urządze nia rejestrze sterującym. M o ż n a także włączyć l u b wyłączyć cały s y s t e m przerwań ustawiając lub zerując bit I w rejestrze statusu S R E G . T y p o w y fragment inicjujący programu przedstawiono w poniższym przykładzie. Przykład 4.14. Typowy fragment programu inicjujący pracę mikrokontrolera $000 $001 $002 $003 $004 $005 $006 $007 $008 $009 $00A $00B $00C $00D
RJMP RJMP RJMP RJMP RJMP RJMP RJMP RJMP RJMP RJMP RJMP MAIN:
RESET ,-uchwyt dla resetu EXT_INT0 ,-uchwyt dla INTO EXT_INT1 ,-uchwyt dla INT1 TIM_CAPT1 ,-uchwyt dla przechwycenia Timeral TIM_C0MP1 juchwyt dla równości Timeral TIM_OVFl ;uchwyt dla przepełnienia Timeral TIM_OVF0 ;uchwyt dla przepełnienia TimeraO UART_RXC ,-uchwyt dla odebranego znafcu przez UART UART_DRE ,-uchwyt dla pustego nadajnika UART-a UART_TXC ;uchwyt dla wysłanego znaku przez UART ANA„COMP ;uchwyt dla komparatora analogowego LDI R16 , LOW (RAMEND) ,• start programu głównego OUT SPL,R16 ;ustawienie wskaźnika stosu
4.10.1. Źródła sygnału zerującego W mikrokontrolerze AT90S2313 przewidziano trzy źródła sygnału zerowania: - Power-on
Reset - mikrokontroler jest z e r o w a n y , g d y n a p i ę c i e zasilające
spadnie poniżej wartości progowej V P O T ( r y
s u
°
e k
4
-
2 3
)-
- External Reset - mikrokontroler j e s t zerowany, g d y na wejściu R E S E T wy stąpi niski stan przez c o najmniej 50 ns. - Watchdog Reset - mikrokontroler jest zerowany, gdy licznik watchdog nie zostanie w porę wyzerowany (w sytuacji g d y w a t c h d o g j e s t uaktywniony). Podczas zerowania mikrokontrolera wszystkie rejestry w e / w y są ustawiane zgodnie z przyjętymi dla nich stanami p o c z ą t k o w y m i . L i c z n i k programu jest zerowany, tak więc pierwszy rozkaz jest w y k o n a n y spod a d r e s u $000. Jeśli planowane jest wykorzystywanie przerwań, m u s i tu b y ć u m i e s z c z o n y skok RJMP d o adresu, pod którym znajdują się instrukcje inicjujące pozostałe ele menty systemu. Jeśli nie jest p r z e w i d y w a n e w y k o r z y s t y w a n i e przerwań ko lejne adresy pamięci programu odpowiadające w e k t o r o m p r z e r w a ń nie będą potrzebne. W takim przypadku program m o ż e być l i n i o w o k o n t y n u o w a n y od adresu $000. Na rysunku 4.22 przedstawiono s c h e m a t układu sprzętowego zerowania, natomiast w tablicy 4.4 zestawiono p a r a m e t r y e l e k t r y c z n e i cza sowe układu zerowania. Użytkownik może wybrać odpowiedni czas startu w zależności o d typowego czasu wzbudzenia oscylatora. Liczbę cykli oscylatora w a t c h d o g a powodującą przekroczenie limitu czasu (time-outu) p o d a n o w tablicy 4.5. N a l e ż y pamiętać, że częstotliwość impulsów zliczanych przez w a t c h d o g j e s t zależna od napięcia.
vcc
j
Moduł Power-On Reset
POR
[jl00...500k RESET
Generator sygnału zerującego
3
Watchdog FSTRT
Wbudowany oscylator RC
14-stopniowy licznik dwójkowy
TT Rys. 4.22. Schemat układu zerowania zastosowanego w mikrokontrolerach AVR
Taft.
4.4. Parametry elektryczne i czasowe układu zerującego
Symbol VPOI
Min.
Parametr
typ.
Napięcie progowe wyzwalania układu zerującego po włączeniu zasilania (napięcie narasta)
1.0
1.4
Napięcie progowe wyzwalania układu zerującego po wyłączeniu zasilania (napięcie opada)
0,4
0,6
Maks.
Jednostki' V
1,8
V
0,8
Napięcie progowe na wejściu R E S E T
ITOUT
Opóźnienie od wyzwolenia do końca zerowania F S T R T nie zaprogramowany
11
16
21
ms
trouT
Opóźnienie od wyzwolenia do końca zerowania F S T R T zaprogramowany
0,25
0,28
0,31
ms
S
0,85 V
V
VR T
C C
Uwagal Sygnat Power-on Reset nie będzie generowany dopóki napięcie zasilające spadnie poniżej Vpox-
Tab. 4.5. Liczba cykli oscylatora watcbdoga ;•
liczba cykli WDT
Bit konfigurujący FSTRT
Time-out dla Vcc=5V
zaprogramowany
0,28 ms
256
nie zaprogramowany
16,0 ms
16 k
|
Zerowanie automatyczne Power-on Reset W układzie z e r o w a n i a występuje kilka b l o k ó w o d p o w i e d z i a l n y c h za g e n e r o wanie
sygnału
zerującego
w różnych
sytuacjach.
Układ
Power-on
Reset
( P O R ) w y t w a r z a sygnał zerowania w m o m e n c i e załączenia zasilania. Jak wi dać na r y s u n k u 4.22, w układzie zerującym znajduje się w e w n ę t r z n y licznik taktowany
z oscylatora
watchdoga. Zapobiega
on rozpoczęciu
pracy
przez
m i k r o k o n t r o l e r przed osiągnięciem przez napięcie zasilające wartości progo wej V p o x (rysunek 4.23).
vcc
RESET i i i
TIME-OUT
'r
t
TOUT
i
• i i i
INTERNAL RESET Rys. 4.23. Generowanie wewnętrznego sygnału zerującego po włączeniu napięcia zasilają cego, gdy wejście RESET jest dołączone do VCC
vcc
RESET
ITOUT-
TIME-OUT
Wewnętrzny sygnał zerujący
Rys. 4.24 Generowanie wewnętrznego sygnału zerującego po włączeniu napięcia zasilają cego, gdy linia RESET jest sterowana zewnętrznie
Użytkownik ma możliwość zdecydowania j a k s z y b k o p o w i n i e n wystartować mikrokontroler po włączeniu zasilania. Czyni to przez o d p o w i e d n i e zapro gramowanie bitu konfigurującego ifuse bit) F S T R F w p a m i ę c i Flash. Jego za programowanie jest wskazane, g d y generator taktujący w s p ó ł p r a c u j e z rezo natorem k w a r c o w y m lub g d y inne źródło przebiegu z e g a r o w e g o gwarantuje odpowiednio szybkie wzbudzenie p o włączeniu zasilania. Jeśli „ w b u d o w a n e " opóźnienie startu jest wystarczające, wejście R E S E T m o ż e b y ć podłączone bezpośrednio lub poprzez rezystor podciągający d o V<x- N i s k i stan logiczny na wejściu R E S E T powinien b y ć u t r z y m a n y p r z e z c z a s , w k t ó r y m napięcie zasilające osiągnie stan ustalony (rysunek 4.24). W p r a k t y c e b y w a z tym różnie. Z tego względu p o w s z e c h n e jest s t o s o w a n i e s p e c j a l i z o w a n y c h ukła d ó w generujących sygnał zerowania w sposób p r a w i d ł o w y .
vcc
RESET \
VRST
-jf-
'TOUT
TIME-OUT
Wewnętrzny sygnał zerujący 4 25
wanie
: ^§g
mi
*rokontrolera
za pomocą zewnętrznego sygnału podawanego na
Zerowanie zewnętrzne Z e w n ę t r z n e zerowanie jest g e n e r o w a n e przez p o d a n i e sygnału niskiego na wejście R E S E T . P o w i n n o b y ć u t r z y m a n e w t y m stanie przez czas nie krótszy niż 5 0 ns n a w e t , g d y zegar s y s t e m o w y nie c h o d z i . K r ó t s z e i m p u l s y nie g w a rantują p r a w i d ł o w e g o zerowania. W y k r y c i e stanu poniżej wartości p r o g o wej V R S T p o w o d u j e w y g e n e r o w a n i e w e w n ę t r z n e g o sygnału z e r o w a n i a ( r y s u n e k 4.25). P o n o w n e przekroczenie tego p r o g u na narastającym
zboczu
sygnału R E S E T inicjuje pracę timera o p ó ź n i e n i a startu. Po przekroczeniu li mitu czasu ty/ouT mikrokontroler zostaje w y z e r o w a n y i r o z p o c z y n a pracę od początku.
Zerowanie wywołane przez watchdoga P r z e k r o c z e n i e limitu czasu określonego p r z e z w a t c h d o g p o w o d u j e w y g e n e r o w a n i e krótkiego impulsu zerującego, trwającego j e d e n cykl oscylatora X T A L ( r y s u n e k 4.26). Jednocześnie z narastającym z b o c z e m tego impulsu pojawia się w e w n ę t r z n y sygnał zerowania. N a opadającym zboczu inicjowany jest tim e r o p ó ź n i e n i a startu. P o przekroczeniu przez n i e g o time-out'u
tjoUT m i k r o
kontroler zostaje w y z e r o w a n y i r o z p o c z y n a pracę o d początku.
vcc
RESET
1 cykl zegarowy Wyjście zerujące watchdoga 'TOUT-
Ucznik czasu trwania sygnału zerującego Wewnętrzny sygnał zerujący
Rys. 4.26. Sygnat zerowania od watchdoga
4.10.2. Uchwyty przerwań Mikrokontroler A T 9 0 S 2 3 1 3 m a d w a 8-bitowe rejestry w y k o r z y s t y w a n e przez system p r z e r w a ń . Są to: G I M S K (General
tnterrupt
(Timer/Counter
P o wystąpieniu p r z e r w a n i a bit glo-
Interrupt
Mask Register).
Mask Register)
i TIMSK
balnego zezwolenia na przerwania j e s t z e r o w a n y , w w y n i k u c z e g o wszystkie przerwania zostają automatycznie zablokowane. Jeśli u ż y t k o w n i k o w i zależy, aby w trakcie obsługi tego przerwania było m o ż l i w e z g ł a s z a n i e innych (o wyższym priorytecie), musi ręcznie ustawić bit I. Jeśli tego nie zrobi, wszyst kie przerwania, które ewentualnie nadejdą w m i ę d z y c z a s i e , zostaną ustawio ne w kolejce według priorytetów obsługi.
U|GA
Niektóre flagi przerwań są z e r o w a n e p o p r z e z w p i s y w a n i e lo gicznej „ 1 " n a pozycję z e r o w a n e g o bitu.
Wyjście z procedury obsługi każdego przerwania realizuje r o z k a z R E T I , któ ry przywraca stan bitu I (ustawia g o na „1"). Z g ł o s z e n i e p r z e r w a n i a powodu j e ustawienie odpowiedniej dla niego flagi. W p r z y p a d k u , g d y zgłoszenie przerwania nastąpi w chwili, gdy bit I jest w y z e r o w a n y , p r z e r w a n i e nie zosta nie obsłużone. Jeśli teraz flaga zgłoszonego przerwania z o s t a n i e wyzerowana (bez wchodzenia d o procedury obsługi), t o p o n o w n e jej ustawienie będzie możliwe dopiero w m o m e n c i e nadejścia następnego żądania o b s ł u g i . W ten sposób j e d n o zgłoszenie m o ż e zostać utracone. T r z e b a j e d n a k
pamiętać
o tym, że nieco inaczej wygląda obsługa przerwań z g ł a s z a n y c h poziomem, kiedy to żądanie obsługi pozostaje w a ż n e przez cały c z a s u t r z y m y w a n i a się niskiego poziomu na wejściu INTx. Flaga d a n e g o p r z e r w a n i a j e s t automa tycznie zerowana, gdy d o licznika programu zostanie w p i s a n y (automatycz nie) adres skoku odpowiadający temu przerwaniu.
.
Przerwanie zewnętrzne zgłaszane p o z i o m e m nie m a przypisa-
JGA
^
^
a s i
1
1
P ^ ™
3 1 1
3
* - Żądanie p r z e r w a n i a pozostaje
aktywne
tak długo, j a k długo występuje fizycznie s y g n a ł p r z e r w a n i a .
Niektóre flagi przerwań są zerowane poprzez w p i s y w a n i e logicznej „ 1 " na pozycję zerowanego bitu. Jeśli wystąpi zgłoszenie p r z e r w a n i a , g d y odpowia dający mu bit zezwolenia j e s t w y z e r o w a n y , flaga p r z e r w a n i a zostanie usta wiona i zapamiętana do czasu p o n o w n e g o o d b l o k o w a n i a p r z e r w a n i a lub ręcznego jej wyzerowania. W sytuacji, gdy bit g l o b a l n e g o z e z w o l e n i a na przerwania jest wyzerowany i następują kolejne zgłoszenia p r z e r w a ń , odpo wiednie flagi zostają ustawione i zapamiętane. Po ustawieniu bitu 1 wszystkie przerwania zostają obsługiwane kolejno według priorytetów.
Rejestr statusu nie jest automatycznie z a p i s y w a n y na stosie p o wejściu d o procedury obsługi p r z e r w a n i a i a u t o m a t y c z n i e od t w a r z a n y p o wyjściu z niej. Jeśli c e l o w e jest j e g o z a c h o w a n i e , m u s i o t o zadbać programista.
GIMSK
{General Interrupt Mask Register) - rejestr ogólnego maskowania przerwań - $3B Bit S38(S5B) I INT1 OJciyi/Zapis R/W Wartość początkowa o
|
B 7 - I N T 1 (External
7 INTO R/W 0
6 |
Interrupt
5 )
- . R 0
4 0
Reguest
3 | R
-
2 |
R 0
1 Enabłe):
R o
1 |
f
| l
o
0 R o
| GIMSK
zezwolenie na obsługę
przerwania zewnętrznego INT1. Jeśli bit I N T 1 j e s t u s t a w i o n y ( „ 1 " ) i bit I ( S R E G ) j e s t u s t a w i o n y ( „ 1 " ) , m o ż l i w a jest o b s ł u g a p r z e r w a ń g e n e r o w a n y c h p r z e z u r z ą d z e n i a
zewnę
trzne, a s y g n a l i z o w a n y c h p o p r z e z wejście I N T 1 . B i t y I S C 1 1 i 1SC10 rejest ru M C U C R określają n a j a k i rodzaj s y g n a ł u na w e j ś c i u I N T 1 p o w i n i e n r e a g o w a ć u k ł a d u p r z e r w a ń ( z b o c z e narastające, o p a d a j ą c e lub p o z i o m ) . A k t y w n y stan k o ń c ó w k i I N T 1 powoduje żądanie obsługi przerwania nawet, gdy jest o n a skonfigurowana j a k o wyjście. O b s ł u g a p r z e r w a n i a I N T 1 r o z p o czyna się od adresu $ 0 0 2 . B 6 - INTO (External
Interrupt
Reąuest
0 Enable):
zezwolenie na obsługę
p r z e r w a n i a z e w n ę t r z n e g o INTO. Jeśli bit INTO j e s t u s t a w i o n y ( „ 1 " ) i bit I ( S R E G ) j e s t u s t a w i o n y ( „ 1 " ) , m o ż l i w a j e s t o b s ł u g a p r z e r w a ń g e n e r o w a n y c h p r z e z urządzenia z e w n ę t r z ne, a s y g n a l i z o w a n y c h p o p r z e z wejście INTO. Bity I S C 0 1 i I S C 0 0 rejestru M C U C R określają na j a k i rodzaj sygnału na wejściu INTO p o w i n i e n r e a g o w a ć u k ł a d u p r z e r w a ń ( z b o c z e narastające, opadające lub p o z i o m ) . A k t y w n y stan k o ń c ó w k i INTO p o w o d u j e ż ą d a n i e obsługi p r z e r w a n i a n a w e t , g d y j e s t o n a s k o n f i g u r o w a n a j a k o wyjście. O b s ł u g a p r z e r w a n i a INTO r o z p o c z y n a się od adresu $ 0 0 1 . B5...0 - z a r e z e r w o w a n e . T e bity nie są w y k o r z y s t y w a n e w układzie A T 9 0 S 2 3 1 3 i z a w s z e o d c z y t y w a ne j a k o zero.
GIFR
(General Interrupt Flag Register) - rejestr flag przerwań - $3A 5
y
BH
4
.
6
S3A(S5A) I IMTF1 I Odczyt/Za,* R/W Wartość początkowa O
INTFO l - l R/W R O 0
B 7 - I N T F 1 (Externał
Interrupt
R 0
3
. I
-
,
2
L
~ R 0
0
1
.
0
~ R 0
I
~ " 0
, I .
. I GlFR
Flag I): flaga z g ł o s z e n i a przerwania ze
w n ę t r z n e g o na wejściu I N T 1 . Flaga INTF1 jest ustawiana („1") w chwili, g d y na k o ń c ó w c e I N T 1 pojawia się zbocze sygnalizujące
żądanie obsługi p r z e r w a n i a . Jeśli bit I rejestru
S R E G oraz odpowiadający temu przerwaniu bit z e z w o l e n i a I N T 1 rejestru G I M S K jest ustawiony ( „ I " ) , to mikrokontroler w y k o n a s k o k określony wek torem przerwania. Flaga jest k a s o w a n a p o wejściu d o p r o c e d u r y obsługi prze rwania. Alternatywnie m o ż e b y ć s k a s o w a n a p r o g r a m o w o p o p r z e z wpisanie logicznej „ 1 " na odpowiednią pozycje. Flaga j e s t z a w s z e zerowana, gdy INT1 jest skonfigurowane na sygnalizowanie żądania o b s ł u g i poziomem. B 6 - INTFO (Externat
Interrupt
Flag 1): flaga z g ł o s z e n i a przerwania ze
w n ę t r z n e g o na wejściu INTO. Flaga INTFO jest ustawiana („1") w chwili, gdy n a k o ń c ó w c e INTO pojawia się zbocze sygnalizujące żądanie obsługi p r z e r w a n i a . Jeśli bit I rejestru S R E G oraz odpowiadający temu przerwaniu bit z e z w o l e n i a INTO rejestru G I M S K jest ustawiony („1"), to mikrokontroler w y k o n a s k o k określony wek torem przerwania. Flaga jest kasowana p o wejściu d o p r o c e d u r y obsługi prze rwania. Alternatywnie może b y ć s k a s o w a n a p r o g r a m o w o p o p r z e z wpisanie logicznej „ 1 " na odpowiednią pozycje. Flaga j e s t z a w s z e zerowana, gdy INTO jest skonfigurowane na sygnalizowanie żądania obsługi poziomem. B5...0 - z a r e z e r w o w a n e . T e bity nie są wykorzystywane w układzie A T 9 0 S 2 3 1 3 i z a w s z e odczytywa ne j a k o zero. Należy pamiętać, że przerwanie zewnętrzne z g ł a s z a n e p o z i o m e m nie ma przypisanej flagi przerwania. Żądanie przerwania pozostaje a k t y w n e tak dłu go, j a k długo występuje fizycznie sygnał przerwania.
TIMSK
[TimeriCounter Interrupt Mask Register) - rejestr maskowania przerwań timera/licznika TC1 - $39 Bit SSL
I-
T 0 I E 1
Wartość początkowa
n
I
I n "
-
I
-
| -ncEi |
-
| T
O I
E0-r~^~1
n 0
0
0
0
0
0
™SK
B 7 - T O I E 1 (Timer/Counterl
Overflow
Interrupt
Enable)'.
z e z w o l e n i e na
p r z e r w a n i e o d u k ł a d u timera/licznika T C 1 s p o w o d o w a n e
przepełnie
niem. Przerwanie o d przepełnienia timera/licznika T C 1 j e s t o d b l o k o w a n e , gdy bit T O I E ł j e s t u s t a w i o n y („1") i bit I ( S R E G ) j e s t u s t a w i o n y („1"). W chwili, gdy nastąpi przepełnienie timera/licznika T C i zostanie w y g e n e r o w a n e prze rwanie, p o przyjęciu którego nastąpi s k o k d o procedury obsługi ($005). Żą danie obsługi przerwania j e s t s y g n a l i z o w a n e u s t a w i e n i e m bitu T O V 1 w re jestrze T I F R . B 6 - O C B E 1 A (Timer/Counterl
Output
Compare
Match
Interrupt
Enable):
z e z w o l e n i e n a p r z e r w a n i e od u k ł a d u t i m e r a / l i c z n i k a T C 1 s p o w o d o w a n e osiągnięciem wartości Timera/Licznikal zgodnej z porównywaną war tością. Przerwanie o d osiągnięcia z a d a n e g o stanu timera/licznika T C 1 j e s t o d b l o k o w a n e , gdy bit O C 1 E 1 A j e s t ustawiony ( „ 1 " ) i bit I ( S R E G ) j e s t ustawiony („1")- W m o m e n c i e , gdy timer/licznik T C 1 osiągnie zadaną wartość zostanie w y g e n e r o w a n e p r z e r w a n i e , p o przyjęciu którego nastąpi s k o k d o procedury obsługi ( $ 0 0 4 ) . Żądanie obsługi p r z e r w a n i a j e s t s y g n a l i z o w a n e u s t a w i e n i e m bitu O C F 1 A w rejestrze T I F R . B5...4 - z a r e z e r w o w a n e . T e bity nie są w y k o r z y s t y w a n e w A T 9 0 S 2 3 ! 3 i z a w s z e o d c z y t y w a n e j a k o zero. B 3 - T I C I E 1 (Timer/Counterl
Input
Capture
Interrupt
Enable):
zezwole
nie n a p r z e r w a n i e w w y n i k u wystąpienia p r z e c h w y c e n i a . G d y bit T I C I E 1 j e s t ustawiony („1") i bit I ( S R E G ) j e s t u s t a w i o n y ( „ 1 " ) , p r z e r w a n i a o d p r z e c h w y c e n i a zawartości licznika są o d b l o k o w a n e . W chwili, g d y nastąpi w y z w o l e n i e przechwycenia na wejściu P D 6 (ICP) nastąpi s k o k d o procedury obsługi ($003). Żądanie obsługi p r z e r w a n i a j e s t s y g n a l i z o w a n e u s t a w i e n i e m bitu I C F 1 w rejestrze T I F R . B2 - zarezerwowany. T e n bit nie j e s t w y k o r z y s t y w a n y w A T 9 0 S 2 3 1 3 i z a w s z e o d c z y t y w a n y j a k o zero. B I - T O I E 0 (Timer/CounterO
Overflow
Interrupt
Enable):
zezwolenie na
przerwanie o d układu timera/licznika TCO s p o w o d o w a n e przepełnieniem. Przerwanie o d przepełnienia timera/licznika TCO j e s t o d b l o k o w a n e , gdy bit T O I E 0 j e s t u s t a w i o n y („1") i bit I ( S R E G ) j e s t u s t a w i o n y („1"'). W chwili,
gdy nastąpi przepełnienie timera/licznika TCO, zostanie w y g e n e r o w a n e prze rwanie, p o przyjęciu którego nastąpi skok d o p r o c e d u r y obsługi ($006). Żą danie obsługi przerwania jest s y g n a l i z o w a n e u s t a w i e n i e m bitu T O V 0 w re jestrze TIFR. BO - z a r e z e r w o w a n y . T e n bit nie jest wykorzystywany w A T 9 0 S 2 3 1 3 i j e s t z a w s z e odczytywany j a k o zero.
TIFR
[TimerfCounter Interrupt Flag Register) - rejestr wskaźników zgłoszenia przerwań od timerów/liczników - $38 Bit 7 $39,856) | TOV1 Odczyt/Zapis R/W Wartość początkowa 0
6 | 0CF1A V R/W 0
B 7 - T O V l (Timer/Counterl
5 fi 0
I
4 R
Overflow
3 I ICF1 R/W 0
Flag):
2 I
R
0
flaga
1 I TOV0 | H/W 0 0
0 R 0
l TIFR
p r z e p e ł n i e n i a timera/
licznika T C 1 . Flaga T O V l jest ustawiana ( „ 1 " ) , gdy nastąpi przepełnienie timera/licznika T C 1 . Jest ona sprzętowo zerowana w m o m e n c i e przeniesienia sterowania do określonego wektora przerwań. Alternatywnie bit ten m o ż e b y ć również ze rowany programowo po wpisaniu logicznej „ 1 " n a pozycji 7 rejestru TIFR. Jeśli ustawione są bity I (w rejestrze S R E G ) , T O I E 1 (w rejestrze TIMSK) i T O V l , to w y k o n y w a n a jest procedura obsługi p r z e r w a n i a od przepełnienia timera/licznika T C 1 . W trybie P W M bit T O V 1 j e s t u s t a w i a n y , g d y timer/licznik T C 1 zmieni kierunek zliczania p o osiągnięciu stanu $ 0 0 0 0 . B 6 - O C F 1 A (Output Compare Flag 1A): flaga p o r ó w n a n i a 1 A (osiągnię cia zadanej wartości przez licznik T C 1 ) . Flaga O C F 1 A zostaje automatycznie ustawiona („1") w chwili zrównania sta n ó w timera/licznika T C 1 i rejestru p o r ó w n a n i a O C R 1 A (Output Register!
Compare
A). O C F 1 A j e s t zerowana s p r z ę t o w o w m o m e n c i e przeniesienia
sterowania d o określonego wektora przerwań. A l t e r n a t y w n i e bit ten może b y ć również zerowany p r o g r a m o w o p o wpisaniu logicznej „ 1 " na pozycji 6 rejestru TIFR. Jeśli ustawione są bity I (w rejestrze S R E G ) , O C I E 1 A (w re jestrze T I M S K ) i O C F 1 A , to w y k o n y w a n a jest p r o c e d u r a obsługi przerwania od porównania timera/licznika T C 1 . B5...4 - z a r e z e r w o w a n e . Te bity nie są w y k o r z y s t y w a n e w A T 9 0 S 2 3 1 3 i z a w s z e o d c z y t y w a n e jako zero.
B 3 - I C F 1 (Input
Capture
Ustawienie („1")
flagi
Flag i ) : flaga p r z e c h w y c e n i a T C 1 .
I C F 1 A sygnalizuje p r z e c h w y c e n i e
timera/licznika
T C 1 i p r z e p i s a n i e j e g o zawartości d o rejestru p r z e c h w y t y w a n i a I C R 1 Capture
Register).
(Input
W s k a ź n i k I C F 1 j e s t z e r o w a n y sprzętowo w m o m e n c i e
przeniesienia sterowania d o o k r e ś l o n e g o w e k t o r a p r z e r w a ń . A l t e r n a t y w n i e bit ten m o ż e b y ć r ó w n i e ż z e r o w a n y p r o g r a m o w o p o wpisaniu logicznej „ 1 " n a pozycji 3 rejestru T I F R . Jeśli ustawione są bity I (w rejestrze S R E G ) , T I C I E 1 (w rejestrze T I M S K ) i l C F l , to w y k o n y w a n a j e s t p r o c e d u r a obsługi p r z e r w a n i a o d p r z e c h w y c e n i a timera/licznika T C 1 . B2 - zarezerwowany. T e n bit nie j e s t w y k o r z y s t y w a n y w A T 9 0 S 2 3 1 3 i j e s t z a w s z e o d c z y t y w a n y j a k o zero. B I - T O V 0 (Timer/CounterO
Overflow Flag): flaga przepełnienia Uczmka TCO.
F l a g a T O V 0 j e s t ustawiana („1"). g d y nastąpi przepełnienie timera/licznika TCO. Jest o n a s p r z ę t o w o z e r o w a n a w m o m e n c i e przeniesienia sterowania d o o k r e ś l o n e g o w e k t o r a p r z e r w a ń . Alternatywnie bit ten m o ż e b y ć r ó w n i e ż z e r o w a n y p r o g r a m o w o p o wpisaniu logicznej „ 1 " na pozycji 1 rejestru T I F R . Jeśli ustawione są bity I (w rejestrze S R E G ) , T O I E 0 (w rejestrze T I M S K ) i T O V 0 , to w y k o n y w a n a j e s t procedura obsługi p r z e r w a n i a od przepełnienia timera/licznika TCO. BO - z a r e z e r w o w a n y . T e n bit nie j e s t w y k o r z y s t y w a n y w układzie A T 9 0 S 2 3 1 3 i j e s t z a w s z e o d c z y t y w a n y j a k o zero.
4.10.3. Przerwania zewnętrzne P r z e r w a n i a z e w n ę t r z n e są zgłaszane poprzez specjalne linie - I N T 1 i INTO. W a ż n ą cechą m i k r o k o n t r o l e r ó w A V R j e s t to, że p r z e r w a n i a m o g ą b y ć zgła s z a n e p o p r z e z te linie nawet w t e d y , gdy są o n e s k o n f i g u r o w a n e j a k o wyjścia. T a k i e rozwiązanie umożliwia realizację tzw. p r z e r w a ń p r o g r a m o w y c h . W y zwolenie p r z e r w a n i a m o ż e nastąpić w chwili pojawienia się na k o ń c ó w k a c h I N T 1 lub INTO narastającego lub opadającego z b o c z a impulsu. M o ż e b y ć r ó w n i e ż z g ł a s z a n e stanem. M i k r o k o n t r o l e r p o w i n i e n b y ć o c z y w i ś c i e skonfi g u r o w a n y d o pracy w j e d n y m z tych trybów. Jeśli j e s t u s t a w i o n e zgłaszanie przerwań p o z i o m e m , to żądanie obsługi t r w a tak d ł u g o , j a k d ł u g o o d p o w i e d nie wejście pozostaje w stanie niskim. Konfigurację przerwań z e w n ę t r z n y c h ustawia się w rejestrze M C U C R .
4.10.4. Czas odpowiedzi na zgłoszenie przerwania Oszacowanie czasu wykonania procedury obsługi p r z e r w a n i a j e s t na ogół bardzo ważnym zadaniem programisty. W s z a k p r z e r w a n i a są
stosowane
głównie w celu m a k s y m a l n e g o w y k o r z y s t a n i a m o ż l i w o ś c i mikrokontrolera. Nierzadko obsługa przerwań o d b y w a się w k r y t y c z n y c h r e ż i m a c h czaso wych, często programiści tworzący j ą d r o p r o g r a m u w j ę z y k u wysokiego po ziomu, przy pisaniu procedur obsługi przerwań odwołują się d o asemblera. Jednym z ważniejszych parametrów c z a s o w y c h z w i ą z a n y c h z przerwaniami jest oszacowanie czasu, jaki u p ł y w a od chwili z g ł o s z e n i a żądania przerwania d o rozpoczęcia j e g o obsługi. W a ż n y j e s t r ó w n i e ż c z a s p o w r o t u d o zawieszo nego programu. Szacowanie s a m e g o czasu w y k o n a n i a p r o g r a m u jest już łat wiejsze, gdyż wynika o n tylko z w y k o n y w a n y c h w p r o c e d u r z e rozkazów. W mikrokontrolerach A V R czas odpowiedzi na z g ł o s z e n i e p r z e r w a n i a wyno si m i n i m u m 4 cykle z e g a r o w e . P o czterech cyklach z e g a r o w y c h o d momentu ustawienia flagi przerwania sterowanie j e s t p r z e n o s z o n e d o a d r e s u odpowied niej procedury. Podczas tych czterech cykli na stos zostaje odłożony adres powrotu odpowiadający aktualnej wartości licznika p r o g r a m u P C (2 cykle) i wskaźnik stosu jest zmniejszany o 2. N a s t ę p n i e zostaje w y k o n a n y skok do procedury obsługi przerwania, co zajmuje kolejne 2 c y k l e z e g a r o w e . Jeśli zgłoszenie przerwania nastąpi w chwili w y k o n y w a n i a w i e l o c y k l o w e g o roz kazu, to powyższe działania muszą zostać w s t r z y m a n e d o c z a s u j e g o zakoń czenia. W t y m m o m e n c i e rozpoczyna się zasadnicza e g z e k u c j a procedury ob sługi przerwania. Zostaje w y k o n a n y pierwszy r o z k a z znajdujący się pod ad resem wektora odpowiedniego przerwania. Najczęściej j e s t to r o z k a z skoku. Powrót z obsługi przerwania trwa 4 cykle zegarowe. W t y m c z a s i e ze stosu zo staje zdjęty adres powrotu, a następnie zapisany d o P C (2 cykle), wskaźnik sto su jest zwiększany o 2 i ustawiana jest flaga zezwolenia na przerwanie globalne I (SREG). Po wyjściu z przerwania zostaje w y k o n a n y przynajmniej jeden roz kaz programu głównego, zanim zostanie przyjęte kolejne przerwanie. Na wy krycie przerwania potrzebne są jednak 4 cykle z e g a r o w e . Jeśli występuje wię cej mż jedno przerwanie równocześnie, w pierwszej kolejności zostaje przyjęte zgłoszenie o najwyższym priorytecie (przerwanie o najniższym numerze).
MCUCR
[MCU Control Register) - rejestr kontrolny mikrokontrolera - $35 Rejestr M C U C R (MCU Control Register)
Odczyt/Zapis R Wartoić początkowa 0
R
o
R/W
R/W
O
o
zawiera bity sterujące pracą MCU. 3 2 1 0 1SC11 | ISC10 | ISC01 I iscoo R/W R/W R/W R/W 0
0
0
0
|MCUCB
B7...6 - z a r e z e r w o w a n e . T e bity nie są wykorzystywane w A T 9 0 S 2 3 1 3 i zawsze odczytywane j a k o zero. B 5 - S E (Słeep Enable):
z e z w o l e n i e n a wejście w t r y b o b n i ż o n e g o p o b o r u
mocy (SLEEP). Bit S E m u s i b y ć u s t a w i o n y ( „ 1 " ) jeśli m i k r o k o n t r o l e r m a w c h o d z i ć w stan uśpienia p o w y k o n a n i u rozkazu SLEEP. A b y u n i k n ą ć n i e p o ż ą d a n e g o uśpie nia m i k r o k o n t r o l e r a , zalecane j e s t ustawianie bitu S E b e z p o ś r e d n i o przed w y k o n a n i e m r o z k a z u SLEEP. B 4 - S M (Sleep Modę):
t r y b uśpienia.
Z a pomocą bitu S M ustawia się j e d e n z d w ó c h t r y b ó w uśpienia m i k r o k o n t r o lera. Jeśli S M j e s t w y z e r o w a n y ( „ 0 " ) , t o w y b r a n y j e s t tryb Idie. Jeśli S M j e s t ustawiony
( „ 1 " ) , to w y b r a n y j e s t tryb Power-Down
(tryby uśpienia są
d o k ł a d n i e o p i s a n e w rozdziale 4.11). B 3 . . . B 2 - I S C 1 1 , I S C 1 0 (Interrupt
Sense Control
1 bit 1 i 0 ) : w y b ó r r o d z a
ju sygnału wyzwalania przerwania INT1. Przerwanie zewnętrzne 1 jest aktywowane poprzez wyprowadzenie I N T 1 , jeśli bit 1 w rejestrze S R E G j e s t u s t a w i o n y i o d p o w i e d n i a m a s k a p r z e r w a n i a w rejestrze G I M S K j e s t ustawiona. Rodzaj sygnału wyzwalającego przerwa nie 1NT1 z a l e ż y od ustawienia bitów I S C 1 1 i I S C 1 0 (tablica 4 . 6 ) . Tab. 4.6. Wybór typu sygnału zgłaszającego przerwanie INT1 .
ISC11
ISC10
Opis
k.. • -
0
Wyzwalanie przerwania poziomem niskim na wejściu INT1
0
1
Zarezerwowane
1
0
Wyzwalanie przerwania zboczem opadającym
1
1
Wyzwalanie przerwania zboczem narastającym
0
B 1 . . . B 0 - I S C 0 1 , ISCOO (Interrupt
Sense Control
•
.-• '"i
0 bit 1 i 0 ) : w y b ó r r o d z a
j u s y g n a ł u w y z w a l a n i a p r z e r w a n i a INTO. P r z e r w a n i e z e w n ę t r z n e 0 j e s t a k t y w o w a n e p o p r z e z w y p r o w a d z e n i e INTO, jeśli bit I w rejestrze S R E G j e s t u s t a w i o n y i o d p o w i e d n i a m a s k a p r z e r w a n i a Tab. 4.7. Wybór typu sygnału zgłaszającego przerwanie INTO
:
iscoi
ISCOO
0
0
Wzwalanie przerwania poziomem niskim na wejściu INTO
0
1
Zarezerwowane
1
0
Wyzwalanie przerwania zboczem opadającym
1
1
Wyzwalanie przerwania zboczem narastającym
Opis
• •
- . '/i
w rejestrze G I M S K jest ustawiona. Rodzaj sygnału w y z w a l a j ą c e g o przerwa nie INTO zależy od ustawienia bitów I S C 0 1 i ISCOO (tablica 4.7)
W trybie w y z w a l a n i a przerwania p o z i o m e m , ż ą d a n i e obsługi
U|GA
przerwania pozostaje a k t y w n e tak d ł u g o , j a k d ł u g o utrzymuje się niski p o z i o m na o d p o w i e d n i m wejściu. Jeśli nie zadba się o to, by w procedurze obsługi z a b l o k o w a ć z g ł o s z e n i a przerwa nia, to wystąpi cykliczne g e n e r o w a n i e p r z e r w a n i a , m o g ą c e za wiesić pracę mikrokontrolera.
Stan końcówki INTn jest próbkowany w celu wykrycia z b o c z a sygnału żądania przerwania. Jeśli wybrano wyzwalanie zboczem, to impuls na tej końcówce nie powinien być krótszy od okresu zegara systemowego. T y l k o spełnienie tego warunku gwarantuje przyjęcie zgłoszenia przerwania. W przypadku wybrania wyzwalania poziomem, sygnał żądania przerwania powinien utrzymać się w stanie niskim co najmniej przez czas w y k o n y w a n i a bieżącego rozkazu. W trybie wyzwalania przerwania p o z i o m e m , żądanie obsługi przerwania po zostaje aktywne tak długo, j a k długo utrzymuje się niski p o z i o m na odpo wiednim wejściu. Jeśli nie zadba się o to, by w p r o c e d u r z e obsługi zdjąć na czas sygnał zgłoszenia przerwania, to wystąpi n a j p r a w d o p o d o b n i e j niepożą dane, cykliczne generowanie przerwania, m o g ą c e z a w i e s i ć p r a c ę mikrokont rolera (rysunek 4.27). prawidłowo
złe
zadania
Rys. 4.27. Zakłócenie pracy MCU w przypadku zbyt długiego sygnału zgłoszenia przerwania (przerwanie zgłaszane poziomem)
4.11. Tryby oszczędzania energii Mikrokontroler A T 9 0 S 2 3 1 3 w n o r m a l n y m trybie p r a c y , przy zasilaniu napię ciem 4 V i z dołączonym
rezonatorem
4 M H z p o b i e r a z zasilania prąd ok.
2,8 m A . Niby nie jest to d u ż o , ale oprócz niego w s y s t e m i e znajduje się jesz cze najczęściej kilka innych odbiorników energii. P o w y k o n a n i u bilansu oka zuje się, że łączne zużycie energii przez urządzenie nie kwalifikuje g o do za-
silania bateryjnego. N a w e t jeśli tak będzie, to trzeba p a m i ę t a ć o n i e m a ł y m problemie e k o l o g i c z n y m z w i ą z a n y m z utylizacją z u ż y t y c h o g n i w . Z a w s z e , jeśli tylko t o m o ż l i w e trzeba w i ę c dbać o minimalizację prądu p o b i e r a n e g o z e źródła zasilania. M i k r o k o n t r o l e r y A V R w y p o s a ż o n o w specjalne tryby pracy z o b n i ż o n y m p o b o r e m m o c y , t z w . tryby uśpienia. Okazuje się, ż e w praktyce b a r d z o c z ę s t o występują sytuacje, w których mikrokontroler przez długi czas nie w y k o n u j e ż a d n y c h zadań, czekając n a nie w m a r t w e j pętli. P o m y s ł nasu w a się w i ę c s a m : w c h w i l a c h oczekiwania trzeba w y ł ą c z y ć rdzeń m i k r o k o n trolera, w taki j e d n a k s p o s ó b , b y mógł o n w każdej chwili a u t o m a t y c z n i e w z n o w i ć p r a c ę . Służą d o tego tryby uśpienia - Sleep Modes. W celu w p r o w a dzenia m i k r o k o n t r o l e r a w stan uśpienia bit S E rejestru M C U R musi b y ć usta w i o n y ( „ 1 " ) i n i e z b ę d n e j e s t w y k o n a n i e rozkazu SLEEP. Jeśli w t y m stanie d o mikrokontrolera dotrze zgłoszenie o d b l o k o w a n e g o przerwania, to m i k r o kontroler
zostanie
obudzony,
wykonana
procedurę
obsługi
przerwania
i przejdzie d o rozkazu występującego b e z p o ś r e d n i o z a r o z k a z e m SLEEP. W s z y s t k i e z a s o b y M C U (rejestry, p a m i ę ć S R A M , układy w e / w y ) pozostają n i e n a r u s z o n e . P r z e b u d z e n i e mikrokontrolera m o ż e r ó w n i e ż nastąpić p o syg nale R E S E T . W t y m przypadku p r o g r a m b ę d z i e w y k o n y w a n y od w e k t o r a r e setu, czyli o d adresu $ 0 0 0 .
4.11.1. Tryb/tf/e W y z e r o w a n i e bitu S M ( „ 0 " ) p o w o d u j e , ż e p o w y k o n a n i u rozkazu SLEEP m i k r o k o n t r o l e r p r z e c h o d z i d o trybu Idle, wstrzymując pracę C P U , z a c h o w u j ą c natomiast a k t y w n e timery/liczniki, w a t c h d o g a i s y s t e m przerwań. Przebu d z e n i e m i k r o k o n t r o l e r a j e s t m o ż l i w e z a r ó w n o p o nadejściu przerwania z e w n ę t r z n e g o , j a k i i wystąpieniu k t ó r e g o ś z p r z e r w a ń w e w n ę t r z n y c h , n p . p o przepełnieniu timera/licznika lub w y z e r o w a n i u s y s t e m u przez w a t c h d o g a . Jeśli nie j e s t w s k a z a n e przebudzanie od przerwania k o m p a r a t o r a a n a l o g o w e go, p o w i n i e n o n b y ć p r o g r a m o w o w p r o w a d z o n y w stan Power-Down p r z e z ustawienie bitu A C D w rejestrze sterującym (Analog
Comparator
po
komparatora - A S C R
Control and Status). P o w y p r o w a d z e n i u m i k r o k o n t r o l e
ra z e stanu Idle w z n a w i a o n swoją pracę natychmiast.
. 4,11.2. Tryb Power-Down Ustawienie bitu S M ( „ 1 " ) powoduje, ż e p o w y k o n a n i u rozkazu SLEEP mik rokontroler p r z e c h o d z i d o trybu Power-Down.
W t y m stanie j e s t z a t r z y m y
w a n y g e n e r a t o r taktujący, lecz przerwania z e w n ę t r z n e i w a t c h d o g są nadal
aktywne (jeśli nie są p r o g r a m o w o z a b l o k o w a n e ) . W y b u d z i ć mikrokontroler z tego stanu mogą j e d y n i e : zewnętrzny sygnał z e r o w a n i a , s y g n a ł zerowania od watchdoga (jeśli nie jest on zablokowany p r o g r a m o w o ) o r a z zewnętrzne przerwania na wejściu INT1 lub INTO w y z w a l a n e p o z i o m e m .
Jeśli d o obudzenia mikrokontrolera ze stanu Power-Down
sto
suje się przerwania w y z w a l a n e p o z i o m e m , to w e j ś c i e zgłasza jące przerwanie p o w i n n o być a k t y w n e p r z e z c z a s dłuższy niż wynosi czas opóźnienia zerowania t-r/ouT- W p r z e c i w n y m przy padku mikrokontroler m o ż e nie o b u d z i ć się z e s t a n u Down.
Power-
5.
Timery/liczniki M i k r o k o n t r o l e r A T 9 0 S 2 3 1 3 w y p o s a ż o n o w d w a timery/liczniki
ogólnego
przeznaczenia. J e d e n z nich j e s t 8-, drugi 16-bitowy. W celu rozszerzenia za kresu ich zliczania w p r o w a d z o n o d o d a t k o w y licznik 10-bitowy, pełniący funkcje w s t ę p n e g o dzielnika i m p u l s ó w taktujących. Jest t o tzw. preskaler. J e g o konfigurację p o k a z a n o na r y s u n k u 5.1. Jeśli j e s t w y k o r z y s t y w a n y sygnał C K a k t y w n e g o generatora
(taktującego
r ó w n i e ż mikrokontroler), to m a m y d o c z y n i e n i a z t i m e r e m , natomiast gdy jest w y k o r z y s t y w a n y sygnał zewnętrzny TO (dla u k ł a d u TCO) lub T l
(dla
układu T C 1 ) , m ó w i m y o funkcji licznika. Stopień podziału preskalera m o ż e b y ć u s t a w i o n y na j e d n ą z czterech s t a n d a r d o w y c h wartości, niezależnie dla każdego
timera/licznika:
C K / 8 , C K / 6 4 , C K / 2 5 6 , C K / 1 0 2 4 . Liczniki/timery
m o g ą b y ć t a k t o w a n e r ó w n i e ż s y g n a ł e m z e g a r o w y m b e z podziału ( C K / l ) .
TCKO Uczni k/Ti merO
Rys. 5.1. Konfiguracja 10-bitowego preskalera służącego do wytwarzania sygnałów zegarowych dla Liczników/TimerówO i 1
5.1.
8-bitowy Timer/LicznikO Schemat blokowy układu TCO przedstawiono na r y s u n k u 5.2. Jest to 8-bito wy timer/licznik, który może być" taktowany b e z p o ś r e d n i o s y g n a ł e m CK (z oscylatora wewnętrznego), sygnałem C K p o d z i e l o n y m w s t ę p n i e przez preskaler oraz sygnałem z wejścia zewnętrznego TO. U k ł a d TCO m o ż e być za trzymany w d o w o l n y m m o m e n c i e poprzez w y z e r o w a n i e b i t ó w sterujących C S 0 2 , C S 0 1 , C S 0 0 znajdujących się w rejestrze sterującym t e g o timera/licz nika - TCCRO. Jeśli układ TCO jest skonfigurowany j a k o licznik, t o z e w n ę t r z n y przebieg ze garowy nie taktuje g o bezpośrednio, lecz j e s t s y n c h r o n i z o w a n y s y g n a ł e m we wnętrznego oscylatora. W tym trybie sygnał z e g a r o w y TO j e s t próbkowany podczas narastającego zbocza w e w n ę t r z n e g o sygnału z e g a r o w e g o . Odpo wiednie warunki próbkowania będą spełnione tylko w t e d y , g d y czas pomię dzy kolejnymi zboczami zewnętrznego sygnału z e g a r o w e g o b ę d z i e dłuższy niż okres wewnętrznego przebiegu taktującego. M a k s y m a l n a m i e r z o n a częs totliwość sygnału na wejściu TO m o ż e być więc r ó w n a fxTAl/2- Układ TCO dla małych stopni podziału preskalera cechuje się dużą rozdzielczością i do kładnością. Duże stopnie podziału przydają się natomiast d o generowania długich impulsów lub obsługi w o l n o z m i e n n y c h z d a r z e ń . W przypadkach,
Przerwania od TCO sygnalizujące przepełnienie
SjllIl Rejestr maski przerwań timera (TIMSK)
Rejestr znaczników przerwań (TIFR)
Rejestr sterujący TCO (TCCRO)
S
O U. p
Ucznikffimer 0
A
rrcNTO)
N
8
Sygnał zagatowv T/C
Rys. 5.2. Schemat blokowy Timera/LicznikaO (TCO)
Układ sterujący
CK TO
w których j e s t w y m a g a n y precyzyjny p o m i a r długich c z a s ó w , n i e z b ę d n e staje się w p r o w a d z e n i e d o d a t k o w y c h m e c h a n i z m ó w p r o g r a m o w y c h .
Najczęściej
będzie to d o d a t k o w a z m i e n n a p r o g r a m u zliczająca p r z e r w a n i a od timera/licz nika. Z l i c z a n i e kończy się dopiero p o osiągnięciu w y m a g a n e j liczby wejść d o procedury obsługującej p r z e r w a n i e . Timer/LicznikO j e s t konfigurowany poprzez rejestr sterujący T C C R O . Flaga przepełnienia dla tego układu ( T O V 0 ) znajduje się w rejestrze T I F R Counter Interrupt
Flag
(Timer/
Register).
TCCRO [Timer/CounterO Control Register) - rejestr sterujący Timera/LicznikaO - $33 Bit $33 ($53) Odczyt/Zapis
7 R
|
6 |
-
5 R
| R
4 |.
R
|
Wartość początkowa 0 0 0 R - oznacza odczyt, R/W - oznacza odczyt/zapis
R 0
3 2 1 | CS02 | CS01 | R/W R/W 0
0
0
0 CSOO R/W
|
TCCRO
0
B7...3 - zarezerwowane. T e bity są z a r e z e r w o w a n e w układzie A T 9 0 S 2 3 1 3 i z a w s z e o d c z y t y w a n e j a k o zero. B 2 . . . B 0 - C S 0 2 , C S 0 1 , CSOO (Clock
SelectO,
bity: 2 , 1, 0 ) : bity w y b o r u
stopnia p o d z i a ł u preskalera o r a z źródła s y g n a ł u t a k t u j ą c e g o i j e g o z b o cza a k t y w n e g o dla licznika TCO. W s z y s t k i e k o m b i n a c j e bitów w y b o r u dla Timera/LicznikaO p r z e d s t a w i o n o w tablicy 5 . 1 . Występujący w tablicy 5.1 sygnał C K p o c h o d z i z w e w n ę t r z n e g o generatora i jest t o ten s a m sygnał, który taktuje C P U . S k o n f i g u r o w a n i e układu TCO j a k o licznik p o w o d u j e - j a k j u ż w i a d o m o - zliczanie i m p u l s ó w z wejścia TO. Dzieje się t a k nawet w t e d y , g d y w y p r o w a d z e n i e mikrokontrolera P D 4 / T 0 j e s t ustawione j a k o wyjście. Rozwiązanie takie u m o ż l i w i a p r o g r a m o w ą k o n t r o l ę Tab. 5.1. Konfiguracja układu Timera/LicznikaO . CS02
CS01
CSOO
0
0
0
OpiS
'"•
'-i
,'
Stop - układ TCO jest zatrzymany
0
0
1
0
1
0
„ Sygnai taktujący CK Sygnai taktujący CK/8
0
1
1
Sygnał taktujący CK/64
1
0
0
Sygna! taktujący CK/256
1
0
1
Sygnał taktujący CK/1024
1
1
0
Sygnat taktujący: zewnętrzny sygnał TO, zboc2e opadające
1
1
1
Sygnał taktujący: zewnętrzny sygnał TO, zbocze narastające
zliczania. Na skutek przepełnienia Timera/LicznikaO m o ż e b y ć wygenerowa n e przerwanie, którego procedura obsługi j e s t u m i e s z c z o n a w pamięci pro g r a m u p o d adresem $ 0 0 6 .
TCHTO {Timer/CounterO) - rejestr Timera/LicznikaO - $32 Bit 7 $ 3 2 ($52) 1 MSB | Otfezyt/Zapte R / W W W Wartoić początkowa 0 0 R/W - oznacza odczyt/zapis
Timer/LicznikO
6
.
5
4
. I
I R/W 0
zaprojektowano
3
. I
R/W
R/W 0
jako
, I
układ
2
R/W 0
1
, I 0
, I
R/W 0
zliczający
0
L
S
B
, I TCMTO
R/W 0
w górę.
Rejestr
T C N T 0 przechowujący aktualny stan zliczania j e s t d o s t ę p n y z a r ó w n o do za pisu j a k i odczytu. Jeśli zapis d o tego rejestru nastąpi j e d n o c z e ś n i e z impul sem z e g a r o w y m , najpierw zostanie z w i ę k s z o n y stan licznika, następnie zo stanie dokonany wpis nowej wartości d o rejestru. Osiągniecie stanu Ojest traktowane j a k o przepełnienie. W t y m m o m e n c i e j e s t u s t a w i a n a flaga prze pełnienia T O V 0 sygnalizująca żądanie obsługi p r z e r w a n i a . T o czy zostanie ono z a u w a ż o n e przez C P U zależy od ustawienia bitu T O I E 0 w rejestrze T I M S K [Timer/Counter
Interrupt
Mask Register)
i bitu g l o b a l n e g o zezwole
nia na przerwania 1 w rejestrze S R E G .
5.2.
16-bitowy Timer/Licznikl Drugi timer/licznik w b u d o w a n y w mikrokontroler A T 9 0 S 2 3 1 3 j e s t znacznie bardziej r o z b u d o w a n y niż o m a w i a n y p o p r z e d n i o , m o ż e w związku z tym spełniać d o d a t k o w e funkcje. S c h e m a t b l o k o w y T i m e r a / L i c z n i k a l przedsta w i o n o na r y s u n k u 5.3. Jest to 16-bitowy timer/licznik, który m o ż e b y ć takto wany bezpośrednio s y g n a ł e m C K (z oscylatora w e w n ę t r z n e g o ) , sygnałem C K podzielonym wstępnie przez preskaler lub s y g n a ł e m z wejścia zewnętrz nego T l . Układ T C 1 m o ż e być zatrzymany w d o w o l n y m m o m e n c i e poprzez w y z e r o w a n i e bitów sterujących C S 1 2 , C S U , C S 1 0 znajdujących się w rejes trze sterującym tego timera/licznika - T C C R 1 B {Timer/Counterl gister
Control Re
B).
Jeśli układ T C 1 jest skonfigurowany j a k o licznik, z e w n ę t r z n y przebieg zega rowy nie steruje n i m bezpośrednio, lecz jest s y n c h r o n i z o w a n y s y g n a ł e m we wnętrznego oscylatora. W t y m trybie sygnał z e g a r o w y T l j e s t próbkowany na narastającym zboczu zegara w e w n ę t r z n e g o . O d p o w i e d n i e w a r u n k i prób kowania będą spełnione tylko wtedy, gdy czas p o m i ę d z y k o l e j n y m i zbocza-
Przerwanie Przerwanie od TC1 odTCI sygnalizujące sygnalizujące pozytywny przepełnienie wynik porównania
LI
Przerwanie od TC1 sygnalizujące poprawny wynik przechwycenia
Rejestr znaczników przerwań (TIFR)
Rejestr maski przerwań timera (TIMSK)
Rejestr sterujący A TC1 (TCCR1A)
Rejestr sterujący B TC1 (TCCR1B)
TT e
7
Rejestr wejściowy CAPTURE TC1 (ICR1)
Układ sterujący
CAPTURE , TR1GGER e
-CK -Tl
—r Sygnał zerujący Sygnał zegarowy UP/DOWN
7
TimerAJcznikt fTCWTI)
8' 7 Komparator 16-bAowy
15
8 7 Rejestr wyjściowy COMPARE TC1 I
0
Rys. 5.3. Schemat blokowy Timera/Licznikal (TC1)
mi z e w n ę t r z n e g o sygnału z e g a r o w e g o będzie dłuższy niż okres w e w n ę t r z n e g o oscylatora. M a k s y m a l n a m i e r z o n a częstotliwość" sygnału na wejściu T l m o ż e b y ć w i ę c r ó w n a fxTAl/2. Układ T C 1 dla m a ł y c h stopni podziału p r e skalera cechuje się dużą rozdzielczością i dokładnością, d u ż e stopnie podzia łu przydają się natomiast d o g e n e r o w a n i a długich i m p u l s ó w lub obsługi w o l n o z m i e n n y c h zdarzeń. W przypadkach, w których j e s t w y m a g a n y precyzyjny p o m i a r d ł u g i c h c z a s ó w , niezbędne staje się w p r o w a d z e n i e d o d a t k o w y c h m e c h a n i z m ó w p r o g r a m o w y c h . Najczęściej będzie to d o d a t k o w a z m i e n n a p r o g r a m u zliczająca przerwania timera/licznika. W ł a ś c i w y proces zliczania k o ń czy się d o p i e r o p o osiągnięciu w y m a g a n e j liczby wejść d o procedury obsłu gującej p r z e r w a n i e .
wm
Jedną z interesujących runkcji Licznika/Timeral jest możliwość
UWBGA UltjjjjjUn
w a n i a
re
J e s Q i
T
C
1
r a c u
e
w
P^echwyty («3*" >P J O™ trybie, to pr> i wyzwalającego na wejście I C P powoduje przepisa nie aktualnego stanu licznika T C 1 d o rejestrów [ICR1H][ICR1L] (czyli [ICR1H][ICR1L]=ITCNT1H][TCNT1L]). T a k więc, po wyzwoleniu licznik zlicza w u s t a l o n y m cyklu, a jego stan w chwili w y z w o l e n i a został zatrzaśnięty w 16-bitowym rejest rze I C R 1 . Impuls w y z w a l a n i a m o ż e b y ć pobierany także z wyj. ścia komparatora a n a l o g o w e g o .
( J a n i e
i
m
p
u
s
u
Układ TC1 oprócz typowych trybów pracy j a k o zwykły t i m e r lub licznik, umożliwia dodatkowo realizację funkcji p o r ó w n y w a n i a wyjścia (Output Com pare),
modulacji P W M (Pulse Width Modułation
- modulacja szerokości im
pulsu) i przechwytywania wejścia (Input Capture).
Funkcja Output
wykorzystuje rejestry O C R 1 A H i O C R 1 A L (Output Compare
Compare
Register
JA) ja
ko źródło danej porównywanej ze stanem T i m e r a / L i c z n i k a l . W przypadku wy stąpienia równości rejestrów: O C R 1 A H = T C N T 1H i O C R 1 A L = T C N T 1 L może nastąpić opcjonalne zerowanie Timera/Licznikal oraz akcja na wyjściu (OCl) Output
Comparel.
Sposób reakcji
zależy
od
i C O M 1 A 0 w rejestrze T C C R 1 A (Timer/Counterl
ustawień
bitów
COM1A1
Control Register
A). Szcze
gółowy opis zamieszczono w dalszej części rozdziału. Rejestry O C R 1 A H i O C R I A L są r ó w n i e ż w y k o r z y s t y w a n e podczas pracy Timera/Licznikal j a k o 8-, 9- lub 10- bitowy m o d u l a t o r P W M . Funkcja prze chwytywania jest związana z rejestrem ICR1 (Input Capture de facto
Register).
Jest to
rejestr 16-bitowy składający się z I C R I H (starszy bajt) i ICR1L
(młodszy bajt). Przechwytywanie jest w y z w a l a n e z e w n ę t r z n y m sygnałem po jawiającym się na w y p r o w a d z e n i u I C P (Input Capture Funkcję
przechwytywania
T C C R 1 B (Timer/Counterl
konfiguruje Control
wania m o ż e być wykorzystany
ICP
się
Register).
Pin) mikrokontrolera.
poprzez
ustawienia
D o w y z w a l a n i a przechwyty
ponadto k o m p a r a t o r a n a l o g o w y
0 Eliminator szumów 1
rejestru
Selektor zbocza
t
—
t
ICNC1
ICES1
ACIC: COMPARATOR IC ENABLE ACO: COMPARATOR OUTPUT
Rys. 5.4. Schemat układu obrabiającego sygnał z wejścia ICP
zawarty
w strukturze mikrokontrolera. N a r y s u n k u S.4 p r z e d s t a w i o n o b u d o w ę układu obrabiającego
sygnał
z wyprowadzenia
ICP
i wyprowadzeń
związanych
z komparatorem analogowym. Z funkcją p r z e c h w y t y w a n i a związany j e s t p o n a d t o u k ł a d eliminacji s z u m ó w (Noise
Canceler).
Jeśli j e s t włączony, to w a r u n e k w y z w o l e n i a dla funkcji
p r z e c h w y t y w a n i a zostanie przyjęty d o p i e r o p o w y k r y c i u czterech kolejnych p r ó b e k sygnału wyzwalającego o j e d n a k o w e j wartości. Timer/Licznikl
jest konfigurowany
poprzez rejestry
sterujące
TCCR1A
i T C C R I B . Flagi zdarzeń związanych z T i m e r e m / L i c z n i k i e m l znajdują w rejestrze T I F R (Timer/Counter pełnienia
Interrupt
T O V l (Timer/Counterl
O C F 1 A (Output
Compare
Flag Register).
Overflow
Flag),
się
Są to: flaga p r z e flaga
porównania
Flag) i flaga p r z e c h w y c e n i a I C F 1 (Input
Capture
Flag).
TCCR1A [Timer/Counterl Control Register A) - rejestr sterujący A Timera/Licznikal - $2F 8 1 1
7
6
5
$2F($4F) [COM1A1 | COM1A0 | Odczyt/Zapis R/W R/W R Wartość początkowa 0 0 0 R - oznacza odczyt, R/W - oznacza odczyt/zapis
|
4 R
3
|
R 0
B 7 , B 6 - C O M 1 A 1 , C O M 1 A 0 (Compare
2 |
R
0
Output
1
0
| PWM11 | PWM 10 [ T C C R 1 A R/W R/W 0 0 0
Model,
bity: 1,0): bity
k o n f i g u r u j ą c e T i m e r / L i c z n i k l w trybie p o r ó w n a n i a . Bity C O M 1 A 1 i C O M I A O określają zachowanie się w y p r o w a d z e n i a m i k r o kontrolera O C 1 (Output
Compare
1 - a l t e r n a t y w n a funkcja
wyprowadzenia
P B 3 ) , następującego p o wykryciu p o z y t y w n e g o p o r ó w n a n i a w układzie T i m e r a / L i c z n i k a l . Wyjście to może w takich przypadkach z a c h o w y w a ć się zgodnie z opisem z tablicy 5.2. W przypadku wykorzystywania funkcji
porównania
w y p r o w a d z e n i e O C 1 / P B 3 p o w i n n o b y ć skonfigurowane j a k o wyjście.
736. 5.2 Konfiguracja Timera/Licznikal w trybie porównaniaWM C0M1A1 COM1A0 0
Opis
£y ;
0
Wyjście 0C1 jest odłączone od układu Timera/Licznikal
0
1
Zmiana stanu na wyjściu 0C1 w wyniku pozytywnego porównania
1
0
Wyzerowanie („U") wyjścia ÓG1 w wyniku pozytywnego porównania
1
1
Ustawienie („1") wyjścia 0C1 w wyniku pozytywnego porównania
Uwagi: 1. W trybie PWM powyższe bity zmieniają znaczenie (patrz tablica 5.6). 2 . Początkowy stan wyjścia 0 C 1 jest nieokreślony.
l
_ •
Tab. 5.3. Konfiguracja modulatora PWM PWM11
PWM10
opis
0
0
Funkcja PWM dla Timera/Licznikal zablokowana
0
1
Timer/Licznikl pracuje jako 8-bitowy PWM
1 1
0
Timer/Licznikl pracuje jako 9-brtowy PWM
1
Timer/Licznikl pracuje jako 10-bitowy PWM
B5...2 - zarezerwowane. T e bity są z a r e z e r w o w a n e w układzie A T 9 0 S 2 3 I 3 i z a w s z e odczytywane ja k o zero. BI, BO - P W M 1 1 , P W M 1 0 (Pułse
Width Modulator
Select Bits):
bity wy
boru trybu pracy modulatora PWM. Bity te ustalają tryb pracy modulatora P W M wykorzystującego Timer/Licz n i k l zgodnie z tablicą 53. TCCR1B (Timer/Counterl Control Register B) - rejestr sterujący B Timera/Licznikal - $2E Btt S2E ($4E) Odczyt/Zapia
7 6 | ICNC1 | ICES1 R/W R/W
5 |
R
Wartość początkowa 0 0 0 R - oznacza odczyt, R/W - oznacza odczyt/zapis
B 7 - I C N C 1 (Input Capture
|
R
4 3 2 1 | CTC1 | CS12 | CS11 | R/W R/W R/W 0
1 Noise Canceler):
0
0
0
0 CS10 | TCCH1B R/W 0
bit włączający/wyłączają
cy układ eliminacji szumu dla Timera/Licznikal pracującego w trybie porównania. Jeśli bit I C N C 1 jest w y z e r o w a n y , układ eliminacji s z u m u j e s t wyłączony. Przechwytywanie jest w ó w c z a s w y z w o l o n e n a p i e r w s z y m narastającym lub opadającym zboczu (w zależności od konfiguracji) s p r ó b k o w a n y m na wej ściu I C P przez C P U . G d y bit I C N C 1 j e s t ustawiony ( w p i s a n o „ 1 " ) , wyzwole nie przechwycenia nastąpi dopiero p o wykryciu czterech kolejnych, jednako w y c h próbek (o wartości określonej konfiguracją) n a wejściu I C P . Konfigu racje wyzwalania określa bit I C E S 1 rejestru T C C R 1 B . C z ę s t o t l i w o ś ć próbko wania jest równa fxTAL- Funkcja eliminacji s z u m u przydaje się, gdy wejście wyzwalające I C P współpracuje n p . z wyjściem k o m p a r a t o r a analogowego. Na skutek niestabilności źródeł referencyjnych i s a m e g o sygnału mierzonego w stanach równowagi n a wejściach komparatora m o ż e d o c h o d z i ć d o wielo krotnych przerzutów na wyjściu komparatora. Sytuacja taka m o g ł a b y zakłó cić pracę T i m e r a / L i c z n i k a l z włączoną funkcją p o r ó w n a n i a .
B 6 - I C E S 1 (Input Capturel
Edge Select):
bit o k r e ś l a j ą c y z b o c z e s y g n a ł u
wyzwalającego przechwytywanie. Jeśli bit I C E S 1 j e s t w y z e r o w a n y ( „ 0 " ) , t o zawartość rejestrów T i m e r a / L i c z n i k a l j e s t p r z e p i s y w a n a d o rejestru I C R 1 (Input Capture
Register)
na opadają
c y m z b o c z u w e j ś c i o w e g o sygnału I C P . Jeśli bit I C E S 1 jest ustawiony ( „ 1 " ) , t o z a w a r t o ś ć rejestrów T i m e r a / L i c z n i k a l jest p r z e p i s y w a n a d o rejestru I C R 1 (Input Capture
Register)
na narastającym zboczu w e j ś c i o w e g o sygnału I C P .
B5, B4 - zarezerwowane. T e bity są z a r e z e r w o w a n e w układzie A T 9 0 S 2 3 1 3 i z a w s z e o d c z y t y w a n e j a k o zero. B 3 - C T C 1 (Clear Timer/Counterl
on Compare
Match)'.
bit z e r o w a n i a Ti
m e r a / L i c z n i k a l p o spełnieniu w a r u n k u p o r ó w n a n i a . Jeśli bit C T C 1 j e s t u s t a w i o n y
( „ 1 " ) , to T i m e r / L i c z n i k l
jest
zerowany
( T C N T I H = $ 0 0 i T C N T l L = $ 0 0 ) w najbliższym cyklu z e g a r o w y m p o speł nieniu
warunku
porównania.
Warunek
porównania
następuje,
gdy
T C N T l H = O C R l A H i T C N T l L = O C R l A L . Jeśli bit C T C 1 jest w y z e r o w a n y („0"), to wystąpienie w a r u n k u p o r ó w n a n i a nie w p ł y w a n a stan Timera/Licz n i k a l . K o n t y n u u j e o n zliczanie. W a r u n e k p o r ó w n a n i a jest w y k r y w a n y przez C P U w najbliższym cyklu z e g a r o w y m p o j e g o wystąpieniu. Dzieje się tak dla wartości podziału preskalera równej 1. Dla w i ę k s z y c h wartości stopnia p o działu funkcja p o r ó w n a n i a będzie działała inaczej. Najlepiej zilustruje to p o niższy p r z y k ł a d . Jeśli stopień podziału preskalera j e s t r ó w n y 1, d o rejestru p o r ó w n a n i a wpisa n o wartość C , a bit C T C 1 j e s t u s t a w i o n y , to T i m e r / L i c z n i k l będzie liczył w cyklu: ....IC-2IC-1IC10I1L.. G d y stopień podziału preskalera będzie u s t a w i o n y n p . na 8, Timer/Licz n i k l będzie liczył w cyklu: ....IC-2, C - 2 , C-2, C-2, C-2, C-2, C-2, C - 2 I C - 1 , C - l , C - l , C - l , C - l , C - l , C - I , C-1IC, 0 , 0, 0, 0, 0 , 0, 01.... Bit C T C 1 w trybie P W M nie m a znaczenia.
W a r u n e k p o r ó w n a n i a j e s t w y k r y w a n y przez C P U w najbliż s z y m cyklu z e g a r o w y m p o j e g o wystąpieniu. Dzieje się tak dla wartości podziału preskalera równej 1. D l a w i ę k s z y c h wartości stopnia podziału funkcja p o r ó w n a n i a b ę d z i e działała inaczej.
Tałt. 5.4. Konfiguracja układu Timera/Licznikal
l
Opis
.
C$12
CS11
CS 10
0
0
0
0
0
1
0
1
0
Sygnał taktujący CK/8
0
1
1
Sygnał taktujący CK/64
1
0
0
Sygnał taktujący CK/256
1
0
1
Sygnał taktujący CK/1024
1
1
0
Sygnał taktujący: zewnęlrzny sygnał T 1 . zbocze opadające
1
1
1
Sygnał taktujący: zewnętrzny sygnał 7 1 , zbocze narastające
,
' '-j
Stop - układ TC1 jest zatrzymany Sygnał taktujący CK
B 2 . . . B 0 - C S 1 2 , C S U , C S 1 0 (Clock
Selectl,
bity: 2 , 1, 0 ) : bity wyboru
stopnia podziału preskalera oraz źródła s y g n a ł u t a k t u j ą c e g o i jego zbo cza a k t y w n e g o dla licznika T C 1 . Wszystkie możliwe kombinacje bitów w y b o r u dla T i m e r a / L i c z n i k a l przed stawiono w tablicy 5.4. Występujący w tablicy 5.4 sygnał C K p o c h o d z i z w e w n ę t r z n e g o oscylatora i jest to ten sam sygnał, który taktuje C P U . S k o n f i g u r o w a n i e układu TC1 ja k o licznik powoduje - j a k j u ż w i a d o m o - zliczanie i m p u l s ó w z wejścia T l . Dzieje się tak nawet wtedy, gdy w y p r o w a d z e n i e m i k r o k o n t r o l e r a PD5/T1 jest ustawione j a k o wyjście. Rozwiązanie takie u m o ż l i w i a p r o g r a m o w ą kontrolę zliczania. N a skutek przepełnienia T i m e r a / L i c z n i k a l m o ż e b y ć wygenerowa ne przerwanie, którego procedura obsługi j e s t u m i e s z c z o n a w pamięci pro gramu pod adresem $ 0 0 5 .
TCNT1H i TCNT1L {Timer/Counterl) - rejestr Timera/Licznikal - $2D/$2C Bit $2D (S4D) $2C ($4C)
15 USB 7
6
5
4
3
Odczyt/Zapis
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
0
0
0
O
0
0
Wartość początkowa 0 0
14
13
12
11
10
9
8
2
1
LSB D
R/W
R/W
R/W
R/W
R/W
R/W
0
0
0
0
0 0
0 0
TCNT1H TCHT1L
R/W - oznacza odczyt/zapis
16-bitowy rejestr T C N T 1 p r z e c h o w u j e a k t u a l n y stan T i m e r a / L i c z n i k a l T C N T 1 H starszy bajt, T C N T 1 L m ł o d s z y bajt. Jest d o s t ę p n y zarówno do zapisu j a k i odczytu, j e d n a k w p e w n e j specyficznej sytuacji m o g ł o b y do c h o d z i ć d o niejednoznaczności operacji o d c z y t u . P r z y p a d e k taki mógłby wystąpić, gdyby m o m e n t odczytu nastąpił, g d y rejestr p r z e c h o w y w a ł war t o ś ć $ F F F F i stopień podziału preskalera był r ó w n y 1. P o odczytaniu np.
m ł o d s z e g o bajtu z T C N T I L nastąpiłoby z w i ę k s z e n i e s t a n u rejestru, w w y niku c z e g o o d c z y t a n a n a s t ę p n i e w a r t o ś ć T C N T 1 H b y ł a b y r ó w n a $ 0 0 , z a miast s p o d z i e w a n e j $ F F . Z p r o b l e m e m t y m m u s z ą s o b i e r a d z i ć s p e c j a l n y m i zabiegami
programowymi
użytkownicy
mikrokontrolerów
rodziny
'51,
w A V R - a c h p r o b l e m został r o z w i ą z a n y p r z e z w p r o w a d z e n i e d o d a t k o w e g o 8-bitowego rejestru t y m c z a s o w e g o T E M P (nie j e s t o d o s t ę p n y d l a u ż y t k o w nika b e z p o ś r e d n i o ) , w s p o m a g a j ą c e g o operacje d o s t ę p u d o rejestru T C N T 1 . Z a p e w n i a o n j e d n o c z e s n y d o s t ę p d o rejestrów T C N T 1 H i T C N T I L i j e s t r ó w n i e ż w y k o r z y s t y w a n y przy d o s t ę p i e d o r e j e s t r ó w O C R 1 A i I C R 1 . G d y C P U d o k o n u j e z a p i s u d o bardziej z n a c z ą c e g o rejestru T C N T 1 H , z a p i s y w a na d a n a j e s t u m i e s z c z a n a p o c z ą t k o w o w rejestrze t y m c z a s o w y m T E M P . N a s t ę p n i e , w t y m s a m y m m o m e n c i e , w k t ó r y m o d b y w a się zapis m n i e j zna c z ą c e g o rejestru T C N T I L , d o rejestru T C N T 1 H j e s t p r z e p i s y w a n y rejestr T E M P . Konsekwencją takiego rozwiązania jest konieczność
wpisywania
najpierw starszej ( T C N T 1 H ) , p ó ź n i e j m ł o d s z e j ( T C N T I L ) c z ę ś c i rejestru p o d c z a s operacji 1 6 - b i t o w e g o zapisu. A n a l o g i c z n i e w y g l ą d a o p e r a c j a od czytu rejestru T C N T 1 . G d y C P U d o k o n u j e o d c z y t u m n i e j z n a c z ą c e g o rejes tru T C N T I L , p o b i e r a n a d a n a j e s t p r z e s y ł a n a b e z p o ś r e d n i o d o C P U i j e d n o cześnie z a w a r t o ś ć bardziej z n a c z ą c e g o rejestru ( T C N T 1 H ) j e s t u m i e s z c z a n a w rejestrze
tymczasowym
TEMP.
Kiedy
teraz
CPU
odczytuje
rejestr
T C N T 1 H , d a n a j e s t p o b i e r a n a z rejestru T E M P . K o n s e k w e n c j ą t a k i e g o roz wiązania j e s t k o n i e c z n o ś ć o d c z y t y w a n i a najpierw
młodszej
p ó ź n i e j starszej ( T C N T 1 H ) c z ę ś c i rejestru p o d c z a s operacji
(TCNTIL), 16-bitowego
odczytu. G d y zapis d o rejestru T C N T 1 następuje w chwili wystąpienia impulsu zega r o w e g o , najpierw będzie w y k o n a n e zliczenie, później zaś rejestr zostanie ustawiony zgodnie z zapisaną daną.
Jeśli p r o g r a m g ł ó w n y i procedury obsługi p r z e r w a ń w y k o r z y s tują operacje z u d z i a ł e m rejestru T E M P , t o przerwania p o w i n ny b y ć z a b l o k o w a n e na czas dostępu d o tego rejestru.
0CR1AH i 0CR1AL [Timer/Counterl Output Compare Register A) - starszy i młodszy rejestr wartości porównywanej - $2B/$2A 14
13
g
8
2
1
LSB 0
R/W
R/W
R/W
RM
R/W
R7W
0
0
0
0
0
0
0
0
11
12
Bit S3B (S4B) UMS4A)
15 MSB 7
6
5
4
3
Odczyt/Zapis
RAM
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
R/W
0 0
a 0
0 0
Wartość początkowa 0 0
10
0CR1AH OCR1AL
R/W - oznacza odczyt/zapis
Wartość p o r ó w n y w a n a przez układ T C 1 j e s t p r z e c h o w y w a n a w 16-bitowym rejestrze
OCR1A
składającym
się
z rejestru
OCR1AH
(starszy
bajt)
i O C R 1 A L (młodszy bajt). W a r t o ś ć zapisana w n i m j e s t bezustannie porów n y w a n a z w a r t o ś c i ą T i m e r a / L i c z n i k a l . W p r z y p a d k u wystąpienia warunku równości obu rejestrów, tzn. gdy O C R 1 A H = T C N T 1H i 0 C R 1 A L = T C N T 1 L , w y k o n y w a n a jest akcja określona w rejestrze sterującym Timera/Licznikal ( T C C R 1 A) i rejestrze statusu ( S R E G ) . A b y z a p e w n i ć j e d n o c z e s n o ś ć odczytu d w ó c h 8-bitowych rejestrów składających się na rejestr 16-bitowy, zastoso w a n o podobny m e c h a n i z m j a k w przypadku rejestru T C N T 1 . W operacjach dostępu do O C R 1 A korzysta się z rejestru t y m c z a s o w e g o T E M P . Gdy CPU dokonuje zapisu do bardziej znaczącego rejestru O C R 1 A H , zapisywana dana jest umieszczana początkowo w rejestrze t y m c z a s o w y m T E M P . Następnie, w t y m s a m y m m o m e n c i e , w którym o d b y w a się z a p i s mniej znaczącego re jestru O C R 1 A L , do rejestru O C R 1 A H p r z e p i s y w a n y j e s t rejestr T E M P . Kon sekwencją takiego rozwiązania j e s t k o n i e c z n o ś ć w p i s y w a n i a najpierw star szej ( O C R 1 A H ) , później młodszej ( O C R 1 A L ) c z ę ś c i rejestru podczas opera cji
16-bitowego zapisu. Analogicznie w y g l ą d a operacja odczytu rejestru
O C R 1 A . Gdy C P U dokonuje odczytu mniej z n a c z ą c e g o rejestru OCR1AL, pobierana dana jest przesyłana bezpośrednio d o C P U i j e d n o c z e ś n i e zawar tość bardziej znaczącego rejestru ( O C R 1 A H ) j e s t u m i e s z c z a n a w rejestrze t y m c z a s o w y m T E M P . Kiedy teraz C P U odczytuje rejestr O C R 1 A H , dana jest pobierana z rejestru T E M P . Konsekwencją takiego r o z w i ą z a n i a jest koniecz ność
odczytywania
najpierw
młodszej
(OCR1AL),
później
starszej
( O C R 1 A H ) części rejestru podczas operacji 1 6 - b i t o w e g o o d c z y t u . Jeśli pro gram główny i procedury obsługi przerwań wykorzystują operacje z udziałem rejestru T E M P , przerwania powinny b y ć z a b l o k o w a n e na czas dostępu do te g o rejestru.
ICR1H i ICR1L {Timer/Counterl Input Capture Register) - starszy i młodszy rejestr przechwytywania - $ 2 5 / $ 2 4 15 MSB
BA $25 ($45) $ 2 4 ($44)
14
13
12
11
10
S
9
LSB
ICR1H ICR1L
7 R
Odczyt/Zapis
R Wartość początkowa
0 0
R - oznacza odczyt
16-bitowy rejestr p r z e c h w y t y w a n i a j e s t p r z e z n a c z o n y tylko d o
odczytu.
W chwili, w której na wejściu I C P zostanie w y k r y t e narastające lub opadają ce zbocze
sygnału
(w zależności
od
ustawień bitu
ICES1
w rejestrze
T C C 1 B ) , aktualna w a r t o ś ć T i m e r a / L i c z n i k a l jest p r z e p i s y w a n a d o rejestru I C R 1 A (Input Capture put Capture
Registerl).
W t y m s a m y m m o m e n c i e flaga I C F 1 (In-
Flag) jest ustawiana. I w t y m p r z y p a d k u , aby z a p e w n i ć j e d n o -
czesność odczytu d w ó c h 8-bitowych rejestrów składających się na rejestr 16bitowy I C R I A , z a s t o s o w a n o rejestr t y m c z a s o w y T E M P . G d y C P U dokonuje odczytu mniej z n a c z ą c e g o rejestru I C R 1 L , pobierana dana j e s t przesyłana b e z p o ś r e d n i o d o C P U i j e d n o c z e ś n i e zawartość bardziej znaczącego rejestru ( I C R 1 A H ) j e s t u m i e s z c z a n a w rejestrze t y m c z a s o w y m T E M P . Kiedy teraz C P U odczytuje rejestr O C R 1 A H , d a n a j e s t pobierana z rejestru T E M P . K o n sekwencją
takiego rozwiązania jest
konieczność
odczytywania
najpierw
młodszej (1CR1AL), później starszej ( I C R 1 A H ) c z ę ś c i rejestru p o d c z a s o p e racji 16-bitowego odczytu. Jeśli p r o g r a m g ł ó w n y i p r o c e d u r y obsługi p r z e r w a ń wykorzystują operacje z u d z i a ł e m rejestru T E M P , to p r z e r w a n i a p o w i n ny b y ć z a b l o k o w a n e na czas dostępu d o tego rejestru.
5.3.
Timer/Licznikl w trybie PWM D o realizacji 8-, 9 - lub 1 0 - b i t o w e g o m o d u l a t o r a P W M (Pulse lation) Compare
Width
w y k o r z y s t y w a n y j e s t T i m e r / L i c z n i k l o r a z rejestr O C R 1 A Register
Modu(Output
I). W y j ś c i e m m o d u l a t o r a j e s t w y p r o w a d z e n i e O C 1 / P B 3
m i k r o k o n t r o l e r a . M o d u l a t o r j e s t u k ł a d e m s a m o d z i e l n y m , c o o z n a c z a , że p o z a ł a d o w a n i u p a r a m e t r ó w g e n e r o w a n e g o sygnału, d a l s z a p r a c a o d b y w a się bez ingerencji p r o g r a m u u ż y t k o w e g o . P a r a m e t r o d p o w i a d a j ą c y w s p ó ł c z y n nikowi wypełnienia może być oczywiście w d o w o l n y m momencie zmienia ny b e z g e n e r o w a n i a z a k ł ó c e ń typu glitch
(niepożądane impulsy). Zmiany
Tab. 5.5. Wartość zliczania licznika TC1 w trybie PWM (JOP) i częstotliwość generowanego przebiegu Wartość zliczania (TOP)
: Rozdzielczość PWM
Częstotliwość generowanego sygnału PWM
S00FF(255)
fici/510
9 bitów
$01FF (511)
W1022
10 bitów
$03FF (1023}
fTci/2046
8 bitów
Tab. 5.6. Znaczenie bitów COM1A1 i COM1A0 rejestru TCCP.1A w trybie PWM(V CDM1A1 CUM 1 AU 0
0
Akcja podejmowana na wyjściu 0C1
.
.••--...••.„..--..;,--,>.'.•'..
Nie występuje
0
1
Nie występuje
1
0
Wyjście 0C1 jest zerowane („0") po osiągnięciu warunku równości podczas zliczania w górę i ustawiane (.1") po osiągnięciu warunku równości podczas zliczania w dół (normalny tryb PWM)
1
1
Wyjście 0C1 jest zerowane (.0") po osiągnięciu warunku równości podczas zliczania w dót i ustawiane (.1") po osiągnięciu warunku równości podczas zliczania w górę (odwrócony tryb PWM)
Uwaga: 1. Stan początkowy wyjścia 0C1 jest nieokreślony.
w s p ó ł c z y n n i k a w y p e ł n i e n i a przebiegają b e z z a k ł ó c e n i a fazy generowanego sygnału. W trybie P W M T i m e r / L i c z n i k l pracuje j a k o licznik rewersyjny zliczający od $ 0 0 0 0 d o wartości maksymalnej ( T O P - patrz t a b l i c a 5.5), p o c z y m kierunek zliczania zostaje zmieniony i licznik odlicza z p o w r o t e m d o zera. W tym mo mencie następuje p o n o w n a zmiana kierunku liczenia i c y k l p o w t a r z a się. Gdy licznik osiągnie stan, w którym 8, 9 lub 10 najmniej z n a c z ą c y c h bitów będzie miało taką samą wartość j a k odpowiadające i m bity w rejestrze OCR1A, wy prowadzenie O C 1 / P B 3 jest ustawiane lub z e r o w a n e , z g o d n i e z ustawieniami bitów C O M 1 A 1 i C O M 1 A 0 znajdujących się w rejestrze T C C R 1 A . Szczegó ły p o d a n o w t a b l i c y 5.6. Zapis wartości p o r ó w n y w a n i a d o rejestru O C R 1 A w trybie P W M przebiega pośrednio - poprzez rejestr T E M P . Operacja ta j e s t w y k o n y w a n a na 10 naj młodszych bitach rejestru O C R 1 A , które są z a t r z a s k i w a n e , kiedy Timer/Licz n i k l osiągnie stan T O P . Zapobiega to p o w s t a w a n i u s z k o d l i w y c h impulsów (glitches)
w przypadku niesynchronicznego zapisu rejestru O C R 1 A . Sytuację
tę zilustrowano na r y s u n k u 5.5. W przedziale czasu p o m i ę d z y zapisem i zatrzaśnięciem danej, odczyt z rejes tru O C R 1 A powoduje pobieranie zawartości rejestru T E M P . W ten sposób dane zapisywane ostatnio d o rejestru O C R 1 A są z a w s z e c z y t a n e spoza niego. Jeśli O C R 1 A zawiera wartość $ 0 0 0 0 lub T O P , to wyjście O C 1 jest aktualizo w a n e d o stanu niskiego lub w y s o k i e g o (w zależności od ustawień bitów
Wartość zliczona Wartość oflnWsianie
Wyjścia PWM OC1 Zsynchronizowany prze rzutnik OCR1A
Wartość zliczona Wartość odniesienia
Niezsynchronizowany orzerzutnlk OCH1A
Rys. 5.5. Przyczyna powstawania impulsów glitches na wyjściu generatora PWM w mikrokont rolerach AVR
C O M 1 A 1 i C O M 1 A 0 w rejestrze T C C R 1 A ) w chwili spełnienia następnego w a r u n k u p o r ó w n a n i a . Zilustrowano to w t a b l i c y 5,7.
Jeśli rejestr p o r ó w n a n i a ( O C R 1 ) z a w i e r a w a r t o ś ć T O P i preskaler nie j e s t u ż y w a n y ( C S 1 2 . . . C S 1 0 = 0 0 1 ) , na wyjściu P W M n i e jest g e n e r o w a n y ż a d e n przebieg. Dzieje się tak, g d y ż w a r tości p o r ó w n a n i a p o d c z a s zliczane w g ó r ę i w dół są osiągane j e d n o c z e ś n i e . Z a s t o s o w a n i e preskalera ( C S 1 2 . . . C S 1 0 = 001 lub 0 0 0 ) powoduje
uaktywnienie wyjścia
PWM
kiedy
licznik
osiągnie wartość T O P , ale p o d c z a s odliczania w dół w a r u n e k p o r ó w n a n i a nie j e s t interpretowany. W t y m p r z y p a d k u zostanie w y g e n e r o w a n y j e d y n i e pojedynczy i m p u l s .
Tab. 5.7. Zachowanie się wyjścia 0C1 w trybie PWM, gdy rejestr porównywania jest równy $0000 lub TOP C0M1A1
COM1A0
0CR1A
1
0
$0000
U
1
0
TOP
H
1
1
$0000
H
1
1
TOP
L
Wyjście 0C1
F l a g a przepełnienia T i m e r a / L i c z n i k a l - T 0 V 1 w t r y b i e P W M j e s t ustawiana, g d y licznik znajdzie się w stanie $ 0 0 0 0 p o d c z a s z l i c z a n i a w g ó r ę . Nie doty czy to j e d n a k p i e r w s z e g o c y k l u p o j e g o w ł ą c z e n i u . Przykład S. 1. Zachowanie się (lagi T0V1 i 0CF1A w tryb/e PWM ;W pętli LOOP są wykonywane kolejne rozkazy programu (wykonywane ;w jednym cyklu), w tym przypadku nie jest istotne jakie, gdyż ; interesują nas tylko stany licznika i flag ,-definicja rejestru tmp tmp=rl7 def org $0000 cseg rjmp RESET ;inicjowanie zmiennych ;programu ... ;w tym SPL
RESET:
sei ldi out ldi ldi out out ldi ouc
tmp,0x81 tccrla,tmp tmp,0x32 tmp, 0 ocrlah,tmp ocrlal,tmp tmp,0x01 cccrlb,tmp
LOOP:
,-globalne włączenie przerwań ;8-bitowy PWM normalny
;0CR1AL=$32, przykładowa wartość ;preskaler=l, start timera ;TCNTl=0, TOV1=0, OCFlA=0 ;kolejne ro2kazy (nieistotne}
TCNT1=$32 TCNT1=$33, OCFlA=l (wystąpił pozytywny wynik porównania)
TCNT1=$FE TCNTl=$FF TCNT1=SFE TCNT1=$FD
TCNT1=$01 TCNT1=$00, T0V1=1 TCNT1=$01
P r z e r w a n i a od p r z e p e ł n i e n i a licznika m o g ą n o r m a l n i e , muszą
(przepełnienie)
w trybie P W M
być oczywiście ustawione
odpowiednie
funkcjonować bity
sterujące:
T O I E 1 w rejestrze T I M S K i I w rejestrze S R E G . A n a l o g i c z n i e można ko rzystać z p r z e r w a n i a o d spełnienia w a r u n k u p o r ó w n a n i a , g d y tylko będzie u s t a w i o n y bit O C I E 1 A w rejestrze T I M S K i I w r e j e s t r z e S R E G .
6.
Watchdog Stale rosnące w y m a g a n i a n i e z a w o d n o ś c i o w e s t a w i a n e przez u ż y t k o w n i k ó w sprzętu e l e k t r o n i c z n e g o - i to nie tylko profesjonalnego - powodują, że k o n struktorzy projektując urządzenia muszą w y k a z a ć dużą staranność w t y m za kresie. N i e z a w o d n o ś ć sprzętu zależy od wielu c z y n n i k ó w , n p . odporności na zakłócenia e l e k t r y c z n e czy p o p r a w n o ś c i o p r o g r a m o w a n i a mikrokontrolera. N a skutek p r z y p a d k o w e g o zakłócenia w y k o n y w a n i e p r o g r a m u m o ż e zostać przeniesione w p r z y p a d k o w e miejsce w p a m i ę c i p r o g r a m u ,
powodując
n i e p r z e w i d y w a l n e działanie systemu. Niedostateczne p r z e t e s t o w a n i e progra m u m o ż e r ó w n i e ż d o p r o w a d z i ć n p . d o p o w s t a w a n i a m a r t w y c h pętli, p o w o d u jąc w efekcie zawieszenie się systemu. C z ę s t o sytuacje takie są trudne d o w y krycia, g d y ż na pierwszy rzut oka p r o g r a m wygląda na p o z b a w i o n y b ł ę d ó w . N a przykład poniższa pętla napisana w j ę z y k u C wydaje się b y ć p o p r a w n a i p o sześciu iteracjach p o w i n n a zostać z a k o ń c z o n a . J e d n a k ż e na skutek za okrąglania wartości zmiennej sterującej typu float, w a r u n e k x = 0 nigdy nie zostanie w niej osiągnięty i pętla będzie n i e p r z e r w a n i e w y k o n y w a n a . Przykład 6.1. Z pozoru poprawna pętla programowa, okazuje się pętlą nieskończoną Binclude <wdt.h> łłinclude
float x;
//Uwaga! Z uwagi na zbyt duże biblioteki //operacji zmiennoprzecinkowych, ten program //nie zmieści się do układu AT90S2313 //deklaracja
wdt_enable(2) ; lor (x = S./3.;x!=0.;x- = l./3
zmiennej
typu float
// .) //zmienna x jest zmniejszana f/bfi
do
0 co
od wartości
1/3
{
wdt_reset{);
//umieszczenie rozkazu zerowania rejestrów //watchdoga w tym miejscu jest błędem, nie //spełni on tu swej funkcji. Mikrokontroler //powinien być wyzerowany, jeśli będzie za //długo przebywał w tej pętli
Aby zapobiec podobnym przypadkom opracowano dość prosty mechanizm s p r z ę t o w o - p r o g r a m o w y . W wielu w s p ó ł c z e s n y c h m i k r o k o n t r o l e r a c h , m . in. w A T 9 0 S 2 3 1 3 , z a w a r t o w strukturze układu w y d z i e l o n y t i m e r - w a t c h d o g , k t ó r e g o z a d a n i e m j e s t o d m i e r z a n i e specjalnych i n t e r w a ł ó w c z a s o w y c h (rime-out),
po przekroczeniu których mikrokontroler jest zerowany. Progra
mista pisząc p r o g r a m nie m o ż e d o p u ś c i ć d o tego, a b y p r z e k r o c z y ć c z a s ti-
me-out,
gdyż s p o w o d u j e to w y g e n e r o w a n i e s y g n a ł u z e r u j ą c e g o przez układ
w a t c h d o g a . W t y m c e l u w r ó ż n y c h p u n k t a c h p r o g r a m u u m i e s z c z a rozkazy zerujące rejestry timera i rozpoczynające t y m s a m y m c y k l liczenia od po czątku. Punkty takie m u s z ą b y ć starannie d o b r a n e . C z a s p r z e j ś c i a pomiędzy d w o m a sąsiednimi (ze w z g l ę d u n a k o l e j n o ś ć p r z e c h o d z e n i a , a nie miejsce w p r o g r a m i e ) nie m o ż e b y ć dłuższy niż time-out
w a t c h d o g a . Jednocześnie
um ie s z c z e ni e rozkazu zerującego w a t c h d o g w pętli p r o g r a m u podejrzanej o to, że m o ż e b y ć pętlą n i e s k o ń c z o n ą (jak w p r z y k ł a d z i e 6.1), nie spełni swojego zadania. W mikrokontrolerze A T 9 0 S 2 3 1 3 w a t c h d o g j e s t t i m e r e m t a k t o w a n y m z wy dzielonego generatora, zawartego w strukturze układu i pracującego z częs totliwością
1 MHz.
Jest
to
typowa
wartość
dla
napięcia
zasilające
g o V c c = 5 V. Watchdog m a swój własny preskaler, dzięki c z e m u progra mista może ustawiać odpowiednią dla siebie w a r t o ś ć time-outu
(tablica 6.1).
Na liście rozkazów mikrokontrolera A T 9 0 S 2 3 1 3 znajduje się specjalny roz kaz - WDR (Watchdog Reset)
- zerujący rejestr timera w a t c h d o g a . Długość
cyklu odmierzanego przez w a t c h d o g m o ż e przybierać j e d n ą z ośmiu różnych wartości. Doliczenie d o końca p o w o d u j e w y g e n e r o w a n i e sygnału zerującego (rysunek 4.26) i skok p o d adres wektora Reset Vector.
Programista, który
świadomie chce zablokować układ w a t c h d o g a m u s i w y k o n a ć specjalną sek wencję wyłączającą.
Zabezpieczenie takie m a n a celu uchronienie się od
p r z y p a d k o w e g o zablokowania w a t c h d o g a .
WDTCR [Watchdog Timer Control Register) - rejestr sterujący watchdoga - $21 BU
S21 ($41) Odczyt/Zapis
I
7 ~ R
1
6 •R
1
5 R
3 WOE R/W
A
| WDTOE | FtyW
Wartość początkowa 0 0 0 H - oznacza <x)czył. R/W - oznacza, odczyt/zapis
0
2 1 O 1 WOP2 | WDP1 | WDPO | WDTCR R/W R/W R/W 0
0
0
0
B7...5 - Z a r e z e r w o w a n e . T e bity są z a r e z e r w o w a n e w układzie A T 9 0 S 2 3 1 3 i z a w s z e odczytywane ja k o zero. B 4 - W D T O E (Watchdog watchdoga.
Turn-off
Enable):
bit z e z w o l e n i a n a wyłączenie
Bit ten musi być ustawiony („1") przed w y z e r o w a n i e m bitu W D E . Jeśli się tego nie zrobi, zablokowanie w a t c h d o g a nie zostanie w y k o n a n e . Po ustawie niu bitu W D T O E zostaje on sprzętowo w y z e r o w a n y a u t o m a t y c z n i e p o 4 cyk lach zegarowych. Wyłączenie w a t c h d o g a m u s i w i ę c nastąpić w tym czasie.
Preskaler waichodga
Generator 1MHz
03 i: 5 CM s CM o CO 3 ov> D O W to
(O O > O O
O
OSO OSO
WATCHDOG RESET
O O
^| " |
WDPO WDP1 W0P2 WDE
Rys. 6.1. Schemat blokowy watchdoga
B 3 - W D E (Watchdog
Zerowanie MCU
Enable) - bit włączający/wyłączający układ watchdoga.
W a t c h d o g j e s t włączony, jeśli bit W D E jest u s t a w i o n y („1")- Jeśli W D E j e s t w y z e r o w a n y ( „ 0 " ) , to w a t c h d o g jest wyłączony. W D E m o ż e b y ć z e r o w a n y tylko w t e d y , g d y j e d n o c z e ś n i e W D T O E jest u s t a w i o n y („1")- W celu zablo k o w a n i a pracującego w a t c h d o g a m u s i b y ć w y k o n a n a poniższa procedura: 1. Zapisać j e d n o c z e ś n i e „ I " d o bitów W D T O E i W D E . L o g i c z n a „ 1 " musi b y ć zapisana d o W D E podczas procedury b l o k o w a n i a w a t c h d o g a n a w e t w t e d y , g d y bit ten był ustawiany wcześniej. 2. W ciągu n a s t ę p n y c h czterech cykli z e g a r o w y c h zapisać „ 0 " d o bitu W D E . W t y m m o m e n c i e w a t c h d o g zostanie z a b l o k o w a n y . B2...0 - W D P 2 , W D P 1 , WDPO (Watchdog
Timer
Preskaler)
- bity konfi
gurujące preskaler watchdoga. Bity W D P 2 , W D P 1 , WDPO określają parametry preskalera w a t c h d o g a , gdy jest on a k t y w n y . Ustawienie preskalera w p ł y w a na d ł u g o ś ć time-outu
watch
d o g a (tablica 6.1). Tab. 6.1. Ustawienie preskalera watchdogaW WDP2
WDP1
WDPO
Liczba cykli oscylatora WDT
Typowa długość time-outu Typowa długość time-outu Ula V = 3 V dlaV =5V w
cc
0
0
0
16 kcykli
47 ms
15 ms
0
0
1
32 kcyKli
94 ms
30 ms 60 ms
0
1
0
64 kcykli
0.19 S
0
1
1
128 kcykli
0,38 s
0,12 S
1 1
0
0
256 kcykli
0,75 s
0,24 S
0
1
512 kcykli
1.5 S
0.49 s
1
1
0
1024 kcykli
3.0 s
0,97 s
1
1
1
2048 kcykli
6,0 S
1.9 S
Uwaga: " i Częstotliwość oscylatora watchdoga jest uzależniona od wartości napięcia zasilającego.
"
R o z k a z WDR (Watchdog
Reset)
p o w i n i e n być z a w s z e w y k o n a n y przed włą
c z e n i e m w a t c h d o g a . T y m s a m y m m a m y p e w n o ś ć , ż e o k r e s z e r o w a n i a będzie z g o d n y z u s t a w i e n i a m i preskalera. Jeśli w a t c h d o g j e s t w ł ą c z o n y bez wcześ niejszego zerowania, to j e g o stan p o c z ą t k o w y m o ż e b y ć r ó ż n y o d zera. Dla uniknięcia n i e z a m i e r z o n e g o z e r o w a n i a M C U , w a t c h d o g p o w i n i e n być bloko w a n y lub z e r o w a n y p r z e d zmianą p a r a m e t r ó w j e g o p r e s k a l e r a . Przykład 6.2. Obsługa watchdoga (wersja programu w asemblerze) .def .def
temp=r20 templ=r21 ldi in cli wdr out out
temp,SOS templ,sreg
wdtcr,temp sreg,templ
wdr
;przygotowanie wpisu do WDTCR ;zapamiętanie statusu CPU ;zablokowanie przerwań reset watchdoga ;start watchdoga z minimalnym timeoutem jodtworzenie statusu CPU
.•zerowanie watchdoga w takim miejscu programu, ;przez który licznik rozkazu musi przechodzić ,-w odstępach czasu nie dłuższych niż wartość ;time-outu
ldi ldi cli wdr out ldi out
temp,$18 templ,sreg
,-procedura wyłączenia watchdoga ; zapamiętanie statusu CPU ;zablokowanie przerwań
wdtcr,temp temp,$10 wdtcr,temp
;WDT0E=1 i WDE=1
out
sreg,templ
WDTOE=l i WDE=0 - stop watchdoga, gdyby nie było powyższego wpisu do wdtcr, watchdog nie zatrzymałby sie odtworzenie statusu CPU
Przykład 6.3. Obsługa watchdoga (wersja programu w języku C)
wdt_reset(); wdt_enable<0);
//zerowanie licznika watchdoga //start watchdoga z minimalnym timeoutem
wdt_reset();
//zerowanie licznika watchdoga w takim miejscu //programu, przez który licznik rozkazu musi //przechodzić w odstępach czasu nie dłuższych //niż wartość time-outu
wdt_dłsable();
//wyłączenie watchdoga, procedura biblioteczna //realizuje ustawienie odpowiedniej sekwencji //bitów WDTOE=l i WDE=1
7.
Pamięć danych EEPROM W i ę k s z o ś ć k o n s t r u o w a n y c h współcześnie urządzeń wykorzystujących m i k r o kontrolery w y m a g a wielokrotnego z a c h o w y w a n i a specyficznych informacji, np. o ostatnich ustawieniach e l e m e n t ó w regulacyjnych, trybach pracy, z a k r e sach p o m i a r o w y c h lub też innych parametrach pracy sterownika. D a n e te p o winny b y ć z a c h o w y w a n e także p o wyłączeniu zasilania. U ż y t a d o tego celu p a m i ę ć p o w i n n a c h a r a k t e r y z o w a ć się d ł u g i m c z a s e m p r z e c h o w y w a n i a da nych
i dostatecznie
dużą
liczbą
cykli z a p i s u / k a s o w a n i a .
Jej
pojemność
w w i ę k s z o ś c i p r z y p a d k ó w nie musi b y ć b a r d z o d u ż a . Z a z w y c z a j w y s t a r c z a kilkadziesiąt d o kilkuset bajtów. N i e są też b a r d z o k r y t y c z n e w y m a g a n i a d o tyczące czasu dostępu d o takiej pamięci, g d y ż nie pełni o n a funkcji pamięci d a n y c h , w której przechowuje się d y n a m i c z n i e m o d y f i k o w a n e z m i e n n e p r o g r a m u . P o w y ż s z e w y m a g a n i a spełnia p a m i ę ć E E P R O M . Występuje
ona
w p r a w i e w s z y s t k i c h o d m i a n a c h m i k r o k o n t r o l e r ó w A V R , nie m a jej tylko w kilku wersjach ATtiny (patrz d o d a t e k A ) .
7.1.
Zapis i odczyt pamięci W strukturach mikrokontrolerów A V R z a w a r t o wszystkie e l e m e n t y niezbęd n e d o p r o g r a m o w a n i a wewnętrznej pamięci E E P R O M , takie j a k logika steru j ą c a i p o m p y ł a d u n k o w e wytwarzające napięcia programujące. K o r z y s t a n i e z pamięci E E P R O M m o ż e się więc o d b y w a ć w typowej aplikacji m i k r o k o n trolera bez ż a d n y c h e l e m e n t ó w z e w n ę t r z n y c h . P r o g r a m i s t a m u s i j e d n a k ż e za c h o w a ć p e w n e środki ostrożności w tych miejscach p r o g r a m u , w których od wołuje się d o pamięci E E P R O M . P o w o d e m tego m o g ą b y ć n p . n i e o c z e k i w a n e z a c h o w a n i a mikrokontrolera p o d c z a s włączania lub wyłączania systemu. Z b y t wolne pojawianie się lub zanik napięcia zasilającego m o ż e s p o w o d o w a ć n i e o c z e k i w a n y skok d o r o z k a z ó w korzystających z pamięci E E P R O M i w y konanie r o z k a z u zapisu d o niej. M i ę d z y i n n y m i z t e g o p o w o d u w s k a z a n e jest s t o s o w a n i e z e w n ę t r z n e g o układu z e r o w a n i a mikrokontrolera. Zapis d o pa mięci o d b y w a się poprzez specjalną p r o c e d u r ę minimalizującą p r a w d o p o d o b i e ń s t w o n i e k o n t r o l o w a n e g o dostępu d o E E P R O M - u . B ę d z i e o n a opisana w dalszej c z ę ś c i rozdziału. Operacje zapisu i odczytu pamięci E E P R O M są r e a l i z o w a n e p o p r z e z w y d z i e lone rejestry specjalne. C z a s dostępu podczas zapisu w a h a się w przedziale od 2,5 d o 4 m s , w zależności od wartości napięcia zasilającego
Vcc-
UĘ
Podczas zapisywania E E P R O M - u , p r a c a C P U zostaje wstrzy-
W l EGi
m
a
n
a
n
a
d
w
a
y t d e
z
e
a
r
o
w
e
w
3
° § ' P ^ y P ^ " odczytu, C P U jest zatrzymana n a cztery cykle z e g a r o w e . D o p i e r o p o t y m czasie jest w y k o n y w a n y następny rozkaz.
UijjjjWrt
EEAR (Address Register) - rejestr adresowy pamięci EEPROM - $ 1 E BU $1E($3E) Odczyt/Zapis
7 |.
Wartość początkowa
-R
EEAR6 R/W
s EEAR5 R/W
4 EEAR4 R/W
E6AR3 R/W
2 EEAR2 R/W
1 EEAR1 R/W
0 EEARO R/W
0
0
0
0
0
0
0
6 I
0
3
fl - oznacza odczyt, R/w - oznacza odczyt/zapis
B 7 - z a r e z e r w o w a n y . T e n bit j e s t z a r e z e r w o w a n y w układzie A T 9 0 S 2 3 1 3 i zawsze odczytywany j a k o zero. B6...0 - E E A R 6 . . . 0 (EEPROM
Address):
adres zapisu/odczytu
pamięci
EEPROM. Bity te zawierają adres dostępu d o pamięci E E P R O M . Określają pojedynczą k o m ó r k ę E E P R O M - u dla operacji zapisu l u b o d c z y t u z c a ł e g o 128-bajtoweg o obszaru j a k i m dysponuje mikrokontroler. A d r e s o w a n i e p a m i ę c i jest linio w e p o m i ę d z y adresami 0 i 127 (S7F).
EEDR (Data Register) - rejestr danych pamięci EEPROM - $1D Bit $1D($3D)
|
7 MSB
Odczyt/Zapis R/W Wartość początkowa 0 R/w - oznacza odczyt/sapls
R/W 0
R/W 0
B 7 . . . 0 - E E D R 7 . . . 0 (EEPROM do/z pamięci E E P R O M .
R/W
R/W 0
Data):
R/W 0
dana
0
R/W 0
R/W 0
zapisywana/odczytywana
Podczas operacji zapisu pamięci E E P R O M , d a n a u m i e s z c z o n a
wcześniej
w rejestrze E E D R jest w p i s y w a n a p o d adres określony zawartością rejestru E E A R . Podczas operacji odczytu, w rejestrze E E D R zostaje u m i e s z c z o n a da na z pamięci E E P R O M spod adresu określonego w rejestrze E E A R .
EECR [Control Register) - rejestr sterujący pamięci EEPROM - $ 1 C Z , 6 5 Z I Odczyt/Zapis R R R Wartość początkowa 0 o o R - oznacza odczyt, R A V - oznacza odczyt/zapis m
SlC(S3C)
,
I
1
L_ -
4
1
-
1
R O
3 R
2 1 lEEMWEl EEWE I R/W R/W O O O
0 EERTI
R/W O
EECR
B7...3 - z a r e z e r w o w a n e . T e bity są z a r e z e r w o w a n e w układzie A T 9 0 S 2 3 1 3 i z a w s z e o d c z y t y w a n e j a k o zero. B 2 - E E M W E (EEPROM
Master
Write Enable):
bit z e z w o l e n i a n a zapis
d o pamięci E E P R O M . Bit E E M W E określa, czy zapis d o pamięci E E P R O M m o ż e nastąpić", czy nie. Jeśli E E M W E jest ustawiony („1"), ustawienie bitu E E W E spowoduje zapi sanie danej pod w s k a z a n y adres. Jeśli E E M W E m a w a r t o ś ć zero, u s t a w i e n i e bitu E E W E nie powoduje zapisu. Zapis d o pamięci p o w i n i e n b y ć w y k o n a n y najdalej w ciągu czterech cykli p o ustawieniu bitu E E M W E . Jeśli to nie na stąpi, to bit ten zostanie sprzętowo w y z e r o w a n y (bez ingerencji p r o g r a m u ) . B I - E E W E (EEPROM
Write Enable):
strob zapisu d o pamięci E E P R O M .
Bit E E W E s t a n o w i strob zapisu d o pamięci E E P R O M . P o ustawieniu o d p o wiednich wartości rejestrów E E A R (adres) i E E D R (dana) ustawienie bitu E E W E p o w o d u j e w y k o n a n i e zapisu d o pamięci E E P R O M .
Bezpośrednio
przed w y s t a w i e n i e m strobu musi b y ć j e s z c z e u s t a w i o n y bit E E M W E . Proce dura zapisu p o w i n n a wyglądać następująco: 1. Czekaj d o m o m e n t u , gdy E E W E osiągnie w a r t o ś ć zero. 2. Zapisz n o w y adres d o rejestru E E A R (opcjonalnie). 3. Zapisz nową daną d o rejestru E E D R (opcjonalnie). 4 . Ustaw bit E E M W E w rejestrze E E C R . Aby było możliwe ustawienie tego bitu, bit E E W E musi być w tym s a m y m cyklu zapisywany wartością zero. 5. Najdalej w c i ą g u czterech cykli zegara p o ustawieniu bitu E E M W E , zapisać logiczną „ 1 " d o bitu E E W E . P o chwili równej czasowi dostępu ( t y p o w o 2,5 m s dla V < x = 5 V lub 4 m s dla V < x = 2,7 V ) bit E E M W E jest s p r z ę t o w o z e r o w a n y . Programista p o w i nien zadbać, aby bit E E W E był z a w s z e s p r a w d z a n y p r z e d w y k o n a n i e m ope racji zapisu d o pamięci E E P R O M , aż osiągnie w a r t o ś ć zero. P o ustawieniu bitu E E W E p r a c a C P U j e s t w s t r z y m y w a n a na czas t r w a n i a d w ó c h cykli zega r o w y c h i d o p i e r o p o t y m czasie j e s t w y k o n y w a n y następny rozkaz.
Jeśli między k r o k i e m 4 . a 5. p o w y ż s z e g o algorytmu wystąpi ja k i e k o l w i e k przerwanie, operacja zapisu m o ż e się nie p o w i e ś ć z p o w o d u przekroczenia time-outu
zapisu. M o ż e się też zda
r z y ć , że procedura obsługi przerwania wykorzystująca dostęp d o pamięci E E P R O M zmodyfikuje rejestry E E A R i E E D R po wodując błędne działanie p r o g r a m u . Z a l e c a się w i ę c globalne b l o k o w a n i e przerwań w czasie w y k o n y w a n i a k r o k ó w 2. d o 4 .
BO - E E R E (EEPROM
Read Enable):
s t r o b o d c z y t u p a m i ę c i EEPROM.
Bit E E R E jest strobem odczytu pamięci E E P R O M . A b y o d c z y t a ć dane z pa mięci E E P R O M , p o wpisaniu o d p o w i e d n i e g o adresu w rejestrze EEAR, na leży wstawić bit E E R E . W chwili, g d y E E R E zostanie s p r z ę t o w o wyzerowa ny, odczytywana dana zostanie u m i e s z c z o n a w rejestrze E E D R , jednakże nie jest konieczne cykliczne sprawdzanie bitu E E R E . P o ustawieniu bitu EERE praca C P U zostaje wstrzymana na czas r ó w n y c z t e r e m c y k l o m zegarowym przed wykonaniem następnego rozkazu. Programista p o w i n i e n jednak spraw dzić stan bitu E E W E przed rozpoczęciem czytania p a m i ę c i E E P R O M . Nie m o ż e on być równy „ 1 " . Jeśli tak b ę d z i e (co o z n a c z a , ż e trwa operacja zapi su), to zmiana rejestru danej lub adresu E E P R O M - u
s p o w o d u j e , że zapis zo
stanie przerwany, a j e g o rezultat b ę d z i e n i e z d e f i n i o w a n y . Przykład 7.1. Obsługa wewnętrznej pamięci EEPROM w asemblerze. Dwie dane będą kolejno zapisywane pod adresy $01 i $02, a następnie zostaną odczytane .def temp=rl6 .def danal=rl7 .de£ dana2=rl8 -def templ=rl9 ;Zapis EEPROM-u LI:' sbic EECR,EEWE rjmp LI ldi temp,1 out eear.temp ldi temp,S7£ out eedr.temp sbi eecr.eeinwe sbi eecr.eewe
;ustaw dana do zapisu np.=S7E ;przygotuj EEPROM do zapisu ;zapisz pod adres 1 daną $7t
L2:
;czekaj na gotowość
sbic rjmp ldi out ldi out in cli sbi sbi out
.-czekaj na gotowość
,-uscaw adres zapisu = 1
EECR,EEWE L2 temp.2 eear.temp temp,Oxbf eedr.temp templ,sreg
;ustaw adres zapisu = $02 ;ustaw dana do zapisu np.=Sbf ;zachowaj status CPU ;zablokuj globalne przerwania ;przygotuj EEPROM do zapisu ,-zapisz pod adres 2 dana. 0xbf ;odtwórz status CPU
eecr.eemwe eecr.eewe sreg,templ
,-Odczyt EEPROM-u L3: sbic EECR,EEWE rjmp L3 ldi temp,0x1 out eear.temp sbi eecceere in dana1,EEDR inc temp out eear.temp sbi eecr.eere in dana2,EEDR
;czekaj na gotowość
;
;ustaw adres odczytu = 1 czytaj eeprom(l) i umieść w zmiennej danal
;
;ustaw adres odczytu = 2 jczytaj eeprom[21 i umieść w zmiennej dana2
;
Przykład 7.2. Ten sam problem co w przykładzie 7.1 zrealizowany w języku C, wzbogacony o wyświetlanie stanu odczytanej pamięci na diodach LED sterowanych z PORTB Ifinclude flinclude tl include <eeprom.h> void czekaj(unsigned long zt) ( unsigned char ztl; for l;zt>0;zt — ) { for(zt1=255;ztl!=0;ztl--ł ;
//procedura pomocnicza
} }
int main[void) { unsigned char dana; PORTB=0xff; DDRB=0xf£; czekaj(10000L); eeprom_wb(l,0x7f); eeprom_wb(2,Oxbf); dana=eeprom_rb(l); PORTE-dana; czekaj(10000L); dana=eeprom_rb(2); PORTB=dana; czekaj (10000D ; while (1);
//gaś LED-y //PORTB w całości jako wyjściowy //czekaj ok. 1 s //zapisz dana 0x7F do EEPROM-u pod adres = 1 //zapisz dana OxbF do EEPROM-u pod adres = 2 //czytaj EEPR0M[1] //i wyświetl na LED-ach //czekaj ok. 1 s //czytaj EEPROM[2] //i wyświetl na LED-ach //czekaj ok. 1 s //zapetl program
}
J a k w i d a ć , rozwiązanie tego s a m e g o p r o b l e m w j ę z y k u C j e s t znacznie prost sze. O d p a d a ż m u d n e o p e r o w a n i e na pojedynczych bitach rejestrów, spraw dzanie w a r u n k ó w gotowości E E P R O M - u d o zapisu itp. O c z y w i ś c i e wszyst kie te operacje są w y k o n y w a n e w p r o c e d u r a c h bibliotecznych j ę z y k a C.
M i k r o k o n t r o l e r y A V R nie są niestety p o z b a w i o n e
pewnych
p r z y k r y c h dla u ż y t k o w n i k a w a d . Jedną z nich j e s t brak z a b e z pieczenia przed sytuacją, w której w takcie w y k o n y w a n i a zapi su d o E E P R O M - u nastąpi z e r o w a n i e mikrokontrolera. Cykl za p i s u zostanie d o k o ń c z o n y normalnie, ale rejestr adresu zostanie w y z e r o w a n y . D a n a zostanie zapisana pod adres
wskazany
i p o d adres Ó, c o oczywiście j e s t z a c h o w a n i e m n i e p o p r a w n y m . Z tego p o w o d u zaleca się n i e w y k o r z y s t y w a n i e z e r o w e g o adre su pamięci E E P R O M , m i m o że o p i s y w a n a sytuacja wydaje się b y ć mało p r a w d o p o d o b n a .
Zapewnienie prawidłowych warunków pracy pamięci EEPROM Pamięć E E P R O M d o p r a w i d ł o w e g o działania w y m a g a stabilnego napięcia zasilającego o wartości mieszczącej się w d o p u s z c z a l n y m przedziale. 2 jed nej strony zależy od tego prawidłowe w y t w o r z e n i e napięć programujących, z drugiej zaś obniżone napięcie zasilające m o ż e mieć s z k o d l i w y wpływ na działanie mikrokontrolera. W efekcie mogą
powstawać
nieprawidłowości
pracy, w szczególności związane z d o s t ę p e m d o pamięci E E P R O M . Aby uchronić się od opisanych p r o b l e m ó w zaleca się s t o s o w a n i e j e d n e j z następu jących zasad: 1. U t r z y m y w a ć a k t y w n y stan linii R E S E T mikrokontrolera p r z e z czas ustala nia się napięcia zasilającego. Najpopularniejszą metodą j e s t wykorzystywa nie w aplikacjach specjalizowanych układów z e r o w a n i a (np. D S 1 8 1 3 ) . Przy ich doborze trzeba pamiętać, aby miały o d p o w i e d n i p o z i o m a k t y w n y sygnału zerującego. Mikrokontrolery A V R są z e r o w a n e p o z i o m e m niskim. Układy takie są n a z y w a n e Brown-out
Detector
( B O D ) i zapewniają prawidłowe ge
nerowanie sygnału zerującego oraz kontrolę obniżenia n a p i ę c i a zasilającego. Wiele dodatkowych informacji m o ż n a znaleźć w n o c i e A V R 1 8 0 dostępnej na internetowej stronie Atmela
(www.atmel.com).
2. G d y napięcie zasilające jest o b n i ż o n e , należy u t r z y m y w a ć mikrokontroler w stanie uśpienia. Rozwiązanie takie zapobiegnie n i e p r a w i d ł o w e m u wykona niu rozkazów, skutecznie zabezpieczając k o m ó r k i p a m i ę c i E E P R O M przed niekontrolowanymi z m i a n a m i . 3. Stałe w y k o r z y s t y w a n e przez p r o g r a m należy p r z e c h o w y w a ć w pamięci Flash (w pamięci p r o g r a m u ) , chroniąc j e t y m s a m y m przed jakimikolwiek zmianami w y w o ł a n y m i przez źle działający p r o g r a m . P a m i ę ć Flash nie może być b o w i e m m o d y f i k o w a n a przez C P U (nie d o t y c z y mikrokontrolerów ATmega).
8.
Układ transmisji szeregowej (UART) W wielu przypadkach system oparty na mikrokontrolerze musi k o m u n i k o w a ć się z j a k i m ś urządzeniem zewnętrznym. Aktualnie c o r a z powszechniej w y k o rzystuje się d o tego celu interfejs U S B , ale w dalszym ciągu klasyczny interfejs - j a k i m jest R S 2 3 2 - cieszy się ogromną popularnością wśród użytkowników. Dlatego też, wiele współczesnych mikrokontrolerów m a w b u d o w a n e odpo wiednie bloki funkcjonalne d o realizacji asynchronicznej (niekiedy również synchronicznej) transmisji szeregowej. Określane są o n e m i a n e m U A R T (Universal Asynchronous
Receiver
and Transmitter).
Stanowią one kompletne roz
wiązanie interfejsu pod w z g l ę d e m logicznym, j e d n a k gdy transmisja m a b y ć prowadzona
na większe odległości wymagają
układów dopasowujących
zastosowania
zewnętrznych
poziom sygnałów d o standardu R S 2 3 2 .
Można
z nich r e z y g n o w a ć w przypadku wieloprocesorowych aplikacji, w których po szczególne jednostki pracują w swoim bezpośrednim sąsiedztwie. Większość urządzeń obsługujących transmisję szeregową wykorzystuje interfejs R S 2 3 2 , w którym logicznej j e d y n c e przypisano wartość napięcia z przedziału od - 3 d o - 1 2 V, zaś logicznemu zeru przypisano wartość napięcia z przedziału od 3 d o 12 V. Sygnały na liniach transmisyjnych nie p o w i n n y osiągać wartości od - 3 d o + 3 V. Najpopularniejszym
układem d o realizacji takiego interfejsu jest
M A X 2 3 2 lub j e g o odmiany. W niektórych przypadkach zadowalające może być wykonanie konwertera poziomów na tranzystorze. M i m o popularności te g o typu transmisji nie wszystkie mikrokontrolery A V R wyposażono w U A R T (patrz porównanie parametrów w dodatku A ) . W takich przypadkach konieczna jest niestety całkowicie programowa j e g o implementacja. Stanowi to p e w n e utrudnienie,
ale nie jest niemożliwe d o zrobienia.
Opisywany
tu
układ
A T 9 0 S 2 3 1 3 na szczęście m a w swojej architekturze dupleksowy blok U A R T u, d o którego dostęp zapewniają wydzielone rejestry nadajnika i odbiornika. P o d s t a w o w e cechy U A R T - u w b u d o w a n e g o w mikrokontrolery A V R to: - w b u d o w a n y generator p o d s t a w y czasu dla transmisji szeregowej, - m o ż l i w o ś ć uzyskiwania w y s o k i c h prędkości transmisji dla niskich częstot liwości rezonatora k w a r c o w e g o , - d a n a o długości 8 lub 9 bitów, - układ redukcji s z u m ó w zakłócających transmisję, - detekcja nadpisania zawartości bufora odbiornika, - detekcja błędu ramki, - detekcja b ł ę d n e g o bitu startu, - trzy w y d z i e l o n e przerwania d o obsługi zdarzeń: z a k o ń c z e n i a transmisji da nej, opróżnienia bufora n a d a w c z e g o , zapełnienia bufora odbiorczego.
8.1.
Budowa i działanie nadajnika UART Schemat b l o k o w y układu nadajnika p r z e d s t a w i o n o na r y s u n k u 8 . 1 . Nadawa nie jest inicjowane przez zapisanie wysyłanej danej d o rejestru nadajnika U D R (UART l/O Register).
Dana ta jest następnie p r z e n o s z o n a d o wyjścio
w e g o rejestru przesuwającego. Jeśli zapis d o U D R nastąpi p o t y m , gdy bit stopu poprzedniego znaku opuści rejestr przesuwający, to rejestr ten jest ła d o w a n y bezpośrednio nową daną. Jeśli zapis d o U D R nastąpi przed w y s ł a n i e m bitu stopu p o p r z e d n i e g o znaku, to n o w a dana czeka w rejestrze U D R na przepisanie d o w y j ś c i o w e g o rejestru przesuwającego d o m o m e n t u , gdy bit stopu p o p r z e d n i e g o znaku zostanie wy słany. Rejestr przesuwający m a długość 10 (lub 11) bitów (8 lub 9 bitów da nej + znak startu + znak stopu). W chwili, g d y rejestr przesuwający nadajnika jest pusty, n o w a dana j e s t przenoszona d o niego z rejestru U D R i jednocześ nie zostaje ustawiony bit U D R E (UART Data Register w rejestrze U S R (UART Status Register), Magistrata danych
XTAL-
BAUOxl6 Generator prędkości transm.
1:16
Rys. 8.1. Schemat blokowy nadajnika układa UART
Empty)
znajdujący się
c o j e s t s y g n a ł e m g o t o w o ś c i nadaj-
Rejestr danych UART (UDR)
nika d o przyjęcia nowej danej. Jednocześnie z przenoszeniem znaku z rejestru U D R d o rejestru przesuwającego bit 0 tego rejestru j e s t zerowany (będzie to bit startu), a bit 9 (lub 10) jest ustawiany (będzie to bit stopu). Jeśli wybrano 9-bitową długość słowa, to bit T X B 8 z rejestru U C R (UART Control Register)
jest
przenoszony d o bitu 9 rejestru przesuwającego. D ł u g o ś ć słowa określa się na dając odpowiednią wartość bitowi C H R 9 znajdującemu się w rejestrze U C R . Dla słowa 9-bitowego bit ten powinien b y ć ustawiony („1"). Przesuwanie bi tów w rejestrze wyjściowym jest taktowane zegarem transmisyjnym (Baud Ra tę Clock). Jest on niezależny od zegara taktującego C P U . Bity nadawanego znaku pojawiają się na wyprowadzeniu T X D mikrokontrolera. Najpierw bit startu, potem bity danej począwszy od najmniej znaczącego (LSB). N a końcu jest wysyłany bit stopu. Kiedy bit stopu opuści rejestr przesuwający, zostaje do niego załadowana n o w a dana z rejestru U D R (jeśli wcześniej została t a m umieszczona). Podczas ładowania bit U D R E jest ustawiony. Jeśli w rejestrze U D R nie m a kolejnego znaku d o wysiania, to bit U D R E zostaje ustawiony w chwili wyjścia poprzedniego bitu stopu z rejestru przesuwającego i pozostaje w t y m stanie d o momentu kolejnego wpisu d o rejestru U D R . Jeśli nie nastąpi zapisanie nowej danej, gdy bit stopu występuje na wyjściu T X D przez czas trwania transmisji j e d n e g o bitu, to zostanie ustawiona flaga TX Compiete
Fłag
(TXC) znajdująca się w rejestrze USR. Nadajnik m o ż e b y ć włączany lub w y łączny za pomocą bitu T X E N z rejestru U C R . Jego ustawienie („1") uaktywnia nadajnik. Jeśli bit ten będzie wyzerowany („0"), wyprowadzenie P D 1 może b y ć wykorzystywane j a k o wejście/wyjście ogólnego przeznaczenia. Ustawienie T X E N powoduje c a ł k o w i t e p r z e c h w y c e n i e funkcji w y p r o w a d z e n i a P D 1 przez nadajnik, niezależnie o d ustawienia bitu D D D 1 w rejestrze D D R D .
Ustawienie bitu C H R 9 w rejestrze U C R p o w o d u j e , że n a d a w a n e i o d b i e r a n e znaki mają długość 9 b i t ó w , plus bit startu i bit stopu. M u s i m u b y ć n a d a n a o d p o w i e d n i a wartość przed zainicjowaniem transmisji. Dziewiąty bit d o w y słania, t o T X B 8 znajdujący się w rejestrze U C R .
8.2.
Budowa i działanie odbiornika UART S c h e m a t b l o k o w y układu odbiornika przedstawiono na r y s u n k u 8.2. Wejście odbiornika transmisji szeregowej jest połączone za p o m o c ą o d p o w i e d n i c h układów przełączających z w y p r o w a d z e n i e m P D 0 / R X D . W e w n ę t r z n a logika próbkuje sygnał
16 razy w c i ą g u czasu t r w a n i a transmisji j e d n e g o bitu.
W czasie, gdy linia znajduje się w stanie idle ( o c z e k i w a n i e na bit startu), po j e d y n c z a p r ó b k a o wartości „ 0 " j e s t interpretowana j a k o opadające zbocze sygnału wejściowego. Powoduje to zainicjowanie sekwencji działań związa nych z wykryciem bitu startu. Przyjmijmy, ż e p r ó b k a ta m a n u m e r 1. Tak więc p o zmianie stanu linii odbiorczej ( R X D ) z 1 n a 0 o d b i o r n i k analizu j e 8, 9 i 10 próbkę. Jeśli c o najmniej dwie z nich będą miały wartość' „ 1 " , wy krycie bitu startu jest a n u l o w a n e . Sytuację taką uznaje się za zakłócenie im pulsowe i cała powyższa procedura jest w z n a w i a n a od początku. W przeciw n y m razie uznaje się, że odebrano bit startu. P r ó b k o w a n i e kolejnych bitów od bywa się w podobny sposób. Wartości c o najmniej d w ó c h j e d n a k o w y c h próbek spośród 8, 9 i 10 decydują o wartości odebranego bitu. J e d n a k o w e próbki nie muszą przy tym występować kolejno p o sobie. Sekwencja n p . 101 j e s t interpre towana j a k o bit o wartości „ 1 " . Odebrany bit „ w c h o d z i " d o rejestru przesuwa jącego. Próbkowanie wejścia R X D zilustrowano na r y s u n k u 8.3.
Magistrala danych
XTAL-
Generaior prędkości transm.
8AUDx16 1:16
Rejestr danych UART (UDR)
BAUD STORĘ UDR
Bufor wejściowy PDO
RXD
Blok detekcji bitów
Rejestr sterujący UART (UCR)
Magistrala danych
Rys. 8.2. Schemat blokowy odbiornika układu UART
>
10(H)-bitowyrejestr przesuwny odbiornika
RXD
sygnału przez 11M11liiiItllllllltlllllllllltllllliri 111 illllllllJlllltlllllllllllinIII•lllllllltItllllMiritlllJIllfllilllJlItllJIllIllIJJJJIlItlłJlIlllIłlllllltlllIIII• IL11 odbiornik UART Rys. 8.3. Próbkowanie danych odbieranych przez odbiornik UART-u
U k ł a d o d b i o r n i k a liczy o d b i e r a n e bity. O s t a t n i m b i t e m ramki jest bit stopu, który p o w i n i e n mieć wartość „ 1 " . Jest o n r o z p o z n a w a n y w z n a n y j u ż sposób. Jeśli o k a ż e się, ż e d w i e l u b trzy próbki (spośród 8, 9 i 10) bitu stopu są r ó w n e „ 0 " , p o d e j m o w a n a jest decyzja o wystąpieniu błędu ramki i ustawiana j e s t flaga Framing
Error ( F E ) w rejestrze statusu U S R (UART Status
Register).
Przed o d c z y t e m danej z rejestru U D R programista powinien z a w s z e spraw dzić, stan tej flagi, a b y u p e w n i ć się, czy nie wystąpi! błąd transmisji. P o pra w i d ł o w y m l u b b ł ę d n y m odebraniu bitu stopu dana j e s t p r z e p i s y w a n a z rejest r u przesuwającego d o rejestru U D R . J e d n o c z e ś n i e j e s t ustawiana flaga R X C w rejestrze U S R . Rejestr U D R to de facto
fizycznie d w a oddzielne rejestry
dla nadajnika i odbiornika. P o d c z a s odczytu U D R j e s t udostępniany odbior czy rejestr d a n y c h , podczas z a p i s y w a n i a natomiast j e s t udostępniany n a d a w czy rejestr d a n y c h . Jeśli w y b r a n o 9-bitowe s ł o w o d a n y c h (bit C H R 9 w rejes trze U C R m a wartość „ 1 " ) , bit R X B 8 w rejestrze U C R jest ładowany 9 b i t e m z rejestru przesuwającego. Dzieje się to w tej samej chwili, c o przepisywanie danej z rejestru przesuwającego d o rejestru U D R . T a k s k o m p l e t o w a n a d a n a p o w i n n a b y ć odczytana z rejestru U D R przed o d e b r a n i e m następnej. Jeśli t a k się nie stanie, to w rejestrze U S R jest ustawiana flaga OverRun
( O R ) , sygna
lizując błąd nadpisania danej. W takiej sytuacji ostatnia dana s k o m p l e t o w a n a w rejestrze przesuwającym nie p o w i n n a b y ć (teoretycznie) przenoszona d o U D R . Flaga O R j e s t buforowana i z a w s z e a k t u a l i z o w a n a p o odczytaniu pra widłowej danej z rejestru U D R . Programista p o w i n i e n z a w s z e s p r a w d z a ć stan flagi O R p o odczytaniu rejestru U D R . W y s t ę p o w a n i e b ł ę d ó w nadpisania m o że b y ć konsekwencją zbyt dużej prędkości transmisji lub n a d m i e r n y m obcią ż e n i e m j e d n o s t k i centralnej i n n y m i zadaniami o w y ż s z y m priorytecie. W y z e rowanie ( „ 0 " ) bitu R X E N w rejestrze U C R p o w o d u j e z a b l o k o w a n i e odbiorni ka. W y p r o w a d z e n i e P D 0 / R X D m o ż e b y ć w ó w c z a s w y k o r z y s t y w a n e j a k o wejście/wyjście o g ó l n e g o przeznaczenia. W p r z y p a d k u ustawienia („1") bitu C H R 9 w rejestrze U C R , dziewiąty bit o d e b r a n e g o z n a k u to R X B 8 znajdujący się w rejestrze U C R .
Włączenie
odbiornika
powoduje
całkowite
przechwycenie
funkcji w y p r o w a d z e n i a PDO przez odbiornik, niezależnie o d ustawienia bitu DDDO w rejestrze D D R D .
8.3.
Sterowanie transmisją D o obsługi transmisji szeregowej poprzez U A R T służą cztery rejestry specjalne.
UDR (UART HO Dała Register) - rejestr danych nadawanych/odbieranych przez UART - $0C Bit S0C($2C)
I
MSB
|
Otoyt/Zapis WW Wartość początkowa o R/W - oznacza odczyt/zapis
I R/W 0
I
I
RM 0
I
R/W
R/W
I R/W
0
0
1 R/W 0
0
L
S
B
i
"DR
0
Rejestr U D R to fizycznie d w a oddzielne rejestry występujące p o d tym sa m y m adresem w przestrzeni I/O. P o d c z a s zapisu d a n e są k i e r o w a n e do rejes tru danych wysyłanych (UART
Transmit
Dała
z rejestru danych odbieranych (UART Receive
Register). Data
O d c z y t następuje
Register).
USR (UART Status Register) - rejestr stanu UART-u - $0B Bit 7 6 $0B($2S) | RXC | TXC | UORE Odczyt/Zapis R R/W R Wartość początkowa 0 0 1 R -oznacza odczyt. R/W - oznacza od czyi/zapis
5 |
FE
4 |
3 OR R
0
0
2
l R
1 I
-
R 0
I R
0
0 R 0
l USR
Rejestr U S R może być tylko o d c z y t y w a n y . Sygnalizuje stan układu UART. B 7 - R X C (UART Receive
Comptete):
flaga
s y g n a l i z u j ą c a o d e b r a n i e zna
ku przez odbiornik. Znacznik ten jest ustawiany („1") w c h w i l i , g d y o d e b r a n a d a n a jest przeno szona z odbiorczego rejestru przesuwającego d o rejestru U D R . Ustawienie bitu R X C o d b y w a się niezależnie od e w e n t u a l n e g o w y k r y c i a błędów trans misji. Jeśli bit R X C I E z rejestru U C R jest u s t a w i o n y ( „ 1 " ) , to ustawienie fla gi R X C będzie o z n a c z a ł o zgłoszenie przerwania UART Receive
Complete,
oznaczającego, że w rejestrze U D R znajduje się d a n a d o o d c z y t u . Bit RXC jest automatycznie k a s o w a n y w chwili odczytu rejestru U D R . Jeśli transmisje prowadzi się wykorzystując system przerwań, to p r o c e d u r a obsługi przerwa nia UART Receive
Complete
p o w i n n a odczytać rejestr U D R w c e l u skasowa
nia flagi R X C . W p r z e c i w n y m razie, z a n i m zostanie z a k o ń c z o n a aktualna procedura obsługi wystąpi kolejne przerwanie. B 6 - T X C (UART Transmit Complete): wysyłania danej przez nadajnik.
flaga
s y g n a l i z u j ą c a zakończenie
Znacznik ten jest ustawiany („1") w chwili, gdy cała n a d a w a n a d a n a (włączając bit stopu) zostanie wysunięta z nadawczego rejestru przesuwającego i nie ma
nowej danej zapisanej w rejestrze U D R . Znacznik ten jest szczególnie przydat ny podczas obsługi transmisji półdupleksowej, w której bezpośrednio po wy słaniu znaku trzeba przechodzić „na odbiór" i zwalniać Unię transmisyjną. Jeśli bit T X C I E z rejestru U C R jest ustawiony („1"), t o ustawienie flagi T X C będzie oznaczało zgłoszenie przerwania UART Transmit Complete,
oznaczającego, ż e
w rejestrze U D R nie ma danej d o wysłania. Bit T X C jest automatycznie zero wany w chwili wykonania skoku d o odpowiedniego wektora przerwania. Moż na też g o z e r o w a ć poprzez wpisanie logicznej j e d y n k i („1") d o tego bitu: sbi
uci".txc
; zeru j flagę TXC w rejestrze UCR
B 5 - U D R E ( U A R T Data Register
Empty);
flaga
sygnalizująca opróżnie
nie bufora U A R T . Bit U D R E jest ustawiany („1") w chwili przenoszenia danej z rejestru U D R d o nadawczego rejestru przesuwającego. Sygnalizowana jest tym s a m y m gotowość nadajnika do wczytania nowej danej przeznaczonej d o wysiania. Jeśli bit U D R I E w rejestrze U C R jest ustawiony („1"), t o przerwanie UART Transmit Complete będzie m o g ł o być obsługiwane dopóty, dopóki bit U D R E jest ustawiony. Flaga U D R E jest zerowana przez zapisanie rejestru U D R . Jeśli transmisję prowadzi się wykorzystując system przerwań, to procedura obsługi przerwania UART Data Register Empty musi zapisywać rejestr U D R w celu skasowania flagi U D R E . W p r z e c i w n y m razie, zanim zostanie zakończona aktualna procedura obsługi wystąpi kolejne przerwanie. Po restarcie mikrokontrolera flaga U D R E jest ustawiana („1") sygnalizując gotowość nadajnika. B 4 - F E (Framming
Error): flaga s y g n a l i z u j ą c a b)ąd r a m k i .
R a g a F E j e s t ustawiana, g d y zostanie wykryty błąd r a m k i (np. w p r z y p a d k u r o z p o z n a n i a zerowej wartości bitu stopu), z e r o w a n a z a ś automatycznie p o odebraniu p r a w i d ł o w e g o bitu stopu. B 3 - O R (OverRun):
flaga
sygnalizująca n a d p i s a n i e d a n y c h w rejestrze
odbiornika. Flaga O R j e s t ustawiana, jeśli zostanie w y k r y t e nadpisanie danych w rejest rze o d b i o r n i k a ( n p . gdy d a n a znajdująca się aktualnie w rejestrze U D R nie zostanie o d c z y t a n a przed w p r o w a d z e n i e m n a s t ę p n e g o znaku d o odbiorczego rejestru przesuwającego). Z n a c z n i k O R jest z e r o w a n y p o przesianiu odebra nej danej d o rejestru U D R . B2...0 - z a r e z e r w o w a n e . T e bity są z a r e z e r w o w a n e w układzie A T 9 0 S 2 3 1 3 i z a w s z e o d c z y t y w a n e j a k o zero.
UCR [UART Control Register) -rejestr sterujący UART-u - $ 0 A s
4
7 6 A(S2A) l RXCIE | TXCIE | UDR1E I Odczyt/Zapis R W R / W R / W R Wartość początkowa 0 0 0 R - oznacza odczyt. W - oznacza zapis, R/W - oznacza S0
B 7 - R X C I E (RX Compłete
3
2
1
. . , , RXSN 1 TXEN I CHR9 | RXB8 / W R / W R / W R 0 0 0 1 odczyt/zapis
B i t
Interrupt
Enable):
. |
0
TXB8 W 0
, | UCR
bit z e z w o l e n i a n a przerwa
nie od odbiornika ( p o o d e b r a n i u danej). Ustawienie („1") bitu R X C I E zezwala na przyjęcie p r z e r w a n i a Receive plete Interrupt,
Com
zgłaszanego automatycznie przez U A R T p o odebraniu danej
i sygnalizowanego ustawieniem flagi R X C w rejestrze U S R . Przerwanie zo stanie obsłużone pod w a r u n k i e m g l o b a l n e g o z e z w o l e n i a na przerwania. B6 - T X C I E (TX Complete
Interrupt
Enable):
bit z e z w o l e n i a n a przerwa
nie od nadajnika (po w y s i a n i u danej). Ustawienie („1") bitu T X C I E zezwala na przyjęcie przerwania Transmit
Comple
te Interrupt, zgłaszanego automatycznie przez U A R T p o zakończeniu nadawania danej i sygnalizowanego ustawieniem flagi T X C w rejestrze USR. Przerwanie zostanie obsłużone pod warunkiem globalnego zezwolenia na przerwania. B 5 - UDRJJE (UART Data Register
Empty Interrupt
Enable):
bit zezwolenia
na przerwanie od nadajnika (po opróżnieniu bufora n a d a j n i k a U D R ) . Ustawienie („1") bitu U D R I E zezwala na przyjęcie p r z e r w a n i a UART Data Register
Empty Interrupt,
zgłaszanego a u t o m a t y c z n i e p r z e z U A R T p o opróż
nieniu bufora nadajnika i s y g n a l i z o w a n e g o u s t a w i e n i e m flagi U D R E w rejes trze U S R . Przerwanie zostanie obsłużone p o d w a r u n k i e m g l o b a l n e g o zezwo lenia na przerwania. B 4 - R X E N (Receher
Enable): bit włączający/wyłączający odbiornik UART.
Ustawienie („1") bitu R X E N powoduje włączenie o d b i o r n i k a U A R T - u . Jeśli bit R X E N m a wartość „ 0 " odbiór jest n i e m o ż l i w y , a flagi R X C , O R i FE nie mogą stawać się a k t y w n e (są ustawiane a u t o m a t y c z n i e p o wystąpieniu odpo wiednich zdarzeń). Jeśli flagi te zostały w czasie pracy u s t a w i o n e , to wyzero wanie bitu R X E N nie w p ł y w a na nie (są nadal u s t a w i o n e ) . B 3 - T X E N (Transmitter Enable): bit włączający/wyłączający odbiornik UART. Ustawienie („1") bitu T X E N powoduje włączenie nadajnika U A R T . Jeśli bit T X E N zostanie w y z e r o w a n y w chwili, gdy nie została j e s z c z e zakończona transmisja, to nadajnik nie zostanie w y ł ą c z o n y natychmiast, lecz dopiero po c a ł k o w i t y m zakończeniu wysyłania bieżącej danej ( w y c h o d z ą c e j z szerego w e g o rejestru przesuwającego nadajnika) i danej znajdującej s i ę w rejestrze U D R (oczekującej na wysłanie).
B 2 - C H R 9 (9 Bit Characters):
bit ustalający d ł u g o ś ć d a n e j n a d a w a n e j /
odbieranej. Ustawienie („1") bitu C H R 9 powoduje przyjęcie 9-bitowej długości danej na dawanej i odbieranej plus bit stopu i bit startu. Dziewiąty bit odebranego znaku jest odczytywany z rejestru U C R (bit R X B 8 ) . Dziewiąty bit transmitowanego znaku jest zapisywany w rejestrze U C R (bit T X B 8 ) . B I - R X B 8 (Receive
Data Bit 8)t ó s m y ( n a j b a r d z i e j z n a c z ą c y ) bit o d e b r a
nej danej. Kiedy bit C H R 9 j e s t ustawiony ( „ 1 " ) , R X B 8 zawiera najstarszy bit odebranej danej. BO - T X B 8 (Transmit
Data Bit 8): ó s m y ( n a j b a r d z i e j z n a c z ą c y ) bit n a d a
wanej danej. Kiedy bit C H R 9 j e s t ustawiony ( „ 1 " ) , T X B 8 z a w i e r a najstarszy bit n a d a w a nej danej.
8.4.
Generator podstawy czasu transmisji [Baud Rate Generator) Z e g a r synchronizujący pracę U A R T jest wytwarzany przez o d p o w i e d n i e p o dzielenie częstotliwości oscylatora s y s t e m o w e g o . D o obliczenia j e g o para m e t r ó w stosuje się poniższą formułę: BAUD = f gdzie:
CK
/16-(UBRR+1)
B A U D - p r ę d k o ś ć transmisji [b/s], fcK - częstotliwość oscylatora taktującego C P U , U B R R - wartość rejestru U B R R zapewniająca transmisję z ustaloną prędkością ( m o ż e p r z y j m o w a ć wartości o d 0 d o 255).
J a k w i d a ć , ustawianie prędkości tylko poprzez zapisanie rejestru U B R R p o ciąga za sobą p e w n e niedogodności. T a k a dyskretna forma regulacji z 2 5 6 (tylko) m o ż l i w y m i k r o k a m i m o ż e budzić o b a w y c o d o jej skuteczności. Istot nie, nie da się w ten sposób uzyskać dowolnej prędkości transmisji dla do wolnej wartości z a s t o s o w a n e g o kwarcu. Pamiętajmy j e d n a k , że najczęściej j e s t s t o s o w a n a j e d n a z kilku standardowych prędkości transmisji przewidzia nych dla interfejsu R S 2 3 2 . Z a s a d a prowadzenia transmisji
asynchronicznej
dopuszcza r ó w n i e ż pewną tolerancję częstotliwości zegara transmisyjnego. Z a k ł a d a się, że 1% błąd określenia tej prędkości nie powinien p o w o d o w a ć praktycznych p r o b l e m ó w . G d y b y p o m i m o tego nie u d a ł o się obliczyć para-
m e t r u U B R R , należy p r ó b o w a ć d o b r a ć c z ę s t o t l i w o ś ć r e z o n a t o r a kwarcowe g o . Wiąże się to niestety z e w e n t u a l n y m i p ó ź n i e j s z y m i p r o b l e m a m i z obli c z e n i a m i czasu w p r o g r a m i e , j e ś l i z o b l i c z e ń w y n i k n i e „ n i e r ó w n a " wartość k w a r c u . Z e s t a w i e n i e z t a b l i c y 8.1 ułatwi o d p o w i e d n i d o b ó r w s z y s t k i c h para m e t r ó w określających p r ę d k o ś ć transmisji,. W y t ł u s z c z o n o w s z y s t k i e pozycje, w których obliczony błąd j e s t mniejszy n i ż
2%.
Tab. 8.1. Dobór parametru UBRR dla standardowych prędkości transmisji i kilku typowych rezonatorów kwarcowych Prędkość
1 MHz
transmisji
Stąd
1.8432 MHz
Błąd [%]
2 MHz
Btąd t%]
2,4576 MHz
f%]
Btąd [%]
2400
UBRR=25
0,2
UBRR=47
0,2
UBRR=12
0.2
UBRR=23
0.0 0,0
UBRR=51
4800
UBRR=25
0,2
UBRfi=63 UBRR=31
0.0
9600
UBRR=6
7.5
UBRR=11
0,0
UBRR=12
0,2
UBRR=15
0,0
14400
UBRR=3
7,8
UBRR=7
0,0
UBRR=8
3,7
UBRR=10
3,1
19200
UBRR=2
7,8
UBRR=5
0,0
UBRR=6
7.5
UBRR=7
0,0
28800
UBRR=1
7,8
UBRR=3
0,0
UBRR=3
7,8
UBRR=4
6,3
38400
UBRR=1
22,9
U8RR=2
0.0
UBRR=2
7,8
UBRR=3
0.0
57600
UBRR=0
7,8
UBRR=1
0,0
UBRR = 1
7.8
UBRR=2
12,5
76800
UBRR=0
22.9
UBRR=1
33,3
UBRR = 1
22.9
UBRR=1
0.0
115200
U8RR-0
84.3
U8RR=0
0,0
UBRR=0
7,8
NBRR=0
25,0
3,2768 MHz
Błąd
3.6864 MHz
Błąd 1%1
4 MHz
Błąd
4,608 MHz
Btąd !%]
Prędkość transmisji
l%]
m
2400
UBRR=84
0,4
UBRR=95
0,0
UBRR=103
0,2
UBRR=42
0,8
UBRR=47
0.0
0,2
9600
UBRR=20
1,6
UBRR=23
0,0
UBRR=51 U8RR=25
UBRR=119 UBRR=59
0,0
4800
0,2
UBRR=29
0,0
14400
UBRR=13
1.6
UBRR=15
0,0
UBRR=16
2.1
UBRR=19
D.O
19200
U8RR = 10
3.1
UBRR=11
0.0
UBRR=12
0,2
UBRR=14
0,0
0,0
28800
UBRR=6
1.6
UBRR=7
0,0
U8RR=8
3,7
UBRR=9
0,0
38400
U8RR=4
6.3
UBRR=5
0,0
NBRR=6
7.5
UBRR=7
6.7
0,0
57600
UBRR = 3
12,5
UBRR=3
7.8
UBRR ==4
UBRR=2
12,5
UBRR=3 UBRR=2
0,0
76800
0,0
UBRR=2
7,8
UBRR=3
6.7
115200
UBRR=1
12.5
UBRR=1
o.o
UBRR = 1
7,8
UBRR=2
20,0
Prędkość transmisji
7,3728 MHz
Błąd [%]
8 MHz
Błąd [%]
9,216 MHz
Błąd [%]
11.059 MHz
Błąd
2400
UBRR=191
0,0
UBRR=207
0,2
UBRR=239
0,0
UBRR=287
_
4800
UBRR=95
0,0
0,0
UBRR-143
U8RR=47
0,0
0,2 0.2
UBRR=119
9600
U8RR=103 U BRR=51
UBRR=S9
UBRR=71
14400
UBRR=31
UBRR=34
0,8
UBRR=39
UBRR=47
0,0
19200
UBRR=23
0.0 0,0
0,0 0,0
0,0 0,0
UBRR=25
0,2
UBRR=29
0,0
UBRR=35
0,0
28800
UBRR=15
0,0
UBRR=16
2,1
UBRR=19
0,0
U8HR=23
0.0
38400
UBRR=11
0.0
UBRR=12
0,2
0,0
UBRR=17
0,0
57600
UBRR=7
0.0
UBRR=8
3.7
UBRR=14 UBRR=9
0,0
UBRR=11
0,0
76800
UBRR=5
0,0
UBRR=6
7,5
UBRR=7
6,7
UBRR=8
0,0
115200
UBRR=3
0,0
UBRR=3
7,8
UBRR=4
0.0
UBRR=5
0,0
UBRR (UART Baud Rate Register) - rejestr wyboru prędkości transmisji UART-u - $09 7 Bit S09(S29) | MSB | R/W Odczyt/Zapis Wartość początkowa 0 R/W - oznacza odczyt/zapis
6
5
4
3
Z
1
RAN
R/W
R/W
R/W
R/W
R/W
0 LSB R/W
0
0
0
0
0
0
0
Rejestr U B R R zawiera 8-bitowy p a r a m e t r określający p r ę d k o ś ć transmisji szeregowej, z g o d n i e z p r z e d s t a w i o n y m i wyżej obliczeniami.
U k ł a d U A R T mikrokontrolera A T 9 0 S 2 3 1 3 m o ż e utracić syn chronizację, jeśli podczas wyłączenia odbiornika na linii R X D b ę d z i e w y s t ę p o w a ! stan niski. Dzieje się tak, g d y ż w e w n ę t r z n a logika bloku U A R T w y k r y w a rozpoczęcie transmisji (bit star tu) nawet w ó w c z a s , gdy U A R T nie j e s t włączony. W takiej sy tuacji pierwszy odebrany bajt p o włączeniu
UART
będzie
błędny. A b y uchronić się o d takiego p r z y p a d k u należy z a p e w nić u t r z y m y w a n i e linii R X D w stanie w y s o k i m podczas wyłą czenia interfejsu U A R T .
9.
Komparator analogowy M a r z e n i e m k a ż d e g o konstruktora j e s t mikrokontroler w y p o s a ż o n y w prze twornik analogowo-cyfrowy. Niestety, często okazuje się, że wykonanie ta k i e g o układu chociaż m o ż l i w e , nie j e s t proste. Z a i m p l e m e n t o w a n i e dobrego przetwornika A/C w strukturze mikrokontrolera jest na o g ó ł okupione dość z n a c z n y m wzrostem kosztu wykonania układu. Minimalizacja wzajemnego o d d z i a ł y w a n i a na siebie b l o k ó w analogowych i cyfrowych w j e d n y m układzie stanowi niemałe w y z w a n i e dla biur konstruk cyjnych producentów. Rezygnacja z tego k o m p o n e n t u znajduje uzasadnienie, g d y ż w wielu p r z y p a d k a c h problem braku p r z e t w o r n i k a m o ż n a obejść pew n y m i metodami. W p r a w d z i e specjalizowane, „ a n a l o g o w e " aplikacje nie obędą się bez p r a w d z i w e g o przetwornika A / C , lecz w mniej wymagających sys temach można d o c e l ó w przetwarzania a n a l o g o w o - c y f r o w e g o
zastosować
komparator analogowy. Okazuje się to na tyle p r o s t y m i tanim rozwiązaniem, że jest stosowane w wielu b a r d z o p o p u l a r n y c h m i k r o k o n t r o l e r a c h . Kompara tor taki m o ż e być oczywiście również w y k o r z y s t y w a n y d o i n n y c h zadań. Większość mikrokontrolerów A V R - w t y m A T 9 0 S 2 3 1 3 -
m a w swojej
strukturze komparator analogowy (patrz zestawienie w d o d a t k u A ) . Jego za daniem jest p o r ó w n y w a n i e d w ó c h napięć d o p r o w a d z o n y c h d o wejścia nieodwracającego A1N0 (PBO) i wejścia odwracającego A I N 1 ( P B l ) (rysunek 9.1). Wyjście komparatora A C O (Analog
Comparator
Output)
jest w stanie
w y s o k i m („1"), jeśli napięcie na wejściu n i e o d w r a c a j ą c y m AINO jest większe od napięcia na wejściu odwracającym A I N 1 . Wyjście k o m p a r a t o r a może być wykorzystywane do w y z w a l a n i a funkcji p r z e c h w y t y w a n i a Timera/Licznikal. W systemie przerwań mikrokontrolera A T 9 0 S 2 3 1 3 p r z e w i d z i a n o specjalny wektor przerwania przydzielony dla k o m p a r a t o r a a n a l o g o w e g o , równy $00A.
PBO (AINO)
ACIE
ACD ACO
Przerwanie od komparatora analogowego
Wybór warunków zgłoszenia przerwania
1 ACIS1
T
ACl ACIC
ACISO Do mulitpleksera TC1 CAPTURE TRIGGER
Rys. 9.1. Schemat blokowy komparatora analogowego
Przerwanie j e s t g e n e r o w a n e na wyjściu k o m p a r a t o r a , przy c z y m zgłoszenie przerwania m o ż e n a s t ę p o w a ć p o zmianie stanu na j e g o wyjściu z niskiego na w y s o k i , z w y s o k i e g o na niski, lub dowolną zmianą stanu (przerzutem). K o m parator m o ż e b y ć p r o g r a m o w o wyłączany w celu zmniejszenia poboru prądu zasilającego p r z e z mikrokontroler.
ACSR {Analog Comparator Control and Status Register) - rejestr sterujący i statusu komparatora analogowego - $08 B i t
7
$08 ($28)
|
ACD
CWczytCapis
6 | •
-
RAW
S :
|
4
ACO
R
R
|
3
ĄCI
|
ACIE
R/W
R/W
Wartość początkowa o 0 N/A 0 R - oznacza odczyt. R/W - oznacza odczyt/zapis. N/A - nieustalona
B7-ACD
(Analog
Comparator
Disable):
2
1
0
| ACIC | ACISl ] AC1S0 | ACSR R/W 0
bit
R/W 0
RAW 0
0
włączający/wyłączający
komparator analogowy. Ustawienie ( „ 1 " ) bitu A C D p o w o d u j e wyłączenie komparatora. Bit ten m o ż e b y ć u s t a w i o n y w d o w o l n y m m o m e n c i e . W y ł ą c z e n i e k o m p a r a t o r a wyraźnie zmniejsza p o b ó r prądu zasilającego w trybie n o r m a l n y m i Idle. zmiany bitu A C D musi b y ć w y ł ą c z o n e p r z e r w a n i e k o m p a r a t o r a Comparator
Interrupt)
W chwili (Analog
przez w y z e r o w a n i e bitu A C I E w rejestrze A C S R . Jeś
li się nie z a p e w n i tego w a r u n k u , m o ż e wystąpić n i e k o n t r o l o w a n e w y g e n e r o wanie p r z e r w a n i a . B 6 - zarezerwowany. T e n bit j e s t z a r e z e r w o w a n y w układzie A T 9 0 S 2 3 1 3 i z a w s z e o d c z y t y w a n y j a k o zero. B 5 - A C O (Analog Comparator
Output):
wyjście komparatora analogowego.
Bit A C O j e s t b e z p o ś r e d n i m odzwierciedleniem s t a n u wyjścia k o m p a r a t o r a analogowego. B 4 - A C l (Analog tora.
Comparator
Interrupt):
flaga
p r z e r w a n i a od k o m p a r a
Bit A C l j e s t ustawiany („1") w m o m e n c i e wystąpienia zdarzenia n a wyjściu komparatora a n a l o g o w e g o zdefiniowanego za p o m o c ą bitów A C I S l i ACISO j a k o zgłoszenie przerwania. Procedura obsługi p r z e r w a n i a od k o m p a r a t o r a (Analog wiony
Comparator
Interrupt)
jest w y k o n y w a n a , jeśli bit A C I E jest usta
(„1") i włączone j e s t globalne zezwolenie n a p r z e r w a n i a (bit I w re
jestrze S R E G jest ustawiony). Flaga A C l j e s t z e r o w a n a sprzętowo w chwili skoku d o w e k t o r a przerwania o d komparatora. M o ż e b y ć także z e r o w a n a p o przez w p i s a n i e j e d y n k i („1") d o tego bitu. Jeśli w p r o g r a m i e pozostałe bity
rejestru U C S R są m o d y f i k o w a n e r o z k a z a m i S B I lub C B I , t o bit A C l powi nien być wyzerowany przed w y k o n a n i e m tych modyfikacji. B 3 - A C I E (Analog
Comparator
Interrupt
Enable):
flaga
zezwolenia na
przerwanie od k o m p a r a t o r a . Ustawienie bitu A C I E („1") przy w ł ą c z o n y m g l o b a l n y m zezwoleniu na prze rwania (bit I w rejestrze S R E G j e s t u s t a w i o n y ) , z e z w a l a n a generowanie przerwania od komparatora. Jeśli A C I E = 0, to p r z e r w a n i a komparatora są zablokowane. B 2 - A C I C (Analog
Comparator
Input Capture
Enable):
bit zezwolenia na
wyzwalanie funkcji p r z e c h w y t y w a n i a T i m e r a / L i c z n i k a l p r z e z kompara tor a n a l o g o w y . Ustawienie („1") bitu A C I C powoduje, że funkcja p r z e c h w y t y w a n i a Timera/ Licznikal jest w y z w a l a n a przez k o m p a r a t o r a n a l o g o w y . W y j ś c i e komparato ra zostaje w ó w c z a s dołączone b e z p o ś r e d n i o d o układu sterującego funkcją przechwytywania. W t y m trybie m o ż n a n o r m a l n i e w y k o r z y s t y w a ć eliminator s z u m u i wybierać z b o c z e generujące p r z e r w a n i e Timer/Counterl ture Interrupt
Input Cap
(patrz opis L i c z n i k a / T i m e r a l ) . Jeśli bit A C I C j e s t wyzerowany
(„0"), opisanego wyżej połączenia nie m a . A b y w y z w a l a n e komparatorem przerwanie Timer/Counterl
Input Capture Interrupt
m o g ł o b y ć wygenerowa
ne, bit T I C I E 1 w rejestrze T I M S K m u s i b y ć ustawiony ( „ 1 " ) . B I , BO - A C I S l , ACISO (Analog
Comparator
Interrupt
Modę
Select): bity
w y b o r u w a r u n k u zgłaszania p r z e r w a n i a przez k o m p a r a t o r . Powyższe bity określają które zdarzenie na wyjściu k o m p a r a t o r a analogowego powoduje zgłoszenie przerwania. Możliwości są przedstawione w tablicy 9.1. Przykład wykorzystania komparatora a n a l o g o w e g o j a k o ź r ó d ł a wyzwalania funkcji przechwytywania T i m e r a / L i c z n i k a l z a m i e s z c z o n o w rozdziale 14.1 (ćwiczenie 6). Tab. 9.1 Tryby wyzwalania przerwania komparatora ustawiane bitami ACIS1, ACISOH) ACISl
ACISO
0
0
Przerwanie komparatora wyzwalane zmianą stanu na jego wyjściu
0
1
Zarezerwowane
1
0
Przerwanie komparatora wyzwalane opadającym zboczem sygnału wyjściowego komparatora
1
1
Przerwanie komparatora wyzwalane narastającym zboczem sygnału wyjściowego komparatora
Tryb przerwania
?:
Uwaga: " i Podczas zmian bitów ACIS1 i ACISO przerwanie od komparatora analogowego powinno być zablokowa ne przez wyzerowanie bilu ACIE w rejestrze ACSR. W przeciwnym razie może wystąpić niekontrolowane zgłoszenie przerwania komparatora.
t
10. Porty wejścia-wyjścia (l/O) D o czego może być wykorzystany mikrokontroler? Jak sama nazwa wska zuje d o s t e r o w a n i a , a j e ś l i tak, to p o w i n i e n b y ć w y p o s a ż o n y w o d p o w i e d n i ą liczbę u n i w e r s a l n y c h wejść i w y j ś ć . U w z g l ę d n i e n i e t e g o postulatu m o ż e niekorzystnie wpływać na wielkość obudowy mikrokontrolera. Aby zmini malizować liczbę wyprowadzeń układu scalonego, wymyślono wielofunk cyjne p o r t y w e / w y . W z a l e ż n o ś c i o d u s t a w i e ń b i t ó w k o n f i g u r a c y j n y c h m o gą o n e p e ł n i ć rolę p o r t ó w w e / w y o g ó l n e g o p r z e z n a c z e n i a w y k o r z y s t y w a nych do sterowania urządzeniami zewnętrznymi lub mogą współpracować z w e w n ę t r z n y m i b l o k a m i f u n k c j o n a l n y m i . Z e w z g l ę d u na b u d o w ę w e w n ę t rzną C P U , a w szczególności długość rejestrów i s z e r o k o ś ć szyny danych porty te mają najczęściej b u d o w ę 8-bitową. N i e k t ó r e z nich m o g ą nawet pra c o w a ć j a k o a n a l o g o w e lub cyfrowe. W zależności o d typu mikrokontrolera j e s t w n i m z a i m p l e m e n t o w a n a mniejsza lub w i ę k s z a liczba p o r t ó w (patrz z e stawienie p a r a m e t r ó w w dodatku A ) . W układzie A T 9 0 S 2 3 1 3 u ż y t k o w n i k m a d o dyspozycji 8-bitowy port w e / w y - P O R T B i 7-bitowy P O R T D . Kieru n e k k a ż d e g o w y p r o w a d z e n i a d o w o l n e g o portu m o ż e ustalany niezależnie o d pozostałych i zmieniany w d o w o l n y m m o m e n c i e bez w p ł y w u na pozostałe li nie portów. S t o s o w n ą konfigurację m o ż n a zrealizować przy użyciu r o z k a z ó w S B I lub C B I . T e s a m e rozkazy mogą służyć d o ustawienia o d p o w i e d n i e g o p o z i o m u na porcie w y j ś c i o w y m lub włączenia/wyłączenia podciągania pullup linii portu w e j ś c i o w e g o .
10.1. Budowa portu B Jak j u ż w i e m y , P O R T B j e s t 8-bitowym, d w u k i e r u n k o w y m p o r t e m w e / w y . Jest on dostępny poprzez 3 lokacje w przestrzeni w e / w y
mikrokontrolera.
D l a c z e g o j e d e n port zajmuje aż trzy adresy? Praktycznie j e d e n adres wystar czy, ale rozwiązania z a s t o s o w a n e w A V R - a c h pozwalają na bardziej efek t y w n e konfigurowanie i w y k o r z y s t y w a n i e portów. Jak się t o z a t e m o d b y w a ? Pierwsza lokacja to rejestr danych (Data
Register)
P O R T B - adres $18 w przestrzeni w e / w y mikrokontrolera lub $ 3 8 w obsza rze pamięci w e w n ę t r z n e j . Następna, to rejestr konfiguracji kierunku Direction
Register)
(Data
D D R B mający o d p o w i e d n i e adresy: $ 1 7 ($37) i ostatni -
rejestr wejściowy (Input Pius) P1NB o adresach $16 ($36). Rejestr P I N B m o że b y ć tylko o d c z y t y w a n y , P O R T B i D D R B mogą b y ć z a r ó w n o czytane j a k
i z a p i s y w a n e . Ważną cechą portu B j e s t to, że każda je
AT90S2313
g o linia m a i n d y w i d u a l n i e w y b i e r a n y rezystor podcią gający d o „plusa" zasilania (pull-up).
D o wszystkich
w y p r o w a d z e ń P O R T B m o ż n a dołączać diody LED j .
LED
e
d y n i e p o p r z e z rezystor ograniczający.
Dopuszczalna
obciążalność k a ż d e g o w y p r o w a d z e n i a P O R T B wynosi
Rys. 10.1. Przykład bezpośredniego stero
2 0 m A w stanie niskim (dla V
wania diodą LED przez
p a m i ę t a ć o tym, ż e s u m a w s z y s t k i c h prądów z portów
mikrokontroler AVR
wyjściowych nie m o ż e p r z e k r o c z y ć wartości 200 mA.
c
c
= 5 V), trzeba jednak
Bezpośrednio sterowane diody L E D p o w i n n y b y ć w ł ą c z o n e poprzez rezystor ograniczający pomiędzy plusem zasilania a p o r t e m w y j ś c i o w y m (przykłado w e sterowanie diodą L E D przedstawiono na r y s u n k u 10.1). Zaświecenie dio dy następuje p o ustawieniu na wyjściu portu n i s k i e g o p o z i o m u logicznego.
Jeśli w y p r o w a d z e n i a PBO d o P B 7 są w y k o r z y s t y w a n e jako wejścia i są zewnętrznie p o d c i ą g a n e d o dołu, t o stanowią źród ło prądu wypływającego z portu, jeśli t y l k o są uaktywnione w e w n ę t r z n e rezystory podciągające.
Jak j u ż wiemy większość Unii p o r t ó w o g ó l n e g o p r z e z n a c z e n i a pełni dodatko w e funkcje wykorzystywane d o obsługi urządzeń peryferyjnych. Znaczenie funkcji alternatywnych portu B p r z e d s t a w i o n o w t a b l i c y 10.1. Tab. 10.1. Alternatywne funkcje portu B Wyprowadzenie portu
Funkcja alternatywna
PBO
AINO (wejście nieodwracające komparatora analogowego)
PBl
AIN1 (wejście odwracające komparatora analogowego)
P83
OCi (wyjście porównania dla Timera/Licznikal)
PB5
MOSI (wejście danych dla programowania szeregowego)
PB6
MISO (wyjście danych dla programowania szeregowego)
PB7
SCK (wejście zegarowe dla programowania szeregowego)
PORTB [Port B Bata Register) - rejestr danych portu B - $ 1 8 Bit
, Z . 6 5 4 2 1 0 > I PORTB7 | PORTB6 I PORTB5 | P0RTB4 I PORTB3 | PORTB21 PORTB1 I PORTBp] PORTU Odczyttfapis R/W R/W R/W RAW RAW R/W RAW RW WartoM początkowa 0 0 o O o o n o R/W-ojnaoza odczyt/zapis u 0 0 0 o 3
S 1 S ( E 3 8
Rejestr P O R T B może b y ć zapisywany i o d c z y t y w a n y . Z a w i e r a dane we/wy.
DDRB (Port B Bata Direction Register) - rejestr kierunku portu B - $17 8 i t
7
$17 ($37) | DDB7 | Odczyt/Zapis R/W Wartość początkowa 0 R/W - oznacza odczyt/zapis
DDB6 R/W 0
6 |
5 DDB5 R/W 0
j
4 DDB4 R/W
3
2
1
0
| DDB3 | DDB2 | DDB1 ] ODBO | DDRB R/W R/W R/W R/W 0 0 0 0 0
Rejestr D D R B określa typ każdej linii portu B . Linie m o g ą b y ć skonfiguro w a n e j a k o w e j ś c i o w e lub wyjściowe. D o d a t k o w o ustawia się opcje związane z podciąganiem. Szczegóły są p o d a n e w dalszej części niniejszego rozdziału.
PINB (Port B Input Pin Address) - rejestr wejściowy portu B - $ 1 6 7 Bit $16 ($36) | PINB7 ; R Odczyt/Zapis Wartość początkowa WA P. - oznacza odczyt
6 PINB6 R
5 PINB5 R
4 PINB4 R
3 PINB3 R
2 PINB2 R
PINB1 R
0 PINBO R
N/A
N/A
N/A
N/A
N/A
N/A
N/A
1
Rejestr PINB może b y ć tylko odczytywany. J e g o zawartość odzwierciedla bez pośrednio stan wyprowadzeń mikrokontrolera przypisanych d o portu B . Fi zycznie nie j e s t to więc rejestr. Inaczej jest podczas bezpośredniego odczytu P O R T B . W ó w c z a s czytany j e s t stan zatrzasków portu B (Port B Data
Latch).
10.1.1. Port B jako cyfrowy port we/wy ogólnego przeznaczenia Jeśli poszczególne linie portu B są wykorzystywane j a k o wyprowadzenia cyfro w e ogólnego przeznaczenia, to są wzajemnie równoważne. Przyjmijmy oznacze nie PBn d o określenia n-tego wyprowadzenia portu B . Stosując dalej tę konwen cję, bit D D B n w rejestrze D D R B będzie określał kierunek wyprowadzenia PBn. Jeśli D D B n będzie ustawiony („1"), to wyprowadzenie P B n będzie skonfiguro wane j a k o wyjściowe. Jeśli D D B n będzie wyzerowany („0"), wyprowadzenie PBn będzie skonfigurowane jako wejściowe. Wyprowadzenie P B n skonfiguro wane jako wejściowe będzie się zachowywało różnie, w zależności od stanu P O R T B n . Jeśli bit P O R T B n będzie ustawiony („1"), to linia wejściowa PBn bęTab. 10.2. Wpływ ustawienia bitów DDBn i PORTBn na wyprowadzenia portu B DDBn
PORTBn
1/0
0
0
Wejście
Brak
Wysoka impedancja (high-Z)
0
1
Wejście
Jest
PBn jest źródłem prądu, jeśli jest zewnętrznie podcią gany do masy zasilania ipull-Iow)
1
0
Wyjście
Brak
Wyjście typu push-pull stan niski
1
1
Wyjście
Brak
Wyjście typu push-pull stan wysoki
Kt
;
Podciąganie pull-up
Uwagi
r
3
:
dzie miała uaktywniony M O S - o w y rezystor podciągający (pull-up). Taka konfi guracja świetnie nadaje się d o obsługi np. zewnętrznej klawiatury, różnego ro dzaju przełączników. Trzeba jednak pamiętać o ograniczonych możliwościach wewnętrznego podciągania. D o wyłączenia wewnętrznego rezystora podciągają cego należy wyzerować („0") bit P O R T B n lub skonfigurować linię PBn jako wyjściową. Po zerowaniu rnikrokontrolera port B jest ustawiany w stan wysokiej impedancji, nawet wówczas, gdy nie jest aktywny zegar systemowy. Konfigurowanie
portów
w języku
C
było
przedstawione
„przy
okazji"
w przykładzie 9 . 1 . Poniżej m o ż n a z o b a c z y ć , j a k robi się to w asemblerze. Przykład 10.1. Konfigurowanie portów mikrokontrolera w asemblerze. W charakterze ćwiczenia, dla lepszego zrozumienia programu warto rozpisać poszczególne bity w rejestrach PORTB i DDRB .include "2313def.inc" -def temp=rl7 ldi
temp,$af
out
ddrb,temp
ldi out
temp,0xc£ portb,temp
;PB0 do PB3 oraz PBS i PB7 - wyjścia PBO PB5 PB4 PB6
do PB3 wyjście wejście wejście
i PB7 wyjście w stanie wysokim w stanie niskim w stanie High-Z podciągnięte do- plusa
10.1.2. Funkcje alternatywne portu B Wyprowadzenie portu B mogą spełniać także następujące funkcje alternatywne: B 7 - S C K : wejście z e g a r o w e dla p r o g r a m o w a n i a s z e r e g o w e g o . D o tego wejścia jest doprowadzany zewnętrzny przebieg zegarowy taktujący trans ferem danych podczas szeregowego p r o g r a m o w a n i a pamięci rnikrokontrolera. B 6 - M I S O : wyjście d a n y c h d l a p r o g r a m o w a n i a s z e r e g o w e g o . Z tego wyjścia są p r z e k a z y w a n e informacje z m i k r o k o n t r o l e r a d o programa tora podczas s z e r e g o w e g o p r o g r a m o w a n i a p a m i ę c i . B 5 - M O S I : wejście danych dla programowania szeregowego. D o tego wejścia są p r z e k a z y w a n e informacje z p r o g r a m a t o r a d o mikrokont rolera podczas s z e r e g o w e g o p r o g r a m o w a n i a p a m i ę c i . B 3 - O C 1 : wyjście p r z e c h w y t y w a n i a . Wyjście O C 1 j e s t w y k o r z y s t y w a n e , gdy j e s t a k t y w n a funkcja porównywania T i m e r a / L i c z n i k a l . Pojawia się na n i m stan w y s o k i , jeśli stan Timera/Liczni kal
zrówna
się
z rejestrem
OCRIA
(tzn.
gdy
TCNTlH=OCRIAH
i T C N T l L = O C R l A L ) . W y p r o w a d z e n i e P B 3 p o w i n n o b y ć w takim p r z y p a d ku skonfigurowane j a k o wyjście. Więcej informacji p o d a n o w rozdziale 5.2. B I - A I N 1 : wejście odwracające komparatora analogowego. Jeśli w y p r o w a d z e n i e t o jest skonfigurowane j a k o wejście z w y ł ą c z o n y m p o d ciąganiem ( D D B 1 jest w y z e r o w a n e („0") i P B l j e s t w y z e r o w a n e („0")), wy p r o w a d z e n i e A I N 1 j e s t b e z p o ś r e d n i o dołączone d o odwracającego
wejścia
komparatora a n a l o g o w e g o z a w a r t e g o w strukturze mikrokontrolera. BO - AINO: w e j ś c i e n i e o d w r a c a j ą c e k o m p a r a t o r a a n a l o g o w e g o . Jeśli w y p r o w a d z e n i e to jest skonfigurowane j a k o wejście z w y ł ą c z o n y m pod ciąganiem (DDBO j e s t w y z e r o w a n e („0") i PBO j e s t w y z e r o w a n e („0")), t o w y p r o w a d z e n i e AINO j e s t b e z p o ś r e d n i o dołączone d o nieodwracającego w e j ścia k o m p a r a t o r a a n a l o g o w e g o zawartego w strukturze mikrokontrolera.
10.1.3. Budowa linii portu B N a r y s u n k a c h 10.2 d o 10.7 p r z e d s t a w i o n o schematy poszczególnych linii portu B . Ich b u d o w a w e w n ę t r z n a różni się ze w z g l ę d u na funkcje alternatyw ne. W s z y s t k i e w y p r o w a d z e n i a portu są s y n c h r o n i z o w a n e , j e d n a k ż e na rysun kach nie p o k a z a n o zatrzasków synchronizujących. Tranzystor MOS (pull-up) J r
WP; zapis do PORTB WD: zapis do DDRB RL: odczyt rejestru PORTO RP; odczyt wyprowadzenia PORTB RD: odczyt DDRB n: 0. i
Do komparatora
nu
Tran^jstof '—•] tpuTHjp}
RESET I Q R D DDB3 C
~~1 WD RESET Q f* 0 PORT63 C WP
WP: zapis do PORTB WD: zapis do DDRB P.L: odczyt rsjastnj PORTB RP: odczyt wyprowadzenia PORTB RD:: odczyt DDRB
Rys. 10.3. Schemat linii 3 portu B
(pun-up) |-J
WP; WO: RL RP: RD; n;
zapis do PORTB zapis do DDRB odczyt rejestru PORTB odczyt wyprowadzenia PORTB odczyt DDRfl 2.4
• COM1A0 Selektor trybu pracy wyjścia
• COM1A1 COMP. MATCH1
nu T
r
a
r
L
« H > (pun-op) r-lr
RESET 1
Q R D PORTBS C
t
WP
WP: WD: RL RP: RD; SPIGN:
zapis do PORTB zapis do DDRB odczyt rejestru PORTB odczyt wyprowadzenia PORTB odczyt DDRB SPI ENABLE
SPI MOSI SPIEN
Rys. 10.5. Schemat linii 5 portu B
(ptHI-up)-'
WP: zapis do PORTB WO: zapis do DDRB flL: odczyt rejestru PORTB RP: odczyt wyprowadzenia PORTB RO: odczyt DDRB SPIEN: SPI ENABLE
SPIEN SPI MISO
T
r
a
n
^ h L
< ~ t ~ l
RESET I O R D PORTB7 C WP
SPI SCK WP: zapis do PORTB WD: zapis do DDRB RL: odczy! rejestru PORTB RP: odczyl wyprowadzenia PORTB RD: odczyl DDRB SPIEN: SPI ENABLE
SPIEN
Rys. 10.7. Schemat linii 7portu B
10.2. Budowa portu D P O R T D zawiera 7 dwukierunkowych linii w e / w y . Jest o n dostępny poprzez 3 lokacje w przestrzeni w e / w y mikrokontrolera. Pierwsza lokacja to rejestr da nych (Data Register)
P O R T D - adres $ 1 2 w przestrzeni w e / w y mikrokontrole
ra lub $ 3 2 w obszarze pamięci w e w n ę t r z n e j . Następna, t o rejestr konfiguracji kierunku (Data Direction
Register)
D D R D mający o d p o w i e d n i e adresy: $11
($31) i ostatni - rejestr wejściowy (Input Pins) P I N D o adresach $10 ($30). Re jestr P I N D m o ż e być tylko odczytywany, P O R T D i D D R D m o g ą być zarówno czytane j a k i zapisywane. K a ż d a linia portu D m a indywidualnie wybierany re zystor podciągający d o góry (pull-up).
D o wszystkich w y p r o w a d z e ń PORTD
można dołączać diody L E D , jedynie poprzez rezystor ograniczający. Dopusz czalna obciążalność każdego w y p r o w a d z e n i a P O R T D w y n o s i 2 0 m A w stanie niskim (dla V
c c
= 5 V), trzeba j e d n a k p a m i ę t a ć o t y m , że s u m a wszystkich prą
dów z portów wyjściowych nie m o ż e przekroczyć wartości 200 m A . Bezpo średnio sterowane diody L E D powinny b y ć w ł ą c z o n e p o p r z e z rezystor ograniJeśli w y p r o w a d z e n i a PDO d o P D 6 są w y k o r z y s t y w a n e jako wejścia i są zewnętrznie p o d c i ą g a n e d o dołu, t o stanowią źród ł o prądu wypływającego z portu, jeśli t y l k o są uaktywnione w e w n ę t r z n e rezystory podciągające.
Tab. 10.3. Funkcje alternatywne portu D
• -CS
Wyprowadzenie portu
Funkcja alternatywna
PDO
RXD (wejście danych odbiornika UART)
PD1
TXD (wyjście danych nadajnika UART)
PD2
INTO (wejście zgłoszenia przerwania zewnętrznego INTO)
PD3
INT1 (wejście zgłoszenia przerwania zewnętrznego INT1)
PD4
TO (wejście zewnętrznego sygnału dla licznika TCO)
PD6
T1 (wejście zewnętrznego sygnału d!a licznika TC1)
PD7
iCP (wejście przechwytywania dla timera/licznika TC1)
czający p o m i ę d z y plusem zasilania a portem wyjściowym (przykład sterowania diodami L E D przedstawiono n a r y s u n k u 10.1). Dioda świeci p o wysterowaniu linii portu niskim p o z i o m e m logicznym. W s z y s t k i e linie portu D pełnią d o d a t k o w e funkcje w y k o r z y s t y w a n e d o obsłu gi urządzeń peryferyjnych, które zestawiono w t a b l i c y 1 0 3 . W p r z y p a d k u w y k o r z y s t y w a n i a poszczególnych linii portu D d o obsługi fun kcji alternatywnych, odpowiadające
i m bity konfiguracyjne
w rejestrach
D D R D i P O R T D p o w i n n y b y ć ustawione zgodnie z o p i s e m tych funkcji. PORTD [Port D Data Register) - rejestr danych portu D - $12 6 5 7 | PORTD6 PORTD5 $12 (S321 I n/w R/W Odczyt/Zapis Wartość początkowa 0 0 0 R - oznacza odczyt. R/w - oznacza odczyt/zapis
e«
R
4 PORTD4 R/W 0
1 3 2 0 P0RTD3 PORTD2 PORTD 1 PORTDO R/W R/W R/W R/W 0
0
0
0
Rejestr P O R T D m o ż e b y ć zapisywany i o d c z y t y w a n y . Z a w i e r a dane w e / w y . DDRD [Port D Data Direction Register) - rejestr kierunku portu D - $11 Btt 7 6 5 | DDD6 DDDS $11 ($31) |R/W R/W R Odczyt/Zapis Wartość początkowa 0 0 0 R - oznacza odczyt. R/W - oznacza odczyt/zapis
4 DDD4 R/W
3 DDD3 R/W
2 DDD2 R/W
1 DDD1 R/W
0 DDDO R/W
0
0
0
0
0
Rejestr D D R D określa typ każdej linii portu D . Linie m o g ą b y ć skonfiguro w a n e j a k o w e j ś c i o w e l u b wyjściowe. D o d a t k o w o ustawia się opcje związane z p o d c i ą g a n i e m . Szczegóły są p o d a n e w dalszej części rozdziału. PIND [Port D Input Pins Address) - rejestr wejściowy portu D Bit S10(S30)
7 |
-R
Odczyt/Zapis Wartość początkowa 0
]
6 PIND6 R
5 PIND5 R
4 PIND4 R
N/A
N/A
N/A
fi - oznacza odczyl, N / A - nieustalona
$10
3 PIND3 R
2 PIND2 R
1 PIND1 R
0 P1ND0 R
N/A
N/A
N/A
N/A
PIND
Rejestr P I N D może b y ć t y l k o o d c z y t y w a n y . J e g o z a w a r t o ś ć odzwierciedla b e z p o ś r e d n i o stan w y p r o w a d z e ń m i k r o k o n t r o l e r a p r z y p i s a n y c h do portu D. Fizycznie nie jest to w i ę c rejestr. Inaczej j e s t p o d c z a s
bezpośredniego
odczytu P O R T D . W ó w c z a s c z y t a n y j e s t s t a n z a t r z a s k ó w p o r t u D (Port D Dała
Latek).
10.2.1. Port D jako cyfrowy port we/wy ogólnego przeznaczenia Jeśli poszczególne linie portu D są w y k o r z y s t y w a n e j a k o wyprowadzenia cyfrowe o g ó l n e g o przeznaczenia, to są w z a j e m n i e r ó w n o w a ż n e . Przyjmijmy oznaczenie P D n do określenia n-tego w y p r o w a d z e n i a portu D . Stosując dalej tę konwencję, bit D D D n w rejestrze D D R D b ę d z i e określał kierunek wypro wadzenia P D n . Jeśli D D D n b ę d z i e u s t a w i o n y ( „ 1 " ) , t o w y p r o w a d z e n i e PDn będzie skonfigurowane j a k o wyjściowe. Jeśli D D D n b ę d z i e wyzerowany („0"), to w y p r o w a d z e n i e P D n będzie s k o n f i g u r o w a n e j a k o wejściowe. Wy prowadzenie P D n skonfigurowane j a k o w e j ś c i o w e b ę d z i e się zachowywało różnie, w zależności od stanu P O R T D n . Jeśli bit P O R T D n będzie ustawiony („1"), to linia wejściowa P D n będzie miała u a k t y w n i o n y M O S - o w y rezystor podciągający (pull-up).
Taka konfiguracja ś w i e t n i e nadaje się do obsługi np.
zewnętrznej klawiatury, r ó ż n e g o rodzaju p r z e ł ą c z n i k ó w . T r z e b a jednak pa miętać o ograniczonych m o ż l i w o ś c i a c h w e w n ę t r z n e g o podciągania. Do wy łączenia w e w n ę t r z n e g o rezystora podciągającego n a l e ż y w y z e r o w a ć („0") bit P O R T D n lub skonfigurować linię P D n j a k o wyjściową. P o zerowaniu mikro kontrolera port D j e s t ustawiany w s t a ń w y s o k i e j i m p e d a n c j i , nawet wów czas, gdy nie j e s t aktywny zegar s y s t e m o w y .
10.2.2. Funkcje alternatywne portu D W y p r o w a d z e n i e portu D m o g ą spełniać t a k ż e następujące funkcje alterna tywne: B 6 - I C P : wejście p r z e c h w y t y w a n i a d l a T i m e r a / L i c z n i k a l . Wejście ICP jest wykorzystywane, gdy jest a k t y w n a funkcja przechwytywania Timera/Licznikal. Pojawienie się na t y m w y p r o w a d z e n i u z b o c z a określonego ustawieniem bitu ICES1 w rejestrze T C C R 1 B powoduje przepisanie stanu Ti mera/Licznikal d o rejestru ICR1 (tzn. I C R 1 H = T C N T 1 H i ICR1L=TCNT1L). W y p r o w a d z e n i e P D 6 p o w i n n o b y ć w takim p r z y p a d k u skonfigurowane jako wejście. Więcej informacji p o d a n o w rozdziale 5.2.
Tab. 10.4. Wpfyw ustawienia bitów DDDn i PORTDn na wyprowadzenia portu D PORTDn
l/O
Podciąganie putl-up
0
0
Wejście
Brak
0
1
Wejście
Jest
' DDDn
Uwagi
'
Wysoka impedancja (high-Z) PDn jest źródłem prądu, jeśli jest zewnętrznie podcią gany do masy zasilania (pull-low)
1
0
Wyjście
Brak
Wyjście typu push-pull stan niski
1
1
Wyjście
Brak
Wyjście typu push-pull stan wysoki
B 5 - T l : w e j ś c i e z e g a r o w e dla T i m e r a / L i c z n i k a l . Jeśli układ Timera/Licznikal pracuje w konfiguracji licznika, zliczane są zewnęt rzne impulsy podawane do wejścia T l . Więcej informacji podano w rozdziale 5.2. B 4 - TO: wejście z e g a r o w e d l a Timera/LicznikaO. Jeśli układ Timera/LicznikaO pracuje w konfiguracji Ucznika, zliczane są zewnęt rzne impulsy podawane do wejścia TO. Więcej informacji podano w rozdziale 5.1. B 3 - I N T 1 : wejście zgłoszenia z e w n ę t r z n e g o p r z e r w a n i a I N T 1 . D o wejścia I N T 1 jest d o p r o w a d z a n y sygnał zgłoszenia przerwania zewnętrz n e g o I N T 1 . S p o s ó b g e n e r o w a n i a zgłoszenia jest określony bitami I S C 1 1 i I S C 1 0 w rejestrze M C U C R . Więcej informacji p o d a n o w rozdziale 4 . 1 0 . 2 . B 2 - INTO: wejście zgłoszenia z e w n ę t r z n e g o p r z e r w a n i a INTO. D o wejścia INTO j e s t d o p r o w a d z a n y sygnał zgłoszenia przerwania zewnętrz nego INTO. S p o s ó b g e n e r o w a n i a zgłoszenia jest określony bitami I S C 0 1 i ISCOO w rejestrze M C U C R . Więcej informacji p o d a n o w rozdziale 4.10.2. B I - T X D : wyjście danych nadajnika U A R T . Jeśli jest włączony nadajnik U A R T , to na wyjściu T X D pojawiają się szerego w o bity transmitowanych danych wraz z bitami startu i stopu. D a n e są wysyła ne od najmłodszego do najstarszego bitu, w takt zegara transmisyjnego. Pozio m y napięciowe (0...+5 V) nie nadają się d o bezpośredniego wykorzystania w interfejsie R S 2 3 2 . Wyprowadzenie T X D zostaje automatycznie skonfiguro w a n e j a k o wyjściowe, gdy tylko zostanie włączony nadajnik U A R T , niezależ nie od ustawienia bitu D D D 1 . Więcej informacji p o d a n o w rozdziale 8. BO - R X D : w e j ś c i e d a n y c h o d b i o r n i k a U A R T . Jeśli jest włączony odbiornik U A R T , d o wejścia R X D należy d o p r o w a d z i ć przebieg odbierany. Poziomy napięciowe p o w i n n y z a w i e r a ć się w przedziale 0...+5 V (dla V
c
c
= 5 V ) . O d e b r a n y przebieg z interfejsu R S 2 3 2 powinien
w i e c b y ć p o d d a n y odpowiedniej konwersji. Bity d a n y c h są odbierane w ko lejności od najmłodszego d o najstarszego, w takt zegara transmisyjnego. Wy p r o w a d z e n i e R X D zostaje a u t o m a t y c z n i e s k o n f i g u r o w a n e j a k o wejściowe, gdy tylko zostanie włączony odbiornik U A R T , niezależnie o d ustawienia bitu DDDO. Ustawienie bitu P O R T D 0 s p o w o d u j e włączenie podciągania (p f/. U
w/?)- Więcej informacji p o d a n o w rozdziale 8.
10.2.3. Budowa linii portu D N a r y s u n k a c h 10.8 d o 10.12 p r z e d s t a w i o n o schematy poszczególnych wy p r o w a d z e ń portu D . Ich b u d o w a w e w n ę t r z n a różni się ze w z g l ę d u na funkcje alternatywne. Wszystkie w y p r o w a d z e n i a p o r t u są s y n c h r o n i z o w a n e , jednakże na rysunkach nie p o k a z a n o z a t r z a s k ó w synchronizujących.
Tranzystor MOS (pull-up)
WP: zapis do PORTD WD: zapia do DDRD W.: odczyt rejestru FORTO [_ RP: odczyl wyprowadzenia PORTD RD: odczyl DDRD RXD: dane odbierano poez UART RK6N: włącza odbiór danytfi UART
Rys. 10.8. Schemat linii 0 portu D
RXEN RX0
WP: WD: RL' RP: RO: FtXD: RXEN:
zapis *> PORTD zapis do DDRD odczyl rejestru PORTD odczyt wyprowadzenia PORTD odczyt ODRO dane nadawane przez UART wtacza nadawanie danych UART
Rys. 10.9. Schemat linii 1 portu D
anzystor —u MOS |p (puH-upJ
WP; zapis do PORTO WD. zapis do DDRD RL: odczyt rejestru PORTD RP: odczyt wyprowadzania PORTD RO: odczyt DORD n: 2.3 m: 0.1
ISCml
isCmO
nu T W B
Bg>
(puii-up) r
RESET R
Q D PORTDn C
•a
— f -
Sygnał zapis do PORTD |Wybor współczynnika "zagarowy zapis do DDRD podziału dla TIMERm odczyt rejestru PORTD odczyt wyprowadzania PORTO odczyt DDRD *• CSm2 CSml CSmO m: 0,1
WP: WD: RU RP: RD; n :
5
Rys. 10.11. Schemat linii 4 i PD5 portu 0
(pull-up)
WP: WD: RL: RP: RD. ACIC: ACO:
zapis do PORTD zapis do DDRD odczytrajestruPORTD odczyl wyprowadzania PORTD odczyt DDRO sygnał włączający komparator wyjścia komparatora
Eliminator szumów
Selektor zbocza
ICNC1
ICESt
-ICF1
-ACIC -ACO
1 1 . Pamięci nieuiotne w mikrokontrolerach AVR Z a p e w n e c z ę ś ć C z y t e l n i k ó w p a m i ę t a p i e r w s z e w e r s j e m i k r o k o n t r o l e r ó w i pa mięci
stosowanych
w systemach
mikroprocesorowych.
Najpowszechniej
s z y m r o d z a j e m p a m i ę c i b y ł y w ó w c z a s układy typu U V E P R O M (Ultra EPROM).
Violet
M o ż n a je było wielokrotnie zapisywać w specjalnym programato
rze i k a s o w a ć za p o m o c ą p r o m i e n i ultrafioletowych. B y ł y w i ę c w użyciu n i e zbyt w y g o d n e , a i ich c e n a nie b y ł a niska. Pomijając p a m i ę c i O T P (One Programmable
Time
- p r o g r a m o w a n e j e d n o r a z o w o ) , nie b y ł o j e d n a k specjalnego
w y b o r u . C e n a p a m i ę c i O T P b y ł a na o g ó ! z n a c z ą c o n i ż s z a od U V E P R O M , lecz ze w z g l ę d u n a m o ż l i w o ś ć j e d n o r a z o w e g o z a p i s u zupełnie nie n a d a w a ł y się o n e d o p r a c konstrukcyjnych. W a d ą U V E P R O M - ó w b y ł a k o n i e c z n o ś ć s t o s o w a n i a n i e ł a t w e g o d o z d o b y c i a k a s o w n i k a (zawierającego l a m p ę ultra fioletową emitującą
p r o m i e n i o w a n i e o o d p o w i e d n i e j długości fali) i długi
czas k a s o w a n i a , na ogół nie krótszy niż kilkanaście d o kilkudziesięciu minut. Dzięki spopularyzowaniu pamięci Flash wszystkie te zmartwienia praktycz nie poszły w z a p o m n i e n i e . Z d o m i n o w a ł y o n e w i ę k s z o ś ć o b e c n i e p r o d u k o wanych
mikrokontrolerów,
a także
nieulotnych
pamięci
zewnętrznych.
T e c h n o l o g i a ta u m o ż l i w i a w i e l o k r o t n y z a p i s i k a s o w a n i e na d r o d z e e l e k t rycznej. Informacja zapisana w pojedynczej komórce pamięci jest reprezen t o w a n a p r z e z ilość ł a d u n k u w s t r z y k n i ę t e g o d o o b s z a r u t z w .
pływającej
bramki zmodyfikowanego nieco - w stosunku do rozwiązań typowych
-
t r a n z y s t o r a M O S ( r y s u n e k 11.1). W s t r z y k n i ę t y ł a d u n e k j e s t z a t r z y m y w a n y Pływająca bramka
\
?
1
\
9* !e@©i ? iseea
Rys. 11.1. Zasada działania komórki pamięciowej w technologii Flash
na stale w s k u t e k pułapki p o t e n c j a ł o w e j . M ó w i ą c p r o ś c i e j „nie m a siły", aby u w o l n i ć się o d otaczającej g o bariery p o t e n c j a ł u . D o p r o w a d z a j ą c dostatecz nie w y s o k i e i o d p o w i e d n i o
spolaryzowane
napięcie d o
poszczególnych
elektrod tranzystora m o ż n a j e d n a k s p o w o d o w a ć o d p ł y w ł a d u n k u z obszaru pływającej bramki, t y m s a m y m s k a s o w a ć p a m i ę ć (lub z a p r o g r a m o w a ć , zależy od przyjętej k o n w e n c j i ) . N a świecie - j a k w i e m y - n i e m a rzeczy ide alnych. Z a w s z e p o d c z a s k a s o w a n i a m o ż e w o b s z a r z e pływającej bramki p o z o s t a w a ć p e w i e n s z c z ą t k o w y ł a d u n e k . Z drugiej s t r o n y , m i m o bariery potencjałów p o j e d y n c z e ładunki m o g ą w p e w n y c h o k o l i c z n o ś c i a c h opusz czać o b s z a r pływającej b r a m k i . S k u m u l o w a n i e t y c h e f e k t ó w spowoduje, że p o p i e r w s z e kolejny cykl k a s o w a n i a / p r o g r a m o w a n i a p a m i ę c i Flash może się nie udać, p o drugie z a p r o g r a m o w a n a p a m i ę ć r o z p r o g r a m u j e się sama po p e w n y m czasie. Liczba cykli k a s o w a n i a / z a p i s u oraz c z a s utrzymywania za wartości pamięci są na szczęście wystarczające d o p r a k t y c z n y c h zastosowań. Trzeba tu w s p o m n i e ć o j e s z c z e i n n y m rodzaju p a m i ę c i nieulotnej jakim jest p a m i ę ć E E P R O M . T e n rodzaj pamięci r ó w n i e ż p o z w a l a n a zachowanie da nych p o wyłączeniu zasilania i nie w y m a g a d o d a t k o w y c h urządzeń do kaso wania. W mikrokontrolerach, w t y m w A V R - a c h , p a m i ę ć E E P R O M jest wy korzystywana j a k o pamięć d a n y c h , które p o w i n n y b y ć z a c h o w a n e po wyłą czeniu zasilania. T y p o w e jej zastosowania to p r z e c h o w y w a n i e parametrów konfiguracyjnych, opcji p r o g r a m u itp. R e a s u m u j ą c : w m i k r o k o n t r o l e r a c h A V R z a s t o s o w a n e są j e d n o c z e ś n i e dwa rodzaje p a m i ę c i nteulotnych. P a m i ę ć F l a s h - pełniąca r o l ę pamięci progra m u i pamięć E E P R O M - służąca d o p r z e c h o w y w a n i a p a r a m e t r ó w programu, a także p e w n y c h informacji d o t y c z ą c y c h k o n f i g u r a c j i s a m e g o mikrokontro lera. P r o g r a m o w a n i e obu r o d z a j ó w p a m i ę c i m o ż e się o d b y w a ć bezpośred nio w s y s t e m i e (bez k o n i e c z n o ś c i p r z e n o s z e n i a m i k r o k o n t r o l e r a d o progra matora).
11.1. Bity zabezpieczające pamięć programu i danych W mikrokontrolerze
AT90S2313
zastosowano
dwa
bity
zabezpieczające
(Lock Bits), za pomocą których ustawia się stopień o c h r o n y danych zapisa nych w pamięci nieulotnej mikrokontrolera, czyli w p a m i ę c i Flash oraz E E P R O M . P o d c z a s p r o g r a m o w a n i a p a m i ę c i m i k r o k o n t r o l e r a bity zabezpie czające m o ż n a pozostawić n i e z a p r o g r a m o w a n e („1") lub zaprogramować je
Tab. 11.1. Ochrona pamięci mikrokontrolera za pomocą bitów zabezpieczających Tryb
Bity zabezpieczające Typ zabezpieczenia L81 L82
1
1
1
Pamięć niezabezpieczona
2
0
1
Zapis pamięci Flash i EEPROM zablokowany' '
3
0
0
Zapis i weryfikacja pamięci Flash i EEPROM zablokowana
1
Uwaga: <" Podczas programowania równoległego zostaje zablokowana również możliwość późniejszego programo wania bitów konfiguracyjnych. Jeśli zachodzi taka konieczność, to bity konfiguracyjne {Fuse Bits) powinny być zaprogramowane przed bitami zabezpieczającymi {Lock Bits).
(„O")- Z n a c z e n i e p o s z c z e g ó l n y c h kombinacji z e s t a w i o n o w t a b l i c y 1 1 . 1 . K a s o w a n i e b i t ó w zabezpieczających m o ż e b y ć p r z e p r o w a d z o n e tylko p o d c z a s k a s o w a n i a całej p a m i ę c i . O p r ó c z bitów z a p e z p i e c z j ą c y c h p a m i ę ć p r o g r a m u i nieulotną p a m i ę ć d a n y c h występują j e s z c z e bity n a z y w a n e w d o k u m e n t a c j i źródłowej Fuse Bits, które z racji p e ł n i o n y c h przez nie funkcji p o w i n n o się raczej n a z y w a ć b i t a m i k o n f i g u r a c y j n y m i .
11.2. Bity konfiguracyjne W m i k r o k o n t r o l e r z e A T 9 0 S 2 3 1 3 z a s t o s o w a n o d w a bity konfiguracyjne
(Fu
se Bits): S P I E N i F S T R T . Ich funkcje są następujące: - Jeśli bit konfiguracyjny S P I E N j e s t z a p r o g r a m o w a n y ( „ 0 " ) , t o m o ż l i w e j e s t s z e r e g o w e p r o g r a m o w a n i e u k ł a d u . B i t konfiguracyjny S P I E N j e s t d o m y ś l nie p r o g r a m o w a n y („0"). - Z a p r o g r a m o w a n i e bitu konfiguracyjnego F S T R T ( „ 0 " ) p o w o d u j e u s t a w i e nie k r ó t k i e g o czasu restartu (start-up).
Na r y s u n k u 4.22 przedstawiono
b l o k z e r o w a n i a mikrokontrolera. J a k n a n i m w i d a ć , sygnał z e r o w a n i a p r z e rzutnika generującego i m p u l s zerujący j e s t p o b i e r a n y z wyjścia Q 7 lub Q 1 3 licznika. Z a p r o g r a m o w a n i e tego bitu konfiguracyjnego p o w o d u j e u a k t y w nienie wyjścia Q 7 , t y m s a m y m skrócenie czasu restartu z 16 m s d o o k . 0,28 m s ( t y p o w o ) . D o m y ś l n ą wartością bitu konfiguracyjnego F S T R T j e s t „ 1 " (bit konfiguracyjny n i e z a p r o g r a m o w a n y ) , j e d n a k ż e układ m o ż e b y ć d o starczany n a żądanie z wartością d o m y ś l n ą „ 0 " .
[*•
U s t a w i a n i e b i t ó w konfiguracyjnych nie j e s t m o ż l i w e p o d c z a s
'UH
programowania szeregowego.
11.3. Sygnatury Wszystkie mikrokontrolery z rodziny A V R mają 3-bajtową sygnaturę identyfi kującą typ układu. Sygnatura m o ż e b y ć odczytywana z a r ó w n o podczas progra mowania równoległego, j a k i szeregowego. Dzięki temu, p o d c z a s programowa nia można w wielu sytuacjach uniknąć błędu m o g ą c e g o uszkodzić układ. Roz mieszczenie sygnatur w mikrokontrolerze A T 9 0 S 2 3 1 3 w y g l ą d a następująco: 1. $ 0 0 0 : - $ 1 E (identyfikator produktu A t m e l a ) , 2 . $ 0 0 1 : - $91 (identyfikator 2 kB pamięci F l a s h ) , 3. $002: - $ 0 1 (identyfikator układu A T 9 0 S 2 3 1 3 , jeśli sygnatura $001 ma wartość $ 9 1 ) . Jeśli bity zabezpieczające są ustawione w t r y b i e 3 (oba zaprogramowane), to odczyt sygnatur jest z a b l o k o w a n y w trybie s z e r e g o w y m . Zwracane będą w t y m przypadku wartości $ 0 0 , $01 i $ 0 2 .
11.4. Programowanie pamięci Flash i EEPROM W układzie A T 9 0 S 2 3 1 3 zastosowano 2 k B p a m i ę ć Flash i 128 B pamięć da nych typu E E P R O M (obie p r o g r a m o w a n e w systemie). Układy są dostarczane z pamięciami fabrycznie w y k a s o w a n y m i (zawartość każdej komórki = $FF) i gotowymi d o zaprogramowania. W strukturze mikrokontrolera znajdują się wszystkie w y m a g a n e do programowania bloki funkcjonalne, w t y m pompy ła dunkowe wytwarzające niezbędne napięcia programujące o wartości większej od napięcia zasilającego. Są o n e wykorzystywane podczas programowania ISP, natomiast programowanie równoległe w y m a g a dostarczenia z zewnątrz napię cia +12 V. Z a r ó w n o pamięć programu, j a k i E E P R O M są programowane bajt p o bajcie, niezależnie od sposobu programowania. W a r t o ś c i napięcia zasilają c e g o mikrokontrolera A T 9 0 S 2 3 I 3 podczas p r o g r a m o w a n i a powinna zawierać się
przedziałach:
2,7...6,0 V (podczas
programowania
szeregowego)
lub
4,5...5,5 V (podczas programowania równoległego).
11.4.1. Programowanie równolegle P r o g r a m o w a n i e równoległe j e s t t y m t r y b e m p r o g r a m o w a n i a , który udostęp nia wszystkie możliwe opcje, w t y m k a s o w a n i e bitów konfiguracyjnych i bi tów zabezpieczających. Niestety konieczne j e s t d o p r o w a d z e n i e napięcia ze w n ę t r z n e g o + 1 2 V i sterowanie niemal w s z y s t k i c h
wyprowadzeń
układu.
Z tego względu programowanie odbywa
się
w specjalnie
programatorze. Pewne standardowe
funkcje
i nazwy wyprowadzeń mikrokontrolera ule gają z m i a n i e p o d c z a s p r o g r a m o w a n i a noległego.
Opisano
je
w tablicy
rów
11.2,
s c h e m a t ilustrujący s p o s ó b dołączenia nałów
wykorzystywanych
+sv
równolegle
skonstruowanym
podczas
a
syg
AT90S2313 +t2V RDY/BSY OE WR BS XAO XA1
RESET • POI * PD2 PD3 PD4 - PD5 - PD6 J~L—- XTAL1
11.2.
W y p r o w a d z e n i a n i e ujęte w tej t a b l i c y (i n a r y s u n k u ) n i e są w y k o r z y s t y w a n e .
Dane
GND
progra
mowania przedstawiono na r y s u n k u
VCC PBO...7
Rys. 11.2. Funkcje wyprowadzeń mikrokontrolera AT90SZ313 podczas programowania równoległego
Tab. 11.2. Opis funkcji wyprowadzeń mikrokontrolera AT90S2313 podczas programowania równoległego Nazwa sygnału
Nazwa wyprowadzenia
Typ wyprowadzenia
rdy/b5v
PD1
Wy
0: układ zajęty (programowanie) 1: układ gotowe do przyjęcia nowego polecenia Odblokowanie buforów wyjściowych (aktywny stan niski)
OT
BS
Funkcja
PD2
We
PD3
We
Impuls zapisu (aktywny stan niski)
PD4
We
Wybór bajtu („0" - wybierz młodszy bajt; „ 1 " - w y b i e r z starszy bajt
XA0
PD5
We
XTAL BitO (patrz tablica 11.3)
XA1
PD6
We
XT AL Bit 1
DATA
PB7...0
We/Wy
Dwukierunkowa szyna danych (wyjściowa dla OT w stanie niskim)
Tab. 11.3. Kodowanie operacji za pomocą bitów XA1 iXA0 XA1
XA0
Operacja wykonana po wystąpieniu impulsu na wejściu XTALT
0
0
Ładuj adres pamięci Flash lub (EEPROM) (starszy lub młodszy bajt, zależnie od ustawienia BS)
0
1
Ładuj daną (starszy lub młodszy bajt, zależnie od ustawienia BS)
1
0
Ładuj polecenie (patrz tablica 11.4)
1
1
Bez akcji, stan W/e
Tab. 11.4. Kody poleceń wykorzystywanych podczas programowania pamięci nieulotnych Bajt polecenia (postać binarna)
Akcja
1000 0000
Kasowanie pamięci
0100 0000
Zapis bitów konfiguracyjnych
0010 0000
Zapis bitów zabezpieczających
0001 0000
Zapis pamięci Flash
0001 0001
Zapis pamięci EEPROM
0000 1000
Czytanie bajtów sygnatury
0000 0100
Czytanie bitów konfiguracyjnych i bilów zabezpieczających
0000 0010
Czytanie pamięci Flash
0000 0011
Czytanie pamięci EEPROM
>
;
Wprowadzenie układu w tryb programowania Każde rozpoczęcie p r o g r a m o w a n i a r ó w n o l e g ł e g o m u s i b y ć poprzedzone wy k o n a n i e m poniższej sekwencji działań: 1. D o p r o w a d ź napięcie zasilające d o w y p r o w a d z e ń V
c
i G N D mikrokont
c
rolera. 2. Ustaw w y p r o w a d z e n i a R E S E T i B S w stan niski ( „ 0 " ) i o d c z e k a ć co naj mniej 100 n s . 3 . D o p r o w a d ź napięcie 11,5.-12,5 V d o w y p r o w a d z e n i a R E S E T . Jakakol wiek z m i a n a stanu na wejściu BS w ciągu 100 ns p o ustaleniu się napięcia + 1 2 V na wejściu R E S E T spowoduje błąd w p r o w a d z e n i a w stan progra mowania.
Kasowanie pamięci (Chip Erase) Polecenie Chip Erase powoduje s k a s o w a n i e p a m i ę c i F l a s h i E E P R O M , a tak że bitów zabezpieczających. Bity zabezpieczające nie ulegają zmianie dopóki pamięci Flash i E E P R O M nie zostaną c a ł k o w i c i e s k a s o w a n e . Bity konfigura cyjne nie ulegają z m i a n i e . P r z e d w y k o n a n i e m r e p r o g r a m o w a n i a pamięci Flash i E E P R O M musi b y ć w y k o n a n e p o l e c e n i e Chip
Erase.
Ładowanie polecenia Chip Erase 1. Ustaw X A 1 na „ 1 " , X A 0 n a „ 0 " w celu u m o ż l i w i e n i a z a ł a d o w a n i a polece nia. 2 . Ustaw B S n a „0". 3. Ustaw D A T A na „1000 0 0 0 0 " (kod p o l e c e n i a Chip 4 . D o p r o w a d ź impuls y \ 5. D o p r o w a d ź
impuls
Erase).
na wejście X T A L 1 . Nastąpi ł a d o w a n i e polecenia.
~\_s d o wejścia
WR
o czasie
trwania
równym
5...15 m s w celu w y k a s o w a n i a pamięci. Fakt z a k o ń c z e n i a kasowania nie jest sygnalizowany s y g n a ł e m na wyjściu R D Y / B U S Y .
Programowanie pamięci Flash A : Ładuj polecenie Write
Flash
1. Ustaw X A 1 na „ 1 " , X A 0 na „ 0 " w c e l u u m o ż l i w i e n i a załadowania po lecenia. 2. Ustaw B S na „0". 3. Ustaw D A T A na „0001 0 0 0 0 " (kod p o l e c e n i a Write
Flash).
4 . D o p r o w a d ź impuls s~L na wejście X T A L I . Nastąpi załadowanie pole cenia.
B: Ładuj starszy bajt adresu 1. U s t a w X A I na „O", XAO na „O" w celu u m o ż l i w i e n i a z a ł a d o w a n i a a d resu. 2 . U s t a w B S na „1" ( w y b ó r starszego bajtu). 3 . U s t a w na liniach D A T A starszy bajt adresu ( $ 0 0 . . . $ 0 3 ) . 4 . D o p r o w a d ź impuls_f~L
n
a
wejście X T A L 1 . Nastąpi ł a d o w a n i e adresu.
C: Ładuj m ł o d s z y bajt adresu 1. U s t a w X A 1 na „ 0 " , X A 0 n a „ 0 " w celu u m o ż l i w i e n i a z a ł a d o w a n i a ad resu. 2 . U s t a w B S na „ 0 " ( w y b ó r m ł o d s z e g o bajtu). 3 . U s t a w n a liniach D A T A m ł o d s z y bajt adresu ( $ 0 0 . . . $ F F ) . 4 . D o p r o w a d ź i m p u l s _r~L na wejście X T A L 1 . Nastąpi ł a d o w a n i e adresu. D: Ładuj m ł o d s z y bajt danej 1. U s t a w X A 1 n a „ 0 " , X A 0 na „ 1 " w celu u m o ż l i w i e n i a z a ł a d o w a n i a da nej. 2. U s t a w n a liniach D A T A m ł o d s z y bajt danej ( $ 0 0 . . . $ F F ) . 3 . D o p r o w a d ź i m p u l s _n_ na wejście X T A L 1 . Nastąpi ł a d o w a n i e m ł o d s z e g o bajtu danej. E: Zapisz m ł o d s z y bajt danej 1. U s t a w B S na „ 0 " ( w y b ó r m ł o d s z e g o bajtu). 2 . D o p r o w a d ź i m p u l s "LJ" na wejście X T A L 1 . Nastąpi r o z p o c z ę c i e p r o g r a m o w a n i a bajtu d a n e j . Wyjście R D Y / B U S Y wejdzie w stan niski (.,0"). 3 . C z e k a j d o p ó k i na wyjściu R D Y / B U S Y b ę d z i e p a n o w a ł stan niski. Z m i a n a stanu na w y s o k i o z n a c z a g o t o w o ś ć d o p r o g r a m o w a n i a n a s t ę p n e g o bajtu ( r y s u n e k 11.2). F: Z a p i s z starszy bajt danej 1. U s t a w X A 1 n a „ 0 " , X A 0 na „ 1 " w celu u m o ż l i w i e n i a z a ł a d o w a n i a da nej. 2 . U s t a w n a liniach D A T A starszy bajt danej ( $ 0 0 . . . $ F F ) . 3 . D o p r o w a d ź i m p u l s J"T_ n a wejście X T A L I . Nastąpi ł a d o w a n i e starsze g o bajtu danej. G: Z a p i s z starszy bajt danej 1. U s t a w B S na „ 1 " ( w y b ó r starszego bajtu). 2. D o p r o w a d ź i m p u l s \ J n a wejście X T A L 1 . Nastąpi r o z p o c z ę c i e p r o g r a m o w a n i a bajtu danej. Wyjście R D Y / B U S Y wejdzie w stan niski C.,0").
data
ZXZEXHS>^1SX^SX
IX
DATA HI
XI
XA1 _ / XA0 BS XTA11
*K
~W
ROYyBSY 12V
6E*
flys. 77.3. Przebiegi podczas programowania pamięci Flash
3. Czekaj dopóki na wyjściu R D Y / B U S Y b ę d z i e p a n o w a ł stan niski. Z m i a n a stanu na w y s o k i o z n a c z a g o t o w o ś ć d o p r o g r a m o w a n i a następ nego bajtu ( r y s u n e k 1 1 3 ) . Z a ł a d o w a n e polecenia i adresy pozostają z a c h o w a n e p o d c z a s wykonywania operacji p r o g r a m o w a n i a . E f e k t y w n e p r o g r a m o w a n i e p o w i n n o w i ę c uwzględ niać kilka następujących zasad (dotyczą o n e p r o g r a m o w a n i a pamięci Flash i E E P R O M oraz czytania pamięci Flash, E E P R O M i b a j t ó w sygnatur): - K o d polecenia powinien b y ć ł a d o w a n y t y l k o raz, g d y m a m y d o czynienia z kolejnym z a p i s e m lub o d c z y t e m wielu lokacji p a m i ę c i . ~ Starszy bajt adresu powinien b y ć ł a d o w a n y t y l k o raz p r z e d zmianą 256-slowowej strony pamięci Flash. - Należy unikać zapisu danej o wartości $ F F . W a r t o ś ć t a k a j e s t wprowadzana d o pamięci Flash podczas operacji k a s o w a n i a .
Odczyt pamięci Flash Algorytm odczytu pamięci Flash jest następujący (zasady ł a d o w a n i a poleceń i adresów są takie s a m e j a k w punkcie Programowanie 1. A: Ląduj polecenie „ 0 0 0 0 0 0 1 0 " (Read
pamięci
Flash):
Flash).
2. B: Ładuj starszy bajt adresu ($00...$03). 3. C: Ładuj m ł o d s z y bajt adresu ($00...$FF). 4 . Ustaw O E na „ 0 " i B S na „0". M ł o d s z y bajt s ł o w a d a n y c h m o ż e być teraz odczytany z linii D A T A . 5 . U s t a w BS na „ 1 " . Starszy bajt słowa d a n y c h m o ż e b y ć teraz odczytany z linii D A T A . 6. U s t a w O E na „ 1 " .
Programowanie pamięci EEPROM A l g o r y t m p r o g r a m o w a n i a p a m i ę c i E E P R O M jest następujący (zasady łado w a n i a p o l e c e ń i a d r e s ó w są takie s a m e j a k w p u n k c i e Programowanie ci
pamię
Flash):
1. A : Ładuj polecenie „0001 0 0 0 1 " (Write
EEPROM).
2. C : Ładuj m ł o d s z y bajt adresu ($00...$7F). 3 . D: Ładuj m ł o d s z y bajt danej ($00...$FF). 4 . E : Z a p i s z m ł o d s z y bajt danej.
Odczyt pamięci EEPROM A l g o r y t m o d c z y t u pamięci E E P R O M j e s t następujący (zasady ł a d o w a n i a p o leceń i a d r e s ó w są takie s a m e j a k w p u n k c i e Programowanie 1. A : Ładuj polecenie „ 0 0 0 0 0 0 1 1 " (Read
pamięci
Flash):
EEPROM).
2. C : Ładuj m ł o d s z y bajt adresu ($00...$7F). 3. U s t a w O E na „ 0 " i B S na „ 0 " . D a n a z pamięci E E P R O M m o ż e b y ć teraz o d c z y t a n a z linii D A T A . 4. Ustaw O E na „ 1 " .
Programowanie bitów konfiguracyjnych (Fuse Bits) A l g o r y t m p r o g r a m o w a n i a bitów konfiguracyjnych j e s t następujący ł a d o w a n i a p o l e c e ń są takie s a m e j a k w p u n k c i e Programowanie
(zasady pamięci
Flash): 1. A : Ładuj polecenie o k o d z i e „ 0 1 0 0 0 0 0 0 " (Write Fuse
Bits).
2. D : Ładuj m ł o d s z y bajt danej (zawierającej informacje o p o s z c z e g ó l n y c h bitach konfiguracyjnych). W a r t o ś c i są z a k o d o w a n e na bitach: -
bit 5 - bit konfiguracyjny S P I E N ,
-
bit 0 - bit konfiguracyjny F S T R T ,
-
bity 7...6 i 4...1 = „ 1 " (bity te w układzie A T 9 0 S 2 3 1 3 stanowią r e z e r w ę i p o w i n n y p o z o s t a ć w stanie „ 1 " ) .
U w a g a ! W a r t o ś ć „ 0 " bitu oznacza, ż e j e s t o n z a p r o g r a m o w a n y , „ 1 " z a ś , że j e s t n i e z a p r o g r a m ó w a n y . 3. D o p r o w a d ź i m p u l s _n_
d o w e j ś c i a W R o c z a s i e t r w a n i a r ó w n y m 1... 1,8
m s w c e l u z a p r o g r a m o w a n i a bitu konfiguracyjnego.
Fakt
zakończenia
p r o g r a m o w a n i a nie j e s t s y g n a l i z o w a n y s t a n e m „ I " na wyjściu BUSY.
RDY/
Programowanie bitów zabezpieczających (Lock Bits) Algorytm p r o g r a m o w a n i a bitów zabezpieczających jest następujący (zasady ładowania poleceń są takie s a m e j a k w p u n k c i e Programowanie
pamięci
Flash): 1. A: Ładuj polecenie o k o d z i e „ 0 0 1 0 0 0 0 0 " (Write Lock
Bits).
2. D: Ładuj młodszy bajt danej (zawierającej informacje o poszczególnych bitach zabezpieczających). Bity zabezpieczające są p r o g r a m o w a n e war tością „ 0 " na pozycjach: -
bit 2 - L o c k Bit2
-
bit I - L o c k B i t l ,
-
f
bity 7...3 i 0 = „ 1 " (bity te stanowią r e z e r w ę i p o w i n n y pozostać w sta nie „ I " ) .
3. E: Zapisz m ł o d s z y bajt danej. Bity zabezpieczające m o g ą b y ć k a s o w a n e t y l k o p o p r z e z k a s o w a n i e pamięci (Chip
Erase).
Odczyt bitów konfiguracyjnych i bitów zabezpieczających A l g o r y t m odczytu bitów konfiguracyjnych
i bitów zabezpieczających jest
następujący (zasady ładowania poleceń są takie s a m e j a k w p u n k c i e Progra mowanie
pamięci
Flash):
1. A: Ładuj polecenie o k o d z i e „ 0 0 0 0 0 1 0 0 " (Ręad Fuse and Lock
Bits).
2. Ustaw O E na „ 0 " i B S n a „ 1 " . Stan b i t ó w zabezpieczających i bitów za bezpieczających może b y ć teraz o d c z y t a n y z linii D A T A ( „ 0 " oznacza stan z a p r o g r a m o w a n y ) : - b i t 7 - L o c k Bitl, - bit 6 - L o c k B i t 2
f
- bit 5 - bit konfiguracyjny S P I E N , - bit 0 - bit konfiguracyjny F S T R T . 3. Ustaw O E na „ 1 " .
Odczyt bajtów sygnatury A l g o r y t m o d c z y t u bajtów sygnatury j e s t następujący (zasady ł a d o w a n i a p o l e c e ń i adresu są takie s a m e j a k w p u n k c i e Programowanie
pamięci
1. A : Ładuj polecenie o k o d z i e „ 0 0 0 0 1 0 0 0 " (Read Signature
Flash): Bytes).
2. C: Ładuj m ł o d s z y bajt adresu (S00...S7F). 3. U s t a w O E na „ 0 " i B S n a „ 0 " . Stan w y b r a n e g o bajtu sygnatury m o ż e b y ć teraz o d c z y t a n y z linii D A T A . 4 . U s t a w O E na „ 1 " .
11.4.2. Programowanie szeregowe Pamięć
programu
(Flash)
i nieulotna
pamięć danych ( E E P R O M ) mikrokontro lera mają r o z d z i e l n e przestrzenie a d r e s o
2,7...6,0V AT90S2313 Sygnał _ zerowania
RESET
Sygnał zegarowy
XTAL1
w e : S 0 0 0 0 . . . S 0 3 F F (Flash) i $ 0 0 0 . . . $ 0 7 F ( E E P R O M ) . O b y d w a obszary m o g ą b y ć
VCC PB7 PB6 PB5
SCK MISO MOSI
p r o g r a m o w a n e przy w y k o r z y s t a n i u inter fejsu SPI ( r y s u n e k 11.4), który zawiera linie: S C K , M O S I (wejście), M I S O (wyj ście). A b y r o z p o c z ą ć mowanie
pamięci,
GND
kasowanie/progra
linia
RESET
musi
znajdować się w stanie niskim. P o speł
Rys. 11.4. Funkcje wyprowadzeń mikro
nieniu tego w a r u n k u n i e z b ę d n e j e s t w y
kontrolera AT90S2313 podczas progra
k o n a n i e p o l e c e n i a Programming
mowania szeregowego (w systemie)
Enable
( z e z w o l e n i e n a p r o g r a m o w a n i e ) , zapobiegające e w e n t u a l n e m u p r z y p a d k o w e m u wejściu w tryb p r o g r a m o w a n i a . Przed r o z p o c z ę c i e m zapisu d a n y c h d o p a m i ę c i E E P R O M j e s t w y k o n y w a n y a u t o m a t y c z n y cykl k a s o w a n i a , w y k o rzystujący układ w e w n ę t r z n e g o t a k t o w a n i a . N i e j e s t w i ę c k o n i e c z n e w y w o ł a nie
polecenia
Chip
Erase.
Operacja
kasowania
powoduje
wypełnienie
wszystkich k o m ó r e k p a m i ę c i wartością $ F F . Z e w n ę t r z n y p r z e b i e g z e g a r o w y m o ż e b y ć d o p r o w a d z o n y d o wejścia X T A L 1 . M o ż n a r ó w n i e ż w y k o r z y s t y w a ć w b u d o w a n y w m i k r o k o n t r o l e r oscylator, współpracujący z r e z o n a t o r e m k w a r c o w y m d o ł ą c z o n y m d o k o ń c ó w e k X T A L 1 i X T A L 2 . N a p r z e b i e g taktu j ą c y operację zapisu d o p r o w a d z o n y p o p r z e z wejście S C K , nałożone są p e w n e w y m a g a n i a . C z a s y t r w a n i a tak stanu niskiego, j a k i w y s o k i e g o tego p r z e biegu p o w i n n y b y ć dłuższe od d w ó c h o k r e s ó w X T A L 1 .
Algorytm programowania szeregowego Podczas szeregowego przesyłania danych d o m i k r o k o n t r o l e r a AT90S2313, dane są o d c z y t y w a n e na narastającym z b o c z u zegara S C K . Odbiór danych z mikrokontrolera jest natomiast taktowany z b o c z e m o p a d a j ą c y m . Szczegóły przedstawiono na r y s u n k u 11.5 oraz w t a b l i c y 11.5. D o p r o g r a m o w a n i a i weryfikacji pamięci w y k o r z y s t y w a n e są 4-bajtowe pole cenia, których format przedstawiono w t a b l i c y 11.5. Z a l e c a n a jest następują ca procedura: 1. Po włączeniu zasilania należy d o p r o w a d z i ć napięcie zasilające do wypro wadzeń V c c i G N D , utrzymując przez ten c z a s linie R E S E T i S C K w stanie niskim. Jeśli rezonator k w a r c o w y nie j e s t d o ł ą c z o n y d o k o ń c ó w e k XTAL1 i X T A L 2 , należy zastosować zewnętrzny p r z e b i e g z e g a r o w y doprowadzony d o wejścia X T A L I . W wielu sytuacjach nie m o ż n a z a g w a r a n t o w a ć utrzyma nia linii S C K w stanie niskim, zanim n a p i ę c i e zasilające osiągnie odpowied nią wartość. W takich p r z y p a d k a c h należy w y g e n e r o w a ć d o d a t n i impuls na linii R E S E T przez c o najmniej d w a okresy zegara X T A L 1 , p o których linia S C K powinna zostać w y z e r o w a n a („0"). 2. Po odczekaniu 2 0 m s należy przesłać d o m i k r o k o n t r o l e r a za pomocą linii M O S I (PB5) polecenie Programming
Enable.
3. P r o g r a m o w a n i e s z e r e g o w e nie będą działać, jeśli nie nastąpi synchroniza cja transmisji p o m i ę d z y p r o g r a m a t o r e m i m i k r o k o n t r o l e r e m . W stanie synchronizmu, drugi bajt polecenia Programming
Enable
($53)
spowoduje
zwrócenie trzeciego bajtu d o programatora ( e c h o ) . J e d n a k b e z względu na to, czy odebrane e c h o będzie p o p r a w n e , czy n i e , w s z y s t k i e cztery bajty polece nia muszą b y ć przesłane d o mikrokontrolera. Jeśli o d e b r a n e e c h o będzie nie p o p r a w n e , należy p o d a ć dodatni impuls S C K i p o n o w n i e w y s ł a ć polecenie Programming
Enable. Brak p o p r a w n e j o d p o w i e d z i p o k o d z i e $ 5 3 utrzymują
cy się w 32 próbach nawiązania synchronizacji o z n a c z a , że występują proble m y z p r o g r a m o w a n y m mikrokontrolerem, b ą d ź z p o ł ą c z e n i e m pomiędzy nim a programatorem.
Szeregowe wejście danych PB5 (MOSI) Szeregowe wyjście danych PB6 (MISO) Sygnał taktujący PB7 (SCK)
_ i U ! J l J L J L J T _ r L r L _
Rys. 11.5. Przebiegi charakteryzujące programowanie szeregowe mik
Tab. 11.5. Formaty poleceń wykorzystywanych podczas programowania szeregowego pamięci Flash i EEPROM Polecenie ba)t1 Zezwolenie na
Format polecenia bajt 2 bajt 3
1010 1100
0101 0011
Operacja bajt 4 1
raxxxxx
xxxxxxxx
Zezwolenie na programowanie szerego we, jeśli linia RESET jest w stanie
programowanie
niskim 1010 1100
100xxxxx
xxxxxm
Czytanie pamięci Programu 0010 H000
xxxxxxaa
bbbb bbbb
Zapis pamięci Programu
0100 H000
xxxx xxaa
bbbb bbbb
i i i i t t i i Zapis H bajtu pamięci pod adres a.b
Czytaj pamięć EEPROM
1010 0000
xxxxxxxx
xbbb bbbb
0 0 0 0 0 0 0 5 Czytanie danej z pamięci EEPROM spod
Zapis pamięci EEPROM
1100 0000
xxxx xxxx
xbbb bbbb
i i i i i i i i Zapis danej do pamięci EEPROM pod
Zapis bitów
10101100
111xx21x
xxxxxxxx
xxxxxm
Kasowanie pamięci
xxxxxxxx
Kasowanie pamięci Flash i EEPROM
oooo oaoo Czytanie H bajtu pamięci spod adresu arb -
adresu b
adres b Zapis bitów zabezpieczających. W celu zaprogramowania danego bitu zabezpie
zabezpieczających
czającego należy wyzerować odpowia dający mu b i t l lub2(1.2="0") Czytaj bajty sygnatury
0011 0000
xxxxxxxx
xxxxxxbb
1
oooo oooo Czytaj bajt sygnatury spod adresu bb' '
Uwagi: 1
i '
Odczyt bajtów sygnatury nie jest możliwy, gdy ustawiono tryb 3 zabezpieczenia pamięci nieulotnej (gdy obydwa bity są zaprogramowane), Odblokowanie tej opcji można wykonać jedynie poprzez programowanie równolegle. a=starsze bity adresu b=m!odsze bity adresu H=0 - młodszy bajt, H = 1 - starszy bajt o=dane wyjściowe i=dane wejściowe x=wartość bitu bez znaczenia 1 = b i t zabezpieczający 1 2 = b i t zabezpieczający 2
4 . J e ś l i w y k o n a n o p o l e c e n i e Chip Erase
(jest
obowiązkowe podczas progra
m o w a n i a p a m i ę c i F l a s h ) , n a l e ż y o d c z e k a ć 8...18 m s ( c z a s z a l e ż y m . i n . o d na pięcia zasilania), po c z y m w y g e n e r o w a ć dodatni impuls na wejściu
RESET
i rozpocząć działania od kroku 2. 5. D o z a p r o g r a m o w a n i a k a ż d e g o b a j t u p a m i ę c i F l a s h i E E P R O M jest
przesianie jego
adresu
oraz
zawartości.
Każda
komórka
niezbędne w
pamięci
E E P R O M j e s t przed zapisaniem nowej wartości k a s o w a n a . Przejście do p r o gramowania
kolejnego adresu m o ż e być realizowane metodą
Dała
Poiling
o p i s a n ą d a l e j . P r z e d z m i a n ą a d r e s u n a l e ż y o d c z e k a ć 4 . . . 9 m s (ten c z a s z a l e ż y m.in. od napięcia zasilania). Operację p r o g r a m o w a n i a m o ż n a omijając a d r e s y , k t ó r e z a w i e r a j ą d a n e o w a r t o ś c i $ F F .
przyspieszyć
6. P o p r a w n o ś ć zapisu m o ż n a z w e r y f i k o w a ć w y k o r z y s t u j ą c polecenie Read. Powoduje o n o przesianie zapisanej w p a m i ę c i danej z mikrokontrolera do programatora p o p r z e z linię M I S O ( P B 6 ) . 7. Z a k o ń c z e n i e p r o g r a m o w a n i a następuje p o ustawieniu linii R E S E T w stan wysoki, rozpoczynając t y m s a m y m n o r m a l n ą p r a c ę mikrokontrolera. 8. Jeśli potrzebna jest sekwencja wyłączenia zasilania (power-off),
to powin
na wyglądać następująco: - ustawić w y p r o w a d z e n i e X T A L I w stanie „ 0 " (przy b r a k u rezonatora kwar cowego), - ustawić linię R E S E T w stan „ 1 " , - wyłączyć zasilanie.
Data Polling EEPROM P r z e c h o d z e n i e p o m i ę d z y p o s z c z e g ó l n y m i p r o g r a m o w a n y m i komórkami pa mięci E E P R O M może się o d b y w a ć n a zasadzie o d p y t y w a n i a pamięci: „czy j u ż można d a l e j ? " (Data Polling).
Jeśli p r o c e s a u t o k a s o w a n i a nie zostanie
zakończony, w wyniku c y k l i c z n e g o o d c z y t y w a n i a p r o g r a m o w a n e j lokacji otrzymuje się wartość $ 8 0 . P o zakończeniu k a s o w a n i a b ę d z i e odczytywana wartość $ 7 F . G d y układ j e s t g o t o w y d o przyjęcia kolejnej danej, w wyniku odczytania tej lokacji otrzymuje się z a p r o g r a m o w a n ą daną. Jeśli zdarzy się, że d o pamięci mają b y ć zapisane dane $80 i $ 7 F , p o z a p r o g r a m o w a n i u pier wszej wartości należy odczekać c o najmniej 4...9 m s , a n a s t ę p n i e przejść do p r o g r a m o w a n i a drugiej. W s z y s t k i e k o m ó r k i w y k a s o w a n e j pamięci mają war tość $ F F . Z a p i s danych o wartości $ F F m o ż n a w i ę c p o m i j a ć . W ten sposób udaje się niekiedy skrócić czas p r o g r a m o w a n i a p a m i ę c i mikrokontrolera. Me toda Data Polling
nie m o ż e b y ć s t o s o w a n a , jeśli E E P R O M j e s t reprogramo-
wany bez wcześniejszego k a s o w a n i a p a m i ę c i (Chip
Erase).
Data Polling Flash W przypadku pamięci Flash, w wyniku cyklicznego odczytywania programo wanej lokacji otrzymywana będzie wartość $ 7 F przez czas, g d y pamięć nie bę dzie gotowa d o przyjęcia kolejnej danej. G d y g o t o w o ś ć t a k a nastąpi, odczytana dana będzie odpowiadać ostatnio zapisywanej d o pamięci i w tym momencie można przystąpić d o programowania kolejnej lokacji. Jeśli d o pamięci Flash m a być zapisana dana o wartości $ 7 F , t o z a n i m rozpocznie się jej programowa nie należy odczekać min. 4...9 m s p o z a p r o g r a m o w a n i u poprzedniej. Na skutek kasowania pamięci wszystkie jej komórki przybierają wartość $FF. Zapisywa ne danej o wartości $ F F można więc pominąć.
Mi Lista rozkazów
12. Zestawienie rozkazów mikrokontrolera AT90S2313 Z a s t o s o w a n e w mikrokontrolerach A V R m n e m o n i k i są niestety trudne do za pamiętania, m i m o że w ich doborze w i d a ć p e w n ą logikę i konsekwencję. Problem polega m.in. na tym, że w liście r o z k a z ó w mikrokontrolerów AVR spotykamy zbliżone „ b r z m i e n i o w o " m n e m o n i k i z d e c y d o w a n i e różniących się rozkazów. Przykładem mogą być choćby: S B I - ustaw bit w rejestrze we/wy i S B I C - skocz, jeśli j e s t ustawiony bit w rejestrze w e / w y . Czy listy r o z k a z ó w trzeba k o n i e c z n i e się u c z y ć ? I tak i n i e . T a k , b o wpływa to korzystnie na płynne i w y d a j n e pisanie p r o g r a m ó w , pozwalając niejedno krotnie na o p t y m a l n e w y k o r z y s t a n i e z a s o b ó w m i k r o k o n t r o l e r a . Nie, bo po pierwsze: z a w s z e m o ż n a przecież zajrzeć d o p o m o c y , c h o ć b y takiej jak za warta w tej książce. P o d r u g i e : „czysty" a s e m b l e r c o r a z rzadziej jest wyko rzystywany d o pisania p r o g r a m ó w , oddając p r y m a t j ę z y k o m wysokiego po ziomu ( B a s c o m , C). W s z y s t k i m t y m , którzy rozpoczynają p r z y g o d ę z mikro kontrolerami A V R gorąco p o l e c a m z a p o z n a n i e się z ich listą rozkazów, bez względu na to, czy będą pisać p r o g r a m y w a s e m b l e r z e , czy nie. Znajomość ta ułatwia zrozumienie architektury mikrokontrolera. C z a s a m i zachodzi potrze ba napisania fragmentu p r o g r a m u z o p t y m a l i z o w a n e g o w szczególny sposób, np. p o d w z g l ę d e m zależności c z a s o w y c h . Pisząc g o w j ę z y k u C , nie mówiąc j u ż o B a s c o m i e , nie zawsze programista m o ż e z a p a n o w a ć nad kodem wyni k o w y m . N i e z a w s z e też jest on o p t y m a l n y . W takich sytuacjach przydają się lub są wręcz niezbędne w s t a w k i a s e m b l e r o w e . I tu c z ę s t o okazuje się, że część nabytej kiedyś wiedzy „poszła w z a p o m n i e n i e " . Wystarczy jednak „rzut o k a " n a zestawienie m n e m o n i k ó w i w s z y s t k o staje s i ę j a s n e . Takie ze stawienie znajduje się w dalszej części książki i p r z y d a s i ę o n o wszystkim tym, którzy listę r o z k a z ó w j u ż znają, a w k o n k r e t n y c h sytuacjach potrzebują szybkiego odświeżenia w i a d o m o ś c i . Pełny opis r o z k a z ó w znajduje się w roz dziale 1 2 . 1 . D o opisu r o z k a z ó w użyto s y m b o l i , k t ó r y c h z n a c z e n i e w y j a ś n i o n o poniżej. Szczególną u w a g ę należy z w r ó c i ć n a przyjęte o z n a c z e n i a rejestrów. Wynika ją o n e z ich o g r a n i c z o n e g o zasięgu działania: Rd
- rejestr źródła lub rejestr p r z e z n a c z e n i a ( R 0 . . . R 3 1 ) ,
Rs
- rejestr źródła ( R 0 . . . R 3 I ) ,
Rh
- górne rejestry m i k r o k o n t r o l e r a ( R 1 6 . . . R 3 1 ) , R h d oznacza rejestr przeznaczenia m i e s z c z ą c y się w zakresie
rejestrów
górnych
( R 1 6 . . . R 3 1 ) , analogicznie R h s - rejestr ź r ó d ł a należący d o r e jestrów górnych, Rm
- rejestry ś r o d k o w e m i k r o k o n t r o l e r a (R16..-R23), R m d o z n a c z a rejestr p r z e z n a c z e n i a mieszczący się w zakresie rejestrów środ k o w y c h ( R 1 6 . . . R 3 1 ) , a n a l o g i c z n i e R m s - rejestr źródła należą cy d o rejestrów ś r o d k o w y c h ,
RR
- p a r a rejestrów ( r 2 4 = R 2 5 : R 2 4 , r 2 6 = R 2 7 : R 2 6 , r 2 8 = R 2 9 : R 2 8 ,
Rxyz
- rejestry i n d e k s o w e ( X = R 2 7 : R 2 6 , Y = R 2 9 : R 2 8 , Z = R 3 1 : R 3 0 ) ,
Ry
- rejestry i n d e k s o w e z p r z e m i e s z c z e n i e m ( Y = R 2 9 : R 2 8 ,
c63
- stała w s k a ź n i k o w a (0...63),
c!27
- stała u ż y w a n a j a k o p a r a m e t r określający zakres skoku w a r u n
c255
- stała 8-bitowa (0...255),
cl024
— stała u ż y w a n a j a k o p a r a m e t r określający zakres skoku w z g l ę d
adr
- stała określająca 16-bitowy adres ( 0 . . . 6 5 5 3 5 ) ,
r30=R31:R30),
Z=R31:R30),
k o w e g o (-64...63),
n e g o (-512...511), adr2k
- stała określająca w z g l ę d n e p r z e m i e s z c z e n i e w o b r ę b i e ± 2 k,
adr64k
- stała określająca 16-bitowy adres ( 0 . . $ F F F F ) ,
a d r 6 5 5 3 5 - stała określająca 16-bitowy adres (0...$FFFF) w obrębie bieżą cego segmentu, adr4M
- stalą określająca 2 2 - b i t o w y adres ( 0 . . . $ 3 F F F F F ) ,
b
- pozycja bitu
P
- n u m e r p o r t u (rejestru) n a l e ż ą c e g o d o o b s z a r u w e / w y
PI
- adres portu (rejestru) n a l e ż ą c e g o d o dolnej strony o b s z a r u
(0...7),
(0...63 = $00...$3F),
w e / w y (0...31 = $00...$1F), +
- dodawanie arytmetyczne,
-
- odejmowanie arytmetyczne,
v
- s u m a logiczna,
A
- iloczyn logiczny,
©
- suma modulo 2 (Ex-OR),
P o n a d t o w opisie r o z k a z ó w przyjęto następujące z a p i s y s y m b o l i c z n e : Ri
- z a w a r t o ś ć 8-bitowego rejestru Ri,
Rj:Ri
- z a w a r t o ś ć 16-bitowego rejestru z ł o ż o n e g o z rejestrów Rj (star
(Ri)
- k o m ó r k a pamięci a d r e s o w a n a p r z e z rejestr R i ,
szy) i R i (młodszy),
Ri(b)
- bit b rejestru Ri,
Rk(j...i)
- bity od i d o j rejestru R k , n p . R l ( 3 . . . 0 ) - m ł o d s z e 4 bity rejestru
a => b a <- b
Rl, - koniunkcja logiczna (jeżeli a, to b ) , - przypisanie b d o a (np. w p i s a n i e w a r t o ś c i b d o rejestru a).
Z a c h o w a n i e się z n a c z n i k ó w (fłag) p o w y k o n a n i u r o z k a z u j e s t przedstawione za p o m o c ą o z n a c z e ń : <->
- flaga u s t a w i a n a z g o d n i e z w y n i k i e m operacji,
0
- flaga zerowana („0"),
1
- flaga ustawiana ( „ 1 " ) . - flaga pozostaje b e z z m i a n y .
Tab. 12.1. Zestawienie listy rozkazów mikrokontrolera AT90S2313 Mnemonik
opis
Ope randy
Operacja
Modyfikowane Hagi
Liczba taktów
zegara u Operacje arytmetyczne i logiczne ADO
Rd.Rs
Doda) zawartość dwóch rejestrów
Rd * - Rd + Rs
Z,C.N.V.H,S
1
ADC
RO.Rs
Dodaj zawartość dwóch rejestrów
Rd«- Rd + Rs + C
Z,C.N.V.H,S
1
z przeniesieniem ADIW
RR.C63
Oodai bezpośrednio stalą do słowa
RRhiRRI * - RRhiRRI + c63
Z.C,N.V,S
SUB
Rd.Rs
Odejmij zawartość dwóch re(estrów
Rti <- Rd - Rs
Z.C,N,V.H.S
1
SUBI
Rfi,c255
Rh <- Rh - C255
Z.C.N,V,H,S
1
Odejmij stalą od rejestru
SBIW
RR,c63
Odejmij bezpośrednio stalą od słowa
RRhiRRI <-RRhiRRI-c63
Z.C.N.V.S
SBC
Rd.Rs
Odejmij zawartość dwóch rejestrów z przeniesieniem
Rd«-Rd-Rs-C
Z.C.N,V.H,S
SBCI
Rh,c255
Rh <- Rh - c255 -C
AND
Rd.RS
ANDl
Rh,c255
Odejmij stalą z przeniesieniem od rejestru Iloczyn logiczny rejestrów Iloczyn logiczny rejestru i stale]
Z.C.N.V.H,S
1
Rs
Z,N.V,S
1
Rh <-* Rh A c255
Z.N.V.S
1
Rd <- Rd v Rs
Z.N.V,S
1
Z.N,V,S
1
Rd * - Rd
A
OR
Rd.Rs
ORl
Rh.c255
Suma logiczna rejestru i stałej
Rh(~Rhvc255
EOR
Rd.Rs
Suma £xclusive OR rejestrów
Rd t - RdffiRs
Z,N,V.S
1
COM
Rd
Uzupełnienie do jedności (negacja bitów)
Rd * - SFF - Rd
Z,C,N.V.S
1
NEG
Rd
Uzupełnienie do dwóch
Rd<-SOO-Rd
Z.C.N,V.H.S
1
S8R
Rh.c255
Ustaw bit(y) w rejestrze
Rh <- Rh v c2S5
Z.N,V,S
1
CBR
Rh.c255
Zeruj bit(y) w rejestrze
Rh*-RhAc255
Z,N.V,S
1
INC
Rd
Inkrementuj rejestr
Rd * - Rd + 1
Z,N.V.S
1
DEC
Rd
Dekrementuj rejestr
Rd ł - Rd - 1
Z.N.V.S
1
TST
Rd
Sprawdź zero lub minus
R d * - Rd
Rd
2,N,V,S
1
CLR
Rd
Zeruj rejestr
Rd <- Rd e Rd
Z.N.V.S
1
SER
Rh
Ustaw rejestr
Rh <- SFF
_
1
R1 :R0 <- Rd • Rs
2
2
MUL
Sumatogicmi rejestrów
A
Rd.Rs
Mnożenie liczb bez znaku
MULS
Rhd.Rhs
Mnożenie liczb ze znakiem
R1:R0<-Rhd-Rhs
z,c z.c
MULSU
Rhd.Rhs
Mnożenie liczby ze znakiem z liczbą bez znaku
R1:R0«-RhdRhs
z.c
2
Mnemonik
OperMdy
Opis
Operacji
Modyfikowane flaoj
Uczta '
taktów zegara ~ .i
FMUL
Rd.Rs
Mnożenie liczb ułamkowych bez znaku
R1:R0*- (Rd -Rs)<<1
Z.C
2
FMULS
Rd.Rs
Mnożenie liczb ułamkowych ze znakiem
R1:R0«- (Rd-Rs)<<1
Z.C
2
FMULSU
Rd.Rs
Mnożenie liczby ułamkowej ze znakiem z liczba, ułamkową bez znaku
R1:R0*-(Rd-Rs)<<1
z,c
2
Skok względny
PC«-PC + c1024 + 1
-
2
PC*-Z
-
2
PC(15..0)+-Z PC(21..16)<-EIND
_
2
PC*- adr4M
-
3
Rozkazy skoków RJMP
Cl 024
IJMP
Skok pośredni określony zawartością rejestru Z
EIJMP
Rozszerzony skok pośredni określony zawartością rejestru Z
JMP
adr4M
Skok bezpośredni
RCALL
C1024
Względne wywołanie podprogramu
(SPL)*-PC+1 SPL«- SPL - 2 PCt-PC + c1024 + 1
3
Pośrednie wywołanie podprogramu,
(SPL)«-PC+1 SPL*- SPL -Z PC*-Z
3
ICALL
określone zawartością rejestru Z Rozszerzone, pośrednie wywołanie podpro gramu, określone zawartością rejestrów ZIEIND
E1CALL
GALL
3dr4M
Wywołanie podprogramu
RET
-
RETI
-
CPSE
Rd,Rs
Porównaj i przeskocz, jeśli równe
CP
Rd.Rs
Porównaj rejestry
CPC
Rd.Rs
Porównaj rejestry z przeniesieniem
CPI
Rh,c255
(SP)*-PC+1 SPL t - SPL - 3 PC(15...0)*-Z PC(21..t6)*-EIND
4
(SP) <- PC+1 (SP) * - SP - 2 PC«- ar
4
Powrót z podprogramu
PC <- (SPL) SPL*- SPL + 2
4
Powrót z przerwania
PC <- (SPL) SPL «- SPL + 2
Porównaj rejestrze stalą
I
4
(Rd=Rs)=>PC«-PC + 2 lub 3
_
Rd-Rs
Z,C,N.V.H.S
1
Rd-Rs-C
Z,C,N.V,H,S
1
Rh - c255
Z.C,N.V,H,S
1
1
lub 2
SBRC
Rs.b
Przeskocz, jeśli bit w rejestrze jest wyzerowany
Rs(t>)=0=>PC«-PC+2 Rs(b)=1 = > P C * - P C + t
_
1.2 łub 3
SBRS
Rs,b
Przeskocz, jeśli bit w rejestrze jest ustawiony
Rs(b)=1 = > PC PC + 2 Rs(b)=0=>PC<-PC + 1
_
1,2 lub 3
Przeskocz, jeśli bit w rejestrze we/wy jest wyzerowany
Pl(b)=0=>PC<-PC + 2 Pl(b)=t = > PC<-PC + 1
_
1,2 lub 3
Przeskocz, jeśli bit w rejestrze we/wy jest ustawiony
Pl(b) = i = > PC*-PC + 2
SBIC
Pl.b
SBIS
Pl,b
PI(b}=0=>PC*-PC + 1
1,2 lub 3
BRBS
b,c127
Skok względny, jeśli tlaga w rejestrze SREG jest ustawiona
SREG(b)=l = > PC«-PC + c127 + 1 SREG(b)=0=>PC*-PC + 1
1 lub 2
BRBC
b,c127
Skok względny, jeśli tlaga w rejestrze SREG jest wyzerowana
SREG(b)=0=>PC<-PC + c127 + 1 SREG(b)=l = > PC*- PC + 1
BREO
c127
Skok względny, jeśli równe
Z=1 = > p c * - P C + c ! 2 7 + 1 Z=0 = > PC<- PC + 1
1 lub 2
-
1 lub 2
Mnemonik
Operandy
.
opis
"
"'
' '
Operacji
Modyfikowane fła«i
LlRta^ (aktów \ zegara ;
BRNĘ
C127
Skok względny, jeśli nierówne
2=0 = > PC*-PC +C127 + 1 Z=1 = > PC«-PC + 1
-
1 lub 2
BRCS
cl27
Skok względny. Jeśli Haga przeniesienia
C=1 = > PC<-PC +C127 + 1 C=0 = > PC*-PC + 1
-
1 lub 2
jest ustawiona BRCC
Cl 27
Skok względny, jeśli flaga przeniesienia jest wyzerowana
BRSH
C127
C=0 = > PC <- PC +C127 + 1 C=1 = > PC t - PC + 1
Skok względny, jeśli większy lub równy (dotyczy liczb bez znaku)
C=0 = > PC*-PC +cl27 + 1 C=1 = > PCt-PC + 1
1lut>2
-
llubz
BULO
C127
Skok względny, jeśli mniejszy (dotyczy liczb bez znaku)
C=1 = > P C * - P C + c 1 2 7 + 1
BRMI
Cl 27
Skok względny, jeśli ujemny
N=t = > PC+-PC +C127 + f N = 0 = > PC*-PC + 1
-
Hub 2
8RPL
C127
Skok względny, jeśli dodatni
N=0=>PC«-PC+Ci27 + 1
-
1lub2
C=0=>PC*-PC + 1
N=1 = > P C * - P C + 1 BRGE
C127
Skok względny, jeśli większy lub równy (dotyczy liczb ze znakiem)
S=0 = > PC*- PC +C127 + 1 S=1 = > PC*~PC + 1
-
1 lub 2
BRLT
C127
Skok względny, jeśli mniejszy niż zero (dotyczy liczb ze znakiem)
S=1 = > PC*- PC +C127 + 1
-
1lub2
S=0 = > PC«-PC + 1
BRHS
C127
Skok względny, jeśli (laga przeniesienia pomocniczego ustawiona
H=1 = > PC«- PC +C127 + 1 H=0=>PC*-PC + 1
-
i lub 2
BRHC
Cl 27
Skok względny, jeśli Haga przeniesienia pomocniczego wyzerowana
H=0 = > PC*-PC +C127 + 1 H=1 = > P C t - P C + 1
-
1 lub 2
BRTS
Cl 27
Skok względny, jeśli znacznik T jest ustawiony
T=1 = > PC*-PC +C127 - M T=0=>PC*-PC + 1
-
Hub 2
BRiC
Cl 27
Skok względny, Jeśli znacznik T |est wyzerowany
T=0=>PC^PC+c127 + 1
-
1 lub E
Skok względny, jeśli tlaga przepełnienia ustawiona
V=1 = > PC*-PC +C127 + 1
-
1 lub 2
8RVS
C127
T=1 = > P C * - P C + 1 V=0=>PC*-PC + t
BRVC
C127
Skok względny, jeśli tlaga przepełnienia wyzerowana
V = 0 = > P C < - P C +C127 + 1 V=f = > PC <- PC + 1
-
1 tub 2
BRIE
C127
Skok względny, jeśli przerwania odblokowane
1=1 = > PC*-PC +C127 + 1
-
1 lub 2
-
1lub2
1=0 = > PC * - PC + 1 BR1D
C127
Skok względny, jeśli przerwania zablokowane
1=0 = > PC*-PC +C127 + 1 1=1 = > PC*-PC + 1
Rozkazy transferu danych MOV MOVW
Rd.Rs Rd+1:Rd,
Kopiuj zawartość rejestru Rs do rejestru Rd Kopiuj zawartość sfowa z rejestrów
R d * - Rs
-
1
Rd+-t:RrJ*-Rs4-t:Rs
-
t
Rs+1:RS
Rs+l:Rs do rejestrów Rd+1:Rd
LOI
Rh,c255
Ładuj rejestr bezpośrednio stalą
Rh *- C255
1
LD
Rd,X
tadu) rejestr pośrednio daną z pamięci SRAM spod adresu wskazywanego przez rejestr X
Rd*-(X)
-
2
LO
Rd,X+
taduj rejestr pośrednio daną z pamięci SRAM spod adresu wskazywanego przez rejestr X z postinkrementacją
Rd«-(X) X*-X + 1
-
2
Ląduj rejestr pośrednio daną z pamięci SRAM spod adresu wskazywanego przez rejestr X z predekrementacją
X*-X-1 Rd*-(X)
-
2
Ładuj rejestr pośrednio daną z pamięci SRAM spod adresu wskazywanego przez rejestr Y
Rd*-(Y)
-
2
LD
LD
Rd.-X
Rd,Y
Mnemonik
Operantfy
Opis
Operacja
Modyflkowaoe flagi
Uczto' taktów
zegara , LD
LD
LDD
Rd,Y+
Rd,-Y
Rd,Y+c63
Ląduj rejestr pośrednio daną z pamięci SRAM spod adresu wskazywanego przez rejestr Y z postinkrementacją
Rd«- (Y) Y*-Y+ 1
2
Ładuj rejestr pośrednio daną z pamięci SRAM spod adresu wskazywanego przez rejestr Y z predekrementacją
Ył-Y-1 Rd*-(Y)
2
Rd «- (Y + C63)
2
Ładuj rejestr pośrednio daną z pamięci SRAM spod adresu wskazywanego przez rejestr Y z przemieszczeniem
LD
Rd.Z
Ładuj rejestr pośrednio daną z pamięci SRAM spod adresu wskazywanego przez rejestr Z
Rd«-(Z)
2
LD
Rd,Z+
Ładuj rejestr pośrednio daną z pamięci SRAM spod adresu wskazywanego przez rejestr Z z postinkrementacją
Rd <~ (Z) Z«-Z + 1
2
Ładuj rejestr pośrednio daną z pamięci SRAM spod adresu wskazywanego przez rejestr Z z predekrementacją
Z*-Z-1 Rd*-(Z)
2
Ładuj rejestr pośrednio daną z pamięci SRAM spod adresu wskazywanego przez rejestr Z z przemieszczeniem
Rd * - (Z + C63)
2
Ładuj rejestr bezpośrednio daną z pamięci SRAM spod adresu adr
Rd * - (adr65535)
2
LD
Rd,-Z
LDD
Rd,Z+c63
LDS
Rd,adr65535
ST
X,Rs
ST
X+.RS
ST
-X,Rs
zachowaj pośrednio rejestr w pamięci SRAM pod adres wskazywany przez rejestr X
(X) «-Rs
Zachowaj pośrednio rejestr w pamięci SRAM pod adres wskazywany przez rejestr X z postinkrementacją
(X) *- Rs Xt-X+ 1
Zachowaj pośrednio rejestr w pamięci SRAM pod adres wskazywany przez rejestr X z predekrementacją
X<-X-1 (X) t - R s
-
2
-
2
2
-
2
-
2
ST
Y.Rs
Zachowaj pośrednio rejestr w pamięci SRAM pod adres wskazywany przez rejestr Y
(Y)<-Rs
ST
Y+,Rs
Zachowaj pośrednio rejestr w pamięci SRAM pod adres wskazywany przez rejestr Y z postinkrementacją
(Y)«-Rs Y«-Y+ 1
Zachowaj pośrednio rejestr w pamięci SRAM pod adres wskazywany przez rejestr Y z predekrementacją
Y«-Y-1
2
ST
-Y,Rs
STD
Y+c63.Rs
Zachowaj pośrednio rejestr w pamięci SRAM pod adres wskazywany przez rejestr Y z przemieszczeniem
(Y+c63) <~ Rs
2
ST
Z.Rs
Zachowaj pośrednio rejestr w pamięci SRAM pod adres wskazywany przez rejestr Z
(Z)«-Rs
2
ST
Z+.Rs
Zachowaj pośrednio rejestr w pamięci SRAM pod adres wskazywany przez rejestr Z z postinkrementacją
(Z)Rs Z*-Z + 1
Zachowaj pośrednio rejestr w pamięci SRAM pod adres wskazywany przez rejestr Z z predekrementacją
Z<-Z-1 (Z) <- Rs
ST
-Z.Rs
-
2
2
Mnemonik
STD
Z+c63,Rs
STS
arJr.Rs
Operacja
Opis
Operandy
Zachowaj pośrednio rejestr w pamięci SRAM pod adres wskazywany przez rejestr Z z przemieszczeniem
Modyfikowane flagi
taktów zegara
(Z+c63) <- Rs
2
(adr)<- Rs
2
Zachowaj bezpośrednio rejestr w pamięci SRAM pod adres adr
-
LPM
_
Ładuj bajt pamięci programu do rejestru RO
RO«-(Z)
LPM
Rd.z
Ładuj bajt pamięci programu do rejestru Rd
RrJ«-(Z)
LPM
Rd.z+
Ładuj bajt pamięci programu do rejestru Rd
Rd * - (Z) Z<-Z + 1
_
3
RO «- (RAMPZ:Z)
-
3
Rd <- (RAMPZlZ)
-
3
-
z postinkrementacją ELPM
-
Rozszerzone lądowanie bajtu pamięci programu do rejestru RO
ELPM
Rd.Z
Rozszerzone lądowanie bajtu pamięci programu do rejestru Rd
ELPM
Rd,Z+
SPM
-
Rozszerzone ładowanie bajtu pamięci programu d o rejestru Rd z poslinkremenlacją
3
Rd +- (RAMPZ:Z) Z*-Z + 1 (Z)«-R1:R0
3
3
IN
Rd.P
Czytaj port
Rd«-P
-
OUT
P.Rs
Zapisz port
P<-Rs
-
1
PUSH
Rs
Odłóż rejestr na stos
(SPL) <- RS SPL «- SPL - 1
_
2
Rd
Pobierz ze stosu
SPL t- SPL + 1 Rd t- (SPL)
POP
Zapisz pamięć programu
1
2
Rozkazy bitowe 1 testujące bity
-
SBI
Pl.b
Ustaw bit w rejestrze we/wy
Pl(b) <- 1
CBI
Pl.b
Zeruj bit w rejestrze we/wy
Pl(b)«- 0
2
-
2
tSL
Rd
Przesuń logicznie w lewo zawartość rejestru
Rd(n+1)*-Rd(n), Rd{0)<-0
Z.C.N.V.H
1
LSR
Rd
Przesuń logicznie w prawo zawartość rejestru
Rd(n)f-Rd(n+1), Rd(7)<~0
Z,C,N.V
1
ROL
Rd
Obróć w lewo przez przeniesienie
Rd(0)«-C. Rd{n+1)«-Rd{n), C «- Rd(7)
Z.C,N,V.H
ROR
Rd
ObnjC w prawo przez przeniesienie
Rd(7)*-C. Rd(n)<-Rd(n+1). C « - Rd(0)
Z,C.N.V
ASR
Rd
Przesuń arytmetycznie w prawo
Rd(n) -Rd(n+1),n=0..6
SWAP
Rd
Zamień pólbajty rejestru
8SET
b
BCLR
b
Z,C,N.V
1
Rd(3..0)«-Rd(7...4), Rd(7...
_
,
Ustaw Hagę
SREG(b) <-1
SREG(b)
1
Zeruj flagę
SREG(b) <- 0
SREG(b)
1
ł
BST
Rs,b
Zachowaj bit rejestru w znaczniku T
T<-Rs(b)
?
1
BLD
Rd.b
Ładuj znacznik T do bitu rejestru
Rd(b) «- T
SEC
-
-
1
Ustaw flagę przeniesienia
C«-1
C
1
Zeruj flagę przeniesienia
C*-0
C
1
CLC SEN
-
Ustaw flagę wartości ujemne/
N<- 1
U
ł
CLN
-
Zeruj flagę wartości ujemnej
N.-0
N
1
SEZ
-
1
CLZ
Ustaw flagę zera
Z«-1
Z
Zeruj flagę zera
Z<-0
Z
1
l<-t
l
1
SEI
-
Odblokuj przerwania
CLI
-
Zablokuj przerwania
l*-0
1
1
Ustaw Hagę znaku
S«-1
s
1
SES
Mnemonik
Opis
Operaady
Operacja
Modyfikowane ffagi
Liczba ~ taktów zegara
CLS
-
Zeruj Hagę znaku
S«-0
S
SEV
1
-
Ustaw tlagę przepełnienia uzupełnienia do dwóch
V *- 1
V
1
CLV
-
Zeruj tlagę przepełnienia uzupełnienia do dwóch
v«~o
V
1
SET
-
Ustaw tlagę T w rejestrze SREG
T«-1
T
1
Zeruj tlagę T w rejestrze SREG
T<-0
T
1
Ustaw Hagę przeniesienia pomocniczego
H.-1
H
1
Zeruj (lagę przeniesienia pomocniczego
H«-0
H
1
CLT
-
SEH
-
CLH
Rozkazy sterujące pracą MCU NOP
-
Nic nie rób
-
1
SLEEP
-
Przejdź w tryb uśpienia
Działanie opisano w dalszej części rozdziału
-
1
WDR
-
Zeruj rejestr watchdoga
Działanie opisano w dalszej części rozdziału
-
1
BREAK
_
Przerwij wykonywanie programu
Działanie opisano w dalszej części rozdziału
-
1
12.1. Opis działania rozkazów W opisie działania r o z k a z ó w obowiązują o z n a c z e n i a s k r ó t o w e przedstawione na początku rozdziału 12. Z e względu na t o , że działanie r o z k a z ó w mikro kontrolera j e s t zazwyczaj
silnie związane
z j e g o architekturą,
ewentualne wątpliwości należy wyjaśniać w o d p o w i e d n i m
wszystkie
wcześniejszym
rozdziale książki. W mikrokontrolerze m o ż n a w y r ó ż n i ć trzy rejestry, które mają w p ł y w na przebieg p r o g r a m u , są to: - 16-bitowy rejestr P C - licznik p r o g r a m u (Program
Counter)
zawierający
adres pamięci programu, spod k t ó r e g o j e s t p o b i e r a n y k o d rozkazu wykony w a n e g o w kolejnym kroku, - 8 - b i t o w y (w przypadku mikrokontrolera A T 9 0 S 2 3 1 3 ) rejestr wskaźnika stosu - S P (Stack Pointer),
zawierający adres p a m i ę c i S R A M , pod który
będzie z a p i s y w a n y n p . adres powrotu z p o d p r o g r a m u (adres następnego rozkazu p o rozkazie w y w o ł a n i a p o d p r o g r a m u ) , - 8-bitowy rejestr z n a c z n i k ó w (flag) - S R E G (Status Register),
zawierający
znaczniki m o g ą c e mieć w p ł y w na p r z e b i e g p r o g r a m u (wykorzystywane np. w rozkazach skoków w a r u n k o w y c h ) . Ze względu n a szczególne znaczenie t y c h rejestrów, w dalszym opisie u w z g l ę d n i o n o sposób ich modyfikacji p r z e z p o s z c z e g ó l n e r o z k a z y .
ADC - dodaj zawartość rejestrów z przeniesieniem D o d a n i e z a w a r t o ś c i d w ó c h rejestrów o r a z z n a c z n i k a C. W y n i k j e s t u m i e s z c z a n y w rejestrze R d . Operacja:
Rd < - Rd + Rs + C PC « - PC + l
Składnia:
ADC
Kod:
Rd,Rs
1 11 0
0
0
1
1
i1
i
s
id
Liczba słów: 1 ( 2 bajty)
d
d
d
d s
s
s
s
i i '
1 1 1
V
Z
Liczba cykli: 1 Flagi:
I
T
H
S
N
C
H : u s t a w i a n a , jeśli nastąpiło przeniesienie z bitu 3 , w p r z e c i w n y m p r z y p a d ku z e r o w a n a . S:
w y k o r z y s t y w a n a d o s p r a w d z a n i a znaku w y n i k u .
V : u s t a w i a n a , jeśli nastąpiło przepełnienie operacji u z u p e ł n i e n i a d o d w ó c h , w przeciwnym przypadku zerowana. N : u s t a w i a n a , jeśli M S B został u s t a w i o n y , w p r z e c i w n y m p r z y p a d k u z e r o wana. Z : u s t a w i a n a , jeśli w y n i k j e s t r ó w n y zeru, w p r z e c i w n y m p r z y p a d k u z e r o wana. C : u s t a w i a n a , jeśli nastąpiło przeniesienie z bitu M S B , w p r z e c i w n y m przy padku zerowana. Przykład: add adc
r2,rO r3,rl
dodaj dwie liczby 16-bitowe rl:r0 + r3:r2 dodaj młodsze bajty dodaj starsze bajty z przeniesieniem
ADD - dodaj zawartość dwóch rejestrów Dodanie zawartości dwóch rejestrów. W y n i k j e s t u m i e s z c z a n y w rejestrze Rd. Operacja:
Rd < - Rd + Rs P C <— P C + 1
Składnia:
ADD
Kod:
Rd,Rs !
o'
0
0
0
1
1 s
d
d
d
r~- i — i — r—i 1 s d d S S s
Liczba słów: ł (2 bajty) Liczba cykli: 1 Flagi:
|
T
—
—
H
S
V
N
Z
C
H : ustawiana, jeśli nastąpiło przeniesienie z bitu 3, w p r z e c i w n y m przypad ku z e r o w a n a . S:
w y k o r z y s t y w a n a d o sprawdzania znaku w y n i k u .
V: ustawiana, jeśli nastąpiło przepełnienie operacji u z u p e ł n i e n i a d o dwóch, w p r z e c i w n y m przypadku z e r o w a n a . N : ustawiana, jeśli M S B został ustawiony, w p r z e c i w n y m przypadku zero wana. Z : ustawiana, jeśli w y n i k j e s t r ó w n y zeru, w p r z e c i w n y m przypadku zero wana. C : ustawiana, jeśli nastąpiło przeniesienie z bitu M S B , w p r z e c i w n y m przy p a d k u zerowana.
Przykład: add add
rl,r2 r28,r28
;dodaj r2 do rl ;dodaj r28 do r28
ADIW - dodaj bezpośrednio stałą do stówa D o d a n i e b e z p o ś r e d n i e stałej z zakresu 0...63 d o z a w a r t o ś c i j e d n e j pary reje strów ś r o d k o w y c h i u m i e s z c z e n i e w y n i k u w tych rejestrach. Operacja:
RRhrRRl < - RRh:RRl + c63 P C <— P C + 1
Składnia:
ADIW
RRh:RRl c63 f
— i — i i — i —
Kod:
1
0 0
1
0
1
1
0 c
c h
h
— i — i — i —
c
c c
c
Liczba stów: 1 ( 2 bajty)
Liczba cykli; 2 Flagi:
S:
I
T
H
S
—
•—
—
-*-#•
V
N
Z
C
w y k o r z y s t y w a n a d o s p r a w d z a n i a znaku w y n i k u .
V : u s t a w i a n a , jeśli nastąpiło przepełnienie operacji u z u p e ł n i e n i a d o d w ó c h , w przeciwnym przypadku zerowana. N : u s t a w i a n a , jeśli M S B został u s t a w i o n y , w p r z e c i w n y m p r z y p a d k u z e r o wana. Z: u s t a w i a n a , j e ś l i w y n i k j e s t r ó w n y zeru, w p r z e c i w n y m p r z y p a d k u z e r o wana. C : ustawiana, jeśli nastąpiło przeniesienie z bitu M S B , w p r z e c i w n y m p r z y padku zerowana.
Przykład: adiw adiw
r25:r24,15 ZH:ZL,63
;dodaj 15 do pary rejestrów r25:r24 ;dodaj 63 do rejestru wskaźnikowego Z
AND - iloczyn logiczny rejestrów Obliczenie iloczynu l o g i c z n e g o zawartości rejestrów R d i R s . Wynik jest umieszczany w rejestrze R d . Operacja:
R d «— R d
A
Rs
PC <- P C + 1 Składnia:
AND
Rd,Rs i
Kod:
0
0
i
!
0 0
1
'I
0 s
r—i
d d
d d
d s
r~—i
s
r—•
s
s
Liczba stów: 1 (2 bajty) Liczba cykli: 1 Flagi:
1
— S:
T
H
— —
S
V
N
Z
C
0
w y k o r z y s t y w a n a d o s p r a w d z a n i a znaku w y n i k u .
V: 0 . N : ustawiana, jeśli M S B został ustawiony, w p r z e c i w n y m przypadku zero wana. Z : ustawiana, jeśli wynik j e s t r ó w n y zeru, w p r z e c i w n y m p r z y p a d k u zero wana. Przykład: and ldi and
r2,r3 rl6,8 r2,rlfi
;oblicz iloczyn logiczny r2 i r2, wynik w r2 ;ustaw maskę 0000 1000 w rejestrze rl6 ;pozostaw tylko bit 3 w rejestrze rl6
ANDI - iloczyn logiczny rejestru i stałej O b l i c z e n i e i l o c z y n u l o g i c z n e g o z a w a r t o ś c i g ó r n e g o rejestru R h i stałej. W y nik j e s t u m i e s z c z a n y w rejestrze R h . Operacja:
R h <~ R h A C 2 5 5 PC <- PC + 1
Składnia:
ANDI
Kod:
0
1
Rh,c255 1
1
—i— c c c
c
— i — i i — i — — i — i r—i h h h h c c C C
Liczba słów: 1 (2 bajty) Liczba cykli: 1 Flagi:
S:
I
T
H
—
—
—
S
V 0
N
Z
C
—
wykorzystywana do sprawdzania znaku wyniku.
V: 0. N : u s t a w i a n a , j e ś l i M S B został u s t a w i o n y , w p r z e c i w n y m p r z y p a d k u z e r o wana. Z:
u s t a w i a n a , jeśli w y n i k j e s t r ó w n y zeru, w p r z e c i w n y m p r z y p a d k u z e r o wana.
Przykład: andi andi andi
rl7,$0£ rl8,$10 rl9,$aa
.-zeruj górny pólbajt rl7 ,-izoluj 4 bit w rJ8 ,-zeruj nieparzyste bity w rl9
ASR - przesuń arytmetycznie w prawo Przesunięcie bitów rejestru R d w p r a w o . Z a w a r t o ś ć bitu 7 n i e zmienia się, natomiast zawartość bitu 0 jest w p i s y w a n a d o z n a c z n i k a C w rejestrze SREG. R o z k a z u m o ż l i w i a w y k o n y w a n i e operacji dzielenia p r z e z 2 liczby jednobajtowej ze z n a k i e m . W y n i k jest u m i e s z c z a n y w rejestrze Rd. Operacja:
rTl b7-
bO
P C <— P C + 1
Skiadnia:
ASR
Rd — i —
Kod;
i — i —
"i
d d d d d
1 0
0
0
1
1
0
Liczba stów: 1 (2 bajty) Liczba cykli: 1 Flagi:
1
— S:
T
H
S
V
N
Z
c
— —
w y k o r z y s t y w a n a d o s p r a w d z a n i a znaku w y n i k u .
V : N © C (wartości N i C p o przesunięciu). N : ustawiana, jeśli M S B został u s t a w i o n y , w p r z e c i w n y m przypadku zero wana. Z : ustawiana, jeśli w y n i k j e s t r ó w n y zeru, w p r z e c i w n y m przypadku zero wana. C: ustawiana, jeśli bit L S B rejestru przed p r z e s u n i ę c i e m był ustawiony, w p r z e c i w n y m przypadku z e r o w a n a .
Przykład: ldi asr ldi asr
rl6,16 rl6 rl7,-4 rl?
;
załaduj rl6 stałą równą 16 ;rlfi=rl6/2 ;załaduj do rl7 stałą równą -4 ,-r!7 = rl7/2
($FC)
BCLR - zeruj flagę w rejestrze SREG R o z k a z zeruje w y b r a n ą flagę w rejestrze s t a t u s o w y m S R E G . Operacja:
SREG(b) <- 0 PC <- PC + 1
Składnia:
BCLR
Kod:
1 0
b 0
1
0
1 0 '
•
0
1
b 1
•
b 1
b 1 0
0
0
i
Liczba stów: 1 (2 bajty) Liczba cykli: 1 F l a g i :
I
I:
T
H
S
V
N
Z
C
O, jeśli b = 7 , w p r z e c i w n y m p r z y p a d k u bez z m i a n y .
T : 0, j e ś l i b = 6 , w p r z e c i w n y m p r z y p a d k u bez z m i a n y . H : 0, jeśli b = 5 , w p r z e c i w n y m p r z y p a d k u bez z m i a n y . S:
0, jeśli b = 4 , w przeciwnym przypadku bez zmiany.
V : 0 , jeśli b = 3 , w p r z e c i w n y m p r z y p a d k u b e z z m i a n y . N : 0, jeśli b = 2 , w p r z e c i w n y m p r z y p a d k u b e z z m i a n y . Z : 0, jeśli b = l , w p r z e c i w n y m p r z y p a d k u bez z m i a n y . C : 0, jeśli b = 0 , w p r z e c i w n y m p r z y p a d k u bez z m i a n y .
Przykład: bclr bclr
0 7
;zeruj £lage przeniesienia ;zablokuj przerwania
BLD - ładuj znacznik T do bitu rejestru R o z k a z kopiuje flagę T z rejestru s t a t u s o w e g o S R E G d o bitu b rejestru Rd. Operacja:
R d ( b ) i-
T
PC«-PC + ł Składnia:
BLD
Rd,b 1
1
0 0
d d
T
r — i
d
d 0
d
1i
i
b b
b
Liczba słów: 1 (2 bajty) Liczba cykli: 1 Flagi:
1
T
H
bst bid
rl,2 r0,4
— — —
S
V
N
—
Z
C
—
Przykład: jumieść bit 2 rejestru rl w znaczniku T ;kopiuj flagę T do bitu 4 rejestru rO
BRBC - skok względny, jeśli flaga w rejestrze SREG jest wyzerowana W a r u n k o w e rozgałęzienie p r o g r a m u . S p r a w d z a p o j e d y n c z y bit w rejestrze S R E G . Jeśli jest w y z e r o w a n y , to nastąpi s k o k w z g l ę d e m b i e ż ą c e g o adresu wskazywanego
przez
PC.
Zasięg
skoku
wynosi:
PC-63 < adres_sko-
ku < P C + 6 4 . P a r a m e t r c l 2 7 j e s t p r z e s u n i ę c i e m z a p i s a n y m w k o d z i e u z u p e ł nienia d o d w ó c h . Operacja:
Jeśli S R E G ( b ) = 0 , to P C < - P C + c l 2 7 + 1 w przeciwnym przypadku PC
Składnia: Kod:
BRBC
PC + 1
b,cl27 1
1—i
r —
1 1 1 1
1
i"
0
i'
1
1
i
c
c c
c
c
c c
b
b
b
Liczba stów: 1 ( 2 bajty) Liczba cykli: 1, jeśli w a r u n e k niespełniony 2 , j e ś l i w a r u n e k spełniony Flagi:
I
T
H
S
V
N
Przykład: cpi brbc
nie:
nop
r20,5 l,nie
;porównaj r20 z liczbą 5 ,-skocz, jeśli flaga Z jest wyzerowana
;tu skocz
BRBS - skok względny, jeśli flaga w rejestrze SREG jest ustawiona W a r u n k o w e rozgałęzienie p r o g r a m u . S p r a w d z a p o j e d y n c z y bit w rejestrze S R E G . Jeśli j e s t ustawiony, nastąpi s k o k w z g l ę d e m b i e ż ą c e g o adresu wska z y w a n e g o przez P C . Zasięg skoku wynosi: P C - 6 3 < a d r e s _ s k o k u < PC+64 Parametr c l 2 7 jest przesunięciem zapisanym
w kodzie
uzupełnienia do
dwóch. Operacja:
Jeśli S R E G ( b ) = l , to P C < - P C + c l 2 7 +.1 w p r z e c i w n y m p r z y p a d k u P C <- PC + 1
Składnia: Kod:
BRBS
b,cl27
1
—i n i c c c c
I - I
1 1 1 1 1 Liczba słów: 1 (2 bajty) 1
0
0
c
1
'
c
b
c i
b i
b i
Liczba cykli: 1, jeśli w a r u n e k niespełniony 2, jeśli w a r u n e k spełniony Flagi:
I
T
H
S
V
N
Z
C
Przykład: osC brbs
jestl:
nop
r0,3 6,jestl
; ładuj flagę T bitem 3 z rejestru rO ;skocz, jeśli flaga T została ustawiona
;tu skocz
BRCC - skok względny, jeśli flaga przeniesienia jest wyzerowana W a r u n k o w e rozgałęzienie p r o g r a m u . S p r a w d z a flagę przeniesienia ( C ) . Jeśli j e s t o n a w y z e r o w a n a , t o nastąpi s k o k w z g l ę d e m adresu w s k a z y w a n e g o p r z e z P C . Z a s i ę g s k o k u w y n o s i : P C - 6 3 < adres_skoku < P C + 6 4 . P a r a m e t r c l 2 7 j e s t p r z e s u n i ę c i e m z a p i s a n y m w k o d z i e u z u p e ł n i e n i a d o d w ó c h . R o z k a z ten j e s t odpowiednikiem B R B C 0 , 0 1 2 7 . Operacja:
Jeśli C = 0 , t o P C <— P C + c l 2 7 + 1 w przeciwnym przypadku P C
Składnia:
BRCC
PC + 1
cl27
Kod:
1 1 1 1 1 1 1 l _ l 1 Liczba słów: 1 ( 2 bajty)
0
i
1 c c i i
—i i i— c c c c c 0 0 0 i i i 1 1 1
Liczba cykli: 1, j e ś l i w a r u n e k niespełniony 2 , jeśli w a r u n e k spełniony
Flagi:
I
T
H
S
V
N
Z
Przykład: add brcc niec:
nop
r22,r23 niec
;dodaj r23 do r22 ;skocz, jeśli C=0 ;tu skocz
C
BRCS - skok względny, jeśli flaga przeniesienia jest ustawiona W a r u n k o w e rozgałęzienie p r o g r a m u . S p r a w d z a flagę przeniesienia (C). Jeśli j e s t ustawiona, nastąpi s k o k w z g l ę d e m b i e ż ą c e g o a d r e s u
wskazywanego
przez P C . Z a s i ę g skoku w y n o s i : P C - 6 3 < a d r e s _ s k o k u < P C + 6 4 . Parametr c l 2 7 j e s t przesunięciem z a p i s a n y m w k o d z i e u z u p e ł n i e n i a d o dwóch. Rozkaz ten jest o d p o w i e d n i k i e m BRBS 0 , c l 2 7 .
Operacja:
Jeśli C = l , to P C
Składnia: Kod:
BRCS c327 1 1 1 1
0
—i—
0
c
1
c c
1
c
1 'T c c c J
L__
Liczba słów: 1 (2 bajty)
o
o
o
1 1.
Liczba cykli: 1, jeśli w a r u n e k niespełniony 2, jeśli w a r u n e k spełniony
Flagi:
I
T
H
S
V
N
Przykład: cpi brcs
jestc:
nop
r26,S56 jestc
;porównaj r26 z liczbą $56 ;skocz, jeśli C=l
; tu skocz
BREAK-zatrzymaj CPU R o z k a z B R E A K j e s t w y k o r z y s t y w a n y przez s y s t e m y u r u c h o m i e n i o w e chip Debug,
On-
W o p r o g r a m o w a n i u aplikacyjnym nie j e s t s t o s o w a n y . P o w y k o
naniu r o z k a z u B R E A K j e d n o s t k a centralna m i k r o k o n t r o l e r a A V R w p r o w a d z o n a w tryb Stopped
Mode,
zostaje
c o stwarza m o ż l i w o ś ć dostępu d o w e
w n ę t r z n y c h z a s o b ó w m i k r o k o n t r o l e r a p r z e z d e b u g e r . Jeśli u s t a w i o n y j e s t k t ó r y ś z b i t ó w zabezpieczających albo bit konfiguracyjny (fuse bit) J T A G E N lub O C D E N j e s t n i e z a p r o g r a m o w a n y , C P U traktuje r o z k a z B R E A K j a k o N O P i n i e w c h o d z i w tryb Stopped
Mode.
R o z k a z B R E A K nie zosta! z a i m p l e m e n t o w a n y w e w s z y s t k i c h mikrokontrolerach
AVR,
w tym
wAT90S2313.
w notach k a t a l o g o w y c h .
Operacja:
Zatrzymanie CPU, P C < - P C + 1
Składnia:
BREAK
Kod:
1 1" I 1 , 0 , 0 , 1 1
0
1 0
1
I
1 0
J
10
1
Liczba stów: 1 (2 bajty)
1
1 0
0
0
1 1 1
Liczba cykli: 1 Flagi:
I
T
H
S
V
N
Z
C
Szczegóły
BREQ - skok względny, jeśli równe W a r u n k o w e rozgałęzienie p r o g r a m u . S p r a w d z a flagę zera ( Z ) . Jeśli jest usta wiona, to nastąpi skok w z g l ę d e m adresu w s k a z y w a n e g o p r z e z P C . Gdy roz kaz ten jest w y k o n y w a n y b e z p o ś r e d n i o p o C P , C P I , SUB l u b S U B I , skok zo stanie w y k o n a n y wtedy i tylko wtedy, g d y b i n a r n a liczba bez znaku lub ze z n a k i e m u m i e s z c z o n a w rejestrze Rd j e s t r ó w n a tak s a m o reprezentowanej liczbie zapisanej w rejestrze R s . Z a s i ę g s k o k u w y n o s i ; P C - 6 3 < adres_skoku < P C + 6 4 . P a r a m e t r c l 2 7 j e s t p r z e s u n i ę c i e m z a p i s a n y m w kodzie uzupeł nienia d o d w ó c h . Rozkaz ten jest o d p o w i e d n i k i e m BRBS 1 , c l 2 7 . Operacja:
Jeśli Z = l , czyli R d = R s , to P C < - P C + c l 2 7 + 1 w p r z e c i w n y m przypadku P C <— P C + 1
Składnia: Kod:
BREQ
cl27
1- I 1 1 1 1 1 1
1
1
1
0
1 c
i—i
>.,
c c
i — iI
c c c c 1—1 1 1
0
0
1
Liczba stów: 1 (2 bajty) Liczba cykli: 1, jeśli w a r u n e k niespełniony 2, jeśli w a r u n e k spełniony
F l 3 5 i :
t
T
H
S
V
N
Z
C
Przykład: cp breq równe:
nop
rl,rO równe
;porównaj rl z rO ;skocz, jeśli są równe
;tu skoc2
BRGE - skok względny, jeśli większy lub równy (rozpatrywane są liczby ze znakiem) W a r u n k o w e rozgałęzienie p r o g r a m u . S p r a w d z a flagę znaku (S). Jeśli j e s t w y z e r o w a n a , t o nastąpi s k o k w z g l ę d e m b i e ż ą c e g o a d r e s u w s k a z y w a n e g o p r z e z P C . G d y r o z k a z ten j e s t w y k o n y w a n y b e z p o ś r e d n i o p o C P , C P I , SUB lub S U B I , s k o k zostanie w y k o n a n y w t e d y i tylko w t e d y , g d y b i n a r n a liczba z e z n a k i e m u m i e s z c z o n a w rejestrze R d j e s t w i ę k s z a l u b r ó w n a od tak s a m o re p r e z e n t o w a n e j liczby zapisanej w rejestrze R s . Z a s i ę g skoku w y n o s i : P C 63 < adres_skoku < PC+64. Parametr c l 2 7 jest przesunięciem
zapisanym
w k o d z i e u z u p e ł n i e n i a d o d w ó c h . R o z k a z ten j e s t o d p o w i e d n i k i e m BRBC 4,cl27. Operacja:
Jeśli S = N © V = 0 , czyli R d > R s , to P C « - P C + c l 2 7 + 1 w p r z e c i w n y m p r z y p a d k u P C
Składnia:
BRGE
cl27
1 1 1 1 1 1 1 L J 1 Liczba słów: 1 ( 2 bajty)
Kod:
1 1 1 0 i 1 i_c i c
1 c
1
r c
1
1 c
1
1 c c
1 i
1 1 0 0 i i
Liczba cykli: 1, jeśli w a r u n e k niespełniony 2, jeśli w a r u n e k spełniony
Flagi:
I
T
H
S
V
N
Z
C
Przykład: cp brge niemn:
nop
rll,rl2 niemn
;porównaj rll z rl2 ;skocz, jeśli rll większy lub równy od rl2 ,• tu skocz
BRHC - skok względny, jeśli flaga przeniesienia pomocniczego jest wyzerowana W a r u n k o w e rozgałęzienie p r o g r a m u . S p r a w d z a flagę przeniesienia pomocni c z e g o (H). Jeśli j e s t w y z e r o w a n a , to nastąpi s k o k w z g l ę d e m bieżącego adresu wskazywanego
przez
PC.
Zasięg
skoku
wynosi:
P C - 6 3 < adres_sko-
k u < P C + 6 4 . P a r a m e t r c l 2 7 j e s t p r z e s u n i ę c i e m z a p i s a n y m w kodzie uzupeł nienia d o d w ó c h . R o z k a z ten j e s t o d p o w i e d n i k i e m BRBC 5 , c l 2 7 . Operacja:
Jeśli H = 0 , to P C < - P C + c l 2 7 + 1 w p r z e c i w n y m p r z y p a d k u P C <— P C + 1
Składnia:
Kod:
BRHC
cl27
1 1 T 1 1 1 1 Ł -1 1
—
0
_ _ J
1
'
c
'
—i -i—i— c c c c c c 1
1
»
1
.
0
i
1 i
liczba słów: 1 ( 2 bajty) Liczba cykli: 1, j e ś l i w a r u n e k niespełniony 2 , jeśli w a r u n e k spełniony
F l a
9'
:
I
T
H
S
V
N
Z
Przykład:
hzero:
brhc
hzero
nop
; tu skocz
;skocz, jeśli H=0
C
BRHS - skok względny, jeśli flaga przeniesienia pomocniczego jest ustawiona W a r u n k o w e rozgałęzienie p r o g r a m u . S p r a w d z a flagę przeniesienia p o m o c n i c z e g o ( H ) . Jeśli jest u s t a w i o n a , t o nastąpi s k o k w z g l ę d e m b i e ż ą c e g o adresu wskazywanego
przez
PC.
Zasięg
skoku
wynosi:
PC-63 < adres_sko-
ku < P C + 6 4 . P a r a m e t r c l 2 7 j e s t p r z e s u n i ę c i e m z a p i s a n y m w k o d z i e u z u p e ł nienia d o d w ó c h . R o z k a z ten j e s t o d p o w i e d n i k i e m B R B S 5 , c ! 2 7 . Operacja:
Jeśli H = l , to P C < - P C + c l 2 7 + 1 w przeciwnym przypadku P C
Składnia:
BRHS
PC + 1
cl27
r 1 1 1 1 1 1 1 1 1 Liczba słów: 1 (2 bajty)
Kod:
0
1 i
0
1 1 -1—i—i— 1 I 1 c c c c c c c 1 0 1 i 1 1 1 i i i
i
Liczba cykli: 1, j e ś l i w a r u n e k niespełniony 2, j e ś l i w a r u n e k spełniony
Flagi:
I
T
H
S
V
N
Z
Przykład:
hust:
brhs
hust
nop
;tu skocz
rskocz, jeśli
H=l
C
BR1D - skok względny, jeśli przerwania zablokowane W a r u n k o w e rozgałęzienie p r o g r a m u . S p r a w d z a flagę g l o b a l n e g o sterowania p r z e r w a n i a m i (I). Jeśli j e s t w y z e r o w a n a , to nastąpi skok w z g l ę d e m bieżącego adresu w s k a z y w a n e g o przez P C . Z a s i ę g skoku wynosi: P C - 6 3 < adres_skoku < P C + 6 4 . P a r a m e t r c l 2 7 j e s t p r z e s u n i ę c i e m z a p i s a n y m w kodzie uzupeł nienia d o d w ó c h . R o z k a z ten j e s t o d p o w i e d n i k i e m BRBC 7 , c l 2 7 . Operacja:
Jeśli 1=0, to P C « - P C + c l 2 7 + 1 w p r z e c i w n y m przypadku P C <— P C + 1
Składnia:
BR1D
Kod: Liczba
cl27
1 1 1 1
stów:
0
*
1 c •
•
c c
c
c c
c
1
1
1
1 (2 bajty)
Liczba cykli: 1, jeśli w a r u n e k niespełniony 2, jeśli w a r u n e k spełniony Flagi:
.
l
.
T
,
H
,
S
.
V
,
N
.
Z
,
C ^
PrzyMad: brid
bezp:
nop
bezp
;skocz, jeśli przerwania zablokowane
;tu skocz
BRIE - skok względny, jeśli przerwania odblokowane W a r u n k o w e rozgałęzienie p r o g r a m u . S p r a w d z a flagę g l o b a l n e g o sterowania p r z e r w a n i a m i (I). Jeśli j e s t ustawiona, to nastąpi s k o k w z g l ę d e m b i e ż ą c e g o adresu w s k a z y w a n e g o p r z e z P C . Z a s i ę g skoku w y n o s i : P C - 6 3 < a d r e s _ s k o ku < P C + 6 4 . P a r a m e t r c l 2 7 j e s t p r z e s u n i ę c i e m z a p i s a n y m w k o d z i e u z u p e ł nienia d o d w ó c h . R o z k a z ten j e s t o d p o w i e d n i k i e m BRBS 7 , c l 2 7 . Operacja:
Jeśli 1=1, t o P C
Składnia: Kod:
BRIE 1
cl 27 1
1
c
1 1 1 1 •
•
1
1
0
c
,°, ,
c
c
c
c
1
1
1
1 1 1
c 1
1
1
Liczba słów: 1 ( 2 bajty) Liczba cykli: 1, jeśli w a r u n e k niespełniony 2 , jeśli w a r u n e k spełniony
Flagi:
I
T
H
S
, -
V
N
Z
C
Przykład:
brie
zprz:
nop
zprz
;skocz, jeśli przerwania
;tu skocz
odblokowane
BRLO - skok względny, jeśli mniejszy (rozpatrywane są liczby bez znaku) W a r u n k o w e rozgałęzienie p r o g r a m u . S p r a w d z a flagę przeniesienia (C). Jeśli j e s t ona ustawiona, nastąpi s k o k w z g l ę d e m b i e ż ą c e g o adresu wskazywanego p r z e z P C . G d y r o z k a z ten jest w y k o n y w a n y b e z p o ś r e d n i o p o CP, C P I , SUB lub S U B I , skok zostanie w y k o n a n y wtedy i t y l k o w t e d y , g d y binarna liczba bez znaku umieszczona w rejestrze Rd j e s t m n i e j s z a od tak s a m o reprezento wanej liczby zapisanej w rejestrze R s . Z a s i ę g skoku w y n o s i : P C - 6 3 < adr e s _ s k o k u < P C + 6 4 . P a r a m e t r c l 2 7 j e s t p r z e s u n i ę c i e m z a p i s a n y m w kodzie uzupełnienia d o d w ó c h . R o z k a z ten j e s t o d p o w i e d n i k i e m BRBS 0 , c l 2 7 . Operacja:
Jeśli C = l , czyli R d < R s , to P C « - P C + c l 2 7 + 1 w p r z e c i w n y m p r z y p a d k u P C <— P C + I
Składnia:
Kod:
BRLO 1 1
1 l
cl27 1
t— :
1
1
'
'
0
i
0
i
c
1
c c c c c c
0
0
0
Liczba stów: 1 (2 bajty) Liczba cykli: 1, jeśli w a r u n e k niespełniony 2 , jeśli w a r u n e k spełniony
Flagi:
I
T
H
S
V
N
Z
C
Przykład: pętla:
eor inc
rt9,rl9 rl9
;zeruj r!9 ,-inkrementuj rl9
cpi brio nop
rl9,$10 pętla
;porównaj rl9 z liczbą $10 ;skacz, jeśli rl9<$10 (bez znaku) .•wyjście z pętli
BRLT - skok względny, jeśli mniejszy niż zero (rozpatrywane są liczby ze znakiem) W a r u n k o w e rozgałęzienie p r o g r a m u . S p r a w d z a flagę znaku ( S ) . Jeśli j e s t o n a u s t a w i o n a , t o nastąpi s k o k w z g l ę d e m b i e ż ą c e g o adresu w s k a z y w a n e g o p r z e z P C . G d y r o z k a z ten j e s t w y k o n y w a n y b e z p o ś r e d n i o p o C P , C P I , SUB lub S U B I , s k o k zostanie w y k o n a n y wtedy i tylko w t e d y , gdy b i n a r n a liczba z e z n a k i e m u m i e s z c z o n a w rejestrze R d jest mniejsza o d tak s a m o reprezento wanej liczby zapisanej w rejestrze R s . Z a s i ę g s k o k u w y n o s i : P C - 6 3 < adres_skoku < PC+64. Parametr c l 2 7 jest przesunięciem zapisanym w kodzie uzupełnienia d o d w ó c h . R o z k a z t e n jest o d p o w i e d n i k i e m BRBS 4 , c l 2 7 . Operacja:
Jeśli S = N © V = 1 , czyli R d < R s , to P C < - P C + c l 2 7 + 1 w przeciwnym przypadku P C < - P C + 1
Składnia:
Kod:
BRLT
cl27
I T 1 1 1 1 1
0
1• j n 0 c c
T
c
T
1
c
c c c
V
N
1 0
0
Liczba stów: 1 ( 2 bajty) Liczba cykli: 1, jeśli w a r u n e k niespełniony 2, jeśli w a r u n e k spełniony
Flagi:
I
T
H
S
Z
C
Przykład: cp rl6,rl brlt mniejsze mniejsze: nop
.-porównaj rl6 z rl ;skok, jeśli rl6
(ze znakiem)
BRMI - skok względny, jeśli wartość ujemna W a r u n k o w e rozgałęzienie p r o g r a m u . S p r a w d z a flagę wartości ujemnej (N). Jeśli j e s t o n a ustawiona, to nastąpi skok w z g l ę d e m b i e ż ą c e g o adresu wskazy w a n e g o przez P C . Z a s i ę g skoku wynosi: P C - 6 3 < a d r e s _ s k o k u < P C + 6 4 . Pa r a m e t r c l 2 7 jest przesunięciem z a p i s a n y m w k o d z i e uzupełnienia d o dwóch. R o z k a z ten jest o d p o w i e d n i k i e m BRBS 2 , c l 2 7 . Operacja:
Jeśli N = l , to P C
Składnia:
BRMI
cl27
Kod:
1 1 1 1 1 _,l J Liczba stów: 1 (2 bajty)
0
•
c
0
i
c c
c
—1
c c 0
c 1
_. t
1
1 0 1 1
Liczba cykli: 1, jeśli w a r u n e k niespełniony 2 , jeśli w a r u n e k spełniony
F
lag'
:
I
T
H
S
V
N
Z
C
Przykład: subi brmi ujemny: nop
rl8,4 ujemny
,• odejmij liczbę 4 od rl8 ;skocz, jeśli wynik ujemny ;tu skocz
BRNE - skok względny, jeśli nie równe W a r u n k o w e rozgałęzienie p r o g r a m u . S p r a w d z a flagę z n a k u (Z). Jeśli j e s t o n a w y z e r o w a n a , to nastąpi s k o k w z g l ę d e m b i e ż ą c e g o adresu
wskazywanego
przez P C . G d y r o z k a z ten jest w y k o n y w a n y b e z p o ś r e d n i o p o C P , C P I , SUB lub S U B I , s k o k zostanie w y k o n a n y wtedy i t y l k o w t e d y , gdy b i n a r n a liczba ze z n a k i e m lub bez z n a k u u m i e s z c z o n a w rejestrze R d jest różna o d tak s a m o reprezentowanej
liczby
zapisanej
w rejestrze
R s . Z a s i ę g skoku
PC-63 < adres_skoku < PC+64. Parametr c l 2 7 jest przesunięciem n y m w kodzie uzupełnienia do dwóch. Rozkaz ten jest BRBC Operacja:
l,cl27.
Jeśli Z = 0 , czyli R d * R s , to P C < - P C + c l 2 7 + 1 w przeciwnym przypadku PC « - PC + 1
Składnia: Kod:
BRNE
cl27
1 1 1 1 1 1 1
0
c
1
c
—i—i—i—
c 1
Liczba słów: 1 (2 bajty)
c c c c ,1,, „1 1.
1
1 0
i
1 0
i
1 i
Liczba cykli: 1, jeśli w a r u n e k niespełniony 2, jeśli w a r u n e k spełniony
Flagi:
I
T
H
S
V
N
Z
C
Przykład: pętla:
eor inc
r27,r27 r27
,-zeruj r27 ;inkrementuj r27
cpi brne nop
r27,5 pętla
;porównaj r27 z liczba 5 ;skacz, jeśli r27o5 .•wyjście z pętli
wynosi: zapisa
odpowiednikiem
BRPL - skok względny, jeśli wartość dodatnia W a r u n k o w e rozgałęzienie p r o g r a m u . S p r a w d z a flagę w a r t o ś c i ujemnej (N). Jeśli j e s t ona w y z e r o w a n a , to nastąpi s k o k w z g l ę d e m b i e ż ą c e g o adresu wska z y w a n e g o p r z e z P C . Zasięg skoku wynosi: P C - 6 3 < a d r e s _ s k o k u < PC+64. P a r a m e t r c l 2 7 j e s t p r z e s u n i ę c i e m z a p i s a n y m w k o d z i e uzupełnienia do d w ó c h . R o z k a z ten jest o d p o w i e d n i k i e m BRBC 2 , c l 2 7 . Operacja:
Jeśli N = 0 , to P C < - P C + c l 2 7 + 1 w przeciwnym przypadku PC + - P C + 1
Składnia: Kod:
BRPL
cl27 j
1 1 1 1
0
1 c
_—i—r
c c
_j—
i
c
r —
c
c c
I-I 1 0 1 0 i
i
i
Liczba słów: 1 (2 bajty) Liczba cykli: 1, jeśli w a r u n e k niespełniony 2, jeśli w a r u n e k spełniony
Flagi:
I
T
H
S
V
N
Z
C
Przykład: subi brpl dodatni: nop
r26,S50 dodatni
jodejmij liczbę $50 od r26 ,-skocz, jeśli wynik dodatni ;tu skocz
(r26>=0)
BRSH - skok względny jeśli większy lub równy (rozpatrywane są liczby bez znaku) W a r u n k o w e rozgałęzienie p r o g r a m u . S p r a w d z a flagę przeniesienia (C). Jeśli j e s t w y z e r o w a n a , to nastąpi s k o k w z g l ę d e m b i e ż ą c e g o adresu w s k a z y w a n e g o przez P C . G d y r o z k a z ten j e s t w y k o n y w a n y b e z p o ś r e d n i o p o C P , C P I , SUB lub S U B I , s k o k zostanie w y k o n a n y wtedy i t y l k o w t e d y , gdy b i n a r n a liczba bez z n a k u u m i e s z c z o n a w rejestrze R d j e s t w i ę k s z a lub r ó w n a o d tak s a m o reprezentowanej
liczby
zapisanej
w rejestrze
R s . Z a s i ę g skoku
PC-63 < adres_skoku < PC+64. Parametr c l 2 7 jest przesunięciem n y m w k o d z i e uzupełnienia d o d w ó c h . R o z k a z ten j e s t BRBC Operacja:
0,0127.
Jeśli C = 0 , czyli R d > R s , to P C i- P C + c l 2 7 + 1 w p r z e c i w n y m p r z y p a d k u P C «— P C + 1
Składnia:
Kod:
BRSH 1
r i
1
cl27 t
1
i
1
i
1
1
0
i
I
1
i
c
1 I
1
r
c
c
I
c 1
1 c
1
-1 1 1 c c 0 0 0 1 i . t
Liczba słów: 1 ( 2 bajty) Liczba cykli: 1, jeśli w a r u n e k niespełniony 2 , jeśli w a r u n e k spełniony
Flagi:
I
T
H
S
V
N
Z
C
Przykład: subi brsh większy;
nop
rl9,4 większy
;odejmij liczbę 4 od rl9 ;skocz, jeśli rl9>=4 ;tu skocz
wynosi: zapisa
odpowiednikiem
BRTC - skok względny, jeśli flaga T jest wyzerowana W a r u n k o w e rozgałęzienie p r o g r a m u . S p r a w d z a flagę p o m o c n i c z ą (T). Jeśli j e s t ona w y z e r o w a n a , to nastąpi skok w z g l ę d e m b i e ż ą c e g o adresu wskazywa n e g o przez P C . Z a s i ę g skoku w y n o s i : P C - 6 3 < a d r e s _ s k o k u £ PC+64. Para m e t r c l 2 7 j e s t p r z e s u n i ę c i e m z a p i s a n y m w k o d z i e u z u p e ł n i e n i a d o dwóch R o z k a z ten j e s t o d p o w i e d n i k i e m BRBC 6 , c l 2 7 . Operacja:
Jeśli T = 0 , to P C < - P C + c l 2 7 + 1 w p r z e c i w n y m przypadku P C <— P C + 1
Składnia:
BRTC
cl27
1 1 -1 1 1 1 1 1 Liczba stów: 1 (2 bajty) Kod:
1
1 • 1 •—
f
0
1
1
1
c
'
i — i
c
c
1
i
-
c
c
•
c
'
1
C 1
1 1
0 1
Liczba cyMi: 1, jeśli w a r u n e k niespełniony 2, jeśli w a r u n e k spełniony Flagi:
I
T
H
S
V
N
Przykład: bst brtc
tzero:
nop
r3,5 tzero
;umieść bit 5 rejestru r3 w znaczniku T ;skocz, jeśli ten bit jest wyzerowany
;tu skocz
BRTS - skok względny, jeśli flaga T jest ustawiona W a r u n k o w e rozgałęzienie p r o g r a m u . S p r a w d z a flagę p o m o c n i c z ą ( T ) . Jeśli j e s t o n a u s t a w i o n a , to nastąpi s k o k w z g l ę d e m b i e ż ą c e g o adresu w s k a z y w a n e go przez PC. Zasięg skoku wynosi: PC-63 < adres_skoku < PC+64. Parametr c ! 2 7 jest przesunięciem zapisanym w kodzie uzupełnienia do dwóch. Rozkaz ten j e s t o d p o w i e d n i k i e m BRBS 6 , c l 2 7 . Operacja:
Jeśli T = l , t o P C < - P C + c ! 2 7 + 1 w p r z e c i w n y m p r z y p a d k u P C <— P C + 1
Składnia:
Kod:
BRTS
cl27
r——r——i
1 1 1 1
1
0
i
0
c
i—i
c c
1
c c 1
1
c c
1
1
0
Liczba słów: 1 ( 2 bajty) Liczba cykli: 1, j e ś l i w a r u n e k n i e s p e ł n i o n y 2, jeśli w a r u n e k spełniony
Flagi:
I
T
H
S
V
N
Z
C
Przykład: bst brts tust:
nop
r3,5 tust
;umieść bit 5 rejestru r3 w znaczniku T ;skocz, jeśli bit T jest ustawiony ;tu skocz
BRVC - skok względny, jeśli flaga przepełnienia jest wyzerowana W a r u n k o w e rozgałęzienie p r o g r a m u . S p r a w d z a flagę przepełnienia (V). Jeśli j e s t o n a w y z e r o w a n a , to nastąpi s k o k w z g l ę d e m b i e ż ą c e g o adresu wskazywa n e g o przez P C . Z a s i ę g s k o k u wynosi: P C - 6 3 < a d r e s _ s k o k u < P C + 6 4 . Para metr c l 2 7 j e s t p r z e s u n i ę c i e m z a p i s a n y m w k o d z i e u z u p e ł n i e n i a d o dwóch. R o z k a z t e n j e s t o d p o w i e d n i k i e m BRBC 3 , c l 2 7 .
Operacja:
Jeśli V = 0 , to P C < - P C + c l 2 7 + 1 w p r z e c i w n y m p r z y p a d k u P C *— P C + 1
Składnia: Kod:
BRYC v
cl27 i — i
1 1 1 1 • 1 Liczba słów: 1 ( 2 bajty) 1
-
T"
O l c e • ' '
c
'
1" 1
c c 1
1
c c !
o
1 1
1 1 1
Liczba cykli: 1, jeśli w a r u n e k niespełniony 2, jeśli w a r u n e k spełniony
Flagi:
I
T
H
S
V
N
Przykład: add brvc
niev:
nop
r3, r4 niev
;dodaj r4 do r3 ;skocz, jeśli nie było przepełnienia
,-tu skocz
BRVS - skok względny, jeśli flaga przepełnienia jest ustawiona W a r u n k o w e rozgałęzienie p r o g r a m u . S p r a w d z a flagę przepełnienia ( V ) . Jeśli j e s t o n a u s t a w i o n a , to nastąpi s k o k w z g l ę d e m b i e ż ą c e g o adresu w s k a z y w a n e g o p r z e z P C . Z a s i ę g skoku wynosi: P C - 6 3 < a d r e s _ s k o k u < P C + 6 4 . P a r a m e t r c l 2 7 jest przesunięciem zapisanym w kodzie uzupełnienia d o dwóch. Rozkaz ten j e s t o d p o w i e d n i k i e m BRBS 3 , c l 2 7 . Operacja:
Jeśli V = I , t o P C « - P C + c l 2 7 + 1 w przeciwnym przypadku P C « - P C + 1
Składnia:
Kod:
BRYC 1
cl27 1
1
1 1 1 1
1 — 1
0 0 c
1 1 c c c
r
r '
c
c c
Uczba słów: 1 (2 bajty)
0 1 1
1
1
.
Liczba cykli: 1, j e ś l i w a r u n e k niespełniony 2, j e ś l i w a r u n e k s p e ł n i o n y
Flagi:
I
T
H
S
Y
N
Z
C
Przykład: add brvs przep: nop
r3, r4 przep
; dodaj r4 do r3 ;skocz, jeśli nastąpiło przepełnienie ,-tu skocz
BSET - ustaw flagę w rejestrze SREG R o z k a z ustawia w y b r a n y bit (flagę) w rejestrze s t a t u s o w y m S R E G . Operacja:
SREG(b) <- 1 P C < - PC + 1
Składnia:
BSET
Kod:
1 0
b 0
1
0
0 0
1 0
b
b
b
1 0
0
0
Liczba stów: 1 (2 bajty) Liczba cykli: 1 Flagi:
I
T
H
S
V
N
Z
C
1, jeśli b = 7 , w p r z e c i w n y m p r z y p a d k u b e z z m i a n y . 1, jeśli b = 6 , w p r z e c i w n y m p r z y p a d k u b e z z m i a n y . 1, jeśli b = 5 , w p r z e c i w n y m p r z y p a d k u b e z z m i a n y . 1, jeśli b = 4 , w p r z e c i w n y m p r z y p a d k u b e z z m i a n y . 1, jeśli b = 3 , w p r z e c i w n y m p r z y p a d k u b e z z m i a n y . 1, jeśli b = 2 , w p r z e c i w n y m p r z y p a d k u b e z z m i a n y . 1, jeśli b = l , w p r z e c i w n y m p r z y p a d k u bez z m i a n y . 1, jeśli b = 0 , w p r z e c i w n y m p r z y p a d k u b e z z m i a n y . Przykład: bset bset
;ustaw flagę T ;odblokuj przerwania
BST - zachowaj bit rejestru w znaczniku T R o z k a z u m i e s z c z a bit b rejestru R s w z n a c z n i k u T rejestru
statusowego
SREG. Operacja:
T < - Rs(b) PC <- PC + 1
Składnia:
BST
Rs,b
i
Kod: 1
i—i—
1
1
1
0
1
-1—i—i—
s s
1
s
s 0
s
b
b
b
Liczba słów: 1 ( 2 bajty) Liczba cykli: 1 Flagi:
1
T
H
S
V
N
Z
C
T : O jeśli bit b w rejestrze R s j e s t w y z e r o w a n y , 1 w p r z e c i w n y m p r z y p a d k u . f
Przykład: bst bid
rl,2 r0,4
;umieść bit 2 rejestru rl w znaczniku T ; kopiuj Ełagę T do bitu 4 rejestru rO
CALL - dalekie wywołanie podprogramu W y w o ł a n i e p o d p r o g r a m u u m i e s z c z o n e g o w d o w o l n y m m i e j s c u pamięci pro g r a m u . A d r e s p o w r o t u (adres następnego r o z k a z u p o rozkazie wywołania p o d p r o g r a m u ) j e s t z a w s z e odkładany na stosie. K a ż d o r a z o w o p o odłożeniu j e d n e g o bajtu, w s k a ź n i k stosu ( S P H . S P L ) j e s t d e k r e m e n t o w a n y (zmniejszany o jeden).
R o z k a z CALL nie został z a i m p l e m e n t o w a n y w e wszystkich mikrokontrolerach
AVR,
w tym
wAT90S2313
(szczegóły
w notach k a t a l o g o w y c h ) . W i n n y c h m i k r o k o n t r o l e r a c h
AVR
j e g o działanie m o ż e b y ć różne w zależności o d wielkości ob sługiwanej p a m i ę c i programu. M o ż l i w e są wersje 16-bitowego adresu (128 k B p a m i ę c i ) lub adresu 2 2 - b i t o w e g o (8 M B pamię ci). T r z e b a p a m i ę t a ć , że s ł o w o zawierające k o d rozkazu w mik rokontrolerach A V R m a d ł u g o ś ć 16-bitów ( d w a bajty). Stąd n p . 16-bitowa przestrzeń a d r e s o w a w y m a g a 128 k B pamięci.
Operacja:
( S P H : S P L ) < - P C + 1 (odłóż adres p o w r o t u n a stos) S P H : S P L
Składnia:
CALL
adr64k
lub CALL
Kod:
adr4M
1 'o'o'1 0 V o ' a I I I a j ,a | a 1a _ a a a a 1 1 l___ i
•
~
—
r
i
a
a
i
a
a
1
1
— i i
a —
i
a a — •
i
1 i
a a
a .
a \ —
a i
a i
Liczba stów: 2 (4 bajty) Liczba cykłi: 4 dla adresu 16-bitowego 5 dla adresu 2 2 - b i t o w e g o Flagi:
I
T
H
S
V
N
Z
C
Przykład: mov cali
rl6,rO spr
;kopiuj rO do rl6 ,-wywolaj podprogram
spr:
cpi breg
rl6,$42 error
.-sprawdź, czy rl6 ma wartość $42 ;skocz, jeśli tak
error:
rjmp
error
;zapętl program
CBI - zeruj bit w rejestrze we/wy Zerowanie wyspecyfikowanego bitu w rejestrze w e / w y . R o z k a z działa tylko r „niskich" rejestrach tego obszaru (o adresach z przedziału 0...31 ($00...$1F)). Operacja:
PI(b) <-~ 0 PC < - PC + 1
Składnia:
CBI
Kod:
1
PI,b 0 0
1
0 p.p.p.p
0 0
1
P, b
b
b
Liczba słów: 1 (2 bajty) Liczba cykli: 2 Flagi:
1
T
H
s
V
N
Z
C
Przykład: cbi
$12,7
; zeruj bit 7 w porcie D
CBR - zeruj bity w rejestrze Zerowanie wyspecyfikowanych
b i t ó w w „ g ó r n y m " rejestrze R h .
Rozkaz
realizuje operacje iloczynu l o g i c z n e g o A N D p o m i ę d z y zawartością rejestru R h i u z u p e ł n i e n i e m m a s k i będącej p a r a m e t r e m r o z k a z u . O z n a c z a to, że z o staną w y z e r o w a n e te bity rejestru, k t ó r y m odpowiadają bity o wartości „ 1 " w masce. Operacja:
Rh < - Rh A (SFF - c255) PC « - PC + 1
Składnia:
Rh,c255
CBR 1
Kod:
0
r
1
1 1 1 t
I
I
1
1
c
c i
1
c :
c i
h h h h i
1
1
— i — i — i —
c
c
c
c
1 1 1
K o d r o z k a z u CBR j e s t p o d o b n y j a k A N D I , przy c z y m bity c odpowiadają l o g i c z n e m u u z u p e ł n i e n i u ( c o m p l e m e n t ) stałej c 2 5 5 ( S F F - c 2 5 5 ) Liczba słów: 1 (2 bajty) Liczba cykli: 1 1
Flagi:
T
— S:
H
—
S
V 0
N -«-*•
Z
c
—
w y k o r z y s t y w a n a d o s p r a w d z a n i a znaku w y n i k u .
V : 0. N : u s t a w i a n a , jeśli M S B został ustawiony, w p r z e c i w n y m p r z y p a d k u z e r o wana. Z : u s t a w i a n a , jeśli w y n i k j e s t r ó w n y z e r o , w p r z e c i w n y m p r z y p a d k u z e r o wana. Przykład: cbr cbr cbr
rl6,$f0 rl8,l rl7,0
;zeruj starszy półbajt rejestru rl6 ;zeruj bit 0 w rl8 ;bez żadnej akcji, rl7 bez zmian!
CLC - zeruj flagę przeniesienia R o z k a z zeruje flagę przeniesienia (C) w rejestrze s t a t u s o w y m S R E G .
Operacja:
C <- 0 PC
Składnia:
PC + 1
CLC • 'i
Kod:
1 0
i
1
i
0
— i — i — i —
1
0
1 0
0
— i —
1 0
i
'i
0
™
0
1
0 0
0
Liczba słów: 1 (2 bajty) Liczba cykli: 1 Flagi:
I
T
H
S
V
N
Z
c 0
C: O Przykład: add cle
rO,rO
;dodaj do siebie rO ;2eruj
flagę przeniesienia
CLH - zeruj flagę przeniesienia pomocniczego R o z k a z zeruje flagę przeniesienia p o m o c n i c z e g o ( H ) w rejestrze s t a t u s o w y m SREG. Operacja:
H «- 0 PC <- PC + 1
Składnia:
CLH
Kod:
0 0
1
1
0
1
0
0
1
1 0
1
1
0 0
0
Liczba słów: 1 (2 bajty) Liczba cykli: 1 Flagi:
I
T
H
S
—
—
0
—
V
N
Z
c
—
—
—
H: O Przykład:
cih
;zeruj flagę przeniesienia pomocniczego
CLI - zeruj flagę przerwań R o z k a z zeruje flagę g l o b a l n e g o sterowania p r z e r w a n i a m i (I) w rejestrze sta t u s o w y m S R E G . P o w y z e r o w a n i u flagi I n a t y c h m i a s t zostaną zablokowane w s z e l k i e p r z e r w a n i a mikrokontrolera, nawet j e ś l i nastąpią w chwili wykony w a n i a rozkazu C L I . Operacja:
I«- 0 PC<-PC+1
Składnia: Kod:
CLI i
;1'0
0
1
0
1
0
0
iI —
1
1 1
1
0 0
1 1
0
Liczba stów: 1 (2 bajty) Liczba cykli: 1 I
Flagi:
T
H
S
V
N
Z
c
0 1:0 Przykład: .def
temp; rl6 in
temp,sreg
cli sbi sbi out
eecr,eemwe eecr,eewe sreg,temp
;zachowaj rejestr statusowy (temp musi być ;zdefiniowany przez użytkownika) ;zablokuj przerwania ;start zapisu pamięci EEPROM ;odtwórz stan procesora
(w tym przerwania}
CLN - zeruj flagę wartości ujemnej R o z k a z zeruje flagę wartości ujemnej ( N ) w rejestrze s t a t u s o w y m S R E G . Operacja:
N <— 0 PC<-PC+1
Składnia: Kod:
CLN 1
'
0
0
1
0
1
0
0
1
r—r—
1 0
Liczba stów: 1 ( 2 bajty)
1 0
1
1 0
1 1 0 0
.-
Liczba cykli: 1 Flagi:
1
—
T
H
—
—
add cln
r2,r3
s
—
V
N
—
0
z
c
— —
N: O Przykład: ;dodaj r3 do r2 ;zeruj flagę wartości ujemnej
CLR - zeruj rejestr Z e r o w a n i e zawartości rejestru R d . R o z k a z w y k o n u j e operację E x - O R (Exclusive OR) której a r g u m e n t e m j e s t ten s a m rejestr R d . W y n i k i e m takiego dzia łania j e s t w y z e r o w a n i e wszystkich bitów rejestru R d . Operacja:
Rd <- Rd ® Rd PC
Składnia:
PC + 1
CLR
Kod:
0
Rd 0
I
1 0 0 •
1
d d
1 d
d
i—i—_J—>—i
patrz też r o z k a z EOR
d d
d
d i_
d i
_
d i
—
Rd, Rs
Liczba stów: 1 (2 bajty) Liczba cykli: 1 T
H
S
V
N
Z
c
— —
—
0
0
0
1
—
1
S: 0. V : 0.
N: 0. Z:
1.
Przykład: pętla:
clr inc
rl8 rl8
;zeruj rl8 rinkrementuj rl8
cpi brne
rl8,$50 pętla
;porównaj r!8 z liczbą $50 ;zapętl, jeśli nierówne
CLS - zeruj flagę znaku R o z k a z zeruje flagę znaku (S) w rejestrze s t a t u s o w y m S R E G .
Operacja:
S <- 0 PC
Składnia:
PC + 1
CLS
Kod:
1
0 0
1
0
1
0
0
1
1 0
0
—i
1
0 0
0
Liczba słów: 1 ( 2 bajty)
Liczba cykli: 1 Flagi:
S:
I
T
H
s
—
—
—
0
add cis
r2,r3
V
N
—
z
0
Przykład: ;dodaj r3 do r2 ;zeruj flagę znaku
c
CLT - zeruj flagę pomocniczą T R o z k a z zeruje flagę p o m o c n i c z ą (T) w rejestrze s t a t u s o w y m S R E G . Operacja:
T *r- O PC <- PC + 1
Składnia:
CLT
Kod:
1 ' 0 '0 '1
0
1
0
0
1
1
1
0
1
0
0
0
Liczba stów: 1 (2 bajty) Liczba cykli: 1 Hani:
(
—
T 0
H
S
V
N
T: O Przykład: clt
;zeruj flagę T
Z
C
CLV - zeruj flagę przepełnienia uzupełnienia do dwóch R o z k a z zeruje flagę przepełnienia (V) w rejestrze s t a t u s o w y m S R E G .
Operacja:
V <- 0 P C <— P C + 1
Składnia: Kod:
CLV — i — i i — i —
1
0 0
1
0
1
0
0
1
0 1
1
1
0 0
0
Liczba słów: 1 (2 bajty) Liczba cykli: 1 Flagi:
s
I
T
H
—
—
— —
add civ
r2, r3
V
N
z
0
—
—
c
—
V: 0 Przykład: ; dodaj r3 do r2 ;zeruj flagę przepełnienia
CLZ - zeruj flagę zera R o z k a z zeruje flagę 2 w rejestrze s t a t u s o w y m S R E G . Operacja:
Z <- 0 PC<-PC + 1
Składnia:
CLZ
Kod:
1 0
0
1
0
0 1 0
1 0
0
1
1 0
0
0
Liczba stów: 1 (2 bajty) Liczba cykli: 1 Flagi:
I
T
H
S
V
N
Z
c
0
—
Z: O Przykład: add clz
r2,r3
; dodaj r3 do r2 ;zeruj flagę Z
COM - oblicz uzupełnienie do jedności R o z k a z oblicza u z u p e ł n i e n i e d o j e d n o ś c i Zawartości rejestru Rd, czyli neguje w s z y s t k i e j e g o bity. W y n i k j e s t u m i e s z c z a n y w rejestrze R d . Operacja:
R d
Składnia:
Rd
COM
Kod:
1
0 0
1
0
1
d d d d d 0
0
0 0
0
Liczba stów: 1 (2 bajty) Liczba cykli: 1 T
I
Flagi:
— S:
H
_ —
S
V
N
Z
0
c 1
w y k o r z y s t y w a n a d o sprawdzania znaku wyniku.
V: 0. N : ustawiana, j e ś l i M S B został ustawiony, w p r z e c i w n y m p r z y p a d k u zero wana. Z : ustawiana, j e ś l i w y n i k jest r ó w n y zeru, w p r z e c i w n y m p r z y p a d k u zero wana. C:
ustawiana.
Przykład:
zero:
ldi com
rl6,Saa rl6
breq
zero
nop
rl6=1010ł010b oblicz uzupełnienie do jedności w r!6 w tym przypadku rl6=01010101b skocz, jeśli zero
;dalsze obliczenia
CP - porównaj zawartość rejestrów P o r ó w n a n i e zawartości rejestrów R d i R s bez z m i a n y ich stanu. R o z k a z ten m o ż e b y ć w y k o r z y s t y w a n y d o realizacji s k o k ó w w a r u n k o w y c h .
Operacja:
R d - Rs PC <- PC + 1
Składnia:
CP
Kod:
Rd,Rs
0
0
0
1
0
1
s
d
d
d
d
d
1
—i
s
s
r~'
s
s
Liczba słów: 1 (2 bajty) Liczba cykli: 1 Flagi:
1
T
H
S
V
N
Z
C
H : ustawiana, jeśli nastąpiło przeniesienie z bitu 3, w p r z e c i w n y m przypad ku z e r o w a n a . S:
w y k o r z y s t y w a n a d o s p r a w d z a n i a znaku w y n i k u .
V : ustawiana, jeśli nastąpiło przepełnienie operacji u z u p e ł n i e n i a d o dwóch, w przeciwnym przypadku zerowana. N : ustawiana, j e ś l i M S B został u s t a w i o n y , w p r z e c i w n y m p r z y p a d k u zero wana. Z : ustawiana, j e ś l i w y n i k j e s t r ó w n y zeru, w p r z e c i w n y m p r z y p a d k u zero wana. C : ustawiana, jeśli wartość b e z w z g l ę d n a z a w a r t o ś c i rejestru Rs jest większa niż wartość b e z w z g l ę d n a zawartości rejestru Rd, w p r z e c i w n y m przypad ku zerowana.
Przykład: cp brne
rożne:
nop
r4,rl9 rożne
;porównaj r4 z rl9 ; skocz, jeśli r4 o
;dalsze obliczenia
rl9
CPC - porównaj zawartość rejestrów z uwzględnieniem flagi przeniesienia P o r ó w n a n i e z a w a r t o ś c i rejestrów R d i R s (bez zmiany i c h stanu) u w z g l ę d n i a j ą c przy t y m stan flagi przeniesienia (C) przed operacją. R o z k a z ten m o ż e b y ć w y k o r z y s t y w a n y d o realizacji s k o k ó w w a r u n k o w y c h . Jest t o o d p o w i e d nik rozkazu SBC, przy c z y m w y n i k operacji nie jest nigdzie z a p i s y w a n y . T y p o w y m z a s t o s o w a n i e m m o ż e b y ć p o r ó w n a n i e d w ó c h rejestrów 16-bitowych z ł o ż o n y c h z p a r rejestrów. Operacja:
Rd-Rs-C PC <- PC + 1
Składnia:
CPC
Kod:
Rd.Rs
oooo 1
1
0
1
s
1
i—*
d
'
d —
1
d
1
d
d •— s
i
R
s
I
s
-
s
Liczba słów: 1 ( 2 bajty) Liczba cykli: 1 Flagi:
I
T
H
S
V
N
Z
C
H: ustawiana, jeśli nastąpiło przeniesienie z bitu 3, w p r z e c i w n y m p r z y p a d ku z e r o w a n a . S:
w y k o r z y s t y w a n a d o sprawdzania znaku wyniku.
V : ustawiana, jeśli nastąpiło przepełnienie operacji u z u p e ł n i e n i a d o d w ó c h , w przeciwnym przypadku zerowana. N : ustawiana, jeśli M S B został ustawiony, w p r z e c i w n y m p r z y p a d k u z e r o wana. Z : ustawiana, jeśli w y n i k j e s t r ó w n y zeru, w p r z e c i w n y m p r z y p a d k u zero wana. C : ustawiana, jeśli w a r t o ś ć b e z w z g l ę d n a zawartości rejestru Rs plus flaga przeniesienia sprzed operacji j e s t większa niż w a r t o ś ć b e z w z g l ę d n a za wartości rejestru Rd, w p r z e c i w n y m p r z y p a d k u z e r o w a n a . Przykład: cp cpc brne
rożne:
nop
r2,r0 r3,rl rożne
;porównaj rejestry 16-bitowe r3:r2 z rl:rO ,-porównaj młodsze rejestry ,-porównaj starsze rejestry ;skocz, jeśli r4 o r!9
;dalsze obliczenia
CPI - porównaj rejestr ze stalą P o r ó w n a n i e zawartości rejestru R h z e stalą c 2 5 5 . Stan rejestru R h nie ulega z m i a n i e . R o z k a z ten m o ż e być" w y k o r z y s t y w a n y d o realizacji s k o k ó w warun kowych. Operacja;
R h - c255 PC
Składnia:
PC + 1
4r-
CPI
Rh,c255
- 1 1 1 0 0 t 1 1 Liczba słów: 1 (2 bajty) Kod:
c
1 i
1
c
i—i
1 1— — 1 c c h h
i
i —
h r
1
i—•
h c '—
c
i — i —
c
c
Liczba cykli: 1 Flagi:
I
T
H
S
V
N
Z
C
H : ustawiana, j e ś l i nastąpiło przeniesienie z bitu 3 , w p r z e c i w n y m przypad ku zerowana. S:
w y k o r z y s t y w a n a d o s p r a w d z a n i a znaku w y n i k u .
V : ustawiana, j e ś l i nastąpiło przepełnienie operacji u z u p e ł n i e n i a d o dwóch, w przeciwnym przypadku zerowana. N : ustawiana, j e ś l i M S B został u s t a w i o n y , w p r z e c i w n y m p r z y p a d k u zero wana. Z : ustawiana, j e ś l i w y n i k j e s t r ó w n y zeru, w p r z e c i w n y m p r z y p a d k u zero wana. C : ustawiana, j e ś l i w a r t o ś ć b e z w z g l ę d n a stałej c 2 5 5 j e s t w i ę k s z a niż wartość b e z w z g l ę d n a zawartości rejestru Rd, w p r z e c i w n y m p r z y p a d k u zerowana. Przykład: cpi brne
rl9nie3:
rl9,3 r!9nie3
;porównaj rl9 z liczbą 3 ;skocz, jeśli rl9 o 3
nop
;dalsze obliczenia
CPSE - porównaj i skocz, jeśli równe R o z k a z p o r ó w n u j e zawartość rejestrów R d i R s , p o c z y m kolejny r o z k a z nie j e s t w y k o n y w a n y , jeśli zawartości rejestrów są j e d n a k o w e . Stan rejestrów n i e ulega z m i a n i e . Operacja:
Jeśli R d = R s , t o P C <— P C + 2 ( l u b P C + 3) w p r z e c i w n y m p r z y p a d k u P C
Składnia:
Kod:
CPSE
Rd.Rs 1
0
0 1
0 1
1
0
0
s
d
d
,
d
,
d
,
S
d
r——r—— S
.
'
S
i
S
i
Liczba słów: 1 (2 bajty) Liczba cykli: 1, j e ś l i w a r u n e k j e s t niespełniony ( b e z p r z e s k o k u ) 2 , jeśli w a r u n e k j e s t spełniony i następuje p r z e s k o k rozkazu
złożonego
z 1 słowa 3 , jeśli w a r u n e k j e s t spełniony i następuje
p r z e s k o k rozkazu
z 2 słów Flagi:
I
T
H
S
V
N
Z
C
Przykład: inc cpse neg nop
r4 r4,r0 r4
,-powiększ r 4 ; p o r ó w n a j r 4 z rO ,-wykonuj t y l k o w t e d y , ,-nastepne o p e r a c j e
gdy r 4
<> rO
złożonego
DEC - dekrementuj rejestr Zmniejszenie o j e d e n zawartości rejestru Rd. W y n i k j e s t u m i e s z c z a n y w R d . D e k r e m e n t o w a n i e rejestru nie p o w o d u j e m o d y f i k o w a n i a flagi przeniesienia (C). Dzięki temu m o ż l i w e jest w y k o r z y s t a n i e rozkazu DEC d o realizacji pętli, w których licznik jest w y k o r z y s t y w a n y w obliczeniach o wielokrotnej pre cyzji. Jeśli w obliczeniach będą w y s t ę p o w a ł y liczby bez z n a k u , to skoki po w i n n y b y ć w y k o n y w a n e tylko za pomocą r o z k a z ó w BREQ i BRNE. Jeśli za wartość d e k r e m e n t o w a n y c h rejestrów b ę d z i e t r a k t o w a n a j a k o liczba zapisana w kodzie uzupełnień d o d w ó c h , t o skoki m o g ą b y ć w y k o n y w a n e za pomocą wszystkich r o z k a z ó w s k o k ó w (uwzględniających z n a k ) . Operacja:
Rd < - Rd - 1 PC <- PC + 1
Składnia:
Rd
DEC
Kod:
0 o' 1 0 1 0 d d d d d 1
1
0
0 1
Liczba stów: 1 (2 bajty) Liczba cyłdi: I Flagi:
I
—
T
—
H
—
S
V •«-•-
N
Z
c
—
S: w y k o r z y s t y w a n a d o s p r a w d z a n i a znaku w y n i k u . V : ustawiana, jeśli nastąpiło przepełnienie operacji u z u p e ł n i e n i a d o dwóch, w p r z e c i w n y m p r z y p a d k u z e r o w a n a . Przepełnienie operacji uzupełnienia d o d w ó c h nastąpi t y l k o w ó w c z a s , g d y rejestr R d p o w y k o n a n i u rozkazu będzie miał wartość r ó w n ą $80. N : ustawiana, jeśli M S B zosta! ustawiony, w p r z e c i w n y m p r z y p a d k u zero wana. Z : ustawiana, jeśli w y n i k j e s t r ó w n y zeru, w p r z e c i w n y m p r z y p a d k u zero wana. Przykład: pętla:
ldi add dec brne nop
r!7,S10 rl,r2 rl7 pętla
; ł a d u j w a r t o ś ć $ 1 0 do r e j e s t r u ; d o d a j r 2 do r l ;dekrementuj rl7 ; s k o c z , j e ś l i r l 7 <> rO ,-dalsze o p e r a c j e
rl7
EICALL - rozszerzone, pośrednie wywołanie podprogramu P o ś r e d n i e w y w o ł a n i e p o d p r o g r a m u . A d r e s p o d p r o g r a m u jest w s k a z y w a n y p r z e z rejestr i n d e k s o w y Z ( 1 6 m ł o d s z y c h bitów a d r e s u ) i rejestr E I N D znaj dujący s i ę w o b s z a r z e w e / w y (6 starszych b i t ó w a d r e s u ) . R o z k a z u m o ż l i w i a w y w o ł a n i e p r o c e d u r y ulokowanej w d o w o l n y m miejscu pamięci p r o g r a m u . A d r e s p o w r o t u (adres n a s t ę p n e g o rozkazu p o rozkazie w y w o ł a n i a p o d p r o g r a m u ) j e s t z a w s z e o d k ł a d a n y na stosie. K a ż d o r a z o w o p o odłożeniu j e d n e g o bajtu, w s k a ź n i k stosu ( S P H r S P L ) j e s t d e k r e m e n t o w a n y (zmniejszany o j e den).
Rozkaz
EICALL
występuje
jedynie
w
mikrokontrolerach
z rdzeniem AVR3Core, np. AT90SC646C-USB.
Operacja:
( S P H r S P L ) < - P C + 1 (odłóż adres p o w r o t u n a stos ( 3 bajty)) S P H r S P L <~ S P H r S P L - 3 PC(15..0) < - Z ( 1 5 . . 0 ) , P C ( 2 1 . . 1 6 ) < - E I N D
Składnia:
Kod:
EICALL
1'o'o'1
0
1
0
1
0 0
0
1
1
r
i —
0 0
1
Liczba słów: 1 (2 bajty) Liczba cykli: 4 tylko d l a m i k r o k o n t r o l e r ó w z 2 2 - b i t o w y m P C
Flagi:
I
T
H
S
V
N
Z
c
Przykład: ldi out ldi ldi eicall
rl6,S05 eind,rl6 r3O,SO0 r31,S10
;ustaw adres w rejestrze
EIND
;oraz w Z ;wywolaj podprogram
spod adresu
$051000
EIJMP - rozszerzony skok pośredni Skok pośredni p o d adres w s k a z y w a n y przez rejestr i n d e k s o w y Z (16 młod szych bitów adresu) i rejestr E I N D znajdujący się w obszarze w e / w y (6 star szych bitów adresu). R o z k a z umożliwia w y k o n a n i e skoku d o dowolnego miejsca w pamięci programu.
U|GA
R o z k a z E I J M P występuje j e d y n i e w mikrokontrolerach z rdze niem A V R 3 C o r e , n p . A T 9 0 S C 6 4 6 C - U S B .
Operacja:
P C ( 1 5 . . 0 ) « - Z(15..0), PC(21..16) « - E I N D
Składnia:
EIJMP
Kod:
1
0
i r—— 0 0
1
1
0
0 o" 1
0 0
1
0 0
1
Liczba słów: 1 (2 bajty) Liczba cykli: 2 Flagi:
I
T
H
s
V
N
Z
c
Przykład: ldi out ldi ldi
er^mp
rl6,$05 eind,rl6 r30,$00 r31,$i0
; ustaw
adres w
rejestrze
; oraz w z ;skocz do adresu
$051000
ELPM - rozszerzone lądowanie bajtu z pamięci programu do rejestru Ł a d o w a n i e d o rejestru R d j e d n e g o bajtu p a m i ę c i p r o g r a m u w s k a z y w a n e g o p r z e z rejestr i n d e k s o w y Z o r a z rejestr R A M P Z znajdujący się w o b s z a r z e w e / w y . R o z k a z j e s t w y k o r z y s t y w a n y d o inicjowania stałych i ich p o b i e r a n i a d o dalszych obliczeń p r z e z p r o g r a m . P a m i ę ć p r o g r a m u w mikrokontrolerach A V R jest z o r g a n i z o w a n a w 16-bitowe słowa, lecz rejestr Z wskazuje kolejne bajty (nie s ł o w a ) . Jeśli najmłodszy bit rejestru Z b ę d z i e miał w a r t o ś ć „ 0 " , t o rejestr ten b ę d z i e w s k a z y w a ł m ł o d s z y bajt s ł o w a p a m i ę c i p r o g r a m u . A n a l o gicznie w a r t o ś ć „ 1 " będzie informowała, że c h o d z i o starszy bajt. R o z k a z E L P M m o ż e a d r e s o w a ć całą p a m i ę ć p r o g r a m u b e z ż a d n y c h
ograniczeń.
W w y n i k u j e g o działania, rejestr i n d e k s o w y m o ż e p o z o s t a ć bez z m i a n y lub m o ż e b y ć i n k r e m e n t o w a n y . Inkrementacja obejmuje z a r ó w n o rejestr Z , j a k i rejestr R A M P Z (razem 2 4 bity).
R o z k a z E L P M nie został z a i m p l e m e n t o w a n y w e wszystkich mikrokontrolerach
AVR,
w tym
wAT90S2313.
Szczegóły
w notach k a t a l o g o w y c h .
U k ł a d y zezwalające
na a u t o p r o g r a m o w a n i e m o g ą w y k o r z y s t y w a ć
rozkaz
E L P M d o o d c z y t y w a n i a stanu bitów konfiguracyjnych i bitów zabezpieczają c y c h . S z c z e g ó ł o w y c h informacji należy s z u k a ć w notach k a t a l o g o w y c h .
p o n i ż s z y c h operacji jest nieokreślony: r30,z+ r31,z+
Operacja:
(*)
RO < - ( R A M P Z : Z ) (RO j e s t rejestrem d o m y ś l n y m ) PC
(**)
PC + 1
Rd <- (RAMPZ:Z) . P C < - PC + 1
(***)
Rd <- (RAMPZ:Z) RAMPZ:Z <- RAMPZ:Z + 1 PC <- PC + 1
Składnia:
Kod:
(*)
ELPM
(**)
ELPM Rd,Z
(***)
LPM
(*)
1 0
(**)
1
(***)
1 0
Rd,Z+ 0
'o'0' 0
1 1 0
1
1 0
1
0
1 0
1
1
0
0
0
d d d d d
0
1
0
0
0
d d d 1 d1 d
0
0
0
1 1 0
1 1 1 1
.
1
Liczba stów: 1 (2 bajty) Liczba cykli: 3 Flagi:
I
T
H
V
N
Przykład:
tabl:
ldi out ldi ldi elpm
zl,byte3{tabl<
.dw
$3738
;bajt $38 jest wskazywany, jgdy z = 0 ;bajt $37 jest wskazywany, ;gdy Z = 1 LSe
LSB
EOR - suma Exclusive Or Obliczenie s u m y E x c l u s i v e O r rejestrów Rd i R s . W y n i k j e s t u m i e s z c z a n y w rejestrze Rd. Operacja:
R d < - R d ® Rs PC < - PC + 1
Składnia:
EOR
Rd Rs f
r——
Kod:
0
0
1
0 0
1
s
d d
d
d
d
s
s
s
s
Liczba słów: 1 ( 2 bajty) Liczba cykli: 1 1
Flagi:
— S:
T
—
H
—
S
V
-*-»•
0
N
Z
C
-«-*•
—
wykorzystywana do sprawdzania znaku wyniku.
V: zerowana. N : ustawiana, j e ś l i M S B został ustawiony, w p r z e c i w n y m p r z y p a d k u z e r o wana. Z : ustawiana, j e ś l i w y n i k j e s t r ó w n y zeru, w p r z e c i w n y m p r z y p a d k u z e r o wana. Przykład: eor eor
r4,r4 r0,r22
;zerup r4 ;oblicz Ex-GR z rO i r22
FMUL - mnożenie utamkowe bez znaku Mnożenie dwóch liczb 8-bitowych. W wyniku operacji otrzymuje się liczbę 16-bitową bez znaku, która dodatkowo zostaje przesunięta w l e w o o jeden bit. Rms
Rmd X
mnożna
mnożnik
8
8
—•
R1
RO
iloczyn H
iloczyn L
16
N i e c h (N.Q) oznacza liczbę ułamkową zawierającą N binarnych cyfr w częś ci całkowitej i Q binarnych cyfr w części u ł a m k o w e j . W y m n o ż e n i e dwóch liczb (N1.Q1) i (N2.Q2) da w wyniku liczbę ( ( N 1 + N 2 ) . ( Q 1 + Q 2 ) ) . W aplika cjach obróbki sygnałów szeroko jest stosowany format (1.7) dla wartości wejściowych i (2.14) dla wyniku m n o ż e n i a . Przesunięcie w l e w o jest wyma gane ze względu na zapewnienie zgodności formatów liczb wejściowych i w y n i k u mnożenia. R o z k a z F M U L wykonuje całą operację, włącznie z prze sunięciem w tej samej liczbie cykli, c o rozkaz MUL. Format (1.7) jest b a r d z o często stosowany d o obliczeń n a liczbach ze zna kiem, lecz r o z k a z F M U L nadaje się tylko dla liczb bez znaku. Jest jednak przydamy d o w y k o n y w a n i a obliczeń cząstkowych iloczynów podczas mno żenia 16-bitowych liczb ze z n a k i e m zapisanych w formacie (1.15), dających w wyniku liczbę formatu (1.31). Najstarszy bit m n o ż e n i a przed przesunię c i e m musi być uwzględniany w obliczeniach i jest w p i s y w a n y d o znacznika przeniesienia. M n o ż n a wpisana d o rejestru R m d i m n o ż n i k w R m s są t r a k t o w a n e j a k o licz by u ł a m k o w e bez znaku, w których punkt dziesiętny znajduje się pomiędzy 6, a 7 bitem. 16-bitowy w y n i k jest liczbą u ł a m k o w ą bez znaku, w której punkt dziesiętny jest położony p o m i ę d z y 14, a 15 bitem. W y n i k mnożenia jest umieszczony w rejestrze R l (starszy bajt) i RO (młodszy bajt).
R o z k a z u F M U L nie z a i m p l e m e n t o w a n o w e wszystkich mikro
U|GA Operacja:
kontrolerach A V R , w t y m w A T 9 0 S 2 3 1 3 . S z c z e g ó ł y w notach katalogowych.
R1:R0 <- Rmd • Rms (liczba bez znaku (1.15) < - liczba bez znaku (1.7) • liczba bez znaku (1.7)) PC < - PC + 1
Składnia:
FMUL
Rmd,Rms (Rmd=R16 do R23, Rms=R16 do R23)
Kod:
o o o o
0
0 •
1 1
0 d d d
1
1
»
s s
s
1 1 1
Liczba stów: 1 (2 bajty) Liczba cykli: 2 Flagi:
I
T
H
S
V
N
Z
C
Z:
u s t a w i a n a , j e ś l i w y n i k j e s t r ó w n y $0000, w p r z e c i w n y m p r z y p a d k u z e r o
C:
u s t a w i a n a , j e ś l i b i t 15 i l o c z y n u
wana. przed przesunięciem
był
w przeciwnym przypadku zerowana.
Przykład: .********«**********+****•********.******+***•*•»*•*»**».***.***» ; ;
Procedura mnożenia dwóch 16-bitowych liczb ułamkowych ze znakiem, dająca w wyniku liczbę 32-bitową rl9:rl8:rl7:rl6 = [r23:r22 * r21:r20) « 1
fmulsl6xl6_32: clr Emuls movw fmul adc movw Emulsu sbc add adc adc fmulsu sbc add adc adc ret
r2 r23,r21 rl9:rl8,rl rO r22,r20 rl8,r2 rl7:rl6,rl rO r23,r20 rl9,r2 rl7,r0 rl8,rl rl9,r2 r21,r22 rl9,r2 rl7,rO rl8,rl rl9,r2 •
;{(signed)ah * (signed)bh) jprzepisz wynik do rl9:rl8 ; (al - bl) « 1 .•przepisz wynik do rl7:rl$ ,- ((signed)ah * bl) « 1
; ((signed)bh * al)<< 1
ustawiony,
FMULS - mnożenie ułamkowe ze znakiem Mnożenie d w ó c h liczb 8-bitowych. W wyniku operacji otrzymuje się liczbę 16-bitową ze znakiem, która dodatkowo zostaje przesunięta w l e w o o jeden bit. Rmd mnożna
R1
Rms mnożnik
x
—•
16
8
8
RO iloczyn L
iloczyn H
Niech (N.Q) oznacza liczbę u ł a m k o w ą zawierającą N binarnych cyfr w częś ci całkowitej i Q binarnych cyfr w części u ł a m k o w e j . W y m n o ż e n i e dwóch liczb ( N ł . Q l ) i ( N 2 . 0 2 ) da w w y n i k u liczbę ( ( N 1 + N 2 ) . ( Q 1 + Q 2 ) ) . W aplika cjach obróbki sygnałów szeroko jest stosowany format (1.7) dla wartości wejściowych i (2.14) dla wyniku mnożenia. Przesunięcie w l e w o jest wyma gane ze względu na z a p e w n i e n i e zgodności formatów liczb wejściowych i wyniku mnożenia. R o z k a z F M U L S wykonuje całą operację, włącznie z prze sunięciem w tej samej liczbie cykli, c o rozkaz M U L S . M n o ż n a wpisana d o rejestru R m d i m n o ż n i k w R m s sa t r a k t o w a n e j a k o licz by u ł a m k o w e ze znakiem, w których punkt dziesiętny znajduje się pomiędzy 6 a 7 bitem. 16-bitowy wynik j e s t liczbą u ł a m k o w ą ze z n a k i e m , w której punkt dziesiętny jest położony p o m i ę d z y 14 a 15 bitem. W y n i k m n o ż e n i a jest umieszczony w rejestrze R l (starszy bajt) i RO (młodszy bajt). Należy pamiętać, że p o d c z a s m n o ż e n i a liczby 0 x 8 0 ( - 1 ) p r z e z liczbę 0x80 ( - 1 ) rezultatem przesunięcia będzie liczba 0 x 8 0 0 0 ( - 1 ) . W w y n i k u przesunię cia nastąpi przepełnienie uzupełnienia d o dwóch. Sytuacja taka m u s i być roz p o z n a w a n a i o d p o w i e d n i o obsługiwana przez program.
Rozkazu F M U L nie z a i m p l e m e n t o w a n o w e wszystkich mikro kontrolerach A V R , w t y m w A T 9 0 S 2 3 1 3 . S z c z e g ó ł y w notach katalogowych.
Operacja:
R1:R0 « - Rmd - Rms (liczba ze znakiem (1.15) < - liczba ze znakiem (1.7) • liczba ze znakiem (1.7)) PC * - PC + 1
Składnia:
Kod:
FMULS Rmd.Rms ( R m d - R 1 6 do R23, Rms=R16 do R23) — i — i
o o o o _ _ J
1
1
0 I
0 1
1 1 1
—Lnu
1 1
d •
d
d 0 i
i
s i
s i
s i
Liczba slow: 1 (2 bajty) Liczba cykli: 2 Flagi:
I
T
H
V
N
Z : ustawiana, jeśli w y n i k j e s t r ó w n y $ 0 0 0 0 , w p r z e c i w n y m p r z y p a d k u z e r o wana. C : ustawiana, jeśli bit 15 iloczynu przed p r z e s u n i ę c i e m był u s t a w i o n y , w przeciwnym przypadku zerowana. Przykład: fmuls r23,r22
movw
r23:r22,rl:r0
.-mnożenie liczb ze znakiem w formacie ;(1.7) umieszczonych w rejestrach ,-r23 i r22 ;iloczyn w formacie (1.15) ,-przepisz wynik do r23:r22
FMULSU - mnożenie ułamkowe liczby ze znakiem przez liczbę bez znaku Mnożenie d w ó c h liczb 8-bitowych. W wyniku operacji otrzymuje się liczbę 16-bitową ze znakiem, która dodatkowo zostaje przesunięta w l e w o o jeden bit. Rmd mnożna 8
Rms X
mnożnik
—•
8
RO iloczyn L
R1 iloczyn H 16
N i e c h (N.Q) oznacza liczbę ułamkową zawierającą N b i n a r n y c h cyfr w częś ci całkowitej i Q binarnych cyfr w części u ł a m k o w e j . W y m n o ż e n i e dwóch liczb (N1.Q1) i ( N 2 . 0 2 ) da w w y n i k u liczbę ( ( N 1 + N 2 ) . ( Q 1 + Q 2 ) ) . W aplika cjach obróbki s y g n a ł ó w szeroko jest stosowany format (1.7) dla wartości wejściowych i (2.14) dla w y n i k u mnożenia. Przesunięcie w l e w o jest wyma gane ze względu na zapewnienie zgodności formatów liczb wejściowych i w y n i k u mnożenia. R o z k a z FMULSU wykonuje
całą operację,
włącznie
z przesunięciem w tej samej liczbie cykli, c o r o z k a z MULSU. Format (1.7) jest b a r d z o często stosowany d o obliczeń na liczbach ze zna k i e m , lecz rozkaz FMULSU nadaje się tylko d o m n o ż e n i a liczby ze znakiem przez liczbę b e z znaku. Jest j e d n a k p r z y d a m y d o w y k o n y w a n i a obliczeń cząstkowych iloczynów podczas m n o ż e n i a 16-bitowych liczb ze znakiem za pisanych w formacie (1.15), dających w w y n i k u liczbę formatu (1.31). Naj starszy bit m n o ż e n i a przed przesunięciem m u s i b y ć u w z g l ę d n i a n y w oblicze niach i j e s t w p i s y w a n y d o znacznika przeniesienia. M n o ż n a wpisana d o rejestru R m d i m n o ż n i k w R m s stanowią liczby ułamko w e w których punkt dziesiętny znajduje się p o m i ę d z y 6, a 7 bitem. Mnożna R m d jest liczbą u ł a m k o w ą ze znakiem, a m n o ż n i k R m s jest liczbą ułamkową bez znaku. 16-bitowy wynik j e s t liczbą u ł a m k o w ą ze znakiem, w której punkt dziesiętny jest położony p o m i ę d z y 14, a 15 bitem. W y n i k mnożenia j e s t umieszczony w rejestrze R l (starszy bajt) i RO (młodszy bajt).
R o z k a z u FMULSU nie z a i m p l e m e n t o w a n o w e wszystkich mik rokontrolerach A V R , w t y m w A T 9 0 S 2 3 1 3 . Szczegóły w no tach katalogowych.
Opwacja:
R1.R0 <- Rmd • Rms (liczba ze znakiem (1.15) < - liczba ze znakiem (1.7) • liczba b e z znaku (1.7)) PC <- P C + 1
Składnia:
FMULSU
Kod:
o o o o
Rmd.Rms 0
( R m d = R 16 d o R 2 3 , R m s = R 1 6 d o R 2 3 )
1 1 —1i d i d i d 1
0
s 1
s 1
s 1
Liczba stów: 1 (2 bajty) Liczba cykli: 2
Ragi:
I
Z:
T
H
S
V
N
2
C
ustawiana, jeśli wynik jest równy $0000, w przeciwnym przypadku zero wana.
C:
u s t a w i a n a , j e ś l i bit
15 i l o c z y n u
przed
przesunięciem był
w przeciwnym przypadku zerowana.
Przykład: ; ;
Procedura mnożenia dwóch 16-bitowych liczb ułamkowych ze znakiem, dająca w wyniku liczbę 32-bitową
;
rl9:rl8:rl7:rl6 = (r23:r22 * r21:r20) «
ł
.**4***444*444**444***44**44**44**44*4*4il-44*4*44**4***44*44*** £mulsl6xl6_32: clr fmuls movw f mul adc movw fmulsu sbc add adc adc Emulsu sbc add adc adc ret
r2 r23,r21 rl9:rl8,rl rO r22,r20 rl8,r2 rl7:rl6,rl rO r23,r20 rl9,r2 rl7,r0 rl8,rl rl9,r2 r21,r22 rl9,r2 rl7,r0 rl8,rl rl9,r2
;((signed)ah * (signed)bh) ;przepisz wynik do rl9:rl8 ; (al * bl} « 1 .•przepisz wynik do rl7:rl6 ; ((signed)ah * bl) « 1
;((signed)bh * al) << 1
ustawiony,
ICALL - pośrednie wywołanie podprogramu W y w o ł a n i e pośrednie podprogramu. Adres p o d p r o g r a m u j e s t wskazywany p r z e z rejestr i n d e k s o w y Z (16-bitowy), należący d o rejestrów roboczych pro cesora. P o d p r o g r a m m o ż e b y ć w i ę c ulokowany w najniższym obszarze adre s o w y m (64 kslów (128 kB)) pamięci programu. P a m i ę ć p r o g r a m u mikrokon trolera A T 9 0 S 2 3 1 3 m a wielkość 1 ksłów. Adres p o w r o t u (adres następnego rozkazu p o rozkazie w y w o ł a n i a p o d p r o g r a m u ) j e s t z a w s z e odkładany na sto sie. K a ż d o r a z o w o p o odłożeniu j e d n e g o bajtu, w s k a ź n i k stosu jest dekremen towany (zmniejszany o j e d e n ) .
Operacja:
[pi
Rozkazu I C A L L nie z a i m p l e m e n t o w a n o w e wszystkich mikro-
i""
kontrolerach A V R . Szczegóły w notach k a t a l o g o w y c h .
dla A T 9 0 S 2 3 1 3 (SPL) <~ P C + 1
(odłóż adres p o w r o t u na stos)
SPL < - S P L - 2 PC<-Z W mikrokontrolerach z 16-bitowym w s k a ź n i k i e m stosu ( S P H : S P L ) * - P C + 1 (odłóż adres powrotu na stos) S P H : S P L < - S P H : S P L - 2 (w przypadku adresu 16-bitowego (2-bajtowego)) lub SPH.-SPL < - SPHrSPL - 3 (w przypadku adresu 22-bitowego (3-bajtowego)) PC(15...0)
I C A L L (zarówno w przypadku adresu 16-bitowego, j a k i 22-bitowego)
Kod: 1
1 0 -J.l
0 1
o'1'o'1
1 1
1
1
'
I
o o o o 1
1
1
1 0 1
0 1
1 1
Liczba słów: 1 (2 bajty) Liczba cykli: 3 dla 16-bitowego adresu 4 dla 22-bitowego adresu Ragi:
I
T
H
S
V
N
Z
C
Przykład: mov r30,r0 icall
;ustaw adres procedury wywołaj podprogram
IJMP - skok pośredni określony zawartością rejestru Z S k o k pośredni. A d r e s skoku jest w s k a z y w a n y p r z e z rejestr indeksowy Z (16-bitowy), należący d o rejestrów roboczych procesora. D ł u g o ś ć rejestru ze zwala n a w y k o n y w a n i e skoków w obrębie najniższego o b s z a r u adresowego (64 ksłów (128 k B ) ) pamięci programu. P a m i ę ć p r o g r a m u mikrokontrolera A T 9 0 S 2 3 1 3 m a w i e l k o ś ć 1 ksłów.
ffti
Rozkazu I J M P nie z a i m p l e m e n t o w a n o w e wszystkich mikrokontrolerach A V R . Szczegóły w notach k a t a l o g o w y c h .
Operacja:
dla AT90S2313 PC<-Z w mikrokontrolerach z 2 2 - b i t o w y m licznikiem p r o g r a m u PC(15...0)
Składnia:
IJMP
Kod:
r—r—
1 0 0 1 0 1 0 '0 0 0 0 0 1 0 0 1
Liczba słów: 1 ( 2 bajty)
Liczba cykli: 2 Ragi:
i
T
H
s
V
N
z
c
Przykład: r30,r0 ijrop
; ustaw adres skoku ;skok pod adres określony przez rejestr Z
IN - czytaj port Z a ł a d o w a n i e danej dostępnej w rejestrze n a l e ż ą c y m d o obszaru w e / w y (por ty, timery/liczniki, rejestry konfiguracyjne itp.) d o j e d n e g o z rejestrów r o b o czych. Operacja:
Rd « - P PC <- PC + 1
Składnia:
IN
Rd.P — i — i
Kod:
1 0
1 1
i
O p p ^ d
d
d d
d P.P.P.P
Liczba słów: 1 (2 bajty) Liczba cykli: 1 Flagi:
1
T
H
S
V
N
Z
c
Przykład: in cpi breq
wyjście:
r25,$16 r25,4 wyjście
nop
ładuj port B do rejestru r25 porównaj odczytana dana z liczbą 4 skok, jeśli r25=4
;dalsze operacje
INC - inkrementuj zawartość rejestru Zwiększenie o j e d e n zawartości rejestru Rd. W y n i k jest umieszczany w Rd. Inkrementowanie rejestru nie powoduje m o d y f i k o w a n i a flagi przeniesienia (C). Dzięki temu m o ż l i w e jest wykorzystanie rozkazu DEC d o realizacji pętli, w których licznik j e s t w y k o r z y s t y w a n y w obliczeniach o wielokrotnej precy zji. Jeśli w obliczeniach będą występowały liczby b e z znaku, t o skoki powin ny b y ć w y k o n y w a n e tylko za pomocą r o z k a z ó w BREQ i BRNE. Jeśli zawar tość d e k r e m e n t o w a n y c h rejestrów będzie traktowana j a k o liczba zapisana w kodzie uzupełnień d o d w ó c h , to skoki m o g ą b y ć w y k o n y w a n e za pomocą wszystkich rozkazów s k o k ó w (uwzględniających znak). Operacja:
Rd
Rd + 1
P C <— P C + 1 Składnia:
Rd
INC
Kod:
1
0 0
1 0
1
0
d d
d d
0 1
d 0
1
Liczba słów: 1 (2 bajty) Liczba cykli: 1 I
Flagi:
— S:
T
H
S
V
N
Z
— —
c
—
w y k o r z y s t y w a n a d o sprawdzania znaku w y n i k u .
V: ustawiana, jeśli nastąpiło przepełnienie operacji uzupełnienia d o dwóch, w p r z e c i w n y m p r z y p a d k u z e r o w a n a . Przepełnienie operacji uzupełnienia d o d w ó c h nastąpi tylko w ó w c z a s , g d y R d p r z e d operacją b y ł równy $?F. N : ustawiana, jeśli M S B został ustawiony, w p r z e c i w n y m p r z y p a d k u zero wana. Z : ustawiana, jeśli w y n i k j e s t r ó w n y zeru, w p r z e c i w n y m przypadku zero wana. Przykład: pętla:
clr inc
r22 r22
;zeruj r22 ;inkrementuj r22
cpi brne nop
r22,$4£ pętla
jporównaj r22 ze stałą $4F ;skocz, jeśli różne ;da1sze operacje
JMP - skok bezpośredni S k o k b e z p o ś r e d n i w o b r ę b i e przestrzeni 4 M s l ó w p a m i ę c i p r o g r a m u . P a t r z również RJMP.
R o z k a z u J M P nie z a i m p l e m e n t o w a n o w e w s z y s t k i c h m i k r o kontrolerach A V R , w t y m w A T 9 0 S 2 3 I 3 . S z c z e g ó ł y w notach katalogowych.
Operacja:
P C <— a d r 4 M (stos pozostaje b e z z m i a n y )
Składnia:
JMP adr4M
Kod:
1 0 a
a
0
1
0
a
a a
1 0
a a
a
a
a
1
1
0
a
a
a a
a
a
a a
a
a
a
a
Liczba słów: 2 (4 bajty) Liczba cykli: 3
Ragi:
I
T
H
S
V
N
Z
C
Przykład: mov jmp dlugiskok:
nop
rl.rO długi skok
.-kopiuj rO do rl ;długi skok ;dalsze operacje
LD - ładuj rejestr pośrednio daną z pamięci SRAM spod adresu wskazywanego przez rejestr indeksowy X Ładowanie pośrednie jednego bajtu z obszaru danych do rejestru. W mikrokontrolerach zawierających pamięć S R A M (należy do nich AT90S2313) obszar da nych (jest to obszar ciągły) rozciąga się na obszar rejestrów roboczych (adresy od 0 do $1F), obszar we/wy (adresy od $20 d o $5F) i wewnętrzną (roboczą) pamięć S R A M (adresy od $60 d o adresu wynikającego z wielkości tej pamięci, w przy padku AT90S2313 do $DF), a także zewnętrzną pamięć S R A M , jeśli jest obsłu giwana przez mikrokontroler. W układach bez pamięci S R A M obszarem danych bedą jedynie rejestry robocze. Pamięć E E P R O M m a wydzieloną przestrzeń adre sową. Dodatkowe informacje można znaleźć w rozdziale 4 . Adres danej, która ma być załadowana do rejestru jest wskazywany przez 16-bitowy rejestr indekso wy X. Dana ta może więc być ulokowana w najniższym obszarze adresowym (64 kB). Jeśli zachodzi potrzeba pobrania danej spoza tego obszaru (dotyczy tyl ko tych układów, które t o umożliwiają, nie dotyczy AT90S2313), należy posłu żyć się rejestrem R A M P X z obszaru we/wy. W wyniku działania r o z k a z u LD, rejestr i n d e k s o w y m o ż e p o z o s t a ć bez zmia ny, m o ż e b y ć i n k r e m e n t o w a n y p o załadowaniu danej (post-incremenf) m o ż e b y ć d e k r e m e n t o w a n y przed z a ł a d o w a n i e m danej
lub
(pre-decrement).
Stwarza t o możliwość w y g o d n e g o m a n i p u l o w a n i a tablicami d a n y c h , a także implementacji stosu u ż y t k o w n i k a (niezależnego o d stosu mikrokontrolera), dla którego w s k a ź n i k i e m będzie rejestr X . C h o c i a ż rejestr X j e s t rejestrem 16-bitowym, to w układach mających nie więcej niż 2 5 6 bajtów pamięci S R A M (np. A T 9 0 S 2 3 1 3 ) w wyniku operacji i n d e k s o w y c h j e s t modyfikowa na tylko młodsza j e g o c z ę ś ć . W takich układach starsza część rejestru indek s o w e g o m o ż e b y ć u ż y w a n a j a k o rejestr o g ó l n e g o przeznaczenia.
Rejestr
R A M P X jest m o d y f i k o w a n y w przypadku mikrokontrolerów mających prze strzeń danych lub przestrzeń pamięci p r o g r a m u większą niż 6 4 k B .
U|GA
N i e wszystkie warianty rozkazu LD z a i m p l e m e n t o w a n o we wszystkich mikrokontrolerach A V R .
Rezultat poniższych operacji jest nieokreślony:
U|GA
ld ld ld ld
r26,xt r27,x+ r26,-x r27,-x
Operacja:
(*)
Rd < - (X) P C f- P C +
(**)
R d « - (X) X*-
X+l
PC«- PC+ (***)
1
X «- X -
1
1
Rd <- (X) PC « - PC + 1
Składnia:
Kod:
(*)
LD
Rd,X
(**)
LD
Rd,X+
(***)
LD
Rd,-X
(*)
1 0
0
1
0
0
0
d d
(**)
1 0
0
1
0
0
0
d d ' d ' d ' d
1 0
0
1
0
0
0
d
d
d
d
d 1
d
d
'
d
1 1 0
0
1 1 0
1
1 1 1 0
'
Liczba stów: 1 ( 2 bajty) Liczba cykli: 2
H
V
N
Flagi:
Przykład:
clr ldi ld
r27 r26,$60 rO,x+
ld ldi ld ld
rl,x r26,$63 r2,x r3,-x
;zeruj starszą część rejestru X ,-młodsza część rejestru X = $60 ;ładuj rO daną spod adresu $60 ;i przygotuj następny adres w rejestrze X ;ładuj rl daną spod adresu $61 ;młodsza część rejestru X = $63 ; ładuj r2 daną spod adresu $63 ;przygotuj wcześniejszy adres ;w rejestrze X i ładuj rl daną ,-spod tego adresu ($62)
LD (LDD) - ładuj rejestr pośrednio daną z pamięci SRAM spod adresu wskazywanego przez rejestr indeksowy Y Ł a d o w a n i e pośrednie j e d n e g o bajtu z obszaru danych d o rejestru. W mikro kontrolerach zawierających p a m i ę ć S R A M (należy d o nich A T 9 0 S 2 3 1 3 ) ob szar danych (jest to obszar ciągły) rozciąga się na obszar rejestrów roboczych (adresy od 0 d o $1F), obszar w e / w y (adresy od $20 d o $5F) i wewnętrzną (roboczą) pamięć S R A M (adresy od $60 d o adresu wynikającego z wielkości tej pamięci, w p r z y p a d k u A T 9 0 S 2 3 1 3 d o $ D F ) , a także zewnętrzną pamięć S R A M , jeśli jest o b s ł u g i w a n a przez mikrokontroler. W układach bez pamięci S R A M obszarem danych będą jedynie rejestry r o b o c z e . P a m i ę ć E E P R O M m a wydzieloną przestrzeń adresową. D o d a t k o w e informacje m o ż n a znaleźć w rozdziale 4 . Adres danej, która m a b y ć z a ł a d o w a n a d o rejestru j e s t wskazy w a n y przez 16-bitowy rejestr i n d e k s o w y Y . D a n a ta m o ż e w i ę c b y ć ulokowa na w najniższym o b s z a r z e a d r e s o w y m (64 k B ) . Jeśli z a c h o d z i potrzeba po brania danej spoza tego obszaru (dotyczy tylko tych u k ł a d ó w , k t ó r e to umoż liwiają, nie dotyczy A T 9 0 S 2 3 1 3 ) , należy posłużyć się rejestrem R A M P Y z obszaru we/wy. W w y n i k u działania r o z k a z u L D , rejestr i n d e k s o w y m o ż e p o z o s t a ć bez zmia ny, m o ż e b y ć i n k r e m e n t o w a n y p o załadowaniu danej (post-increment) m o ż e być d e k r e m e n t o w a n y
przed z a ł a d o w a n i e m danej
lub
(pre-decrement).
W przypadku w y k o r z y s t a n i a rejestru Y j a k o rejestru i n d e k s o w e g o , można realizować pośrednie ł a d o w a n i e danej z p r z e m i e s z c z e n i e m - r o z k a z L D D . Adres danej jest określony wtedy zawartością rejestru Y i s t a ł y m przemiesz c z e n i e m , b ę d ą c y m p a r a m e t r e m rozkazu. Ł a d o w a n i e pośrednie stwarza możli w o ś ć w y g o d n e g o m a n i p u l o w a n i a tablicami d a n y c h , a także implementacji stosu użytkownika (niezależnego od stosu mikrokontrolera), dla którego wskaźnikiem będzie rejestr Y. C h o c i a ż rejestr Y jest rejestrem 16-bitowym, to w układach mających nie więcej niż 256 bajtów pamięci S R A M (np. AT90S2313)
w wyniku
operacji i n d e k s o w y c h jest
modyfikowana
tylko
młodsza j e g o część. W takich układach starsza część rejestru indeksowego m o ż e b y ć u ż y w a n a j a k o rejestr o g ó l n e g o przeznaczenia. Rejestr R A M P Y jest modyfikowany w p r z y p a d k u mikrokontrolerów mających przestrzeń danych lub przestrzeń pamięci p r o g r a m u większą niż 6 4 k B .
N i e wszystkie warianty rozkazu L D z a i m p l e m e n t o w a n o w e wszystkich mikrokontrolerach A V R .
Rezultat p o n i ż s z y c h operacji j e s t nieokreślony: ld ld ld ld
ufGA Operacja:
(*)
r28,y* r29,ył r2S,-y r29,-y
Rd < - (Y) PC
(**)
PC + 1
Rd<-(Y) Y<- Y + 1 PC <- P C + I
(***)
Y <— Y - 1 Rd
(****)
R
(Y+c63)
d
P C < - P C +• 1 Składnia:
(*)
LD
(**)
LD
(***)
LD
Rd,Y Rd,Y+ Rd,-Y
(****)LDD Kod:
Rd,Y+c63
(*)
1 0
0
0
0
0
0
d
d
d
d
d
1 0
0
0
(**)
1 0
0
1
0
0
0
d
d
d
d
d
1 0
0
1
1 '0*0 \1 0
0
0
d
d
d
d
d
1 0
1
c
0
d
d
d
d
d
1
0
c
0 c
Liczna stów: 1 (2 bajty) Liczba cytdi: 2 Flagi:
I
H
V
N
1 0 c
c
c
Przykład: clr ldi ld
r29 r28,$60 rO,y+
ld ldi ld ld
rl.y r28,$63 r2,y r3, -y
ldd
r4,y+2
; zeruj starszą część rejestru Y ;młodsza część rejestru Y = $60 ;ładuj rO dana spod adresu $60 ;i przygotuj następny adres w rejestrze Y ; ładuj rl daną., spod adresu $61 ,-młodsza część rejestru Y = $63 ;ładuj r2 daną spod adresu $63 ;przygotuj wcześniejszy adres ,-w rejestrze Y i ładuj rl daną ;spod tego adresu ($62) ; ładuj r4 daną spod adresu $64
LD (LDD) - ląduj rejestr pośrednio daną z pamięci SRAM spod adresu wskazywanego przez rejestr indeksowy Z Ł a d o w a n i e pośrednie j e d n e g o bajtu z obszaru danych d o rejestru. W m i k r o k o n t r o l e r a c h zawierających p a m i ę ć S R A M (należy d o n i c h A T 9 0 S 2 3 1 3 ) o b szar d a n y c h (jest to o b s z a r ciągły) rozciąga się na obszar rejestrów r o b o c z y c h (adresy o d O d o $ 1 F ) , o b s z a r w e / w y (adresy od $ 2 0 d o $ 5 F ) i w e w n ę t r z n ą (roboczą) p a m i ę ć S R A M (adresy o d $ 6 0 d o adresu wynikającego z w i e l k o ś c i tej p a m i ę c i , w p r z y p a d k u A T 9 0 S 2 3 1 3 d o $ D F ) , a także z e w n ę t r z n ą p a m i ę ć S R A M , j e ś l i j e s t o b s ł u g i w a n a przez m i k r o k o n t r o l e r . W u k ł a d a c h bez p a m i ę c i S R A M o b s z a r e m d a n y c h będą j e d y n i e rejestry r o b o c z e . P a m i ę ć E E P R O M m a wydzieloną przestrzeń adresową. D o d a t k o w e informacje m o ż n a z n a l e ź ć w rozdziale 4 . A d r e s d a n e j , która m a b y ć z a ł a d o w a n a d o rejestru j e s t w s k a z y w a n y p r z e z 16-bttowy rejestr i n d e k s o w y Z . D a n a ta m o ż e w i ę c b y ć u l o k o w a na w n a j n i ż s z y m o b s z a r z e a d r e s o w y m ( 6 4 k B ) . Jeśli z a c h o d z i p o t r z e b a p o brania danej s p o z a tego o b s z a r u (dotyczy tylko tych u k ł a d ó w , które to u m o ż liwiają, nie dotyczy A T 9 0 S 2 3 1 3 ) , n a l e ż y p o s ł u ż y ć się rejestrem
RAMPZ
z obszaru we/wy. W w y n i k u działania r o z k a z u L D , rejestr i n d e k s o w y m o ż e p o z o s t a ć b e z z m i a ny, m o ż e b y ć i n k r e m e n t o w a n y p o z a ł a d o w a n i u danej (post-increment) może być dekrementowany
przed z a ł a d o w a n i e m danej
lub
(pre-decrement).
W p r z y p a d k u w y k o r z y s t a n i a rejestru Z j a k o rejestru i n d e k s o w e g o , m o ż n a r e a l i z o w a ć pośrednie ł a d o w a n i e danej z p r z e m i e s z c z e n i e m - r o z k a z L D D . A d res danej j e s t określony wtedy zawartością rejestru Z i stałym p r z e m i e s z c z e n i e m , b ę d ą c y m p a r a m e t r e m rozkazu. Ł a d o w a n i e p o ś r e d n i e stwarza m o ż l i w o ś ć w y g o d n e g o m a n i p u l o w a n i a tablicami d a n y c h , p a r a m e t r y c z n e g o w y w o ł y w a n i a p o d p r o g r a m ó w , a także implementacji stosu u ż y t k o w n i k a (niezależ n e g o o d stosu m i k r o k o n t r o l e r a ) , dla k t ó r e g o w s k a ź n i k i e m będzie rejestr Z . C h o c i a ż rejestr Z j e s t rejestrem 16-bitowym, to w u k ł a d a c h mających
nie
więcej niż 2 5 6 bajtów p a m i ę c i S R A M ( n p . A T 9 0 S 2 3 1 3 ) w w y n i k u operacji i n d e k s o w y c h j e s t m o d y f i k o w a n a tylko m ł o d s z a j e g o c z ę ś ć . W takich ukła dach starsza c z ę ś ć rejestru i n d e k s o w e g o m o ż e b y ć u ż y w a n a j a k o rejestr o g ó l n e g o p r z e z n a c z e n i a . Rejestr R A M P Z j e s t modyfikowany w p r z y p a d k u m i k r o k o n t r o l e r ó w mających przestrzeń d a n y c h lub przestrzeń pamięci p r o g r a m u większą niż 6 4 k B .
[A i jUH
N i e w s z y s t k i e warianty r o z k a z u L D z a i m p l e m e n t o w a n o wszystkich m i k r o k o n t r o l e r a c h A V R .
we
Rezultat poniższych operacji j e s t nieokreślony: ld ld ld ld
UfGA Operacja:
(*)
r30,z+ r31,z+ r30,-z r31,-z
R d « - (Z) PC <- PC + 1 Rd < - (Z) Z<-Z+ 1 PC
(***)
PC + 1
z « - Z - l
Rd < - (Z) PC <- PC + 1 (****)
Rd < - ( Z + c 6 3 ) PC <- PC + 1
Składnia:
(*)
LD
Rd,Z
(**)
LD
Rd,Z+
(***)
LD
Rd,-Z
(****)
LDD
Rd,Z+cć3
Kod:
(**) (...)
1 0
0
0
0
0
0
d d d d d o o o o
1 0
0
1
0
0
0
d d d d d
0
0
1 0
0
1
0
0
0
d d d d d
0
0
0 c
c
0
d d•d did
0
c
1
0 1
c 1
1
Liczba stów: 1 (2 bajty) Liczba cykli: 2 Flagi:
I
T
H
V
N
0
1 1 0
c
c
Przykład: clr ldi ld
r31 r30,$60 rO, z +
ld ldi ld ld
rl.z r30,$63 r2,z r3,-z
ldd
r4,2+2
;zeruj starszą cześć rejestru Z jmłodsza część rejestru z = $60 ; ładuj rO daną spod adresu $60 ;i przygotuj następny adres w rejestrze Z ;ładuj rl daną spod adresu $61 ;młodsza część rejestru Z - $63 ;ładuj r2 daną spod adresu $63 ;przygotuj wcześniejszy adres ;w rejestrze Z i ładuj rl daną ;spod tego adresu ($62) ;ładuj r4 daną spod adresu $64
LDI - ładuj rejestr bezpośrednio stalą Ł a d o w a n i e bezpośrednie 8-bitowej danej d o górnego rejestru Operacja:
Rh (R16...R31).
Rh < - c255
PC <~ PC + 1 Składnia:
LDI
Kod:
Rh,c255
1 ' 1 ' 1
'o
i
—i
c
c
i—
c
c
h h h h
—i—r
c
c
i—
c
c
Liczba słów: 1 (2 bajty) Liczba cykli: 1 Flani:
1
T
H
S
V
N
Z
C
Przykład: clr ldi lpta
r31 r30,$f0
,-zeruj starszą część rejestru Z ;mlodsza część rejestru Z = $F0 ,-pobranie stałej z pamięci programu spod ;adresu wskazywanego ;zawartością rejestru Z
LDS - ładuj rejestr bezpośrednio daną z pamięci SRAM Bezpośrednie ładowanie j e d n e g o bajtu z obszaru danych (pamięć S R A M ) d o re jestru. W mikrokontrolerach zawierających
pamięć S R A M (należy d o nich
A T 9 0 S 2 3 1 3 ) obszar danych (jest to obszar ciągły) rozciąga się na obszar rejest rów roboczych (adresy od 0 d o $1F), obszar we/wy (adresy od $20 d o $5F) i w e wnętrzną (roboczą) pamięć S R A M (adresy od $ 6 0 d o adresu
wynikającego
z wielkości tej pamięci, w przypadku A T 9 0 S 2 3 1 3 d o $DF), a także zewnętrzną pamięć S R A M , jeśli jest obsługiwana przez mikrokontroler. W układach bez pa mięci S R A M obszarem danych będą jedynie rejestry robocze. Pamięć E E P R O M m a wydzieloną przestrzeń adresową. D o d a t k o w e informacje można znaleźć w rozdziale 4 . Adres danej, która m a b y ć załadowana d o rejestru jest wskazywa ny przez 16-bitową stałą, podawaną j a k o parametr rozkazu. Zasięg działania roz kazu L D S jest więc ograniczony d o aktualnie dostępnego segmentu danych o wielkości 6 4 k B . Jeśli zachodzi potrzeba pobrania danej spoza tego obszaru (dotyczy tylko tych układów, które to umożliwiają, nie dotyczy AT90S2313), na leży posłużyć się rejestrem R A M P D należącym d o obszaru we/wy.
R o z k a z u LDS nie z a i m p l e m e n t o w a n o w e w s z y s t k i c h m i k r o kontrolerach A V R . S z c z e g ó ł y w notach k a t a l o g o w y c h .
Operacja:
Rd
Składnia:
LDS
Kod:
Rd,adr65535 i — i — i — i —
1 0 - 1
a
i
0
1
1
I
i
i
a a
0
a a
0 1
a
0 •
a
d
d
d
d 0
a a
a
a
a a
d '
0
0
a i
0
a i
a i
liczba słów: 2 (4 bajty) Liczba cykli: 2
Flagi:
Przykład:
I
T
H
lds
r2,$f£00
add sts
r2,rl $ff00,r2
S
V
N
Z
C
; ładuj r2 daną z obszaru danych. ;spod adresu $FF00 ;dodaj rl do r2 ;i zapisz ponownie zmodyfikowaną wartość
LPM - taduj bajt pamięci programu do rejestru L ą d o w a n i e d o rejestru R d j e d n e g o bajtu pamięci p r o g r a m u w s k a z y w a n e g o przez rejestr Z. Rozkaz j e s t w y k o r z y s t y w a n y d o inicjowania stałych i ich po bierania d o dalszych obliczeń przez p r o g r a m . P a m i ę ć p r o g r a m u w mikrokon trolerach A V R jest z o r g a n i z o w a n a w 16-bitowe słowa, lecz rejestr Z wskazu j e kolejne bajty (nie słowa). Jeśli najmłodszy bit rejestru Z będzie miał war tość „ 0 " , to rejestr ten będzie wskazywał młodszy bajt słowa pamięci progra m u . Analogicznie w a r t o ś ć „ 1 " będzie informowała, że chodzi o starszy bajt. Zasięg działania rozkazu LPM j e s t ograniczony d o p i e r w s z y c h 6 4 k B pamięci p r o g r a m u (32 ksłów). W w y n i k u działania rozkazu LPM, rejestr indeksowy m o ż e pozostać bez z m i a n y lub m o ż e b y ć i n k r e m e n t o w a n y . Inkrementacja nie dotyczy rejestru R A M P Z . Układy zezwalające n a a u t o p r o g r a m o w a n i e mogą w y k o r z y s t y w a ć rozkaz LPM d o odczytywania stanu bitów konfiguracyjnych i bitów
zabezpieczają
cych. S z c z e g ó ł o w y c h informacji należy szukać w notach k a t a l o g o w y c h .
Nie
U|GA U|GA Operacja:
(*)
wszystkie
warianty
rozkazu
LPM
g o w y c h (listy rozkazów).
Rezultat poniższych operacji jest nieokreślony: lpm lpm
r30,z+ r31,2+
RO < - (Z)
(RO jest rejestrem d o m y ś l n y m )
PC <- PC + 1 Rd < - (Z) P C <— P C + 1 R d < - (Z) Z*-Z+l PC *- PC + 1
Składnia:
(*) (...)
zaimplementowano
w k a ż d y m mikrokontrolerze A V R . Szczegóły w n o t a c h katalo
LPM LPM
Rd,Z
(nie występuje w A T 9 0 S 2 3 1 3 )
LPM
Rd,Z+
(nie występuje w A T 9 0 S 2 3 1 3 )
1 0
0
1
0
1 0
1
1 0
0
1
0
0
0
d d d d d
0
1 0
0
1 0
0
1
0
0
0
d d d d d
0
1 0
1
1 1 0
0
1 0
0
0
1
i—•
Liczba stów: 1 (2 b a j t y ) Liczba cykli: 3 Flagi:
I
T
H
S
V
N
Z
C
Przykład: ldi ldi lpm
tabl:
zh,high(tabl<
;inicjuj rejestr indeksowy Z
$5876
;bajt $76 jest wskazywany, gdy Z = 0 ,-bajt $58 jest wskazywany, gdy 2 SB=1
;ładuj stała z pamięci programu ;wskazywana przez rejestr Z ;do rejestru rl6
LSB
L
LSL - przesuń logicznie w lewo Przesunięcie wszystkich bitów rejestru R d w lewo. Bit O jest z e r o w a n y , bit 7 jest przesuwany do znacznika C rejestru S R E G . R o z k a z j e s t przeznaczony d o w y k o n y w a n i a operacji m n o ż e n i a liczby jednobajtowej bez znaku przez 2. Operacja:
b7PC
Składnia:
LSL
K o d :
b0*-0
PC+1 Rd
0' 0' 0 ' 0
1 ' 1 ' d' d
d'd'd'd d
d
d
d
kod rozkazu L S L Rd j e s t taki sam j a k dla ADD R d , R d Liczba słów: 1 (2 bajty) Liczba cykli: 1 1
FlaoJ:
T
H
S
V
N
Z
C
H: przyjmuje wartość bitu Rd(3). S:
w y k o r z y s t y w a n a d o sprawdzania znaku wyniku.
V : N © C (N i C p o przesunięciu). N : ustawiana, jeśli M S B został ustawiony, w p r z e c i w n y m p r z y p a d k u zero wana. Z : ustawiana, jeśli w y n i k j e s t r ó w n y zeru, w p r z e c i w n y m przypadku zero wana. C : ustawiana, jeśli bit M S B rejestru przed p r z e s u n i ę c i e m b y ł ustawiony, w p r z e c i w n y m p r z y p a d k u zerowana. Przykład: add lsl
r0,r4 rO
; dodaj r4 do rO .•pomnóż zawartość rO przez 2
LSR - przesuń logicznie w prawo P r z e s u n i e c i e bitów rejestru R d w p r a w o . B i t 7 j e s t z e r o w a n y , bit O j e s t p r z e s u w a n y d o z n a c z n i k a C rejestru S R E G . R o z k a z jest p r z e z n a c z o n y d o w y k o n y w a n i a operacji d z i e l e n i a p r z e z 2 liczby j e d n o b a j t o w e j b e z znaku. Operacja:
rj-Jj^
•>b0
PC <- PC + 1 Składnia:
Kod:
LSR
Rd
— i — i
1
1
— i —
0 0
1
— i — i
0
1
d
d
1
— i — i I
d d
d
d 0
1
1
0
Liczba słów: 1 (2 bajty) Liczba cykli: 1 Flagi:
S:
1
T
H
—
—
—
S
V
N
Z
c
0
wykorzystywana d o sprawdzania znaku wyniku.
V : N © C ( N i C p o przesunięciu). N : 0. Z : ustawiana, j e ś l i w y n i k j e s t r ó w n y zeru, w p r z e c i w n y m p r z y p a d k u z e r o wana. C: u s t a w i a n a , jeśli bit L S B rejestru p r z e d p r z e s u n i ę c i e m b y ł u s t a w i o n y , w przeciwnym przypadku zerowana. Przykład: add lsr
r0,r4 rO
; dodaj r4 do rO ,-podziel wartość wpisaną do rO przez 2
MOV - kopiuj zawartość rejestru do rejestru R o z k a z kopiuje zawartość j e d n e g o rejestru d o drugiego. Rejestr źródłowy po zostaje niezmieniony. Operacja:
Rd + - Rs
PC <- PC + 1 Składnia:
MOV
Rd,Rs 1
o '0 1 0 1 1 s d d d
Kod:
s
i
s
r —
s
s
Liczba stów: 1 (2 bajty) Uczba cykli: 1 Flagi:
1
T
H
S
V
N
Z
C
Przykład:
spr:
mov rl6,r0 rcall spr
,-kopiuj rO do rlfi ;wywołaj podprogram
cpi
,-porównaj zawartość rl6 z liczba $11
ret
rl6,$ll
;powrót z podprogramu
MOVW - kopiuj zawartość słowa zawartego w parze rejestrów Rs+1:Rs do pary rejestrów Rd+1:Rd R o z k a z kopiuje z a w a r t o ś ć 2-bajtowego s ł o w a z a p i s a n e g o w parze rejestrów R s + l : R s d o pary rejestrów R d + l : R d . Rejestry ź r ó d ł o w e pozostają n i e z m i e nione.
U|GA
J a k o rejestry R d i R s m o g ą b y ć użyte tylko rejestry o p a r z y s
• I
R o z k a z u MOVW n i e z a i m p l e m e n t o w a n o w e w s z y s t k i c h m i k r o -
tych adresach ( 0 , 2,..., 3 0 ) .
UffiGA
kontrolerach A V R , w t y m w A T 9 0 S 2 3 1 3 . S z c z e g ó ł y w notach
••
Operacja:
katalogowych.
R d + l : R d < - Rs+l:Rs P C
Składnia:
MOVW Rd+l:Rd,Rs+l:Rs
Kod:
-1—i
— i — i
0 0
0
-i • ii — i — s s s s 1
0 0
0 0
1
d
d
d
d
Liczba słów: 1 (2 bajty)
Liczba cykli: 1 Flagi:
1
T
H
S
V
N
Z
C
Przykład:
spr:
movw rl7:lfc, r l : r 0 rcall spr
;kopiuj rlrrO do rl7:rl6 .-wywołaj podprogram
cpi
r!6,SU
;porównaj zawartość rl6 z liczbą Sil
cpi
rl7,$32
jporównaj zawartość rl7 z liczbą S32
ret
;powrót z podprogramu
MUL - mnożenie liczb bez znaku M n o ż e n i e d w ó c h 8-bitowych liczb bez znaku. W w y n i k u operacji otrzymuje się liczbę 16-bitową b e z znaku. Rs
R1
RO
mnożnik
iloczyn H
iloczyn L
Rd
X
mnożna
16
8
8
Przed wykonaniem operacji MUL d o rejestru Rd należy wpisać mnożną, d o re jestru Rs mnożnik. Obie liczby są traktowane j a k o 8-bitowe liczby bez znaku. W rezultacie wykonania rozkazu MUL, w rejestrze R l zostanie zapisany bar dziej znaczący bajt 16-bitowego wyniku, a w RO mniej znaczący bajt wyniku.
U|GA
Jeśli j a k o R d i Rs w y b r a n o rejestry R l i RO, to i c h zawartość zostanie z m o d y f i k o w a n a .
Rozkazu M U L nie z a i m p l e m e n t o w a n o w e w s z y s t k i c h mikro
U|GA Operacja:
R1:R0
kontrolerach A V R , w tym w A T 9 0 S 2 3 1 3 . S z c z e g ó ł y w notach katalogowych.
Rd - Rs
(wszystkie liczby b e z znaku)
PC « - PC + 1 Składnia:
M U L Rd,Rs i
i
Kod:
1 0
0
1
1
1
d d
s
d
d
d
s
s
s
s
Liczba stów: 1 (2 bajty) Liczba cykli: 2 Flagi:
I
T
H
S
V
N
Z
C
Z : ustawiana, jeśli wynik jest równy $0000, w przeciwnym przypadku zerowana C : ustawiana, jeśli bit M S B iloczynu ( R l ( 7 ) ) j e s t ustawiony, w przeciwnym przypadku z e r o w a n a . Przykład: mul
r5,r4
;pomnóż rS przez r4
movw
r4,r0
;kopiuj iloczyn do pary r5:r4
MULS - mnożenie liczb ze znakiem M n o ż e n i e d w ó c h 8-bitowych liczb ze z n a k i e m . W w y n i k u operacji o t r z y m u j e się liczbę 16-bitową ze z n a k i e m . Rhd
R1
RO
iloczyn H
iloczyn L
Rhs
X
mnożna
~*
mnożnik
8
8
16
Przed w y k o n a n i e m operacji MULS d o rejestru Rhd należy wpisać mnożną, d o r e jestru R h s mnożnik. Obie liczby są traktowane j a k o 8-bitowe liczby ze znakiem. W rezultacie wykonania rozkazu MULS, w rejestrze R l zostanie zapisany bar dziej znaczący bajt 16-bitowego wyniku, a w RO mniej znaczący bajt wyniku.
R o z k a z u MULS nie z a i m p l e m e n t o w a n o w e w s z y s t k i c h m i k r o kontrolerach A V R , w t y m w A T 9 0 S 2 3 1 3 . S z c z e g ó ł y w n o t a c h katalogowych.
Operacja:
R I : R 0 < ~ R h d -Rhs
(wszystkie liczby z e znakiem)
PC <- PC + 1 Składnia: Kod:
MULS 0
Rhd.Rhs
0 0
0 0
0
1
d d
0 d
d
s
s
s
s
Liczba słów: 1 ( 2 bajty) Liczba cykli: 2 1
Flagi:
Z:
T
H
S
V
N
Z
C
ustawiana, jeśli wynik jest równy $0000, w przeciwnym przypadku zerowana,
C : u s t a w i a n a , jeśli bit M S B iloczynu ( R 1(7)) j e s t u s t a w i o n y , w p r z e c i w n y m przypadku zerowana. Przykład: I
muls movw
r21,r20 r20,r0
.-pomnóż r21 przez r20 .-kopiuj iloczyn do pary r21:r20
MULSU - mnożenie liczby ze znakiem z liczbą bez znaku M n o ż e n i e liczby 8-bitowej ze z n a k i e m z liczbą 8-bitową bez znaku. W wyni k u operacji otrzymuje się liczbę 16-bitową ze z n a k i e m . Rms
Rmd mnożna 8
X
—•
mnożnik 8
R1
RO
iloczyn H
iloczyn L 16
Przed w y k o n a n i e m operacji M U L S U d o rejestru R m d należy wpisać mnożną (liczbę 8-bitową ze z n a k i e m ) , d o rejestru R m s m n o ż n i k (liczbę 8-bitową bez znaku). W rezultacie w y k o n a n i a rozkazu M U L S U , w rejestrze R l zostanie za pisany bardziej znaczący bajt 16-bitowego w y n i k u (liczba ze znakiem), a w RO mniej znaczący bajt wyniku.
R o z k a z u M U L S U nie z a i m p l e m e n t o w a n o w e wszystkich mikro kontrolerach A V R , w t y m w A T 9 0 S 2 3 1 3 . S z c z e g ó ł y w notach katalogowych.
Operacja:
R 1 : R 0 < - Rhd - Rhs PC < - PC + 1
Składnia:
MULSU o ' 0 i
Kod:
(Rmd = R16 do R23, R m s = R16 do R23)
Rmd.Rms
i 0
0 0
0
1
1 0
d d
s s
d 0
s
Liczba słów: 1 (2 bajty) Liczba cykli: 2 Flagi:
1
Z:
T
H
S
V
N
Z
C
ustawiana, jeśli w y n i k j e s t r ó w n y $ 0 0 0 0 , w p r z e c i w n y m przypadku zero wana.
C : ustawiana, jeśli bit M S B iloczynu ( R l ( 7 ) ) j e s t u s t a w i o n y , w przeciwnym przypadku z e r o w a n a .
Przykład: Procedura mnożenia dwóch liczb 16-bitowych ze znakiem iloczyn jest 32-bitową liczbą ze znakiem rl9:r!8:rl7:rl6 = r23:r22 * r21:r20 mulsl6xl6_32: clr muls movw mul movw mulsu sbc add adc adc rnulsu sbc add adc adc ret
r2 r23,r21 rl9:rl8,rl:r0 r22,r20 rl? :rl6,rl:rO r23,r20 rl9,r2 rl7,r0 rl8,rl rl9,r2 r21,r22 rl9,r2 rl7,r0 rl8,rl rl9,r2
,-mnóż starsze bajty .-przepisz wynik do rl9:rl8 ;mnóż nilodsze bajty .-przepisz wynik do rl7:rl6
NEG - uzupełnienie do dwóch Z a m i a n a zawartości rejestru Rd na j e g o uzupełnienie d o d w ó c h . Wartość $80 pozostaje niezmieniona. Zapis liczb w kodzie uzupełnienia d o d w ó c h pozwa la interpretować j e j a k o liczby ze znakiem. Wyjaśnia t o poniższy przykład: liczba przed w y k o n a n i u rozkazu NEG
Operacja:
liczba p o wykonaniu rozkazu NEG
-3 = $11111101
->
$00000011 = 3
-2 = $ i n i n i o
->
$00000010 = 2
-1 =$11111111
->
$00000001 = 1
0 = $00000000
->
$00000000 =
o
Rd < - $ 0 0 - Rd PC <- P C + 1
Składnia:
Rd
NEG
Kod:
1
0 0
1
0
1
0
d
d
d d
0 0
d 0
1
Liczba słów: 1 ( 2 bajty) Liczba cykli: 1 I
Flagi:
—
T
H
S
V
N
Z
c
—
H: ustawiana, jeśli nastąpiło przeniesienie z bitu 3 , w p r z e c i w n y m przypad k u zerowana. S:
w y k o r z y s t y w a n a d o sprawdzania znaku w y n i k u .
V: ustawiana, j e ś l i nastąpiło p r z e p e ł n i e n i e operacji u z u p e ł n i e n i a do d w ó c h , w p r z e c i w n y m p r z y p a d k u z e r o w a n a . P r z e p e ł n i e n i e nastąpi tylko w ó w c z a s , g d y rejestr R d p o w y k o n a n i u r o z k a z u b ę d z i e miał wartość równą $ 8 0 . N : ustawiana, jeśli M S B zosta! ustawiony, w przeciwnym przypadku zerowana. Z : ustawiana, jeśli w y n i k jest r ó w n y zeru, w p r z e c i w n y m p r z y p a d k u zero wana. C: ustawiana, jeśli p o d c z a s operacji o d e j m o w a n i a liczby o d zera była po trzebna pożyczka, w p r z e c i w n y m przypadku z e r o w a n a . Flaga C będzie ustawiana z a w s z e , z wyjątkiem przypadku, gdy zawartość rejestru Rd po wykonaniu r o z k a z u N E G będzie r ó w n a $ 0 0 .
Przykład:
dod:
sub brpl neg nop
rll.rO; dod rll
rodejmij rO od rll ;skocz, jeśli wynik dodatni ,-oblicz uzupełnienie do dwóch ;dalsze operacje
NOP - nic nie rób W wyniku działania rozkazu N O P nie j e s t p o d e j m o w a n a żadna akcja (oprócz zwiększenia stanu licznika p r o g r a m u umożliwiającego p o b r a n i e kolejnego rozkazu). Jest on najczęściej w y k o r z y s t y w a n y d o u z y s k i w a n i a opóźnienia. Zajmuje j e d e n cykl. Operacja:
PC <- PC + 1
Składnia:
NOP
Kod:
r
i
r—
o o o o
o o o o
i
1 1 r~~ l__J o o o o
o o o o L—J
L 1 1_ Liczba słów: 1 (2 bajty) Liczba cykli: 1
Flagi:
Przykład:
I
clr ser out nop out
T
H
rl6 rl7 S18,rl6 $18,rl7
S
V
N
Z
C
;zeruj rl6 ;ustaw rl7 ; zapisz 0 do portu B ,-nic nie rób ,-zapisz jedynki do portu
OR - suma logiczna rejestrów O b l i c z e n i e s u m y logicznej rejestrów R d i R s . W y n i k j e s t u m i e s z c z a n y w re jestrze R d . Operacja:
Rd <- Rd v Rs PCł-PC + 1
Składnia: Kod:
OR
Rd,Rs
—i
0
0
i—i—
i—i— 1 0 1
0 s
d
d
d
d
d
s
s s
s
Liczba słów: 1 ( 2 bajty) Liczba cykli: 1 1
Flagi:
T
H
— — — S:
S
V 0
N
Z
C
•«•+•
—
w y k o r z y s t y w a n a d o s p r a w d z a n i a znaku w y n i k u .
V : 0. N : u s t a w i a n a , jeśli M S B został u s t a w i o n y , w p r z e c i w n y m p r z y p a d k u zero wana. Z : u s t a w i a n a , jeśli w y n i k j e s t r ó w n y zeru, w p r z e c i w n y m p r z y p a d k u zero wana. Przykład: or bst brts
•ók;
nop
rl5,rl6 rl5,6 ok
;oblicz sume logiczną rl5 i rl6, wynik w rl5 ,-skopiuj bit 6 rejestru rl6 do znacznika T ;skocz, jeśli znacznik T ustawiony
;dalsze
działania
ORI - suma logiczna rejestru i stałej Obliczenie sumy logicznej górnego rejestru R h i stałej. W y n i k jest umiesz czany w rejestrze R h . Operacja:
Rh < - Rh v c255 PC«— P C + 1
Składnia:
ORI
Rh,c255 —
Kod:
0 ' 1
0
V
r
—
c
c
r—i C
C
d'd'd'd
r
c
r
c
i
c
c
Liczba slow. 1 (2 bajty)
Liczba cykli: I Flaoj:
1
—
T
H
— —
S
V
N
Z
C
0
S: w y k o r z y s t y w a n a d o sprawdzania znaku w y n i k u . V: 0. N : ustawiana, jeśli M S B został ustawiony, w p r z e c i w n y m p r z y p a d k u zero wana. Z : ustawiana, jeśli w y n i k j e s t równy zeru, w p r z e c i w n y m p r z y p a d k u zero wana.
Przykład: ori ori
rl6,$f0 rl7,l
;ustaw górny półbajt ;ustaw bit 0 w r!7
rl6
OUT - zapisz port Urnieszczenie danej z rejestru r o b o c z e g o R s d o rejestru n a l e ż ą c e g o d o obsza ru w e / w y ( p o r t y , timery/liczniki, rejestry konfiguracyjne itp.). Operacja:
P <- Rs PC<-PC + 1
Składnia: Kod:
OUT
P,Rs 1 — 1
—1
1 0 1
1
1 1 1
1
p
p
s
i—
i
— i
s
_
s »
s 1
s
p . p . p . p
»
Liczba stów: 1 ( 2 bajty) Liczba cykli: 1
Ragi:
Przykład:
I
T
clr ser out nop out
H
rl6 rl7 $18,rl6 $18,rl7
S
V
N
Z
C
;zeruj rejestr rl6 ,-ustaw rl7 ;zapisz zera do p o r t u B ;czekaj ;zapisz jedynki d o portu
B
POP - pobierz rejestr ze stosu Rozkaz ładuje bajt ze szczytu stosu mikrokontrolera d o rejestru Rd. Przed pobra niem danej ze stosu inkrementowany jest wskaźnik stosu (preinkrementacja).
R o z k a z u P O P nie z a i m p l e m e n t o w a n o w e wszystkich mikro kontrolerach A V R . W mikrokontrolerze A T 9 0 S 2 3 1 3 wskaźni kiem stosu j e s t 8-bitowy rejestr S P L ( S P H nie występuje). Szczegóły w notach katalogowych.
R o z k a z P O P j e s t na o g ó l w y k o r z y s t y w a n y z r o z k a z e m P U S H . Stos mikrokon trolera m o ż n a p o r ó w n a ć d o stosu talerzy p o u k ł a d a n y c h j e d e n na drugim. Operacja na stosie m o ż e się o d b y w a ć tylko poprzez j e g o g ó r n y element (nie m a możliwości wyciągnięcia talerza ze Środka). T r z e b a r ó w n i e ż pamiętać o tym, że elementy są pobierane ze stosu w odwrotnej kolejności niż w tej, w której były na n i m o d k ł a d a n e . Operacja:
SPH:SPL <- SPH:SPL + 1 Rd
(SPHrSPL)
dla mikrokontrolera A T 9 0 S 2 3 1 3 : SPL « - SPL + 1
Kd<~
(SPL)
PC <- PC + 1 Składnia:
POP
Kod:
1 0
Rd 0
1
0
0 0
d d
d
d
d
1
1
1
1
•
Liczba słów: I (2 bajty) Liczba cykli: 2 Flag):
I
T
H
S
V
N
Z
c
Przykład:
proc:
cali
proc
jwywołaj podprogram
push push
rl4 rl3
;odłóż na stos rl4 ,-odłóż na stos rl3
clr clr
rl3 rl4
;zeruj rl3 ;zeruj rl4
pop pop ret
rl3 rX4
;odtwórz rl3 (pobierając ze stosu) ;odtwórz rl4 (pobierając ze stosu)
PUSH - odłóż rejestr na stos R o z k a z zachowuje zawartość rejestru Rd na szczycie stosu mikrokontrolera. P o zapisaniu danej na stosie d e k r e m e n t o w a n y j e s t w s k a ź n i k stosu (postdekrementacja).
R o z k a z u PUSH nie z a i m p l e m e n t o w a n o w e w s z y s t k i c h mikro kontrolerach A V R . W mikrokontrolerze A T 9 0 S 2 3 1 3 wskaźni kiem stosu jest 8-bitowy rejestr S P L ( S P H nie występuje). Szczegóły w notach katalogowych.
R o z k a z PUSH j e s t n a ogół w y k o r z y s t y w a n y z r o z k a z e m POP. Stos mikrokon trolera m o ż n a p o r ó w n a ć d o stosu talerzy p o u k ł a d a n y c h j e d e n n a drugim. Operacja na stosie m o ż e się o d b y w a ć tylko poprzez j e g o górny e l e m e n t (nie m a możliwości wyciągnięcia talerza ze środka). T r z e b a r ó w n i e ż pamiętać o tym, że elementy są p o b i e r a n e ze stosu w odwrotnej kolejności niż w tej, w której były na n i m odkładane. Operacja:
(SPH:SPL) < - Rd SPH:SPL+- SPH:SPL- 1 dla mikrokontrolera A T 9 0 S 2 3 1 3 : ( S P L ) + - Rd SPL <- SPL - 1 PC < - P C + 1
Składnia:
PUSH
Kod:
Rd i — i —
1
1 0
0 '
1
0
0
1
"i
d
d
1 1
d
1
Liczba stów: 1 (2 bajty)
1
d 1
d
1 1 1 1 i
i
.
—
Liczba cyłdi: 2 Ragi:
I
T
H
S
V
N
Z
C
Przykład:
proc:
cali
proc
;wywołaj podprogram
push push
rl4 rl3
;odłóż na stos rl4 ;odłóż na stos rl3
clr clr
rl3 rl4
;zeruj rl3 ;zeruj rl4
pop pop ret
rl3 rl4
;odtwórz rł3 (pobierając ze stosu} ;odtwórz rl4 (pobierając ze stosu)
RCALL - wywołanie podprogramu o adresie względnym W y w o ł a n i e p o d p r o g r a m u o adresie w z g l ę d n y m . A d r e s u l o k o w a n i a podpro gramu w pamięci p r o g r a m u nie m o ż e b y ć bardziej odległy od r o z k a z u wywo łującego niż PC-2 k s ł ó w + 1 d o P C + 2 k s ł ó w . W mikrokontrolerach, w których pamięć p r o g r a m u jest mniejsza niż dopuszczalny zasięg działania rozkazu RCALL (np. A T 9 0 S 2 3 1 3 ) p o w y ż s z e ograniczenie o c z y w i ś c i e nie m a znacze nia. Adres powrotu (adres następnego rozkazu p o rozkazie w y w o ł a n i a pod p r o g r a m u ) j e s t z a w s z e odkładany na stosie. K a ż d o r a z o w o p o odłożeniu jed nego bajtu, wskaźnik stosu ( S P H : S P L ) j e s t d e k r e m e n t o w a n y
(zmniejszany
o j e d e n ) . W mikrokontrolerze A T 9 0 S 2 3 1 3 w s k a ź n i k stosu j e s t rejestrem 8-bit o w y m - S P L (tylko). A r g u m e n t e m rozkazu RCALL jest adres w y w o ł y w a n e g o p o d p r o g r a m u , a w ł a ś c i w i e przemieszczenia w z g l ę d e m adresu bieżącego (stąd wywołanie względne). „ R ę c z n e " obliczanie p r z e m i e s z c z e ń byłoby jed n a k b a r d z o n i e w y g o d n e w praktyce. Najczęściej w i ę c stosuje się symbolicz ny zapis adresu p o d p r o g r a m u , w postaci etykiety. K o n k r e t n a w a r t o ś ć prze mieszczenia j e s t później obliczana na etapie asemblacji. Operacja:
( S P H : S P L ) <~ P C + 1 (odłóż adres p o w r o t u na stos) S P H : S P L < - S P H : S P L - 2 (w przypadku adresu 16-bitowego (2-bajtowego)) lub S P H : S P L
Składnia: Kod:
R C A L L adr2k 1
1
1
1 1 0 1
1
-1
I
1
r-
a a a
i
i
i—i—
a a a a a a a a a —_i i—i
Liczba słów: 1 (2 bajty) Liczba cykli; 3 dla 16-bitowego adresu w y w o ł y w a n e g o p o d p r o g r a m u 4 dla 2 2 - b i t o w e g o adresu w y w o ł y w a n e g o p o d p r o g r a m u
Flagi:
I
T
H
S
y
n
2
C
3
Przykład:
proc:
rcall proc
;wywołaj podprogram ;(adres w postaci symbolicznej)
push
r!4
,-zachowaj r!4 na stosie
pop ret
rl4
,-odtwórz rejestr rl4 ;powrót z podprogramu
RET - powrót z podprogramu R o z k a z powoduje inkrementację wskaźnika stosu, a następnie zdjęcie ze sto su danej będącej adresem powrotu z p o d p r o g r a m u i z a ł a d o w a n i e jej d o licz nika programu P C .
U|GA Operacja:
W mikrokontrolerze A T 9 0 S 2 3 1 3 wskaźnik stosu j e s t rejestrem 8-bitowym - S P L . Rejestru S P H nie z a i m p l e m e n t o w a n o .
dla 16-bitowego P C : SPH:SPL <- SPH:SPL + 2 PC(15...0) < - ( S P H : S P L ) dla 16-bitowego P C dla 22-bitowego P C : SPH:SPL <- SPH;SPL + 3 PC(21...0) < - ( S P H : S P L ) dla 22-bitowego P C dla mikrokontrolera A T 9 0 S 2 3 1 3 : SPL < - SPL + 2 P C ( 1 5 . . . 0 ) < - (SPL)
Składnia: Kod:
RET 1 0
0 1 0
1 0
1
o o o o
1 0
0
0
Liczba słów: 1 (2 bajty) Liczba cykli: 4 dla 16-bitowego adresu 5 dla 22-bitowego adresu
Ragi:
I
N
T
H
cali
proc
;wywołaj podprogram
push
rl4
;odłóż na stos rl4
pop ret
rl4
,-odtwórz rl4 (pobierając ze stosu)
S
V
Przykład:
proc:
RETI - powrót z procedury obsługi przerwania P o w r ó t z procedury obsługi przerwania w y m a g a w y k o n a n i a p e w n y c h c z y n ności, których nie realizuje r o z k a z R E T . Z tego p o w o d u k a ż d a procedura o b sługi p r z e r w a n i a p o w i n n a b y ć z a k o ń c z o n a r o z k a z e m R E T I . P o w o d u j e on in k r e m e n t a c j ę w s k a ź n i k a stosu, a następnie zdjęcie ze stosu danej będącej a d r e sem p o w r o t u z p o d p r o g r a m u i z a ł a d o w a n i e j e j d o licznika p r o g r a m u P C . D o d a t k o w o , a u t o m a t y c z n i e j e s t u s t a w i a n a flaga g l o b a l n e g o s t e r o w a n i a p r z e r w a n i a m i , p o w o d u j ą c ich o d b l o k o w a n i e . P r o g r a m i s t a musi p a m i ę t a ć , ż e tak j a k w y w o ł a n i e p r o c e d u r y o b s ł u g i p r z e r w a n i a nie powoduje a u t o m a t y c z n e g o z a c h o w a n i a u ż y w a n y c h rejestrów n a stosie, t a k p o w r ó t z p r z e r w a n i a za p o m o c ą r o z k a z u R E T I n i e p o w o d u j e ich a u t o m a t y c z n e g o zdjęcia ze stosu. N a j c z ę ś ciej j e d n a k p e w n e rejestry są u ż y w a n e . W szczególności, w w y n i k u w y k o n y w a n y c h w p r o c e d u r z e operacji m o ż e ulec zmianie rejestr statusowy S R E G . J e g o u ż y c i e m o ż e b y ć w i ę c niejawne. T r z e b a mieć tego ś w i a d o m o ś ć i b e z pieczniej j e s t z a w s z e z a c h o w y w a ć g o . P e w i e n kłopot z t y m związany p o l e g a na t y m , że rejestr S R E G nie m o ż e być a r g u m e n t e m rozkazu P U S H , a t y m sa m y m n i e m o ż e b y ć b e z p o ś r e d n i o z a c h o w a n y n a stosie. N i e z b ę d n y jest z a b i e g p o k a z a n y w przykładzie dla rozkazu R E T I .
U|GA Operacja:
W m i k r o k o n t r o l e r z e A T 9 0 S 2 3 1 3 w s k a ź n i k stosu j e s t rejestrem 8 - b i t o w y m - S P L . Rejestru S P H nie z a i m p l e m e n t o w a n o .
dla 16-bitowego P C : SPH:SPL <- SPH:SPL + 2 I<-
1
PCC15...0) * - ( S P H : S P L ) d l a 16-bitowego P C dla 2 2 - b i t o w e g o P C : S P H : S P L
1
PC(15...0)<- (SPL) Składnia:
Kod:
RETI 1
0
0
1
0
1
0
1
0
0
0
1
1 0 0 0
Liczba słów: 1 (2 bajty) Liczba cykli: 4 d l a 1 6 - b i t o w e g o a d r e s u 5 dla 22-bitowego adresu 1
Flagi:
T
H
S
V
N
Z
c
1 1:1. Przykład: Ovr2: push push in push
r24 rO rO,sreg rO
Ids subi sts
r24,$60 r24,$FF S60,r24
pop out pop pop ret i
rO sreg,rO rO
,-procedura obsługi przerwania ; zachowaj r24 na stosie ;pobierz rejestr statusowy do rO ,-zachowaj SREG na stosie
;niejawna zmiana stanu rejestru SREG
,-stara wartość SREG ze stosu do rO ,-odtwórz rejestr statusowy ;odtwórz pozostałe rejestry
r24 ;powrót z przerwania
RJMP - skok względny S k o k w z g l ę d n y w o b r ę b i e 2 k s l ó w o d bieżącego adresu ( P C - 2 k s ł ó w + 1 d o P C + 2 k s l ó w ) . W mikrokontrolerach, w których p a m i ę ć p r o g r a m u j e s t m n i e j sza niż d o p u s z c z a l n y zasięg działania r o z k a z u R J M P (np. A T 9 0 S 2 3 1 3 ) p o w y ż s z e o g r a n i c z e n i e o c z y w i ś c i e nie m a znaczenia. A r g u m e n t e m
rozkazu
R J M P j e s t adres skoku, a w ł a ś c i w i e p r z e m i e s z c z e n i e w z g l ę d e m adresu bieżą c e g o . „ R ę c z n e " obliczanie przemieszczeń byłoby j e d n a k b a r d z o n i e w y g o d n e w praktyce. Najczęściej w i ę c stosuje się s y m b o l i c z n y zapis adresu procedury, w postaci etykiety. K o n k r e t n a wartość p r z e m i e s z c z e n i a j e s t później o b l i c z a n a na e t a p i e asemblacji. R o z k a z R J M P m o ż e a d r e s o w a ć całą p a m i ę ć mikrokontrolera A T 9 0 S 2 3 1 3 . Operacja:
PC « - adr2k
Składnia:
RJMP
(stos pozostaje bez z m i a n y )
adr2k 1 — —r—
Kod:
1 1 0 1
1
1
0
a
i
a
a
a a —
a
ł
a
r—
1
1
a a
a
a
a
Liczba słów: 1 (2 bajty) Liczba cykli: 2 Flagi:
I
T
H
V
N
Przykład:
Ok:
cpi breq rjmp add inc nop
rl6,$42 error ok rl6,rl7 rl6
;sprawdź, czy rl6 ma wartość ; s k o c 2 , jeśli tak ;skok bezwarunkowy ;dodaj rl7 do rl6 ;inkrementuj rl6 ;adres skoku rjmp
$42
ROL - obróć w lewo przez flagę przeniesienia Przesunięcie wszystkich bitów rejestru R d o j e d n ą pozycję w l e w o . W s k a ź n i k C rejestru S R E G j e s t p r z e s u w a n y d o bitu 0 rejestru R d , bit 7 j e s t przesuwany d o znacznika C. R o z k a z ROL w połączeniu z L S L j e s t w y k o r z y s t y w a n y d o m n o ż e n i a przez 2 wielobajtowych liczb ze z n a k i e m lub bez z n a k u .
PC <- PC + 1
Składnia:
ROL
Kod:
0
Rd
0 '
0 '
1 1
1
—
1
d
i
'
i—i d d d i
i
i
d
d
d
d
d
d
r
k o d rozkazu ROL R d j e s t taki s a m j a k dla ADC R d , R d Liczba stów: 1 (2 bajty)
Liczba cykti: 1 Ragi:
I
T
H
S
V
N
Z
C
H: Rd(3). S:
w y k o r z y s t y w a n a d o sprawdzania znaku w y n i k u .
V : N © C (N i C p o przesunięciu). N : ustawiana, jeśli M S B został ustawiony, w p r z e c i w n y m p r z y p a d k u zero wana. Z : ustawiana, jeśli w y n i k j e s t r ó w n y zeru, w p r z e c i w n y m p r z y p a d k u zero wana. C : ustawiana, jeśli bit M S B rejestru Rd przed przesunięciem b y ł ustawiony, w przeciwnym przypadku zerowana.
Przykład:
cjed:
lsl roi
rl8 rl9
brcs
cjed
nop
pomnóż rl9:rl8 przez 2 rl9:r!8 jest liczbą integer ze znakiem lub bez znaku skok jeśli flaga C ustawiona .
,-dalsze operacje
ROR - obróć w prawo przez flagę przeniesienia Przesuniecie wszystkich b i t ó w rejestru Rd o jedną pozycję w prawo. W s k a ź n i k C rejestru S R E G jest p r z e s u w a n y d o bitu 7 rejestru R d bit 0 jest p r z e s u w a n y f
d o znacznika C. R o z k a z ROR w połączeniu z rozkazem ASR jest wykorzysty wany d o dzielenia przez 2 wielobajtowych liczb ze znakiem, a w połączeniu z r o z k a z e m LSR d o dzielenia przez 2 wielobajtowych liczb bez znaku.
PC < - P C + 1 Składnia:
ROR
Rd
1
Kod:
1
1 0 1
1
0 1
1
1
0
I
1 i
0 1
1
1
T
d d d d d 0 1
'
i
1 1 1 i
•
i
Liczba słów: 1 (2 bajty) Liczba cyWi: 1 I
Flagi:
S:
T
H
S
V
N
Z
C
w y k o r z y s t y w a n a d o s p r a w d z a n i a znaku wyniku.
V: N © C (N i C p o przesunięciu). N: u s t a w i a n a , jeśli M S B został u s t a w i o n y , w p r z e c i w n y m przypadku z e r o wana. Z : u s t a w i a n a , jeśli w y n i k j e s t r ó w n y z e r u , w p r z e c i w n y m p r z y p a d k u z e r o wana. C : u s t a w i a n a , jeśli bit L S B rejestru Rd przed p r z e s u n i ę c i e m b y ł u s t a w i o n y , w przeciwnym przypadku zerowana. Przykład: lsr ror brcc asr ror brcc
rl9 rl8 czerol rl7 rl6 czero2
podziel rl9:rl8 przez 2 rl9:rl8 jest liczbą integer bez znaku skok jeśli flaga C wyzerowana podziel rl7:rl6 przez 2 rl7:rl6 jest liczbą integer ze znakiem skok jeśli flaga C wyzerowana
czerol: nop
,-dalsze operacje
czero2: nop
;dalsze operacje
SBC - odejmij zawartość rejestrów z przeniesieniem Odjecie zawartości d w ó c h rejestrów oraz znacznika C. W y n i k j e s t umiesz czany w rejestrze Rd. Operacja:
Rd « - Rd - Rs - C PCf-PC+1
Składnia:
SBC
Rd.Rs
o 0 0 0
Kod:
1 0 s
— i
(
r
d d d d d s s s
r— s
Liczba stów: 1 ( 2 bajty) Liczba cykli: 1 Flagi:
1
T
H
S
V
N
Z
C
— H: ustawiana, jeśli nastąpiło przeniesienie z bitu 3 , w p r z e c i w n y m przypad k u zerowana. S:
w y k o r z y s t y w a n a d o sprawdzania znaku wyniku.
V : ustawiana, jeśli nastąpiło przepełnienie operacji u z u p e ł n i e n i a d o dwóch, w p r z e c i w n y m p r z y p a d k u zerowana. N : ustawiana, jeśli M S B został ustawiony, w p r z e c i w n y m p r z y p a d k u zero wana. Z : ustawiana, jeśli w y n i k jest r ó w n y zeru, w p r z e c i w n y m p r z y p a d k u zero wana. C: ustawiana, jeśli w a r t o ś ć b e z w z g l ę d n a zawartości rejestru Rs płus pierwot ny stan flagi C j e s t w i ę k s z a niż wartość b e z w z g l ę d n a zawartości rejestru Rd. Przykład: aub sbc
r2,rtł r3,rl
;odejmij rl:r0 od r3:r2 ;odejmij młodsze bajty .-odejmij starsze bajty z przeniesieniem
SBCI - odejmij bezpośrednio stalą od rejestru Odjęcie b e z p o ś r e d n i e stałej z zakresu 0...255 i przeniesienia od g ó r n e g o r e jestru. W y n i k j e s t u m i e s z c z a n y w t y m s a m y m g ó r n y m rejestrze Rh. Operacja:
Rh < - R h - c 2 5 5 - C PC
Składnia:
Kod:
PC + 1
SBCI 0
Rh,c255
1 0
0
r—
r—i
c
h h h h c c c c 1
c c c —i—i—i i
1
1
(
Liczba stów: 1 (2 bajty) Liczba cykli: 1 Flagi:
> I
T
H
S
V
N
Z
C
H: ustawiana, jeśli nastąpiło przeniesienie z bitu 3, w p r z e c i w n y m p r z y p a d ku z e r o w a n a . S:
wykorzystywana do sprawdzania znaku wyniku.
V : ustawiana, jeśli nastąpiło przepełnienie operacji uzupełnienia d o d w ó c h , w przeciwnym przypadku zerowana. N : ustawiana, jeśli M S B został u s t a w i o n y , w p r z e c i w n y m p r z y p a d k u z e r o wana. Z : ustawiana, j e ś l i w y n i k j e s t r ó w n y zeru, w p r z e c i w n y m p r z y p a d k u z e r o wana. C: u s t a w i a n a , jeśli w a r t o ś ć b e z w z g l ę d n a stałej c 2 5 5 plus p i e r w o t n y stan fla gi C j e s t w i ę k s z a niż wartość b e z w z g l ę d n a zawartości rejestru Rh. Przykład: subi sbci
rł6,$23 rl7,$4f
.-odejmij liczbę S4F23 od rl7:rl6 ,-odejmij młodszy bajt ,-odejmij starszy bajty z przeniesieniem
SBI - ustaw bit w rejestrze we/wy Ustawienie wyspecyfikowanego bitu w rejestrze we/wy. R o z k a z działa tylko na niskich rejestrach tego obszaru (o adresach z przedziału 0...31 ($00...$1F)). Operacja:
Pl(b)
1
PC<- P C + 1 Składnia:
SBI
Kod:
— i ™i—i— 'T 1 0 0 1 1 0
Pl.b I
1 ' 1
1 0 P,P
I
p,p
l
1 —
p ,
b
1
i — i —
b
b
Liczba stów: 1 (2 bajty) Liczba cykli: 2 Flagi:
I
T
H
S
V
N
Z
C
Przykład: .include "2313def.inc"
out sbi in
eear,rO eecr,O rl,eedr
;2apisz adres EEPROM-u ;ustaw bit EERE rejestru EECR ;czytaj pamięć EEPROM
SBIC - przeskocz, jeśli bit w rejestrze we/wy jest wyzerowany R o z k a z s p r a w d z a w y s p e c y f i k o w a n y bit w d o l n y m rejestrze obszaru w e / w y i jeśli bit ten m a w a r t o ś ć z e r o , t o następuje p r z e s k o k kolejnego rozkazu. Stan rejestru nie ulega z m i a n i e . R o z k a z operuje tylko na d o l n y c h rejestrach p r z e strzeni w e / w y . Operacja:
Jeśli P l ( b ) = 0 , to P C <~ P C + 2 (lub P C + 3 ) w p r z e c i w n y m p r z y p a d k u P C <— P C + 1
Składnia:
SBIC
Kod:
Pl,b
1 0 '
0 •
1
1 0
•
1
0
1
p, p . p .
p
p r
b i
b i
b i
Liczba stów: 1 (2 bajty) Liczba cykli: 1, jeśli w a r u n e k j e s t niespełniony (bez p r z e s k o k u ) 2 , jeśli w a r u n e k j e s t s p e ł n i o n y i następuje p r z e s k o k r o z k a z u
złożonego
z 1 słowa 3, jeśli w a r u n e k j e s t spełniony i następuje p r z e s k o k r o z k a z u
złożonego
z 2 słów I Flagi:
I
T I
|
H I
S I
V N I_ I
Z
C I
,
Przykład: .include
e2zap:
-2313de£.inc"
sbic rjmp nop
e e c r . e e w e jprzeskocz następny rozkaz, jeśli EEWE=0 e2zap ,-zapis do E E P R O M - u nie zakończony
SBIS - przeskocz, jeśli bit w rejestrze we/wy jest ustawiony R o z k a z testuje w y s p e c y f i k o w a n y bit w d o l n y m rejestrze o b s z a r u
we/wy
i j e ś l i bit ten j e s t u s t a w i o n y , to następuje p r z e s k o k k o l e j n e g o r o z k a z u . Stan rejestru nie ulega z m i a n i e . R o z k a z operuje t y l k o na d o l n y c h
rejestrach
przestrzeni w e / w y . Operacja:
Jeśli P l ( b ) = l , to P C < - P C + 2 (lub P C + 3) w przeciwnym przypadku PC <- PC + 1
Składnia: Kod:
SBIS
Pl,b
1 ' 0 ' 0 ' 1 1
1 0
1 1
p,p,p.p
p
b
b
b
1 — 1
Liczba słów: 1 (2 bajty) Liczba cykli: 1, jeśli warunek j e s t niespełniony (bez przeskoku) 2, jeśli w a r u n e k j e s t spełniony i następuje p r z e s k o k r o z k a z u
złożonego
z 1 słowa 3 , jeśli w a r u n e k j e s t spełniony i następuje p r z e s k o k r o z k a z u
złożonego
z 2 słów
H
Flagi:
V
N
Przykład: .include *2313def.inc*
czekaj: sbis
pind,0
rjmp nop
czekaj
;przeskocz następny rozkaz, ; jeśli bit 0 portu D nie jest ustawiony ;czekaj na zmianę stanu ;nast epne operacje
SBIW - odejmij bezpośrednio stałą od stówa B e z p o ś r e d n i e odjęcie stałej z zakresu 0...63 od pary rejestrów R R i u m i e s z czenie w y n i k u w tych s a m y c h rejestrach R R . M o ż l i w e pary rejestrów t o : R25:R24, R27:R26, R29:R28, R31:R30. Operacja:
R R h : R R l « - RRh:RRl - c63 PC+-PC+1
Składnia:
SBIW 1
RR,c63 1
1 0 1
1
0 1
r
1
0
1
1
r
_I
u.
1
r
c
1 1 1
i
J
1
r
c i
—
r
i
—
c
i
i
—
c 1
i
—
c •
c 1
Liczba słów: 1 (2 bajty) Liczba cykli: 1 Ragi:
I
S:
T
H
S
V
N
Z
C
w y k o r z y s t y w a n a d o s p r a w d z a n i a znaku wyniku.
V : u s t a w i a n a , jeśli nastąpiło przepełnienie operacji uzupełnienia d o d w ó c h , w przeciwnym przypadku zerowana. N : u s t a w i a n a , jeśli M S B został u s t a w i o n y , w p r z e c i w n y m przypadku z e r o wana. Z : ustawiana, jeśli w y n i k j e s t r ó w n y $ 0 0 0 0 , w p r z e c i w n y m przypadku z e r o wana. C : u s t a w i a n a , jeśli w a r t o ś ć b e z w z g l ę d n a stałej c 6 3 j e s t w i ę k s z a niż w a r t o ś ć b e z w z g l ę d n a zawartości rejestru R R . Przykład: sbiw sbiw
r25:r24,l ;odejmij 1 od r25:r24 yh:yl,63 ,-odejmij 63 od rejestru indeksowego Y=r29:r28
SBR - ustaw bity w rejestrze Ustawienie w y s p e c y f i k o w a n y c h bitów w g ó r n y m rejestrze R h . R o z k a z reali zuje operację s u m y logicznej O R p o m i ę d z y zawartością rejestru R h i maską będącą p a r a m e t r e m r o z k a z u . O z n a c z a t o , że zostaną ustawione t e bity rejest ru, k t ó r y m odpowiadają bity o wartości „ 1 " w m a s c e . Operacja:
Rh
Rh v c255
PC<- PC+ 1 Składnia:
Kod:
SBR 0
'
1
Rh,c255
—i i" i— 1 0 c c c c h
h
h
h
—i C c c C
Liczba słów: 1 (2 bajty)
Liczba cykli: 1 Flagi:
1
— S:
T
H
—
S
V 0
N
Z
C
-*-*•
—
w y k o r z y s t y w a n a d o sprawdzania znaku wyniku.
V: 0. N : ustawiana, jeśli M S B został ustawiony, w p r z e c i w n y m p r z y p a d k u zero wana. Z : ustawiana, jeśli w y n i k j e s t r ó w n y zeru, w p r z e c i w n y m p r z y p a d k u zero wana.
Przykład: sbr sbr
rl6,3 r!7,Sf0
;ustaw bit 0 i 1 w rl6 ;ustaw A najstarsze bity w r!7
SBRC - przeskocz, jeśli bit w rejestrze jest wyzerowany Rozkaz testuje wyspecyfikowany bit w rejestrze R s i jeśli bit ten jest wyzerowa ny, to następuje przeskok kolejnego rozkazu. Stan rejestru nie ulega zmianie. Operacja:
Jeśli R s ( b ) = 0 , to P C < - P C + 2 (lub P C + 3) w przeciwnym przypadku P C « - P C + 1
Składnia:
Kod:
SBRC 1
Rs,b
l
1
1 1 1 1 1
•
I
I
I
]
1 1i0 i s s __i I
s s
s 0
•
b i
b i
b i
1
Liczba słów: 1 ( 2 bajty) Liczba cykli: 1, jeśli w a r u n e k j e s t niespełniony ( b e z p r z e s k o k u ) 2, jeśli w a r u n e k j e s t spełniony i następuje p r z e s k o k r o z k a z u
złożonego
z 1 słowa 3 , j e ś l i w a r u n e k j e s t s p e ł n i o n y i następuje p r z e s k o k r o z k a z u
złożonego
z 2 słów
Flagi:
I
T
H
S
V
N
Z
C
Przykład: sub sbrc sub nop
rO.rl r0,7 rO.rl
;odejmij rl od rO ,-przeskocz, jeśli bit 7 w rO jest wyzerowany ;wykonuj tylko wtedy, ,-gdy bit 7 w rO nie jest wyzerowany jdalsze operacje
SBRS - przeskocz, jeśli bit w rejestrze jest ustawiony R o z k a z testuje wyspecyfikowany bit w rejestrze Rs i jeśli bit ten j e s t ustawio ny, to następuje przeskok kolejnego rozkazu. Stan rejestru nie ulega zmianie.
Operacja:
Jeśli R s ( b ) = l , to P C < - P C + 2 (lub P C + 3) w p r z e c i w n y m p r z y p a d k u P C «— P C + 1
Składnia: Kod:
SBRS
Rs,b 1 r— i ' s s s s s 0 1
1 1 1 1 1
•
1
1
'
11 1
1
1
b
b
b
1
Liczba stów: 1 (2 bajty) Liczba cykli: 1, jeśli w a r u n e k jest niespełniony (bez przeskoku) 2, jeśli w a r u n e k j e s t spełniony i następuje p r z e s k o k r o z k a z u
złożonego
z 1 słowa 3 , jeśli warunek jest spełniony i następuje p r z e s k o k r o z k a z u
złożonego
z 2 słów T
H
V
N
Flagi: Przykład: sub sbrs neg nop
rO.rl r0,7 rO
;odejmij rl od rO ,-przeskocz, jeśli bit 7 w rO jest ustawiony ;wykonuj tylko wtedy, ;gdy bit 7 w rO nie jest ustawiony ;daisze operacje
SEC - ustaw flagę przeniesienia R o z k a z ustawia flagę przeniesienia (C) w rejestrze s t a t u s o w y m
Operacja:
C«-1 PC <- PC +
Składnia: Kod:
1
SEC —i—i 1 0
1
0
—i 0
1
1
1
0
0
0
1
0
0
0
1
0
0
0
Liczba stów: 1 ( 2 bajty)
Liczba cykli: 1
I
Flagi:
T
H
s
V
N
z
c 1
C:
1
Przykład: sec adc
rO.rl
ustaw flagę c rO=rrO + rl + l
SREG.
SEH - ustaw flagę przeniesienia pomocniczego R o z k a z ustawia flagę przeniesienia p o m o c n i c z e g o (H) w rejestrze statuso wym SREG. Operacja:
H<- 1 PC«~PC+1
Składnia:
SEH
Kod:
r * — i 1
0 0
1
0
1
0
0 0
1
0
1
1
0 0
0
Liczba słów: 1 (2 bajty) Liczba cykli: 1 I
Flagi:
— H:
T
H
—
1
s
_
V
N
—
z
c
— —
1
Przykład: seh
,-ustaw flagę p r z e n i e s i e n i a
pomocniczego
SEI - ustaw flagę globalnego sterowania przerwaniami R o z k a z u s t a w i a flagę g l o b a l n e g o sterowania p r z e r w a n i a m i (I) w rejestrze sta t u s o w y m S R E G . P o w y k o n a n i u rozkazu S E I , przed faktycznym o d b l o k o w a niem p r z e r w a ń , będzie w y k o n a n y następny p o SEI rozkaz. Operacja:
I <- 1 PC
Składnia; Kod:
PC + 1
SEI — i
—i
0 0
1
1
0
1
0
0
i
0
r r 1 1 1
— i — i
1
1
0 0
0
Uczta słów: 1 ( 2 bajty) Liczba cykli: 1 I
Flagi:
T
H
s
V
N
z
c
1 1:1 Przykład: sei sleep
;odblokuj przerwania ;uśpij procesor, czekaj na przerwanie lub reset
SEN - ustaw flagę wartości ujemnej R o z k a z ustawia flagę wartości ujemnej (N) w rejestrze s t a t u s o w y m S R E G .
Operacja:
N <- 1 PC <- PC + 1
Składnia:
SEN
Kod:
0 0
1
1
0
1 0
0 1 ' 0 1
0
0
0 0
0
Liczba stów: 1 (2 bajty) Liczba cykli: 1 Flagi:
I
T
—
—
H
s — .
V
N
Z
c
—
1
—
—
N: 1 Przykład: add sen
r2,rl9
;dodaj rl9 do r2 ;ustaw flagę wartości ujemnej
SER-ustaw rejestr R o z k a z u s t a w i a w s z y s t k i e bity w g ó r n y m rejestrze R h . Operacja:
Rh < - S F F PC < - P C +
Składnia:
1
SER
Kod:
1
1 I
1
0
1
1
1
1
i
1
r 1
i
1
-i
s
1 i
r
s 1
-i
s '
s 1
1
1
1 1
•
1 • ••
Liczba słów: 1 (2 bajty) Liczba cykli: 1
Flagi:
I
T
H
S
V
N
Z
C
Przykład: .include '2 313def.inc* clr ser out nop out
rl6 rl7 portb,rl6
;zeruj rl6 ;ustaw rl7 ;zapisz zera do portu B
portb,rl7
;zapis2 jedynki do portu B
SES - ustaw flagę znaku R o z k a z ustawia flagę z n a k u (S) w rejestrze s t a t u s o w y m S R E G . Operacja:
S«— 1 P C <— P C + 1
Składnia:
SES
Kod:
0 0
1
1
0
1
0
0 0
1
0
0
1
0 0
0
Liczba stów: 1 (2 bajty) Liczba cykli: 1 I
Flagi:
T
— — S:
H
S
V
N
—
1
—
—
z
1
Przykład: add ses
r2,rl9
c
_ —
,-dodaj rl9 do r2 ,-ustaw flagę 2naku
SET - ustaw flagę pomocniczą T R o z k a z u s t a w i a flagę p o m o c n i c z ą (T) w rejestrze s t a t u s o w y m S R E G .
Operacja:
T «- 1 PC*-PC+1
Składnia: Kod:
SET
1 0 0
1
0
1
0 0 0 1
0 1 0 0 0
1
liczba słów: I (2 bajty)
Liczba cykli: 1 Flagi:
T:
I
T
—
1
H
s
V
N
z
1
Przykład: 'Set
ustaw flagę
T
c
SEV - ustaw flagę przepełnienia uzupełnienia do dwóch R o z k a z ustawia flagę przepełnienia uzupełnienia d o d w ó c h (V) w rejestrze statusowym SREG. Operacja:
V <- 1 PC <- PC + 1
Składnia: Kod:
SEV — i
•
1 0
i — i —
0
1
0
1
r
0 0
0
0 1
r" 1
1
0 0
0
Liczba stów: 1 ( 2 bajty) Liczba cykli: 1 Flagi:
1
T
— —
H
s
— —
V
N
1
—
Z
V: 1 Przykład: add sev
r2,rl9
c
— —
;dodaj rl9 do r2 ;ustaw flagę V
SEZ-ustaw flagę zera R o z k a z u s t a w i a flagę zera (Z) w rejestrze s t a t u s o w y m S R E G . Operacja:
Z <- 1 PC <- PC + 1
Składnia:
SEZ i—
i
Kod:
1
—t—i
i —
1 0
1 0
0 0
0 0
I
1
1 1 0 0
0 0
0
Liczba słów: 1 (2 bajty) Liczba cykli: 1 I
Ragi:
Z:
T
H
S
V
N
z
c
1
—
1
Przykład: add sez
r2,rl9
;dodaj rl9 do r2 ;ustaw flagę zera
SLEEP - przejdź w tryb uśpienia W p r o w a d z e n i e mikrokontrolera w tryb o b n i ż o n e g o poboru m o c y zdefiniowa nego ustawieniem bitu S M w rejestrze M C U C R (patrz rozdział 4.11). Aby wejście w tryb uśpienia było m o ż l i w e , musi b y ć ustawiony bit S E w rejestrze M C U C R . Zalecane jest j e g o ustawianie b e z p o ś r e d n i o przed w y k o n a n i e m roz kazu S L E E P . Z a b e z p i e c z a to przed możliwością n i e p o ż ą d a n e g o
uśpienia
mikrokontrolera. W y p r o w a d z e n i e układu z tego stanu jest m o ż l i w e tylko po przez przerwanie lub zerowanie. Programista m u s i p a m i ę t a ć , aby przed wy k o n a n i e m rozkazu S L E E P o d p o w i e d n i e p r z e r w a n i e oraz z e z w o l e n i e globalne na przerwania były o d b l o k o w a n e . Operacja:
w p r o w a d z e n i e układu w tryb uśpienia PC<-PC + 1
Składnia:
SLEEP i
Kod:
1 0
0
1
0
i
i
1 0
1
1 0
0
0
1 0
0
0
Liczba słów: 1 (2 bajty) Liczba cykli: 1
Flagi:
I
H
V
N
Przykład: .include -2313def.inc* .def temp=rlfj
ldi out sei
temp,$02 mcucr.temp
in
temp.mcur temp,(1<<SE)
ori
out sncucr,temp sleep out portb,0
;przerwania od opadającego zbocza jodblokuj globalnie przerwania
INTO
;przepisz stan rejestru MCUR do temp ;przygotuj możliwość wprowadzenia trybu ;uśpienia ;uśpienie procesora ;zapal LED-y dołączone ;obudzeniu ,-dalsze operacje
do portu B po
SPM - zapisz pamięć programu R o z k a z SPM m o ż e b y ć u ż y w a n y d o k a s o w a n i a strony p a m i ę c i p r o g r a m u , za p i s y w a n i a strony pamięci p r o g r a m u (która j e s t j u ż w y k a s o w a n a ) oraz d o ustawiania bitu zabezpieczającego boot loadera.
W niektórych m i k r o k o n t r o
lerach m o ż n a z a p i s y w a ć p o j e d y n c z e s ł o w o p a m i ę c i p r o g r a m u , w innych z a ś , przed o s t a t e c z n y m z a p i s e m n a l e ż y umieścić d a n e w s p e c j a l n y m buforze stro ny. Z a w s z e j e d n a k operacja zapisu p a m i ę c i p r o g r a m u b ę d z i e wiązała się z w y k a s o w a n i e m całej strony pamięci. W c z a s i e k a s o w a n i a rejestry R A M P Z i Z służą d o a d r e s o w a n i a strony. P o d c z a s zapisu, rejestry R A M P Z i Z służą d o a d r e s o w a n i a strony l u b s ł o w a , a w parze rejestrów R 1 :R0 j e s t p r z e c h o w y w a n a d a n a d o z a p i s u ( R l - starszy bajt, RO - młodszy bajt).
R o z k a z u SPM nie z a i m p l e m e n t o w a n o w e wszystkich m i k r o
U|GA Operacja:
(*)
kontrolerach A V R , w t y m w A T 9 0 S 2 3 1 3 . S z c z e g ó ł y w notach katalogowych.
( R A M P Z : Z ) < - $ F F F F kasuj p a m i ę ć p r o g r a m u P C
(**)
( R A M P Z : Z ) « - R 1 : R 0 zapisz s ł o w o pamięci p r o g r a m u PC
(***)
( R A M P Z : Z ) « - R 1 : R 0 zapisz bufor pamięci p r o g r a m u PC
(****)
PC + 1
PC + 1
( R A M P Z : Z ) < - T E M P zapisz dane z bufora d o p a m i ę c i p r o g r a m u PC
PC + 1
(****•) B L B I T S
SPM i
1
0 0
1
0
1
i
0
-
1
"
- - 1
1
1
1
0 1
1
0 0
0
Liczba słów: 1 ( 2 bajty) Liczba cykli: zależy od operacji Ragi:
I
T
H
s
V
N
Z
c
loadera
Przykład: Przykład pokazuje zapis strony pamięci procedura zapisuje jedna stronę z pamięci RAM do Flash-a adres pierwszej danej w RAM-ie jest wskazywany przez rejestr Y adres pierwszej danej we Elash-u jest wskazywany przez rejestr Z nie ma obsługi błędów procedura musi być umieszczona w obszarze boot (przynajmniej podprogram do__spm używane rejestry: rO, rl, templ, temp2, looplo, loophi, spmcrval (templ, temp2, looplo, loophi, spmcrval musza, być zadeklarowane przez użytkownika .equ PAGESIZEB = PAGESIZE * 2 .org SMALLBDOTSTART zap_st r: ldi spmcrval, (1«PGERS) cali do_spm
;PAGESIZE jest wielkością strony ,-w bajtach, nie w słowach ;kasuj stronę (1«SPMEN)
;przepisanie danych z RAM-u do Flash-a idi looplo,Iow(PAGESIZEB) ; inicjuj zmienna, sterującą pętli ldi loophi,high{PAGESIZEB) ,-zbędne, jeśli PAGESIZEB<=256 rO,ył ld ld rl ,y+ ldi spmcrval. U « S P M E N ) cali do_spm adiw zh:zl,2 sbiw loophi:looplo,2 ;dla E>AG£SIZEB<=256 użyj subi brne wrloop Strony subi sub i ldi cali
zl,low
aj ponownie i sprawdź ldi looplo,low(PAGESIZEB) ldi 1oophi,h i gh(PAGESIZEB) subi yl,low(PAGESIZEB) subi yh,high(PAGESIZEB) rO,Z+ rdloop lpm ld rl ,y+ cpse rO,rl jmp error sbiw loophi:looplo,2 brne rdloop ret do_spm:
;odtwórz wskaźnik ;zbedne, jeśli PAGESIZEB<=256 (1«SPMEN)
;inicjuj zmienną sterującą pętli zbędne, jeśli PAGESIZEB<^256 rodtwórz wskaźnik ;
;dla PAGES1ZEB<=256 użyj subi
,-wejście: spmcrval określa akcję ;SPM ;zablokuj przerwania, zachowaj ;status in cli
temp2,sreg
in sbrc rjmp
templ,spmcr templ,spmen wait
out spm out ret
spmcr,spmcrval
;sprawdz, zanim skompletujesz
;sekwencja SPM
error:
ret
sreg, ten»p2
jodtwórz status
ST - zachowaj pośrednio rejestr w pamięci SRAM pod adresem wskazywanym przez rejestr indeksowy X Pośrednie z a c h o w a n i e zawartości pojedynczego rejestru w obszarze danych. W mikrokontrolerach z pamięcią S R A M (należy do nich AT90S2313) obszar da nych (jest t o obszar ciągły) rozciąga się na obszar rejestrów roboczych (adresy od 0 d o $1F), obszar we/wy (adresy od $20 do $5F) i wewnętrzną (roboczą) pamięć" S R A M (adresy od $60 d o adresu wynikającego z wielkości tej pamięci, w przy padku A T 9 0 S 2 3 1 3 d o $DF), a także zewnętrzną pamięć S R A M , jeśli jest obsłu giwana przez mikrokontroler. W układach bez pamięci S R A M obszarem danych są jedynie rejestry robocze. Pamięć E E P R O M ma wydzieloną przestrzeli adreso wą. D o d a t k o w e informacje m o ż n a znaleźć w rozdziale 4 . Adres, pod który m a być zapisana dana z rejestru wskazywany jest przez 16-bitowy rejestr indeksowy X. D a n a ta m o ż e w i ę c b y ć ulokowana w najniższym obszarze a d r e s o w y m (64 k B ) . Jeśli zachodzi potrzeba zachowania danej poza t y m o b s z a r e m (doty czy tylko tych układów, które to umożliwiają, nie dotyczy A T 9 0 S 2 3 1 3 ) , należy posłużyć się rejestrem R A M P X należącym d o obszaru w e / w y . W w y n i k u działania r o z k a z u ST, rejestr i n d e k s o w y m o ż e pozostać bez zmia ny, m o ż e b y ć i n k r e m e n t o w a n y p o z a ł a d o w a n i u danej (post-increment) może być dekrementowany
przed z a ł a d o w a n i e m danej
lub
(pre-decrement).
S t w a r z a t o m o ż l i w o ś ć w y g o d n e g o m a n i p u l o w a n i a tablicami d a n y c h , a także implementacji stosu u ż y t k o w n i k a (niezależnego od stosu mikrokontrolera), dla k t ó r e g o w s k a ź n i k i e m b ę d z i e rejestr X . C h o c i a ż rejestr X j e s t rejestrem 16-bitowym, t o w układach mających nie więcej niż 256 bajtów
pamięci
S R A M ( n p . A T 9 0 S 2 3 1 3 ) w w y n i k u operacji indeksowych j e s t m o d y f i k o w a na tylko m ł o d s z a j e g o c z ę ś ć . W takich u k ł a d a c h starsza c z ę ś ć rejestru indek s o w e g o m o ż e b y ć u ż y w a n a j a k o rejestr o g ó l n e g o przeznaczenia.
Rejestr
R A M P X j e s t m o d y f i k o w a n y w przypadku m i k r o k o n t r o l e r ó w mających prze strzeń d a n y c h lub przestrzeń pamięci p r o g r a m u większą niż 6 4 k B .
U|GA
N i e wszystkie warianty r o z k a z u LD są z a i m p l e m e n t o w a n e w e wszystkich mikrokontrolerach A V R . °
Rezultat p o n i ż s z y c h operacji j e s t nieokreślony:
U|GA
sc st st st
xt,r26 x+.r27 -x,r2fi -x,r27
Operacja:
(*)
(X) < - Rs PC <- PC +
(**)
1
(X) < - Rs X<-X+
I
PC < - PC + (***)
1
X < - X - l (X)
Składnia:
1
(*)
ST
X,Rs
(**)
ST
X+,Rs
(***)
ST
-X,Rs 1
1
T
1 0
0
1
0
0
1
s
s
s
s
s
1 1 0
0
1 0
0
1
0
0
1
s
s
s
s
s
1 1 0
1
1 0
0
1
0
0
1
s
s
s
s
s
1 1 1 0 i
i
i
Liczba stów: 1 (2 bajty) Liczba cykli: 2 I Flagi:
I
T 1
I
H I
S I
V
N I
Z I
C I
Przykład: clr ldi st
r27 r26,$Ć0 x+,rO
st ldi st st
x, rl r26,$63 x,r2 -x, r3
;zeruj starszą cześć rejestru X ;młodsza cześć rejestru X = S60 zachowaj rO pod adres $60 ;i przygotuj następny adres w rejestrze X jzachowaj rl pod adres $61 ;mlodsza cześć rejestru X = $63 ;zachowaj r2 pod adres $63 ,-przygotuj wcześniejszy adres ;w rejestrze X i zachowaj r3 ;pod ten adres ($62f
ST (STD) - zachowaj pośrednio rejestr w pamięci SRAM pod adres wskazywany przez rejestr indeksowy Y Pośrednie z a c h o w a n i e zawartości p o j e d y n c z e g o rejestru d o obszaru danych. W mikrokontrolerach
zawierających
pamięć
SRAM
(należy
do
nich
A T 9 0 S 2 3 1 3 ) o b s z a r d a n y c h (jest to o b s z a r ciągły) rozciąga się n a obszar re j e s t r ó w r o b o c z y c h (adresy o d O d o $ 1 F ) , obszar w e / w y (adresy od $ 2 0 d o $ 5 F ) i w e w n ę t r z n ą (roboczą) pamięć S R A M (adresy od $ 6 0 d o adresu w y n i kającego z wielkości tej p a m i ę c i , w p r z y p a d k u A T 9 0 S 2 3 1 3 d o $ D F ) , a także zewnętrzną
p a m i ę ć S R A M , jeśli jest o b s ł u g i w a n a przez
mikrokontroler.
W u k ł a d a c h b e z p a m i ę c i S R A M o b s z a r e m d a n y c h są j e d y n i e rejestry r o b o c z e . P a m i ę ć E E P R O M m a wydzieloną przestrzeń adresową. D o d a t k o w e in formacje m o ż n a znaleźć w rozdziale 4 . A d r e s , p o d który m a b y ć zapisana da na z rejestru jest w s k a z y w a n y p r z e z 16-bitowy rejestr i n d e k s o w y Y . D a n a ta m o ż e w i ę c b y ć u l o k o w a n a w najniższym o b s z a r z e a d r e s o w y m (64 k B ) . Jeśli zachodzi p o t r z e b a z a c h o w a n i a danej poza t y m o b s z a r e m (dotyczy tylko tych u k ł a d ó w , k t ó r e to umożliwiają, nie dotyczy A T 9 0 S 2 3 1 3 ) , należy posłużyć się rejestrem RAMPY n a l e ż ą c y m d o obszaru w e / w y . W w y n i k u działania r o z k a z u ST, rejestr i n d e k s o w y m o ż e p o z o s t a ć b e z zmia ny, m o ż e b y ć i n k r e m e n t o w a n y p o z a ł a d o w a n i u danej (post-increment) może być dekrementowany
przed z a ł a d o w a n i e m
danej
lub
(pre-decrement),
W p r z y p a d k u w y k o r z y s t a n i a rejestru Y j a k o rejestru i n d e k s o w e g o , m o ż n a re alizować z a c h o w y w a n i e
rejestru pośrednie z p r z e m i e s z c z e n i e m -
rozkaz
STD. A d r e s danej jest o k r e ś l o n y wtedy zawartością rejestru Y i stałym prze m i e s z c z e n i e m , b ę d ą c y m p a r a m e t r e m rozkazu. Z a c h o w y w a n i e pośrednie re jestru
stwarza
możliwość
wygodnego
manipulowania
tablicami
danych,
a także implementacji stosu u ż y t k o w n i k a (niezależnego od stosu m i k r o k o n trolera), dla którego w s k a ź n i k i e m będzie rejestr Y. C h o c i a ż rejestr Y jest re j e s t r e m 16-bitowym, to w układach mających nie więcej niż 2 5 6 bajtów pa mięci S R A M (np. A T 9 0 S 2 3 1 3 ) w w y n i k u operacji i n d e k s o w y c h modyfiko w a n a j e s t tylko m ł o d s z a j e g o część. W takich układach starsza część rejestru i n d e k s o w e g o m o ż e b y ć u ż y w a n a j a k o rejestr o g ó l n e g o przeznaczenia. Rejestr R A M P Y j e s t m o d y f i k o w a n y w przypadku m i k r o k o n t r o l e r ó w mających p r z e strzeń d a n y c h lub przestrzeń pamięci p r o g r a m u większą niż 6 4 k B .
fftł
N i e w s z y s t k i e warianty rozkazu LD są z a i m p l e m e n t o w a n e w e
jUH
wszystkich mikrokontrolerach A V R .
Wg
Rezultat p o n i ż s z y c h operacji jest nieokreślony:
UfGA S
S:S
st
Operacja:
(*)
-y,r29
(Y) < - R s PC <- PC + 1
(**)
(Y) < - R s Y«- Y+ 1 PC <- PC + 1
(***)
Y f - Y - 1 ( Y ) < - Rs PC < - PC + 1
(****)
(Y)<-(Y+c63) PC <- PC + 1
Składnia:
Kod:
(*)
ST
Y,Rs
ST
Y+,Rs
(***)
ST
-Y,Rs
(****)
STY+c63,Rs
(*)
1 0
0
0
(**)
1 0
0
1
1 0
0
1
1
0
0
0
1 s s s s s
0'o'1's
1 0
0
0
s s s s 1 0
0
1
s s s s 1 0
c 0 c c 1 s s s s s 1
Liczba słów: 1 (2 bajty) Liczba cykli: 2 Flagi:
I
T
H
V
N
1 0
c c c
Przykład: clr ldi st
r29 r28,$60 y+,rO
st ldi st st
y.n r28,$63 y,r2 -y.r3
std
y+2,r4
;zeruj starszą część rejestru Y ;młodsza część rejestru Y = $60 ;zachowaj rO pod adres $60 ;i przygotuj następny adres w rejestrze Y ;zachowaj rl pod adres $61 ,-mlodsza część rejestru Y = $63 ;zachowaj r2 pod adres $63 ;przygotuj wcześniejszy adres ;w rejestrze Y i zachowaj r3 ;pod ten adres ($62) ;zachowaj r4 pod adres $64
ST (STD) - zachowaj pośrednio rejestr w pamięci SRAM pod adres wskazywany przez rejestr indeksowy Z Pośrednie z a c h o w a n i e zawartości pojedynczego rejestru d o obszaru danych. W mikrokontrolerach
zawierających
pamięć
SRAM
(należy
do
nich
A T 9 0 S 2 3 1 3 ) obszar d a n y c h (jest to obszar ciągły) rozciąga się n a obszar re j e s t r ó w roboczych (adresy od O d o $ 1 F ) , obszar w e / w y (adresy o d $20 d o $ 5 F ) i wewnętrzną (roboczą) pamięć S R A M (adresy od $60 d o adresu wyni kającego z wielkości tej p a m i ę c i , w przypadku A T 9 0 S 2 3 1 3 d o $ D F ) , a także zewnętrzną pamięć S R A M , jeśli jest o b s ł u g i w a n a p r z e z
mikrokontroler.
W układach bez pamięci S R A M o b s z a r e m danych są j e d y n i e rejestry robo cze. P a m i ę ć E E P R O M m a wydzieloną przestrzeń adresową. D o d a t k o w e in formacje
m o ż n a znaleźć w rozdziale 4 . A d r e s , pod który m a b y ć zapisana da
na z rejestru j e s t w s k a z y w a n y p r z e z 16-bitowy rejestr i n d e k s o w y 2 . D a n a ta może więc b y ć u l o k o w a n a w najniższym obszarze a d r e s o w y m ( 6 4 k B ) . Jeśli zachodzi potrzeba z a c h o w a n i a danej poza t y m o b s z a r e m (dotyczy tylko tych u k ł a d ó w , które to umożliwiają, nie dotyczy A T 9 0 S 2 3 1 3 ) , należy p o s ł u ż y ć się rejestrem
R A M P Z należącym d o obszaru we/wy.
W w y n i k u działania r o z k a z u ST, rejestr i n d e k s o w y m o ż e p o z o s t a ć bez zmia ny, m o ż e b y ć i n k r e m e n t o w a n y p o załadowaniu danej (post-increment) może być dekrementowany
przed z a ł a d o w a n i e m danej
lub
(pre-decrement).
W przypadku w y k o r z y s t a n i a rejestru Z j a k o rejestru i n d e k s o w e g o , można realizować z a c h o w y w a n i e rejestru pośrednie z p r z e m i e s z c z e n i e m - rozkaz STD. A d r e s danej jest określony wtedy zawartością rejestru Z i stałym prze mieszczeniem, b ę d ą c y m p a r a m e t r e m rozkazu. Z a c h o w y w a n i e pośrednie re jestru stwarza m o ż l i w o ś ć w y g o d n e g o
manipulowania tablicami
danych,
a także implementacji stosu u ż y t k o w n i k a (niezależnego od stosu mikrokon trolera), dla którego w s k a ź n i k i e m b ę d z i e rejestr Z. C h o c i a ż rejestr Z j e s t re j e s t r e m 16-bitowym, to w układach mających nie więcej niż 2 5 6 bajtów pa mięci S R A M (np. A T 9 0 S 2 3 1 3 ) w w y n i k u operacji i n d e k s o w y c h modyfiko w a n a j e s t tylko m ł o d s z a j e g o część. W takich układach starsza c z ę ś ć rejestru i n d e k s o w e g o m o ż e b y ć u ż y w a n a j a k o rejestr o g ó l n e g o przeznaczenia. Rejestr RAMPZ jest m o d y f i k o w a n y w przypadku m i k r o k o n t r o l e r ó w mających prze strzeń danych lub przestrzeń pamięci p r o g r a m u większą niż 6 4 k B .
N i e w s z y s t k i e warianty rozkazu S T są z a i m p l e m e n t o w a n e w e wszystkich mikrokontrolerach A V R .
WM
Rezultat poniższych operacji j e s t nieokreślony:
UfGA s Z% Wt
Operacja:
st st
-z,r30 -z,r31
(Z) < - Rs
(*)
1
P C <— P C + (**)
(Z) < - R s Z<-Z+ 1 P C
(***)
Z+-Z-1 (Z) < - R s
1
PC <- PC + (****)
( ) <_ (z+c63) Z
P C +- PC + Składnia:
Kod:
(*)
ST
Z,Rs
(**)
ST
Z+,Rs
(...)
ST
-Z,Rs
(****)
STZ+c63,Rs
(*)
1 0
0
0 0
0
-~i—i i 1 s s s s s
oooo
(**)
1,00,1
0
0
1 s s
s
s
s 0
0
(...)
1 ' 0 '0 \ 1 0
0
1 s s
s
s
s 0
0
C 1 S s
s
s
s 0
c
....)
(
1
V
c[o
Liczba stów: 1 (2 bajty) Liczba cykli: 2 Hagi:
1
I
T
H
c
0
1 1 0
c
c
Przykład: clr ldi st
r31 r30,$60 z+,r0
st ldi st st
z,rl r30,S63 z,r2 -z,r3
std
z + 2, r4
;zeruj starszą cześć rejestru Z .•młodsza część rejestru Z = $60 ;zachowaj rO pod adres $60 ;i przygotuj następny adres w rejestrze Z ;zachowaj rl pod adres $61 ,-młodsza część rejestru Z = $63 ;zachowaj r2 pod adres $63 ;przygotuj wcześniejszy adres ;w rejestrze Z i zachowaj r3 ;pod ten adres ($62) .-zachowaj r4 pod adres $64
STS - zachowaj rejestr bezpośrednio w pamięci SRAM Bezpośrednie zachowanie zawartości pojedynczego rejestru w obszarze danych (pamięć S R A M ) . W mikrokontrolerach z pamięcią S R A M (należy d o nich A T 9 0 S 2 3 1 3 ) obszar danych (jest to obszar ciągły) rozciąga się n a obszar rejest rów roboczych (adresy od 0 d o $1F), obszar we/wy (adresy od $ 2 0 d o S5F) i w e wnętrzną (roboczą) pamięć' S R A M (adresy od $ 6 0 do adresu
wynikającego
z wielkości tej pamięci, w przypadku A T 9 0 S 2 3 1 3 d o $DF), a także zewnętrzną pamięć S R A M , jeśli jest obsługiwana przez mikrokontroler. W układach bez pa mięci S R A M obszarem danych będą jedynie rejestry robocze. Pamięć E E P R O M ma wydzieloną przestrzeń adresową. D o d a t k o w e informacje m o ż n a znaleźć w rozdziale 4 . A d r e s danej, która m a b y ć z a ł a d o w a n a do rejestru jest wskazy wany przez 16-bitową stałą, podawaną j a k o parametr rozkazu. Zasięg działania rozkazu S T S jest więc ograniczony d o aktualnie dostępnego segmentu danych o wielkości 6 4 k B . Jeśli zachodzi potrzeba zachowania danej poza tym obszarem (dotyczy tylko tych układów, które to umożliwiają, nie dotyczy AT90S2313), na leży posłużyć się rejestrem R A M P D należącym d o obszaru w e / w y .
U|GA Operacja:
R o z k a z u S T S nie z a i m p l e m e n t o w a n o w e w s z y s t k i c h m i k r o kontrolerach A V R . Szczegóły w notach k a t a l o g o w y c h .
(adr65535) < - R s PC < - PC + 2
Składnia:
STS
adr65535,Rs i
Kod:
1 0
0
—H
a
——i
!
a
i
1 1
a
i
0
0
— i
a a
l
a
l
a
r~~
i
s
s
s
s 0
a a
a
a
a a
s
1
0 Ą
0
i — •
0 1
I
a
a
a
Liczba stów: 2 ( 4 bajty) Liczba cykli: 2
H
flagi:
V
N
Przykład: lds
r2,SffOO
add sts
r2,rl Sfe00,r2
ładuj r 2 dana z obszaru danych, spod adresu $ F F 0 0 dodaj rl do r 2 i zapisz ponownie zmodyfikowana wartość
SUB - odejmij zawartość rejestrów bez przeniesienia O d zawartości rejestru Rd jest o d e j m o w a n a zawartość rejestru R s . W y n i k j e s t u m i e s z c z a n y w rejestrze R d . Operacja:
R d < - Rd - Rs PC
Składnia: Kod:
PC + 1
SUB 0
Rd,Rs 0
1 1 0 s
0
d d
d s
d d
s
i
r
-
S
5
Liczba słów: 1 (2 bajty) Liczba cykli: 1 I
Flagi:
T
H
S
V
N
Z
—
c
H: ustawiana, jeśli nastąpiła p o ż y c z k a z bitu 3, w p r z e c i w n y m przypadku ze rowana. S:
w y k o r z y s t y w a n a d o sprawdzania znaku w y n i k u .
V: ustawiana, jeśli nastąpiło przepełnienie operacji u z u p e ł n i e n i a d o d w ó c h , w przeciwnym przypadku zerowana. N : ustawiana, jeśli M S B został ustawiony, w p r z e c i w n y m p r z y p a d k u zero wana. Z : ustawiana, jeśli w y n i k jest r ó w n y $ 0 0 , w p r z e c i w n y m p r z y p a d k u zerowa na. C : ustawiana, jeśli w a r t o ś ć b e z w z g l ę d n a zawartości rejestru R s jest większa niż b e z w z g l ę d n a w a r t o ś ć rejestru Rd, w p r z e c i w n y m p r z y p a d k u zerowa na. Przykład: sub brne
rożne:
nop
rl3,rl2 rożne
.-odejmij rl2 od rl3 ;skocz, jeśli rl2or!3
,-dalsze operacje
SUBI - odejmij bezpośrednio stałą od rejestru O d z a w a r t o ś c i g ó r n e g o rejestru R h jest o d e j m o w a n a stalą. W y n i k j e s t zapisy w a n y w t y m s a m y m rejestrze. Operacja:
R h + - Rh - c255 PC < - PC + 1
Składnia: Kod:
SUBI 0
Rh,c255
1 0 '
c
1
1
1
c
c
1
h h h h c c c c
c
*
i—•
1
1
1
Liczba stów: 1 (2 bajty) Liczba cykli: 1
Hagi:
I
T
H
S
V
N
2
C
H: u s t a w i a n a , jeśli nastąpiła p o ż y c z k a z bitu 3 , w p r z e c i w n y m przypadku z e rowana. S: w y k o r z y s t y w a n a d o s p r a w d z a n i a znaku w y n i k u . V : ustawiana, jeśli nastąpiło przepełnienie operacji uzupełnienia d o d w ó c h , w p r z e c i w n y m p r z y p a d k u zerowana. N: ustawiana, jeśli M S B został ustawiony, w p r z e c i w n y m p r z y p a d k u zero wana. Z : ustawiana, j e ś l i w y n i k j e s t r ó w n y $ 0 0 , w p r z e c i w n y m p r z y p a d k u zerowa na. C: ustawiana, jeśli wartość b e z w z g l ę d n a zawartości rejestru R h jest większa niż b e z w z g l ę d n a wartość stałej c 2 5 5 , w p r z e c i w n y m p r z y p a d k u zerowa na. Przykład: subi brne
rożne:
nop
r22,SH rożne
;odejmij liczbę $11 od rejestru r22 ,-skocz, jeśli r22oll
;dalsze operacje
SWAP - zamień póibajty w rejestrze Z a m i a n a miejscami starszego i m ł o d s z e g o półbajtu rejestru Rd. Operacja:
Rd(7...4) < - Rd(3..0), Rd(3...0) < - Rd(7...4) PC
Składnia:
PC + 1
SWAP
Kod:
1 0
Rd 0
1
0
cl d
1 0
d
d
d 0
0
1 0
Liczba słów: I (2 bajty) Liczba cykli: 1 Flagi:
1
T
H
S
V
N
Z
C
Przykład: ldi swap
rl6, Sa5 r!6
;załaduj rejestr rl6 wartością $a5 ;zamień póibajty rl6=S5a
TST - sprawdź zero lub minus S p r a w d z e n i e , czy z a w a r t o ś ć rejestru jest ujemna lub r ó w n a zeru. Operacja polega na obliczeniu iloczynu logicznego A N D rejestru ze sobą. Z a w a r t o ś ć rejestru nie ulega j e d n a k z m i a n i e . Operacja:
Rd < - Rd A Rd P C
SWadnia:
TST
Kod:
0
Rd 0
1 0 0
0
d
d
d
d
d
d
d
d i
d i
d i
kod r o z k a z u T S T j e s t taki sam j a k dla AND R d , R d Liczba stów: 1 (2 bajty) liczba cykli: 1
S:
1
T
H
—
—
—
S
V
N
Z
0
c
—
w y k o r z y s t y w a n a d o s p r a w d z a n i a znaku wyniku.
V: 0. N : ustawiana, jeśli M S B został u s t a w i o n y , w p r z e c i w n y m przypadku z e r o wana. Z : ustawiana, jeśli w y n i k jest r ó w n y zeru, w p r z e c i w n y m przypadku z e r o wana.
Przykład:
zero:
tst
rO
,• testuj rO
breq
zero
;skok, jeśli r0=0
nop
,-dalsze operacje
WDR - zeruj rejestr watchdoga W y z e r o w a n i e licznika w a t c h d o g a . R o z k a z t e n p o w i n i e n b y ć
wykonywany
systematycznie w czasie określonym przez ustawienie preskalera watchdoga. S z c z e g ó ł y m o ż n a z n a l e ź ć w rozdziale 6. Operacja:
Restart watchdoga P C <~ P C + 1
Składnia:
WDR
Kod:
1 ' 0 ' 0 ' 1
0
1 0
1
1 0
1 0
1 0
0
0
Liczba stów: 1 (2 bajty) Liczba cykli: 1 Flagj:
1
T
H
S
V
N
Z
c
Przykład: -def -def
terop=r20 templ=r21 ldi in cli wdr out out
temp,508 templ,sreg
wdtcr,temp sreg,templ
;przygotowanie wpisu do WDTCR ;zapamiętanie statusu CPU ;zablokowanie przerwań ;reset watchdoga ;start watchdoga z minimalnym timeoutem :odtworzenie statusu CPU
: zerowanie watchdoga w takim miejscu ;programu, przez który licznik rozkazu musi rprzechodzić w odstępach czasu nie dłuższych rniż wartość timeoutu
wdr
ldi in Cli wdr out ldi out
temp,$18 templ,sreg
;procedura wyłączenia watchdoga ;zapamiętanie statusu CPU ;zablokowanie przerwań
wdtcr,temp temp,$10 wdtcr,temp
;WDTOE=l i WDE=1
out
sreg,templ
; WDTOE=l i WDE=0 - stop watchdoga, gdyby ;nie było powyższego wpisu do wdtcr, ,-watchdog nie zatrzymałby się rodtworzenie statusu CPU
13. Narzędzia projektowe D o uruchamiania urządzeń z b u d o w a n y c h z w y k o r z y s t a n i e m mikrokontrole r ó w nie wystarczy s a m a lutownica. Wyjątkiem m o ż e b y ć sytuacja, w której ograniczymy swoją rolę j e d y n i e d o z m o n t o w a n i a układu z u ż y c i e m zaprogra m o w a n e g o mikrokontrolera. Jednak większość Czytelników książki chce za p e w n e aktywnie uczestniczyć w tworzeniu aplikacji, tzn. projektować sprzęt i pisać o p r o g r a m o w a n i e . W c o projektant p o w i n i e n w y p o s a ż y ć swoją p r a c o w n i ę ? M o ż e m y tu w y r ó ż nić trzy rodzaje narzędzi: - O p r o g r a m o w a n i e n i e z b ę d n e (lub c o najmniej przydatne) d o pisania włas n y c h p r o g r a m ó w , a w i ę c wszelkiego rodzaju edytory tekstów. - Kompilatory j ę z y k ó w
programowania.
W przypadku
mikrokontrolerów
A V R największą popularnością cieszą się języki: asembler ( p r o g r a m o w a n i e na p o z i o m i e kodu m a s z y n o w e g o ) , Basic (a właściwie j e g o implementacja z n a n a j a k o B a s c o m ) i j ę z y k C. - Symulatory stosowane d o uruchamiania programów przeznaczonych dla mik rokontrolerów, nie wymagające przy t y m „kontaktu" z układami fizycznymi. Wykorzystują jedynie ich wirtualne implementacje. Niestety, symulatory rza dko potrafią w pełni oddać faktyczne działanie mikrokontrolera i dlatego podczas realizacji bardziej złożonych systemów - często konieczne jest użycie emulatora sprzętowego, w którym można uruchomić program z dokładnością do fizycznych sygnałów występujących na wyprowadzeniach układu. P i e r w s z a grupa narzędzi jest licznie reprezentowana i z p e w n o ś c i ą każdy pro gramista znajdzie o d p o w i e d n i e narzędzie, spełniające i n d y w i d u a l n e preferen cje. P o w s z e c h n i e d o s t ę p n e - b o występujące w pakiecie o p r o g r a m o w a n i a s y s t e m o w e g o W i n d o w s - edytory tekstów takie j a k N o t e p a d , W o r d P a d lub popularny edytor W o r d m o g ą służyć d o pisania ź r ó d ł o w y c h wersji oprogra m o w a n i a . Niestety, n a w e t m i m o bardzo z a a w a n s o w a n y c h m o ż l i w o ś c i , j a k i e m a n p . W o r d , nie z a w s z e będą o n e narzędziami o p t y m a l n y m i z punktu wi dzenia programisty. P r z y k ł a d o w y m edytorem, m a j ą c y m s z a n s ę zaspokoić w y m a g a n i a praktycznie k a ż d e g o programisty, jest Kedit (dostępny zarówno w wersji D O S - o w e j , j a k i nowocześniejszej - dla W i n d o w s ) . Jest on dostępny na stronie
http://www.kedit.com/.
C o r a z w i ę k s z a p o p u l a r n o ś ć z i n t e g r o w a n y c h narzędzi I D E (Integrated lopment
Environment)
Deve-
przyczynia się d o spadku zainteresowania samodziel
n y m i edytorami. W p r z y p a d k u I D E m a m y b o w i e m d o c z y n i e n i a z komplet-
nym, zintegrowanym środowiskiem uruchomieniowym, w którym w jednym pakiecie j e s t d o s t ę p n y edytor, k o m p i l a t o r ( l u b polecenia m e n u wywołujące kompilator z e w n ę t r z n y ) i - zazwyczaj - symulator. Najczęściej zintegrowane środowiska u r u c h o m i e n i o w e umożliwiają r ó w n i e ż bezpośrednie sterowanie p o p u l a r n y c h p r o g r a m a t o r ó w . P r z y k ł a d o w y m i p r o g r a m a m i t e g o rodzaju, opi sanymi w dalszej części rozdziału, są: A V R S t u d i o i Yisual M i c r o L a b .
13.1. AVR Assembler for Windows Pierwsze kroki z mikrokontrolerem A V R warto z pewnością w y k o n a ć pisząc programy w asemblerze. W dalszych pracach, nawet m i m o stosowania j ę z y ków w y s o k i e g o poziomu, b a r d z o często będzie zachodziła konieczność analizy kodu g e n e r o w a n e g o przez kompilatory. Czasami wstawki asemblerowe będą pomocne w rozwiązaniu niektórych p r o b l e m ó w optymalizacyjnych, np. pod czas pisania procedur wrażliwych na zależności czasowe, a także wymagają cych szczególnie starannego wykorzystywania pamięci mikrokontrolera lub in nych j e g o z a s o b ó w . Umiejętność pisania i uruchamiania procedur asemblerowych da tu nieocenione usługi. Firma Atmel bezpłatnie udostępnia użytkowni k o m mikrokontrolerów A V R asembler wavrasm ny na
stronie:
V 1.30, który j e s t umieszczo
http:/Avww.afmel.com/dyn/products/tools.asp?familyJd=607.
Po kliknięciu n a powyższy odsyłacz przechodzimy d o działu Software i tam z pozycji AVR Family Assembler
m o ż n a pobrać plik asmpack.exe.
files Po j e
go uruchomieniu zostaną w aktualnym katalogu rozpakowane pliki instalacyj ne, wśród których znajduje się Setup.exe,
Uruchomienie tego programu rozpo
czyna instalację, która przebiega niemal automatycznie, w sposób typowy dla systemu W i n d o w s . Po zakończeniu instalacji i zrestartowaniu komputera pro gram jest g o t o w y d o pracy. W menu startowym, w grupie ATMELAVR znajduje się skrót A VR Assembler
Tools
1.30. Kliknięcie na niego spowoduje urucho
mienie p r o g r a m u , którego g ł ó w n e o k n o przedstawiono na r y s u n k u 1 3 . 1 . P o u r u c h o m i e n i u p r o g r a m u m o ż n a przystąpić d o edycji n o w e g o p r o g r a m u lub skorzystać z g o t o w y c h p r z y k ł a d ó w . W p i e r w s z y m przypadku wybieramy z m e n u opcję File>New,
w w y n i k u czego na ekranie zostaje wyświetlone
puste o k n o edycyjne. W p i s u j e m y
w n i m własny p r o g r a m
W d r u g i m p r z y p a d k u k o r z y s t a m y z opcji File>Open,
asemblerowy.
a następnie wybieramy
interesujący n a s plik z r o z s z e r z e n i e m .asm. Jest to ź r ó d ł o w a postać progra mu, który b ę d z i e m y k o m p i l o w a ć . Linie p r o g r a m u pisanego w asemblerze p o winny m i e ć następującą b u d o w ę (nawiasy k w a d r a t o w e oznaczają opcjonalne występowanie danego elementu):
[etykieta] dyrektywa [parametry] [;komentarzJ [etykietaI mnemonik_rozkazu (parametry] (;komentarz) ;komentarz pusta_linia
Poniżej przedstawiono p r z y k ł a d o w y fragment p r o g r a m u n a p i s a n e g o w asem blerze. Przykład 13.1. Przykład programu napisanego w asemblerze mikrokontrolera AVR etykieta: .EQU Varl = 100 ,-Dyrektywa definiująca stałą Varł o wartości 100 .EQU Var2=200 ;analogicznie nadanie Var2 wartości 200 test: nop rjmp test ;rozkaz skoku (realizacja martwej pętli) ;Linia komentarza, poniżej będzie linia pusta ;Kolejna Linia komentarza. Ten komentarz jest jbardzo długi i dlatego musiał być przełamany
K o m e n t a r z e z a w s z e rozpoczynają się od znaku średnika. Jeśli nie mieszczą się w jednej linii, to trzeba j e p r z e ł a m y w a ć i nową linię r ó w n i e ż rozpoczynać od znaku średnika (patrz przykład 13.1). Etykiety m o g ą b y ć u ż y w a n e j a k o adresy s y m b o l i c z n e . W w y n i k u asemblacji zostaną o n e zastąpione adresami r z e c z y w i s t y m i . D o w p i s y w a n i a r o z k a z ó w mikrokontrolera k o r z y s t a m y z ich tzw. m n e m o n i k ó w . Są t o s y m b o l i c z n e n a z w y operacji mikrokontrolera. Do-
Taft. 13.1. Najważniejsze dyrektywy asemblera AVR Assembler 1.30 Dyrektywa
Opis
BYTE
Rezerwuj bajt dla zmiennej
CSEG
Segment Code
DB
Definiuj stalą - bajt (bajty)
DEF
Definiuj symboliczną nazwę rejestru
DEVICE
Definiuj typ mikrokontrolera
.
DSEG
Segment Data
OW
Definiuj stalą - stówo (stówa)
ENOM, ENDMACRO
Koniec makrodefinicji
EOU
Przypisz etykiecie wartość wyrażenia
ESEG
Segment EEPROM
EXIT
Dyrektywa zatrzymania asemblacji
INCLUOE
Oolącz do pliku źródłowe dane z innego pliku
LIST
Generuj listing po asemblacji
USTMAC
Włącz rozwijanie makrodefinicji w pliku listingu
NOLIST
Nie generuj listingu po asemblacji
ORG
Ustaw licznik rozkazów
SET
Przypisz etykiecie wartość
.
•,
\Ą
kladny ich opis z a m i e s z c z o n o w rozdziale 12. W t a b l i c y 1 3 . 1 przedstawiono znaczenie dyrektyw a s e m b l e r a . D o k ł a d n y ich opis m o ż n a znaleźć w p o m o c y programu. Podczas edycji programu można korzystać z typowych udogodnień, jak na przykład: w y s z u k i w a n i e , wyszukiwanie z zamianą,
kopiowanie
lub
p r z e n o s z e n i e f r a g m e n t ó w t e k s t u . Z w y b r a n y c h , p o w t a r z a j ą c y c h się w i e l o krotnie fragmentów programu mogą być tworzone makrodefinicje. Umoż liwiają o n e z a s t ę p o w a n i e t e k s t u j e d n ą , s y m b o l i c z n ą n a z w ą p r z y p i s a n ą da nej m a k r o d e f i n i c j i . N i e m a w i ę c p o t r z e b y p o w t a r z a n i a c z a s a m i dość długich fragmentów programu. Jakiekolwiek wątpliwości
nawet
nasuwają
c e się p o d c z a s p r a c e d y c y j n y c h p o w i n n a s k u t e c z n i e w y j a ś n i ć p o m o c z a warta w programie. Ostatnią czynnością przed przystąpieniem do symulacji programu będzie jego asemblacja.
W tym celu wybieramy z menu
komendę
Assemble.
W p r z y p a d k u j e d n o c z e s n e j edycji k i l k u p l i k ó w t r z e b a p a m i ę t a ć o w c z e ś niejszym
uaktywnieniu
tego okna, które zawiera moduł główny
pro
gramu, zaś przed przystąpieniem do asemblacji wszystkie moduły powin ny b y ć w c z e ś n i e j z a p i s a n e na d y s k u . W w y n i k u a s e m b l a c j i i k o n s o l i d a c j i t w o r z o n y j e s t p l i k r e l o k o w a l n y .obj, plik w y n i k o w y .hex o r a z o p c j o n a l n i e p l i k Ast z a w i e r a j ą c y l i s t i n g p r o g r a m u z r z e c z y w i s t y m i a d r e s a m i u m i e s z c z o n y m i o b o k r o z k a z ó w . G e n e r o w a n i e p l i k u listingu m o ż e b y ć w y ł ą c z o ne dyrektywą
. N O L I S T . W p r z y p a d k u j e j z a s t o s o w a n i a plik Ast b ę d z i e
zawierał jedynie komunikaty o przebiegu asemblacji. wielomodułowych .include
programów
należy
pamiętać
Podczas
o tym,
że
pisania
dyrektywa
p o w o d u j e d o ł ą c z e n i e z a w a r t o ś c i o s o b n e g o p l i k u w miejscu
j e j w y s t ą p i e n i a . N i e u m i e j ę t n e k o r z y s t a n i e z niej m o ż e p o w o d o w a ć t r u d n e d o z l o k a l i z o w a n i a b ł ę d y , g d y ż n i e są o n e w y k r y w a n e n a e t a p i e a s e m b l a c j i ( p r z y k ł a d 13.2). Przykład 13.2. Przykład nieprawidłowego zastosowania dyrektywy .include ;2awartość pliku modull.asm: .include "2313de£.inc* .def temp=rl6 .cseg .org 0 rjmp .include .org 10 reset:
tu:
.-dołączono definicje rejestrów ;definicja rejestru temp rdefinicja adresu bezwzględnego ;skok do początku programu pod adres SIO
reset
;w tym miejscu jest dołączony fragment ;programu zawarty w pliku modul2.asm
"modul2.asm"
ldi out ldi rcall i nc nop rjmp
,-definicja adresu bezwzględnego temp,low(RAMEND) ;temp=adres stosu ;ustaw wskaźnik stosu SPL,temp temp,Sa5 pprog ;wywołaj podprogram (jego treść jest ;zamieszczona w pliku modul2.asm) ;inkrementuj zmienna temp temp tu
;2awartość pliku modul2.asm: pprog: nop nop • •
rmp nop nop
nop nop nop nop out ret
portb,temp
Umieszczenie .include
u
podprogramu
pprog
w miejscu
wystąpienia
dyrektywy
m o d u l 2 . a s m " j e s t w p o w y ż s z y m p r z y k ł a d z i e b ł ę d e m . Dłu
g o ś ć t e g o p o d p r o g r a m u j e s t zbyt d u ż a , w w y n i k u c z e g o następujący p o n i m rozkaz l d i
t e m p , Iow(RAMEND)
s e m $ 1 0 za p o m o c ą d y r e k t y w y dwa rozkazy podprogramu
u m i e j s c o w i o n y na s z t y w n o p o d adre
. o r g 1 0 , t y m s a m y m n a d p i s z e ostatnie
pprog.
W konsekwencji
nie wystąpią
one
w o g ó l e w p r o g r a m i e . A b y u n i k n ą ć takiej sytuacji n a l e ż a ł o b y albo prze n i e ś ć w s p o m n i a n ą d y r e k t y w ę . i n c l u d e na k o n i e c m o d u ł u 1 lub nie usta lać b e z w z g l ę d n e g o adresu d y r e k t y w ą . o r g 1 0 .
W o k n i e k o m u n i k a t ó w (Message)
są s y g n a l i z o w a n e w s z y s t k i e w y k r y t e b i e
dy k o m p i l a c j i . U s t a w i e n i e kursora na w y b r a n y k o m u n i k a t p o w o d u j e p o d świetlenie w o k n i e e d y c y j n y m linii p r o g r a m u podejrzanej o błąd. N a l e ż y się j e j u w a ż n i e p r z y j r z e ć , usunąć n i e p r a w i d ł o w o ś ć i p o w t ó r n i e w y k o n a ć a s e m b l a c j ę p r o g r a m u . D o p i e r o p o u z y s k a n i u w y n i k u Assembly with no errors chamianiem
complete
m o ż n a p r z y s t ą p i ć d o d a l s z y c h c z y n n o ś c i z w i ą z a n y c h z uru programu.
Będą
one
opisane w
dalszej c z ę ś c i
rozdziału
(w p o d r o z d z i a l e 1 3 . 3 . 1 ) .
13.2. Kompilator języka C - AVR-GCC wersja 3.2 Wyższość języków wysokiego poziomu nad językami
niskopoziomowymi
jest bezdyskusyjna. G d y b y tak nie było najprawdopodobniej w ogóle by nie powstały, a p r o g r a m i ś c i tworzyliby p r o g r a m y na poziomie pojedynczych bi t ó w . P r o g r a m n a p i s a n y w j ę z y k u w y s o k i e g o poziomu j e s t czytelniejszy od a s e m b l e r o w e g o , u m o ż l i w i a skrócenie czasu potrzebnego na z a k o d o w a n i e al g o r y t m u , z d e c y d o w a n i e ułatwia p r o g r a m o w a n i e złożonych operacji arytme tycznych. M i m o , że w j ę z y k a c h w y s o k i e g o p o z i o m u p r o b l e m y są traktowane w s p o s ó b bardziej abstrakcyjny niż w asemblerze, możliwe jest precyzyjne sterowanie
urządzeniami
peryferyjnymi
dołączonymi d o
mikrokontrolera
i w y k o r z y s t y w a n i e j e g o z a s o b ó w niemal tak precyzyjne, j a k za pomocą j ę z y k ó w n i s k i e g o p o z i o m u . J ę z y k i w y s o k i e g o p o z i o m u nie nadają się j e d n a k d o realizacji w s z y s t k i c h z a d a ń . Największą bolączką p r o g r a m i s t ó w jest problem z optymalizacją k o d u w y n i k o w e g o przejawiający się zbyt dużą wielkością p r o g r a m u l u b zbyt d ł u g i m c z a s e m w y k o n y w a n i a się poszczególnych p r o c e dur. W k r y t y c z n y c h sytuacjach programista musi skorzystać z możliwości umieszczania w programie pisanym w języku wysokiego poziomu wstawek a s e m b l e r a w y c h . M e t o d a t a k a na ogół rozwiązuje w i ę k s z o ś ć p r o b l e m ó w , a j e ś l i n i e , o z n a c z a t o z a z w y c z a j , że trzeba sięgnąć p o silniejszy m i k r o k o n troler. W e w c z e ś n i e j s z y c h rozdziałach książki p r z e d s t a w i o n o
przykłady
p r o g r a m ó w p i s a n y c h z a r ó w n o w a s e m b l e r z e , j a k i w j ę z y k u C. O w y b o r z e tego j ę z y k a z a d e c y d o w a ł o m.in. to, że j e s t d o s t ę p n y j e g o b e z p ł a t n y k o m p i lator w w e r s j i b e z o g r a n i c z e ń . M o w a tu o A V R - G C C . Jest t o d o ś ć interesu j ą c y - z p u n k t u w i d z e n i a s p o s o b u j e g o t w o r z e n i a - p r o d u k t . N i e m a on j e d n e g o a u t o r a , k a ż d y k t o czuje się na siłach m o ż e zostać j e d n y m z j e g o wielu t w ó r c ó w . N a d s y n c h r o n i z a c j ą prac c z u w a specjalna 1 4 - o s o b o w a g r u p a z w a na GCC
Steering
Committee.
Proponuje o n a t e m a t y d o realizacji i zbiera
wyniki p r a c programistów z całego świata. Szczegóły można znaleźć na stronie
http://gcc.gnu.org/.
T a k a formuła tworzenia p r o g r a m u p o w o d u j e , że ewoluu
j e on dość szybko. Niestety, nie z a w s z e udaje się zapewnić pełną k o m p a t y bilność n o w y c h wersji z e starszymi. N i e d o g o d n o ś c i te z p e w n o ś c i ą rekom pensuje fakt, że A V R - G C C j e s t p r o d u k t e m d a r m o w y m .
13.2.1. Instalacja kompilatora Kompilator A V R - G C C m o ż n a p o b r a ć ze strony AVRGCC.
http://www.avrfreaks.net/
U ż y t k o w n i c y m o d e m ó w nie będą z a c h w y c e n i , g d y ż d o ściągnię
cia jest plik o objętości o k . 12 M B . T r z e b a za t o przyznać, ż e geograficznie najbliższy Polsce s e r w e r mieszczący się w Dublinie działa b a r d z o sprawnie i z w y k l e gwarantuje dobry transfer. Pobrany plik m a n a z w ę n p . 2002-06-25__FREAKS.exe,
WinAVR-
w której - j a k widać - j e s t ukryta d a t a powstania
pobieranej wersji kompilatora. N a j p r a w d o p o d o b n i e j , w chwili ukazania się książki n a rynku, będą j u ż d o s t ę p n e n o w s z e wersje kompilatora. U r u c h o m i e nie tego p r o g r a m u spowoduje rozpoczęcie procedury i n s t a l o w a n i a kompila tora. P o zaznajomieniu się i zaakceptowaniu w a r u n k ó w licencji (naciskamy k l a w i s z / Agree)
ukazuje się o k n o , w k t ó r y m jest p r o p o n o w a n y katalog d o c e
lowy - d o m y ś l n i e C:\WINAVR.
W razie konieczności m o ż n a g o z m i e n i ć . N a
ciskając klawisz Install r o z p o c z y n a m y właściwą instalację. Po j e j zakończe niu wyświetlana j e s t zawartość pliku readme.txt.
P r o g r a m nie w y m a g a żad
n y c h d o d a t k o w y c h czynności konfiguracyjnych, jest g o t o w y d o pracy zaraz p o restarcie komputera. Będzie on wykorzystywany najczęściej w połączeniu z j a k i m ś symulatorem, n p . A V R Studio, który m u s i m y zainstalować na swoim komputerze.
13.3. AVR Studio wersja 3.56 A V R Studio to - j a k j u ż wiemy - programowy symulator mikrokontrole r ó w A V R . Integruje o n w sobie r ó w n i e ż a s e m b l e r , u m o ż l i w i a j ą c t y m sa m y m u r u c h a m i a n i e n i s k o p o z i o m o w y c h p r o g r a m ó w b e z k o n i e c z n o ś c i insta l o w a n i a d o d a t k o w y c h p r o g r a m ó w n a r z ę d z i o w y c h . Jest o n bezpłatnie p r z e z firmę A t m e l ~ na stronie ducts/tools.asp?family_id-607.
udostępniony
http://www.atmel.com/dyn/pro-
W c h w i l i pisania książki
dostępne
były
d w i e wersje p r o g r a m u : 3.56 i 4.0. Z u w a g i na p l a n o w a n e w y k o r z y s t y w a n i e A V R Studio w r a z z k o m p i l a t o r e m A V R - G C C z a l e c a n e j e s t z a i n s t a l o w a n i e wersji 3.56, p r z y s t o s o w a n e j d o łatwej integracji o b u p r o g r a m ó w . W t y m c e lu na w y m i e n i o n e j stronie należy w s k a z a ć o d n o ś n i k AVR Studio
3.5, a na-
s t ę p n i e o d n o ś n i k p o w o d u j ą c y p o b r a n i e p l i k u astudio3.exe.
Jest to s a m o r o z -
p a k o w u j ą c e się a r c h i w u m . J e g o u r u c h o m i e n i e p o w o d u j e u m i e s z c z e n i e w e w s k a z a n y m p r z e z u ż y t k o w n i k a katalogu k o m p l e t u p l i k ó w instalacyjnych. W ł a ś c i w a instalacja r o z p o c z y n a się p o u r u c h o m i e n i u p r o g r a m u
setup.exe
i p r z e b i e g a a u t o m a t y c z n i e . P r o g r a m j e s t g o t o w y d o pracy n a t y c h m i a s t p o z a k o ń c z e n i u instalacji.
13.3.1. Przygotowanie programów pisanych w asemblerze do symulacji w AVR Studio 3.56 P r o g r a m A V R S t u d i o m o ż e b y ć w y k o r z y s t y w a n y d o testowania p r o g r a m ó w p r z y g o t o w a n y c h za p o m o c ą z e w n ę t r z n e g o asemblera, n p . opisanego na po czątku niniejszego rozdziału. M o ż n a pisać własny p r o g r a m od podstaw, k o rzystając z w b u d o w a n e g o edytora i asemblera, m o ż n a r ó w n i e ż s y m u l o w a ć p r o g r a m y p i s a n e w j ę z y k a c h w y s o k i e g o p o z i o m u , np. A V R - G C C . W pierw s z y m p r z y p a d k u w y s t a r c z y za pomocą polecenia File>Open
otworzyć j e d e n
z p l i k ó w w y n i k o w y c h a s e m b l e r a . Korzystając z przykładu 13.2 m o ż e t o b y ć n p . modułl.hex
lub modułI.obj.
Otwierając plik .hex w o k n i e r o b o c z y m uzys
kujemy p o d g l ą d j e g o z d i s a s e m b l o w a n e j postaci, niestety bez nazw s y m b o licznych (jedynie m n e m o n i k i mikrokontrolera i rzeczywiste adresy). Praca w t a k i m p r z y p a d k u jest b a r d z o n i e w y g o d n a , nadaje się w zasadzie jedynie d o p o d g l ą d a n i a tego, c o robi mikrokontroler w obcych p r o g r a m a c h , gdzie m a m y d o dyspozycji j e d y n i e odczytaną z a w a r t o ś ć pamięci Flash mikrokontrolera. Otwierając plik .obj uzyskujemy j u ż pełen komfort pracy, g d y ż w oknie ro b o c z y m d o s t a j e m y pełną postać źródłową p r o g r a m u wraz z adresami s y m b o licznymi. Jeśli w trakcie pracy z A V R S t u d i o za pomocą z e w n ę t r z n e g o a s e m blera z o s t a n i e z m o d y f i k o w a n y program w y n i k o w y mikrokontrolera, to z m i a na ta z o s t a n i e wykryta i pojawi się informacja, której z a a k c e p t o w a n i e p o w o duje p r z e ł a d o w a n i e (odświeżenie) plików roboczych. O p i s a n y wyżej tryb pracy, c h o ć m o ż l i w y , nie znajduje w i ę k s z e g o zastosowania w o b e c faktu w y posażenia A V R Studio w e własny asembler. Bardziej n a t u r a l n y m s p o s o b e m pracy w y d a j e się w i ę c pisanie i u r u c h a m i a n i e p r o g r a m u od początku d o k o ń ca w t y m systemie. N a początku k o n i e c z n e j e s t utworzenie projektu. W t y m c e l u należy w y b r a ć p o l e c e n i e Project>New, mojj?rojekt
a następnie w o k n i e d i a l o g o w y m p o d a ć n a z w ę , n p .
i w y b r a ć typ A V R A s s e m b l e r ( r y s u n e k 13.2).
Kolejną c z y n n o ś c i ą jest u t w o r z e n i e n o w e g o pliku ź r ó d ł o w e g o lub dodanie d o projektu p l i k u j u ż istniejącego. W y w o ł a n i e o d p o w i e d n i e g o o k n a d i a l o g o w e -
" |I._t-T \. T<
|
~
0X
|
Etnę*
| 3 3
Rys. 13.2. Okno wstępnej konfiguracji projektu
' - - Dołączanie plików źródłowych do projektu
g o następuje p o kliknięciu p r a w y m p r z y c i s k i e m myszki, gdy podświetlony j e s t folder Assembler
files
( r y s u n e k 13.3) i w y b r a n i u opcji o d p o w i e d n i o :
Create New File... lub Add File.... W w y n i k u p r z e p r o w a d z e n i a t y c h c z y n n o ś ci w folderze t y m pojawiają się wskazane pliki lub - w p r z y p a d k u n o w e g o pliku - j e s t otwierane o k n o edycyjne, w którym m o ż n a w p i s y w a ć źródło pro gramu. P o zdefiniowaniu projektu i przed r o z p o c z ę c i e m dalszych prac w a r t o w y k o nać polecenie Project>Save
powodujące zachowanie projektu n a dysku. Po
zakończeniu wszystkich prac edycyjnych m o ż n a podjąć p r ó b ę w y g e n e r o w a nia wersji w y k o n y w a l n e j .hex. Służy d o tego celu polecenie and
Project>Build
run.
W pierwszej fazie prac n a d projektem, gdy s p o d z i e w a n e są liczne błędy for m a l n e , wygodniej b ę d z i e skorzystać z polecenia Project>Assemble,
powodu
j ą c e g o j e d y n i e p r z e p r o w a d z e n i e asemblacji bez tworzenia pliku w y n i k o w e g o .hex. W y n i k tej operacji jest wyświetlany w oknie k o m u n i k a t ó w , które poja wia się p o zakończeniu asemblacji. W a r u n k i e m k o n i e c z n y m d o rozpoczęcia następnego etapu prac u r u c h o m i e n i o w y c h j e s t w y e l i m i n o w a n i e wszystkich b ł ę d ó w , o c z y m informuje komunikat: Assembly
complete
with no
errors.
j e ś l i tak się nie stanie,, to zostanie w y ś w i e t l o n a lista b ł ę d ó w . Klikając na p o s z c z e g ó l n e p o z y c j e tej listy p o w o d u j e m y p r z e n i e s i e n i e k u r s o r a d o linii p r o g r a m u związanej z e w s k a z a n y m b ł ę d e m , g d z i e m o ż n a w p r o w a d z i ć od p o w i e d n i e p o p r a w k i . P o „ w y c z y s z c z e n i u " p r o g r a m u m o ż n a przystąpić d o s y m u l a c j i . O p i s tego e t a p u prac b ę d z i e z a m i e s z c z o n y w d a l s z e j c z ę ś c i roz działu.
13-3.2. Integracja programu AVR Studio 3.56 z kompilatorem AVR-GCC O ile p r a c a z s y m u l a t o r e m A V R Studio p o d c z a s uruchamiania p r o g r a m ó w a s e m b l e r o w y c h przebiega w sposób naturalny i raczej bez w i ę k s z y c h proble m ó w , to w y k o r z y s t y w a n i e g o w połączeniu z k o m p i l a t o r e m A V R ~ G C C nie jest - niestety - j u ż takie proste. U w a g a ta dotyczy g ł ó w n i e zasad t w o r z e n i a projektów wykorzystujących
pliki ź r ó d ł o w e pisane w j ę z y k u
AVR-GCC,
p ó ź n i e j s z a s y m u l a c j a przebiega j u ż n o r m a l n i e . Najlepiej zilustruje to poniż szy p r z y k ł a d . SSI^SSHMi^H^K
W celu utworzenia n o w e g o projektu należy w y b r a ć z menu polecenie Project>New.
N a ekranie zosta-
nie wyświetlone o k n o , w k t ó r y m trzeba podać naz w ę projektu np. cwiczl,
w s k a z a ć lokalizację j e g o
plików, a następnie podświetlić opcję Generic party Compiler. ki projektu
znajdowały
dokładnie
n
A
W
3rd
W y m a g a n e jest, aby wszystkie pli się w j e d n y m
Niech to będzie np. c:\gcctesfcwiczl kład
f *
opisany
katalogu.
(jest to przy
w rozdziale
14.). Taką
ścieżkę dostępu należy w i ę c wpisać w polu Loca- flyj. 13.4. Okno konfiguracji tion o k n a pokazanego na r y s u n k u 13.4.
projektu
P o z a a k c e p t o w a n i u ustawień k l a w i s z e m OK w s k a z a n e jest zapisanie projektu na d y s k u , n p . p r z e z naciśnięcie trzeciej od lewej strony ikony na pasku n a r z ę d z i o w y m . Dołączanie lub tworzenie plików ź r ó d ł o w y c h przebiega tak s a m o j a k w p r z y p a d k u p r o g r a m ó w a s e m b l e r o w y c h . Pliki p r o g r a m u
*.c
należy
u m i e s z c z a ć w folderze Source files, pliki n a g ł ó w k o w e *.h w folderze
Header
files,
natomiast plik makefile
w folderze Other files.
Wskazanie dowolnego
pliku i d w u k r o t n e kliknięcie spowoduje otwarcie o k n a edycyjnego, w k t ó r y m m o ż n a d o k o n y w a ć z m i a n zawartości e d y t o w a n e g o pliku. P o kliknięciu pra w y m p r z y c i s k i e m m y s z k i na p o d ś w i e t l o n y m folderze Source Files
wybiera
m y opcję Create New File. W oknie, które teraz zostanie w y ś w i e t l o n e należy wpisać n a z w ę z r o z s z e r z e n i e m pliku ź r ó d ł o w e g o programu. W n a s z y m p r z y kładzie j e s t to cwiczl.c.
P o l e Location
pozostaje bez z m i a n . W o t w a r t y m o k
nie e d y c y j n y m m o ż n a teraz w p r o w a d z i ć tekst programu. Z a m k n i ę c i e o k n a s p o w o d u j e a u t o m a t y c z n e z a c h o w a n i e efektów pracy na d y s k u . Z a k o ń c z e n i e czynności edycyjnych nie spowoduje a u t o m a t y c z n e g o dołączenia pliku d o projektu, trzeba to zrobić ręcznie. D o kompilacji programu niezbędny b ę d z i e j e s z c z e plik makefile,
pełniący szczególną rolę w projektach
AVR-GCC.
Przykład takiego pliku j e s t umieszczany p o d c z a s instalacji kompilatora w k a -
talogu cMvrgcćVtvrfreaks.
M o ż n a g o s k o p i o w a ć d o n a s z e g o katalogu robo
c z e g o i o d p o w i e d n i o d o potrzeb m o d y f i k o w a ć . D w u k r o t n e kliknięcie na nim spowoduje j a k z w y k l e rozpoczęcie edycji. W o m a w i a n y m p r z y k ł a d z i e należy d o p r o w a d z i ć g o d o postaci: tt simple Makefile Volker oth (c> 1999 łt edited by AVRfreaks.net nov.2001 #Jtfl« change these lines according to your project »tł«» Kput the name of the target mcu here (at90s8515, at90s8S35, attiny22, atmega603 etc.) MCU = at90s2313 #put the name of the target Cile here (without extension) TRG = cwiczl #put your C sourcefiles here SRC = $(TRG).c Sput additional assembler source Eile here ASRC dadditional libraries and object files to link LIB itadditional includes to compile INC ttassembler flags ASFLAGS = -Wa, -gstabs Scompiler flags CPFLAGS K -g -Os -Wall -Wstrict-prototypes -Wa,-ahlms=$(<:.C=.lst) Klinker flags LDFLAGS = -Wl,-Map=$(TRG).map,-cref #fl#0 you should not need to change the following include S(AVR)/avrfreaks/avr_make
line S«#J)
(ł##łł dependencies, add any dependencies you need here Hłftt $(TRG).0 : $(TRG).C
L i n i e r o z p o c z y n a j ą c e s i ę z n a k i e m „ # " t o k o m e n t a r z e i nie są i s t o t n e z p u n k tu w i d z e n i a k o m p i l a t o r a . P o z o s t a ł e zawierają informacje, m a j ą c e w p ł y w na przebieg k o m p i l a c j i . Są t o m.in. typ m i k r o k o n t r o l e r a ( M C U ) , n a z w a pliku w y n i k o w e g o b e z r o z s z e r z e n i a ( T R G ) , lista p l i k ó w ź r ó d ł o w y c h ( S R C ) *.c, a także e w e n t u a l n e i n f o r m a c j e o d o ł ą c z a n y c h m o d u ł a c h a s e m b l e r o w y c h , b i b l i o t e k a c h . Ich o p i s w y k r a c z a p o z a r a m y tej książki, w i ę c e j w i a d o m o ś c i n a l e ż y s z u k a ć w d o k u m e n t a c j i k o m p i l a t o r a . W t y m miejscu w a r t o j e d y n i e w s p o m n i e ć o linii pliku makefile,
która w p ł y w a na n i e o c z e k i w a n e c z a s a m i
z a c h o w a n i e się p r o g r a m u w y n i k o w e g o . Z a w i e r a o n a m.in. o p c j ę o p t y m a l i zacji k o m p i l a t o r a - 0 . W sytuacjach e k s t r e m a l n y c h , na s k u t e k ustawienia z b y t w y s o k i e g o p o z i o m u o p t y m a l i z a c j i n i e k t ó r e linie p r o g r a m u ź r ó d ł o w e g o m o g ą p o prostu nie z n a l e ź ć się w p r o g r a m i e w y n i k o w y m , j e ś l i t y l k o k o m pilator uzna, że są z b ę d n e . D l a p r z y k ł a d u krótki p r o g r a m p r z e d s t a w i o n y w p r z y k ł a d z i e 13.3 i s k o m p i l o w a n y z opcją - 0 2 p o m i n i e c a ł k o w i c i e pętlę for. O p c j a - 0 1 s p o w o d u j e , że p ę t l a b ę d z i e się w p r a w d z i e w y k o n y w a ł a , ale p o w y j ś c i u z niej z m i e n n a licznik
pozostanie bez zmiany. Spowodowane
jest
to tym,
że zmienna
licznik
nie j e s t w
dalszej
części
programu
wykorzystywana. Dopiero, gdy zostanie zastosowany parametr - O 0
pro
g r a m w y k o n a się z g o d n i e z z a m i a r e m a u t o r a . Przykład 13.3. Przykładowy program ilustrujący wpływ opcji optymalizacji kompilatora int main(void) t
unsigned char i,licznik; licznik=0x0O; for(i=0;i<10;i++}
whileU) ;
N i e j e s t t o j e s z c z e k o n i e c czynności niezbędnych d o p r z e p r o w a d z e n i a k o m pilacji p r o g r a m u . W kolejnym k r o k u należy ustawić p a r a m e t r y w z a k ł a d c e Target Debug
o k n a projektu. W t y m celu należy kliknąć p r a w y m k l a w i s z e m
m y s z k i n a p o d ś w i e t l o n y folder Target Debug,
w w y n i k u c z e g o zostaje w y
ś w i e t l o n e m e n u , z k t ó r e g o trzeba - t y m r a z e m l e w y m k l a w i s z e m - w y b r a ć opcję Settings
( r y s u n e k 13.5). W oknie, k t ó r e zostanie wyświetlone, n a l e ż y
z m i e n i ć trzy ustawienia: - należy o d z n a c z y ć opcję Run 'cornpife' on eachfile - w polu Command
group,
line p o w i n n a b y ć w p i s a n a linia polecenia wywołującego
k o m p i l a t o r . M a ona p o s t a ć : - w polu Extension
in Source Files
ofobjectfile
c:\avrgcc\avrfreaks\gcc_cmp.bat, to load w p i s obj należy zastąpić w p i s e m cof.
P o w y ż s z e zmiany p r z e d s t a w i o n o na r y s u n k u 13.6. D o p i e r o teraz staje się m o ż l i w e k o m p i l o w a n i e p r o g r a m ó w pisanych w j ę z y k u A V R - G C C . K o m p i l a tor w p e w n y c h sytuacjach w y m a g a j e d n a k , aby przed r o z p o c z ę c i e m pracy
L , * f ł / B i i J Slagr S«ltąi —
' WLEKŁEŚ? P ^HMloHci
2 mjW*
Add
RIFT IrimitulO u « o ta*
Fic
t*s«:
'
Th*r C O m i u i u d ł
P Rui eodt
Rys. 13.5. Ustawianie paramet rów zakładki Target Debug
Rys, 13.6. Zalecane ustawienia parametrów kompilatora
z katalogu roboczego były w y k a s o w a n e pliki w y g e n e r o w a n e wcześniej. Czyn ności te w y k o n y w a n e ręcznie są dość uciążliwe dla programisty, warto więc dokonać
jeszcze
programu
AVR
jednego Studio
ustawienia
uwalniającego
nas od nich. T r z e b a w t y m celu u t w o rzyć dodatkową zakładkę, której zacho wując
Rys. 13.7. Tworzenie zakładki Target Ciean
angielską
terminologię,
nadać nazwę n p . Ciean.
można
Postępujemy
podobnie j a k wcześniej, przy c z y m t y m razem należy w y b r a ć w menu opcje Target>Add
( r y s u n e k 13.7).
Następnie w polu Name wpisujemy przyjętą n a z w ę Ciean, a z listy rozwija nej Copy settings fro/n:
wybieramy pozycję Debug.
wienie parametrów zakładki Target
Pozostaje jeszcze usta
Ciean. W oknie projektu, w górnej j e g o
części, znajduje się lista, z której trzeba wybrać pozycję Target Ciean.
Dalej
postępujemy podobnie, j a k przy zakładce Target Debug. T y m razem linia po leceń p o w i n n a mieć postać: c:\avrgcoavrfreaks\gcc_cmp.bat d w a pola Run Stage Settings
ciean,
a oby
muszą b y ć puste.
Pracy trochę było, najwyższy j u ż czas sprawdzić, czy to w s z y s t k o działa.
13.3.3. Symulacja programów w AVR Studio V. 3.56 B e z b ł ę d n y w y n i k k o m p i l a c j i nie d o w o d z i o c z y w i ś c i e , że p r o g r a m j e s t j u ż gotowy do zapisania w pamięci mikrokontrolera. Oznacza jedynie, że jest p o z b a w i o n y b ł ę d ó w f o r m a l n y c h takich j a k : l i t e r ó w k i , n i e p r a w i d ł o w e uży c i e m n e m o n i k ó w a s e m b l e r o w y c h lub zła s k ł a d n i a instrukcji j ę z y k a C, n i e z g o d n o ś ć p a r a m e t r ó w r o z k a z ó w , z d u b l o w a n e adresy s y m b o l i c z n e itp. B ł ę d y takie p o p e ł n i a s i ę c z ę s t o , ale na ogól też b a r d z o ł a t w o j e s t j e usu nąć z p r o g r a m u . P o ł o w ę z a d a ń w y k o n u j e p r z e c i e ż k o m p i l a t o r . Z n a c z n i e gorzej j e s t z b ł ę d a m i l o g i c z n y m i . Niestety, m u s i m y b y ć w z n a c z n e j m i e rze z d a n i na w ł a s n e siły, wspierając się j e d y n i e t a k i m p r o g r a m e m , j a k n p . A V R Studio. Po wykonaniu wszystkich czynności konfiguracyjnych
opisanych
wyżej,
można przeprowadzić kompilację programu źródłowego. W t y m celu należy z menu w y b r a ć polecenie Project>Build
and run lub j e d n o c z e ś n i e nacisnąć
klawisze Ctrl i F 7 . W przypadku błędów kompilacji w oknie Project
Output
będą wyświetlane n u m e r y błędów i linii, w których wykryty błąd występuje.
Ltttld • tf I
—
g
ii jp l w i
o^hog
gg w u * zawili
Ol
±S
-3
[JEEH
tys.
3
""^
13.8. Okno ustawiania parametrów uruchamianego systemu
Niestety w p r z y p a d k u p r o g r a m ó w pisanych w C nie działa kliknięcie na linię z komunikatem
błędu
powodujące
przeniesienie
kursora
w odpowiednie
miejsce tekstu ź r ó d ł o w e g o , tak j a k to było w przypadku p r o g r a m ó w a s e m b l e r o w y c h . T y m r a z e m trzeba podejrzaną o błąd linię o d s z u k a ć ręcznie, k o r z y s tając z informacji wyświetlanych w p r a w e j części paska stanu (u dołu o k n a głównego programu). P o pierwszej bezbłędnej kompilacji zostanie w y ś w i e t l o n e o k n o , w k t ó r y m k o n i e c z n e b ę d z i e p o d a n i e p e w n y c h informacji dotyczących p a r a m e t r ó w d o c e l o w e g o systemu ( r y s u n e k 13.8). Są t o : typ mikrokontrolera (w n a s z y m przykładzie j e s t to A T 9 0 S 2 3 1 3 ) , wielkość pamięci p r o g r a m u i danych (pozo s t a w i a m y wartości d o m y ś l n e ) oraz częstotliwość rezonatora
kwarcowego
( u s t a w i a m y taką wartość, j a k a j e s t z a s t o s o w a n a w u r u c h a m i a n y m systemie, aby p r a w i d ł o w o a n a l i z o w a ć zależności c z a s o w e - w o m a w i a n y m przykładzie jest to 8 M H z ) . Znajdują się tu j e s z c z e i n n e parametry. Są o n e a k t y w n e tylko dla n i e k t ó r y c h t y p ó w m i k r o k o n t r o l e r ó w . P o zaakceptowaniu ustawień p r z y ciskiem OK m o ż n a p r z y g o t o w a ć sobie o k n o robocze. W y b i e r a m y te informa cje, k t ó r e będą potrzebne d o symulacji. N a małych monitorach nie będzie t o łatwe.
Otwiera okno podglądu Otwiera okno podglądu Otwiera okno komunikatów zmiennych programu zawartości wybranego y symulatora Walches n . obszaru pamięci Messages
7
V
Otwiera okno podglądu rejestrów mikrokonfrolara Regisiars
Otwiera okno podglądu stanu licznika programu, wskaźnika stosu. stanu rejestrów indeksowych oraz wskaźników zawartych w rejestrze SREG pamlęd
Rys. 13.9. Ikony paska narzędziowego służące do konfiguracji głównego okna roboczego programu AVR Studio
Naciśnięcie pierwszej lewej ikonki paska przedstawionego na r y s u n k u 1^.5 ot wiera okno podglądu zmiennych programu (Watches), podgląd rejestrów mikrokontrolera (Registers),
druga ikona otwiera
trzecia ikona powoduje wy-
świedenie zawartości pamięci. W zależności o d wybranej pozycji z listy rozwi janej może t o być obszar pamięci danych S R A M , obszar we/wy, wewnętrzny E E P R O M lub pamięć programu. Możliwa jest jednoczesna obserwacja kilku obszarów. Naciśnięcie czwartej ikony powoduje wyświedenie informacji zwią zanych z e stanem mikrokontrolera, a więc stanu licznika programu, wskaźnika stosu, stanu rejestrów indeksowych oraz wskaźników zawartych w rejestrze S R E G . Bardzo przydamy d o obliczeń czasowych będzie z pewnością licznik wykonanych cykh uzupełniony o pole, w którym wartość ta jest przeliczana n a
r v » « , *
i {llrwhi**0,Ucuhlh4irii]lro.tM«} < i-
PTjflTBS POBtei IWIII POfltH
(HI.WS [MB. M l
» IWIIBI
1
f
I
KWIM
B
ailbio
r ł r p p c p p p cm. V ' I? i r r ^ F y - £ UARI Inloflm BlOai flOW
JAP
>0L l?A'<
L -OTi i i ; .-JH
Ul.'rp 1^
roto
fiwiic*,io T»jrt»jKł-rto
3
oi&o oooo
(KC
DiOO
00)
rrprr kb.htssa] rrrrrrrr w »
EESSM. o.v
OHM
km
•1
01.)0r6o0w at>3"
.lAłfc
oooo
0004
tei^ilch
Ł
1
rrrr
H S
Pul
OOOO •
W » OCłfl toM OOOO ł D H OKO 0300 łMO OOOO ' oo,o oooo coco o o * j oooo o w o oooo o w o oooo ' M » 0000 MOC OCW OMO *WQ M00 • OOJLO 0000 OOOO W D oooo M<]0 OOOO OMII UL111U ' M&0 DCM MM MM OOOO OOOfl OWO 0000 0000 * COCO OOOO OOOO OOOO 0000 OOOO CH3O0 000& 0000 ' M&0 0 0 0 0 00M MDO OOOO OiilO OMO OiOO 00,1 •
» » «
w«i
w j ł g J I "i***r
/rys. /3.70. Okno główne programu AMR Studio
0000
Uruchamiaj
p
f
e
'
wykonywanie programu rozkazu Dotacja \ z wejściem
do listy W a f c f t e s N ^
\
V
^
* X 5 T
/ Uruchamia przez kursor / automatyczną 1
*
i
*
I**; Lft/ ^ 5*t r?\*o\
i
1 § i « Usuwa zmienną z listy WatCiWS 2a\rtimĄ» ^ - g ^ un^^nia 1 Wykonanie Usuwa wszystkie wykonywań* wykonanie \ *n>kow ustawtone pułapki programu pojedynczego \ Pfoownu ™ Wykonania programu od aktualne] wartości PC do instrukcji wskazywanej przez kursor
\ «i
n
(
( a 2 u
Rys. 13.11. Ikony paska narzędziowego AVR Studio służące do prowadzenia symulacji programu
jednostki czasu. Dodatkową korzyścią jest możliwość zerowania wskazań tego licznika, c o umożliwia realizacje precyzyjnego pomiaru czasu w y k o n y w a n i a poszczególnych fragmentów programu. Piąta ikona służy d o otwarcia o k n a komunikatów symulatora (Messages),
a ostatnia umożliwia wyświetlenie zaso
b ó w mikrokontrolera (stan C P U , ustawienia przerwań, rejestry Umerów/liczni k ó w , w a t c h d o g a , E E P R O M - u , U A R T - u , komparatora analogowego, a także stany rejestrów związanych z portami w e / w y ) . Sposób prezentowania danych z a p e w n i a w y g o d n ą interpretację poszczególnych bitów każdego rejestru (rysu nek 13.10). Są one wyświetlane n a c z e r w o n o w przypadku, gdy w wyniku w y konania pojedynczego rozkazu (praca krokowa) ulegną modyfikacji. Wszystkie zasoby mikrokontrolera mogą b y ć ręcznie modyfikowane przez użytkownika. N a r y s u n k u 13.11 p o k a z a n o ikony związane bezpośrednio z przebiegiem sy mulacji. P i e r w s z a od lewej p o w o d u j e dołączenie podświetlonej w oknie p r o g r a m u symulacji zmiennej d o listy Watches,
dzięki c z e m u stan tej zmiennej
jest ś l e d z o n y w trakcie w y k o n y w a n i a się p r o g r a m u . D r u g a i k o n a służy d o k a s o w a n i a z m i e n n e j z listy podglądu. M u s i b y ć o n a wcześniej podświetlona w oknie Watches.
N a s t ę p n e ikonki uruchamiają symulację w różnych try
bach. P i e r w s z a z nich p o w o d u j e ciągłe w y k o n a n i e p r o g r a m u , w związku z c z y m najczęściej będzie współpracowała z wcześniej u s t a w i o n y m i pułapka mi. Stosuje się ją, g d y n i e c h c e m y śledzić w y k o n y w a n i a p r o g r a m u instrukcja p o instrukcji, g d y ż s a m przebieg n a s n i e interesuje, natomiast m o ż e on m i e ć w p ł y w n a resztę p r o g r a m u - np. pętle opóźniające. Naciśnięcie tej ikony p o woduje d e z a k t y w a c j ę pozostałych. N i e są też w i d o c z n e z m i a n y licznika pro g r a m u . D ł u ż s z a praca w t y m trybie m o ż e n a s u w a ć wątpliwości, c z y p r o g r a m gdzieś się n i e zawiesił. Kolejna i k o n a (czwarta od lewej n a r y s u n k u 13.11) powoduje przerwanie w y k o n y w a n i a p r o g r a m u . W y ś w i e t l o n y w t y m m o m e n c i e stan mikrokontrole-
r a o d p o w i a d a takiemu, j a k i wystąpił p o ostatnim r o z k a z i e . Kolejne ikony słu żą do: w y k o n a n i a p o j e d y n c z e g o rozkazu z wejściem d o ciała procedury (jeśli jest to np. RCALL), w y k o n a n i a rozkazu traktując napotkaną p r o c e d u r ę j a k o pojedynczy k r o k p r o g r a m u . S i ó d m a od lewej strony i k o n a z r y s u n k u 13.11 służy d o o p u s z c z e n i a procedury. Jej naciśnięcie p o w o d u j e ciągłe w y k o n y w a n i e p r o g r a m u , aż d o n a p o t k a n i a rozkazów RET lub R E T I . Kolejna i k o n a p o w o d u j e ciągłe w y k o n a n i e p r o g r a m u o d adresu wynikającego z aktualnej wartości licznika p r o g r a m u P C d o miejsca w s k a z y w a n e g o przez kursor w o k n i e p r o g r a m u . W niektórych sytuacjach b a r d z o przydatne m o g ą b y ć kolejne d w i e ikonki. P i e r w s z a z nich inicjuje automatyczną p r a c ę k r o k o wą. M i ę d z y p o s z c z e g ó l n y m i k r o k a m i p r o g r a m u w s t a w i a n a j e s t p r z e z symula tor p r z e r w a , której długość w milisekundach określa się p o l e c e n i e m menu Debug>Options>Single
step delay (ms). Kolejna ikona powoduje ciągłe w y
k o n a n i e /i k r o k ó w p r o g r a m u b e z p o d g l ą d a n i a z a s o b ó w . W a r t o ś ć » jest usta w i a n a w poleceniu Debug>Options>Number
of Single
Steps.
D o o m ó w i e n i a pozostały j e s z c z e trzy ostatnie ikony p r z e d s t a w i o n e na r y s u n k u 1 3 . 1 1 . Ikona z „łapką" ustawia/kasuje pułapkę p r o g r a m o w ą w miejscu p r o g r a m u w s k a z y w a n y m przez kursor w postaci żółtej strzałki w o k n i e pro g r a m u . Jeśli pułapka j e s t ustawiona p o lewej stronie instrukcji p r o g r a m u z o stanie w y ś w i e t l o n y
m a ł y k w a d r a c i k . Ikona z d w i e m a
„łapkami"
usuwa
wszystkie pułapki ustawione w p r o g r a m i e . Pułapki m o g ą być t y m c z a s o w o b l o k o w a n e . O d p o w i e d n i e d o tego polecenia znajdują points>Show
List>Enable
lub Breakpoints>Show
się w m e n u
List>Disable.
BreakOstatnia
i k o n a służy d o w y z e r o w a n i a s y m u l o w a n e g o mikrokontrolera. 1
'A"" "
'
'
d[u.li''afl
Hys. 13.12. Ikony paska narzędziowego informu-
P o d c z a s symulacji programu w i e l o m o d u ł o w e g o nazwa a k t y w n e g o modułu jest wyświetlana w oknie przedstaw i o n y m na r y s u n k u 13.12. Krok w y k o n y w a n i a pronapisanego w C p o k r y w a się domyślnie z i n -
jące o aktywnym modu-
lei przetaczające tryb pracy okna programu
, s
t
r
u
k
. c
. , e
, 2
„ 8
C
z
. a
s
a
n
u
z
a
c
h
o
d
z
i
e d n a k
k o
^ S ° J* ** " J " nieczność pracy na poziomie k o d u m a s z y n o w e g o . Jest t o m o ż l i w e p o naciśnięciu ikonki z n a w i a s a m i klamro w y m i przedstawionej na r y s u n k u 13.12. Zostaje w ó w c z a s otwarte o k n o zawie rające zdeasemblowaną postać programu. O d tego m o m e n t u praca k r o k o w a od b y w a się na p o z i o m i e r o z k a z ó w mikrokontrolera ( r y s u n e k 13.13). P r o g r a m A V R Studio stwarza m o ż l i w o ś ć uruchamiania programu b e z koniecz ności wielokrotnego p r o g r a m o w a n i a pamięci mikrokontrolera. Wirtualna jed nostka centralna nie zachowuje j e d n a k pełnej kompatybilności z jej rzeczywis tym odpowiednikiem. Przykładowo A V R Studio 3.56 nie potrafi symulować watchdoga, nie radzi sobie też dobrze z k o m p a r a t o r e m a n a l o g o w y m .
Nie
• •."•V. i.xnr «7,>n
urn i jt.mi ^łi»j t p l j
FT11 *0OOO00;9. coor *QOQttQ0; CFM łr
I
-I.
• H I I ™
O
11(1 •oooooozc; O M • a o o o o c : ? 0401
LEI » P W ?5 : T » L I - T ^ T P I - - ] ;
K5. H
ŁIJODOTUŁ^C.
lOtKrOCort*. trJOOMOJI;
ł Jłl
• 000000 W : łOOOOOOJl. łOOOO0Qli: ULCULLH-L>JLLCAILLL4L.0JL.ŁCNUJT4H
. WW.L* H»hti,
Ai^tt*
-Onp; u; oiai U l . OlOO kf.o
I •'
łbl,.
t
•000OQ0l> •000400Jt •cootocu*ooooooi* ioooooon
Ł
toto
łZł.OłCtf
Rys. 13.13. Okno podglądu pracy mikrokontrolera na poziomie kodu mikrokontrolera
wszystkie wiec tryby pracy układu rzeczywistego mogą b y ć przetestowane w programie. Czasami trzeba się o d w o ł y w a ć d o emulatorów sprzętowych. P o e t a p i e ż m u d n e g o w y s z u k i w a n i a b ł ę d ó w logicznych p r z y c h o d z i w k o ń c u m o m e n t , w k t ó r y m u z n a j e m y , że program m o ż e b y ć zapisany w pamięci mik rokontrolera. T e r a z nastąpi weryfikacja działania symulatora w p o r ó w n a n i u z u k ł a d e m r z e c z y w i s t y m . Opcje p r o g r a m u A V R Studio pozwalają n a b e z p o średnie
zaprogramowanie
mikrokontrolerów
wykorzystując
zestawy
S T K 5 0 0 / A V R I S P / J T A G I C E oraz A V R P r ó g . W p r z y p a d k u ich braku należy z a s t o s o w a ć d o w o l n y p r o g r a m a t o r zewnętrzny wykorzystujący w y g e n e r o w a ny przez k o m p i l a t o r A Y R - G C C plik *.hex.
13.4. Symulator Visual Micro Lab 3.56 W s z y s t k i e o p i s y w a n e wcześniej w książce p r o g r a m y występują j a k o t z w . freeware,
c o o z n a c z a ż e m o ż n a z nich korzystać zgodnie z warunkami licen
cji b e z w n o s z e n i a ż a d n y c h opłat. Jest j e d n a k pewien p r o g r a m komercyjny, który z e w z g l ę d u n a swoje zalety, także zasługuje na prezentację. M o w a o pakiecie V i s u a l M i c r o L a b . S y m u l a t o r Visual M i c r o L a b znacznie lepiej oddaje rzeczywistość n i ż A V R Studio, p o n a d t o u m o ż l i w i a wierną symulację różnorodnych, z e w n ę t r z n y c h e l e m e n t ó w i u k ł a d ó w peryferyjnych dołączanych d o mikrokontrolera takich jak: rezystor, k o n d e n s a t o r , dioda L E D , klawiatura 4 x 4 , w z m a c n i a c z opera cyjny, k o m p a r a t o r , przetworniki C/A i A / C , funktory logiczne, generatory 2
r ó ż n y c h p r z e b i e g ó w , potencjometry, a także m o n i t o r I C , alfanumeryczny
•pł £« Kuch y** fKWJ Ct^r-Tłrti
Ę-J^
i**
QOT™
• • g ;T » '1 1
j'^ł*ł,— u-*
\3\.
Ł ''>*ickt bia^iuica^o punktu /r*tr#*ni* ataktu { U c z t * e y t l
TOKTŁ-l*«ly ' CUM
oooo: rr oo ?? ?? ?? ?? ?? 0009: 7? 77 7? 77 ?? 7J }? 77 0010: oo oa oo ?? 7? 7? 0Q 00 ooifl: ooooooootrooscoi G02Q: oo;»[ l a iir> ijft : o oo ooio: - • oo oo rr ix 00W: u oo w " OOiO: 00 • 0-, CO fO PO 00 nfl 00 00ŁOI CCi C D 00 0056: '.JD 00 uQ UO D 7 15 0040: os oo oo oo yj 77 ?? t? ooń8: yy yy 7? ii ?? ?? ?? 7? oo70t 77 7? 7? j ? 77 ?? ?> ł? ooiai ?? 17 77 77 77 77 77 7? 0060: >ł I? 77 77 77 77 77 77 C C G O t 77 77 77 77 77 77 77 77 OOSOi 77 77 77 77 77 77 77 77
Dt-Jan* łff
HJOMSOW OOODOOW rb J W D
USR OOIOMCO Ufjł OOCOOCCO UflRfl O W O O W e
Gnw^ >\iW l - ł w j ifl' (lii , i : J11J11 1 gq:u0DO2 3 JKilKOM jcwceoK lJttWOHtt
9vm«m«
UsCOWCO' ISJOWOOMT
JJ >K"EXW £1 WWCCSO< £ > W » O 0 &1110J11L.
FORT aocooooc' AG*
GOJ
fefarPLCf
i om Torf*
-111:111
IttoOttK.
5D»»kco; H.-mowOft
Zj fTOOf-lOOCi
DcidlJlWJ 21 oommoj.
0^000000' DC ĆMOM'
tc-ia»7 iłtf& KWiOlOi;
/rys. 73.14. Okno programu Visual Micro Lab
wyświetlacz L C D o r a z terminal komunikacyjny T T Y . V M L A B w wielu sy tuacjach uwalnia u ż y t k o w n i k a od konieczności b u d o w a n i a układu prototypo w e g o i stosowania e m u l a t o r ó w sprzętowych. O p r ó c z p o d z e s p o ł ó w , z których m o ż n a z b u d o w a ć system, w programie V M L A B z a i m p l e m e n t o w a n o również wielokanałowy o s c y l o s k o p wirtualny. Opis u r u c h a m i a n e g o układu p r z y p o m i na n i e c o standard, j a k i m j e s t Spice. Z a p o m o c ą Visual M i c r o L a b m o ż n a uru c h a m i a ć urządzenia, w których wykorzystuje się z a i m p l e m e n t o w a n y w mik rokontrolerze przetwornik analogowo-cyfrowy l u b komparator, z c z y m j a k p a m i ę t a m y miał p r o b l e m y symulator A V R Studio. Visual Micro L a b t o p r o g r a m typu I D E . Integruje o n asembler, zewnętrzny kompilator n p . A V R - G C C , linker i debuger, przy c z y m integracja poszcze gólnych e l e m e n t ó w j e s t znacznie lepsza n i ż w A V R Studio. D e b u g e r w y świetla i wykonuje p r o g r a m z a r ó w n o n a poziomie kodu m a s z y n o w e g o j a k i j ę z y k a w y s o k i e g o p o z i o m u . W i d a ć przy t y m współzależność o b u postaci programu. W V M L A B użytkownik r ó w n i e ż w każdej chwili m o ż e podejrzeć lub zmienić stan d o w o l n e g o k o m p o n e n t u mikrokontrolera lub zmiennej pro gramu. Prezentacja wszystkich zasobów mikrokontrolera jest zrealizowana w sposób b a r d z o czytelny ( r y s u n e k 13.14), lecz rozmieszczenie wszystkich okien w y m a g a z a s t o s o w a n i a dużego monitora, pracującego w wysokiej roz dzielczości.
Instalacja p r o g r a m u j e s t b a r d z o prosta. P r z e d z a k u p e m pełnej wersji m o ż n a w y p r ó b o w a ć działanie p r o g r a m u n a 2 I - d n i o w e j wersji ewaluacyjnej. Pliki m o ż n a p o b r a ć ze strony http://www.amtools.net.
Z a i n s t a l o w a n i e wersji peł
nej w y m a g a w y p e ł n i e n i a o d p o w i e d n i e g o f o r m u l a r z a i d o k o n a n i a opłaty. P o w y k o n a n i u t y c h c z y n n o ś c i , drogą e l e k t r o n i c z n ą są d o s t a r c z a n e k o d y d l a wersji p e ł n e j . Instalator
zakłada
n a dysku
domyślnym
katalog c:\VMLAB,
w którym
u m i e s z c z a w s z y s t k i e n i e z b ę d n e d o pracy pliki. K o m p i l a t o r y j ę z y k a C m u szą b y ć z a i n s t a l o w a n e na k o m p u t e r z e n i e z a l e ż n i e od V M L A B - a . Nadają się j e d y n i e te, k t ó r e generują pliki *.cof. S y m u l a c j a u r u c h a m i a n e g o urządzenia m u s i b y ć p o p r z e d z o n a z d e f i n i o w a n i e m projektu. Z m e n u w y b i e r a m y p o l e cenie Project>New
project.
P o j a w i a się o k n o k r e o w a n i a projektu, w k t ó
r y m n a l e ż y w y p e ł n i ć o d p o w i e d n i e pola. T r z y m a j ą c się p o p r z e d n i e g o przy kładu n a d a j e m y n a z w ę n p . cwiczl.prj,
wybieramy jako docelowy mikro
k o n t r o l e r A T 9 0 S 2 3 1 3 , d e c y d u j e m y się na p r o g r a m w j ę z y k u C. Przyjmuje m y w e r s j ę G N U C i z g a d z a m y się na a u t o m a t y c z n e w y g e n e r o w a n i e pliku makefile,
c o j e s t d u ż y m u d o g o d n i e n i e m , g d y ż zwalnia n a s z k o n i e c z n o ś c i
k o p i o w a n i a t e g o pliku z i n n y c h k a t a l o g ó w lub ż m u d n e g o , s a m o d z i e l n e g o w p i s y w a n i a . A u t o m a t y c z n e t w o r z e n i e pliku nie z a m y k a o c z y w i ś c i e m o ż l i wości p ó ź n i e j s z e j j e g o e d y c j i . P r z y k ł a d o w e u s t a w i e n i a projektu przedsta wiono na r y s u n k u 13.15. Przed przystąpieniem d o symulacji przydatne będzie określenie konfiguracji całego u r u c h a m i a n e g o s y s t e m u , w t y m e w e n t u a l n e dołączenie wirtualnych peryferiów, zdefiniowanie p a r a m e t r ó w śledzenia, określenie p u n k t ó w syste-
£tppl ^dnthqni fhtnp^yutrcffi
i
Ewiun/ bron* /
dwtory J
' P Cnmt
U C C F 1 T K
OZCHWX
i
PCUER STORĘ 2 5 0 .
VSS-0
Power nod*i Kiero ciot*. Tr»to (nicitwiigM
to) «lorw« um
D; UDO PBO D; UCD PBl DC VIC PB»
flys. 73.75. 0*/w parame/rówpnyeWu ffys. 73.76. Konfiguracja uruchamianego systemu
m u , d o których będzie dołączony wielokanałowy oscyloskop wirtualny. Ustawień tych dokonuje się w oknie w y w o ł a n y m poleceniem View>Project File ( r y s u n e k 13.16). Szczegóły dotyczące użycia d o s t ę p n y c h elementów m o ż n a znaleźć w d o b r z e opracowanej p o m o c y programu. Zaletą V M L A B - a j e s t możliwość zdefiniowania pięciu r ó ż n y c h organizacji ekranu. Z a p a m i ę t y w a n i e kilku w i d o k ó w pozwoli szybko przechodzić pomię dzy ekranami zawierającymi istotne w d a n y m m o m e n c i e informacje. Znacz nie zwiększa się t y m s a m y m czytelność, c o m a znaczenie szczególnie wtedy, gdy monitor nie jest zbyt duży. Widoki zmienia się wybierając odpowiednią pozycję listy rozwijanej umieszczonej na końcu paska n a r z ę d z i o w e g o poka zanego na r y s u n k u 13.14. Pierwsza faza uruchamiania p r o g r a m u najczęściej będzie polegała n a częstym sięganiu d o źródła, k o m p i l o w a n i u programu, przeglądaniu
komunikatów
kompilatora i ponownej edycji źródła. W a r t o więc w j e d n y m z w i d o k ó w po dzielić ekran tylko na d w a okna: edycyjne i k o m u n i k a t ó w . Z a p e w n i to duży komfort podczas prac na t y m etapie. D o przeprowadzenia kompilacji progra m u należy wybrać polecenie Project>Build.
M o ż n a też u ż y ć klawisza F 9 lub
ikony Build (środkowa ikona na pasku n a r z ę d z i o w y m ) . W o k n i e
Messages
pojawią się wszystkie komunikaty generowane przez kompilator. Jeśli wystą pi choćby j e d e n błąd, kursor edycyjny zostanie ustawiony w podejrzanym o to miejscu. C z a s a m i j e d n a k błąd m o ż e b y ć ulokowany gdzie indziej. Na przykład, brak średnika kończącego linię p r o g r a m u C spowoduje wystąpienie błędu dopiero p o d c z a s kompilacji dalszej części programu. W s z y s t k i e miejs ca, na które trzeba zwrócić uwagę, są sygnalizowane w y k r z y k n i k a m i umiesz c z o n y m i przed treścią komunikatu. Kolor żółty oznacza, ż e chodzi tylko o ostrzeżenie, p r o g r a m będzie k o m p i l o w a n y . P r z y k ł a d o w o V M L A B ostrzega w ten sposób przed z a d e k l a r o w a n i e m zmiennej, która nie jest używana dalej w ż a d n y m miejscu p r o g r a m u . Gorzej, gdy wykrzyknik m a k o l o r czerwony. W takiej sytuacji kompilator nie tworzy pliku w y k o n y w a l n e g o , a więc uru chomienie programu nie będzie możliwe. T e g o typu błędy trzeba bezwzględ nie poprawić. C z a s a m i zdarza się, że j e d n a nieprawidłowość w źródle p o w o duje wygenerowanie całej listy błędów. Ż m u d n y etap eliminacji błędów for malnych kończy się wyświetleniem komunikatu: Success! Ali ready to run. O d tego momentu r o z p o c z y n a się kolejna faza uruchamiania aplikacji - sy mulacja. Teraz w s k a z a n e będzie stworzenie sobie kolejnych e k r a n ó w robo czych wynikających ze specyfiki u r u c h a m i a n e g o układu. N a p e w n o warto umieścić na n i m c h o ć b y niewielkie o k n o źródła programu. Wykorzystując krokowy tryb pracy, będzie w n i m zaznaczana aktualnie w y k o n y w a n a in strukcja na poziomie odpowiadającym wersji źródłowej (język C lub asemb-
ler). Jeśli p r o g r a m j e s t napisany w C a c h c e m y w y k o n y w a ć g o na poziomie t
rozkazów
m i k r o k o n t r o l e r a , konieczne b ę d z i e dołożenie o k n a Program
me-
mory i u c z y n i e n i e g o a k t y w n y m . P o lewej s t r o m e każdej instrukcji widnieją niewielkie p r z y c i s k i e k r a n o w e . Ich naciśnięcie powoduje wstawienie w da n y m miejscu p r o g r a m u p u ł a p k i (breakpoint).
Kolor klawisza zmienia się
w ó w c z a s n a c z e r w o n y . A k t y w n y c h p u ł a p e k m o ż e b y ć wiele. Podczas prac u r u c h o m i e n i o w y c h c z ę s t o z a c h o d z i konieczność pomiaru czasu w y k o n y w a nia się n p . o k r e ś l o n e j p r o c e d u r y . Tu niestety trzeba przyznać w y ż s z o ś ć pro g r a m u A V R S t u d i o nad V i s u a l M i c r o L a b . Atrakcyjna m o ż e b y ć natomiast graficzna interpretacja c z a s u p r z e b y w a n i a j e d n o s t k i centralnej w o k r e ś l o n y m miejscu p r o g r a m u . Rolę w s k a ź n i k ó w spełniają żółte paski nałożone na po s z c z e g ó l n e instrukcje. T r z e b a przy t y m pamiętać, że skala czasu jest logaryt miczna! P o s z c z e g ó l n e k o m p o n e n t y mikrokontrolera są z g r u p o w a n e w kilku niezależ nych o k n a c h , n p . ; rejestry, p a m i ę ć p r o g r a m u , pamięć danych S R A M , pamięć E E P R O M , porty oraz U A R T , timery, w a t c h d o g . Zawartość k a ż d e g o z nich m o ż e b y ć w y ś w i e t l a n a w postaci binarnej, h e x a d e c y m a l n e j , całkowitoliczbowej, a n a w e t w kodach A S C I I . N a wszystkie pola jest nałożony półprzeźro czysty p a s e k graficzny, który w postaci analogowej pokazuje stan d a n e g o k o m p o n e n t u . K a ż d y z rejestrów m o ż e b y ć w dowolnej chwili zmieniony. Niestety n i e d o t y c z y to licznika programu, c o oznacza, że p r o g r a m m o ż e b y ć w y k o n a n y t y l k o w takiej kolejności, j a k w układzie rzeczywistym. U ż y t k o w nik m a też m o ż l i w o ś ć podglądania z m i e n n y c h programu. Bywają z t y m nie stety p r o b l e m y , z m i e n n e te nie z a w s z e są dostępne. Nie m o ż n a też modyfiko w a ć w prosty s p o s ó b ich wartości. W t y m zakresie A V R Studio wykazuje p r z e w a g ę n a d Visual M i c r o L a b . P e w n y m wyjściem z sytuacji jest podejrze nie miejsca p r z e c h o w y w a n i a zmiennej (rejestry, pamięć R A M ) i jej edycja na tym poziomie. Specyficznym o k n e m V M L A B - a jest tzw. panel sterujący. Zawiera on zewnę trzne urządzenia peryferyjne wykorzystywane w aplikacji. M o ż e to być klawia tura 4 x 4 , alfanumeryczny wyświetlacz L C D , wirtualny terminal T T Y , diody świecące, potencjometry. Ich parametry konfiguruje się w oknie projektu. U r u c h o m i e n i e w i r t u a l n e g o systemu następuje p o naciśnięciu klawisza F 5 lub ikonki z s e m a f o r e m . N a s z wirtualny system zaczyna w t y m m o m e n c i e dzia łać. N a o s c y l o s k o p i e (jeśli j e s t włączony) pojawiają się przebiegi g e n e r o w a n e przez m i k r o k o n t r o l e r , z m i a n i e ulegają wszystkie w y k o r z y s t y w a n e k o m p o nenty. S y m u l a c j ę m o ż n a z a t r z y m a ć naciskając ikonę ze z n a k i e m „ S T O P " . Oprócz p r a c y ciągłej m a m y d o dyspozycji - p o d o b n i e j a k w A V R Studio różne tryby pracy k r o k o w e j .
Przebieg na oscyloskopie m o ż e być dość swobodnie skalowany, umożliwia jąc w y ś w i e d a n i e charakterystyk z dużą dokładnością (100 ns/działkę) lub wyświetlanie przebiegów zebranych w dłuższym czasie, a także przyjrzenie się detalom z rozdzielczością
100 ns/działkę. Ustawiając na oscylogramie
d w a kursory m o ż n a łatwo d o k o n a ć pomiaru czasu. Program Visual Micro L a b jest bardzo w y g o d n y w użyciu, m a wiele cech sprawiających, że chętnie się p o niego sięga. W sytuacjach, w których wady stają się męczące z a w s z e można sięgnąć p o A V R Studio.
13.5. Programowanie pamięci programu w systemie (ISP) Mikrokontrolery A V R firmy Atmel są w y p o s a ż o n e w interfejs umożliwiający programowanie ich pamięci j u ż p o zamontowaniu w systemie (ISP). W y k o rzystanie takiego sposobu programowania powoduje, że m o ż n a zrezygnować z zakupu programatora stacjonarnego, wystarczy j e d y n i e prosty interfejs mię dzy u r u c h a m i a n y m s y s t e m e m a k o m p u t e r e m P C (jak np. Z L 2 P R G opisany w dalszej części rozdziału). Liczne przykłady takich konstrukcji można zna leźć w Internecie. O d n o ś n i k i są zamieszczone w dodatku H.
13.5.1. Programator ZL2PRG S c h e m a t elektryczny programatora Z L 2 P R G p o k a z a n o na r y s u n k u 13.17. Układ U l pełni rolę separatora linii w e / w y interfejsu d r u k a r k o w e g o Centro nics od systemu, w k t ó r y m znajduje się p r o g r a m o w a n y mikrokontroler. Inter fejs jest zasilany napięciem pobieranym z systemu, w związku z c z y m pod czas korzystania z niego nie trzeba stosować d o d a t k o w e g o zasilacza. Dla pro gramatora Z L 2 P R G zaprojektowano dwustronną płytkę drukowaną,
której
mozaiki i schemat m o n t a ż o w y p o k a z a n o w dodatku G. Układ U l m a o b u d o w ę przystosowaną do montażu S M D ( S O 2 0 ) , pozostałe elementy są m o n t o w a n e klasycznie. Złącza J l i JP1 są montowane na krawędzi płytki w taki sposób, że przed ich przylutowaniem laminat jest wsuwany po• między rzędy wyprowadzeń. Na r y s u n k u 13.18 pokazano przypisanie sygna łów d o styków gniazda J P 1 . Sygnał L E D można wykorzystać d o sterowania diody świecącej, sygnalizującej programowanie układu. N a płytce Z L 1 A V R dioda taka jest uwzględniona (D9 dołączona d o styku 3. gniazda ISP2).
SN74HC244
Rys. 13.17. Schemat elektryczny programatora ZL2PRG
A t u t e m p r o g r a m a t o r a Z L 2 P R G j e s t m o ż l i w o ś ć współpracy z wieloma bez p ł a t n y m i p r o g r a m a m i sterującymi j e g o pracą. J e d n y m z lepszych j e s t p r o gram P o n y P r o g 2 0 0 0 ( r y s u n e k 13.19), dostępny w Internecie pod adresem: http://www.lancos.com/ppwin95.html.
P o n y P r o g występuje w wersjach d l a
W i n d o w s (łącznie z NT72K/XP) oraz Linuksa. Obsługuje mikrokontrolery: A T 9 0 S 1 2 0 0 , A T 9 0 S 2 3 1 3 , A T 9 0 S 2 3 2 3 , A T 9 0 S 2 3 3 3 , A T 9 0 S 2 3 4 3 , AT90S4414, AT90S4434, AT90S8515, AT90S8534, AT90S8535, ATmega8, ATmegaló, ATmega64, ATmegal03, ATmegal28, ATmegal61, ATmegal63, ATmega 323,
ATtinyl2 i ATtinyl5.
Na r y s u n k u
13.20 p o k a z a n o zalecany s p o s ó b dołączenia
programatora
Z L 2 P R G d o m i k r o k o n t r o l e r a z a i n s t a l o w a n e g o w systemie. Taki sposób dołą• PoorProoJOOO SmM Doyicii Pingin
• lal xi Efc
Bo»w
tainsd
itrp
U*y
J«*"> 2
^nljn
"3
8
> u o o a Strona .etemenlów"
— f ••••
płytki programatora Sliona Jutowanis" płytki programatora
1*
g n o m ę ) 11 I I b o b i e d> f f u b g s b 3 » ) 11 KF o n o M i ) f i FF onoes a) n II o n o s ó d l u II 011007(1) t i ft gngosii) i r n t a a m i ) if n DOOMO) F-F
II II II
ii u n FF ff n FF FF FF II II U
II II rr rr
II If II ff IF |t FF FI
i ir i r FI r 1 FF F F II F I II I
F I FF n FF I F Ff FF FF I I
ggyijiijUyijggijiiiiuiJ
ir i rr r
rr rr rr rr BWIOFł.) I I
rr
IT M
(f
FI Ff Tf If > W * b X 0 > ~ AT9BM3J" "ĆteJJStyw CRC 4*3*
13.18. Wyprowadzenia mnatów na styki gniazda JP1
3
I II I I Ił I I F t F FF F I Ft f I F F I FI I I 'I I I Tf I I I I I
n Ff t r r i
n a e m B ) ir H a n o u e i o i i Ff o m a n a) r r IT
|*19CSUJ3
Sys, 13.79. Wygląd okna programu PonyProg 2000
mmmmmm
Do złącza JP1 programatora ZL2PRG
3 PB7
x 1 ( t
Do aplikacji P87
PS7
AXY
PS6
PB6
PB6
exv
PBS
PB5
PBS
CXY A B C
RESET
RESET
AVR Rys. 13.20. Zalecany sposób dołą czenia programatora ZL2PRG do mikrokontrolera zainstalowanego w systemie, gdy PB5, PB6 i PB7 pracują jako wejścia
RESET
AVR
AX ex ex AY 8Y CY
15 £BJL PB$
| O.
Rys. 13.21. Zalecany sposób dołączenia pro gramatora ZL2PRG do mikrokontrolera zain stalowanego w systemie, gdy co najmniej je dno z wyprowadzeń PB5, PB6 lub PBl pracuje jako wejście
czenia interfejsu I S P d o rnikrokontrolera jest m o ż l i w y tylko w przypadku, gdy porty P B 5 , P B 6 i P B 7 są skonfigurowane j a k o wejścia. W przypadku, gdy któreś z tych w y p r o w a d z e ń musi pracować j a k o wyjście, firma Atmel za leca inny sposób dołączenia programatora - p o k a z a n o go na r y s u n k u 13.21.
14. Przykładowe aplikacje Wcześniejsze rozdziały książki zawierały wiele informacji technicznych, które można znaleźć" w notach katalogowych mikrokontrolerów AVR, w szczególności A T 9 0 S 2 3 1 3 . Zapoznanie się z nimi jest nieodzowne do świadomego i efektyw nego wykorzystywania możliwości mikrokontrolerów w e własnych projektach, pomaga także zrozumieć zasadę działania rozwiązań spotykanych w książkach, czasopismach i Internecie. Sucha wiedza katalogowa z pewnością nie wystarczy do pełnego zaznajomienia się z mikrokontrolerami A V R . Najczęściej dopiero sa modzielnie przeprowadzone eksperymenty praktyczne wyjaśnią wątpliwości, ja kie mogły nasunąć się podczas lektury opisu technicznego. Rozdział 14. u ł o ż o n o w formie zestawu ć w i c z e ń praktycznych, s u k c e s y w n i e odsłaniających tajemnice mikrokontrolera, objaśniających zasady w y k o r z y s tywania j e g o b l o k ó w funkcjonalnych i rozwiązujących wiele p r o b l e m ó w , na j a k i e natykają początkujący elektronicy. Powtarzające się bez końca pytania, z którymi m o ż n a s p o t k a ć się na internetowych grupach dyskusyjnych typu: „Jak o b s ł u ż y ć w y ś w i e t l a c z a l f a n u m e r y c z n y ? " , „Jak zrealizować transmisję, wykorzystując interfejs R S 2 3 2 ? " , czy nawet . J a k sterować L E D - e m dołączo n y m d o m i k r o k o n t r o l e r a ? " , skłaniają d o zajęcia się tymi zagadnieniami. M a m nadzieję, ż e o p i s a n e e k s p e r y m e n t y rozwieją przynajmniej część tego typu wątpliwości C z y t e l n i k ó w . Przedstawiony m i n i k u r s opiera się na płytce uruchomieniowej
ZL1AVR
z m i k r o k o n t r o l e r e m A V R A T 9 0 S 2 3 1 3 . Zestaw zaprojektowano specjalnie na potrzeby książki. W y b ó r mikrokontrolera został p o d y k t o w a n y dużą popular nością tego układu, j e g o niską ceną i faktem, że świetnie się nadaje d o wielu p r a k t y c z n y c h aplikacji.
Płytki
drukowane
zestawu
ZL1AVR
oraz
programatora
Z L 2 P R G są d o s t ę p n e w i n t e r n e t o w y m sklepie W y d a w n i c t w a BTC
(hrip://www.btc.pł/index.php?id-15).
P o d s t a w o w y m dylematem rozstrzyganym podczas przygotowywania ćwiczeń był w y b ó r j ę z y k a programowania. W poprzednich rozdziałach książki więk szość p r z y k ł a d ó w napisano w asemblerze. T r u d n o było uczynić inaczej pod czas o m a w i a n i a listy rozkazów mikrokontrolera. Język ten nie jest jednak obecnie zbyt często stosowany w praktyce. Pisanie programów w asemblerze zajmuje d u ż o czasu, a ich czytelność, szczególnie p o p e w n y m czasie staje się
niewielka. Alternatywnymi możliwościami był Bascom lub j ę z y k C - mój w y bór padl na język C. A r g u m e n t e m przemawiającym za t y m rozwiązaniem był fakt, że jest dostępny kompilator tego języka w wersji darmowej ( A V R - G C C ) , bez żadnych ograniczeń (licencja G N U ) . Spotykane w Internecie opisy zagad nień technicznych również na ogół występują w postaci procedur lub całych pro gramów pisanych w C. Nie da się ukryć, że język ten stanowi obecnie standard w zastosowaniach profesjonalnych, warto więc nauczyć się g o j a k najwcześniej.
P r z y k ł a d o w e programy przedstawione w dalszej części książki napisano w języku C i k o m p i l o w a n o za pomocą
bezpłatnego
kompilatora A V R - G C C w wersji 3.2 datowanej n a 2 0 0 2 . 0 6 . 2 5 . Jest ona dostępna na stronie internetowej W y d a w n i c t w a B T C (http:/Avww.btc.pl?id=pliki).
Wybranie języka wysokiego poziomu m a również taką zaletę, że ucząc się pro gramowania w języku wysokiego poziomu, w każdej chwili m o ż n a podejrzeć kod wynikowy i w p e w n y m sensie również w ten sposób uczyć się asemblera. Przykłady przedstawione w książce k o m p i l o w a n e są k o m p i l a t o r e m
AVR-
G C C . S p o s ó b skonfigurowania środowiska d o pracy z t y m kompilatorem opisano w rozdziale 13. Należy zaznaczyć, że nie było z a m i a r e m autora pisa nie podręcznika d o nauki j ę z y k a C. Trzeba również dodać, że zamieszczone programy reprezentują tylko j e d n ą z wielu możliwych m e t o d rozwiązywania poszczególnych p r o b l e m ó w .
14.1. Zestaw uruchomieniowy ZL1AVR Jak j u ż w s p o m n i a n o , specjalnie na potrzeby niniejszej książki zaprojektowa n o zestaw u r u c h o m i e n i o w y , na którym były testowane wszystkie projekty przedstawione w tym rozdziale. Jest on stosunkowo łatwy w w y k o n a n i u , bar d z o uniwersalny, a j e g o koszt wykonania relatywnie niski. N a r y s u n k u 14.1 przedstawiono schemat elektryczny zestawu uruchomienio wego Z L 1 A V R , a na r y s u n k u 14.2 widok zmontowanej płytki i rozmieszcze nie na niej najważniejszych elementów. Dla j a k najpełniejszego zilustrowania możliwości mikrokontrolera
przewidziano kilka b l o k ó w
funkcjonalnych,
k o n f i g u r o w a n y c h za p o m o c ą licznych z w o r e k . O d p o w i e d n i e ich ustawienie pozwoli na przeprowadzenie różnorodnych eksperymentów praktycznych.
Rys. 14.2. Rozmieszczenie najważniejszych elementów na płytce zestawu ZL1AVR
Wykorzystując zestaw będzie m o ż n a również uruchamiać fragmenty włas nych aplikacji, a to dzięki uniwersalnemu polu m o n t a ż o w e m u umieszczone m u w prawej części płytki. Rozwiązanie takie podnosi walory funkcjonalne, a przede wszystkim edukacyjne zestawu.
14.1.1. Zasilanie zestawu Zasilanie z e s t a w u Z L 1 A V R m o ż e b y ć zrealizowane na kilka s p o s o b ó w . Pier wszy z nich, t o w y k o r z y s t a n i e t y p o w e g o zasilacza w t y c z k o w e g o dostarczają cego napięcie o wartości od 8 d o 12 V. Umieszczenie na płytce m o s t k a pros towniczego D l i stabilizatora U l nie narzuca ostrych w y m a g a ń c o d o napię cia w e j ś c i o w e g o . N i e m u s i b y ć o n o stabilizowane, nie jest nawet konieczne napięcie stale. J a k w i ę c w i d a ć , drugim s p o s o b e m zasilania będzie w y k o r z y s tanie z w y k ł e g o transformatora. W t y m p r z y p a d k u wartość skuteczna napięcia powinna z a w i e r a ć się m i ę d z y 5,6 V , a 8,5 V.
M o z a i k i płytki d r u k o w a n e j oraz schemat m o n t a ż o w y płytki ze s t a w u Z L I A Y R znajdują się w dodatku G.
Napięcie zasilające d o p r o w a d z a się d o gniazda J P 1 2 lub J P 1 3 . Złącze J P 1 2 to śrubowy z a c i s k A R K , przydatny d o podłączania p r z e w o d ó w . Z e względu na obecność m o s t k a D l nie j e s t istotna b i e g u n o w o ś ć dołączanego napięcia zasi lającego. Z ł ą c z e J P 1 3 to t y p o w e g n i a z d o zasilające, które m o ż n a w y k o r z y s tywać a l t e r n a t y w n i e z J P 1 2 . Pobór prądu przez system nie jest duży (ok. 45 m A z włączonymi diodami L E D i wyświetlaczem L C D ) , dzięki czemu stabilizator U l - w większości przypad ków - będzie m ó g ł pracować bez radiatora. Dołączenie własnych układów może spowodować znaczny wzrost prądu zasilającego, a co za tym idzie wzrost tempe ratury stabilizatora. W takim przypadku konieczne może się okazać założenie ra diatora na układ U l lub zmniejszenie d o minimum wartości napięcia zasilające go. Różnica między napięciem wejściowym, a wyjściowym nie powinna być mniejsza niż 2 V. Kondensator C7 filtruje tętnienia napięcia wyprostowanego, a C 8 i C 9 odsprzęgają układ U l dla wielkich częstotliwości,
zabezpieczając
przed wzbudzeniem się. W dolnej oraz górnej części uniwersalnego pola monta żowego przebiegają dwie ścieżki zasilające tak, by można było w j a k najwygod niejszy sposób doprowadzić napięcie zasilające d o własnej części badanego sys temu. Oprócz tego napięcie to jest dostępne na łączówkach JP17 i JP18. Podczas korzystania z nich należy uważać, by nie spowodować zwarcia.
14.1.2. Taktowanie i zerowanie mikrokontrolera N a j w a ż n i e j s z y m e l e m e n t e m n a płytce j e s t o c z y w i ś c i e m i k r o k o n t r o l e r U 3 . Zalecany j e s t układ A T 9 0 S 2 3 1 3 - 1 0 , współpracujący z r e z o n a t o r e m k w a r c o -
w y m X l o częstotliwości 8 M H z . Dla takiej konfiguracji są p r z y g o t o w a n e p r z y k ł a d o w e p r o g r a m y . W szczególności c h o d z i o p r o c e d u r y o d m i e r z a n i a czasu. W p r z y p a d k u k o r z y s t a n i a z rezonatora na płytce, z w o r k i J3 i J 4 p o winny b y ć u s t a w i o n e w g ó r n y m położeniu. G d y b y z j a k i c h ś p o w o d ó w za szła k o n i e c z n o ś ć d o ł ą c z e n i a z e w n ę t r z n e g o sygnału z e g a r o w e g o , to jest to m o ż l i w e poprzez ł ą c z ó w k ę O S C _ E X T . Z w o r k i J3 i J 4 p o w i n n y b y ć w ó w c z a s u s t a w i o n e w d o l n y m położeniu. Sygnał z łączówki wejściowej O S C _ E X T trafia p o p r z e z z w o r k ę J 3 n a wejście X T A L 1 m i k r o k o n t r o l e r a . M o ż l i w o ś ć użycia z e w n ę t r z n e g o sygnału z e g a r o w e g o m o ż e b y ć w y k o r z y s tana n p . d o s p r a w d z e n i a zależności prądu zasilającego w funkcji częstotli w o ś c i taktowania u k ł a d u . Z generatorem jest związany układ zerujący. Mikrokontroler j e s t j a k w i a d o m o układem synchronicznym. D o j e g o pracy niezbędny j e s t odpowiedni przebieg zegarowy. W m o m e n c i e włączenia zasilania generator nie wzbudza się natychmiast. Start jednostki centralnej musi więc być opóźniony o czas gwarantujący j e g o stabilną pracę. D o w y g e n e r o w a n i a o d p o w i e d n i e g o sygna łu R E S E T najlepiej nadają się specjalizowane układy, takie j a k n p . D S 1 8 1 3 , który zastosowano w zestawie u r u c h o m i e n i o w y m (układ U 2 ) . Zaletą takiego rozwiązania jest w y g e n e r o w a n i e p e w n e g o w działaniu sygnału zerującego, bez względu na szybkość narastania napięcia zasilającego. O d p o w i e d n i a ja kość zerowania b y w a ignorowana przez konstruktorów, t y m c z a s e m okazuje się, że w wielu p r z y p a d k a c h nieprawidłowo rozwiązane z e r o w a n i e mikrokon trolera uniemożliwia j e g o prawidłowe działanie. Z e r o w a n i e mikrokontrolera tylko i wyłącznie poprzez wyłączanie i włączanie zasilania byłoby na dłuższą metę uciążliwe, szczególnie w przypadku prowa dzenia różnorodnych testów. Dlatego też na płytce znajduje się przycisk R E S E T , za pomocą którego m o ż n a ręcznie zerować system.
14.1.3. Wykorzystywanie portów mikrokontrolera Wszystkie porty mikrokontrolera są wyprowadzone na gniazda o oznaczeniach P O R T B i P O R T D . Z a n i m j e d n a k sygnały z odpowiednich portów mikro kontrolera d o nich dotrą, muszą przejść przez zworki zakładane na specjalnie do tego celu umieszczone podwójne rzędy szpilek Z W ^ P O R T B i Z W _ P O R T D . Umieszczenie zworki np. w położeniu 1-2 gniazda Z W _ P O R T B powoduje połączenie w y p r o w a d z e n i a 1 gniazda P O R T B z w y p r o w a d z e n i e m 19 mikro kontrolera (PB7). Analogicznie jest dla pozostałych wyprowadzeń. W ten spo sób wyprowadzenia poszczególnych portów mikrokontrolera (gniazda P O R T B i P O R T D ) mogą b y ć n a stałe dołączone, np. d o własnego układu umieszczone-
g o na u n i w e r s a l n y m polu m o n t a ż o w y m i w razie potrzeby odłączane od niego za pomocą z w o r e k zakładanych na Z W J > O R T B i Z W _ P O R T D . N a u w a g ę za sługują k o ń c ó w k i 1 i 2 g n i a z d a Z W _ P O R T D oraz 1 P O R T D . Mikrokontroler A T 9 0 S 2 3 1 3 m a j e d y n i e 7 w y p r o w a d z e ń portu D i w związku z t y m w y m i e nione wyżej k o ń c ó w k i w y k o r z y s t a n o d o dołączenia sygnału d o wewnętrzne g o k o m p a r a t o r a a n a l o g o w e g o mikrokontrolera. Dla w y g o d y w y p r o w a d z e n i e 2 Z W _ P O R T D dołączono do masy.
D l a w y g o d y pracy w a r t o p r z y g o t o w a ć sobie specjalne kabelki,
U|GA
k t ó r e będą w y k o r z y s t y w a n e d o połączeń systemu z w ł a s n y m u k ł a d e m u m i e s z c z o n y m na u n i w e r s a l n y m polu m o n t a ż o w y m . K a b e l k i takie m o g ą b y ć w y k o n a n e np. przy użyciu pojedyn c z y c h s t y k ó w tulipanowych w y m o n t o w a n y c h ze standardowej ł ą c z ó w k i w i e l o s t y k o w e j . D o każdej k o ń c ó w k i należy przy luto w a ć k a w a ł e k drutu (linki miedzianej) i zaizolować rurką termo kurczliwą, w z m a c n i a j ą c t y m s a m y m połączenie. Drugi koniec k a b e l k a m o ż e b y ć j e d y n i e p o z b a w i o n y izolacji i p o c y n o w a n y . B ę d z i e on później d o l u t o w y w a n y do o d p o w i e d n i e g o punktu p o l a m o n t a ż o w e g o . D o e k s p e r y m e n t ó w przyda się też kilka ka b e l k ó w z a k o ń c z o n y c h obustronnie łączówką.
14.1.4. Klawiatura W jaki s p o s ó b c z ł o w i e k m o ż e k o m u n i k o w a ć się z systemem mikroprocesoro w y m ? N a p r z y k ł a d za p o m o c ą klawiatury. J a k o , ż e jej obsługa stanowi od wieczny p r o b l e m początkujących
elektroników, klawiatury nie m o g ł o za
braknąć na p ł y t c e . T w o r z ą j ą przyciski S W 1 , S W 2 , S W 3 , S W 4 . Z w o r k i JP4...JP7 służą d o dołączenia klawiatury d o mikrokontrolera i o d p o w i e d n i e g o jej s k o n f i g u r o w a n i a . Przyciski S W 1 . . . S W 4 m o g ą p r a c o w a ć j a k o d w a nie zależne przyciski dołączone b e z p o ś r e d n i o d o mikrokontrolera, przy c z y m muszą b y ć o b s ł u g i w a n e p r z e z d w a różne porty (można więc w y k o r z y s t y w a ć parę S W 1 , S W 4 lub S W 2 , S W 3 ) . Mogą też b y ć skonfigurowane j a k o klawia tura m a t r y c o w a 2 x 2 . W p i e r w s z y m p r z y p a d k u zworki J P 6 i J P 7 muszą być zwarte, a J P 4 i J P 5 z a ł o ż o n e w pozycji 2-3 (połączenie z masą). W układzie klawiatury m a t r y c o w e j z w o r k i J P 4 i J P 5 p o w i n n y b y ć założone w pozycji 1-2 (lewe p o ł o ż e n i e ) . Z w o r k i J P 6 i J P 7 służą d o całkowitego odłączenia przycisków od mikrokontrolera. M o ż e b y ć t o konieczne np. w przypadku używania U A R T - u lub p o r t ó w PD1 i/lub PDO. Naciśnięcie k t ó r e g o ś z tych przycisków m o g ł o b y zakłócić pracę systemu.
14.1.5. Interfejs RS232 Wejście i wyjście U A R T - u mikrokontrolera w y p r o w a d z o n o poprzez zworki J P 2 i J P 3 oraz układ M A X 2 3 2 (U4) na gniazdo D B 1 . Układ U 4 służy do konwersji p o z i o m ó w logicznych mikrokontrolera na p o z i o m y napięć zgodne ze standardem R S 2 3 2 . Płytkę uruchomieniową można łączyć poprzez gniaz d o D B 1 (typu D S U B - 9 ) z d o w o l n y m i n n y m urządzeniem
wyposażonym
w interfejs R S 2 3 2 . D o połączenia wystarczy kabel typu nułl-modem,
w któ
rym wykorzystuje się jedynie 3 przewody (dwie linie transmisyjne i masę sygnałową). N i e z b ę d n e w takim przypadku zapętlenia sygnałów R T S i C T S oraz D S R , D T R i D C D są w y k o n a n e na płytce ( r y s u n e k 14.3).
DTE (np. ZL1AVR)
OCE (PCJ
Rys. 14.3. Połączenie typu nułl-modem. Zapętlenia sygnałów RTS i CTS oraz DSR, DTR i DCD mogą być wykonane na płytce drukowanej lub przy stykach złącz DSUB-9
14.1.6. Diody LED Kolejnym środkiem komunikacji p o m i ę d z y systemem a u ż y t k o w n i k i e m jest zespół diod świecących L E D 1 . . . L E D 8 . Są o n e dołączane indywidualnie d o portu P B mikrokontrolera poprzez zworki Z W _ P O R T B . M o ż n a wykorzysty w a ć tylko wybrane, niekoniecznie wszystkie na raz. Z w o r k a J P 1 służy nato miast d o j e d n o c z e s n e g o odłączenia wszystkich diod L E D od mikrokontrole ra. Sterowanie d i o d a m i o d b y w a się bezpośrednio z w y p r o w a d z e ń mikrokon trolera bez d o d a t k o w y c h
wzmacniaczy tranzystorowych. J a k
pamiętamy
z poprzednich rozdziałów, wydajność prądowa portów układu A T 9 0 S 2 3 1 3 jest wystarczająca d o tego celu. Jedyne na co trzeba zwrócić u w a g ę , to takie dobranie rezystorów R 9 d o R 1 5 , aby nie przekroczyć całkowitej dopuszczal nej m o c y strat układu U 3 . W przypadku zestawu warunek ten jest spełniony, gdyż rezystory dołączone szeregowo ograniczają prąd diod L E D d o ok. 4 m A / s z t , co przy zapaleniu wszystkich diod daje pobór prądu o wartości ok. 32 mA. Założona wartość prądu w zupełności p o w i n n a wystarczyć d o wyraźnego świecenia się diod L E D , nawet gdy nie będą to diody wysokiej j a s n o ś c i . D i o -
dy L E D są d o ł ą c z o n e d o t e g o s a m e g o portu c o wyświetlacz alfanumeryczny L C D . Jeśli p r z e w i d y w a n e j e s t j e g o stosowanie, to niestety należy zrezygno wać z diod L E D lub z g o d z i ć się, że będą mrugały podczas pracy w czasie w y m i a n y d a n y c h m i ę d z y mikrokontrolerem a wyświetlaczem. Jedynie L E D 1 i L E D 2 pozostają d o e w e n t u a l n e g o n o r m a l n e g o wykorzystania, ale tym ra zem p o d w a r u n k i e m , ż e nie b ę d z i e u ż y w a n y przetwornik analogowo-cyfrowy lub o d p o w i e d n i o porty PBO i P B l .
14.1.7. Wyświetlacz alfanumeryczny LCD Na płytce u r u c h o m i e n i o w e j u m i e s z c z o n o g n i a z d o szpilkowe L C D 1 przezna czone d o d o ł ą c z e n i a t y p o w e g o wyświetlacza alfanumerycznego L C D . W z e stawie p r z e w i d z i a n o w y ś w i e t l a c z 2 x 1 6 . O b s ł u g a jest realizowana za pomocą 4-bitowej s z y n y d a n y c h i d w ó c h sygnałów sterujących: E i R S . T y p o w y in terfejs w y ś w i e t l a c z a a l f a n u m e r y c z n e g o zawiera ponadto sygnał R / W , za p o mocą k t ó r e g o określa się k i e r u n e k transmisji danych. Jest to potrzebne pra wie wyłącznie d o s p r a w d z a n i a gotowości wewnętrznego sterownika wy świetlacza. N a d e s ł a n e polecenie d o w y k o n a n i a przez mikrokontroler w c h w i li, gdy s t e r o w n i k nie j e s t g o t o w y kończy się j e g o zignorowaniem, c o najczęś ciej p r o w a d z i d o b ł ę d n e g o działania układu. G o t o w o ś ć tę m o ż n a j e d n a k prze widzieć, w p r o w a d z a j ą c d o obsługi odpowiednie opóźnienia p r o g r a m o w e (za kładając, ż e p o t y m czasie sterownik upora się z wcześniejszymi zadaniami). Obsługa n i e j e s t wtedy tak wydajna, j a k przy sprawdzaniu gotowości wy świetlacza, lecz w z a s t o s o w a n i a c h praktycznych na ogół w niczym to nie p r z e s z k a d z a . P o t e n c j o m e t r P I usytuowany blisko wyświetlacza służy d o re gulacji kontrastu i c z ę s t o b y w a p o w o d e m frustracji niedoświadczonych elekt roników. J e ś l i b o w i e m j e g o s u w a k będzie ustawiony w z ł y m położeniu, to kontrast w y ś w i e t l a c z a m o ż e b y ć na tyle m a ł y , że żadne znaki nie będą wi doczne na w y ś w i e t l a c z u . C a ł a w i n a w takich sytuacjach j e s t c z ę s t o „zrzuca na" na błędy programu lub pomyłki w połączeniach. Dlatego w czasie pierw szego włączenia wyświetlacza, gdy nic na n i m nie widać, warto pokręcić su wak od j e d n e g o skrajnego położenia do drugiego. Dopiero, gdy p o tym spraw dzeniu w y ś w i e t l a c z nadal będzie „milczał", należy szukać innych błędów.
2
14.1.8. Interfejsy l C i 1-Wire Interfejsy 1 ^ i 1-Wire są p o w s z e c h n i e s t o s o w a n e d o komunikacji różnorod nych
urządzeń
peryferyjnych
z systemem
mikroprocesorowym.
Czasami
można s p o t k a ć nieco z m i e n i o n e ich n a z w y , c o b y w a związane z trudnościami
w uzyskiwaniu licencji na stosowanie interfejsu przez p r o d u c e n t ó w poszcze gólnych m o d u ł ó w peryferyjnych. Okazuje się, ż e właściciele p r a w autorskich b a r d z o s u r o w o j e egzekwują, a liczni producenci nie zawsze m o g ą sobie po zwolić lub p o prostu nie mają zamiaru za nie płacić. P r o b l e m ó w takich nie 2
uniknął nawet taki potentat, j a k Analog Devices. Interfejs I C został opraco wany przez firmę Philips, natomiast 1-Wire w dawnej Dallas Semiconductor, obecnie M a x i m - D a l l a s . O b y d w a interfejsy nie wymagają stosowania żadnych dodatkowych układów oprócz rezystorów podciągających na liniach transmi 2
syjnych. Urządzenia peryferyjne komunikujące się poprzez interfejs I C dołą cza się d o systemu p o p r z e z gniazda J l lub J2 ( z d u b l o w a n o j e dla w y g o d y ) . Linię danych S D A d o ł ą c z a się d o mikrokontrolera za pomocą z w o r k i J P 1 5 , a linię zegarową S C L za p o m o c ą J P 1 6 . Rezystory podciągające R 2 i R 3 gwarantują o d p o w i e d n i ą j a k o ś ć podciągnięcia. A n a l o g i c z n i e j e s t z interfej s e m 1-Wire. T y m r a z e m , j a k sama n a z w a wskazuje, j e s t t o p o ł ą c z e n i e j e d n o p r z e w o d o w e . S y g n a ł d o p r o w a d z a się d o gniazda J P 1 0 lub J P 1 1 , a dołą 2
czenie d o systemu z a p e w n i a z w o r k a J P 1 4 . Interfejsy I C i 1-Wire zajmują porty o d p o w i e d n i o P D 5 , P D 6 i P D 3 . Należy to uwzględnić w planowaniu eksperymentów.
14.1.9. Przetwornik analogowo-cyfrowy Z zasady działania u k ł a d ó w cyfrowych, d o j a k i c h należą mikrokontrolery, wynika, że operują o n e na dyskretnym i s k o ń c z o n y m zbiorze stanów w e j ściowych i wyjściowych. T y m c z a s e m świat wokół nas jest a n a l o g o w y , czyli ciągły i nieskończony (przynajmniej z matematyczno-fizycznego punktu w i dzenia). M o ż n a w i e c w y s n u ć wniosek, że przydatność
mikrokontrolerów
w dziedzinie analizy t y p o w y c h , otaczających nas zjawisk będzie raczej nie wielka. Z drugiej zaś strony jeśli przyjrzeć się n a s z y m z m y s ł o m , to okaże się, że są bardzo ułomne i s t o s u n k o w o prosto m o ż n a j e oszukać... oczywiście m e todami cyfrowymi. Przekonujemy się o t y m na c o dzień słuchając płyt k o m p a k t o w y c h , czy nawet oglądając zdjęcia z wakacji. Jak z a t e m w p r o w a d z i ć analogową informację d o cyfrowego mikrokontrolera? W o g ó l n y m przypad ku o d p o w i e d ź brzmiałaby: stosując przetwornik analogowo-cyfrowy. W i ę k szość p r o d u c e n t ó w mikrokontrolerów m a w swojej ofercie handlowej modele układów w y p o s a ż o n y c h w wewnętrzne przetworniki A D C Converter). tinyl5L,
(Analog-Digital
Znajdziemy j e również wśród produktów A t m e l a , np.: A T A T t i n y 2 6 L , A T 9 0 S 4 4 3 3 , A T 9 0 S 8 5 3 5 i większość u k ł a d ó w serii
A T m e g a . Niestety przetwornika takiego nie z a i m p l e m e n t o w a n o w układzie A T 9 0 S 2 3 1 3 . W zamian za to znajduje się w j e g o strukturze k o m p a r a t o r ana l o g o w y . Dokładając s t o s u n k o w o niewiele e l e m e n t ó w zewnętrznych m o ż n a
Ą
|PO4
Rys. 14.4. Schemat elektryczny przetwornika analogowo-cyłrowego wykonanego na komparatorze analogowym
Rys. 14.5. Przebieg cyklu lądowania/ rozładowania kondensatora referencyjnego C
za j e g o p o m o c ą zrealizować przetwornik analogowo-cyfrowy. J e g o parametry nie są z p e w n o ś c i ą tak dobre j a k układów wyspecjalizowanych, czy przetwor ników z a w a r t y c h w strukturach mikrokontrolerów, ale są w zupełności wystar czające w wielu zastosowaniach. Schemat elektryczny i ogólną zasadę działa nia takiego przetwornika przedstawiono na r y s u n k a c h 14.4 i 14.5. K o n d e n s a t o r p o m i a r o w y C dołączono d o nieodwracającego wejścia kompa ratora a n a l o g o w e g o oraz - p o p r z e z opornik R - d o j e d n e g o z p o r t ó w mikro kontrolera ( n p . P D 4 ) . D o wejścia odwracającego komparatora jest doprowa dzony a n a l o g o w y sygnał m i e r z o n y . Cykl p o m i a r o w y rozpoczyna się od usta wienia s t a n u w y s o k i e g o na wyjściu P D 4 , w w y n i k u czego kondensator C za czyna się ł a d o w a ć przez o p o r n i k R d o napięcia zasilającego Vcc- W t y m sa mym momencie
m i k r o k o n t r o l e r powinien
uruchomić p o m i a r czasu
(po
wcześniejszym w y z e r o w a n i u rejestrów timera). L ą d o w a n i e przebiega zgod nie z zależnością:
V =V c
c c
(l-exp^~)
(14.1)
W m o m e n c i e , g d y napięcie n a kondensatorze osiągnie wartość mierzonego napięcia w e j ś c i o w e g o , na wyjściu komparatora nastąpi z m i a n a stanu. Fakt ten p o w i n i e n s p o w o d o w a ć z a t r z y m a n i e p o m i a r u czasu, który j a k widać bę dzie proporcjonalny
d o napięcia wejściowego. W rzeczy wistości
zmiana
stanu na wyjściu k o m p a r a t o r a najczęściej będzie wyzwalała funkcję prze chwytywania
Timeral,
czyli
zatrzaśnięcie
wyniku
w rejestrach
ICR1H
i I C R I L . 2 z a l e ż n o ś c i opisanej w z o r e m 14.1 wynika, że ładowanie konden satora nie p r z e b i e g a liniowo. Przeliczenie czasu na napięcie nie będzie więc łatwe. W p r a w d z i e mając d o dyspozycji mikrokontroler m o ż n a zależność tę zlinearyzować p r o g r a m o w o , lecz będzie się to wiązało z koniecznością za stosowania n i e m a ł y c h bibliotek matematycznych. Inna metoda, to stablicowa-
nie funkcji ładowania. W tym przypadku trzeba będzie z kolei zająć sporo miejsca w pamięci programu. Na rysunku 14.6 przedstawiono kilka oscylogram ó w rzeczywistego układu mierzącego na zasadzie ładowania kondensatora przez opornik. Oglądając te przebiegi zauważamy, że mniej więcej d o połowy napięcia Vrjc, ładowanie można uznać za liniowe. P o wprowadzeniu odpo wiednich ograniczeń dla napięcia wejściowego m a m y wiec kolejną metodę. Obliczeń dokonujemy stosując zwykłe przekształcenia liniowe b e z dołączania do programu bibliotek matematycznych. Zakładamy przy tym, ż e popełniany błąd jest do zaakceptowania. Cykl pomiarowy kończy się podaniem stanu nis kiego na wyjściu PD4, w wyniku czego kondensator jest rozładowywany przez rezystor R i niewielką oporność wyjściową portu P D 4 w tym stanie. W y k o r z y s t a n i e elementarnej wiedzy z fizyki p o m o ż e n a m w opracowaniu j e s z c z e j e d n e g o układu p o m i a r o w e g o . Jak p a m i ę t a m y ze szkoły, ładunek z g r o m a d z o n y w k o n d e n s a t o r z e jest proporcjonalny d o p o j e m n o ś c i tego kon densatora i napięcia panującego na nim. Z drugiej strony ładunek jest iloczy n e m prądu i czasu. Wykorzystując ten fakt uzyskujemy zależność I-t = U-C, z której w y n i k a wprost, że ładowanie kondensatora będzie m i a ł o charakter li niowy, jeśli tylko zostanie z a p e w n i o n a
stała wartość prądu. N a
płytce
Z L 1 A V R z a s t o s o w a n o właśnie takie rozwiązanie. R o l ę źródła p r ą d o w e g o pełnią tranzystory Q l , Q 2 i rezystor R l , pracujące w układzie lustra prądo w e g o . Prąd kolektora tranzystora Q l jest odzwierciedleniem prądu kolektora tranzystora Q 2 , a ten z kolei w y n i k a z wartości rezystora R l : V
I = cc-U Rl R 1
B E
P
(wzór 14.2)
Tranzystory p o w i n n y m i e ć j a k najbardziej zbliżone parametry. I d e a ł e m b y ł o b y , g d y b y były w y k o n a n e w tej samej strukturze p ó ł p r z e w o d n i k o w e j . O d p o wiednie elementy są d o s t ę p n e w handlu, j e d n a k z r e z y g n o w a n o z nich na rzecz popularnych tranzystorów, które m o ż n a kupić w k a ż d y m sklepie elekt r o n i c z n y m . K o n d e n s a t o r p o m i a r o w y C 5 j e s t dołączony d o wejścia nieodwra-
Rys. 14.6. Oscylogramy układu pomiarowego wykorzystującego ładowanie kondensatora prądem płynącym przez rezystor
Rys. 14.7. Oscylogramy układu pomiarowego wykorzystującego ładowanie kon prądowe cającego AINO (PBO). Jest o n ładowany stałym prądem ze źródła p r ą d o w e g o z b u d o w a n e g o z tranzystorów Q l , Q 2 . Z a l e ż n o ś ć napięcia n a kondensatorze w funkcji czasu określa w z ó r 14.3:
U
c
= ^
( w z ó r 14.3)
Jak w i d a ć j e s t to z a l e ż n o ś ć liniowa. W praktyce oczywiście nie jest tak ideal nie j a k n a papierze, ale błędy są d o przyjęcia (patrz rozdział 14.3.6). Mierzo ne n a p i ę c i e należy d o p r o w a d z i ć się d o wejścia A I N 1 ( P B l ) p o p r z e z (uwaga!) k o ń c ó w k ę 1 gniazda P O R T D . Tranzystor Q 3 (wraz z rezystorem R 5 ) , stero w a n y z wyjścia P D 4 u m o ż l i w i a szybkie rozładowania kondensatora C 5 . Pra cuje od n a s y c e n i a d o zatkania, j a k typowy klucz tranzystorowy. T a k zrealizo w a n y p r z e t w o r n i k będzie p r a c o w a ł niemal w całym zakresie napięć wejścio w y c h , t z n . od zera d o VQC- J e d n a k ze względu na n i e z n a c z n e pogorszenie charakterystyki dla dużych wartości napięcia wejściowego, celowe jest j e g o ograniczenie d o ok. 4,8 V przy zasilaniu 5 V . Oscylogramy przedstawione na r y s u n k u 14.7 pokazują j a k wygląda ładowanie kondensatora ze źródła prądo w e g o w rzeczywistym układzie (na płytce Z L 1 A V R ) . Widać wyraźną poprawę liniowości ładowania kondensatora w porównaniu z wcześniej opisaną metodą.
14.1.10. Programowanie mikrokontrolera w systemie (ISP) W p u n k c i e 11.4.2 o p i s a n o s z e r e g o w e p r o g r a m o w a n i e pamięci Flash mikro kontrolera. W y k o r z y s t y w a n y jest d o tego celu interfejs S P I , zaimplemento 0
w a n y w w i ę k s z o ś c i m i k r o k o n t r o l e r ó w A V R . D w u k i e r u n k o w a transmisja sze r e g o w a j e s t p r o w a d z o n a liniami M O S I (wejście danych dla mikrokontrolera), M I S O (wyjście d a n y c h ) i S C K (zegar synchronizujący transmisję). M i k r o kontroler u m i e s z c z o n y n a płytce uruchomieniowej m o ż e b y ć p r o g r a m o w a n y za p o m o c ą
dowolnego
programatora
zgodnego
z t y m standardem (np.
Z L 2 P R G ) . P r z y k ł a d o w ą konstrukcję o p i s a n o w rozdziale 13.
Płytki d r u k o w a n e d o programatora Z L 2 P R G oraz j e g o doku mentacja są dostępne w i n t e r n e t o w y m sklepie W y d a w n i c t w a BTC {http://www.btc.pi/index.php7id-zV2prg).
S t o s o w a n i e programowania szeregowego j e s t b a r d z o w y g o d n e dla użytkow nika, g d y ż uwalnia g o od uciążliwego przekładania układu z podstawki zesta w u d o podstawki programatora. Ci Czytelnicy, którzy zdecydują się pisać swoje programy w B a s c o m i e , będą mogli robić to w j e d n y m , zintegrowanym środowisku. T r z e b a j e d n a k pamiętać, że p r o g r a m o w a n i e szeregowe nie jest d o k ł a d n y m odpowiednikiem p r o g r a m o w a n i a równoległego. D o t y c z y t o usta wiania bitów konfiguracyjnych
(fuse bits).
Z tego względu warto j e d n a k
z a m o n t o w a ć na płytce p o d s t a w k ę pod mikrokontroler. Programator Z L 2 P R G najwygodniej jest dołączyć b e z p o ś r e d n i o d o gniazda I S P 2 przez kabel w y k o n a n y z taśmy 10-przewodowej. Połączenia powinny b y ć w y k o n a n e 1:1 (styk 1 na styk 1, 2 na 2 itd.), zgodnie z r y s u n k i e m 14.8. Na płytce Z L 1 A V R znajduje się ponadto g n i a z d o ISP1 z g o d n e ze specyfika cją Atmela. Zawiera ono tylko 6 styków. W przypadku wykorzystywania te g o gniazda d o p r o g r a m o w a n i a mikrokontrolera, niezbędne będzie w y k o n a n i e kabla przejściowego. S p o s ó b j e g o w y k o n a n i a przedstawiono n a r y s u n k u 14.9. W t y m przypadku dioda sygnalizacyjna L E D 9 nie będzie działała, p o -
Gnlazdo programatora 2L2PRS
2
Gniazdo ISP2 na płytce ZL1AVR
1
Rys. 14.8. Kabel połączeniowy dla programatora ZL2PRG dołączonego do gniazda ISP2 Gniazdo programatora ZL2PRG
Gniazdo ISP1 napłyt«ZL1AVR
Rys. 14.9. Kabel przejściowy dla programatora ZL2PRG dołączonego do gniazda ISP1
n i e w a ż j e s t o n a s t e r o w a n a s y g n a ł e m występującym wyłącznie na j e d n y m ze styków I S P 2 , sygnalizując a k t y w n o ś ć interfejsu.
14.2. Ćwiczenia praktyczne 14.2.1. Ćwiczenie 1 Sterowanie portami mikrokontrolera w trybie wyjściowym - efekt węża świetlnego i biegnącego punktu na linijce diod LEO P o z n a w a n i e m i k r o k o n t r o l e r a r o z p o c z n i e m y o d kilku przykładów obsługi j e g o portów. W w i ę k s z o ś c i p r a k t y c z n y c h aplikacji będziemy się spotykać z po d o b n y m z a g a d n i e n i e m , w s z a k jeśli j u ż w urządzeniu zastosowano mikrokon troler, t o o c z y w i s t e jest, że m u s i w y k o n y w a ć j a k i e ś zadania. A w jaki sposób, j a k nie p o p r z e z porty w e / w y , m a on p r z e k a z y w a ć efekty swojej pracy d o reszty s y s t e m u ? W ć w i c z e n i u n a u c z y m y się ustawiać linię portów w tryb wyjściowy i z m i e n i a ć ich stan. Mikrokontroler
AT90S2313
wyposażono
w dwa
porty
we/wy:
PORTB
i P O R T D . M o g ą o n e p r a c o w a ć j a k o porty ogólnego przeznaczenia lub m o ż n a w y k o r z y s t y w a ć ich funkcje alternatywne (patrz rozdział 3.1). D o wysterowa nia diod ś w i e c ą c y c h skorzystamy z ich p o d s t a w o w y c h możliwości. Porty m i k r o k o n t r o l e r ó w A V R są obsługiwane p r z e z trzy rejestry
umieszczone
w przestrzeni w e / w y . U ż y c i e portu p o w i n n o być p o p r z e d z o n e o d p o w i e d n i m s k o n f i g u r o w a n i e m go, najlepiej w e wstępnej fazie programu. Poszczególne linie p o r t ó w m o g ą b y ć i n d y w i d u a l n i e ustawiane j a k o wejściowe lub wyjścio we. D o k o n u j e się tego p o p r z e z wpis odpowiednich wartości d o rejestru kie runku (np. d l a portu B jest t o D D R B ) . W p i s a n i e „ 1 " na daną pozycję ozna cza, że o d p o w i a d a j ą c e jej w y p r o w a d z e n i e portu będzie p r a c o w a ł o j a k o wyj ściowe. A n a l o g i c z n i e „ 0 " konfiguruje port j a k o wejściowy (patrz następne ćwiczenia). Linijka diod L E D na płytce uruchomieniowej jest dołączona bez pośrednio d o portu B . Jak p a m i ę t a m y , porty mikrokontrolerów A V R mają wystarczającą wydajność prądową d o ich wysterowania. A b y zaświecić wy-
Ź r ó d ł o w e i w y n i k o w e wersje p r o g r a m ó w d o ć w i c z e ń przedsta w i o n y c h w dalszej części książki są dostępne na stronie interne towej W y d a w n i c t w a B T C
(http:/Avww.brc.pi?id~avr).
braną diodę należy o d p o w i e d n i e wyjście portu ustawić w stanie niskim, czyli wpisać „ 0 " na odpowiednią pozycję rejestru P O R T B . Ustawienie linii w sta nie w y s o k i m powoduje zgaszenie L E D - a . Oczywiście dołączenie diod Świe cących w niniejszym ćwiczeniu jest p o d y k t o w a n e tylko chęcią pokazania „ n a m a c a l n e g o " efektu sterowania portami. N a wyjściach portu występują napięcia o wartościach, które umożliwiają współpracę mikrokontrolera ze z w y k ł y m i układami cyfrowymi. J e d y n e na c o trzeba ewentualnie zwrócić u w a g ę , to upewnienie się o kompatybilności układów zasilanych r ó ż n y m i napięciami, gdyż coraz powszechniejsze stają się układy zasilane napięciem n p . 3,3 V. Niektóre układy występują j u ż tylko w wersjach niskonapięciowych. W takich przypadkach m o ż e okazać się nie zbędne stosowanie odpowiednich interfejsów. Przykład z d i o d a m i L E D m a j e s z c z e j e d e n praktyczny walor. W wielu aplikacjach w y m a g a n e jest galwa niczne odizolowanie systemu mikroprocesorowego
od
współpracujących
z n i m urządzeń. Jeśli w y m i a n a informacji dotyczy sygnałów cyfrowych, naj prostszą
metodą zrealizowania separacji jest zastosowanie
transoptorów,
a sterowanie nimi, to przecież nic innego j a k gaszenie i zapalanie diod L E D . Podobnie jest z przełączaniem o b w o d ó w dużej m o c y za pomocą optotriaków lub optoprzekaźników. Sterowanie portu m o ż n a zrealizować poprzez wpisanie całego bajtu o odpo wiedniej wartości lub poprzez manipulowanie pojedynczymi bitami. W j ę z y ku C realizuje się to instrukcjami np.: PORTB-0x0£; sbi(PORTB,5); cbi(PORTB,7);
//wyprowadzenia PB7...PB4 w stanie "0", PB3...PB0 //wlstanie "1". //ustaw bit 5 portu B w stanie wysokim ("l") //bez zmiany pozostałych //ustaw bit 7 portu B w stanie niskim ("0") //bez zmiany pozostałych
D o sterowania i n d y w i d u a l n y m i bitami portu m o ż n a również stosować bar dziej naturalny zapis. Przykład będzie podany w ćwiczeniu 9.
Aktualne wersje kompilatora A V R - G C C pozwalają, a na wet wymagają
stosowania zapisu np.
PORTB=wartość.
W wersjach wcześniejszych wymagane było użycie makra outp(wartość,
port).
Stany wyjść portu sterującego diodami świecącymi w t y m ćwiczeniu są zmieniane cyklicznie. C z a s cyklu wyznaczony jest na s z t y w n o za pomocą funkcji c z e k a j . Jest to funkcja uniwersalna, w zależności od wartości argu-
menru funkcji
pt
generowane
W programie z listingu
m o ż e b y ć opóźnienie o różnej
długości.
1 4 . 1 funkcja ta j e s t w y w o ł y w a n a z parametrem
p c z e k a j . Jest to z m i e n n a t y p u u n s i g n e d l o n g , inicjowana w miejscu de klaracji w a r t o ś c i ą 1500. Program realizujący p r z e d s t a w i o n e zadanie znajduje się na l i s t i n g u 1 4 . 1 . N a leży s k o m p i l o w a ć p r o g r a m cwiczl.c
i z a p r o g r a m o w a ć mikrokontroler z z e
stawu Z L 1 A V R plikiem w y n i k o w y m
cwiczl.hex.
Konfiguracja płytki Z L 1 A V R : • z w o r k a J 3 w pozycji 1-2, z w o r k a J 4 w pozycji 2-3 - dołączony oscylator wewnętrzny, • z w o r k a J P I z w a r t a - g l o b a l n e włączenie diod L E D , • zworki Z W _ P O R T B z w a r t e (wszystkie) - włączone wszystkie diody L E D , • położenie p o z o s t a ł y c h z w o r e k nieistotne (np. rozłączone). List. 14.1. Program do ćwiczenia 1
/* Ćwiczenie 1 - sterowanie portami w trybie wyjściowym V /* Efekty świetlne na linijce LED-ów
*/
/* J . D . '2003 l*+***+»»«******.*.***********«*********»***•»**»******•*•/
*/
ttinclude unsigned long pczekaj=1500; void czekaj(unsigned long pt) //funkcja opóźnienia t unsigned char tpl; £or(;pt>0;pt--) for(tpl=255;tpl!=0;tpl--);
int main(void)
//program główny
unsigned char ledy,i,licznik; DDRB=0xff; while(l)
//konfiguracja wszystkich wyprowadzeń //portu B w trybie wyjścia //nieskończona pętla główna programu
//efekt węża for Uicznik=0;licznik<10;licznik++) //liczba powtórzeń efektu PORTB=0xff; czekaj(pczekaj); for(i=0;i<8; cbi(PORTB,i); czekaj(pczekaj};
//wygaś LED-y //pętla zmieniająca fazę efektu //wysteruj
(zapal) pojedynczego LED-a
f o r ( i = 0 ; i < 8 ; / / p ę t l a zmieniająca fazę efektu < Sbi(PORTB,i}; //wysteruj (zgaś) pojedynczego LED-a czekaj (pczekaj) ,>
}
//efekt biegnącego punktu PORTB=0xff; // wygaś LED-y for(licznik=0;licznik<10;licznik++) //liczba powtórzeń efektu <
for(ledy=0xfe;ledy!=0xff ;ledy=(ledy«=l) +1) //pętla zmieniająca fazę efektu {
PORTB=ledy; czekaj(pczekaj);
//wysterowanie LED-ów zgodne z wartością //zmiennej ledy //opóźnienie
) )
) )
14.2.2. Ćwiczenie 2 Wykorzystanie timera do odmierzania czasu w trybie odpytywania (generator przebiegu prostokątnego o częstotliwości 1 kHz) W p o p r z e d n i m ćwiczeniu d o odmierzania czasu trwania k a ż d e g o cyklu efek tu b y ł a w y k o r z y s t y w a n a funkcja c z e k a j ( p t ) . U z y s k i w a n i e opóźnienia od b y w a ł o się na d r o d z e p r o g r a m o w e j . Czas opóźnienia jest zależny od wartości zmiennej p t , j e d n a k ż e dokładne j e g o określenie w normalnie stosowanych d o tego celu jednostkach (s, m s , tts) w o g ó l n y m przypadku jest d o ś ć kłopotli w e . M o ż n a oczywiście zadać sobie trud i policzyć liczbę cykli zegarowych C P U potrzebnych na w y k o n a n i e tej funkcji dla określonego parametru, jed nak nietrudno z a u w a ż y ć , że precyzja odmierzania czasu nie będzie zbyt wy soka. P o zastosowaniu rezonatora k w a r c o w e g o o innej częstotliwości niż przewidziana, odmierzany czas będzie miał inną wartość. N a szczęście w e wszystkich mikrokontrolerach A V R jest z a i m p l e m e n t o w a n y c o najmniej j e den
timer,
który
jest
nieodzowny
w takich
sytuacjach.
W przypadku
A T 9 0 S 2 3 1 3 użytkownik m a d o dyspozycji j e d e n timer/licznik 8-bitowy i j e den 16-bitowy (patrz rozdział 5). O b y d w a timery są w y p o s a ż o n e w preskalery rozszerzające możliwości p o m i a r o w e p o p r z e z wstępny podział odmierza n y c h c z a s ó w (impulsów). W ćwiczeniu 2 j e s t wykorzystany Licznik/TimerO. N a s z e zadanie polega na wygenerowaniu fali prostokątnej o częstotliwości 1 k H z . Zadanie wydaje się dość proste. T i m e r musi odmierzać czas równy
połowie o k r e s u g e n e r o w a n e g o przebiegu ( 5 0 0 |xs). Po odmierzeniu
tego
czasu m i k r o k o n t r o l e r m u s i z m i e n i ć stan portu wyjściowego na przeciwny, p o c z y m u r u c h o m i ć o d m i e r z a n i e kolejnego opóźnienia. A b y z m i n i m a l i z o w a ć błąd wynikający z n i e z e r o w e g o czasu reakcji na wykrycie odliczenia półokresu, tuż p o wystąpieniu t e g o zdarzenia, d o rejestru TCNTO zostaje wpisa na wartość o d p o w i a d a j ą c a odmierzeniu ż ą d a n e g o czasu. T y m s a m y m rozpo czyna się p o m i a r kolejnego półokresu. D o p i e r o p o t y m następuje zmiana sta nu wyjścia ( p o s p r a w d z e n i u d o d a t k o w e g o w a r u n k u ) . G e n e r o w a n y przebieg będzie w y p r o w a d z o n y n a wyjście PBO. Port B zostanie w całości skonfiguro wany j a k o w y j ś c i o w y . Największą trudnością w t y m ćwiczeniu będzie obli czenie w a r t o ś c i , którą należy w p i s y w a ć d o rejestru TCNTO (nazwiemy ją sta lą czasową, c h o ć to trochę nieprecyzyjne określenie) oraz parametru preska lera w p i s y w a n e g o d o rejestru TCCRO. Wartości p o w y ż s z e p o w i n n y b y ć tak dobrane, by z a p o m o c ą t i m e r a m o ż l i w e było odmierzanie czasu r ó w n e g o do kładnie 5 0 0 n s . P r z y p o m n i j m y , że timer/licznik TCO zgłasza fakt przepełnie nia (przejścia od stanu S F F d o stanu $00) poprzez ustawienie flagi T O V 0 w rejestrze T I F R . Inkrementacja wartości timera/licznika następuje zgodnie z u s t a w i o n y m p a r a m e t r e m preskalera ( t a b l i c a 5.1). P r z y k ł a d o w o , jeśli d o re jestru T C C R O zostanie w p i s a n a wartość 2, to inkrementacja będzie następo wała c o 8 o k r e s ó w oscylatora s y s t e m o w e g o . Przy rezonatorze k w a r c o w y m o częstotliwości 8 M H z , k w a n t odmierzanego czasu będzie w i ę c równy 1 u s . Zwiększenie stopnia podziału niestety doprowadzi d o uzyskania n i e w y g o d nych wartości o d m i e r z a n e g o czasu, utrudniających lub w r ę c z uniemożliwia jących u z y s k a n i e z a ł o ż o n e g o czasu. P r z y k ł a d o w o dla stałej czasowej równej 500 u s przy k w a r c u 8 M H z , liczba zliczanych o d c i n k ó w czasu (L) byłaby równa: - dla T C C R O = 1 ( C K / l ) ,
At = 125 ns,
L = 4000,
- dla T C C R O = 2 ( C K / 8 ) ,
At = 1 u s ,
L = 500,
- dla T C C R O = 3 ( C K / 6 4 ) ,
At = 8 ns,
L = 62,5,
- dla T C C R O = 4 ( C K / 2 5 6 ) ,
At = 3 2 ns,
L = 15,625,
- dla T C C R O = 5 ( C K / 1 0 2 4 ) ,
At = 128 u s ,
L = 3,90625.
Przyjęcie opcji z niecałkowitą wartością L będzie równoznaczne z zaakcepto waniem p o m i a r u czasu obarczonego p e w n y m błędem. W ogólnym przypadku może się o k a z a ć , że uzyskanie całkowitych wartości L nie będzie możliwe. W ó w c z a s należy wybrać taką opcję, która da najmniejszy błąd pomiaru czasu. Zgodnie z p o w y ż s z y m , d o naszego ćwiczenia najlepiej nadają się d w a pierwsze przypadki. O b a mają j e d n a k tę wadę, że wymagają zliczania więcej niż 256 k w a n t ó w czasu, c o przy 8-bitowym rejestrze TCNTO jest niewykonalne. M o ż na zastosować timer/licznik T C 1 , ale może on b y ć przydatny d o innych zadań.
P o z o s t a w m y więc g o w rezerwie, wybierzmy opcję drugą, a problem zliczenia 5 0 0 impulsów rozwiążemy częściowo na drodze programowej. Zliczanie zosta nie podzielone na d w a etapy (2-krotne zliczenie 2 5 0 impulsów). Jak pamięta m y timery/liczniki mikrokontrolerów A V R liczą w przód. Timer/licznik TCO m o ż e zliczać modulo 2 5 6 (czyli liczyć od 0 d o 255). Jeśli liczba zliczanych im p u l s ó w ma być mniejsza, należy przed
rozpoczęciem
zliczania d o rejestru
TCNTO wpisać odpowiednią różnicę; TCNTO = 2 5 6 - t . W naszym ćwiczeniu, zgodnie z powyższymi założeniami t = 250. Rejestr TCNTO powinien więc być inicjowany wartością: TCNTO = 2 5 6 - 2 5 0 = 6 . W p r o g r a m i e zdefiniowano stałą t a u O (dyrektywą kompilatora
#define),
która będzie w p i s y w a n a d o rejestru TCNTO na początku programu i każdora z o w o , p o ustawieniu flagi przepełnienia T O Y 0 . W przypadku zastosowania rezonatora o innej częstotliwości łub z m i a n y częstotliwości generatora, nale ży tę stałą przedefiniować zgodnie z p o w y ż s z y m i w s k a z ó w k a m i . K a ż d o r a z o w e przekręcenie timera TCO powoduje predekrementację zmiennej l i c z n i k (ustawianej wstępnie na wartość 2) i sprawdzenie, czy osiągnęła o n a wartość 0. Jeśli tak, to znaczy, że zostało odliczone liczba 5 0 0 k w a n t ó w czasu, w w y n i k u czego powinien b y ć zmieniony stan wyjścia PBO. O d b y w a się to p o przez w y k o n a n i e operacji E x - O R na bicie 0 rejestru P O R T B , a następnie z m i e n n e j l i c z n i k n a d a w a n a j e s t p o n o w n i e wartość 2. Z a s t o s o w a n i e działa nia E x - O R p o z w a l a na selektywną zmianę j e d n e g o bitu w c a ł y m rejestrze, pozostałe mogą przecież b y ć w y k o r z y s t y w a n e d o i n n y c h celów. Jeśli flaga T O V 0 j e s t k o n t r o l o w a n a p r o g r a m o w o , t o trzeba pamiętać o j e j „ r ę c z n y m " zerowaniu p o wystąpieniu przepełnienia. Pamiętajmy r ó w n i e ż , że flagę tę zeruje się poprzez wpisanie bitu o wartości „ 1 " na pozycji T O V 0 , stąd w programie pojawia się instrukcja T I F R = l « T O V 0 . Przy okazji warto porównać, jak kompilator przetłumaczy cję w h i l e ( b i t _ i s „ c l e a r ( T I F R , T O V 0 ) )
użytą
zamiast
instruk instrukcji
w h i l e ( ( i n p ( T I F R ) & 0 x 0 2 ) ! = 0 x 0 2 ) . J a k widać, czasami trud twórców kompilatora wydaje się być zupełnie zbędny. Proponowane ułatwienie (wątpli w e zresztą) powoduje zarówno zwiększenie długości kodu, j a k również czasu j e g o wykonania. W konkretnym przypadku, w pierwszej wersji pętla wykonuje się 0,88/0,75 tis (dla warunku spełnionego/nie spełnionego), w drugim nato miast czasy te wynoszą 0,5/0,38 u s . Okazuje się, że nawyki nabyte podczas pi sania programów w asemblerze czasami są bardzo przydatne nawet podczas pi sania programów w językach wysokiego poziomu. P r o g r a m realizujący p r z e d s t a w i o n e zadanie znajduje się na l i s t i n g u 14.2. Na leży s k o m p i l o w a ć p r o g r a m cwiczl.c s t a w u Z L 1 A V R plikiem w y n i k o w y m
i z a p r o g r a m o w a ć mikrokontroler z ze cwicz2.hex.
Konfiguracja płytki Z L 1 A V R : • z w o r k a J 3 w p o z y c j i 1-2, z w o r k a J 4 w pozycji 2 - 3 - d o ł ą c z o n y o s c y l a t o r wewnętrzny, • zworka Z W _ P O R T B
z w a r t a w pozycji
15-16 -
wyjście
generatora na
gnieździe P O R T B - 8 , • p o ł o ż e n i e p o z o s t a ł y c h z w o r e k n i e i s t o t n e ( n p . rozłączone). List 14.2. Program do ćwiczenia 2 /* Ćwiczenie 2 - Obsługa timeraO w trybie odpytywania /* Generator fali prostokątnej 1kHz /* J.D. '20(13
*/ */ ./
#include Sdefine tauO 6;
//stała czasowa dla 1kHz @8MHz
int main(voidł t unsigned char liczniki; DDRB=0xOl; TCNTO^tauO; TCCR0=2;
//wyjściem generatora będzie PBO //wpisz stałą czasową dla zadanego interwału //timerO będzie pracował z preskalerem Fosc/8
while(l) { while(Unp(TIFR)&0xO2)!=0x02); //czekaj na ustawienie flagi //TOV0 (przekręcenie 1 icznika) TCNT0=tau0; //wpisz stalą czasową if(--licznik==0) //zmiana polaryzacji wyjścia wymaga //2-krotnego przekręcenia się licznika (
PORTB"=0x01; licznik=2;
//zmień stan wyjścia //odśwież stan licznika
}
TIFR=l«TOV0; //kasuj flagę przepełnienia }
>
14.2,3. Ćwiczenie 3 Sterowanie portami mikrokontrolera w trybie wejściowym, wykorzystanie timera do odmierzania czasu z wykorzystaniem przerwań - obsługa przycisków dołączonych do portów mikrokontrolera W p o p r z e d n i m ć w i c z e n i u n a u c z y l i ś m y się k o r z y s t a ć z timera. K o n t r o l a p r z e pełnienia o d b y w a ł a się p o p r z e z p r o g r a m o w e s p r a w d z a n i e flagi T O V 0 . Z a uważmy j e d n a k , ż e jest to marnotrawstwo czasu mikrokontrolera.
Zamiast
p r z e b y w a ć w pętli sprawdzania flagi T O V 0 przez większą część programu, procesor m ó g ł b y zająć się innymi zadaniami. Ale tu z kolei całkiem prawdo p o d o b n a mogłaby b y ć sytuacja, w której jednostka centralna, zajęta innymi zadaniami zupełnie zaniedbałaby sprawdzanie flagi T O V 0 , co z kolei prowa dziłoby d o p o w s t a w a n i a dużych błędów pomiaru czasu. W niektórych aplika cjach j e s t to rozwiązanie nie do przyjęcia. Z pomocą przychodzą przerwania. W mikrokontrolerach A V R niemal każdy ich blok funkcjonalny m o ż e być źródłem przerwań (patrz rozdział 4.10). Przerwania umożliwiają obsługę asynchronicznych zdarzeń przez sekwencyj nie wykonywany program. Sygnał zgłoszenia przerwania może wystąpić w do wolnym miejscu programu. W tym momencie C P U zawiesza wykonywanie ak tualnego kodu (kończąc w y k o n y w a n y rozkaz) i przechodzi do specjalnej pro cedury obsługi przerwania. Zawsze kończy się ona rozkazem RETI, który „zaciera" ślady p o przerwaniu (może np. ustawiać flagę I w rejestrze S R E G , jeśli zezwolono wcześniej na przerywanie w y k o n y w a n i a procedury obsługi). Następnie k o n t y n u o w a n e jest w y k o n y w a n i e programu od miejsca, w którym został on zawieszony. P r o c e d u r a obsługi przerwania j e s t ściśle związana z j e g o źródłem (każdy blok funkcjonalny zgłaszający przerwanie m a własną p r o cedurę obsługi). M o ż l i w e przypadki zostaną opisane w n a s t ę p n y m ćwiczeniu. W t y m przykładzie przerwania zostaną wykorzystane d o obsługi timera od mierzającego chwile, w których będą testowane stany d w ó c h przycisków do łączonych d o portu D mikrokontrolera. Obsługa przycisków (klawiatury) nie jest tak banalna, j a k m o g ł o b y się w y d a w a ć . Problemy są związane z drganiami styków występujących w trakcie przełączeń. W zależności od konstrukcji mechanicznej i materiału, z jakiego są zrobione styki, drgania te mogą trwać dłużej lub krócej, ale występują pra w i e zawsze, zwłaszcza w starszych konstrukcjach. M o ż n a przyjąć, że czas drgań wynosi kilkadziesiąt milisekund. Czasami stosowane są d o ich gasze nia kondensatory. W urządzeniach, w których nie m a mikroprocesora, d o lik widacji drgań używa się przerzutników R S . Jeśli j e d n a k w urządzeniu zasto s o w a n o mikrokontroler, to najprostszą metodą eliminacji drgań jest odpo wiednia obsługa p r o g r a m o w a . Przyciski będą najczęściej dołączane d o portu wejściowego tak, aby zwierały g o do m a s y . Jest to p o d y k t o w a n e tym, że w mikrokontrolerach A V R możliwe jest skonfigurowanie wejścia z w e w n ę t r z n y m podciąganiem „ d o g ó r y " (do plusa zasilania -pull-up).
N i e jest wtedy
w y m a g a n y zewnętrzny rezystor podciągający. A b y zrealizować takie usta wienie, należy do rejestru kierunku, np. D D R D , na o d p o w i e d n i m bicie (pa miętamy, że poszczególne w y p r o w a d z e n i a j e d n e g o portu m o g ą b y ć konfigu r o w a n e niezależnie j a k o wejściowe lub wyjściowe) wpisać wartość „ 0 " , a d o
przyctsk
rejestru P O R T D wpisać wartość „1". N i e T
r
ii n i n iti n a Pi
wpisanie j e d y n k i d o P O R T D spowoduje, że wejście
pozostanie bez
podciągania
i p r a w i d ł o w y odczyt przełącznika nie bę wciśnięty^ przycisk i zwolniony
dzie m o ż l i w y (chyba, że zostanie zastoso w a n e podciąganie zewnętrznymi rezysto rami). Czytanie portów wejściowych od b y w a się poprzez rejestry P I N B (dla portu B ) i P I N D (dla portu D ) . Jeśli przycisk bę dzie zwolniony, rezystor podciągający bę
Rys. 14.10. Dobranie odpowiedniej
dzie w y m u s z a ł na wejściu stan wysoki.
częstotliwości skanowania klawiatury
Z w a r c i e przycisku spowoduje odczytanie
pozwala na uniknięcie błędów odczy tu: a) błędnie zinterpretowano trzy naciśnięcia klawisza, b) prawidłowo
stanu niskiego. W ćwiczeniu zostaną wy korzystane klawisze S W 1 i S W 4 dołączo
zinterpretowano jedno naciśnięcie
ne o d p o w i e d n i o d o portów PDO i P D l .
klawisza
Obsługa
klawiszy
będzie
polegała
na
o k r e s o w y m s p r a w d z a n i u ich stanu, a następnie podejmowaniu odpowiednich działań. C z a s d r g a ń s t y k ó w s z a c o w a n y na kilkadziesiąt milisekund, to dla mikrokontrolera - s z c z e g ó l n i e A V R - niemal wieczność. Jest on zdolny d o 0 wiele c z ę s t s z e g o p r ó b k o w a n i a klawiatury. Jeśli jej sprawdzenie nastąpi kil kukrotnie w c z a s i e drgań s t y k ó w , to m o ż e się okazać, że zamiast j e d n e g o wciśnięcia p r z y c i s k u , zostanie wykryte wielokrotne naciśnięcie. Najprostszą metodą na u n i k n i ę c i e takiej sytuacji jest o d p o w i e d n i o rzadkie próbkowanie klawiatury ( r y s u n e k 14.10) l u b odczekiwanie określonego czasu p o wykry ciu zmiany s t a n u przycisku. D o p i e r o p o j e g o upływie m o ż n a będzie p o n o w nie o d c z y t a ć stan przycisku. W ćwiczeniu przyciski będą służyły d o inkrementacji (SW1) i dekrementacji (SW4) 8 - b i t o w e g o licznika, k t ó r e g o stan w postaci binarnej będzie wyświet lany n a linijce diod L E D . W y p r o w a d z e n i a PDO d o P D 4 portu D zostaną skonfigurowane j a k o w e j ś c i o w e , natomiast port B i P D 6 i P D 5 j a k o wyjścio we. Stan k l a w i s z y b ę d z i e s p r a w d z a n y w procedurze obsługi przerwania od ti mera TCO, o d m i e r z a j ą c e g o m o m e n t y próbkowania. Zakładamy, że sprawdza nie będzie n a s t ę p o w a ł o c o ok. 130 m s . Taki czas pozwoli skutecznie elimino wać drgania s t y k ó w i j e d n o c z e ś n i e spowoduje, że możliwa będzie prosta m e toda z r e a l i z o w a n i a przycisku z funkcją autopowtarzania. Dzięki temu, nie bę dzie p o t r z e b n e z w a l n i a n i e klawisza w celu p o w t ó r z e n i a działania z nim zwią zanego. O d l i c z e n i e 130 m s przy kwarcu 8 M H z nie jest m o ż l i w e wprost, na wet przy n a j w i ę k s z y m stopniu podziału preskalera. W tej sytuacji należy wprowadzić d o d a t k o w ą zmienną, która będzie zliczała wejścia d o przerwania 1 dopiero p o osiągnięciu odpowiedniej liczby, będą p o d e j m o w a n e stosowne
działania. Biorąc p o d u w a g ę r o z w a ż a n i a z poprzedniego ć w i c z e n i a zostanie wybrany preskaler C K / 1 0 2 4 (TCCRO = 5), w i ę c będzie o d m i e r z a n y c z a s 128 u s . Jeśli przyjmiemy wpis d o rejestru T C N T O równy 2 4 7 , t o przerwania o d timera TCO będą g e n e r o w a n e c o t = ( 2 5 6 - 2 4 7 ) 128 u s = 1,152 m s . P o zwoli n a m to, niejako przy okazji, g e n e r o w a ć przebieg prostokątny o częstot liwości o k . 4 3 4 H z (f = l/(2-t)) n a wyjściu P D 6 (w celach c z y s t o edukacyj nych, dla zilustrowania, ż e j e d n o przerwanie m o ż e pełnić kilka z a d a ń ) . O b sługa klawiszy będzie w y m a g a ł a przy p o w y ż s z y c h założeniach 113-krotnego wejścia w procedurę obsługi przerwania timera. Liczba wejść b ę d z i e zliczana w zmiennej ł i c z t O . A b y ułatwić ewentualne e k s p e r y m e n t y , n a początku p r o g r a m u została zdefiniowana
(dyrektywą kompilatora
#define)
stała
v l i c z t O , która m o ż e b y ć wielokrotnie użyta w programie. Stała ta będzie określała częstotliwość próbkowania klawiatury, będąc j e d n o c z e ś n i e c z a s e m samopowtarzania klawisza. Wartość v l i c z t O żadnym jednostkom
fizycznym,
oczywiście n i e odpowiada
wynika j e d y n i e z p o w y ż s z y c h
kalkulacji.
Mierząc czas naciśnięcia klawisza ( n p . poprzez w p r o w a d z e n i e dodatkowej zmiennej) m o ż n a r ó w n i e ż zrealizować przycisk z efektem działania progre s y w n e g o . Klawisz taki mógłby zwiększać krok zliczania zmiennej licznik w zależności o d c z a s u przyciśnięcia. Z w o l n i e n i e klawisza przywracałoby krok domyślny. W j ę z y k u A V R - G C C procedury obsługi przerwań są w y r ó ż n i a n e specjalnymi n a z w a m i oraz s ł o w e m k l u c z o w y m S I G N A L lub I N T E R R U P T . W y k a z nazw p r z e r w a ń m o ż n a znaleźć w dokumentacji kompilatora. Procedury oznaczone s ł o w e m S I G N A L są w y k o n y w a n e przy z a b l o k o w a n y c h p r z e r w a n i a c h (1=0 w rejestrze S R E G ) . O d w r o t n i e jest w przypadku procedur ze s ł o w e m kluczo w y m I N T E R R U P T . P o d p r o g r a m obsługi przepełnienia timera TCO zaczyna się o d linii S I G N A L
(SIG_OVERFLOW0).
P r o g r a m realizujący p r z e d s t a w i o n e zadanie znajduje się n a l i s t i n g u 14.3. N a leży s k o m p i l o w a ć p r o g r a m cwiczS.c stawu Z L 1 A V R plikiem w y n i k o w y m
i z a p r o g r a m o w a ć mikrokontroler z z e cwicz3.hex.
Konfiguracja płytki Z L 1 A V R : • zworka J 3 w pozycji 1-2, zworka J 4 w pozycji 2-3 - dołączony oscylator wewnętrzny, • zworka J P 1 zwarta - globalne włączenie diod L E D , • zworki Z W _ P O R T B zwarte (wszystkie) - włączone wszystkie diody L E D , • z w o r k a J P 4 w pozycji 2-3 (włączenie klawiszy S W 1 i S W 4 ) , • z w o r k a J P 7 zwarta (włączenie klawisza S W 4 ) , • zworka J P 6 zwarta (włączenie klawisza S W 1 ) , • położenie pozostałych zworek nieistotne (np. rozłączone).
Ust. 14.3. Program do ćwiczenia 3
/
'
/* /* /* /•
/
Ćwiczenie 3 - sterowanie portami w trybie wejściowym Obsługa przycisków dołączonych do portów mikrokontrolera Licznik rewersyjny naciśnięć klawiszy J.D. '2003 ł ł ł ł
/ " * • * * *
*/ V +/ ./
/
(linclude 0include (tinclude <signal .h> łdefine tauO 247; łdefine vliczt0 113;
/
/
t
. K . « . . . . . . . t ł . t . . .
unsigned char licztO; unsigned char licznik;
//stała czasowa timeraO //stała wpisywana do licznika wejść do //do przerwania timeraO zmienne globalne »»»......»...... //Licznik wejść do przerwania timeraO. //Klawisz jest badany, gdy licztO=0 //Licznik rewersyjny, którego stan jest //wyświetlany na linijce LED-ów
void czekaj[unsigned long zt) //funkcja opóźnienia { unsigned char ztl; for ( , - zt>0; zt-) { for(ztl=255;ztl!=0;ztl-); }
)
SIGNAL
(SIG_OVERFLOWQ)
//obsługa przerwania //od przepełnienia timeraO
{
TCNT0=tau0; P0RTD =1< A
//odśwież stałą czasowa w TCNTO //zmień stan wy generatora 434Hz //czy już czytać klawisze? //tak //czytaj SW4 - <->
{
licznik--; >
else t if(bit_is_clear(PIND, PDO)) ( licznik+t;
//czytaj SW1 - <+>
)
PORTB -licznik;
//wyświetl stan licznika na LED-ach //negacja jest potrzebna, gdyz LEDY są //zapalane niskim stanem
Iiczt0=vliczt0;
//Odśwież stan licztO
3
} )
int main(void) i
Iiczt0=vliczt0; DDRD-0x6OPORTD=0xff
//PD0-PD4 jako wejściowy, PD5-PD6 - wy 7
;
'I -
podciąganiem
DDRB=Oxf£; PORTB=0x££; TIM$K=l«TOIE0; TCNTO=tauO; TCCRO^5; sei();
//PORTB - wy //LED-y wygaszone //zezwolenie na przerwania od TCO //wpisz stałą czasowa do TCNTO //preskaler XTAL/1024, //mierzony czas = I28(is //odblokuj globalne przerwania
while(l) PORTD"=0x20; czekaj(10000L),-
//generator
14.2.4. Ćwiczenie 4 „Hello World!", czyli sterowanie wyświetlaczem alfanumerycznym LCD 1 6 x 2 1 1 6 x 1 . Obsługa pojedynczego przycisku M o ż n a z a r y z y k o w a ć twierdzenie, że umiejętność sterowania wyświetlaczem alfanumerycznym L C D jest jedną z podstawowych dla k a ż d e g o , kto planuje konstruowanie własnych urządzeń. Swą popularność elementy te zawdzię czają m a ł y m w y m i a r o m , niewygórowanej cenie oraz możliwości wyświetle nia z n a k ó w alfanumerycznych (w t y m 8 definiowanych przez użytkownika). Ostatnia cecha staje się bardzo przydatna, g d y ż w handlu nie występują wer sje z polskimi znakami diakrytycznymi. P o d s t a w o w y interfejs wyświetlacza jest dość r o z b u d o w a n y , g d y ż w y m a g a zastosowania 8 linii danych (dwukie r u n k o w y c h ) , 3 linii sterujących, 2 zasilających, a także k o ń c ó w k i , d o której dołącza się potencjometr regulacji kontrastu (rozmieszczenie w y p r o w a d z e ń t y p o w y c h wyświetlaczy przedstawiono w dodatku E). Najczęściej j e d n a k wyświetlacz jest dołączany d o systemu mikroprocesoro w e g o poprzez uproszczoną wersję interfejsu, w której magistrala danych jest z r e d u k o w a n a d o 4 linii. Ponadto m o ż n a zrezygnować z odczytywania statusu wyświetlacza i p r z y j m o w a ć , że p o określonym czasie od przesłania instrukcji jest on gotowy d o dalszych operacji. Linię R / W należy w ó w c z a s na stałe do łączyć d o masy. Taki wariant zastosowano również na płytce Z L 1 A V R . Nie znacznie bardziej złożona obsługa programowa jest z r e k o m p e n s o w a n a p o z o stawieniem czterech d r o g o c e n n y c h w y p r o w a d z e ń portów mikrokontrolera do innych celów. Wyświetlacze alfanumeryczne są dostępne w wielu „rozmia rach". Najpopularniejszy jest chyba wariant z 2 liniami p o 16 z n a k ó w , który skutecznie wypiera jednolinijkową wersję z 16 znakami. Jeśli konieczne jest j e d n o c z e s n e wyświetlenie większej ilości danych, to m o ż n a sięgnąć po wyś w i e d a c z e z w i ę k s z ą liczbą wierszy i z n a k ó w n p . 4 x 1 0 , 4 x 1 6 , 2 x 2 0 , 4 x 2 0 ,
2 x 2 4 , 2 x 4 0 , 4 x 4 0 . Producenci z wielu krajów starają się z a c h o w a ć k o m p a t y bilność s w o i c h w y r o b ó w z e standardem, j a k i m stal się sterownik H D 4 4 7 8 0 (Hitachi). S z t u k a ta udaje się z mniejszym lub w i ę k s z y m p o w o d z e n i e m d o k o n a ć . Bywają natomiast p r o b l e m y z różnorodną obsługą wyświetlaczy jednoli nijkowych, wynikającą
z przyjętej organizacji danych. M o ż n a spotkać na
przykład w e r s j e 1-linijkowe emulujące wyświetlacze 2-linijkowe. T a k a właś nie wersja b ę d z i e opisana w dalszej części rozdziału. T r z e b a j e d n a k pamię tać, że p r z e d s t a w i o n e p r o c e d u r y m o g ą nie działać p r a w i d ł o w o z p e w n y m i ty pami w y ś w i e t l a c z y . W p o n i ż s z y c h opisach ograniczymy się tylko d o 4-bitow e g o t r y b u pracy interfejsu. W takim przypadku, dane są przesyłane do/z w y ś w i e t l a c z a poprzez linie D B 7 , D B 6 , D B 5 i D B 4 , które są dołączane na płytce Z L 1 A V R o d p o w i e d n i o d o P B 7 , P B 6 , P B 5 , P B 4 . Oczywiście podane p r z y p i s a n i e w y p r o w a d z e ń j e s t tylko p r z y k ł a d o w e .
R o z m i e s z c z e n i e w y p r o w a d z e ń typowych wyświetlaczy L C D 1 x 1 6 i 2 x 1 6 p r z e d s t a w i o n o w dodatku E.
W z a l e ż n o ś c i od potrzeb, w y ś w i e t l a c z m o ż e b y ć dołączany d o innych portów mikrokontrolera. N i e z b ę d n e będzie wtedy o d p o w i e d n i e zmodyfikowanie pro cedur obsługi. W p r z y p a d k u interfejsu 4-bitowego, linie DBO d o D B 3 szyny danych n a l e ż y pozostawić nie podłączone. Informacje p r z e k a z y w a n e d o wy świetlacza m o ż n a podzielić n a instrukcje sterujące oraz dane d o wyświetlenia lub zapisania w pamięci m o d u ł u . W drugą stronę m o ż n a odbierać informacje o stanie s t e r o w n i k a (jego
gotowości d o w y k o n a n i a kolejnych poleceń) lub
o d c z y t y w a ć w e w n ę t r z n ą p a m i ę ć modułu. W y b o r u rodzaju informacji d o k o nuje się p o p r z e z o d p o w i e d n i e ustawienie linii R S , kierunkiem przepływu ste ruje zaś linia R / W ( t a b l i c a 14.1). D a n e są s t r o b o w a n e s y g n a ł e m p o d a w a n y m na linię E ( r y s u n e k 14.11). Informacje o kształcie w y ś w i e t l a n y c h z n a k ó w sterownik czerpie z tzw. gene ratora z n a k ó w - C G - R O M (Character R O M (Read
Only Memory)
Generator
ROM). Jest to p a m i ę ć typu
p r o g r a m o w a n a na etapie produkcji - jej zawar
tość m o ż n a tylko o d c z y t y w a ć . K a ż d y z n a k składa się z matrycy 5 x 7 lub 5 x 1 0 W . U. 1. Możliwe stany linii sterujących RS i R/W RS 0
Operacja
0
Zapis instrukcji lub adresu do LCD
0
1
Zapis kodu znaku do wyświetlenia lub kodu definiowanego znaku (zapis w pamięci CGRAM)
1
0
Odcrvt wskaźnika zaietości wyświetlacza i bieżącego adresu wyświetlanego znaku
i
1
Odczyt pamięci DDRAM lut) CGRAM
•
\
i
OB0...7^
/
. )( DANE WAŻNE \
v )( DANE WAŻNE j{
Rys. 14.11. Przebiegi czasowe interfejsu wyświetlacza LCD: podczas zapisu (a) i odczytu [b) danych do/ze sterownika
p u n k t ó w . Znaki są w y b i e r a n e poprzez podanie o d p o w i e d n i e g o k o d u (w dużej części zgodnego z A S C I I ) . Umieszczenie znaku na ekranie wyświetlacza po lega na wpisaniu j e g o k o d u pod o d p o w i e d n i m adresem p a m i ę c i D D R A M (Display
Data
U|GA
RAM).
Tablice A S C I I oraz znaki wpisane d o pamięci C G - R O M typo wych
sterowników
alfanumerycznych
wyświetlaczy
LCD
przedstawiono w dodatku I.
Sterownik w y p o s a ż o n o w licznik, który m o ż e b y ć automatycznie inkremen towany lub d e k r e m e n t o w a n y p o przesianiu kodu znaku d o wyświetlenia. Dzięki temu nie trzeba określać j e g o adresu za k a ż d y m razem. Jest to bardzo przydatna cecha, gdyż n a ogól m a m y d o czynienia z s e k w e n c y j n y m zapisem danych d o wyświetlacza. Rozszerzeniem pamięci C G - R O M jest 64-bajtowa pamięć C G - R A M . M o ż n a w niej zdefiniować 8 własnych z n a k ó w w matrycy 5 x 7 , a ich kody są r ó w n e 0 d o 7. Z p r a w i d ł o w y m o p r o g r a m o w a n i e m wyświetlacza alfanumerycznego związa n e są d w a zagadnienia. Jest to prawidłowe zainicjowanie sterownika p o wy zerowaniu systemu m i k r o p r o c e s o r o w e g o oraz odpowiednie dla zastosowanej w n i m organizacji przesyłanie danych. P r z y k ł a d o w e adresowanie z n a k ó w Wyświeilacz 16x1 1 2 3 4 5
6
7
8
9
10 11 12 13 14 15 16
Linia 1 00 01 02 03 04 05 06 07 38 39 3A 3B 3C 3D 3E 3F Wvświellacz 16x2 1 2 3 4 5 Liniał
6
7
8
9
10 11 12 13 14 15 16
00 01 02 03 04 05 06 07 08 09 0A OB
oc
OD OE 0F
Unia 2 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F
Rys. 14.12. Adresowanie znaków w wyświetlaczach alfanumerycznych LCD
w w y ś w i e t l a c z a c h 16x1 i 16x2 p r z e d s t a w i o n o na r y s u n k u 14.12. P o k a z a n a j e s t tu wersja w y ś w i e t l a c z a 1 6 x 1 , który emuluje wyświetlacz 8 x 2 . Jak w i d a ć występuje p e w n a n i e d o g o d n o ś ć polegająca na przeskoku adresów na pozycji 9. W y ś w i e t l a c z taki p o w i n i e n być inicjowany j a k o 2-wierszowy. S t e r o w n i k H D 4 4 7 8 0 z e z w a l a n a określenie liczby wierszy (1 lub 2). M o ż n a się spotkać również z wyświetlaczami
1 6 x 1 , które p o w i n n y b y ć konfigurowane j a k o
1-linijkowe. A d r e s o w a n i e z n a k ó w jest w nich ciągle, tzn. od $ 0 0 d o SOF. Tab. 14.2. Zestawienie instrukcji sterownika HD44780 łntrokcja
Kod RS flW DB7 DB6 DB5 DB4 DB3 0B2 DBt DBG
1
Opis
Czas wykonania
WyczyśC wyświetlacz
0
0
0
0
0
0
0
0
0
Przesuń kursor do pozycji początkowej
0
0
0
0
0
0
0
0
1
Ustaw iryb wprowadzania znaków
0
0
0
0
0
0
0
1
l/D
S
Ustawienie kierunku i trybu przesuwania kursora w trakcie zapisu lub odczytu danych: l/D—0 - > zmniejszanie l/D=1 -> zwiększanie S = 0 - > wprawo
40 u.S
Ustaw tryb wyświetlacza wleczenie/wytyczenie
0
0
0
0
0
0
1
0
C
B
Ustawienie trybu: 0 = 0 - > wyłącz LCD 0 = 1 -> wtacz LC0 C = 0 - > wytączkursor
40 MS
Wyczyszczenie ekranu i przesunięcie kursora do pozycii początkowej (adres 0)
1,64 ms
Przesunięcie kursora do pozycji początko wej (adres 0). Pamięć DDRAM pozostaje niezmieniona.
1,64 ms
C=1 - > wtącz kursor B=0 -> wyłącz miganie kursora B=1 - > włącz miganie kursora Przesuń kursor/wskazanie 0
0
0
0
0
1
s/c
RA
*
Przesunięcie kursora i wyświetlanego tekstu o jedną pozycję: S/C=0 - > przesuwanie kursora S/C=1 - > przesuwanie wyświetlacza
40 ns
R/L=0-> w lewo R/L=l •> w prawo F
0
0
0
0
1
Ustaw adres pamięci CGRAM
0
0
0
1
ACG-adres CGRAM
Ustaw adres pamięci DDRAM
0
0
1
Wczytajflagę,zajętoścf adres
0
1
Zapisz (Sane do pamięci CG RA M/0 DRAM
1
0
Odczytai dane z pamięci CGRAWmORAM
1
1
* • wanosc bez znaczenia
DL
N
Ustaw funkcję
ADD - adres DDRAM
*
Konfigurowanie wyświetlacza: DL=0 - > interfejs 4-bitowy DL=1 •> interfejs 8-bilowy N = 0 - > 1 linia N»t->2H» F=0 - > matryca 5x7 f = 1 -> matryca 5x10
40 (iS
Ustawienie adresu CGRAM dla zapisu i odczytu tei pamięci
40 US
Ustawienie adresu DDRAM dla zapisu
40 us
I odczytu tej pamięci Czytanie flagi zajetoścl sterownika BF oraz licznika adresów dla pamięci DDRAM i CGRAM)
40 us
Zapisywana dana
Zapisanie danej do pamięci CGRAM lub DDRAM
40 us
Zapisywana dana
Odczytanie danej z pamięci CGRAM lut) DDRAM
BF
AC-adres DDRAM i CGRAM
40 us
W tablicy 14.2 zestawiono instrukcje sterujące
dla alfanumerycznego
wy
świetlacza L C D . Podano w niej binar ne kody rozkazów wraz z odpowiedni mi dla nich stanami linii sterujących oraz czasy wykonania rozkazów dla sterowników
taktowanych
250 kHz (typowo). Czas
zegarem wykonania
rozkazu jest szczególnie istotny dla aplikacji, w których nie sprawdza się wskaźnika gotowości sterownika. Możliwość pracy interfejsu wyświetla cza w trybie 4- lub 8-bitowym stwarza pewne
problemy
z jego
zainicjowa
niem. Dane przekazywane d o sterowni ka będą przecież przez niego interpreto wane inaczej dla szyny 4-bitowej, ina czej dla 8-bitowej. Wyświedacze są na ogól
wyposażone
w układ
zerujący,
który p o włączeniu zasilania ustawia sterownik w trybie 8-bitowym
zjedna
linią i matrycą 5 x 7 , ale p o sprzętowym zerowaniu
systemu
stan
sterownika
wyświetlacza może być dla mikrokon trolera nieokreślony. Układ
zerujący
wymaga ponadto odpowiedniej szyb kości narastania napięcia zasilającego. Jeśli warunek ten nie będzie spełniony, stan sterownika może być również nie określony. Z tego względu do zainicjo wania pracy zalecane jest wykonanie specjalnej sekwencji instrukcji (rysu n e k 14.13), gwarantującej prawidłowe skonfigurowanie
wyświetlacza,
bez
względu na jego początkowy stan. Ska la czasu na wykresie nie jest jednolita. Po włączeniu zasilania niezbędne jest odczekanie minimum 15 m s na wyko Rys. 14.13. Przykładowa sekwencja instrukcji inicjująca
nanie się procedury zerującej sterow
pracę sterownika wyświetlacza
nik L C D . Następnie należy 3-krotnie
przesłać d o wyświetlacza instrukcje $3x, p o c z y m instrukcję $2x (takty 1, 2, 3 i 4 na r y s u n k u 14.13). Zapis $2x i $3x oznacza, że młodsza część bajtu jest nieistotna. Kolejna instrukcja $28 zagwarantuje ustawienie wyświetlacza w try bie 4 - b i t o w y m z d w o m a liniami. Należy pamiętać, że zapis $ 2 8 oznacza prze sianie d o wyświetlacza kodu instrukcji w d w ó c h taktach $2x i $8x (rysunek 14.13). Z a ł o ż e n i e to będzie obowiązywało również w dalszej części opisu. Z dokumentacji w y ś w i e d a c z y wynika, że p o pierwszym takcie (przed rozpo częciem drugiego) należy odczekać m i n i m u m 4,1 m s , a p o drugim ok. 100 |As. W programie
z
listingu
14.4
dla
uproszczenia
przyjęto,
że
wszystkie
opóźnienia są r ó w n e ok. 5 m s . Kolejnymi instrukcjami zalecanymi w procedu rze inicjującej są $ 0 8 , $ 0 1 , $06 i SOF, przy c z y m ostatnie dwie zależą od tego, j a k m a b y ć skonfigurowany wyświetlacz (można j e odpowiednio modyfiko w a ć ) . T r z e b a zwrócić u w a g ę na dość długi czas w y k o n y w a n i a się instrukcji czyszczenia ekranu (1,64 ms). W programie uwzględniono pętlę opóźniającą p o k a ż d y m takcie, c o jest związane ze zrezygnowaniem z odczytu flagi goto wości ( B F ) sterownika. G d y b y j e d n a k program i połączenia interfejsu były do tego przystosowane, to odczyt gotowości wyświetlacza jest możliwy dopiero p o 13 takcie (rysunek 14.13). D o ćwiczenia 4 dołączono d w a oddzielne programy: wersja „a" - dla wyświetla czy 16x2 i wersja „ b " - dla wyświetlaczy 1 6 x 1 . Niektóre procedury są wspólne. Na początku zdefiniowano numery bitów, d o których dołączono linie R S i E. Z m i e n n e w i e r s z i k o l u m n a ułatwiają umieszczanie z n a k ó w w dowolnym miejscu na wyświetlaczu. Funkcja c z e k a j jest wykorzystywana d o odmierza nia czasu. Stalą t a u pozwala w przybliżeniu przeliczać argument funkcji na czas w milisekundach. Dokładność odmierzania czasu nie jest tu zbyt duża, ale wystarczająca. D o przesłania instrukcji dla sterownika wyświetlacza służy funkcja p i s z i l c d ( i n s t r ) , której argumentem jest kod instrukcji. W wy wołaniu podaje się g o w postaci bajtu, a procedura realizuje 2-taktowe przesła nie g o d o wyświetlacza. Podobnie działa funkcja p i s z d l c d ( d a n a ) , która przesyła sterownikowi daną d o wyświetlenia. W t y m przypadku dana to kod znaku, którego kształt jest zapisany w pamięci C G - R O M
lub
W programie uwzględniono również funkcję czyszczenia ekranu lcd()
CG-RAM. czysc-
i ustawiania kursora w określonych współrzędnych ekranowych
-
l c d x y ( w i e r s z , k o l u m n a ) . Za„bezpośrednie umieszczenie znaku na ekra nie o d p o w i a d a funkcja p i s z z n a k ( z n a k ) . Wywołuje ona omówioną wcześ niej p i s z d l c d ( d a n a )
i odpowiednio modyfikuje zmienne w i e r s z i k o
l u m n a . W praktyce będziemy mieli najczęściej d o czynienia z wyświetlaniem całych łańcuchów znakowych, nie pojedynczych znaków. Łańcuchy (string)
są deklarowane poprzez statyczne wskaźniki (poinłery)
takie
*tekstl,
* t e k s t 2 itd. wskazujące na dane umieszczone w pamięci programu. Ich za-
stosowanie zapobiega umieszczaniu łańcuchów znakowych przez kompilator w pamięci R A M , co przy niezbyt dużej wielkości tej pamięci mogłoby prowa dzić do kłopotliwych sytuacji w pewnych aplikacjach. Opisana metoda jest możliwa tylko dla tych mikrokontrolerów, które mają zaimplementowane roz kazy LPM lub ELPM. C h o ć zasadniczą część programu stanowią funkcje obsłu gi wyświetlacza, to uwzględniono w nim również krótką funkcję sprawdzającą naciśnięcie określonego klawisza - k l a w i s z ( p o z k l ) . Argument
pozkl
określa bit portu D, który będzie badany. Zauważmy, że zastosowana metoda jest w t y m przypadku d o przyjęcia, lecz nie zawsze będzie ona odpowiednia. Program zatrzymuje się b o w i e m w pęUi oczekującej na naciśnięcie klawisza, zawieszając ewentualne inne zadania. Po wykryciu tego faktu w y w o ł y w a n y jest podprogram odmierzający opóźnienie dla eliminacji drgań styków, p o c z y m oczekuje się zwolnienia klawisza. Wykorzystywany jest klawisz S W 4 . Programy pokazane na listingach 14.4 i 14.5 demonstrują
kilka
efektów
uzyskiwanych na wyświetlaczu L C D odpowiednio 16x2 i 1 6 x 1 . W y b r a n y program (w przypadku wyświetlacza 16x2 - cwicz4a.c, ku wyświetlacza 16x1 - cwicz4b.ć)
w przypad
należy s k o m p i l o w a ć i następnie zapro
g r a m o w a ć mikrokontroler z zestawu Z L 1 A V R o d p o w i e d n i m plikiem wyni k o w y m (cwicz4a.hex
lub
cwicz4b.hex).
Konfiguracja płytki Z L 1 A V R : • zworka J3 w pozycji 1-2, zworka J 4 w pozycji 2-3 - dołączony oscylator wewnętrzny, • zworka JP1 rozwarta - globalne wyłączenie diod L E D , • zworka J P 4 w pozycji 2-3 (włączenie klawiszy S W 1 i S W 4 ) , • zworka JP7 zwarta (włączenie klawisza S W 4 ) , • zworka J P 6 zwarta (włączenie klawisza S W 1 ) , • zworki Z W _ P O R T B z w a r t e w pozycjach 1-2, 3-4, 5-6, 7-8, 9-10, 11-12; położenie z w o r e k 13-14 i 15-16 jest nieistotne, • położenie pozostałych z w o r e k nieistotne (np. rozłączone), • d o gniazda L C D 1 należy dołączyć wyświetlacz alfanumeryczny 16x2 (dla programu cwicz4a.c)
lub 16x1 (dla p r o g r a m u
cwicz4b.ć).
Ust 14.4. Program do ćwiczenia 4a /* Ćwiczenie 4a - sterowanie alfanumerycznym wyświetlaczem /* 16x2 (16 znaków, 2 wiersze} /* - obsługa pojedynczego klawisza /* J . D . -2003 ttinciude (tinclude
<progmem.h>
LCD
*/ */ V */
linclude <stdlib.h> ttdefine lcd_rs 2 łdefine lcd_e 3 fdeline CR 0 x 0 a
//definicja bitu portu dla linii RS //definicja bitu portu dla linii E //definicja znaku CR (przejście do nowej //linii)
unsigned char wiersz=0; unsigned char kolumna=0; void czekaj(unsigned long pt) //funkcja opóźnienia I Hdefine tau 10.38 //przybliżony przelicznik argumentu na ms unsigned char tpl; for(;pt>0;pt--) ( for(tpl=255;tpl!=0;tpl--); ) )
void piszilcdlunsigned char instr) . //zapisz instrukcje sterującą do LCD (
cbi(PORTBjlcd_rs); sbi(PORTB,lcd_e); PORTB=(PORTB&0x0£>I(instr&0xf0); //przygotuj starszy pólbajt do LCD asm("nop"); //wymagane wydłużenie impulsu asm( "nop") ,asm(*nop"); cbi(PORTB,lcd_e); //impuls strobujący czekaj(10L); //czekaj na gotowość LCD ok. lOOus sbi(PORTB,lcd_e); PORTB= (PORTBS.0x0f) I ( (instr&0x0f ) « 4 ) ; //przygotuj młodszy półbajt do LCD asm(*nop") asm("nop") asm("nop") cbi(PORTB,lcd_e); //impuls strobujący czekaj(10L); //czekaj na gotowość LCD ok. lOOus )
void piszdlcdlchar dana) //zapisz daną do LCD 1 sbi(PORTB,lcd_rs); sbi(PORTB,lcd_e); PORTB=(PORTB&0x0f)I(dana&0x£0); //przygotuj starszy półbajt do LCD asmCnop-); //wymagane wydłużenie impulsu asm("nop*); asm("nop*); cbi(PORTB,lcd_e); //impuls strobujący czekaj(10L); //czekaj na gotowość LCD sbi(PORTB,lcd_e}; PORTB=(PORTBŁ0x0f) I < (dana&0x01) « 4 ) ; //przygotuj młodszy poibajt do L<-L> asm("nop") asm("nop") asm("nop"), , cbi(PORTB,lcd « ) ; //impuls strobu ący czekaj(10L); //czekaj na gotowość LCD 3
)
void czysclcd(void) { piszilcd(0x01); czekaj {1.64*tau) ,wiersz=0; kolumna=0;
//czyść ekran //polecenie czyszczenia ekranu dla //kontrolera LCD //rozkaz 0x01 wykonuje się I.64ms
)
void piszznak{char znak}
//procedura umieszcza znak na //wyświetlaczu
{ piszdlcd(znak} ; if(*+kolumna==16)
//wyświetl znak na LCD //czy bieżąca kolumna mieści się na //wyświetlaczu?
kolumna=0; if (nwiersz==2)
//jeśli nie, to ustaw początkową... lii przejdź do nowego wiersza
{
wiersz=0;
//jeśli nowy wiersz jest poza //wyświetlaczem, ustaw początkowy
)
void lcdxy(unsigned char w, unsigned char k) //ustaw współrzędne kursora <
piszilcdt(w*0x40*k) 10x80};
//standardowy rozkaz sterownika LCD //ustawiający kursor w określonych //współrzędnych
>
void pisztekst(char *tekst)
//pisz tekst na LCD wskazywany przez //"tekst
< char zn; char nr=0; while(l) { //pobranie znaku z pamięci programu zn=PRG_RDB(&tekst[nr++]); //czy nie ma końca tekstu? if(zn!=0) i //czy znak nowej linii if(zn==CR) { wiersz==l?wiersz=0:+*wiersz; //przejdź do nowej linii kolumna=0; //ustaw obowiązujące po zmianie lcdxy(wiersz,kolumna); //współrzędne na LCD )
else ( piszdlcd(zn);
//umieść pojedynczy znak tekstu na LCD
}
)
else ł break;
//zakończ pętlę, jeśli koniec tekstu
)
void klawiszlunsigned char pozkl) //czekaj na naciśnięcie określonego klawisza //klawisz jest wybierany poprzez argument //pozkl {
while(PIND&pozkl); czekaj(30*tau); while(I(PlND&pozkl)),-
//czekaj na naciśnięcie klawisza //odczekaj aż ustaną zakłócenia //czekaj na zwolnienie klawisza
)
int main(void)
//program główny
{
unsigned char i; //»»>»»» definicje tekstów wyświetlanych na LCD «<<<«<«« char *tekstl=PSTR("kursor, mruga*); char *tekst2=PSTR ("bez kursora\nbez mrugania") ,• // \n oznacza znak CR (przejście do nowej //linii) char *tekst3 = PSTR("kursor\nbez mrugania"); char *tekst4=PSTR("bez kursora\nmruganie") ; char *tekstS=PSTR("Przesuwanie\ntekstu w prawo"); char *tekst6=PSTR("Przesuwanie\ntekstu w lewo*); char *tekst7=PSTR("pozycja 1,3*1; char *tekst8=PSTR("pozycja 0,9"); char -tekst9=PSTR("Hello World!"); / / » » » » » » » » » PORTD=0xff; PORTB=0xQ3; DDRD=0x00; DDRB=0xff;
//>>>>>>>>>>>>>>> czekaj(45*tau);
konfigurowanie portów < « « « « « « : « « « « « < //port z podciąganiem //port z podciąganiem //PORTD - we //PORTB - wy inicjacja wyświetlacza LCD « « « « « « « « « « //opóźnienie ok. 45ms dla ustabilizowania //się napięcia zasilania LCD (katalogowo //min. 15 ms). lcd„rs już wcześniej było //ustawione w stanie "0" //3-krotne wysłanie 3-
for(i=0;i<3;i++) { sbi(PORTB,lcd_e); PORTB=(PORTB&0xQf)10x30; //wyślij 3- do LCD asm(*nop"); asm( *nop*) ,asm{"nop"); cbi(PORTB,lcd_e); czekaj(5*tau); //ok. 5ms }
sbi (PORTB, lcd__e) ; PORTB-(PORTB&0x0f} 0x20; asm("nop"); asm("nop"); asm("nop"); cbi(PORTB,lcd_e); czekaj(10L),-
//wyślij 2- do LCD //wymagane wydłużenie impulsu
//od tego momentu można sprawdzać gotowość //LCD //w tym programie nie będzie sprawdzania //gotowości
piszilcd(0x28); piszilcd{0x08); piszilcd(0x01); czekaj(1.64*tau);
//interfejs 4-bitowy, 2 linie, znak 5x7 //wyłącz LCD, wyłącz kursor, wyłącz mruganie //czyść LCD //wymagane dla instrukcji czyszczenia ekranu //opóźnienie //bez przesuwania w prawo
piszilcd{0x06); while(l) { / / » » » » » » EFEKT 1 piszilcd(0x0f); pisztekst(tekstl); klawisz(2); czysclcd(};
<<<<<<<<<<«<<< //włącz LCD, włącz kursor, włącz mruganie
/ / » » » » » » EFEKT 2 piszilcd(0x0c); pisztekst(tekst2); klawisz(2) ; CzysclcdO ;
«««<<<«<<<< //włącz LCD, bez kursora, bez mrugania
//>>>>>>>>>>>> EFEKT 3 piszilcd(0x0e); pisztekst(tekst3); klawisz(2); czysclcdO ;
<««<<:<««<« //włącz LCD, włącz kursor, bez mrugania
//>>>>>>>>>>>> EFEKT piszilcd(0xOd) ,pisztekst(tekst4); klawisz(2); czysclcdO ;
«<«<«<<<«<< //włącz LCD, bez kursora, z mruganiem
/ / » » » » » » EFEKT 5 pisztekst(tekst5);
<<<<<<<<<<<<<<< //umieść tekst na LCD, a następnie przesuń //w prawo
czekaj(1000L»tau); for(i=0;i<16;i++) { piszilcd(Oxlc); czekaj(200*tau);
//przesuń
}
czysclcdO ; //>»>»>>»» EFEKT 6 pisztekst(tekst6);
<<<««<<<«<« //umieść tekst na LCD, a następnie przesuń //w lewo
czekaj(1000L*tau); for(i=0;i<16;i++) {
piszilcd(0xl8); czekaj(200*tau);
.//przesuń
}
czysclcdO ; //>>>s>>>>>>>> EFEKT 7 <<<<<<<<<<<<<<< //umieszczanie kursora w różnych współrzędnych ekranu pisztekst (tekst?) ,lcdxy(l,3); klawisz(2); czysclcdl);
pisztekst(tekstS); lcdxy(0,9); klawisz(2); czekaj(5Q0*tau): //>»»»»»> EFEKT 8 « « « « « £ « « //wprowadzanie tekstu spoza ekranu piszilcd(0xOc); //wyłącz kursor czysclcd(); piszilcd[0x80|0xl0) //ustaw współrzędne poza ekranem pisztekst(tekst9) ; //pisz tekst poza ekranem... for(i=0;i<14;ił+) //i przesuń w lewo { piszilcd(0xl8) ; //przesuń czekaj(200*tau); )
czekaj(200*tau); //>>>»>>»»> EFEKT 9 <<<«<««<«« //mruganie tekstem wyświetLanym na LCD //ze zmienną częstotliwością for(i=10;i!=0xff;i--) i
piszilcd(0x08); czekaj (i*1038); piszilcd(0x0c); czekaj(i-1038);
//wyłącz LCD //włącz LCD
}
czekaj(200*tau); klawisz(2); czysclcdO ; lcdxy(1,2}; pisztekst(tekst9); czekaj(50Q*tau); £or(i=0;i<16;i++}
//obsunięcie tekstu w dół
//zatarcie tekstu znak po znaku
lcdxy(l,i); piszznak(' ") ; czekaj(200*tau); )
czysclcd{);
ł
List. 14.5. Program do ćwiczenia 4b , * * , * *
i********************************************** • • " * * " * • * * * * /
/* Ćwiczenie 4b - sterowanie alfanumerycznym wyświetlaczem LCD */ /* 16x1 (16 znaków, 1 wiersz) */ /•* - obsługa pojedynczego klawisza */ /* J.D. '2003 /************************************************•****************/ Sinclude Sinclude <progmem.h> . V
Kdefine lcd_rs 2 Idefine lcd_e 3 łdefine CR 0x0a
volatile unsigned char kolumna; void czekaj(unsigned { ttdefine tau 10.38 unsigned char tpl;
long pt)
//funkcja opóźnienia //przybliżony przelicznik argumentu na ms
£or(;pt>0,-pt--} { for(tpl=255;tpl!=0;tpl--); ) )
void piszilcdłunsigned char instr) //zapisz instrukcje sterującą do LCD {
cbi(PORTB,lcd_rs); sbi(PORTB,lcd_e); PORTB=(PORTB&0x0f)I(instr&0xf0);//przygotuj starszy półbajt do LCD asmCnop"); //wymagane wydłużenie impulsu asm("nop"); asm("nop"); //impuls strobujący cbi(PORTB,lcd_e); //czekaj na gotowość LCD ok. lOOus czekaj(10L); sbi(PORTB,lcd_e); PORTB=(PORTB&Dx0f)I((instr&0x0f)«4); //przygotuj młodszy półbajt do LCD asm{"nop") asm("nop") asm("nop"} //impuls strobujący cbi(PORTB,lcd_e); //czekaj na gotowość LCD ok. lOOus czekaj(10L); )
void piszdlcd(char dana}
//zapisz daną do LCD
{
sbi(PORTB,lcd_rs); sbi(PORTB,lcd_e); PORTB=(PORTBŁ0x0f)I(danai0xf0);//przygotuj starszy półbajt do LCD asm(*nop"); //wymagane wydłużenie impulsu asrnf"nop"); asm(-nop"}; //impuls strobujący cbi(PORTB,lcĆLe); //czekaj na gotowość LCD czekaj (10D ; sbi(PORTB,lcd_e); P0RTB=(PORTBŁ0x0f)I((dana&0x0f)«1); //przygotuj młodszy półbajt do LCD asm(* nop") asm("nop"} asm{"nop") //impuls strobujący cbi(PORTB,lcd_e); //czekaj na gotowość LCD czekaj(10L); )
void czysclcd(void} ( piszilcd(0x01) ;
czekaj(1.64*tau); kolumna=0;
//czyść ekran //polecenie czyszczenia ekranu dla //kontrolera LCD //rozkaz 0x01 wykonuje się 1.64ms
void piszznak(char znak)
//procedura umieszcza znak na //wyświetlaczu
{ unsigned char p; i£(kolumna<8) i
p=kolumna;
1 else 1 p=kolumna+56;
//dodatkowe przesunięcie współrzędnych //dla LCD 1x16 //dla drugiej połówki wyświetlacza
}
piszilcd(pl0x80) ; kolumna=kolumna!=15?++kolumna:0; //ustaw następną kolumnę piszdlcdf znak) ; //wyświetl znak na LCD
ł void lcdy(unsigned char k) { if(k<8) { piszilcd(kl0x80);
//ustaw współrzędne kursora
//standardowy rozkaz sterownika LCD //ustawiający kursor w określonych //współrzędnych
}
else t piszilcd((k+56)10x80);
//dodatkowe przesunięcie współrzędnych //dla LCD 1x16
)
kolumna=k; }
void pisztekst(char *tekst)
//pisz tekst na LCD wskazywany przez //•tekst
{ char nr=0; char zn; while(l) ( zn=PRG_RDB(Stekst[nr++l ) ; if(zn!=0) {
if(zn==CR) < kolumna=0;
//pobranie znaku z pamięci programu //czy nie ma końca tekstu? //czy znak nowej linii //jeśli tak, ustaw obowiązujące po //zmianie współrzędne na LCD
)
else { piszznak(zn);
//umieść pojedynczy znak tekstu na LCD
}
}
else ( break;
ł )
//zakończ pętlę, jeśli koniec tekstu
void
klawisz(unsigned
char
pozkl) //czekaj na naciśnięcie określonego //klawisza //klawisz jest wybierany p o p r z e z //argument pozkl
i //czekaj na naciśnięcie klawisza //odczekaj aż ustaną zakłócenia //czekaj na zwolnienie klawisza
whilet (PIND&pozkl) — p o z k l ) czekaj(30*tau); while((PIND&pozkl)!=pozkl) ) int
main(void)
//program
główny
t unsigned
char
i;
/ / > » > » » » d e f i n i c j e tekstów wyświetlanych char * tekst1 = PSTR("Wyświetlacz 1 x 1 6 * ) ; char t e k s t 2 = P S T R ( ' H e l l o W o r l d ! " ) ;
na
LCD
<<<<<<<<<<<
ł
/ / » » » > » » » » » > PORTD=0x£t; PORTB=0xC3; DDRD=0x0O; DDRB=Qxf f;
//»>»»»»»»
konfigurowanie portów <<<<<<««<<<<<<<<<<<< //port z podciąganiem //port z podciąganiem //PORTD - we //PORTB - wy inicjacja
czekaj(45*tau);
for(i=0;i<3;i++)
wyświetlacza LCD « < « < « < < « « < « « < //opóźnienie ok. 45ms dla u s t a b i l i //zowania się napięcia zasilania //LCD (katalogowo min. 15 m s ) //lcd_rs już wcześniej było ustawione //w stanie " 0 * //3-krotne wysłanie 3-
< sbi(PORTB,lcd_e); PORTB=(PORTB&0x0£)10x30; asm("nop") asm("nop") asm("nop") cbi(PORTB,lcd_e); czekaj(5*tau); ) sbi(PORTB,lcd_e); PORTB-(PORTBŁ0x0f)10x20; asm("nop") asm("nop") asm("nop") cbi(PORTB,lcd_e); czekaj(10L); piszilcd(0x28); piszilcd(0x0c); piszilcd(0x01); czekaj(1.64"tau); piszilcd(0x06);
//wyślij
3- do
//impuls strobujący //ok. Sms
//wyślij 2- d o LCD //wymagane wydłużenie
//impuls
impulsu
strobujący
//interfejs 4-bitowy, 2 linie, znak 5x7 //wyłącz LCD, wyłącz kursor, wyłąc2 //mruganie //czyść LCD //wymagane dla instrukcji czyszczenia //ekranu opóźnienie //bez przesuwania w prawo
while(l) { / / » » » » » » EFEKT //wyświetl tekst pisztekst(teksŁl);
LCD
<<<<<<<<<<<<<<<
klawisz<2); pisztekst(tekst2] klawisz(2); czysclcdO ; //>»»»>»» EFEKT 2 « « « « < « « « //umieszczanie kursora w różnych współrzędnych ekranu piszilcd(0x0e); //włącz LCD, włącz kursor bez mrugania for(i = 0; i
lcdy (i) ,czekaj(500 tau); czysclcd(); lcdy(15-i); czekaj(500*tau); czysclcdO ?
//umieść kursor
ł
//umieść kursor
}
/ / » » » » » » EFEKT 3 <«««««.«« //mruganie tekstem wyświetlanym na LCD czysclcd(); pisztekst(tekst2); //wyświetl tekst na LCD for(i=0;i<20;i++) t piszilcd(0x08); czekaj C30u*tau); piszilcd(0x0c); czekaj(300"tau); if ( . ' (PIND&0x02>) { break;
//wyłącz LCD //włącz LCD
//zakończenie pętli po naciśnięciu SW4
1 }
czysclcd(); czekaj(200"tau) ;
14.2.5. Ćwiczenie 5 „Łapanie muchy", czyli obsługa klawiatury matrycowej z wykorzystaniem przerwań timera, obsługa wyświetlacza alfanumerycznego LCD 1 6 x 2 W p o p r z e d n i c h p r z y k ł a d a c h p o k a z a n o o b s ł u g ę pojedynczych klawiszy, dołą czanych b e z p o ś r e d n i o d o p o r t ó w rnikrokontrolera. Rozwiązania takie stosuje się w aplikacjach, w których nie występuje d u ż a liczba klawiszy. Jeśli będzie ich więcej niż 4 , warto r o z w a ż y ć możliwość połączenia ich w matrycę. D l a d u ż o w i ę k s z y c h klawiatur j e s t to właściwie j e d y n a sensowna metoda. N a r y s u n k u 1 4 . 1 4 p o k a z a n o p r z y k ł a d o w y sposób dołączenia klawiatury 4-przyciskowej d o mikrokontrolera A V R . Jest ona zorganizowana w układzie matrycy 2 x 2 (2 w i e r s z e , 2 k o l u m n y ) . J a k widać nie uzyskuje się tu właściwie żadnej
oszczędności
AVR
wyjścia.
PD2
Przy
portów tak
wejścia-
niewielkiej
klawiaturze liczba zajętych linii j e s t r ó w n a 4 b e z względu PD3
konfigurację
styków.
na
Przykład
o m a w i a m y j e d y n i e w celu poka zania zasady obsługi klawiatury
PDO
matrycowej. W
PD1
programie d o ćwiczenia
5
klawiatura zostanie wykorzysta Rys. 14.14. Przykładowy sposób dołączenia kla wiatury 4-przyciskowej do mikrokontrolera AVR
na w prostej grze zręcznościo wej „Łapanie m u c h y " . „Muchą" jest znak kropki poruszający się
w sposób losowy (pseudolosowy) p o ekranie wyświetlacza L C D . Zadaniem za wodnika jest podążanie za ruchem muchy za pomocą czterech klawiszy. Ich znaczenie jest następujące: S W 3 - ruch w lewo, S W 4 - ruch w prawo, S W 2 ruch na dół, S W 1 - ruch d o góry. W zależności od tego, które przyciski zostały naciśnięte, odpowiednio jest przemieszczany znak „plus" p o ekranie. Konfiguracja klawiatury nie uwalnia nas od p r o b l e m ó w związanych z zakłó ceniami w y w o ł y w a n y m i drganiem styków. W t y m przypadku r ó w n i e ż należy p o d e j m o w a ć o d p o w i e d n i e środki d o ich eliminacji.
Najodpowiedniejszym
rozwiązaniem jest cykliczne skanowanie stanu klawiatury z p r o g r a m o w ą eli minacja zakłóceń. M o m e n t y p r ó b k o w a n i a najwygodniej jest w y z n a c z a ć wy korzystując timer mikrokontrolera sygnalizujący przepełnienie (a więc m i e rzenie określonego czasu), o d p o w i e d n i m przerwaniem. W t y m konkretnym przypadku będzie to TimerO. Linie portów, d o których są dołączone kolumny klawiatury ( P D I i PDO) p o w i n n y być ustawione j a k o wyjściowe, natomiast wiersze są dołączone d o portów P D 3 i P D 2 pracujących j a k o wejścia z pod ciąganiem. S p r a w d z e n i e stanu klawiatury m o ż e przebiegać w e d ł u g następu j ą c e g o algorytmu: 1. U s t a w stan niski n a wyjściu PDO. 2 . S p r a w d ź stan wejścia P D 2 . Jeśli jest „ 1 " , to klawisz S W 1 nie jest naciś nięty. Stan wysoki j e s t w y m u s z a n y przez wewnętrzne podciąganie d o plu sa linii P D 2 . N a płytce Z L 1 A V R przewidziano ponadto rezystor R 6 , który będzie pełnił funkcję pull-up
w przypadku, gdy podciąganie nie zostanie
włączone (do c e l ó w doświadczalnych). Analogicznie działa R7 dla linii P D 3 . Naciśnięcie klawisza S W 1 spowoduje podanie stanu „ 0 " z wyjścia PDO na wejście P D 2 . Odczytanie więc stanu niskiego n a wejściu P D 2 oznacza, że naciśnięto klawisz S W 1 .
3. S p r a w d ź w a n a l o g i c z n y s p o s ó b p o z o s t a ł e w e j ś c i a w i e r s z y . W n a s z y m p r z y p a d k u j e s t t o t y l k o linia P D 3 . Jeśli na o d c z y t y w a n y m wejściu b ę d z i e s t a n „ 1 " , t o k l a w i s z leżący n a p r z e c i ę c i u a k t y w n e j k o l u m n y i s p r a w d z a n e g o w i e r s z a j e s t z w o l n i o n y . W p r z e c i w n y m r a z i e j e s t na ciśnięty. 4. P o w t ó r z analogiczną s e k w e n c j ę j a k w punktach 1 d o 3 d l a pozostałych wyjść k o l u m n o w y c h (w n a s z y m przypadku j e s t to tylko linia P D I ) . Zauważmy, że liczba binarna odpowiadająca stanowi wszystkich linii obsługują cych klawiaturę m o ż e b y ć traktowana jako naturalny kod znaku. Na przykład na ciśnięcie klawisza S W 4 spowoduje zwrócenie kodu 1001 (PD3=1, PD2=0, PD1=0, P D 0 = 1 ) . M o ż n a także przyjąć dowolną inną metodę kodowania, lecz w tym przypadku niezbędne będą dodatkowe działania wykonane przez mikro kontroler. Przepatrywanie klawiatury odbywa się w procedurze obsługi przerwa nia. Akcja, j a k a m a być podjęta p o naciśnięciu przycisku, może czasami wyma gać dużego obciążenia mikrokontrolera. Wykonanie jej z wnętrza procedury przerwania m o ż e doprowadzić d o chwilowego zawieszenia systemu. Na przy kład przerwanie o niższym priorytecie nie będzie się mogło doczekać swojej ob sługi. A b y uniknąć takich sytuacji można zastosować specjalną flagę, dzięki któ rej procedura obsługi będzie sygnalizować programowi głównemu naciśnięcie klawisza i konieczność wykonania związanego z tym zadania. W omawianym programie zagrożenia takiego nie ma, lecz technika taka zostanie zastosowana. Wskaźnikiem jest zmienna f k l a w i s z , ustawiana w procedurze obsługi prze rwania od TimeraO p o wykryciu naciśnięcia dowolnego klawisza. Sprawdzenie, czy jest wciśnięty jakikolwiek klawisz dla aktywnej kolumny jest realizowane za pomocą operacji E x - O R (patrz komentarze na listingu 14.6). Jeśli w głównej pęt li programu okaże się, że flaga ta jest ustawiona, to wykonywana jest sekwencja instrukcji powodująca wyświedenie znaku „ + " w nowym położeniu zależnym od kodu naciśniętego klawisza. D o obsługi wyświetlacza będą
wykorzystane
funkcje znane z poprzedniego ćwiczenia. Na potrzeby gry nieznacznej zmianie uległa tylko funkcja p i s z z n a k ( z n a k ) . D o obliczania nowych współrzędnych ekranowych znaku „ + " wykorzystane są funkcje i n c w i e r s z ( w ) , i n c k o l u m n a ( k ) , d e c w i e r s z ( w ) , d e c k o l u m n a ( k ) . Są one również wykorzysty wane do obliczania pozycji ekranowej „muchy". Kierunek przesunięcia jest loso wany za pomocą funkcji standardowej r a n d ( ) , która nadaje zmiennej r war tość losową z przedziału 0 d o 255. Cały zakres podzielono na 8 przedziałów od powiadających kierunkom: w górę, w prawo w skos do góry, w prawo itd. Prze działy ze względu na asymetrię geometryczną wyświetlacza nie są sobie równe. Kierunek ruchu „muchy" zależy od tego, w jakim przedziale znajduje się wylo sowana liczba.
P r o g r a m realizujący p r z e d s t a w i o n e z a d a n i e znajduje sie na l i s t i n g u 14.6. N a leży s k o m p i l o w a ć p r o g r a m cwiczS.c stawu Z L 1 A V R p l i k i e m w y n i k o w y m
i zaprogramować mikrokontroler z ze cwicz5.hex.
Konfiguracja płytki Z L 1 A V R : • z w o r k a J 3 w pozycji 1-2, z w o r k a J 4 w pozycji 2-3 - d o ł ą c z o n y o s c y l a t o r wewnętrzny, • zworka JP1 rozwarta - globalne wyłączenie diod L E D , • z w o r k a J P 4 i J P 5 w pozycji 1-2 (dołączenie k l a w i s z y w u k ł a d z i e m a t r y c y do mikrokontrolera), • z w o r k a J P 6 i J P 7 z w a r t a (dołączenie k l a w i s z y d o m i k r o k o n t r o l e r a ) , • z w o r k i Z W _ P O R T B z w a r t e w p o z y c j a c h 1-2, 3-4, 5-6, 7-8, 9 - 1 0 , 11-12; z w o r k i 13-14 i 15-16 n i e i s t o t n e , • położenie pozostałych zworek nieistotne (np. rozłączone) • podłączony do gniazda L C D 1 wyświetlacz alfanumeryczny 16x2. List. 14.6. Program do ćwiczenia 5
/* Ćwiczenie 5 - Obsługa klawiatury matrycowej z wykorzystaniem /* przerwań timeraO /* - wykorzystanie wyświetlacza LCD 16*2 /* - prosta gra zręcznościowa /* J.D. '2003
*/ */ */ */ */
#include ttinciude Sinclude <signal.h> fldefine lcd_rs 2 ttdefine lcd_e 3 ttdefine tauO 247 tfdefine vliczt0 113 ttdetine vlkursor 10
//definicja bitu portu dla linii RS //definicja bitu portu dla linii E //stała czasowa timeraO //stała wpisywana do licznika wejść do //do przerwania timeraO //wartość wpisywana do zmiennej lkursor
//****»*************** unsigned char licztO; unsigned
volatile volatile volatile unsigned unsigned
zmienne globalne *.**»**•*.******.«•* //Licznik wejść do przerwania timeraO. //Klawisz jest badany, gdy liczt0=0 //licznik wejść do przerwania timeraO char lkursor; //dla ustawienia flagi zmiany //położenia "muchy* unsigned char kodklaw; //kod naciśniętego klawisza; unsigned char fklaw; //flaga wykrycia naciśnięcia klawisza; unsigned char fkursor; //flaga zmiany położenia "muchy* char wiersz=0; //pozycja umieszczenia znaku na LCD char kolumna=0; //pozycja umieszczenia znaku na LCD
void czekaj(unsigned long ztł //funkcja opóźnienia { Odefine tau 10.38 //przybliżony przelicznik argumentu na ms unsigned char ztl;
for(;zt>0;zt--) < for(zt1=255;ztl!=0;ztl --) ;
1 1 SIGNAL
(SIG_QVERFLOW0l
//obsługa przerwania od przepełnienia //timeraO
{ unsigned char kkolumna,kwiersz; //zmienne pomocnicze TCNTO=tauO; //odśwież stalą czasową w TCNTO if(--licztO==0) //czy już czytać klawisze? { //tak for(kkolumna=Oxfe;kkolumna!=0xfb;kkolumna={kkolumna«l)*1) {
PORTD=(PORTDI0x03)&(kkolumna); //podaj *0* na linię sterującą aktywną //kolumną kwiersz=PIND&Ox0f; //czytaj wiersz, pozostaw tylko linie //obsługujące klawiaturę //czy jest odpowiedź na jakiejś linii if((kwiersz&0x0c)"0x0c) //wierszy? //tak, ustaw flagę gotowości klawiatury { fklaw=l //i zakończ przepatrywanie break; ;
)
if(fklaw) t kodklaw=kwiersz;
//jeśli wykryto wciśnięcie klawisza, podaj //jego kod
)
else { kodklaw=0xff;
//jeśli nie, ustaw kod neutralny
)
Iiczt0=vliczt0; if(--lkursor==0) { fkursor=l; lkursor=vlkursor;
//odśwież stan licztO //czy można ustawić flagę zmiany "muchy"? //tak {minęło ok. 300mst //odśwież stan lkursor
} )
void piszilcd(unsigned char instr) //zapisz instrukcję sterującą do LCD i cbi(PORTB,lcd_rs); sbi(PORTB,lcd_e); PORTB=(PORTB&0x0f)I(instr&0x£0); //przygotuj starszy połbait do LCD asm("nop"); asm("nop"); asm("nop*); cbi(PORTB,lcd_e); //impuls strobujący czekaj(10L); //czekaj na gotowość LCD ok. lOOus sbi(PORTB,lcd_e); PORTB=(PORTBŁ0x0f ) I ( (instr&0x0£)«4) ; //przygotuj młodszy półbajt oo LCD
asm("nop") asm("nop*} asm("nop*) cbi(PORTB,lcd_e); czekaj(10L);
11impu1s strobujący //czekaj na gotowość LCD ok. lOOus
)
void piszdlcd(char dana) //zapisz daną do LCD { sbi(PORTB,lcd_rs); sbi(PORTB,lcd_e); PORTB=(PORTB&0x0£)|(dana&0x£0); //przygotuj starszy półbajt do LCD asm("nop*); asm("nop"); asm("nop"); cbi(PORTB,lcd_e); //impuls strobujący czekaj(10L); //czekaj na gotowość LCD sbi(PORTB,lcd_e); PORTB=(PORTB&0x0£) | ((dana60x0f) « 4 ) ; //przygotuj młodszy półbajt do LCD asm("nop">, asm("nop") asm("nop") cbi(PORTB,lcd_e); //impuls strobujący czekaj(10L); //czekaj na gotowość LCD )
void czysclcd(void) i piszilcd(0x01); czekaj(l.S4*tau); wiersz=0; kolumna=0;
//czyść ekran //polecenie czyszczenia ekranu dla //kontrolera LCD //rozkaz 0x01 wykonuje sie l-64ms
}
void lcdxy(unsigned char w, unsigned char k) //ustaw współrzędne kursora {
piszilcd((w*0x40+k)10x80)
void piszznak(char znak) I pis2dlcd(znak);
//standardowy rozkaz sterownika LCD //ustawiający kursor w określonych //współrzędnych
//funkcja umieszcza znak na wyświetlaczu //wyświetl znak na LCD
)
unsigned char incwiersz(unsigned char w) //inkrementuj wiersz LCD (
return w==l?0:l; }
unsigned char decwiersz(unsigned char w) //dekrementuj wiersz LCD (
return w==0?l:0; )
unsigned char inckolumna(unsigned char k) //inkrementuj kolumnę LCD return k==15?0:++k;
unsigned char deckolumna(unsigned char k) //dekrementuj kolumnę LCD return k==0?15:--k;
nt main(void)
//program główny
unsigned char r,i; unsigned char xg=0; unsigned char yg=0;
//zmienne pomocnicze //kolumna wyświetlania kursora gracza //wiersz wyświetlania kursora gracza
Iiczt0=vliczt0; lkursor=vlkursor; PORTD=0xff; PORTB=0x03; DDRD=0xO3; DDRB=0xff; TIMSK=l«TOIE0; TCNTO=tauO; TCCR0=4; fklaw=0; //>>>>>>>>>>>>>>>> czekaj(45*tau);
lit podciąganiem //z podciąganiem wejść //PD0-PD1 wy, pozostałe wejścia //PORTB - wy //zezwolenie na przerwania od TCO //wpisz stałą czasową do TCHTO //preskaler XTAL/256, //kwant mierzonego czasu = 32|is inicjacja wyświetlacza LCD <<<<<<<<<<<<<<«<<<< //opóźnienie ok. 45ms dla ustabilizowania //się napięcia //zasilania LCD (katalogowo min. 15 ms) //lcd_rs już wcześniej było ustawione //w stanie "O" //3-krotne wysłanie 3-
£or(i=0;i<3;i+* { Sbi (PORTB,lcd_e) ; PORTB=(PORTB&0x0f)10x30; asm("nop") asm("nop") asm("nop") cbi (PORTB, lcd_e) ; czekaj(5*tau);
//wyślij 3- do LCD
//ok. 5ms
}
sbi(PORTB,lcd„e); PORTB=(PORTB&0x0f)10x20; asm(* nop") asm("nop") asm("nop") cbi(PORTB,lcd_e) ; czekaj (10D ; piszilcd(0x28) piszilcd(0x08) piszilcd(0x01) czekaj(1.64*tau); piszilcd(0x06); piszilcd(0x0c); sei(); i = 0;
//wyślij 2- do LCD //wymagane wydłużenie impulsu
//impuls strobujący //interfejs 4-bitowy, 2 linie, znak 5x7 //wyłącz LCD, wyłącz kursor, wyłącz mruganie //czyść LCD //wymagane dla instrukcji czyszczenia //ekranu opóźnienie //bez przesuwania w prawo //włącz LCD, bez kursora, bez mrugania //odblokuj globalne przerwania
-
piszznak('S ) piszznak f•t') piszznakf'a') piszznakf'r') piszznak{' t') do ( i++;
//wyświetl napis "Start *
srand(i); czysclcd(); piszznak('+');
//zmienna "i" będzie wykorzystana później //do zainicjowania //generatora pseudolosowego //naciśnięcie klawisza zapewnia losowy //start generatora //inicjuj generator liczb pseudolosowych //czyść ekran //umieść znak gracza na ekranie
whileU)
//główna pętla programu
Jwhilel!fklaw);
t
i£(fkursor) //czy można przemieścić "muchę"? { lcdxy(wiersz,kolumna); //tak... if{(wiersz==yg)£&(kolumna==xg)} { //wymaż starą pozycję pozostawiając gracza piszznakf'+'); }
else t piszznakf' ' ) ;
//wymaż starą pozycję
1
//losuj nowe położenie r=rand(); //wylicz nową pozycję if<(r<37)&&(r>18)) t wiersz=incwiersz(wiersz); }
if(r<19) ( wiersz^decwiersz(wiersz); }
if (((r>12)&Ł(r<19))II((r>30)&&(r<147))) { kolumna=inckolumna(kolumna); )
ift(r<7)I|(18))I|(r>1461) { kolumna=deckolumna(kolumna); )
lcdxy(wiersz,kolumna); piszznak('.'); fkursor=0;
//ustaw nowe współrzędne //umieść "muchę" w nowym położeniu
)
i£(fklaw) { //wykryto naciśnięcie klawisza fklaw^O; //ustaw współrzędne znaku gracza... lcdxy(yg,xg); //. . . i wymaż go piszznak!' ' ) ; //reakcja na klawisz switch (kodklaw) i case 0x09: xg=inckolumna(xg) ; //SW4 - w prawo z zawijaniem break;
case 0x05:
case 0x06:
xg=deckolumna(xg) //SW3 - w lewo z zawijaniem break; yg=l ;
case 0x0a:
break; yg=0;
;
//SW2 - na dół bez zawijania
//SW1 - do góry bez zawijania lcdxy(yg,xg) ; //ust. //ustaw nowe współrzędne znaku gracza if!<wiersz==yg)S&(kolumna==xg)) piszznak!'* * ) ; czekaj(200);
//znak, jeśli trafiony //przytrzymaj chwile na ekranie
else piszznak{'+');
//znak jeśli "pudło"
14.2.6. Ćwiczenie 6 6-bitowy, binarny wskaźnik napięcia. Zastosowanie komparatora analogowego do budowy przetwornika analogowo-cyfrowego. Wyzwalanie funkcji przechwytywania Timeral za pomocą komparatora. Przerwanie od przechwytywania Timeral. Obsługa wewnętrznej pamięci EEPROM Opis przetwornika analogowo-cyfrowego znajdującego się na płytce Z L 1 A V R z a m i e s z c z o n o w pierwszej części tego rozdziału. W ćwiczeniu 6. przetwornik ten w y k o r z y s t a m y d o b u d o w y 6-bitowego, binarnego wskaźnika napięcia. W y n i k p o m i a r u będzie wyświetlany na sześciu diodach L E D w postaci liczby binarnej. O g r a n i c z e n i e w s k a z a n i a d o 6-bitów wynika z konieczności przy dzielenia p o r t o w i B d w ó c h zadań: sterowania diodami L E D i realizacji prze twornika A / C . Z e w z g l ę d u na niewykorzystane porty np. P D I i PDO, można pokusić s i ę e w e n t u a l n i e o u ż y c i e ich d o sterowania pozostałymi d w o m a dio dami L E D . B ę d z i e t o w y m a g a ł o w y k o n a n i a odpowiednich połączeń n a płyt ce oraz z m i a n w o p r o g r a m o w a n i u . W d a n y m ćwiczeniu wariantu takiego nie uwzględniono. W początkowej części p r o g r a m u następuje inicjowanie systemu. Port D j e s t w y k o r z y s t y w a n y d o obsługi klawiszy S W 1 i S W 3 oraz sterowania tranzysto r e m Q 3 . L i n i e PDO i P D I są skonfigurowane j a k o wejścia z podciąganiem. W y p r o w a d z e n i a P B 2 . . . P B 7 sterują L E D - a m i , dlatego są ustawione j a k o w y j ścia. Linie PBO i P B l to wejścia k o m p a r a t o r a a n a l o g o w e g o - pracują j a k o
wejścia. Z a s t o s o w a n o podciąganie portu PBO, g d y ż w p ł y w a ł o t o korzystnie na pracę układu. Przy ustalaniu trybu pracy T i m e r a l z r e z y g n o w a n o z preska lera, c o m a na celu m a k s y m a l n e skrócenie czasu konwersji. W p i s wartości $41 d o rejestru T C C R 1 B powoduje włączenie funkcji
przechwytywania
i start timera bez w s t ę p n e g o podziału częstotliwości oscylatora. Ustawienie bitu A C I C w rejestrze A C S R zezwala na w y z w o l e n i e funkcji p r z e c h w y t y w a nia T i m e r a l s y g n a ł e m z komparatora a n a l o g o w e g o . G ł ó w n a pętla p r o g r a m u j e s t b a r d z o prosta - w y n i k a z z a s a d y działania p r z e t w o r n i k a . C y k l p o m i a r o w y r o z p o c z y n a się od w y z e r o w a n i a portu P D 4 , c o j e s t r ó w n o z n a c z n e z w y ł ą c z e n i e m tranzystora Q 3 . Płynący z e źródła Q l , Q 2 , R l prąd r o z p o c z y n a liniowe ł a d o w a n i e k o n d e n s a t o r a p o m i a r o w e g o C 5 . Zaraz
po
wyłączeniu
tranzystora
Q3
są
zerowane
rejestry
Timeral:
T C N T 1 H i T C N T I L . N a l e ż y z w r ó c i ć u w a g ę na kolejność dostępu d o tych rejestrów, wynikającą z u ż y w a n i a przez C P U rejestru t y m c z a s o w e g o pod czas operacji ich z a p i s y w a n i a (szczegóły w rozdziale 5.2 - o p i s rejestrów T C N T 1 H i T C N T I L ) . W y z e r o w a n i e rejestrów j e s t j e d n o z n a c z n e z r o z p o c z ę c i e m p o m i a r u c z a s u . T i m e r a nie trzeba startować, g d y ż p o zainicjowa niu pracuje on n o n - s t o p . N a s t ę p n i e j e s t z e r o w a n a flaga p o m i a r i w pętli w h i l e ( p o m i a r = = 0)
oczekuje się n a z a k o ń c z e n i e p o m i a r u . W c h w i l i ,
gdy n a p i ę c i e n a k o n d e n s a t o r z e C 5 z r ó w n a się z n a p i ę c i e m n a gnieździe P O R T D 1 - 1 k o m p a r a t o r a n a l o g o w y mikrokontrolera z m i e n i a stan, c o p o w o duje w y z w o l e n i e funkcji p r z e c h w y t y w a n i a T i m e r a l . A k t u a l n y stan rejest rów
TCNT1H
i T C N T I L jest
automatycznie
przepisany
do
rejestrów
ICR1H i ICR1L, po czym generowane jest przerwanie od przechwytywania T i m e r a l . W c z a s i e o c z e k i w a n i a na to zdarzenie procesor m ó g ł b y w y k o n y w a ć inne zadania, ale w t y m k o n k r e t n y m p r z y p a d k u takich z a d a ń nie ma, stąd p o z o s t a w a n i e w pętli w h i l e . P o z g ł o s z e n i u p r z e r w a n i a , s t e r o w a n i e j e s t p r z e n i e s i o n e d o p r o c e d u r y j e g o obsługi SIGNAL
(SIG_INPUT__CAP-
T U R E 1 ) , w której następuje odczyt rejestrów I C R I H i I C R I L , u n o r m o w a nie w y n i k u d o postaci 6-bitowej liczby binarnej i wyświetlenie rezultatu na diodach L E D . Zapis PORTB= ( P O R T B & 0 x 0 3 ) | c z a s 8 oznacza, że najpierw są z e r o w a n e bity 2...7 portu B , a następnie są ustawiane j e d y n k i na pozycjach wynikających z w a r t o ś c i zmiennej c z a s 8 , reprezentującej k o ń c o w y w y n i k p o m i a r u . Na z a k o ń c z e n i e funkcji j e s t ustawiana flaga p o m i a r , p o c z y m port P D 4 j e s t p r z e ł ą c z a n y w stan w y s o k i , powodując t y m s a m y m b a r d z o s z y b k i e r o z ł a d o w a n i e k o n d e n s a t o r a p r z e z niską o p o r n o ś ć w ł ą c z o n e g o tran zystora Q 3 . O d tej c h w i l i cały prąd źródła p r z e p ł y w a p r z e z t r a n z y s t o r Q 3 , a k o n d e n s a t o r C 5 m o ż e się n a ł a d o w a ć j e d y n i e d o b a r d z o małej wartości na pięcia n a s y c e n i a UCES-
K a ż d y „ p r a w d z i w y " p r z e t w o r n i k A / C m a albo wewnętrzne źródło referencyj ne, a l b o w y m a g a dołączenia takiego źródła z zewnątrz. Jest o n o potrzebne d o o d p o w i e d n i e g o p r z e t w o r z e n i a napięcia wejściowego n a j e g o postać cyfrową. P r z y k ł a d o w o , jeśli 8-bitowy przetwornik będzie pracował z 2,5 V źródłem referencyjnym, t o napięciu wejściowemu r ó w n e m u 2,5 V będzie odpowiadał stan S F F n a wyjściu przetwornika. W przypadku przetwornika A / C opisywa nego w ćwiczeniu wartością referencyjną jest czas ładowania kondensatora C 5 d o określonego napięcia. Chociaż czas ten można wyliczyć teoretycznie, to w praktyce - choćby z e względu na tolerancję użytych elementów - wyniki najczęściej nie będą p o k r y w a ć się z założonymi. A b y pokonać ten problem, w p r o g r a m i e uwzględniono specjalną procedurę kalibracyjną. Jest ona urucha miana, g d y zaraz p o restarcie mikrokontrolera zostanie wykryte naciśnięcie klawisza S W 4 -
if(bit_is_clear(PIND, 1 ) ) . W p ę t l i do...while
j e s t r e a l i z o w a n y c y k l i c z n y p o m i a r napięcia wejściowego, przy c z y m w t y m p r z y p a d k u nie korzysta się z przerwań. T a k w i ę c p o w y z e r o w a n i u flagi zgło szenia p r z e r w a n i a (wpisanie „ 1 " n a pozycję flagi) następuje oczekiwanie w pętli, a ż p o n o w n i e zostanie o n a ustawiona przez funkcję p r z e c h w y t y w a n i a . Stan flagi j e s t k o n t r o l o w a n y p r o g r a m o w o : sbi(T2FR,lCFl); while{bit_is_clear(TIFR, ICF1)) ;
//czekaj na //ustawienie
flagi
Wyjście z pętli jest możliwe p o naciśnięciu klawisza S W 1 . Powoduje to wylicze nie współczynnika kalibracyjnego i zapisanie g o w pamięci E E P R O M mikrokon trolera począwszy od adresu $ 0 1 . Współczynnik jest liczbą typu integer, zajmuje więc d w a bajty. D o obsługi pamięci E E P R O M wykorzystano funkcje bibliotecz ne języka A V R - G C C . Zapis odbywa się przy użyciu eeprom_wb {adres, dana_8_bit}, d o odczytu z a ś służy eeprom_rw(adres,dana_16_bit). Jak w i d a ć , dzięki t y m p r o c e d u r o m programista został całkowicie zwolniony z o b o w i ą z k u przestrzegania wszystkich reguł dotyczących obsługi pamięci E E P R O M , poza świadomą rezygnacją z zerowego adresu (patrz opis pamięci EEPROM).
Wszystkie
operacje, jakie wykonuje
mikrokontroler
podczas
realizacji tych funkcji m o ż n a obejrzeć dokładnie p o uruchomieniu podglądu kodu n a p o z i o m i e asemblera n p . w A V R Studio. Jeśli p o restarcie systemu nie zostanie w y k r y t e naciśnięcie klawisza S W 4 , przed wejściem d o pętli pomiaro wej współczynnik kalibracji jest odczytywany z pamięci E E P R O M i będzie później wykorzystywany d o przeliczenia czasu ładowania kondensatora n a liczbę binarną wyświetlaną n a diodach L E D . Kalibrację należy przeprowadzić po zaprogramowaniu mikrokontrolera. Później układ będzie zawsze gotowy d o pomiarów p o włączeniu zasilania lub zrestartowaniu mikrokontrolera.
70
Napięcia wejściowe (V)
Rys. 14.15. Wykres liniowości przetwornika A/C badanego w ćwiczeniu Kolejne kroki postępowania są następujące: 1.
Naciśnij przycisk S W 4 i włącz zasilanie lub zrestartuj s y s t e m (nie pusz
2.
D o p r o w a d ź d o wejścia P O R T D 1 - 1 napięcie w z o r c o w e i ustaw za pomocą
czając S W 4 ) . woltomierza wartość, której powinien o d p o w i a d a ć stan $ 3 F przetwornika (np.
4,5 V). P o d a n i e później (w. trakcie pomiarów) takiego napięcia na
wejście spowoduje zapalenie sześciu diod L E D odpowiadających b i t o m najbardziej znaczącym. 3.
W czasie kalibracji palą się lampki L E D 3 d o L E D 8 .
4.
Naciśnij klawisz S W 1 , c o spowoduje automatyczne wejście w tryb pomia rowy. Z m i a n o m napięcia wejściowego p o w i n n o t o w a r z y s z y ć zmienianie stanu diod L E D .
M i e r z o n e napięcie m o ż n a pobierać z s u w a k a potencjometru P I , służącego normalnie do regulacji kontrastu wyświetlacza L C D ( w y p r o w a d z e n i e 3 łą c z ó w k i L C D 1 ) . N a r y s u n k u 14.15 przedstawiono wykres liniowości prze twornika A/C b a d a n e g o w ćwiczeniu 6. P r o g r a m realizujący przedstawione zadanie znajduje się na l i s t i n g u 14.7. Na leży skompilować p r o g r a m cwiczó.c stawu Z L 1 A V R plikiem w y n i k o w y m
i z a p r o g r a m o w a ć mikrokontroler z ze cwicz6.hex.
Konfiguracja płytki Z L 1 A V R : • z w o r k a J 3 w pozycji 1-2, z w o r k a J 4 w pozycji 2-3 - dołączony oscylator wewnętrzny, • z w o r k a JP1 zwarta - globalne włączenie diod L E D ,
• z w o r k a J P 4 i J P 5 w pozycji 2-3 (dołączenie pojedynczych klawiszy d o mikrokontrolera), • z w o r k a J P 6 i J P 7 z w a r t a (dołączenie klawiszy d o
mikrokontrolera),
• z w o r k i Z W _ P O R T B zwarte w pozycjach 1-2, 3-4, 5-6, 7-8, 9-10,
11-12,
z w o r k i 13-14 i 15-16 rozwarte, • z w o r k i J P 8 i J P 9 z w a r t e (włączenie źródła p r ą d o w e g o i kondensatora p o miarowego), • z w o r k a Z W _ P O R T D 1 - 2 rozwarta, • p o ł o ż e n i e p o z o s t a ł y c h z w o r e k nieistotne (np. rozłączone), • wyświetlacz alfanumeryczny L C D
zdemontowany,
• p o ł ą c z o n e k o ń c ó w k i g n i a z d a L C D - 3 z P O R T D - 1 (w p r z y p a d k u korzystania p o t e n c j o m e t r u P I d o regulacji napięcia w e j ś c i o w e g o ) , • jeśli d o p o m i a r ó w b ę d z i e w y k o r z y s t y w a n e zewnętrzne ź r ó d ł o napięcia, na leży j e d o p r o w a d z i ć d o g n i a z d a P O R T D - 1 (połączenia z punktu wyżej nie w y k o n y w a ć ) , k o ń c ó w k ę 0V źródła połączyć z masą płytki Z L 1 A V R . List. 14.7. Program do ćwiczenia 6 ^ * * » * * « i > i > l H * l « » * » 1 H » * » » * ł « * * * * « * " > " * » » * » * * * * * * * » » * * * * » * » * * * * * * * * * " * /
/* Ć w i c z e n i e 6 /* /* /* j* /* /* J.D. '2003
- zastosowanie komparatora analogowego d o budowy pizetwornika analogowo-cyfrowego. w y z w a l a n i e funkcji przechwytywania timeral za pomocą komparatora. Przerwanie od przechwytywania. obsługa wewnętrznej pamięci EEPROM.
*/ *I */ */ */ */ *>
/**.***»**»»****•************»***********»*•»******•***•****•*****/ ttinciude ttinciude ttinciude ttinciude
<signal.h> <eeprom. h>
/,».,,....,.»....... unsigned
char
volatile
unsigned
zmienne g l o b a l n e
***•***********.***•
licztO; char pomiar;
//flaga
dokonania
pomiaru
uniont u n s i g n e d int w s p k a l ; //współczynnik unsigned char w s p k a l b [ 2 1 ; )uwspkal; void
czekaj(unsigned
long
zt)
kalibracji
//funkcja
opóźnienia
//obsługa
przerwania
{ (łdefine tau 10-38 u n s i g n e d char Ztlj for(;zt>0;zt--) { forlztl = 255;ztl!=0;ztl — ) ;
) } StGHAL
i
(SIG_IHPUT_CAPTURE1)
od
przechwycenia
unionł unsigned int czas; unsigned char czasb[2); luczas; unsigned char czasS; uczas.czasb[0)=iCR]L; //zatrzaśnij rejestry przechwytywania uczas.czasbil J =ICR1H,czas8=~{(uczas.czas/uwspkal.wspkal}«2); //normalizacja wyniku do postaci 6-bitowej //liczby binarnej przesuniętej o 2 bity //w lewo (P0RTB1 i 0 są wykorzystywane //przez komparator analogowy) PORTB=(PORTBŁ0x03) Jczas8; //wyświetl wynik na LEDach pomiar=l; //pomiar dokonany (zapal flagę) sbi(PORTD,4) ; //zacznij rozładowywać kondensator //pomiarowy )
int main(void) DDRD=0xl0; PORTD=0xf£; PORTB=0x01; DDRB=0xfc; TCCR1A=0; TCCRlB=0x41;
//PORTD we oprócz PD4 //z podciąganiem //PBO z podciąganiem //PORTB7-2 - wy, PORTB1-0 - we // funkcje porównania i PWM wyłączone //preskaler XTAL/1 dla TC1, przechwyty//wanie na narastającym zboczu //zezwolenie na przerwania od //przechwytywania //zezwolenie na wyzwalanie //przechwytywania komparatorem
TIMSK=Ox08; ACSR=1<:
//kasuj przerwania od timerów
if(bit_is_clear(PlND,l)) { //wciśnięty SW4 - kalibracja do { cbi(PORTD,4); //ładuj kondensator pomiarowy TCNT1H=0; //zeruj licznik 1 pomiar czasu ładowania TCNT1L=0; sbi(TIFR,ICFl); //kasuj flagę przechwytywania while(bit_is elear(TIFR,ICFl)); //czekaj aż napięcie mierzone zrówna //się z napięciem wejściowym uwspkal.wspkal=(ICRlL+2$6"ICRlH); sbi (PORTD, 4) ,• //kasuj flagę przechwytywania czekaj(l*tau); //opóźnienie związane z częstotliwością //odświeżania )while(bit_is_set(PIND, 0)) ; uwspkal.wspkal/ = 64 ; eeprom_wb(l, uwspkal .wspkalMO]); //zapisz współczynnik kalibracji eeprom_wb(2,uwspkal.wspkalb[1]) ; //do pamięci EEPROM sbi(TIFR,ICFl); //kasuj flagę przechwytywania —
)
else ( uwspkal.wspkal=eeprom_rw(l); //odczytaj współczynnik kalibracji z EEPROM-u )
sei{);
//odblokuj globalne przerwania
wtule(l) l cbi(PORTD,4); TCNT1H=0; TCNTIL^O; pomiar=0; whilę(pomiar==0) ,czekaj(23*tau);
//główna pętla pomiarowa //ładuj kondensator pomiarowy //zeruj licznik 1 - pomiar czasu ładowania
//czekaj aż napięcie mierzone zrówna się z //napięciem na kondensatorze pomiarowym //opóźnienie związane z częstotliwością //odświeżania wskaźnika LED
)
1
14.2.7. Ćwiczenie 7 Regulacja obrotów silnika DC. Wykorzystanie Timeral jako modulatora PWM. Obsługa pojedynczych klawiszy W życiu c o d z i e n n y m często spotykamy się ze sprzętem elektrycznym, którego parametry mogą b y ć r e g u l o w a n e przez użytkowników, np. poprzez zmianę na pięcia zasilającego. P r z y k ł a d e m mogą być urządzenia wykorzystujące silniki prądu stałego lub z m i e n n e g o (regulacja obrotów), sprzęt oświetleniowy (regu lacja jasności), piece i grzejniki elektryczne (regulacja mocy) itp. Jedną z pier wszych m e t o d praktycznej realizacji takich urządzeń, jaka n a s u w a się w sposób naturalny, to regulacja wartości napięcia zasilającego. Nie jest to niestety zada nie łatwe d o wykonania, szczególnie w przypadku urządzeń dużej mocy, gdyż może się wiązać z w y s t ę p o w a n i e m dużych strat. Z a u w a ż m y jednak, że silniki, żarówki, grzałki itp. z zasady działania są urządzeniami całkującymi, czyli m ó wiąc prościej potrafią s a m e uśredniać przyłożone d o nich napięcie, co objawia się zmianą parametrów k o ń c o w y c h (obroty, jasność świecenia, m o m e n t obro towy). W n i o s e k jest taki, że jeśli d o zasilania takich odbiorników energii zasto sowano przebieg zmienny, to wraz ze zmianą j e g o właściwości, będących fun kcją czasu, będą zmieniały się również parametry urządzeń. Wydaje się, że ma jąc d o dyspozycji mikrokontroler najprostszym rozwiązaniem jest wykorzysta nie g o j a k o generatora przebiegu prostokątnego o zmiennym współczynniku wypełnienia. W przypadku mikrokontrolerów A V R rozumowanie takie jest tym bardziej zasadne, że są o n e wyposażone w timer ( T i m e r l ) , który może pra c o w a ć j a k o modulator P W M (Pulse Width Modulation).
Z a s a d a wykorzystania
modulacji P W M będzie o m ó w i o n a w t y m ćwiczeniu na przykładzie prostego regulatora obrotów silnika prądu stałego. D o prób użyto m a ł e g o silniczka z ze stawu L e g o zasilanego napięciem stałym 5 V . O c z y w i ś c i e , w p o d o b n y s p o s ó b można sterować znacznie w i ę k s z y m i odbior nikami energii, zasilanymi nawet z sieci energetycznej. W y m a g a n a jest wte-
dy rozbudowa układu sterującego i dosto sowanie g o d o w y m a g a ń odbiornika. Zasa dę wykorzystania
modulatora
PWM
do
c e l ó w regulacji przedstawiono na r y s u n k u 14.16. Na r y s u n k u 14.16a wyjaśniono is
»h a a n -, t
totę pomysłu, czyli definicję współczynni k a wypełnienia fali prostokątnej. Genero wany
przebieg
ma
stałą
częstotliwość,
a w i ę c i okres T. Z m i a n i e m o ż e ulegać j e dynie długość impulsu t . p
Współczynnik
wypełnienia j e s t określony zależnością: Rys. 14.16. Sposób liczenia wartoś ci współczynnika wypełnienia prze biegu prostokątnego (a), przykłado we wartości średniego napięcia w zależności od współczynnika wy pełnienia (b) i (c)
T Wartość średnia takiego przebiegu (czyli całka za okres) będzie w p r o s t proporcjo-
nalna d o wartości napięcia U M i współczynnika wypełnienia a ( r y s u n k i 14.16b i c). Jak widać m e t o d a ta nadaje się d o regulacji p a r a m e t r ó w w pełn y m zakresie: od 0 d o 100%. D o realizacji modulatora P W M wykorzystamy Timer 1. Odpowiedni tryb pracy wybiera się poprzez ustawienie d w ó c h najmłodszych bitów rejestru T C C R 1 A ( P W M 1 1 i P W M 1 0 ) . Układ można skonfigurować w zależności od potrzeb ja k o 8-, 9- lub 10-bitowy modulator P W M . Uzyskuje się w ten sposób różne roz dzielczości, a więc i precyzję regulacji. Szczegóły o m ó w i o n o w rozdziale 5.3. W ćwiczeniu wybrano wariant 10-bitowy, w którym wyjście O C I (PB3) jest ustawiane w momencie zrównania się zawartości rejestrów licznika ( T C N T 1 H i T C N T I L ) z rejestrami porównania ( O C R 1 A H i O C R I AL) podczas zliczania w dół. Jest to tzw. prosty wariant modulacji, w którym stan wysoki wyjścia O C I jest proporcjonalny do zawartości rejestrów O C R 1 A . Ten tryb jest konfi gurowany bitami C O M 1 A 1 i C O M 1 A 0 rejestru T C C R 1 A (patrz t a b l i c a 5.6). W y d a w a ć by się mogło, że 10-bitowa rozdzielczość, odpowiadająca 1024 kro k o m regulacji, jest zbyt duża. W praktyce okazuje się jednak, że efektywny za kres regulacji obrotów silnika D C pokrywa zaledwie część możliwych wartoś ci. W konkretnym przypadku wynosił on a = 0,75...1. Wartość średnia napięcia zasilającego silnik odpowiadająca wypełnieniu poniżej 0,75 była na tyle mała, że silnik nie byl w stanie kręcić wirnikiem. W tych warunkach efektywna roz dzielczość sterowania odpowiadała mniej więcej 8-bitowej. Regulacja częstotliwości g e n e r o w a n e g o przebiegu P W M j e s t niestety dość ograniczona. T r u d n o tu m ó w i ć nawet o regulacji, j e s t to raczej w y b ó r j e d n e j
z kilku m o ż l i w y c h wartości. Częstotliwość ta zależy jedynie od rozdzielczoś ci P W M i wartości preskalera u s t a w i o n e g o dla T i m e r a l (patrz tablice 5.4 i 5.5). W ć w i c z e n i u w y b r a n o preskaler 3, czyli podział częstotliwości przez 6 4 (tablica 5.4). D l a 10-bitowej P W M m a m y d o d a t k o w o podział f c i / 2 0 4 6 . T
Ostatecznie, przy k w a r c u 8 M H z , wyjściowa częstotliwość przebiegu P W M będzie równa: osc 64 =61,1Hz 2046
f,P W M ~
W y b r a n i e m n i e j s z y c h wartości w przypadku sterowania silnikiem nie jest w s k a z a n e , g d y ż wystąpią w y r a ź n i e o d c z u w a l n e szarpania wału. M o ż n a nato miast z p o w o d z e n i e m s t o s o w a ć j e przy sterowaniu grzałką. Przed przystąpieniem d o e k s p e r y m e n t ó w należy na uniwersalnym polu m o n t a ż o w y m płytki Z L 1 A V R przygotować interfejs pomiędzy mikrokontrolerem i silnikiem. J e g o schemat p o k a z a n o na r y s u n k u 14.17. T y p użytego tranzys tora zależy od rodzaju silnika. N a ogół przy zasilaniu 5 V , prąd pobierany przez n i e g o z zasilacza będzie rzędu kilkuset m A . Użyty d o prób silnik p o bierał ok. 2 0 0 m A przy pełnych obrotach i bez obciążenia. W a r t o ś ć rozrucho wa była j e d n a k znacznie w i ę k s z a . Trzeba j e s z c z e pamiętać o tym, że silnik jest e l e m e n t e m i n d u k c y j n y m i podczas i m p u l s o w e g o zasilania powstają na n i m d o ś ć d u ż e przepięcia, m o g ą c e uszkodzić złącze kolektor-emiter tranzys tora. S z k o d l i w e impulsy m o ż n a gasić kondensatorem o wartości kilkuset p F d o ł ą c z o n y m równolegle d o silnika lub diodą (jak na r y s u n k u 14.17). W a r t o również w y p o s a ż y ć stabilizator U l w radiator, gdyż jeśli silnik będzie zasilany z napięcia + 5 V dostępnego na płytce, m o ż e się on dość m o c n o grzać. Baza tranzystora p o w i n n a być połączona poprzez rezystor R
B
z wyjściem O C I mik
rokontrolera (PB3). W t y m celu najlepiej jest założyć zworkę Z W _ P O R T B w pozycji 9-10, a na szpilkę P O R T B - 5 w ł o ż y ć kabelek, którego drugi koniec należy p r z y l u t o w a ć d o rezystora R , zgodnie z rysunkiem 14.17. B
+UCC
AT9052313
iw. PORTB PORTB —O
(PB3)OC1 9
10
5
RB 1K
CTD-
Rys. 14.17. Schemat elektryczny interfejsu służącego do sterowania silnikiem DC
Regulacji obrotów silnika dokonuje się w ćwiczeniu za pomocą przycisków S W 1 (zmniejszanie) i S W 4 (zwiększanie). D o zapamiętywania aktualnej war tości współczynnika wypełnienia przebiegu P W M służy z m i e n n a upwm. Jest to unia zawierająca składową typu i n t ( u p w m . pwm), niezbędną d o przecho w a n i a liczby większej niż 8-bitowa oraz tablicę d w u e l e m e n t o w ą typu c h a r ( u p w m . p w m c ) , przydatną d o wyłuskiwania poszczególnych bajtów składo wej u p w m . p w m . N a początku programu zmiennej u p w m . p w m j e s t nadawana wartość 0x3ff, c o jest r ó w n o z n a c z n e z w y s t e r o w a n i e m wyjścia O C I w s t a ń wysoki. Silnik p o restarcie rusza w i ę c z pełnymi obrotami. W pętli głównej p r o g r a m u badane jest naciśnięcie klawisza S W 4 i jeśli fakt ten zostanie wy kryty, wartość współczynnika wypełnienia (a ściślej długość impulsu t ) jest p
zwiększana o aktualnie obowiązujący przyrost. D o d a t k o w o s p r a w d z a się, czy nie przekroczono wartości TOP (0x3ff przy takich ustawieniach j a k w ć w i czeniu), c o byłoby interpretowane j a k o przeskok d o wartości 0 , a w i ę c p o w o d o w a ł o zatrzymanie silnika. Jeśli taka sytuacja nastąpi, zmiennej u p w m . p w m nadaje się wartość T O P . Po tych czynnościach w y w o ł y w a n a j e s t , znana j u ż z wcześniejszych ć w i c z e ń , funkcja c z e k a j , generująca opóźnienie. U z y s k u j e się dzięki temu efekt eliminacji trzasków a zarazem zabezpiecza się przed niepożądanym
ponownym
zinterpretowaniem
stanu
SW4
(w
następnej
iteracji pętli), gdy nie został j e s z c z e zwolniony. Z a k ł a d a się przy tym, że p o j e d y n c z e naciśnięcie klawisza nie p o w i n n o trwać dłużej niż 150 m s . Jest to wartość s p r a w d z o n a w praktyce. P o d o b n e działania p o d e j m o w a n e później, służą d o obsługi klawisza S W 1 . W t y m przypadku w s p ó ł c z y n n i k wypełnienia j e s t j e d n a k zmniejszany. Z a d b a n o również, aby p o osiągnięciu wartości zero wej nie zmniejszać dalej tego współczynnika. Każde naciśnięcie d o w o l n e g o klawisza powoduje i n k r e m e n t o w a n i e zmiennej l i c z n i k k l . Przekroczenie wartości 6 odpowiada przytrzymaniu klawisza przez ok. 0,9 s i powoduje zwiększenie zmiennej p r z y r o s t o 16. O d p o w i a d a to przyspieszeniu regula cji współczynnika wypełnienia. Po wykryciu zwolnienia klawiszy,
obie
z m i e n n e wracają d o s w o i c h wartości początkowych. Ostatnie d w i e instrukcje pętli głównej służą d o przepisania parametrów przebiegu P W M ze zmiennej u p w m . p w m d o rejestrów O C R 1 A , c o znajduje odbicie w z m i a n i e obrotów silnika. P r o g r a m realizujący przedstawione zadanie znajduje się na l i s t i n g u 14.8. Na leży s k o m p i l o w a ć p r o g r a m cwicz7.c stawu Z L 1 A V R plikiem w y n i k o w y m
i z a p r o g r a m o w a ć mikrokontroler z z e cwicz7.hex.
Konfiguracja płytki Z L 1 A V R : • zworka J3 w pozycji 1-2, zworka J 4 w pozycji 2-3 - dołączony oscylator wewnętrzny,
• z w o r k a J P 1 z w a r t a - g l o b a l n e włączenie diod L E D , • z w o r k a J P 4 i J P 5 w p o z y c j i 2-3 ( d o ł ą c z e n i e p o j e d y n c z y c h
klawiszy
do
mikrokontrolera), • z w o r k a J P 6 i J P 7 z w a r t a (dołączenie k l a w i s z y d o m i k r o k o n t r o l e r a ) , • p o ł ą c z y ć k a b e l k i e m n ó ż k ę 9 Z W _ P O R T B z nóżką 16 Z W _ P O R T B , • n ó ż k ę 5 ł ą c z ó w k i P O R T B p o ł ą c z y ć z r e z y s t o r e m R B interfejsu
przygoto
w a n e g o w c z e ś n i e j n a u n i w e r s a l n y m p o l u m o n t a ż o w y m ( r y s u n e k 14.17), • zworki JP8 i JP9 rozwarte, • p o ł o ż e n i e p o z o s t a ł y c h z w o r e k nieistotne ( n p . r o z ł ą c z o n e ) . List. 14.8. Program do ćwiczenia 7 j
/ » * * i H r * * * * * * * * ł * * * * * » * « * * * i > « * » * * » * * » ł l r * * » « « * « * « ł *
1
H n l r * * * * * » * * * # » * ^
/* Ćwiczenie 7 - Regulacja obrotów silnika DC */ /* Modulacja PWM przy użyciu timeral */ /* J.D. -2003 */ /*********»•****»****«**»***«*«*»*»»****»»*«•*********»***•********/ Sinclude void czekaj(unsigned long zt) //funkcja opóźnienia { Sdefine tau 10.38 unsigned char ztl; for(;zt>0;zt--) { for(ztl = 255;ztl!=0;ztl--) ; )
)
int main( void ) ( unsigned char licznikkl=0; char przyrostki;
//zmienna wykorzystywana do pomiaru //czasu naciśnięcia przycisków //przyrost zmiany współczynnika //wypełnienia sygnału PWM
union {
unsigned int pwm; unsigned char pwmc{2]; Wolatile upwm; //aktualny współczynnik wypełnienia //sygn. PWM DDR8=0xQ8; PORTB=0; DDRD=0x£c; PORT7>0x03; TCCRlA:Ox83;
TCCR18=Ox03TCNTlL=0x00-
p B 3
(
o
c
l
// ' "V " wyJ //pozostałe we //bez podciągania
ś c i e
P W M
>-
//PDI i PDO - we (obsługa klawiszy SW1 //i SW4), pozostałe wy //wejścia z podciąganiem (potrzebne dla //klawiatury) //PWM 10 bitowy //zerowanie OCI po spełnieniu warunku //równości podczas liczenia w górę, //ustawiane podczas liczenia w dół ,'/preskaler = 3 , co przy 10-bit PWM daje //Fwy=ok. 61Hz 08MHz //wstępne ustawienie licznikal
TCNTlH=Ox0O; upwm.pwm= O x 3 £ f ;
while(l)
//początkowo silnik włączony, wartość TOP //odpowiada wysokiemu poziomowi na //wyjściu OCI (PB3) //główna pętla programu
i
if(bit_is_clear(PlND,1)) { upwm.pwm+=przyrost; if{upwm.pwm>Ox3ff) t upwm.pwm= 0x3 f f;
//czy wciśnięto SW4 //zwiększ pwm
//jeśli przekroczono wartośó TOP, to //ustaw TOP
)
czekaj {150*tauł;
//eliminacja drgań i powtórnej //interpretacji naciśnięcia przycisku //mierz długość naciśnięcia przycisku
licznikkl++; )
else { if(bit_is_clear(PIND,Q)) < upwm.pwm-^przyrost; if(upwm.pwm>0x3ff) { upwm.pwm=0;
//czy wciśnięto SW1 //zmniejsz pwm //odpowiada to upwm.pwm<0 //jeśli przekroczono wartość zero, to //ustaw zero
}
czekaj (150*tau);
//eliminacja drgań i powtórnej //interpretacj i naciśnięcia przycisku //mierz długość naciśnięcia przycisku
1icznikkl+ł; }
else { licznikk]=0; przyrostki ;
//zeruj licznik pomiaru czasu naciśnięcia //klawisza ponieważ wszystkie przyciski //są zwolnione //ustaw początkową wartość przyrostu //dla pwm
J )
if (licznikkl>6) ( przyrost=16;
//wykryto długie naciśnięcie przycisków, //zwiększ krok regulacji
licznikkl=6;
ł OCRlH=upwm.pwmc[1 ] ; OCRlL=upwm.pwmc[0] ; ) >
//wpisz aktualnie ustawiony współczynnik //do rejestrów //OCR1 timerai
14.2.8. Ćwiczenie 8 Sterowanie obrotami silnika DC z komputera PC. Wykorzystanie Timeral jako modulatora PWM. Wykorzystanie UART-a mikrokontrolera do prowa dzenia transmisji szeregowej pomiędzy płytką ZL1AVR a komputerem PC W p o p r z e d n i m ć w i c z e n i u w y k o n a l i ś m y autonomiczny sterownik silnika prą du stałego. T y m r a z e m zbudujemy interfejs pozwalający sterować silnikiem z p o z i o m u k o m p u t e r a P C . D o tego celu zostanie wykorzystany w b u d o w a n y w mikrokontroler
AVR
U A R T (Universal
Asynchronous
układ
asynchronicznej Receiver
transmisji
and Transmitter).
szeregowej
-
Dzięki niemu
m o ż n a w b a r d z o prosty s p o s ó b zrealizować łączność poprzez port szeregowy C O M , w j a k i j e s t w y p o s a ż o n a większość k o m p u t e r ó w . Niewątpliwą zaletą łączności poprzez łącze R S 2 3 2 C jest prostota protokołu k o m u n i k a c y j n e g o i fakt, ż e większość mikrokontrolerów, nie tylko A V R , m a z a i m p l e m e n t o w a n y układ U A R T . Wadą natomiast jest konieczność d o b u d o w y w a n i a k o n w e r t e r a p o z i o m ó w , zgodnego ze standardem R S 2 3 2 . Na płytce Z L 1 A Y R rolę tę pełni układ U 4 .
Interfejs RS232 Interfejs R S 2 3 2 m a d o s y ć długą historię, sięgającą lat 60. X X wieku. M i m o to przetrwał d o dzisiaj w p r a w i e niezmienionej postaci. W p ł y n ę ł a na to j e g o o g r o m n a p o p u l a r n o ś ć tak w sprzęcie profesjonalnym, j a k i p o w s z e c h n e g o użytku. W r o k u 1991 z m i e n i o n o nazwę standardu z R S 2 3 2 n a E I A 2 3 2 , nadal jednak, c h y b a z przyzwyczajenia częściej jest stosowana n a z w a pierwotna. Interfejs R S 2 3 2 C o p r a c o w a n o do p r o w a d z e n i a łączności p o m i ę d z y k o m p u t e rem i t e r m i n a l e m lub p o m i ę d z y d w o m a terminalami bez komputera. W prak tyce j e s t w y k o r z y s t y w a n y w wielu o d m i a n a c h . Najbardziej r o z b u d o w a n e p o zwalają n p . n a sprzętowe kontrolowanie przepływu danych i p r o w a d z e n i e sygnalizacji, najprostsze realizują łączność za pomocą t y l k o trzech przewo d ó w . Standard R S 2 3 2 C określa d w a rodzaje urządzeń, p o m i ę d z y którymi j e s t p r o w a d z o n a transmisja d a n y c h . Jest to D T E (Data
Terminal
Eąuipment)
najczęściej b ę d z i e n i m k o m p u t e r oraz D C E (Data CircuiMerminałing
-
Eąuip
ment) - n p . m o d e m . N o r m a przewiduje stosowanie odpowiednich gniazd p o ł ą c z e n i o w y c h , zakłada r ó w n i e ż konkretne p o z i o m y napięć na liniach interfej su. W p r a k t y c e , najczęściej nie m a potrzeby korzystania ze wszystkich możli wości interfejsu, wykorzystuje się j e g o najprostszą wersję. Schemat połączeń takiego w a r i a n t u p r z e d s t a w i o n o na r y s u n k u 14.3. Jest to połączenie n a z y w a ne null-modem.
O p i s dotyczy wersji z 9 - s t y k o w y m i g n i a z d a m i D S U B , w któ
re najczęściej są w y p o s a ż a n e komputery P C .
Łącząc urządzenia transmisyjne kablem nułl-modem
zakłada się, że zarówno
nadajniki j a k i odbiorniki są zawsze gotowe do pracy. Wykorzystanie tylko trzech przewodów - d w ó c h transmisyjnych, potrzebnych d o komunikacji dup leksowej oraz przewodu odniesienia (masy sygnałowej) - uniemożliwia jaką kolwiek możliwość sprzętowego kontrolowania przepływu danych. Oprogra mowanie używane d o prowadzenia transmisji może j e d n a k korzystać z wybra nych sygnałów interfejsu, zakładając że łączność jest prowadzona opierając się na j e g o pełnej wersji. W takich przypadkach są niezbędne widoczne na r y s u n k u 14.3 połączenia wewnętrzne p o obu stronach kabla. Ich brak będzie trakto wany j a k o zgłoszenie braku gotowości danego urządzenia, co w konsekwencji mogłoby doprowadzić d o zawieszenie transmisji lub nawet niemożności jej za inicjowania. Z tego względu bezpieczniej jest uwzględniać takie zapętlenia w urządzeniach. Na płytce Z L 1 A V R w y k o n a n o j e na obwodzie drukowanym. Standard R S 2 3 2 C określa dokładnie przypisanie wyprowadzeń gniazd D S U B poszczególnym sygnałom interfejsu. Rozkład wyprowadzeń dla wersji z gniaz dami 9-stykowymi przedstawiono w tablicy 14.3. T r z e b a zwrócić u w a g ę na to, że w gniazdach D T E ( D B 9 m ę s k i e ) i D C E ( D B 9 żeńskie) z a m i e n i o n e są miejscami w y p r o w a d z e n i a T X D i R X D . Dzięki
Tab. 14.3. Definicje sygnałów interfejsu RS232C (wersja 9-stykowa) Oznaczenie
Nazwa
opis
Numer wyprowadzenia w gnieździe DSUB9
7X0
Transmited Data
Dane nadawane z DTE do DCE. Przy braku transmisji - stan Mark
3(DB9M),2(DB9F)
RXD
Received Data
Dane odbierane przez DTE z DCE. Przy braku transmisji - stan Mark
2(DB9M).3(DB9F)
RTS
Reguest To Send Żądanie nadawania. Sygnał informuje DCE o gotowości wysiania danych przez DTE. Aktywny stan „0" (ujemne napięcie)
CTS
Clear To Send
Gotowość do odbioru. Sygnał z DCE informuje o tym, że DCE jest gotowe do przyjęcia danych. Aktywny stan . 0 " (ujemne napięcie)
8
DSR
DCE Ready
Gotowość" DCE do prowadzenia transmisji. Stan . 0 " oznacza, np. że urządzenie jest włączone i prawidłowo zainicjowane
6
DTR
DTE Ready
Gotowość DTE do prowadzenia transmisji. Stan „0" oznacza, ze DTE chce zrealizować transmisję (otworzyć kanał komunikacyjny)
4
DCD
Carrier Detect
Wykryto nośną. Sygnał wykorzystywany we współpracy z modemami. Stan . 0 " oznacza, że modem nawiązał połączenie z drugim modemem
1
SG
Signal Ground
Masa sygnałowa. Linia ta stanowi poziom odniesienia dla wszystkich sygnałów elektrycznych na styku RS232
5
Rl
Ring Indlcator
Sygnał dzwonienia. Wykorzystywany, gdy DTE jest modemem. Stan . 0 " oznacza, że modem odbiera sygnał dzwonienia z linii telefonicznej.
9
7
t e m u nadajnik j e d n e g o urządzenia jest dołączany d o
01
DTR
kl PI
r
Ł
odbiornika drugiego i odwrotnie. Połączenie może w i ę c b y ć zrealizowane za pomocą kabla 1:1.
02 RTS
k!
r
N i e k t ó r e linie interfejsu R S 2 3 2 C mogą być w pew n y c h rozwiązaniach wykorzystywane w sposób nie standardowy. Na przykład umożliwiają one zasila-
Rys. 14.18. Wykorzysta-
^
itie linii DTR i RTS jako
r e m prądu (do kilku m A ) bezpośrednio z interfejsu.
źródła zasilania
Program
urządzeń charakteryzujących się małym p o b o uruchomiony
na komputerze
powinien
przy t y m z a d b a ć o ustawienie linii wyjściowych D T R i R T S w stan S P A C E („O"), k t ó r e m u o d p o w i a d a dodatnie napięcie na wyjściu. Schemat odpowied nich połączeń j e s t p r z e d s t a w i o n y na r y s u n k u 14.18. Rezystory wyrównujące R l i R 2 o niewielkiej wartości zapewniają w miarę r ó w n o m i e r n e obciążenie obu linii. D i o d y D l i D 2 zabezpieczają przed wstecznym p o d a n i e m napięcia z j e d n e g o wyjścia na drugie. Z e względu na spadek napięcia na diodach, naj lepiej z a s t o s o w a ć diody S h o t t k y ' e g o . Do wyjścia -t-Uz można dołączyć ewen tualnie stabilizator charakteryzujący się m a ł y m prądem w ł a s n y m , aby nie zmniejszać i tak niewielkiej wydajności prądowej takiego „zasilacza". Mówiąc o transmisji szeregowej nie można pominąć zagadnień związanych z formatem d a n y c h i p r o t o k o ł e m transmisyjnym. Format danych jest związa ny z p r z y j ę t y m s p o s o b e m przesyłania poszczególnych bitów przez kanał transmisyjny, d o t y c z y w i ę c najniższego poziomu. Protokół zaś określa zasa dy p r o w a d z e n i a transmisji n a wysokim poziomie. Dotyczy metod nawiązy wania łączności, s p o s o b ó w organizowania danych w bloki, kontroli popra w n o ś c i transmisji na p o z i o m i e b l o k o w y m (np. wyliczanie s u m kontrolnych C R C ) itp. Ł ą c z n o ś ć wykorzystująca kanał szeregowy może b y ć prowadzona w sposób s y n c h r o n i c z n y
lub asynchroniczny. Pierwsza z metod
wymaga
przesyłania zegara transmisyjnego, c o może się wiązać z koniecznością doło żenia d o d a t k o w e j linii d o interfejsu. M o ż n a również stosować specjalne m e tody k o d o w a n i a d a n y c h , umożliwiające odtwarzanie zegara transmisyjnego po stronie o d b i o r n i k a bez d o d a t k o w y c h połączeń. Zagadnienia te wykraczają poza t e m a t y k ę książki i nie będziemy się nimi zajmować. Transmisja syn chroniczna j e s t r z a d k o stosowana w urządzeniach amatorskich. Druga meto da, wykorzystująca transmisję asynchroniczną jest stosowana natomiast bar dzo powszechnie. P r z y k ł a d o w e f o r m a t y danych (tzw. ramki) przesyłanych łączem s z e r e g o w y m p r z e d s t a w i o n o na r y s u n k u 14.19. Najbardziej popularnym formatem j e s t 8,n,l. Z a p i s ten oznacza, ż e ramka składa się z 8 bitów d a n y c h , nie w y k o rzystuje bitu parzystości i zawiera j e d e n bit stopu. Niezależnie od tego, każda
2
£
Jo
« w
1
|0|1|2|3|4|5|9|7|
fi
|
! i
1
[oh
J0|1|2|3|1|5|6TTT
Ramka 8, N, 1 9- o. £ Ol 1 2 3 4 5 6 7 E
1
J5J3
|0|l|g|3|4|6l6|7U|
Ramka B. E, 2 E • Wt parzystości = 1, gdy parzyaia liczba jedyni lub tMt parzystości = 0, gdy nieparzysta liczba Jedynek
Rys. 14.19. Wygląd przykładowych ramek stosowanych w asynchronicznej transmisji szeregowej
ramka zawiera j e d e n bit startu. R a m k a m o ż e mieć długość 5, 6 , 7 lub 8 bitów danych. Czasami d o kontroli poprawności transmisji u ż y w a się bitu parzysto ści. Bit taki osiąga wartość zależną od liczby j e d y n e k występujących w bi tach danych, n p . parzystej liczbie bitów danych o wartości „ 1 " o d p o w i a d a bit parzystości o wartości „ 1 " . Taka kontrola poprawności transmisji jest c h y b a najprostszą z m o ż l i w y c h , ale cechuje się s t o s u n k o w o małą
skutecznością.
Z tego p o w o d u najczęściej się z niej rezygnuje. Początek ramki jest sygnalizowany pojedynczym bitem startu
(rysunek
14.19). P o n i m następują bity danych, w y s y ł a n e od najmniej, d o najbardziej znaczącego. Następnie m o ż e w y s t ę p o w a ć bit parzystości (najczęściej g o nie ma) i j e d e n lub d w a bity stopu o wartości „ 1 " . R a m k ę z a w s z e zaczyna bit startu o wartości „ 0 " . R a m k i m o g ą b y ć w y s y ł a n e pojedynczo, niekoniecznie muszą b y ć f o r m o w a n e w większe bloki. W chwilach przerw w transmisji linia T X D
+25soace
space
(wyjście nadajnika) przyjmuje stan M A R K ( „ 1 " ) . Interfejs R S 2 3 2 wykorzystuje logikę ujemną, stanowi M A R K o d p o w i a d a ujem ne napięcie na linii wyjściowej
>
(rysunek
14.20). Należy zwrócić u w a g ę na duże
-3-
wartości napięć występujących na liniach _mark_ Uwaga! Zakres napięć -25...+25 V Jest dopuszczany przez standard, ale wszystkie układy Interfejsowa pracują poprawnie w zakresie naptec-12...+l2V.
interfejsu R S 2 3 2 C . Przyjęto j e p o to, aby zwiększyć odporność transmisji na zakłó cenia w linii. Jest to o c z y w i ś c i e j a k a ś me toda, ale tak naprawdę skuteczne jest za
Rys. 14.20. Stany występujące na li
stosowanie pętli prądowej (jak np. w inter
niach interfejsu RS232
fejsie R S 4 2 2 ) .
D o p r o w a d z e n i a transmisji szeregowej niezbędne jest utrzymywanie prawidło wej synchronizacji
nadajnika
z odbiornikiem. W transmisji
synchronicznej
problem ten jest rozwiązany w sposób naturalny - zegar transmisyjny jest prze syłany b e z p o ś r e d n i o lub jest odtwarzany innymi metodami p o stronie odbior czej. W transmisji asynchronicznej sygnał zegara nie występuje, trzeba g o wy twarzać niezależnie w nadajniku i odbiorniku. D o podsynchronizowywania od biornika służy bit startu, który powoduje zerowanie liczników odmierzających czas w układzie U A R T odbiornika. Gdyby taki zabieg nie byl wykonany, p o pewnej liczbie przesłanych danych układy .rozjechałyby" się, nawet przy wysokostabilnych generatorach. Zdolność d o wstępnej synchronizacji odbiornika nie zwalnia nas j e d n a k z konieczności j e d n a k o w e g o ustawiania parametrów ge neratorów nadajnika i odbiornika. Standard RS232 przewiduje kilka typowych szybkości transmisji. T u niestety powstaje problem. Okazuje się, że biorąc do wolne rezonatory k w a r c o w e wykorzystywane przez oscylator mikrokontrolera, jego układy c z a s o w e nie będą w stanie wytworzyć przebiegu zegarowego o częstotliwości odpowiedniej dla przyjętej szybkości transmisji. Zilustrowano to w t a b l i c y 8.1. W s p o m n i a n e wyżej zdolności odbiorników tolerują pewne odchyłki w doborze parametrów. Dopuszcza się 1% błąd. Na płytce Z L 1 A V R zastosowano rezonator 8 M H z . Z tablicy 8.1 wynika, że pozwoli on na osiąg nięcie największej dopuszczalnej prędkości transmisji równej 38400 b/s. Efek tywna prędkość transmisji będzie jednak mniejsza. Pamiętajmy, że ramka za wiera o p r ó c z bitów danych także bit startu, bit/bity stopu i ewentualnie bit pa rzystości. P o w y ż s z e problemy z doborem prędkości transmisji obowiązują tyl k o wtedy, g d y p r z e w i d y w a n e jest dołączanie standardowych urządzeń komuni kacyjnych. Parametry interfejsu R S 2 3 2 muszą być wtedy przestrzegane bez względnie. Jeśli planujemy łączyć ze sobą d w a systemy mikroprocesorowe, to wystarczy z a d b a ć jedynie o to, by ich U A R T - y były identycznie inicjowane. T o , że będą się k o m u n i k o w a ł y z niestandardowymi prędkościami nie będzie miało ż a d n e g o znaczenia.
Sterowanie silnikiem z komputera Zadanie, j a k i e m a m y d o rozwiązania w t y m ćwiczeniu, jest b a r d z o podobne d o p o p r z e d n i e g o . Z a s a d a sterowania silnikiem pozostała bez zmian. Obroty zależą od wartości średniej przebiegu P W M , j a k i m jest zasilany. W t y m ćwi czeniu s t e r o w a n i e będzie p r o w a d z o n e zdalnie n p . za pomocą komputera P C . Przyciski znajdujące się na płytce Z L 1 A V R nie będą wykorzystywane. N a ciśnięcie k l a w i s z a na klawiaturze komputera powoduje przesłanie j e g o kodu ASCII d o mikrokontrolera na płytce Z L 1 A V R . Po odebraniu znaku przez U A R T następuje j e g o interpretacja, p o c z y m są podejmowane stosowne dzia łania. Z n a c z e n i e p o s z c z e g ó l n y c h klawiszy j e s t następujące:
U - zmniejszenie obrotów. Z n a k U występuje n a j e d n y m klawiszu razem z e z n a k i e m -iJ (dobrze kojarzącym się z e zmniejszaniem wartości parametru). Z n a k U w y m a g a j e d n a k naciśnięcia d o d a t k o w o klawisza J^l, c o mogłoby b y ć niepotrzebnym utrudnieniem. UJ - z w i ę k s z e n i e o b r o t ó w . U z a s a d n i e n i e w y b o r u tego k l a w i s z a j e s t p o d o b ne jw., 1°J - natychmiastowe zatrzymanie silnika, LD - natychmiastowy start silnika z pełnymi obrotami, Ilil - żądanie przekazania aktualnych p a r a m e t r ó w przebiegu P W M sterujące g o silnikiem. W odpowiedzi na odebranie tego znaku, mikrokontroler przesy ła d o komputera aktualną wartość rejestru O C R 1 A w postaci łańcucha A S C I I reprezentującego liczbę s2esnastkową. Liczba jest poprzedzona charakterys t y c z n y m dla zapisu liczb szesnastkowych w j ę z y k u C prefiksem 0 x . Transmisja
będzie
prowadzona
z wykorzystaniem
zaimplementowanego
w mikrokontrolerze układu U A R T , pracującego z w y k o r z y s t a n i e m systemu przerwań. Dyrektywy umieszczone na początku p r o g r a m u służą d o dołącze nia niezbędnych p l i k ó w w czasie kompilacji. Kolejne definicje
pozwalają
sparametryzować konfigurowanie U A R T - u . P o d a n a j e s t t a m częstotliwość r e zonatora k w a r c o w e g o , założona prędkość transmisji oraz wyliczony n a tej podstawie parametr, j a k i należy wpisać d o rejestru U B R R . Pamiętajmy, ż e nie m a tu pełnej dowolności ( t a b l i c a 8.1). G d y nie j e s t e ś m y p e w n i wyniku, w a r t o obliczenia zweryfikować ręcznie. Następne linie p r o g r a m u , to deklara cje zmiennych globalnych, procedury obsługi przerwań i funkcje p o m o c n i cze. P r o g r a m główny rozpoczyna się, j a k zwykle, od p r a w i d ł o w e g o skonfigu r o w a n i a portów mikrokontrolera, układów c z a s o w y c h oraz U A R T - u . Port B został w całości ustawiony w trybie wyjściowym, tak by m o ż n a b y ł o w y k o r z y s t y w a ć diody L E D d o sygnalizowania różnych sytuacji. W praktyce dioda L E D 1 będzie p o k a z y w a ł a swoją intensywnością aktualnie ustawiony współczynnik wypełnienia przebiegu P W M (pełna j a s n o ś ć o d p o w i a d a wyłą czeniu silnika, całkowite wygaszenie o d p o w i a d a o b r o t o m m a k s y m a l n y m ) , dioda L E D 2 będzie zapalana w chwilach, gdy na dłużej zostanie przytrzyma ny klawisz. Wykrycie takiego przypadku będzie skutkowało zwiększeniem kroku regulacji, który domyślnie m a wartość 1, co odpowiada
największej
możliwej rozdzielczości. Port D , z wyjątkiem linii P D I , skonfigurowano j a k o wejściowy. Linia P D I j e s t wyjściem nadajnika, dlatego pracuje w trybie wyj ściowym. D o rejestru U D R R jest wpisywana wartość 12, która umożliwia pro wadzenie transmisji z prędkością 38400 b/s z błędem r ó w n y m 0,2%, a więc d o puszczalnym.
W fazie
inicjującej
włączane
są przerwania
od
nadajnika
wyslijtekstROM(info£i])
powoduje w i ę c w y s ł a n i e j e d n e j linii, zakończonej znakami \ n ( L F - Line Feed - przejście d o n o w e j linii) i \ r (CR - Carriage
Return - powrót karetki).
W p r o g r a m i e z a s t o s o w a n o d w i e funkcje o p o d o b n y m działaniu, lecz pobiera j ą c e d a n e z r ó ż n y c h t y p ó w pamięci. Wynikają one poniekąd z budowy mik rokontrolera. O ile d o pobrania danej z pamięci R A M wystarczą rozkazy LD m i k r o k o n t r o l e r a , t o p o b r a n i e danej z pamięci programu w y m a g a użycia roz kazu LPM. W j ę z y k u A V R - G C C pobieranie danych z R A M - u m o ż e b y ć zre alizowane p r z y w y k o r z y s t a n i u t y p o w y c h wskaźników, tak j a k w procedurze wyslijtekst
( * p f i f o s i o ) . D o pobierania danych z pamięci programu
służy m a k r o PRG_RDB u ż y t e w procedurze w y s l i j t e k s t R O M . G ł ó w n a pętla p r o g r a m u to w ł a ś c i w i e j e d n a instrukcja w a r u n k o w a sprawdza jąca, czy został o d e b r a n y j a k i ś znak. G d y rezultat porównania będzie pozy tywny, z o s t a n ą podjęte działania polegające n a zinterpretowaniu znaku. Za s t o s o w a n o tu instrukcję s w i t c h , świetnie nadającą się d o takiego celu. P o równuje o n a o d e b r a n y znak, kolejno ze wszystkimi interesującymi nas przy p a d k a m i . R o z p o z n a n i e klawiszy _J, U , 1°J lub lii powoduje reakcję znaną z ćwiczenia 7. R o z p o z n a n i e klawisza ii) oznacza, że d o k o m p u t e r a trzeba bę dzie przesiać aktualne parametry modulatora P W M . Wysyłany jest więc tekst informacyjny , A k t u a l n e parametry P W M : " zawarty w i n f o [ 6 ] , a bezpo średnio p o n i m prefiks 0 x . Następnie, przy wykorzystaniu
standardowej
funkcji i t o a j e s t d o k o n y w a n a konwersja aktualnego stanu rejestrów m o d u latora P W M , czyli liczby całkowitej (int) na łańcuch tekstowy. Dzięki temu liczba ta m o ż e b y ć przesłana d o komputera w postaci znaków A S C I I i b e z p o średnio w y ś w i e t l o n a na monitorze komputera. W ostatnim p a r a m e t r z e funkcji podaje się p o d s t a w ę obliczeniową. Liczba 16 oznacza, że łańcuch tekstowy zwracany p r z e z p r o c e d u r ę i t o a będzie reprezentował liczbę szesnastkową. Transmisja j e s t prowadzona przy wykorzystaniu systemu przerwań. Odbiornik zgłasza fakt odebrania znaku ustawiając flagę R X C . Powoduje to automatycz ne wywołanie funkcji SIG_UART_RECV, w której jest zapamiętywany odebra ny znak (w zmiennej k o m e n d a ) oraz ustawiana jest flaga odebrania znaku. Nadajnik zgłasza przerwanie ustawiając flagę T X C . Robi to p o wysłaniu znaku z rejestru nadajnika. Aby to j e d n a k nastąpiło, pierwszy znak musi być wpisany
„ręcznie". Dlatego w funkcjach w y ś l i j t e k s t R O M i w y ś l i j t e k s t umiesz czono instrukcje UDR= . Wcześniej jest włączany nadajnik, poprzez ustawienie bitu T X E N w rejestrze U C R . Kolejne znaki będą wysyłane z procedury obsługi przerwania T X C - SIG_UART_TRANS. W procedurze tej sprawdzane jest po nadto, czy wysłano j u ż wszystkie znaki z bufora. Każdy łańcuch tekstowy koń czy się znakiem o wartości „0". Jeśli fakt ten zostanie wykryty, to nadajnik zo stanie wyłączony poprzez wyzerowanie bitu T X E N w rejestrze U C R . D o prowadzenia łączności od strony k o m putera m o ż e b y ć w y k o r z y s t a n y
dowolny
p r o g r a m terminalowy, n p . HyperTerminal. Przed nawiązaniem połączenia, port komu nikacyjny
powinien b y ć
skonfigurowany
j a k na r y s u n k u 1 4 . 2 1 . Jeśli
z3 1
Skro* r n p w O * * fe^a*
konfigurację
p r z e p r o w a d z o n o p r a w i d ł o w o , to p o połą czeniu
płytki
ZL1AVR
z komputerem
i włączeniu jej zasilania l u b w y z e r o w a n i u mikrokontrolera, na ekranie p o w i n n y się pokazać kolejne linie przesłane Z Z L 1 A V R Bys. 14,21. Konfiguracja portu COM komputera na potrzeby ćwiczenia 8
d o komputera P C . Następnie naciskając od powiednie klawisze na klawiaturze k o m p u -
tera zmieniamy obroty silnika lub żądamy przesiania aktualnych parametrów regulacji. P r o g r a m realizujący przedstawione zadanie znajduje się na l i s t i n g u 14.9. Na leży s k o m p i l o w a ć p r o g r a m cwiczS.c stawu Z L 1 A V R plikiem w y n i k o w y m
i z a p r o g r a m o w a ć mikrokontroler z ze cwicz8.hex.
Konfiguracja płytki Z L 1 A V R : • z w o r k a J3 w pozycji 1-2, z w o r k a J4 w pozycji 2-3 - dołączony oscylator wewnętrzny, • z w o r k a J P 1 zwarta - globalne włączenie diod L E D , • zworki J P 4 i JP5 całkowicie rozłączone, • z w o r k a Z W _ P O R T B zwarta w pozycji 13-14, • połączyć kabelkiem n ó ż k ę 9 Z W _ P O R T B z nóżką 16 Z W _ P O R T B , • n ó ż k ę 5 łączówki P O R T B połączyć z rezystorem R B interfejsu przygoto w a n e g o wcześniej na uniwersalnym polu m o n t a ż o w y m ( r y s u n e k 14.17), • zworki J P 8 i J P 9 rozwarte, • położenie pozostałych zworek nieistotne (np. rozłączone), • połączyć płytkę Z L 1 A V R z komputerem poprzez port szeregowy i umchomić o d p o w i e d n i o skonfigurowany program terminalowy, n p . „Hyperterminal".
List. 14.9. Program do ćwiczenia 8
/......".......„.„„„„„„„„„„„„„„„„^^^^^^^^^^^ /* Ćwiczenie 8 - Zdalna regulacja obrotów silnika DC z komputera PC V /* Modulacja PWM przy użyciu timeral */ /* Wykorzystanie UART-u do transmisji z komputerem */ /* J.D. -2003 *j / * * * . * . * . * * * • * * * * . .
ttinciude (linclude ttinciude ttinciude #include
. H t . . . H t t . . l . »
t
t t ł . ł .
t
t t . l . . . « . . . t t t ł ł ł t ł
t
. t . * . . t . /
<progmem.h> <stdlib.h> <signal.h>
ftdefine FCPU 8000000 //częstotliwość oscylatora CPU ttdefine VUART 38400 //prędkość transmisji [b/s} ttdefine VUBRR FCPU/ {VUART*16t -1 //wpis do UBRR dla VUART unsigned char romram;
//romram=l => dane z pamięci programu //romram=0 ^> dane z RAM-u char "pfifosio; //wskaźnik na kolejkę UART-u unsigned char volatile fodbznak=0; //flaga: "odebrano znak" char komenda; //odebrana komenda z PC-ta char *fifosio[]; //wskaźnik na kolejkę UART-u
//procedura obsługi odbiornika UART-u
SIGNAL(SIG„UART_RECV) { komenda=UDR; fodbznak=l;
//zapamiętaj odebraną komendę //ustaw flagę odebrania znaku
}
//procedura obsługi nadajnika UART //wywoływana po wysłaniu znaku
SIGNAL(SIG_UART„TRANS) { char znak; if(romram) { znak=PRG_RDB(pf i fosio++);
//skąd pobierać dane? //pobierz daną z pamięci programu
}
else { znak=*pfifosio+*;
//pobierz dane z pamięci RAM
}
//czy
if (znak!=0) { UDR=znak;
koniec pobierania danych?
//nie, wyślij znak pobrany z kolejki
}
else ( cbi(UCR,TXEN);
°//tak, wyłącz nadajnik
} )
void czekaj(unsigned { ttdefine tau 10.38 unsigned char ztl; for(,-zt>0;zt--) {
long zt)
//funkcja opóźnienia
for(ztl=255;ztl1=0;ztl-->; )
void wyslijtekstROM(char
*tekst) //wysyłanie danych z pamięci programu
{
//dane będą z pamięci programu //ustaw wskaźnik na dane do wysłania //włącz nadajnik //wyślij pierwszy znak, pozostałe będą //pobierane w procedurze obsługi //przerwania TXC
romram=1; pf i fosio=tekst ,• sbi(UCR,TXEN); UDR=PRG_RDB(pfi£osio++);
void wyślij tekst(char *tekst) ( romram=0; pfifosio=tekst; sbi(UCR,TXEN); UDR=*pfifosio++;
//wysyłanie danych z pamięci programu //dane będą z pamięci danych //ustaw wskaźnik na dane do wysłania //włącz nadajnik //wyślij pierwszy znak, pozostałe będą //pobierane w procedurze obsługi //przerwania TXC
int main(void) ( unsigned char i; unsigned char volatile licznikkl=0; //zmienna wykorzystywana do pomiaru //czasu naciśnięcia przycisków char volatile przyrost=l;
//przyrost zmiany współczynnika //wypełnienia sygnału PWM //tablica komunikatów do wysłania char *info(7]={ PSTR("\n\rRegulator obrotów silnika DC\n\r*), PSTR(•, - zmniejszanie obrotów\n\r"), PSTR[". - zwiększanie obrotów\n\r") , PSTRCO - zatrzymanie silnika\n\r"}, PSTRCl - start z max. obrotami\n\r"}, PSTRCN - podaj aktualne parametry sterownika\n\r\n"), PSTR["\n\rAktualne parametry PWM:•) >;
union
//unia pozwala na bajtowy dostęp do //zmiennej int (
unsigned int pwm; unsigned char pwmcf2]; }volatile upwm;
DDRB=0xff; PORTB=0xff; DDRD=0x02; PORTD=0x02; UBRR=VUBRR; UCR=1«RXCIE
TCCRlA=0x83;
//aktualny współczynnik wypełnienia //sygnału PWM //PORTB - wy
I 1«TXCIE
//PDI - wy (RXD), pozostałe we //podciągania wejścia PDI (RXD) //ustaw prędkość transmisji 1«RXEN; //zezwolenie na przerwania od odbiornika //i nadajnika, zezwolenie na odbiór //PWM 10-bitowy
TCCRlB=Ox01; TCNTlL=OxOO; TCNTlH=OxOO; upwm.pwm=0x3 tt;
OCRlH=upwm.pwmc|1); OCRlL=upwm.pwmc(0); sei(}; for(i=0;i<5;i++) { wyslijtekstROMIinfo[i i); while(bit_is_set(UCR,TXEN))
//zerowanie OCI po spełnieniu warunku //równości podczas liczenia w górę, //ustawiane podczas liczenia w dół //preskalerO, co przy 10-bit PWM daje //Fwy=ok. 61Hz @8MHz //wstępne ustawienie licznika 1 //początkowo silnik włączony, wartość //TOP odpowiada wysokiemu //poziomowi na wyjściu OCI (P83) //wpisz aktualnie ustawiony //współczynnik do rejestrów /70CR1 timeral //włącz przerwania //wyślij winietkę //wysłanie pojedynczej linii tekstu / / trzeba zaczekać, aż zostanie wyslana //do końca
}
while(l) < if(fodbznak) { fodbznak=0; switch (komenda)
//główna pętla programu //czy odebrano jakiś znak? //tak //interpretacja komendy //odpowiedniej akcji
i wykonanie
1 1
: //odebrano *. - zwiększ prędkość upwm.pwmt-przyrost; //zwiększ PWM if(upwm.pwm>0x3ff) //jeśli przekroczono wartość TOP, to (upwm.pwm= 0x 3 f f; //ustaw TOP >
czekaj(150'tau); licznikkl++; break; •. Upwm.pwm-=przyrost; if(upwm.pwm>0x3fE) (upwm.pwm=0; I czekaj(150'tau) 1icznikkl++; break; '0-: upwm.pwm=0; break; ' 1' :
case case
upwm.pwm=0x3 f f; break; ' n' :
//eliminacja powtórnej interpretacji //naciśnięcia przycisku //mierz długość naciśnięcia przycisku //odebrano - zmniejsz prędkość //zmniejsz PWM //odpowiada upwm.pwm<0 //jeśli przekroczono wartość zero, to //ustaw zero //eliminacja powtórnej interpretacji //naciśnięcia przycisku //mierz długość naciśnięcia przycisku //odebrano "O" - zatrzymaj silnik //silnik STOP //odebrano 1" - ustaw m a x obroty //silnika //silnik na MAX
wyslijtekstROM(in£o(6l); //wysłanie pojedynczej linii tekstu
while(bit_is„aet(UCR,TXEN}) //trzeba zaczekać, aż zostanie wysłana //do końca wysli]tekst{"0x"); //wyślij prefiks dla liczb //heksadecymalnych while(bit_is_set (UCR.TXEN)); //trzeba zaczekać, aż zostanie wysiana //do kbńca itoa(upwm.pwm,fifosio,16); //konwersja liczby int (hex) //na łańcuch znakowy wyslijtekst(fifosio); //wyślij aktualna wartość PWM do PC-ta while(bit_is_set(UCR,TXEN)); //trzeba zaczekać,aż zostanie //wysłana do końca break; ;
}
if(licznikkl>6) t przyrost=16; licznikk]=6; cbi(PORTB,l>;
//wykryto długie naciśnięcie klawisza, //zwiększ krok regulacji //dalej już nie zwiększaj kroku //zapal diodę LED1
)
OCRlH=upwm.pwmc(1J, OCRlL=upwm.pwmclO] , } else { licznikkl=0; przyrost = l ; sbi(PORTB, 1);
//wpisz aktualnie ustawiony //współczynnik do rejestrów //0CR1 timeral
//jeśli cisza na linii, to ustaw //parametry spoczynkowe
//zgaś diodę LED1
)
14.2.9. Ćwiczenie 9 Obsługa interfejsu 1-Wire. Odczyt pastylki identyfikacyjnej Dallasa - DS1990A. Obsługa wyświetlacza LCD 1 6 x 2 L i c z b a r ó ż n o r o d n y c h interfejsów funkcjonujących w sprzęcie e l e k t r o n i c z n y m j e s t trudna d o o s z a c o w a n i a . W i e l e z nich z a p r o j e k t o w a n o specjalnie na p o trzeby b a r d z o k o n k r e t n y c h z a s t o s o w a ń i nie znajduje z a s t o s o w a n i a w sprzę cie p o w s z e c h n y m . I n n e , dzięki s w o i m w a l o r o m , stały się b a r d z o p o p u l a r n e i są c h ę t n i e w y k o r z y s t y w a n e p r z e z r ó ż n y c h p r o d u c e n t ó w . T r z e b a w i e d z i e ć , że w i ę k s z o ś ć z nich j e s t c h r o n i o n a p a t e n t a m i , c o nie sprzyja ich u p o w s z e c h nianiu. B y ć m o ż e to w ł a ś n i e ten fakt s t a n o w i m o t y w a c j ę d o p o d e j m o w a n i a
prac nad tworzeniem własnych rozwiązań przez większych potentatów
światowych.
Przykładem może być bardzo dynamicznie rozwijająca się jeszcze nie tak d a w n o temu firma Dallas Semiconductors, która m o ż e się szczycić wieloma bardzo oryginalnymi i u d a n y m i o p r a c o w a n i a m i . Właściwie nale żałoby p o w i e d z i e ć , że m o g ł a się p o s z c z y cić, g d y ż - j a k to często b y w a w s k o m p l i k o w a n y c h współczesnych realiach tę przejął inny potentat Fot. 14.22. Wygląd uktadów iButton
firma
firmę
Maxim,
w w y n i k u czego powstał prawdziwy gigant M a x i m - D a l l a s . J e d n y m z e sztandarowych
p r o d u k t ó w o p r a c o w a n y c h przez Dallasa są pastylki identyfikacyjne iButton, wykorzystujące j e d n o p r z e w o d o w y interfejs komunikacyjny 1-Wire, będący o p r a c o w a n i e m w ł a s n y m firmy. J e d n o p r z e w o d o w y " o z n a c z a de facto
dwa
p r z e w o d y . J e d e n to d w u k i e r u n k o w a linia transmisyjna, drugi to oczywiście p r z e w ó d odniesienia ( m a s a ) . N a uwagę zasługuje fakt, że pastylki nie w y m a gają ż a d n e g o zasilania, czerpiąc całą energię z transmitowanych sygnałów. M y l ą c y m o ż e w i ę c b y ć ich wygląd (fotografia 14.22), d o złudzenia p r z y p o minający p o j e d y n c z e o g n i w o akumulatora. W ofercie M a x i ma-Dali asa znajduje się wiele różnych o d m i a n pastylek. D o ć w i c z e n i a 9. w y b r a n o j e d n ą z najbardziej popularnych, oznaczoną s y m b o l e m D S 1 9 9 0 A . Jej zasadniczą część stanowi p a m i ę ć R O M , w której na etapie pro d u k c y j n y m zapisano m e t o d a m i laserowymi niepowtarzalny w każdym e g z e m p l a r z u n u m e r seryjny. J e g o 48-bitowa długość ma zniechęcać potencjal nych „ w ł a m y w a c z y " d o łamania kodu, co j e s t metodą skuteczną przy założe niu, ż e pastylka będzie pieczołowicie chroniona przez jej właściciela, tak j a k dzieje się to z tradycyjnymi kluczami. Sporządzenie kopii pastylki w przy padku d o s t a n i a się jej w n i e p o w o ł a n e ręce nie stanowi j e d n a k problemu, p r o tokół transmisji j e s t b o w i e m j a w n y . Dzięki temu zresztą nie są w y m a g a n e specjalne czytniki, a k a ż d y użytkownik m o ż e w e w ł a s n y m zakresie w y k o n a ć o d p o w i e d n i układ. S p o s ó b dołączenia pastylki d o mikrokontrolera jest banal ny, p r z e d s t a w i o n o g o na r y s u n k u 14.23. Dla zapewnienia komfortu pracy m o ż n a z a k u p i ć specjalne g n i a z d o (fotografia 14.24), d o którego przykłada się p a s t y l k ę . D o e k s p e r y m e n t ó w wystarczą d w a z w y k ł e przewody. A b y o d c z y t a ć dane z pastylki, trzeba przyłożyć ją d o d w ó c h punktów, zgod nie z r y s u n k i e m 14.23. C i spośród Czytelników, którzy nie mieli wcześniej d o c z y n i e n i a z u k ł a d a m i D S 1 9 9 0 , będą z a p e w n e zaskoczeni sposobem ich
Ł
—j
•
^—
1
Fot. 14.24. Korzystanie z pastyle ton ułatwiają specjalne gniazda, wyposażone w diody LED służące do Rys. 14.23. Sposób dołączenia pastylki iButton do portu mik- sygnalizowa rokontrolera go sterownika działania. Transmisja wszystkich danych trwa z a l e d w i e o k o ł o 5 m s , wystar czy w i ę c d o s ł o w n i e m u s n ą ć pastylką styki czytnika. A b y interfejs 1-Wire pracował p o p r a w n i e , port mikrokontrolera musi b y ć d w u k i e r u n k o w y , a j e g o wyjście p o w i n n o b y ć typu open drain, c o jest na ogól łatwe d o spełnienia. W przypadku płytki Z L 1 A V R , d o realizacji interfejsu 1-Wire w y k o r z y s t a n o linię P D 3 . Sterowanie tą linią będzie trochę nietypowe, c o w y n i k a z e specyfi ki interfejsu. Port D b ę d z i e w całości skonfigurowany j a k o wejściowy b e z podciągania. D o j e g o rejestru wyjściowego ( P O R T D ) zostanie n a stale wpi sana wartość „ 0 " (Unia T x na r y s u n k u 14.23). D a n e będą odbierane z pastyl ki poprzez bezpośredni odczyt rejestru P I N D . W y s ł a n i e bitu o wartości „ 1 " będzie się wiązało z ustawieniem portu w tryb wejściowy. Nie należy się te m u d z i w i ć - stan w y s o k i n a linii interfejsu j e s t w y m u s z a n y z e w n ę t r z n y m r e z y s t o r e m podciągającym ( R 4 n a p ł y t c e Z L 1 A V R ) . W y s ł a n i e bitu o w a r tości „ 0 " b ę d z i e p o l e g a ł o n a przełączeniu portu w tryb w y j ś c i o w y . W ó w czas z a p i s a n e wcześniej „ 0 " d o P O R T D s p o w o d u j e u s t a w i e n i e linii inter fejsu w stan niski. Dostęp d o informacji bitowych z p o z i o m u j ę z y k a A V R - G C C j e s t d o ś ć nie w y g o d n y . Wykorzystuje się d o tego celu n p . m a k r a s b i ( r e j e s t r , b i t ) lub c b i ( r e j e s t r , b i t ) . Pisząc p r o g r a m nie zawsze p a m i ę t a m y , w k t ó r y m rejestrze j e s t u m i e s z c z o n y dany bit. Wygodniejsze byłoby ustawianie l u b zerowanie bitów p o p r z e z bezpośrednie użycie ich symbolicznej n a z w y , n p . l c d _ e = 0 . A b y było t o możliwe, n a początku programu należy w y k o n a ć kil ka d o d a t k o w y c h czynności. P o pierwsze, m o ż n a d l a w y g o d y
zdefiniować
specjalną strukturę, która będzie później u ż y w a n a d o deklarowania bitów. W programie d o ćwiczenia 9. jest to struktura p o l e _ b i t o w e .
Następnie
zdefiniujemy m a k r o D A J _ B I T przypisujące symboliczną n a z w ę d o fizyczne-
g o a d r e s u w przestrzeni adresowej mikrokontrolera. M a k r o to korzysta z przestrzeni a d r e s o w e j pamięci R A M , w której j a k pamiętamy z wcześniej szych r o z d z i a ł ó w zawierają
się również adresy układów wejścia-wyjścia.
W s t a n d a r d o w y c h plikach n a g ł ó w k o w y c h (*.h) porty mikrokontrolera są jed nak określone w przestrzeni wejścia-wyjścia, stąd konieczność użycia dodatko wej definicji używającej adresów pamięci R A M . Przykładowo dla rejestru P O R T B należy w programie zamieścić definicję # d e f i n e
_PORTB
0x38.
Znak podkreślenia zabezpiecza przed podwójnym zdefiniowaniem tego same g o s y m b o l u . N a koniec pozostaje j u ż tylko przypisanie nazw symbolicznych o d p o w i e d n i m b i t o m poszczególnych rejestrów. N a przykład zapis # d e f i n e pastylka_we
DAJ_BIT(_PIND) . b i t 3 oznacza, że od tej chwili nazwa
p a s t y l k a _ w e będzie oznaczała bit 3 portu P I N D . D o sprawdzania stanu linii interfejsu 1-Wire zamiast stosować zapis n p . i f ( b i t _ i s _ s e t (PIND, 3 ) ) wystarczy zapis: i f ( p a s t y l k a _ w e ) , c o w j ę z y k u C j e s t
równoznaczne
z i f ( p a s t y l k a _ w e = = l ) . N i e sposób s i ę nie zgodzić z tym, że zrozumia łość drugiej m e t o d y jest d u ż o lepsza. D l a podniesienia czytelności programu zastosowano jeszcze jedną definicję związaną z wysterowywaniem linii 1-Wire. Jak j u ż było wcześniej powiedziane, wystawienie stanu niskiego, wiąże się z wpisaniem „ 1 " d o portu D D R B , analogicznie wpisanie „ 0 " powoduje ustawie nie linii w stan w y s o k i . Port związany z linią 1-Wire został nazwany p a s t y l k a _ w y dyrektywą
ttdefine
pastylka_wy
DAJ_BIT(_DDRD) . b i t 3 ,
a s t e r o w a n i e n i m o d b y w a s i ę poprzez wpisanie wartości zdefiniowanych j a ko: # d e f i n e
stan_0
1 oraz # d e f i n e
stan_l
0. Dzięki p o w y ż s z y m
z a b i e g o m u s t a w i e n i e linii 1-Wire n p . w stan niski o d b y w a s i ę w bardzo intui cyjny s p o s ó b : p a s t y l k a _ w y = s t a n _ 0 . N o d o b r z e , ale j a k zrealizować dwukierunkową transmisję danych za pomocą tylko j e d n e j linii? P o m y s ł Dallasa jest w r ę c z genialny. W urządzeniu w y k o rzystującym interfejs 1-Wire zawsze występuje jeden układ nadrzędny (Mas ter) i c o najmniej j e d e n układ podrzędny (Slave).
M o ż l i w o ś ć jednoczesnego
dołączenia kilku u k ł a d ó w p o d r z ę d n y c h wydaje się wręcz nieprawdopodobna, ale dzięki o d p o w i e d n i m z a b i e g o m p r o g r a m o w y m ich obsługa jest j a k najbar dziej m o ż l i w a . Z a g a d n i e n i a te nie będą j e d n a k omawiane w tej książce. O d p o w i e d n i e materiały m o ż n a znaleźć w notach aplikacyjnych Maxima-Dallasa. W s t a n i e
spoczynkowym
wyjściowy
port mikrokontrolera
pozostaje
w stanie w y s o k i e j impedancji, c o odpowiada wysokiemu poziomowi w y m u szanemu p r z e z rezystor podciągający. Transmisja jest prowadzona poprzez o d p o w i e d n i o określone t z w . szczeliny c z a s o w e (slots). ich rodzaje. N a początku Master
Wyróżnia się cztery
generuje szczelinę inicjującą, mającą na ce
lu w y k r y c i e , c z y d o interfejsu jest dołączony jakikolwiek układ Slave. Szcze lina ta r o z p o c z y n a się i m p u l s e m zerującym (wystawienie stanu niskiego na
okno próbkowania .
DS1990A
! j :
FC
1 stan wymuszony przez Mastera ' stan wymuszony przez Mastera
Klan wynikający z podciągnięcia rezystorem
• stan wynikający 2 podciągnięcia rezystorem
• slan wymuszany przez pastylka
Rys. 14.25. Transmisję danych pomiędzy układem iButton i mikrokontrolerem roz poczyna sekwencja zerowania (czasy w mikroksekundach)
Rys. 14.26. Okno wpisu „1" do rejest ru wejściowego układu iButton (czasy w mikroksekundach)
linię 1-Wire), trwającym m i n i m u m 4 8 0 lis ( r y s u n e k 14.25). N a r y s u n k a c h 14.26...14.2$ stany w y m u s z a n e przez Mastera
z a z n a c z o n o grubą linią ciągłą,
stany w y m u s z a n e p r z e z układ Slave grubą linią przerywaną, z a ś stan wysoki będący rezultatem podciągania rezystorem z e w n ę t r z n y m zaznaczony jest ciągłą linią cienką. D o uzyskiwania opóźnienia jest w y k o r z y s t y w a n a funkcja czekaj (czas) czas
z n a n a z wcześniejszych
ćwiczeń. W a r t o ś ć
5parametru
odpowiada opóźnieniu r ó w n e m u właśnie ok. 4 8 0 u,s (dla kwarcu
8 M H z ) . Ewentualna z m i a n a częstotliwości rezonatora będzie
wymagała
przeliczenia wszystkich c z a s ó w . Po zakończeniu impulsu zerującego, linia interfejsu j e s t z w a l n i a n a poprzez wystawienie stanu „ ł " . Teraz j e s t odmierza ny czas równy ok. 6 5 u,s. Jest o n potrzebny pastylce d o wystawienia tzw. im pulsu obecności. Niestety funkcja c z e k a j nie gwarantuje o d p o w i e d n i o wy sokiej dokładności, z t e g o w z g l ę d u d o odmierzania krótkich interwałów bę dzie używana z n a c z n i e dokładniejsza funkcja c z e k a j _ l w ( c z a s ) .
Opóź
nienie jest w t y m p r z y p a d k u r ó w n e t = (5+5-taulw)-T, gdzie t a u l w jest pa r a m e t r e m funkcji, a T to okres oscylatora s y s t e m o w e g o (125 ns przy 8 M H z ) . P o odczekaniu 65 Jis (min. 6 0 + 5 u.s rezerwy) mikrokontroler s p r a w d z a , czy linia 1-Wire znajduje się w stanie niskim. Jeśli tak, m o ż e to oznaczać, że zgłosiła się pastylka, ale m o ż e b y ć też p o w o d e m zwykłego zwarcia linii. Sy tuację tę trzeba będzie rozpoznać w dalszej kolejności. T y m c z a s e m fakt wy krycia niskiego stanu n a linii interfejsu jest zapamiętany przez inkrementację zmiennej pomocniczej z p . Po kolejnym odczekaniu ok. 4 1 5 u,s do k o ń c a szczeliny (czas ten w y n i k a z protokołu komunikacyjnego interfejsu 1-Wire) mikrokontroler p o n o w n i e bada stan linii. Przed zakończeniem szczeliny p a s tylka p o w i n n a z w o l n i ć linię, c o odpowiada stanowi w y s o k i e m u będącemu w y n i k i e m podciągania rezystorem R 4 . W y k r y c i e w t y m m o m e n c i e stanu nis-
J60...120)
15
^
U
*
--"
Okno próbkowania OSlWOA ^.
^
-
I r
>j i
«
10
J
•
ffiOM)
* stan wymuszony przez Mastera
stan wymuszony przez Mastera stan wynikający z podciągnięcia rezystorem
stan wynikający z podciągnięcia rezystorem — — — • stan wymuszany przez pastylkę
Rys. 14.27. Okno wpisu „0" do rejestru wej ściowego układu iButton (czasy w mikroksekundach)
Rys. 14.28. Odczyt stanu wyjścia danych układu iButton przez mikrokontroler (czasy w mikroksekundach)
k i e g o n a j p r a w d o p o d o b n i e j będzie efektem zwarcia - zmienna z p jest p o raz kolejny i n k r e m e n t o w a n a . P o zakończeniu fazy inicjującej pastylkę mikrokon troler r o z p o z n a j e , która z p o w y ż s z y c h sytuacji wystąpiła na linii interfejsu. Jeśli z m i e n n a z p m a w a r t o ś ć 1, to z d u ż y m prawdopodobieństwem można p r z y p u s z c z a ć , ż e została r o z p o z n a n a obecność pastylki i nastąpi teraz próba odczytania z niej d a n y c h . A b y to uczynić, mikrokontroler musi przesłać do pastylki r o z k a z Czytaj
ROM
o kodzie 0 x 3 3 (lub 0x0f). Służy d o tego celu
u n i w e r s a l n a funkcja z a p i s z l w ( d a n a ) , której parametrem będzie w t y m przypadku wartość 0 x 3 3 . Funkcja ta wyłuskuje kolejne bity danej, począwszy od najmniej znaczącego, i wywołuje funkcję s l o t l w _ z a p ( z n a k ) , której za d a n i e m j e s t w y g e n e r o w a n i e odpowiedniej szczeliny nadawczej. W zależności od wartości t r a n s m i t o w a n e g o bitu, szczelina nadawcza przybiera odpowied nią p o s t a ć . W p r z y p a d k u bitu „ 1 " m a m y d o czynienia ze szczeliną Zapisz
je
den ( r y s u n e k 14.26). Mikrokontroler ustawia linię interfejsu w stan niski, odczekuje 11 u s , p o c z y m z w a l n i a j ą wpisując „ 1 " . Po 15 u s od chwili w y z e rowania, u k ł a d odbiorczy pastylki rozpoczyna próbkowanie linii, które może trwać d o 6 0 u s licząc od początku szczeliny. Mikrokontroler odczekuje jesz cze 6 0 u s d o k o ń c a slotu, p o c z y m może kontynuować pracę. W przypadku transmisji bitu o wartości „ 0 " m a m y d o czynienia ze szczeliną Zapisz
zero
( r y s u n e k 14.27). R ó ż n i się ona od poprzedniej czasem przytrzymania linii 1-Wire w s t a n i e niskim, który powinien zawierać się między 6 0 a l 2 0 u s . W p r o g r a m i e odczekuje się 7 0 us. Po przesłaniu rozkazu Czytaj ROM mikro kontroler r o z p o c z y n a odbieranie danych z pastylki. Służy d o tego funkcja c z y t a j l w ( ) . W wyniku jej działania d o 8-elementowego bufora b u f o r l w zostaną zapisane kolejne bajty odebrane z pastylki. Funkcja c z y t a j l w ( ) kompletuje
poszczególne
bity
w 1-bajtowe dane, wykorzystując
funkcję
Fot 14.29. Niepowtarzalny numer seryjny układu iButton jest wypalony laserem na obudo wie układu
s l o t l w _ c z y t ( ) . Szczelinę odczytu przedstawiono na r y s u n k u 14.28. Jej początek jest sygnalizowany wyzerowaniem przez mikrokontroler linii interfej su na czas t s u (1 us), p o którym jest ona zwalniana. W t y m m o m e n c i e pastylka wystawia stan odpowiadający n a d a w a n e m u przez nią bitowi. Mikrokontroler odczekuje jeszcze ok. 14 u s d o momentu, w którym będzie mógł próbkować li nię. P o odczytaniu bitu, funkcja s l o t l w _ c z y t {) zwraca wynik d o wywołu jącej ją c z y t a j l w ( ) , gdzie j a k j u ż wiadomo następuje kompletowanie ramki i zapis danej d o bufora. D a n e odebrane z pastylki to: identyfikator rodziny układów, tzw. Family Code (w przypadku układów D S 1 9 9 0 A zawsze będzie miał wartość 1), 6-bajtowy, niepowtarzalny n u m e r seryjny pastylki (jest on również wygrawerowany na obudowie - fotografia 14.29) oraz bajt C R C sta nowiący kontrolę poprawności odczytu. Procedura rozpoznająca obecność pas tylki w czytniku czasami może mylnie zinterpretować jej dołączenie, np. w wy niku zakłócenia linii interfejsu. M o ż e się również zdarzyć, że p o prawidłowym rozpoznaniu obecności pastylki, dane nie zostaną z niej odczytane bezbłędnie, np. w wyniku braku odpowiedniego kontaktu elektrycznego. Zastosowania d o j a k i c h zostały przewidziane układy D S 1 9 9 0 A
narzucają,
aby p e w n o ś ć odczytu danych była j a k największa. W t y m celu, p o odebraniu kompletu danych jest obliczana suma kontrolna C R C (służy d o tego celu fun kcja ł i c z _ C R C { d a n a , c r c ) ) . Jak widać na r y s u n k u 14.30, wartość sumy kontrolnej jest zapisana w pamięci R O M pastylki i przesyłana w r a z z resztą danych. 8
5
Do
obliczeń
jest
wykorzystywany
wielomian
generujący
4
x + x + x + 1. Funkcja l i c z „ C R C jest implementacją w j ę z y k u C proce dury asemblerowej opublikowanej w nocie katalogowej układu D S 1 9 9 0 A . S u m a kontrolna jest liczona w programie ze wszystkich 8 odebranych baj tów. W y n i k obliczeń w przypadku poprawnej transmisji p o w i n i e n dać war-
numer bajtu w buforze butorlw 1 LSB MSB FAMILY CODE
NUMER SERYJNY PASTYLKI
USB MSB
LSB MSB
kolejność odczytu
Rys. 14.30. Mapa pamięci układu 0S1990A
tość 0. K a ż d a inna w a r t o ś ć będzie oznaczała wystąpienie błędu podczas transmisji i d a n e takie p o w i n n y b y ć zignorowane. Jest w ó w c z a s wyświetlany o d p o w i e d n i k o m u n i k a t . S u m ę kontrolną C R C można liczyć również w inny sposób. O b l i c z e n i a m o g ą b y ć p r o w a d z o n e dla siedmiu pierwszych bajtów, a w y n i k p o w i n i e n o d p o w i a d a ć bajtowi ó s m e m u . Obie metody są r ó w n o w a ż ne, w y b ó r p a d ł na pierwszą, nieco łatwiejszą w realizacji praktycznej. Po o t r z y m a n i u p r a w i d ł o w e g o wyniku na wyświetlaczu jest wyświetlany ko munikat o r o z p o z n a n i u pastylki wraz z jej n u m e r e m seryjnym i k o d e m rodzi ny. D a n e są w y ś w i e t l a n e od tyłu, począwszy od szóstego elementu tablicy b u f o r l w tak, ż e b y o d p o w i a d a ł y rzeczywistej kolejności (zgodnej z n u m e r e m w y g r a w e r o w a n y m na o b u d o w i e ) . Ostatnie dwie cyfry zawierają identyfi kator r o d z i n y . D o w y ś w i e t l a n i a danych wykorzystano standardowe funkcje biblioteczne: u t o a - zamieniająca liczbę całkowitą, w tym przypadku szesnastkową na znaki A S C I I o r a z t o u p p e r , która zamienia małe litery na wiel kie. O b e c n o ś ć pastylki j e s t d o d a t k o w o sygnalizowana zapaleniem
diody
L E D 1 . P r o g r a m w y k r y w a brak pastylki w czytniku, zwarcie linii interfejsu, przyłożenie pastylki i błąd odczytu. P r o g r a m realizujący przedstawione zadanie znajduje się n a listingu 14.10. Należy
skompilować
p r o g r a m cwicz9.c
z z e s t a w u Z L 1 A V R plikiem w y n i k o w y m
i zaprogramować
mikrokontroler
cwicz9.hex.
Konfiguracja płytki Z L 1 A V R : • z w o r k a J 3 w pozycji 1-2, zworka J 4 w pozycji 2-3 - dołączony oscylator wewnętrzny, • z w o r k a J P 1 rozwarta - globalne wyłączenie diod L E D , " z w o r k a J P 5 całkowicie rozłączona, • zworki Z W _ P O R T B zwarte w pozycjach 1-2, 3-4, 5-6, 7 - 8 , 9-10, 11-12, • z w o r k a J P 1 4 zwarta, • d o łączówki J P 1 1 dołączone p r z e w o d y czytnika układu D S 1 9 9 0 A (masa na g ó m y m styku), • p o ł o ż e n i e pozostałych z w o r e k nieistotne (np. rozłączone).
List 14.10. Program do ćwiczenia 9 | t ł ł t H ł ł ) : * ł t « « m ł « t * ł ł ł ł t l H ł t ł H i l t t f ł ł « t H i l i t ł > l l H I * l r * * « t t * * « ł * ł » ł t * * y
/* Ćwiczenie 9 - Obsługa interfejsu 1-Wire - odczyt pastylki /* O b s ł u g a wyświetlacza LCD 2x16 /* J.D. '2003 /»*«******»*«*»*»*****»»»»*******. ************************************* ttinciude ttinciude ttinciude ttinciude tt include
DS1990A
*/ */ */ f
<progmem.h> <stdlib.h> <string.h>
// Poniższe definicje służą typedef struct _bit_struct
do
realizacji
wygodnego
dostępu
bitowego
{ unsigned char unsigned char unsigned char unsigned char unsigned char unsigned char unsigned char unsigned char }pole_bitowe; ttdefine ttdefine ttdefine ttdefine ttdefine ttdefine ttdefine ttdefine ttdefine ttdefine ttdefine
bitO: bitl bit2 bit3 bit4 bit5 bit6 bit?
DAJ„BIT(adr) (*((volatile pole_bitowe*t _PORTB 0x38 _PINB 0x36 „ P O R T D 0x32 _DDRD 0x31 _ P I N D 0x30 pastylka_we DAJ_BIT(_PIND),bit3 pastylka_wy DAJ_BIT(_DDRD) -bit3 lcd_rs DAJ_BIT(_PORTB),bit2 lcd_e DAJ_BTT(_PORTB}.bit3 ledO DAJ_BlT(_PORTB).bitO
ttdefine stan_0
1
ttdefine stan_l
0
ttdefine CR
(adr)))
//definicja stanu niskiego na linii 1-Wire / / " l " oznacza p r z e ł ą c z e n i e portu w tryb //wyjściowy //port jest wcześniej wysterowany w stan //niski //definicja stanu w y s o k i e g o na linii 1-Wire / / " 0 " oznacza przełączenie portu w tryb //wejściowy //stan wysoki jest wymuszany przez zewnętrzny //rezystor podciągający //znak CR (przejście do nowej linii)
0xOa
char b u f l c d [ 4 ] ; char *pbuflcd; unsigned char buforlwfS] unsigned char 'pbuforlw; unsigned char w i e r s z = 0 ; unsigned char kolumna=0;
//roboczy bufor wyświetlacza LCD //wskaźnik na bufor wyświetlacza //bufor interfejsu 1-Wire (dane z pastylki} //wskaźnik na bufor danych z pastylki //pozycja umieszczenia znaku na LCD //pozycja umieszczenia znaku na LCD
void
zt)
czekaj(unsigned
{ ttdefine tau 10.38 unsigned char ztl;
long
//funkcja
opóźnienia
ior(;zt>0;zt--) i
for(zt1 = 255;ztl!=0;ztl - - ) ; }
)
/ / » » » » » » Procedury obsługi wyświetlacza LCD « « « « « « < « void piszilcdtunsigned char instr) //zapisz instrukcje sterującą do LCD i
lcd_rs=0; lcd_e=l; pORTB={PORTB&0x0f) | (inst;c&0xi0) ; //przygotuj starszy półbajt do LCD asmj"nop") asm("nop"J asm("nop") lcd_e=0; //impuls strobujący czekaj(10L); //czekaj na gotowość LCD ok. lOOus lcd_e=l; PORTB^={PORTBS.OxOf) I ( { ins t rŁ0x0f) «A) ; //przygotuj młodszy półbajt do LCD asm("nop") asm("nop"} asm{"nop") lcd_e=0; //impuls strobujący czekaj(10L); //czekaj na gotowość LCD ok. lOOus }
void piszdlcdlchar dana) //zapisz daną do LCD { lcd_rs=l; lcd_e=l; PORTB=(PORTBS0x0f)I(dana&0xf0); //przygotuj starszy półbajt do LCD asm('nop' asm("nop") asm("nop">. lcd_e=0; //impuls strobujący czekaj(10L); //czekaj na gotowość LCD lcd_e=l; PORTBn(PORTB&0x0f)I((dana&0xO£) « 4 ) ; _ //przygotuj młodszy półbajt do LCD asm("nop") asm("nop") asm{"nop"). lcd_e=0; //impuls strobujący czekaj(10L); //czekaj na gotowość LCD )
void czysclcdWoid) l
piszilcd{0x01); czekaj(1.64*tauł; wiersz=0; kolumna=0;
//czyść ekran //polecenie czyszczenia ekranu dla //kontrolera LCD //rozkaz 0x01 wykonuje się 1.64ms
}
void lcdxy (unsigned char w, unsigned char k) //ustaw współrzędne kursora V i i r t [ n r f l
piszLlcd((w*0x40+k)10x80) }
void piszznak(char znak) < piszdlcdłznak);
//standardowy rozkaz sterownika LCD //ustawiający kursor w określonych //współrzędnych //procedura umieszcza znak na wyświetlaczu //wyświetl znak na LCD
(
void pisztekst(char *tekst)
//pisz tekst na LCD wskazywany przez //•tekst
t char zn,char nr=0; while(1) { zn=PRG_RDB(Łtekst(nr++]) ; //pobranie znaku z pamięci programu //czy nie ma końca tekstu? i£(zn!=0) ( //czy 2nak nowej linii if (zn==CR} { wiersz==l?wiersz=0: + +wiersz,//przejdź do nowej linii kolumna=0; //ustaw obowiązujące po zmianie lcdxy(wiersz,kolumna) //współrzędne na LCD ł
else ( piszdlcd(zn);
//umieść pojedynczy znak tekstu na LCD
I
} else { break;
//zakończ pętlę, jeśli koniec tekstu
} } )
//»»»>»» Procedury obsługi interfejsu 1-Wire ««<«««.«« void czekaj_lw(unsigned char taulw) //pętla opóźnienia dla l-wire { //opóźnienie jest równe t=(5+5*taulw) T do //T - cykl zegarowy MCU, taulw - parametr //procedury t asm("nop•); //wstawka asemblerowa - rozkaz NOP //mikrokontrolera )while(--taulw!=0); ł
}
unsigned char slotlw_czyt(void) //slot odczytu pastylki t unsigned char bitlw; pastylka_wy=stan_0; czekaj_lw(l) ,pastylka_wy=stan_l; czekaj_lw(27); bitlw=pastylka_we==l?l:0;
//inicjuj slot czytania //odczekaj tsu //zwolnij linię //ok. H u s
czekaj_lw(118) ,return bitlw;
void
slotlw_zap(unsigned
//ok. 60us
char
znak)
//slot zapisu do pastylki 1
if(znak) < pastylka_wy=stan_0; czekaj_lw(20); pastyika_wy=stan_l; czekaj_lw(119);
//slot "1//inicjuj slot //ok. H u s //podciąganie do "l* rezystorem //zewnętrznym //60us do końca slotu
}
else 1 pastylka_wy=stan_0; czekaj_lw(139); pastylka_wy=stan_l;
//slot "0" //inicjuj slot //ok. 70us //podciąganie do *1' rezystorem //zewnętrznym
} )
void zapiszlwlunsigned char rozkaz) //transmisja 8-bitowego rozkazu //do pastylki { unsigned char i; for(i=0;i<8;i++) { slotlw_zap(rozkaz&0x01} rozkaz>>=l;
//wyślij bit do pastylki
) )
void czytajlw(void) f unsigned char i,j; unsigned char dana; pbuforlw=&buforlw[0] ; for(i=0;i<8;i++) (
dana=0; for(j=0x01;j !=0; j « = l )
//odczyt bajtu z pastylki
//dane będą umieszczone w buforze "buforlw" //czytaj "family code" (lbajt) //i "registration number" (6 bajtów) //wstępne zerowanie danej //zmienna sterująca pętli wskazuje //jednocześnie aktualnie zapisywany bit
{ dana I=slotlw_czyt()?j:dana; //czytaj kolejne bity (są one sumowane //logicznie z odczytanymi wcześniej )
•pbuforlwł+=dana;
//po skompletowaniu zapisz odebrany bajt //do bufora
void licz CRC(char bajt,unsigned char *CRC) //funkcja wyliczania CRC //wielomian generujący jest równy: //x"8 + x"5 + x"4 + 1
{ unsigned
char
zpl,zp2,i;
//zmienne
pomocnicze
zpl=bajt; £or(i=0;i<8;ił*) ( //wskaźnik *CRC wyznacza a k t u a l n i e //wyliczony CRC //wydzielenie bitu do obliczeń
A
bajt =*CRC; zp2=bajt&0x01; bajt=*CRC; i£[zp2) ( bajt"=0xl8; ) bajt=((unsigned
char)(bajt)»1)+0x80*zp2; //konwersja uch jest potrzebna d o //prawidłowego wykonania p r z e s u n i ę c i a
*CRC=bajt; zpl=(bajt=zpl>>l) ; )
int
main(void)
//program
główny
{ unsigned
char
i,zp;
//tablica komunikatów do wyświetlenia char *in£o[5]={ PSTRfWykryto pastylkę"), PSTR(-Wykryto zwarcie " ) , PSTR!"Brak pastylki * ) , PSTR(" ") , PSTR("Blad CRC " ) ,
//PORTB - wy //PORTD - w e //bez podciągania //gaś LED-a
DDRB=0x££; DDRD=0; PORTD=0; led0=l; //»»»»»»>•> lcd_rs=0; czekaj(45*tau);
Inicjowanie wyświetlacza
for(i=0;i<3;i++) { lcd_e=l; PORTB=(PORTBfi0x0I)10x30; asm("nop") asm("nop") asm("nop") lcd_e=0; czekaj(5*tau); } lcd_e=l; PORTB=(PORTB&0x0f)10x20; asm("nop"); asm{"nop"); asm("nop*); lcd_e=0; Czekaj(10L);
LCD
<<<<<<<<<<«<«<<<<
//opóźnienie ok. 45ms dla ustabilizowania //się napięcia zasilania LCD (katalogowo //min. 15 ms) //3-krotne wysłanie 3-
//wyślij
/ /ok.
3- do
LCD
5ms
//wyślij 2- do LCD //wymagane w y d ł u ż e n i e
//impu1s
s t robu jący
impulsu
piszilcd(0 28> piszilcd 0x08 ; piszi)cd(0x01); czekaj(1.64'tau);
//interfejs 4 - b i t o w y . 2 Linie, znak 5x7 //wyiacz LCD, wyłącz kursor, w y U c z mruganie //czyść LCD //wymagane dla instrukcji czyszczenia ekranu //opóźnienie p i s z i l c d ( 0 x 0 6 ) / / b e z przesuwania w prawo piszilcd(0x0c); //włącz LCD, bez kursora, bez mrugania X
;
while(l)
//główna pętla programu
zp=0; pastylka_wy=stan_0; czekaj(5): pastylka_wy=stan_l; czekaj_lw(128),if(pastylka_we==Oł
//sekwencja inicjująca pastylkę //impuls inicjujący "O" ok. 480us //zwolnij linię //po odczekaniu ok. 65us czekaj na impuls obecności
{
zp++;
//zapamiętaj fakt wykrycia impulsu obecności //pastylki
) czekaj(4);
czekaj_lw(56);
//czekaj ok. 416us do zakończenia slotu //inicjującego
if(pastylka_we==0) < zp++;
//jeśli pozostaje w stanie niskim, to oznacza //zwykłe zwarcie
)
if(zp==l) ( zapiszlw(0x33); czytajlwO; zp=0; for(i=0;i<8;i++)
//reakcja na rozpoznane sytuacje //jeśli zp=l, to oznacza że pastylka zgłosiła się //wyślij do pastylki kod rozkazu przesłania //numeru seryjnego //czytaj numer seryjny pastylki {+ kod rodziny + //CRC) / / w zp będzie liczone CRC - wstępne zerowanie
i
licz_CRC(buforlw[i),&zp); //licz CRC ze wszystkich bajtów odebranych }
lcdxy(0,0); . if (zp= = 0) t //zerowa wartość CRC oznacza prawidłowość danych ledO=0; //zapal LED-a pisztekst(info(0]); //wyświetl komunikat na LCD o rozpoznaniu pastylki lcdxy(1,0>; pbuforlw=&buforlw[7); for(i=6;il=0x£f;i--l //wyświetlenie danych z pastylki utoa( (unsigned char) buf orlw[ i ], buf lcd, 161 ,//przepisz buforlw do bufora wyświetlacza //z jednoczesną konwersją na ASCII pbuflcd=&buflcd[0]; _, //ustaw wskaźnik bufora LCD na początek if(strlen(buflcd)<2> //jeśli odebrano pojedynczą cyfrę, trzeba dopisać 0 1
(
1
piszznakt'O ł; //wyświetlenie zera wiodącego
ihilefpbuflcd)
//wyświetl zawartość bufora LCD
{
piszznak(toupper(*pbuflcd++)); //wyświetl dane z konwersja na duże litery ) }
)
else { pisztekst(info[4]); //komunikat o błędzie obliczenia CRC )
czekaj(3000*tauJ;
//przytrzymaj wynik na wyświetlaczu przez ok. 3s
ł
else { ledO=l; //gaś LED-a lcdxy(1,0); pisztekst(info[31//wyczyść dolną linie wyświetlacza lcdxy{0,0); if(zp==2> 1 //to było tylko zwarcie pisztekst{info[1]) ; //wyświetl komunikat o zwarciu }
else f
pisztekst(info[2]); //wyświetl komunikat o braku pastylki )
) }
)
142.10. Ćwiczenie 10 Obsługa interfejsu PC. Obsługa przerwania zewnętrznego. Wykorzystanie układu PCF8583 (RTC - Real Time Clock) do budowy zegara 24-godzinnego. Obsługa wyświetlacza LCD 1 6 x 2 . Kolejnym interfejsem powszechnie stosowanym w sprzęcie elektronicznym jest r^C (Inter-Integrated
Circuit).
O p r a c o w a n o g o i opatentowano w firmie
Philips, a j e g o funkcjonalny odpowiednik występuje dość często także w wyro bach innych producentów, także pod innymi nazwami. N a przykład w ukła dach Atmela nosi n a z w ę T W I (Two Wire Interface).
W większości takich przy
p a d k ó w , poza bardzo niewielkimi różnicami pozwalającymi uniknąć opłat 2
licencyjnych, poszczególne odmiany są zgodne ze standardem I C . N a z w a oryginału sugeruje, ż e interfejs I^C o p r a c o w a n o g ł ó w n i e w celu ujed nolicenia lokalnej komunikacji p o m i ę d z y układami scalonymi l u b modułami funkcjonalnymi w c h o d z ą c y m i w skład urządzenia. Łączy się w i ę c za j e g o
Młkrotcontrołor A
WyśwWttac? LCD
J
SRAM
u
EEPROM
LT
SOA
Jj
C s c T
n u
IIII
Uniwersalne porty we/wy
\
liii
Płetwom* A/C
Mikrokontroler B
Rys. 14.31. Schemat blokowy typowego urządzenia wyposażonego w magistralę PC
p o m o c ą t a k i e e l e m e n t y j a k : pamięci E E P R O M i S R A M , potencjometry elek troniczne, zegary czasu rzeczywistego ( R T C ) , czujniki temperatury, termo staty, p r z e t w o r n i k i A / C i C / A itp. Interfejs
jest wykorzystywany d o regu
lacji w z m o c n i e n i a w z m a c n i a c z y , przestrajania tunerów, wyświetlania danych na w y ś w i e t l a c z a c h L C D itp. - p r z y k ł a d ó w można m n o ż y ć wiele. W jednej 2
sieci I C m o g ą w s p ó ł p r a c o w a ć z e sobą nadajniki, odbiorniki lub układy łą czące o b i e te funkcje. L i c z b a takich elementów w jednej aplikacji z praktycz nego p u n k t u w i d z e n i a w zasadzie nie j e s t ograniczona. N i e m o ż n a j e d n a k m ó w i ć o p e ł n e j s w o b o d z i e p o d t y m względem. P o w o d e m tego są indywidu alnie p r z y p i s y w a n e adresy d l a każdego układu. N a ogól są o n e - w p e w n y m zakresie - k o n f i g u r o w a l n e , c o daje wystarczającą s w o b o d ę konstruktorowi. A b y to z r o z u m i e ć trzeba dokładniej przyjrzeć się funkcjonowaniu interfejsu 2
I C . Jest o n z a s t o s o w a n y w przykładowym urządzeniu, którego schemat blo kowy j e s t przedstawiony n a r y s u n k u 14.31.
Ogólna zasada działania interfejsu PC 2
K o m u n i k a c j a poprzez interfejs I C jest p r o w a d z o n a za pomocą d w ó c h linii: S D A {Serial
DAta)
i S C L (Serial
transmisję szeregową.
CLock).
Zastosowano tu synchroniczną
Kolejne bity danych są p r z e k a z y w a n e linią S D A
w takt sygnału z e g a r o w e g o S C L ( r y s u n e k 14.32). Transmisją - podobnie j a k to b y ł o w p r z y p a d k u interfejsu 1-Wire - zarządza układ nadrzędny
Master.
T o o n generuje o d p o w i e d n i przebieg z e g a r o w y synchronizujący transmisję.
r
ACK
T
,,
sec
g ukwencja wara
lys. 14.32. Przebieg typowej transmisji danych magistralą PC
^ C
f potwierdzenie (star. I.) [ brak potwierdzenia (stanH)
'^Z^* P S W
W
1
0
1
grupa 1 4 —
0
—»
identyfikator rodzaju układu
0 (
0
AO ftrW
grupa 2
^
błt - kierunku transmisji
zapis do Slave'a odczyt ze Slave'a
adres fizyczny
Rys. 14.33. Adres typowych układów z interfejsem PC składa się z dwóch części
2
Konstrukcja interfejsu I C p o z w a l a na obecność kilku u k ł a d ó w Master
w jed
nej sieci. Jest to m o ż l i w e dzięki p r o c e d u r o m arbitrażu i synchronizacji prze b i e g ó w zegarowych. W większości p r z y p a d k ó w b ę d z i e m y mieli j e d n a k d o czynienia z sieciami z j e d n y m u k ł a d e m pełniącym funkcję Mastera.
Najczęś 2
ciej będzie to mikrokontroler. Każdy układ wykorzystujący interfejs 1 C pra cujący j a k o Slave m a fabrycznie nadany adres identyfikacyjny. N i e jest t o j e d n a k adres niepowtarzalny dla k a ż d e g o egzemplarza, j a k w przypadku układów 1-Wire. Zazwyczaj adres j e s t podzielony na d w i e g r a p y ( r y s u n e k 14.33). Cztery naj starsze bity adresu (a7...a4) mają wartości na stałe ustalone w rejestrze adre s o w y m . P r z y k ł a d o w o w układach P C F 8 5 8 3 mają o n e wartość 1010. Kolejne trzy bity (a3...al) u ż y t k o w n i k m o ż e ustawiać w stan „ 0 " lub „ 1 " poprzez po łączenie odpowiednich wejść adresowych d o masy lub d o plusa zasilania. T o właśnie o n e gwarantują s w o b o d ę w konfigurowaniu adresu u k ł a d u . W przy padku u k ł a d ó w P C F 8 5 8 3 , bity a2 i a l są - j a k starsza część adresu - zapisane na stale. Mają o n e w a r t o ś ć „ 0 " , a u ż y t k o w n i k m o ż e z m i e n i a ć d o w o l n i e j e d y nie stan bitu aO. W rejestrze a d r e s o w y m znajduje się ponadto bit R / W (aO), poprzez który Master
informuje Słave'a,
czy będzie coś z n i e g o odczytywać
( R / W = 0 ) , czy d o niego zapisywać ( R / W = l ) . W celu zainicjowania transmisji Master
musi w y g e n e r o w a ć s e k w e n c j ę startu
- S ( r y s u n e k 14.32). O d p o w i a d a jej opadające zbocze sygnału S D A , podczas g d y linia S C L jest u t r z y m y w a n a w stanie w y s o k i m . Od tego m o m e n t u dane na liniach S D A m o g ą się zmieniać tylko wtedy, gdy linia S C L będzie w sta nie niskim. Dlatego też, po w y g e n e r o w a n i u w a r u n k u startu linia S C L j e s t ze rowana, a w chwilę później linia S D A przybiera stan zgodny z wartością naj starszego bitu transmitowanej danej. P o o k r e ś l o n y m czasie następuje poje dynczy impuls dodatni na linii S C L , powodujący zapisanie lub odczytanie bieżącego bitu. W analogiczny sposób są przesyłane kolejne bity. Specyficz na sytuacja występuje podczas dziewiątego impulsu z e g a r o w e g o . W t y m cza sie z a a d r e s o w a n y układ, musi potwierdzić p r a w i d ł o w e przyjęcie całego bajtu w y z e r o w a n i e m linii S D A (bit potwierdzenia - A C K ) . O d e b r a n i e bajtu m o ż e czasami p o w o d o w a ć dłuższą zajętość odbiornika ( s p o w o d o w a n ą n p . obsługą
p r z e r w a n i a wynikającego ze skompletowania danej w odbiorniku). Z tego p o w o d u odbiornik m o ż e p o wystawieniu potwierdzenia w p r o w a d z i ć w stan o c z e k i w a n i a (wait
stale)
Mastera
poprzez przytrzymanie linii S C L w stanie 2
n i s k i m . D o m o m e n t u jej zwolnienia wszelkie operacje na magistrali I C są z a m r o ż o n e . Jeśli nie nastąpi potwierdzenie (bit A C K = 1 ) , transmisja p o w i n n a b y ć z a k o ń c z o n a . W p o d o b n y j a k wyżej sposób przebiega przesyłanie kolej n y c h bajtów, a ż d o wystąpienia sekwencji stopu - P, czyli w y g e n e r o w a n i a narastającego i m p u l s u na Unii S D A , podczas gdy linia S C L pozostaje w sta nie w y s o k i m ( r y s u n e k 14.32). Interwały c z a s o w e p o m i ę d z y poszczególnymi z b o c z a m i na liniach interfejsu wynikają z dopuszczalnej prędkości transmisji, k t ó r e w y n o s z ą : 100 kb/s w wersji standardowej i 400 kb/s w trybie fast. 2
Specyfikację I C o p r a c o w a n o w latach 8 0 . X X wieku i obecnie wersja p o d s t a w o w a nie z a w s z e spełnia w y m a g a n i a użytkowników. W p r o w a d z o n o w i ę c 10-bitowe a d r e s o w a n i e , a m a k s y m a l n e prędkości transmisji mogą dochodzić nawet d o 3,4 M b / s (High-speed
Mode).
Większość popularnych układów j e s t
j e d n a k z g o d n a z wersją podstawową i d o niej ograniczymy się w dalszej części o p i s u , przyjmując ponadto, że w urządzeniu będzie pracował j e d e n układ
Master. 2
Przesyłanie danych magistralą \ C 2
Specyfikacja interfejsu I C szczegółowo określa zasady przebiegu transmisji tak na p o z i o m i e b i t o w y m , j a k i bajtowym. Generowanie poszczególnych bi tów o p i s a n o w c z e ś n i e j , obecnie zajmiemy się zagadnieniami
związanymi
z a d r e s o w a n i e m u k ł a d ó w Slave oraz organizowaniem danych tak, aby były p r a w i d ł o w o przesyłane. N a r y s u n k u 14.34 przedstawiono m o ż l i w e sytuacje. W p i e r w s z y m przypad ku ( r y s u n e k 14.34a) m a m y d o czynienia z zapisem danych z układu
Master
d o Slave. P o w y g e n e r o w a n i u sekwencji startu (S) Master przesyła linią S D A adres u k ł a d u Slave, d o którego kieruje dane (transmisja przebiega od najstar szego d o najmłodszego bitu). P o 7 bitach adresu, ósmy bit m a j v a r t o ś ć „ 0 " , co o z n a c z a , że d a n e będą zapisywane d o Slave'a
(jest to bit R / W , ustalający
kierunek transmisji d a n y c h ) . Bajt ten odbierają wszystkie układy dołączone d o magistrali, ale tylko ten, którego adres j e s t zgodny z n a d a n y m o d p o w i a d a wystawiając bit potwierdzenia A C K poprzez ściągnięcie linii S D A do stanu „ 0 " . Kolejny bajt transmitowany przez Mastera,
t o adres rejestru
Slave'a,
który b ę d z i e z a p i s y w a n y w następnym kroku. Odebranie tego bajtu p o w o d u j e o d p o w i e d n i e ustawienie rejestru a d r e s o w e g o w układzie Slave. W następs twie r o z p o z n a n i a bitu potwierdzenia A C K w y s t a w i o n e g o przez Slave'a,
Mas
ter r o z p o c z y n a w y s y ł a n i e kolejnych bitów, które będą po ich skompletowa-
Zapis s
^
n—i—iiii
adres slave'a
jDA
r i' i i-r-i-t rri n adres słowa |A i • • • • i i i l_
1
i i i i— ^ — n i • ir— A A P dana 1 dansN ^ ^ i.i 1 BtokNdanych
\, i
Odczyt od podanego adresu n—i—I—I—i—n—i i i i i—i t i—r |S adres 6tevo'a olAl adres Btowa
~i—i i i i i i Blok N danych
Odczyl od Wetącego adresu genetuje Master Blok N danych generuje SUtve - sekwencja startu - sekwencja stopu - bit potwierdzenia (ACK)
Rys. 14.34. Zapis danych z układu Master do Slave (a), blokowy odczyt danych ze Slave'a (b), odczyt w kilku sesjach kolejnych rejestrów Slave'a (c)
niu w bajt zapisane d o w s k a z a n e g o rejestru Slave 'a. P o wysianiu ó s m e g o bitu Słave
o d p o w i a d a p o t w i e r d z e n i e m oraz automatycznie inkrementuje
a d r e s o w y . Jeśli Master
rejestr
będzie nadawał następne bajty, będą o n e z a p i s y w a n e
d o kolejnych rejestrów Slave'a.
Przeskoczenie adresu w y m a g a zakończenia
transmisji w y s t a w i e n i e m sekwencji stop (P) i powtórzenia całej powyższej procedury z p o d a n i e m n o w e g o adresu układu i adresu rejestru d o c e l o w e g o . Sytuacja przedstawiona na r y s u n k u 1 4 . 3 4 b dotyczy b l o k o w e g o odczytu da nych z e Slave'a,
począwszy od w s k a z a n e g o adresu. Transmisja j e s t inicjowa
na w y s t a w i e n i e m sekwencji startu (S), a następnie zaadresowaniu odpowied n i e g o Slave'a.
Bit ó s m y , występujący bezpośrednio p o adresie, tak j a k w p o
przednim przypadku m a wartość „ 0 " . K a ż d y wysiany bajt k o ń c z y się j a k z w y k l e w y s t a w i e n i e m potwierdzenia. P o adresie Slave 'a i t y m razem należy w s k a z a ć adres rejestru, który będzie odczytywany w dalszej części sesji. Przełączenie Slave 'a n a nadawanie następuje p o p o n o w n y m przesłaniu sek wencji startu, a następnie j e g o adresu i bitu R / W o wartości „ 1 " . Slave odpo wiada b i t e m potwierdzenia A C K . P o j e g o p r a w i d ł o w y m rozpoznaniu zwalnia linię S D A i od tej chwili kontrolę nad nią przejmuje Słave. teraz kolejne bity d a n y c h w takt zegara S C L g e n e r o w a n e g o przez
Master
Wystawia Mastera.
P o wysłaniu ó s m e g o bitu linia S D A ponownie przechodzi pod kontrolę Maste ra, który wystawia bit potwierdzenia. Licznik adresowy Slave'a j e s t inkremen towany co powoduje, ż e w następnych krokach są przesyłane kolejne rejestry. Transmisja przebiega w podobny sposób do momentu, gdy Master nie wystawi potwierdzenia ( A C K = 1 ) . Dopiero ten warunek wyłącza nadajnik Slave'a.
Nie
m o ż n a j e d n a k z a p o m i n a ć o wygenerowaniu sekwencji stop (P). S z c z e g ó l n y m p r z y p a d k i e m m o ż e b y ć oczywiście odczytanie tylko j e d n e g o bajtu.
C z a s a m i z a c h o d z i p o t r z e b a odczyty warna kolejnych rejestrów Slave'a ale m e w j e d n e j sesji lecz w kilku. Taki przypadek przedstawiono na r y s u n k u 14.34c. P o w y g e n e r o w a n i u sekwencji startu (S) i zaadresowaniu Slaye^a z bi t e m R / W = l następuje bezpośrednie odczytywanie kolejnych rejestrów. T r a n s m i s j a przebiega w z n a n y j u ż sposób, jest kończona brakiem potwier dzenia i sekwencją stop (P). Czytając p o w y ż s z y opis m o ż n a zadać sobie pytanie, j a k t o jest możliwe, ż e różne u k ł a d y w y p o s a ż o n e z a r ó w n o w nadajniki j a k i odbiorniki korzystają bezkolizyjnie z tych s a m y c h d w ó c h linii transmisyjnych S D A i S C L . O d p o wiedzi m o ż n a się d o m y ś l a ć p o lekturze opisu interfejsu 1-Wire, metoda jest b o w i e m p o d o b n a . Porządku n a magistrali pilnują układy Master,
a dostęp d o
magistrali przez wiele u k ł a d ó w zapewniają wyjścia typu open drain.
Każda
linia j e s t i n d y w i d u a l n i e podciągana d o plusa zasilania zewnętrznym rezysto r e m podciągającym. Wartości tych rezystorów powinny g w a r a n t o w a ć uzyski w a n i e o d p o w i e d n i c h stromości zboczy impulsów przy uwzględnieniu pojem ności występujących na danej linii (ich rezystancja m a zazwyczaj wartość p o j e d y n c z y c h k Q ) . Pojęcie „linia z w o l n i o n a " oznacza wyłączenie tranzystora w y j ś c i o w e g o , w w y n i k u c z e g o na linii panuje stan wysoki w y m u s z a n y rezys torem podciągającym. W ł ą c z e n i e tego tranzystora oznacza natomiast „zwar c i e " linii d o m a s y , a więc w y m u s z e n i e na niej stanu niskiego.
2
Programowa obsługa interfejsu l C Mikrokontrolery A V R nie mają sprzętowego interfejsu l2C. Trzeba g o obsługi wać w sposób programowy. Na szczęście zadanie nie jest zbyt trudne. D o reali zacji interfejsu na płytce Z L 1 A V R wykorzystano port P D 5 (SDA) i P D 6 (SCL). Sterowanie limami będzie realizowane podobnie, j a k w interfejsie 1-Wire. W y p r o w a d z e n i a P D 5 i P D 6 będą skonfigurowane j a k o wejściowe bez podciągania. N a pozycje P O R T D 5 i P O R T D 6 rejestru wyjściowego P O R T D będzie w i ę c na stałe wpisana wartość „0", zaś w rejestrze D D R D odpowiednie bity ( D D D 5 i D D D 6 ) należy ustawić w stan „1". Linie interfejsu będą odczyty wane z rejestru P I N D . Ustawienie danej linii w stan „ 1 " jest równoważne z rekonfiguracją portu w tryb wejściowy, czemu towarzyszy - j a k wiemy - wymu szenie zewnętrznym rezystorem podciągającym stanu wysokiego. Wyzerowanie linii będzie polegało na przełączeniu portu w tryb wyjściowy. Wówczas zapisa ne wcześniej „ 0 " d o P O R T D spowoduje ustawienie linii interfejsu w stan niski. W procedurach obsługi interfejsu \K finiowania
zostaną zastosowane znane już metody de
bitów za pomocą struktury p o l e _ b i t o w e , co powinno poprawić
czytelność programu. Dla zwiększenia precyzji pętli opóźnienia zastosowano funkcję
czekaj_l2C(czas).
Opóźnienie jest dla niej r ó w n e : t = (5 + 5 • tauI2C) • T, gdzie: tauI2C - p a r a m e t r procedury, a T - okres oscylatora s y s t e m o w e g o (125 ns przy częstotliwości taktowania 8 M H z ) . Funkcja ta j e s t analogiczna d o c z e k a j _ l w w p o p r z e d n i m ćwiczeniu. 2
D o realizacji transmisji p o p r z e z interfejs I C śluzą w programie następujące funkcje: - b i t s t a r t u () i b i t s t o p u () - generują o d p o w i e d n i o sekwencję start (S) i stop (P), 2
- z a p i s z B _ l 2 C ( d a n a ) - wysyła poprzez I C pojedynczy bajt przekazy w a n y j a k o parametr d a n a , z w r a c a wartość bitu potwierdzenia A C K , 2
- c z y t a j B _ I 2 C ( a c k ) - odczytuje z I C pojedynczy bajt i w zależności od parametru a c k generuje bit potwierdzenia lub nie generuje g o , z w r a c a war tość odczytanego bajtu, - d o I 2 C ( a d r I 2 C , a d r d a n e , I z ) - wysyła l z bajtów d o układu o adresie a d r I 2 C , dane będą z a p i s y w a n e w n i m począwszy od adresu a d r d a n e , - o d I 2 C ( a d r I 2 C , a d r d a n e , l z ) - odczytuje l z bajtów z układu o adresie a d r I 2 C , dane będą odczytywane z niego począwszy od adresu a d r d a n e . (ZAPISZ BAJT 10AMA))
1=0; l<8: Ił*
^>
( Rys. 14.35. Algorytm działania funkcji zapiszBJ2C
RETJH
)
(CZYTAJ BAJT(POTWIERDZ))
W funkcjach c ł o l 2 C i o d I 2 C wykorzysty wany j e s t ten sani bufor
bufI2C[9),
w którym umieszczane są dane d o wysia nia oraz dane odebrane. Algorytmy funkcji zapiszB_I2C
i czytajB_I2C
przed
s t a w i o n o na r y s u n k a c h 1 4 3 5 i 1 4 3 6 . W
ćwiczeniu
PCF8583, micznym
10.
będący
zastosowano kompletnym,
zegarem czasu
układ autono
rzeczywistego.
D o prawidłowej pracy w y m a g a on dołą czenia t y p o w e g o zegarkowego rezonatora kwarcowego 2
1 5
= 32768 Hz oraz konden
satora o pojemności o d 15 d o 35 p F . Zastą pienie zwykłego kondensatora
trymerem
umożliwi regulację zegara, lecz d o ekspe r y m e n t ó w nie jest to oczywiście koniecz ne. M o ż l i w e jest również taktowanie ukła du zewnętrznym
przebiegiem
prostokąt
n y m o częstotliwości 50 H z , doprowadzo n y m do wejścia OSCI. Przed przystąpie niem d o eksperymentów należy na uniwer salnym
polu
montażowym
zmontować
układ, którego schemat p o k a z a n o na r y sunku
14.37. D o p u n k t ó w
z wyprowadzeniami
SDA
połączonych
(5), S C L
(6)
i I N T (7) można przylutować pionowe ka wałki p r z e w o d ó w , tak żeby wystawały ok. 7 m m ponad płytkę. Zabieg ten uwolni nas to od konieczności u ż y w a n i a lutownicy za każdym
razem,
gdy
będziemy
chcieli
zmienić konfigurację. Teraz wystarczy tyl k o nałożyć kabelek na tak przygotowany pin
i połączyć
z
odpowiednim
pinem
gniazda J 2 lub P O R T D ( r y s u n e k 14.37). Rezystory
podciągające
interfejsu
2
I C
znajdują się na płytce Z L 1 A V R . Oprócz
zaznajomienia
się
z interfejsem
2
Rys. 14.36. Algorytmy działania funkcji czytajBJZC
I C , w ćwiczeniu zostanie pokazany przy kład
użycia
przerwania
zewnętrznego
I
Cc 22p
a .
VDD OSCI
1
SDA
9 1
I
O—
SCL
32768Hz
O
Z. OSCO
>U_ SDA Q .Q SCL
1
-
fNT
AO GND
I Rys. 74.37. Schemat elektryczny BTC do zmontowania na uniwersalnym polu montażowym zestawu ZL1AVR
INTO. W trybie pracy j a k o zegar czasu rzeczywistego na wyjściu I N T układu PCF8583
jest
generowany
przebieg
prostokątny
o częstotliwości
1 Hz
i współczynniku wypełnienia 0,5. Wystąpienie opadającego z b o c z a na t y m wyjściu będzie sygnalizowało mikrokontrolerowi konieczność odczytania da n y c h z R T C i zaktualizowanie stanu wyświetlacza. T r z e b a w t y m miejscu w s p o m n i e ć , że P C F 8 5 8 3 m o ż e p r a c o w a ć r ó w n i e ż j a k o timer lub licznik zda rzeń, zliczający impulsy z wejścia O S C I . W tych trybach wyjście I N T działa trochę inaczej. W Ćwiczeniu 10. zostanie wykorzystana tylko najprostsza fun kcja zegara czasu rzeczywistego, bez ustawiania a l a r m ó w . D a n e o aktualnym czasie umieszczone są w rejestrach układu P C F 8 5 8 3 , począwszy od adresu $01 d o $ 0 6 . Pod adresem $ 0 0 znajduje się rejestr stanu będący j e d n o c z e ś n i e rejestrem sterującym. N a r y s u n k u 14.38 przedstawiono a d r e s o w a n i e danych i ich format. P r o g r a m pokazany na l i s t i n g u 14.11 zaczyna się od znanych j u ż d o b r z e in strukcji inicjujących p r a c ę wyświetlacza L C D ( 2 x 1 6 ) . Zaraz p o nich w rejes trze G I M S K jest ustawiany bit INTO, włączający
przerwania zewnętrzne
zgłaszane wejściem P D 2 (INTO). Z e względu na długi czas t r w a n i a stanu ak t y w n e g o i praktyczny b r a k możliwości j e g o zmiany, trzeba w y b r a ć wariant zgłaszania przerwania z b o c z e m . Arbitralnie w y b r a n o zbocze opadające i z te g o p o w o d u d o rejestru M C U C R zostaje wpisana wartość 0 x 0 2 . Przerwania będą m o g ł y b y ć p r z y j m o w a n e p o ustawieniu bitu I w rejestrze S R E G . C z y n i to instrukcja s e i () u m i e s z c z o n a w dalszej części programu. Przed wejściem w g ł ó w n ą pętlę p r o g r a m u jest sprawdzany stan klawisza S W 1 . Rozwiązanie takie jest b a r d z o często stosowane, np. d o uruchamiania procedur konfiguracyjnych, d o których dostęp powinien b y ć zabroniony pod-
- przerwania alarmu wyłączone - b e i przerwań alarmu timera - przerwania timera wyłączona
0
$01
0
0 ' 0 bez alarmu (BCD)
X I / 10 a
0 ' 0 ' butlmara > • 1
0
i
XI/
$02
1 $03
$04
x 1 0 min 0-24h 1-12h
r H
I
x10s
(SCO)
xl s
II
) x1
$05
x10godz
x 1 godz
]
1
Sekundy
1
miesiąc X10
i
1
Minuty
(BCD) i
Godziny
—1
(BCD)
DzfcnVrok
1i (BCO)
miesiąc x 1 .
(BCO) i
i ——1
x 1 dzień miesiąca 1
$06
i
i
dziej x 1 0 (odO do 3)
d z M i y o o d nla od Odo< »
UłamW sekund
—1
mki
i
i
rt>k (odO do 3)
[BCD)
i
|
I
1-PM
L
Rełesfratanuńnerufacy (szczegóły w nocie kautogowe] układu PCF8583)
ł
(BCD)
0-AM
(8CD>
00 8
I
0
i
i
MlesHłcWzleń tygodnia
i
Rys. 14.38. Rejestry wewnętrzne układu PCF8S83 czas n o r m a l n e g o działania programu. W t y m przypadku, jeśli przed restartem systemu z o s t a n i e naciśnięty i przytrzymany klawisz S W 1 , n a wyświetlaczu pojawi s i ę k r ó t k a informacja o płytce Z L 1 A V R . P o n o w n e j e g o naciśnięcie s p o w o d u j e wejście w n o r m a l n y tryb pracy. Główna pętla programu składa się z a l e d w i e z d w ó c h instrukcji w a r u n k o w y c h . Pierwsza -
if(zegar),
to
s p r a w d z e n i e czy m o ż n a uaktualnić stan wyświetlacza. Flaga f z e g a r jest u s t a w i a n a w p r z e r w a n i u INTO w y w o ł a n y m przebiegiem 1 H z z wyjścia I N T układu P C F 8 5 8 3 . Z g ł o s z e n i e tego przerwania oznacza z m i a n ę stanu rejest r ó w z e g a r a , a w i ę c konieczność ich p o n o w n e g o wyświetlenia. Obsługą prze r w a n i a zajmuje się funkcja SIGNAL ( S I G _ I N T E R R U P T O ) . Wywołuje ona funkcję o d l 2 C ( r t c , 0 x 0 2 , 3 ) , która odczytuje trzy kolejne rejestry po cząwszy o d adresu 0x02 z układu mającego symboliczny adres R T C (zdefi n i o w a n y w części deklaracyjnej programu j a k o 0xa0). T e trzy rejestry zawie rają informacje - j a k w y n i k a z r y s u n k u 14.38 - o sekundach, minutach i go dzinach
aktualnego
czasu.
W celu
uatrakcyjnienia
działania
programu,
w p r o c e d u r z e obsługi przerwania zmienia się dodatkowo stany diod LED1 i L E D 2 . B ę d ą o n e m i g a ć c o sekundę. W y ś w i e t l a n i e m czasu zajmuje się funk cja w y s w i e t l c z a s ( ) . Pobiera ona d a n e bezpośrednio z b u f o r a interfejsu l^C, dokonuje odpowiednich rozgrupowań danych i wyniki wyświetla na L C D za pośrednictwem funkcji n a l c d ( z n l , z n 2 ) . Ze względu na to, że operuje my tylko n a cyfrach, konwersja na znaki ASCII nie jest realizowana za pomocą procedur bibliotecznych, a jedynie poprzez proste dodanie liczby 0x30. D r u g a instrukcja w a r u n k o w a głównej pętli programu sprawdza, czy został naciśnięty klawisz S W 4 . Jeśli to nastąpi, zostaje wywołana funkcja ustawie-
nia zegara u s t a w z e g a r ( ) . Na wstępie są wyłączane przerwania,
aby
uchronić bufor b u f I 2 C przed przypadkową modyfikacją i j e s t w y ś w i e t l a n a informacja o trybie ustawiania. N a wyświetlaczu jest włączane m r u g a n i e zna ku, które ułatwia orientację podczas ustawiania zegara. W pierwszej kolej ności zmieniane są cyfry godzin. Służy d o tego celu klawisz S W 1 . J e g o na ciśnięcie powoduje modyfikację odpowiedniej grupy cyfr. G o d z i n y są zlicza n e m o d u l o 2 4 (czyli od 0 d o 23). P o p r a w i d ł o w y m ich ustawieniu należy na cisnąć klawisz S W 4 , w w y n i k u c z e g o analogiczną operację wykonuje się te raz na cyfrach minut. T y m razem licznik liczy m o d u l o 6 0 (czyli od 0 d o 59). Trzeba zwrócić u w a g ę n a to, że z m i e n n e g o d z i m i n są b e z p o ś r e d n i m od zwierciedleniem danych z rejestrów układu P C F 8 5 8 3 . Zawierają w i ę c liczby zapisane w kodzie B C D . Jeśli w i ę c w w y n i k u i n k r e m e n t o w a n i a takiej z m i e n nej nastąpi przekroczenie wartości 9, konieczne będzie w y k o n a n i e odpowied niej korekcji. Najprostsza m e t o d a polega na dodaniu liczby 0 x 0 6 . Funkcja u s t a w z e g a r () nie ustawia sekund, przyjmując założenie, że zegar będzie startowany zawsze o pełnych minutach. N a zakończenie jest wyświetlany ko munikat „ S T A R T n / t " zachęcający d o naciśnięcia k t ó r e g o ś z przycisków. Jeś li będzie to S W 4 , n o w e dane zostaną zapisane d o R T C i o d tej chwili zegar będzie p o k a z y w a ł u s t a w i o n y czas. Naciśnięcie klawisza S W 1 spowoduje zig norowanie ustawień i kontynuację wyświetlania czasu, j a k i
obowiązywał
przed wejściem d o funkcji u s t a w z e g a r ( ) . W trakcie e k s p e r y m e n t o w a n i a w a r t o rozłączyć p o s z c z e g ó l n e linie interfejsu oraz I N T i o b s e r w o w a ć j a k układ będzie reagował n a takie sytuacje. D o w y k o n a n i a ćwiczenia konieczne jest z m o n t o w a n i e układu, którego sche m a t p o k a z a n o na r y s u n k u 14.37. P r o g r a m realizujący przedstawione zadanie znajduje się na l i s t i n g u 1 4 . 1 1 . Należy s k o m p i l o w a ć program cwiczlO.c programować cwiczl
mikrokontroler
z zestawu
ZL1AVR
plikiem
i za
wynikowym
0.hex.
Konfiguracja płytki Z L 1 A V R : • z w o r k a J3 w pozycji 1-2, z w o r k a J 4 w pozycji 2-3 - dołączony oscylator wewnętrzny, • zworka J P 1 zwarta - globalne włączenie diod L E D , • z w o r k a J P 4 i JP5 w pozycji 2-3 (dołączenie pojedynczych klawiszy d o mikrokontrolera), • z w o r k a J P 6 i JP7 zwarta (dołączenie klawiszy d o mikrokontrolera), • zworki Z W _ P O R T B zwarte, • zworki I P 8 i J P 9 rozwarte, • zworki J P 1 5 i J P 1 6 zwarte, • z w o r k a Z W _ P O R T D zwarta w pozycji 11-12,
• połączyć kabelkiem n ó ż k ę 6 P O R T D z wyprowadzeniem 7. układu PCF8583, • p o ł ą c z y ć k a b e l k i e m n ó ż k ę 1 J 2 z w y p r o w a d z e n i e m 5. układu P C F 8 5 8 3 , • p o ł ą c z y ć k a b e l k i e m n ó ż k ę 2 J 2 z w y p r o w a d z e n i e m 6. u k ł a d u P C F 8 5 8 3 , • p o ł o ż e n i e p o z o s t a ł y c h z w o r e k nieistotne (np. rozłączone), • w ł o ż o n y w y ś w i e t l a c z a l f a n u m e r y c z n y 1 6 x 2 d o gniazda L C D 1 . Ust. 14.11. Program do ćwiczenia 10 /
. . . . .
ł
. . . . . . H
ł
.
t
. . . M . t
t
t
. . . ł H . , . M .
t
. . . .
l
l
, .
H
. . l l . . « t H . . . . . . . t « t . /
/* Ćwiczenie 10 - Obsługa interfejsu T2C /* układ RTC (zegar czasu rzeczywistego) - PCF8583 I* Obsługa przerwania zewnętrznego INTO /* Obsługa wyświetlacza LCD 2x16 /* J.D. '2003
linclude ftinclude #include {linclude
*/ */ */ */ */
<progmem.h> <signal .h>
// Poniższe definicje służą, do realizacji wygodnego dostępu bitowego typedef struct _bit_struct { unsigned char bitO; unsigned char bitl: unsigned char bit2: unsigned char bit3: unsigned char bit4: unsigned char bit5: unsigned char bit6: unsigned char bit7: }pole_bitowe; Kdefine DAJ_BIT(adr) (*({volatile pole_bitowe'l #define _PORTB 0x38 ttdefine „PINB 0x36 fldefine _PORTD 0x32 ttdefine _DDRD 0x31 ttdefine _PINO 0x30 ttdefine sda_we DAJ_B1T(_PIND) .bit5 ttdefine sda_wy DAJ_BIT(_DDRD) .bit5 ttdefine scl_wy DAJ_BIT(_DDRDl .bit6 ttdefine scl_we DAJ_BIT(_PIND) ,bit6 #define lcd_rs DAJ_BIT(_PORTB).bit2 ttdefine lcd_e DAJ_BIT (_PORT8) .bit3 ttdefine sw4 DAJ_BIT(_PIND)-bitl itdefine swl DAJ_BIT(_PIND).bitO ttdefine stan_0 1
(adr)))
//definicja stanu niskiego na limach I2C //•l" oznacza przełączenie portu w tryb wy ściowy //port jest wcześniej wysterowany w stan niski //definicja stanu wysokiego na liniach I2C //•O- oznacza przełączenie portu w tryb wejściowy //stan wysoki jest wymuszany przez zewnętrzny //rezystor podciągający D
Itdefine stan_l 0
ttdefine rtc QxaO
//7-bitowy adres bazowy zegara RTC //(PCF8583) = 1010000 przesunięty na //bity od 7 do 1 i uzupełniony zerem //definicja znaku CR (przejście do //nowej linii)
#define CR 0x0a
//roboczy bufor wyświetlacza LCD char buflcd[4]; //wskaźnik na bufor wyświetlacza char *pbuflcd; //bufor interfejsu I2C Idane z/do RTC) unsigned char bufI2C[9i; //wskainik na bufor danych z RTC unsigned char *pbufI2C; //pozycja umieszczenia znaku na LCD unsigned char wiersz=0; //pozycja umieszczenia znaku na LCD unsigned char kolumnado; unsigned char godz=0,min=0, sek=0,dzien=l,mies=l; unsigned char fzegar; //flaga odświeżenia stanu zegara na LCD void czekaj(unsigned { ttdefine tau 10.38 unsigned char ztl; for(;zt>0;zt-)
long zt) //funkcja opóźnienia //przybliżony przelicznik argumentu na ms
{
for(zt1=255;ztl!=0;ztl-); }
)
//»»>»»» Procedury obsługi wyświetlacza LCD <«<««<<««<<: void piszilcd(unsigned char instr) //zapisz instrukcje sterującą do LCD {
lcd„rs=0; lcd_e=l; PORTB=(PORTBŁ0x0f)I(instr&0x£Q); //przygotuj starszy półbajt do LCD asm("nop"); asm("nop"); asm("nop"); lcd_e=0; //impuls strobujący czekaj(10L); //czekaj na gotowość LCD ok. lOOus lcd_e=l PORTB={PORTBŁ0x0f)|((instr&0x0f)«4); //przygotuj młodszy półbajt do LCD asm("nop") asm("nop") asm("nop") lcd_e=0; //impuls strobujący czekaj(10L); //czekaj na gotowość LCD ok. lOOus ;
}
void piszdlcd(char dana) //zapisz daną do LCD { lcd_rs=l; lcd_e=l; PORTB=(PORTBS0x0f) I (dana&0xf0) ,//przygotuj starszy półbajt do LCD asm{ "nop"} ,asm("nop"); asm("nop*); 1cd_e=0; //impuls strobujący czekaj(10L); //czekaj na gotowość LCD lcd_e=l;
PORTB=(PORTB&0x0f)|((dana&0x0£)«4); //przygotuj młodszy półbajt do LCD asm("nop*)asm{"nop *) asm("nop") //impuls strobujący lcd_e=0; //czekaj na gotowość LCD czekaj (10L) ,• void czysclcdlvoid) { piszilcd(0x01); czekaj(1.64*tau); wiersz=0; kolumna=0;
//czyść ekran //polecenie czyszczenia ekranu dla //kontrolera LCD //rozkaz 0x01 wykonuje się 1.64ms
)
void lcdxy(unsigned char w, unsigned char k) //ustaw współrzędne kursora (
piszilcd((w*0x40+k)10x80);
void piszznakfchar znak) ( piszdlcd(znak);
//standardowy rozkaz sterownika LCD //ustawiający kursor w określonych //współrzędnych //procedura umieszcza znak na wyświetlaczu //wyświetl znak na LCD
)
void pisztekst (char 'tekst) { char zn; char nr=0;
//pisz tekst na LCD wskazywany przez *tekst
while(l) ( //pobranie znaku z pamięci programu zn=PRG_RDB(&tekstlnr+ł]); //czy nie ma końca tekstu? if(zn!=0) ( //czy znak nowej linii if(zn==CR) t wiersz==l?wiersz=0:++wiersz; //przejdź do nowej linii kolurnna=0; //ustaw obowiązujące po zmianie lcdxy(wiersz,kolumna) //współrzędne na LCD 1 else i piszdlcd(zn);
//umieść pojedynczy znak tekstu na LCD
} }
else ( break; }
//zakończ pętle, jeśli koniec tekstu
}
>id nalcd(unsigned char znl, unsigned char zn2)
i piszznak(znl+0x30);
//umieszczenie czasu na LCD z jednoczesna //konwersją na ASCII //dodanie 0x30 realizuje prostą konwersje //liczby na ASCII
piszznak!(zn2&0x0£)+0x30); )
/ / » » » » » » Procedury void czekaj_I2c(unsigned char ( do
obsługi interfejsu I2C <<<<<<<<<<<<<<<< tauI2C) //pętla opóźnienia dla I2C //opóźnienie jest równe t=l5+5*tauI2C)*T //T - cykl zegarowy MCU, //tauI2C - parametr procedury
<
asm{"nop");
//wstawka asemblerowa - rozkaz NOP //mikrokontrolera
)while(--taul2C.' = 0) ; )
void bitstartu(void) { sda_wy=stan_l; czekaj_I2C(10) scl_wy=stan_l; czekaj_I2C(10) sda_wy=stan_0; czekaj_I2C(10) scl_wy=stan_0; czekaj_I2C(10) )
void bitstopu(void) < sda_wy=stan_0; czekaj_I2C(10) scl_wy=stan_l; czekaj_l2C(10) sda_wy=stan_l; czekaj_l2C(10), J
//bit startu na magistrali I2C // SCL SDA // I // I tl I I fł i ! // I / //
I
I
// •// //
/
I 1 I
( I
ft ff N
SCL
// // // // //
\
1
I I I
SDA I I I I \
unsigned char zapiszB_l2C(unsigned char dana) { //wysłanie pojedynczego bajtu do Slave'a unsigned char i; for(i=0;i<8;i++) { if(dana&0x6Q) ( sda_wy=stan_l;
//będzie 8 bitów //badaj najstarszy bit wysyłanego znaku //wyślij -1"
)
else ( sda_wy=stan_0
//wyślij "0"
)
czekaj_I2C(10) scl_wy=stan_l,• czekaj_I2C(10) scl_wy=stan_0; czekaj_I2C(10) dana«=l;
//przygotuj następny bit do wysłania
sda_wy=stan_l; czekaj_l2C(10>; scl_wy=sCan_l; while{!scl_we);
//zwolnij linię SDA dla Slave'a
//czekaj, aż Slave będzie gotowy do //przyjęcia następnego bitu
Czekaj_l2C{10); i=sda_we; scl_wy=stan_0; czekaj_I2C(10); return i ;
//czytaj potwierdzenie ACK od Slave'a
//zwróć bit potwierdzenia ACK
)
unsigned char czytajB_l2c(unsigned char ack) { //przyjęcie pojedynczego bajtu od Slave'a I2C //parametr ack=l oznacza, że jest wysyłany ostatni bajt //bloku, nie należy więc wysyłać potwierdzenia unsigned char dana=0,i; for(i=0;i<8;i++)
//będzie 8 bitów
{
scl_wy-stan_0; czekaj_l2C<10); scl_wy=stan_l; czekaj_I2C(10); dana<<=l; danal=sda_we==l?l:0;
//przygotuj miejsce na kolejny odebrany bit //dopisz odebrany bit
)
scl_wy=stan_0; if(ack)
//czy wysyłać potwierdzenie?
{
//wyślij ACK
sda_wy=stan_0; )
else { sda_wy=stan_l;
//brak potwierdzenia sygnalizuje zakończenie //bloku
}
czekaj_I2C(10); scl_wy=stan_l; while{!scl_we);
//czekaj, aż Slave będzie gotowy do przyjęcia //następnego bitu
czekaj_I2C(10); sda_wy=stan_l; scl_wy=stan_0; return dana;
//zwolnij linię SDA
}
void bladI2C(void) { char *tekst[2]={
//reakcja na brak potwierdzenia ACK od Slave'a PSTRl'Blad I2C"), PSTRC ") );
PiSi^taeksttO]);
//wyświetl na LCD komunikat o błędzie I2C
czekaj(1500*tau); Pisztek^UekstlU); )
//wyczyść komunikat o błędzie
void dol2C(unsigned char adrI2C,unsigned char adrdane,unsigned char lz) ( //wysłanie bloku "lz" znaków do Slave'a I2C / / " a d r I 2 C - adres fizyczny Slave'a //"adrdane" - adres rejestru w Slave'ie, od k t ó r e g o będą //zapisywane dane pbufI2C=ŁbufI2C; //ustaw wskaźnik bufora I2C na jego początek bitstartu(),//wyślij bit startu (początek transmisji) if(zapiszB_I2C(adrI2C)) //wyślij adres Slave'a, to informacja dla //pozostałych układów Slave, że dane nie będą //dla nich {
bladI2C{); ) if{zapiszB_l2C(adrdane)) < bladI2C(),-
//wyświetl komunikat o błędzie //jeśli -nie było ACK //zaadresuj
rejestr
w
interfejsu
I2C,
Slave'ie
//wyświetl komunikat o błędzie interfejsu //jeśli nie było A C K
I2C,
) for(;lz!=0rlz--)
//wysyłanie bloku danych //do wysłania
{ if(zapiszB_I2C(*pbufI2C++)) //wyślij
kolejny
bajt
do
(lz
- liczba
bajtów
Slave'a
<
bladI2C();
//wyświetl komunikat o błędzie //jeśli nie było ACK
interfejsu
I2C,
) )
bitstopu();
//wyślij
bit
stopu
(koniec
transmisji)
) void ł
odI2C(unsigned char adrl2C,unsigned char a d r d a n e , u n s i g n e d char lz) //odebranie bloku "lz" znaków od Slave'a I2C //"adrI2C* - adres fizyczny Slave"a //"adrdane* - adres rejestru w Slave'ie, od k t ó r e g o będą //odczytywane d a n e bitstartu(); //wyślij bit startu (początek transmisji) if(zapiszB_I2C(adrI2C)) //wyślij adres Slave'a, to informacja dla //wybranego Slave'a, że dane będą odbierane //od niego <
bładi2C{) ,) if(zapiszB_I2C(adrdane)) { bladl2C(); ) bitstartut); if(zapiszB_I2C(adrl2c+l))
//wyświetl komunikat o błędzie //I2C, jeśli nie byio A C K //zaadresuj
rejestr
w
interfejsu
Slave'ie
//wyświetl komunikat o b ł ę d z i e //I2C, jeśli nie było ACK
interfejsu
//ponowne w y s ł a n i e bitu startu //ponowne wysłanie adresu S l a v e " a z bitem //R/W=l oznacza przełączenie Slave"a na //nadawanie
{ blad!2C(); ) pbufI2C=&bufl2C; for{;lz>l;lz--) {
//wyświetl komunikat o błędzie //I2C, jeśli nie było ACK
interfejsu
//ustaw w s k a ź n i k bufora I2C na jego początek //odbierz "lz* bajtów danych od Slave'a
*pbu£I2C +=czytajB_l2C(l)j//zapisuj odebrane bajty w buforze I2C +
-pbufI2C =czytajB_I2C{0); //odbierz ostatni bajt od I2C, nie wysyłaj ACK bitstopu O ; ........ //wyślij bit stopu (koniec transmisji] ++
}
SIGNAL(SIG_INTERRUPTO)
A
PORTB =0x03; odI2C(rtc,0x02,3); fzegar=l;
//procedura obsługi przerwania zewnętrznego //INTO //zmień stany LED1 i LED2 //odczytaj czas z RTC (tylko godz, min i sek) //ustaw flagę odczytania danych
1 void wyswietlczas(void) { unsigned char zp; lcdxyll,0); pbufI2C=&bufI2C[2] ; Zp=*pbufl2C--; nalcdl (zp&0x30)»4,zpt piszznakf':'); zp=*pbufI2C--; nalcdf (zpi0xf0t»4,zp) piszznak! ' : ) ; zp=*pbufI2C; nalcd{ (zp&0xf0)»4,zp)
//procedura wyświetlania czasu na LCD //zmienna pomocnicza
//ustaw wskaźnik bufora na pozycje godzin //pobierz godziny //wyświetl godziny //pobierz minuty //wyświetl minuty
1
//pobierz sekundy //wyświetl minuty
}
void zwolnijklawivoid) ( czekaj(200*tau); whilel(PlND&Ox03}==Ox03); //czekaj aż wszystkie klawisze będą zwolnione )
void ustawzegar(void)
//procedura ustawiania czasu w układzie RTC
{
char *kom[1]=(PSTR <'STARTn/t*)) ; cll<): piszilcd(0x0d); odI2C(rtc,0x02,3); wyswietlczas(); pbufI2C=&bufl2C[l]; bufl2C[0]=0; min=*pbufI2C++; godz-*pbufI2C; lcdxy(l,l); zwolnijklaw(); while(sw4) { lcdxy(l,l); i£(!swl) { godz+ +; if((godzŁ0x0£)>9) ( godz:+=0x06; }
if((godz&0x3f)>0x2i)
//wyłącz przerwania, aby nie naczytać danych //włącz mruganie //odczytaj czas z RTC (tylko godz, min, sekł //ustaw wskaźnik bufora I2C na minuty //sekundy będą zawsze zerowane //pobierz minuty //pobierz godziny
//czekaj na naciśnięcie SW4 wykonując //poniższe instrukcje ustawianie godzin //czy naciśnięto SW1? //inkrementuj godziny
//korekcja dziesiętna liczby BCD
i godzi=0xc0;
//kasuj godziny po przekroczeniu
zakresu
)
bufI2C[2]=[bu£I2C[2}&0xc0)Igodz; //zapisz uaktualnione godziny w buforze 12C //pozostawiając bity 24/12 i AM/PM //nienaruszone wyswietlczas () ,• czekaj (150*tau);
lcdxy(1,4); zwolnij klaw(); //czekaj na naciśnięcie SW4 wykonując //poniższe instrukcje //ustawianie minut
while(sw4) {
lcdxy(1,4); if(!swl) { min++; if((mini0x0f}>9) ( min+=0x06; )
//czy naciśnięto SW1? //inkrementuj minuty
//korekcja dziesiętna liczby BCD //korekcja przekroczenia wartości S9
if(min>0x59) { min=0;
//przeniesienia na godziny nie ma, bo są one //ustawiane niezależnie
>
bufI2C[l]=min; wyswietlczas O ; czekaj(150*tau);
//zapisz uaktualnione minuty w buforze I2C
} )
piszilcd(0xOc); lcdxy(l,8); pisztekst(kom[01); zwolnijklawf); while(swl&sw4); i f(!sw4) ( doI2C(rtc,2,3); bufI2C(0]=0; doI2C(rtc,0,l);
//wyłącz mruganie //wyświetl komunikat
"START"
//czekaj na naciśnięcie jakiegoś klawisza //po naciśnięciu klawisza SW4... //...zapisz ustawienia zegara //start zegara
1 //włącz przerwania
sei();
int main(void) ( unsigned char i,zp;
//program główny
//tablica komunikatów do wyświetlenia char *info[4]=( PSTRCUstaw zegar •*), PSTR("Blad I2C "), PSTR("RTC - PCF8583 ") , PSTR("ZL1AVR - plytka\newaluacyjna AVR") >;
DDRB=0xf f; PORTBI=0x02; DDRD=OxO0; PORTD=Qx07; scl_wy=stan_0; fzegar=0; //>>>>>>>>>>»>>>> lcd__rs=0; czekaj (45"tau);
//PORTB - wy //zapal LED1, zgaś LED2 //PORTD - we //podciąganie linii PDO, PDI i PD2 //SCL=0
Inicjowanie wyświetlacza LCD
« « « « « « « « « «
//opóźnienie ok. 45 ms dla ustabilizowania //się napięcia zasilania LCD //(katalogowo min. 15 ms) //3-krotne wysłanie 3-
for(i=Q;i<3;i++) { lcd_e=l; P0RTB=(PORTB&0x0f}10x30; //wyślij 3- do LCD asm("nop") asm("nop") asm("nop") lcd_e=0; czekaj(5*tau); //ok. 5m$ }
lcd_e=l; PORTB={PORTBŁ0x0f)10x20; asm("nop"); asmCnop") ; asm("nop"); lcd_e=0; czekaj(10L); piszilcd(Ox28); piszilcd(0x08); piszilcd(0x01); czekaj (1.64*tau); piszilcd(0x06); piszilcd(0x0c); //»>>»»>>>>»>>» GIHSK=1«INT0; MCUCR^Ox02; if (iswlt
//wyślij 2- do LCD //wymagane wydłużenie impulsu
//impuls strobujący //interfejs 4-bitowy, 2 linie, znak 5x7 //wyłącz LCD, wyłącz kursor, wyłącz mruganie //czyść LCD //wymagane dla instrukcji czyszczenia ekranu //opóźnienie //bez przesuwania w prawo //włącz LCD, bez kursora, bez mrugania
<«««««««««««« //włącz przerwanie zewnętrzne INTO //przerwania INTO wyzwalane opadającym //zboczem //czy w chwili restartu był naciśnięty SW1?
i
czysclcdO ; pisztekst(info[3]); czekaj(1000*tau); while(swl); czysclcd(); )
pisztekst(info[2]); sei(); while(1) ( if(fzegar) { fzegar=0; lcdxy(l,0); wyswietlczas(); )
i f(!sw4) (
//wyświetl info o płytce //czekaj na ponowne naciśnięcie SW1
//wyświetl komunikat o układzie RTC na LCD //włącz przerwania
//czy można odświeżyć czas na LCD
//czy naciśnięto klawisz SW4
czekaj(150*tau); lcdxy<0,0); pisztekst
//wyświetl komunikat o trybie ustawiania //ustaw zegar //odtwórz komunikat o układzie RTC na LCD
142.11. Ćwiczenie 11 Podłączenie mikrokontrolera AVR do komputera PC przez port USB. Obsługa nadajnika i odbiornika UART z wykorzystaniem systemu przerwań. Obsługa wyświetlacza LCD 1 6 x 2 W p i e r w o t n y c h z a m i e r z e n i a c h w y k o r z y s t y w a n i e interfejsu U S B p r z e z m i k r o k o n t r o l e r y A V T n i e m i a ł o b y ć o p i s a n e w niniejszej k s i ą ż c e . P o w o d e m j e s t b a r d z o r o z b u d o w a n y p r o t o k ó ł transmisji i wynikające z t e g o p r o b l e m y w p r a w i d ł o w y m o p r o g r a m o w a n i u w ł a s n y c h aplikacji. K o n i e c z n o ś ć p r z e dzierania się przez kilkusetstronicową d o k u m e n t a c j ę traci c z ę s t o sens w o bec możliwości stosowania alternatywnych portów komunikacyjnych, jak chociażby
n i e ś m i e r t e l n e g o R S 2 3 2 , czy portu r ó w n o l e g ł e g o C e n t r o n i c s .
T e n ostatni, p o w p r o w a d z e n i u t r y b ó w E P P i E C P stal się b a r d z o atrakcyj n y m r o z w i ą z a n i e m , p o z w a l a j ą c y m na s t o s u n k o w o p r o s t e o p r o g r a m o w a n i e szybkich i wydajnych procedur komunikacyjnych. Nieco gorzej
wygląda
s p r a w a z ł ą c z e m s z e r e g o w y m . T a m barierę s t a n o w i m a k s y m a l n a , standar d o w a p r ę d k o ś ć transmisji r ó w n a 115,2 k b / s . Zaletą z a ś j e s t b a r d z o p r o s t e o p r o g r a m o w a n i e t a k i e g o interfejsu. Jest j e d n a k p e w i e n p r o b l e m , który staje się c o r a z trudniejszy d o p o k o n a n i a . Jest n i m p o w s z e c h n y j u ż b r a k p o p u l a r n y c h C O M - ó w w k o m p u t e r a c h , g ł ó w n i e typu n o t e b o o k , ale w s z y s t k o wska zuje na t o , że t e n d e n c j a ta b ę d z i e się r o z s z e r z a ł a r ó w n i e ż n a k o m p u t e r y sta cjonarne. Przejście z R S - a na U S B m o ż e dla wielu m ł o d y c h e l e k t r o n i k ó w s t a n o w i ć barierę nie d o p r z e s k o c z e n i a . C z y t o o z n a c z a , ż e są b e z r a d n i ? O t ó ż n i e . N a s z c z ę ś c i e p o j a w i ł o się roz wiązanie, które uwalnia nas od wszystkich wspomnianych
problemów.
Rozwiązaniem tym jest układ F T 8 U 2 3 2 B M produkowany przez Futurę T e c h n o l o g y D e v i c e s I n t l . L t d . znaną j a k o F T D I . Jest t o u k ł a d , k t ó r y e m u luje p o ł ą c z e n i e p o p r z e z s t a n d a r d o w y port s z e r e g o w y , t w o r z ą c w i r t u a l n e g o C O M - a z w y k o r z y s t a n i e m U S B ( r y s u n e k 14.39). Zaletą t a k i e g o rozwią zania j e s t m o ż l i w o ś ć d o ł ą c z e n i a d o złącza U S B k o m p u t e r a
dowolnego
2 punkhi widzenia mikrokontrolera I przez I
Komputer z zainstalowanymi sterownikami (linm. MacOS. Windows) dla układów FTBU232BM (system onracytny .widzi" dzięki nim dodatkowy port komunikacyjny COM) Kabel połączeniowy USB
El
System lub mfcrokontroler z wbudowanym UART-em
Konwerter USB<->RS232 zuWaoero FTSUKJ2BM
Transmisja zgodna z protokołem Usaf.1/2.0
TxD/RxD
UART
Tu następuje : Mikrokontroler US&^FS?32 *™"'*"resie która jest całkowicie konwerterem przeźroczysta za pomocą dla mikrokontrolera asynchronicznego łącza szeregowego (poziomy TTA.) 2
Rys. 14.39. Dzięki uktadom FT8U232BM korzystanie z USB nie różni się w praktyce od ko rzystania z klasycznego interfejsu RS232
u r z ą d z e n i a b e z k o n i e c z n o ś c i p o z n a w a n i a j e g o tajników i pisania specjal nych sterowników. Układ F T 8 U 2 3 2 B M realizuje następujące funkcje: - w z a j e m n ą konwersję transmisji U S B n a standardową, asynchroniczną, sze r e g o w ą transmisję d a n y c h , - z a p e w n i a pełną kontrolę przepływu d a n y c h , wykorzystującą
modemowe
s y g n a ł y interfejsowe, a także kontrolę typu X-on/X-off, - obsługuje 7 - lub 8-bitowe ramki danych z 1 lub 2 bitami stopu oraz kontro lą t y p u OdaVEven/Mark/Space/NoParity t
- z a p e w n i a w y m i a n ę d a n y c h z szybkością dochodzącą d o 3 Mbd, - z a p e w n i a r e g u l o w a n y time-out
dla bufora odbiornika,
- u m o ż l i w i a zasilanie dołączanych urządzeń (np. systemu mikroprocesoro w e g o ) z gniazda U S B . Układ w y p o s a ż o n o w wewnętrzny układ zerowania (Power-On-Reset\
który
z a p e w n i a stabilne działanie układu p o dołączeniu do U S B . W y m i a n ę danych ułatwia w b u d o w a n y w układ wewnętrzny bufor danych o rozmiarze 384 baj tów dla odbiornika i 128 bajtów dla nadajnika. Układ F T 8 U 2 3 2 B M jest zasi lany n a p i ę c i e m o wartości 4,4...5,25 V - w zależności od konfiguracji b e z p o średnio z U S B lub ze współpracującego systemu mikroprocesorowego.
W y k o r z y s t a n i e układu interfejsowego F T 8 U 2 3 2 B M powoduje, że k o m u n i k a c j a poprzez U S B przebiega - z p u n k t u widzenia mikrokontrolera i współpracującej na P C -
z n i m aplikacji
pracującej
d o k ł a d n i e w taki sam sposób, j a k m a to
miejsce
w p r z y p a d k u klasycznej transmisji danych przez R S 2 3 2 .
Układ F T 8 U 2 3 2 B M m o ż e b y ć w y k o r z y s t y w a n y w aplikacjach k o n w e r t e r ó w U S B < - > R S 2 3 2 oraz U S B < - > R S 4 2 2 / R S 4 8 5 , w interfejsach służących d o łą czenia systemów m i k r o p r o c e s o r o w y c h z urządzeniami z e w n ę t r z n y m i poprzez U S B itp. N a stronie p r o d u c e n t a są dostępne bezpłatne sterowniki dla syste m ó w operacyjnych W i n d o w s 9 8 , W i n d o w s 98 SE, W i n d o w s 2 0 0 0 / M E / X P , M A C O S - 8 i O S - 9 , L i n u x 2.40 i późniejsze. Sterowniki te pozwalają na pisa nie własnych p r o c e d u r komunikacyjnych w sposób identyczny j a k w przy padku urządzeń transmitujących dane za p o ś r e d n i c t w e m interfejsu R S 2 3 2 . D o łączności od strony k o m p u t e r a m o ż n a również stosować t y p o w e progra m y terminalowe n p . o k i e n k o w y H y p e r T e r m i n a l . Rozwiązanie takie wydaje się b y ć najprostszą
metodą realizacji transmisji z w y k o r z y s t a n i e m
portu
U S B . Bardziej z a a w a n s o w a n i programiści m o g ą sięgać p o sterowniki D 2 X X (USB Direct
Drivers
+ DLL S/W łnterface).
Są o n e dostępne d l a W i n d o w s
9 8 , W i n d o w s 9 8 S E , W i n d o w s 2 0 0 0 / M e / X P . Dużą zaletą u k ł a d ó w F T 8 U 2 3 2 jest m o ż l i w o ś ć p r a w i e d o w o l n e g o dobierania prędkości transmisji, byle tylko była o n a taka s a m a p o stronie n a d a w c z e j , j a k i odbiorczej. C e l e m ćwiczenia 1 1 . j e s t pokazanie, j a k w praktyce m o ż n a dołączyć w ł a s n e urządzenie d o k o m p u t e r a P C poprzez port U S B i z a d e m o n s t r o w a n i e przykła d o w e g o p r o g r a m u realizującego transmisję danych w obu kierunkach. D o re alizacji tego zamierzenia w y k o r z y s t a n o gotowy interfejs opisany w Elektro nice Praktycznej 5 / 2 0 0 3 . W y g l ą d tego modułu p o k a z a n o na f o t o g r a f i i 14.40, j e g o schemat elektryczny przedstawiono n a r y s u n k u 1 4 . 4 1 , a na r y s u n k u 14.42 p o k a z a n o sposób dołączenia g o d o płytki Z L 1 A V R .
j
P o dołączeniu modułu U S B d o płytki
£
Z L 1 A V R oraz k o m p u t e r a P C (za p o m o cą t y p o w e g o kabla U S B ) należy zasilić
^
zestaw i włączyć k o m p u t e r . Przy pierw szym
uruchomieniu
system
Windows
p o w i n i e n a u t o m a t y c z n i e rozpoznać no w e urządzenie i z a p r o p o n o w a ć zainstało-
Fot. 14.40. Wygląd interfejsu
wanie sterowników.
USB<->RS232
(771)
S2C4Ł.
wc-i Ov
-2-
GIC
CS 16V Ul
Fmzsm EESK tŁUATA VCC1 RESET WSTOUT 3V30UT US8DP USTOM GNDt SLEEP RXL£D TXLEO VCCIO
pwncrt
PWREN TXD£N
EECS TEST AVCC AGNO JCTOUT )CT1N VCO TXD fan RTS CTS DTR
Dsn
OCO
«
GNOZ
Rys. 14.41. Schemat elektryczny uniwersalnego modułu interfejsowego USB
Rys. 14.42. Sposób dołączenia uniwersalnego modułu interfejsowego USB do płytki ZL1AVR i komputera PC
N a l e ż y j e wcześniej s k o p i o w a ć na dyskietkę lub C D - R O M , m o ż n a j e także wgrać na d y s k twardy k o m p u t e r a d o d o w o l n e g o katalogu. Procedura instala cji przebiega niemal automatycznie, w standardowy dla W i n d o w s sposób (został on s z c z e g ó ł o w o opisany w Elektronice Praktycznej 10/2002, wybrane fragmenty tego artykułu znajdują się w dodatku F). P o zainstalowaniu sterowników w w i n d o w s o w y m M e n e d ż e r z e urządzeń p o j a w i a się n o w y port szeregowy C O M z kolejnym (następnym po dotychczas w i d z i a n y c h przez system) n u m e r e m , który w razie konieczności można ręcz nie z m i e n i ć .
Port t e n m o ż n a skonfigurować w identyczny sposób, j a k w p r z y p a d k u HyperTerminala z ćwiczenia 8. ( r y s u n e k 14.22) - czyli 3 8 4 0 0 , n , 8 , l . O d tej chwili urządzenia dołączone d o portu U S B k o m p u t e r a będą dostępne p o p r z e z wirtu alny port szeregowy.
Sterowniki dla układu F T 8 U 2 3 2 B M są dostępne n a stronie in ternetowej producenta, p o d adresem: FTDriver.htm.
http://www.ftdichip.com/
Opis ich instalacji znajduje się w d o d a t k u F .
Demonstracja działania m o d u ł u będzie polegała n a przesłaniu b l o k u danych 0 wielkości 128 k B z zestawu Z L 1 A V R d o komputera P C , a następnie przej ściu n a odbiór danych. W t y m trybie znaki w y s t u k i w a n e n a klawiaturze k o m putera będą - za p o m o c ą programu HyperTerminal - p r z e s y ł a n e d o m i k r o kontrolera n a płytce Z L 1 A V R i wyświetlane n a wyświetlaczu L C D . D o o b sługi wyświetlacza zostały wykorzystane procedury z poprzednich ćwiczeń. Nieznacznej zmianie w zakresie interpretacji z n a k ó w L F i C R uległ funkcja pisztekst. D o obsługi nadajnika i odbiornika U A R T - u przewidziano 3 2 - e l e m e n t o w y b u for f i f o s i o [32]. Rozwiązanie takie było m o ż l i w e , dzięki założeniu simpleksowej (jednokierunkowej) transmisji. D o tego bufora są więc „ w k ł a d a n e " znaki odebrane przez U A R T , a także pobierane są z niego dane d o wysłania. G d y b y zaistniała konieczność prowadzenia j e d n o c z e s n e g o n a d a w a n i a i o d bioru, bufor taki p o w i n i e n zostać z d u b l o w a n y (oddzielny dla nadajnika, o d dzielny dla odbiornika), f i f o s i o
to bufor cykliczny. D a n e są d o niego
w k ł a d a n e począwszy od elementu o indeksie 0, aż d o elementu o indeksie 3 1 . P o zapisaniu danej p o d a d r e s e m 31 następna d a n a będzie p o n o w n i e zapisana na pozycję 0 itd. P o d o b n i e dzieje się z pobieraniem danych. Operacje wkła dania i pobierania e l e m e n t ó w d o / z bufora odbywają się niezależnie, w dodat ku w d w ó c h zupełnie różnych częściach programu - w s e g m e n c i e g ł ó w n y m 1 w procedurach obsługi p r z e r w a ń U A R T - u . N a d prawidłowością zapisu i o d czytu bufora czuwają z m i e n n e i z f i f o s i o
(indeks zapisu
fifosio),
iofifosio (indeks odczytu f i f o s i o ) oraz z m i e n n a ldanych zliczająca aktualnie wpisaną liczbę danych d o bufora. W a r t o ś ć ldanych nigdy nie m o że przekroczyć wielkości bufora, czyli wartości 3 2 . Przed z a p i s a n i e m danej j e s t sprawdzany o d p o w i e d n i w a r u n e k i program zapętla się w oczekiwaniu n a zwolnienie operacja
miejsca
w buforze
while (ldanych==32);.
na fifosio powoduje
inkrementację
Każdorazowa
odpowiedniego
indeksu.
Z u w a g i n a wielkość bufora działanie to musi b y ć w y k o n y w a n e m o d u l o 3 2 .
P r z y k ł a d o w o instrukcja inkrementowania indeksu zapisu d o bufora s i o w y g l ą d a następująco:
fifo
izfifosio^=31?izfifosio=0:++izfifosio; Jest to m o ż e m a ł o czytelny zapis, ale za t o bardzo zwięzły. Oznacza tyle, ż e s p r a w d z a n y j e s t w a r u n e k , czy i z f i f o s i o
jest r ó w n e 3 1 . Jeśli tak, t o
z m i e n n a ta j e s t n a s t ę p n i e zerowana, jeśli nie, to zwiększana o j e d e n . W y k o rzystanie bufora p o z w a l a poprawić płynność transmisji. Jeśli g e n e r o w a n i e danych d o wysłania przebiega nierównomiernie w czasie, to - gdyby nie b y ł o bufora - m o g ł y b y się t w o r z y ć przerwy w nadawaniu zmniejszające efektyw ną p r ę d k o ś ć transmisji. Bufor pozwala wysyłać dane w chwilach oczekiwania na kolejne. Jeśli g e n e r o w a n i e danych przebiega szybciej niż ich nadawanie, t o d o s t a r c z a n i e danych j e s t w s t r z y m y w a n e w m o m e n c i e całkowitego zapeł nienia bufora, czyli gdy liczba danych w buforze osiągnie wartość 32. Osiąg nięcie i n d e k s u 31 nie o z n a c z a przepełnienia bufora. Najczęściej b ę d z i e m y mieli w ó w c z a s sytuację taką, że bufor szybko zostanie zapełniony, a następ nie d a n e będą na przemian dokładane i pobierane z szybkością na jaką p o z w a l a transmisja. P i e r w s z a część p r o g r a m u , to wysłanie do komputera bloku danych o rozmia rze 128 k B . D a n e , to powtarzające się znaki A S C I I w kolejności od spacji d o litery „ Z " . P r z y przyjętej prędkości transmisji cały blok powinien b y ć wysła ny w ciągu ok. 3 4 sekund. W tym miejscu warto z a u w a ż y ć , że wykorzysty w a n i e p o r t u U S B d o przesyłania niewielkich paczek d a n y c h nie tylko m o ż e nie spełnić o c z e k i w a ń c o d o u z y s k i w a n e g o transferu, ale w pewnych sytua cjach m o ż e d a ć gorsze wyniki niż n p . wykorzystanie portu szeregowego. P o w o d e m j e s t d o ś ć r o z b u d o w a n y protokół transmisji U S B , który sprawia, że n p . przy wysyłaniu j e d n e g o bajtu przez łącze przechodzi d u ż o więcej danych (nagłówki, s p o r o czasu zabiera negocjacja połączenia U S B itp.). P o z a k o ń c z e n i u transmisji na wyświetlaczu pojawia się k o m u n i k a t zachęcają cy t y m r a z e m d o przesyłania danych z k o m p u t e r a P C d o zestawu. Jeśli będą t o z n a ł a w y s y ł a n e z klawiatury, to zostaną natychmiast wyświetlone na w y świetlaczu. Jeśli natomiast prześlemy plik tekstowy, to niestety z a u w a ż y m y , że n a s z s y s t e m nie nadąża z obsługą transmisji, która przebiega dużo szybciej niż p r ę d k o ś ć wyświetlania z n a k ó w na L C D . Zaobserwujemy tu działanie bu fora, objawiające się p r a w i d ł o w y m wyświetleniem 32 z n a k ó w , p o c z y m k o lejne d a n e będą n a d p i s y w a n e przez następne. P o w o d e m j e s t brak kontroli p r z e p ł y w u transmisji. Mikrokontroler na płytce Z L 1 A V R nie m o ż e w żaden s p o s ó b p o w s t r z y m a ć nadajnika komputera.
Jeśli przyjrzymy się p o n i ż s z e m u p r o g r a m o w i , t o z a u w a ż y m y b e z trudu, że nie m a t a m nawet j e d n e g o rozkazu, który związany by był z protokołem U S B . Cały p r o g r a m j e s t napisany tak, j a k b y był pisany dla połączenia za po mocą R S 2 3 2 . M o ż n a się o t y m łatwo się przekonać odłączając m o d u ł U S B , zwierając zworki JR2 i J P 3 oraz łącząc płytkę Z L 1 A V R z k o m p u t e r e m p o przez port szeregowy C O M . M o ż n a też w y k o n a ć e k s p e r y m e n t w drugą stro n ę . W t y m celu trzeba się cofnąć d o ćwiczenia 8. Płytkę skonfigurować zgod nie z opisem d o tego ćwiczenia, z tą różnicą że zamiast kabla R S 2 3 2 dołącza m y moduł U S B . W ten s p o s ó b uzyskujemy możliwość regulacji obrotów sil nika z k o m p u t e r a P C p o p r z e z port U S B . D o w y k o n a n i a ć w i c z e n i a konieczne jest dołączenie d o zestawu m o d u ł u inter fejsowego U S B . S c h e m a t ilustrujący sposób przyłączenia p o k a z a n o na r y s u n k u 14.42. P r o g r a m realizujący przedstawione zadanie znajduje się na lis t i n g u 14.12. P r o g r a m cwiczl l.c należy s k o m p i l o w a ć i z a p r o g r a m o w a ć mik rokontroler z zestawu Z L 1 A V R plikiem w y n i k o w y m
cwiczllhex.
Konfiguracja płytki Z L 1 A V R : • z w o r k a J 3 w pozycji 1-2, z w o r k a J 4 w pozycji 2-3 - dołączony oscylator wewnętrzny, • zworki Z W _ P O R T B z w a r t e w pozycjach 1-2, 3-4, 5-6, 7 - 8 , 9-10, 11-12, • zworki J P 6 i J P 7 rozłączone, • zworki J P 2 i J P 3 rozłączone, b ę d z i e d o nich dołączony k a b e l k a m i m o d u ł USB, • położenie pozostałych z w o r e k nieistotne (np. rozłączone), • w ł o ż o n y wyświetlacz alfanumeryczny 16x2 d o gniazda L C D 1 . Ust. 14.12. Program do ćwiczenia 11
/* /* /* J.D.
poprzez port USB Nadawanie i odbiór poprzez UART z użyciem
*/ */ przerwań*/
-2003
#include tfinclude <progmem.h> ttinciude <stdlib.h> ttinciude ttinciude <signal.h> ttdefine FCPU ttdefine VUART ttdefine VUBRR
8000000 38400 FCPU/ (VUART*16) -1
//częstotliwość oscylatora CPU //prędkość transmisji Jb/s) //wpis do UBRR dla VUART
// Poniższe definicje służą do realizacji typedef struct _bit_struct unsigned unsigned unsigned
char bitO: 1 char Bitl: 1 char bit2: 1
wygodnego dostępu
bitowego
unsigned char unsigned char unsigned char unsigned char unsigned char )pole_bitowe;
bit3 bit4 bitS bit6 bit7
ddefine łdefine Itdefine ttdefine ttdefine Itdefine ttdefine fdefine Sdefine ttdefine ttdefine
DAj_BIT(adr) l*((volatile pole_bitowe*) (adr))) _PORTB 0x38 _PINB 0x36 _PORTD 0x32 _DDRD 0x31 _PIND 0x30 lcd_rs DAJ_B1T{_P0RTB)-bit2 lcd_e DAJ_BIT(_PORTB).bit3 ledO DAJ_BIT(_PORTB).bitO ledl DAJ_BIT{_PORTB) .bitl LF 0x0a //definicja znaku LF (przejście do //nowej linii) ttdefine CR 0x0d //definicja znaku CR (powrót karetki)
unsigned char wiersz=0; unsigned char kolumna^O;
//pozycja umieszczenia znaku na LCD //pozycja umieszczenia znaku na LCD
//wskaźnik odczytu kolejki UART-u char volatile iofifosio; //wskaźnik zapisu kolejki UART-u char volatile izfifosio; //kolejka UART-u char fifosio[32]; //liczba danych w buforze fifosio unsigned char volatile ldanych=0; void czekaj[unsigned long zt) { ttdefine tau 10.38 unsigned char ztl; for(;zt>0;zt--) ( for(ztl=255;ztl!=0;ztl--) ;
//funkcja opóźnienia //przybliżony przelicznik argumentu na ms
) ) <<<<<<<<<<<<<<<< //>»»»>»> Procedury obsługi wyświetlacza LCD void piszilcd(unsigned char instr) //zapisz instrukcje sterująca do LCD
{
lcd_rs=0; lcd_e=l; PORTB=(PORTB&0x0f)I(instri0xf0) ;
. //przygotuj starszy półbajt do LCD
asm("nop*] asm("nop"] asm("nop*), //impuls strobujący lcd_e=0; //czekaj na gotowość LCD ok. lOOus czekaj (10D ; TORTB«(POBTBŁ0x0E)l((instrt0x0f)«4); //przygotuj młodszy półbajt do LCD asm("nop") asm("nop") asm("nop") //impuls strobujący lcd_e=0; //czekaj na gotowość LCD ok. lOOus czekaj(10L); void piszdlcdfchar dana) ( lcd_rs=l; PORTBllpORTB&0x0f)l(da a(.0xf0); asm(*nop*); asm("nop"); n
//zapisz daną do LCD
//przygotuj starszy półbajt do LCD
asm{"nop"); lcd_e=0; //impuls strobujacy czekaj(10L); //czekaj na gotowość LCD lcd_e=l; PORTB=(PORTB&OxOO I ((dana&0x0£)«4); //przygotuj młodszy półbajt do LCD asm!"nop"] asm{"nop"] asml"nop"), lcd_e=0; //impuls strobujący czekaj(10L); //czekaj na gotowość LCD void czysclcd(void) piszilcd(0x01); czekaj(1.64*tau); wiersz=0; kolumna=0;
//czyść ekran //polecenie czyszczenia ekranu dla //kontrolera LCD //rozkaz 0x01 wykonuje się 1.64ms
)
void lcdxy(unsigned char w, unsigned char k) //ustaw współrzędne kursora ( piszilcd{(w*0x40+k)I0x80); //standardowy rozkaz sterownika LCD ) //ustawiający kursor w określonych //współrzędnych //procedura umieszcza znak na void piszznak(char znak) //wyświetlaczu { //wyświetl znak na LCD pis2dlcd(znak) ; ) void pisztekst(char "tekst,unsigned char romram) //pisz tekst na LCD wskazywany przez { //*tekst char zn; char nrsO; while(l) f if(!romram) t zn=PRG_RDB(Łtekst[nr++])
//pobranie znaku z pamięci programu
)
else C if (Udanych) { break;
//czy sa jeszcze jakieś dane w buforze
)
//pobierz znak z bufora zn=fifosio[iofifosio]; iofifosio==31?iofifosio=0:++iofifosio; //inkrementacja modulo 32 ldanych--; )
//czy nie ma końca tekstu? if(zn!=0) ( if ( (zn==LF-) I I (zn==CR)) //czy znak nowej linii? { if (zn==LF) { //przejdź do nowej linii wiersz==l?wiersz=0:++wiersz; } else //był CR { kolumna=0; //powrót karetki } } else { piszdlcd(zn);
//umieć pojedynczy znak tekstu na LCD
k o l u m n a — 15?kolumna=0: ł t k o l u m n a ; //inkrementacja
modulo
16
i f (kolumna—0) ( wiersz==1?wiersz=0:**wiersz; //przejdź
do nowej
//zakończ
pętle,
linii
) J lcdxy(wiersz,kolumna) ) else { break;
jeśli
koniec
tekstu
}
} >
SIGNAL(SIG_UART RECV) //procedura obsługi odbiornika { ledl=0; if(ldanych<32) ( / / z a p a m i ę t a j odebrany znak fifosio[iziifosio]=UDR; i z f i f o s i o — 3 1 ? i z f ifosio=0: * ł i z f i fosio; / / i n k r e m e n t a c j a modulo 32 ldanych++; ) / / z g a ś leda ledl=lt 1
/ / p r o c e d u r a o b s ł u g i n a d a j n i k a UART //wywoływana po w y s ł a n i u znaku
SIGNAL(SIG UART TRANS) i char
UART-u
znak;
ledO^O; / / p o b i e r z dane z p a m i ę c i RAM znak=fifosio(iofifosio]; / / c z y k o n i e c p o b i e r a n i a danych? if(ldanych1=0) { / / n i e , w y ś l i j 2 n a k pobrany z k o l e j k i UDR^znak; ldanych-; } else I / / t a k , wyłącz nadajnik cbi(UCR,TXEN); ) iofifosio==31?iofifosio=0:++iofifosio; / / i n k r e m e n t a c i a mod il led0=l; ) i n t main{void) ( unsigned long char znak; //tablica char
i;
komunikatów
do
wysłania
*info[2J={ PSTR("Wysyłam d a n e " ) , PSTR("Prześlij z PC-ta") ); r
DDRB=0xff; PORTB=0xff ; DDRD=0x02; PORTDn0x02; lcd_rs=0; czekaj(45*tau)
//PORTB - wy / / P D I - wy (RXD), p o z o s t a ł e we / / p o d c i ą g a n i a w e j ś c i a PDI (RXD)
/ / o p ó ź n i e n i e o k . 4Sms d l a u s t a b i //lizowania się napięcia zasilania
//LCD (katalogowo min. / / 3 - k r o t n e w y s i a n i e 3-
for(i=0;i<3;i++) { lcd_e=l; PORTB=(PORTB&0x0f)10x30; asm("nop") asm{"nop*) asm("nop") lcd_e=0; czekaj(5*tau); ) lcd_e=l; PORTB=(PORTB&0x0f) 1 0 x 2 0 ; asm(*nop"}. asm("nop"). asm("nop"). lcd_e=0; czekaj(10L); piszilcd(0x28); piszilcd(0x08);
//wyślij
//ok.
do LCD
5 ms
/ / w y ś l i j 2 - do LCD //wymagane w y d ł u ż e n i e
//impuls
impulsu
strobujący
/ / i n t e r f e j s 4 - b i t o w y , 2 l i n i e , znak 5x7 / / w y ł ą c z LCD, w y ł ą c z k u r s o r , / / w y ł ą c z mruganie / / c z y ś ć LCD //wymagane d l a i n s t r u k c j i c z y s z c z e n i a //ekranu opóźnienie / / b e z p r z e s u w a n i a w prawo / / w ł ą c z LCD, bez k u r s o r a , b e z m r u g a n i a
p i s z i l c d (0x01) ,czekaj(1.64*tau); piszilcd(0x06); piszilcd(0x0c); pisztekst(info[0],0); UBRR=VUBRR; UCR=1«RXCIE I 1 « T X C I E
3-
15 ms)
I
sei ( ) ; iz£ifosio=0; iofifosio=0; znak=' ' ; sbi'Z') l znak=' ' ;
/ / k o m u n i k a t na LCD / / u s t a w prędkość t r a n s m i s j i 1«RXEN; / / z e z w o l e n i e na p r z e r w a n i a od //ka i nadajnika, zezwolenie / / w ł ą c z przerwania //inicjuj
zmienne
//włącz nadajnik //umieść pierwszy / / p ę t l a wysyłania
znak znaków
/ / j e ś l i bufor przepełniony, t o czekaj / / u m i e ś ć znak do w y s i a n i a w b u f o r z e
)
izfifosio==31?izfifosio=0: ++izfifosio; //inkrementuj l d a n y c h * +;
mod 32
1 czysclcdO ; pisztekst(info[l],0); czekaj(2000*tau); czysclcd(); izfifosio=0; iofifosio=0; ldanych=0; while(l)
//inicjuj
//pętla
zmienne
odbioru
znaków
{ if(ldanych) { pisztekst(fifosioI0],1); ) )
odbiornina o d b i ó r
//czy
odebrano
//wyświetl
jakiś
odebrane
znak? znaki
Dodatek A
Podstawowe parametry mikrokontrolerów z rodziny AVR Pamięć Flash [k8]
Napięcie zasilania
Pojemn. pamięci EEPROM [kB]
Pojemn.
AT90C8534
8
3.3...6.0
0,5
AT90LS2323
2
2,7-6,0
T
m
Liczba wypr. we/wy
Liczba przerwań
[Bl
Maks. CzęstOl. taktowania (MKz]
255
1,5
7
6
2
0,125
126
4
3
2
1
pamięci SRAM
Liczba Interfejs przerwań TWl zewnęirz. (odpow. I*C}
Timer 16-bitowy
1. •
1
AT90LS2343
2
2.7-6.0
0.125
128
4
4
2
1
AT90LS4433
4
2.7...6.0
0,25
128
4
20
13
2
1
AT90LS8535
8
2,7-6.0
0,5
512
4
32
15
2
1
AT90S1200
1
2.7...6.0
0,0625
12
15
3
1
AT90S2313
2
2,7...6,0
0.125
126
10
15
10
2
AT90S2323
2
4.O...6,0
0,125
128
4
3
2
1
AT90S2343
2
4,0-6.0
0,125
128
10
4
2
1
AT90S4433
4
4,0-6,0
0.25
128
8
20
14
2
1
AT90S8515
8
2,7-6.0
0,5
512
8
32
11
2
1
AT90S8535
8
4,0-6,0
0,5
512
8
32
15
2
A7mega128
128
4,5-5,5
4
4096
16
53
34
8
ATmega128L
1
1
+ +
2
128
2,7-5,5
4
4096
8
53
34
8
ATmega16
16
4,5-5.5
0,5
1024
16
32
20
2
2 1
ATmega161
16
4.0-5.5
0,5
1024
8
35
20
3
1
ATmegaieU
16
2.7-5,5
0,5
1024
4
35
20
3
1
ATmega162
16
4,5-5,5
0,5
1024
16
35
23
3
2
ATmega162L
16
2,7-5,5
0,5
1024
8
35
28
3
2
ATmega162V
16
1.8-3.6
0,5
1024
1
35
28
3
2
ATmegal69
16
4,5...5,5V
0.5
1024
16
23
17
1
ATmega169L
16
2.7-3,6
0,5
1024
8
54
23
17
1
ATmega169V
16
1.8-5,5
0,5
1024
1
54
23
17
ATmega16L
16
2,7-5,5
0,5
1024
8
32
20
3
1
+ +
1
+ + +
2
ATmega32
32
4,0-5.5
1
2048
16
32
19
3
ATmega64
64
4,5-5,5
2
4096
16
53
34
8
1
ATmega$4L
64
2,7-5.5
2
4096
8
53
34
8
ATmegaB
8
4,5-5,5
0,5
1024
16
23
18
2
ATmega8515
8
4,5-5,5
0,5
512
16
35
16
3
t
ATmega8515L
8
2,7-5,5
0,5
512
8
35
16
3
1
A*Tmega8535
8
4.5-5,5
0.5
512
16
32
20
3
ATmega8535L
8
2.7-5.5
0.5
512
8
32
20
3
ATmegaBL
8
2.7-5.5
0,5
1024
8
23
18
2
ATtinyll
1
4...5.5
6
6
4
1
ATtiny12
1
4-5,5
0,0625
8
6
5
1
ATtfny15L
1
2,7-5.5
0,0625
1.6
6
8
1(+5)
ATtiny26
2
4.5-5.5
0.125
128
16
16
11
1
ATtiny26L
2
2,7-5,5
0.125
128
8
16
11
1
ATtiny28l
2
2,7-5,5
32
4
11
5
2{+8)
ATtiny28V
2
1,8...5,5
32
1
11
5
2(+8)
2 1
+
1
•ł-
1
1
lirteris)s | 10-bHowy ISP SPI ' przetwornik A/C (liczba kanatdw) i ... AT90C8534
UART
Tlmery
Watck-
8-bitowe
6
Liczba RTC Konpw. Spfifttowy WbudowMyl kanałów analog. moduł generator ' PWM irtnoteaia Uktujący
1
AT90LS2323
+
1
AT901S2343
+
1
+
1
+
1
+
3
AT90LS4433
1
6
+
1
AT90LS8535
1
8
+
1
AT90S1200
+
AT90S2313
+
AT90S2323 AT90S2343 AT90S4433
1
AT90S851S
1
AT90S8535
t
6
8
+
1
+
1
+
+
1
+
+
1
+
1
1
+
+
1
1
+
1
+
1
+ +
+ +
1
+
1
+
+
+
+
2
+
3
+ +
+
ATmega128
1
8
+
2
2
+
8
+
+
+
+
ATmegal28L
1
8
+
2
2
+
e
+
+
+
+
ATmega16
1
8
+
1
2
+
3
+
+
+
+
ATmega161
1
+
2
2
+
A
+
+
+
ATmega161L
1
+
2
2
+
4
+
+
+
ATmega162
1
+
2
2
+
A
+
+
+
+
ATrnega162L
1
+
2
2
+
4
+
+
+
+
ATmega162V
1
2
+
A
+
+
+
ATmegat69
1
+
4
ATmega169L ATmega169V
+
+
2
8
+
1
1
8
+
1
2
+
4
+
+
1
8
+
1
2
+
4
+
+
ATmega16L
1
a
+
1
2
+
3
+
+
+
ATmeBa32
1
8
+
1
2
+
4
+
+
+
ATmega64
1
8
+
2
2
+
8
+
+
+
+
ATmega64L
1
8
+
2
2
+
8
+
+
+
+
ATmegaS
1
8
+
1
2
+
3
+
+
+
+
ATmega8515
1
+
1
1
+
4
+
+
ATmega8515L
1
+
1
1
+
4
ATmega853S
1
8
+
1
2
+
4
ATmega8535L
1
8
+
1
2
+
4
ATmegaSL
1
8
+
1
2'
+
3
1
+
A-Ttrnyl 1
+
+
+
+
+ +
+
+
+
+
+
+
+
+
+ + +
+
1
+
+
+
ATtinylSL
4
+
2
+
1
+
+
ATliny26
11
+
2
+
2
+
+
+
2
+
2
+
+
1
+
+
+
+
+
ATbny12
ATHny26L ATtiny28L Arnny28V
11
t
Dodatek B
Zestawienie rejestrów mikrokontrolera AT90S2313 Adres
Nazwa
Bit 7
Bite
Bit 5
Bit 4
BK 3
Bit 2
Bit 1
BitO
Opis ' na str.
S3F{S5F)
SREG
I
T
H
S
V
N
Z
C
40
$3E{$5E)
Zarezerwowane
S3D(S5D)
SPL
$3C(S5C)
Zarezerwowane
$3B($5B)
GIMSK
$3A($5A)
n
_ SP7
SP6
SP5
INT1
INTO
_
GIFR
INTF1
INTFO
$39($59)
TIMSK
TOIE1
OCIE1A
S38(S58)
TIFR
TOV1
OCF1A
$37{$57)
Zarezerwowane
$36(S56)
Zarezerwowane
$35(555)
MCUCR
$34(S54)
Zarezerwowane
$33(553)
TCCRO
S32(S52)
TCNTO
$31 ($51)
Zarezerwowane
$30 ($50)
Zarezerwowane
S2F($4F)
TCCR1A
$2E{$4E)
TCCR1B
$2D($4D)
TCNT1H
Timer/Licznikl - bardziej znaczący bajt licznika
68
$2C($4C)
TCNT1L
Timer/Licznikl - mniej znaczący bajt licznika
68
$2B($4B)
OCR1AH
Timer/Licznikl - bardziej znaczący bajt rejestru porównania
70
$2A($4A)
OCR1AL
Timer/Licznikl - mniej znaczący bajt rejestru porównania
70
$29{$49)
Zarezerwowane
$28{$48)
Zarezerwowane
$27($47)
Zarezerwowane
$26($46)
Zarezerwowane
$25(545)
ICR1H
Timer/Licznikl - bardziej znaczący bajt rejestru przechwytywania
71
Timer/Ucznikl - mniej znaczący bajt rejestru przechwytywania
71
$24 ($44)
ICR1L
$23 ($43)
Zarezerwowane
$22($42)
Zarezerwowane
$21 ($41)
WDTCR
$20($40)
Zarezerwowane
$1F(S3F)
Zarezerwowane
$1E(S3E)
EEAR
$1D($3D)
EEDR
$1C($3C)
EECR
$1B($3B)
Zarezerwowane
$1A($3A)
Zarezerwowane
SP4
SP3
-
-
_
TICIE1
SE
SM
ISC11
SP2
SP1
SPO
41
-
-
-
49
-
52
_
ICF1
-
TOIEO TOV0
50 50
-
-
-
-
-
ISC10
ISC01
ISCOO
54
CS02
CS01
CSOO
61
-
-
Timer/LicznikO
62
COM1A1 C0M1A0 1CNC1
ICES1
-
-
-
-
CTC1
CS12
3
PWM 11 W M 1 0 CS11
CS10
65 66
-
-
-
-
-
-
WDTOE
WDE
WDP2
WDP1
WDPO
-
Rejestr adresowy pamięci EEPROM
80
Rejestr danych pamięci EEPROM
-
-
-
-
-
EEMWE
-
76
80 EEWE
EERE
80
_
-
Mres
Nazwa
$19(539)
Zarezerwowane
$18(538)
Bit 7
Bit 6
PORTB
P0RTB7
PORTB6
$17(537)
DDRB
DDB7
DDB6
DDB5
DD84
DD83
ODB2
DDB1
DDBO
101
$16(536)
PINB
PINB7
PINB6
PINB5
PINB4
PINB3
PINB2
P1NB1
PINBO
101
$15(535)
Zarezerwowane
_
$14(534)
Zarezerwowane
513(533)
Zarezerwowane
512(532)
PORTD
-
Sit 5
Bit 4
Bit 3
BitZ
Bit 1
BitO
Opis '3 Dastr.
_
-
PORTD6
PORTB5 P0RTB4 PORTB3 PORTB2
P0RTB1 'ORTBO
P0RTD5 P0RTD4 P0RTD3 PORTD2 PORTD1 'ORTOO
100
107
511(531) j DDRD
D0D7
DDD6
DDD5
DDD4
DDD3
DDD2
DDD1
DDDO
107
S10(S30)
PIND
PIND7
PIND6
PIND5
PIND4
PIND3
PIND2
PIND1
PINDO
107
S0F(S2F)
Zarezerwowane
S0E(S2E)
Zarezerwowane
S0D(S2D)
Zarezerwowane
S0C(S2C)
UDR
S0B(S2B)
USR
RXC
TXC
UDRE
FE
OR
-
S0A($2A)
UCR
RXCIE
TXCIE
UDRIE
RXEN
TXEN
CHR9
509(529)
UBRR
508(528)
ACSR
S07($27)
Zarezerwowane
$06(526)
Zarezerwowane
$05(525)
Zarezerwowane
-
$04(524)
Zarezerwowane
$03(523)
Zarezerwowane
$02(522)
-
Zarezerwowane
-
Rejestr we/wy układu UART
90
RXB8
-
TXB8
ACIS1
ACISO
Rejestr szybkości transmisji układu UART ACD
-
ACO
ACl
ACIE
ACIC
90 92 95 97
-
$01(521)
Zarezerwowane
-
$00(520)
Zarezerwowane
-
Uwagi: 1. By zapewnić kompatybilność z nowymi mikrokontrolerami, zarezerwowane bity powinny być zerowane (.0"). Zarezerwowane ob szary przestrzeni we/wy nie powinny być nigdy modyfikowane. 2. Niektóre flagi są zerowane poprzez wpisanie logicznej . 1 " na odpowiadające im pozycje. Mogą do tego służyć rozkazy CBI i SBI. Trzeba jednak pamiętać, że ich zasięg działania jest ograniczony do przestrzeni adresowej we/wy od $00 do $1F. 0 Ile więc wyzero wanie Hagi np. TXC może być zrealizowane przez bezpośrednie wpisanie do niej . 1 " : sbi usr.bcc o tyle wyzerowanie flagi T0V0 wymaga już bardziej złożonego działania: in temp.fjfr ori temp,0xQ2 out tifr.temp 3. W kolumnie .Adres" wartości podane w nawiasach oznaczają adresy rejestrów adresowanych jako pamięć SRAM.
Dodatek C
Wybrane charakterystyki elektryczne i czasowe mikrokontrolera AT90S2313 Przedstawione w t y m rozdziale charakterystyki odpowiadają t y p o w y m konfi guracjom pracy mikrokontrolerów, nie są o n e testowane na etapie produkcji układu. Założono, że porty w e / w y skonfigurowano j a k o w e j ś c i o w e z włączo n y m w e w n ę t r z n y m p o d c i ą g a n i e m . J a k o źródło sygnału z e g a r o w e g o zastoso w a n o generator przebiegu sinusoidalnego z wyjściem rail-to-rail
(pracują
c y m w c a ł y m zakresie napięcia zasilającego). P o b ó r prądu j e s t funkcją zależną od kilku c z y n n i k ó w , takich j a k : napięcie pracy, częstotliwość pracy, obciążenie portów w e / w y , szybkość przełączania p o r t ó w w e / w y , w y k o n y w a n e g o przez mikrokontroler k o d u , temperatury o t o czenia. W a r t o ś ć prądu p o b i e r a n e g o z pojedynczego w y p r o w a d z e n i a portu m o ż e b y ć o s z a c o w a n a zależnością: I = CL-Vcc-f, gdzie VQC ~ napięcie pracy, f - Śred nia częstotliwość przełączania portów, C L - pojemność obciążająca linie por tów we/wy.
Rys. c.4. Zależność poboru prądu w funkcji napięcia zasilającego (tryb Idle)
Napięcie zasilania JV]
Rys. C.5. Zależność poboru prąću w funkcji napięcia zasilającego (tryb Power-down, watchdog wyłączony) 1600 if
1400
I£. n
T, - 25*0^
1200 1000
o*
800 600
i
400
& 200
8
2
2,5
3'
3,5 4 Naplecie zasilania [V]
4,5
5
5,5
Rys. C.6. Częstotliwość oscylatora watchdoga w funkcji napięcia zasilającego 70
f 1
60 ,
T,= B5C 50
e 40 30
¥
i io.
20
//
10 0
0
0,5
1
1,5 2 Napłęde wyjściowa V q ^ [V]
2,5
ffys, C. 7. Prąd wpływający do linii portu we/wy w funkcji napięcia wyjściowego (napięcie zasilania mikrokontrolera 5 V)
_ T , • 25"C
X
\ O
0,5
1
1,5
2 2,5 3 Napięcie wyjściowo V
0 H
3,5 [V]
4
4,5
5
Rys. C.8. Prąd pobierany z linii portu we/wy w funkcji napięcia wyjściowego (napięcie zasilania mikrokontrolera 5 V)
2,7
4.0 Naplecie zasilające V
5,0 c c
[V]
Rys. C.9. Wejściowe napięcie progowe przełączania portów we/wy w funkcji napięcia zasilającego 0.18 0,16 £ O." & S 0,12 i
o.i
§ o.oe z 0,06 0,04 0,02 O 27
5,0 Napięcie zasilające V
c c
ryj
Rys. £ 10. Histereza napięcia wejściowego w funkcji napięcia zasilającego
Dodatek D
D.1. Dopuszczalne parametry elektryczne mikrokontrolera AT90S2313 •
Parametry z a w a r t e w tablicy D . 1 są p a r a m e t r a m i d o p u s z c z a l n
2GA •
m
c n
y *' * przekroczenie m o ż e s p o w o d o w a ć u s z k o d z e n i e mikrokontrolera.
nieodwracalne
Tab. D.1. Dopuszczalne parametry mikrokontrolera AT90S2313 -55...+125°C
Zakres temperatury pracy
-65...+150X
Temperatura przechowywania
-1,0...Vcc+0.5V
Napięcie na końcówkach mikrokontrolera za wyjątkiem RESET w odniesieniu do GND
-1.0...13,0V
Napięcie na końcówce RESET w odniesieniu do GND
6,6 V
Maksymalne napięcie pracy
40 mA
Prąd DC obciążenia wyprowadzeń l/O Prąd DC na wyprowadzeniach zasilania V
c c
200 mA
i GND
Tab.D.2. Charakterystykistaloprądowe dla Ta=-40...+85°C
i Vcc=2,7...6,0V (jeśli nie zaznaczono inaczej) Maks.
Jedn.,
Napięcie wejściowe w stanie niskim
Z wyjątkiem XTAL1
-0.5
0.3V <"
V
Vu
Napięcie wejściowe w stanie niskim
XT ALi
-0.5
0,3Vccl
11
V
V,H
Napięcie wejściowe w stanie wysokim
2 wyjątkiem XTAL11FSESTT
0,6V «)
Vcc+0,5
V
Oznaczenie Parametr v
Ł
Warunek
Mirt.
Typ-
CC
CC
V V
IOL=20 mA,VCC=5V
0.5
V
l =10mA,VCC=3V
0.6
Napięcie wejściowe w stanie wysokim
XTAL1
v
K
Napięcie wejściowe w stanie wysokim
RESTT
3
;
Vcc+0,5
w
Napięcie wyjściowe' ' (porty B i 0)
..,"';<7
Vtc+0.5
v
V«.
,
O.B5Vcc(«
ol
4
Napięcie wyjściowe' ' (porty B i D)
ll
Prąd wejściowy l/O w sianie niskim
l,H
Prąd wejściowy 1/0 w stanie wysokim
RRST
R
W
I O H = - 3 mA, VCC=5V
4,3
I M . ^ - 1 , 5 mA, VCC=3V
2,3
V V V
Vcc=6V
1.5
HA
980
nA
Rezystancja podciągająca do góry wejścia RJ5TT
100
500
kn
Rezystancja podciągająca do góry
35
120
kn
3,0
mA
1,0
mA
9,0
15,0
pA
<1.0
2,0
pA
40
mV
50,0
nA
wejść portów l/O lec
Prąd zasilania
Tryb aktywny, V = 3 V. 4 MHz Tryb Idle. ^ = 3 V. 4 MHz c c
5
lec
Tryb Power-down<>
WDT aktywny, V = 3 V WDT zablokowany, V = 3 V cc
c c
VACIO
Wejściowe napięcie offsetu
Vcc=5V
komparatora analogowego
v -v«/z
IACIK
Wejściowy prąd upływu komparatora
Vcc=5V
analogowego
V*=V /2
Czas propagacji komparatora analo
Vcc=2JV
750,0
gowego
Vcc=4V
500,0
I*CPO
h
cc
-50.0
ns
Uwagi: 1.
„ M a k s . " o z n a c z a najwyższą wartość napięcia, która gwarantuje prawidło wą interpretację stanu niskiego.
2.
„ M i n . " o z n a c z a najniższą wartość napięcia, która gwarantuje prawidłową interpretację stanu w y s o k i e g o .
3.
P o m i m o t e g o , że k a ż d y port m o ż e być źródłem prądu większego niż po dany
w
warunkach
pomiaru
(20 m A
przy V
c
c
= 5 V i 10 m A
przy
Vcc = 3 V) w stanie statycznym obowiązują poniższe warunki: 1.
S u m a prądów wyjściowych IOL ze wszystkich wyjść nie powinna b y ć w i ę k s z a niż 2 0 0 m A ,
2.
S u m a prądów wyjściowych IOL dla portów D0...D5 i X T A L 2 nie po w i n n a przekraczać 100 m A ,
3.
S u m a prądów wyjściowych IOL dla portów B0...B7 i D 6 nie powinna p r z e k r a c z a ć 100 m A .
Jeśli prąd IQL przekracza założone warunki pomiarowe, to napięcie V Q L m o ż e przekraczać p o d a n e wartości. W y p r o w a d z e n i a nie gwarantują wy dajności prądowej większej niż określają to warunki pomiaru. 4.
P o m i m o t e g o , że k a ż d y port m o ż e być źródłem prądu większego niż po dany
w
warunkach
pomiaru
(3 m A
przy V
c
c
= 5 V i 1,5 m A
przy
V c c = 3 V ) w stanie statycznym obowiązują poniższe warunki: 1.
S u m a prądów wyjściowych IOH ze wszystkich wyjść nie powinna być w i ę k s z a niż 200 m A ,
2.
S u m a prądów wyjściowych IOH dla portów D0...D5 i X T A L 2 nie po w i n n a przekraczać 100 m A ,
3.
S u m a prądów wyjściowych IOH dla portów B0...B7 i D 6 nie powinna p r z e k r a c z a ć 100 m A .
Jeśli prąd I O H przekracza założone warunki p o m i a r o w e , napięcie V H 0
m o ż e przekraczać p o d a n e wartości. W y p r o w a d z e n i a nie gwarantują wy dajności prądowej większej niż określają to warunki pomiaru. 5.
M i n i m a l n a w a r t o ś ć napięcia V c w stanie Power-down C
wynosi 2 V.
D.2. Parametry czasowe zewnętrznego sygnału zegarowego
t
*
CLCX
*
4
tcUCL
Rys. D. 1. Definicje parametrów zewnętrznego sygnatu zegarowego Tab. D.3. Parametry czasowe zewnętrznego sygnatu zegarowego 'Oznaczenie Parametr 1/tcLCL
Częstotliwość oscylatora
V c=2,7 do 6,0 V C
Min.
Maks.
0
4
Vcc=4,0do 6,0 V Min.
Maks.
0
10.0
Jedn. ? • •-
MHZ
•CLCL
Okres zegara
250,0
100,0
ns
tf;HCX
Czas stanu wysokiego
100,0
40,0
ns
*CLCX
Czas stanu niskiego
100,0
40,0
tCLCL
Czas narastania
1.6
0,5
(IS
tcHCL
Czas opadania
1,6
0,5
|IS
ns
Dodatek E
Wyprowadzenia typowych wyświetlaczy LCD i VFD z interfejsem równoległym 1UUUUUUUUUUUUOJ14
4
•••••••••••••••1
4
Wypr.
Symbol
Funkcja
Aktywny
1
VSS
L
Minus zasilania
2
VDD
H
Plus zasilania
3
VO/VEE
-
4
RS
H/L
5
R/W
H/L
6
E
H
Regulacja kontrastu Wybór rejestru H: odczyt/L: zapis Sygnał zezwalający (enable)
7
DO
H/L
Unia danych DO
8
D1
H/L
Unia danych D1
9
D2
H/L
Unia danych D2
TO
D3
H/L
Unia danych D3
11
D4
H/L
Unia danych D4
12
05
H/L
Linia danych D5
13
D6
H/L
Linia danych D6
14
D7
H/L
- Linia danych D7
Dodatek F
Instalacja sterowników dla układu FT8U232BM w systemie operacyjnym Windows Fragment artykułu „Konwerter USB<->RS232" opublikowanego w Elektronice Praktycznej 10/2002
Przed pierwszym p o d ł ą c z e n i e m interfejsu d o k o m p u t e r a m u s i m y się w y p o s a żyć
w odpowiedni
sterownik.
chip.com/FTDriver.htm)
Na
stronie
producenta'
{http://www.ftdi-
m a m y d o dyspozycji sterowniki dla r ó ż n y c h syste
m ó w operacyjnych (prototyp byl sprawdzany pod W i n d o w s 9 8 o r a z M e ) . W y b i e r a m y o d p o w i e d n i i zapisujemy g o na dysk. N a l e ż y też z w r ó c i ć u w a g ę , ż e F T 8 U 2 3 2 m o ż e b y ć obsługiwany (pod W i n d o w s ) za p o m o c ą kilku ste rowników: - p o d s t a w o w y sterownik portu s z e r e g o w e g o , który przechwytuje w y w o ł a n i a funkcji A P I i przekierowuje j e d o stosu, - U S B (w komunikacji korzystamy wtedy z t y p o w y c h funkcji W i n d o w s ob sługi portu, w Delphi bez p r o b l e m u m o ż n a u ż y ć d o t y c h c z a s u ż y w a n e k o m ponenty obsługi C O M , np, T C o m P o r t lub T R s P o r t ze strony EP), - rozszerzony sterownik portu - posiada m o ż l i w o ś c i j a k w y ż e j , ale d o d a t k o w o obsługuje m e c h a n i z m Pług & Piay ( w y k r y w a n i e przy starcie W i n d o w s n o w y c h urządzeń - j e ś l i nie budujemy urządzenia, które zareaguje na wy wołanie P n P , lepiej t e g o sterownika nie stosować, g d y ż s y s t e m będzie do syć długo c z e k a ć na o d p o w i e d ź , c o spowolni u r u c h a m i a n i e k o m p u t e r a ) , - sterownik b e z p o ś r e d n i (direct)
t
który w y m a g a oddzielnych funkcji d o ob
sługi portu (funkcje t e są udostępniane w dołączonej bibliotece dli) - nie m o ż n a z a t e m korzystać z g o t o w y c h k o m p o n e n t ó w , ale za to m a m y dostęp d o rozszerzonego z e s t a w u operacji (ustawianie n i e t y p o w y c h
szybkości
transmisji, dostęp d o zawartości E E P R O M ) . D l a potrzeb p r e z e n t o w a n e g o interfejsu będą n a m p o t r z e b n e d w a sterowniki: p o d s t a w o w y oraz direct.
Po ściągnięciu ze strony F T D I p o t r z e b n y c h plików
rozpakowujemy j e d o o d d z i e l n y c h folderów (o d o w o l n y c h n a z w a c h ) u t w o rzonych na t w a r d y m dysku.
S u t m W r t o maUS n ł H « o w niwy ipR* USB<»SHWJ ff
ianWaW*; 00103 a w u n g o t o K ^ c e IwĄ tQii#.
W ^ i i j , r«*itiuy :>•(-«* dU uiflmi
1
Co cłtWK s t M !
0«V /rys. F. J. Windows automatycznie wykrywa dołą czenie konwertera
|
Rys. F.2. W tym oknie podaje się lokalizację ste rownika
Uruchomienie układu T e r a z p o d ł ą c z a m y k a b l e m naszą płytkę do gniazda U S B komputera (lub hu ba). P o p r a w n i e z m o n t o w a n e urządzenie jest od razu wykryte przez system, który p r o s i o w s k a z a n i e lokalizacji sterownika (rys. F . l ) - zaznaczamy opcję Podaj
lokalizację
sterownika.
P o p o t w i e r d z e n i u otwiera się okienko lokalizacji (rys. F.2) - zaznaczamy op cję Określona
lokalizacja
i wybieramy folder, do którego rozpakowaliśmy
pliki p o d s t a w o w e g o drivera wirtualnego portu C O M . W i n d o w s potwierdza znalezienie prawidłowego sterownika (rys. F 3 ) , a następ nie informuje o poprawnym zakończeniu instalacji nowego sprzętu (rys. F.4). Po z a ł a d o w a n i u sterownika W i n d o w s umieszcza interfejs na Uście sprzętu i p r z y d z i e l a m u n u m e r portu szeregowego - jest to widoczne w oknie Mene dżera
magistrali
szerego
wej oraz Porty - rys. F.5 i F . 6 . Zwróćmy uwagę, że zapis na liście
Urządzeń
Menedżera
K'»«nr dgdaurinii nowego ui*«|u
p o d pozycjami: Kontroler
BP??**'
uniwersalnej
Krealar dediwMni* n o w e o o s p r i f l u USB
SpMd Saol CwoMi
USB H**i $p»dSt
23
c.yjiiis\sitfiQw-?nDiBus.iHF
3
*** -I
F.3. Wybór sterownika trzeba zatwierdzić
Rys. F.4. Zakończenie instalacji sterowników in terfejsu
Właściwości: System •góto
M r a S = . i « ł i t e r f | Pro*, ipnstwm | Wyoapotó| ff WyhwjOwiKługiypow
•; i£j U m » u . 5Tl KornolBy CD-ROM
<~ Wirlwa-łOłnopotaia^
U « ~ « ; * y konlfoki ruota tlpu PO do USB VIA looh 3(*J u ™ ™ ; i * » Łortiolw hoiU l n u PO do USB W T t t h 3t USB H * 5 i m d S w l CorwsM < * • M o d e m ->; "I Mor*>y
3
^fayftolarydłhicku. w*d» • QHT $J VL4 ACH7 Auto ConMei [ W W l i s 3 Koreokrr m c i djłknith
H J>Pon/iCO«lLPI| _y AVM ISDN CAPI Pni 1 tftWISDNl | J KM ISDN CAPI Port 2 IWMISONJ, _J Porl*i**ŁjECPn.Pn) J Poi k o ™ * K y r v ( C O M 1 ) ^ Pert l ™ * K S T y t C O M 2 ] _y USBS«MlPoB(l»M31 m s5J S!**ia>>k4» ;*j *5 Uria&wia tytit/rotm
tff Sló—y tonwmaloi USB i i ¥ kontt«dio> USB i i U r a m u t y Ł w f i i * . h M « W u P O do USB VIA Tach 3C * f UrwHiA«luHraleir»it4««uPad4USavulKh3( <4 USBHiohSpwJStnalCOf-Hlor
<1 ^jfcjwald |
Qdinwt
|
Ulu*
|
Ęiufcij.
"1
I -
|
A^ui
flys. F.5. Po dołączeniu interfejsu do kompu
rtys. F.ft. Wirtualny port COM w oknie mene
tera i poprawnym zainstalowaniu sterowni
dżera sprzętu Windows
ków kontroler interfejsu USB jest widoczny Ailujnced Pan Sattln
w oknie menedżera sprzętu Windows
1
j e s t każdorazowo
aktualizowany
Stfectfow ifflłifli tocwecicowłKlicflpobtofni
• Sf+Kt
«łt»iOi lor
przy odłączaniu i dołączaniu płyt ki - m o ż e m y się naocznie przeko
perlornwca -
Hiohti*);
! IronmlBUfst Lw.[i|
nać, j a k działa m e c h a n i z m wykry w a n i a urządzeń przez magistralę
COM
U S B . N u m e r portu jest wybrany j a k o pierwszy wolny, ale m o ż e m y g o dowolnie zmienić, korzystając flys. F.7. Konfiguracja wirtualnego portu szerego z o k n a dialogowego Port>Właści- wego przebiega w taki sam sposób, jak innych wości>Zaowansowane
(rys. F.7).
portów COM
Programowanie pamięci EEPROM D o zaprogramowania pamięci 93C46 n a płytce służy bezpłatny ftd2xxst.exe
program
(pobrany z e strony FTDI wraz z opisem w formacie pdf). W y m a g a
on jednak zainstalowania wspomnianego wcześniej sterownika direct. Aby nie usuwać używanego d o tej pory sterownika portu wirtualnego, wykorzystamy standardowy mechanizm aktualizacji sterowników w W i n d o w s . W oknie Mene dżera Sprzętu wybieramy nasz kontroler U S B (rys. F.8) i otwieramy okno jego właściwości, w których uruchamiamy opcję Aktualizuj sterownik
(rys. F.9).
Przejdziemy wtedy p r z e z szereg okien p o d o b n y d o pierwszej instalacji - ale j a k o lokalizację p o d a j e m y folder z r o z p a k o w a n y m i plikami sterownika di-
rect. Po zakończeniu aktualizacji w Mene Opita
Mmetounitio
ff Wftngt w»oług W««
| Piofo icrzeUw* | Wyd»»fii| f~
dżerze sprzętu
Wjtfwedwedhjc-pofcfiierl
a także (rys.
,v ; i Korttotaiy CD-ROM >; ^ •.onoolwy oysku rwardego .-] Q WJioIcty o*»skii. wideo i gier ^ Vtó AT97 Audc Ccmboier fWDM] S s i K«**
wirtualny
F.10).
Od
tej
port
chwili
szeregowy do
obsługi
U A R T - u musimy używać oddzielnych fun kcji z dołączonej biblioteki dli (na stronie
4rf Głowy koncenlroltt USB 1C Glowny koncwKiahM USB (6 u»wi^kviirftohoualrouPC1dDUSBVIATech3C dr Ur^i:^kttviotatoaiypuPatoU5BvlATecłi3( USB HIGIISPE«L 5 WAL CAWATS
zmienia się opis konwertera
znika
znajdziemy szereg przykładów dla popular nych środowisk programistycznych, oczy wiście także dla Delphi). Teraz m o ż e m y uruchomić program serwiso
Mcrtoiy
wy. P o j e g o uruchomieniu ( r y s . F . l l ) nale ży wypełnić wszystkie pola edycyjne p o d s t a w o w e g o opisu urządzenia (dalsze opcje Ani*
uaktywniają
po
ponownym
Rys. F.8. Wymianę sterownika rozpoczynamy od
przejściu d o pola Manufacturer
się
dopiero
klawiszem
wskazania modyfikowanego urządzenia w mene
Tab).
dżerze urządzeń
dla własnych warsztatowych (a nie produk-
Tutaj jedna b a r d z o istotna uwaga
-
cyjno-komercyjnych) potrzeb - nie warto zmieniać żadnych identyfikatorów p o z a o p i s e m . Dotyczy t o zwłaszcza n u m e r ó w V I D i P I D , na podstawie któ rych W i n d o w s identyfikuje potrzebny sterownik. Przy zmianie VID/P1D na leży w y s z u k a ć i z m i e n i ć również wpisy w odpowiednich plikach *.inf
-
w p r z e c i w n y m razie s y s t e m nie odnajdzie sterownika i konwerter pozostanie u r z ą d z e n i e m n i e z n a n y m dla systemu. Wldtciwcrid: USB Hiah Spaed Swlal Co Go**
OGOHE MenedMi iK4d»I | PROFLE iojiCowo | Wydaroić |
SlrWł* |
ff WYI»s
r
Wytv«ełfwectuB położeń
KoiWo^i^wiabeiroagnttaiKeretiowei3
GIcWykoncmliOOltJSB GM*wvkonc*i*a«irU5B UrifWia^kc^oiHhoMalypuPa<)oUSBVlArłcłi3( Unw«^r^oWhoilaWoPadoUSBVlAIeeh3( ^ 1 Modem 5 ł Monlocy 4& A s£
uiadttna. kttniojjo*. S:tKO«yc*u Mrio™*» iły :*tuatao~*ć P » i « e w A a d ł ' ^ a ; 5 d » ^ V i k i ^ r « y « ^ ' * ' " i*™**ll,,
1
ls
JPORTYLCOKULK] J AVM ISDN CAPI Port 1 (AWMISDNll J AVH ISDN CAPI Port 2(AVMISDH2I ^ P « L dJ>arti ECPILFT1I _y Port komnisciny ItOMI) J PorlkcnunkaciwICOMa
fljrc. F.9. Okno aktualizacji (wymiany) ste rownika Rys. F. 10. Menedżer urządzeń po przeinstalowa niu sterownika
- l a t xl Ejle
Qevice
Qpiicns tielp AdcSional ilwns *e coofigued as lolows: -•
CcWiguraricn ~
PtogandPlay F[ SełPowced FosdSenalHmfceiF? | Rewie Woka* [Docooocc ;
Vendc.lD |0403
ProduclID |*00l Deiaipbon |KOHWERIER USB-RS232
MajsPoweilrrAJ (osj
7]
"iMÓDErEdiT
/fys. F. 12. Okno zaawansowanych usta
Rys. F.11. Okno główne programu serwisowego
wień uktadu FT8U2xxAM
P o zapamiętaniu nastaw w ł ą c z a m y u a k t y w n i o n e w t e d y u s t a w i e n i a z a a w a n s o w a n e (Advanced
setup) - r y s . F . 1 2 . Umożliwiają o n e :
- W y b ó r opcji P ł u g and P l a y - p o z o s t a w i a m y niezaznaczoną. - W y b ó r ręcznego lub automatycznego przyznania n u m e r u seryjnego (automa tyczny jest w y g o d n y , g d y ż zapobiega - przy p r o g r a m o w a n i u konwerterów n a d a n y m komputerze - powtórzeniu się numeru. Dla potrzeb n a s z e g o pro jektu obejmującego tylko kilka płytek został j e d n a k wybrany tryb ręczny). - W y b ó r sposobu zasilania: z magistrali albo s a m o d z i e l n e - p o z o s t a w i a m y zasilanie z magistrali (nie jest t o zbyt istotne, g d y ż n a d r z ę d n y d l a określe nia s p o s o b u zasilania j e s t p o z i o m n a wejściu P W R C T L kostki, c o p o z w a l a na sprzętową kontrolę a k t u a l n i e u ż y w a n e g o źródła zasilania w bardziej roz budowanych układach). -Udostępnienie
funkcji
H*l WtilMIWI-lirill I • • • Eile
Qevice
flptions
tielp
^
'-M*
z d a l n e g o budzenia hosta
z
trybu
Układ
stand-by.
wykonuje
ustawiając
parę
to
różni
cową w stan K ( o d w r ó c o n a polaryzacja) - d a l szym przekazaniem te g o sygnału zajmuje się j u ż hub. - Określenie nego
maksymal
poboru
prądu:
k o n w e r t e r (jak w y n i k a
MonJactuw 10 jrr VendwlD |0403
PmdudlO J6001 D e a w k m JKOKWERTER USB-&232
PROGRAM DEYICE H u n ^ r 00000002 00:000003MO! 600002 8 0 3 ! 0 0 0 0 0 0 0 0 W 0 * 10.9E 28 CS 12 0A 03 46 00 S4 00 « 00 49 00 23 03 20: 4B 00 4F00 4E 00 5? 00 4 5 00 52 00 54 00 43 00 30: 52 00 20 00 53 00 33 OO 42 00 2D 00 52 00 53 00 40:32 00 33 00 320012 033000 30 00 30 00 30 00 50.300030003000 32 000203 01 0000000000 fO.OOOOOOOOOOOODOOOOOOOOOOOOOOOOOOO
Zł "[MODETPro grani
Rys. F.13. Odczyt kontrolny zaprogramowanej pamięci
z not k a t a l o g o w y c h użytych układów) pobiera zawsze poniżej 100 mA. U m o ż l i w i a to b e z p r o b l e m o w e zasilenie z magistrali U S B , gdyż każdy hub gwarantuje 100 m A w portach downstream (nawet w trakcie e n u m e racji). W polu e d y c y j n y m została wpisana przykładowo wartość nieco mniejsza. P o w p r o w a d z e n i u d a n y c h wykonujemy programowanie i kontrolny odczyt E E P R O M - w y n i k tej operacji widzimy n a r y s . F . 1 3 .
Sprzętowy test konwertera Program
s e r w i s o w y umożliwia też przeprowadzenie kompletnego testu
s p r z ę t o w e g o . W y m a g a n e j e s t j e d n a k do tego posiadanie w komputerze wol nych p o r t ó w s z e r e g o w y c h C O M 1 i C O M 2 oraz przygotowanie odpowied niego k a b l a p o ł ą c z e n i o w e g o (dla złącz D B 9 ) : Pin Pin Pin Pin Pin Pin Pin
3 2 7 8 6 5 4
(TXD) (RXD) (RTS) (CTS) (DSR) (GND) (DTR)
-
COM2 COM2 COM2 COM2 COM2 COM2 COM2
Pin Pin Pin Pin Pin Pin Pin
2 3 8 7 4 5 6
(RXD) (TXD) (CTS) (RTS) (DTR) (GND) (DSR)
Pin 1 ( C D )
- C O M 1 Pin 4 (DTR)
Pin 9-(RI)
- C O M I Pin 7 (RTS)
U w a g a ! T e s t u r u c h a m i a m y dopiero p o wykonaniu wszystkich podłączeń w p r z e c i w n y m przypadku program się zawiesza (w przypadku W i n d o w s 98 r a z e m z s y s t e m e m ) . W y n i k poprawnie przeprowadzonego testu pokazano
U ^ U U m i l L J T f T £.ie
Qevi«
Qpnons
mmr?:"--^'''
MwnietfuerlO |rT~
Mfniactimi jfTDl VendoilD
- m u s i
Help
-
jw© "
PiodueUD [ t O O l
-
D « a i p o o o |KOH W E R T E R USB-B2J2
CTS T m PASS KRT«1 PASS CDT«I P*SS RlT.it PASS R*/r* it300 Biud PAK JOTTKU I I J I O O B - I PASS o
J
DEVICE PASSED j—
—
- — —
~ ~ .MODE": Piafli*™
Rys. F. 14. Wyniki poprawnego testu sprzętowego konwertera
na r y s . F . 1 4 . Test jest w y k o n y w a n y za pomocą p r o g r a m u d o s t ę p n e g o na stro nie www.fidichip.com.
Znajduje się tam też P D F z d o k ł a d n y m o p i s e m obsłu
gi, którego tutaj nie b ę d z i e m y przytaczać. T e n s a m p r o g r a m służy d o zapisy wania współpracującej
z F T 8 U 2 3 2 B M pamięci E E P R O M - j e s t to łatwe
dzięki załączonym s z c z e g ó ł o w y m instrukcjom. Materiały p o m o c n i c z e F T D I zawierają wiele d o d a t k o w y c h informacji na te m a t z a s t o s o w a n e g o u k ł a d u oraz zalecenia d o p r o g r a m o w a n i a transmisji wy nikające ze specyfiki transferów bulk u ż y w a n y c h od strony magistrali U S B . W a r t o przynajmniej c z ę ś c i o w o zapoznać się z nimi przed p i s a n i e m własnych procedur obsługi komunikacji z u ż y c i e m k o n w e r t e r a oraz b u d o w ą innych urządzeń korzystających z F T 8 U 2 3 2 . Jerzy Szczesiul, A V T [email protected]
Dodatek G
G.1. Płytka drukowana zestawu ZL1AVR i-i 1
• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • •
• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • a o • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • a o • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • O • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • a o • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • a o • • • • • • • • • • • • • • • • • • • • • • • a • • • • • • • • • • • a • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • a a • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • a o • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • o o • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • a o • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • a o • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • a o • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • o ^ • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • a a i° • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • a • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • a Dooooooooooaoooa•••••••••••••••••nad DDDOOaOOODDDOaDa • • • • • • • • • • • • • • • • • • • o • • • • • • • • • • • • • • • • • • • • 0 0 • • • • • • • • • • • • • • • • • • • • • a • • • • • • • • • • • • • • • • • • • • • a ooaoo Oannoaaana•••••••••••• cJoaoo —tooo! • • • • • • • • • • • • • • • • • • • • a a rd I d S i l • • • • • • • • • • • • • • • • • • • • • a eaai • • • • • • • • • • • • • • • • • • • • • o • • • • • • • • • • • • • • • • • • • 0 0 • • • • • • • • • • • • • • • • • • • a o • • • • • • • • • • • • • • • • • • • •
§
oooooooo ^opooooogl
o—B-5
180
Rys. G1, Schemat montażowy piytkizestawu ZL1AV8
• • • • • • • • • • • • • • • • • • • • • • • • • • • • •
• • • • • • • • • • • • •
• • • • • • • • • • • • •
• • • • • • • • • • • • •
• • • • • • • • • • • • •
• • • • • • • • • • • • •
• • • • • • • • • • • • •
• • • • • • • • • • • • •
• • • • • • • • • • • • •
• • • • • • • • • • • • •
• • • • • • • • • • • • •
• • • • • • • • • • • • •
• • • • • • • • • • • • •
• • • • • • • • • a • • • • a • • • • a • • • • a • • • • • • • • • • • • • • a • • • • a • • • • • • • • • • • • • • • • • • • •
• ••••••••••••••••!]•••••••••••••••• • •••••••••••••••[!••••••••••••••••• •••••••••••••••••••••••••••••••••• •••••••••••••••••••••••••••••••••• • • • •
• • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • •••••••••••••••••••nn • • • • • • • • • • • • • • • • • • •
• • • • • • • n n a n a n • • • • • • • • • • • • • • nanaanoonana • • • • • • • • • • • • • •
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
• •
•
• • •
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
•
Rys. G2. Strona elementówptytkizestawu ZL1AVR
• • • • • •
•
•
• • • • •
• •
•
• •
•
• • •
• •
• •
•
• •
• •
• • •
• O
• •
•
• O
• •
• •
•
• O
•
•
• • • • • • • • • • • • • • •
• • • • • • • • • • • • • • •
• • • • • • • • • • • • • • • • •
• • • • • • • • • • • • • • • • •
• • • • • • • • • • • • • • • • •
• • • • • • • • • • • • • • • • •
• • • • • • • • • • • • • • • • •
• • • • • • • • • • • • • • • • •
• • • • • • • • • • • • • • • • •
• • • • • • • • • • • • • • n a • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • n • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • n a • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • a • • • • • • • • • • • • • • • • • • • • • • • • a • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • a • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • a • • • • • • • • • • • • • • • • • a • • • • • • • • • • • • • • • • • a • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • • •
Rys. G3. Strona lutowania płytki zestawu ZL1AVR
G.2. Płytka drukowana programatora ZL2PRG
mmmmmmm
\
r
2
/
flys. G4. Schemat montażowy płytki programatora ZL2PRG
Rys. G6. Strona lutowania ptytki programatora ZL2PRG
Dodatek H
Wybrane adresy internetowe związane z mikrokontrolerami AVR Internet j e s t nieprzebraną skarbnicą wiedzy. Nie mogło więc zabraknąć stron o m i k r o k o n t r o l e r a c h A V R . M o ż n a tu znaleźć noty katalogowe i aplikacyjne p r o d u c e n t a , liczne strony autorskie prezentujące bardzo zróżnicowane p r o j e k t y , m o ż n a zapisać się na tematyczne grupy dyskusyjne, gdzie problemy t e c h n i c z n e r o z w i ą z y w a n e są przez grupowiczów. Wprawdzie rzadko kiedy udaje się u z y s k a ć w ten sposób wyczerpującą odpowiedź, ale często poczy nione sugestie otwierają n a m przysłowiowe „klapki na oczach", pozwalając z r e a l i z o w a ć z s u k c e s e m własny projekt. T r u d n o w krótkim rozdziale streścić n a w e t c z ę ś ć najciekawszych stron. Poniżej zostaną wymienione jedynie wy b r a n e a d r e s y z krótkim przedstawieniem poruszanej tematyki: - http://www.atmel.com
- strona producenta mikrokontrolerów A V R - firmy
Atmel. - http://www.avijreaks.net
- j e d n a z ważniejszych stron o mikrokontrolerach
A V R . M o ż n a na niej znaleźć informacje dotyczące samych układów, j a k i p r o g r a m ó w narzędziowych przeznaczonych dla nich. Jest też forum p o d z i e l o n e na kilka g r u p tematycznych, n p . grupa ogólna o AVR-ach, grupa 0 A V R - G C C , grupa o A V R Studio, grupa o projektach itp. M o ż n a tu zna leźć d a n e k a t a l o g o w e wszystkich mikrokontrolerów A V R . Jedną z cieka w o s t e k j e s t prezentowany status produkcyjny każdego elementu, co przy c z ę s t y c h zmianach w programie produkcyjnym Atmela może być bardzo przydatną informacją.
M o ż n a też znaleźć informacje o licznych narzę
d z i a c h p r z e z n a c z o n y c h dla A V R - ó w . Funkcjonująca na tej stronie
Akade
mia j e s t ź r ó d ł e m wiedzy na profesjonalnym poziomie. 1 wreszcie w zakład ce A V R G C C m o ż n a znaleźć najnowsze wersje kompilatora A V R - G C C . - http://users.rcn.com/rneswold/avr/index.html
- strona z dokumentacją k o m
pilatora A V R - G C C . - http://www.avr-asm-tutoriai.net/index.html
- strona opisująca mikrokontrole
ry od podstaw z wieloma przykładowymi programami i projektami urządzeń. - http://avr.hw.cz/hw/avr/
- ciekawa strona zawierająca zarówno teorię, j a k
1 p r a k t y k ę . M o ż n a tu znaleźć m.in. porównanie poszczególnych typów mik rokontrolerów A V R , kilka schematów programatorów ISP, odnośniki d o p r o d u c e n t ó w narzędzi.
- http://www.mikrocontroller.net/tutorial/index.en.htm
- tutorial mikrokont
rolerów A V R . - http://www.blitzlogic.8m.com/proj_avr.htm sów
wykorzystujących
- przykłady r ó ż n y c h
mikrokontroler
interfej
AT90S2313,
oprogramowanych
- http://www.atmel.com/dyn/resources/prod_documents/doc0943.pdf
- nota
w j ę z y k u C. aplikacyjna A t m e l a A V R 9 1 0 dotycząca p r o g r a m o w a n i a m i k r o k o n t r o l e r ó w w systemie. -http://www.voIny.cz/eremy/progfun/popis_p.htm
- opisy r ó ż n y c h konstruk
cji p r o g r a m a t o r ó w . -http://jaichi.virtualave.net/adapter-e.htm
- przykłady r ó ż n y c h p r o g r a m a t o
r ó w przeznaczonych d l a mikrokontrolerów A V R . - http://www.avrproject.com/
- g o t o w e projekty n a A V R - y .
- http://www.online-club.de/-burkhard-john/avrkreis/index_e.html projekty n a
-
gotowe
AVR-y.
- http://www.myplace.nu/avr/index.htm
-
strona Jespera H a n s e n a , twórcy
s ł y n n e g o Y a m p p a . Z n a j d z i e m y tu wiele c i e k a w y c h informacji. -http://www.opticompo.com/emb/support/docs/ieasy2_data.pdf
-
opis bar
d z o interesującego projektu modułu internetowego P P P - T C P / I P bazującego na m i k r o k o n t r o l e r z e A T m e g a 3 2 3 L . - http://www.hpinfotech.ro/
- strona producenta kompilatora j ę z y k a C C o d e -
V i s i o n A V R z b a r d z o r o z b u d o w a n y m i funkcjami bibliotecznymi, w y p o s a ż o n e g o w IDE. -http://www.e-lab.de/AVRco/index_en.html
- d o pobrania na tej stronie jest
d a r m o w y kompilator P a s c a l a dla A V R - ó w . - http://www.mcselec.com/bascom-avr.htm
- strona producenta kompilatora
B A S C O M dla A V R - ó w , d o d a t k o w o opisy wielu projektów. - http://www.fastavr.com/-
strona o konkurencyjnym dla B A S C O M - a kompi 2
latorze Basica dla A V R - ó w z procedurami obsługi L C D , R T C , I C , D C F - 7 7 , generatora D T M F , odbiornika R C 5 , itp. - http://sourceforge.net/projects/winavr
- trochę różności nie tylko o AVR-ach.
-http://c2.com/cgi/wiki7ExtremeProgrammingRoadmap
- strona dość luźno
związana z m i k r o k o n t r o l e r a m i A V R , ale z pewnością zainteresuje k a ż d e g o bardziej z a a w a n s o w a n e g o programistę. Porusza tematykę p r o g r a m o w a n i a ekstremalnego. -http://www.elektronika.qs.pl/linki.html
- bogata lista o d n o ś n i k ó w d o stron
p r o d u c e n t ó w e l e m e n t ó w elektronicznych.
Tablice kodów
ASCII
Dodatek
Tablice kodów ASCII 1.1. Tablica kodów ASCII oec
HEX
CHAR
DEC
HEX
CHAR
DEC
HEX
CHAR
0
00
NUL
42
2A
*
84
54
T
1
01
43
2B
+
85
55
2
02
SOH STX
44
2C
56
U V
3
EXT
45
20
-
57
W
4
03 04
86 87
EOT
2E
88
5
05
ENO
46 47
2F
1
89
58 59
Y
6
06
ACK
48
30
0
90
5A
Z
7
07
BEL
49
31
1
91
5B
8
08
BS
50
32
2
92
5C
[ \
9
09
HT
51
33
3
10
OA
LF
52
34
4
93 94
11
08
VT
53
35
5
12
OC
FF
54
36
6
95 96
60
1
13 14
OD
CR
55
37
7
97
61
a
OE
SO
8
98
62
b
OF
S1
56 57
38
15
9
99
16
10
DLE
58
39 3A
100
63 64
c d e
5D
1
5E 5F
A
17
11
XON
59
3B
: ;
101
65
18
12
DC2
60
3C
<
102
19
13
XOFF
61
30
s
20
14
DC4
62
3E
>
103 100
66 67
21
15
NAK
63
3F
22
16
SYN
64
23 24
17
ETB
65
40 41
? ©
18
CAN
42
B
25
19
EM
66 67
43
C
26
1A
SUB
68
44
D
27
1B
ESC
69
45
E
28
1C
FS
70
46
29
10
30
1E
GS RSt
71 72
A
105 106 107
X
68 69 6A 6B
f g h i j k
6C
1
110
6D 6E
m n
111
6F
o
F
112
70
P
47
G
48
H 1
113 114
71 72
q r
49
31
1F
US
32
20
SPACE
73 74
4A 4B
108 109
115
73
s
J K
116 117
74 75
u
t
33
21
I
75
34
22
76
4C
L
118
76
V
35
23
77
40
M
119
77
w
36
24
• # $
78
4E 4F
N
120 121
78 79
122
7A 7B
37
25
%
79
38
26 27 28
S
60
50
•
81 62
51 52
83
53
39 40 41
29
( )
0 P Q
X
y z
{
B
123 124
7C
1
S
125
7D
)
Rys. 11. Znaki i odpowiadające im kody ASCII (część 1)
DEC
HEX
CHAR
126 127
7E 7F
DEL
128
80
129 130
DEC
HEX
CHAR
DEC
HEX
CHAR
172
AC
V,
212
D4
L
AD
1
AE
«
213 214
D5
C
173 174
F ir
81
0
175
AF
n
D7
6
215
82
b
B
D8
83
BO
216
131
176
132 133
84
&
177
BI
85
h
178
134
86 87
k
179 180
B4
181
B5
182
86
183
B7
184
B8
135
C
D6
4
217
D9
B2
1 1
218
DA
B3
:
219
DB
220
DC
221
DD
222
DE
^
223
DF
i i •
Tl
224
EO
a
-i
225
E1
226
E2
227
E3
P rTC
228
E4
Z
i
136 137
88 89
6
138
8A 8B
B
139 140
8C
r
141
8D
f
142
A A
185
B9
^
143
8E 8F
186
BA
II
144
90
E
187
BB
145
91
88
229
E5
a
188
BC
92
/E
E6
DC
146 147
230
189
8D
IL
93
Ó
231
E7
t
190
BE
J
148
94
r
232
E8
149
95
ó
*e
F
150
96
151
97
0
152
98
153 154
99
9 Ó
9A
0
155
9B
c
156 157
9C
£
9D
158
H
191
BF
1
233
E9
192
CO
L
234
EA
193
C1
_L
235
EB
194
C2
T
236
EC
cc
237
ED
0
238
EE
€
239
EF
195
C3
r
196
C4
_
197
C5
t
240
FO
•
¥
198
ce
r
241
F1
±
9E
Pt
199
C7
h
242
F2
243 244
F3
ś
F4
245
F5
ri
246
F6
+
247
F7
m
248
F8
159
9F
/
200
C8
l!_
160
A0
a
201
C9
Ir
161
A1
[
202
JL
162
A2
ó
CA CB
163
A3 A4
u
204
CC
h
A5 A6
Ń
205
CD
206 207
CE CF
208
DO Dl D2 D3
164 165 166
n8
t
203
167
A7
a
168
A8
i
169
A9 AA
<~
209
170
-.
171
AB
V.
210 211
V
+
249
F9
250
FA
251
F8
•i
252
FC
T*
253
FD
*1 2
T
254
FE
•
4.
255
FF
Rys. 1.2. Znaki i odpowiadające im kody ASCII (część 2)
Tablice kodów
ASCII
1.2. Znaki zawarte w generatorze znaków sterownika HD44870
OOOO 0001 woaOOOO
CG RAM (0
xxxx0001
(2)
0010
0011 0100
J-'
•JJ J iJL..' w.
r*
B
* •
(3)
—
p
•a.S
• i
1001 1010 1011 1100 1101 1110 1111
\
y s H I 1 Mn •
xxxx0010
0101 0110 0111 1000
r
T T
ij
(4)
* H- u
wc«0101
(5)
•
(7)
i " : , J
xxxx0111
xxxx1000
j j
~?
" .= 1
(8)
•
0)
•
H i U W :
xxxx1010
(2)
(3) - V 't Li- I
*
s" " I
E
T
(4)
xxxx110O
(5)
xxxx1101
(6)
•
srać;
fl
h
B
T
1
P +1 »
•
-I—r
J
•
X •
!"!
U
IL- - 1 I.,- 1
B
T l
- 3
S'
•
V
n
•
±
•
PI
xxxx1110
N
(7) •
xxxx1111
(8)
• *
•
• •
•
•
HI
ij
n I
m
3
ń
I
Ti
i i
i
| B
B
U
—• •—
Rys. 1.3. Wygląd znaków zapisanych w generatorze znaków sterownika LCD HD44870 (wersja standardowa). Znaki o kodach 00...QFh (CG RMK1....CG RAMS) użytkownik może samodzielnie zdefiniować
M
Ti R
B
—
f
!ti!
3 P q
•
—~~
t
H •
w—
•
-—
JU.
•
B
75
\
B e •
ij
i
y "
E= 6
=F
\-
fl
T
*
K[ k M "j
—
—~\
fl •
T
^i •
B
1 1
.1
J
B
xxxx1011
fl^B
I
B B
T
h
^~~r—3
q
fl
—IF^
-n
*
fl
ii
— M l — I I
xxxx1001
T
E
J
*'' ^ ''
T.
IJ p U
B —«»—
xxxx0110
c
i
Li 1
—MT—
n
E
•
(6)
' 1
P
"l"
J
^ ^ B
i*.
xxxx0100
1
— ,
• *
xxxx0011
"
E
* •
DOOO 0 0 0 1 0 0 11 0 0 1 00 0 1 1 0 1 0 00 1 0 10 1 1 00 1 1 1 1 0 0 01 0 1 01 0 1 11 1 0 01 1 0 11 1 1 01 1 1 1 CS xxxxOOOO
RAM
(1)
•
E. ES. ET II
M
x x x x 0 0 1 0 (3)
x x x x 0 0 1 1 <4)
xxxx0100
Cu »
!"":
.3
•4
"ssr 6 ) x x x x 0 1 0 1(
•
lLę
.
!
VK
•
i
ff •
~J£
•
•
(8)
i • a
. -
r . E
r™
" 5 [ -s f" *
x x x x 1 0 0 1 (2)
• • p
*
x x x x 1 0 1 0 {3}
B
hi •
I i • •
;
""Hi r™i E
•
•
!
j'
\
JU
+
r
: s
r.
s
E
-
I\
j—>_
—•—
:
:™a
i f • •
ł"
-h -Ł-
.—! i !
E—E B I J Ł-
.«
•
.•HI • •
E 3 s T
Im!
B—
i
B
i
4 •
•5
* •
• •
• • —mur— •
B
3™3
•
L-ll
• • • • »
•
• • * •
y
-. •l • '
BE
• •
B
n• .
^ m —^
*
J£
w
:VS
•E5!b
1
i.
3 3 • • B_J
•^b
ł_ — -•
ra !.-
j *
IZe • •
• •
• •
, ara .
: ą i™
•
3 3 3
• •
• • • a
• •
.-1
|"|
9
, ntM —•— • •
• •
iV
1
.TojL,
—•—
i 1
• • 8
.ii-
• • E 3 •--
1
i I
H
fi
Ha
E
•i y
•s
•
B B
s i
hi n
• •
r
i
A
• • • • • * • E• •I • HM Jl • H_
E
•
• •
r-. L •
ś
•. • _ j n
.T
ł '+ •
1
U
B
(4)
x x x x 1 1 0 0 (5)
B
n T
* •
•
xxxx1011
b~e
"i
• mm
f"
x x x x 1 0 0 0 ( 1 )
: s s
i.! T• n f. • r™ i ilśni
T^TT—I -
xxxx0111
r
3±S
• • ! 'e
—
r- • * 7 ) x x x x 0 1 1 0 (
Ę_
•_ j
!~-
ii.
3>
(5)
=~B
f". •
??
P
1 R R
\
x x x x 0 0 0 1 (2)
E—B
p
• » S
"T
•
*
• •
,
x x x x 1 1 0 1( 6 )
,* 7S.f
•• •
n —'-" - &
(8)
• •
x x x x 1 1 1 0 ( 7 ) SC"™.." XXXX1111
• •
•
"ST
• •
•
H
i •"
_*
0
"L.
lii
F"e
l E
n
3
=|=
"Fi E™
• n•
•• a
nrm
i~i
• T S
1
—•—
3.s
T BI
•_a •
«•"i
i i
9
_o»_ ..-W—
t>
•
• • •
• B ' 3
•
m m m w
e"b
i
"b
•ś • • ml
JL
S
mmm\
Rys. 1.4. Wygląd znaków zapisanych w generatorze znaków sterownika LCD HD44870 (wersja europejska). Znaki o kodach OO...OFh (CG RAM1....CG RAMS) użytkownik może samodzielnie zdefiniować
1-wire 311. 374 A/C 96,351,389 ACD 57,97 ACI 97 ACIC 98 ACIE 98 ACISO 98 ACIS1 98 ACO 97 ACSR 97 ADC 137 ADD 138 ADIW 139 Adresowanie bezpośrednie 31 pośrednie 31 różnicowe 25 AINO 17, 96, 100, 103 AIN1 17,96, 100, 103 Aktywne zbocze 49, 50, 67, 98 ALU 13, 20, 26 AND 140 ANDI 141 Architektura U, 21 Arytmetyczne 26, 130 ASCII 299, 330, 367, 397, 413, 445 Asembler 8, 128, 278, 279, 284, 296 ASR 142 Asynchroniczna 85, 365, 409 ATmega 84, 301, 312 ATtiny 79,420 AVR Studio 279, 284, 290, 353 AVR-GCC 8, 283, 304, 326, 369 Bascom 128, 278, 304 Baud 93 BaudRate 87,93,95 BCLR 143 Bit startu 87, 93, 366 stopu 86, 93. 365 zezwolenia 48, 50, 76, 81, 92, 98 Bity konfiguracyjne 107, 115 zabezpieczające 114 BLD 40, 144 Błąd ramki 89, 91 BRBC 145 BRBS 146 BRCC 147 BRCS 148 BREQ 150 BRGE 151
BRHC 152 BRHS 153 BRID 154 BRIE 155 BRLO 156 BRLT 157 BRMI 158 BRNE 159 Brown-out 84 BRPL 160 BRSH 161 BRTC 162 BRTS 163 BRVC 164 BRVS 165 BS 118 BSET 166 BST 167 C/A 295,389 CBI 38, 98, 170 CBR 171 CG ROM 330 CG RAM 330 Chiperase 118 CHR9 87,93 CLC 172 CLH 173 CLI 174 CLN 175 CLR 176 CLS 177 CLT 178 CLV 179 CLZ 180 COM 181 COM1A0 64,72,358 COM1A1 64, 72, 358 CP 182 CPC 183 CPI 184 CPSE 185 CRC 365, 380 CS00 60,61 CS01 60,61 CS02 60,61 CS 10 62,68,73 CSU 62,68,73 CS 12 62,68,73 CTC1 67
Cykl 47, 72, 76, 83, 114, 123, 313, 352 DATA 117 DataPolling 126 DDRAM 329,330 DDRB 39, 99, 101 DDRD 39, 87, 106, 107 DEC 186 DTR 310 Dyrektywa 281 EEAR 39,80 EECR 39,80 EEDR 39,80 EEMWE 39,80 EEPROM 26, 79, 80, 82, 84, 114, 116, 123 EERE 82 EEWE 81 EIA232 363 EICALL 187 EIJMP 188 ELPM 189 EOR 191 FE 89,91 Fifo 369,413 Flaga przerwania 48, 97 Flash 16, 21, 26, 84, 113, 116, 123, 285 FMUL 192 FMULS 194 FMULSU 196 FSTRT 45, 115 FTDI 408 Funkcja porównania 65, 67 Funkcje alternatywne 102, 108 generator 73, 76, 93 taktujący 23, 46, 57 GIFR 39,50 GIMSK 39,47,49 Glitch 71,73 Globalne zezwolenie 97 GNU 284, 297, 304 PC 311,388 ICALL 34, 198 ICES1 66 ICF1 53 ICNC1 66 ICP 18, 64, 67, 108 ICR1 39, 64, 71, 108 ICR1H 39,64,71,108,313,352 ICR1L 39, 64, 71, 108, 313, 352 Identyfikator 116, 380
Idle 16, 55, 57, 88, 97 UMP 34,200 IN 201 INC 202 Indeksowy 20, 25, 32 Instalacja 284, 297, 432 INT0 18,49, 53, 55, 109 INT1 18, 49, 53, 55, 109 Interfejs 85, 300, 310, 331, 363, 374, 388 INTERRUPT 40, 47, 92, 97 INTF0 50 INTF1 50 ISC00 55 ISC01 55 ISC10 55 ISC11 55 ISP1 316 ISP2 316 JMP 36,203 Kedit 278 Klawiatura 295, 309 Komparator analogowy 64,96,312,352 Kompilator 8, 278, 283, 287 LCD 311, 328, 343, 374, 396, 408, 412 LCD! 311 LD 208 LDD 206,209 LDI 212 LDS 213 LED 303,310,317,351,368 LF 369,412 Licznik programu 26, 44, 136 Lista rozkazów 128 Lockbits 114, 122 LPM 214 LSL 216 LSR 217 Magistrala 11,20,328,389 Makefile 287, 297 Mapa pamięci 22, 381 Master 81, 377, 389 MCUCR 39,54 MISO 17, 100, 102, 123, 315 MOSI 17, 100, 102, 123, 315 MOV 218 M O V W 219 MUL 220 MULS 221 MULSU 222
NEG 224 NOP 226 Null-modem 310 Obszar adresowy 26 we/wy 204, 206, 209, 213, 263, 265, 268, 271 OC1 17,65, 71, 102, 358 OCIE1A 51 OCR1A 70, 72, 102, 358 OCR1AH 39, 64, 70, 102. 358 OCR1AL 39, 64, 70, 103. 358 Odbiornik 88, 90. U0, 369 OE 117 Open drain 376, 393 OR flaga 25. 89, 92 OR 227 ORI 228 OSC_EXT 308 Oscylator 15, 36 OUT 38,229 Pamięć danych 11, 26. 27, 79, 114, 123, 299 Pamięć EEPROM 26, 79, 84, 114, 116, 123 Pamięć nieulotna 26, 123 Pamięć programu 11,21,26,28,114,116, 122, 189, 198 PINB 39,99, 101,325 P1ND 39, 106. 107, 325 Pobranie rozkazu 21,226 Pointer 21, 41, 136 PonyProg 301 POP 230 Port 17,99,229 szeregowy 363, 408 PORTB 39,99 PORTD 39. 106 Postinkremenlacja 27, 33 Power-down 16, 55, 57 Predekrementacja 28, 32, 322 Preskaler 59, 76, 276 Prędkość transmisji 39, 94, 95. 367, 408 Priorytet 23, 42, 48 Programator 300 Programowanie równolegle 116 szeregowe 123 Próbkowanie 56, 89, 325. 379 Przechwycenie 53, 66, 68 Przerwanie 42, 48. 50, 54, 58, 81, 91, 97, 293 Przestrzeli adresowa 21
Przetwornik 96, 295, 312 Pull-low 101, 109 Pull-up 17, 99, 101. !06, 108, 324 PUSH 232 Push-pulI 101, 109 PWM 52.64,71,357 PWM10 66,358 PWM U 66.358 Ramka 365 RCALL 234 RDY/BSY 117 Rdzeń 13.25 Rejestr danych 80, 89, 99 indeksowy 12, 20, 33 ogólnego przeznaczenia 24 sterujący 23, 61. 65 tymczasowy 71 Reset 18,43,44 RET 236 RETI 237 Rezonator 23, 36. 56, 94, 307, 320 RJMP 239 ROL 240 ROR 241 RS232 85,310,363,408 RTC 388 RTS 310 RXB8 93 RXC 90 RXCIE 92 RXEN 93 SBC 242 SBCI 243 SBI 244 SB1C 245 SBIS 246 SB IW 247 SBR 248 SBRC 249 SBRS 250 SCK 17, 102, 123, 315 SCL 389 SDA 389 SE 55 SEC 251 SEH 252 SEI 253 Sekwencja startu 390 Sekwencja stopu 390
SEN 254 SER 255 SES 256 SET 257 SEV 258 SEZ 259 SIGNAL 326 Slave 377,390 SLEEP 260 SM 55 SPI 16, 123, 315 SPIEN 115 SPL 39,41 SPM 261 SRAM 16, 23, 25, 27, 38, 57 SREG 39,40 ST 263 Start-up 115 STD 265, 268 Strob 81, 82 STS 271 SUB 272 SUBI 273 SWAP 274 Sygnał taktujący 23, 36, 61 wyzwalający 55, 66, 67 zegarowy 15, 17, 23, 60 Sygnatura 116 Symulacja 287, 297 Symulator 278, 295 Synchroniczny 15, 365 System przerwań 16,23,43,47,57,91 TO 60 Tl 68 TCCRO 61, 321 TCCR1A 65 TCCR1B 66 TCNTO 62 TCNT1 68 TCNT1H 68 TCNTIL 68 TEMP 69 TICIE1 51 TIFR 52 Time-out 44, 76, 81, 409 Timer/licznik 60, 62, 320 Timing 36 TIMSK 50 TOIE0 51
TOIE1 51 TOP 72, 360 TOV0 53 T0V1 52 Tryb adresowania 21, 34 odpytywania 126, 320 odwrócony 72 pracy 56, 64, 66, 285, 298, 358, 397 TST 275 TWl 388 TXB8 87 TXC 87,91 TXCIE 92 TXEN 93 UART 85, 363, 408 UBRR 94,95 UDR 86,90 UDRE 91 UDRIE 92 USB 408,410 USR 87,90 Visual Micro Lab 295 VMLAB 295 Watchdog 44, 57, 76, 276 WDE 77 WDPO 77 WDPI 77 WDP2 77 WDR 76,276 WDTCR 76 WDTOE 76 We/wy 99 Wektor przerwania 23, 42, 52, 76, 96 WR 117 Współczynnik wypełnienia 360 X 21,25 XA0 117 XA1 117 XTALI 23 XTAL2 23 Y 21,25 Z 21,25 Zerowanie 42, 45 Zestaw uruchomieniowy 304 ZL1AVR 304 ZL2PRG 315 Źródto prądowe 314 Żądanie obsługi 42, 48, 56