LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY

Podobne dokumenty
LABORATORIUM MIKROKONTROLERY I MIKROSYSTEMY

Instytut Teleinformatyki

Instrukcja do laboratorium Akademii ETI *

dokument DOK wersja 1.0

Electronic Infosystems

Projektowanie z użyciem procesora programowego Nios II

XMEGA. Warsztaty CHIP Rok akademicki 2014/2015

Schemat blokowy architektury AVR

Instrukcja do oprogramowania ENAP DEC-1

imei Instytut Metrologii, Elektroniki i Informatyki

ADVANCE ELECTRONIC. Instrukcja obsługi aplikacji. Modbus konfigurator. Modbus konfigurator. wersja 1.1

Poradnik programowania procesorów AVR na przykładzie ATMEGA8

PROGRAMOWALNE SYSTEMY MECHATRONIKI

Cwiczenie nr 1 Pierwszy program w języku C na mikrokontroler AVR

Instrukcja do ćwiczeń

Politechnika Gdańska Wydział Elektrotechniki i Automatyki Katedra Inżynierii Systemów Sterowania

Niektóre piny mogą pełnić różne role, zależnie od aktualnej wartości sygnałów sterujących.

Parametryzacja przetworników analogowocyfrowych

Instytut Teleinformatyki

2. Architektura mikrokontrolerów PIC16F8x... 13

Programowanie mikrokontrolerów AVR

Programowanie mikrokontrolerów. 8 listopada 2007

TECHNIKA MIKROPROCESOROWA II

Szkolenia specjalistyczne

Podstawowe urządzenia peryferyjne mikrokontrolera ATmega8 Spis treści

Warsztaty AVR. Instalacja i konfiguracja środowiska Eclipse dla mikrokontrolerów AVR. Dariusz Wika

Programator AVR MKII. Instrukcja obsługi. Copyright by Barion

TECHNIKA MIKROPROCESOROWA II

Stanowisko laboratoryjne dla mikrokontrolera ATXmega32A4 firmy Atmel

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

Ćwiczenia z S S jako Profinet-IO Controller. FAQ Marzec 2012

Projektowanie z użyciem softprocesora picoblaze w układach programowalnych firmy Xilinx

Instytut Teleinformatyki

Programator procesorów rodziny AVR AVR-T910

MultiTool instrukcja użytkownika 2010 SFAR

Przemysłowy odtwarzacz plików MP3

Płytka uruchomieniowa AVR oparta o układ ATMega16/ATMega32. Instrukcja Obsługi. SKN Chip Kacper Cyrocki Page 1

Politechnika Białostocka

LABORATORIUM UKŁADÓW PROGRAMOWALNYCH. PROCESORY OSADZONE kod kursu: ETD 7211 SEMESTR ZIMOWY 2017

Tworzenie nowego projektu w asemblerze dla mikroprocesora z rodziny 8051

1.1 Co to jest USBasp? Parametry techniczne Obsługiwane procesory Zawartość zestawu... 4

SYSTEMY CZASU RZECZYWISTEGO (SCR)

Politechnika Gdańska Wydział Elektrotechniki i Automatyki Katedra Inżynierii Systemów Sterowania

1.Wstęp. 2.Generowanie systemu w EDK

4 Transmisja szeregowa na przykładzie komunikacji dwukierunkowej z komputerem PC, obsługa wyświetlacza LCD.

Opis procedur asemblera AVR

Technika Mikroprocesorowa Laboratorium 5 Obsługa klawiatury

LabVIEW PLATFORMA EDUKACYJNA Lekcja 5 LabVIEW i Arduino konfiguracja środowiska i pierwszy program

Instrukcja ręcznej konfiguracji połączenia z Internetem przez. modem ED77 w systemie Windows XP

Programowanie mikrokontrolerów AVR z rodziny ATmega.

Politechnika Łódzka. Instytut Systemów Inżynierii Elektrycznej

Organizacja pamięci VRAM monitora znakowego. 1. Tryb pracy automatycznej

