Mikroprocesory i mikrosterowniki Wydział Elektroniki Mikrosystemów i Fotoniki Politechniki Wrocławskiej Ćwiczenie nr 1

Podobne dokumenty
Mikroprocesory i Mikrosterowniki Laboratorium

Mikrokontrolery AVR Wprowadzenie

Instytut Teleinformatyki

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

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

Techniki mikroprocesorowe i systemy wbudowane

Schemat blokowy architektury AVR

Podstawowe urządzenia peryferyjne mikrokontrolera ATmega8 Spis treści

KOMUNIKACJA Z OTOCZENIEM MIKROKONTROLERA

Instytut Teleinformatyki

2. Architektura mikrokontrolerów PIC16F8x... 13

MultiTool instrukcja użytkownika 2010 SFAR

Technika Mikroprocesorowa Laboratorium 5 Obsługa klawiatury

Mikrokontroler ATmega32. System przerwań Porty wejścia-wyjścia Układy czasowo-licznikowe

Komunikacja w mikrokontrolerach Laboratorium

interfejs szeregowy wyświetlaczy do systemów PLC

imei Instytut Metrologii, Elektroniki i Informatyki

Instrukcja obsługi programatora AVR Prog USB v2

Instrukcja obsługi. PROGRAMATOR dualavr. redflu Tarnów

PROGRAMOWALNE SYSTEMY MECHATRONIKI

Hardware mikrokontrolera X51

Opis układów wykorzystanych w aplikacji

Instrukcja obsługi programatora AVR Prog USB v2

LABORATORIUM - ELEKTRONIKA Układy mikroprocesorowe cz.2

Instytut Teleinformatyki

Ćwiczenie 2. Siedmiosegmentowy wyświetlacz LED

Sterowanie urządzeniami elektronicznymi przy użyciu portu LPT

Programowanie mikrokontrolerów. 5 grudnia 2007

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

dokument DOK wersja 1.0

Poradnik programowania procesorów AVR na przykładzie ATMEGA8

Podstawy techniki mikroprocesorowej

Parametryzacja przetworników analogowocyfrowych

Mikroprocesory i Mikrosterowniki

Mikroprocesory i Mikrosterowniki

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

Instrukcja obsługi programatora AVR Prog USB v2

INSTRUKCJA OBSŁUGI. Przekaźnik czasowy ETM ELEKTROTECH Dzierżoniów. 1. Zastosowanie

Widok programatora PonyProgUSB wersja 1.0 oraz jego elementy przedstawiono na poniższym rysunku.

Tworzenie nowego projektu w asemblerze dla mikroprocesora z rodziny 8051

SigmaDSP - zestaw uruchomieniowy dla procesora ADAU1701. SigmaDSP - zestaw uruchomieniowy dla procesora ADAU1701.

AVR DRAGON. INSTRUKCJA OBSŁUGI (wersja 1.0)

Laboratorium Komputerowe Systemy Pomiarowe

Programowanie mikrokontrolerów. 8 listopada 2007

AVREVB1. Zestaw uruchomieniowy dla mikrokontrolerów AVR. Zestawy uruchomieniowe

Electronic Infosystems

Laboratorium Systemów wbudowanych Wyższa Szkoła Zarządzania i Bankowości, Informatyka studia inżynierskie

Komunikacja w mikrokontrolerach. Wydział Elektroniki Mikrosystemów i Fotoniki Piotr Markowski

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

Mikroprocesory i Mikrosterowniki Laboratorium

Mikroprocesory i mikrosterowniki

Przemysłowy odtwarzacz plików MP3

MOD Xmega explore z ATXmega256A3BU. sklep.modulowo.pl akademia.modulowo.pl zestawy.modulowo.pl app.modulowo.pl blog.modulowo.

SYSTEM PRZERWAŃ ATmega 32

Spis treœci. Co to jest mikrokontroler? Kody i liczby stosowane w systemach komputerowych. Podstawowe elementy logiczne

SML3 październik

Programator mikrokontrolerów AVR

Programowanie mikrokontrolerów AVR z rodziny ATmega.

Wstęp Architektura... 13

Instrukcja obsługi programatora AVR Prog USB v2

CW-HC08 Programowanie mikrokontrolera MC9S08QD4 [2]

Instrukcja Obsługi. Modułu wyjścia analogowego 4-20mA PRODUCENT WAG ELEKTRONICZNYCH

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

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

Wydział Elektryczny. Katedra Automatyki i Elektroniki. Instrukcja. do ćwiczeń laboratoryjnych z przedmiotu: SYSTEMY CYFROWE 1.

INSTRUKCJA OBSŁUGI PROGRAMATORA WILLEM

Centrala alarmowa ALOCK-1

POLITECHNIKA WROCŁAWSKA WYDZIAŁ ELEKTRYCZNY KATEDRA ENERGOELEKTRYKI LABORATORIUM INTELIGENTNYCH INSTALACJI ELEKTRYCZNYCH

Politechnika Białostocka

Szkolenia specjalistyczne

XMEGA. Warsztaty CHIP Rok akademicki 2014/2015

Opis szybkiego uruchomienia programu APBSoft

Bramki logiczne Instrukcja do ćwiczeń laboratoryjnych

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

Ćwiczenie 7 Matryca RGB

