LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY 5 - …zbczaja/pdf/lab_atxmega32a4.pdf · LABORATORIUM...

30
Katedra Metrologii i Optoelektroniki Wydzial Elektroniki, Telekomunikacji i Informatyki Politechnika Gdańska LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY Ćwiczenie nr 5 Tworzenie programów w asemblerze na mikrokontroler ATXmega32A4 firmy Atmel Ćwiczenie nr 6 Pisanie oprogramowania z wykorzystaniem języka C na mikrokontroler ATXmega32A4 firmy Atmel opracowane przez: dr hab. inż. Zbigniew Czaja Gdańsk 2015

Transcript of LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY 5 - …zbczaja/pdf/lab_atxmega32a4.pdf · LABORATORIUM...

Page 1: LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY 5 - …zbczaja/pdf/lab_atxmega32a4.pdf · LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY Ćwiczenie nr 5 Tworzenie programów w asemblerze

Katedra Metrologii i Optoelektroniki

Wydział Elektroniki, Telekomunikacji i Informatyki

Politechnika Gdańska

LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY

Ćwiczenie nr 5

Tworzenie programów w asemblerze na mikrokontroler ATXmega32A4 firmy Atmel

Ćwiczenie nr 6

Pisanie oprogramowania z wykorzystaniem języka C na mikrokontroler ATXmega32A4 firmy Atmel

opracowane przez: dr hab. inż. Zbigniew Czaja

Gdańsk 2015

Page 2: LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY 5 - …zbczaja/pdf/lab_atxmega32a4.pdf · LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY Ćwiczenie nr 5 Tworzenie programów w asemblerze

1

Ćwiczenie nr 5

Tworzenie programów w asemblerze na mikrokontroler ATXmega32A4 firmy Atmel

I. Literatura (dokumentacja do ćwiczeń laboratoryjnych)

[1] Atmel Corporation, "8-bit XMEGA A Microcontroller, XMEGA A MANUAL ", 2012, plik - xmega32a_manual.pdf.

[2] Atmel Corporation, "8/16-bit XMEGA A4 Microcontroller, ATxmega128A4 ATxmega64A4 ATxmega32A4 ATxmega16A4", 2012, plik - xmega32a4.pdf.

[3] Atmel Corporation, "8-bit AVR Instruction Set", 2010, plik - AVR_Instruction_Set.pdf.

[4] Czaja Z., Burek K., "Stanowisko laboratoryjne dla mikrokontrolera ATXmega32A4 firmy Atmel", 2013, plik – atxmega32a4_pl.pdf.

Powyższa dokumentacja znajduje się w katalogu c:\labmik\doc

II. Sprzęt i oprogramowanie

1. Zestaw laboratoryjny mikrokontrolera ATxmega32A4.

2. Programator Programator AVRISP mkII z interfejsem PDI podłączony do portu USB komputera PC.

3. Zasilacz gniazdkowy stabilizowany 9V.

4. Kabel połączeniowy dla standardu interfejsu szeregowego USB.

5. Oprogramowanie użytkowe na komputer PC:

a) zintegrowane środowisko programistyczne IDE (Atmel Studio 6 (c:\labmik\Atmel Studio 6\ atmelstudio.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 AVRISP mkII do jednego portu USB, a przez kabel USB do drugiego portu USB 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

Page 3: LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY 5 - …zbczaja/pdf/lab_atxmega32a4.pdf · LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY Ćwiczenie nr 5 Tworzenie programów w asemblerze

2

e) przejść do katalogu c:\labmik\ i usunąć podkatalog lab5 z całą jego zawartością (rys. 1) (kasowanie katalogu – po zaznaczeniu katalogu lab5 nacisnąć klawisz Delete lub F8),

Rys. 1. Panel programu Total Commander z zaznaczonym katalogiem c:\labmik\lab5

f) rozpakować plik lab5.zip znajdujący się w katalogu C:\labmik\ (zawiera on podkatalog lab5 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 lab5.zip (zaznaczyć go i nacisnąć klawisz Enter lub dwa razy kliknąć na nim myszką), po czym zaznaczyć katalog lab5 i nacisnąć klawisz F5 (rys. 2). W prawym panelu pojawi się ten katalog już rozpakowany).

Rys. 2. Panel programu Total Commander z otwartym plikiem lab5.zip

2. Zapoznanie się ze środowiskiem IDE dla mikrokontrolera ATxmega32A4– kompilacja.

a) Uruchomić program atmelstudio.exe. W tym celu najlepiej przejść do katalogu c:\labmik\lab5\ i dwukrotnie kliknąć na link AtmelStudio.lnk .

b) Pojawi się panel główny programu Atmel Studio. Będąc w zakładce „Start Page” kliknąć na ikonę New Project ... .

Page 4: LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY 5 - …zbczaja/pdf/lab_atxmega32a4.pdf · LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY Ćwiczenie nr 5 Tworzenie programów w asemblerze

3

c) Pojawi się okienko „New Project” (rys. 3). Wybrać Assembler. Pola „Name”, „Location”, „Solution” i „Solution name” powinny być uzupełnione tak, jak pokazano na rys. 3. Po czym nacisnąć przycisk OK .

Rys. 3. Okienko z ustawieniami projektu

d) Pojawi się kolejne okienko „Device Selection” (rys. 4). W polu „Device family” ma być wybrane AVR XMEGA, 8-bit , a na liście zaznaczony mikrokontroler ATxmega32A4. Na zakończenie nacisnąć przycisk OK .

Rys. 4. Okienko „Device Selection”

Page 5: LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY 5 - …zbczaja/pdf/lab_atxmega32a4.pdf · LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY Ćwiczenie nr 5 Tworzenie programów w asemblerze

4

e) Na ekranie pojawił się panel programu Atmel Studio 6 z oknem „przyk1.asm” zawierajacym uniwersalny szablon dla programów pisanych w asemblerze.

f) Teraz należy przekopiować zawartość pliku przyk1_tmp.asm do tego okna. W tym celu otworzyć w dowolnym edytorze tekstowym plik przyk1_tmp.asm, (np. będąc w Total Commander zaznaczyć ten plik i nacisnąć klawisz F4). Jak jesteśmy w edytorze tekstowym z otwartym plikiem przyk1_tmp.asm, aby zaznaczyć cały tekst naciskamy klawisze Ctrl-A , aby zachować go w schowku Windows naciskamy klawisze Ctrl-C . Zamykamy edytor tekstowy i przechodzimy do Atmel Studio do okna „przyk1.asm”. Zaznaczamy cały tekst i naciskamy klawisze Ctrl-V . Zapisujemy tak utworzony plik przyk1.asm, naciskajac klawisze Ctrl-S .

Rys. 5. Główny panel programu Atmel Studio 6

g) Dokonać asemblacji (kompilacji) programu przyk1.asm. W tym celu należy wybrać z menu głównego polecenie Build > Build Solution lub nacisnąć klawisz F7.

h) Sprawdzić, czy w oknie „Output” są komunikaty informujące o poprawnej kompilacji. Panel programu Atmel Studio powinien wyglądać podobnie jak na rys. 5.

i) W okienku „Solution Explorer” (prawe okienko pokazane na rys. 5) otworzyć katalog Output Files, zaznaczyć plik przyk1.lss i go otworzyć – np. poprzez dwukrotne kliknięcie lewym klawiszem myszy na tym pliku. Przeanalizować ten plik – uwaga: wyniki asemblacji znajdują się pod koniec tego pliku. Po przeanalizowaniu pliku zamknąć okienko z jego zawartością.