Ćwiczenia z S Komunikacja S z miernikiem parametrów sieci PAC 3200 za pośrednictwem protokołu Modbus/TCP.

Konfiguracja i programowanie PLC Siemens SIMATIC S7 i panelu tekstowego w układzie sterowania napędami elektrycznymi. Przebieg ćwiczenia

MikloBit ul. Cyprysowa 7/ Jaworzno. JTAG + ISP dla AVR. rev

Dariusz Kozak ZESTAW URUCHOMIENIOWY MIKROKOMPUTERÓW JEDNOUKŁADOWYCH MCS-51 ZUX51. Loader LX51 INSTRUKCJA OBSŁUGI DK Wszystkie prawa zastrzeżone

4 Transmisja szeregowa, obsługa wyświetlacza LCD.

TWRS-21 TABLICOWY WYŚWIETLACZ CYFROWY DOKUMENTACJA TECHNICZNO-RUCHOWA. Wrocław, listopad 1999 r.

Laboratorium Procesorów Sygnałowych

Instrukcja programowania płytek edycji 2014

TwinCAT 3 konfiguracja i uruchomienie programu w języku ST lokalnie

AVR Asembler: Podstawy posługiwania się AVR Studio 4.

Konfiguracja pakietu CrossStudio for MSP

Programowalne Układy Cyfrowe Laboratorium

Programowanie Mikrokontrolerów

LITEcompLPC1114. Zestaw ewaluacyjny z mikrokontrolerem LPC1114 (Cortex-M0) Sponsorzy:

Instytut Teleinformatyki

Programowanie mikrokontrolerów AVR z rodziny ATmega.

Systemy wbudowane. Uniwersytet Łódzki Wydział Fizyki i Informatyki Stosowanej. Witold Kozłowski

Instytut Teleinformatyki

Product Update Funkcjonalność ADR dla przemienników Częstotliwości PowerFlex 750 oraz 525 6

Mikroprocesory i Mikrosterowniki Laboratorium

Politechnika Gdańska Katedra Optoelektroniki i Systemów Elektronicznych

Następnie kliknąć prawym klawiszem myszy na Połączenie sieci bezprzewodowej i wybrać Wyłącz.

Systemy wbudowane. Wprowadzenie. Struktura. Mikrokontrolery AVR. Wprowadzenie do programowania w C

INSTRUKCJA UŻYTKOWNIKA MPCC

OPTIMA PC v Program konfiguracyjny dla cyfrowych paneli domofonowy serii OPTIMA ELFON. Instrukcja obsługi. Rev 1

TM PROGRAM TERMINALA RS232 DLA MULTIPLEKSERA 8XRS232 / ETHERNET 10BASE-T

1. Opis. 2. Wymagania sprzętowe:

Licznik rewersyjny MD100 rev. 2.48

Komunikacja w mikrokontrolerach Laboratorium

Użycie AVR Studio do kompilacji AVRUB

Bezpieczeństwo informacji oparte o kryptografię kwantową

Opis szybkiego uruchomienia programu APBSoft

1. Tworzenie nowego projektu.

Program EDYTOR-AS-OUX

Instytut Teleinformatyki

Zaawansowane aplikacje internetowe - laboratorium

PLUTO Sterownik bezpieczeństwa Skrócona Instrukcja obsługi oprogramowania. PlutoProgrammingManualPL_v7A.pdf 1

Temat nr 5. System czasu rzeczywistego bazujący na stałopozycyjnym procesorze sygnałowym. LABORATORIUM Procesory i komputery przemysłowe

Notatka Aplikacyjna NA 03006PL Maj 2016

ZL8AVR. Płyta bazowa dla modułów dipavr

Gromadzenie danych. Przybliżony czas ćwiczenia. Wstęp. Przegląd ćwiczenia. Poniższe ćwiczenie ukończysz w czasie 15 minut.

STM32Butterfly2. Zestaw uruchomieniowy dla mikrokontrolerów STM32F107

