Podstawy Techniki Mikroprocesorowej
Laboratorium
Ćwiczenie nr 1
Temat: PROGRAMOWANIE MIKROKONTROLERA 80535.
Wykonali: 1. Piotr Jeziorski
2. Grzegorz Kałużny
Kierunek: informatyka Rok studiów: II
Prowadzący: mgr Marcin Biliński
Mikrokontroler MCS-51 należy do rodziny 8-bitowych mikrokomputerów jednoukładowych. Mikrokomputery takie mają szerokie zastosowanie w przemyśle, np. w układach: automatyki, pomiarowych, sterujących itp.
Głównymi cechami architektury MCS-51 są:
· duża ilość linii I\O, wielopoziomowe układy przerwań, układ transmisji szeregowej, wewnętrzna pamięć danych i programu, programowalne układu czasowe, układ regulacji poboru mocy, przetworniki A\D, D\A
· możliwość dołączenia (do 64KB) zewnętrznej pamięci danych i programu
· prawie jednolita, taka sama dla wszystkich mikrokontrolerów z rodziny, lista rozkazów
Wszystkie mikrokontrolery rodziny MCS-51 są całkowicie zgodne z mikrokontrolerem 8051.
Zestaw laboratoryjny ZD535 jest emulatorem mikrokontrolera 80535. Oznacza to, że instrukcje wykonywane są bezpośrednio na mikrokontrolerze 80535, a nie symulowane w pamięci komputera PC, który jest podłączony za pomocą RS do zestawu ZD535. Współpraca komputera PC z modułem laboratoryjnym polega na tym, że zbiór instrukcji programu przesyłany jest z PC do pamięci ZD535 i uruchamiany. Zawartość pamięci i rejestrów ZD535 jest przesyłana z powrotem do PC, gdzie jest dostępna dla użytkownika.
W skład zestaw laboratoryjnego wchodzi:
· wyświetlacz LCD
· 8 przełączników
· klawiatura (16 przycisków)
· przetwornik D\A
· 8 diod LED
· zewnętrzny generator NE555
· przetwornik akustyczny (buzzer)
· dodatkowe diody i potencjometry oraz inne dodatki
Zewnętrzna pamięć ZD535 podzielona jest na pamięć danych i programu. Pamięć programu składa się z 8KB EPROM, w której znajduje się program monitora oraz 32KB RAM, do której przegrywany jest program użytkownika. Wielkość pamięci danych wynosi 2KB.
Do kompilacji programów służy program „Archimedes”. Umożliwia on:
· kompilację programów do postaci object;
· linkowanie programów w postaci object do postaci binarnej;
· debugowania i monitorowania programów przy pomocy monitora.
Kod programu można napisać w dowolnym edytorze tekstowym, a następnie poddać go kompilacji.
Celem ćwiczenia było poznanie podstawowych rozkazów asemblera, używania mnemoników oraz sposobu korzystania z zestawu laboratoryjnego ZD535.
Przed umieszczeniem tekstu na wyświetlaczu należy wykonać procedury inicjujące LCD. Aby umieścić tekst na zadanej pozycji, należy za pomocą rozkazu MOV umieścić w akumulatorze wartość określającą położenie kursora: 0..15 - górny wiersz, 16..31 - dolny wiersz. Polecenie DB umieszcza w kolejnych bajtach pamięci programu, począwszy od adresu określonego etykietą TEXT, kody ASCII tekstu, który ma być wyświetlony na LCD. Adres ten jest przekazywany do 16-bitowego rejestru specjalnego DPTR za pomocą rozkazu MOV. W ostatnim kroku rozkaz CALL wywołuje procedurę umieszczającą tekst na wyświetlaczu.
Program:
CALL INIT_LCD_C ; inicjacja wyświetlacza LCD
CALL LCD_C_OFF
MOV A,#3H ; wpisz do akumulatora wartości 3hex
CALL GOTO_X_Y ; ustaw kursor w pozycji podanej w akumulatorze (4 pozycja
; w pierwszym wierszu)
MOV DPTR, #TEXT ; wpisz do DPTR wskaźnik adresu TEXT
CALL LCD_STR_PUT ; wyświetl komunikat na LCD
TEXT: DB 'Czesc na LCD $' ; do adresu określonego etykietą TEXT umieść kody ASCII tekstu
; znajdującego się między apostrofami
Wprowadzenie opóźnienia można zrealizować przez dodanie dodatkowej pętli. Większość rozkazów mikrokontrolera rodziny MCS-51 wykonuje się w czasie 1µs. DJNZ ma dwa cykle maszynowe więc czas jego trwania wyniesie 2µs. Konstruując pętle, które wykonują pewną liczbę rozkazów, można wprowadzać opóźnienia do programu. W naszym przypadku wykonywane są trzy pętle. Pętla zaczynająca się etykietą:
· delay wykonuje się 15 razy
· dly1 wykonuje się 255 razy
· dly2 wykonuje się 255 razy
Wymnożenie wszystkich tych wartości: 15*255*255*1ms daje opóźnienie ok. 2 s.
delay: MOV R7,#0FH ; wpisz do rejestru R7 stałą 0Fhex
dly1: MOV R5,#00H ; wpisz do rejestru R5 stałą 00hex
dly2: MOV R6,#00H ; wpisz do rejestru R6 stałą 00hex
; CPL BUZZER ; Make sound - rozkaz nie aktywny
DJNZ R6,$ ; zmniejsz R6 o jeden, wykonuj dopóki R6 ¹ 0
DJNZ R5,dly2 ; zmniejsz R5 o jeden, jeśli R6 ¹ 0 i skocz do adresu wskazywanego
; przez etykietę dly2
DJNZ R7,dly1 ; zmniejsz R7 o jeden, jeśli R7 ¹ 0 i skocz do dly1
RET ; wróć do miejsca wywołania procedury rozkazem CALL
Stan przełączników zapisany jest pod adresem oznaczonym etykietą SWTCH. Za pomocą rozkazu MOVX pobierana jest do akumulatora wartość komórki zewnętrznej pamięci danych wskazywanej przez DPTR, w której zapisany jest adres stanu przełączników. Następnie stan przełączników, pamiętany w akumulatorze, zapisywany jest w zewnętrznej pamięci danych do adresu wskazywanego przez DPTR. Stan przełączników i diod LED pamiętany jest w komórce pamięci o takim samym adresie, dlatego podczas odczytu wartości z tej komórki otrzymujemy stan przełączników, a przy zapisie do tej komórki ustawiamy diody LED.
MOV DPTR,#SWTCH ; do DPTR wpisz adres przełączników SWITCH
MOVX A,@DPTR ; do akumulatora wpisz stan przełączników
; MOV R3,A ; do rejestru R3 wpisz zawartość akumulatora - nie aktywny
; MOV A,P5 ; do akumulatora wpisz wartość portu P5 - nie aktywny
MOVX @DPTR,A ; wpisz stan przełączników do komórki wskazywanej przez DPTR,
; ustaw stan diod LED
MOV A,R3 ; do akumulatora wpisz zawartość rejestru R3
Stan klawiszy klawiatury pamiętany jest pod dwoma adresami. Pierwsze dwa rzędy klawiatury pamiętane są pod adresem KEYB0, a dwa następne pod adresem KEYB1. Za pomocą rozkazu MOV do DPTR zapisywany jest adres KEYB0 lub KEYB1. Rozkazem MOVX z zewnętrznej pamięci danych, do akumulatora wpisywana jest wartość komórki wskazywanej przez DPTR. Wartość akumulatora kopiowana jest do rejestru B. Do akumulatora zapisywana jest pozycja kursora, a następnie wykonywana jest procedura ustawienia kursora na zadanej pozycji. Dwa następne rozkazy wyświetlają znak zapisany w akumulatorze na wyświetlaczu LCD. Taki algorytm sprawdzana jest stan klawiszy pierwszej i drugiej części klawiatury.
KLAW: MOV DPTR,#KEYB0 ; do rejestru DPTR wpisz adres pierwszych dwóch rzędów
; klawiszy
MOVX A,@DPTR ; do akumulatora wpisz wartość wskazywaną przez DPTR
MOV B,A ; do rejestru B wpisz zawartość akumulatora
MOV A,#0H ; do akumulatora wpisz stałą 0 - pozycja kursora na LCD
CALL GOTO_X_Y ; ustaw kursor na zadanej pozycji
MOV A,B ; do akumulatora wpisz zawartość rejestru B
CALL LCD_CH_OUT ; wyślij znak z akumulatora na LCD
MOV DPTR,#KEYB1 ; do rejestru DPTR wpisz adres 3 i 4 rzędu klawiszy
MOV A,#10H ; do akumulatora wpisz stałą 10hex - pozycja kursora na LCD
JMP KLAW ; skocz do adresu wskazywanego przez etykietę KLAW
Zastosowanie mikrokontrolerów rodziny MCS-51 jest bardzo wszechstronne, ponieważ dzięki odpowiedniemu oprogramowaniu daje on możliwość wykonywania wielu różnorodnych zadań. Zadania te zależą oczywiście od układu, z którym mikrokontroler współpracuje.
Program dla mikrokontrolera pisze się w asemblerze używając mnemoników, które określają odpowiedni rozkaz. Dzięki temu tekst program jest bardziej przejrzysty i zrozumiały. Komponując rozkazy według algorytmów działania zlecamy mikrokontrolerowi wykonanie odpowiednich zadań lub procesów, np.: wyświetlenie tekstu na wyświetlaczu LCD, zapalenie diody, obsługę klawiatury. Algortymy powinno się optymalizować, aby dane zadanie lub proces wykonał się jak najszybciej. Należy więc pisać program wykonujący jak najmniej rozkazów, ponieważ każdy rozkaz wykonuje się w czasie 1µs lub 2µs, co przy bardzo rozbudowanej liście rozkazów może spowalniać działanie mikrokontrolera.
mistrzcater