Page 6: LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY 5 - …zbczaja/pdf/lab_atxmega32a4.pdf · LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY Ćwiczenie nr 5 Tworzenie programów w asemblerze

5

3. Zapoznanie się ze środowiskiem IDE dla mikrokontrolera ATxmega32A4 – symulacja.

a) Nasz program musi być wcześniej skompilowany, co już zrobiliśmy w poprzednim punkcie. Aby uruchomić symulację wybrać Project > przyk1 Properties.

b) W oknie „przyk1” w zakładce „Tool” w polu „Select debugger/programmer” wybrać Simulator. Zapisać ustawienia – nacisnąś klawisze Ctrl-S , po czym zamknąć okienko „przyk1”.

c) Przejrzeć listę poleceń menu Debug. W celu prześledzenia pracy programu przyk1.asm najlepiej wybrać pracę krokową, wywołując polecenie Debug > StepInto (klawisz F11). Jedno naciśnięcie klawisza F11 powoduje wykonanie jednej instrukcji asemblera oraz modyfikację stanów rejestrów i ich bitów w okienku „IO View”

d) Po pierwszym naciśnięciu klawisza F11 powinny pojawić się okienka „IO View” i „Memory”. W okienku „IO View” wybrać np. Port Configuration (PORTA) , a w dolnym okienku przejść na „Registers”, tak jak pokazano na rys. 6.

Rys. 6. Główny panel programu Atmel Studio 6 z uruchomionym symulatorem

e) Przeanalizować całą pracę programu: naciskająć klawisz F11 (praca krokowa programu przyk1.asm) obserwować co się dzieje na potrach PORTA i PORTC oraz ze zmiennymi counter, tmp i tmp2 (jakie przypisano im rejestry?).

f) Aby zakończyć symulację programową należy wywołać polecenie Debug > Stop Debugging.

Page 7: LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY 5 - …zbczaja/pdf/lab_atxmega32a4.pdf · LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY Ćwiczenie nr 5 Tworzenie programów w asemblerze

6

4. Programowanie mikrokontrolera ATxmega32A4w systemie docelowym.

a) Zamknąć poprzedni projekt „przyk1” wywołując polecenie File > Close Solution.

b) Następnie utworzyć nowy projekt – wywołać polecenie File > New > Project... . Nadać mu nazwę porty . Przy tworzeniu projektu postępować tak jak w poprzednim przykładzie (punkty od 2c) do 2f)). Przy czym w tym przypadku przekopiować zawartość pliku porty_tmp.asm do okna z plikiem porty.asm.

c) Dokonać asemblacji wybierając polecenie Build > Build Solution (klawisz F7).

d) Przeanalizować kod programu porty.asm oraz zawartość pliku porty.lss. Zrozumieć zasadę działania programu. Wszystkie niezbędne informacje znajdują się w dokumentacji technicznej [1-4].

e) Uruchomić symulator tak jak przedstawiono w punkcie 3b). Prześledzić na symulatorze programowym pracę programu porty.asm. Pętla Wait_for_E0 trwa ponad 2000 cykli, a dokładnie ile? Ile cylki potrzeba na wykonanie pętli Program? – aby się tego dowiedzieć wybrać okienko „Processor”.

Rys. 7. Okienko „IO View” skonfigurowane do generacji przewań zewnętrznych na PORTD

f) W celu zasymulowania przycisku SW0 umieszczonego na płytce laboratoryjnej [4], czyli w celu wywołania przerwania zewnętrznego INT0, skonfigurować okienko „IO View” tak jak pokazano na rys. 7 – wybrać w górnej części okienka Port Configuration (PORTD), a w dolnej zaznaczyć rejestr IN . Następnie ustawić stan

Page 8: LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY 5 - …zbczaja/pdf/lab_atxmega32a4.pdf · LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY Ćwiczenie nr 5 Tworzenie programów w asemblerze

7

wysoki na pozycji bit 0 rejestru IN (rys. 7). Należy pamiętać o wykonywaniu w między czasie polecenia Debug > StepInto (klawisz F11). Dopiero będąc już w obsłudze przerwania ServiceINT0 wyzerować ten bit. Obserwować co się dzieje ze zmienną tmp3 i na PORTC_OUT.

g) Podobnie wywołać przerwanie od INT1 (pozycja bit 1 w rejestrze IN ).

h) Dla zainteresowanych: można generować pobudzenia na liniach portów mikrokontolera za pomocą poleceń zapisanych w plikach *.stim – korzystajac z polecenia Debug > Execute Stimulifile – opisane zostało to w pomocy programu Atmel Studio (polecenie Help > View Help).

i) Po przeanalizowaniu pracy programu porty.asm zakończyć symulację programową wywołując polecenie Debug > Stop Debugging.

j) Sprawdzić, czy płytka laboratoryjna jest włączona (świecą się diody LED 9 i LED 10) – przełącznik POWER SWITCH w pozycji ON [4].

k) Przejść do programowania. W tym celu wybrać programator korzystajac z polecenia Tools > Device Programming.

l) Pojawi się okienko „Device Programming”. W polu „Tool” wybrać AVRISP mkII , w polu „Device” ma być ATxmega32A4, a w polu „Interface” PDI. Następnie nacisnąć przycisk Apply .

m) Aby poznać parametry pracy mikrokontrolera wybrać zakładkę „Device information” i nacisnąć przycisk Read. Powinien pojawić się komunikat podobny jak na rys. 8.

Rys. 8. Okno obsługi programatora AVRISP mkII – zakładka „Device information”

n) W celu zaprogramowania mikrokontrolera wybrać zakładkę „Memories”. W polu „Flash (32 KB+4 KB BOOT)”, tak jak na rys. 9, powinien być wybrany plik C:\labmik\lab5\porty\ porty\Debug\porty.hex . Nacisnąć przycisk Program.

o) Po proprawnym zaprogramowaniu mikrokontrolera, w dolnym polu okienka „Device Programming” powinny być takie same komunikaty jak na rys. 9. Można wtedy zamknąć to okienko.

Page 9: LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY 5 - …zbczaja/pdf/lab_atxmega32a4.pdf · LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY Ćwiczenie nr 5 Tworzenie programów w asemblerze

8

Rys. 9. Okno obsługi programatora AVRISP mkII – zakładka „Memories”

p) Przeanalizować pracę programu porty.asm w systemie docelowym. Zmieniać ustawienia przełączników na DIP SWITCH, obserwować co się dzieje na diodach LED0 – 7, naciskać przyciski SW0 do SW3 i przyglądać się jak pracuje wyświetlacz 7-mio segmentowy.

5. Zapoznać się z obsługą w asemblerze przetwornika A/C mikrokontrolera.

a) w tym celu przeanalizować kod programu adc.asm, korzystać z dokumentacji [1,4]. Do czego służą potencjometry POT1 i POT2 w tym programie? Na czym wyświetlany jest wynik zmierzonego napięcia na wyjściu POT1, a na czym napięcie wyjściowe na POT2?

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 za pośrednictwem interfejsu USB obsługiwanego

przez moduł MMusb232 z komputerem PC za pomocą interfejsu UART mikrokontrolera.

a) przeanalizować kod programu rs232.asm korzystając z dokumentacji [1,4] – jak wysyła i odbiera się dane w programie rs232.asm? Co jest wyświetlane na diodach LED, a co na wyświetlaczu 7-mio segmentowym?

b) dokonać jego kompilacji, po czym zaprogramować mikrokontroler,

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