CW-HC08 Programowanie mikrokontrolera MC9S08QD4 [2]

Ćwiczenie 7 Matryca RGB

Katedra Inżynierii Systemów Sterowania WEiA PG. Przemysłowe Sieci Informatyczne Laboratorium

Programowanie w środowisku graficznym GUI

Programowanie sterowników

Transkrypt:

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

Ć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 1

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

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 3

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ą. 4

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

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 6

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

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 8

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

IV. Listingi programów 1. Program przyk1.asm ; Przyklad pierwszy - przeznaczony do nauki symulacji 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 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..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 ; procedura inicjalizacji po resecie i włączeniu zasilania Reset: ldi tmp,0xff sts PORTC_DIR,tmp ldi tmp,0xf2 sts PORTA_DIR,tmp ldi tmp,0x00 sts PORTD_DIR,tmp ldi tmp,0x08 sts PORTE_DIR,tmp ldi tmp2,0x40 ; port C - wyjściowy ; linie PA7-PA4, PA1 wyjściami, PA3,PA2 i PA0 ; wejściami (analogowymi) ; port D - wejściowy ; linia PE3 (TxD) wyjściem, pozostałe linie wej. ; 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 linijki LED) sts PORTA_OUTCLR,tmp2 ; zatrzaśnięcie stanu na wyjściu IC3 ;st X+,tmp2 ;st X,tmp2 ;dec r26 ; kod realizuje powyższą procedurę, tylko szybciej.exit ret 10

2. Program porty.asm ; Przyklad drugi - porty.asm - obsługa portów mikrokontrolera 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 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..dseg.def tmp = r16 ; przypisanie nazw dla rejestrów.def tmp2 = r17.def tmp3 = r18.def counter = r19.cseg ; wektory resetu i przerwań.org 0x00 jmp Reset.ORG PORTD_INT0_vect jmp ServiceINT0.ORG PORTD_INT1_vect jmp ServiceINT1 ; początek segmentu programu ; wektor przerwania od resetu / początek programu ; wektor przerwania INT0 ; wektor przerwania INT1 ; procedury obsługi przerwań ServiceINT0: pause0: lds tmp,portd_in sbrs tmp,0 rjmp pause0 inc tmp3 rcall wysw7 reti ServiceINT1: pause1: lds tmp,portd_in sbrs tmp,1 rjmp pause1 dec tmp3 rcall wysw7 reti ; obsługa przerwania od INT0 na porcie D ; sprawdzenie czy przycisk INT0 puszczony, czy jest ; na nim stan "Hi" ; jesli nie, to pauza ; inkrementuj zawartość zmiennej tmp3 ; wyświetlenie danej tmp3 na wyswietlaczu 7-seg. ; obsługa przerwania od INT1 na porcie D ; sprawdzenie czy przycisk INT1 puszczony, czy jest ; na nim stan "Hi" ; jesli nie, to pauza ; dekrementuj zawartość zmiennej tmp3 ; wyświetlenie danej tmp3 na wyswietlaczu 7-seg. ; procedura inicjalizacji po resecie i włączeniu zasilania Reset: ; konfiguracja pracy oscylatora ldi tmp,0xcb sts OSC_XOSCCTRL,tmp; ; zakres 12-16 MHz, 16K clk start-up time lds tmp,osc_ctrl ori tmp,0x08 sts OSC_CTRL,tmp ; External Oscillator (EO) możliwy do wykorzystania 11