4. Karta modułu Slave

1 Moduł Neuronu Cyfrowego SM

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

Mikroprocesory i Mikrosterowniki Laboratorium

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

Inż. Kamil Kujawski Inż. Krzysztof Krefta. Wykład w ramach zajęć Akademia ETI

Instrukcja obsługi programu PLOMP PLUS FM

Odczyt zegara ze sterownika do panelu serii TIU z możliwością korekty ustawień zegara w sterowniku

Akademia Górniczo-Hutnicza w Krakowie Katedra Elektroniki

wersja dokumentacji 1.00 Opis programu TeleTokenEdit

Podstawowe urządzenia peryferyjne mikrokontrolera ATmega8 Spis treści

1.2 Schemat blokowy oraz opis sygnałów wejściowych i wyjściowych

Programowanie mikrokontrolerów AVR z rodziny ATmega.

Wyświetlacz alfanumeryczny LCD zbudowany na sterowniku HD44780

Akademia Górniczo- Hutmicza w Krakowie Katedra Elektroniki WIET

Dokumentacja sterownika mikroprocesorowego "MIKSTER MCC 026"

ZL4PIC. Uniwersalny zestaw uruchomieniowy dla mikrokontrolerów PIC

ZL2AVR. Zestaw uruchomieniowy z mikrokontrolerem ATmega8

Ćwiczenie 4: Eksploatacja systemu kontroli dostępu jednego Przejścia REGIONALNE CENTRUM EDUKACJI ZAWODOWEJ W BIŁGORAJU

Programowanie w językach asemblera i C

Sprawozdanie z projektu MARM. Część druga Specyfikacja końcowa. Prowadzący: dr. Mariusz Suchenek. Autor: Dawid Kołcz. Data: r.

MOD Xmega explore z ATXmega256A3BU. sklep.modulowo.pl akademia.modulowo.pl zestawy.modulowo.pl app.modulowo.pl blog.modulowo.

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

Instrukcja do laboratorium Akademii ETI *

Metody obsługi zdarzeń

Transkrypt:

1 Ćwiczenie nr 1 Program ćwiczenia: Wprowadzenie - obsługa zestawów dydaktycznych i narzędzi programistycznych, Programowanie portów, pętli, skoków i procedur, Obsługa przerwań. Zagadnienia do przygotowania: Specyfika portów we/wy układu ATmega8535 Rejestry uniwersalne wpisywanie danych Rejestry specjalne wpisywanie wartości Skoki bezwarunkowe Wywołania podprogramów Inicjalizacja stosu 1

2 1. Makiety dydaktyczne informacje wstępne Wszystkie ćwiczenia laboratoryjne prowadzone w ramach kursu Podstawy Techniki Mikroprocesorowej realizowane są na specjalnie przygotowanych makietach dydaktycznych. Wygląd makiety przedstawiono na rys. 1. Rys. 1. Widok makiety dydaktycznej Makieta dydaktyczna wyposażona jest między innymi w: - mikrokontroler (Atmega 8535 firmy ATMEL), - osiem diod elektroluminescencyjnych (D0..D8), - klawiaturę 4 4, - tranzystory mocy (układ scalony ULN2803A), - potencjometry (Pot1, Pot2), - wyświetlacz LCD (HD44780), - układ scalony MAX7219 (sterowanie pracą wyświetlaczy 7 segmentowych), - zewnętrzną pamięć EEPROM (układ scalony 24C08), - rozszerzenie portów I/O (układ scalony PCF8574A). 2

3 Wyprowadzenia we/wy mikrokontrolera (określane potocznie jako piny, spotyka się również stosowanie terminu nóżki, którego stosowanie nie jest zalecane) są na makiecie podłączone do podwójnych listew kołkowych typu GOLGPIN. Listwy te podzielone są na cztery grupy po jednej dla każdego z portów (A, B, C, D) mikrokontrolera. Dla pojedynczego wyprowadzenia portu (jednej linii portu) każda para wyprowadzeń (pinów) na listwie kołkowej znajduje się na tym samym potencjale. Sygnały sterujące do diod elektroluminescencyjnych (LED) doprowadzane są za pomocą złączy JLEDx (gdzie x odpowiada numerowi diody). Klawiatura umieszczona na makiecie składa się z 16 przycisków rozmieszczonych w 4 rzędach po 4 przyciski w każdym. Obsługiwana jest za pomocą podwójnej listwy kołkowej zawierającej 2 8 pinów. Wybór odpowiedniego przycisku uzyskuje się przez podłączenie właściwych pinów na listwie. Górne cztery piny służą do wyboru kolumny (Kol), natomiast cztery dolne używane są do wyboru rzędu (Rzad). Tranzystory mocy służą do wzmacniania sygnałów pochodzących z mikrokontrolera w celu wysterowania np. uzwojeń silnika krokowego. Sygnał wejściowy należy podłączyć do odpowiednich pinów podwójnej listwy kołkowej oznaczonej symbolem IN0..7. Sygnały wyjściowe buforów prądowych doprowadzone są do listwy zaciskowej oznaczonej symbolem OUT0..7. Potencjometry Pot1, Pot2 podłączane są za pomocą pinów JPOTx (gdzie x to numer odpowiedniego potencjometru). Na wyprowadzeniu JPOTx występuje napięcie o wartości zależnej od aktualnej nastawy potencjometru. Przy rezystancji potencjometru ustawionej na minimum wyprowadzenia JPOTx znajduje się na potencjale Vcc = 5V. Wyświetlacz LCD umożliwia wyświetlanie znaków graficznych. Obsługiwany jest za pomocą 11 sygnałów: 3 sygnałów sterujących (REG SELECT, READ/WRITE, ENABLE) oraz 8 linii danych (D0..7). Układ scalony MAX7219 służy do sterowania pracą wyświetlaczy 7-segmentowych (SGM0..7). Programowanie układu odbywa się za pośrednictwem magistrali szeregowej SPI. Do sterowania pracą układu służą wyprowadzenia CLK, LOAD, DOUT, DIN. 3