Page 10: LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY 5 - …zbczaja/pdf/lab_atxmega32a4.pdf · LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY Ćwiczenie nr 5 Tworzenie programów w asemblerze

9

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 Com2 do Com8 (w zależności od stanowiska laboratoryjnego), Bitów na sekundę 9600, Bity danych 8, Parzystość Brak , Bity stopu 1, kontrola transmisji Brak (rys. 10).

Rys. 10. 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).

Page 11: LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY 5 - …zbczaja/pdf/lab_atxmega32a4.pdf · LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY Ćwiczenie nr 5 Tworzenie programów w asemblerze

10

IV. Listingi programów 1. Program przyk1.asm ; Przyklad pierwszy - przeznaczony do nauki symulac ji pracy ATxmega32a4 ; w środowisku Atmel Studio 6 ; Laboratorium: Mikrokontrolery i mikrosystemy oraz Mikrosterowniki i mikrosystemy ; rozproszone ; ; Dokumentacja techniczna do ćwiczenia laboratoryjnego: ; [1] Atmel Corporation, "8-bit XMEGA A Microcontro ller, XMEGA A MANUAL ", 2012, ; plik - xmega32a_manual.pdf. ; [2] Atmel Corporation, "8/16-bit XMEGA A4 Microco ntroller, ATxmega128A4 ; ATxmega64A4 ATxmega32A4 ATxmega16A4", 2012, p lik - xmega32a4.pdf. ; [3] Atmel Corporation, "8-bit AVR Instruction Set ", 2010, ; plik - AVR_Instruction_Set.pdf. ; [4] Czaja Z., Burek K., "Stanowisko laboratoryjne dla mikrokontrolera ATXmega32A4 ; firmy Atmel", 2013, plik - atxmega32a4_pl.pdf . .DSEG .DEF tmp = r16 ; przypisanie nazw dla rejestrów .DEF tmp2 = r17 .DEF counter = r18 .CSEG ; pocz ątek segmentu programu .ORG 0x00 ; wektor przerwania od resetu / pocz ątek programu ; procedura inicjalizacji po resecie i wł ączeniu zasilania Reset: ldi tmp,0xFF sts PORTC_DIR,tmp ; port C - wyj ściowy ldi tmp,0xF2 sts PORTA_DIR,tmp ; linie PA7-PA4, PA1 wyj ściami, PA3,PA2 i PA0 ; wej ściami (analogowymi) ldi tmp,0x00 sts PORTD_DIR,tmp ; port D - wej ściowy ldi tmp,0x08 sts PORTE_DIR,tmp ; linia PE3 (TxD) wyj ściem, pozostałe linie wej. ldi tmp2,0x40 ; sterowanie lini ą PA6 ;ldi r26,low(PORTA_OUTSET) ; wprowadzenie adresu PORTA_OUTSET do rejestru X ;ldi r27,high(PORTA_OUTSET) ; *** 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: sts PORTC_OUT,counter ; wystawienie stanu licznika na port C sts PORTA_OUTSET,tmp2 ; aktywacja układu IC3 (od l inijki LED) sts PORTA_OUTCLR,tmp2 ; zatrza śni ęcie stanu na wyj ściu IC3

;st X+,tmp2 ; kod realizuje powy ższ ą procedur ę, tylko szybciej ;st X,tmp2 ;dec r26

ret .EXIT

Page 12: LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY 5 - …zbczaja/pdf/lab_atxmega32a4.pdf · LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY Ćwiczenie nr 5 Tworzenie programów w asemblerze

11

2. Program porty.asm ; Przyklad drugi - porty.asm - obsługa portów mikro kontrolera ATxmega32a4 ; w środowisku Atmel Studio 6 ; Laboratorium: Mikrokontrolery i mikrosystemy oraz Mikrosterowniki i mikrosystemy ; rozproszone ; ; Dokumentacja techniczna do ćwiczenia laboratoryjnego: ; [1] Atmel Corporation, "8-bit XMEGA A Microcontro ller, XMEGA A MANUAL ", 2012, ; plik - xmega32a_manual.pdf. ; [2] Atmel Corporation, "8/16-bit XMEGA A4 Microco ntroller, ATxmega128A4 ; ATxmega64A4 ATxmega32A4 ATxmega16A4", 2012, p lik - xmega32a4.pdf. ; [3] Atmel Corporation, "8-bit AVR Instruction Set ", 2010, ; plik - AVR_Instruction_Set.pdf. ; [4] Czaja Z., Burek K., "Stanowisko laboratoryjne dla mikrokontrolera ATXmega32A4 ; firmy Atmel", 2013, plik - atxmega32a4_pl.pdf . .DSEG .DEF tmp = r16 ; przypisanie nazw dla rejestrów .DEF tmp2 = r17 .DEF tmp3 = r18 .DEF counter = r19 .CSEG ; pocz ątek segmentu programu ; wektory resetu i przerwa ń .ORG 0x00 ; wektor przerwania od resetu / pocz ątek programu jmp Reset .ORG PORTD_INT0_vect ; wektor przerwania INT0 jmp ServiceINT0 .ORG PORTD_INT1_vect ; wektor przerwania INT1 jmp ServiceINT1 ; procedury obsługi przerwa ń ServiceINT0: ; obsługa przerwania od INT0 na por cie D pause0: lds tmp,PORTD_IN ; sprawdzenie czy przycisk INT0 puszczony, czy jest

; na nim stan "Hi" sbrs tmp,0 rjmp pause0 ; jesli nie, to pauza inc tmp3 ; inkrementuj zawarto ść zmiennej tmp3 rcall wysw7 ; wy świetlenie danej tmp3 na wyswietlaczu 7-seg. reti ServiceINT1: ; obsługa przerwania od INT1 na por cie D pause1: lds tmp,PORTD_IN ; sprawdzenie czy przycisk INT1 puszczony, czy jest

; na nim stan "Hi" sbrs tmp,1 rjmp pause1 ; jesli nie, to pauza dec tmp3 ; dekrementuj zawarto ść zmiennej tmp3 rcall wysw7 ; wy świetlenie danej tmp3 na wyswietlaczu 7-seg. reti ; procedura inicjalizacji po resecie i wł ączeniu zasilania Reset: ; konfiguracja pracy oscylatora ldi tmp,0xCB sts OSC_XOSCCTRL,tmp; ; zakres 12 - 16 MHz, 16K cl k start-up time lds tmp,OSC_CTRL ori tmp,0x08 sts OSC_CTRL,tmp ; External Oscillator (EO) mo żliwy do wykorzystania

Page 13: LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY 5 - …zbczaja/pdf/lab_atxmega32a4.pdf · LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY Ćwiczenie nr 5 Tworzenie programów w asemblerze

12

Wait_for_EO: lds tmp,OSC_STATUS ; czekaj a ż EO b ędzie gotowy sbrs tmp,3 rjmp Wait_for_EO ldi r16,0xD8 ; modyfikacja rejestru chronionego ldi r19,0x03 ldi r27,0x00 ldi r26,0x40 out 0x34,r16 ; CPU_CCP = 0xD8 - odblokuj rejest przed zapisem st x,r19 ; CLK_CTRL = 0x03 - przeł ącz system zegarowy na EO ; ustawienie wska źnika stosu i rejestru Z ldi tmp, high(RAMEND) ; [1] out CPU_SPH, tmp ldi tmp, low(RAMEND) out CPU_SPL, tmp ldi zh,high(ZNAKI<<1) ; rejestr Z wskazuje na pocz ątek tablicy ldi zl,low(ZNAKI<<1) ; ZNAKI ; konfiguracja portów ldi tmp,0xF2 sts PORTA_DIR,tmp ; linie PA7-PA4, PA1 wyj ściami, PA3,PA2 i PA0

