Katedra Metrologii i Optoelektroniki Wydział Elektroniki, Telekomunikacji i Informatyki Politechnika Gdańska LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY Ćwiczenie nr 3 Realizacja oprogramowania w asemblerze na mikrokontroler ATmega16 firmy Atmel Ćwiczenie nr 4 Wykorzystanie języka C do pisania programów na mikrokontroler ATmega16 firmy Atmel opracowane przez: dr inż. Zbigniew Czaja Gdańsk 2013
Ćwiczenie nr 3 Realizacja oprogramowania w asemblerze na mikrokontroler ATmega16 firmy Atmel I. Literatura (dokumentacja do ćwiczeń laboratoryjnych) [1] Atmel Corporation, "8-bit Microcontroller with 16K Bytes In-System Programmable Flash. ATmega16 ATmega16L", 2006, plik - Atmega16.pdf. [2] Atmel Corporation, "8-bit AVR Instruction Set", 2002, plik - AVR_Instruction_Set.pdf. [3] Czaja Z., Dudkiewicz P., "Stanowisko laboratoryjne dla mikrokontrolera Atmega16 firmy Atmel", 2013, plik - Zestaw_lab_Atmega16.pdf. Powyższa dokumentacja znajduje się w katalogu c:\labmik\doc II. Sprzęt i oprogramowanie 1. Zestaw laboratoryjny mikrokontrolera Atmega16. 2. Programator AVRISP mkii podłączony do portu USB komputera PC. 3. Zasilacz gniazdkowy stabilizowany 9V. 4. Kabel połączeniowy dla standardu interfejsu szeregowego RS232. 5. Oprogramowanie użytkowe na komputer PC: a) zintegrowane środowisko programistyczne IDE (AVR Studio 4.19 (c:\labmik\ AVRStudio\ AVRStudio4\AvrStudio.exe), b) program obsługi terminali szeregowych (terminal.exe (c:\labmik\terminal\ terminal.exe)), c) program Total Commander do zarządzania systemem plików. III. Zadania laboratoryjne 1. Przygotowanie stanowiska laboratoryjnego do pracy. a) sprawdzić czy zestaw laboratoryjny jest podłączony do zasilacza gniazdkowego 9V podłaczonego do listwy zasilającej. b) sprawdzić czy zestaw laboratoryjny jest podłączony przez programator STK500 do portu USB, a przez kabel RS232 do portu COM komputera PC, c) uruchomić komputer PC (praca pod Windows XP), d) uruchomić program do zarządzania systemem plików, np. Total Commander (ikona na pulpicie ), Totalcmd.lnk e) przejść do katalogu c:\labmik\ i usunąć podkatalog lab3 z całą jego zawartością (rys. 1) (kasowanie katalogu po zaznaczeniu katalogu lab3 nacisnąć klawisz Delete lub F8), 1
Rys. 1. Panel programu Total Commander z zaznaczonym katalogiem c:\labmik\lab3 f) rozpakować plik lab3.zip znajdujący się w katalogu C:\labmik\ (zawiera on podkatalog lab3 wraz z jego właściwą zawartością) (rozpakowywanie w obydwu panelach programu Total Commander musi być wyświetlany katalog c:\labmik. W lewym panelu wejść do pliku lab3.zip (zaznaczyć go i nacisnąć klawisz Enter lub dwa razy kliknąć na nim myszką), po czym zaznaczyć katalog lab3 i nacisnąć klawisz F5 (rys. 2). W prawym panelu pojawi się ten katalog już rozpakowany). Rys. 2. Panel programu Total Commander z otwartym plikiem lab3.zip 2. Zapoznanie się ze środowiskiem IDE dla mikrokontrolera Atmega16 kompilacja. a) Uruchomić program AvrStudio.exe. W tym celu najlepiej przejść do katalogu c:\labmik\lab3\ i dwukrotnie kliknąć na link AvrStudio.lnk. b) Pojawi się panel główny programu AVR Studio. Nacisnąć przycisk Create New Project. c) Pojawi się okienko Create new project (rys. 3). W polu Project type zaznaczyć Atmel AVR Assembler, w polu Location ma być C:\labmik\lab3, w pole Project Name wpisać przyk1 (zgodne z nazwą pliku przyk1.asm ). Po czym nacisnąć przycisk Next >>. 2
Rys. 3. Okienko powitalne z ustawieniami projektu d) Będąc w okienku Select debug platform and device (rys. 4), w polu Debug platform zaznaczyć AVR Simulator, a w polu Device ATmega16. Na zakończenie nacisnąć przycisk Finish. Rys. 4. Okienko Select debug platform and device e) Na ekranie pojawił się główny panel programu AVR Studio 4 (rys. 5). W lewym oknie Project pokazana jest struktura projektu, środkowe okno zawiera kod programu przyk1.asm, a w prawym oknie I/O view znajduje się lista urządzeń peryferyjnych ATmega16. 3
Rys. 5. Główny panel programu AVR Studio 4 f) Dokonać asemblacji (kompilacji) programu przyk1.asm. W tym celu należy wybrać z menu głównego polecenie Build > Build lub nacisnąć klawisz F7. g) Sprawdzić, czy w oknie Messages są komunikaty informujące o poprawnej kompilacji, przejrzeć zawartość katalogu C:\labmik\lab3 oraz przeanalizować nowopowstałe pliki (w dowolnym edytorze tekstowym, np. Notepad w tym celu w Total Commanderze zaznaczyć dany plik tekstowy, a następnie nacisnąć klawisz F4). 3. Zapoznanie się ze środowiskiem IDE dla mikrokontrolera Atmega16 symulacja. a) Uruchomić Debugger wykonując polecenie Debug > Start Debugging. Nasz program musi być wcześniej skompilowany, co już zrobiliśmy w poprzednim punkcie. b) W celu ustawienia oscylatora na 8 MHz wywołać polecenie Debug > AVR Simulator Options (Alt-O). W okienku Simulator Options (rys. 6) w polu Frequency wybrać 8.00 MHz po czym nacisnąć przycisk OK. 4
Rys. 6. Okienko Simulator Options c) Na potrzeby analizowanego programu wystarczy w prawym okienku I/O view otworzyć obiekty przez niego wykorzystywane, czyli PORTA i PORTC. Aby oglądać zawartości rejestrów roboczych można otworzyć okienko Register polecenie View > Register. Rys. 7. Panel AVR Studio 4 z aktualnie pracującym programem przyk1 w symulatorze programowym 5
d) W celu prześledzenia pracy programu przyk1.asm najlepiej wybrać pracę krokową, wywołując polecenie Debug > Step Into (klawisz F11). Jedno naciśnięcie klawisza F11 powoduje wykonanie jednej instrukcji asemblera oraz modyfikację stanów rejestrów i obiektów w okienku I/O view (jeżeli są problemy z widocznością okienka z kodem programu, to można użyć polecenia z menu Window, np. Window > Cascade). e) Przeanalizować całą pracę programu. Gdzie obserwuje się zmienną counter? Kiedy i jak zmienia się jej wartość? Przeanalizować inne polecenia menu Debug. f) Aby zakończyć symulację programową wywołuje się polecenie Debug > Stop Debugging (kombinacja klawiszy Ctrl+Alt+F5). 4. Programowanie mikrokontrolera Atmega16 w systemie docelowym. a) Zamknąć poprzedni projekt wywołując polecenie Project > Close Project. b) Następnie utworzyć nowy projekt wywołać polecenie Project > New Project. Nadać mu nazwę porty. Przy tworzeniu projektu postępować tak jak w poprzednim przykładzie (punkty od 2b) do 2e)). c) Dokonać asemblacji wybierając polecenie Build > Build (klawisz F7). d) Przeanalizować kod programu porty.asm. Zrozumieć zasadę działania programu. Wszystkie niezbędne informacje znajdują się w dokumentacji technicznej [1,2,3]. e) Prześledzić na symulatorze programowym pracę programu porty.asm. Należy wymuszać (zmieniać) stany na liniach portu C w rejestrze PINC (rys.8), najlepiej w chwili gdy wykonywany jest rozkaz nop w funkcji dip8. Co się dzieje wtedy ze zmienną tmp2 (rejestr R17)? Rys. 8. Panel AVR Studio 4 z aktualnie pracującym w symulatorze programem porty.asm 6
f) W celu zasymulowania przycisku INT0 umieszczonego na płytce laboratoryjnej [3], czyli w celu wywołania przerwania zewnętrznego INT0, ustawić na PIND bit 2 stan wysoki (rys. 9) klawisz nienaciśnięty, a następnie stan niski klawisz naciśniety (symulacja zbocza opadającego na tej linii). Należy pamiętać o wykonywaniu w między czasie polecenia Debug > Step Into (klawisz F11). Będąc w obsłudze przerwania, aby opóścić pętle pause, ponownie ustawić stan wysoki na PIND2 (co wynika z kodu programu). Obserwować co się dzieje w zmiennych tmp, tmp2 i tmp3. Rys. 9. Panel AVR Studio 4 z aktualnie pracującym w symulatorze programem porty.asm g) Po przeanalizowaniu pracy programu porty.asm zakończyć symulację programową wywołując polecenie Debug > Stop Debugging (kombinacja klawiszy Ctrl+Alt+F5). h) Sprawdzić, czy płytka laboratoryjna jest włączona (świeci się dioda LED 11) przełącznik SW1 w pozycji ON [3]. i) Przejść do programowania. W tym celu wywołać polecenie Tools > Program AVR >Connect. j) Pojawi się okienko Select AVR Programmer. W polu Platform wybrać AVRISP mkii, a w polu Port USB, następnie nacisnąć przycisk Connect. k) Na ekranie ukaże się okienko obsługi programatora AVRISP mkii (rys. 10). Wybrać zakładkę Program. W polu Device, tak jak na rys. 10, obie opcje muszą być zaznaczone. l) W polu Flash tego okna nacisnąć przycisk... i wybrać plik C:\labmik\lab3\porty.hex, a następnie nacisnąć przycisk Program. m) Po proprawnym zaprogramowaniu mikrokontrolera (w dolnym polu okienka powinny być takie same komunikaty jak na rys. 10) można zamknąć okienko. 7
n) Przeanalizować pracę programu porty.asm w systemie docelowym. Zmieniać ustawienia przełączników na DIP8, obserwować co się dzieje na diodach LED1-8, naciskać przycisk INT0 i przyglądać się jak pracuje wyświetlacz 7-mio segmentowy. Rys. 10. Okno obsługi programatora AVRISP mkii 5. Zapoznać się z obsługą w asemblerze przetwornika A/C i komparatora analogowego mikrokontrolera. a) w tym celu przeanalizować kod programu adc.asm, korzystać z dokumentacji [1,3]. Do czego służą potencjometry P1 i P2 oraz P4 w tym programie? b) dokonać jego kompilacji, ewentualnie symulacji programowej oraz zaprogramować mikrokontroler, c) przeanalizować pracę programu adc.asm w systemie docelowym (opis obsługi płytki laboratoryjnej pracującej zgodnie z programem adc.asm znajduje się w komentarzach do kodu tego programu). 6. Komunikacja zestawu laboratoryjnego z komputerem PC za pośrednictwem interfejsu szeregowego RS232. a) przeanalizować kod programu rs232.asm korzystając z dokumentacji [1,3] jak wysyła i odbiera się dane w programie rs232.asm? b) dokonać jego kompilacji, po czym zaprogramować mikrokontroler, 8
c) przeanalizować pracę programu rs232.asm w systemie docelowym (obsługa zestawu laboratoryjnego znajduje się w komentarzach do kodu tego programu). Na komputerze PC uruchomić program terminal.exe do komunikacji z urządzeniami dołączonymi do portów COM (c:\labmik\terminal\terminal.exe). W celu skonfigurowania terminala wywołać okienko Parametry transmisji przez Połączenie->Linia... Powinno być ustawione: Port Com1 lub Com2 (w zależności od stanowiska laboratoryjnego), Bitów na sekundę 9600, Bity danych 8, Parzystość Brak, Bity stopu 1, kontrola transmisji Brak (rys. 11). Rys. 11. Okno programu terminal.exe 7. Napisać kod źródłowy własnego programu pracującego zgodnie z zaleceniami prowadzącego laboratorium i uruchomić go (zadanie dodatkowe nieobowiązkowe przeznaczone dla studentów wykonujących laboratorium z Mikrosterowników i mikrosystemów rozproszonych). IV. Listingi programów 1. Program przyk1.asm ; ; Przyklad pierwszy - przeznaczony do nauki symulacji pracy ATmega16 ; w środowisku AVRStudio ; Laboratorium: Mikrokontrolery i mikrosystemy oraz ; Mikrosterowniki i mikrosystemy rozproszone ; ; Dokumentacja techniczna do ćwiczenia laboratoryjnego: ; ; [1] - Atmel Corporation, "8-bit Microcontroller with 16K Bytes In-System ; Programmable Flash. ATmega16 ATmega16L", 2006, plik - Atmega16.pdf. ; [2] - Atmel Corporation, "8-bit AVR Instruction Set", 2002, ; plik - AVR_Instruction_Set.pdf. ; [3] - Czaja Z., Dudkiewicz P., "Stanowisko laboratoryjne dla mikrokontrolera ; Atmega16 firmy Atmel", 2013, plik - Zestaw_lab_Atmega16.pdf.INCLUDE "m16def.inc".dseg.def tmp = r16 ; przypisanie nazw dla rejestrów.def tmp2 = r17.def counter = r18.cseg.org 0x00 ; początek segmentu programu ; wektor przerwania od resetu / początek programu 9
; procedura inicjalizacji po resecie i włączeniu zasilania Reset: ldi tmp, high(ramend) ; [1], s. 12 out SPH, tmp ldi tmp, low(ramend) out SPL, tmp ldi tmp,0b11111100 ; 1- wyjście, 0-wejście out DDRA,tmp ; kierunek pinów portu A, PORTA0 PORTA1 wejścia ldi tmp,0b00000100 out PORTA,tmp ldi tmp,0xff out DDRC,tmp ; inicjalizacja portu C, wyjściowy out PORTC,tmp ; ustawienie stanów wysokich na C ser counter ; wpisanie jedynek do licznika ; wygaszenie wyświetlacza 7 segmentowego ; (jedynkami) [3] out PORTC,counter ; wystawienie jedynek na port sbi PORTA,4 ; aktywacja wyjść zatrzasku U6 jako bufory cbi PORTA,4 ; zatrzaśnięcie stanu na wyjściu U6 ; *** Program główny (głowna pętla programu) *** Program: rcall Show ; wyświetlenie stanu licznika dec counter ; dekrementowanie licznika rjmp Program ; powrót do początku programu ; ********************************************************************************* ; funkcja wyświetlenie licznika na linijce diod led [3] Show: out PORTC,counter ; wystawienie stanu licznika na port sbi PORTA,3 ; aktywacja układu U5 (od linijki LED) cbi PORTA,3 ; zatrzaśnięcie stanu na wyjściu U5 ret.exit 2. Program porty.asm ; ; Przyklad drugi - obsługa portów równoległych ATmega16 ; Laboratorium: Mikrokontrolery i mikrosystemy ; oraz Mikrosterowniki i mikrosystemy rozproszone ; ; Dokumentacja techniczna do ćwiczenia laboratoryjnego: ; ; [1] - Atmel Corporation, "8-bit Microcontroller with 16K Bytes In-System ; Programmable Flash. ATmega16 ATmega16L", 2006, plik - Atmega16.pdf. ; [2] - Atmel Corporation, "8-bit AVR Instruction Set", ; 2002, plik - AVR_Instruction_Set.pdf. ; [3] - Czaja Z., Dudkiewicz P., "Stanowisko laboratoryjne dla mikrokontrolera ; Atmega16 firmy Atmel", 2013, plik - Zestaw_lab_Atmega16.pdf ; Uwaga: - zakomentowane linie z instrukcjami to dodatkowe przykłady prezentujące ; obsługę urządzeń peryferyjnych mikrokontrolera ; NIE NALEŻY ICH ODKOMENTOWYWAĆ.INCLUDE "m16def.inc" 10
.DSEG.DEF tmp = r16 ; przypisanie nazw dla rejestrów.def tmp2 = r17.def tmp3 = r18.cseg.org 0x00 jmp Reset.ORG 0x02 jmp ServiceINT0 ;.ORG 0x04 ;jmp ServiceINT1 ; początek segmentu kodu programu ; wektor przerwania od resetu ; wektor przerwania INT0 ; wektor przerwania INT1 ; procedura inicjalizacji po resecie i włączeniu zasilania Reset: ldi tmp, high(ramend) ; [1], s. 12 out SPH, tmp ldi tmp, low(ramend) out SPL, tmp ldi zh,high(znaki<<1) ; rejestr Z wskazuje na początek tablicy ZNAKI ldi zl,low(znaki<<1) ; ldi tmp,0b11111100 ; 1- wyjście, 0-wejście out DDRA,tmp ; kierunek pinów portu A, PORTA0 PORTA1 wejścia ldi tmp,0b00000100 out PORTA,tmp ser tmp out DDRC,tmp ; inicjalizacja portu C, wyjściowy out PORTC,tmp ; ustawienie stanów wysokich na C ; wygaszenie wyświetlacza 7 segmentowego ; (jedynkami) sbi PORTA,4 ; aktywacja wyjść zatrzasku U6 jako bufory cbi PORTA,4 ; zatrzaśnięcie stanu na wyjściu U6 clr tmp out DDRB,tmp ; inicjalizacja portu B jako wejściowy ldi tmp, 0x02 out DDRD,tmp ; inicjalizacja portu D jako wejściowy, TxD wyjscie ; [1], s. 68 ldi tmp, 0x0A ; przerwania INT0 i INT1 na zbocze opadajace out MCUCR, tmp ldi tmp, 0x40 ; odblokowanie INT0 out GICR, tmp ;ldi tmp, 0x?0 ; Jak jednocześnie odblokować INT0 i INT1? ;out GICR, tmp sei ; właczenie przerwań ; *** Program główny (głowna pętla programu) *** Program: rcall dip8 rcall led8 ; odczyt DIP-8 ; wyświetlenie danej na linijce 8 LED ;rcall serviceman ; sprawdzenie stanu przycisku MAN ;rcall serviceicp1 ; sprawdzenie stanu przycisku ICP1 rjmp Program ; powrót do początku programu 11
; ********************************************************************************* ; obsluga przerwania INT0 ServiceINT0: pause0: sbis PIND,2 ; sprawdzenie czy przycisk INT0 puszczony, czy jest ; na nim stan "Hi" rjmp pause0 ; jesli nie, to pauza inc tmp3 ; inkrementuj zawartość zmiennej tmp3 rcall wysw7 ; wyświetlenie danej tmp3 na wyswietlaczu ; 7-segmentowym reti ; obsluga przerwania INT1 ;ServiceINT1: ;pause1: ;sbis PIND,3 ; sprawdzenie czy przycisk INT1 puszczony, czy jest na nim stan "Hi" ;rjmp pause1 ; jesli nie, to pauza ;... ; miejsce na obsługę przerwania INT1 ;reti ; *** Blok funkcji *** ; funkcja odczyt ustawien DIP-8 dip8: cli ; zablokowanie przerwan clr tmp out DDRC,tmp ; inicjalizacja portu C jako wejściowy out PORTC,tmp ; bez pull-up cbi PORTA,2 ; aktywacja układu U4 (od DIP-8) [3] nop in tmp2, PINC ; odczyt DIP-8 sbi PORTA,2 ; dezaktywacja układu U4 ser tmp out DDRC,tmp ; ustawienie portu C na wyjściowy sei ; odblokowanie przerwan ret ; funkcja wyświetlenie licznika na linijce diod led led8: out PORTC,tmp2 ; wystawienie stanu DIP-8 na port C sbi PORTA,3 ; aktywacja układu U5 (od linijki LED) cbi PORTA,3 ; zatrzaśnięcie stanu na wyjściu U5 ret ; funkcja wyświetlenie liczbę naciśnięć przycisku INT0 wysw7: mov zl, tmp3 ; adresowanie pośrednie - dostęp do pamięci FLASH ; (dekodowanie znaku na wyśw. 7-segmentowy) andi zl,0x0f ; użycie maski 0x0F - zerowanie czterech ; najstarszych bitów lpm ; [2], s. 91 out PORTC,r0 ; wystawienie stanu DIP-8 na port C - zdekodowany ; wynik po wykonaniu instrukcji "lpm" znajduje się 12
; w rejestrze "r0" sbi PORTA,4 ; aktywacja układu U6 (od wysw. 7-seg.) cbi PORTA,4 ; zatrzaśnięcie stanu na wyjściu U6 ret ; funkcja obsluga przycisku MAN ; funkcja obsluga przycisku MAN ;serviceman: ;sbic PINB,0 ; sprawdzenie czy przycisk MAN naciśnięty "Lo" ;rjmp endman ; jesli nie, skok do endman ;pauseman: ;sbis PINB,0 ; sprawdzenie czy przycisk MAN puszczony "Hi" ;rjmp pauseman ; jesli nie, to pauza ;... ; miejsce na kod ;endman: ;ret ; funkcja obsluga przycisku ICP1 ;serviceicp1: ;sbic PIND,6 ; sprawdzenie czy przycisk MAN naciśnięty "Lo" ;rjmp pauseicp1 ; jesli nie, to skok do endicp1 ;pauseicp1: ;sbis PIND,6 ; sprawdzenie czy przycisk MAN puszczony "Hi" ;rjmp pauseicp1 ; jesli nie, to pauza ;... ; miejsce na kod ;endicp1: ;ret ; *** Tablica znaków *** ; tablica znaków umieszczona jest w pamięci programu FLASH począwszy ; od adresu 0x100 ; - dostęp: instrukcja lpm wykonująca operację: r0 <- FLASH(Z), ; gdzie 16-bitowy rejestr Z składa się z dwóch 8-bitowych rejestrów zh,zl.org 0x100 ZNAKI:.db 0x0C0,0x0F9,0x0A4,0x0B0,0x99,0x92,0x82,0x0F8,0x80,0x90,0x88,0x83,0x0C6,0x0A1,0x86, 0x8E ; Zawartość rejestru zl Kod 7-seg. Wyświetlany znak na wyświetlaczu 7-seg. ; ---------------------------------------------------------------------------- ; 0x00 0x0C0 0 ; 0x01 0x0F9 1 ; 0x02 0x0A4 2 ; 0x03 0x0B0 3 ; 0x04 0x099 4 ; 0x05 0x092 5 ; 0x06 0x082 6 ; 0x07 0x0F8 7 ; 0x08 0x080 8 ; 0x09 0x090 9 ; 0x0A 0x088 A ; 0x0B 0x083 b ; 0x0C 0x0C6 C ; 0x0D 0x0A1 d ; 0x0E 0x086 E ; 0x0F 0x08E F ; ----------------------------------------------------------------------------.EXIT 13
Ćwiczenie nr 4 Wykorzystanie języka C do pisania programów na mikrokontroler Atmega16 firmy Atmel I. Literatura (dokumentacja do ćwiczeń laboratoryjnych) [1] Atmel Corporation, "8-bit Microcontroller with 16K Bytes In-System Programmable Flash. ATmega16 ATmega16L", 2006, plik - Atmega16.pdf. [2] Generated by Doxygen 1.5.6, " avr-libc 1.6.7", 2010, plik - avr-libc-user-manual.pdf. [3] Czaja Z., Dudkiewicz P., "Stanowisko laboratoryjne dla mikrokontrolera Atmega16 firmy Atmel", 2013, plik - Zestaw_lab_Atmega16.pdf. Powyższa dokumentacja znajduje się w katalogu c:\labmik\doc II. Sprzęt i oprogramowanie 1. Zestaw laboratoryjny mikrokontrolera Atmega16. 2. Programator AVRISP mkii podłączony do portu USB komputera PC. 3. Zasilacz gniazdkowy stabilizowany 9V. 4. Kabel połączeniowy dla standardu interfejsu szeregowego RS232. 5. Oprogramowanie użytkowe na komputer PC: a) zintegrowane środowisko programistyczne IDE (AVR Studio 4.19 (c:\labmik\ AVRStudio\ AVRStudio4\AvrStudio.exe), b) program obsługi terminali szeregowych (terminal.exe (c:\labmik\terminal\ terminal.exe)), c) program Total Commander do zarządzania systemem plików, d) środowisko programistyczne WinAVR (c:\labmik\winavr\pn\pn.exe). III. Zadania laboratoryjne 1. Przygotowanie stanowiska laboratoryjnego do pracy. a) sprawdzić czy zestaw laboratoryjny jest podłączony do zasilacza gniazdkowego 9V podłaczonego do listwy zasilającej. b) sprawdzić czy zestaw laboratoryjny jest podłączony przez programator STK500 do portu USB, a przez kabel RS232 do portu COM komputera PC, c) uruchomić komputer PC (praca pod Windows XP), d) uruchomić program do zarządzania systemem plików, np. Total Commander (ikona na pulpicie ), Totalcmd.lnk 14
e) przejść do katalogu c:\labmik\ i usunąć podkatalog lab4 z całą jego zawartością (rys. 1) (kasowanie katalogu po zaznaczeniu katalogu lab4 nacisnąć klawisz Delete lub F8), Rys. 1. Panel programu Total Commander z zaznaczonym katalogiem c:\labmik\lab4 f) rozpakować plik lab4.zip znajdujący się w katalogu C:\labmik\ (zawiera on podkatalog lab4 wraz z jego właściwą zawartością) (rozpakowywanie w obydwu panelach programu Total Commander musi być wyświetlany katalog c:\labmik. W lewym panelu wejść do pliku lab4.zip (zaznaczyć go i nacisnąć klawisz Enter lub dwa razy kliknąć na nim myszką), po czym zaznaczyć katalog lab4 i nacisnąć klawisz F5 (rys. 2). W prawym panelu pojawi się ten katalog już rozpakowany). Rys. 2. Panel programu Total Commander z otwartym plikiem lab4.zip 2. Zapoznanie się ze środowiskiem WinAVR dla mikrokontrolera Atmega16 kompilacja. a) Przejść do katalogu C:\labmik\lab4\przyk1\. Przeanalizować plik makefile w dowolnym edytorze tekstowym, np. Notepad (w tym celu w Total Commanderze zaznaczyć ten plik tekstowy, a następnie nacisnąć klawisz F4). b) Uruchomić Programmer s Notepad 2 klikając na link c:\labmik\lab4\pn.lnk. 15
c) Otworzyć plik przykładu 1 przyk1. W tym celu wywołać polecenie File > Open... (Ctrl+O) i wybrać plik c:\labmik\lab4\przyk1\main.c. d) Przeanalizować kod programu. Opis składni, instrukcji i funkcji języja C znajduje się w dokumencie [2] avr-libc-user-manual.pdf. e) Dokonać kompilacji pliku main.c. W tym celu wykonać polecenie Tools > [WinAVR] Make All. Panel programu Programmer s Notepad 2 powinien wyglądać podobnie jak na rys. 3. f) Uwaga: polecenie Tools > [WinAVR] Make Clean usuwa pliki wynikowe kompilacji. Jest to przydatne, w przypadku ponownej kompilacji dokonanej po zmianach pliku źródłowego. Mamy wówczas gwarancję, że nasze poprawki znajdą się w pliku wynikowym. Zatem jak chcemy ponownie skompilować nasz plik to należy najpierw wywołać polecenie Tools > [WinAVR] Make Clean, a następnie polecenie [WinAVR] Make All. Rys. 3. Panel programu Programmer s Notepad 2 g) Przeanalizować wynik kompilacji. Sprawdzić zawartość katalogu C:\labmik\lab4\ przyk1\. Jakie powstały nowe pliki. Przeanalizować plik main.lss i main.lst zawierające zdekodowany na asembler kod programu main.c (w dowolnym edytorze tekstowym, np. Notepad w tym celu w Total Commanderze zaznaczyć dany plik 16
tekstowy, a następnie nacisnąć klawisz F4 lub w przeglądarce tekstowej Lister po naciśnięciu klawisza F3). 3. Symulacja pracy mikrokontrolera Atmega16 w środowisku AVR Studio 4. a) Dokonać kompilacji pliku c:\labmik\lab4\porty\main.c postępując zgodnie z punktami od 2. b) do 2. g). b) Uruchomić AVR Studio 4 klikając na link C:\labmik\lab4\AVRStudio.lnk. c) Otworzyć drugi przykład porty. W tym celu wywołać polecenie File > Open File (Ctrl-O) i wybrać C:\labmik\lab4\porty\main.hex. d) Pojawi się okienko Save AVR Studio Project File. Kliknąć na przycisk Zapisz. e) Następnie ukaże się okienko Select device and debug platform. W polu tekstowym Debug Platform zaznaczyć AVR Simulator, a w polu Device ATmega16, po czym nacisnąć przycisk Finish. Rys. 4. Okienko wyboru platformy symulacji i danego modelu mikrokontrolera f) Znajdujemy się już w trybie debagowania (pracy symulatora programowego). Na potrzeby analizy pracy programu wystarczy w prawym okienku I/O view otworzyć obiekty przez niego wykorzystywane: PORTA i PORTC, a w lewym okienku rozwinąć listę rejestrów roboczych (rys. 5). g) W celu prześledzenia pracy programu C:\labmik\lab4\porty\main.hex najlepiej wybrać pracę krokową, wywołując polecenie Debug > Step Into (klawisz F11). Jedno naciśnięcie klawisza F11 powoduje wykonanie jednej instrukcji asemblera oraz modyfikację stanów obiektów w okienku I/O view. Przeanalizować całą pracę programu. Na rys. 5 pokazano wygląd panelu programu AVR Studio 4 w trakcie symulacji programu C:\labmik\lab4\porty\main.hex. 17
Rys. 5. Panel programu AVR Studio 4 w trakcie symulacji programu przyk1 h) Aby zakończyć symulację wywołuje się polecenie Debug > Stop Debugging (kombinacja klawiszy Ctrl+Alt+F5). 4. Programowanie mikrokontrolera Atmega16 w systemie docelowym. a) W programie Programmer s Notepad 2 zamknąć okienka dotyczące przyk1. Następnie otworzyć przykład porty.w tym celu wywołać polecenie File > Open... (Ctrl+O) i wybrać plik C:\labmik\lab4\porty\main.c. b) Przeanalizować kod programu. Opis składni, instrukcji i funkcji języja C znajduje się w dokumencie [2]. c) Dokonać kompilacji pliku main.c. W tym celu wykonać polecenie Tools > [WinAVR] Make All. d) Przeanalizować wynik kompilacji. Sprawdzić zawartość katalogu C:\labmik\lab4\ porty\. Przeanalizować plik main.lss i main.lst zawierające zdekodowany na asembler kod programu main.c w dowolnym edytorze tekstowym (np. w Notepad w tym celu w Total Commanderze zaznaczyć dany plik tekstowy, a następnie nacisnąć klawisz F4 lub w przeglądarce tekstowej Lister po naciśnięciu klawisza F3). Porównać kod po deasemblacji pliku C:\labmik\lab4\porty\main.lss z plikiem C:\labmik\lab3\ porty.asm. Czym się różnią? e) Dokonać symulacji przykładu C:\labmik\lab4\porty\main.hex w AVR Studio 4. Postępować tak, jak w punktach od 3a) do 3f). 18
f) Po przeanalizowaniu pracy programu porty zakończyć symulację wywołując polecenie Debug > Stop Debugging (kombinacja klawiszy Ctrl+Alt+F5). g) Sprawdzić, czy płytka laboratoryjna jest włączona (świeci się dioda LED 11) przełącznik SW1 w pozycji ON [3]. h) Uwaga: Jeżeli chcemy zaprogramować mikrokontroler dopiero co po uruchomieniu programu AVR Studio 4, to najpierw musimy utworzyć projekt według punktów 3b) c) d), a następnie zakończyć symulację punkt 3g). Jest to konieczne, ponieważ oprogramowanie musi wiedzieć jaki wybraliśmy mikrokontroler. W naszym przypadku wybieramy ATmega16 (rys. 4). i) Przejść do programowania. W tym celu wywołać polecenie Tools > Program AVR >Connect. j) Pojawi się okienko Select AVR Programmer. W polu Platform wybrać AVRISP mkii, a w polu Port USB, następnie nacisnąć przycisk Connect. k) Na ekranie ukaże się okienko obsługi programatora AVRISP mkii (rys. 6). Wybrać zakładkę Program. W polu Device, tak jak na rys. 6, obie opcje muszą być zaznaczone. l) W polu Flash tego okna nacisnąć przycisk... i wybrać plik C:\labmik\lab4\porty\ main.hex, a następnie nacisnąć przycisk Program. m) Po proprawnym zaprogramowaniu mikrokontrolera można zamknąć okienko (w dolnym polu okienka powinny być takie same komunikaty jak na rys. 6). n) Przeanalizować pracę programu C:\labmik\lab4\porty\main.c w systemie docelowym. Zwrócić uwagę na: przełączniki DIP8, diody LED1-8, przycisk INT0 i wyświetlacz 7-mio segmentowy. Rys. 6. Okno obsługi programatora AVRISP mkii 19
5. Zapoznać się z obsługą w języku C przetwornika A/C i komparatora analogowego mikrokontrolera. a) w tym celu przeanalizować kod programu C:\labmik\lab4\adc\main.c, korzystać z dokumentacji [1-3]. Do czego służą potencjometry P1 i P2 oraz P4 w tym programie? b) dokonać jego kompilacji oraz zaprogramować mikrokontroler, c) przeanalizować pracę programu w systemie docelowym (opis obsługi płytki laboratoryjnej pracującej zgodnie z tym programem znajduje się w komentarzach kodu programu). 6 Komunikacja zestawu laboratoryjnego z komputerem PC za pośrednictwem interfejsu szeregowego RS232. a) przeanalizować kod programu C:\labmik\lab4\rs232\main.c korzystając z dokumentacji [1-3] jak wysyła i odbiera się dane w programie? Czy są jakieś różnice w obsłudze interfejsu względem programu rs232.asm z ćwiczenia nr 3? b) dokonać jego kompilacji, po czym zaprogramować mikrokontroler, c) przeanalizować pracę programu C:\labmik\lab4\rs232\main.c w systemie docelowym (obsługa zestawu laboratoryjnego znajduje się w komentarzach do kodu tego programu). Na komputerze PC uruchomić program terminal.exe do komunikacji z urządzeniami dołączonymi do portów COM (c:\labmik\terminal\terminal.exe). W celu skonfigurowania terminala wywołać okienko Parametry transmisji przez Połączenie->Linia... Powinno być ustawione: Port Com1 lub Com2 (w zależności od stanowiska laboratoryjnego), Bitów na sekundę 9600, Bity danych 8, Parzystość Brak, Bity stopu 1, kontrola transmisji Brak (rys. 7). Rys. 7. Okno programu terminal.exe 7 Program demonstracyjny dla zestawu laboratoryjnego ATmega16. a) przeanalizować kod programu C:\labmik\lab4\demo\main.c korzystając z dokumentacji [1-3]. Co będzie realizował ten program? b) dokonać jego kompilacji, po czym zaprogramować mikrokontroler, c) przeanalizować pracę tego programu w systemie docelowym. 8 Napisać kod źródłowy własnego programu pracującego zgodnie z zaleceniami prowadzącego laboratorium i uruchomić go (zadanie dodatkowe nieobowiązkowe przeznaczone dla studentów wykonujących laboratorium z Mikrosterowników i mikrosystemów rozproszonych). 20
IV. Listingi programów 1. Program przyk1.c /* Przyklad pierwszy - przeznaczony do nauki symulacji pracy ATmega16 w środowisku AVRStudio */ /* Laboratorium: Mikrokontrolery i mikrosystemy oraz Mikrosterowniki i mikrosystemy rozproszone */ /* Dokumentacja techniczna do ćwiczenia laboratoryjnego: [1] - Atmel Corporation, "8-bit Microcontroller with 16K Bytes In-System Programmable Flash. ATmega16 ATmega16L", 2006, plik - Atmega16.pdf. [2] - Generated by Doxygen 1.5.6, " avr-libc 1.6.7", 2010, plik - avr-libc-user-manual.pdf. [3] - Czaja Z., Dudkiewicz P., "Stanowisko laboratoryjne dla mikrokontrolera Atmega16 firmy Atmel", 2013, plik - Zestaw_lab_Atmega16.pdf Definicje niestandardowych funkcji sbi() i cbi() w pliku sfr_defs.h #define sbi(sfr, bit) (_SFR_BYTE(sfr) = _BV(bit) ) #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit) ) */ #include <avr/io.h> void avr_init(void); unsigned char licznik; // prototyp funkcji // deklaracja zmiennej globalnej int main(void) // procedura inicjalizacji po resecie i włączeniu zasilania avr_init(); // *** Program główny (głowna pętla programu) *** while(1) PORTC = licznik; // wystawienie stanu licznika sbi (PORTA,3); // aktywacja wyjść zatrzasku U5 cbi (PORTA,3); // zatrzaśnięcie wyjść układu U5 licznik--; // zmniejszenie licznika o 1 // ********************************************* return(0); /* *********** Blok funkcji *********** */ void avr_init(void) /* inicjalizacja układu */ DDRA = 0b11111100; // kierunek I/O, 0-wejście 1-wyjście PORTA = 0b00000100; // ustawienie stanu wysokiego na PA2 DDRC = 0xFF; PORTC = licznik; // stan wysoki na porcie C w celu wygaszenia // diod /* wygaszenie diod przy resecie */ licznik = 0xFF; sbi (PORTA,4); cbi (PORTA,4); return; // inicjalizacja licznika // aktywacja wyjść zatrzasku U6 // zatrzaśnięcie wyjść układu U6 21
2. Program porty.c /* Przyklad drugi - sterowanie portami ATmega16 */ /* Laboratorium: Mikrokontrolery i mikrosystemy oraz Mikrosterowniki i mikrosystemy rozproszone */ /* Dokumentacja techniczna do ćwiczenia laboratoryjnego: [1] - Atmel Corporation, "8-bit Microcontroller with 16K Bytes In-System Programmable Flash. ATmega16 ATmega16L", 2006, plik - Atmega16.pdf. [2] - Generated by Doxygen 1.5.6, " avr-libc 1.6.7", 2010, plik - avr-libc-user-manual.pdf. [3] - Czaja Z., Dudkiewicz P., "Stanowisko laboratoryjne dla mikrokontrolera Atmega16 firmy Atmel", 2013, plik - Zestaw_lab_Atmega16.pdf Definicje niestandardowych funkcji sbi() i cbi() w pliku sfr_defs.h #define sbi(sfr, bit) (_SFR_BYTE(sfr) = _BV(bit) ) #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit) ) Uwaga: - zakomentowane linie z instrukcjami to dodatkowe przykłady prezentujące obsługę urządzeń peryferyjnych mikrokontrolera NIE NALEŻY ICH ODKOMENTOWYWAĆ */ #include <avr/io.h> #include <avr/signal.h> #include <avr/interrupt.h> typedef unsigned char uint8_t; // definicja bajta uint8_t dana,counter,wynik; /* *** Tablica znaków dla wyswietlacza 7-segmentowego *** */ const uint8_t buf[16]=0x0c0,0x0f9,0x0a4,0x0b0,0x99,0x92,0x82,0x0f8,0x80,0x90,0x88,0x83,0x0c6,0x0 A1,0x86,0x8E; /* prototypy funkcji */ void avr_init(void); void SetLedBar(uint8_t); void Set7Segm(uint8_t); uint8_t ReadDip(void); //void serviceman(void); //void serviceicp1(void); /* *** deklaracje i obsługi przerwań *** */ SIGNAL (SIG_INTERRUPT0) /* obsługa przerwania zewnętrznego INT0 */ counter++; counter &= 0x0F; loop_until_bit_is_set(pind,2); wynik = buf[counter]; Set7Segm(wynik); // czekaj na puszczenie klawisza INT0 // konwersja na kod wys. 7-seg. // wyswietl dana na wysw. 7-seg. /* SIGNAL (SIG_INTERRUPT1) // obsługa przerwania zewnętrznego INT1 loop_until_bit_is_set(pind,3); */ // czekaj na puszczenie klawisza INT1 //...; // kod obsługi przerwania 22
/* *** program glowny *** */ int main(void) // procedura inicjalizacji po resecie i włączeniu zasilania avr_init(); // *** Program główny (głowna pętla programu) *** while(1) dana = ReadDip(); SetLedBar(dana); //serviceman(); //serviceicp1(); // odczyt przelacznikow DIP8 // wyswietlenie stanu DIP8 na linijce LED // sprawdzenie stanu przycisku MAN // sprawdzenie stanu przycisku ICP1 // ********************************************* return(0); /* *********** Blok funkcji *********** */ void avr_init(void) /* inicjalizacja układu */ DDRA = 0b11111100; // kierunek I/O, 0-wejście 1-wyjście PORTA = 0b00000100; // ustawienie stanu wysokiego na PA2 DDRC = 0xFF; DDRB = 0x00; DDRD = 0x02; // TxD wyjscie /* wygaszenie diod przy resecie */ PORTC = 0xFF; sbi (PORTA,4); cbi (PORTA,4); // stan wysoki na C w celu wygaszenia diod // aktywacja wyjść zatrzasku U6 // zatrzaśnięcie wyjść układu U6 MCUCR = 0x0A; // przerwanie na zbocze opadajace GICR = 0x40; // odblokowanie INT0 //GICR = 0xC0; // odblokowanie INT0 i INT1 sei(); // globalne odblokowanie przerwań return; void SetLedBar(uint8_t bajt) /* wysterowanie linijki diod led */ PORTC = bajt; sbi (PORTA,3); cbi (PORTA,3); return; // wystawienie zmiennej na port // zatrzaśnięcie wyjścia układu U5 void Set7Segm(uint8_t bajt) /* wysterowanie wyświetlacza 7 segmentowego */ PORTC = bajt; sbi (PORTA,4); cbi (PORTA,4); // zatrzaśnięcie wyjścia układu U6 return; 23
uint8_t ReadDip(void) /* funkcja odczytuje stan przełaczników DIP8 */ uint8_t bajt; cli(); // blokada przerwan DDRC = 0x00; // kierunek IO: wejscia cbi (PORTA,2); // uaktywnienie bufora U4 (od DIP8) bajt = PINC; // próbny odczyt (w celu 1 cyklu opoznienia) bajt = PINC; // odczyt z pinów stanu przełączników sbi (PORTA,2); // wylaczenie ukladu U4 (od DIP8) DDRC = 0xFF; // kierunek IO: wyjscia sei(); // globalne odblokowanie przerwań return bajt; /* void serviceman(void) // odczyt stanu klawisza MAN if bit_is_clear(pinb,0) // testowanie klawisza MAN - gdy naciśnięty // to jest stan niski loop_until_bit_is_set(pinb,0); // oczekiwanie na puszczenie klawisza MAN //...; // kod funkcji return; void serviceicp1(void) // odczyt stanu klawisza ICP1 */ if bit_is_clear(pind,6) // testowanie klawisza ICP1 - gdy naciśnięty // to jest stan niski loop_until_bit_is_set(pind,6); // oczekiwanie na puszczenie klawisza ICP1 //...; // kod funkcji return; 24