4 Zewnętrzna pamięć danych (EEPROM) umożliwia zapis i odczyt danych za pomocą magistrali TWI(I 2 C). Linie A0..A2 (środkowe na listwie kołkowej) służą do ustalania adresu urządzenia (potrzebne w przypadku programowania więcej niż jednego układu pamięci). Linia WP służy do zabezpieczenia przed zapisem (gdy podłączony do Vcc, możliwy jest tylko odczyt). Sygnał zegarowy podłączany jest do linii SCA, a dane wysyłane/odbierane są przez linię SDA. Układ scalony PCF8574A umożliwia podłączenie dodatkowych portów I/O do mikrokontrolera. Układ programowany jest za pomocą magistrali TWI. Wyprowadzenia dodatkowego portu podłączone są do listwy kołkowej oznaczonej symbolem Port I2C (OUT0..7I). Do sterowania pracą układu służą linie A0..2 (adres układu), SCL (sygnał zegarowy), SDA (wysyłanie/odbiór danych), INT (przerwanie od rozszerzonego portu). Programowanie mikrokontrolera umieszczonego w makiecie odbywa się przez port równoległy IEEE 1284 (LPT). Nie ma konieczności stosowania odrębnego układu programatora. Przed rozpoczęciem pracy do makietę należy podłączyć do zasilacza. W tym celu wyprowadzenie zasilacza wtyczkowego 9 VDC należy podłączyć do gniazda zasilania umieszczonego na makiecie. W sytuacji gdy po podłączeniu zasilania zaświecą się wszystkie segmenty wyświetlaczy 7-segmentowych należy odłączyć zasilacz i po krótkiej chwili podłączyć makietę ponownie do zasilacza. 2. Obsługa narzędzi programistycznych Programowanie mikrokontrolera ATmega8535 odbywa się za pośrednictwem programów AVRStudio 4.19 oraz PonyProg2000. Oba programy są oprogramowaniem typu freeware i mogą być pobrane za darmo za pośrednictwem sieci Internet. Pierwszy z programów służy do pisania kodu i jego konwersji na język maszynowy (binarny). Skompilowany kod wysyłany jest za pomocą programu PonyProg2000 do mikrokontrolera. 4

5 2.1 Obsługa programu AVR Studio 4 Po uruchomieniu programu AVR Studio 4 wyświetlone zostanie okno powitalne (Rys.2). Jeżeli chcemy rozpocząć pracę nad nowym projektem należy wybrać przycisk New Project (u góry po lewej stronie). W wypadku gdy chcemy otworzyć już istniejący projekt należy wybrać odpowiedni projekt z listy umieszczonej poniżej i kliknąć przycisk z napisem Open (po prawej stronie). Rys. 2. Widok okna powitalnego programu AVR Studio 4 Po wyborze nowego projektu, wyświetlone zostanie kolejne okno (Rys. 3). Rys. 3. Okno wyboru typu, nazwy oraz ścieżki nowego projektu 5

6 Służy ono do wyboru typu, nazwy oraz ścieżki projektu. Środowisko AVR Studio 4 umożliwia programowanie mikrokontrolerów za pomocą języka Assembler (kliknięcie na Atmel AVR Assembler) lub C (kliknięcie na AVR GCC). Program kursu Podstawy techniki mikroprocesorowej przewiduje programowanie w języku Assembler. Po wyborze typu projektu, należy w polu po prawej stronie wpisać nazwę projektu. Możliwa jest również zmiana ścieżki projektu. Aby to zrobić należy kliknąć guzik po prawej stronie (z symbolem ) i wybrać nową ścieżkę projektu. Po wyborze języka programowania oraz wpisaniu nazwy projektu należy kliknąć przycisk z napisem Next>> (dolna część okna). Po wykonaniu wspomnianej czynności wyświetlone zostanie kolejne okno (Rys. 4). Umożliwia ono wybór platformy debugowania (po lewej stronie) oraz typu programowanego mikrokontrolera (po prawej stronie). Należy wybrać platformę AVR Simulator oraz mikrokontroler ATmega8535, a następnie kliknąć przycisk z napisem Finish. Następnie wyświetlone zostanie okno główne programu (Rys. 5). Rys. 4. Okno wyboru platformy debugowania oraz typu mikrokontrolera 6