; wej ściami (analogowymi) ldi tmp,0x80 ; sterowanie lini ą PA7 sts PORTA_OUTSET,tmp ; dezaktywacja układu IC4 ldi tmp,0xFF sts PORTC_DIR,tmp ; port C - wyj ściowy ldi tmp,0x00 sts PORTD_DIR,tmp ; port D - wej ściowy ldi tmp,0x08 sts PORTE_DIR,tmp ; linia PE3 (TxD) wyj ściem, pozostałe linie

; wej ściowe ; konfigutracja przerwa ń zewn ętrznych na porcie D - klawisze SW0 -SW3 [4] ldi tmp,0x05 sts PORTD_INTCTRL, tmp ; Low level interrupt na IN T0 i INT1 ldi tmp,0x01 sts PORTD_INT0MASK, tmp ; PD0 - INT0 ldi tmp,0x02 sts PORTD_INT1MASK, tmp ; PD1 - INT1 ldi tmp,0x01 sts PORTD_PIN0CTRL, tmp ; INT0 na zbocze narastaj ące ldi tmp,0x01 sts PORTD_PIN1CTRL,tmp ; INT1 na zbocze narastaj ące ldi tmp,0x01 sts PMIC_CTRL, tmp ; Low level interrupt odblokow ane sei ; odblokowanie przerwa ń ; *** Program główny (głowna p ętla programu) *** Program: rcall dip8 ; odczyt DIP-8 rcall led8 ; wy świetlenie danej na linijce 8 LED rcall sw4 ; odczyt stanu przycisków SW2 i S W3 rjmp Program ; powrót do pocz ątku programu ; ************************************************* ********************************

Page 14: LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY 5 - …zbczaja/pdf/lab_atxmega32a4.pdf · LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY Ćwiczenie nr 5 Tworzenie programów w asemblerze

13

; blok funkcji ; funkcja odczyt stanu przycisków SW2 i SW3 sw4: lds tmp, PORTD_IN ; odczyt stanu linii portu D sbrs tmp,2 ; czy nienaci śniety klawisz SW2 ldi tmp3, 0x0 ; wpisz '0' jak naci śniety sbrs tmp,3 ; czy nienaci śniety klawisz SW3 ldi tmp3,0x0F ; wpisz 'F' jak naci śniety rcall wysw7 ; wy świetlenie danej tmp3 na wyswietlaczu

; 7-segmentowym ret ; funkcja odczyt ustawien DIP-8 dip8: cli ; zablokowanie przerwan clr tmp sts PORTC_DIR,tmp ; inicjalizacja portu C j ako wej ściowy ldi tmp,0x80 ; sterowanie lini ą PA7 sts PORTA_OUTCLR,tmp ; aktywacja układu IC4 (od DI P-8) [4] nop lds tmp2, PORTC_IN ; odczyt DIP-8 sts PORTA_OUTSET,tmp ; dezaktywacja układu I C4 ser tmp sts PORTC_DIR,tmp ; ustawienie portu C na w yj ściowy sei ; odblokowanie przerwan ret ; funkcja wy świetlenie licznika na linijce diod led led8: sts PORTC_OUT,tmp2 ; wystawienie stanu DIP- 8 na port C ldi tmp,0x40 ; sterowanie lini ą PA6 sts PORTA_OUTSET,tmp ; aktywacja układu IC3 (od l inijki LED) sts PORTA_OUTCLR,tmp ; zatrza śni ęcie stanu na wyj ściu IC3 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 ; [3] sts PORTC_OUT,r0 ; wystawienie stanu DIP-8 na port C - zdekodowany

; wynik po wykonaniu instrukcji "lpm" znajduje si ę ; w rejestrze "r0"

ldi tmp,0x20 ; sterowanie lini ą PA5 sts PORTA_OUTSET,tmp ; aktywacja układu IC2 (od w ysw. 7-seg.) sts PORTA_OUTCLR,tmp ; zatrza śni ęcie stanu na wyj ściu IC2 ret ; *** Tablica znaków *** ; tablica znaków umieszczona jest w pami ęci programu FLASH pocz ąwszy od ; adresu 0x400 ; - 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 0x400 ZNAKI: .db 0x21,0xF5,0x13,0x91,0xC5,0x89,0x09,0xF1,0x01,0x 81,0x41,0x0D,0x2B,0x15,0x0B,0x4B

Page 15: LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY 5 - …zbczaja/pdf/lab_atxmega32a4.pdf · LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY Ćwiczenie nr 5 Tworzenie programów w asemblerze

14

; Zawarto ść rejestru zl | Kod 7-seg. | Wy świetlany znak na wy świetlaczu 7-seg. ; ------------------------------------------------- --------------------------- ; 0x00 | 0x21 | 0 ; 0x01 | 0xF5 | 1 ; 0x02 | 0x13 | 2 ; 0x03 | 0x91 | 3 ; 0x04 | 0xC5 | 4 ; 0x05 | 0x89 | 5 ; 0x06 | 0x09 | 6 ; 0x07 | 0xF1 | 7 ; 0x08 | 0x01 | 8 ; 0x09 | 0x81 | 9 ; 0x0A | 0x41 | A ; 0x0B | 0x0D | b ; 0x0C | 0x2B | C ; 0x0D | 0x15 | d ; 0x0E | 0x0B | E ; 0x0F | 0x4B | F ; ------------------------------------------------- --------------------------- .EXIT

Page 16: LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY 5 - …zbczaja/pdf/lab_atxmega32a4.pdf · LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY Ćwiczenie nr 5 Tworzenie programów w asemblerze

15

Ćwiczenie nr 6

Pisanie oprogramowania z wykorzystaniem języka C na mikrokontroler ATXmega32A4 firmy Atmel

I. Literatura (dokumentacja do ćwiczeń laboratoryjnych)

[1] Atmel Corporation, "8-bit XMEGA A Microcontroller, XMEGA A MANUAL ", 2012,

plik - xmega32a_manual.pdf.

[2] Atmel Corporation, "8/16-bit XMEGA A4 Microcontroller, ATxmega128A4 ATxmega64A4 ATxmega32A4 ATxmega16A4", 2012, plik - xmega32a4.pdf.

[3] Czaja Z., Burek K., "Stanowisko laboratoryjne dla mikrokontrolera ATXmega32A4 firmy Atmel", 2013, plik – atxmega32a4_pl.pdf.

[4] Generated by Doxygen 1.5.6, " avr-libc 1.6.7", 2010, plik - avr-libc-user-manual.pdf.

[5] Hitachi, "HD44780U (LCD-II)(Dot Matrix Liquid Crystal Display Controller/Driver)", plik - hd44780.pdf.

Powyższa dokumentacja znajduje się w katalogu c:\labmik\doc

II. Sprzęt i oprogramowanie

1. Zestaw laboratoryjny mikrokontrolera ATxmega32A4.

2. Programator Programator AVRISP mkII z interfejsem PDI podłączony do portu USB komputera PC.

3. Zasilacz gniazdkowy stabilizowany 9V.

4. Kabel połączeniowy dla standardu interfejsu szeregowego USB.

5. Oprogramowanie użytkowe na komputer PC:

a). zintegrowane środowisko programistyczne IDE (Atmel Studio 6 (c:\labmik\Atmel Studio 6\ atmelstudio.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 AVRISP mkII do portu USB, a przez kabel USB do drugiego portu USB komputera PC,

c) uruchomić komputer PC (praca pod Windows XP),

Page 17: LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY 5 - …zbczaja/pdf/lab_atxmega32a4.pdf · LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY Ćwiczenie nr 5 Tworzenie programów w asemblerze

16

d) uruchomić program do zarządzania systemem plików, np. Total Commander

