BADANIE MIKROKONTROLERA 8051
1. Cel i zakres ćwiczenia
Poznanie podstawowych działań realizowanych przez mikrokontroler 8051 podczas komunikacji z zewnętrzną pamięcią programu i danych oraz z urządzeniami peryferyjnymi, poprzez rejestrację odpowiednich przebiegów czasowych podczas wykonywania przykładowych rozkazów i programów.
2. Podstawy teoretyczne
Mikrokontroler 8051 jest przedstawicielem 8 - bitowej rodziny układów mikroprocesorowych MCS 51. Schemat funkcjonalny oraz symbol logiczny przedstawia poniższy rysunek.
Rys. 1. Mikrokontroler 8051: a). schemat funkcjonalny, b). symbol logiczny.
8 - bitowa jednostka centralna (CPU) - może wykonywać 111 rozkazów umożliwiających łatwą efektywną realizację wszelkiego rodzaju algorytmów sterowania.
Zegar - stabilizowany zewnętrznym rezonatorem o fmax = 12 MHz.
Wewnętrzna pamięć programu - (ROM), o pojemności 4K bajtów (może być rozszerzona do 64K poprzez dołączenie pamięci zewnętrznej).
Wewnętrzna pamięć danych - (RAM), o pojemności 128 bajtów (możliwe jest dołączenie zewn. pamięci danych o pojemności do 64K w ramach osobnej przestrzeni adresowej).
Układ czasowo - licznikowy - zawiera dwa 16 - bitowe liczniki, które mogą zliczać wewnętrzne lub zewnętrzne impulsy zegarowe, bądź pracować w jednym z czterech, ustawianych indywidualnie trybów.
Linie wejścia - wyjścia - (32 linie) są zorganizowane w cztery 8 - bitowe porty (linie portu P3 służą dodatkowo do realizacji funkcji specjalnych).
Port szeregowy - umożliwia niezależne nadawanie i odbieranie transmisji szeregowej (może pracować w 4 trybach).
Układ przerwań - (dwupoziomowy) może obsługiwać 2 przerwania zewnętrzne i 2 z układu czasowo - licznikowego oraz przerwanie z układu szeregowego wejścia - wyjścia.
Wykorzystanie poszczególnych podzespołów układu i wybór trybów pracy wymaga ustawienia znaczników w odpowiednich słowach sterujących w rejestrach z obszaru rejestrów specjalnych (SFR) znajdujących w wewnętrznej pamięci danych, której podział przedstawia poniższy rysunek.
Rys. 2. Podział wewnętrznej pamięci danych mikrokontrolera 8051.
Podstawową operacją wykonywaną przez mikrokontroler jest cykl rozkazowy, który składa się z określonej liczby cykli maszynowych, wynikającej z dekodowanego rozkazu.
Cykl maszynowy - składa się z sześciu stanów, z których każdy dzieli się na dwie fazy, po jednym takcie zegara każda. Cykl maszynowy jest więc wykonywany w czasie 12 taktów (faz) numerowanych od S1P1 (stan 1, faz 1) do S6P2. Podział cyklu maszynowego pokazano na rys. 3 i 4a, uwzględniając dostępne na zewnątrz układu sygnały: zegarowy XTAL2 oraz ALE, wysyłany dwukrotnie w każdym cyklu (oraz PSEN w przypadku zewn. pamięci programu).
Każdy rozkaz realizowany jest w jednym lub dwu cyklach maszynowych z wyjątkiem mnożenia i dzielenia (4 cykle). ogólnie wyróżnić można cztery typy cykli maszynowych:
cykl wewnętrzny - pobrania i realizacji rozkazu wewnątrz mikrokontrolera (aktywny jest jedynie sygnał ALE dwukrotnie podczas każdego cyklu),
cykl pobrania kodu rozkazu lub argumentu rozkazu z zewnętrznej pamięci programu (aktywne sygnały ALE i PSEN, obydwa dwukrotnie w każdym cyklu maszynowym),
cykl odczytu danych z zewnętrznej pamięci danych (aktywny jest sygnał ALE, lecz tylko raz, PSEN jest nieaktywny, aktywny jest natomiast RD),
cykl zapisu danych do zewnętrznej pamięci danych - sygnały aktywne jak wyżej, przy czym zamiast sygnału RD aktywny jest sygnał WR.
Rys. 3. Przebiegi sygnałów w trakcie realizacji cykli: a).odczytu zewn. pamięci programu, b). odczytu oraz zapisu zewn. pamięci danych.
Rys. 4. Cykl maszynowy: a). sygnały zegarowe, b - f). schematy wykonywania przykładowych rozkazów.
W każdym cyklu maszynowym wykonują się pewne elementarne operacje, przy czym w stanach S1 i S4 jest realizowane odczytywanie pamięci programu. Zazwyczaj w stanie S1 jest pobierany (z komórki o adresie zawartym w liczniku rozkazów) kod rozkazu. W stanie S2 dekodowany jest rozkaz oraz zwiększana o 1 zawartość licznika rozkazów. W kolejnych stanach wykonują się operacje wynikające z treści rozkazu. Jeżeli wykonanie rozkazu wymaga odczytania z pamięci programu np. argumentu lub adresu bezpośredniego, to odbywa się to w stanie S4 - w innym przypadku odczytywanie w stanie S4 jest jałowe.
Dzięki dwukrotnemu czytaniu z pamięci programu w każdym cyklu maszynowym, prawie wszystkie rozkazy są wykonywane w czasie jednego lub dwóch cykli. Widać to na rys.4., na którym przedstawiono schematy wykonania przykładowych rozkazów z różnych grup. Tylko sposób wykonania rozkazów MOVX jest nieco odmienny od pozostałych. W tym przypadku, w drugim cyklu maszynowym jest realizowany dostęp do zewnętrznej pamięci danych - nie ma więc pobierania z pamięci programu. Nie jest też wytwarzany sygnał ALE.
Sygnały sterujące:
ALE - sygnał strobujący adres wysyłany do port P0 (w chwili opadającego zbocza adres jest obecny na porcie P0 i dotyczy najbliższego przesłania) przy każdym odczytywaniu z zewnętrznej pamięci programu oraz przy komunikacji z zewnętrzną pamięcią danych, wysyłany dwukrotnie w każdym cyklu maszynowym,
PSEN - sygnał odczytywania z zewnętrznej pamięci programu, wytwarzany przy każdym pobraniu kodu rozkazu lub argumentu,
RD, WR - sygnały odczytywania i zapisywania do zewnętrznej pamięci danych (wytwarzane w czasie wykonywania rozkazów MOVX).
Odczytywanie z zewnętrznej pamięci programu jest wykonywane przez procesor dwukrotnie w każdym cyklu maszynowym, przy pobieraniu z pamięci kodu rozkazu, argumentu bezpośredniego lub danej. Przebiegi czasowe sygnałów w czasie odczytywania przedstawia rys.5.
Rys. 5. Przebiegi czasowe sygnałów w cyklu odczytu zewnętrznej pamięci programu.
Adres jest wpisywany (z licznika rozkazów) do portów P0 i P2 w stanie S5P1 i w stanie S2P1, gdy ALE = 1. Jest on utrzymywany na P2 do końca odczytywania, a na P0 - do zakończenia (opadającego zbocza) impulsu ALE. Port P0 jest ustawiany jako wejściowy (w stan wysokiej impedancji), a następnie jest wytwarzany sygnał sterujący PSEN. W odpowiedzi układ pamięci wysyła do portu P0 zawartość zaadresowanej komórki. Wczytanie danych przez procesor następuje w stanie S1P1 i S4P1, chwilę przed narastającym zboczem sygnału PSEN, po czym kończy się wysyłanie adresu na P2.
Odczytywanie lub zapisywanie zewnętrznej pamięci danych jest realizowane w drugim cyklu maszynowym, w czasie wykonywania rozkazów MOVX. Przebiegi czasowe sygnałów podczas odczytywania pokazano na rys.6a. Adres komórki zewnętrznej pamięci danych jest wpisywany w stanie S5P1 pierwszego cyklu (gdy ALE = 1):
- tylko do portu P0 (8 - bitowy adres z rejestru R0 lub R1), gdy jest wykonywany rozkaz
MOVX A, @Ri,
- do portów P0 i P2 (16 - bitowy adres z rejestru DPTR), gdy jest wykonywany rozkaz
MOVX A, @DPTR.
Rys. 6. Przebiegi czasowe sygnałów w cyklach: a). odczytu, b). zapisu zewn. pamięci danych.
Adres na P2 jest utrzymywany do końca odczytywania, natomiast na P0 - do zakończenia (opadającego zbocza) impulsu ALE. Port P0 jest ustawiany jako wejściowy (w stan wysokiej impedancji), a następnie jest wytwarzany sygnał sterujący RD. Wczytanie przez procesor danych wejściowych z portu P0 następuje w stanie S3P1, chwilę przed narastającym zboczem sygnału RD.
Przebiegi czasowe sygnałów podczas zapisywania do zewnętrznej pamięci danych pokazano na rys. 6b. Adres jest, jak poprzednio, wysyłany do portu P0 (przy wykonywaniu rozkazu MOVX @Ri, A) lub do portów P0 i P2 (przy wykonywaniu rozkazu MOVX @DPTR, A). Jest on strobowany sygnałem ALE. Następnie do portu P0 są wpisywane dane do zapisania i jest wytwarzany sygnał sterujący WR. Dane do zapisania są obecne na porcie P0 jeszcze chwilę po zakończeniu (narastającym zboczu) impulsu WR.
W cyklu maszynowym, w którym jest wykonywane zapisywanie lub odczytywanie zewnętrznej pamięci danych, w odróżnieniu od każdego innego cyklu, w stanie S1 i S2 nie jest wytwarzany impuls ALE.
Należy też zwrócić uwagę, że czas od chwili wysłania adresu oraz od chwili pojawienia się stanu aktywnego sygnału sterującego do momentu odczytania przez procesor danych wejściowych z portu P0 jest krótszy (o dwa okresy oscylatora) przy odczytywaniu zewnętrznej pamięci programu niż przy odczytywaniu pamięci danych.
Mikrokontroler 8051 posiada 32 linie wejścia - wyjścia, zgrupowane w 4 porty: P0, P1, P2 i P3, umieszczone w przestrzeni adresowej wewnętrznej pamięci danych jako rejestry specjalne (o adresach: 80H, 90H, A0H, i B0H - patrz rys.2). Wszystkie porty są dwukierunkowe - mogą być wykorzystane jako wejścia lub wyjścia bezpośrednie. Do rejestrów portów (bitów) pracujących jako wejścia muszą być wpisane jedynki (po wyzerowaniu do rejestrów wszystkich portów wpisywane są jedynki - porty ustawione są jako wejścia). Tylko port P1 jest przeznaczony do pracy wyłącznie jako bezpośrednie wejście - wyjście. Pozostałe linie, w zależności od konfiguracji systemu i oprogramowania, mogą spełniać również inne funkcje. Przy współpracy z zewnętrzną pamięcią programu lub danych port P0 pełni funkcję wejścia - wyjścia dwukierunkowej multipleksowanej magistrali adresowej (8 mniej znaczących bitów) i danych, a port P2 jest wyjściem 8 bardziej znaczących bitów magistrali adresowej. W takim przypadku porty te nie mogą być wykorzystywane jako wejście - wyjście. Bity portu P3 mogą być użyte do pewnych alternatywnych funkcji (we/wy szeregowe, wejścia przerywające, wejścia zewn. liczników T0 i T1, wyjścia strobujące zapis i odczyt do zewn. pamięci danych).
Układ czasowo - licznikowy zawiera dwa 16 - bitowe liczniki T0 i T1, które mogą zliczać impulsy zewnętrzne, doprowadzone do wejść P3.4 i P3.5, spełniając w ten sposób funkcję licznika. Mogą także zliczać wewnętrzne impulsy zegarowe, w celu odmierzania opóźnień czy generowania przerwań zegarowych o zadanej częstotliwości (taktują także transmisję szeregową poprzez linie portu P3). W takim przypadku spełniają funkcję czasomierza. Poza tym każdy z nich może pracować w jednym z czterech indywidualnie ustawianych trybów.
System przerwań może przyjmować zgłoszenia następujących przerwań:
a). zewnętrznych:
- z wejścia INT0 (zn.IE0),
- z wejścia INT1 (zn.IE1),
b). z układu czasowo - licznikowego:
- przepełnienie licznika T0 (zn. TF0),
- przepełnienie licznika T1 (zn. TF1),
c). z portu szeregowego:
- koniec nadawania znaku (TI) lub koniec odbierania znaku (RI).
Z każdą przyczyną przerwania jest związany wyżej wymieniony znacznik, do którego wpisanie jedynki jest zgłoszeniem przerwania. Wyzerowanie znacznika powoduje skasowanie przerwania. Odbywa się to automatycznie - odpowiednio przy wystąpieniu przyczyny przerwania i przy jego przyjęciu (zn. TI, RI nie są zerowane automatycznie). Wszystkie wymienione znaczniki mogą też być ustawiane i zerowane programowo. System przerwań może być włączany i wyłączany oraz każde zgłoszenie może być indywidualnie zamaskowane przez ustawienie odpowiedniego bitu w słowie sterującym IE (1 - odblokowanie przerwania, 1 - zablokowanie, po restarcie IE = 0). Każde z przerwań, przez ustawienie lub wyzerowanie właściwego bitu w słowie sterującym IP, może być programowo umieszczone na wyższym priorytecie (1) lub niższym (0). W razie jednoczesnego zgłoszenia dwóch przerwań, jako pierwsze będzie przyjęte przerwanie z wyższego poziomu priorytetu. Natomiast, przy jednoczesnym zgłoszeniu kilku przerwań umieszczonych na tym samym poziomie, o kolejności decyduje sztywno ustalony priorytet zgłoszeń (w kolejności od najwyższego: zewn. INT0, od licznika T0, zewn. INT1, od licznika T1, od portu szeregowego). Ponadto, umieszczenie przerwań na danym poziomie priorytetu decyduje o możliwości przerywania programów obsługi innych przerwań. W czasie wykonywania programu obsługi przerwania z niższego poziomu priorytetu będzie przyjęte zgłoszenie przerwania z wyższego poziomu (o ile nie jest zablokowane), a nie będzie przyjęte zgłoszenie przerwania z niższego poziomu. W czasie wykonywania programu obsługi przerwania z wyższego poziomu priorytetu nie będzie przyjęte żadne zgłoszenie przerwania. Program obsługi przerwania z wyższego poziomu jest nieprzerywalny. Jeżeli w słowie IE jest EA = 1 (włączony system przerwań), to w stanie S6 każdego cyklu maszynowego są przeglądane znaczniki nie zamaskowanych przerwań. Wykrycie zgłoszenia powoduje (o ile nie jest spełniony żaden z poniższych warunków), że w następnym cyklu maszynowym rozpocznie się wykonywanie cyklu przyjęcia przerwania o najwyższym priorytecie ze zgłoszonych. Warunki uniemożliwiające przyjęcie przerwania:
wykonywany w danej chwili cykl maszynowy nie jest ostatnim w cyklu rozkazowym; przerwanie zostaje przyjęte po zakończeniu wykonywania bieżącego rozkazu,
w danej chwili wykonywany jest rozkaz RETI lub rozkaz działający na zwartości słów sterujących IE lub IP; przerwanie zostaje przyjęte dopiero po zakończeniu wykonywania następnego rozkazu (jeżeli nie jest to RETI lub rozkaz działający na IP lub IE),
w danej chwili wykonywany jest program obsługi przerwania z poziomu priorytetu wyższego lub równego temu, na którym jest umieszczone zgłoszone przerwanie; zostaje ono przyjęte dopiero po zakończeniu programu obsługi (wykonaniu rozkazu RETI).
Jeżeli co najmniej jeden z warunków jest spełniony, to przyjęcie przerwania zostaje wstrzymane. W następnym cyklu maszynowym następuje ponowne sprawdzenie znaczników zgłoszeń.
Podczas cyklu przyjęcia przerwania są wykonywane następujące operacje:
ustawienie wewnętrznego przerzutnika poziomu przerwania,
wyzerowanie znacznika zgłoszenia przyjętego przerwania (poza TI i RI),
zapisanie na stosie zawartości licznika rozkazów PC,
wpisanie do licznika rozkazów adresu początku programu obsługi przerwania:
0003H - dla przerwania zewnętrznego INT0,
000BH - dla przerwania z licznika T0,
0013H - dla przerwania zewnętrznego INT1,
001BH - dla przerwania z licznika T0,
001BH - dla przerwania z portu szeregowego,
Cykl przyjęcia przerwania jest wykonywany w ciągu dwóch cykli maszynowych. Po jego zakończeniu procesor rozpoczyna realizację kolejnych cykli rozkazowych i wykonuje się program obsługi przerwania. Program obsługi przerwania musi być zakończony rozkazem powrotu z przerwania - RETI. Do chwili wykonania tego rozkazu nie zostanie przyjęte żadne zgłoszenie przerwania z poziomu równego lub niższego niż poziom obsługiwanego przerwania. Wykonanie rozkazu RETI powoduje wyzerowanie przerzutnika poziomu, ustawionego przy przyjęciu przerwania, oraz zdjęcie ze stosu adresu powrotu (2 bajty) i wpisanie go do licznika rozkazów.
Wybrane rozkazy mikrokontrolera 8051:
Rozkaz |
Znaczenie |
B/C |
Kod |
|
OPERACJE ARYTMETYCZNO - LOGICZNE |
||||
ADD A, <s> |
Dodaj do akumulatora wskazany argument, wynik wpisz do akumulatora. |
----- |
----------- |
|
ADD A, Rr |
A <- A + Rr |
1/1 |
28...2FH |
|
ADD A, @Ri |
A <- A + (Ri) |
1/1 |
26,27H |
|
ADD A, ad |
A <- A + (ad) |
2/1 |
25H |
|
ADD A, #n |
A <- A + n |
2/1 |
24H |
|
|
|
|
|
|
ANL <r>, <s> |
Iloczyn logiczny (bit po bicie) wskazanych argumentów, wynik w <r>. |
----- |
----------- |
|
ANL A, Rr |
A <- A ^ Rr |
1/1 |
58...5FH |
|
ANL A, ad |
A <- A ^ (ad) |
2/1 |
55H |
|
ANL A, @Ri |
A <- A ^ (Ri) |
1/1 |
56,57H |
|
ANL A, #n |
A <- A ^ n |
2/1 |
54H |
|
ANL ad, A |
(ad) <- (ad) ^ A |
2/1 |
52H |
|
ANL ad, #n |
(ad) <- (ad) ^ n |
3/2 |
53H |
|
|
|
|
|
|
ORL <r>, <s> |
Suma logiczna (bit po bicie) wskazanych argumentów, wynik w <r>. |
----- |
----------- |
|
ORL A, Rr |
A <- A v Rr |
1/1 |
48...4FH |
|
ORL A, ad |
A <- A v (ad) |
2/1 |
45H |
|
ORL A, @Ri |
A <- A v (Ri) |
1/1 |
46,47H |
|
ORL A, #n |
A <- A v n |
2/1 |
44H |
|
ORL ad, A |
(ad) <- (ad) v A |
2/1 |
42H |
|
ORL ad, #n |
(ad) <- (ad) v n |
3/2 |
43H |
|
|
|
|
|
|
INC <r> |
Zwiększ argument o 1. |
----- |
----------- |
|
INC A |
A <- A + 1 |
1/1 |
04H |
|
INC Rr |
Rr <- Rr + 1 |
1/1 |
08..0FH |
|
INC ad |
(ad) <- (ad) + 1 |
2/1 |
05H |
|
INC @Ri |
(Ri) <- (Ri) + 1 |
1/1 |
06,07H |
|
INC DPTR |
DPTR <- DPTR + 1 |
1/2 |
A3H |
|
DEC <r> |
Zmniejsz argument o 1. |
----- |
----------- |
|
DEC A |
A <- A - 1 |
1/1 |
14H |
|
DEC Rr |
Rr <- Rr - 1 |
1/1 |
18..1FH |
|
DEC ad |
(ad) <- (ad) - 1 |
2/1 |
15H |
|
DEC @Ri |
(Ri) <- (Ri) - 1 |
1/1 |
16,17H |
|
|
|
|
|
|
CLR A |
Wyzeruj akumulator A <- '0'. |
1/1 |
E4H |
|
CPL A |
Neguj akumulator A <- A. |
1/1 |
F4H |
|
SWAP A |
Wymień półbajty w akumulatorze A3..0 <-> A7..4 |
1/1 |
C4H |
|
RL A |
7 <- A 0 /przesuwa w A bity o jedną pozycję w lewo/ |
1/1 |
23H |
|
RR A |
7 -> A 0 /przesuwa w A bity o jedną pozycję w prawo/ |
1/1 |
03H |
|
|
|
|
|
|
PRZESŁANIA |
||||
MOV <r>, <s> |
Ośmiobitowe dane z miejsca wskazanego przez drugi argument są przesyłane do miejsca wskazanego przez pierwszy argument. |
------ |
----------- |
|
MOV A, Rr |
A <- Rr |
1/1 |
E8...EFH |
|
MOV A, ad |
A <- (ad) |
2/1 |
E5H |
|
MOV A, @Ri |
A <- (Ri) |
1/1 |
E6,E7H |
|
MOV A, #n |
A <- n |
2/1 |
74H |
|
MOV Rr, A |
Rr <- A |
1/1 |
F8...FFH |
|
MOV Rr, ad |
Rr <- (ad) |
2/2 |
A8...AFH |
|
MOV Rr, #n |
Rr <- n |
2/1 |
78...7FH |
|
MOV ad, A |
(ad) <- A |
2/1 |
F5H |
|
MOV ad, Rr |
(ad) <- Rr |
2/2 |
88...8FH |
|
MOV ad1, ad2 |
(ad1) <- (ad2) |
3/2 |
85H |
|
MOV ad, @Ri |
(ad) <- (Ri) |
2/2 |
86,87H |
|
MOV ad, #n |
(ad) <- n |
3/2 |
75H |
|
MOV @Ri, A |
(Ri) <- A |
1/1 |
F6,F7H |
|
MOV @Ri, ad |
(Ri) <- (ad) |
2/2 |
A6,A7H |
|
MOV @Ri, #n |
(Ri) <- n |
2/1 |
76,77H |
|
MOV DPTR,#nn |
DPTR <- nn |
3/2 |
90H |
|
|
|
|
|
|
XCH A, <s> |
Zawartość akumulatora jest wymieniana z zawartością wskazanego argumentu. |
------ |
------------ |
|
XCH A, Rr |
A <-> Rr |
1/1 |
C8...CFH |
|
XCH A, ad |
A <-> (ad) |
2/1 |
C5H |
|
XCH A, @Ri |
A <-> (Ri) |
1/1 |
C6,C7H |
|
XCHD A, @Ri |
A3..0 <-> (Ri)3..0 |
1/1 |
D6,D7H |
|
|
|
|
|
|
MOVX |
Zapis lub odczyt zewn. pamięci danych. |
------ |
------------ |
|
MOVX A, @Ri |
A <- (Ri) |
1/2 |
E2,E3H |
|
MOVX @Ri, A |
(Ri) <- A |
1/2 |
F2,F3H |
|
MOVX A, @DPTR |
A <- (DPTR) |
1/2 |
E0H |
|
MOVX @DPTR, A |
(DPTR) <- A |
1/2 |
F0H |
|
|
|
|
|
|
OPERACJE NA BITACH |
||||
CLR bit |
(bit) <- '0' |
2/1 |
C2H |
|
SETB bit |
(bit) <- '1' |
2/1 |
D2H |
|
CPL bit |
(bit) <- (bit) |
2/1 |
B2H |
|
|
|
|
|
|
SKOKI |
||||
AJMP adr11 |
PC10..0 <- adr11 |
2/2 |
01,21H |
|
SJMP d |
PC <- PC + d |
2/2 |
80H |
|
LJMP adr16 |
PC <- adr16 |
3/2 |
02H |
3. Opis stanowiska laboratoryjnego.
Rozkazy do mikrokontrolera przesyła się za pomocą klawiatury komputerowej. Opis klawiszy używanych na stanowisku laboratoryjnym podano niżej:
Klawisz |
Opis |
F1 |
Tryb pracy krokowej |
F2 |
Tryb pracy automatycznej |
F3 |
Tryb wpisywania programu do symulowanej pamięci ROM |
C |
Sygnał zegarowy (CLK) |
R |
Sygnał zerowania (RESET) |
SPACJA |
Start pracy automatycznej wolnej |
G |
Start pracy automatycznej szybkiej |
TAB |
Przełączanie między pamięcią ROM i RAM |
0,1..7 |
Ustawianie bitów danych |
H + x + y
|
Ustawianie bajtu danych (x - starsza część bajtu, y - młodsza część bajtu, x,y = (0, 1 .. 9 ,A ,B .. F) |
4. Pytania kontrolne.
1. Podać definicję cyklu maszynowego i rozkazowego.
2. Wyjaśnić do czego służy sygnał ALE.
3. Wyjaśnić do czego służy sygnał PSEN.
4. Podać kiedy uaktywniane są sygnały RD i WR.
5. Wyjaśnić pojęcie priorytetu przerwań i podać jego kolejność.
6. Podać na czym polega cykl przyjęcia przerwania oraz kolejność operacji wówczas wykonywanych.
7. Podać kiedy przerwanie nie może być przyjęte.
8. Podać czym kończy się podprogram obsługi przerwania i co jest następnie wykonywane.
5. Zadania laboratoryjne.
Ćwiczenie I: Podstawowe cykle pracy mikrokontrolera 8051.
1. W trybie 'F1' zdjąć przebiegi czasowe sygnałów CLK, ALE, PSEN, stan portów P0 i P2 oraz adresy: A 0-7 i A 8-15, w trakcie realizacji jednego z podanych rozkazów:
a). skok bezwarunkowy pod adres 16 - bitowy (adr16):
LJMP adr16 (np. LJMP 0D00Dh ;kod: 02 D0 0D h),
b). załadowanie komórki o adresie bezpośrednim 8 - bitowym (ad) argumentem bezpośrednim 8 - bitowym (n):
MOV ad, #n (np. MOV 90h, #0ABh ; kod: 75 90 AB h),
c). załadowanie rejestru roboczego Rr adresem bezpośrednim 8 - bitowym (ad):
MOV Rr, ad (np. MOV R7, 0EEh ;kod: AF EE h),
d). załadowanie wskaźnika danych DPTR argumentem bezpośrednim 16- bitowym (nn):
MOV DPTR, #nn (np. MOV DPTR, #0E00Eh) ;kod: 90 E0 0E h).
Przygotowanie do kolejnych zajęć:
w trybie 'F3' wprowadzić do symulowanej pamięci programu kod realizowanego rozkazu i po przejściu w tryb 'F2' zaobserwować wykonywanie rozkazu.
W sprawozdaniu:
przedstawić zdjęte przebiegi czasowe,
opisać odpowiednie cykle maszynowe, cykle pobrania kodu rozkazu, adresu lub argumentu wraz z zaznaczeniem pobieranych bajtów (zaznaczyć pobrania jałowe).
Ćwiczenie II: Komunikacja mikrokontrolera 8051 z pamięcią zewnętrzną.
1. W trybie 'F3' wprowadzić do symulowanej pamięci programu wybrany program:
a).
org 0000h
POCZATEK:
MOV R1, #0Bh ; wpis 8 - bitowego argumentu bezpośredniego (będącego ; w tym wypadku adresem wykorzystanym dalej w trybie ; adresowania pośredniego) do rejestru R1
MOV A, #0AAh ; wpis 8 - bitowego argumentu bezpośredniego do akumulatora
MOVX @R1, A ; zapisanie komórki zewnętrznej pamięci danych o adresie ; w rejestrze R1 zawartością akumulatora
MOVX A, @R1 ; odczyt zewnętrznej pamięci danych
MOV P1, A ; przesłanie do portu P1 zawartości akumulatora
MOV P1, #0FFh ; ustawienie portu P1 w stan wysoki
LJMP POCZATEK ; skok do adresu 0000h
Adres Kod Program źródłowy:
hex hex
0000 org 0000h
0000 POCZATEK:
0000 79 0B MOV R1, #0Bh
0002 74 AA MOV A, #0AAh
0004 F3 MOVX @R1, A
0005 E3 MOVX A, @R1
0006 F5 90 MOV P1, A
0008 75 90 FF MOV P1, #0FFh
000B 02 00 00 LJMP POCZATEK
b).
org 0000h
POCZATEK:
MOV DPTR, 0F00Fh ; wpis 16 - bitowego adresu do wskaźnika danych DPTR
MOV A, #0AAh ; wpis 8 - bitowego argumentu bezpośr. do akumulatora
MOVX @DPTR, A ; zapisanie komórki zewnętrznej pamięci danych o adresie ; w DPTR zawartością akumulatora
MOVX A, @DPTR ; odczyt zewnętrznej pamięci danych
MOV P1, A ; przesłanie do portu P1 zawartości akumulatora
MOV P1, #0FFh ; ustawienie portu P1 w stan wysoki
LJMP POCZATEK ; skok do adresu 0000h
Adres Kod Program źródłowy:
hex hex
0000 org 0000h
0000 POCZATEK:
0000 90 F0 0F MOV DPTR, #0F00Fh
0003 74 AA MOV A, #0AAh
0005 F0 MOVX @DPTR, A
0006 E0 MOVX A, @DPTR
0007 F5 90 MOV P1, A
0009 75 90 FF MOV P1, #0FFh
000C 02 00 00 LJMP POCZATEK
2. Przejść do trybu 'F2', uruchomić automatyczne wykonywanie programu i zaobserwować poprawność wykonywania programu.
3. Włączyć sygnał RESET (R) następnie zatrzymać pracę automatyczną, zdjąć sygnał RESET i rozpocząć pracę krokową (pozostając w trybie F2). Po wykonaniu restartu rozpoczyna się wykonywanie wprowadzonego programu. Po trzech pełnych cyklach maszynowych (od S4 do S3) rozpocząć zdejmowanie przebiegów następujących sygnałów (od stanu S4): CLK, ALE, PSEN, RD, WR, A0-7, A8-15, P0 oraz P1. Zdejmowanie przebiegów zakończyć w momencie pojawienia się w porcie P1 wartości AAh.
W sprawozdaniu:
przedstawić zdjęte przebiegi zapisu i odczytu zewnętrznej pamięci danych oraz wpisu do portu P1,
opisać odpowiednie cykle maszynowe wraz z zaznaczeniem cykli odczytu i zapisu zewnętrznej pamięci danych,
porównać długość trwania odczytu zewnętrznej pamięci programu i danych.
Ćwiczenie III: Komunikacja mikrokontrolera 8051 z urządzeniami peryferyjnymi.
Napisać krótkie programy (do 64 bajtów) realizujące podane niżej zadania, wykorzystując wcześniej listą zamieszczoną rozkazów (do każdego z zadań należy starać się używać innych rozkazów):
ustawić w stan wysoki bity P1.0, P1.3, P1.5 i P1.7 portu P1, natomiast pozostałe ustawić w stan niski,
cyklicznie ustawiać na przemian w porcie P1 wartości 55h i 00h,
ustawiać w stan wysoki kolejne bity portu P1 w sposób cykliczny,
ustawiać w stan niski kolejne bity portu P1 w sposób cykliczny.
w sposób cykliczny ustawiać kolejne bity portu P1 w stan niski a następnie w stan wysoki.
VI. Literatura.
[1] Rydzewski Andrzej: „Mikrokomputery jednoukładowe rodziny MCS - 51”,
[2] Jakubiec Jerzy: „Wprowadzenie do techniki mikroprocesorowej”,
[3] Gałka Piotr, Gałka Paweł: „Podstawy programowania mikrokontrolera 8051”.
4.7-13
BADANIE MIKROKONTROLERA 8051
______________________________________________________________________________________
__________________________________________________________________________________________
LABORATORIUM TECHNIKI CYFROWEJ I MIKROPROCESOROWEJ
<r> - miejsce pobrania argumentu
i zapisania wyniku operacji,
<s> - miejsce pobrania drugiego
argumentu operacji,
@ - w mnemoniku poprzedza
adres pośredni,
# - w mnemoniku poprzedza
argument bezpośredni,
Rr - rejestr roboczy, r = 0...7,
Ri - rejestr roboczy - wskaźnik
danych, i = 0,1,
DPTR - wskaźnik danych (DPH,
DPL),
PC - licznik rozkazów,
ad - 8 - bitowy adres bezpośr.,
n - 8 - bitowy argument bezp.,
nn - 16 - bitowy argument bezp.,
bit - 8 - bitowy adres w RAM lub
SFR,
adr 11 - adres 11 - bitowy,
adr 16 - adres 16 - bitowy,
d - 8 - bitowe przesunięcie o
wartościach z przedziału
<-128, 127>,
B/C - liczba bajtów/ liczba cykli
maszynowych.