7 Rys. 5. Widok okna głównego programu AVR Studio 4 Po lewej stronie znajduje się okno zawierające informacje dotyczące najważniejszych rejestrów mikrokontrolera (np. wskaźnik wierzchołka stosu - Stack Pointer, rejestr statusu SREG itd.) oraz rejestrów ogólnego przeznaczenia (R0..31). W oknie po prawej stronie znajduje się lista wszystkich rejestrów I/O mikrokontrolera. Kod programu wpisywany jest w centralnym polu. Po zakończeniu pisania kodu, program należy poddać kompilacji. W tym celu należy kliknąć przycisk (Assemble) lub nacisnąć klawisz F7. W wypadku gdy chcemy zasymulować działanie napisanego programu (tryb debugowania) należy kliknąć przycisk (Assemble and Run) lub wcisnąć kombinację klawiszy Ctrl+F7. Podczas trwania symulacji (Rys. 6) kolejna instrukcja, która będzie wykonana zaznaczona jest przez strzałkę znajdującą się po lewej stronie okna kodu programu. Aby przejść do kolejnej linijki kodu (symulacja wykonania instrukcji przez mikrokontroler) należy kliknąć ikonę znajdującą się w górnym menu lub nacisnąć klawisz F11. W trakcie trwania symulacji można przeglądać aktualne wartości wszystkich rejestrów mikrokontrolera na każdym etapie działania programu. Wartości zmienione w ostatnim kroku podświetlane są kolorem czerwonym. 7

8 Rys. 6. Widok okna głównego programu AVR Studio 4 w trakcie debugowania (symulacji) Po przeprowadzeniu kompilacji oprogramowanie AVR Studio 4 generuje plik o takiej samej nazwie jak projekt i rozszerzeniu hex. Jest to plik wsadowy w formacie INTEL dla programu PonyProg2000. 2.2 Obsługa programu PonyProg2000 Wygenerowany plik.hex należy otworzyć w programie PonyProg2000 przez kliknięcie ikony (górne menu obrazkowe) lub klikając File w górnym menu, a następnie Open Device File. Po otwarciu pliku.hex w polu edycyjnym wyświetlona zostanie zawartość tego pliku (Rys. 7). Przed wpisaniem programu do mikrokontrolera należy sprawdzić czy PonyProg2000 jest właściwie skonfigurowany. Po prawej stronie górnego menu obrazkowego powinno być wybrane AVR micro oraz ATmega8535. Jeżeli PonyProg2000 jest skonfigurowany poprawnie można zapisać program do mikrokontrolera uprzednio podłączając przewód LPT do odpowiedniego portu na makiecie dydaktycznej. Wpisanie programu do mikrokontrolera odbywa się po kliknięciu ikony (Write Device) w dolnym menu obrazkowym. W wypadku gdy mikrokontroler miał już wcześniej zapisany program po kliknięciu ikony Write Device nastąpi nadpisanie starego programu nowym. 8

9 Rys. 7. Widok okna głównego programu PonyProg2000 Za pomocą programu PonyProg2000 można również sprawdzić i zmienić ustawienia tzw. FUSE bitów informujący m. in. o źródle i częstotliwości taktowania. W celu oczytania konfiguracji FUSE bitów należy kliknąć ikonę i po pojawieniu się nowego okna kliknąć Read (Uwaga: puste pole przy bicie oznacza, że jest on w stanie wysokim). Konfiguracji FUSE-bitów NIE WOLNO zmieniać bez zgody prowadzącego zajęcia laboratoryjne! 3. Programowanie portów mikrokontrolera Mikrokontroler ATmega8535 zawiera 64 rejestry specjalne i 32 rejestry uniwersalne. Nazwy rejestrów specjalnych są zdefiniowane i związane są z funkcją jaką te rejestry pełnią, bądź ze sprzętem którego pracę konfigurują (np. rejestr statusu SREG, rejestry DDRx, PORTx, PINx portów I/O,). Natomiast nazwy rejestrów uniwersalnych składają się z numeru rejestru (od 0 do 31) poprzedzonych literą R (np. R16). Aby móc korzystać ze zdefiniowanych nazw rejestrów należy program rozpocząć dyrektywą:.include "m8535def.inc" 9

10 Rejestry specjalne służą do konfigurowania i sterowania pracą peryferii mikrokontrolera (np. portów, liczników, przetwornika analogowo-cyfrowego, itd.). Operacje arytmetycznologiczne mogą być wykonywane tylko na rejestrach uniwersalnych. Rejestry te są używane również do programowania (konfigurowania) rejestrów specjalnych. Praktycznie wszystkie rejestry mikrokontrolera ATmega8535 są 8 bitowe (poza nielicznymi wyjątkami). Jednym z podstawowych peryferii każdego mikrokontrolera są porty. Służą one między innymi do wysyłania i odbierania danych przez mikrokontroler. Układ ATmega8535 wyposażony jest w 4 porty (A, B, C i D). Do konfiguracji kierunku portu (wejście/wyjście) służy rejestr specjalny DDRx (gdzie x to nazwa portu np. dla portu A rejestr będzie nosił nazwę DDRA). Aby skonfigurować port A jako wyjście należy wpisać w odpowiednie miejsce w rejestrze DDRA wartość logiczną 1. Jeżeli wpisana zostanie wartość logiczna 0 to dana linia portu będzie skonfigurowana jako wejście. Do wpisywania wartości do rejestrów służy między innymi komenda ldi jednak nie można wykorzystać jej do bezpośredniego konfigurowania rejestrów specjalnych oraz rejestrów uniwersalnych od R0 do R15. Oznacza to, że zapis: ldi DDRA, 0b11111111 spowoduje błąd podczas kompilacji programu. Poprawnie konfiguracja portu odbywa się za pośrednictwem rejestru uniwersalnego R16..31, np.: ldi R16, 0b11111111 out DDRA, R16 Użyta powyżej komenda out powoduje przepisanie wartości z rejestru uniwersalnego R16 do specjalnego DDRA. Możliwe jest skonfigurowanie portu jako wejściowo-wyjściowego: ldi R16, 0b00001111 out DDRA, R16 taki zapis spowoduje, że połowa portu A będzie wyjściem (młodsza część portu linie 0..3), pozostała część będzie wejściem (starsza część portu linie 4..7). W wypadku pracy portu jako wejścia stany logiczne odpowiadający sygnałom dostarczonym z zewnątrz do linii portu są wpisywane przez mikrokontroler do rejestru PINx. Aby odczytać wartość z portu i zapisać ją do rejestru uniwersalnego należy użyć instrukcji in: 10

