22_10.pdf

(194 KB) Pobierz
152728893 UNPDF
Też to potrafisz
W kolejnym odcinku naszego cyklu,
którego celem jest poznanie i naucze−
nie się programowania mikrokontrole−
rów serii MCS−51, postanowiłem od−
łożyć na bok pozostałe do omówienia
bloki funkcjonalne procesora 8051
(port szeregowy, system przerwań,
specjalne tryby pracy), a „wrzucić” Ci,
drogi Czytelniku garść informacji po−
chodzącej trochę z „innej beczki”.
Chodzi mianowicie o krótkie, aczkol−
wiek wystarczające zapoznanie się
z podstawowymi pojęciami dotyczący−
mi obsługi tych „wszystkich mądroś−
ci”, o których od kilku miesięcy uważ−
nie czytasz – czyli o sposób progra−
mowania, czyli: „czym?, jak?, i dlacze−
go?... się ten procesor programuje”.
Decyzja moja jest po części Waszą,
prawdopodobnie przecież większość
z Was ma już swój „Komputerek edu−
kacyjny”, którego konstrukcja została
opisywana w dwóch poprzednich nu−
merach EdW. A skoro wydałeś na to
swoje oszczędności, to dobrze by by−
ło, nie patrzeć tylko na te „cudeńko”
ale je w końcu wypróbować!
Mikrokontrolery?
To takie proste...
Część 6
Asembler – język maszynowy procesora
Do wspólnego zrealizowania tego za−
dania niezbędnych jest kilka informacji
oraz zrozumienie pojęcia „programowa−
nia” układu scalonego – w naszym przy−
padku mikroprocesora.
Zanim przejdę do wyjaśnienia tych po−
jęć, pragnę uspokoić wszystkich drobiaz−
gowych Czytelników, że wspomniane po−
zostałe bloki funkcjonalne procesora
omówię w następnych odcinkach nasze−
go cyklu, ale tym razem... uwaga: na go−
rąco, czyli z wykorzystaniem naszego
edukacyjnego układu.
Tym wszystkim, którzy nie zaopatrzyli
się w dedykowany temu kursowi, kom−
puterek, radzę o jak najszybsze zmonto−
wanie go, dzięki czemu będziecie, moi
drodzy, na bieżąco praktycznie wykony−
wać wszystkie zadania.
A więc zacznijmy od najważniejszego
stwierdzenia: „Mikrokontroler bez pro−
gramu jest jak żołnierz bez....” wiesz bez
czego. I jest to święta racja. Jak sam zdą−
żyłeś się zorientować śledząc poprzednie
odcinki kursu, że kostka 8051 zawiera
w swojej strukturze całe mnóstwo uży−
tecznych elementów takich jak np. pa−
mięć programu, danych, programowane
układy licznikowe, stos, itd. Wszystko faj−
nie... „tylko jak nad tym wszystkim zapa−
nować?...”. Otóż aby odpowiednio wyko−
rzystać zasoby kontrolera i zmusić je do
pracy zgodnie z naszym zamysłem i prze−
znaczeniem konstruowanego układu, po−
trzebny jest język porozumiewania się
z mikroprocesorem. Ten język najczęściej
nazywa się językiem maszyno−
wym. Brzmi bardzo poważnie, praw−
da? Tak na prawdę język ten jest prostym
zbiorem poleceń, dzięki którym możliwa
jest nie tylko ingerencja we wszystkie
wspominanie bloki funkcjonalne proceso−
ra, ale także wykonywanie określonych
logicznych czynności: sprawdzanie wa−
runków czy operacje arytmetyczno−lo−
giczne. Sam język maszynowy to na po−
zór nieczytelny dla człowieka ciąg liczb.
Aby sprawę uprościć stworzono postać
jawną języka maszynowego – asemb−
ler. W języku tym kolejne polecenia opi−
sywane są za pomocą słownych instruk−
cji uzupełnionych odpowiednimi do danej
sytuacji argumentami. Tak postać jest ak−
ceptowalna przez programistę, dzięki te−
mu program pisze się po prostu w dowol−
nym edytorze tekstowym (np. na kompu−
terze), następnie dokonuje się zamiany
(translacji) tak napisanego programu na
wspomniany ciąg liczb – czyli język ma−
szynowy procesora.
Tak jak istnieje na świecie wiele języ−
ków porozumiewania się między ludźmi,
tak samo w rodzinach różnych mikroproce−
sorów, często pochodzących od różnych
producentów, istnieje wiele języków,
wszystkie jednak to języki maszynowe.
Producenci oprogramowania tworzą
bardziej zaawansowane tzw. języki
„wyższego poziomu”, słyszałeś zapew−
ne o takich jak Pascal, C, Basic oraz inne.
Tak naprawdę to są to translatory bardziej
złożonych poleceń danego języka „wyż−
szego poziomu” na kod maszynowy pro−
cesora. Zawsze na samym końcu obrób−
ki programu użytkownika, czy powstał on
w takim czy innym języku powstaje i za−
wsze kod maszynowy, który akceptuje
dedykowany mikroprocesor.
W przypadku pisania większości pro−
gramów na kontrolery 8051 (lub każde
inne „jednoukładowce”), szczególnie
podczas nauki, każdy początkujący musi
poznać jego język maszynowy, czyli
asembler. Dzięki temu później, kiedy
nauczy się nim biegle posługiwać, bę−
dzie mieć duża swobodę i możliwość
obiektywnej oceny w wyborze dowolne−
go innego narzędzia wspomagającego
programowanie tego procesora, ale to
zupełnie inna historia.
Ogólnie można powiedzieć, że pisanie
programu na procesor to po prostu two−
rzenie kolejnych poleceń, z których
w efekcie powstaje cały program.
„Tworzenie” to np. pisanie w dowolnym
edytorze tekstowym ASCII w przypadku
posiadaczy komputerów. Pozostałe oso−
by nie mające dostępu, mogą taki pro−
gram napisać chociażby na kartce papie−
ru (aczkolwiek w przypadku większych
programów jest to bardzo trudne, czy
wręcz niemożliwe).
44
E LEKTRONIKA DLA WSZYSTKICH 10/97
152728893.003.png
Też to potrafisz
Polecenie zwykle zawiera się w jednej
linii programu. Jego składnia jest zasadni−
czo określona, z reguły można ją przed−
stawić jako:
instrukcja <argument_1>, <argument_2>.....(1)
Czasami przed instrukcją występuje
także etykieta zakończona znakiem „:”
(dwukropka), np. „etyk01:”, której zada−
niem jest po prostu nazwanie danej linii
polecenia. Ilość argumentów w linii pole−
cenia może być różna w zależności od ro−
dzaju instrukcji. W przypadku asemblera
procesora 8051 i pochodnych liczba ta
waha się od zera w przypadku instrukcji
bezargumentowych do trzech. Zasadą
jest że poszczególne argumenty oddziela
się zawsze znakiem „,”: (przecinka), na−
tomiast instrukcja oddzielona jest od pier−
wszego argumentu spacją (odstępem)
lub znakiem tabulacji (to informacja dla
komputerowców).
Podajmy przykład polecenia dla proce−
sora 8051 w którym procesor wykonuje
dodawanie zawartości dwóch jego rejes−
trów:
ADD A, B (2)
W poleceniu tym wystąpiły:
–instrukcja: „ADD”
–argumenty: A – rejestr A (akumulator)
oraz rejestr B
W nazewnictwie asemblerowym pier−
wszą część polecenia, czyli instrukcję
(np. ADD ) nazywa się „mnemonikiem”,
toteż od tego momentu będziemy posłu−
giwać się tym zwrotem. Aby otrzymać
wynik dodawania należy dodać do siebie
dwa argumenty. Pierwszy argument (ja−
kaś liczba) znajduje się w akumulatorze
procesora 8051, druga zaś w tym przy−
padku w rejestrze B. W wyniku wykona−
nia przytoczonego polecenia procesor do−
da do zawartości rejestru A wartość z re−
jestru B, a wynik umieści w rej. A (aku−
mulatorze). Powiedzmy że chcemy do−
dać dwie liczby: 25 + 43. W tym celu mu−
simy wpisać te wartość (składniki doda−
wania) do rejestrów procesora a potem
jej dodać poleceniem (2). Można to zrobić
w sposób następujący:
MOV A, #25 (3)
MOV B, #43 (4)
ADD A, B (5)
W liniach 3 i 4 rozkazaliśmy procesoro−
wi wpisanie składników odpowiednio do
rejestrów A i B, działanie polecenia w linii
(5) jest Ci już znane.
Osoby znające asembler i możliwości
8051 pewnie się trochę zaśmieją
z przykładu (3)...(5), bowiem dodawanie 2
stałych da się zapisać krócej w dwóch
liniach, lecz nie o to nam chodzi, przynaj−
mniej na tym etapie kursu.
Mnemonik „MOV” ma wiele zastoso−
wań w języku procesorów ‘51, na język
polski można ją przetłumaczyć jako
„przemieszczenie” (przesunięcie) czegoś
gdzieś. Czego i gdzie to zależy od kontek−
stu, czyli od rodzaju argumentów, ale
o tym za chwilę. Linia (3) oznacza do−
słownie w tłumaczeniu na jęz. polski:
„wpisz do akumulatora liczbę 25”, linia
(4) – wpisz do rejestru B liczbę 43, linia (5)
– dodaj do akumulatora zawartość rejest−
ru B. W efekcie wykonania tych 3 pole−
ceń w akumulatorze będzie wynik doda−
wania, czyli liczba 68 (binarnie będzie to
01000100). Jeżeli teraz każesz proceso−
rowi wykonać np. polecenie
MOV P1, A (6)
spowoduje to że liczba 68 pojawi się na
końcówkach portu P1 procesora, oczy−
wiście w postaci binarnej. Aby to spraw−
dzić naocznie wystarczy dołączyć do każ−
dej z 8−miu jego końcówek (piny 1...8
‘8051/2) diodę świecącą z rezystorem,
z pewnością zapalone zostaną diody dołą−
czone do końcówek: 3 i 7 (na tych pozy−
cjach liczby 68 w postaci binarnej jest
„1”. Procesor po prostu w wyniku poda−
nia polecenia (6) wpisał zawartość aku−
mulatora do rejestru portu P1.
No ale na razie wystarczy przykładów,
wyjaśnimy sobie teraz, jak fizycznie pro−
cesor akceptuje instrukcje, no bo prze−
cież „nie zje” od razu ciągu liter układają−
cych się w napis chociażby z przykładu
(6). Otóż asembler procesora 8051 posia−
da określoną liczbę mnemoników oraz
określone rodzaje argumentów.
Jeżeli jesteś ciekawy to powiem Ci że
mnemoników jest nie tak wiele bo
42. W przyszłości będziesz musiał je poz−
nać i zapamiętać, ale nie przejmuj się, nie
jest to dużo, przy okazji praktycznego pro−
gramowania same wpadną ci do głowy –
i już zostaną...na zawsze.
Jeżeli chodzi o argumenty to wyróżnia
się kilka ich rodzajów, nie będę teraz
szczegółowo wyliczał ich wszystkich,
pierwszy ich rodzaj – argument bezpo−
średni, poznałeś w przykładzie dodawa−
nia dwóch rejestrów – liczby: #25 i #43.
W zależności od rodzaju argumentów
jakie występują po mnemoniku, różne
jest działanie całego polecenia – instruk−
cji. W architekturze procesorów 8051
konstruktorzy wyróżnili 255 takich sytua−
cji i ponumerowali je od 0 do 255 (FFh
szesnastkowo).
Tak powstało 255 instrukcji procesora
(nie 256 bo jeden numer nie jest wyko−
rzystany).
I jak się pewnie niedługo przekonasz
z punktu widzenia programisty – użyt−
kownika liczba ta jest mniejsza, to jednak
należy zapamiętać ten fakt.
Jeżeli zatem cały zbiór instrukcji pro−
cesora daje się przedstawić jako liczba
wraz z towarzyszącymi jej ewentualnie
argumentami, z których każdy także daje
się przetłumaczyć na liczbę, w efekcie
można wywnioskować, że cały program
pisany przez użytkownika w postaci
źródłowej (literowej) można przetłuma−
czyć na ciąg liczb. Mało tego, wszystkie
te liczby mogą zawierać się jedynie
w 8 bitach, co idealnie pasuje architektu−
ry naszego procesora – jest on przecież
prawdziwym ośmiobitowcem. Zamienio−
ny do takiej postaci Twój program wy−
starczy teraz śmiało wpisać do poszcze−
gólnych komórek pamięci EPROM bądź
samego procesora (gdy ten pracuje
w trybie z wewnętrzną pamięcią progra−
mu – np.87C51) lub do kostki EPROM
z której później procesor będzie pobierał
instrukcje.
Operację programowania pamięci EP−
ROM przyprowadza się oczywiście za
pomocą specjalizowanych narzędzi do
programowania procesorów – tzw. pro−
gramatorów. Na pocieszenie powiem Ci
że w ofercie handlowej AVT pod nazwą
AVT−320 znajduje się taki programator
idealnie nadający się do programowania
wszystkich dostępnych na rynku kostek
serii MCS−51. W przyszłości, kiedy nabę−
dziesz już umiejętności swobodnego
„surfowania” (to ostatnio bardzo popu−
larne słowo) wśród rodziny ‘51−nek,
z pewnością takie narzędzie Ci się przy−
da. To przyszłość, na razie do tego etapu
jeszcze wspólnie nie doszliśmy.
Całą drogę od pomysłu na program po−
przez jego napisanie i zamianę do postaci
akceptowanej przez procesor i jedno−
cześnie dającej wpisać się do pamięci
programu procesora obrazuje rysunek 1.
Rys. 1. Od pomysłu na program do jego realizacji
E LEKTRONIKA DLA WSZYSTKICH 10/97
45
152728893.004.png 152728893.005.png 152728893.006.png 152728893.001.png
Też to potrafisz
Wróćmy na chwilę do naszego proste−
go przykładu dodawania dwóch liczb. Za−
piszmy instrukcje (3)...(5) z argumentami
dodawania w postaci szesnastkowej:
MOV A, #19h (7)
MOV B, #2Bh (8)
ADD A, B (9)
Liczba 25 dziesiętnie można zapisać
w postaci heksadecymalnej jako
„19”, a liczba 43 jako „2B”, dodając na
końcu każdej z nich małą literkę „h” co
oznacza zapis że zapisaliśmy liczbę w ta−
kiej właśnie postaci. Spróbujmy teraz za−
mienić te trzy linie na postać liczbową
(bajtową) akceptowaną przez procesor.
W liście rozkazów 8051 instrukcja:
MOV A, ”jakaś_liczba_8_bitowa”
ma numer (odtąd będziemy ten numer
nazywać kodem rozkazu): „74h”. Ale
w linii (7) występuje jeszcze argument –
liczba stała „19h”, dlatego ostatecznie li−
nię tę w kodzie maszynowym (liczbowo)
można zapisać jako:“74h, 19h”. Podob−
nie tłumaczymy linię (8). Odwołując się
do listy instrukcji (którą całą niebawem
poznasz), sekwencję:
MOV B,”jakaś_liczba_8_bitowa”
tłumaczymy jako: „75h, F0h, 2Bh”. Trze−
cia linia zaś będzie miała postać: „25h,
F0h”. Skąd to wszystko wiem? Ano ze
wspomnianej listy instrukcji. Nie martw
się w tej chwili nie jest Ci ona potrzebna,
ważne jest abyś uzmysłowił sobie w jaki
sposób pisze się program w języku
asemblera i jak go potem tłumaczy się na
język maszynowy procesora – czyli po−
stać liczbową.
W efekcie po przetłumaczeniu nasze−
go przykładu otrzymamy sekwencję liczb:
„ 74h, 19h, 75h, F0h, 2Bh, 25h, F0h „ (10)
Jeżeli teraz poszczególne liczby wpi−
szesz do kolejnych komórek pamięci
programu (czy to zewnętrznej czy to we−
wnętrznej) to po uruchomieniu układu
procesor wykona dokładnie to czego do
niego oczekujesz, czyli załaduje dwa
składniki do dwóch rejestrów procesora
a następnie dokona operacji dodania ich.
Uff, wyglądało to dość mozolnie, bo
trzeba było napisać instrukcje w posta−
ci asemblerowej czyli jawnej (linie
7,8,9), potem na podstawie bliżej Ci nie
znanej (na razie) tabeli instrukcji zamie−
nić program do postaci maszynowej,
wreszcie umieścić sekwencję w pa−
mięci programu.
W praktyce dzięki zastosowaniu do−
wolnego komputera proces ten da się
przyśpieszyć.
O ile każdy program w postaci asem−
blera trzeba wstukać z klawiatury i zapi−
sać na dysku w postać pliku tekstowego
(np. korzystając z edytora popularnego
Norton Commandera), to do przetłuma−
czenia postaci źródłowej za wykonywal−
ną (maszynowej) służą specjalne narzę−
dzia (programy) zwane kompilatora−
mi. Dzięki nim proces zamiany – zwany
dalej kompilacją – kodu źródłowego na
maszynowy trwa często bardzo krótko,
a tłumaczenie nawet kilku tysięcy linii nie
trwa dłużej niż kilkanaście sekund.
W efekcie działania kompilatora powsta−
je zbiór z programem zapisany w postaci
maszynowej, czyli ciągu liczb jak zilustro−
wałem na przykładzie dodawania liczb.
Plik taki najczęściej jest gotowy do uży−
cia przez programatory pamięci EPROM
(lub programatory procesorów). Taki
zbiór świetnie nadaje się też do zapisania
w pamięci operacyjnej twojego kompu−
terka edukacyjnego opisywanego
w trzech ostatnich numerach EdW. Jeże−
li posiadasz dowolny komputer klasy PC,
będziesz mógł nabyć dyskietkę z takim
kompilatorem, dzięki któremu efekty
twojej pracy będą natychmiastowe.
Szczegółowe informacje zawarte są
w 3 części opisującej komputerek eduka−
cyjny na 8051 w tym numerze EdW.
Jeżeli nie masz dostępu do kompute−
ra, będziesz zmuszony do tłumaczenia
przykładów z naszego kursu, ręcznie na
kartce papieru, korzystając ze
„ściągawki”, którą będzie lista instrukcji
procesora 8051. Lista taka ukaże się
w przyszłym numerze EdW. Będziesz ją
mógł wyciąć i w razie potrzeby zafolio−
wać, chroniąc ją tym samym przez znisz−
czeniem.
I choć wszystkie przykłady w czasie
programowania będą dość proste i dają−
ce się zrealizować „na papierze”, to po−
winieneś już teraz pomyśleć o wyposaże−
niu swego domowego kącika, nawet
w przestarzały komputer klasy AT−286 lub
w muzealną wersję XT.
Użytkownicy komputerów innych ro−
dzajów, np. Amiga, Commodore, Atari,
posiadający interfejs szeregowy zgodny
z RS232c będą mogli także ich używać,
do przesyłania kodu maszynowego pisa−
nych przez siebie programów z kompu−
tera do naszego systemiku edukacyjne−
go. Musicie jednak kochani poszperać
wśród swoich kolegów i namierzyć kom−
pilator na procesory 8051 działający na
waszym komputerze, bowiem na dys−
kietce oferowanej do naszego kursu zna−
jduje się zestaw programów na kompu−
tery klasy PC.
W tym odcinku dość nietypowo,
umieszczamy pierwsze 5 ćwiczeń
w części III opisu zestawu AVT−2250. Za−
praszam do lektury w tym numerze EdW.
Słławomiir Surowiińskii
46
E LEKTRONIKA DLA WSZYSTKICH 10/97
152728893.002.png
Zgłoś jeśli naruszono regulamin