Wait_for_EO: lds tmp,osc_status sbrs tmp,3 rjmp Wait_for_EO ldi r16,0xd8 ldi r19,0x03 ldi r27,0x00 ldi r26,0x40 out 0x34,r16 st x,r19 ; czekaj aż EO będzie gotowy ; modyfikacja rejestru chronionego ; CPU_CCP = 0xD8 - odblokuj rejest przed zapisem ; 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) ldi zl,low(znaki<<1) ; rejestr Z wskazuje na początek tablicy ; 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 INT0 i INT1 ldi tmp,0x01 sts PORTD_INT0MASK, tmp ldi tmp,0x02 sts PORTD_INT1MASK, tmp ldi tmp,0x01 sts PORTD_PIN0CTRL, tmp ldi tmp,0x01 sts PORTD_PIN1CTRL,tmp ldi tmp,0x01 sts PMIC_CTRL, tmp sei ; PD0 - INT0 ; PD1 - INT1 ; INT0 na zbocze narastające ; INT1 na zbocze narastające ; Low level interrupt odblokowane ; odblokowanie przerwań ; *** Program główny (głowna pętla programu) *** Program: rcall dip8 rcall led8 rcall sw4 rjmp Program ; odczyt DIP-8 ; wyświetlenie danej na linijce 8 LED ; odczyt stanu przycisków SW2 i SW3 ; powrót do początku programu ; ********************************************************************************* 12

; blok funkcji ; funkcja odczyt stanu przycisków SW2 i SW3 sw4: lds tmp, PORTD_IN sbrs tmp,2 ldi tmp3, 0x0 sbrs tmp,3 ldi tmp3,0x0f rcall wysw7 ret ; odczyt stanu linii portu D ; czy nienaciśniety klawisz SW2 ; wpisz '0' jak naciśniety ; czy nienaciśniety klawisz SW3 ; wpisz 'F' jak naciśniety ; wyświetlenie danej tmp3 na wyswietlaczu ; 7-segmentowym ; funkcja odczyt ustawien DIP-8 dip8: cli ; zablokowanie przerwan clr tmp sts PORTC_DIR,tmp ; inicjalizacja portu C jako wejściowy ldi tmp,0x80 ; sterowanie linią PA7 sts PORTA_OUTCLR,tmp ; aktywacja układu IC4 (od DIP-8) [4] nop lds tmp2, PORTC_IN ; odczyt DIP-8 sts PORTA_OUTSET,tmp ; dezaktywacja układu IC4 ser tmp sts PORTC_DIR,tmp ; ustawienie portu C na wyjściowy sei ; odblokowanie przerwan ret ; funkcja wyświetlenie licznika na linijce diod led led8: sts PORTC_OUT,tmp2 ldi tmp,0x40 sts PORTA_OUTSET,tmp sts PORTA_OUTCLR,tmp ret ; wystawienie stanu DIP-8 na port C ; sterowanie linią PA6 ; aktywacja układu IC3 (od linijki LED) ; zatrzaśnięcie stanu na wyjściu IC3 ; 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 ldi tmp,0x20 sts PORTA_OUTSET,tmp sts PORTA_OUTCLR,tmp ret ; wystawienie stanu DIP-8 na port C - zdekodowany ; wynik po wykonaniu instrukcji "lpm" znajduje się ; w rejestrze "r0" ; sterowanie linią PA5 ; aktywacja układu IC2 (od wysw. 7-seg.) ; zatrzaśnięcie stanu na wyjściu IC2 ; *** 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,0x81,0x41,0x0D,0x2B,0x15,0x0B,0x4B 13

; 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 14

Ć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), 15

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

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 17

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? 18

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 19

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 20

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

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

6. Obsługa wyświetlacza tekstowego LCD. Rys. 10. Okno programu terminal.exe 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). 23

IV. Listingi programów 1. Program przyk1.c /* Przyklad pierwszy - przeznaczony do nauki symulacji 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 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-usermanual.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; PORTA_OUTSET = 0x40; PORTA_OUTCLR = 0x40; // wystawienie stanu licznika // aktywacja układu IC3 (od linijki LED) // zatrzaśnięcie stanu na wyjściu IC3 licznik++; // zwiększenie licznika o 1 liczba += 10; // operacja na liczbach zmiennoprzecinkowych // ********************************************* return(0); /* *********** Blok obsługi przerwań *********** */ // external interrupt 0 - inkrementacja zmiennej flaga ISR(PORTD_INT0_vect) flaga++; // external interrupt 1 - dekrementacja zmiennej flaga ISR(PORTD_INT1_vect) flaga--; 24