11 ldi R16, 0b00000000 \\wpisz 00000000 do rejestru R16 out DDRA, R16 \\cały port A ustawiony jako wejście in R17, PINA \\przepisanie wartości z rej. PINA do R17 Jeżeli port pracuje jako wyjście to wysyłane nim dane należy wpisywać do rejestru PORTx. W wypadku wysyłania danych np. portem A należy użyć polecania out:.include "m8535def.inc" ldi R16, 0b11111111 \\załaduj 11111111 do R16 out DDRA, R16 \\cały port A ustawiony jako wyjście ldi R17, 0b01010101 \\załaduj 01010101 do R17 out PORTA, R17 \\wyślij zawartość R17 portem A Wpisanie powyższego programu do mikrokontrolera i podłączenie jego portu A z wejściami sterującymi pracą diod LED na makiecie (Rys. 8) spowoduje, że zaświeci się co druga dioda (D1, D3, D5, D7). Rys. 8. Schemat podłączenia portu A mikrokontrolera z wejściami diod LED 11

12 Powyższy program z punktu widzenia formalnego jest poprawny, natomiast z punktu widzenia praktycznego zawiera drobną usterkę mogącą spowodować nieprzewidywalne zachowanie układu. Sprawa dotyczy zachowania mikrokontrolera po wykonaniu ostatniej instrukcji programu. Po wykonaniu instrukcji out PORTA, R17 \\wyślij zawartość R17 portem A mikrokontroler wykona bowiem kolejną instrukcję zapisaną w pamięci programu. W szczególności może być tam zapisana instrukcja z programu, który wpisany był do pamięci przez poprzednie osoby używające tej makiety, np. zapisanie rejestru PORTA wartości zerowej. Aby poprawnie zatrzymać działanie mikrokontrolera po wykonaniu programu należy w końcowej jego części umieścić zapętlenie (informacje dotyczące wyjaśnienia użytego mechanizmu znajdują się w dalszej części instrukcji): zatrzymaj: rjmp, zatrzymaj \\skocz do etykiety zatrzymaj 4. Programowanie pętli, skoków i procedur Mikrokontroler wykonuje program kolejno rozkaz po rozkazie. Aby zaburzyć taką pracę należy zastosować jedną z dostępnych funkcji skoku. Wywołanie jej spowoduje skok (przejście) w wybrane (wskazane) miejsce programu. Miejsce, od którego ma zostać przeniesione wykonywanie programu zaznacza się w programie etykietą. Etykieta może mieć dowolną nazwę i powinna kończyć się dwukropkiem (:). W kodzie programu nie mogą występować dwie identyczne etykiety. Jedną z instrukcji umożliwiających skok warunkowy do wybranego miejsca w programie jest BRNE. Instrukcja ta powoduje skok do miejsca oznaczonego etykietą jeżeli wartość ostatnio zmienianego rejestru uniwersalnego nie jest równa 00000000 (instrukcja ta testuje wartość logiczną flagi Z rejestru SREG). W chwili wyzerowania aktualnie używanego przez ALU rejestru uniwersalnego ustawiana jest flaga Z w rejestrze SREG i wówczas wywołanie instrukcji BRNE nie powoduje wykonania skoku, wykonywana jest kolejna instrukcja umieszczona w kodzie programu po instrukcji BRNE. Instrukcja BRNE może posłużyć do 12

13 konstrukcji pętli opóźniającej. Pętla taka może być wykorzystana np. w programie sterującym pracą diod LED na makiecie. Program powodujący cykliczne zaświecanie i gaszenie wszystkich diod LED może mieć postać:.include "m8535def.inc" ldi R16, 0b11111111 ldi R17, 0b00000000 out DDRA, R16 powtorz: out PORTA, R16 out PORTA, R17 rjmp powtorz Dla tak napisanego programu diody będą mrugać z częstotliwością w przybliżeniu równą połowie częstotliwości pracy mikrokontrolera. W wypadku mikrokontrolera ATmega8535 umieszczonego na makiecie jest ona na tyle wysoka (3,686 MHz), że niemożliwe jest dostrzeżenie za pomocą ludzkiego oka zaprogramowanego gaszenia i zaświecania diod LED. Widoczny efekt mrugania diod można osiągnąć przez uzupełnienie programu o pętlę opóźniającą: ldi R16, 0b11111111 \\wypełnij rejestr R16 delay: \\etykieta o nazwie delay dec R16 \\zmniejsz wartość R16 o 1 brne delay \\skocz do delay jeżeli ostatnio \\ zmieniony rejestr (R16) \\nie jest równy 0 Wykonanie tak skonstruowanej pętli opóźniającej zajmie mikrokontrolerowi 3 255 cykli zegarowych. Pętle należy umieścić dwukrotnie w kodzie - po instrukcjach zaświecających i gaszących diody LED. 13

