Mikrokontrolery cz8


Też to potrafisz
T
e
ż
t
o
p
o
t
r
a
f
i
s
z
Mikrokontrolery?
W kolejnym odcinku naszego cyklu
o mikrokontrolerach 8051 kontynuu-
jemy szczegółowy opis instrukcji
To takie proste...
procesora ze zwróceniem uwagi na
składnię instrukcji oraz skrótowe
przykłady zastosowania. Podczas
analizy z pewnością przyda się za-
mieszczona we wkładce poprzed-
niego numeru EdW, tabela ze spi-
sem wszystkich instrukcji. I choć
dzisiejszy odcinek może wydać się
nieco monotonny, to trzeba pamię-
tać, że nauka każdego języka, tak
porozumiewania się jak i programo-
Część 8
wania inteligentnych układów elekt-
ronicznych jest niezbędna każdemu Asembler  język maszynowy procesora
elektronikowi - hobbyście.
Kontynuując opis instrukcji przedsta- . We wszystkich przypadkach (oprócz  kod: 1 1 1 0 0 1 1 i stąd: E6h, E7h
 cykle: 1 bajty: 1
wimy kolejno grupę najważniejszych in- jednego) argumentami instrukcji MOV są
 przykład:
strukcji dotyczących przemieszczania da- wyrażenia 8 bitowe: rejestry, dane adre-
;przed wywołaniem
nych w strukturze rejestrów procesora. sy pośrednie itp. Jedynie załadowanie
instrukcji R1 zawiera
Dodatkowe instrukcje umożliwiające sko- 16 bitowego wskaznika adresu DPTR
wartość 34h
ki warunkowe oraz wywoływanie pod- wymaga odpowiedniego 16 bitowego
MOV A, @R1 ;załadowanie zawartości
programów, przedstawimy w ostatniej, (stałej) argumentu. komórki o adresie 34h do
;akumulatora
trzeciej części opisu asemblera. Poniżej opiszemy wszystkie możliwe
przypadki użycia instrukcji MOV.
MOV A, #dana
Operacje przemieszczenia
 instrukcja załadowania 8 bitowej liczby
MOV A, Rn
danych
 dana do akumulatora
 do akumulatora zostaje załadowana zawar-
1. Instrukcja MOV
A < dana
tość rejestru Rn
Instrukcją służącą do przekazywania
kod: 0 1 1 1 0 1 0 0 74h
A < Rn
danych pomiędzy rejestrami procesora
 cykle: 1 bajty: 2 (kod instrukcji:
 kod: 1 1 1 0 1 n2 n1 n0 gdzie n2...n0
74h + dana)
M
O
V
pamięcią wewnętrzną jest:  MOV (ang.
wskazują na R0...7 stąd: E8h EFh
 przykład:
 cykle: 1 bajty: 1
 move  przesuń, przenieś)
 przykład: MOV A,#100 ;załadowanie do
W zależności od tego co i gdzie
MOV R7,#0 akumulatora liczby 100
 przenosimy , polecenie to może mieć
MOV A, R7 ;wyzerowanie akumulatora
kilkanaście różnych postaci w zależności
......
MOV Rn, A
od zastosowanych argumentów. Jedno-
 do rejestru Rn (R0...R7) zostaje załadowana
MOV A, adres
cześnie warto wiedzieć, że polecenie to
zawartość akumulatora
 do akumulatora zostaje załadowana zawar-
Rn < A
w praktyce nie powoduje dosłownego
tość komórki wewnętrznej pamięci RAM
 kod: 1 1 1 1 1 n2 n1 n0 gdzie n2...n0
 przemieszczenia danej, lub zawartości
o adresie:  adres
wskazują na R0...7 stąd: F8h FFh
rejestru, ale jej skopiowanie ze zródła do
A < (adres)
 cykle: 1 bajty: 1
miejsca przeznaczenia.  kod: 1 1 1 0 0 1 0 1 E5h
 przykład:
 cykle: 1 bajty: 2 (kod instrukcji E5h
Ogólne instrukcję MOV można zapi-
MOV R3, A ;przepisanie zawartości
+ 8 bitowy adres)
sać jako:
akumulatora do rejestru R3
 przykład:
MOV
M
O
V
<
d
>
<
s
>
MOV A, 20h ;załadowanie do A
MOV Rn, adres
gdzie: jest miejscem przeznaczenia
zawartości komórki
 do rejestru Rn (R0...R7) zostaje załadowana
 tam dokąd ma być skopiowana dana ze o adresie 20h
zawartość komórki o adresie  adres
zródła (ang.  destination ) , a zród-
Rn < (adres) gdzie n = 0...7
MOV A, @Ri
łem pobrania danej (ang.  source ).
 kod: 1 0 1 0 1 n2 n1 n0 gdzie n2...n0
 do akumulatora zostaje załadowana zawartość ko-
W wyniku wykonania instrukcji MOV za-
mórki wewn. RAM, której adres znajduje się w re- wskazują na R0...7 stąd: A8h AFh
wartość zródła zostaje umieszczona
jestrze R0 (i=0), lub R1 (i=1)  cykle: 1 bajty: 2 (kod instrukcji + adres)
(skopiowana) w obiekcie przeznaczenia A < (Ri) gdzie i = 0 lub 1  przykład:
ELEKTRONIKA DLA WSZYSTKICH 12/97 37
Też to potrafisz
T
e
ż
t
o
p
o
t
r
a
f
i
s
z
MOV R4, 65h ;załadowanie do rejestru MOV 45h, #100;komórce o adresie 45h
o konkretnym zdarzeniu. Ponieważ takie
R4 zawartości komórki zostaje nadana wartość 100
komunikaty są z reguły niezmienne,
o adresie 65h
w praktyce programista umieszcza je
MOV @Ri, A
w kodzie programu (pamięci stałej).
MOV Rn, #dana  do komórki o adresie znajdującym się w re-
Dzięki takiemu działaniu instrukcja
 do rejestru Rn (R0...R7) zostaje wpisana jestrze R0 (i=0) lub R1 (i=1) zostaje wpisana
