POLITECHNIKA LUBELSKA
KATEDRA ELEKTRONIKI
LABORATORIUM PODSTAW SYSTEMÓW MIKROPROCESOROWYCH
SPRAWOZDANIE DO ĆWICZENIA NR. 3
„PAMIĘĆ WEWNĘTRZNA RAM. ORGANIZACJA I WYKORZYSTANIE STOSU.”
Wykonali: Remigiusz Gwiazda ED 5.4
Paweł Luty ED 5.4
Cel ćwiczenia:
Celem ćwiczenia było zapoznanie się z układem pamięci wewnętrznej RAM mikroprocesora typu 8051 oraz jej wykorzystaniem ,a także z organizacją i wykorzystaniem stosu.
Zadanie 1.
Przy użyciu pracy krokowej systemu DSM-51 został przeanalizowany krótki program. Jednocześnie zostały zanotowane zmiany w rejestrze PSW procesora oraz stan wyświetlacza LCD.
Instrukcja |
BIT |
PSW.7 |
PSW.6 |
PSW.5 |
PSW.4 |
PSW.3 |
PSW.2 |
PSW.1 |
PSW.0 |
LCD |
|
FLAGA |
CY |
AC |
F0 |
RS1 |
RS0 |
OV |
- |
P |
- |
LJMP START ORG 100H |
|
|
|
|
|
|
|
|
|
|
START: LCALL LCD_CLR |
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
|
MOV A,#10H |
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
|
LCALL WRITE_HEX |
|
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
10 |
MOV ACC,#20H |
|
1 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
10 |
LCALL WRITE_HEX |
|
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1020 |
LJMP $ |
|
1 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1020 |
Zadanie 2.
W tym zadaniu program z poprzedniego przykładu został tak zmodyfikowany aby zawartość akumulatora była zmieniana poprzez adresowanie bezpośrednie jego wybranych bitów.
Listing zmodyfikowanego programu:
LJMP START
ORG 100H
START:
LCALL LCD_CLR
ANL A,#0H
SETB ACC.4
LCALL LCD_HEX
ANL A,#0H
SETB ACC.5
LCALL LCD_HEX
LJMP $
Instrukcja |
BIT |
PSW.7 |
PSW.6 |
PSW.5 |
PSW.4 |
PSW.3 |
PSW.2 |
PSW.1 |
PSW.0 |
LCD |
|
FLAGA |
CY |
AC |
F0 |
RS1 |
RS0 |
OV |
- |
P |
- |
LJMP START ORG 100H |
|
|
|
|
|
|
|
|
|
|
START: LCALL LCD_CLR |
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
|
ANL A,#0H |
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
|
SETB ACC.4 |
|
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
|
LCALL WRITE_HEX |
|
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
10 |
ANL A,#0H |
|
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
10 |
SETB ACC.5 |
|
1 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
10 |
LCALL WRITE_HEX |
|
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1020 |
LJMP $ |
|
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1020 |
Jak widać w tym przypadku zamiast wpisywać do akumulatora bezpośrednio cały bajt instrukcją MOV A,#XX jego zawartość została zmieniona za pomocą ustawienia jego odpowiednich bitów tak aby bity te reprezentowały pewną liczbę. W wielu przypadkach taki sposób zmieniania zawartości akumulatora oraz innych rejestrów jest szybszy , ale zależy to oczywiście od programu.
Analizując programy w zadaniach 1 i 2 można zauważyć ,że zawartość rejestru PSW zmienia się w momencie wywołania podprogramów, w tym przypadku obsługujących wyświetlacz. Oczywiście jest to spowodowane tym , że same podprogramy wykonując pewne instrukcje zmieniają zawartość PSW. Podczas wywoływania podprogramu LCD_CLR ustawiał się wskaźnik CY, a podczas wywoływania WRITE_HEX dodatkowo ustawiał się także wskaźnik P.
Zadanie 3.
Do akumulatora podobnie jak do pozostałych rejestrów specjalnych można się odwoływać zarówno jak do rejestru 8-bitowego jak też do 8 rejestrów 1-bitowych. Każdy z tych rejestrów posiada własny adres. Dla akumulatora jako całości adres ten jest liczba podzielną przez 8.
Jednocześnie adres jego pierwszego bitu jest taki sam , a adresy pozostałych bitów nie są podzielne przez 8. W programach używa się symbolu „A” gdy adresuje się akumulator jako rejestr 8-bitowy oraz symbolu „ACC” gdy adresuje się jego poszczególne bity.
Zadanie 4.
W zadaniu został przeanalizowany krótki program z wykorzystaniem pracy krokowej.
Instrukcja |
BIT |
PSW.7 |
PSW.6 |
PSW.5 |
PSW.4 |
PSW.3 |
PSW.2 |
PSW.1 |
PSW.0 |
ACC |
LCD |
|
FLAGA |
CY |
AC |
F0 |
RS1 |
RS0 |
OV |
- |
P |
|
- |
B0R7 EQU 7 B1R7 EQU 8+7 B2R7 EQU 10H+7 B3R7 EQU 18H+7 |
|
|
|
|
|
|
|
|
|
|
|
LJMP START ORG 100H |
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
|
0 |
|
START: MOV B0R7,#0 |
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
|
0 |
|
MOV B1R7,#1 |
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
|
0 |
|
MOV B2R7,#2 |
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
|
|
|
MOV B3R7,#3 |
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
|
|
|
LCALL LCD_CLR |
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
21 |
|
MOV A,R7 |
|
0 |
0 |
0 |
0 |
0 |
0 |
0 |
|
0 |
|
LCALL WRITE_HEX |
|
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
21 |
00 |
SETB RS0 |
|
1 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
21 |
00 |
MOV A,R7 |
|
1 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
1 |
00 |
LCALL WRITE_HEX |
|
1 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
19 |
0001 |
SETB RS1 |
|
1 |
0 |
0 |
1 |
1 |
0 |
0 |
1 |
19 |
0001 |
MOV A,R7 |
|
1 |
0 |
0 |
1 |
1 |
0 |
0 |
0 |
3 |
0001 |
LCALL WRITE_HEX |
|
1 |
0 |
0 |
1 |
1 |
1 |
0 |
0 |
FF |
000103 |
CLR RS0 |
|
1 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
FF |
000103 |
MOV A,R7 |
|
1 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
2 |
000103 |
LCALL WRITE_HEX |
|
1 |
0 |
0 |
1 |
0 |
0 |
0 |
1 |
FE |
00010302 |
SJMP $ |
|
|
|
|
|
|
|
|
|
|
|
Zawartości rejestrów w poszczególnych bankach:
BIT |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
BANK 0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
BANK 1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
BANK 2 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
BANK 3 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
W wyniku wykonania programu na wyświetlacz zostały wyprowadzone liczby 00, 01, 03 oraz 02.
Liczby te były zawarte w rejestrach R7 poszczególnych banków od R0 do R3. Program działa w ten sposób, że po uprzedniej zmianie bieżącego banku rejestrów wpisuje do akumulatora zawartość rejestru R7 , a następnie wywołuje procedurę obsługi wyświetlacza ,która wyświetla tą zawartość.
Bieżący bank rejestrów jest zmieniany poprzez ustawienie lub wyczyszczenie odpowiednich bitów RS0 i RS1 w rejestrze PSW. Stan tego rejestru podobnie jak w poprzednich programach ulega zmianie podczas wywoływania podprogramów obsługujących wyświetlacz.
Zadanie 5.
Stosując adresowanie pośrednie można zapełnić pewien obszar pamięci wartością 0EEH np. przy pomocy następującego programu:
ADRES EQU 50H
LICZBA EQU 0EEH
LJMP START
ORG 100H
START: MOV R0,#40H
LOOP : MOV @R0,#LICZBA
DEC R0
CJNE R0,#20H,LOOP
Działanie tego programu polega na tym, że do rejestru R0 wpisuje się wartość liczby, która odpowiada adresowi dowolnej komórki pamięci (w tym wypadku 40H), a następnie za pomocą instrukcji MOV @R0,#LICZBA wpisuje się wartość LICZBA (0EEH) do komórki ,której adres znajduje się w R0. Instrukcja CJNE R0,#20H,LOOP porównuje zawartość R0 z liczbą ,która reprezentuje ilość komórek pamięci ,które chcemy zapełnić. Jeśli wartość ta jest różna to proces wpisywania stałej 0EEH powtarza się aż zapełni się 20 komórek pamięci.
Zadanie 6.
Prosty program ,który ustawia wartość komórki 21 na 3H i wyświetla ją:
KOMORKA EQU 21
SJMP START
ORG 100H
START: LCD_CLR
SETB KOMORKA.0
SETB KOMORKA.1
MOV ACC,KOMORKA
WRITE_HEX
Wnioski:
Zadania od 1 do 7 miały na celu objaśnienie budowy i działania pamięci wewnętrznej mikroprocesora 8051. Pamięć ta ma w wersji podstawowej 128 bajtów z czego cześć jest zajęta przez rejestry specjalne. Używa się jej w wielu programach do przechowywania danych.
Można ją adresować bezpośrednio lub pośrednio tak jak to było pokazane w ćwiczeniu.
Z kolei zadania 8-10 miały za zadanie objaśnienie działania stosu mikroprocesora.
W programach do tych zadań używa się stosu czyli pamięci podręcznej ,która umożliwia szybkie zapamiętywanie i odtwarzanie wartości rejestrów lub komórek pamięci.
Stos zajmuje miejsce w pamięci RAM począwszy od adresu ,który wskazuje wskaźnik stosu czyli rejestr SP. Wskaźnik ten można dowolnie ustawiać wpisując odpowiednią liczbę. Można więc ustalić położenie stosu w pamięci. Należy uważać aby podczas wykorzystywania stosu nie zniszczyć zawartości komórek pamięci ,które mogą mieć swoje adresy w obszarze stosu. Do zapamiętania wartości na stosie służy instrukcja „PUSH” , a do jej odtworzenia instrukcja „POP”.
Stos najczęściej jest używany w podprogramach ,które przechowują wartości rejestrów aby uchronić je przed utratą danych.