plik


ÿþTe| to potrafisz T e | t o p o t r a f i s z Mikrokontrolery? W niniejszym odcinku szkoBy mikro- procesorowej koDczymy omawianie listy instrukcji procesora 8051. Po- zostaBo kilka prostych instrukcji u|y- wanych gBównie w ptlach progra- To takie proste... mowych oraz instrukcja pusta. W dalszej cz[ci artykuBu zajmiemy si dokBadnym opisem wszystkich podprogramów usBugowych monitora  czyli programu komputerka eduka- cyjnego, który ka|dy z Was ma zapi- sany w EPROM-ie swego zestawu. Poznamy tez proste sposoby na wy- korzystanie podstawowych zaso- bów tego programu, dziki którym mo|liwa bdzie kontrolowana inge- Cz[ 10 rencja we wszystkie mechanizmy dostpne w Twoim systemie eduka- Asembler  jzyk maszynowy procesora cyjnym. Kontynuujemy opis instrukcji z grupy skoków. PozostaBa nam do etyk02: ;wBa[ciwe miejsce skoku wedBug pozycji = 1 omówienia do[ rzadko wykorzystywana przez pocztkujcych progra- ..... mistów, instrukcja skoku wzgldem wskaznika danych DPTR, dwie in- etyk03: ;wBa[ciwe miejsce skoku wedBug pozycji = 2 strukcje skoków warunkowych testujcych zawarto[ akumulatora ..... oraz dwa typy instrukcji, które dziki swojej konstrukcji znajduj najszer- etyk04: ;wBa[ciwe miejsce skoku wedBug pozycji = 3 sze zastosowanie przy porównywaniu zawarto[ci niektórych rejestrów ..... z warto[ciami staBymi (wykorzystywane np. przy odczycie kodów naci[- nitego klawisza) lub w ptlach programowych. Oto one: Poni|ej zapoznamy si z instrukcjami skoków warunkowych, któ- re badaj warunek zgodno[ci zadanego bajtu w wew. RAM proceso- JMP A+DPTR J M P A + D P T R ra (rejestru) z innym rejestrem lub argumentem bezpo[rednim (licz-  ang.  Jump Indirect relative to DPTR  skocz po[rednio wzgldem b). Dwie z nich JZ i JNZ sprawdzaj czy w akumulatorze znajduje rejestru DPTR si liczba zero czy nie i na tej podstawie podejmowana jest decyzja  w wyniku tej instrukcji nastpuje skok pod adres bdcy sum aktu- o skoku. PozostaBe instrukcje porównujce wybrane rejestry z innym alnej warto[ci rejestru DPTR (liczba 16 bitowa) i warto[ci akumulato- lub konkretn liczb znajduj zastosowanie szczególnie w ptlach ra (liczba 8 bitowa). Mo|na powiedzie |e skok nastpuje pod adres programowych, gdzie konieczne jest wykonanie n razy okre[lonej w pamici programu umieszczony w DPTR z przesuniciem poda- opracji. nym w akumulatorze. Przesuniecie to traktowane jest jako liczba bez znaku, czyli z zakresu <0...255> JZ rel J Z r e l PC < A + DPTR  kod: 0 1 1 1 0 0 1 1 73h  ang.  Jump if Accumulator is Zero , skocz je|eli w akumulatorze jest  cykle: 2 bajty: 1 liczba 0 (zero)  przykBad: realizacja skoków w miejsca w programie okre[lone po-  sprawdzana jest zawarto[ akumulatora (A), je|eli jest równa zero, to przez numer w zmiennej  pozycja (umieszczonej  zadeklarowanej do licznika rozkazów PC dodawane jest przesunicie  rel  na zasa- z wewn. RAM procesora) dach takich jak opisano wczesniej przy okazji omawiania poprzednich MOV A, pozycja ;zaBadowanie numeru pozycji instrukcji skoków z argumentem  rel (liczba 8 bitowa ze znakiem MOV B, #2 ;2 bo instrukcje w tabeli skoków sa w kodzie U2). 2 bajtowe (AJMP) PC < PC + 2, je[li A = 0, to PC < PC + rel MUL A, B ;obliczenie faktycznego ofsetu  kod: 0 1 1 0 0 0 0 0 60h do tabeli skoków  cykle: 2 bajty: 2 (kod instrukcji 60h + przesunicie  rel ) MOV DPTR, #tablica_skokow ;zaBadowanie adresu  przykBad: tabeli skoków do DPTR MOV A, B ;zaBadowanie rej. B do Acc celem JMP A+DPTR ;wykonanie skoku ;sprawdzenia czy = 0 tablica_skoków: ;tu zaczyna sie tabela skoków JZ jest_zero ;je|eli tak to skok do etykiety  AJMP etyk01 ;tu nastapi skok gdy  pozycja = 0 jest_zero AJMP etyk02 ;tu nastpi skok gdy  pozycja = 1 nie_zero: ;je|eli nie to wykonuj pozostaBe instrukcje AJMP etyk03 ;tu nastpi skok gdy  pozycja = 2 ..... AJMP etyk04 ;tu nastpi skok gdy  pozycja = 3 ..... ..... ;pozostaBe instrukcje programu jest_zero: ;tu nastpi skok je|eli rej.B byB równy zero ..... etyk01: ;wBa[ciwe miejsce skoku wedBug pozycji =0 ..... ;i zostan wykonane te instrukcje ..... ;tu mozna umie[ci instrukcje ..... ELEKTRONIKA DLA WSZYSTKICH 2/98 35 Te| to potrafisz T e | t o p o t r a f i s z JNZ rel choby w naszym komputerku). Je|eli chcemy podj okre[lone J N Z r e l dziaBanie w zale|no[ci od rodzaju klawisza, nale|y przechowywany  ang.  Jump if Accumulator is Not Zero , skocz je|eli akumulator nie kod klawisza porówna z konkretna liczb. jest = 0 (zero)  sprawdzana jest zawarto[ akumulatora (A), je|eli jest ró|na od zera, to do licznika rozkazów PC dodawane jest przesunicie  rel  na za- czekaj: sadach takich jak opisano wczesniej przy okazji omawiania poprzed- MOV A, klawisz ;pobranie kodu wci[nitego klawisza nich instrukcji skoków z argumentem  rel (liczba 8 bitowa ze zna- CJNE A, #65, sprB ;czy wcisnito klawisz  A (65  kod  A ) kiem w kodzie U2). ........ ;tak to wykonuj te instrukcje PC < PC + 2, je[li A <> 0, to PC < PC + rel sprB:  kod: 0 1 1 1 0 0 0 0 70h CJNE A, #66, sprC ;nie to czy wci[nito klawisz  B  cykle: 2 bajty: 2 (kod instrukcji 70h + przesuenicie  rel ) ........ ;tak to wykonuj te instrukcje  przykBad: sprC: MOV A, B ;zaBadowanie rej. B do Acc celem CJNE A,#67, sprD ;nie to czy wci[nito klawisz  C sprawdzenia czy = 0 ......... ;tak to wykonuj te instrukcje JNZ nie_zero ;je|eli nie to skok do etykiety  nie_zero sprD: jest_zero: ;je|eli tak to wykonuj pozostaBe instrukcje CJNE A, #68,czekaj ;nie to czekaj na kolejne naci[nicie ..... klawisza ..... ......... ;tak to wykonuj te instrukcje nie_zero: ;tu nastapi skok je|eli rej.B byB ró|ny od zera CJNE Rn, #dana, rel C J N E R n , # d a n a , r e l ..... ;i zostan wykonane te instrukcje  rejestr Rn (R0...R7) zostaje porównany z argumentem bezpo[red- ..... nim, je|eli nie sa zgodne zostaje wykonany skok PC < PC + 3, je[li Rn <> dana, to PC < PC + rel gdzie A oto wspomniana wczesniej grupa instrukcji u|ywana gBównie n = 0...7 w ptlach programowych lub przy zwielokrotnionym sprawdzaniu wa- dodatkowo: C < 0 gdy Rn>= dana, lub C< 1 gdy Rn< dana runków zgodnosci okre[lonych rejestrów z innym lub z argumentami  kod: 1 0 1 1 0 n2 n1 n0 gdzie n2 n1 n0 okre[laj jeden z rejest- staBymi. Ogólna posta instrukcji jest nastpujca: rów R0...R7 std kody: B8h....BFh  cykle: 2 bajty: 3 (kod instrukcji + dana + przesuniecie  rel ) CJNE <arg1>, <arg2>, rel  przykBad: C J N E < a r g 1 > , < a r g 2 > , r e l  ang.  Compare and Jump if Not Equal , porównaj i skocz je|eli argu- MOV R4, P1 ;odczytanie stanów z portu P1 menty porównania nie s sobie równe CJNE R4, #100, nie_100 ;porównanie ich z liczb 100 SETB P3.0 ;równe to ustaw pin 0 portu P3 W instrukcji tej porównywane sa dwa argumenty: arg1 i arg2. Je|eli ...... nie s one równe (ich warto[ci nie sa równe), to do zawarto[ci licznika nie_100: rozkazów jest dodawane przesunicie  rel na zasadach zgodnych CLR P3.0 ;nie równe to zeruj pin 0 portu P3 z omówionymi wcze[niej. W efekcie zostaje wykonany skok w progra- ...... mie. Tu uwaga, skok nastepuje wzgldem instrukcji wystpujcej po in- ...... strukcji CJNE. Dodatkowo jest zmieniany znacznik przeniesienia C. I tak, je|eli w wyniku porównania oka|e sie z argumrent arg1 jest W przykBadzie porównywana jest zawarto[ rejestru R4 z liczb 100, mniejszy od argumentu arg2 to do znacznika C wpisywana jest jedynka je|eli wystpuje zgodno[, to w porcie P3 zostaje ustawiony najmBod- (znacznik jest ustawiany), w przeciwnym przypadku znacznik jest zero- szy bit (pin) P3.0,w przeciwnym przypadku jest zerowany. Jest to pros- wany (C=0). W zalezno[ci od typu argumentów instrukcji mo|liwe s ty przykBad komparatora liczby 8 bitowej podawanej na port P1 z ze- cztery przypadki, oto one. wntrz ze staB liczb (w tym przypadku jest to liczba 100). C J N E @ R i , # d a n a , r e l CJNE A, adres, rel CJNE @Ri, #dana, rel C J N E A , a d r e s , r e l  porównywany jest akumulator oraz komórka wew. RAM o adresie  porównywana jest zawarto[c komórki w wew. RAM której adres podanym bezposrednio jako argument  adres znajduje sie w rejestrze Ri (R0 gdy i=0, lub R1 gdy i=1) z argumen- PC < PC + 3, jesli A <> (adres), to PC < PC + rel tem bezpo[rednim. Je|eli si ró|ni to nastpuje skok. dodatkowo: C < 0 gdy A>= (adres), lub C< 1 gdy A< (adres) PC < PC + 3, je[li (Ri) <> dana, to PC < PC + rel gdzie  kod: 1 0 1 1 0 1 0 1 B5h i = 0, 1  cykle: 2 bajty: 3 (kod instrukcji + adres + przesunicie  rel ) dodatkowo: C < 0 gdy (Ri) >= dana, lub C< 1 gdy (Ri) < dana  przykBad:  kod: 1 0 1 1 0 1 1 i gdzie i=0, 1 std kody: B6h, B7h MOV B,#56  cykle: 2 bajty: 3 (kod instrukcji + dana + przesuniecie  rel ) check:  przykBad: sekwencja instrukcji porównania w postaci: CJNE A, B, zwieksz MOV R1, #30h SJMP koniec CJNE @R1, #255, skocz zwieksz: ....... INC A skocz: SJMP check ....... koniec: jest równowa|na sekwencji CLR B MOV A, #255 ...... CJNE A, 30h, skocz ....... W przykBadzie tym do rejestru B wpisywana jest liczba 56. Nastepnie skocz: sprawdzany jest warunek zgodno[ci akumulatora z rejestrem B, je|eli ....... nie s sobie równe, to akumulator jest inkrementowany (dodawana jest do niego jedynka)  patrz etykieta  zwieksz . Nastpnie operacja jest przeanalizuj i zastanów sie dlaczego. Podpowiem tylko, |e w przykBa- powtarzana od pocztku  instrukcja  SJMP check . Je|eli w koDcu na- dzie porównywana jest zawarto[ komórki pamici wew. RAM z okre[- stpi zgodno[ obu rejestrów, wykonywany jest skok do etykiety  ko- lon liczb, przy ró|nicy wystepuje skok. niec , gdzie rejestr B zostaje wyzerowany. Ostatni instrukcj skoków warunkowych jest polecnie DJNZ. Ogól- na posta instrukcji jest nastpujca: CJNE A, #dana, rel C J N E A , # d a n a , r e l  akumulator zostaje porównany z argumentem bezpo[rednim (8 bito- DJNZ <arg>, rel D J N Z < a r g > , r e l w liczb), je|eli nie s zgodne nastepuje skok. PC < PC + 3, je[li A <> dana, to PC < PC + rel  ang.  Decrement and Jump if Not Zero , zmniejsz o jeden i skocz je- dodatkowo: C < 0 gdy A>= dana, lub C< 1 gdy A< dana |eli nie równe zero  kod: 1 0 1 1 0 1 0 0 B4h W wyniku tej operacji od wskazanego argumentu  arg jest odejmo-  cykle: 2 bajty: 3 (kod instrukcji + dana + przesunicie  rel ) wana jedynka (jest on dekrementowany). Je|eli w wyniku odjcia war-  przykBad: niech w zmiennej (rejestrze)  klawisz bdzie przechowy- to[ argumentu nie jest równa zero, to zostaje wykonany skok zgodnie wany kod wci[ntego klawisza w systemie mikroprocesorowym (ot z zasadami opisanymi wcze[niej w przypadku argumentu  rel . Stan 36 ELEKTRONIKA DLA WSZYSTKICH 2/98 Te| to potrafisz T e | t o p o t r a f i s z znaczników nie zmienia si. W zalezno[ci od typu argumentu rozró|nia  rczniacy powinny tBumaczy (rozumie) te 3 litery  DL1 jako liczb si dwa typy instrukcji, oto one. 120. I tak je|eli w dalszej cz[ci programu, juz w samym kodzie pojawi sie np. instrukcja: MOV DL1, A DJNZ Rn, rel D J N Z R n , r e l  zmniejszona zostaje zawarto[ podanego rejestru Rn (R0...R7) o je- oznacza to bedzie to samo co instrukcja MOV 78h, A den, a nastepnie je|eli nie jest równa zero, to nastpuje skok. PC < PC + 2, Rn < Rn  1, gdzie n = 0...7 Podobnie np. je|eli zechcemy np. zaBadowa liczb (nie zawarto[ ko- je|eli Rn <> 0, to PC < PC + rel  kod: 1 1 0 1 1 n2 n1 n0 gdzie n2 n1 n0 okre[laj jeden z rejest- mórki spod podanego adresu) 78h np. do rejestru B wykonamy operacj: rów R0...R7 std kody: D8h...DFh MOV B, #DL1  cykle: 2 bajty: 2 (kod instrukcji + przesunicie  rel ) co bdzie to|same jako  przykBad: sekwencja instrukcji MOV B, #78h CLR A MOV R7, CLR A #26 Znaczek  # oznacza |e mamy do czynienia z argumentem bezpo- dodaj: [rednim, czyli liczb, a nie jak w przykBadzie poprzednim z adresem ko- ADD A, #1 mórki w wewntrznej pamici RAM procesora. Warto to zapamita. DJNZ R7, dodaj Dla zapamitania jeszcze jeden przykBad: niech pod adresem F005h ...... w obszarze zewntrznej przestrzeni adresowej procesora (w jakim[ jest równowa|na poleceniu ukBadzie skonstruowanym przez nieznanego elektronika a wykorzystu- ADD A,#26 jcym procesor 8051) znajduje si 8 bitowy rejestr pracujacy jako wy- co w obu przypadkach powoduje dodanie do akumulatora liczby 26. j[cie informacji, np. sterujcy o[mioma przekaznikami zaBczajcymi |a- rówki w|a [wietlnego  chocia|by znany wam ju| ukBad 74573. Aby DJNZ adres, rel D J N Z a d r e s , r e l zapali co drug |arówk nale|y wykona proste instrukcje zapisu do  zmniejszona zostaje zawarto[ komórki pamicie wew. RAM o poda- zewntrznej pamici danych, zakBadajc |e rejestr jest zatrzaskiwany nym bezpo[rednio adresie o jeden, a nastepnie je|eli nie jest równa pod wpBywem (nie bezpo[rednio !!!) sygnaBu /WR  zapisu do ext. RAM zero, to nastpuje skok. procesora. Zadeklarujmy zatem ten specjalny adres jako nazw pocho- PC < PC + 2, (adres) < (adres)  1, je|eli (adres) <> 0, to PC dzaca od angielskiego sBowa  w| : < PC + rel SNAKE EQU 0F005h  kod: 1 1 0 1 0 1 0 1 D5h Wykonanie w dalszej cz[ci programu sekwencji:  cykle: 2 bajty: 3 (kod instrukcji + adres + przesunicie  rel ) MOV DPTR, #SNAKE ;zaBaduj adres do wskaznika  przykBad: sekwencja instrukcji przedstawiona poni|ej daje taki sam danych efekt jak w porzednim przykBadzie. MOV A, #55h ;w liczbie 55h ssiednie bity CLR A sa ró|ne: 01010101 MOV B, #26 MOVX @DPTR, A ;i zapisz do rejestru pod dodaj: wskazany adres ADD A, #1 spowoduje zamierzony efekt. Pierwsz lini mo|na zapisa oczywi[cie DJNZ B, dodaj jako: ....... MOV DPTR, #F005h ...... A teraz pora na naprawd ostatni instrukcj z listy poleceD proceso- ...... ra 8051. ale jak sami widzicie pierwszy sposób jest bardziej czytelny, bowiem od razu wiemy czytajc program, |e w tym miejscu nastapi zapis do rejes- NOP N O P tru w|a [wietlnego.  ang.  No Operation , nie rób nic  jest to instrukcja, w wyniku której nie zmienia si stan procesora, Drug deklaracj wa|n szczególnie a mo|e przede wszysktim dla z wyjtkiem licznika rozkazów którym po pobraniu tej instrukcji jest I N C L U D E komputerowców jest dyrektywa  INCLUDE  ang. wBcz w sensie do- zwikszany o jeden. Bcz, dopnij, wez pod uwag kompilujc program . SBu|y ona do wBcza-  kod: 0 0 0 0 0 0 0 0 00h nia podczas kompilacji zbiorów dodatkowych ), oprócz tego, którym jest  cykle: 1 bajty: 1 celem kompilacji, przy wywoBaniu programi kompilatora PASM51.EXE,  przykBad: sekwencja instrukcji w których znajduj si dodatkowe kawaBki  kodu zródBowego u|yt- MOV A, B kownika. W sensie dosBownym mog to by zbiory tekstowe zawiera- NOP jce biblioteki (w postaci zródBowej) dodatkowych procedur np. mate- MUL A, B matycznych. zajmie procesorowi o 1 cykl maszynowy wicej niz sekwencja W praktyce np. kiedy zachodzi potrzeba u|ycia podprogramu doda- MOV A, B wania dwóch liczb 32 bitowych w piciu aplikacjach (programach), nie MUL A, B warto umieszcza kodu tej procedury w ka|dym z piciu zbiorów zród- ale efekt dziaBania bdzie taki sam w obu przypadkach. Bowych. Lepiej i wygodniej jest raz zapisa kod zródBowy takiej procedu- ry w odzielnym zbiorze np. pod nazw:  ADD32.INC , po czym w ka|- I na tym koDczy si lista instrukcji procesora 8051. Teraz pozostaje juz dym z pieciu aplikacji zapisa 1 liniow deklaracj doBczenia tego zbio- tylko praktyczne ich wykorzystanie w celu tworzenia programów. Na ru podczas kompilacji w postaci: pocztku bd to aplikacje na komputerek edukacyjny, który ka|dy INCLUDE ADD32.INC z Was powinien ju| mie uruchomiony, potem na dowolne ukBadu elek- co spowoduje doBczenie tre[ci zbioru ADD32.INC do pliku gBównego troniczne, które ju| sami bdziecie konstruowa bazujc na proceso- w miejscu jej wywoBania. Oczywi[cie je|eli w zbiorze z podprogramem rach serii 8051 I pochodnych. wystpi bBd w zapisie jakiej[ instrukcji kompilator automatycznie prze- rwie tBumaczenie sygnalizujc komunikatem odpowiedni bBd z poda- Pozostaje jesz

Wyszukiwarka

Podobne podstrony:
Mikrokontrolery cz10
Mikrokontrolery cz10
Mikrokontrolery ARM cz10
Mikrokontrolery ARM cz1
Mikrokomputer Pecel z procesorem AT90S8535 cz 3
Mikrokontrolery PIC w praktycznych zastosowaniach mipicp
Mikrokontrolery ARM cz14
Mikrokontrolery ARM cz8
Mikrokontrolery cz1 (2)
Mikrokontrolery ARM cz12
Fotogrametria cz10 orto(1)

więcej podobnych podstron