Badanie układów mikroprocesorowych
Sprawozdanie
Zespół:
Karol Magielnicki
Łukasz Kwiek
Marek Krawczyk
Mateusz Kołodziejczyk
Elektrotechnika 24
Układ 8051 jest jednoukładowym mikrokontrolerem 8-bitowym. Mikrokontroler jest umieszczony w 40-nóżkowej obudowie typu DIL.
Poszczególne końcówki układu mają następujące funkcje:
Końcówki 1-8 (P1.0-P1.7): są to wyprowadzenia uniwersalnego portu wejścia/wyjścia Pi-
Końcówka 9 (RST): jest to końcówka Reset służąca do zerowania mikrokontrolera.
Końcówki 10-17 (P3.0-P3.7): są to wyprowadzenia uniwersalnego portu wejścia/wyjścia P3. Poszczególne końcówki mogą także pełnić inne funkcje -omówione przy opisie portu P3.
Końcówki 18,19 (XTAL1, XTAL2): są to wyprowadzenia służące do podłączenia rezonatora lub zewnętrznego generatora impulsów zegarowych.
Końcówka 20 (GND): wyprowadzenie masy układu.
Końcówki 21-28 (P2.0-P2.7): są to wyprowadzenia uniwersalnego portu
wejścia/wyjścia P2. Port ten pełni również rolę starszego bajtu szyny adresowej przy dostępie do pamięci zewnętrznej.
Końcówka 29 (PSEN'): końcówka informująca o odczycie zewnętrznej pamięci programu.
Końcówka 30 (ALE): sygnał wyjściowy służący do zatrzaskiwania młodszej części adresu przy dostępie do pamięci zewnętrznej.
Końcówka 31 (EA'): stan na tym wejściu określa sposób współpracy z pamięcią programu.
Końcówki 32-39 (P0.0-P0.7): są to wyprowadzenia uniwersalnego portu wejścia/wyjścia PO. Port ten pełni również rolę młodszego bajtu szyny adresowej multipleksowanego z szyną danych podczas dostępu do pamięci zewnętrznej.
Końcówka 40 (Vcc): końcówka zasilania układu. Vcc=5V +/- 0.25V
Mikrokontroler 8051 jest wyposażony w priorytetowy, dwupoziomowy układ przerwań. Układ przerwań jest specjalizowaną strukturą logiczną, której zadaniem jest monitorowanie stanu wskaźników przerwań i zgłaszanie faktu ustawienia określonego wskaźnika do układu sterowania. W mikrokontrolerze 8051 przerwanie może zostać wywołane przez jedno z pięciu wskaźników. Cztery ze wskaźników umieszczone są w rejestrze TCON:
Znaczenie poszczególnych bitów jest następujące:
• TF1 - wskaźnik przerwania od licznika T1 układu czasowego.
• TF0 - wskaźnik przerwania od licznika T0 układu czasowego.
• TR1 , TR0 - sterowanie licznikami T1 i T0 (nie istotne dla układu przerwań).
• IE1 - wskaźnik przerwania zewnętrznego INT1'.
• IE0 - wskaźnik przerwania zewnętrznego INT0'.
• IT0, IT1 - sposób zgłaszania odpowiednich przerwań zewnętrznych:
0 - zgłaszanie niskim poziomem napięcia,
1 -zgłaszanie zboczem opadającym.
Piątym źródłem przerwania jest układ transmisji szeregowej. Przerwanie to jest zgłaszane przez ustawienie dowolnego z bitów RI
lub TI rejestru SCON.
W przypadku przerwań zewnętrznych i od układów czasowych, wskaźniki przerwania są sprzętowo zerowane po przyjęciu zgłoszenia przerwania (za wyjątkiem sytuacji, gdy przerwanie zewnętrzne jest zgłaszane niskim poziomem). Wskaźniki przerwania z układu transmisji szeregowej muszą być zerowane programowo przez procedurę obsługi przerwania, gdyż sprzętowe zerowanie uniemożliwiłoby określenie, który ze wskaźników (RI czy TI) przerwanie wywołał.
Znaczenie bitów rejestru IE:
• EA - ustawienie bitu włącza układ przerwań, wyzerowanie wyłącza układ przerwań (blokuje wszystkie przerwania).
• ES - ustawienie bitu powoduje włączenie obsługi przerwania z układu transmisji szeregowej.
• ET1, ET0 - ustawienie bitów powoduje włączenie obsługi przerwań z odpowiednich liczników (T1 i T0).
• EX1, EX0 - ustawienie bitów powoduje włączenie obsługi odpowiednich przerwań zewnętrznych.
Rejestr IP służy do określenia poziomu poszczególnych przerwań. "0" lub "1" na poszczególnych pozycjach przyporządkowują dane przerwanie do poziomu odpowiednio 0 lub 1.
• PS - ustalanie poziomu priorytetu przerwania z układu transmisji szeregowej.
• PT1 , PT0 - poziomy priorytetów przerwań z odpowiednich liczników.
• PX1 , PX0 - poziomy priorytetów odpowiednich przerwań zewnętrznych.
Podczas realizacji procedury obsługi przerwania poziomu 0 może nastąpić jej przerwanie przez procedurę obsługi przerwania o poziomie 1 - nie może jednak wystąpić sytuacja odwrotna. Nie może również wystąpić wzajemne przerywanie procedur obsługi przerwań z tego samego poziomu.
Dodatkowo podczas realizacji programu może wystąpić jednoczesne zgłoszenie dwóch lub więcej przerwań o tym samym poziomie. Powoduje to wybranie do wykonania przez układ przerwań obsługi przerwania o najwyższym priorytecie według kolejności: INTO' (priorytet najwyższy), TF0, INT1', TF1, RI+TI (priorytet najniższy).
Przyjęcie przerwania powoduje sprzętową generacje rozkazu LCALL z adresem procedury obsługi przerwania, właściwym dla każdego przerwania (patrz "Pamięć programu"). Przyjęcie przerwania jest możliwe jednak tylko wtedy, gdy obecnie nie jest wykonywane przerwanie o równym lub wyższym priorytecie, trwa aktualne wykonywanie jakiegoś rozkazu (układ obsługi przerwania musi poczekać do zakończenia wykonywania tego rozkazu) lub jeżeli jest wykonywany adres powrotu z procedury obsługi przerwania RETI, rozkaz dostępu do rejestrów IE i IP, lub jakikolwiek rozkaz po nich wykonywany.
uVision jest środowiskiem programowania mikrokontrolerów rodziny MCS51. Umożliwia edytowanie, asemblację i symulację pracy mikrokontrolera, podglądanie wszystkich wbudowanych komponentów jak rejestry (ogólnego przeznaczenia, rejestry specjalne, porty) i pamięć. Za jego pomocą możemy zobaczyć jak się będą zachowywać porty, wejścia u wyjścia mikrokontrolera w czasie jego pracy. Przydatną funkcją jest wykonywanie programu krok po kroku, co może nam pomóc w odnajdywaniu i eliminacji błędów. Przed wgraniem programu do mikrokontrolera możemy go dokładnie przetestować, czy działa tak jak chcieliśmy.
Program obliczający sumę dwóch liczb 16-bitowych zapisanych w kodzie U2:
WEJŚCIE:
p0, p2: pierwszy czynnik (p0 - 8 młodszych bitów, p2 - 8 starszych bitów);
p1, p3: drugi czynnik (p1 - 8 młodszych bitów, p2 - 8 starszych bitów);
WYJŚCIE:
p0, p1: suma (p0 - 8 młodszych bitów, p1 - 8 starszych bitów);
p3 - status ('00' - wynik prawidłowy; '-1' - wynik nie mieści się na 16 bitach);
; plik: cw1-1.a51
LJMP start
; rozkaz skoku w obszarze 64kB
; wpisuje do licznika rozkazów adres oznaczony etykietą 'start'
ORG 1000h
; dyrektywa specyfikujaca adres (1000h), pod którym ma zostać
; umieszczona następująca po niej sekcja programu oznaczona
; etykietą 'start'
start:
MOV r0, p0
; wpisz do rejestru r0 zawartość na porcie p0
MOV r1, p1
; wpisz do rejestru r1 zawartość na porcie p1
MOV r2, p2
; wpisz do rejestru r2 zawartość na porcie p2
MOV r3, p3
; wpisz do rejestru r3 zawartość na porcie p3
MOV a, r0
; wpisz do akumulatora zawartość rejestru r0
ADD a, r1
; dodaj do zaw. akumulatora zaw. rejestru r1
; zapisz wynik (r0 + r1) w akumulatorze
PUSH psw
; zapamiętaj zawartość rejestru specjalnego psw na stosie
; zawartość psw opisuje stan wyniku poprzedniej instr.
; (ADD a, r1), takie jak znacznik parzystości/nadmiaru
MOV p0, a
; wypisz na port p0 zawartość akumulatora
MOV a, r2
; umieść w akumulatorze zaw. rejestru r2
POP psw
; pobierz ze stosu zaw. rejestru stanu psw
ADDC a, r3
; dodawanie z przeniesieniem
; a = a + r3 + c, gdzie c (carry) jest 7-bitem w psw i
; jest znacznikiem wyst. przeniesienia z 7 bitu akumulatora
JNB ov, loop
; skocz do etykiety 'loop' jeśli bit ov jest wyzerowany
; ov (overflow) - znacznik nadmiaru będący 2 bitem w psw
MOV p3, #-1
; umieść na porcie p3 wartość '-1' (wystąpiło przepełnienie)
loop:
MOV p1, a
; umieść na porcie p1 zaw. akumulatora (8 starszych bitów wyniku)
END
; koniec programu
Program porównujący dwie liczby 8-bitowe zapisane w kodzie U2:
WEJŚCIE: p0, p1;
WYJŚCIE: p3 - wynik porównania ('1' jeśli p0 <> p1, '0' jeśli p0 = p1 );
; plik: cw1-2.a51
LJMP start
ORG 1000h
start:
MOV r0, p0
; przenieś zaw. portu p0 do rejestru r0
MOV 01h, p1
; przenieś zaw. portu p1 pod adres 01h
MOV a, r0
; przenieś zaw. rejestru r0 do akumulatora
CJNE a, 01h, noteql
; porównaj zaw. akumulatora i pamięci pod adr. 01h
; skocz do etykiety 'noteql' jeśli wartości różne
MOV p3, #0
; wypisz na porcie p3 wartość '0' (p0 = p1)
SJMP stop
; wykonaj skok w obszarze 256kB do etykiety 'stop' (koniec)
noteql:
MOV p3, #1
; wypisz na porcie p3 wartość '1' (p0 <> p1)
stop:
; koniec programu
END
Wykonywanie podprogramów w zależności od stanu jednej z trzech linii (p1.0, p1.1, p1.2) portu p1:
; plik: cw2-1.a51
start:
etykieta1: JB p1.0, etykieta2
; skocz do adresu etykiety 'etykieta2' jesli bit p1.0 ustawiony
; w przeciwnym razie ...
ACALL program1
; wywolaj podprogram w stronie 2kB
; zapisz na stos aktualna wartość PC (Program Counter)
; i skocz do adr. procedury 'program1'
etykieta2: JB p1.1, etykieta3
; skocz do etykiety 'etykieta3' jeśli bit p1.1 ustawiony
; w przeciwnym razie ...
ACALL program2
; wykonaj podprogram 'program2'
etykieta3: JB p1.2, etykieta4
ACALL program3
etykieta4: ACALL start
; wywołaj podprogram 'start' (skocz na początek programu)
; kody poszczególnych podprogramów
; każdy wykonuje trzy puste rozkazy (NOP) zajmujące 1 cykl zegara
; instr. RET (powrot z procedury) pobiera ze stosu PC
; i przekazuje sterowanie do zaw. w nim adresu
program1:
NOP
NOP
NOP
RET
program2:
NOP
NOP
NOP
RET
program3:
NOP
NOP
NOP
RET
END
Działanie obsługi przerwań na przykładzie obsługi przerwania zewnętrznego INT0 sterowanego na porcie p3:
; plik: cw2-2.a51
LJMP main
; procedura obslugi przerwania INT0
SETB 10h
; ustaw bit pod adr 10h
RETI
; powrot z procedury obslugi przerwania (RETurn from Interrupt)
; ustawia PC (Program Counter) na adr. zapamiętany na stosie
; w momencie wystąpienia przerwania
main:
MOV 0a8h, #81h
; załaduj pod adr. 0a8h (rejestr IE - Interrupt Enable) stałą 81h
; ustawia bit EA (IE[7]), co powoduje włączenie obsługi przerwań
; ustawia bit EX0 (IE[0]) - włączenie osbługi przerwania zewn INT0
ANL 088h, #0feh
; ustawia bity rejestru TCON jako iloczyn logiczny zaw. TCON i #0feh
; zeruje bit IT0 (TCON[0) - zgłaszanie przerw. INT0 na niskim
; poziomie napięcia
CLR 10h
; wyczyść bit pod adr. 10h
; następujący ciąg instr. prowadzi do zapętlenia
; o ile nie zostanie zgłoszone przerwanie INT0 na porcie p3
SETB p1.0
CLR p1.0
SETB p1.6
CLR p1.6
SETB p1.7
CLR p1.7
SETB p1.1
CLR p1.1
SETB p1.0
powrot1:
JB p1.0, koniec1
LJMP powrot1
koniec1:
SETB p1.6
powrot2:
JNB p1.6, koniec2
LJMP powrot2
koniec2:
SETB p1.7
powrot3:
JNB p1.7, koniec
LJMP powrot3
koniec: END
Wpisz poniższy program, przeanalizuj jego działanie. Wykonaj program wykorzystując symulator uvision . W sprawozdaniu opisz działanie poszczególnych instrukcji programu wstawiając komentarz do każdej linii.
;program obrazujący działanie licznika T0
;oraz możliwość przerywania programu przy jego użyciu
start: ; rozpoczęcie działania programu
A113: ; etykieta A113
CLR TR0 ; zeruje bit TR0, zatrzymuje pracę licznika T0
CLR TF0 ; zeruje bit TF0, znacznik przepełnienia licznika T0
MOV TL0,#0 ; wpisanie liczby 0 do rejestru TL0
MOV TH0,#254 ; wpisanie liczby 254 do rejetru TH0
MOV P1,#01 ; wyprowadzenie na port P1 liczby 01
SETB TR0 ; ustawienie bitu TR0, uruchomienie licznika T0
A114: ; etykieta A114
MOV C,TF0 ; zapisanie w bicie C wartości bitu TF0
MOV P1.1,C ; wyprowadzenie bitu C na końcówkę 1 portu P1
NOP ; nic nie robi
JNC A114 ; jeżeli znacznik flagi przeniesienia jest równy 0
; to skocz do etykiety A114
JC A115 ; jeżeli znacznik flagi przeniesienia jest równy 1
; to skocz do etykiety A115
;JNB P1.1,A114 ; komentarz
;JB P1.1,A115 ; komentarz
NOP ; nic nie robi
NOP ; nic nie robi
NOP ; nic nie robi
NOP ; nic nie robi
A115: ; etykieta A115
JMP A113 ; skok do etykiety A113
END ; zakończenie pracy programu