(ikona na pulpicie ),

e) przejść do katalogu c:\labmik\ i usunąć podkatalog lab6 z całą jego zawartością (rys. 1) (kasowanie katalogu – po zaznaczeniu katalogu lab6 nacisnąć klawisz Delete lub F8),

Rys. 1. Panel programu Total Commander z zaznaczonym katalogiem c:\labmik\lab6

f) rozpakować plik lab6.zip znajdujący się w katalogu C:\labmik\ (zawiera on podkatalog lab6 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 lab6.zip (zaznaczyć go i nacisnąć klawisz Enter lub dwa razy kliknąć na nim myszką), po czym zaznaczyć katalog lab6 i nacisnąć klawisz F5 (rys. 2). W prawym panelu pojawi się ten katalog już rozpakowany).

Rys. 2. Panel programu Total Commander z otwartym plikiem lab6.zip

2. Zapoznanie się ze środowiskiem IDE dla mikrokontrolera ATxmega32A4– kompilacja.

a) Uruchomić program atmelstudio.exe. W tym celu najlepiej przejść do katalogu c:\labmik\lab6\ i dwukrotnie kliknąć na link AtmelStudio.lnk .

Totalcmd.lnk

Page 18: LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY 5 - …zbczaja/pdf/lab_atxmega32a4.pdf · LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY Ćwiczenie nr 5 Tworzenie programów w asemblerze

17

b) Pojawi się panel główny programu Atmel Studio. Będąc w zakładce „Start Page” kliknąć na ikonę New Project ... .

c) Pojawi się okienko „New Project” (rys. 3). Zaznaczamy C/C++ i wybieramy GCC C Executable Project C/C++. Pola „Name”, „Location”, „Solution” i „Solution name” powinny być uzupełnione tak, jak pokazano na rys. 3. Po czym nacisnąć przycisk OK .

Rys. 3. Okienko z ustawieniami projektu

d) Pojawi się kolejne okienko „Device Selection” (rys. 4). W polu „Device family” ma być wybrane AVR XMEGA, 8-bit , a na liście zaznaczony mikrokontroler ATxmega32A4. Na zakończenie nacisnąć przycisk OK .

Rys. 4. Okienko „Device Selection”

Page 19: LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY 5 - …zbczaja/pdf/lab_atxmega32a4.pdf · LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY Ćwiczenie nr 5 Tworzenie programów w asemblerze

18

e) Na ekranie pojawił się panel programu Atmel Studio 6 z oknem „przyk1.c” zawierajacym uniwersalny szablon dla programów pisanych w asemblerze.

f) Teraz należy przekopiować zawartość pliku przyk1_tmp.c do tego okna. W tym celu otworzyć w dowolnym edytorze tekstowym plik przyk1_tmp.c, (np. będąc w Total Commander zaznaczyć ten plik i nacisnąć klawisz F4). Jak jesteśmy w edytorze tekstowym z otwartym plikiem przyk1_tmp.c, aby zaznaczyć cały tekst naciskamy klawisze Ctrl-A , aby zachować go w schowku Windows naciskamy klawisze Ctrl-C . Zamykamy edytor tekstowy i przechodzimy do Atmel Studio do okna „przyk1.c”. Zaznaczamy cały tekst i naciskamy klawisze Ctrl-V . Zapisujemy tak utworzony plik przyk1.c, naciskajac klawisze Ctrl-S .

Rys. 5. Główny panel programu Atmel Studio 6 z oknem przyk1.c

g) Dokonać kompilacj) programu przyk1.c. W tym celu należy wybrać z menu głównego polecenie Build > Build Solution lub nacisnąć klawisz F7.

h) Sprawdzić, czy w oknie „Output” są komunikaty informujące o poprawnej kompilacji. Panel programu Atmel Studio powinien wyglądać podobnie jak na rys. 5.

i) W okienku „Solution Explorer” (prawe okienko pokazane na rys. 5) otworzyć katalog Output Files, zaznaczyć plik przyk1.lss i go otworzyć – np. poprzez dwukrotne kliknięcie lewym klawiszem myszy na tym pliku. Przeanalizować ten plik: − Jak odbywa się zamiana kodu C na kod asemblera? − Jak wygląda obsługa przerwań? − Zwrócić uwagę, jakie rejestry od r0 do r31 używane są przez kompilator?

Page 20: LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY 5 - …zbczaja/pdf/lab_atxmega32a4.pdf · LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY Ćwiczenie nr 5 Tworzenie programów w asemblerze

19

− Ile linii w asemblerze odpowiada poleceniu liczba += 10; ?

j) Zamknąć okno „przyk1.lss”.

k) W kodzie programu przyk1.c zakomentować linię z poleceniem liczba += 10; . Zapisać plik przyk1.c (naciskajac klawisze Ctrl-S ) i ponownie go skompilować - polecenie Build > Rebuild Solution.

l) Ponownie otworzyć plik przyk1.lss i zobaczyć o ile jest krótszy plik wynikowy bez obliczeń zmiennoprzecinkowych.

3. Zapoznanie się ze środowiskiem IDE dla mikrokontrolera ATxmega32A4 – symulacja.

a) Nasz program musi być wcześniej skompilowany, co już zrobiliśmy w poprzednim punkcie. Aby uruchomić symulację wybrać Project > przyk1 Properties.

b) W oknie „przyk1” w zakładce „Tool” w polu „Select debugger/programmer” wybrać Simulator. Zapisać ustawienia – nacisnąś klawisze Ctrl-S , po czym zamknąć okienko „przyk1”.

c) Przejrzeć listę poleceń menu Debug. W celu prześledzenia pracy programu przyk1.c najlepiej wybrać pracę krokową, wywołując polecenie Debug > StepInto (klawisz F11). Jedno naciśnięcie klawisza F11 powoduje wykonanie jednej instrukcji asemblera oraz modyfikację stanów rejestrów i ich bitów w okienku „IO View”.

Rys. 6. Główny panel programu Atmel Studio 6 z uruchomionym symulatorem

Page 21: LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY 5 - …zbczaja/pdf/lab_atxmega32a4.pdf · LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY Ćwiczenie nr 5 Tworzenie programów w asemblerze

20

d) Po pierwszym naciśnięciu klawisza F11 powinny pojawić się okienka „IO View” i „Memory”. W okienku „IO View” wybrać np. Port Configuration (PORTA) , a w dolnym okienku przejść do „Memory1”.

e) W okienku „Memory1” wybrać w linii „Memory:” data INTERNAL_SRAM . Pod adresem 0x2005 znajduje się zmienna counter, a pod adresem 0x2004 zmienna flaga.

f) Przeanalizować całą pracę programu: naciskająć klawisz F11 (praca krokowa programu przyk1.c) obserwować co się dzieje na potrach PORTA i PORTC oraz ze zmiennymi counter, flaga. Aby wywoływać obsługi przerwań zaznaczać w rejestrze INTFLAGS bit 0 dla INT0 i bit 1 dla INT1 .

g) Aby zakończyć symulację programową należy wywołać polecenie Debug > Stop Debugging.

4. Programowanie mikrokontrolera ATxmega32A4w systemie docelowym.

a) Zamknąć poprzedni projekt „przyk1” wywołując polecenie File > Close Solution.

