POLITECHNIKA ŚLĄSKA
WYDZIAŁ TRANSPORTU
KATEDRA SYSTEMÓW INFORMATYCZNYCH TRANSPORTU
ROK AKADEMICKI 2010/2011
LABORATORIUM Z ELEKTRONIKI
SPRAWOZDANIE Z ĆWICZENIA LAB. NR 9
TEMAT: Pamięć wewnętrzna mikrokontrolera 8051
Data wykonania ćwiczenia lab.: 28.03.2011
GRUPA DZIEKAŃSKA: T 21 B
Michał Kudela
Jaromir Bracki
Piotr Zieliński
KATOWICE, DNIA 03.04.2011
Pamięć wewnętrzna mikrokontrolera 8051.
ROM - Największy rozmiar zbioru obiektu, który może powstać po kompilacji, to
64kB, jakkolwiek znacznie większe rozmiary pamięci ROM (do 1MB - kompilator
Keil, do 4MB - kompilator Raisonance) mogą być obsługiwane w trybie
przełączanych banków pamięci (BANKED) opisanym w dalszej części artykułu.
Zmienne mogą być deklarowane przy użyciu słowa kluczowego code
umieszczającego je w pamięci programu mikrokontrolera. Nazwa zmienne jest tu
myląca, ponieważ zadeklarowana na przykład tablica, może pełnić rolę wzorca –
nigdy zaś zmiennej.
RAM - Dostępne są trzy modele pamięci: SMALL, COMPACT i LARGE.
SMALL - Wszystkie zmienne zostają umieszczone w wewnętrznej pamięci
mikrokontrolera
COMPACT - Zmienne zostają zapamiętane w segmencie pamięci PDATA,
adresowanej przez port P0 (z bankami przełączanymi przez P2). Używany
jest tryb adresowania pośredniego. Wewnętrzne rejestry mikrokontrolera
są w dalszym ciągu używane do przechowywania lokalnych zmiennych i
parametrów.
LARGE - Zmienne i parametry przechowywane są w zewnętrznej pamięci
adresowanej za pośrednictwem @DPTR. Wewnętrzne rejestry
mikrokontrolera w dalszym ciągu używane są do przechowywania
zmiennych i parametrów.
BANKED - (przełączane banki pamięci). Program może zajmować do 1MB -
kompilator Keil lub 4MB - kompilator Raisonance. Pamięć przełączana jest w
formie „stron” o rozmiarze 64kB każda przy pomocy innych niż właściwe dla P0 i
P1 wyprowadzeń mikrokontrolera albo też za pomocą zatrzasków latch
umieszczonych w przestrzeni adresowej, powyżej adresu 0xFFFF. Każdy 64kB blok
pamięci programu musi posiadać ustawiony tak zwany blok wspólny (COMMON
AREA) dla biblioteki funkcji przełączającej banki pamięci.
SMALL - pamięć RAM, 128 bajtów
Używając modelu SMALL, należy zredukować do minimum liczbę zmiennych globalnych
używanych w programie. Pozwoli to programowi linkera na nakładkowanie funkcji w taki
sposób, aby aplikacja pracowała efektywnie. Dla mikrokontrolerów z serii 8052 / 8032
deklaracje zmiennych w przestrzeni IDATA powyżej adresu 0x80 mogą pozwolić aplikacji
na uzyskanie dodatkowej przestrzeni do przechowywania zmiennych. Należy jednak
pamiętać, że obszar ten używany jest również na stos mikrokontrolera.
Model SMALL można także stosować przy kompilacji nawet bardzo dużych programów,
umieszczając obiekty duże i takie, do których nie jest wymagany bardzo szybki dostęp, w
zewnętrznej pamięci RAM. Dobrze jest tam również ulokować zmienne, które muszą być
dostępne w czasie rzeczywistym podczas uruchamiania urządzenia z mikrokontrolerem
przy pomocy emulatora, ponieważ emulatory (takie jak produkowane przez Hitex albo
Raisonance) mają bezpośredni dostęp do tego segmentu pamięci. Ten model najlepszy
jest również dla aplikacji o krytycznym czasie wykonywania, jako że gwarantuje on
najszybszy dostęp do zmiennych i parametrów przez funkcje, podczas gdy duże obszary
danych mogą zostać umieszczone poza układem mikrokontrolera.
COMPACT - pamięć RAM 256 bajtów poza układem, 128 lub256 bajtów w układzie.
COMPACT to model pamięci dostosowany do programów, gdzie dla przykładu wewnętrzny
RAM mikrokontrolera przeznaczony jest na zmienne systemu operacyjnego. Model ten
jest rzadko używany dla całego programu. Najbardziej użyteczna kombinacja to jego
połączenie z modelem SMALL używanym lokalnie dla procedur obsługi przerwań.
COMPACT stosuje się przede wszystkim do programów zawierających dużą liczbę
zmiennych, które nie wymagają krótkiego czasu dostępu. Odbywa się on bowiem za
pomocą instrukcji MOVX A,@Ri wykorzystującej tryb adresowania pośredniego przy
pomocy rejestru R0 lub R1. COMPACT może być również bardzo użyteczny dla aplikacji
wymagających stosu o dużym rozmiarze, co może oznaczać konieczność umieszczenia go
w zewnętrznej pamięci RAM poza układem mikrokontrolera.
LARGE - pamięć RAM do 64kB poza układem, 128 lub 256 bajtów w układzie.
Model LARGE pozwala na niezbyt szybki dostęp do bardzo dużego obszaru pamięci RAM i
jest przypuszczalnie najłatwiejszym do użycia. Podobnie jak poprzednio, niezbyt często
używa się go w odosobnieniu – raczej w połączeniu z modelem SMALL. Tak jak w
COMPACT, nadal używane są rejestry mikrokontrolera.
Opis blokowy programów, które zostały wykonane podczas Laboratorium:
Odliczanie I :
MOV R1, #0FH ;zapisanie do rejestru R1 wartości 15
MOV A, R1 ;zapisanie do akumulatora zawartości R1
MOV R0, A ;zapisanie A w R0
L00 ;etykieta
LCALL LCD_CLR ;wywołanie czyszczenia wyświetlacza
MOV A, R0 ;zapisanie do akumulatora zawartości R0
LCALL WR_HEX ;wywołanie wyświetlenia liczby z akumulatora
MOV A, R0 ;zapisanie do akumulatora zawartości R0
JZ L01 ;skok do L01, gdy akumulator = 0
DEC A ;dekrementacja A
MOV R0, A ;zapisanie A w R0
MOV R1, #0AH ;zapisanie w R1 wartości 10
LCALL DEL_100 ;wywołanie opóźnienia A*ms
LJMP L00 ;skok do etykiety
L01: ;etykieta
CLR P1.7 ;zapalenie diody
L02: ;etykieta
LJMP L02 ;skok do etykiety
.END ;koniec programu
Schemat blokowy:
N
T
Odliczanie II :
MOV R1, #0FH ;zapisanie do rejestru R1 wartości 15
MOV A, R1 ;zapisanie do akumulatora zawartości R1
MOV R0, A ;zapisanie A w R0
L00 ;etykieta
LCALL LCD_CLR ;wywołanie czyszczenia wyświetlacza
MOV A, R0 ;zapisanie do akumulatora zawartości R0
LCALL WR_HEX ;wywołanie wyświetlenia liczby z akumulatora
MOV A, R0 ;zapisanie do akumulatora zawartości R0
JZ L01 ;skok do L01, gdy akumulator = 0
DEC A ;dekrementacja A
MOV R0, A ;zapisanie A w R0
MOV R1, #0AH ;zapisanie w R1 wartości 10
LCALL DEL_100 ;wywołanie opóźnienia A*ms
LJMP L00 ;skok do etykiety
L01: ;etykieta
LJMP L01 ;skok do etykiety
.END ;koniec programu
Schemat blokowy:
N
T
Rejestr :
SETB RS1 ;wybranie banku rejestrów 2
MOV R1, #05H ;zapisanie do rejestru R1 wartości 5
CLR RS1 ;wybranie banku rejestrów 0
MOV R1, #07H ;zapisanie do rejestru R1 wartości 7
LCALL W_KEY ;pobranie numeru klawisza z klawiatury do akumulatora
JZ L01 ;skok do L01, gdy akumulator = 0
SETB RS1 ;wybranie banku rejestrów 2
L00 ;etykieta
MOV A, R1 ;zapisanie do akumulatora zawartości R1
LCALL WR_HEX ;wywołanie wyświetlenia liczby z akumulatora
L00: ;etykieta
LJMP L00 ;skok do etykiety
.END ;koniec programu
Schemat blokowy:
N
T
Odliczanie od wartości zapisanych w rejestrze
SETB RS1 ;wybranie banku rejestrów 2
MOV R1, #05H ;zapisanie do rejestru R1 wartości 5
CLR RS1 ;wybranie banku rejestrów 0
MOV R1, #07H ;zapisanie do rejestru R1 wartości 7
LCALL W_KEY ;pobranie numeru klawisza z klawiatury do akumulatora
JZ L01 ;skok do L01, gdy akumulator = 0
SETB RS1 ;wybranie banku rejestrów 2
L01 ;etykieta
LCALL LCD_CLR ;wywołanie czyszczenia wyświetlacza
MOV A,R1 ;zapisanie do akumulatora zawartości R1
LCALL WR_HEX ;pobranie numeru klawisza z klawiatury do akumulatora
MOV A,R1 ;zapisanie do akumulatora zawartości R1
JZ LOO ;skok do L01, gdy akumulator = 0
DEC A ;dekrementacja A
MOV R1,A ;zapisanie A w R1
MOV A,#OAH
LCALL DEL_100 ;wywołanie opóźnienia A*ms
LJMP L01
LJMP L00
L00:
LJMP L00
.END
Schemat blokowy
N T
T
N
N
T
Odliczanie od 00H do 0FH
L04:
MOV R1, #00H ;zapisanie do rejestru R1 wartości 15
MOV A, R1 ;zapisanie do akumulatora zawartości R1
MOV R0, A ;zapisanie A w R0
L00 ;etykieta
LCALL LCD_CLR ;wywołanie czyszczenia wyświetlacza
MOV A, R0 ;zapisanie do akumulatora zawartości R0
LCALL WR_HEX ;wywołanie wyświetlenia liczby z akumulatora
MOV A, R0 ;zapisanie do akumulatora zawartości R0
INC A
MOV R0, A ;zapisanie A w R0
MOV A, #05H ;zapisanie w R1 wartości 10
LCALL DEL_100 ;wywołanie opóźnienia A*MS
MOV A, R0
SUBB A, #0FH
JZL01
LJMP L00 ;skok do etykiety
L01
LCALL W_KEY
JZL04
L02: ;etykieta
LJMP L02 ;skok do etykiety
.END ;koniec programu
Schemat blokowy :
T
N
T N
WNIOSKI:
Opis działania programów, które zostały wykonane podczas Laboratorium:
Program wyświetla 0F przez ok. 1 sekundę, a następnie odlicza do zera wstecz. Dioda zapala się od razu po osiągnięciu wartości zerowej licznika i świeci bezustannie, aż do momentu zakończenia programu.
Program wyświetla 0F przez ok. 1 sekundę, a następnie odlicza do zera wstecz. Dioda nie zapala się po osiągnięciu wartości zerowej licznika.
Program po wciśnięciu klawisza „0” wyświetla „07” natomiast po wciśnięciu innego dowolnego klawisza wyświetla „05”.
Program liczy wstecz z interwałem jednej sekundy do zera od jednej z dwóch wartości zapisanych w rejestrach R1( naciśniecie o powoduje wybór banku 0 , naciśniecie każdego innego wybór banku 2)
Program liczy w przód od 00H do 0FH z interwałem 0,5 sekundy i wyświetla wynik na wyświetlaczu LCD