/* *********** 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; PORTA_OUTSET = 0x40; PORTB_DIR = 0x00; PORTC_DIR = 0xFF; PORTD_DIR = 0x00; PORTE_DIR = 0x08; // linie PA7-PA4, PA1 wyjściami, PA3,PA2 i PA0 // wejściami (analogowymi) // sterowanie linią PA6 - dezaktywacja układu IC3 // Port B - wejście // port C - wyjściowy // port D - wejściowy // linia PE3 (TxD) wyjściem, pozostałe linie // wejściowe /* wygaszenie diod po resecie */ PORTC_OUT = 0xFF; PORTA_OUTSET = 0x40; PORTA_OUTCLR = 0x40; // wystawienie stanu wysokiego na diody LED // aktywacja układu IC3 (od linijki LED) // zatrzaśnięcie stanu na wyjściu IC3 licznik = 0x0; /* przerwania zewnętrzne INT0 i INT1 na PORT D */ PORTD_INTCTRL = 0x05; PORTD_INT0MASK = 0x01; PORTD_INT1MASK = 0x02; PORTD_PIN0CTRL = 0x01; PORTD_PIN1CTRL = 0x01; PMIC_CTRL = 0x01; sei(); // niski poziom przerwań INT0 i INT1 // PD0 - INT0 // PD1 - INT1 // INT0 na zbocze narastające // INT1 na zbocze narastające // Low level interrupt odblokowane // odblokowanie przerwań return; 2. Program porty.c /* Przyklad drugi - sterowanie portami ATxmega32a4 */ /* Laboratorium: Mikrokontrolery i mikrosystemy oraz Mikrosterowniki i mikrosystemy rozproszone */ /* Dokumentacja techniczna do ćwiczenia laboratoryjnego: [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-usermanual.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(); 25

/* *** deklaracje zmiennych *** */ unsigned char result; unsigned char dana, counter; /* *** Tablica znaków dla wyswietlacza 7-segmentowego *** */ // '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(); send8led(dana); //servicesw2(); //servicesw3(); // odczyt przełącznikow DIP SWITCH // wyswietlenie stanu DIP SWITCH na linijce LED8 // sprawdzenie stanu przycisku SW2 // sprawdzenie stanu przycisku SW3 // ********************************************* return(0); /* *********** Blok obsługi przerwań *********** */ // external interrupt 0 - inkrementacja zmiennej flaga 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 26

/* *********** 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; OSC_CTRL = 0x08; // zakres 12-16 MHz, 16K clk start-up time // External Oscillator (EO) możliwy do // wykorzystania do while((osc_status & 0x08) == 0); //CPU_CCP = 0xD8; //CLK_CTRL = 0x03; 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" : : ); // czekaj aż EO będzie gotowy // odblokuj rejest przed zapisem // przełącz system zegarowy na EO // Porty: A, B, C, D, E - kierunek linii: 0-wejście 1-wyjście PORTA_DIR = 0xF2; PORTA_OUTSET = 0x80; PORTB_DIR = 0x00; PORTC_DIR = 0xFF; PORTD_DIR = 0x00; PORTE_DIR = 0x08; // linie PA7-PA4, PA1 wyjściami, PA3,PA2 i PA0 // wejściami (analogowymi) // sterowanie linią PA7 - dezaktywacja układu IC4 // Port B - wejście // port C - wyjściowy // port D - wejściowy // linia PE3 (TxD) wyjściem, pozostałe linie // wejściowe /* wygaszenie diod po resecie */ PORTC_OUT = 0xFF; PORTA_OUTSET = 0x40; PORTA_OUTCLR = 0x40; // wystawienie stanu wysokiego na diody LED // aktywacja układu IC3 (od linijki LED) // zatrzaśnięcie stanu na wyjściu IC3 27