b) Następnie utworzyć nowy projekt – wywołać polecenie File > New > Project... . Nadać mu nazwę porty . Przy tworzeniu projektu postępować tak jak w poprzednim przykładzie (punkty od 2c) do 2f)). Przy czym w tym przypadku przekopiować zawartość pliku porty_tmp.c do okna z plikiem porty.c.

c) Dokonać kompilacji wybierając polecenie Build > Build Solution (klawisz F7).

d) Przeanalizować kod programu porty.c oraz zawartość pliku porty.lss. Zrozumieć zasadę działania programu. Wszystkie niezbędne informacje znajdują się w dokumentacji technicznej [1-4].

e) Uruchomić symulator tak jak przedstawiono w punkcie 3a-c). Prześledzić na symulatorze programowym pracę programu porty.c. Pętla do {} while ((OSC_STATUS & 0x08) == 0); trwa ponad 2000 cykli. Zapoznać się ze schematem ideowym płytki laboratoryjnej i obsługą układów znajdujacych się na niej). Co z tego wynika? Jak zasymulować sygnały sterujace układami IC2, IC3 i IC4 na płytce?

Rys. 7. Okienko „IO View” z portem PORTA

Page 22: LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY 5 - …zbczaja/pdf/lab_atxmega32a4.pdf · LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY Ćwiczenie nr 5 Tworzenie programów w asemblerze

21

f) W celu zasymulowania przycisku SW0 umieszczonego na płytce laboratoryjnej [4], czyli w celu wywołania przerwania zewnętrznego INT0, skonfigurować okienko „IO View” podobnie tak jak pokazano na rys. 7 w ćwiczeniu nr 3. Podczas „wywoływania przerwań” należy pamiętać o wykonywaniu w między czasie polecenia Debug > StepInto (klawisz F11). Dopiero będąc już w obsłudze przerwania ServiceINT0 wyzerować ten bit. Obserwować co się dzieje ze zmienną counter (aby znaleźć jej miejsce, czyli adres, w pamieci SRAM mikrokontrolera zajrzeć do pliku porty.lss).

g) Po przeanalizowaniu pracy programu porty.asm zakończyć symulację programową wywołując polecenie Debug > Stop Debugging.

h) Sprawdzić, czy płytka laboratoryjna jest włączona (świecą się diody LED 9 i LED 10) – przełącznik POWER SWITCH w pozycji ON [4].

i) Przejść do programowania. W tym celu wybrać programator korzystajac z polecenia Tools > Device Programming.

j) Pojawi się okienko „Device Programming”. W polu „Tool” wybrać AVRISP mkII , w polu „Device” ma być ATxmega32A4, a w polu „Interface” PDI. Następnie nacisnąć przycisk Apply .

k) Jeżeli chcemy poznać parametry pracy mikrokontrolera, to wybrać zakładkę „Device information” i nacisnąć przycisk Read. Powinien pojawić się komunikat podobny jak na rys. 8.

Rys. 8. Okno obsługi programatora AVRISP mkII – zakładka „Device information”

l) W celu zaprogramowania mikrokontrolera wybrać zakładkę „Memories”. W polu „Flash (32 KB+4 KB BOOT)”, tak jak na rys. 9, powinien być wybrany plik C:\labmik\lab6\porty\ porty\Debug\porty.hex . Nacisnąć przycisk Program.

m) Po proprawnym zaprogramowaniu mikrokontrolera, w dolnym polu okienka „Device Programming” powinny być takie same komunikaty jak na rys. 9. Można wtedy zamknąć to okienko.

Page 23: LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY 5 - …zbczaja/pdf/lab_atxmega32a4.pdf · LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY Ćwiczenie nr 5 Tworzenie programów w asemblerze

22

Rys. 9. Okno obsługi programatora AVRISP mkII – zakładka „Memories”

n) Przeanalizować pracę programu porty.c w systemie docelowym. Zmieniać ustawienia przełączników na DIP SWITCH, obserwować co się dzieje na diodach LED0 – 7, naciskać przyciski SW0 oraz SW1 i przyglądać się jak pracuje wyświetlacz 7-mio segmentowy.

5. Komunikacja zestawu laboratoryjnego za pośrednictwem interfejsu USB obsługiwanego

przez moduł MMusb232 z komputerem PC za pomocą interfejsu UART mikrokontrolera.

a) Utworzyć projekt rs232 tak jak w punktach 2a) do 2e), utworzyć plik rs232.c z pliku rs232_tmp.c tak jak w punkcie 2f).

b) Przeanalizować kod programu rs232.c korzystając z dokumentacji [1,4] – jak wysyła i odbiera się dane w programie rs232.c? Co jest wyświetlane na diodach LED, a co na wyświetlaczu 7-mio segmentowym?

c) Dokonać jego kompilacji, po czym zaprogramować mikrokontroler plikiem C:\labmik\lab6\rs232\rs232\Debug\rs232.hex.

d) Przeanalizować pracę programu rs232.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 Com2 do Com8 (w zależności od stanowiska laboratoryjnego), Bitów na sekundę 9600, Bity danych 8, Parzystość Brak , Bity stopu 1, kontrola transmisji Brak (rys. 10).

Page 24: LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY 5 - …zbczaja/pdf/lab_atxmega32a4.pdf · LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY Ćwiczenie nr 5 Tworzenie programów w asemblerze

23

Rys. 10. Okno programu terminal.exe

6. Obsługa wyświetlacza tekstowego LCD.

a) Utworzyć projekt lcd tak jak w punktach 2a) do 2e), utworzyć plik lcd.c z pliku lcd_tmp.c tak jak w punkcie 2f).

b) Do katalogu C:\labmik\lab6\lcd\ lcd\ przekopiować z katalogu C:\labmik\lab6\ pliki lcd_lib.h i lcd_lib.c.

c) Przeanalizować kody programu w plikach lcd.c, lcd_lib.h i lcd_lib.c korzystając z dokumentacji [1-4], a szczególnie z [5] – jak inicjalizuje się wyświetlacz LCD i jak wysyła się do niego dane i polecenia? W pliku lcd_lib.c znajdują się kody wszystkich funkcji obsługujących wyświetlacz LCD. Aby otworzyć plik lcd_lib.h lub plik lcd_lib.c w oknie edytora Atmel Studio, należy wykonać polecenie File > Open > File... (Ctrl-O ) i wybrać dany plik.

d) Dokonać kompilacji pliku lcd.c, po czym zaprogramować mikrokontroler plikiem C:\labmik\lab6\lcd\lcd\Debug\lcd.hex.

e) Przeanalizować pracę programu lcd.c w systemie docelowym (obsługa zestawu laboratoryjnego znajduje się w komentarzach do kodu tego programu). Można podmieniać wysyłane na wyświetlacz LCD teksty, zmieniać ustawienia kursora na wyświetlaczu, itp. Aby zobaczyć efekty swojej pracy, po każdej zmianie należy zapisać program, dokonać jego kompilacji i zaprogramować nim mikrokontroler.

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).

Page 25: LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY 5 - …zbczaja/pdf/lab_atxmega32a4.pdf · LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY Ćwiczenie nr 5 Tworzenie programów w asemblerze

24