8 bitowa liczba zawartość akumulatora MOVC umożliwia odczytanie całego kodu
M
O
V
C
Rn < dana gdzie n = 0...7 (Ri) < A
programu użytkownika, co często w prakty-
 kod: 0 1 1 1 1 n2 n1 n0 gdzie n2...n0  kod: 1 1 1 1 0 1 1 i gdzie i = 0 lub 1
ce nie jest pożądane, bo pozwala na np.
wskazują na R0...7 stąd: 78h 7Fh stąd: F6h, F7h
 nielegalny odczyt i skopiowanie przez
 cykle: 1 bajty: 2 (kod instrukcji + dana)  cykle: 1 bajty: 1
osobę niepowołaną ( hackera ) programu
 przykład: jeżeli chcemy np. wpisać do rejes-  przykład:
CLR A ;wyzerowanie akumulatora
tru R6 liczbę 16 można wydać komendę utworzonego przez programistę. Jest to
MOV @R1, A ;wyzerowanie komórki
MOV R6, #10h ;10h szesnastkowo to 16
oczywiście naruszeniem praw autorskich
o adresie w R1
dziesiętnie
danego projektu, ale łamiącemu prawo pi-
ratowi pozwala np. na powielenie ciekawe-
MOV @Ri, adres
MOV adres, A
 do komórki o adresie  adres zostaje wpi-  do komórki o adresie znajdującym się w re- go urządzenia (np. sterownika) bez zgody
jestrze R0 (i=0) lub R1 (i=1) zostaje wpisana
sana zawartość akumulatora jego autora. Na szczęście procesor 8051
zawartość komórki o adresie  adres
(adres) < A
i wszystkie z jego rodziny mają wbudowa-
(Ri) < (adres)
 kod: 1 1 1 1 0 1 0 1 F5h
ne mechanizmy sprzętowego zabezpiecze-
 cykle: 1 bajty: 2 (kod instrukcji + adres)  kod: 1 0 1 0 0 1 1 i gdzie i = 0 lub 1
nia przed taką sytuacją. Istnieje bowiem
stąd: A6h, A7h
 przykład:
możliwość permanentnego zablokowania
MOV 00h, A ;wpisanie zawartości  cykle: 2 bajty: 2 (kod instrukcji + adres)
M
O
V
C
instrukcji MOVC wywoływanej z zewnę-
akumulatora do komórki  przykład:
MOV R0, #11h
o adresie 0
trznej pamięci programu (napisanego np.
MOV @R0,10h ;przepisanie zawartości
;instrukcja równoznaczna
przez hackera). Sytuacja ta dotyczy oczy-
komórki o adresie 10h do
zapisowi MOV R0, A w
wiście aplikacji wykorzystujących proceso-
komórki
;przypadku gdy
ry z wewnętrzną pamięcią programu (87xx,
;sąsiedniej o adresie 11h
aktywnym zbiorem rej.
roboczych jest 0. 89xx) gdzie przezorny programista umieścił
MOV @Ri, #dana
kod programu w wewnętrznej pamięci pro-
 do komórki o adresie znajdującym się w re-
MOV adres, Rn
gramu, uniemożliwiając tym skopiowanie
 do komórki o adresie  adres zostaje wpi- jestrze R0 (i=0) lub R1 (i=1) zostaje wpisana
go przez osoby niepowołane. W przypadku
wartość stała (liczba)
sana zawartość rejestru Rn (R0...R7)
aplikacji z kodem programu umieszczone-
(Ri) < dana
(adres) < Rn gdzie n = 0...7
 kod: 1 0 0 0 1 n2 n1 n0 gdzie n2...n0  kod: 0 1 1 1 0 1 1 i gdzie i = 0 lub 1 go w zewnętrznej pamięci programu (np.
stąd: 76h, 77h
 wskazują na R0...7 stąd: 88h 8Fh
EPROM) nie istnieje możliwość zabezpie-
 cykle: 2 bajty: 2 (kod instrukcji + adres)  cykle: 1 bajty: 2 (kod instrukcji + dana)
czenia programu  hacker może w po pros-
 przykład:
 przykład:
tu wyjąć z układu pamięć EPORM (ROM)
MOV @R0, #255 ;jeżeli wcześniej
MOV 30h, R5 ;wpisanie do komórki
i odczytać ją na dowolnym programatorze
rejestr R0 miał
w wew. RAM zawartości
wartość np. 30h, to w (bez stosowania instrukcji MOVC) .
rejestru ;R5.
;efekcie tej operacji
do komórki o adresie
MOV adres1, adres2
MOVC A, @A+DPTR
30h zostanie
 przepisanie zawartości komórki o adresie
 do akumulatora zostaje załadowana dana z pa-
; wpisana liczba 255
 adres2 do komórki o adresie  adres1
mięci programu spod adresu będącego sumą
(adres1) < (adres2)
bieżącej wartości wskaznika danych DPTR i za-
MOV DPTR, #dana16
 kod: 1 0 0 0 0 1 0 1
wartości akumulatora. Najpierw procesor two-
 cykle: 2 bajty: 3 (kod instrukcji + adres2  instrukcja załadowania 16 bitowego, bez-
rzy 16 bitowy adres poprzez dodanie DPTR
względnego adresu do wskaznika danych
+ adres1)
i A potem pobiera spod tego adresu daną (bajt
DPTR
 przykład:
kodu programu) i umieszcza ją z akumulatorze.
DPTR < dana16 gdzie  dana16 jest
MOV 7Fh, 7Eh ;przepisanie zawartości
A < (A + DPTR)
liczbą 16 bitową (zakres: 0...FFFFh)
dwóch sąsiadujących
 kod: 1 0 0 1 0 0 1 1 93h
 kod: 1 0 0 1 0 0 0 0 90h