14 Oszacować: Czy takie opóźnienie jest wystarczające, aby je zauważyć? Jeśli nie zaproponować kod dla pętli zagnieżdżonej. Jednak przygotowany w taki sposób program traci na przejrzystości. Dlatego lepszym rozwiązaniem jest zastosowanie podprogramu. W wypadku języka Assembler podprogram musi rozpocząć się etykietą i zakończyć instrukcją RET. Aby wywołać odpowiedni podprogram należy jego etykietę poprzedzić np. instrukcją RCALL: rcall podprogram_opoznienie \\ skok do miejsca \\oznaczonego etykietą \\ podprogram_opoznienie Jednak, aby móc użyć instrukcji RCALL należy uprzednio dokonać inicjalizacji stosu. Instrukcja RCALL jest to funkcja skoku z tzw. śladem oznacza to, że w momencie wywołania skoku w pamięci mikrokontrolera (na tzw. stosie) zapisywany jest adres powrotu. Program wraca do punktu z którego nastąpiło wywołanie podprogramu, gdy w podprogramie natrafi na komendę RET. Ponieważ adres powrotu zapisywany jest na stosie, niezbędne jest zainicjalizowanie wskaźnika wierzchołka stosu (Stack Pointer). Uzyskuje się to następującą sekwencją instrukcji: ldi R16,low(RAMEND) \\inicjalizacja stosu out SPL, R16 ldi R16,high(RAMEND) out SPH, R16 RAMEND jest stałą 16-bitową w której przechowywany jest adres wierzchołka stosu. Rejestry SPL (Stack Pointer Low) oraz SPH (Stack Pointer High) są rejestrami do których zapisywana jest młodsza (low) oraz starsza (high) część adresu wskaźnika wierzchołka stosu. Wspomniany fragment kodu powinien zawsze znajdować się na początku programu zaraz za dyrektywami Assemblera (instrukcje rozpoczynające się kropką np..include). Zmodyfikowany kod programu powodujący cykliczne zaświecanie i gaszenie diod LED z wykorzystaniem podprogramów może mieć postać: 14

15 ldi R16, 0b11111111 ldi R17, 0b00000000 \\ dyrektywy, stos, konf. portów, itd. powtorz: out PORTA, R16 rcall delay0 out PORTA, R17 rcall delay0 rjmp powtorz \\ program główny \\ zaświeć diody \\ wywołanie podprogramu delay0 \\ zgas diody \\ zapętlenie program głównego delay0: ldi R18, 0b11111111 delay0_1: dec R18 brne delay0_1 ret \\wyjście z podprogramu \\do programu głównego Oszacować: Czy takie opóźnienie jest wystarczające, aby je zauważyć? Jeśli nie zaproponować kod dla pętli zagnieżdżonej. 15

16 5. Obsługa przycisków Schemat podłączenia pojedynczego przycisku do mikrokontrolera przedstawiono na Rys. 9. Który przycisk został wybrany? Rys. 9. Podłączenie przycisku do mikrokontrolera na makiecie dydaktycznej Aby uniknąć problemów z indukowaniem się zakłóceń elektromagnetycznych (np. sygnały z nadajników telefonów komórkowych) w liniach portów mikrokontrolera używanych jako wejścia dobrą praktyką jest użycie mechanizmu pull-up, który podciąga (brak lepszego odpowiednika w języku polskim) ustala stan logiczny 1 wybranych linii portów. Uruchomienie mechanizmu pull-up można zainicjalizować w kodzie programu w następujący sposób: ldi R16, 0 out DDRA, R16 ldi R16, 255 out PORTA, R16 \\port A jako wejście \\pull-up na wszystkich liniach portu A W tej sytuacji ustalone zostały wysokie stany logiczne na wszystkich liniach portu A i możliwe jest tylko wykrywanie przez mikrokontroler zewnętrze ustalenie linii w stan niski. 16