IV. Listingi programów 1. Program przyk1.c /* Przyklad pierwszy - przeznaczony do nauki symu lacji pracy ATxmega32a4 w środowisku Atmel Studio 6 */ /* Laboratorium: Mikrokontrolery i mikrosystemy o raz Mikrosterowniki i mik rosystemy rozproszone */ /* Dokumentacja techniczna do ćwiczenia laboratoryjnego: [1] - Atmel Corporation, "8-bit XMEGA A Microcontr oller, XMEGA A MANUAL ", 2012, plik - xmega32a_manual.pdf. [2] - Atmel Corporation, "8/16-bit XMEGA A4 Microco ntroller, ATxmega128A4 ATxmega64A4 ATxmega32A4 ATxmega16A4", 2012, p lik - xmega32a4.pdf. [3] - Czaja Z., Burek K., "Stanowisko laboratoryjne dla mikrokontrolera ATXmega32A4 firmy Atmel", 2013, plik - atxmega32a4_pl.pdf . [4] - Generated by Doxygen 1.5.6, " avr-libc 1.6.7" , 2010, plik - avr-libc-user- manual.pdf. */ #include <avr/io.h> #include <avr/interrupt.h> void avr_init(void); // prototyp funkcji unsigned char licznik; volatile unsigned char flaga; double liczba; // deklaracja zmiennej globalnej –

// zmienno-przecinkowej int main(void) { // procedura inicjalizacji po resecie i wł ączeniu zasilania avr_init(); // *** Program główny (głowna p ętla programu) *** while(1) { PORTC_OUT = licznik; // wystawienie stanu licznika PORTA_OUTSET = 0x40; // aktywacja układu IC 3 (od linijki LED) PORTA_OUTCLR = 0x40; // zatrza śni ęcie stanu na wyj ściu IC3 licznik++; // zwi ększenie licznika o 1 liczba += 10; // operacja na liczba ch zmiennoprzecinkowych } // ********************************************* return(0); } /* *********** Blok obsługi przerwa ń *********** */ // external interrupt 0 - inkrementacja zmiennej fl aga ISR(PORTD_INT0_vect) { flaga++; } // external interrupt 1 - dekrementacja zmiennej fl aga ISR(PORTD_INT1_vect) { flaga--; }

Page 26: LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY 5 - …zbczaja/pdf/lab_atxmega32a4.pdf · LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY Ćwiczenie nr 5 Tworzenie programów w asemblerze

25