komórek w
 cykle: 2 bajty: 1
;wew. RAM procesora  cykle: 2 bajty: 3 (kod instrukcji + starszy
 przykład:
bajt + młodszy bajt liczby  dana16 )
MOV DPTR, #tablica ;załadowanie
 przykład:
MOV adres, @Ri
adresu tablicy
 do komórki o adresie  adres zostaje wpi- MOV DPTR,#0 ;wyzerowanie wskaznika
do wskaznika
danych
sana zawartość komórki której adres
DPTR
znajduje się w rejestrze R0 (i=0) lub R1 (i=1)
MOV A,#3 ;pobierz czwarty
(adres) < (Ri)
2. Instrukcja MOVC element tablicy
 kod: 1 0 0 0 0 1 1 i gdzie i = 0 lub 1
(nie trzeci, bo od
M
O
V
Podobną do instrukcji MOV jest
stąd: 86h, 87h
;elementy są
MOVC. Służy ona także do przemieszcza-
M
O
V
C
 cykle: 2 bajty: 2 (kod instrukcji + adres)
numerowane
nia danych z tym że przemieszczanie do-
 przykład:
od zera)
tyczy tylko pobierania danych (bajtów)
MOV R1, #32
MOVC A, @A+DPTR ;pobranie
MOV 32h, @R1 ;przepisanie zawartości znajdujących się w kodzie programu, czy- elementu 
komórki o adresie 32h na nia litera  A
li w wewn. lub zewnętrznej pamieci pro-
;samą (fizycznie operacja ....... ;gdzie tablica
gramu procesora. W praktyce instrukcję
ta nie ma efektu) może być
tę wykorzystuje się do pobierania danych
zdefiniowana
stałych (np. tablic przy konwersji arytme-
MOV adres, #dana w programie
 do komórki o adresie  adres zostaje wpi- tycznej lub logicznej. Innym często spoty- jako np.:
sana wartość stałą (8 bitowa liczba) tablica DB  WITAJ KOLEGO!
kanym przypadkiem jest generowanie
(adres) < stała
standardowych komunikatów (teksto-
 kod: 0 1 1 1 0 1 0 1 75h MOVC A, @A+PC
wych) np. na wyświetlaczach LCD
 cykle: 2 bajty: 3 (kod instrukcji + adres  do akumulatora zostaje załadowana dana
w określonych sytuacjach pracy proceso-
+ dana) z pamięci programu spod adresu będącego
 przykład: ra w celu poinformowania użytkownika sumą wartości: licznika rozkazów PC (na-
38 ELEKTRONIKA DLA WSZYSTKICH 12/97
Też to potrafisz
T
e
ż
t
o
p
o
t
r
a
f
i
s
z
stępnej po tej instrukcji) i zawartości aku- A < (DPTR) tu P2 procesora, co w wielu przypadkach
mulatora. W praktyce przy wykonaniu tej in-  kod: 1 1 1 0 0 0 0 0 E0h jest wręcz niezbędne. Można by oczywiście
strukcji, adres pobrania jest równy sumie  cykle: 2 bajty: 1 zaadresować tę pamięć za pomocą instrukcji
zawartości akumulatora oraz wartości liczni-  przykład: MOVX A, @DPTR (podając wtedy adres
ka rozkazów  będzie to adres następnej po aby odczytać zawartość komórki z zewn. MOV DPTR, #0124h), ale wtedy zniszczeniu
MOVC instrukcji. RAM o adresie np. 1240h nalezy wykonać uległy by stany pozostałych, nie dołączonych
A < (A + PC) instrukcje: do pamięci, końcówek portu P2.
 kod: 1 0 0 0 0 0 1 1 83h MOV DPTR, #1240h ;załadowanie
 cykle: 2 bajty: 1 adresu (16 bit) do MOVX @Ri, A
 przykład: wskaznika DPTR  do obszaru zewnętrznej pamięci danych
CLR A ;wyzerowanie akumulatora MOVX A, @A+DPTR ;i odczyt danej spod o adresie znajdującym się w rejestrze Ri (R0
MOVC A, @A+PC ;pobranie do tego adresu gdy i=0 lub R1 gdy i=1) zostaje przesłana za-
...... ;dana znajduje się
akumulatora kodu wartość akumulatora. Innymi słowy jest to
w akumulatorze
rozkazu NOP (00h) zapis do zewnętrznej pamięci danych.
NOP (Ri) < A gdzie Ri = R0, lub R1
MOVX @DPTR, A
......  kod: 1 1 1 1 0 0 1 i gdzie i = 0,1
 do komórki zewnętrznej pamięci danych
stąd: F2, F3
o podanym w DPTR adresie zostaje przesła-
 cykle: 2 bajty: 1
3. Instrukcja MOVX
na zawartość akumulatora  innymi słowy
 przykład:
M
O
V
X
Instrukcja MOVX służy do przesyłania
jest to operacja zapisu do zewnętrznej pa-
wezmy sytuacje z poprzedniego przykładu,
danej pomiędzy akumulatorem a zewnęt-
mięci danych.
ale tym razem chcemy zapisać daną znajdu-
rzną pamięcią danych. Wykonanie tej in- (DPTR) < A
jącą się w akumulatorze do komórki o adre-
 kod: 1 1 1 1 0 0 0 0 F0h
strukcji uaktywnia sygnały /RD (przy od- sie 00h na stronie 7 (innymi słowy fizyczny
 cykle: 2 bajty: 1
adres komórki będzie równy: 0700h), w tym
czycie z zewnętrznej pamięci) lub /WR
 przykład:
celu należy wykonać ciąg instrukcji:
(przy zapisie) procesora  piny P3.7 i P3.6.
aby zapisać daną w obszarze zewnętrznej
SETB P2.2 ;ustawienie linii
Dodatkowo porty P0 i P2 pełnią wtedy ro-
pamięci danych pod adresem np. 8000h na-
adresowej A10
lę magistrali systemowej dzięki której wy- leży wykonać instrukcje:
SETB P2.1 ;ustawienie linii
MOV A, ...... ;w miejsce kropek należy
stawiany jest adres oraz przekazywana adresowej A9
wpisać zródło danej
SETB P2.0 ;ustawienie linii
dana do zewnętrznej pamięci danych.
MOV DPTR, #8000h ;podajemy też
adresowej A8 (strona: 7)
Jak już zapewne wiesz z poprzednich
adres zapisu
MOV R1, #00h ;załadowanie
odcinków naszego cyklu zewnętrzna pa-
MOVX @DPTR,A ;i zapisujemy
adresu komórki
mięć danych można zaadresować w dwo-
daną w zewn.
do wskaznika
pamięci
jaki sposób. MOVX @R1, A ;i zapisane danej
z akumulatora
Pierwszą metodą jest użycie pełnego
w zewn. RAM
16 bitowego adresu. W takim przypadku
......
Tryb stronicowania
procesor odczytując lub zapisując daną
(niepełnego adresu)
w tej pamięci (właśnie dzięki instrukcji
MOVX) młodszą część adresu zatrzaskuje
4. Instrukcje przesyłania wymiany danych
MOVX A, @Ri
w zewnętrznym latch u (np. 74573), star-
 do akumulatora zostaje przesłana zawartość
ze stosem
szą wystawia na port P2.
komórki w obszarze zewn. pamięci danych
PUSH adres
Często jednak używana kostka pamię- spod adresu znajdującego się w rejestrze  ang.  push onto stack , prześlij na stos
R0 (i=0) lub R1 (i=1): adres 8 bitowy  w wyniku tej operacji zawartość wskaznika
ci SRAM jest mniejszej pojemności
A < (Ri) gdzie Ri = R0, lub R1
stosu SP jest zwiększana o 1, po czym na
i większość linii adresowych starszego
 kod: 1 1 1 0 0 0 1 i gdzie i = 0,1
wierzchołek stosu (adresie w wew. RAM
bajta (adresu) nie jest wykorzystana do
stąd: E2, E3
wskazywanym przez SP) zostaje zapisana
sterowania pamięcią. W takim przypadku  cykle: 2 bajty: 1
zawartość komórki z wew. RAM o podanym
adresie bezpośrednim  adres . Innymi sło-
możliwe jest adresowanie pamięci za po-  przykład:
niech w układzie z procesorem 8951 pracu- wy wykonywana jest operacja  przesłania
mocą tzw.  stronicowania . Ten sposób
jącym z wewn. pamięcią programu znajduje
na stos .
omówiliśmy już w poprzednich odcin-
się zewnętrzna pamięć danych w postaci
SP < SP + 1, (SP) < (adres)
kach szkoły mikroprocesorowej. Jak za-
kostki SRAM 2kB  typ 6116.
 kod: 1 1 0 0 0 0 0 0 C0h
pewne pamiętasz w takim trybie adreso- Linie adresowe A0...A7 tej pamięci są dołą-  cykle: 2 bajty: 2 (kod instrukcji
C0h + adres)
wania procesor przy obsłudze zewnętr- czone do zatrzasku młodszej części adresu
szyny procesora (patrz poprzednie odcinku  przykłady:
znej pamięci danych wystawia tylko
cyklu). Trzy starsze linie A8...A10 są dołą- PUSH ACC ;przesłanie akumulatora
młodszą część adresu (A0...A7), nato-
czone np. do pinów P2.0, P2.1 i P2.2 proce-
na stos
miast port P2 nie jest modyfikowany, co
sora, pozostałe końcówki portu P2
PUSH B ;przesłanie rejestru B
pozwala użytkownikowi na pełna kontro- (P2.2...P2.7) są wykorzystywane np. do ste- na stos
rowania przekaznikami jakiegoś urządzenia
lę sposobu i kierunku ustawienia jego PUSH 20h ;przesłanie zawartości
zewnętrznego. Aby odczytać daną z tej pa- komórki o adresie 20h
końcówek  a więc jest metodą na mak-
mięci np. spod adresu 24h na stronie pierw- na stos
symalne wykorzystanie cechy  jed-
szej (strony liczone od 0 do 7, bo 2kB / 256 PUSH DPH ;przesłanie 16 bitowego
noukładowości procesora.
= 8 stron) należy wykonać instrukcje: wskaznika danych na stos
I tak dwa wspomniane dwa tryby ad- CLR P2.2 ;wyzerowanie linii PUSH DPL ;w dwóch instrukcjach,
adresowej A10
resowania zewnętrznej RAM maja swoje starsza i młodsza część
CLR P2.1 ;wyzerowanie linii DPTR
odzwierciedlenie w liście instrukcji z wy-
adresowej A9 .....
korzystaniem rozkazu MOVX, oto one.
SETB P2.0 ;ustawienie linii
adresowej A8 (strona: 1) POP adres
Tryb pełnego adresu
MOV R1, #24h ;załadowanie  ang.  pop from stack , zdejmij ze stosu
(16 bitowego) adresu komórki  w wyniku tej operacji dana znajdująca się
do wskaznika pod adresem w wewn. RAM określonym
MOVX A, @DPTR MOVX A, @R1 ;i przesłanie jej zawartości w SP zostaje wpisana do komórki o poda-
 do akumulatora zostaje załadowana dana do akumulatora nym adresie bezpośrednim  adres . Na-
(bajt) z zewnętrznej pamięci danych (odczyt ...... stępnie wskaznik stosu SP zostaje zmniej-
z zewnętrznej pamięci danych) spod adresu Zauważ że przy takim zaadresowaniu pamię- szony o 1. Innymi słowy wykonywana jest
w DPTR ci nie uległy modyfikacji piny P2.3...P2.7 por- operacja  zdjęcia ze stosu .
ELEKTRONIKA DLA WSZYSTKICH 12/97 39
Też to potrafisz
T
e
ż
t
o
p
o
t
r
a
f
i
s
z
(adres) < (SP), SP < SP  1 A3 0 < > (Ri)3 0 e) przykład:
 kod: 1 1 0 1 0 0 0 0 D0h  kod: 1 1 0 1 0 1 1 i gdzie i = 0,1 SETB C
 cykle: 2 bajty: 2 (kod instrukcji stąd: D6h, D7h ADDC A,#0 ;inkrementacja
D0h + adres)  cykle: 1 bajty: 1 akumulatora
 przykład: jeżeli w poprzednim przykładzie  przykład: z wykorzystaniem C
załadowaliśmy na stos rejestry w w/w kolej- MOV A, #5Ah ....
ności, to aby poprawnie je odtworzyć nale- MOV @R1, #A5h
ży zdjąć je w kolejności odwrotnej, czyli: CLR bit
XCHD A, @R1
POP DPL
.... ;teraz w akumulatorze a) ang.  clear bit , zeruj bit
POP DPH ;odtworzenie wskaznika
będzie liczba 55h, a pod b) w wyniku tej operacji wyzerowany zostaje
DPTR
;adresem @R1 liczba AAh bit którego adres podany jest bezpośrednio
POP 20h ;następnie komórki
(bit) < 0
o adresie 20h
c) kod: 1 1 0 0 0 0 1 0 C2h
Operacje na bitach
POP B ;i rejestru B
d) cykle: 1 bajty: 2 (instrukcja C2 + adres bitu)
Do tej pory omawialiśmy instrukcje
POP ACC ;wreszcie akumulatora
e) przykład:
operujące na bajtach danych. Procesor
....
CLR AFh ;zablokowanie systemu
8051 i mu pochodne zawiera bardzo po-
przerwań (EA w słowie
mocny zestaw instrukcji do wykonywa-
IE = 0)
....
nia operacji na pojedynczych bitach.
5. Dodatkowe instrukcje przemieszczania
Przykład ten można także zapisać w postaci
Dzięki temu możliwe jest wykonanie
danych
CLR EA
XCH A, Rn
wielu często niezbędnych operacji, jed-
 ang.  exchange register with accumulator ,