/* - kod konfiguracji przetwornika ADC A // Kalibracja przetwornika ADCA // ADACAL0-0x20; ADACAL1-0x21; dana = (read_calibration_row(0x21)<<8) read_calibration_row(0x20); ADCA_CAL = dana; // ADCA_CAL = 0x0444; // ADC A ADCA_CTRLB = 0x06; ADCA_REFCTRL = 0x20; ADCA_PRESCALER = 0x02; ADCA_CH0_CTRL = 0x01; ADCA_CH1_CTRL = 0x01; ADCA_CH0_MUXCTRL = 0x10; ADCA_CH1_MUXCTRL = 0x18; ADCA_CH0_INTCTRL = 0x01; ADCA_CH1_INTCTRL = 0x01; ADCA_CTRLA = 0x01; */ // wynik bez znaku, 12-bitowa rozdzielczość, // justowanie w lewo // zewnętrzne napięcie referencyjne z pinu AREF // na PORT A // podział sygnału zegarowego DIV16 (1 MHz) // wejście dodatnie na kanale CH0 // wejście dodatnie na kanale CH1 // kanał CH0 na pinie ADC2 // kanał CH1 na pinie ADC3 // Low level interrupt na kanale CH0 // Low level interrupt na kanale CH1 // włączenie ADC A /* przerwania zewnętrzne INT0 i INT1 na PORT D */ PORTD_INTCTRL = 0x05; PORTD_INT0MASK = 0x01; PORTD_INT1MASK = 0x02; PORTD_PIN0CTRL = 0x01; PORTD_PIN1CTRL = 0x01; PMIC_CTRL = 0x01; sei(); // niski poziom przerwań INT0 i INT1 // PD0 - INT0 // PD1 - INT1 // INT0 na zbocze narastające // INT1 na zbocze narastające // Low level interrupt odblokowane // odblokowanie przerwań counter = 0; return; void send8led(unsigned char bajt) /* wysterowanie linijki diod led */ PORTC_OUT = bajt; PORTA_OUTSET = 0x40; PORTA_OUTCLR = 0x40; return; // wystawienie zmiennej na port C // aktywacja układu IC3 (od linijki LED) // zatrzaśnięcie stanu na wyjściu IC3 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; PORTA_OUTSET = 0x20; PORTA_OUTCLR = 0x20; return; // wystawienie zmiennej na port C // aktywacja układu IC2 (od wysw. 7-seg.) // zatrzaśnięcie stanu na wyjściu IC2 28

unsigned char ReadDip8(void) /* funkcja odczytuje stan przełaczników DIP SWITCH */ uint8_t bajt; cli(); PORTC_DIR = 0x00; PORTA_OUTCLR = 0x80; bajt = PORTC_IN; bajt = PORTC_IN; PORTA_OUTSET = 0x80; PORTC_DIR = 0xFF; sei(); return bajt; // blokada przerwan // ustawienie portu C jako wejściowy // aktywacja układu IC4 (od DIP-8) // odczyt z pinów stanu przełączników DIP SWITCH // dodatkowy odczyt z pinów stanu przełączników // DIP SWITCH // dezaktywacja układu IC4 // ustawienie portu C na wyjściowy // globalne odblokowanie przerwań /* void servicesm2(void) // odczyt stanu klawisza SW2 if bit_is_clear(portd_in,2) // testowanie klawisza SW2 - gdy naciśnięty to jest // stan niski loop_until_bit_is_set(portd_in,2); // oczekiwanie na puszczenie klawisza SW2 //...; // kod funkcji return; void servicesm3(void) // odczyt stanu klawisza SW3 if bit_is_clear(portd_in,3) // testowanie klawisza SW3 // gdy naciśnięty to jest stan niski loop_until_bit_is_set(portd_in,3); // oczekiwanie 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 unsigned char dana: */ dana = (unsigned char)(v_res = v_res >> 4); // konwersja na bajt // (dla justowania w lewo) 29