/* *********** Blok funkcji *********** */ void avr_init(void) { /* inicjalizacja układu */ // Porty: A, B, C, D, E - kierunek linii: 0-wej ście 1-wyj ście PORTA_DIR = 0xF2; // linie PA7-PA4, PA1 wyj ściami, PA3,PA2 i PA0 // wej ściami (analogowymi) PORTA_OUTSET = 0x40; // sterowanie lini ą PA6 - dezaktywacja układu IC3 PORTB_DIR = 0x00; // Port B - wej ście PORTC_DIR = 0xFF; // port C - wyj ściowy PORTD_DIR = 0x00; // port D - wej ściowy PORTE_DIR = 0x08; // linia PE3 (TxD) wyj ściem, pozostałe linie // wej ściowe /* wygaszenie diod po resecie */ PORTC_OUT = 0xFF; // wystawienie stanu wysokie go na diody LED PORTA_OUTSET = 0x40; // aktywacja układu IC3 ( od linijki LED) PORTA_OUTCLR = 0x40; // zatrza śni ęcie stanu na wyj ściu IC3 licznik = 0x0; /* przerwania zewn ętrzne INT0 i INT1 na PORT D */ PORTD_INTCTRL = 0x05; // niski poziom przerwa ń INT0 i INT1 PORTD_INT0MASK = 0x01; // PD0 - INT0 PORTD_INT1MASK = 0x02; // PD1 - INT1 PORTD_PIN0CTRL = 0x01; // INT0 na zbocze narast aj ące PORTD_PIN1CTRL = 0x01; // INT1 na zbocze narast aj ące PMIC_CTRL = 0x01; // Low level interrupt odblok owane sei(); // odblokowanie przerwa ń return; }

2. Program porty.c /* Przyklad drugi - sterowanie portami ATxmega32a 4 */ /* Laboratorium: Mikrokontrolery i mikrosystemy o raz Mikrosterowniki i mi krosystemy rozproszone */ /* Dokumentacja techniczna do ćwiczenia laboratoryjnego: [1] - Atmel Corporation, "8-bit XMEGA A Microcontro ller, XMEGA A MANUAL ", 2012, plik - xmega32a_manual.pdf. [2] - Atmel Corporation, "8/16-bit XMEGA A4 Microco ntroller, ATxmega128A4 ATxmega64A4 ATxmega32A4 ATxmega16A4", 2012, p lik - xmega32a4.pdf. [3] - Czaja Z., Burek K., "Stanowisko laboratoryjne dla mikrokontrolera ATXmega32A4 firmy Atmel", 2013, plik - atxmega32a4_pl.pdf . [4] - Generated by Doxygen 1.5.6, " avr-libc 1.6.7" , 2010, plik - avr-libc-user- manual.pdf. */ #include <avr/io.h> #include <avr/interrupt.h> /* *** prototypy funkcji *** */ void avr_init(void); void send7SEG(unsigned char); void send8LED(unsigned char); unsigned char ReadDip8(void); //serviceSW2(); //serviceSW3();

Page 27: LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY 5 - …zbczaja/pdf/lab_atxmega32a4.pdf · LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY Ćwiczenie nr 5 Tworzenie programów w asemblerze

26

/* *** deklaracje zmiennych *** */ unsigned char result; unsigned char dana, counter; /* *** Tablica znaków dla wyswietlacza 7-segmentowe go *** */ // '0' , '1', '2', '3', '4', '5', '6', '7', '8', '9 ', 'A', 'b', 'C', 'd', 'E', 'F', const unsigned char buf[16] = {0x21,0xF5,0x13,0x91,0xC5,0x89,0x09,0xF1,0x01,0x81, 0x41,0x0D,0x2B,0x15,0x0B,0x4B}; int main(void) { // procedura inicjalizacji po resecie i wł ączeniu zasilania avr_init(); // *** Program główny (głowna p ętla programu) *** while(1) { dana = ReadDip8(); // odczyt przeł ącznikow DIP SWITCH send8LED(dana); // wyswietlenie stanu DIP SWI TCH na linijce LED8 //serviceSW2(); // sprawdzenie stanu przycisk u SW2 //serviceSW3(); // sprawdzenie stanu przycisk u SW3 } // ********************************************* return(0); } /* *********** Blok obsługi przerwa ń *********** */ // external interrupt 0 - inkrementacja zmiennej fl aga ISR(PORTD_INT0_vect) { counter++; loop_until_bit_is_set(PORTD_IN,0); // czekaj na puszczenie klawisza SW0 send7SEG(counter); // wyswietl dana na wysw. 7-seg. } // external interrupt 1 - ... ISR(PORTD_INT1_vect) { loop_until_bit_is_set(PORTD_IN,1); // czekaj na puszczenie klawisza SW1 // ...; // kod obsługi przerwania } /* - kod obsługi przerwa ń przetwornika ADC A // ADC A CH0 interrupt - odczytanie wyniku i ... ISR(ADCA_CH0_vect) { v_res = ADCA_CH0RES; // odczyt wyniku pomiaru napi ęcia na kanale CH0 // ...; // kod obsługi przerwania } // ADC A CH1 interrupt - odczytanie wyniku i ... ISR(ADCA_CH1_vect) { v_res = ADCA_CH1RES; // odczyt wyniku pomiaru napi ęcia na kanale CH1 // ...; // kod obsługi przerwania } */

Page 28: LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY 5 - …zbczaja/pdf/lab_atxmega32a4.pdf · LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY Ćwiczenie nr 5 Tworzenie programów w asemblerze

27

/* *********** Blok funkcji *********** */ /* - kod funkcji u żywanej do konfiguracji przetwornika ADC A // Definition of read calibration row function: // NVM_CMD = 0x02; // Read calibration Row Command, NVM_CMD has address 0x01CA // read __result from addr of read calibration row space // NVM_CMD = 0x00; // No operation uint8_t read_calibration_row(uint16_t addr) { uint8_t result; asm( "ldi r19,0x02 \n" "ldi r27,0x01 \n" "ldi r26,0xCA \n" "st x,r19 \n" "lpm %0, Z" "\n\t" "ldi r19,0x00 \n" "st x,r19 \n" : "=r" (result) : "z" (addr) ); return(result); } */ void avr_init(void) { /* inicjalizacja układu */ // Ustawienie zegara systemowego OSC_XOSCCTRL = 0xCB; // zakres 12 - 16 MHz, 1 6K clk start-up time OSC_CTRL |= 0x08; // External Oscillator (EO) możliwy do

// wykorzystania do {} while((OSC_STATUS & 0x08) == 0); // czeka j a ż EO b ędzie gotowy //CPU_CCP = 0xD8; // odblokuj rejest przed z apisem //CLK_CTRL = 0x03; // przeł ącz system zegarowy na EO asm ("ldi r16,0xD8 \n" "ldi r19,0x03 \n" "ldi r27,0x00 \n" "ldi r26,0x40 \n" "out 0x34,r16 \n" "st x,r19 \n" : : ); // Porty: A, B, C, D, E - kierunek linii: 0-wej ście 1-wyj ście PORTA_DIR = 0xF2; // linie PA7-PA4, PA1 wyj ściami, PA3,PA2 i PA0

// wej ściami (analogowymi) PORTA_OUTSET = 0x80; // sterowanie lini ą PA7 - dezaktywacja układu IC4 PORTB_DIR = 0x00; // Port B - wej ście PORTC_DIR = 0xFF; // port C - wyj ściowy PORTD_DIR = 0x00; // port D - wej ściowy PORTE_DIR = 0x08; // linia PE3 (TxD) wyj ściem, pozostałe linie

// wej ściowe /* wygaszenie diod po resecie */ PORTC_OUT = 0xFF; // wystawienie stanu wysokie go na diody LED PORTA_OUTSET = 0x40; // aktywacja układu IC3 ( od linijki LED) PORTA_OUTCLR = 0x40; // zatrza śni ęcie stanu na wyj ściu IC3

Page 29: LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY 5 - …zbczaja/pdf/lab_atxmega32a4.pdf · LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY Ćwiczenie nr 5 Tworzenie programów w asemblerze

28

/* - kod konfiguracji przetwornika ADC A // Kalibracja przetwornika ADCA // ADACAL0 - 0x2 0; ADACAL1 - 0x21; dana = (read_calibration_row(0x21)<<8) | read_c alibration_row(0x20); ADCA_CAL = dana; // ADCA_CAL = 0x0444; // ADC A ADCA_CTRLB = 0x06; // wynik bez znaku, 12-bitow a rozdzielczo ść,

// justowanie w lewo ADCA_REFCTRL = 0x20; // zewn ętrzne napi ęcie referencyjne z pinu AREF

// na PORT A ADCA_PRESCALER = 0x02; // podział sygnału zegar owego DIV16 (1 MHz) ADCA_CH0_CTRL = 0x01; // wej ście dodatnie na kanale CH0 ADCA_CH1_CTRL = 0x01; // wej ście dodatnie na kanale CH1 ADCA_CH0_MUXCTRL = 0x10; // kanał CH0 na pinie A DC2 ADCA_CH1_MUXCTRL = 0x18; // kanał CH1 na pinie A DC3 ADCA_CH0_INTCTRL = 0x01; // Low level interrupt na kanale CH0 ADCA_CH1_INTCTRL = 0x01; // Low level interrupt na kanale CH1 ADCA_CTRLA = 0x01; // wł ączenie ADC A */ /* przerwania zewn ętrzne INT0 i INT1 na PORT D */ PORTD_INTCTRL = 0x05; // niski poziom przerwa ń INT0 i INT1 PORTD_INT0MASK = 0x01; // PD0 - INT0 PORTD_INT1MASK = 0x02; // PD1 - INT1 PORTD_PIN0CTRL = 0x01; // INT0 na zbocze narast aj ące PORTD_PIN1CTRL = 0x01; // INT1 na zbocze narast aj ące PMIC_CTRL = 0x01; // Low level interrupt odblok owane sei(); // odblokowanie przerwa ń counter = 0; return; } void send8LED(unsigned char bajt) { /* wysterowanie linijki diod led */ PORTC_OUT = bajt; // wystawienie zmiennej na po rt C PORTA_OUTSET = 0x40; // aktywacja układu IC3 ( od linijki LED) PORTA_OUTCLR = 0x40; // zatrza śni ęcie stanu na wyj ściu IC3 return; } void send7SEG(unsigned char bajt) { /* wysterowanie wy świetlacza 7 segmentowego */ bajt &= 0x0F; // u życie maski 0x0F - zerowanie czterech

// najstarszych bitów result = buf[bajt]; // konwersja na kod wys. 7- seg. PORTC_OUT = result; // wystawienie zmiennej na port C PORTA_OUTSET = 0x20; // aktywacja układu IC2 ( od wysw. 7-seg.) PORTA_OUTCLR = 0x20; // zatrza śni ęcie stanu na wyj ściu IC2 return; }

Page 30: LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY 5 - …zbczaja/pdf/lab_atxmega32a4.pdf · LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY Ćwiczenie nr 5 Tworzenie programów w asemblerze

29

unsigned char ReadDip8(void) { /* funkcja odczytuje stan przełaczników DIP SWITCH */ uint8_t bajt; cli(); // blokada przerwan PORTC_DIR = 0x00; // ustawienie portu C jako we j ściowy PORTA_OUTCLR = 0x80; // aktywacja układu IC4 ( od DIP-8) bajt = PORTC_IN; // odczyt z pinów stanu przeł ączników DIP SWITCH bajt = PORTC_IN; // dodatkowy odczyt z pinów s tanu przeł ączników

// DIP SWITCH PORTA_OUTSET = 0x80; // dezaktywacja układu IC 4 PORTC_DIR = 0xFF; // ustawienie portu C na wyj ściowy sei(); // globalne odblokowanie przerwa ń return bajt; } /* void serviceSM2(void) { // odczyt stanu klawisza SW2 if bit_is_clear(PORTD_IN,2) // testowanie klawis za SW2 - gdy naci śni ęty to jest

// stan niski { loop_until_bit_is_set(PORTD_IN,2); // oczekiw anie na puszczenie klawisza SW2 // ...; // kod funkcji return; } } void serviceSM3(void) { // odczyt stanu klawisza SW3 if bit_is_clear(PORTD_IN,3) // testowanie kla wisza SW3 –

// gdy naci śni ęty to jest stan niski { loop_until_bit_is_set(PORTD_IN,3); // oczekiw anie na puszczenie klawisza SW3 // ...; // kod funkcji return; } } */ /* *********** Uwagi dotycz ące ADC A *********** */ /* // Kod uruchamiania konwersji ADC: ADCA_CH0_CTRL = 0x81; // start konwersji, wej ście dodatnie na kanale CH0 ADCA_CH1_CTRL = 0x81; // start konwersji, wej ście dodatnie na kanale CH1 // Konwersja zmiennej unsigned int v_res na unsigne d char dana: dana = (unsigned char)(v_res = v_res >> 4); // konwersja na bajt

// (dla justowania w lewo) */