na z nich było omówione wcześniej stro-
SETB bit
wymień akumulator z rejestrem
nicowanie zewnętrznej pamięci danych
a) ang.  set bit , ustaw bit
 w wyniku tej operacji zawartość akumulato-
(przykład z instrukcją MOV @Ri,A). Trze- b) w wyniku tej operacji ustawiony zostaje bit
ra zostaje wymieniona z zawartością rejest-
którego adres podany jest bezpośrednio
ba wiedzieć że większość rejestrów
ru Rn (R0...R7), wymieniona tzn. że liczba
(bit) < 1
znajdująca się w A znajdzie się w Rn, i od- specjalnych SFR procesora posiada
c) kod: 1 1 0 1 0 0 1 0 D2h
wrotnie.
możliwość bezpośredniego adresowa-
d) cykle: 1 bajty: 2 (instrukcja + adres bitu)
A< > Rn
nia ich bitów. I tak np. akumulator (A)
e) przykład:
 kod: 1 1 0 0 1 n2 n1 n0 gdzie n2...n0
SETB P1.2 ;ustawienie wysokiego
składa się z 8 miu adresowanych bitów
wskazują na R0...7 stąd: C8h CFh
poziomu logicznego
 cykle: 1 bajty: 1 Acc.7 ... Acc.0
