Tartalmi kivonat
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.41 Ó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 6. 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. Timer 1 128 byte RAM Counter Inputs Timer 0 D R K 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 31 19 Q 18 C2 30p VCC 10u C3 R1 10K 9 12 13 14 15 1 2 3 4 5 6 7 8 GND-20 Vcc-40 IC 39 EA/VP P0.0 38 P0.1 37 X1 P0.2 36 P0.3 35 P0.4 34 X2 P0.5 33 P0.6 32 P0.7 RESET 21 P2.0 22 P2.1 23
INT0 P2.2 24 INT1 P2.3 25 T0 P2.4 26 T1 P2.5 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 VCC RST P0.7 P0.6 P0.5 P0.4 P0.3 P0.2 P0.1 P0.0 SECONDARY FUNCTIONS P O R T 0 ADDRESS AND DATA BUS 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 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 P O R T 1 P O R T 2 ADDRESS BUS Funkcionális vázlat 1. ábra 1.42 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 1.421 Belső adatmemória 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 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 D R K B an k 1 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 (PSW3) 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 215 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 200, 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 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 B an k 3 B an k 2 0 0 H SP DPL DPH *TCON TMOD TL0 TL1 TH0 TH1 *P1 PCON *SCON SBUF *P2 IE *P3 *IP *PSW *ACC *B Cím (Hex) 80 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 7 F H 4 1.422 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.43 A CPU regiszterei 1.431 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.44 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.441 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 (TMOD2 ill TMOD6) 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 TMOD3) 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 TMOD4 (M10) és a TMOD.5 (M11), illetve a - a T0-nál - pedig a TMOD0 (M00) és TMOD1 (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. 8 ÷ 12 oszc. ÷12 C /T = 0 C/T=0 vezérlés C/T=1 T1bemenet TH1 (8BIT) GAT TL0 (5 B I T ) TR0 & 1 TCON SFR T C O N SF R ≥1 f o szc /1 2 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) ÷ 12 oszc. C/T=0 TL1 T1 bemenet (8BIT) TM O D SFR TR1 Interupt TF1 átirás & 1 TCON SFR ≥1 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.45 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/TMOD7 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 TF1 & 1 T 0 bem e n et GAT TMOD SFR TR1 Interupt TL1 (5BIT) v ezér lés C /T = 1 TH 1 (8BIT) INT1 bemenet ALTERNATÍV KIMENŐ FUNKCIÓ Vcc KIMENETI FELHÚZÓ ELL. LÁB BELSŐ BUSZ TÁROLÓBA ÍRÁS D Q Cl Q É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 (plaz 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.451 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.452 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.46 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.461 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.462 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 TCON1 (IE0) illetve a TCON3 (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 TF1Ezeket 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.47 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.11 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.12 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.13 Címzési módok 2.131 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.463 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.132 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.133 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.134 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.135 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.136 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 a címzett memória és az akkumulátor tartalmát adja össze. Az eredmény az akkumulátorba kerül DA • 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.141 Az adatátvíteli utasítások: általános-, akummulátor-, és a Data-Pointeres adatmozgató utasítások. 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.143 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. 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. ANL Ez az utasítástípus három csoportra
bontható. CLR • Az általános adatátvíteli utasítások ORL A csoportot az alábbi utasítások alkotják: RL MOV RLC 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. RR POP RRC 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. D R K 2.14 A különböző utasítás fajták 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. törli a direkt címzett bitet, vagy az akkumulátort. az ANL-hez hasonlóan végez logikai VAGY műveletet. az akkumulátor tartalmát egy hellyel balra forgatja. az akkumulátor tartalmát a CY közbeiktatásával forgatja egy hellyel balra. az akkumulátor tartalmát egy hellyel jobbra forgatja. 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.144 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.142 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 JNZ JC JNC JB akkor következik az ugrás, ha az akkumulátor tartalma 0. akkor következik az ugrás, ha az akkumulátor tartalma nem 0. akkor következik az ugrás, ha a Carry-Flag 1. akkor következik az ugrás, ha a Carry-Flag 0. 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 - 14 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.1tá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.15 Az utasítások hossza és végrehajtási idejük 1.2tá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.3tá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.4tá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.8READ-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 15 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.5tá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 .OBJ ÁTHELYEZHETŐ (RELOKÁLHATÓ) .A51 MAKROASSEMBLER (SZÖVEGSZERKESZTŐ) OBJECT FÁJL (A51) .LST LISTAFÁJL OBJECT FÁJL 1 .OBJ . . ABSZOLUT LINKER/LOCATOR OBJECT FÁJL n OBJECT FÁJL (L51) .LIB .M51 LIBRARY CROSS. REF MAP FÁJL .HEX ABSZOLUT KONVERTÁLÓ OBJECT FÁJL INTEL HEX FORMAT .HEX SZIMULÁTOR .M51 (SIMUL5X) LETÖLTÉS TESZTELÉS .HEX .TSK EPROM ÉGETŐ KIPRÓPÁLÁS D R K .HEX 51- ES FEJLESZTŐ MONITORPROGRAMMAL ASSEMBLER PROGRAM FEJLESZTÉSÉNEK LÉPÉSEI 3.21 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: [Szimbólum] DIREKTIVA [Op1][,Op2][,Op3] a Szimbólumhoz rendelhetők: • változók címe, • változók értéke, • programrészek címe. • • • • • • • ;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) .HEX KONVERTÁLÓ HEX TO BIN programsorban: [Címke:] 8051 mnemonic [Op1][,Op2][,Op3] (Az operandusok száma utasításfüggő!) az operandus lehet: 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 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.22 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 3.221 Szimbólum definiáló direktívák: 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 XDATA 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.223 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 a direktívával deklarált szimbólumok minden modulból elérhetők. Használata: PUBLIC Szimb[,Szimb[,.]] 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) A szimbólumhoz rendeli a csak indirekt címezhető belső memória egy címét. pl. OSSZEG IDATA 60H MARAD IDATA OSSZEG - 1 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 A szimbólumhoz rendeli egy külső memória címét. pl. TABL XDATA 100H KIF1 XDATA TABL + 23H 3.224 Cím beállító és szegmens választó direktívák D R K IDATA 3.222 Helyfoglaló, és inicializáló direktívák 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. D R K EQU 22 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 END RSEG 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 forrásprogram végét jelzi. ( Mindig kell használni ) 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 meghatározza a következő utasítás, vagy adat címét. ORG 100H ORG START [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:XE2A51GYAKPELDA1.OBJ ASSEMBLER INVOKED BY: A51 C:XE2A51GYAKPELDA1.A51 0000 758100 ---0000 0001 0003 0004 ---0000 0001 ---0000 0001 0002 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.0820 * ;* Készítette: Zalotay Péter * ;* ;* A modul leírása: * ;* Példák a különböző helyfoglalási megoldásokra * ;* 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 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 ;* 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 RSEG
VALTB DBIT DBIT DBIT 1 1 1 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 B1: B2: B3: Használt külső függvények xxxxxx ;Helyfoglalás a B1,B2,B3 kétértékű változóknak EXTRN 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.23 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 Az általános makro-definíció a 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 D R K • • • • • • 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,<VAR1,V2,Z1> 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.24 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.241 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:XE2A51PELDA1.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: REG552INC) 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.242 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.243 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=01, AD2=02, AD3=03 delay = 10 AD4 = 0.4, AD5=05, AD6=06, AD7=07 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 - P17 DPORT PC futtatásával lehet meggyőződni. COMx P4.0 - P47 Azonban ehhez a futtatáshoz (és az esetleges hibakereséshez) egy P1.0-P15 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-P47 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-P34 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.21 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: 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 MONITOR COMMANDS: @ - DOWNLOAD A - ASSEMBLE (B) I - INPUT PORT (A) J - INPUT IOMEM (A) R - REGISTER S - SINGLE STEP (B)* Bemeneti rutinok: 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 KLAV kód: 10H bemenet: - kimenet: ACC egy karakter beolvasása az ACC-ba billentyűzetről. 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 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.22 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)