17 Należy zatem jedno wyprowadzenie przycisku zwiernego z klawiatury należy podłączyć do portu mikrokontrolera. Natomiast drugie wyprowadzenie należy podłączyć do GND (stan logiczny 0 ). Linia portu do której podłączony jest przycisk powinna być skonfigurowana jako wejście. Przy właściwym podłączeniu wciśnięcie przycisku spowoduje ustalenie potencjału GND na odpowiedniej linii portu. Wykrycie przez mikrokontroler wciśnięcia przycisku realizuje się przez obserwację stanu logicznego na linii portu, do której to podłączony jest przycisk. Do wykrywania wciśnięcia przycisku można posłużyć się na przykład instrukcjami SBIC, SBIS, SBRC, SBRS. Dwie pierwsze instrukcje przeznaczone są dla rejestrów specjalnych, a dwie kolejne dla rejestrów uniwersalnych. Polecenie SBIC/SBRC powoduje pominięcie kolejnej linijki kodu jeżeli odpowiedni bit w wybranym rejestrze jest równy 0. Komendy SBIS/SBRS działają w analogiczny sposób, z tą różnicą że kolejna linijka jest pomijana jeżeli wybrany bit jest równy 1. Składnia każdego z poleceń jest identyczna i wygląda w następujący sposób: sbic nazwa_rejestru_i/o, nr_bitu_w_rejestrze Przykładowy fragment kodu powodującego zaświecenie diody LED gdy przycisk został wciśnięty i zgaszenie gdy został zwolniony: \\dyrektywy, konfiguracja portów itd. ldi R16,0b00000010 out DDRA, R16 \\linia 1 ustawiona jako wy., pozostałe na we. przycisk: ldi R17,0b11111101 \\ wł. pull-up na wejsciach out PORTA, R17 \\ dioda podłączona do pinu 1 (zgaszona) sbic PINA, 0 \\ sprawdź czy na pinie 0 portu A jest 0 \\ (do pin 0 na porcie A podłączony \\ jest przycisk) rjmp przycisk \\ jeżeli wciśnięty to ta linijka jest pomijana rjmp zaswiec \\ jeżeli wciśnięty skocz do zaswiec 17

18 zaswiec: ldi R16,0b11111111 \\ustaw 1 na wy i włącz pull-up na we. out PORTA, R16 \\zaswiec diodę podłączoną do linii 1 portu A rjmp przycisk 6. Obsługa wyświetlacza 7-segmentowego (zewnętrznego) Wyświetlacz ten służy do wyświetlania liczb dziesiętnych oraz niektórych liter. Składa się z siedmiu segmentów odpowiedzialnych za wyświetlanie liczby lub litery oraz pojedynczego segmentu będącego kropką. Wyświetlacz wyposażony jest w wyprowadzenia zapewniające zasilanie oraz umożliwiające sterowanie każdym segmentem niezależenie. Wyświetlacz używany podczas zajęć laboratoryjnych posiada 9 wyprowadzeń umieszczony na niewielkiej płytce PCB, dołączany do makiety za pośrednictwem przewodów. Schemat wyświetlacza siedmiosegmentowego przedstawiono na Rys. 10. Rys. 2. Schemat wyświetlacza siedmiosegmentowego Do obsługi pojedynczego wyświetlacza siedmiosegmentowego z kropką wystarcza jeden bajt. Sposób podłączenia poszczególnych segmentów do bitów sterujących może być dowolny. W zależności czy kodowany wyświetlacz jest układem ze wspólną katodą (WK) lub wspólną anodą (WA) należy jego dziewiąty pin (środkowy w dolnym rzędzie) podłączyć do GND lub Vcc. Dla układu WK podanie stanu wysokiego ( 1 ) na pin wyświetlacza spowoduje zaświecenie wybranego segmentu, a stanu niskiego ( 0 ) jego zgaszenie. W wyświetlaczach WA jest odwrotnie. Poniżej zamieszczono przykładowy kod powodujący cykliczne zaświecanie i gaszenie wszystkich segmentów wyświetlacza siedmiosegmentowego: 18

19 \\ dyrektywy, itd. ldi R16, 0b11111111 out DDRA, R16 \\ port A ustawiony jako wyjście zapal: out PORTA, R16 \\ wysyłanie 1 do segmentów wyświetlacza WK rcall delay0 \\ opóźnienie zgas: ldi R17, 0b00000000 out PORTA, R17 \\ wysyłanie 0 do segmentów wyświetlacza WK rcall delay0 rjmp zapal \\ po opóźnieniu skocz do zapal delay0: \\ pętla opóźniająca ret 7. Przerwania zewnętrzne (INT0, INT1) Przerwaniem nazywamy sygnał powodujący wstrzymanie aktualnie wykonywanego przez mikrokontroler programu i wykonanie programu obsługi przerwania. Po obsłużeniu przerwania mikrokontroler powraca do wykonywania programu w miejscu, w którym nastąpiło przerwanie. Przerwania dzielimy na zewnętrzne oraz wewnętrzne. W pierwszym przypadku sygnał przerwania pochodzi od zewnętrznego urządzenia podłączonego do odpowiednich linii mikrokontrolera. Dla mikrokontrolera ATmega8535 sygnał przerwania zewnętrznego powinien być podłączony do linii 2 (przerwanie INT0) lub 3 (przerwanie INT1) portu D. Przerwania wewnętrzne mogą być wywoływane przez wybrane peryferia mikrokontrolera (np. licznik, przetwornik analogowy-cyfrowy, itd.). 19