;na wyprowadzeniu
 przykład:
Toteż aby np. ustawić wybrane bity te-
2 portu P1 (pin 3 procesora)
MOV A, #10 ;nadanie wartości
go rejestru nie trzeba modyfikować całoś-
akumulatorowi
ci a jedynie wyzerować lub ustawić wy- CPL C
MOV R4, #23 ;nadanie wartości
brani bit. Dla przykładu prześledzimy sytu- a) ang.  complement carry , zaneguj flagę
rejestrowi R4
przeniesienia
XCH A, R4 ;wymiana danych ację kiedy chcemy wyzerować bit 4 aku-
b) w wyniku tej operacji flaga C zostaje zane-
.... ;teraz w A jest liczba 23,
mulatora bez ingerowania w pozostałe,
gowana
a w R4 liczba 10
można wykonać te zadanie dwojako:
C < /C
 poprzez instrukcję iloczynu logicznego:
c) kod: 1 0 1 1 0 0 1 1 B3h
XCH A, adres
d) cykle: 1 bajty: 1
ANL A, #11101111b ;wyzerowanie
 w wyniku tej operacji zawartość akumulato-
e) przykład:
ra zostaje wymieniona z zawartością komór-
bitu 4
SETB C ; C=1
ki w wew. pamięci RAM o podanym adresie
akumulatora
CPL C ;teraz C=0
bezpośrednim
 lub poprzez instrukcję działającą na po-
A < > (adres)
jedynczym bicie:
CPL bit
 kod: 1 1 0 0 0 1 0 1 C5h
a) ang.  complement bit , zaneguj bit
CLR Acc.4
 cykle: 1 bajty: 2 (kod instrukcji C5 + adres)
b) w wyniku tej operacji zanegowany zostanie
 przykład:
Instrukcje operujące na bitach nabiera-
bit, którego adres podany jest bezpośrednio
MOV A,#99
ją szczególnie praktycznego znaczenia
(bit) < /(bit)
MOV 00h, #0
przy badaniu stanu końcówek (portów)
c) kod: 1 0 1 1 0 0 1 0 B2h
XCH A, 00h ;teraz w akumulatorze
mikroprocesora lub przy ich sterowaniu d) cykle: 1 bajty: 1
będzie 0
e) przykład: wykonanie instrukcji
.... (ustawianiu na nich poziomów logicznych
neg: CPL P1.0
niskich lub wysokich oraz przy ustawianiu
SJMP neg
XCH A, @Ri
w stan wysokiej impedancji). Problemem
spowoduje nieprzerwane generowanie na
 w wyniku tej operacji zawartość akumulato-
