1 BUDAPESTI MŰSZAKI FŐISKOLA KANDÓ KÁLMÁN VILLAMOSMÉRNÖKI KARA
2
ELEKTRONIKA SZAKCSOPORT
2000
1.4 A 8051/8031 típusú mikrokontroller hardver kialakítása.
Oktatási segédlet
AUTOMATIKA INTÉZET
MCS-51-es MIKROKONTROLLER
MCS-51-es MIKROKONTROLLER ÖSSZEFOGLALÓ KÉSZÍTETTE: DR. KÓNYA LÁSZLÓ Tartalomjegyzék
A mikrokontroller egy mikroprocesszor műveletvégző egységéből és periféria részekből áll. A periféria funkciókkal a továbbiakban részletesen foglalkozunk. A 8051-es mikrokontroller család továbbfejlesztett tagjai (pl. 8052/32, 80515/535, 80517/537, 80C552 stb.) felülről kompatibilisek a 8051/31 alaptípussal. Ez azt jelenti, hogy az alapegységek mindegyik változatban azonosak, az eltérések a bővített funkciókban találhatók. Utasításkészlete viszont a család minden tagjának azonos. Ebből fakad, hogy az alaptípus felépítésének, programozásának alapos ismerete a további változatok alkalmazására is - kevés bővítő ismeret megszerzése után - képessé teszi a felhasználót. A 8051 típusú mikrokrontroller funkcionális blokk-sémája látható az 1.ábrán.
1.4.1 Órajel-egység ( oszcillátor) A 8051 mikrokontrollerben - a legtöbb mikroprocesszorhoz hasonlóan - belső órajel-egysége van. Az áramkör egy invertáló erösítő, amelynek a be-, és a kimenete az XTAL1 és az XTAL2 lábakhoz csatlakozik ( 19 és 18-as lábak ). A felhasználáshoz szükséges órajel frekvenciát a csatlakoztatott külső áramköri elemek határozzák meg. Rendszerint erre a célra kvarcot, vagy kerámia-rezonátort használhatunk.
1.
Az MCS-51-es mikrokontroller család felépítése, ismertetése...............................................................................1
2.
A 8051 mikrokontroller család utasításkészlete....................................................................................................11
3.
Az MCS-51-es család mikrokontrollereivel épített mikrogépek programozása ................................................17
External Interrupts
4.
Szimulátor program az 51/52 mikrokontrollerekhez (SIMULA5X)...................................................................29
Interrupt Control
80C51 Blokk Diagram
Counter Inputs
Timer 0
A 8051 mikrokontrolleres gyakorló....................................................................................................................... 34
1. Az MCS-51-es mikrokontroller család felépítése, ismertetése 1.1 Mi a mikrokontroller?
A nagyon gyorsan fejlődő integrálási technológia azt eredményezte, hogy egyre több tranzisztor-funkció került egy lapkára (chip-be). Eleinte csak a mikroprocesszorok teljesítőképességét növelték. Ezzel párhuzamosan keresték annak a lehetőségét is, hogy az egy lapkára integrált funkciók számát növeljék. A cél az volt, hogy az egyedi periféria IC-ket is a processzor lapkára vigyék be, s ezzel egyszerűbbé váljon az áramkörépítés. Az Intel cég 1975-ben állította elő az első mikrokontrollert, a 8048-t. Erre a kontrollerre alapozva 1980-ban vitte a piacra az Intel a 8051 típust. Ezt a mikrokontrollert világszerte felhasználták. Napjainkban számos gyártó részegységeit továbbfejlesztve - kínálja a különböző változatait. Természetesen más félvezetőgyártók is kínálnak mikrokontroller családot, ennek ellenére a 8051-es család bővül. Ebben az összeállításban csak a 8051 mikrokontrollert ismertetjük részletesen.
1.2 A mikrokontroller és a mikroprocesszor közötti különbség
A mikrokontroller nem más, mint egy "csökkentett tudású" mikroprocesszor és periféria áramkörök egyetlen közös egységbe integrálva. Ma már az összes periféria-funkciót beintegrálják egy mikrokontroller IC-be. A legismertebb mikrokontrollerbe - a 8051 - az alábbi funkciók vannak beépítve: • • • • •
két 16 bites időzítő/számláló, négy 8 bites párhuzamos port, 128 bájt RAM, 4 Kbájt programtároló (ROM), ( a 8031 típusban nincs ) soros vonali illesztő.
1.3 A mikrokontroller alkalmazási területe A mikrokontrollerek ára, a nagyon sok funkció ellenére sem magas. Azzal mindvégig tisztában kell lennünk, hogy a mikrokontroller számítási képessége elmarad a mikroprocesszorokétól. A hardver kialakítás sem olyan rugalmas, mint a mikroprocesszorokkal. Nincs is erre szükség. A mikrokontrollerek klasszikus alkalmazási területe a vezérlés. Nagyon kevés külső áramkörrel - mint pl. programtárolóként használt EPROM, vagy néhány meghajtó tranzisztor - egyetlen kártyán, vagy más kivitelben - alakítható ki a teljes mikrogép. További felhasználási területük a szórakoztatóelektronika (képmagnók, televíziók). Ezekben a különböző adókra történő rugalmas átprogramozást biztosiíja. A gyártónak csak egyszer kell a programot kifejleszteni a vezérelt készülékhez.
D R K
6.
Timer 1
128 byte RAM
51-es programok fejlesztése PC-n ..........................................................................................................................32
D R K
5.
4k byte ROM
CPU
OSC
Bus Control
Serial Port
I/O Ports
TXD
P0
P2
P1
RXD
P3
(Address / Data)
8031/32 ROM nélküli típusok
11.0592MHz C1 30p Q
C2 30p
VCC
10u C3 R1 10K
31 19 18
9
12 13 14 15
1 2 3 4 5 6 7 8
GND-20 Vcc-40 IC 39 P0.0 EA/VP 38 P0.1 37 P0.2 X1 36 P0.3 35 P0.4 34 P0.5 X2 33 P0.6 32 P0.7 RESET 21 P2.0 22 P2.1 23 P2.2 INT0 24 P2.3 INT1 25 P2.4 T0 26 P2.5 T1 27 P2.6 28 P1.0/T2 P2.7 P1.1/T2X P1.2 RD 17 P1.3 WR 16 P1.4 PSEN 29 P1.5 ALE/P 30 11 P1.6 TXD 10 P1.7 RXD
VSS
XTAL1
XTAL2 EA
PSEN ALE
SECONDARY FUNCTIONS RxD TxD INT0 INT1 T0 T1 WR RD
P O R T 3
Áramköri bekötés
P3.7 P3.6 P3.5 P3.4 P3.3 P3.2 P3.1 P3.0
VCC
RST P0.7 P0.6 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0 P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0
P2.7 P2.6 P2.5 P2.4 P2.3 P2.2 P2.1 P2.0
SECONDARY FUNCTIONS P O R T 0
ADDRESS AND DATA BUS
P O R T 1
P O R T 2
ADDRESS BUS
Funkcionális vázlat
1. ábra
1.4.2 Belső memóriák A 8051 mikrokontroller család minden tagjában van belső adatmemória ( RAM ), illetve egyes típusokban belső programmemória ( ROM/EPROM ) is található.
3
A 8051 típusú mikrokontroller belső RAM-ja két 128 bájtos területet • az operatív memóriát, és ( 00H - 7FH címterület ), és • az un. Speciális-Funkció-Regiszter (SFR) memóriát ( 80H - FFH címterület ) tartalmazza ( 2. ábra ). Az operativ memória további három részre tagolódik. Ezek: • négy 8 bájtos Regiszter Bank ( BANK0, BANK1, BANK2, BANK3 ), • bájtos bit-címezhető memória, • bájt általános felhasználású memória. F F H S F R r e g isz te rek 8 0 H 7 F H
3 0 H
Á lt. fe lh a sz n á lá su m e m ó r ia B it c im zésü m em .
1 F H
2 F H 2 0 H
B an k 3
D R K
B an k 2 B an k 1
0 0 H
B an k 0
2. ábra
A Bank-ok közül mindig egy lehet aktív. Az aktív Bank regisztereihez rendeltek az R0, R1 ..... R7 regiszter elnevezések ( szimbólumok ). Ezek az un. munkaregiszterek, amelyek közül az R0, R1 indirekt címzéshez, míg a többi egyéb funkciókra pl. ciklusszámlálás használhatók. A másik három bank memóriahelyei abszolút címzéssel elérhetők, és például adattárolásra használhatók. Az aktuális Bank kiválasztása szoftverből történhet a PSW ( Program Status Word ) regiszter RS1 (PSW.4) és RS0 (PSW.3) bitjeinek megfelelő beállításával. ( A két bitből alkotott bináris szám a kiválasztandó Bank sorszáma. ) Hardver Reset illetve bekapcsoláskor a Bank 0 a kiválasztott. A bit címezhető memória 16 bájtja elérhető bájtos címzéssel is, de a memóriaterület 128 bitje ( 16*8 ) bites változóként külön-külön írható/olvasható, illetve használható bitműveletek változóiként. A bitek címzése kétféle, mégpedig • bájtcím . bit sorszám pl. 21.5 a 21H című bájt 5-ös sorszámú ( hatodik ) bitje, • abszolút címzéssel a 00H - 7FH címtartományban. A 00H a 20.0, vagyis a 20H című bájt legkisebb helyiértékű bitje, míg a 7FH a 2F.7 vagyis a terület legutolsó bájtjának a legnagyobb helyiértékű bitje. pl. az 53H című bit 2AH című bájt 3-as sorszámú bitje ( 2A.3 ). Az általános felhasználású memóriaterület csak bájtos szervezésű. Az operatív memória teljes területe direkt ( közvetlen címmel ) vagy indirekt címzéssel ( cím az aktuális Bank R0, vagy R1 regiszterében van ) érhető el. A belső adatmemória 80H - FFH címterületén találhatók az un. Speciális Funkció Regiszterek ( SFR ). Itt találhatók • • • •
a CPU regiszterek ( ACC, B, PSW, SP ), címző regiszterek ( PC, DPTR ), a portok regiszterei ( P0, P1, P2, P3 ), a belső perifériák • ( időzítők: TMOD, TCON, TH0, TL0,TH1, TL1, • soros vonal: SCON, SBUF, megszakítás: IP, IE ) regiszterei.
Az SFR regiszterek csak direkt címzéssel írhatók/olvashatók. Ezen regiszterek között vannak olyanok, amelyek bitjei is külön-külön kezelhetők. Ezek abszolút címtartománya a 80H- FFH értékeket öleli fel. Ezek a bitek is ugyanúgy kétféle módon címezhetőek, mint az előzőekben leírt alsó 128 bit. Az SFR-ek elnevezései, címei és funkciójuk összefoglalva látható a táblázatban , ahol a *-al jelöltek a bitenként is címezhető regisztereket. A 8051/31 mikrokontroller SFR regiszterei Szimbólum *P0
Jelentés Port 0
Cím (Hex) 80
SP DPL DPH *TCON TMOD TL0 TL1 TH0 TH1 *P1 PCON *SCON SBUF *P2 IE *P3 *IP *PSW *ACC *B
Stack-Pointer Data-Pointer: LOW bájt Data-Pointer: HIGH bájt Időzítő/Számláló vezérlő regiszter Időzítő/Számláló mód-regiszter 0-ás Időzítő/Számláló: LOW bájt 1-es Időzítő/Számláló: LOW bájt 0-ás Időzítő/Számláló: HIGH bájt 1-es Időzítő/Számláló: HIGH bájt Port 1 Power vezérlő regiszter Soros Port vezérlő regiszter Soros port buffer Port 2 Megszakítás engedélyező regiszter Port 3 Megszakítás prioritás regiszter Programstátusz regiszter Akkumulátor B regiszter
81 82 83 88 89 8A 8B 8C 8D 90 97 98 99 0A0 0A8 0B0 0C8 0D0 0E0 0F0
A címterületen szándékosan hagytak lyukakat a későbbiekben fejlesztett változatok - mint pl.80552 vagy a 80517 további regisztereinek az egységes keretbe illesztése céljából. A mikrokontroller SFR regisztereibe a RESET jel hatására meghatározott alapérték íródik. Ezeket a katalógusok pontosan megadják. A felhasználás során ezt figyelembe kell venni.
D R K
1.4.2.1 Belső adatmemória
4
1.4.2.2 Belső programmemória ( ROM/EPROM )
A belső programtároló (ROM/EPROM) - ha van, akkor - 4 kbájt kapacitású. A két különböző változat: • a 8051 típus, amelyben van ROM, • a 8031 típusjelű pedig ROM nélküli kialakítású.
A ROM-ba a programot a gyártás során maszkolják és azt a későbbiekben már nem lehet megváltoztatni. Előnye a maszkprogramozásnak, hogy részben esetleg teljesen elhagyható a külső programmemória. Azonban a feladathoz illesztett maszk fejlesztése drága. Ezért e változat alkalmazása csak nagy darabszám esetén kifizetődő (pl.videómagnókban). A 8051 használható a 8031-nek megfelelően is. A belső programtároló az EA jelü bemenetre (31 láb) adott vezérléssel be-, vagy kiiktatható. A lábra adott magas (HIGH) szintű jel esetében a mikrokontroller az utasításokat a belső programtárból hívja, ameddig a programkódok száma kevesebb, mint 4096 (4 kbájt). Az e feletti kódokat pedig már a külső memóriából veszi. Alacsony (LOW) szintű vezérlésnél - minden esetben - a külső programmemóriát használja. A 8031 típusnál ezt a lábat mindig alacsony szintre kell kötni, mivel nincs belső programtárja. A család egy megkülönböztetett változata a 8751 típusjelű. ( Ehhez hasonlóan kapható a 8752 típus is. ) E típusokba nem ROM-ot, hanem EPROM-ot integrálnak. A program fejlesztésnél a tesztelés és esetleges módosítás lehetőségét biztosítja az EPROM. A végleges maszk elkészítése előtt, az esetleges programhibánál az EPROM törölhető és újra írható. Igy csak a valóban helyes program kerül maszkolásra a gyártásban.
1.4.3 A CPU regiszterei 1.4.3.1 Belső időviszonyok A belső oszcillátor kimenete, illetve a bevezetett órajel egy belső ütemgenerátort hajt meg. Ez állítja elő a szükséges belső ütemező jelet, amelynek frekvenciája mindenkori órajel frekvencia fele. A belső jel ütemezi a műveleteket. A 8051/8031 típusoknál minden gépi-ciklus hat ütemű, melyeket S1-től S6-ig jelölünk. Mindegyik ütem két oszcillátor periódusból - P1 és P2 - áll. Minden gépi-ciklus P tehát 12 órajel-periódusból áll, vagyis az S1P1-el kezdődik és az S6P2-vel fejeződik be. A gépi ciklus periódusideje (P) a következő összefüggés alapján számolható ki: P = 12/f
5
6
Az f-t 1/s - ban helyettesítve a P periódusidőt sec-ban, illetve mikrosec-ben kapjuk. Például ha egy kontrollert 8 MHz-es órajellel működtetünk, akkor P = 12/8*106 s = 1,5 µs hosszú lesz egy gépi ciklus. A ciklusidő ismeretében egy adott program futási ideje is kiszámolható. A 8051/8031 kontrollerek utasításai 1-3 bájt hosszúak és végrehajtásuk egy vagy két ciklus alatt történik. Kivétel a szorzás (MUL), illetve az osztás (DIV), melyeket a mikrokontroller 4 ciklus alatt hajt végre.
üzemmódját, leállítását, indítását, és tartalmának módosítását két SFR - a TMOD (timer-mod ) és a TCON ( timercontrol ) - regiszterrel lehet beállítani. A TMOD csak bájtosan írható/olvasható, míg a TCON bitjei egyedenként is elérhetőek. E regiszterek bitjeinek szimbólumait és funkcióit foglaltuk össze a táblázatokban.
A program állapot szó (Program-Status-Word (PSW)) A PSW-ben különböző jelzőbitek ( flag-ek ) vannak, amelyek többek között meghatározott programugrások feltételei lehetnek. A Program-Status-Word regiszter (PSW) bitjei, és funkcióik Bájt-cím: 0D0H Abszolut bit-címek: 0D0H-0D8H
P OV RS0 RS1 F0
Szimbólum
PSW.6 PSW.7
AC CY
Funkció Paritás bit nem használt aritmetikai túlcsordulás bit Regiszterbank választó bit 0 Regiszterbank választó bit 1 Általános célú bit. Tetszőlegesen felhasználható Fél-átvitel bit Átvitel - áthozat bit
D R K
Bit cím PSW.0 PSW.1 PSW.2 PSW.3 PSW.4 PSW.5
Az RS1 és az RS0 bitek segítségével választható ki az aktuális regiszterbank. A bitekből alkotott bináris szám értéke az aktív bank sorszáma. A CY, AC, OV és P flag-ket az aritmetikai utasítások írják 1-be, vagy törlik. Az egyes flag-ek funkciója a következő: CY AC OV P
az összeadás átvitelekor, illetve a kivonás áthozatakor íródik 1-be, közbenső átvitel, ( átvitel az alsó dekádról a felsőre ), aritmetikai túlcsordulást jelző bit, amely 1 - be íródik, ha az összeadás illetve a kivonás eredménye a 128 és a +127 tartományon kívül esik, a paritást jelző bit.1-be íródik, ha az akkumulátorban páros számú 1-es van és törlődik páratlan számú 1-es esetében. A P értéke minden gépi ciklusban újra képződik.
Az akkumulátor (ACC) A mikrokontroller és a mikroprocesszor akkumulátorainak funkciói azonosak. Külön magyarázata ezért nem szükséges. A B-regiszter A B-regiszternek meghatározott szerepe csak a szorzásnál és az osztásnál van. Egyébként adattárolóként használható. A program során - a B-be írt adatot - csak a már említett szorzó, vagy az osztó utasítások írják felül. Data-Pointer (DPTR) A Data-Pointer 16 bites regiszter, amely LOW-bájt-ból (DPL) és HIGH-bájtból (DPH) áll. A két regiszter tartalma, a megfelelő utasításokkal külön-külön 8 bites bájtként, vagy együtt 16 bites szóként használható. Rendszerint a külső adatmemóriába történő írásnál, vagy olvasásnál közvetett címzéshez használjuk. Programszámláló (PC) A programvégrehajtás során mindig a beolvasandó program-kód címét tartalmazza. Szoftverben is használható a kódmemória relatív címzéskor. A külső tárolók vezérlőjelei Az S1-S6 ütemekben a P1,P2 órajelciklusok szerint változik minden - a külső tárolóáramkörök működtetéséhez szükséges - vezérlőjel. Ezek a következők: ALE PSEN RD WR
(Address Latch Enable) (Program Store Enable) (Read) (Write)
1.4.4 Programozható időzítő/számláló perifériák A 8051-es család tagjaiban különböző számú időzítő/számláló áramkör van. Ezekhez még további funkciók is kapcsolódhatnak. A 8051/31 típusban a T0 és T1 jelű két időzítő/számláló van. Mindkét áramkör lehetséges
Bit cím TCON.0
Szimbólum IT0
TCON.1
IE0
TCON.2 TCON.3 TCON.4 TCON.5 TCON.6 TCON.7
IT1 IE1 TR0 TF0 TR1 TF1
Funkció Az INT0 külső megszakítás vezérlő bit. 1 értéknél a megszakítás lefutó élre, 0 értélnél LOW szintre történik. Az INT0 megszakítás él-jelző bitje. 1-be íródik, ha a bemenetre lefutó él érkezik. A hardver törli a rutin végén (RETI). Az INT1 külső megszakítás vezérlő bit. Azonos az IT0-al. Az INT1 megszakítás él-jelző bitje. Azonos az IE0-al. A T0 vezérlő bitje. 1 engedélyez, 0 tilt. Irható olvasható. A T0 tulcsordulás bitje. A T1 vezérlő bitje. Azonos az TR0-al. A T1 tulcsordulás bitje.Azonos az TF0-al.
A Timer-Modus-regiszter (TMOD) bitjei és funkcióik Bájt-cím: 89H Bit sorszáma Szimbólum Funkció 0 T0 időzítő/számláló üzemmód beállító-bit 0 M00 1 T0 időzítő/számláló üzemmód beállító -bit 1 M10 2 T0 vezérlő bit, 0 értéknél időzítő, 1értéknél eseményszámláló C/T0 3 T0 kapuzó bit, 0 tiltja, 1 engedi az INT0 bemenetről a vezérlést GATE0 4 T1 időzítő/számláló üzemmód beállító -bit 0 M01 5 M11 T1 időzítő/számláló üzemmód beállító -bit 1 6 C/T1 T1 vezérlő bit, 0 értéknél időzítő, 1értéknél eseményszámláló 7 GATE1 T1 kapuzó bit, 0 tiltja, 1 engedi az INT bemenetről a vezérlést Megjegyzés: az indexek a számláló sorszámát jelölik.
D R K
Verem mutató (Stack-Pointer) A Stack-Pointer funkciója a mikrokontrollerekben is hasonló, mint a mikroprocesszorokban. A RESET jel után az SP-be 07H érték íródik. Tehát a verem-terület a 08H - nál a BANK1-nél kezdődik. Ugyanakkor adott a lehetőség arra, hogy a verem mutatót egy tetszőleges értékkel töltsük fel. A verem a 256 bájtos belső RAM-terület tetszőleges helyén kijelölhető. A verembe író műveleteknél az SP tartalma inkrementálódik. Ez azt jelenti, hogy a verem-memória a kezdő címtől növekvő című területet foglal el.
A Timer-Control-regiszter (TCON) bitjei és funkcióik Bájtcím: 88H Abszolut bit-címek: 88H - 8FH
1.4.4.1 A T0 és T1 időzitő/számlálók és üzemmódjaik (0 - 3)
A T0 és a T1 áramkörök időzítőként, vagy eseményszámlálóként használhatók. A működési módot a TMOD-regiszter 2. és 6. C/T jelü bitjeivel (TMOD.2 ill. TMOD.6) kell beállítani. A logikai 1 - hez a számláló üzemmód tartozik. Az időzítő üzemmódban a számtartalom gépi ciklusonként dekrementálódik. Ebből következik, hogy az időzítés alapegysége az oszcillátor periódusidejének a 12-e. A számláló üzemmódban mindegyik számláló a hozzátartozó bemenetre - T0, T1, - kapcsolt jel lefutó élénél inkrementálódik. A maximális számlálási frekvencia tehát az órajel frekvenciájának 24-e. A 12 MHz-es oszcillátor használatánál a számlálási frekvencia maximálisan 500 kHz. Az áramkört kiegészítő - szoftverből vezérelhető kapu - előnyösen használható a pontos eseményszámlálásnál. A kapuzás a TR0 és TR1 bitekkel (TMOD.7 és a TMOD.3) történik. A T0 ill. T1-es jelű áramkörök négy különböző üzemmódban működtethetők. Az üzem-módokat - a T1-nél - a TMOD.4 (M10) és a TMOD.5 (M11), illetve a - a T0-nál - pedig a TMOD.0 (M00) és TMOD.1 (M10) bitekkel kell kiválasztani. Az M0-M1 bitekből alkotott bináris szám értéke az üzemmód index-e. Az egyes üzemmódok a következők: • 0 - ás üzemmód A 0-ás üzemmód a 8048-as mikrokontroller időzítő/számlálójának a működésével egyezik meg. A TH0 (TH1) regiszter 8 bites, míg a TL0 (TL1) csak 5 bites. Az áramkörök tehát egy 32-es elosztóval rendelkező 8-bites számlálóként használhatók (3. ábra).
7
oszc.
oszc.
÷12 _ C/T=0
vezérlés
TL1 (5BIT)
TMOD SFR TR1 GAT
TH1 (8BIT)
TF1
Interupt
v ezér lés
TL0
_ C /T = 1
T 0 bem e n et
(5 B I T )
TR0
TCON SFR
&
GAT
1
T C O N SF R
≥1
IN T 0 bem e n et v ezér lés
T M O D SFR
≥1
TH0 (8 B I T )
INT1bemenet
Inter up t
T F1
TR1
3.ábra
5.ábra
• 1-es üzemmód Az 1-es üzemmód hasonló a 0-áshoz, azzal az eltéréssel, hogy a számláló 16-bites. • 2-es üzemmód A számláló a 2-es üzemmódban 8 bites, de automatikus visszatöltés is történik (4.ábra).
oszc.
÷ 12
_ C/T=0
TL1
T1 bemenet
(8BIT)
TM O D SFR
TR1
Interupt
átirás
&
1
TF1
TCON SFR
≥1
TH 1
(8BIT)
INT1 bemenet
A portokon keresztül történik a mikrokontroller és a külvilág közötti adatcsere. A 8051-es család tagjainál egyre több periféria-funkciót integráltak egy tokba. 8051 portjai eltérnek a hagyományos számítástechnikai I/O áramköröktől. A mikrokontrollernél egy 8 bites port több funkciót is elláthat. Így pl. busz-meghajtást, vagy soros adatátviteli interfész feladatát. A négy port tulajdonképpen 32 db. önálló egy-bites port, amelyek bitenként címezhetőek is. Ez azt jelenti, hogy bármelyik port-bit egyedileg írható, olvasható. A portok mindegyik bitjéhez egy-egy tároló (Latch) tartozik, melyek a megfelelő SFR bitjei. Ezek mindegyikéhez kimeneti meghajtó, és bemeneti illesztő áramkör kapcsolódik. A legtöbb porthoz - az alap funkció mellett egy-egy alternatív funkció is tartozik, de egy adott alkalmazásban csak az egyik funkció használható. Az ábrán egy ilyen láb általános kialakítását mutatjuk be, egyes portok áramkörei ettől kisebb mértékben eltérnek, de jól illusztrálja a portok tényleges működését. TÁROLÓ KIOLVASÁS
vezérlés
_ C/T=1
1.4.5 A portok
D R K
D R K
A számláló túlcsordulása 1-be írja a megfelelő megszakításkérő bitet (Timer-Interrupt-Flag TF0/TF1). A számlálandó impulzusokat külső és belső vezérlés együttesen kapcsolja a számlálóra. A feltételek, - a 3. ábrának megfelelően - hogy a TR0/TR1 bit 1- szintű és ugyanakkor a TMOD.3/TMOD.7 bit alacsony vagy az INT0/INT1 csatlakozási ponton magas szint legyen. A számlálók külső-, (hardver) és belső-, (szoftver) vezérelhetősége nagyon széleskörű, rugalmas felhasználást biztosít.
G AT
Inter up t
T F0
f o szc /1 2
& 1
÷ 12 _ C /T = 0
_ C/T=1
T1bemenet
8
BELSŐ BUSZ
TÁROLÓBA ÍRÁS
ALTERNATÍV KIMENŐ FUNKCIÓ
D
Q
Cl
Q
Vcc KIMENETI FELHÚZÓ ELL. LÁB
ÉS
LÁB OLVASÁS
ALTERNATÍV BEMENŐ FUNKCIÓ
EGY BE/KIMENETI (LÁB) ILLESZTŐ ÁRAMKÖR
4.ábra A TL0/TL1 regiszter tulcsordulása a megfelelő megszakításkérő bitet (TF0/TF1) beállítja és ugyanakkor a TH0/TH1 regiszter tartalmát beírja a TL0/TL1 regiszterbe. A TH0/TH1 regiszter tartalma nem változik. Ezek felülírása szoftver úton végezhető. A meg-oldással programból változtatható késleltetés valósítható meg. • 3-as üzemmód A 3-as üzemmódba csak a T0-ás időzítő/számláló áramkör üzemeltethető. Ha a T1-et állítjuk 3-as módba, akkor az leáll. Ebben a módban TL0 és a TH0 regiszterek önálló 8 bites számlálóként használhatóak és egymástól teljesen függetlenül dolgoznak (5.ábra). Az üzemmódot akkor használják, ha több időzítő funkció is szükséges. (Megjegyzés: a TH0 csak késleltetőként működtethető!) Ha a T0 a 3-as módban üzemel, akkor T1-es áramkör a többi üzemmódban azzal a kikötéssel dolgozik, hogy a belső leállítás nem működik, és nem kezdeményezhet megszakítást. ( A T1 a soros kommunikációs csatorna Baud-rate generátoraként is használható ).
6. ábra Az egyes portokhoz kapcsolódó másodlagos funkciók a következők: P0 a külső memória írás/olvasás ciklusokban időmultiplex módon a cím-, és adatbusz funkciót teljesít az alábbi sorrendben: • egy gépi ciklus kezdetétől az ALE jel végéig a cím alsó bájtját (A0..A7) adja ki, • ezt követően a gépi ciklus végéig adat írás/olvasás feladatát látja el. P1 csak I/O funkciót lát el. P2 a külső memória írás/olvasás ciklusokban címbusz felső bájtját (a8..A15) adja. P3 minden egyes bitje más-más funkciójú az alábbiak szerint:
9
Láb P3.0 P3.1 P3.2 P3.3 P3.4 P3.5 P3.6 P3.7
Szimbólum RXD TXD INT0 INT1 T0 T1 WR RD
Funkció Soros vonal bemenete Soros vonal kimenete 0-ás külső megszakítás 1-es külső megszakítás 0-ás időzítő/számláló bemenete 1-es időzítő/számláló bemenete Író-jel Olvasó-jel
D R K
Amikor az egyes portokat az alternatív funkciójukban kívánjuk használni, akkor az alábbiakra kell figyelni: • A portoknak van belső felhúzó (Pull-up) ellenállásuk. Az alternatív funkció csak akkor működik, ha a megfelelő port tárolóban HIGH szint van. • Ha a port 1-be írása elmarad, akkor a megfelelő lábat egy belső tranzisztor lehúzza 0-ra. Ilyen esetben egy külső Ucc (+5V) szintű jel tönkre teheti az áramkört. • Az egyes portokhoz kapcsolt alternatív funkciók miatt ezek már nem használhatók a klasszikus értelemben vett I/Oportnak. A többfunkciós kialakítás alapvető oka, hogy a mikrokontroller lábszáma korlátozott. Az egyes portok bitjeinek áramköri felépítése kismértékben különbözik. A különböző felépítésű portok között azonos, hogy mindegyik bithez egy-egy tároló tartozik. Ezek D-flip-flopok, amelyek mindegyike valamelyik SFR egyik bitje. A belső buszról az adatot a WRITE LATCH (a D-flip-flop clock-ja) jel írja be a flip-flopba. A tárolóba írt tartalom - a P1 portot kivéve - a belső vezérlő jeltől függően jelenik meg a hozz tartozó lábon, vagyis csak az alapfunkcióban. Az alternatív funkció esetében a kontroller egy másik SFR tartalmát kapcsolja a lábakra. Fordított irányban, vagyis amikor egy jelet olvasunk be, akkor két lehetőség van: vagy a kiválasztott lábon lévő jelet (READ PIN), vagy a tároló (READ LATCH) jelét olvassuk be. Egyes utasítások a tároló olvasásra, mások pedig a lá bon lévő jel beolvasására alkalmasak. A tárolók csak a kimenő-jeleket tárolják. A bemeneti jeleket a beolvasás után külön tárolni kell mert azok elvesznek. A felhasználáskor a programban kell gondoskodni a jelek változásának figyeléséről. Erre az ismételt lekérdezés (polling) alkalmas. Amikor ez nem alkalmazható, akkor külső hardverrel kell megszakítást kérni a figyelt szintváltásnál. A 0- s (P0) port A P0 alternativ funkciója a külső tárolók és a kontroller közötti adatforgalomhoz kapcsolódik. E port adja egyrészt a cím busz alsó 8 bitjét ,másrészt pedig a klasszikus értelembe vett adatbusz. A belső CONTROL jel kapcsolja a port-funkciót (CONTROL=0) ill. a külső memóriakezelői funkciót. Mielőtt a porton keresztül a külső memóriából olvas s tőrténik, a tárolóba 1 íródik. Ezzel a port eredeti tartalma elvész. Az 1-es (P1) port A 8051mikrokontroller egyetlen portja, amelyikhez nincs alternatív funkció is rendelve. A felépítése is ezért egyszerű. Egy D-tárolóból, két és kapuból valamint egy végtranzisztorból és felhúzó ellenállásból áll. Az ÉS kapuk a lábról (READ PIN) illetve a tárolóból (READ LATCH) történő olvasást vezérlő belső jeleket kapuzzák.
A 2-es (P2) port A P2 port alternatív funkciója - a P0-áshoz hasonlóan - a külső memória és mikrokontroller közötti adat írás-, olvasáshoz kapcsolódik. Ilyenkor ez a port adja a címbuszra a cím felső 8 bitjét. Ha nem használjuk ezt a portot bemenetként, akkor nem is kell a tárolóba 1-t írni. A port tárolóiba írt információ a címzési funkció végrehajtása alatt változatlan. Ezért a belső CONTROL jel inaktiválódásakor ismét a lábakra kerül az eredetileg beírt információ. A 3-as (P3) port A P3 port alternatív funkciója bitenként más és más. Egyesek be-, mások pedig kimeneti jeleket szolgáltatnak. A P0 és a P2-es portokkal ellentétben, itt bitenként külön használhatók az alternatív, vagy az alap port funkciók. Egy lábról történő olvasáskor nincs szétválasztva áramkörileg az alternatív-, és a portfunkció. Amikor egy bemeneti jelet (pl.az INT0-át) kívánunk használni, akkor azt a programban inicializálni kell, vagyis a lábhoz tartozó D-tárolóba 1-t kell írni. A tároló kimenete és az alternatív jel között ÉS kapcsolat van. Ezért alapfunkció - normál port - használatakor előbb az alternatív jelet kell 1-be írni. Az alternatív funkció érvényesülése viszont csak a tároló 1-be írásával biztosítható.
1.4.5.1 A portok terhelhetősége (fan-out) Miután az egyes portok áramköri kialakítása különböző, ezért különbözik az általuk vezérelhető TTL bemenetek száma is. A P0 maximálisan 8 LS-TTL bemenetet tud meghajtani. A P1 - P3 portok átlagosan 4 egységgel terhelhetők.
Figyelni kell arra, hogy a P0 port kimenetéhez - kivéve, ha csak külső tárolók eléréséhez használjuk - felhúzó-ellenállást kell csatlakoztatni.
1.4.5.2 READ-MODIFY-WRITE utasítások A 8051-es családnál mód van arra, hogy csak egy lábon lévő jelet (READ PIN), vagy csak a hozzátartozó tároló tartalmát olvassuk be (READ LATCH). Az olvasási módok között szoftverben választhatunk. Azokat az utasításokat, amelyek a tárolók tartalmát olvassák ki - nevezik READ-MODIFY-WRITE (olvas - változtat - ír) utasításoknak. A READ-MODIFY-WRITE típusú utasítások a címzett tároló tartalmát kiolvassák, az adott értékre változtatva írják vissza azt.
1.4.6 A megszakítások és használatuk A mikrokontroller megszakításainak segítségével oldhatók meg az események valós idejű lekezelése. A megszakítás (Interrupt) egy hardver esemény kiszolgálására szolgál. A kiszolgálást kérő jel - hozzá tartozó - megszakítás- kérő (Interrupt -Request) flag-ot 1-be állítja A megszakítást külső-, (pl. a megfelelő bemenetre érkező feszültségszint, vagy szintváltás) illetve belső esemény (pl. az egyik számláló túlcsordulása) kérhet. Mindegyik megszakításhoz meghatározott prioritás rendelhető. Amikor egy megszakítást kérő jel érkezik, akkor az éppen futó program végrehajtása felfüggesztődik és a megszakítást kiszolgáló (Interrupt-Service) rutin fog futni. Ha mikrokontroller éppen egy azonos ,vagy magasabb prioritású megszakítást szolgál ki, akkor csak a futó rutin befejezése után hívja az újabb megszakítás-rutint.
D R K
P3 port egyes lábainak a funkciója
10
1.4.6.1 A megszakítás engedélyező (Interrupt-Enable) regiszter (IE)
A 8051 mikrokontroller megszakításainak engedélyezése az IE-regiszter tartalmának megfelelő beírásával végezhető. Az EA (IE.7) jelű bit az általános megszakítás engedélyező. Amikor EA=0,akkor mindegyik megszakítás tiltott. Az általános engedélyezés (EA=1) mellet az IE regiszter megfelelő bitjét is be kell írni a kívánt megszakítás engedélyezéséhez. A megszakítás engedélyező regiszter (IE) tartalma Szimbólum Bit Jelentése EX0 IE.0 A külső INT0 engedélyezése ET0 IE.1 A T0 időzítő túlcsordulás megszakítás-engedélyezése EX1 IE.2 A külső INT1 engedélyezése ET1 IE.3 A T1 időzítő túlcsordulás megszakítás-engedélyezése ES IE.4 A soros-vonal megszakítás engedélyezése ET2 IE.5 A T2 időzítő túlcsordulás megszakítás-engedélyezése IE.6 foglalt EA IE.7 Általános megszakítás-engedélyezés
1.4.6.2 Megszakítás-prioritás (IP) regiszter
A 8051 megszakítás vezérlő része két prioritás szintet különböztet meg. Az egyes megszakítás források prioritását az IP regiszter megfelelő beírásával végezhetjük. Az 1 jelenti a magasabb prioritást. A megszakítás prioritás regiszter (IP) tartalma Szimbólum Bit Jelentése PX0 IP.0 A külső INT0 prioritása PT0 IP.1 A T0 időzítő prioritása PX1 IP.2 A külső INT1 prioritása PT1 IP.3 A T1 időzítő prioritása PS IP.4 A soros vonal prioritása PT2 IP.5 A T2 időzítő prioritása (csak a 8052-nél) IP.6 foglalt A 8051 mikrokontroller megszakítás-rutinjainak a kezdőcíme állandó. Erre a címre egy ugró-utasítást kell beírni, amely a megszakítás-rutinra adja át a vezérlést. A rutinból a főprogramba történő visszatérést a RETI utasítás hajtatja végre.
11 A 8051 utasításai - a végrehajtási ciklusszám alapján - az alábbiak szerint oszlanak meg:
A 8051 ill. a 80C51 típusoknál öt megszakítás forrás és két prioritási szint van. A 8052 típusú mikrokontrollerbe még egy további megszakításforrást (T2) integráltak. Megkülönböztetünk külső és belső megszakítás-forrásokat. A külső megszakításokat (INT0,INT1) a megfelelő bemenetre (12-es ill. 13-as lábak) adott feszültségszint, vagy negatív él indítja. Az egyes bemenetek szint-, vagy él-érzékenységét a TCON (Timer-Control) regiszter IT0,illetve IT1 bitjeivel lehet megválasztani. Az egyes megszakítások végre-hajtását a TCON.1 (IE0) illetve a TCON.3 (IE1) bitek 1-be írásával engedélyezhetjük. A belső megszakításokat - az előzőekkel ellentétben - nem külső, hanem a tokon belüli jel kezdeményezi. A felhasználó ezért csak közvetetten kezdeményezheti. A belső megszakításra példa az ES, amelyet a soros vonal indít az RI vagy a TI beíráséval. További belső megszakítási források még a TF0 és a TF1.Ezeket a megfelelő időzítő/számláló (T0,illetve T1) túlcsordulása indítja.
D R K
Megszakítás-források és kezdő-címeik Megszakítás-forrás Kérő-flag Kezdő-cím 0-ás külső megsz. IE0 0003 H Timer 0 megsz. TF0 000B H 1-es külső megsz. IE1 0013 H Timer 1 megsz. TF1 001B H Soros vonal megsz. RI vagy TI 0023 H A külső megszakítás-forrás megszakítást kérő jelének LOW, vagy HIGH szintje minden esetben legalább egy teljes gépi ciklus időtartamáig kell fennálljon. Csak ezzel biztosítható a megszakítás-kérés biztonságos felismerése. A 8051 megszakítás-vezérlő logikája bármelyik megszakítási kérelem felismerése után egy LCALL utasítást generál. Ellenőrzés, hogy kiadható-e az LCALL utasítás. Ha a kérés pillanatában azonos, vagy magasabb prioritásu megszakítás kiszolgálása folyik, akkor a kontroller nem ad ki LCALL utasítást. Az alacsonyabb szintü megszakítás-végrehajtást egy magasabb prioritású megszakítja. ł
• Ha a megszakítás-kérés utasítás végrehajtása közben érkezik, akkor először befejeződik az, és csak utána történik a megszakítás-rutin hívása. • A programszámláló pillanatnyi értékét leteszi a VEREM-be. • A programszámlálót feltölti az aktuális megszakítást kiszolgáló rutin kezdőcímével. • A megszakítás-rutint egy RETI utasítás kell lezárja. Ennek hatására folytatódik a megszakított program végrehajtása.
1.4.7 Soros vonali-illesztő
A 8051-es család minden tagjában van szabványos soros adatátviteli port, amit itt nem részletezünk.
2. A 8051 mikrokontroller család utasításkészlete 2.1 A bit-, és bájtszervezésű működés
A 8051 mikrokontroller utasításkészlete nagyon hasonlít a 8080 típusú mikroprocesszor utasításaihoz. Lényeges eltérés azonban, hogy a 8051-t elsősorban különböző vezérlési feladatokhoz fejlesztették ki. A mikrokontrollert olyan utasításokkal látták el, amelyekkel nagyon egyszerűen lehet bitműveleteket végezni. Ezt szolgálja a bitcímzés és a bitekre is értelmezett logikai műveletek (boole utasítások). A hagyományos mikroprocesszorokhoz hasonlítva még egy lényeges eltérésre kell felhívni a figyelmet. A mikroprocesszorok főleg bájt szervezésű számításokat végeznek. A vezérlési feladatoknál ritkábban van erre szükség. Többségében egyes kapcsolók állapotát kell lekérdezni, és reléket ki-, bekapcsolását vezérelni. Az ilyen jellegű működés bitszervezést igényel.
2.1.1 Az utasítások hossza A 8051 mikrokontrollernek összesen 111 utasítása van. Az utasítások között egy-, két- és három bájt hosszúakat találunk. Az utasítás bájtszámban a műveleti kód és - rendszerint közvetetten - az operandusok is benne vannak. Az utasítások között:
hosszúságú van.
2.1.2 Futási idő Egy program futási idejének pontos meghatározásához ismerni kell azt, hogy az egyes utasítások feldolgozása hány gépi ciklus alatt történik. A 8051mikrokontroller utasításainak a végrehajtása - a MUL és DIV aritmetikai utasítások kivételével - egy-, vagy két gépi ciklus befejeződik. Az említett mindkét utasítás végrehajtásához négy gépi ciklus szükséges. Egy műveleti ciklus 12 oszcillátor-periódus hosszú. Az órajel frekvenciájának ismeretében a program végrehajtásához szükséges idő - a futási idő - a következők szerint számolható ki: Az program összes utasításaihoz tartozó ciklusok összegét szorozni kell a quartz periódusidejének 12-szeresével .
• 63 egy-ciklusú, • 46 két-ciklusú és • 2 négy-ciklusú.
2.1.3 Címzési módok 2.1.3.1 A címzésről általában A 8051-nél az alábbi öt különböző címzési mód alkalmazható: • • • • •
regisztercímzés, direkt címzés, indirekt címzés, közvetlen címzés, indirekt regisztercímzés.
A mikrokontroller különböző memóriaterületekkel kommunikál. A fizikailag, vagy logikailag elkülönített területek más-más címzési móddal érhetőek el. A 8051 öt féle címzési módja alapvetően két nagy csoportot alkot, mégpedig a direkt és az indirekt címzésűeket. A direkt címzésnél az utasítás része a megfelelő tároló-cella címe (hexadecimális szám). Az indirekt címzésnél a tárolócella címét egy regiszterben vagy egy másik tároló-cellában van. Az utasítás ez utóbbiak címét tartalmazza. Az indirekt címzés kissé nehézkesebb, mivel a programozónak először arról kell gondoskodnia, hogy a szükséges cím a megfelelő tároló-egységbe kerüljön. Ugyanakkor rugalmasabb programozást tesz lehetővé. Az indirekt címzés egy másik lehetősége az un. adatmutató, vagyis a Data-Pointer használata. Az adatmutatóba egy 16 bites szám írható, amely 64 Kbájt kapacitású adatmemória címzését teszi lehetővé. Az adott értékhez relatív címzés is megoldható.
D R K
1.4.6.3 Megszakítás-források
• 49 egy-bájt • 45 két-bájt és • 17 három-bájt
12
A relatív címzés a strukturált programozást teszi könnyebbé. Sok esetben előnyös ez a módszer.
2.1.3.2 Regiszter-címzés
Az aktuális bank R0 és R7 regiszterei címzésre is használhatóak. Segítségükkel a belső RAM egyes memória elemei így az A,B a CY és DPTR is - közötti kommunikáció megvalósítható. Az utasításkód három legalacsonyabb helyiértékű bitje határozza meg az aktuális regisztert.
2.1.3.3 Direkt címzés
A direkt címzésnél az utasítás része az elérendő memória címe. A cím az utasítás műveleti kódja utáni hexadecimális szám. Például: MOV A,32H alakú utasítás a 32H című belső memória tartalmát az Akkumulátor-ba (A) viszi. A speciális funkció-regiszterek (SFR-k) csak a direkt címzéssel érhetők el. Az SFR regisztereken kívül a belső RAM alsó 128 bájtja is címezhető direkt módon.
2.1.3.4 Indirekt címzés
Az indirekt címzésnél nem az utasítás, hanem - az aktuális regiszterbank - R0,vagy R1 regisztere tartalmazza az elérendő memóriacella címét. A 8 bites tartalommal 256 bájt széles RAM terület címezhető. E terület lehet a belső, vagy a külső RAM-ban is. Természetesen a 8051 típusnál a belső RAM csak 128 bájtos. Az indirekt címzésre példa a MOVX A,@Ri utasítás, amely az akkumulátorba viszi a külső RAM egy cellájának tartalmát. A cella címe az Ri regiszterben van. A magasabb helyiértékű 8 címbit ezalatt nem változik meg. Az utasítás segítségével relatív címzést is meg tudunk valósítani. Először a P2 SFR-be kell beírni a cím magasabb bájtját, s az Ribe pedig az alacsonyabb bájtot. Az indirekt címzésű egy bájtosak. Segítségükkel a teljes 64 Kbájtnyi külső RAM egy kisebb területe érhető el. A teljes memóriaterület címzése a DPTR adat-mutató regiszterrel történhet (@DPTR).
Mivel a verem-terület kisebb 256 bájtnál, akkor a PUSH és POP utasításoknál is indirekt a címzés. A címe itt a verem-mutatóban (SP) van. Ezen az alapon a verem-terület is a RAM tetszőleges területére helyezhető. A programozónak kell biztosítani a magasabb helyiértékű 8 címbit megfelelő beállítását.
13
14
2.1.3.5 Közvetlen címzés
ADD
A közvetlen címzésnél az adat, amellyel műveletet akarunk végezni nem valamelyik RAM egyik cellájában, hanem az utasításban van. Ez azt jelenti, hogy az értéket - az utasítás részeként - a programmemóriába (ROM, vagy EPROM) kell beírni.
ADDC mint az ADD utasítás, de még a CY flag értékét is az eredményhez adja.
Például: a MOV A,#23H utasítás 23 hexadecimális értéket ír az akkumulátorba. A közvetlen címzést leggyakrabban a matematikai, vagy a fizikai képleteket megoldó programoknál használjuk.
INC
2.1.3.6 Indirekt regiszter-címzés Az indirekt-regisztercímzésnél a tényleges fizikai címet két regiszter tartalmának az összege adja. A cím tehát egy bázis-, és egy eltolási (offset) címrészből áll. A bázis cím vagy az adatmutatóban (DPTR), vagy a programszámlálóban (PC) van. E címhez adja hozzá egy belső regiszter (pl. @A) tartalmát.
DA •
a címzett memória és az akkumulátor tartalmát adja össze. Az eredmény az akkumulátorba kerül. a BCD számok összeadásakor végez korrekciót. az adott memória tartalmát inkrementálja (1-el növeli).
Kivonó utasítások
DEC
az INC utasítás ellentettje. Az adott memória tartalmát dekrementálja (1-el csökkenti).
SUBB
az akkumulátor tartalmából levonja az adott bájtot. Ha a CY=1, akkor az eredményből még 1-t levon. A művelet eredménye az akkumulátorba kerül.
•
Szorzó és osztó utasítások
A B regisztert (az SFR-ben) kizárólag csak ezeknél az utasításoknál használja a kontroller.
A 8051-nek 111 különböző utasítása van. Ezek a következő négy csoportba sorolhatók: adatátviteli utasítások, aritmetikai utasítások, logikai, ill. bit műveleti utasítások, vezérlő utasítások.
D R K
• • • •
2.1.4.1 Az adatátvíteli utasítások: általános-, akummulátor-, és a Data-Pointeres adatmozgató utasítások. Az adatátvíteli - az un. MOV - utasítások regiszter vagy RAM cella tartalmát viszi át másikba. A PUSH és POP utasítások is a MOV csoportba tartoznak. Ez az utasítástípus három csoportra bontható.
• Az általános adatátvíteli utasítások
A csoportot az alábbi utasítások alkotják: MOV
egy bitet, vagy bájtot visz át regiszterből regiszterbe, vagy RAM-ba, illetve fordítva.
PUSH inkrementálja a verem-mutató (SP) tartalmát majd a vonatkozó adatot az SP által címzett memóriába írja. POP
az SP által címzett memória tartalmát átírja a vonatkozó helyre, majd dekrementálja az SP tartalm*át.
A MOV utasítások a címzett helyről az adatot átmásolják a cél helyre, de közben a forrás tartalmát nem változtatják meg.
• Akkumulátor-utasítások
Ezeknél az utasításoknál az ACC-regiszter a célja, vagy a forrása az adatátvitelnek. Az akkumulátor önmaga lehet a cél is és a forrás is. XCH
(exchange) az akkumulátor és a címzett memória tartalmát cseréli fel.
XCHD hasonló az XCH utasításhoz, de csak az akkumulátor és a címzett memória tartalmának az alsó négy bitjét cseréli meg.
MUL
két előjel nélküli 8 bites számot szoroz össze. A szorzandókat az ACC és a B regiszterekbe kell vinni. A szorzat két bájtos lesz. Az eredmény alacsonyabb helyiértékű bájtja az ACC-be, míg a magasabb helyiértékű pedig a B-be kerül. A 256-nál nagyobb eredménynél az OV 1-be íródik.
DIV
az ACC tartalmát osztja a B tartalmával. Előjelet nem vesz figyelembe! Az osztás egészrészét az ACC fogja tartalmazni. A maradék kerül a B regiszterbe. Ha a hányados 0, akkor az OV flag 1-be íródik.
2.1.4.3 Logikai és boole utasítások. A logikai utasítások formailag nagyon hasonlóak a mikroprocesszorok azonos jellegű utasításaihoz. E csoport viszont az aritmetikai műveletekkel ellentétben - sokkal bővebb alkalmazási lehetőséget nyújt. A 8051-es mikrokontrollert elsődlegesen vezérlésekhez fejlesztették és ezért mind bitekkel, mind pedig bájtokkal tud logikai műveleteket végrehajtani.
D R K
2.1.4 A különböző utasítás fajták
ANL
logikai ÉS művelet az operendusok azonos helyiértékű bitjei között. Az eredmény az első operandus helyére íródik, míg a második nem változik meg.
CLR
törli a direkt címzett bitet, vagy az akkumulátort.
ORL
az ANL-hez hasonlóan végez logikai VAGY műveletet.
RL
az akkumulátor tartalmát egy hellyel balra forgatja.
RLC
az akkumulátor tartalmát a CY közbeiktatásával forgatja egy hellyel balra.
RR
az akkumulátor tartalmát egy hellyel jobbra forgatja.
RRC
az akkumulátor tartalmát a CY közbeiktatásával forgatja egy hellyel jobbra.
Az RLC és RRC utasításoknál a CY az akkumulátor kilencedik bitjének tekinthető. SETB
a direkt címzett bitet 1-be írja.
SWAP felcseréli az akkumulátor felső- és alsó négy bitjét. XRL
az EXKLUSIV-VAGY művelet két operandus azonos helyiértékű bitjei között. Az eredmény - az ANL és ORL műveletekhez hasonlóan - az első operandus helyére kerül.
Az ANL, ORL műveletek egyes bitek között is alkalmazhatóak. A hagyományos diszkrét logikai hálózatok kiválthatók a 8051 bázisú rendszerrel (például a különböző tárolt programú vezérlések).
MOVX a külső adatmemória és az akkumulátor között végez adatátvitelt.
2.1.4.4 Vezérlő utasítások: feltétel nélküli CALL és JUMP, feltételes JUMP.
MOVC programtárolóból visz egy bájtot az akkumulátorba. A címzésnél a DPTR-ben, vagy PC-ben van a báziscím.
A vezérlő utasítások alkalmazhatók a programokon belüli különböző ugrások végre-hajtására. Ilyen lehet egy szubrutin hívása, vagy egy feltételtől függő programelágazás. A vezérlő utasítások az alábbi három osztályba sorolhatók:
• Data-Pointer utasítás MOV
DPTR, # áll a megadott 16 bites állandóval tölti fel a Data-Pointer DPH és DPL regisztereít.
2.1.4.2 Az arítmetikai utasítások: összeadás, kivonás, szorzás és osztás. A 8051 mikrokontroller matematikai műveletei korlátozottak. Csupán 8 bites előjeles számokkal lehet műveleteket végezni. Az Overflow-flag (OV) segíti a felhasználót az elő-jeles számok összeadásánál és kivonásánál. A 8051 aritmetikai utasításai hasonlítanak a 8080 és a 8085 mikroprocesszorok azonos utasításaihoz. •
Összeadó utasítások
• feltétel nélküli CALL és JUMP, • feltételes JUMP, • megszakítások. Ezen utasítások közös jellemzője, hogy a programszámláló tartalmát változtatják meg. A PC határozza meg, hogy a kontroller mely címről hív be utasítást. Ennek megváltoztatásával vezérelhető egy programelágazás. A JUMP és a CALL utasítások megtörik a program tiszta sorrendi (lineáris) lefutását.
15 A JUMP-ok (esetleg egy meghatározott feltételtől függően) a program meghatározott helyére történő ugrást vezérlik. A program végrehajtása e helyről fog folytatódni. A CALL utasítás egy szubrutint hiv. A rutin feldolgozása egy RET utasításig tart. A RET hatására a főprogram - a CALL utasítást követő helyről - fut tovább. Ugyanaz a szubrutin a főprogram tetszőleges helyéről és többször is hívható. Elsődlegesen a különböző összetettebb matematikai műveletekhez használjuk a szubrutinokat.
16 #data 16 az utasításban megadott 16 bites adat (a 2. és a 3. bájt). rel
egy relatív cím. A következő utasítás címéhez viszonyítottan -128 és +127 területen belülre mutathat.
bit
jelentheti a 128 "softver-flag" valamelyikét, egy I/O bitet illetve vezérlő vagy státuszbitet.
A megszakítási elágazás, hasonlóan a CALL-hoz egy szubrutin hívását jelenti. Lényeges eltérés az hogy ezt az ugrást egy hardveresemény váltja ki. A szubrutin hívása a meg-szakítás után azonnal megtörténik. Feltétel nélküli CALL és JUMP
ACALL
két bájtos szubrutin hívó utasítás.2 K-bájtos szegmensen belüli programugrást hajt végre. Az ACALL-hoz 11 bites cím tartozik. A PC-ben lévő legnagyobb helyiértékű öt bit érvényes marad (együtt adják a 16 bites címet). Az ACALL hívásakor a PC tartalma inkrementálódik. Ha az ACALL egy 256-bájtos szegmens utolsó két bájtja, akkor a PC inkrementálása miatt az a következő szegmensbe kerül.
LCALL három bájtos szubrutinhívó utasítás. Hasonló az ACALL-hoz, de alkalmas a teljes 64-Kbájton belüli tetszőleges című rutin hívására.
D R K
AJMP/LJMP lényegében az ACALL és LCALL utasításokhoz hasonlóan használhatók. SJMP
egy rendkívüli ugrás utasítás. A SHORT JUMP használatával csak 256 bájtos területen belüli ugrás oldható meg.
JMP @A+DPTR az ugrás címét a DPTR és az akkumulátor tartalmának összege adja. A 8 bites akkumulátor-tartalom egy lapot fog át. A DPTR a teljes 64 Kbájtos programmemória tetszőleges helyére mutathat. RET •
az ACALL vagy az LCALL utasításokkal meghívott szubrutinból való visszatérést vezérli. Hatására a PC-be íródik a szubrutin hívást követő utasítás címe.
Feltételes JUMP
Az előzőekkel ellentétben az ugrás csak akkor következik, ha meghatározott feltétel teljesül. A feltételes ugrás mindig relatív. Az éppen aktuális helytől számítottan 8 bites címtávolságon belül lehet a célhely. Ez azt jelenti, hogy a feltételes ugrásoknál az utasítás helyétől számítva -128, vagy +127 területen belül lehet a cél cím. A 8051-nek a következő feltételes ugróutasításai vannak: JZ
akkor következik az ugrás, ha az akkumulátor tartalma 0.
JNZ
akkor következik az ugrás, ha az akkumulátor tartalma nem 0.
JC
akkor következik az ugrás, ha a Carry-Flag 1.
JNC
akkor következik az ugrás, ha a Carry-Flag 0.
JB
akkor következik az ugrás, ha egy tetszőleges, direkt címzett bit 1.
JNB
akkor következik az ugrás, ha egy tetszőleges, direkt címzett bit 0.
JBC
akkor következik az ugrás, ha egy tetszőleges, direkt címzett bit 1.Utána törli a bitet.
CJNE
összehasonlítja két regiszter tartalmát. Akkor következik az ugrás, ha a két tartalom nem egyforma. Amikor az elsőnek adott regiszter tartalma a kisebb, akkor a CY is 1-be íródik. Ellenkező esetben törlődik.
DJNZ
először dekrementálja az adott címen lévő értéket. Majd ellenőrzi, hogy a csökkentett érték 0 vagy nem és az utóbbi esetben hajtja végre az előírt ugrást.
A továbbiakban megadjuk a pontos Assembly jelölésüket (mnemonic) is. Az INTEL cég processzoraira és kontrollerjeire érvényes a következő írási sorrend: első művelet, második az adat-cél és végül következik a forrás. A felhasználói könyvek, katalógusok az alábbi rövidítéseket használják: Rn
az R0 - R7 munkaregiszterek valamelyikét jelöli. Az utasítás e regiszter tartalmára vonatkozik.
direct
a belső RAM-ban egy cím, I/O port vagy státusregiszter. Az utasításban hexadecimálisan kell megadni.
@Ri
az R0,vagy R1 regiszterek tartalma, amely az elérendő bájt címe.
#data az utasításban megadott 8 bites adat.
A 1.1 - 1.4 táblázatokban az egyes utasítások hosszát és az oszcillátor periódusában megadott végrehajtási idejét adtuk meg. A felhasználó ezek alapján kiszámíthatja a szükséges memóriaterületet és a futás időt. Már említettük, hogy egy gépi ciklus hossza 12 oszcillátor periódus. 1.1.táblázat Adatátvíteli utasítások
MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV MOV MOVC MOVC MOVX MOVX MOVX MOVX PUSH POP XCH XCH XCH XCHD
Utasítás A,Rn A,direct A,@Ri A,#data Rn,A Rn,direct Rn,#data direct,A direct,Rn direct,direct direct,@Ri direct,#data @Ri,A @Ri,direct @Ri,#data DPTR,#data16 A,@A+DPTR A,@A+PC A,@Ri A,@DPTR @Ri,A @DPTR,A direct direct A,Rn A,direct A,@Ri A,@Ri
Hossz bájtban 1 2 1 2 1 1 2 2 2 3 2 3 1 2 2 3 1 1 1 1 1 1 2 2 1 2 1 1
Oszcillátor periódus 12 12 12 12 12 24 12 12 24 24 24 24 12 24 12 24 24 24 24 24 24 24 24 24 12 12 12 12
ADDC SUBB SUBB SUBB SUBB INC INC INC INC INC DEC DEC DEC DEC MUL DIV DA
A,#data A,Rn A,direct A,@Ri A,#data A Rn direct @Ri DPTR A Rn direct @Ri AB AB
D R K
•
A feltétel nélküli ugrás, mint ahogyan a nevében is benne van, nem függvénye valamilyen eredménynek. Az ugrás minden esetben bekövetkezik, amikor a program egy ilyen utasításhoz ér. Szigorúan véve a RETURN utasítás is e csoportba tartozik. A CALL végrehajtása előtt a fő-program következő utasításának címe a verem-be íródik. Ezután a Verem-pointer értéke kétszer inkrementálódik (16 bites cím kerül be a verem-be). A RET utasítás hatására ez a cím visszaíródik a PC-be. Végül az SP tartalma kettővel csökken.
2.1.5 Az utasítások hossza és végrehajtási idejük
1.2.táblázat Arítmetikai utasítások Utasítás ADD A,Rn ADD A,direct ADD A,@Ri ADD A,#data ADDC A,Rn ADDC A,direct ADDC A,@Ri
Hossz bájtban 1 2 1 2 1 2 1
Oszcillátor periódus 12 12 12 12 12 12 12
2 1 2 1 2 1 1 2 1 1 1 1 2 1 1 1 1
12 12 12 12 12 12 12 12 12 24 12 12 12 12 48 48 12
1.3.táblázat Logikai és boole- utasítások Utasítás ANL A,Rn ANL A,direct ANL A,@Ri ANL A,#data ANL direct,A ANL direct,#data ORL A,Rn ORL A,direct ORL A,@Ri ORL A,#data ORL direct,A ORL direct,#data XRL A,Rn XRL A,direct XRL A,@Ri XRL A,#data XRL direct,A XRL direct,#data CLR A CPL A RL A RLC A RR A RRC A SWAP A CLR C CLR bit SETB C SETB bit
Hossz bájtban 1 2 1 2 2 3 1 2 1 2 2 3 1 2 1 2 2 3 1 1 1 1 1 1 1 1 2 1 2
Oszcillátor periódus 12 12 12 12 12 24 12 12 12 12 12 24 12 12 12 12 12 24 12 12 12 12 12 12 12 12 12 12 12
17 C bit C,bit C,/bit C,bit C,/bit C,bit bit,C rel rel bit,rel bit,rel bit,rel
1 2 2 2 2 2 2 2 2 2 3 3 3
12 12 24 24 24 24 12 24 24 24 24 24 24
Hossz bájtban
Oszcillátor periódus 24 24 24 24 24 24 24 24 24 24 24 Oszcillátor periódus 24 24 24 24 12 12
1.4.táblázat Vezérlő utasítások Utasítás ACALL addr11 LCALL addr16 RET AJMP addr11 LJMP addr16 SJMP rel JMP JZ rel JNZ rel CJNE A,direct,rel CJNE A,#data,rel
2 3 1
CY X X X 0 0 X X X X X X X X X X X X
OV X X X X X
AC X X X
1.8.READ-MODIFY-WRITE utasítások A READ-MODIFY-WRITE utasítások egy port tartalmát kiolvassák, a kívánt értékre változtatják és azonnal visszaírják a port-latchbe. A READ-MODIFY-WRITE utasításokhoz mindig egy port címe tartozik. Az csoportba a következő utasítások tartoznak: Utasítás Példa ANL ANL P2,A ORL ORL P1,A XRL XRL P1,A JBC JBC P2.2,re CPL CPL P1.1 INC INC P1 DEC DEC P1 DJNZ DJNZ P1,rel MOV MOV P2.1,C CLR CLR P1.0 SETB SETB P1.0
D R K
2 3 2 1 2 2 3 3 Hossz Utasítás bájtban CJNE Rn,#data,rel 3 CJNE @Ri,#data,rel 3 DJNZ Rn,rel 3 DJNZ direct,rel 3 NOP 1 RETI 1 1.7. A FLAG-ket befolyásoló utasítások
Utasítás ADD ADDC SUBB MUL DIV DA RRC RLC SETB C CLR C CPL C ANL C,bit ANL C,/bit ORL C,bit ORL C,/bit MOV C,bit CJNE
A 8051 utasításai közül csak nagyon kevés változtatja a mikrokontroller flag-jeít.A 1.5. táblázatban foglaltuk össze, hogy az egyes flag-ekre melyik utasíts hat.Az X azt jelenti,hogy az adott flag-t az utasítás változtatja. A 0 ill. az 1 jelőli azt a konkrét értéket,amelyre a flag min-dig beáll a művelet hatására.
A lista első utasításainál azonnal belátható, hogy azok READ-MODIFY-WRITE utasítások. Az utolsó háromnál első látásra kétséges. Ezekre is érvényes, hogy először a port kiolvasása, az érték módosítása és a visszaírás követik egymást.
1.5.táblázat. A flag-ket állító utasítások
3. Az MCS-51-es család mikrokontrollereivel épített mikrogépek programozása 3.1 Alapfogalmak A programfejlesztés célja: Olyan gépikód-, és adatsorozat létrehozása, amely alapján az adott mikroprocesszor, mikrokontroller a kívánt feladatot végrehajtja. (A szükséges aritmetikai, logikai műveleteket elvégzi, a perifériákat kezeli stb.) A programfejlesztés lépései:
1. A feladat egyértelmű megfogalmazása 2. A program elemeinek, szerkezetének meghatározása. Ennek fő egységei: • főprogram, • egyedi programblokkok ( szubrutinok ), • változók, adatstruktúrák. Mindezeket szövegesen, és folyamatábrákon célszerű rögzíteni. Ez jelentősen segíti a programírást, illetve a menet-közbeni ellenőrzéseket, majd a programélesztést. 3. A programozás lépései : • a szöveges forrásnyelvi fájl megírása a választott programnyelv szintaktikai (formai) és szemantikai ( értelmezési ) szabályainak betartásával, • az un. tárgykódú (object) fájl létrehozása a megfelelő fordító program (assembler, compiler) programmal, • az obj. fájlból, vagy fájlokból futtatható program előállítása a szerkesztő (linker) programmal. 4. Programtesztelés, élesztés módszerei: • program szimuláció arra ad lehetőséget, hogy a programunk működését számítógépes környezetben lépésenként, vagy nagyobb blokkokban - ellenőrizhessük, • valós idejű ellenőrzés emulátor-on, vagy a végleges hardveren elemző monitorprogram segítségével. A mikrokontroller programozásához használt nyelvek • az un. processzor-közeli assembly nyelv, • a magas szintű nyelvek közül a C nyelv.
3.2 Programozás assembly nyelven
D R K
CPL CPL ANL ANL ORL ORL MOV MOV JC JNC JB JNB JBC
18
Assembly nyelven irt program elemi lépéseit az adott mikrokontroller (mikroprocesszor) utasításai határozzák meg. Ezért nevezik ezt processzor-közeli, vagy gépi szintű programozásnak. A korszerű fordítók ( assemblerek) támogatják: • • • • •
a moduláris programozást, az abszolút és relatív program-, és adatszegmensek használatát, a szimbólumok használatát, a makrók írását, használatát, a könyvtárak használatát.
A magas szintű programnyelvekkel ellentétben a programozónak kell: • a különböző programblokkokat az elemi utasításokból összeállítani, • a program és adatszegmensek elhelyezkedését meghatározni, • gondoskodni kell az adatok, változók elhelyezési formájáról, helyéről.
Mindezen feladatok végrehajtását támogatják az assemblernek szóló különböző direktívák, fordítási és formátum parancsok.
19
8051 FORRÁSFÁJL .A51
MAKROASSEMBLER
(SZÖVEGSZERKESZTŐ)
ÁTHELYEZHETŐ (RELOKÁLHATÓ) OBJECT FÁJL
(A51) .LST
OBJECT FÁJL 1 ....
.__
LINKER/LOCATOR
OBJECT FÁJL n
ABSZOLUT OBJECT FÁJL
(L51) .LIB
LIBRARY
LISTAFÁJL
.OBJ
.M51
CROSS. REF. MAP FÁJL
ABSZOLUT
KONVERTÁLÓ
OBJECT FÁJL .HEX KONVERTÁLÓ HEX TO BIN LETÖLTÉS
.HEX
INTEL HEX FORMAT
.HEX
SZIMULÁTOR
.M51
(SIMUL5X)
TESZTELÉS
.HEX EPROM ÉGETŐ
KIPRÓPÁLÁS
51- ES FEJLESZTŐ MONITORPROGRAMMAL
D R K
.HEX
ASSEMBLER PROGRAM FEJLESZTÉSÉNEK LÉPÉSEI
3.2.1 A forrásnyelvi fájl írása
A forrásnyelvi fájl tetszőleges szövegszerkesztővel irható, de mindenképen text formátumban kell tárolni a további feldolgozáshoz. A szöveges program alapvetően két követelményt kell kielégítsen, mégpedig: • a fordító program feldolgozhassa, vagyis meg kell feleljen a formai (szintaktikai) előírásoknak, és az utasítások, operátorok, direktívák helyes használatát megszabó (szemantikai) követelményeknek, • a program olvasható, elemezhető legyen.
Az utóbbi elvárás a programfejlesztési, ellenőrzési, és az esetleges módosítási munkát segíti, rövidíti le. Egy terjedelmesebb program több fájlban is megírható. Az önálló fájlba irt szöveges programot nevezik modul - nak. Minden modult külön-külön kell lefordítani, vagyis létre kell hozni az egyes modulok object fájljait. (Természetesen az egyes modulok a program önálló funkciójú egységei kell legyenek.) A forrás-fájlokat MODUL_NÉV.A51 fájlnéven kell tárolni. Az egyes modulok - így az egy modulos program - legalább az alábbi egységekből kell álljon: • szegmensek kijelölése ( program, adat, stack ), • változók deklarációja ( név, hely, kezdőérték), • program blokkok ( főprogram, szubrutinok stb. ). A forrásnyelvi fájl egy sorának általános felépítése: deklarációban: DIREKTIVA [Op1][,Op2][,Op3]
a Szimbólumhoz rendelhetők: • változók címe, • változók értéke, • programrészek címe.
[Címke:] 8051_mnemonic [Op1][,Op2][,Op3] (Az operandusok száma utasításfüggő!) az operandus lehet: • • • • • • •
;Megjegyzés
speciális assembler szimbólum (pl .regiszter), program szimbólum, indirekt cím, konstans, belső RAM cím, bit-cím, program cím.
A használható speciális assembler szimbólumok:
(OHS51)
.TSK
[Szimbólum]
programsorban:
A (ACC) B R0...R7 DPTR PC C AB AR0..AR7
Akkumulátor B regiszter az aktuális regiszter-bank munkaregiszterei a külső memóriák címzéséhez használt regiszterpár (DPH-DPL) programszámláló túlcsordulás bit regiszter-pár szorzásnál, és osztásnál az aktuális regiszterbank munkaregisztereinek abszolút címe
D R K
EDITOR
.OBJ
20
A további szimbólumokat a deklarációs részben, vagy az un. ínclude fájlban ( pl. a 80C552 kontroller SFR és bit címei 80552.inc fájlban vannak) definiálhatunk. Az operandusok, vagy új szimbólumok előállíthatók a már deklarált szimbólumok operátorokkal történő összekapcsolásával. Operátorok: aritmetikai: +,előjel ( +5, -0AH ) +,összeadás, kivonás ( cím + offset ) * szorzás ( 1200H*7 ) / osztás ( 17/4 ) MOD maradék ( 17 MOD 4 ) () csoportosítás ( (cím-offset)*3 ) logikai: NOT egyes kompl. ( NOT 5 ) HIGH szó felső bájtja ( HIGH 1234 ) LOW szó alsó bájtja ( LOW 1234 ) SHR,SHL jobbra/balra lépt. ( 2 SHR 8 ) AND ÉS művelet ( SIMB AND 0AH ) OR VAGY művelet ( SIMB1 OR SIMB2 ) XOR KIZÁRÓ-VAGY m. ( 12H XOR 5 ) hasonlító: >= / GTE nagyobb egyenlő ( SIMB >= 13H ) <= / LTE kisebb egyenlő (SIMB LTE 0A1H ) <> / NE nem egyenlő ( SIMB NE 045H ) = / EQ egyenlő ( SIMB = 0A2H ) < / LT kisebb mint ( SIMB < 0B2H ) >/ GT nagyobb mint ( SIMB GT 051H )
3.2.2 Assembler DIREKTIVÁK
;Megjegyzés
A direktívák tulajdonképpen a fordítást vezérlő parancsok. Ezek segítségével • • • •
definiálhatók szimbólumok, foglalhatók le és inicializálhatók memória területek, kapcsolhatók össze modulok, állíthatók be program-, és szegmenscímek.
21
EQU
A szimbólumhoz rendel egy értéket, vagy regiszter nevet. A szimbólum értéke késöbb már nem változtatható. pl. HATAR EQU 1200 ERTEK EQU HAT+R - 'A' AKKU EQU A SZAML EQU R7
SET
A szimbólumhoz úgy rendel értéket, vagy regisztert, hogy az újra definiálható. pl. TAR SET R0 VALT SET 1AH . TAR SET R1 VALT SET 0D2H
DATA
A szimbólumhoz rendel egy direkt címezhető belső memória címet. pl. BEM1 DATA 20H KIM2 DATA 22H A szimbólumhoz rendeli a csak indirekt címezhető belső memória egy címét. pl. OSSZEG IDATA 60H MARAD IDATA OSSZEG - 1
D R K
IDATA
XDATA
A szimbólumhoz rendeli egy külső memória címét. pl. TABL XDATA 100H KIF1 XDATA TABL + 23H
CODE
A szimbólumhoz rendeli a programmemória egy címét. pl. START CODE 00H INTV_0 CODE START + 3
SEGMENT
Egy relokálható SZEGMENS deklarálását biztosítja. A következő formában használható: Szegm_Nev SEGMENT Szegm_tipus [elh_tip] ahol a Szegm_Nev a szegmens funkciójára utaló név, Szegm_tipus megadja, hogy a szegmens melyik memóriaterületre legyen letöltve, elh_tip a letöltés kezdetét határozza meg [ opcionális ].
Szegmens-típusok:
CODE program memória, XDATAkülső adatmemória, DATA a direkt címezhető belső memória, IDATA indirekt címezhető belső memória, BIT a bit-címezhető belső memória.
3.2.2.2 Helyfoglaló, és inicializáló direktívák DS
adott számú összefüggő memóriaterületet foglal le (bármelyik memóriában), használata: [Cimke:] DS szám, vagy kifejezés
DBIT
adott számú bitet foglal le, használata: [Cimke:] DBIT szám, vagy kifejezés
DB
a programmemóriában ad kezdőértéket a felsorolt bájtoknak, használata: [Cimke:] DB szám[,kifejezés][,szimbólum]...
DW
a programmemóriában ad kezdőértéket a felsorolt szavaknak, használata: [Cimke:] DW szám[,kifejezés][,szimbólum]...
3.2.2.3 Modulok közötti kapcsolatok direktívái Feladatuk a különböző modulokban deklarált szimbólumok elérésének biztosítása. PUBLIC
EXTRN egy másik modulban deklarált szimbólum elérését biztosítja az aktuális modulban. Használata: EXTRN Szegm_tipus(Szimb_lista) NAME az egyes tárgy-modulok (object) megkülönböztetését teszi lehetővé. Ha nem adjuk meg, akkor a forrásfájl neve lesz a tárgy-modul neve is. Használata: NAME Tárgy_mod_név
3.2.2.4 Cím beállító és szegmens választó direktívák
A direktívák segítségével adhatók meg programrészek, szegmensek kezdő címei, illetve választhatók már létező szegmensek. ORG
meghatározza a következő utasítás, vagy adat címét. ORG 100H ORG START
END
a forrásprogram végét jelzi. ( Mindig kell használni )
RSEG
egy - már korábban definiált - relokálható szegmenst kiválaszt RSEG Szegmens_név
CSEG, DSEG, XSEG, ISEG, BSEG az egyes szegmensek kezdőcímét lehet megadni a direktívák segítségével. Használatuk: CSEG DSEG XSEG ISEG BSEG
Elhelyezési típusok: PAGE INPAGE INBLOCK
lapkezdetre igazítás ( csak CODE és XDATA után ), a szegmens csak egy lapon belül lehet (csak CODE és XDATA után), a szegmens csak egy 2048 bájtos blokkot foglalhat el (csak CODE után),
BITADDRESSABLE a belső memória bit-címezhető 16 bájt-ja ( 20H - 2FH )lehet ( csak DATA és IDATA után ), UNIT egy biten, vagy egy bájton kezdődő szegmens, OVERLAYABLE olyan szegmens, amelyet a C-51 deklarált, és ebbe beszerkesztés engedélyezett.
a direktívával deklarált szimbólumok minden modulból elérhetők. Használata: PUBLIC Szimb[,Szimb[,....]]
D R K
3.2.2.1 Szimbólum definiáló direktívák:
22
[AT absz-cím] [AT absz-cím] [AT absz-cím] [AT absz-cím] [AT absz-cím]
Amennyiben nincs cím, akkor a fordításnál mindegyik szegmens 0 címnél kezdődik. USING
az aktuális regiszterbankot választja ki. Használata: USING sorsszám (a sorszám 0...3 lehet)
A szegmensek kijelölésére, a változók elhelyezésére, és a különböző helyfoglalásokra mutat mintát a PELDA1.LST fájl. A bemutatott példa a forrásnyelvi fájl fordítása után létrehozott lista-fájlt szemlélteti. A lista végén látható szimbólumtáblázat megadja, a szimbólum nevét, típusát ( C,D,B,N ), relokálható (R), vagy abszolut címre (A) került a deklarálásnál, valamint azt, hogy a lista hányadik sorában került deklarálásra #, és melyik sorokban használt még az adott szimbólum. A relokálhatóaknál még a szegmensnév is látható. Megfigyelhető, hogy minden relatívan
23 (relokálhatóan) deklarált szegmens változóinak címe 0-án kezdődik. A tényleges címet a szerkesztés ( linkelés ) után kapják meg. A51 MACRO ASSEMBLER
PELDA1
DATE
02/09/96
PAGE
1
24
---0000
MS-DOS MACRO ASSEMBLER A51 V4.4 OBJECT MODULE PLACED IN C:\XE2A51\GYAK\PELDA1.OBJ ASSEMBLER INVOKED BY: A51 C:\XE2A51\GYAK\PELDA1.A51 LINE 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 F 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
SOURCE ;xxxxxxx fordítási parancsok xxxxxxx
$XREF $DEBUG ;******************************************************* ;* K K M F Automatika Intézet * ;* Elektronika Szakcsoport * ;******************************************************* ;* F‹program: Helyfoglalás adatoknak * ;* Változat: V1.0 * ;* Dátum: 1996.08.20 * ;* Készítette: Zalotay Péter * ;******************************************************* ;* A modul leírása: * ;* Példák a különböző helyfoglalási megoldásokra * ;*******************************************************
----
0000 758100
---0000 0001 0003 0004
---0000 0001
---0000 0001 0002
NAME
Pelda_1
;xxxxxxx Deklarációk xxxxxxx
;**** Relatív címmegadások (relokálható szegmensek)*****
VALT1 VALT2 VALTB STACK PROG
SEGMENT SEGMENT SEGMENT SEGMENT SEGMENT
DATA ;Adatszegmens a direkt címezhető belső mem.-ban DATA BITADDRESSABLE ;Adatszegm. a bit címezhető belső m.-ban BIT ;Bit szegmens IDATA ;Stack szegmens CODE ;Program szegmens
;****** Program szegmens ******
RSEG
PROG
MOV
SP,#STACK-1 . . .
; ; ;
;A program első utasítása
;A program vége
;****** Adatszegmens a direkt címezhető belső memóriában ******
V1: V2: V3:
RSEG
VALT1
DS DS DS DS
1 2 1 20
;Helyfoglalások a V1,V2,V3 változóknak
;Nevezetlen memóriaterület lefoglalása
;***** Adatszegmens a bit címezhető belső memóriában *****
BEM: KIM:
RSEG
VALT2
DS DS
1 1
;Helyfoglalás a BEM és KIM változóknak
;***** Bit szegmens *****
B1: B2: B3:
RSEG
VALTB
DBIT DBIT DBIT
1 1 1
1000 7800
0030 0031 0032 00AF
0030 0031 0000
;***** Stack szegmens **** RSEG
STACK
DS
10H
;Stack memória lefoglalása
;***** Abszolút címmegadások **** CSEG
AT
FOLYT:
MOV
R0,#KIM
DSEG
AT
BEM2: KIM2: V4 K1
DS DS DATA EQU
1 1 32H 0AFH
BSEG
AT
DBIT DBIT BIT
1 1 BEM.0
B4: B5: B6
1000H
30H
30H
END
D R K
OBJ
D R K
LOC
64 65 66 67 68 69 70 71 72 73 74 F 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91
XREF SYMBOL TABLE LISTING ---- ------ ----- ------N A M E
T Y P E
B1 . . . B2 . . . B3 . . . B4 . . . B5 . . . B6 . . . BEM. . . BEM2 . . FOLYT. . K1 . . . KIM. . . KIM2 . . PELDA_1. PROG . . SP . . . STACK. . V1 . . . V2 . . . V3 . . . V4 . . . VALT1. . VALT2. . VALTB. . REGISTER ASSEMBLY
V A L U E
. B ADDR 0000H.0 . B ADDR 0000H.1 . B ADDR 0000H.2 . B ADDR 0026H.0 . B ADDR 0026H.1 . B ADDR 0000H.0 . D ADDR 0000H . D ADDR 0030H . C ADDR 1000H . N NUMB 00AFH . D ADDR 0001H . D ADDR 0031H . ------. C SEG 0003H . D ADDR 0081H . I SEG 0010H . D ADDR 0000H . D ADDR 0001H . D ADDR 0003H . D ADDR 0032H . D SEG 0018H . D SEG 0002H . B SEG 0003H BANK(S) USED: 0 COMPLETE, NO ERRORS
ATTRIBUTES / REFERENCES
R R R A A R R A A A R A
A
R R R A
SEG=VALTB 60# SEG=VALTB 61# SEG=VALTB 62# 86# 87# SEG=VALT2 88# SEG=VALT2 53# 88 79# 75# 82# SEG=VALT2 54# 75 80# 19 REL=UNIT 29# 33 35 REL=UNIT 28# 35 66 SEG=VALT1 44# SEG=VALT1 45# SEG=VALT1 46# 81# REL=UNIT 25# 42 REL=BITADDRESSABLE 26# 51 REL=UNIT 27# 58
FOUND
A több modulos programoknál az egyes forrásnyelvi fájlok szerkezete a bemutatotthoz hasonló. Ilyen programokban a szimbólumoknak két fajtája létezik. Mégpedig: • a modulra lokális, és • a globális típusok. A modulra lokális csak az adott modulban érhető el, itt történik a deklarálásuk is. A globálisak minden modulból elérhetőek. Ezeket abban a modulban, ahol deklaráljuk a PUBLIC direktíva után fel kell sorolni. azokban a modulokban pedig, ahol felhasználjuk az EXTERN direktívával kell megjelölni az alábbiak szerint. ;xxxxxxx
;Helyfoglalás a B1,B2,B3 kétértékű változóknak EXTRN
Használt külső függvények xxxxxx
CODE
(STRKI,KIIR,BEOLV,T0O)
25 ;xxxxxxx Használt külső változók xxxxxxx EXTRN EXTRN
DATA BIT
26 Paraméter értékadásának ismétléséhez használható az IRPC makró-utasítás. pl.:
(BEM,BEMP,KIM) (LEP_J,LEP_BE,G_LEP,FUT_J,FUT_BE,KI,IR,IDOB)
definíció IRPC X,1987 ADDC A,#X ENDM
;xxxxxxx Kivülről elérhető szimbólumok xxxxxxx START,VBEC,VKIC,DBEC,DKIC,LEDS,NGS
3.2.3 Makrók definiálása és használatuk A makró olyan programrészlet, amelyet többször is akarunk használni, de eltérő argumentumokkal (operandusok, változók stb.). Az argumentumok a makró paraméterei. A makrót - a felhasználás előtt - definiálni kell, majd ezután lehet a makrót felhasználni (makróhívás). Definiálás
A definiáláshoz használjuk a következő makróutasításokat. • • • • • •
MACRO ENDM LOCAL IRP IRPC EXITM
D R K Makro_név
MACRO
[ paraméterek ]
sorral kezdődik, majd ezt követik a programutasításokat tartalmazó sorok az un. makró-törzs. Az utolsó sor az ENDM makró-utasítás kell legyen. pl. CLEAR MACRO G1,G2 MOV R0,#G1 MOV A,#G2 MOV @R0,A ENDM Amennyiben a makrón belül címké(ke)t kell használni, akkor ez(eke)t a makro-törzsben a LOCAL direktívával deklarálni kell. pl.: MEMCLR MACRO P1,P2,P3 LOCAL ISM MOV R0,#P1 MOV A,#P2 MOV R7,#P3 ISM: MOV @R0,A INC R0 DJNZ R7,ISM ENDM Azonos programrészek ismételhetők a REPT makró-utasítással. pl.: definíció REPT 3 MOVX @DPTR,A INC DPTR ENDM
Az EXITM makró-utasítás a makróból történő feltételes kilépést teszi lehetővé. pl.: MAC2 MACRO X,Y ...... IF X = 0 ; vagy X EQU 0 EXITM ENDIF ....... ENDM Makróhívás
Az általános makro-definíció a
eredmény MOVX @DPTR,A INC DPTR MOVX @DPTR,A INC DPTR MOVX @DPTR,A INC DPTR Ha egy paraméternek több értéket kívánunk adni, akkor ez az IRP makró-utasítással hajtható végre. pl.: definíció eredmény IRP X,
MOV R1,VAR1 MOV R1,X MOV @R1,A MOV @R1,A MOV R1,V2 ENDM MOV @R1,A MOV R1,Z2 MOV @R1,A
A,#1 A,#9 A,#8 A,#7
A már definiált makrót a programban a következő formában kell használni. Makro_név [ paraméterek ] pl.: CLEAR 20H,0 ; a CLEAR makró hívása . MEMCLR 20H,0,10 ; a MEMCLR makró hívása
3.2.4 Fordítási parancsok
D R K
PUBLIC
eredmény ADDC ADDC ADDC ADDC
A forrásnyelvi fájl fordítási módozatára adhatók a fordítási parancsok. A parancsok között az elsődleges típusúak csak egyszer használhatók, és a forrás-program legelső - értékelhető - sorában kell megadni (megjegyzés, magyarázó szöveg megelőzheti). A másodlagos típusú parancsok a programban többször, és bármely helyen megadhatók. Mindkét típusú parancsot sor elejére a $ jellel kezdve kell írni. A fordítási parancsok egy külön csoportját alkotják a feltételes parancsok, melyek segítségével - megadott feltételektől függően - programrészek kitilthatók a fordításból.
3.2.4.1 Elsődleges parancsok:
DATE (rövidítve: DA) A lista minden oldalán a fejlécbe dátum írása. A dátum maximálisan 9 betűs lehet. Alapértelmezés: MS-DOS szerinti írásmód Pl.: $ DATE (12/07/96) DEBUG/NODEBUG (rövidítve: DB/NODB) A DEBUG parancs hatására a szimbólum információk ( címkék, szimbólumok és értékük ) is belekerülnek a *.obj fájlba. Ezek révén a szimulátor, illetve emulátor is megjeleníti ezeket a szimbólumokat. Alapértelmezés: NODEBUG Pl.: $ DEBUG $ DB $ NODB
ERRORPRINT/NOERRORPRINT (rövidítve: EP/NOEP) A fordítás során felismert hibákat lehet egy megadott fájlba kiíratni. Nem változtatja meg azt, hogy a hibák a lista fájlba is bekerülnek Alapértelmezés: NOEP Pl.: $ EP(PROG1:ERR) $ NOEP OBJECT/NOOBJECT (rövidítve: OJ/NOOJ ) Parancs object fájl készítésére, vagy letiltására. Ha nem adunk meg nevet, akkor a forrásfájl nevén készül a fájl. Alapértelmezés: OBJECT ( fájl_név.OBJ) Pl.: $ OBJECT (C:\XE2A51\PELDA1.OBJ) $ NOOJ PAGELENGHT (rövidítve: PL)
27
PAGEWIDTH (rövidítve PW) A listázásnál egy sorba írt karakterek számát adja meg az utasítás után zárójelbe írt 8-132 közötti szám. Alapértelmezés: PW(120) Pl.: $ PW (79) $ PAGEWIDTH(122) PRINT/NOPRINT (rövidítve: PR/NOPR ) Készítsen, vagy ne készítsen lista fájlt. Ha a PRINT utasítás után nem adunk meg fájl nevet, akkor a forrásnéven készül a lista. Alapértelmezés: PRINT(forrás_név.LST) Pl.: $ PRINT $ NOPR $ PR(temp.lst)
D R K
SYMBOLS/NOSYMBOLS (rövidítve: SB/NOSB ) Írjon, vagy ne írjon szimbólum azok attribútumaival táblázatot a lista végére. Alapértelmezés: SYMBOLS Pl.: $ SYMBOLS $ NOSB MOD51/NOMOD51 (rövidítve: MO/NOMO ) Az alapértelmezésben (MOD51) az assembler felismeri a 8051 kintroller regiszter és SFR szimbólumait. Amennyiben más típushoz készül a program, akkor a NOMOD51 parancsot kell megadni, és az alkalmazott kontroller szimbólumait tartalmazó un. include fájlt (pl.: REG552.INC) kell a program elején beolvastatni az INCLUDE másodlagos paranccsal. Alapértelmezés: MOD51 Pl.: $ NOMOD51 COND/NOCOND (rövidítés: nincs) A COND parancs hatására feltételes fordítás (IF-ELSEIF-ENDIF szerkezet) érvénytelen részét is listázza, míg a NOCOND megadásnál nem. Alapértelmezés: COND Pl.: $COND $ NOCOND MACRO/NOMACRO (rövidítés: nincs) Alapértelmezésben felismeri, és feldolgozza a makró-definíciókat. A NOMACRO utasítás hatására a fordító nem dolgozza fel a makrókat. Alapértelmezés: MACRO Pl.: $MACRO $ NOMACRO REGISTERBANK/NOREGISTERBANK (röviditve: RB/NORB ) Az RB parancs határozza meg, hogy a programban melyik ( zárójelbe irt szám/számok ) regiszterbankokat kívánjuk használni. A NORB parancs megszünteti a helyfoglalást a bank számára. Alapértelmezés: REGISTERBANK(0) Pl.: $ REGISTERBANK (0,1) $ NORB XREF/NOXREF (rövidítve: XR/NOXR ) Írjon, vagy ne írjon szimbólum táblázat után keresztreferencia listát. Alapértelmezés: NOXREF Pl.: $ XREF $ NOXR TITLE (rövidítve: TT) Írjon a lap tetejére fejlécet. A szöveget zárójelben kell a parancs után írni. Alapértelmezés: TITLE a fájl neve kiterjesztés nélkül, vagy a 'NAME' paranccsal megadott név. Pl.: $ TITLE ( modul meghatározás )
3.2.4.2 Másodlagos parancsok EJECT (röviditve: EJ ) A parancs hatására a listában lapdobás következik Pl.: $ EJ INCLUDE (rövidítve: IC) A parancstól kezdve a fordító a zárójelbe irt fájlt fordítja és iktatja be az object fájlba, majd folytatja a forrásfájl fordítását. Maximálisan kilenc ilyen közbeiktatást alkalmazhatunk. Pl.: $ INCLUDE (REG552.INC) LIST/NOLIST (rövidítve: LI/NOLI ) A parancsok arra adnak utasítást, hogy a következő részeket listázza, vagy ne. Ezzel meghatározott részek listázása mellőzhető. Alapértelmezés: LIST Pl.: $ LIST $ NOLIST GEN/NOGEN (rövidítés: nincs ) A parancsok azt határozzák meg, hogy a makró-kifejtés bekerüljön, vagy ne a listába. Alapértelmezés: GEN Pl.: $ GEN $ NOGEN
3.2.4.3 Feltételes fordítási parancsok
D R K
A listázásnál egy lapra írt sorok számát adja meg az utasítás után zárójelbe írt 10-nél nagyobb szám. Alapértelmezés: PL (68) Pl.: $ PAGELENGHT (132) $ PL (75)
28
SET/RESET A feltételes fordítás számára deklarál, vagy szüntet meg szimbólumot és rendel a szimbólumhoz értéket. Ha csak a szimbólumot deklaráljuk, akkor értéke 0FFFFH lesz. Pl.: $ SET (TMP, VALT= 55) $ RESET (TEMP,VALT) IF A feltételes szerkezet kezdő parancsa. Utána kell megadni az értékelendő feltételt. Ha a feltétel teljesül, akkor folytatódik a fordítás, ellenkező esetben az ENDIF parancs utáni rész fordítása következik. Pl.: $ IF ( VALT=55) 1.programrész $ ENDIF 2.programrész ELSE Választásos feltételes szerkezet ( IF-ELSE-ENDIF) parancsa. Ha az IF feltétele nem teljesül, akkor az ELSE utáni rész fordítása következik. Pl.: $ IF ( VALT=55) 1.programrész $ ELSE 2. programrész $ ENDIF 3.programrész ELSEIF Egymásba ágyazott választásos feltételes szerkezet parancsa. Az ELSE ágon belül újabb IF, vagy IF-ELSE szerkezet beiktatását teszi lehetővé. Pl.: $ IF ( VALT=55) 1.programrész $ ELSEIF(VALT2) 2.programrész $ ELSEIF ( SWITCH=2) 3.programrész $ ENDIF 4.programrész ENDIF A feltételes fordítási szerkezet lezáró parancsa.
29
4. Szimulátor program az 51/52 mikrokontrollerekhez (SIMULA5X) A PC-n futó szimulátor program arra szolgál, hogy a mikrokontrollerben futó programot ellenőrzött módon lehessen végrehajtani. Ez azt jelenti, hogy a program végrehajtása közben: • meg tudjuk vizsgálni és esetleg módosítani a kontroller bármelyik regiszterének tartalmát (watch), • meg tudjuk a program futását adott helyen állítani, azaz töréspontot tudjunk elhelyezni (breakpoint), • tudjuk a programot lépésenként futtatni (single step), • a külső környezetből jövő (input) adatokat fájlból beolvasva szimulálni (stimulus), • illetve kiküldött (output) adatokat fájlba eltárolni, • a szimuláció során bekövetkező eseményeket a későbbi elemzés céljából gyűjteni (log). A program elindítása után a következő képet látjuk a számítógép képernyőjén: A verem Ha van stimulus fájl „memória akkor az aktuális sor A legfontosabb regiszterek neve, környezete” A fő menüpontok száma alattuk az aktuális tartalmuk A veremmutató aktuális értéke A program listája: programszámláló, utasításkód, mnemonik Memóriatartalom kijelzése: IData-belső RAM SFR-SFR regiszterek Xdata-külső RAM Code-progr.memória Az előzőleg végrehajtott utolsó két utasítás címe Portok kijelzése/ beállítása Segítő sor
Mivel a program támogatja az egér használatát, ezért a szokásos módon egérrel és billentyűzettel is kezelhető. A következőkben a File főmenüpontból elindulva megmagyarázzuk az egyes menűpontok jelentését: File menü parancsai:
Load Intel Hex file Load binary file Load symbol file Clear symbol stack Write Intel Hex file Write binary file Load stimulus file Open log file DOS command Quit ALT-F4
A gerjesztéseket tartalmazó fájlt egy szövegszerkesztővel lehet megírni. A pontosvesszővel és a /*-al kezdődő sorok megjegyzésnek minősülnek. Csak néhány utasítás használható. Portpknak és bitjeinek értékadása, késleltetés két gejesztés között (gépi ciklusban), várakozás portbemenet állapotára. Betöltéssel már aktivizáljuk a stimulus fájlt, és a képernyő bal felső felében megjelenő sor száma jelzi, hogy a fájl hányadik sora hajtódik végre. Egy kis mintafájllal illusztráljuk az elmondottakat.
Intel hexa formátumú fájl betöltése. (ld. később!) Bináris fájl betöltése - az a fájl a kódmemória bináris alakját tartalmazza Szimbólum fájl betöltése - a forrásprogramban használt címkék, változók nevei A szimbólumokat tartalmazó verem törlése A memória tartalmának Intel hexa formátumú fájlba írása A memória bináris tartalmának fájlba írása A bemeneti gerjesztéseket tartalmazó fájl betöltése A szimuláció alatt történt portokra vonatkozó eseményeket naplózó fájl nyitása DOS parancs kiadása a programból való kilépés nélkül Kilépés a programból
/* Stimulus minta fájl ; Portok beállítása (többfajta megadás lehetséges!) P0=055h, P1=0xff, P2 = $0FF ; delay n -> n gépi ciklusnyi késleltetés delay=10 P0=0, P1=055h, P2 = 0AAh, P3=03Ch Portbitek állítása P0.0=0 delay = 5 ; wait várakozás a portbit adott állapotára, ; csak akkor megy tovább wait P1.0=1 P4 = 0 ;analóg bemenetek állítása AD0 = 0.01, AD1=0.1, AD2=0.2, AD3=0.3 delay = 10 AD4 = 0.4, AD5=0.5, AD6=0.6, AD7=0.7 AD0= 0.99 ; break = a stimulus vége wait p3.3=1, break
Run menü parancsai: Single step F7 A program lépésenkénti végrehajtása Single proc F8 A program lépésenkénti végrehajtása, szubrutinok is egy lépésben Run program F9 A program végrehajtása Goto address F4 A program adott címére ugrás Restart user prog A újra indítása
D R K
D R K
File Run View Break Assemble Options F1=Help R0 R1 R2 R3 R4 R5 R6 R7 A B DPTR PC PSW Flags 00 00 00 00 00 00 00 00 00 00 0000 0000 00 - - - RB0- - -----xxxx------------------------------------------------------------------------PROG: + SP= 07 07 07 0000: 02 00 0C LJMP INIT1 + 0003: 75 D0 00 MOV PSW, #00 + FF: 00 00 00 00 INTRCL: + 03: 00 00 00 00 0006: 78 FF MOV R0, #FF + SP: 00 00 00 00 VICL: + 0008: 76 00 MOV @R0, #00 + OP-2:0000 000A: D8 FC DJNZ R0, VICL + OP-1:0000 INIT1: ţ 000C: 75 81 60 MOV SP, #60 + P0 = 11111111 000F: 90 5F FF MOV DPTR, #5FFF + P1 = 11111111 0012: C2 03 CLR GYU + P2 = 11111111 0014: 12 01 82 LCALL LACINIT + P3 = 11111111 MAIN: + P4 = 11111111 0017: 12 01 95 LCALL PICOLV + PWM0:0 PWM1:0 W 001A: F5 F0 MOV B, A - IData --0--1--2--3--4--5--6--7----8--9--A--B--C--D--E--F-IData-SFR-XData-Code0000: 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 *................* 0010: 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 *................* 0020: 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 *................* F2=SFR, F4=Goto Addr, F7=Step, F8=Proc, F9=Run, Alt F..,F10=Menue 80552/83552
30
Lépésenkénti program végrehajtás Ha a töréspontok elhelyezésével sikerült meghatározni azt a programrészt, ahol a program hibásan működik, akkor ezen a részen belül a hibás utasítás vagy utasítássorozat megtalálása a lépésenkénti program végrehajtás segítségével könnyen elvégezhető. Ebben az üzemmódban a felhasználói programnak mindig csak egy utasítása hajtódik végre, és ilyenkor mindig lehetőség van a regiszterek vagy a tártartalmak vizsgálatára, vagyis a végrehajtott utasítás hatásának, a program helyes működésének az ellenőrzésére. Lehetőség van szubrutinok egy lépésben történő végrehajtására is. View menü parancsai:
Register, R0 ... R0-R7 regisztertömb kijelzése/módosítása Ports, P0 ... Portok kijelzése/módosítása Internal RAM, Idata SFR Speciális funkciójú regiszterek Extern. memory,Xdata Külső adatmemória megnézése/módosítása Code memory, Cdata Program memória megnézése/módosítása IData symbols Belső RAM - hoz a programban rendelt szimbólumok megnézése SFR symbols SFR-ekhez a programban rendelt szimbólumok megnézése Bit symbols Bitekhez a programban rendelt szimbólumok megnézése Code symbols A programban használt szimbólumok megnézése XData symbols Külső RAM - hoz a programban rendelt szimbólumok megnézése Serial input Soros bemenetre küldött adatok Serial output Soros kimeneten megjelenő adatok Cycle count Ciklusszám megjelenítése Break menü parancsai:
Set breakpoint ctrl-B Clear breakpoint ctrl-E Remove all breakpoints List breakpoints
Töréspont beállítása Töréspont törlése Az összes beállított töréspont eltávolítása Töréspontok listázása
A felhasználónak a program belövése során igen nagy segítséget nyújt, ha a programot egy, még az indítás előtt kijelölt címen meg lehet állítani, azaz a futását felfüggeszteni. Ekkor ugyanis a regiszterek és a programban használt változók tartalmainak vizsgálatával könnyen eldönthető, hogy a program eddig a pontig helyesen, vagy hibásan működött. A
31
Assemble Disassemble screen Disassemble PRN Move code memory Fill code memory
Assembler forráskód beírása Kódból visszafordított assembler forrás képernyőre írása Kódból visszafordított assembler forrás nyomtatóra Program memória átmozgatása Program memória feltöltése
D R K
A fejlesztői munka során gyakori, hogy egy gépi kódú programrészlet működését kell megérteni. A gépi kódból az utasítások visszafejtése, egy aránylag egyszerűen programozható tevékenység. Lényegében a fordítóprogram (az assembler) működésénél leírtak "visszafelé történő" végrehajtására, sőt ennél egy kicsit egyszerűbb műveletre kell gondolni. Az assembler ugyanis az állandó és a változó szimbólumtáblát is kezeli, vagyis a felhasználó által definiált szimbólumok értékeit nyilván kell tartania és a fordítás során a keletkező gépi kódba ezt be kell szerkesztenie. A visszafordítás (a disassemblálás) során csak az állandó szimbólumtáblát kezeljük. Az operandus mezőben szereplő értékeket nem szimbolikusan, hanem abszolút formában, hexadecimális számként jelezzük ki. A visszafordító program működése tehát viszonylag egyszerű. Az első (vagy első két) bájtból megállapítja hogy milyen utasításról van szó, a táblázat alapján kiírja a mnemonikját, értelmezi és visszafordítja az operandus mezőben szereplő értéket. A probléma azonban ott kezdődik, ha nem tudjuk, hogy melyik az utasítás első bájtja. Ugyanez az eset áll elő akkor is, ha ismerjük ugyan a program kezdetét, de a program utasításai között adatterület is elhelyezkedik. Mindkét eset azt eredményezi, hogy a visszafordító program adatot értelmez utasításként és így hibásan fordít vissza. Ezért minden visszafordítást kritikával kell fogadnunk. Ellenőriznünk kell, hogy nem tévedt-e el a visszafejtő program. Például gyakran előfordul, hogy egy programrészben egymás után sok MOV utasítás szerepel. Ez a terület szinte biztosan nem programot tartalmaz, hanem szöveget, mivel az MOV utasítás kódjai éppen az ASCII kódtáblában értelmezett kódok tartományába esnek. Ennek gyors ellenőrzésére a legtöbb visszafejtő program egyszerű lehetőséget biztosít azzal, hogy a visszafejtett listán a bájtoknak megfelelő ASCII kódot is megjeleníti, a nem ábrázolható kódokat egy "."-al jelezve. A tapasztalat azt mutatja, hogy a visszafordítás az adatterület vége után 5-6 bájttal helyreáll. Ez annak köszönhető, hogy az MCS-51 utasításai között aránylag sok az egybájtos utasítás. Egy ilyen területre "ráfutva" a visszafordítás ismét helyes lesz. Mivel a maximális utasításhossz négy bájt lehet, ezért elegendő három egymást követő egybájtos utasítás ahhoz, hogy a "tévelygés" megszűnjön. Igényesebb visszafejtők, ha előre megadjuk, akkor a táblázatos részt nem utasításként, hanem táblázatként adják vissza a listában. Másik fejlett szolgáltatásuk abban áll, hogy a visszafejtett listát-ami tulajdonképpen egy szövegfájl--képes a rendszer szövegszerkesztője fogadni, és ebből a visszafejtett listából fordítható forrásnyelvi listát készíteni. Options menü parancsai:
MCU 8051/8031 MCU 8052/8032 MCU 83C552/80C552 MCU 80515/80535 MCU 80C517/80C537 Reset mikrocontroller 80C552 Watchdog en. 80C517 data pointer 80C517 PE#/SWDT-pin A/D-Converter voltage Ports for log file Serial I/O ASCII
Szimulálandó processzortípus kiválasztása
Kontroller RESET-elése (alapállapotba hozása) 80c552 watchdog áramkörének engedélyezése 80c517 adatmutatójának beállítása (mivel több van) láb beállítása A/D átalakító feszültsége - itt adhatók meg a bemeneti feszültségek értékei. Melyik portokat naplózzuk a soros vonal bájtjainak ASCII alakja
A parancsfájlokban való használat miatt a program parancssorból is indítható. -i [Fájlnév] -b [Fájlnév] -a [Adresse] -s [Fájlnév] -8051 -8052 -80515 -80517 -80552 -nc
: : : :
A szimulátor program kapcsolói Intel hexa fájl betöltése Bináris (abszolút) gépi kódú fájl betöltése A gépi kód kezdőcíme Szimbólumfájl betöltése : MCU 8051 / 8031 : MCU 8052 / 8031 : MCU 80515 / 80535 : MCU 80517 / 80537 : MCU 83552 / 80552 : nincs a kis és nagybetű megkülönböztetve
-l -sascii -com1 -com2 -nm0 -nm8 -nm32 -nm64 -?
: : : : : : : : :
Laptop képernyő Soros adatok ASCII alakban 1-es soros vonal kiválasztása 2-es soros vonal kiválasztása 8k közös program és adatmemória 0 címtől 8k közös program és adatmemória 8000h címtől 32k közös program és adatmemória 8000h címtől 64k közös program és adatmemória 0 címtől help
Például: simula5x -i proba -s proba -80552 Az Intel hexa formátum Az Intel hexa formátumnál az adatokat rekordokba szervezik. Egy rekord változó hosszúságú lehet. A rekordban az első mező a rekordjelző mező (Record Mark Field). Ez a mező jelzi a rekord kezdetét és egy ASCII kettőspontot tartalmaz (:). A második mező a rekordhossz mező (Record Length Field). Ez a mező két ASCII karaktert tartalmaz, melyek jelzik a rekordban lévő adatbájtok számát. A hexadecimálisan adott adatbájtok számát két ASCII karakterré konvertálva adódik ki a mező két karaktere, a magasabb helyiértékű digit szerepel előbb. Egy rekordban maximálisan 255 adatbájt lehet. A harmadik mező a betöltési cím mező (Load Address Field). Ez a mező négy ASCII karaktert tartalmaz, a rekord hexadecimálisan adott betöltési címének ASCII karakterré konvertált értékét az alábbi sorrendben: a cím felső bájtjának magasabb helyiértékű digitje, a cím felső bájtjának alacsonyabb helyiértékű digitje, a cím alsó bájtjának magasabb helyiértékű digitje, a cím alsó bájtjának alacsonyabb helyiértékű digitje. A rekordban lévő első adatbájt a betöltési címre töltődik, az utána következő adatbájtok a sorban következő címekre. A fájlvége (End Of File, EOF) rekordban ez a mező négy ASCII nullát tartalmaz vagy a program kezdőcímét. A negyedik mező a rekord típus mező (Record Type Field). A rekord típus adatrekord esetén 00, fájlvége rekord esetén 01. Ez a mező két ASCII karaktert tartalmaz, a rekord típus ASCII karaktereit, a magasabb helyiértékű digit szerepel előbb. Az ötödik mező az adat mező (Data Field). Ez a mező tartalmazza az aktuális adatokat két-két ASCII karakterré konvertálva, a magasabb helyiértékű digit szerepel előbb. A fájlvége rekordban nincs adat mező. Az utolsó mező az ellenőrző összeg mező (Checksum Field). Az ellenőrző összeg a második, harmadik, negyedik és az ötödik mező hexadecimális bájtjainak 8 bitre csonkított összegének kettes komplemense. Az így kapott összeget két ASCII karakterré konvertálva kapjuk a mező két karakterét, a magasabb helyiértékű digit szerepel előbb.
D R K
teljes programot több, logikailag jól elhatárolt részre bontva, a hibásan működő programrész gyorsan meghatározható. Az ilyen leállási feltétel--azaz töréspont (angolul breakpoint (e.: brékpoint)-- a programban több is elhelyezhető. Assemble menü parancsai:
32
A leírásból is látható, hogy egy Intel hexa formátumú fájl egy szöveges (ASCII) fájl, így pl. egy szövegszerkesztő vagy listázó program segítségével megvizsgálhatjuk a tartalmát. Példa Intel hexa formátumra: :10200000455A5420455244454D455320564F4C5453 :0B201000204D454746454A54454E49C7 :00000001FF A leiráshoz kapcsolódva, az első sor mezői: 1. :
2. 10
3. 2000
4. 00
5. 6. 455A5420455244454D455320564F4C54 53
5. 51-es programok fejlesztése PC-n
Az 51-es rendszerfejlesztéshez szükséges lépések az ábrán láthatók. A lemezen az XMCS5X könyvtárba kell a SIM51.BAT fájlt elhelyezni. Ide kell elhelyezni a saját írandó programunk vázát .A51 kiterjesztéssel. Az alattuk lévő PROGR alkönyvtárban vannak a fejlesztést megvalósító programok. A fejlesztés a SIM51 fájlnév parancssorral indítható. Az A51 kierjesztést nem szabad megadni!!! Ezek után a bejelentkező képernyőn megjelenik egy szöveg, amelyben leírtak alapján az egyes lépések sorrendje módosítható, vagy megfelelő funkció kiváltható. A lépések sorrendje megváltoztatásában négy gombnak van szerepe: E - mindig a szövegszerkesztőhöz tér vissza. U - az MCS51 utasításkészletet jeleníti meg R - a fejlesztés közben keletkező fájlokat törli Q - kilépés a programból
A .HEX fájl előállítása után a T billentyű megnyomásával a szimulátor indítása helyett a hardver fejlesztőeszközhöz kapcsolódó TERMINÁL programot hívja meg, és a program már egy tényleges hardveren futhat a szimulátor helyett. A fejlesztő környezet egy IBM-PC számítógép, és a hozzá soros vonalon kapcsolódó fejlesztő rendszer. A fejlesztő rendszer induláskor egy olyan EPROM-ot tartalmaz, amelyben egy a programfuttatást segítő monitorprogram van. A program biztosítja, hogy az IBM-PC-n fejlesztett programunkat hexadecimális formában letöltsük a fejlesztő rendszerünk RAM-jába és ott azt a monitor felügyelete alatt futtassuk.
33
5.1 A TERMINAL program leírása A funkcióbillentyűzetről kiadható parancsok
D R K
F1: Help - Segítség. Ez a funkció megjelenít egy ablakot, melyben a funkcióbillentyűk jelentése látható. Az ablak bármelyik gomb megnyomására eltűnik. F3: Chdir - Könyvtár váltás. A DOS chdir (cd) parancsát valósítja meg, de nem parancssorosan, hanem egy menüben megjelennek a könyvtárak, és ezek között a kurzormozgató billentyűk valamint az Enter gomb megnyomásával lehet választani. Az éppen aktuális könyvtár mindig a képernyő legalsó sorában jelenik meg. A funkcióból az ESC gomb megnyomásával lehet kilépni, és az aktuális könyvtár az lesz, ahol éppen az ESC megnyomásakor voltunk. F4: Load - E funkció segítségével INTEL hexa formátumú fájlt lehet áttölteni a fejlesztendő rendszer RAM-jába. A képernyőn megjelenik egy szerkesztő ablak; benne az aktuális fájl névvel és útvonallal. Ide lehet beírni a fájl nevét, vagy az F10 megnyomásával megjelenik egy menü, melyben a könyvtárak valamint a .HEX kiterjesztésű fájlok láthatók. A könyvtárak között a kurzor mozgató billentyűk valamint az Enter gomb megnyomásával lehet váltani. Ha az Enter gombot egy .HEX fájlon állva nyomjuk meg, akkor ez lesz a letöltendő fájl. Ha megnyomjuk az ESC-et akkor úgy térhetünk vissza a fájl név szerkesztéséhez, hogy ott az a fájl név marad, ami a lista meghívásakor volt. Letöltés közben az Intel HEX fájlnál az aktuális hexadecimális cím látható. A művelet ESC billentyű megnyomásával megszakítható. F5: Shell - ideiglenesen kiléphetünk a TERMINAL programból és visszatérhetünk a DOS-ba. Az "EXIT" parancs beírásával térhetünk vissza a TERMINAL programba. F6: Load & Autostart - Ez megfelel az F4 billentyűvel aktivizált parancsnak, azzal a kiegészítéssel, hogy letöltés után azonnal el is indítja a letöltött gépi kódú programot. (Indítási cím a letöltött program első sorában van.) F8: Execute Command - Parancs végrehajtás. A megjelenő ablakban meg lehet adni egy DOS parancsot, amit a TERMINAL oly módon hajt végre, hogy ideiglenesen kilép a DOS-ba és a DOS végrehajtja a parancsot. A parancs eredménye a képernyőn megtekinthető, majd egy billentyű megnyomásával visszatérhetünk a TERMINAL programba. F10: Exit - kilépés a TERMINAL programból. A képernyőn megjelenik egy ablak, mely a kilépési szándék megerősítésére vár. Ha a "Yes" feliraton állva nyomjuk meg az Enter gombot, akkor kilép, minden más esetben elveti a kilépési szándékot. Parancssoros hívás: TERMINAL [baudrate] [filename] [portnum]
Itt baudrate a szabványos adatátviteli sebességek (110, 300, 600, 1200, 2400, 4800, 9600, 19200, 38400, 57600, 115200) valamelyike, a filename a letöltendő fájl neve és a portnum a COM port sorszáma (1,2). Parancssor nélkül indítva az alapértelmezés a 9600 baud és COM1.
6. A 8051 mikrokontrolleres gyakorló A megírt assembler program működő képességéről a program P1.0 - P1.7 DPORT PC futtatásával lehet meggyőződni. COMx P4.0 - P4.7 Azonban ehhez a futtatáshoz (és az esetleges hibakereséshez) egy P1.0-P1.5 olyan eszközt kell biztosítani, P1 RxD,TxD P4 amivel lehetséges: a futtatandó SIO CPU P3 program indítási címének P4.0-P4.7 megadása és indítása, a processzor AN0-AN7 ANI regisztereinek kijelzése és módosítása, stb. Ezt a feladatot P3.2-P3.4 egy gépi szintű, általában IOILL kisméretű önálló program, az ún. OPPORT monitor végzi el. A monitor segítségével tudja a OUT0-OUT7 IN0-IN7 felhasználó a saját gépi szintű programjának működését RO OPIN ellenőrizni és az előforduló hibákat U/f javítani. Ezt a folyamatot a Karakter program "belövésének" nevezzük. HOUT1kijelző A program belövése során HOUT4 általában a következő funkciókra OHID BK KKJ van szükség: BNG • adott memória tartalom megjelenítése (kiíratása) és esetleges módosítása, • adott regisztertartalom megjelenítése (kiíratása) és esetleges módosítása, • program indítása, • töréspont elhelyezése a programban, • lépésenkénti program végrehajtás, • a tárban lévő program rögzítése háttértárolón és visszatöltése a tárba. A mérésben használt monitorprogramot tartalmazó mikrogép blokk-sémája az ábrán látható.
D R K
Az IBM-PC szerepe: Fejlesztői üzemmódban a program fejleszthetését: írását, fordítását, linkelését, majd a tárgykód hexadecimális formában letöltését, és monitor felügyelete alatti futtatását végezhetjük. Monitor üzemmódban a PC a monitor termináljaként működik, itt adhatók ki a parancsok, illetve a válaszok a képernyőn megjelennek.
34
6.1 A gyakorló felépítése
A 8 bites PCB80C552 mikrokontroller bázisú központi egység ( CPU ) , az IOILL (periféria illesztő) egységen keresztül a következő - memóriába ágyazott - perifériákat kezeli: • BNG 8 db nyomógomb cím: 0C000H • BK 8 db LED cím: 0C001H • KKJ • • • • • •
2*16 karakteres LCD kijelző cím: 0C003H (VKIC), 0C007H (DKIC), 0C00BH (VBEC), RO 8 db relés kimenet cím: 0C000H OPIN 8 db optocsatolt bemenet cím: 0C002H OHID 2 db optocsatolt tranzisztoros hid cím: C002H ANI 8 db analóg bemenet cím: P5 OPPORT a P1,P3,P4 portok egyes bitjeinek optocsatolt kivezetései SIO soros port (RS232)
A CPU - ban találhatók: • mikrokontroller (PCB80C552) • címdekódoló-vezérlő logika • 32 Kbájt EPROM • 32 Kbájt RAM
A mikrokontroller portjai (P0-P5) az alábbi feladatokat látják el:
0C00FH (DBEC),
cím: P1,P3,P4
35
36
P0 multiplexelt ADAT és CIM (AD0-AD7) busz ellátja a kártyán belüli adatátviteli és címzési feladatokat. P1 általános célú portként, vagy a hozzárendelt speciális funkciókra (capture, I2C-soros átvitel, T2 indítás) használható. P2 a cím-busz felső nyolc bitjét (A7-A15) állítja elő. P3 ellátja normál soros átvitelt (RxD, TxD), a külső megszakitáskérések (T0,T1,INT0,INT1) fogadását a a belső adatmemória vezérlést (RD,WR). P4 általános célú portként, vagy a hozzárendelt speciális funkcióra (komparálás) használható. P5 egyetlen funkciója az ANALOG (AN0-AN7) jelek fogadása. A STADC - a konverziót kívülről indító - bemenet. PWM0, PWM1 szélesség-modulált kimenetek.
CNUM: EQU 30H MC: EQU 0C0H Az egyes rutinok a általában következő módszerrel aktivizálhatók (hívhatók): az input adatokat be kell tölteni a megfelelő regiszterekbe (bájtos adat esetén az ACC-ba, szavas adat esetén az ACC és B regiszterbe). Majd a hívás: MOV CNUM,#FUNCODE CALL MC A CNUM regiszterbe kell beírni a hívott rutin kódját. A rutinok általában az A,B,PSW,DPTR és a RB3 regisztertömb értékeit elronthatják!
A címdekódoló-vezérlő logika végzi a
D R K
A 32 Kbájt kapacitású EPROM két címterületre oszlik: • a 0000H - 3FFFH 16 Kbájt-os címtartományban csak a PSEN érvényes. Ezért e területről a mikrokontroller csak programot olvashat, • a 8000H - BFFFH 16 Kbájt-os címtartományban a PSEN mellett az RD is hatásos. Ezért innen program és adat olvasása is történhet. A 32 Kbájt kapacitású RAM - ban is két területet különböztethetünk meg: • a 0000H - 3FFFH 16 Kbájt-os címtartományban a RD és WR jelek hatásosak. A területet a mikrokontroller csak külső adatmemóriaként használhatja, • a 4000H - 7FFFH 16 Kbájt-os címterületen a RD és WR mellett a PSEN jel is érvényes. Ez biztosítja, hogy innen a mikrokontroller programot is olvashasson. (Megjegyzés: 4000H cimtől a megszakítások kezdődnek!) Az I/O vonalak C000H címnél kezdődő legfelső 16 Kbájt-ra helyezhetők. A periféria címzés redundáns, mivel csak a címvonalak alsó négy bitjével (A0-A3) lehet választani.
6.2 Szoftver rendszer és fejlesztői környezet
A PC a rendszerben kettős funkciójú:
1. Programfejlesztő eszköz: A szövegszerkesztővel megírt assembler programot a PC-n fordítjuk le olyan kóddá, amit a mikrokontroller végre tud hajtani. 2. Ezt a kódot a PC soros vonalán töltjük le a mikrokontroller memóriájába, majd ott a monitorprogram felügyelete mellett futtatjuk. A monitor ki- és bemeneti perifériája a PC képernyője és billentyűzete.
6.2.1 A mikrogép monitor és tesztelő programja
A mikrogép EPROM - jában van a monitor és tesztelő program. A monitor segíti a fejlesztett program futtatását, ellenőrzését. Biztosítja a soros kommunikációt a terminálként használt PC-vel. Parancsai az alábbiak:
MONITOR COMMANDS: @ - DOWNLOAD A - ASSEMBLE (B)
I - INPUT PORT (A) J - INPUT IOMEM (A)
R - REGISTER S - SINGLE STEP (B)*
B - BREAKPOINT(B)* C - COPY (B E D) D - DATA DUMP(B)
K - DSP & MFY BIT (A) L - LOAD CODM TO DATM M - MODIFY DATA (A)
T - TRACE (B)* U - UNASSAMBLE (B) V - INT. RAM DUMP
E F G H
N O P Q
W X Y Z
-
TEST FILL DATM(BED) GO (B) THIS HELP
-
UPLOAD CODE (B E) OUTPUT PORT (A D) OUTPUT IOMEM (A D) CODE DUMP (A)
-
UPLOAD DATA(B E) HEX ARITM. (D D) MFY INT.RAM (A) MFY SFR REG. (A)
B - BEGIN ADDRESS E - END ADDRESS
Kimeneti rutinok: MON kód: 0 bemenet: - kimenet: Visszatérés a monitorba DISP kód: 1 bemenet: ACC=kar kimenet: Az ACC értékének megfelelő ASCII kódú karakter kiirása DISPW kód: 2 bemenet: ACC=kar. kimenet: Az ACC értékének megfelelő ASCII kódú karakter kiirása, Ctrl-S, Ctrl-Q figyelésével. SPACE kód: 3 bemenet: - kimenet: betűköz kiírása. CRLF kód: 4 bemenet: - kimenet: új sor kezdete (CR, LF kiküldése)
D R K
- program-, és adatmemóriák (EPROM, RAM) és - a diszkrét I/O vonalak kiválasztását és az írás, olvasás vezérlését. Az áramköri kialakítás biztosítja, hogy programot ne csak az EPROM-ból, hanem a RAM-ból is lehessen futtatni. A megoldás teszi lehetővé, hogy a programfejlesztés során valós-idejü ellenőrzést is végezhessünk.
TEXT kód: 5 bemenet: DPTR, F0 kimenet: A DPTR által mutatott címen kezdődő, ETX (End of Text, szöveg vége, 03H) karakterrel lezárt string kiírása.A szöveg lehet a programmemóriában (F0=0), vagy a kódmemóriában F0=1). ADATKI kód: 6 bemenet: ACC kimenet: Az ACC értékének kiírása hexadecimálisan.
CIMKI kód: 7 bemenet: ACC, B kimenet: Az ACC, B regiszterekben levő 16 bites szám (pl. cím) kiírása.
BINOUT kód: 8 bemenet: ACC kimenet: Az ACC értékének bináris kijelzése. BINDEC kód: 9 bemenet: ACC kimenet: ACC tartalmának decimális megjelenítése.
DTOFIL..kód: AH bemenet: KCIM: R6R7 VCIM: R4R5 azRB3-ban! A KCIM VCIM párossal adott adatmezőt UPLOADED.DAT néven fájlba menti. ADCNV kód: FH bemenet: ACC kimenet: ACC az ACC-ban adott (0...7) sorszámú analóg csatorna konvertált 10 bites értékének felső 8 bitjét az ACC-ba tölti. Bemeneti rutinok:
KLAV kód: 10H bemenet: - kimenet: ACC egy karakter beolvasása az ACC-ba billentyűzetről. SCAN kód: 11H bemenet: - kimenet: ACC Nyomtak-e meg billentyűt? Ha igen: ACC=kód, ha nem: ACC=0 ADATBE kód: 12H bemenet: - kimenet: ACC 1 bájtos hexadecimális szám beolvasása az ACC-ba. CIMBE kód: 13H bemenet: - kimenet: ACC, B 2 bájtos hexadecimális szám beolvasása az ACC, B regiszterekbe.
A - ADDRESS D - DATA
( a * jelölt menüpontok nem használhatók ! Fejlesztés alatt )
6.2.2 A terminál kezelése felhasználói programból A monitorban használt legfontosabb rutinok a felhasználó számára funkciókódos rendszerhívással érhetők el. A felhasználói programban el kell helyezni a következő két definíciót:
GET kód: 14H bemenet: -kimenet: ACC 1 bájtos hexadecimális szám beolvasása az ACC-ba, visszajelzéssel (echoval).