Sprawozdanie z zajęć laboratoryjnych
Technika Mikroprocesorowa 2
Temat: System przerwań mikroprocesora Z80
Wykonujący ćwiczenie: Marcin Walenciej
Adam Zabrocki
Adam Turowski
Studia dzienne
Kierunek: Elektronika i Telekomunikacja
Specjalność: Elektronika Przemysłowa
Semestr V Grupa laboratoryjna: L03
Prowadzący ćwiczenie: dr inż. Sajewski Łukasz
...........................
OCENA
01.12.2010r.
Data wykonania ćwiczenia
..............................................
Data i podpis prowadzącego
I. Wstęp
Przerwanie - zdarzenie wewnątrz lub na zewnątrz systemu mikroprocesorowego, wymagające natychmiastowej reakcji ze strony programu wykonywanego przez mikroprocesor. Procedura obsługi przerwania - ciąg rozkazów realizujących pożądaną reakcję na przerwanie.
Rodzaje przerwań / zastosowania przerwań
1. przerwania zegarowe - regularne, o f > 1Hz, odmierzanie odcinków czasu (np. w ms), pomiar czasu astronomicznego, w małych systemach mikroprocesorowych: obsługa urządzeń zewnętrznych (klawiatur, wyświetlaczy, itd.).
2. przerwania od urządzeń zewnętrznych (komputerowych) - nieregularne,
informują mikroprocesor o gotowości urządzenia do nowej transmisji
informacji lub zakończeniu dotychczasowej transmisji.
3. przerwania od układów kontrolujących pracę systemu mikroprocesorowego -
sporadyczne, zwykle o wysokim priorytecie, zazwyczaj sygnalizujące jakieś
niesprawności (zanik zasilania, błąd parzystości w bloku pamięci, załamanie
się cyklu pracy systemu nadzorowanego przez watchdog).
4. przerwania od układów sprzężenia z obiektem - nieregularne, sygnalizujące
rożne zdarzenia w USO (np. koniec cyklu konwersji przetwornika A/C) lub w
kontrolowanym obiekcie (zadziałanie krańcówek alarmowych, wystąpienie
stanów alarmowych wielkości ciągłych).
II. Cel i zakres ćwiczenia.
Nabycie umiejętności programowania prostych systemów obsługi przerwań.
III. Opis stanowiska badawczego.
Ćwiczenie przeprowadzane jest w dwuosobowych grupach przy stanowisku komputerowym. Wymagany jest komputer klasy Pentium z systemem operacyjnym Windows, wyposażony w kolorową kartę graficzną i takiż monitor. Na komputerze powinny być zainstalowane programy narzędziowe (program metaasemblera C32.EXE i symulatora ekranowego SYMULATOR.EXE). Wymienione oprogramowanie narzędziowe w całości jest umieszczone w kartotece D:\Z80. Studenci piszą i uruchamiają swoje programy w indywidualnych podkartotekach, założonych w kartotece D:\Z80\LAB na pierwszych zajęciach.
Jako przykładowy rzeczywisty system mikroprocesorowy wykorzystuje się modułowy system z mikroprocesorem Z80. Jest on połączony z komputerem typu PC łączem szeregowym, które służy do ładowania kodów programów do pamięci operacyjnej systemu mikroprocesorowego.
IV. Przebieg ćwiczenia.
Nasza grupa miała do wykonania trzy zadania:
Zadanie 1: Napisać program, który wykorzystując przerwania o częstotliwości 1..2Hz będzie generował na linijce diod LED pod wyświetlaczem wybrany wzór z instrukcji.
Zadanie 2: To samo co zadanie pierwsze tylko inny wzór
Zadanie 3: Napisane dwa programy połączyć w jeden z możliwością wyboru dowolnym klawiszem na klawiaturze.
Zadanie nr 1:
Za zadanie mieliśmy wygenerować określony wzór geometryczny w postaci migających w odpowiednich chwilach diod. Wzór ten przedstawiony zostanie poniżej w postaci 0;1 gdzie 1 oznacza świecącą diodę.
1 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0
0 0 1 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 1
1 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0
0 0 1 0 0 0 0 0
0 0 0 1 0 0 0 0
0 0 0 0 1 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 1 0
0 0 0 0 0 0 0 1
Poniżej został przedstawiony jeno razowo cały kod całego programu (Nasz program napisany jest w przerwaniu int1)
cpu "z80.tbl"
hof "int8"
incl "system.inc"
org 8000h
; porty ukladu CTC na plycie CPU (zdefiniowane w pliku SYSTEM.INC):
;ctc1 equ 74h
;ctc2 equ 75h
;ctc3 equ 76h
;ctc4 equ 77h
; port LED'ow na plycie PKW
;ledy equ 0c1h
begin: im 2
ld a,81h
ld i,a ; wektor przerwan
ld a,00h
out (ctc1),a ; wektor przerwan
ld a,0b7h
out (ctc1),a ; inicjalizacja CTC1 jako genera-
ld a,0f7h ; tora przerwan systemowych
out (ctc2),a
out (ctc3),a
out (ctc4),a
ld a,00h
out (ctc1),a ; CTC1 / 256
ld a,20
out (ctc2),a ; CTC2 co 5/8 sekundy
ld a,2
out (ctc3),a ; CTC3 co 5/4 sekundy
ld a,8
out (ctc4),a ; CTC4 co 10 sekund
ld a,1 ; ładuj 1 do akkumulatora
ei ; zezwolenie na przerwania INT
label1: ;call inopnd
;ld hl,(oprnd1)
;ld de,(oprnd2)
;or a ; CY := 0
;sbc hl,de
;call hl4hp
;dfb 42h
;call conin
;call clsp
;dfb 80h
jr label1
; O B S L U G I P R Z E R W A N
int0: ;push af
;in a,(ledy)
;xor 0c0h
;out (ledy),a
;pop af
ei
reti
; nasz program
int1: ;push af
;in a,(ledy) ; wyświetl akku na linijce
rrc a ; przesuń w prawo jedynke
out (ledy),a ; wyświetl na linijce nową wartość w akku
;pop af
ei
reti
int2: ;push af
;in a,(ledy)
;xor 0ch
;out (ledy),a
;pop af
ei
reti
int3: ;push af
;in a,(ledy)
;xor 03h
;out (ledy),a
;pop af
ei
reti
org 8100h
tabint: dwl int0 ; tablica adresow obslug przerwan
dwl int1
dwl int2
dwl int3
end
Opis działania programu:
Program standardowo zaczyna się trzema rozkazami:
cpu "z80.tbl" - podanie biblioteki rozkazów
hof "int8" - rozkazy tłumaczone na kod szesnastkowy
org 8000h - określa, od jakiego adresu mają być lokowane kody następujących po nim rozkazów (w naszym wypadku jest to komórka o adresie 8000 w kodzie szesnastkowym)
W powyższym tekście prog ramu zaznaczono po średnikach, które fragmenty odpowiadają za inicjalizację CTC1 jako generatora przerwań, częstotliwości migania diod LED, zezwolenie na przerwania INT, obsługę przerwań oraz tablicę adresów obsługi przerwań. Z kolei nasz program zaczyna się od przerwania INT 1, jego zadaniem jest wyświetloną wcześniej diodę na linijce przesunąć w prawo i tak co każde przerwanie w nieskończoność.
Zadanie nr 2:
W drugiej części ćwiczeń mieliśmy przygotować kolejny program wyświetlający na linijce
Wybrany wzór z instrukcji tyle że trudniejszy.
1 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0
1 1 1 0 0 0 0 0
1 1 1 1 0 0 0 0
1 1 1 1 1 0 0 0
1 1 1 1 1 1 0 0
1 1 1 1 1 1 1 0
1 1 1 1 1 1 1 1
1 0 0 0 0 0 0 0
1 1 0 0 0 0 0 0
1 1 1 0 0 0 0 0
1 1 1 1 0 0 0 0
1 1 1 1 1 0 0 0
1 1 1 1 1 1 0 0
1 1 1 1 1 1 1 0
1 1 1 1 1 1 1 1
Kod programu:
Przed przerwaniem :
ld a,10000000b - ładuj do akku liczbę 10000000 binarnie
int1: ;push af
out (ledy),a ; wyświetl akku na linijce
SRA a ; przesuń wartość binarnie w akku w prawo z zapamiętaniem poprzedniej
cp 11111111b ; porównanie 11111111b z akku
jp z,zeruj ; jeżeli akku=11111111b=> Z=1 => skok do „zeruj”
jp wyjdz ; jeżeli Z=0 skok do „wyjdź”
zeruj: ld a, 10000000b ; pętla zeruj, ładuj do akku 10000000b
wyjdz: ; pętla wyjdź (wychodzimy z przerwania i zaczynamy od początku)
;pop af
Ei
Reti
Opis działania programu:
Program ten ma zadanie zapalić diodę na linijce i przesuwać ją w prawo z zapamiętaniem przedniej co widać na przedstawionym powyżej rysunku.
Zadanie nr 3:
W trzecim i ostatnim naszym zadaniu mieliśmy nasze poprzednie dwa programy złożyć w jeden z możliwością wyboru migania diod poprzez wciśniecie dowolnego klawisza.
Kod programu:
int1: ;push af
; ld a,(ledy) ; ładuj komórkę pamięci o nazwie ledy(zadeklarowaną na początku programu) do akku
ld E,A ; ładuj akku do rej. E
call ifkey ; jeżeli wciśnięty klawisz wrzuca do akku jego wartość
cp 30h ; porównaj 30h z akku
jp Z,wzor1 ; jeżeli akku=30h=>Z=1 to skocz do wzór 1
cp 31h ; porównaj 31h z akku
jp Z,wzor2 ; jeżeli akku=31h=>Z=1 to skocz do wzór 2
jp wyjdz ; jeżeli żaden z powyższych skocz do pętli wyjdź
wzor1: ; pętla wzor1
ld A,E ; ładuj rej E do akku
out (ledy),a ; wyświetl akku na linijce
SRA a ; przesuń wartość binarnie w akku w prawo z zapamiętaniem poprzedniej
cp 11111111b ; porównanie 11111111b z akku
jp z,zeruj ; jeżeli akku=11111111b=> Z=1 => skok do „zeruj”
jp wyjdz ; jeżeli Z=0 skok do „wyjdź”
zeruj: ; pętla zeruj
ld a, 10000000b ; pętla zeruj, ładuj do akku 10000000b
jp wyjdz ;skok do wyjdź
wzor2: ; pętla wzor 2
ld A,E ; ładuj rej E do akku
ld (ledy),A ;ładuj akku do komórki pamięci o wartości ledy
rrc a ; przesuń w prawo jedynkę
out (ledy),a ; wyświetl na linijce nową wartość w akku
jp wyjdz ; skok do pętli wyjdź
wyjdz: ;ptla wzjdz.
;pop af
Ei
Reti
Opis działania programu:
Program ten ma wykonać wyświetlanie wzorów diod z poprzednich zadań. Gdy trzymamy wciśnięty przycisk „0”=30h program uruchamia wzór 1 a gdy wciśniemy „1”=31h to program automatycznie zacznie wykonywać wzór 2
V. Wnioski:
Udało się nam przerobić program do wersji potrzebnej na laboratoria. Sekwencję zapalania się diod można zmienić wciskając przycisk 0 LUB 1. Mogliśmy również zmieniać czas świecenia diod poprzez modyfikację odpowiedniej części programu. Na przykład jak wpiszemy 38 to diody będą świecić przez okres czasu równy sekundzie.
6