20 W wypadku równoczesnego (w tym samym cyklu zegarowym) wystąpienia się dwóch (lub więcej) przerwań obsługiwane jest przerwanie o wyższym priorytecie. Wykaz wszystkich przerwań oraz ich priorytetów można znaleźć w Tab. 19 (s. 46) dokumentacji układu ATmega8535. We wspomnianej tabeli można odszukać również adres do umieszczenia programu obsługi przerwania. Na przykład w wypadku przerwania RESET program przejdzie do instrukcji umieszczonej pod adresem 0x000 (czyli na początek programu). W wypadku gdy w programie przewidujemy występowanie przerwań innych niż RESET niezbędne jest uporządkowanie jego struktury za pomocą dyrektywy.org. Dyrektywa ta umożliwia nadanie konkretnego adresu występującej po niej linijce kodu, np.:.org $000 rjmp przerwanie1 \\ ta linijka ma adres $000.org $013 rjmp przerwanie2 \\ a ta linijka będzie mieć adres $013 Stosując dyrektywę.org należy pamiętać, że nie można używać dwa razy tego samego adresu w jednym programie, np.:.org $000 rjmp przerwanie1.org $000 rjmp przerwanie2 \\ TAK JEST ŹLE Wartość adresu po dyrektywie.org może tylko wzrastać w kolejnych linijkach kodu, np.: ŹLE DOBRZE.org $013.org $000 rjmp etykieta1 rjmp etykieta2.org $000.org $013 rjmp etykieta2 rjmp etykieta1 20

21 Powrót z programu obsługi przerwania następuję przez użycie instrukcji RETI. Do prawidłowego działania programu wykorzystującego przerwania niezbędna jest inicjalizacja stosu. Aby móc korzystać z przerwań zewnętrznych należy je odblokować w rejestrze GICR (General Interrupt Control Register): 7 6 5 4 3 2 1 0 bit INT1 INT0 INT2 - - - IVSEL IVCE GICR Odblokowanie wybranego przerwania odbywa się poprzez ustawienie właściwego bitu w rejestrze GICR. W przypadku przerwań zewnętrznych INT1 i INT0 są to odpowiednio bity 7 i 6. Po odblokowaniu odpowiedniego przerwania/przerwań należy wskazać sygnał wyzwalający przerwanie zewnętrzne. W tym celu należy skonfigurować rejestr MCUCR: 7 6 5 4 3 2 1 0 bit SM2 SE SM1 SM0 ISC11 ISC10 ISC01 ISC00 MCUCR Bity ISC11 oraz ISC10 używane są do konfigurowania sygnału wyzwalającego przerwania INT1, a bity ISC01 oraz ISC00 dla przerwania INT0. Sygnały wyzwalające przerwanie zewnętrzne oraz odpowiadające im kombinacje bitów ISCx0 i ISCx1 przedstawiono poniżej: ISCx1 ISCx0 Sygnał wyzwalający 0 0 Niski poziom na linii INT1/0 0 1 Zmiana stanu logicznego na linii INT1/0 1 0 Opadające zbocze na linii INT1/0 1 1 Narastające zbocze na linii INT1/0 Po skonfigurowaniu rejestrów GICR oraz MCUCR należy odblokować przerwania globalnie. Odbywa się to przez ustawieniu 7 bitu (Interrupt) w rejestrze SREG. Można zrobić to za pomocą instrukcji SEI lub przez zapis: sbi SREG, 7 \\ustaw bit 7 w SREG Należy pamiętać, że wyprowadzenia portu (D) do których dostarczany jest sygnał przerwania powinny być skonfigurowane jako wejściowe i musi być na nich ustawiony pull-up. 21

22 Przykładowy program wykorzystujący przerwanie zewnętrzne przedstawiono poniżej:.include "m8535def.inc".org $000 rjmp start.org $001 rjmp przerw0 \\ adres RESET \\ adres przerwania INT0 start: ldi R16, low(ramend) out SPL, R16 ldi R16, high(ramend) out SPH, R16 ldi R16,0b00000000 out DDRD, R16 ldi R16,0b11111111 out PORTD, R16 \\ port D jest wyjściem \\ pull-up na porcie D ldi R16, 0b01000000 out GICR, R16 ldi R16, 0b00000001 out MCUCR, R16 sei \\ konfiguracja przerwań \\ odblokowanie przerwania INT0 \\ przerwanie INT0 wywołane \\ zmianą stanu na linii PD2 \\ globalne odblokowanie przerwań prog_glowny: \\ program główny rjmp prog_glowny przerw0: reti \\ program obsługi przerwania od INT0 22

23 8. Przykładowe zadania 1) Napisać program wyświetlający nr indeksu na wyświetlaczu siedmiosegmentowym (cyfra po cyfrze). Wskazówka: zmodyfikować pętlę opóźniającą w taki sposób aby opóźnienie wyniosło 3 x 255 x 255 cykli zegarowych. 2) Napisać program obsługujący 4 przyciski. Po wciśnięciu każdego z przycisków na wyświetlaczu siedmiosegmentowym pojawi się inna cyfra/litera. 3) Napisać program który będzie zliczał ile razy został wciśnięty przycisk. Wynik zliczania będzie wyświetlany na: a. linijce diod, b. wyświetlaczu siedmiosegmentowym. Wskazówka: wykorzystać komendy ROL/ROR, MOV. 4) Napisać program który zaświeci jedną z ośmiu diod. Po wciśnięciu jednego przycisku zaświecona dioda przesunie się w lewą stronę, a po wciśnięciu drugiego przycisku w prawo. Program zrealizować wykorzystując: a. instrukcje SBIC/SBIS lub SBRC/SBRS, b. przerwania zewnętrzne INT0, INT1. Wskazówka: wykorzystać polecenia ROL, ROR 23