tym zajmiemy się przy okazji kolejnej lek-
pinie 1 procesora fali prostokątnej
ra zostaje wymieniona z zawartością komór-
cji ze szkoły mikroprocesorowej. o częstotliwości równej: ..... (jako ćwiczenie
ki w wew. RAM o adresie znajdującym się
powinieneś sam wpisać wartość  odpo-
w rejestrze R0 (i=0) lub R1 (i=1)
CLR C wiedz w kolejnym odcinku naszego cyklu).
A < > (Ri)
a) ang.  clear carry , zeruj flagę przeniesienia
 kod: 1 1 0 0 0 1 1 i gdzie i = 0,1
b) w wyniku tej operacji wyzerowany zostaje znacz- ANL C, bit
stąd: C6h, C7h
nik (bit w rejestrze PSW) przeniesienia C a) ang.  AND direct bit to carry , iloczyn lo-
 cykle: 1 bajty: 1
C < 0 giczny znacznika C i bitu o adresie podanym
 przykład: wykonanie instrukcji
c) kod: 1 1 0 0 0 0 1 1 C3h jako bezpośredni
MOV R1, #20h
d) cykle: 1 bajty: 1 b) w wyniku tej operacji zostanie wykonany
CLR A
e) przykład: iloczyn logiczny flagi przeniesienia C oraz bi-
XCH A, @R1
CLR C ;wyzerowanie przeniesienia tu o adresie  bit , a wynik zostanie umiesz-
jest równoważne
SUBB A, B ;aby odjąć A  B bez pożyczki czony w C
MOV A, 20h
.... C < C )" (bit)
MOV 20h, #0
zastanów się dlaczego ? c) kod: 1 0 0 0 0 0 1 0 82h
SETB C d) cykle: 2 bajty: 2 (kod instrukcji + adres bitu)
XCHD A, @Ri a) ang.  set carry , ustaw flagę przeniesienia e) przykład:
 w wyniku tej operacji młodszy półbajt (bity b) w wyniku tej operacji ustawiona zostaje fla- ANL C, D6h ;iloczyn flagi przeniesienia
3 0) akumulatora zostaje wymieniony ga przeniesienia C i flagi przeniesienia
z młodszym półbajtem komórki w wew. C < 1 ;pomocniczego AC
RAM o adresie zawartym w rejestrze Ro c) kod: 1 1 0 1 0 0 1 1 D3h (jej adres w słowie
(i=0) lub R1 (i=1). d) cykle: 1 bajty: 1 PSW to D6h)
40 ELEKTRONIKA DLA WSZYSTKICH 12/97
Też to potrafisz Też to potrafisz
T
e
ż
t
o
p
o
t
r
a
f
i
s
z
T
e
ż
t
o
p
o
t
r
a
f
i
s
z
ANL C, /bit c) kod: 1 0 1 0 0 0 0 0 A0h Załóżmy że bit1 zdefiniowaliśmy jako:
a) ang.  AND complement of direct bit to car- d) cykle: 2 bajty: 2 (kod instrukcji + adres bitu) bit1 EQU 20h ;EQU to deklaracja
ry , iloczyn logiczny znacznika C i zanego- e) przykład: równoważności
wanego bitu o adresie podanym jako bezpo- ORL C, /D7h ;równoważne ustawieniu  przypisania
średni znacznika C ;nazwie umownej
b) w wyniku tej operacji zostanie wykonany ;bo zsumowano C przed (wyrazowi) konkretnego
iloczyn logiczny flagi przeniesienia C oraz za- zanegowane C adresu
negowanego bitu o adresie  bit , a wynik ;(adres C w PSW to D7h) a bit 2 jako
zostanie umieszczony w C bit2 EQU 30h
C < C )" /(bit) MOV C, bit Chcąc teraz przenieść zawartość bitu 1 do
c) kod: 1 0 1 1 0 0 0 0 B0h a) ang.  move direct bit to carry , przenieś za- bitu 2 często początkujący wykonują błędną
d) cykle: 2 bajty: 2 (kod instrukcji + adres bitu) wartość bitu o podanym adresie bezpośred- operację:
e) przykład: nim do znacznika przeniesienia C MOV bit2, bit1
ANL C, /D7h ;równoważne b) w wyniku tej operacji zawartość bitu o po- co w efekcie nie powoduje przeniesienia bi-
wyzerowaniu znacznika C danym adresie  bit zostanie przepisana do tu 1 do 2 ale przepisanie zawartości komórki
;bo wymnożono C przed znacznika przeniesienia C wew. RAM o adresie 20h do komórki o adre-
zanegowane C C < (bit) sie 30h  wykonywana jest zatem operacja
;(adres C w PSW to D7h) c) kod: 1 0 1 0 0 0 1 0 A2h na bajtach , a nie przenoszenie bitów (patrz
d) cykle: 1 bajty: 2 (kod instrukcji A2h + adres instrukcja: MOV adres1, adres2)
ORL C, bit bitu) Prawidłową odpowiedzią na postawione za-
a) ang.  OR direct bit to carry , logiczna suma e) przykład: danie będzie wykorzystania instrukcji MOV
znacznika C i bitu o adresie podanym jako MOV C, P1.7 ;odczyt stanu końcówki działających na bitach i znaczniku przenie-
bezpośredni 7 portu P1 i wpisanie go sienia C w postaci sekwencji:
b) w wyniku tej operacji zostanie wykonana do C MOV C, bit1 ;najpierw załaduj bit1 do C
suma logiczna flagi przeniesienia C oraz bitu MOV bit2, C ;a potem C do bitu 2,
o adresie  bit , a wynik zostanie umiesz- MOV bit, C w efekcie przeniosłeś bit1
czony w C a) ang.  move carry to direct bit , przenieś za- do 2
C < C (bit) wartość znacznika C do bitu o podanym ad- ....
c) kod: 0 1 1 1 0 0 1 0 72h resie bezpośrednim
W dzisiejszym odcinku to wszystkie
d) cykle: 2 bajty: 2 (kod instrukcji + adres bitu) b) w wyniku tej operacji zawartość znacznika
instrukcje, w trzeciej części  ostatniej
e) przykład: przeniesienia C zostanie przepisana do bitu
opisującej listę poleceń procesora 8051
ORL C, D6h ;suma flagi przeniesienia o podanym adresie bezpośrednim  bit
zapoznasz się drogi Czytelniku z instruk-
C i flagi przeniesienia (bit) < C
;pomocniczego AC c) kod: 1 0 0 1 0 0 1 0 92h cjami skoków warunkowych, bezwarun-
(jej adres w słowie PSW d) cykle: 2 bajty: 2 (kod instrukcji
kowych i do podprogramów. Po zapozna-
to D6h) + adres bitu)
niu się z pozostałymi poleceniami roz-
e) przykład:  pytanie?...
poczniemy wspólne tworzenie pierw-
ORL C, /bit jak przenieść zawartość jakiegoś bitu (o podanym
szych aplikacji (programów) na procesor
a) ang.  OR complement of direct bit to car- adresie bezpośrednim do innego o innym adresie
ry , suma logiczna znacznika C i zanegowa- bezpośrednim  czyli wykonać operację : 8051 przy wykorzystaniu zmontowanego
nego bitu o adresie podanym jako bezpo- (bit2) < (bit1)
przez Ciebie komputerka edukacyjnego.
średni Otóż do wykonania tego niezbędny jest
Na razie w celu przećwiczenia omó-
b) w wyniku tej operacji zostanie wykonana znacznik C, nie można bowiem wykonać ta-
wionych dzisiaj instrukcji zapraszam do
suma logiczna flagi przeniesienia C oraz za- kiej operacji bezpośrednio jednym rozkazem.
wnikliwej lektury  Lekcji 3 szkoły mikro-
negowanego bitu o adresie  bit , a wynik Nie istnieje w 8051 instrukcja która by wyko-
zostanie umieszczony w C nywała taką operację przeniesienia zawartoś- procesorowej.
C < C *" /(bit) ci jednego bitu do drugiego bezpośrednio.
Sławomir Surowiński
S
ł
a
w
o
m
i
r
S
u
r
o
w
i
ń
s
k
i
Lekcja 3
3
Jako uwieńczenie analizy drugiej  w pierwszej na wyświetlaczu wypisywa- w efekcie zostaje wypisany komunikat
części listy instrukcji procesora 8051 ny adres aktualnie testowanej komórki  Err  skrót od  error  z angielskiego
proponuję abyśmy przećwiczyli przesy-  w drugiej: testowana jest komórka pa-  błąd wraz z widniejącym adresem
łanie danych pomiędzy procesorem mięci przez zapisanie w niej, odczyt wadliwej komórki.
a zewnętrzną pamięcią danych, umiesz- i weryfikację wartości testowej: czyli W przypadku przetestowania całego
czoną na płytce komputerka  układ U4. dwóch liczb: 55h i AAh. Wybrano właś- zakresu pamięci wypisany zostaje komu-
Otóż wspólnie napiszemy prostą proce- nie takie liczby, bowiem jak pewnie za- nikat o zakończeniu:  End  koniec.
durę testującą wszystkie komórki tej pa- uważyłeś są one kombinacjami zer i jedy- Zauważmy że testowany obszar za-
mięci, z dodatkowym wyświetlaniem na nej na przemian: 55h = 01010101b, a AAh czyna się od adresu 8100h, a nie np.
wyświetlaczu aktualnie testowanego = 10101010h, co pozwala na spraw- 8000h, dlaczego? Otóż pamiętajmy że
adresu i ewentualnych błędów. Wyko- dzenie wszystkich 8 miu bitów danej w obszarze 8000h....8040h znajduje się
rzystamy przy tym m.in. instrukcję komórki pamięci. kod naszego programu, toteż gdybyśmy
MOVX, a pamięć będziemy adresować  w trzeciej części inkrementowany jest wpisali jako wartość początkową adres
z wykorzystaniem pełnego 16 bitowego adres wskaznika DPTR po czym jeżeli 8000h, program zostałby zamazany
adresu. nie przekracza on założonego obszaru i komputerek zawiesiłby się.
Popatrzmy zatem i przeanalizujmy lis- pamięci (8100h...9FFFh) wykonywany Ta sama uwaga dotyczy adresu koń-
ting przykładowego programu, realizują- jest skok na początek procedury i tes- cowego, w przypadku pamięci 8kB
cego procedurę testowania pamięci. towana jest następna komórka. (6264). Posiadacze komputerków
Program zasadniczo składa się W przypadku wykrycia błędu następu- z 32kB RAM (62256) mogą zakończyć
z 3 części: je skok do etykiety  blad w której testowanie pamięci na adresie FFFFh.
ELEKTRONIKA DLA WSZYSTKICH 12/97 41
Też to potrafisz
T
e
ż
t
o
p
o
t
r
a
f
i
s
z
W takim przypadku należy nieco zmody- a następnie przekompilować program DPTR (inną niż proponowana: 8100h).
fikować program, sposób w dalszej zródłowy jeszcze raz. Wtedy w momen- W tym miejscy uwaga:  pójście wyżej
części artykułu. cie gdy po inkrementacji DPTR będzie adresu 8041h spowoduje zamazanie
Uwaga, przed rozpoczeciem wpisywa- = 0000h (przekroczy FFFFh czyli ostatni części kodu programu testującego  patrz
nie programu upewnij się czy zwora JP3 adres w RAM) warunek : listing 1.
znajduje się w pozycji  8000h . mov A, DPH Jeżeli denerwuje Cię szybkie przemia-
jnz next tanie testowanego adresu, możesz to
Dla komputerowców: i tak będzie spełniony bez skasowanej linii spowolnić wpisując w linii pod adresem
Przedstawiony program znajduje się i w efekcie nastąpi skok na koniec programu. 8006h większą wartość do akumulatora.
na dyskietce kursu (AVT 2250/D) jako Reguła: wartość wpisana do A * 2 mi-
zbiór LEKCJA3.S03. Dla nie posiadających PC ta: lisekundy = opóznienie po teście każdej
Należy go skompilować jak poprzed- Tak jak poprzednio należy wstukać kod komórki.
nie lekcje wydając komendę programu począwszy od adresu 8000h, Komputerowcy moga zmodyfikować
DO LEKCJA3 lub użyć bezpośrednio korzystając z gotowych bajtów kodu poda- tę linię w programie LEKCJA3.S03
komendy kompilatora: nych w drugiej kolumnie listingu 1, czyli: np. mov A, #99h
> PASM51 LEKCJA3.S03 /H /L  12, 02, 74, 90, 81, 00 .... itd. .....
co spowoduje utworzenie zbioru wynikowego W przypadku chęci przetestowania pa- przy takiej wartości procedura testująca
w postaci Intel HEX, gotowego do przesłania mięci 32kB (U4  62256) należy pominąć linię będzie trwała niesamowicie długo (moż-
do komputerka poprzez łącze szeregowe. z listingu pod adresem 8024h, wpisując na się zdrzemnąć).
Dodatkowy zbiór LEKCJA3.LST jest w miejsce bajtów : Pozostali moga modyfikować opóznie-
listingiem programu przedstawionym 64, A0 nie poprzez wpisanie do komórki o adre-
w artykule. bajty sie 8007h (funkcja  Edit monitora) do-
W przypadku chęci przetestowania pa- 00, 00 wolną wartość z zakresu 1...FFh (1...255)
mięci 32kB (posiadacze U4  62256) na- czyli dwie instrukcje NOP (puste). i próbowac od nowa.
leży wykasować linię : Dodatkowo można poeksperymento- Wesołej zabawy !
S
ł
a
w
o
m
i
r
S
u
r
o
w
i
ń
s
k
i
8024 64A0 xrl A,#A0h ;testujemy RAM wać z początkową wartością wskaznika Sławomir Surowiński
CPU 8052.DEF
;***************************************************************
; Lekcja 3: Testowanie zewnetrznej pamieci danych U4
;***************************************************************
include const.inc
include bios.inc ;deklaracje dla kompilatora
8000 org 8000h ;kod programu od adresu 8000h
8000 120274 lcall CLS ;wyczyszczenie wyswietlacza
8003 908100 mov DPTR,#8100h ;testujemy od adresu 8100h do 9FFFh
8006 next:
8006 7405 mov A,#5 ;male opoznienie (ok. 10ms)
8008 120295 lcall DELAY ;abys mogl zaobserwowac zmiane adresu
800B 75F001 mov B,#1 ;od pozycji 1 wyswietlacza
800E 12025F lcall DPTR4HEX ;wypisz aktualnie testowany adres RAM
8011 test55:
8011 7455 mov A,#55h ;zaladowanie 1 liczby testowej (01010101b)
8013 F0 movx @DPTR,A ;i zapisanie jej w zewn. RAM
8014 E0 movx A,@DPTR ;i odczyt spod tego samego adresu
8015 6455 xrl A,#55h ;sprawdzenie danej ze wzorcem
8017 701A jnz blad ;jezeli sie nie zgadza to blad komorki
8019 testAA:
8019 74AA mov A,#AAh ;zaladowanie 2 liczby testowej (10101010b)
801B F0 movx @DPTR,A ;i zapisanie jej w zewn. RAM
801C E0 movx A,@DPTR ;i odczyt spod tego samego adresu
801D 64AA xrl A,#AAh ;sprawdzenie danej ze wzorcem
801F 7012 jnz blad ;jezeli sie nie zgadza to blad komorki
8021 A3 inc DPTR ;zwiekszenie wskaznika adresu o 1
8022 E583 mov A,DPH ;spr. czy nie koniec testowanego adresu
8024 64A0 xrl A,#A0h ;testujemy RAM do adresu A000h
8026 70DE jnz next ;jezeli nie to testuj nastepna komorka
8028 koniec:
8028 757D79 mov DL6,#_E
802B 757E54 mov DL7,#_n ;na koniec milutki napis  End  koniec
802E 757F5E mov DL8,#_D ;informujacy ze koniec testu
8031 8009 sjmp stop ;i skok na koniec programu
;                                          
;ta czesc programu zadziala gdy bedzie blad jakiejs komorki RAM
8033 757D79 blad: mov DL6,#_E
8036 757E50 mov DL7,#_r ;niemmily komunikat ze pod adresem z DPTR
8039 757F50 mov DL8,#_r ;jest blad pamieci RAM  napis  Err
803C 7571E0 stop: mov blinks,#E0h ;aby napis  End lub  Err bedzie mrygal
803F 80FE stop2: sjmp stop2 ;i stop programu (klawisz M  powrot)
8041 END
42 ELEKTRONIKA DLA WSZYSTKICH 12/97


Wyszukiwarka

Podobne podstrony:
Mikrokontrolery ARM cz8
Mikrokontrolery ARM cz1
Mikrokomputer Pecel z procesorem AT90S8535 cz 3
Mikrokontrolery ARM cz10
Mikrokontrolery PIC w praktycznych zastosowaniach mipicp
Mikrokontrolery ARM cz14
Mikrokontrolery cz1 (2)
Mikrokontrolery ARM cz12
Mikrokontrolery To takie proste, cz 15 (układ licznikowy w 8052C & specjalne tryby pracy 8051)
Układy licznikowe mikrokontrolera 8051
wysokościomierz z mikrokontrolerem PIC 2
programowanie mikrokontrolerów

więcej podobnych podstron