Zalotay Péter
DIGITÁLIS TECHNIKA II.
Távoktatási előadás anyag BMF Kandó Kálmán Villamosmérnöki Kar
1.oldal
Tartalomjegyzék: Bevezetés ............................................................................................................................... 6 1.
Programozott logikai műveletvégzés............................................................................ 7 1.1.
Mi a program és a programozás?........................................................................................7
1.2.
Programozott logikai műveletvégző egységek .....................................................................7
1.2.1. 1.2.2. 1.2.3. 1.3.
Szabadon programozható logikai vezérlő............................................................................9
1.3.1. 1.3.2. 2.
Bitprocesszor .................................................................................................... 10 Szabadon programozható logikai gép ................................................................ 12
A mikrogép (mikroszámítógép).................................................................................. 17 2.1.
A központi vezérlő egység .................................................................................................18
2.1.1. 2.1.2. 2.2.
A CPU funkciói................................................................................................. 18 Processzor vezérlés ........................................................................................... 18
Memóriák ..........................................................................................................................18
2.2.1. 2.2.2.
A program memória( PM ) ............................................................................... 18 Az adatmemória (DM) ...................................................................................... 18
2.3.
Periféria illesztés................................................................................................................18
2.4.
A tápegység ( TE ).............................................................................................................19
2.5.
A busz-rendszer.................................................................................................................19
3.
A mikroprocesszor ..................................................................................................... 19 3.1.
Utasítás feldolgozó.............................................................................................................20
3.2.
Aritmetikai - logikai egység ( ALU ) .................................................................................20
3.3.
Regiszter - tömb ................................................................................................................21
3.4.
Busz illesztés ......................................................................................................................21
3.5.
Időzítő - vezérlő egység .....................................................................................................21
3.6.
A processzor megszakításkezelése .....................................................................................21
3.7.
Memória írás, olvasás........................................................................................................22
3.8.
Periféria írás, olvasás ........................................................................................................22
4.
Memóriák, és illesztésük ............................................................................................ 23 4.1.
A memóriák elvi felépítése.................................................................................................23
4.1.1. 4.1.2. 4.1.3. 4.2.
Csak olvasható (fix) memóriák .......................................................................... 24 Írható, olvasható memóriák ............................................................................... 26 Memóriák illesztése........................................................................................... 27
Perifériák illesztése a mikrogép -hez..................................................................................28
4.2.1. 4.2.2. 4.2.3. 5.
Rögzített (fix) programozás................................................................................. 7 Változtatható programozás ................................................................................. 8 A „szabad” programozás ..................................................................................... 9
Bemenetek (input) illesztése .............................................................................. 28 Kimenetek (output) illesztése ............................................................................ 28 Perifériák címzése ............................................................................................. 29
A mikrokontroller ...................................................................................................... 30 2
5.1.
A 8051 mikrokontroller család..........................................................................................30
5.1.1. 5.1.2. 5.1.3. 5.1.4. 5.1.5. 5.1.6. 5.1.7. 5.2.
Külső memóriák illesztése..................................................................................................41
5.2.1. 5.2.2. 6.
A CPU és regiszterei ......................................................................................... 31 Belső memória .................................................................................................. 31 A Portok ........................................................................................................... 33 Programozható időzítő / számláló egységek....................................................... 34 Soros vonali illesztő .......................................................................................... 37 Megszakítások .................................................................................................. 40 Teljesítmény felvétel vezérlése........................................................................... 41 Adat-, és programmemória kezelése .................................................................. 41 Külső perifériák csatlakoztatása......................................................................... 42
Mikrogépek programozása......................................................................................... 43 6.1.
A programozásról általában..............................................................................................43
6.1.1. 6.1.2. 6.2.
Assembly nyelvű programozás ..........................................................................................44
6.2.1. 6.2.2. 7.
A programozás célja.......................................................................................... 43 A programfejlesztés lépései ............................................................................... 43 A forrásnyelvi program...................................................................................... 45 Fordítást vezérlő utasítások ............................................................................... 51
A 8031/51 típusú mikrokontrollerek utasításai.......................................................... 55 7.1.
Az utasítások, és azok hossza.............................................................................................55
7.1.1. 7.1.2. 7.2.
A címzésről általában ........................................................................................................56
7.2.1. 7.2.2. 7.2.3. 7.2.4. 7.2.5. 7.3.
8.
Regiszter-címzés ............................................................................................... 56 Direkt címzés .................................................................................................... 56 Indirekt címzés.................................................................................................. 56 Közvetlen címzés .............................................................................................. 57 Indirekt regiszter-címzés ................................................................................... 57
A különböző utasítás fajták ...............................................................................................57
7.3.1. 7.3.2. 7.3.3. 7.3.4. 7.3.5. 7.4.
Futási idő .......................................................................................................... 55 Címzési módok ................................................................................................. 55
Az adatátviteli utasítások................................................................................... 58 Az aritmetikai utasítások. .................................................................................. 59 Logikai utasítások. ............................................................................................ 60 Forgatás ( rotáció)............................................................................................. 60 Vezérlés átadó utasítások. ................................................................................. 61
Az utasítások hossza és végrehajtási idejük ......................................................................63
Programfejlesztés....................................................................................................... 64 8.1.
A programfejlesztés lépései ...............................................................................................64
8.2.
A programfejlesztés eszközei.............................................................................................65
8.3.
Program-blokkok...............................................................................................................65
8.4.
Programszerkezetek ..........................................................................................................71
8.5.
Példa programfejlesztésre .................................................................................................73
8.5.1. 8.5.2.
Mit kell csináljon a program?............................................................................. 73 A programszerkezet meghatározása................................................................... 73
3
8.5.3. 8.5.4. 8.5.5. 8.6.
Deklarálás ......................................................................................................... 74 Részfeladatok (algoritmusok) ............................................................................ 74 Forrásállomány megírása ................................................................................... 76
A programtesztelés ............................................................................................................79
8.6.1. 8.6.2. 8.7.
9.
A program szimulálása ...................................................................................... 79 A program valós idejű tesztelése........................................................................ 80
Megszakítás (interrupt) kiszolgálásának programozása....................................................80
Programfejlesztés az XE251 környezetben................................................................. 83 9.1.
A forrásállomány írása, módosítása ..................................................................................84
9.1.1. 9.1.2. 9.1.3. 9.1.4. 9.1.5. 9.2.
File (fájlkezelés) menü....................................................................................... 85 Az Edit (szövegszerkesztő) menü...................................................................... 86 A Tools (eszközök) menü ................................................................................. 86 Az Options menü .............................................................................................. 86 Példa a forrásállomány megírására. .................................................................... 87
A futtatható állomány létrehozása .....................................................................................88
9.2.1. 9.2.2. 9.2.3. 9.3.
Fordítás (assembler) .......................................................................................... 88 Szerkesztés (linker) ........................................................................................... 90 Fájl konverzió (HEX generálás)......................................................................... 91
A program ellenőrzése.......................................................................................................91
9.3.1. 9.3.2. 9.3.3. 10.
A program szimulációja..................................................................................... 91 A szimuláció végrehajtása.................................................................................. 94 A programok valós idejű futtatás..................................................................... 100
Példák programfejlesztésre ...................................................................................... 107
10.1.
Kombinációs logikai feladat programozása .................................................................107
10.2.
Kijelző vezérlés megszakítás (interrupt) használatával................................................112
10.3.
Közlekedési jelzőlámpák vezérlése...............................................................................121
11.
Függelék.................................................................................................................. 130
11.1.
Assembler direktívák ...................................................................................................130
11.1.1.
Szimbólum definiáló direktívák: ................................................................... 130
Szegmens-típusok:............................................................................................................. 130 Elhelyezési típusok: ........................................................................................................... 130 11.1.2. Helyfoglaló, és inicializáló direktívák............................................................ 130 11.1.3. Modulok közötti kapcsolatok direktívái ....................................................... 131 11.1.4. Cím beállító és szegmens választó direktívák ................................................ 131 11.2.
Fordítási parancsok .....................................................................................................131
11.2.1. 11.2.2. 11.2.3.
Elsődleges parancsok: .................................................................................. 131 Másodlagos parancsok ................................................................................. 133 Feltételes fordítási parancsok ....................................................................... 133
11.3.
A 8031/51 mikrokontroller család utasításai................................................................134
11.4.
A szimulátor parancsainak részletes leírása.................................................................136
11.4.1. 11.4.2. 11.4.3.
File menü: .................................................................................................... 136 Run menü: ................................................................................................... 136 View menü: ................................................................................................. 136 4
11.4.4. 11.4.5. 11.4.6. 11.4.7. 11.5.
Break menü: ................................................................................................ 138 Assemble menü ............................................................................................ 138 Options menü:.............................................................................................. 139 Az Intel hex formátum ................................................................................. 139
A monitor program......................................................................................................141
11.5.1. 11.5.2. 11.5.3. 11.5.4. 11.5.5.
Inicializálás .................................................................................................. 141 Memóriakezelés műveletei ........................................................................... 141 Lépésenkénti futtatás feltételei. .................................................................... 148 Memóriatartalom letöltése a mikrokontrollerbe ............................................ 148 Memóriatartalom küldése a terminálprogramnak .......................................... 149
5
Bevezetés A tantárgy feladata a mikroprocesszoros un. intelligens berendezések - PC-k, ipari irányító készülékek (PLC -k), különböző hírközlési rendszerek stb. - működésének megismeréséhez, programozásuk elsajátításához szükséges alapismeretek megtanítása. Jártasságot kíván nyújtani az assembly nyelvű programozásban, valamint készséget kialakítani a mikrogépek használatában. A felsorolt célkitűzések elérése érdekében foglalkozunk · · · · · · ·
a programozási alapismeretekkel, az egy bites logikai műveletek programozásával, a mikroszámítógépek általános felépítésével és működésükkel, a mikroprocesszorok rendszertechnikai szerepével, az un. "egy chip -es" számítógép, a mikrokontroller alkalmazásával, a perifériák illesztésével, a processzor közeli programozás (assembly nyelvű) alapjaival,
A mérési gyakorlatok keretében egy általános célú mikrogépen sajátítják el a hallgatók · · · ·
a programozás alapjait, a különböző programszerkezetek kialakítási módszereit, a megszakítások használatát, a különböző irányítási feladatok programozását.
6
1.
Programozott logikai műveletvégzés
A mikrogépek és programozásuk részletes tárgyalása előtt röviden összefoglaljuk a programozható logikai műveletvégzés legfontosabb alapismereteit. 1.1. Mi a program és a programozás? A hétköznapi életben a program nem más, mint egy adott cél elérésre szolgáló cselekvéssorozat leírása. A cselekvés emberekre, azok csoportjára vonatkozik, és célja valamilyen közös tevékenység megvalósítása. Ilyen vonatkozásban a programkészítés, vagy programozás a cselekvéssorozat megtervezése. Ebben figyelembe kell venni a résztvevők tulajdonságait, és a körülményeket, feltételeket. A műszaki életben, annak gyakorlatában a program, egy meghatározott feladatot ellátó készülék, vagy berendezés műveletsorozatát meghatározó leírás. A program „leírása” a készülék számára „érthető formában”, és elérhető helyen kell legyen. A következőkben összefoglaljuk a logikai műveletekre visszavezethető feladatokban használt programleírási, és tárolási megoldások változatait. 1.2. Programozott logikai műveletvégző egységek A programozott logikai műveletvégző berendezésekkel leggyakrabban a számítástechnikában és a különböző irányítási feladatokban találkozunk. A villamos jelekkel végzett automatikus irányítás mintegy 100 év alatt fejlődött a mai alkalmazási szintjére. A fejlődés leglátványosabb szakasza az utolsó 40 év, az integrált áramkörök megjelenésétől számítható. A program tervezésére kialakított módszerek tulajdonképpen a különböző villamos tervek készítése. A számítógép alkalmazása a tervezésben biztosítja a megbízhatóságot és a tervezés hatékonyságát. 1.2.1. Rögzített (fix) programozás Rögzített programozásnak azt a megoldást nevezzük, amelynél a programozott berendezés működését „roncsolás” (szétszedés) nélkül nem lehet megváltoztatni, A villamos irányítás, ezen belül a vezérlés korai változataiban a mágneskapcsolók, relék, jelző eszközök működtetésével történt. A működés parancsait kapcsolók, nyomógombok, valamint a vezérelt eszközök érintkezőinek megfelelő összekapcsolásával adják. Az elemek összekapcsolása vezetékekkel történt, az un. áramút terv (1.a.ábra) alapján. Tehát a „programozás” az áramútas rajz megtervezése volt. A program „tárolása” a huzalozás (1.b.ábra). (Esetenként az ilyen berendezéseket huzalozott programozásúnak is nevezik.)
7
a.
b. 1. ábra
A félvezető eszközök – diódák, tranzisztorok, integrált áramkörök – alkalmazásánál a nyomtatott áramköri lapokon történt az összekötés (huzalozás), tehát ezek a megoldások is a fix programozás csoportjába tartoznak. A tervezés végeredménye a logikai vázlat, illetve kapcsolási rajz (2.a.ábra), és a megvalósítás a nyomtatott áramköri lapon történik (2.b.ábra). A kapcsolási rajzot megvalósító IC-k
a.
b. 2. ábra
1.2.2. Változtatható programozás A gazdaságosabb gyártás igényelte az olyan félvezető alapú áramkörök kialakítását, amelyek alkalmazásánál az áramkörbe rögzített program megváltoztatható. Tulajdonképpen először a memóriákhoz fejlesztettek programozható változatokat, pl. az EPROM (2.8. fejezet) amelynek tartalma újra programozható. A programozható logikai integrált áramkörök (FPGA), amelyekbe a beépített kapuk közötti kapcsolat beégethető, és változtatásnál törölhető. Ilyen megoldásban többszörös átprogramozást is meg lehet valósítani. Az elvet szemlélteti a 3. ábra. A chip -et ÉS-VAGY hálózat és Inverterek alkotják. Az ÉS kapuk előtt mátrix elrendezésű vezetékhálózat van,
8
amelyek keresztpontjai a gyártás után még egymástól elszigeteltek. A programozás lényege, hogy a megtervezett logikai függvényt megoldó hálózatot a megfelelő keresztpontok „összekötésével”, beégetésével érjük el. Ezek a kötések – az áramkör sérülése nélkül – bonthatók (törölhető), és ezután új program égethető be. Az ábra a K = B1 B 3 + B1 B 2 B 3 + B1B 2 B 4 logikai függvényt oldja meg. inverterek
ÉS-VAGY hálózat
vezetékhálózat
Beégetett csatlakozás
3. ábra 1.2.3. A „szabad” programozás Az ember gondolkodása, feladatmegoldása elemi műveletek végrehajtásának sorozatából tevődik össze. Vegyük példának három szám összeadását. Először leolvassuk az első számot, majd hozzáadjuk a második számot majd a részeredményhez adjuk a harmadik számot. Befejezésül közöljük, leírjuk (tároljuk) a végeredményt. Természetesen a részeredményeket fejben tartjuk (tároljuk), vagy ha szükséges le is írjuk. A leírt műveletsornak megfelelően működnek a szabadon programozhatónak nevezett készülékek, amelyek műveletvégző egységekből, és memóriákból épülnek fel. A memóriába írható be a feladat megoldását előíró megszabó program és a változók aktuális értéke. A memóriatartalom bármikor, tehát rendeltetésszerű működés közben is felülírható. A megoldás viszonylag kötetlen (szabad) programozási lehetőséget biztosít, ezért nevezzük az ilyen készülékeket szabadon programozható berendezéseknek. Az alkalmazott számítógépek, ipari irányító berendezések (PLC), a hírközlés stb. eszközei mind ebbe a csoportba tartoznak. Mindezek alapvető működésmechanizmusa azonos, mégpedig abban, hogy egy adott időpillanatban csak egyetlen műveletet végez. A műveletek programozott sorozata adja a feladat megoldását. 1.3. Szabadon programozható logikai vezérlő Vizsgáljuk meg, hogyan alakítható ki olyan hardver (áramkör), amely két bit között programozottan hajt végre logikai, illetve bit-mozgató műveleteket. A feladatot a 4. ábrán látható elvi felépítésű áramkör megoldja. Az áramkör egy adott időben két bit közötti logikai műveletet, vagy bit „mozgatást” végez. Azt, hogy az egység 9
milyen műveletet fog végezni, a programozó bemenetekre (I0, I1, I2) adott három bites digitális információ (utasítás kód) határozza meg. Az eredmény-tároló (ET) egy D flip-flop, amely a mindenkori logikai művelet eredményét tárolja, vagy az adatmozgatás forrása, illetve célja. A programozható logikai egység (LU) – az I0, I1, I2 bementekre adott bitkombináció (utasítás) alapján – többféle műveletet végez.
Ø Ø Ø
A Dbe bemenetre érkező bitet, az ET tárolóba írja, vagy az ET -ben tárolt értéket (eredményt) a Dki kimenetre írja, vagy az ET -ben tárolt részeredmény, és a Dbe vezetékre érkező bit között végez logikai műveletet, és ennek eredményét írja vissza a tárolóba. A művelet ütemezését biztosítja a Cp jelű órajel.
4. ábra 1.3.1. Bitprocesszor A továbbiakban a programozható, bites logikai műveletvégző egységet „bitprocesszor” -nak nevezzük. Az előzőkben leírt műveleteket végreható áramkör egy lehetséges megvalósításának logikai vázlata látható az 5. ábrán.
5. ábra
10
Először az LU jelű logikai egység működését nézzük meg. Az ET -ben tárolt érték és a D_be bemeneten lévő bit kétbemenetű ÉS, illetve VAGY kapu végzi.
közötti logikai műveletet a
A tagadást a kétbemenetű XOR kaput alkalmaztunk. A kapu egyik bemenetén van az adatbit és a másikon pedig az I0 jelű utasítás-bit. Az utóbbi 0 értékénél az adat bit változatlanul jut a kapu kimenetére, mg az 1 értéknél negálva. Két XOR kaput alkalmaztunk, hogy mind a bemeneti, mind a tárolt bitet is lehessen tagadni. A bitprocesszor másik fő egysége a kiválasztó multiplexer. Az I1, I2 parancsbitek kombinációi határozzák meg, hogy melyik bemenet aktuális értéke kerül továbbításra. Ugyanez a két bit határozza meg az adattovábbítás irányát és az adat külső egységbe történő írás (WR), vagy onnan az olvasás (RD) vezérlését. A kiválasztott adat az órajel (Cp) ütemezésében – egy-egy tri-state kapun keresztül – íródik a belső tárolóba (ET), vagy a kimenetre (D_ki). A vezérlőjeleket a Cp ütemezi. A WR kimeneten az adat kiírásakor, míg a RD kimeneten az adat beolvasásakor jelenik meg impulzus. A működés alaposabb megismeréséhez vegyünk nézzünk néhány példát. 1. példa Logikai művelet. Az bemeneteken a következő értékek vannak: I0 = 0, I1 = 1, I2 = 0, Cp = 0, D_be = x, ET = 0. Az I0 parancsbit 0 ezért mindkét XOR kapu változatlan értékkel engedi tovább a másik bemenetére jutó adat-bitet. Az I1=1, I2=0 értékeknél az adatirány-t meghatározó ÉS kapu kimenetén 0 van. Hatására a tri-state kapuk közül a K_ki zár, míg K_be és a K_ki vezetnek. A Kiválasztó multiplexer a VAGY kapu kimenetét (a MUX 1 bemenete) kapcsolja az O kimenetre Amíg a Cp órajel 0, addig a D_ki kimenet lebeg (nagy impedancia), a RD és a WR vezérlő kimenetek 0 szintűek. Változás csak az órajel 1 szintre váltása után lesz. A RD olvasó kimenet is 1 – be vált, a D_be bemeneten megjelenik az új változó, amely most legyen 1. Ekkor a VAGY művelet eredménye 1, amely érték az Eredménytároló (ET) D bemenetére jut. A bitprocesszor tehát az ET -ben tárolt érték és a Cp 1 szintjénél érkező új változó közötti VAGY műveletet hajtotta végre. A Cp jel 1 – 0 szintváltása után az ET tárolja a művelet eredményét. Az RD jel is visszavált 0 – ba. 2. példa Adatmozgatás Az bemeneteken a következő értékek vannak: I0 = 1, I1 = 1, I2 = 1, Cp = 0, D_be = x, ET = 1.
11
Az I0 parancsbit 1 ezért mindkét XOR kapu tagadott értékkel engedi tovább a másik bemenetére jutó adat-bitet. Az I1=1, I2=1 értékeknél az adatirány-t meghatározó ÉS kapu kimenetén 1 van. Hatására a tri-state kapuk közül a K_ki vezet, míg K_be és a K_ki zárnak. A Kiválasztó multiplexer az ET -ben tárolt értéket átvivő XOR kapu kimenetét (a MUX 3 bemenete) – ahol az I0 =1 érték miatt a tárolt érték tagadottja - kapcsolja az O kimenetre Amíg a Cp órajel 0, addig a D_ki kimenet lebeg (nagy impedancia), a RD és a WR vezérlő kimenetek 0 szintűek. Változás csak az órajel 1 szintre váltása után lesz. A WR írást vezérlő kimenet 1 – be vált, és a D_ki kimeneten megjelenik az ET –ben tárolt érték tagadottja. A Cp jel 1 – 0 szintváltása után a WR jel is visszavált 0 – ba. A példákban leírt eseménysorozatot nevezzük utasítás-, vagy máskép műveleti ciklusnak. ·
Utasítás kódok
A megismert bitprocesszor nyolc műveletet végezhet, amelyeket a három utasítás-bit (I0, I1, I2) kombinációja határoz meg. A következő táblázatban foglaltuk össze a kódkombinációkhoz tartozó műveletek leírását.
kód 000 001 010 011 100 101 110 111
magyarázat az ET tartalma és a D_be – n lévő bit közötti ES művelet eredményét az ET tárolóba írja az ET tartalma és a D_be – n lévő bit tagadottja közötti ES művelet eredményét az ET tárolóba írja az ET tartalma és a D_be – n lévő bit közötti VAGY művelet eredményét az ET tárolóba írja az ET tartalma és a D_be – n lévő bit tagadottja közötti VAGY művelet eredményét az ET tárolóba írja az ET tárolóba írja D_be – n lévő bit -et az ET tárolóba írja D_be – n lévő bit tagadottját a D_ki – re írja az ET - ben tárolt értéket a G_ki – re írja az ET - ben tárolt értéket tagadottját
1.3.2. Szabadon programozható logikai gép Megismertük egy bitprocesszor működését. A következőkben építsünk meg egy programozható logikai műveletvégző gépet. A processzor mellett szükségesek memóriák, amelyek egyrészt a programot – a programmemória -, másrészt pedig a műveletekben használt változók értékét – az adatmemória - tárolják. A program futtatásának vezérléséhez egy számlálót, amely az órajel ütemezésében választja ki a programmemória soron következő tartalmát. A gép külvilággal történő kapcsolatát illesztő egységek – portok – kell biztosítsák. Ezeken keresztül írhatók be a memóriába a műveletek független változói, illetve adható ki az eredmények. Röviden foglaljuk össze, hogy mit kell megadni egy program egy utasításában a tervezett művelet végrehajtásához. Szükséges a műveleti-kód (operátor kód), amely megszabja a processzor műveletét, amely még kevés. Meg kell adni a művelet tényezői –t is (operandus 12
t). Az oprandusokat mindig valamelyik memória tárolja, ezért a tárolási hely címével hivatkozhatunk rá. Ezt a megoldást követve a programmemóriában tárolt műveleti utasítás e két részből áll. Egy logikai függvény értékének meghatározásához a következő műveleteket kell végrehajtani: 1. a független változók értékét be kell olvasni port -ról az adatmemóriába, 2. a függvényben szereplő logikai műveletek elvégzése, a műveletek rész-, és végeredményének átmeneti tárolása az adatmemóriában, 3. a végeredmény (függő változó) kiírása a port -on keresztül. A leírt műveletsorozatot ciklikusan kell ismételni. A logikai gép blokkvázlata látható a 6. ábrán. A blokkvázlat alapján kövessük a működést. A tárolt program ciklikus futását a Start jel indítja. Először a „vezérlő jel” a port -on keresztül beolvassa a memóriába a független változókat, és kiírja az előző ciklusban kiszámított függő változó(kat). Utána indul - a Cp hatására – a számláló léptetése. A számláló kimenetei választják ki a programmemóriában tárolt, a programlépést meghatározó utasítás szót.
6. ábra
13
A programmemória kimenetén jelenik a soron következő „utasítás-kód” és az „ADAT cím”. A Cp ütemezi a bitprocesszor működését és ezen keresztül az adat memóriából történő olvasást, írást. Az utolsó programozott művelet után a ciklus kezdődik újból. ·
Utasítás készlet
A továbbiakban határozzuk meg a logikai gép programozható műveleteit, vagyis az utasításkészletet. A processzor tehát adatmozgatást, logikai műveleteket illetve adat írás, vagy olvasás vezérlését is végez. Azt, hogy éppen melyik műveletet kell végrehajtani, azt a három bites parancs, más szóval utasítás határozza meg. Az eddigiekben az egyes utasításokat a műveletet meghatározó bináris számhoz - utasítás kódhoz - kapcsoltuk. Célszerű egy könnyebben megjegyezhető, az utasítás tartalmát is jelentő szóképet használni a leírásnál. A digitális technikában általánosan a műveletek angol elnevezéseit (pl. AND), vagy abból származó szóképeket (pl. NOR) használunk. A gép műveleteinek jelöléseinél is használjuk a leírtakat. A továbbiakban
Ø Ø Ø Ø
az AND a logikai És műveletet, az OR a logikai VAGY műveletet, a / vonal a bit hivatkozás előtt a tagadást, a MOV az adatmozgatást jelzi.
A művelet jelölése után meg kell adni, hogy mely változókkal – operandusokkal - végezzük el azt. Mint ahogyan már említettük, egy adott bit értékének felhasználásához legcélszerűbb azt megadni, hogy az hól, milyen címen van. Tovább egyszerűsíthetjük a jelölésünket az OR és az AND műveleteknél, mivel ezeknél az egyik operandus mindig az eredménytároló (ET) tartalma. Ezért felesleges ezt mindig jelezni. A mozgatásnál első operandus a cél a második a forrás címe. A következő táblázatban foglaltuk össze a teljes utasításkészletet. A táblázat egyes oszlopai a művelet szöveges leírását, az utasítás kódolt változatát, és a magyarázatot tartalmazzák.
utasítás
kód
AND
b_cím
000
AND
/ b_cím
001
OR
b_cím
010
OR
/ b_cím
011
MOV ET, b_cím MOV ET, / b_cím MOV b_cím, ET
100
MOV b_cím, /ET
111
101 110
magyarázat az ET tartalma és a b_cím – ről behívott bit közötti ES művelet eredményét az ET tárolóba írja az ET tartalma és a b_cím – ről behívott bit tagadottja közötti ES művelet eredményét az ET tárolóba írja az ET tartalma és a b_cím – ről behívott bit közötti VAGY művelet eredményét az ET tárolóba írja az ET tartalma és a b_cím – ről behívott bit tagadottja közötti VAGY művelet eredményét az ET tárolóba írja az ET tárolóba írja b_cím – ről behívott bit -et az ET tárolóba írja b_cím – ről behívott bit tagadottját a b_cím – re írja az ET - ben tárolt értéket a b_cím – re írja az ET - ben tárolt értéket tagadottját
14
Megjegyzés: a b_cím az a memóriacím, ahol az adott bit van. Bemeneti változóként ez a bit a bitprocesszor D_be pontjára, míg kimeneti változóként pedig a D_ki pontról kerül a memóriába. Az leírtak alaposabb megértéséhez írjunk programokat logikai függvények megoldására. 1. példa Írjuk meg a következő Kp diagrammal adott logikai függvényt megoldó programot! BA DC
Kp 00 01 11
10 1
00 01
x
11
1
10
1 x
1
1
x
A legegyszerűbb függvény algebrai alakja: F = B (D + A ) + A B C A forrásprogram írásának első lépéseként a operandusok (változók) elhelyezését a memóriában, vagyis a hivatkozási címeket kell megadni. Ebben a példában, mint ahogyan a későbbiekben is látjuk a változókat jelölő szimbólumok (itt a betű) deklarálása a címet megadja a fordítónak. Következzék a logikai függvényt megoldó programrész utasításokkal történő szöveges leírása. MOV OR AND MOV
ET,D /A B T,ET
a (D+/A)B függvényrész meghatározása és az eredmény átmeneti tárolása a T helyen
MOV AND AND
ET,A /B C
a A/BC függvényrész meghatározása
OR
T
|
a (D+/A)B + A/BC kiszámított értéke az ET -
MOV
F,ET
|
az eredmény kiírása az F helyre
ben
2. példa Írjuk meg az előző példában megadott függvény konjunktív alakjából egyszerűsített változatát megoldó program szöveges forrásállományát! Ks
BA DC
11 10 00 01 11
1
1
1
10
1
x
1
00
1
01
1
x 1 15
x
Az egyszerűsített függvény algebrai alakja: F = (B + A (C + D)) (A + D) A meghatározott függvényt megvalósító program: MOV OR MOV
ET,D /A T,ET
MOV OR AND OR
ET,C /D A B
AND
T
|
a (B+A(C+/D)) (D+/A) kiszámított értéke az ET -
MOV
F,ET
|
az eredmény kiírása az F helyre
a (D+/A) függvényrész meghatározása és az eredmény átmeneti tárolása a T helyen a B+A(C+/D) függvényrész meghatározása
ben
16
2.
A mikrogép (mikroszámítógép)
A félvezető alapú elektronikus áramkörök gyártástechnológiája az 1970 –es évtized elejére nagyon sokat fejlődött. Ekkor az Intel, valamint a Motorola cégek a digitális számítógépek központi vezérlőegységének alapvető feladatait ellátó nagy integráltságú áramköröket kezdtek gyártani. Ekkor született meg a mikroprocesszor. A további fejlesztések egyre nagyobb elemsűrűségű áramkörök gyártását tették lehetővé. Az évtized végére már egy chip -ben egy minimál konfigurációjú számítógépet gyártottak, a mikrokontrollert. A mikroprocesszort, vagy mikrokontrollert alkalmazó digitális berendezéseket nevezzük mikroszámítógépnek, vagy röviden mikrogép –nek. A személyi számítógépek (PC - k) mellett többek között ilyen készülékek irányítják a különböző ipari gyártósorokat, korszerű gépkocsikat és a szórakoztató elektronika, valamint a háztartási gépek egy nagy csoportját is. A mikrogépek mindegyikében megtaláljuk · · · · ·
a központi vezérlő egységet ( CPU Central Processor Unit ), a program memóriát, az adat memóriát, a periféria illesztő egységeket, és a tápegységet.
A mikrogép rendszertechnikai felépítését szemlélteti a 7.ábra.
7. ábra A blokkvázlatban szereplő egységek feladatát, működését tárgyaljuk a következőkben.
17
2.1. A központi vezérlő egység A CPU irányítja a mikrogép program szerinti működését. 2.1.1. A CPU funkciói A működés az un. utasítás ciklusok sorozatából tevődik össze. Egy utasítás ciklusban a CPU · a programtárból beolvassa az soron következő utasítást, · végrehajtja az utasításnak megfelelő elemi műveletet, és · előállítja a mikrogép elemeit vezérlő jeleket. 2.1.2. Processzor vezérlés A mikroprocesszor működését az un. processzorvezérlő jelekkel lehet változtatni. A működést a beépített, vagy külső órajel generátor ütemezi. További vezérlő jelek: · · · · · · 2.2.
a bekapcsolási alapállapotot vezérlő bemenet a RESET, működést befolyásoló várakozás (wait) vezérlő bemenet READY, megszakítás-t kérő bemenet INT, a megszakítás elfogadását visszajelző kimeneti jel INTA, külső busz vezérlő, vagy másik processzor által kiadott un. busz kérési jelet fogadó bemenet, és a busz kezelését átadó kimeneti jel a RD (olvasó), WR (író , és periféria választó jelek. Memóriák
A mikrogépek működéséhez feltétlenül szükséges a programot, és a számítások, műveletek operandusait memóriák tárolják. Funkcionálisan ezek külön egységet alkotnak, ugyanakkor fizikailag egy memória is alkothatja ezeket. 2.2.1. A program memória( PM ) A mikrogép működését előíró program utasításainak megfelelő műveleti kódokat, és egyes operandusait tárolja a program memória. A műveletek végrehajtása során e memória területről csak olvasás történik. Olyan mikrogépek -ben amelyek csak egy programot hajtanak végre (pl. videó-magnó irányítása), a programot un. fix-memória (ROM, PROM, EPROM, EEPROM) tárolja. A PC - ben futás közben is változik az éppen végrehajtandó program, ezért itt irható-olvasható memóriában (RAM) tárolják az éppen aktuális program kódjai, operandusait. 2.2.2. Az adatmemória (DM) Az adatmemória tárolja a működés során használt változók, perifériákról beolvasott, ill. kiviendő információk aktuális értékeit. A feladatból adódóan csak irható-olvasható memóriák (statikus és dinamikus RAM, mágneses tárolok stb.) használhatóak ilyen feladatra. 2.3. Periféria illesztés A mikrogép és a külső eszközök adatforgalma és vezérlése a periféria illesztő egységeken keresztül történik. Mindkettő irányulhat a külső eszköztől a mikrógépbe (bemeneti-, vagy input egység), illetve ellenkező irányba (kimeneti-, vagy output egység ). Az ember-gép 18
közvetlen kapcsolat alapeszközei az adat-, és parancsbevitelre szolgáló klaviatúra, illetve a különböző megjelenítő egységek (képernyő, szám-, és karakter kijelzők stb. ) ahová a mikrogép a műveletek eredményeit írja ki. Amikor a mikrogép egy berendezést irányít ( automatizálás ) az információk és parancsok gép-gép közötti illesztő egységeken keresztül történik. 2.4. A tápegység ( TE ) A mikrogép feszültség, és áramellátását biztosítja. A leggyakrabban normál hálózatból (230 VAC 50 Hz) állítják elő a tápegységek az integrált áramkörök biztos működését szolgáló stabilizált (Ucc= 5 V), illetve az egyéb célokra használt stabilizálatlan egyenfeszültségeket (12 V, stb.). Különleges mikrogépek tápenergiáját akkumulátor is biztosíthatja ( pl. gépkocsik fedélzeti számítógépei, meteorológiai mérésadatgyűjtők stb.) 2.5. A busz-rendszer A mikroprocesszor közvetlen környezetét a különböző memóriák, programozható perifériák, illesztő-, és processzorvezérlő egységek alkotják. A környezet elemei közötti adatmozgás, és egyéb műveletek jelei a BUSZ vonalakon keresztül történik. Elvi felépítését láthatjuk a 1.ábrán. A DATA (adat) buszon kétirányú adatmozgás lehetséges. A cél, vagy a forrás mindig a processzor. Az ADRESS (cím) busz vonalain adja ki a processzor azt a címet (programszámláló tartalmát) ahonnan, vagy ahová az adat átvitelre kerül. A címbusz vonalszáma (szélessége) határozza meg a csatlakoztatható maximális memóriakapacitást. Például ha 16 bites címzés 216 bájt, azaz 64 Kbájt elérését teszi lehetővé. A vezérlő vonalak, vagy CONTROLL "busz" változó számú vonala miatt igazában nem nevezhető busznak. Ezeken a vonalakon keresztül vezérli a mikroprocesszor a kiválasztott adatmozgatást.
3.
A mikroprocesszor
A mikroprocesszor olyan integrált áramkör, amely egy digitális számítógép központi egységének ( CPU - Central Processor Unit ) alapvető feladatait látja el. Az Intel cég 8080 típusjelű első mikroprocesszora 1973-ban került a piacra. A mai napig számtalan változatot fejlesztettek ki, amelyek közül a legismertebbek a 8085, 8086, 80286, 80386, 80486, 80586 (pentium), és a sor folytatódik. A mikroprocesszorban - gyártótól, és típustól függetlenül - megtalálhatók a · · · · · · ·
utasítás dekóder és ciklus vezérlő, aritmetikai-logikai egység ( ALU), regisztertömb ( Accumulator, operatív-, és átmeneti tárolók ), Stack mutató ( Stack-pointer SP), Program számláló ( PC ), időzítő és vezérlőegység, adat-, és címbusz meghajtók.
19
A továbbiakban az Intel 8085 típusú mikroprocesszor felépítését tárgyaljuk. A mikroprocesszor blokk-sémája látható a 8. ábrán.
8. ábra 3.1. Utasítás feldolgozó A soron következő - Fetch ciklusban - beolvasott utasítás egy regiszterbe íródik, amelyhez csatlakozó utasítás dekóder " értelmezi " az utasítás kódot, vagyis előállítja az utasítás végrehajtásához szükséges belső vezérlőjeleket. 3.2. Aritmetikai - logikai egység ( ALU ) A mikroprocesszor az utasításban előirt aritmetikai (ÖSSZEADÁS, KIVONÁS), valamint logikai (ÉS, VAGY, KIZÁRÓ-VAGY, és TAGADÁS) műveleteket az ALU (Arithmetic Logic Unit) műveleti egység végzi. A műveleti egységhez tartoznak az Accumulator (ACC) a Flag (jelző), és az átmeneti (temporary) 8 bites regiszterek. A legtöbb műveletvégzés előtt az egyik operandusz -t az ACC -be kell vinni, a másik operandusz a regiszter tömbben, vagy a külső memóriában, illetve a programban kell legyen. A művelet eredménye az ACC -be kerül, és egyúttal állíthatja a jelző (flag) regiszterben lévő feltétel biteket. Ezek a bitek · · · · ·
Zero Carry Sign Parity AC
1 ha az eredmény 0, 1 ha az eredmény túlcsordul, 1 ha az eredmény negatív, 1 ha páros számú egyes van az akkumulátorban, (Auxiliari carry - közbenső átvitel ) 1 ha az alsó négy bitről van átvitel.
20
3.3. Regiszter - tömb A processzorban van egy irható, olvasható memória, amely egyrészt bájtos (8 bit), másrészt szavas (16 bit) szervezésű. A B, C, D, E, H, L jelölésű hat különálló bájtos regisztert jelent. Ugyanezek regiszterpár -ként is elérhetők a BC, DE, HL jelölésekkel. További két regiszterpár a Stack-pointer (SP), valamint a Program-számláló ( PC ). Ezek mindig címet tárolnak. Az SP tárolja a Stack- ( zsák ) memória aktuális címét. A PC-ben van a soron következő programbájt címe. 3.4. Busz illesztés A mikroprocesszor és a környezete közötti adatforgalom a buszrendszeren keresztül történik. A processzor a DATA (adat) buszhoz kétirányú, míg az ADRESS (cím) buszhoz egyirányú (kifelé irányított) buszmeghajtó - tri-state - illesztő áramkörökön csatlakozik A két busz lábkiosztása részben átfedett. Az adatbitek, és a cím alsó 8 bitje azonos lábakon (AD0...AD7) jelenik meg. Míg a cím felső 8 bitje külön lábakon (A8 .. A15) van kivezetve. A közös lábakon kivezetett adat-, és címbitek szétválasztásához egy külső tároló (8 bites Latch) szükséges. Ebbe az ALE (Address Latch Enable ) jel írja be ciklus elején kiadott címbiteket. A vezérlő vonalak, vagy CONTROLL "busz" változó számú vonala miatt igazában nem nevezhető busznak. Ezeken a vonalakon keresztül valósul meg az egész rendszer - pl. adatcím szétválasztás ( ALE ), az írás ( WR), vagy az olvasás (RD) - vezérlése. A processzort vezérlő jelek biztosítják a működés időbeli ütemezését (CLOCK, READY), alaphelyzetbe állítását (RESET), a busz használatának átadását másik processzornak, vagy DMA vezérlőnek (HOLD, HLDA), megszakítás kérések fogadását ( INT,TRAP, stb.), visszajelzését (INTA). 3.5. Időzítő - vezérlő egység Az időzítő - vezérlő egység fogadja a processzort vezérlő jeleket és előállítja a rendszer működését vezérlő jeleket. A kiadott jelek egy része tri-state illesztésű. 3.6. A processzor megszakításkezelése A mikroprocesszorok a programban megirt sorrendben hajtják végre az utasításokat. Az előre ismert, és jól definiált műveletek sorrendje viszonylag könnyen irható le. Sok esetben a feladat olyan, hogy a mikrogép -nek egy külső esemény bekövetkeztekor abba kell hagynia az éppen futó program végrehajtását, és az eseménytől függő más programot kell futtatnia. Ezt a folyamatot nevezzük program-megszakításnak (interrupt). Alapvetően az alábbi két megszakítási eljárást alkalmazzák: ·
egyik módszernél a megszakítás kérése, és elfogadása után a külső vezérlő adja meg azt a címet, ahonnan a processzornak hívnia kell az un. megszakítás szubrutint. E módszernél a megszakítást kérő jel érkezik az INTR bemenetre. A kérés elfogadása után a processzor adja az INTA jele(ke)t, amelynek hatására az adatbuszon kapja meg a cím bájtjait,
21
·
a másik eljárásnál minden megszakításkérő bemenethez (TRAP, RST 5.5, RST 6.5, RST 7.5) egy-egy adott cím tartozik, és a processzor innen hívja az aktuális megszakítás-rutint.
3.7. Memória írás, olvasás A memóriák funkcionálisan két csoportba sorolhatók. Az egyik a programot (PM ), a másik pedig az adatokat, és változók értékét tároló un. adatmemória (DM). A processzor a programmemóriából olvassa ki az utasítás-kódokat, illetve a programban foglalt adatokat és címeket. Erre a memóriaterületre írás sohasem történik. Az adatmemória tartalmát a processzor olvassa is, és írja is. A memória kezelést az IO/M jelű vezérlő vonalának 0 szintjével jelzi. Egy bájt írása, vagy olvasása egy un. gépi ciklus alatt történik, amely az órajel periódusidejével megegyező ütemekből ( T1, T2, T3, stb ) áll. A memória, illetve periféria olvasás időzítését szemlélteti a 9. ábra.
CLK IO/M A8 … A15 A0-A7 ..D0D7 ALE RD READY
9. ábra A T1 (cikluskezdő) ütemben a címbitek, az IO/M (periféria/memória választó), és az ALE (címtároló) jelek kerülnek a megfelelő vonalakra. A T2 - ben kerülnek a buszra az adatbitek, és az írást (WR=0), vagy olvasást (RD=0) vezérlő jelek. Ugyanekkor vizsgálja meg a processzor a READY várakozást kérő bemenetet. Ameddig ez aktív (0 szintű) un. várakozási ütemet (Tw) következnek. A T3 ütemben - a vezérlőjel felfutó élénél - történik az adatok beolvasása a processzorba (olvasási ciklus), vagy a memóriába (írási ciklus). 3.8. Periféria írás, olvasás A leggyakrabban alkalmazott programozható perifériák az időzítő, a megszakítás-vezérlő, a kommunikációt (soros, párhuzamos) végző, és különböző bites, vagy bájtos portok. A portok rendszeren belüli, vagy más rendszerekhez történő illesztést is elláthatják. A memória, illetve periféria írás időzítését szemlélteti a 10.ábra. 22
CLK IO/M A8 … A15 A0-A7 ..D0-D7 ALE WR READY 10. ábra A processzor periféria írásakor, vagy olvasásakor csak 8 bites címet küld a buszra, és ezt mind a címbusz alsó-, mind pedig a felső 8 bites részén egyformán. Ily módon 256 különböző cím lehetséges. Az IO/M vonal ekkor 1 szintű. Miután az írást a WR, az olvasást pedig a WR jel vezérli, ezért azonos címen egy kimeneti-, és egy bemeneti - 8 bites periféria érhető el. A periféria írási-, és olvasási gépi ciklusok időzítése megegyezik a memória elérési gépi ciklusokéval.
4.
Memóriák, és illesztésük
A következőkben röviden áttekintjük a használt, félvezető alapú memóriák · · ·
általános felépítését, legfontosabb változatait, címzési módját.
A leggyakrabban használt bájt szervezésről beszélünk alapvetően. Az ilyen memóriában tárolt adatok bájtonként (8 bit) olvashatók, vagy írhatók. Nem térünk ki azokra a memóriákra, amelyeknél a tárolt információ egyes bitjei közvetlenül érhetők el. 4.1. A memóriák elvi felépítése A 11. ábra szemlélteti egy memória (chip) alapvető részeit.
11. ábra
23
·
A tároló-cellák –ba kerülnek beírásra a tárolni kívánt információk, adatok .A tárolás történhet bit -es, vagy bájt -os egységekben · A dekóder választja ki a - címek (A0, A1,…An-1) alapján - meghatározott adatot. · Az adatbusz illesztőn keresztül jut a kiválasztott helyről az adat a buszra, vagy fordítva. A leírt memória-felépítés elvileg minden változatnál azonos. Lényeges különbség a tárolandó információ (adat) beírási módja között van. Ezek alapján különböztetjük meg a csak olvasható (fix), és az írható-olvasható tárolókat. A következőkben áttekintjük e-memória változatok lényeges tulajdonságait. 4.1.1. Csak olvasható (fix) memóriák A fix memóriák megnevezés arra utal, hogy a tárolt adatokat csak olvasni lehet a mikrogép -ben futtatott alkalmazói programban. Az adatok beírása csak programozó egységgel végezhető. A beírás történhet ·
maszkolással, a memória gyártása során, amelyet ROM – nak (Read Only Memori – csak olvasható memória) nevezünk, · a felhasználó által, de csak egyszer programozhatóak a PROM – ok (Programabble Read Only Memori – programozható csak olvasható memória), a felhasználó által többször is programozhatóak az EPROM –ok (Erasable Programabble Read Only Memori – törölhető, és programozható csak olvasható memória), illetve az EEPROM –ok ( Electrical Erasable Programabble Read Only Memori – elektromosan törölhető, és programozható csak olvasható memória). Az EPROM –ban tárolt adat törlése - a tok tetején lévő quartz ablakon keresztül meghatározott hullámhosszú UV sugárral végezhető („napoztatás”). Az EEPROM adatai elektromos árammal törölhetőek ki, a készülékből való eltávolítás nélkül. A következőkben röviden tekintsük át a fix memóriák egyes részegységeinek feladatát, működését. Þ A dekódoló egység Feladata, hogy a címbemenetekre (A0 … An-1) adott bináris kód dekódolásával, 1 az n-ből kóddá alakításával kiválasszon egy memória-egységet, bájtot, vagy bitet. A címbemenetek száma n, határozza meg a memória kapacitását, vagyis hány egységnyi információ tárolható benne. Þ A memória cellák Az ismertetett változatok bájtos-memóriacelláinak elvi megvalósítását szemléltetjük a 6. ábrán. Mindhárom változatnál mátrix elrendezést rajzoltunk. A dekóder a sor-vezetékek egyikére ad csak 0 szintet. Az oszlopvezetékek mindegyike – ellenálláson keresztül – az 1 szintű tápfeszültségre (Ut) csatlakozik. A sor-oszlop keresztpontjait vagy összekötik, vagy nem. A „rövidzár” , vagy hiánya adja a tárolt információ egy bitjének az értékét. A 12.a.ábrán a ROM felépítését láthatjuk. A dekódoló által kiválasztott sornál (bájtnál) azokra az oszlopvezetékeken lesz 0 szint amelyeknél – a gyártás során felvitt - összekötő vezeték van, a többi pedig 1 szintű lesz. Az így „beprogramozott” bájt jut a belső adatbuszon az illesztő egységre. Az illesztő egység kialakítása – hogy invertáló, vagy 24
nem invertáló - határozza meg, milyen szintű lesz az engedélyező jel időtartama alatt az adatbusz egyes vezetékeire jutó jel szintje. A 12.b.ábra a PROM felépítését mutatja. Gyárilag mindegyik sor oszlop keresztpontban van összekötő vezeték, vagyis mindegyik bit azonos értékű. A rövidzárak könnyen olvadó fémből készülnek. A felhasználás előtt egyszer programozható a memória azáltal, hogy kiolvaszthatók a szükséges összekötök. Ily módon a tárolandó információt a felhasználó viheti be a chip -be. Hibás programozást már nem lehet módosítani! A 12.c.ábrán az újra programozható fix-memóriák - EPROM, illetve EEPROM kialakítása látható. Mindegyik keresztpontban van egy FET , amelyeknél a vezérlő elektróda (Gate) egy „sziget”, amelyekbe bevihetők elektromos töltések (elektronok, vagy lyukak), illetve onnan kitörölhetők. A töltés-bevitel mindig elektromosan történi, amit „beégetésnek” is nevezünk. A szigetekben tárolt töltések kitörléséhez szükséges energiát vagy UV sugárzással (EPROM), vagy elektromos áram révén (EEPROM) visszük be. Azok a tranzisztorok vezetnek, amelyeknél a vezérlőelektróda töltött, a többi viszont szakadás. A működés további része teljesen megegyezik a ROM, és PROM működésénél leírtakkal.
a.
b.
c.
12. ábra Þ A BUSZ illesztő Mindegyik memória típusnál a kiválasztott információ tri-state kapukon keresztül kerül – engedélyező jelek hatására - az ADAT BUSZ egyes vezetékeire. Az illesztés egyik változatának elvi kapcsolási rajza látható a 13.ábrán.
13. ábra
25
Az adatátvitelt két jel együtt engedélyezi. Az EN -el jelölt jel az un. chip-enable CE (tok engedélyező), vagy máskép chip-select CS (tok kiválasztó). A tok olvasásának engedélyezését a címekből állítja elő egy dekódoló logika. Az olvasó jelet RD (Read) a mikroprocesszor küldi a vezérlő buszra. A memória-tokoknál ezt az engedélyező bemenetet OE (Output Enable) jelöléssel adják meg. A legtöbb memória típusnál mind az olvasó OE, mind pedig a tok kiválasztó CE (CS) bemenetek aktív szintje a nulla. 4.1.2. Írható, olvasható memóriák A számítógépen futó alkalmazói programból írható-olvasható memóriákat nevezik RAM nak. A jelölés a Random Accesse Memori („véletlen” hozzáférésű memória) megnevezésből adódik. A véletlen hozzáférés arra utál, hogy a memória egységek teljesen egyformán érhetők el. Találkozhatunk a RWM (Read Write Memori) elnevezéssel is, amely az írhatóolvasható tulajdonságot jelöli. A 14.a. ábrán a RAM tároló celláinak elrendezése, a b. ábrán pedig a tároló cellák felépítése látható. Minden bitet egy-egy félvezető alapú D flip-flop tárol. Az egyes tárolók írását, illetve olvasását a dekódoló egység Ki jele készíti elő. A flip-flop beírását a Cb billentő jel végzi. Mind az írás, mind pedig az olvasást a külső vezérlőjelek – a busz illesztőn keresztül – hajtják végre.
a. b. 14. ábra A 15.ábra szemlélteti egy RAM busz-illesztő egységének felépítését. A kiválasztott bájt bitjeinek írását a Cb jel végzi, amelyet az EN engedélyező és a WR író jel állít elő, és egyúttal engedélyezi a külső adatbusz jeleinek fogadását.
15. ábra
26
Az adat olvasása pedig az EN engedélyező, és a RD olvasó jelek hatására történik, amikor is a kiválasztott bájt egyes bitjeinek értékét a tri-state kapuk a külső adat-buszra csatolják. 4.1.3. Memóriák illesztése A mikrogépek -ben különböző típusú, illetve kapacitású memória-tokok vannak. Ezek elérése a CPU felől az eltérő címük alapján történik. A 17.ábrán – egy példa segítségével – szemléltetjük a különböző memóriák címzését, illesztésüket a CPU -hoz.
16. ábra Az ábra szerinti példán a CPU –hoz (IC1) két 27128 típusú EPROM (IC2, IC3), és két 6164 típusú RAM (IC4, IC5) illeszkedik. Az egyes memória-tokok kapacitása címbitek száma alapján állapítható meg. Az EPROM kapacitása 16 kBájt, mivel 14 címvezetékkel (A0 … A13) választható egy memória egység a tokon belül. k = 2 14 = 16 384 A RAM –nak 13 címvezetéke (A0 … A12) van, tehát a kapacitása 8 kBájt.
Az egyes tokok közötti választást a nem használt címbitek kombinációi alapján lehet kialakítani. A példában az A15, és az A14 bitek négy kombinációját állítja elő az IC6 jelű dekódoló (SN74LS139). A kapcsolásban használt négy memória-tok címzési tartományait foglaltuk össze a következő táblázatban. A tokon belüli címzéshez használt címbitekhez írt x jelenti azt, hogy az 0, vagy 1 értékű is lehet. A RAM – nál az A13 bit nincs felhasználva sem a tokon belüli, sem a tokok közötti választáshoz, ezért ezt n –el jelöltük. Mivel a bit mindkét lehetséges értékénél ugyanaz a tok érhető el, ezért nem teljes a dekódolás. Amikor ez nem okoz hibát, az ilyen dekódolás megengedett, mert kevesebb áramkört alkalmazhatunk. tok A15 A14 A13 A12 A11 A10 A9 A8 A7 A6 A5 A4 A3 A2 A1 A1 Cím IC2 0 0 x x x x x x x x x x x x x x 0000H – 3FFFH IC3 0 1 x x x x x x x x x x x x x x 4000H – 7FFFH 8000H – 9FFFH IC4 1 0 n x x x x x x x x x x x x x A000H – BFFFH C000H – DFFFH IC5 1 1 n x x x x x x x x x x x x x E000H – FFFFH 27
A teljes dekódolás hiánya miatt a RAM -ok minden bájtja két címen is hozzáférhető!! 4.2. Perifériák illesztése a mikrogép -hez A mikrogépek feladata, hogy különböző függetlenváltozók – bemeneti jelek -értékeitől függően, kimeneti jelekkel – függő változók - működtessen készülékeket. A bemeneti, és a kimeneti jelek egyaránt lehetnek digitálisak (kétértékű), illetve analógok (folytonos, kvantált stb.). A tantárgy keretében csak a digitális jelek illesztésével foglalkozunk. Perifériákat illesztő áramkörök alapvető feladatai: · a csatlakozó periféria adatvonalainak összekapcsolása az ADAT busszal, · szint-, és teljesítmény illesztés, · potenciál-leválasztás (esetleges). A következő részekben a legegyszerűbb, de alapvető illesztési megoldásokat tekintjük át. 4.2.1. Bemenetek (input) illesztése A mikrogép -be érkező jeleket illesztő áramkörök leggyakoribb megoldása a bájtos szervezés. Gondoskodni kell a bejövő jelek · potenciál illesztéséről, · szűréséről, és a · megfelelő időpontban történő mintavételezésről. A 18. ábra szerinti áramköri kapcsolás egy adat mintavételezésére mutat példát.
17. ábra Az ábrán a tri-state kaput az IO/RD jel nyitja, amely akkor 0 szintű, ha a periféria (I/O) kezelése engedélyezett és olvasó jel (RD) van. A bemenetei jelet egy nyomógomb adja, amely csak megnyomáskor szolgáltat zárt áramkört. Elektronikus áramkörökben “szakadás” nem engedhető meg. Az Rf felhúzó ellenállás biztosítja, hogy a kapu bemenetén állandóan legyen feszültségszint. Amikor nincs lenyomva a BE gomb, akkor 1 szintű a bemenet, és ezt is olvassa be a BUSZ –ra a mintavételező jel. A gomb lenyomott állapotát 0 szint jelzi. A bemenet zajszűréséhez RC tagokat alkalmaznak, és szűrő. 4.2.2. Kimenetek (output) illesztése A mikrogép -hez kimenetei a csatlakozó készülékeket (kijelzők, relék, stb.) működtetik. A vezérelt készülék határozza meg illesztés feltételeit, vagyis a · ·
szint-átalakítás jellegét, a teljesítmény-átvitel mértékét,
28
· potenciál illesztés kívánalmait. Minden típusú kimeneti illesztő egységben van tartó áramkör, mivel a mikrogép a kimeneti jeleket programciklusonként csak egyszer frissíti. Két jelfrissítés között minden bit értékét tárolni kell! A kimeneti jel illesztésének egy elvi kapcsolási vázlata látható a12.ábrán .
18. ábra A tartó áramkör (D flip-flop) mindig azt az értéket tárolja, amely az IO/WR jel 1-0 átmenetekor érvényes adat. A tárolt értéket az EROSIT jelű 0 szintre aktív nyitott(open)kollektorú erősítő kapcsolja a kimenethez csatlakozó RELÉ tekercséhez. Mivel az erősítő invertál, ezért az 1 szintű tárolt értéknél húz meg a relé. 4.2.3. Perifériák címzése A perifériákat illesztő áramkörök alapvetően kétféle megoldás szerint kapcsolódnak a CPU környezetébe. A megoldások: · a memóriába ágyazott, illetve a · önálló perifériaként. A mikroprocesszorok – az IO utasításaikkal - külön is kezelhetik a periféria-elemeket, ugyanakkor a RD/WR vezérlőjelek is használhatók egy-egy diszkrét regiszter, vagy tri-state kapu vezérléséhez. Az utóbbi megoldást nevezzük memóriába-ágyazásnak (memorymapped). A mikrokontrollerek többsége csak memóriába-ágyazott perifériakezelést tud vezérelni. A 20.ábrán egy 8 bites bemeneti tri-state kapu (SN74541), és ugyancsak 8 bites tart áramkör (SN74573) illesztése a DATA BUS -hoz..
19. ábra A következő fejezetekben, illetve a mérési gyakorlatok során több áramköri változat megismerésére is mód nyílik. 29
5.
A mikrokontroller
A mikrokontroller egyetlen közös áramkörbe (chip -be) integrált csökkentett utasításkészletű mikroprocesszor és több periféria áramkör. A több cég által is gyártott 8031/51 típusú mikrokontrollerben a következő perifériák találhatók: (21. ábra) · · · · · · ·
két 16 bites időzítő/számláló ( T0, T1 ), négy 8 bites - bitenként is kezelhető - Port ( P0, P1, P2, P3 ), 128 bájt belső memória ( RAM ), 128 bájt SFR memória ( RAM ), 4 Kbájt programmemória ( ROM csak a 8051 típusban), RS 232 szabvány szerinti soros vonalillesztő, megszakítás vezérlő egység,
20. ábra 5.1. A 8051 mikrokontroller család A 8051 mikrokontroller családnak különböző típusú mikrokontrollerei vannak. A család alaptípusa a 8031/51 kontroller. A továbbfejlesztett változatok mindegyikében változatlanul benne van az alaptípus minden eleme, és további perifériákat is tartalmaz, vagyis működésben felülről kompatíbilisak. A család minden tagjának azonos az utasításkészlete. A bővített perifériák miatt több SFR regisztert, illetve megszakítást használható. A kontroller család elemeit több cég is ( Siemens, Philips, Dallas, Atmell stb. ) gyártja és forgalmazza. Néhány elterjedt típus és periféria bővítései : · ·
8032/52 80C552
3. időzítő/számláló (T2), 3.idözítő/számláló (T2), Watchdog számláló (T3), 8 csatornás (10 bites) A/D átalakító,
30
2. soros vonalillesztő ( I2C busz ), két PWM modulációs kimenet. · 80515/535 3.idözítő/számláló (T2), 8 csatornás (8 bites) A/D átalakító, programozható referencia-feszültség, 2. soros vonalillesztő ( RS232 ), 5.1.1. A CPU és regiszterei A mikrokontroller központi műveletvégző és vezérlő egysége ( CPU ) - a tulajdonképpeni mikroprocesszor rész - hajtja végre · · · ·
az utasításbeolvasás -t, és "értelmezés"-t, az aritmetikai-, és logikai műveleteket, a belső működés - utasítástól függő - vezérlését, a külső vezérlőjelek generálását.
A CPU működését közvetlenül támogató SFR regiszterek: · ·
az akkumulátor ( ACC ) a műveletek operandusz-, és célregisztere, a státusz-regiszter (PSW),a műveletek eredményétől függő feltétel bitek tárolója, · a stackpointer ( SP ), tárolja a stack memóriába utoljára letárolt információ címét, · a program számláló ( PC ), tárolja a következő utasítás-bájt címét. · a B regiszter , a szorzás, ill. osztásnál az egyik operandusz-, és célregiszter. 5.1.2. Belső memória A 8031/51 típusban 128 bájt - míg a család többi tagjában 256 bájt - méretű operatív belső memória és 128 bájtos SFR memória van. (22. ábra)
21. ábra A belső operatív memória - címsorrendben - a következő részekre tagozódik:
31
· · ·
az alsó 32 bájt ( 00H - 1FH ) négy 8 bájtos Regiszter Bank - ra oszlik ( BANK0, BANK1, BANK2, BANK3 ), a következő 16 bájt ( 20H - 2FH ) bit-címezhető memóriaterület, a további címeken ( 30H - 7FH az 51-es típusnál, illetve 30H - FFH a többi kontrollérnél ) általános felhasználású memória.
Az SFR jelölésű memóriaterület ugyancsak a 80H - FFH címen helyezkedik el, de címzési módja különbözteti meg az ugyanezen címtartományban lévő általános felhasználású memóriától
Ø
A Bankok és használatuk A Bankok közül mindig csak egy - az aktívnak választott - érhető el az utasításban foglalt címzés-el. A kiválasztott bank egyes regisztereit az R0, R1, ... R7 szimbólumokkal jelöljük. Az R0, és R1 használható indirekt címzéshez, míg a többi tárolásra, vagy ciklusszervezéshez alkalmazható. A teljes BANK terület bármelyik bájtja direkt címzéssel tetszőlegesen irható, vagy olvasható. A Bank kiválasztása a PSW regiszter RS1, RS0 jelű bitekbe irt értékkel, történik ( a két bites bináris szám adja a Bank számát, pl. RS1 = 1, RS0 = 0 a BANK2 -t teszi aktívvá). A PSW regiszter bitkiosztása a következő: CY AC F0 Az egyes flag -ek, jelző-bitek:
RS1 RS0 OV
-
P
·
CY (carry) az átvitel-, áthozat -bit, amely az aritmetikai műveleteknél jelzi a túlcsordulást, · AC az alsó négy bit túlcsordulását jelző bit, a BCD átalakításnál van szerepe, · F0 felhasználó által használható jelző-bit, · RS0-RS1 határozzák meg az aktuális Bank -ot, · OV az aritmetikai túlcsordulást jelzi, · P az Accumulator -ban lévő 1 páros számát jelzi (0, ha páratlan számú 1 van). A CY, OV, és P bitek értékétől függően program-ugrásokat lehet végrehajtani. A vonatkozó feltételes vezérlésátadó utasításokat a programozásnál fogjuk ismertetni.
Ø
A bit-címezhető memória, és használata
A bit-címezhető bájtok egyes bitjei külön-külön is írhatók, olvashatók, illetve értékükkel logikai műveletek végezhetők. Az egyes bitek kétféle módon címezhetők, még-pedig ·
bájtcím. bitszám formában pl. 20.5 a 20H című bájt 5-ös bitje ( a bit-szám 0 7 szám valamelyike, 0 az első, 7 a nyolcadik bitet jelenti ),
·
abszolút bitcímzéssel 00H - 7FH címtartományban. A 16 bájtos memóriaterületen lévő 128 ( 16 * 8 ) bit számozása a legelső bájt legkisebb helyértékű bitjénél kezdődik ( 20.0 - 00H ), majd a következő bit s így tovább, s sor a legutolsó bájt legnagyobb helyértékű bitjével fejeződik be ( 2F.7 7FH ).
A bites logikai műveletvégzés lehetősége folytán a mikrokontrollerek nagyon előnyösen használhatók automatizálási (vezérlési) feladatokat megvalósító berendezések (PLC – k) építésére.
Ø
Általános felhasználású memóriaterület 32
A belső operatív memória 30H címtől kezdődő memóriaterületét minden megkötöttség nélkül lehet változók értékének tárolásra felhasználni. A memória terület 00H - 7FH címen elhelyezkedő bájtjai ( a 8031/51 típusnál csak ez létezik ) mind direkt-, mind pedig indirekt címzéssel elérhetők. A 80H - FFH című bájtok csak indirekt címzéssel érhetők el, mivel ugyan ezen a címeken vannak az SFR terület bájtjai, amelyek kezeléséhez viszont a direkt címzést kell használni.
Ø
Speciális Funkció Regiszterek (SFR)
Az SFR jelölésű - a 80H - FFH című - memóriaterületen helyezkednek el a · · ·
CPU regiszterek, programozható perifériák vezérlő-, és státusz regiszterei, a Port-ok kimeneti tárolói.
Az SFR regiszterek között vannak olyanok, amelyek csak bájtosan, és olyanok is amelyek bitjei egyedenként is írhatók, olvashatók. Az utóbbi csoportba azok a regiszterek tartoznak, amelyeknek a címe 8-al osztható (pl. 80H,88H....F0H,F8H ). 5.1.3. A Portok A mikrokontrollerek és a környezet között az adatcsere a Portokon keresztül történik. A portok mind bájtosan, mind pedig bitesen kezelhetők. Mindegyik port-bit alkalmazható be-, vagy kimenetként is. A mikrokontroller családnál a portok többsége nem csupán egyszerű I/O port -ként használható, hanem további, úgynevezett másodlagos funkcióra is alkalmazható. A négy Port egy - egy bitjének kapcsolási rajza a 23. ábrán látható. A 8031/51 kontroller -nél az egyes portok másodlagos funkciói a követezőek: · · · ·
P0 P1 P2 P3
multiplexelt CIM - ADAT busz ( AD0.... AD7 ), nincs cím felső 8 bitje ( A8 ...... A15 ), bitenként különböző: soros vonal (RxD - P3.0, TxD - P3.1) külső megszakítás bemenetek (INT0 - P3.2, INT1 - P3.3), számláló bemenetek (T0 - P3.4, T1 - P3.5), külső memória vezérlése ( WR - P3.6, RD - P3.7).
P0
P1 33
P2
P3
22. ábra Minden port-bit írásakor az adat a D-tárolóba kerül, amelyben tárolt érték állítja be - az illesztő áramkörön keresztül – a kimenet állapotát. Egyszerű olvasáskor a lábon lévő adat kerül a belső buszra. A read-modify típusú utasításokkal a tároló tartalmát lehet visszaolvasni Amikor a port-bitet bemenetként kívánjuk felhasználni, vagy a másodlagos funkciót akarjuk engedélyezni, akkor a D - tárolóba HIGH szintet ( 1 - et ) kell írni. A RESET jel hatására a mindegyik port a tárolóiba 1 íródik. 5.1.4. Programozható időzítő / számláló egységek A 8031/51 típusú mikrokontrollerben két programozható időzítő/számláló (T0, T1) periféria van. A két periféria felépítése egyforma, és három üzemmódban azonosan is használható. Eltérés a kettő között az, hogy az "osztott" üzemmódra (3-as üzemmód) csak a T0 - ás időzítő/számláló programozható, míg a soros adatátvitelt ütemező Baud-rate generátor-ként csak a T1 - es használható. A T0 egység a TH0, és a TL0 jelű, míg a T1 pedig a TH1, és a TL1 jelű SFR regiszterekben számlálja a kiválasztott bemenet impulzusait. Az impulzusforrás lehet az órajel 12-e ( foszc/12 ), vagy egy külső impulzussorozat, amelyet a T0 ( P3.4 ), vagy a T1 ( P3.5 ) lábakra csatlakoztatunk. A számlálók üzemmódját a TMOD (Timer-Modus) nevű SFR regiszter tartalma határozza meg. A számlálók vezérlő bitjei, és a túlcsordulást tároló bitek a TCON (Timer-Control) - bitenként is irható, olvasható - SFR regiszterben vannak. A számláló akkor használható digitális késleltetőnek (időzítőnek), ha a számlált jelsorozat frekvenciája állandó. Ez a feltétel a belső – frekvencia-stabilizált - órajel kiválasztásánál teljesül, és ekkor mondjuk, hogy az egység időzítő. A kívülről érkező jelsorozat kiválasztásakor esemény-számlálásról beszélünk. Az időzítés alapegysége a mindenkori órajel periódusidejének 12 szerese, mivel gépi ciklusonként növekszik (incrementálódik) a számtartalom. A számlálásnál a külső jel
34
élváltásának meghatározásához két gépi ciklus szükséges, és ezért a legnagyobb számlálható frekvencia az órajel-frekvencia 24-e.
Ø
Időzítő / számlálók vezérlése
A T0 számláló periféria üzemmódját a TMOD regiszter alsó négy bitje, míg a felső négy bit a T1 egységét állítja be. (Az azonos szimbólumok indexe utal a számláló számára ). ·
A C/T0(1) bit választja ki az impulzus-forrást. A bit logikai 1 érétke a leosztott belső órajelet, míg a 0 érték a külső lábra érkező jelet kapcsolja a számlálóra.
·
M10(1) és az M00(1) bitekből álló bináris szám határozza meg az számlálóregiszterek működésének módját, az üzemmód-ját.
·
A számláló indításának, leállításának módját a GATE0(1) kapuzó bit szabja meg. 0 érétkénél csak szoftverből, míg egy értékénél szoftverből, és külső jellel (hardver módon) is vezérelhető a számláló.
A számlálás indítható, illetve leállítható: ·
csak szoftver vezérlési módban a TCON regiszterben lévő TR0(1) szoftver indító bit logikai 1 szinttel indít, 0 - val pedig leállít,
·
szoftver, és hardver vezérlésű módban, a TR0(1) bit és az INT0(1) lábra kívülről adott vezérlő jel együttes 1 szintje indítja a számlálást, míg bármelyik 0 értéke leállítja azt.
A TMOD és a TCON regiszterek bitjei a következők: TMOD
T1 Gate
C/T
M1
T0 M0
Gate
C/T
M1
M0
TCON TF0
IT1
IE0
IT0
számlálók leállítása után is megmarad a regiszterekben lévő számtartalom, és egy újra indítás után erről az értékről folytatódik a számlálás. A számláló regiszterek tartalma programból - tetszőleges értékre - bármikor átírható.
Ø
Időzítő / számlálók 0-ás és 1-es üzemmódjai
Mindkét üzemmódban szabadon futó előre számlálóként működik a periféria. A különbség csupán az, hogy a 0 - ás módban a magasabb helyértékű regiszter (a TH0(1)) csak 5 bites, míg az 1 - es módban 8 bites. Ennek megfelelően a 0 - ás üzemmódba állított számláló 13 bites, míg az 1 - es modulusú pedig 16 bites. A két regiszterből álló számláló kiegészül egy túlcsordulás bittel (TF0 (1)), amely a TCON regiszterben van. A túlcsordulást követően a számlálás kezdődik elölről, és a túlcsordulás bit is törlődik. A túlcsordulás megszakítás-t (interrupt) is indíthat, ha az engedélyezett. Az áramköri felépítést szemlélteti a 16. ábra.
35
23. ábra A számláló modulusa változtatható oly módon, hogy a túlcsorduláskor egy 0 - tol eltérő kezdőértéket, írunk a számlálóregiszterekbe. (Csak megszakításos működésnél valósítható meg!)
Ø
Időzítő / számlálók 2-es üzemmódja
A 2 - es üzemmódban csak a TL0(1) 8 bites regiszterben történik a számlálás. A regiszter túlcsordulásakor ebbe a regiszterbe magától átíródik a TH0(1) regiszter tartalma, és ezért nem kell a kezdőértéket mindig újra írni. . Az áramköri felépítést szemlélteti a 17. ábra.
24. ábra A túlcsordulást jelző bitnek ugyanaz a működése, mint a 0 - ás, vagy az 1 - es üzemmódokban. A 2-es üzemmódot elsősorban az állandó késleltetési időalap előállítására szokás használni. A soros adatátvitel ütemezéséhez (Baud-rate generátor) a T1 számlálót is ebbe a módba kell beállítani.
Ø
A T0 időzítő/számláló 3-as üzemmódja
A 3-as üzemmódot osztott regiszteresnek is nevezhetjük, mivel ekkor a T0 jelű periféria egység két 8 bites számláló regisztere más-más impulzussorozatot számlálhat.
36
·
A TH0 a leosztott órajelet számlálja, ha a TR1= 1. Túlcsordulásakor a TF1 bitbe kerül 1. Ez egy vezérelt késleltető.
·
A TL0 regiszterhez csatlakoznak a T0 vezérlő áramkörei, és ezért e regiszterben 8 bitesen a leosztott órajel (időzítés), vagy a T0 lábra érkező impulzusok számlálása történhet (eseményszámlálás).
Az áramköri felépítést szemlélteti a 26. ábra.
25. ábra Ezt az üzemmódot akkor kell használnunk, ha szükséges a soros kommunikáció - tehát a T1 foglalt - és a feladat megoldásához szükséges két független számláló. 5.1.5. Soros vonali illesztő A mikrokontroller beépített perifériája a soros adatátviteli illesztőegység. A soros átvitelnél a kontroller a TxD jelű lábon adja a kiviendő, míg az RxD jelű lábon fogadja a beérkező adatokat. Az átviteli egység Full - duplex, ami azt jelenti, hogy egyidejűleg mind adás, mind pedig vétel is folyhat. A periféria üzemmódjainak vezérlő bitjei, illetve a státusz bitek az SCON jelű SFR regiszterben vannak. Négyféle üzemmódban működhet az átviteli egység. A leggyakrabban az RS232C szabványnak megfelelő 3-as üzemmódot használják. A soros - aszinkron kommunikációt a T1 időzítő/számláló ütemezi 2-es üzemmódban. Az átvitel Baudban (bit/sec) mért sebességét az órajel frekvenciája és a számláló modulusa határozza meg, amely számítható is, vagy a katalógusokból kikereshető. A kommunikáció a 19. ábra szerinti bitsorrendben bájtonként történik. · ·
Adásszünetben az átviteli vonalakon magas szint van. Egy bájt adása az egy bit-ideig tartó alacsony szintű un. START bittel kezdődik.
37
· · ·
Ezután kerülnek egymás után a vonalra - a legkisebb helyértékűvel kezdve - a bájt bitjei, az ADAT - bitek.(D0 – D7) Az adatok után következhet egy paritás - ellenőrző bit, amely programozástól függően el is maradhat.( P ) A bájt adását egy, vagy két - magas szintű - STOP - bit zárja le. D0 D1 D2 D3 D4 D5 D6 D7
Adás szünet
Start bit
Adat bitek
P
Paritás bit
Stop bitek
26. ábra Az adatátvitel önszinkronozó, mivel egy bájt átvitelét egy magasról-alacsony szintre váltó él indítja mindig. Adásszünetben a vonalak magas szinten vannak. A kommunikáció csak akkor lesz hibamentes, ha az adó és a vevő átviteli sebessége, és formátuma azonos. A 20. ábrán látható az RS232 szabvány szerint működő soros vonali illesztő egység logikai vázlata. A programozható illesztő a TxD (Transmit =adó), és az RxD (Rcievie =vevő) vonalakon keresztül kommunikál a csatlakozó egységgel. E mellett még a két készülék közös tápfeszültség pontjait (GND) kell összekötni. A fizikailag különböző vonalak lehetővé teszik az egyidejű adást, és vételt, vagyis DUPLEX. A működést ütemező jelet a T1 számláló túlcsordulása végzi. Az adás sebességét még az SMOD bit 0-ba állításával felezni lehet. Két SBUF (Serial Buffer) jelű léptető-regisztert találunk az ábrán. Az egyik a kiviendő adatot, míg a másik a vett adatot tárolja. A felhasználói felületről nézve, mindkettő azonos címen van!! A különbség, hogy az adó-regiszterbe csak írni, míg a vevő-regiszterből csak olvasni lehet. A 20. ábra alapján tömören áttekintjük a soros adás, és a vétel működését.
38
27. ábra
Ø
Adás
Az adás egy - az SBUF –ba irányuló - adatátviteli utasítással indul. Ekkor az „Írás az SBUF -ba” jelű bemenetre érkező vezérlő jel a belső adatbuszról az SBUF -ba tölti a kiviendő adatot, a D flip-flop -ba írja a TB0 bit értékét (9. bit), valamint indítja az adás vezérlését (Start). A további folyamat önállóan megy végbe, amely a 21. ábrán követhető. Az adás-vezérlő állítja elő a Send, Data, és Shift jeleket. Ezek vezérlik a TxD vonalon kilépő – a 19. ábrán vázolt felépítésű adatsort. A nyolcadik adat bit (D7) kilépése után írja 1-be a TI bitet, amely jelzi az információ kivitelének végét.
39
28. ábra
Ø
Vétel
A soros vonalon érkező információ az RxD csatlakozópontra jut. Amíg nincs érvényes adat, a vonal magas szinten van. A vonalon megjelenő 1 – 0 átmenet „jelezheti” bájt következik. A vétel-vezérlő egységet az él-figyelő indítja a Start bemenetén, és ez a jel egyúttal törli a 16-os osztót is. Az osztó a háromszor vizsgálja a bejövő jel szintjét (a bit-idő közepén). A Start-bit esetében ez a 0. Amennyiben a három eredmény többsége 0 szintű, akkor valóban új adat-bájt kezdődik, tehát folytatódik az adatsor beléptetése. Amennyiben a vizsgálat nem ad 0-t, akkor egy külső zaj indított, és nem folytatódik a művelet. A nyolc adatbit beléptetése után 1-be vált az RI (Recevie Interrupt) bit, amely jelzi az új információ beérkezését. Az új adat párhuzamosan kiolvasható. 5.1.6. Megszakítások A mikrokontroller megszakításainak segítségével oldhatók meg az események valós idejű kezelése. A program megszakítását kérheti : · · ·
külső esemény az INT0, ill. az INT1 lábakra adott jellel, a T0, vagy a T1 számláló túlcsordulása, a soros adatátvitel.
A felsorolt források mindegyikéhez tartozik egy megszakítás kérő (interrupt requist) bit, amely 1-be írása kezdeményezheti a a megszakítást. A megszakítások mindegyikéhez tartozik a programmemória egy címe.
29. ábra Mindegyik megszakítás elfogadása egyedileg engedélyezhető, vagy tiltható az IEN (Interrupt Enable) SFR regiszter megfelelő bitjeivel (1 enged, 0 tilt). Ugyanezen regiszter legmagasabb helyértékű (MSB) bitje általános engedélyező bit. Ha ez 0 akkor mindegyik megszakítás elfogadása tiltott, amikor 1 értékű, csak akkor hatásosak az egyedi engedélyezések.
40
A megszakításforrások között egy prioritási sorrend van, ami azt jelenti, hogy egyidejű megszakításkéréskor a magasabb prioritásút szolgája ki a CPU. A prioritási sorrend korlátozottan módosítható az IP ( Interrupt Priority ) regiszter egyes bitjeivel.
Ø
Megszakítások kiszolgálása
A megszakítás elfogadásakor a Stack -be a visszatérési cím a PC programszámlálóba a megszakításforráshoz tartozó cím ( fix című megszakítás kiszolgálás ) íródik, és a CPU e címmel kezdődő szubrutin hívást végez. Ezért ezekre a címekre olyan vezérlésátadó utasítást kell írni, amely a a megszakítást kiszolgáló rutin kezdőcímére ugratja a programfolytatást. A megszakítás elfogadása után a CPU letiltja a további megszakítás engedélyezést, ezért a kiszolgáló rutint a RETI utasítással kell befejezni, aminek hatására töltődik vissza a Stack ből a PC-be a visszatérési cím, és az általános megszakítás-elfogadás engedélyeződik. A külső megszakítások kezdeményező jelét legalább két gépi ciklus idejéig kell fent tartani, de a kiszolgáló rutin vége előtt meg kell szüntetni. A megszakításkérő bitek közül a külső megszakításokhoz tartozók a rutinba ugrás után törlődnek. A számláló túlcsordulások, - ha az időzítéses módban üzemelnek - ugyancsak törlődnek. Egyébként szoftver úton kell törölni a megszakítás rutinban. 5.1.7. Teljesítmény felvétel vezérlése A mikrokontroller teljesítmény felvétele programból állíthat. A két lehetséges üzemmód · ·
Power Dawn és az Idle.
30. ábra 5.2. Külső memóriák illesztése A mikrokontrollerhez külső program-, és adatmemória is csatlakoztatható. A külső memóriák címzése, és adatforgalma a P0, és P2 portokon keresztül történik. · ·
A P2 port adja a címbuszra a felső nyolc bitet ( A8 ... A15 ). A P0 porton jelenik meg - időosztással - először a cím alsó nyolc bitje ( A0 ... A7 ), majd az adatbusz ( D0 ... D7 ) funkcióját látja el. A szétválasztáshoz külső tárolót ( EXL ) kell alkalmazni, amelybe az ALE ( Address Latch Enable ) vezérlőjel lefutó éle írja be a címbiteket. 5.2.1. Adat-, és programmemória kezelése 41
A 16 bites címmel 64 Kbájt memória érhető el. Ez a memória - kapacitás megduplázódik azzal, hogy a programmemóriából történő olvasást - a címkiadást követően - a PSEN (Program Strobe Enable) jel, míg az adatmemóriából az olvasást az RD (Read), az írást pedig a WR (Write) jel vezérli. Amelyik kontroller -ben van belső programmemória is (pl. a 8051 típus) a belső és külső memória együtt lehet 64 Kbájt, és a külső memória kezdő címe a belső után következik. Viszont le is tiltható a belső programmemória és ekkor a külső memória 64 Kbájt lehet. De mód van arra is, hogy csak külső memóriát használjunk. Ehhez az EA jelű szelektáló bemenetre 0 szintet kell adni. Ilyenkor a külső programmemória kezdő címe 0000H. 5.2.2. Külső perifériák csatlakoztatása A mikrokontroller családnál - a mikroprocesszoroktól eltérően - nincs külön perifériát író/olvasó utasítás. A perifériákat illesztő áramköröket a külső adatmemória részeként kell megvalósítani (memóriába ágyazott periféria ). A bemeneti - input - egységek jeleit - szintillesztő áramkörökön keresztül - egy buszmeghajtó áramkör (pl. 74LS541) bemeneteihez kell csatlakoztatni. A meghajtó kimenetei az adatbuszhoz csatlakoznak. Az áramkör kiválasztásához cím-dekódolót (pl. 74LS138) kell használni, amely az illesztőhöz rendelt címnél előkészíti az átvitel engedélyezést, amely a RD jel hatására következik be. Ekkor a külső periféria adatbitjei a kontroller akkumulátorába kerülnek. Kimeneti - output - egységhez kimeneti tárolót kell alkalmazni (pl. 74LS574), amely kiválasztása - a bemenethez hasonlóan – cím - dekódolással történik, és az akkumulátorból kiírandó adat a tárolóba a WR jel hatására íródik be. A tároló kimenetei szint-, és teljesítményillesztő áramkörökön keresztül hajthatják meg a vezérelt egységeket.
42
6.
Mikrogépek programozása
A fejezetben a 8031/51 típusú mikrokontroller család valamelyik típusával megépített mikrogép assembly nyelvű programozásával foglalkozunk. 6.1. A programozásról általában A különböző automatizálási, adatfeldolgozási, vagy egyéb alkalmazói feladatok céljára ma már csak programozható „intelligens” berendezéseket, mikroprocesszoros készülékeket használnak. Az ilyen készülékek működését a programmemóriában tárolt kódsorozat – a program – határozza meg. A mikrogépek két csoportba sorolhatók aszerint, hogy a felhasználó módosíthatja-e a működtető programot, vagy nem. A háztartási gépekben, vagy a korszerű vezérlőelektronikával ellátott gépjárművekben, vagy különböző gyártó berendezésekben lévő mikrogépek működtető programját gyárilag írják be a csak olvasható típusú memóriákba ( ROM, PROM, EPROM stb.), s így az a felhasználó által nem módosítható. Ezeket fix programú készülékeknek nevezzük. A különböző feladatokra is felhasználható készülékeknél – számítógépeknél (PC), programozható logikai vezérlőknél (PLC) stb. - gyárilag csak a konfigurációnak megfelelő memória, és periféria-kezeléseket (BIOS, monitor program stb.) készíti el a készülékgyártó, és tárolja a fix memóriában. A készülék programmemóriájának egy jelentős területe írhatóolvasható (RAM), amelybe felhasználói programok tölthetők, és innen futtathatók. Az ilyen berendezéseket nevezik szabadon programozható típusúaknak. A letölthető felhasználói programokat akkor kell írnunk, ha ugyanazon készüléket más-más feladat ellátására is fel kívánunk használni. A következőkben tömören foglalkozunk a programfejlesztés céljával, eszközeivel, módszereivel, és ellenőrzésének fajtáival. 6.1.1. A programozás célja A mikrogép működését meghatározó programot az un. code-, vagy programmemóriába kell tárolni az alkalmazott mikroprocesszor, vagy mikrokontroller - a továbbiakban processzor - típusától függő gépi kódok sorozatával. A program végrehajtásakor a processzor innen olvassa ki az utasításokat, és paramétereket. A programozás célja tehát. · ·
egy olyan kódsorozat létrehozása, amelyet egy mikrogép (mikroprocesszor bázisú számítógép) programmemóriájába töltve, · meghatározza a mikrogép feladat szerinti működését. 6.1.2. A programfejlesztés lépései A programfejlesztés az alábbiakban tömören ismertetett lépésekből áll. A program felépítésének megtervezése. Ezt segíti a folyamatábra megrajzolása. a. A programban használt változók, állandók, periféria-címek meghatározása. b. szöveges formában - valamilyen szövegszerkesztő (editor) segítségével - kell megírni a programozási-nyelv " helyesírási " (szintaktikai), és tartalmi (szemantikai) szabályai
43
szerint. Az így megirt szöveg a program forrásnyelvi formája. A számítógépek, mikrogépek alkalmazásának széleskörű elterjedése a különböző programnyelv választékot is bővítette. A programnyelveket gépközeli- (assembly), és a magas szintű nyelvek csoportjába sorolhatjuk. ·
Gépközel i az a programozás, amelynél minden program l épés – programsor - az alkalmazott processzor egy-egy u t así t ása . Mivel minden processzornak saját utasításkészlete van, ezért a programírás is processzorfüggő. Az ilyen programírást nevezzük assem bl y vagy más közelítésben processzoru t así t ás szi n t ű programírásnak.
·
A m agas szi n t ű programozási nyelvek (Pascal, C, stb) rendszerint a nemzetközileg elfogadott m at em at i kai , l ogi kai műveletek, és különböző ál t al án os, a pr o gr amszer kezet et meghat ár o zó u t así t ások segítségével írják le a feladatot. Ezért e nyelveken a programozás független attól a géptől, amelyen a programot futatni akarjuk. A magas szintű nyelven történő programírást m ű vel et - közpon t ú programozásnak is nevezhetjük.
c. A forrásnyelvi programból a különböző f ordí t ó programok (assembler, compiller) állítják elő a program t árgykódú (object) alakját, illetve a programlistát, amelyek már a processzor utasításkódjait is tartalmazzák. (A leírtakból következik, hogy a magas szintű nyelveknél is a fordítóprogram már processzortól függő.) d. A tárgykódú programból, vagy programokból (több modul esetében) a szerkeszt ő (linker) program állítja elő a f u t t at h at ó programváltozatot. Az így előállított programot kell b eí rn i (letölteni) a programmemóriába. A programmemória lehet fix (ROM, EPROM), illetve irható-olvasható (RAM) kialakítású. A beégetés, vagy letöltés történhet teljes kódú (bináris), vagy tömörített (pl. HEX) alakú fájlból. Ennek megfelelően a programozás utolsó lépése a kívánt kódkonverzió elvégzése. 6.2. Assembly nyelvű programozás A különböző assembly nyelvek nagyon sok azonos elemet tartalmaznak. Rendszerint a felépítésük, szintaktikai szabályaik közel azonosak. Lényeges eltérés a processzorok utasítás-készleteiben van. Az assembly nyelvek formai követelményei viszonylag szigorúak. A legerősebb kötöttség a processzor utasítások írása, amelyeket az adott processzor dokumentációjának deklarált formájában szabad használni. Szabadságfok, hogy nincs különbség a kis-, és nagybetűs írásmód között. Mindegyik assembly - ben használhatók: · · · · · ·
szimbólumok a változók, állandók, és címek megadásához, címkék (label) a programrészek azonosításához, helyfoglaló-értékadó utasítások (direktívák) a program-. és az adatmemória kezeléséhez, műveleti jelek (operátorok) a szimbólumok, címek közötti aritmetikai, logikai műveletekhez, fordítási (command) utasítások, és magyarázatok (comment) a program szöveges leírásához. 44
6.2.1. A forrásnyelvi program A forrásnyelvi program írásakor törekedni kell az áttekinthető felépítésre, a megfelelő magyarázatokkal támogatni az érthetőséget. Ugyanakkor szigorúan be kell tartani a szintaktikai szabályokat. A program általános szerkezete a következő: · fej a program jellemzőinek tömör összefoglalása, · fordítási parancsok, · a használt változók, konstansok, memória szegmensek deklarálása, · a program – törzs (inicializálás, főprogram), · a szubrutinok (alprogramok). A mikrogép által elvégzendő feladatokat a főprogramban, és a szubrutinokban kell leírni a processzor utasításainak segítségével. A forrásnyelvi programban minden utasítást külön sorba kell írni. Egy sor általános felépítése a következő:
címke: műveleti utasítás és operandus -ok
; magyarázat
A sorokból - felsoroltak közül - egy, kettő, vagy mindhárom hiányozhat, vagyis egy sor lehet üres, tartalmazhat csak címkét, vagy csak magyarázatot, vagy csak utasítást, illetve ezek lehetséges variációit. A forrásnyelvi program ajánlott felépítése az alábbi sorrendben: §
a programazonosító fej,
§
fordítási parancsok,
§
deklarálások: - konstansok, periféria címek megadása, - szegmensek deklarációja, - szegmenseken belüli deklaróciók
§
a főprogram megírása,
§
alprogramok (szubrutinok) megírása.
A következő példa szemlélteti az ajánlott programfelépítést. Az alkalmazott magyarázat (comment) segítik a szerkezet felismerését. Mint látható a magyarázó szövegek kezdhetők a sor bármelyik helyén, de mindig pontos-vesszővel kell kezdeni. A fordító program (assembler) soronként fogja olvasni a forrásnyelvű szöveget, és amikor a sorban ; - t talál, akkor abbahagyja a sor elemzését, és a következő sort fordítja.
45
; xxxxxxx A PROGRAMAZONOSÍTÓ FEJ xxxxxxx ;********************************************************** ;* BMF KKVM Automatika Intézet * ;* Elektronika Szakcsoport * ;********************************************************** ;* Főprogram: GYAKORLÓ-TESZT * ;* Változat: V1.2 * ;* Dátum: 1999.09.05 * ;* Készítette: XY * ;********************************************************** ;* A modul leírása: * ;* A mikrokontrolleres gyakorló belső perifériái* ;* nak tesztelése. * ;********************************************************** ;xxxxxxx FORDÍTÁSI PARANCSOK xxxxxxx $XREF $DEBUG NAME FO_MOD ;################### DEKLARÁCIÓK ########################### ;****** Gyakorló port címei ****** NGS XDATA 0C000H ; nyomógomb-sor címe LEDS XDATA 0C001H ; LED -sor címe PROG VALT VALTB STACK
;******* Szegmensek deklarálása ****** SEGMENT CODE SEGMENT DATA SEGMENT DATA BITADDRESSABLE SEGMENT DATA
; program ; bájtos változók ; bitcímezhető változók ; stack memória
;****** ADAT szegmens bájtos változóknak ******* RSEG VALT DS 10H ;helyfoglalás 16 bájt részére ;****** ADAT szegmens bitcímezhető változóknak ******* RSEG VALTB ; xxxxxxx bájtos változók xxxxxxx DS 2 ; nevezetlen helyfoglalás BEM: DS 1 ; bemeneti memória BEPEL: DS 1 ; pozitív él memória JELZ: DS 1 ; jelző bájt NG0P NG6P NG1N JLZB1
BIT BIT BIT BIT
; xxxxxxx bit változók xxxxxxx BEPEL.0 NG0P+6 BENEL.1 JELZ.0
; ****** STACK kijelölés ****** RSEG STACK DS 10H
; NG0 nyomógomb poz.él bitje ; NG6 nyomógomb poz.él bitje ; NG1 nyomógomb neg.él bitje ; 1.jelzőbit ;STACK kezdet ;16 bájt lefoglalása STACK részére
46
;################### PROGRAMOK ################################### ;***** Program szegmens ***** RSEG PROG ;xxxxxxx Program-törzs xxxxxxx START:
LJMP INIT
; ugrás az inicializálásra
;****** Megszakítás ugrótábla ****** DS 8 INIT:
; helyfoglalás a megszakításoknak
;******* Inicializálás ******* MOV SP,#STACK-1 . . .
; változóknak kezdőértének megadása ; periféria üzemmódok beállítása ; megszakítások engedélyezése
;******** Fő program ********* FOPR:
CALL
BEOLV
; beolvasás, él meghatározás
;xxx a feladatot megoldó program xxx . . . ;xxx kimenetek vezérlése xxx
; a program további része
FOPRV: CALL JMP
KIIR FOPR
;kimenetek vezérlése ; visszatérés a főprogram elejére
;******** Szubrutinok ******** ;xxxxxxx beolvasó és él képző rutin xxxxxxx BEOLV: MOV MOVX
DPTR,#NGS A,@DPTR
;beolvasás a nyomógomb-sorról ; a rutin további része
. . . RET
;visszatérés a főprogramba
;xxxxxxx kiviteli rutin xxxxxxx KIIR: MOV MOV
DPTR,#LEDS A,KIM
;kimeneti memória kivitele ;a kimeneti perifériára –LED sorra ; a rutin további része
. . RET END
; a fordítóprogramnak jelzi a forrás ;végét
47
Ø
A címke ( label )
A címkét olyan programrészek első utasítása elé kell írni, amelyekre a program egyéb helyein hivatkozunk, vagyis ahová a vezérlést át kell adni (ugrás, vagy rutin hívás). A címke tulajdonképpen a hivatkozási hely címét tartalmazó szimbólum. A programban azonos címkék nem használhatók! A címke egy betűvel ( 'a' .... 'z', 'A'..... 'Z', '.' ) kezdődő karaktersor (szimbólum, jelző), amelynek további karakterei számjegyek is lehetnek, és a ' : ' karakterrel kell befejezni. Magyar ékezetes betűk használata tilos! Elvileg a karakterek száma nincs korlátozva, de a fordító csak az első nyolc karaktert tárolja, és nem tesz különbséget a kis és nagybetűk között. ( Ha két címke csak a kilencedik karaktertől kezdve különbözik, akkor a fordító hibát jelez, mivel azonosnak tekinti azokat. ) A címkéket rendszerint a sor elejére írjuk, kiemelve ezzel a sor jelző szerepét. Helyes címkék:
Helytelen címkék:
Kezdet: _1sor: foprog_2:
Ø
2.sor: Ugrás.1: Első sor:
Műveleti utasítás és operandus
A programsorban a műveleti utasítás írja elő a CPU által végrehajtandó műveletet, és a hozzá csatlakozó operandus - ok adják meg a műveleti tényezőket, vagy azok címét. Az operandus lehet: · 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: 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 regiszter pá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
A lehetséges műveleti utasításokat, a hozzá tartozó operandusokat, és helyes írásmódjukat az alkalmazott mikroprocesszor / mikrokontroller utasításkészlet - e tartalmazza. A műveleti utasítást egy szóval, az un mnemonic - al írják le, amely a művelet angol megnevezése, vagy annak rövidítése. Az operandusok lehetnek szám - ok, vagy szimbólum - ok, illetve adott írásjel, amely meghatározza az operátor címzési módját.
48
pl. a
MOV 20 , 45
sorban a műveleti utasítás a MOV mnemonic a másolást jelenti, amely után meg kell adni először a cél cím - ét, (itt a 20-as című memóriahely), majd a forrás címét, vagy értékét ( példánkban a 45 ugyancsak cím ). Az utasítás tehát arra utasítja a CPU - t, hogy a 20 - as címen található adatot másolja át a 45 címen lévő helyre. A következő utasításban MOV 20 , #45 a második operandus előtt álló # azt jelenti, hogy az utána következő szám egy állandó érték, amely a programmemóriában az utasításkód után van. Az utasítás hatására a 20 - as című helyre 45 íródik. Az operandusok szimbólumokkal is megadhatók. 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: jel +,+,* / MOD () · logikai: jel NOT HIGH LOW SHR,SHL AND OR XOR · hasonlító: jel >= / GTE <= / LTE <> / NE = / EQ < / LT > / GT
jelentés
példa
előjel összeadás, kivonás szorzás osztás maradék csoportosítás
( +5, -0AH ) ( cím + offset ) ( 1200H*7 ) ( 17/4 ) ( 17 MOD 4 ) ( (cím-offset)*3 )
jelentés
példa
egyes komplemens a szó felső bájtja a szó alsó bájtja jobbra/balra lépt. ÉS művelet VAGY művelet KIZÁRÓ-VAGY m.
( NOT 5 ) ( HIGH 1234 ) ( LOW 1234 ) ( 2 SHR 8 ) ( szimbólum AND 0AH ) (szimbólum1 OR szimbólum 2 ) ( 12H XOR 5 )
jelentés
példa
nagyobb egyenlő kisebb egyenlő nem egyenlő egyenlő kisebb mint nagyobb mint
(szimbólum >= 13H ) (szimbólum LTE 0A1H ) (szimbólum NE 045H ) (szimbólum = 0A2H ) (szimbólum < 0B2H ) (szimbólum GT 051H )
49
Ø
Szimbólumok használata
A programozást nagyban segíti, ha számokkal megadott címek, változók helyett a jelentésre utaló szavakat, rövidítéseket, vagyis szimbólumok - at használunk. Szimbólumok a már megismert címke, illetve utasítás mnemonic - ok is. · a címke egy programcímet helyettesít, · az utasítás mnemonic a CPU utasításkódját. Szimbólumokkal lehet helyettesíteni · változók tárolási helyének címét, · konstansokat. Szimbólumban csak betű, számjegy és a '_' karakter szerepelhet. A processzor utasítás elnevezése (mnemonic), illetve a belső regiszterek elnevezései, és a direktívák nem használhatók általános szimbólumként. A szimbólum deklarálásához az EQU direktívát kell használni. pl. az EQU BE_GOMB 12 azt jelenti, hogy a BE_GOMB szimbólum értéke 12. Felhasználása programsorban a MOV C , BE_GOMB jelentése, hogy a túlcsordulás bitbe (Cy) másolja át a 12 című bit értékét.
Ø
A számok, szövegek ábrázolása
A számítástechnikában nem csupán a decimális, hanem a bináris, az oktális, és a hexadecimális számábrázolást is használják, illetve az ASCII szabvány szerinti karakter, és string megadás is szükséges. Bináris: a bináris számjegyek után irt B betű pl. 011010 b vagy 011010 B Decimális: a decimális számjegyek vagy utána irt D betű pl. 345 vagy 345 D Oktális: az oktális számjegyek után irt O betű pl. 137 o vagy 137 O Hexadecimális: a hexadecimális számjegyek után irt H betű, ha szám a betű karakterek valamelyikével kezdődik akkor 0 – kell elé írni pl. 15A H vagy 0E34 H . Karakterek ' A ' formában megadott karaktert az ASCII kóddal helyettesít. Szöveg (string) " Ez egy szöveg " az egyes karaktereket ASCII kóddal helyettesítve helyezi le.
50
Ø
Magyarázatok (comment)
A programrészletekhez magyarázatok (comment) is írhatok a forrásnyelvi programunkban. Ezzel segíteni lehet a programlépések megértését, az áttekinthetőséget. A magyarázó szöveget mindig a ; karakterrel kell kezdeni. ; Példa a magyarázat elhelyezésére KEZD: MOV ANL JZ
; itt kezdődik a program ; az akkumulátor feltöltése ; a kimeneti memória maszkolása
A,#5EH A,KIM TOV
A magyarázat szerepelhet egy önálló sorban is, de ha van címke, vagy utasítás, illetve mindkettő, akkor csak ezeket követően írható. 6.2.2. Fordítást vezérlő utasítások A forrásnyelvi fájlból a fordítóprogram (az assembler) készít tárgykódú (.obj) fájlt. A fordító számára is lehet utasításokat adni, az un. direktívák segítségével. A legfontosabb direktívák a követezőek:
Ø
Assembler DIREKTIVÁK
A direktívák tulajdonképpen a fordítást vezérlő parancsok. Ezek segítségével · · · ·
Ø
szimbólumok definiálhatók, lefoglalhatók és inicializálhatók memória területek, összekapcsolhatók modulok, beállíthatók program-, és szegmenscímek. Fordítási parancsok
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étektől függően - programrészek kitilthatók a fordításból. A51 MACRO ASSEMBLER
PELDA1
DATE 02/09/96 PAGE
MS-DOS MACRO ASSEMBLER A51 V4.4 OBJECT MODULE PLACED IN C:\XE2A51\GYAK\PELDA1.OBJ ASSEMBLER INVOKED BY: A51 C:\XE2A51\GYAK\PELDA1.A51 LOC OBJ
LINE 1 2 3 4 5
SOURCE ;xxxxxxx fordítási parancsok xxxxxxx
$XREF $DEBUG
51
1
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
;********************************************************* ;* K K M F Automatika Intézet ;* Elektronika Szakcsoport * ;********************************************************* ;* F‹program: Helyfoglalás adatoknak * ;* Változat: V1.0 * ;* Dátum: 1996.08.20 * ;* Készítette: Zalotay Péter * ;******************************************************** ;* A modul leírása: * ;* Példák a különböző helyfoglalási megoldásokra * ;******************************************************** NAME
Pelda_1
;xxxxxxx Deklarációk xxxxxxx ;**** Relatív címmegadások ( relokálható szegmensek)***** VALT1
SEGMENT DATA
26
VALT2
SEGMENT
27 28 29 30 31 32 33 34 0000 758100 F 35 36 37
VALTB STACK PROG
SEGMENT SEGMENT SEGMENT
0001 0003 0004 lefoglalása
0000 0001
39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
*
;Adatszegmens a direkt címezhető ;belső mem. -ban DATA BITADDRESSABLE ;Adatszegmens a bit címezhető ;belső memóriában BIT ;Bit szegmens IDATA ;Stack szegmens CODE ;Program szegmens
;****** Program szegmens ****** RSEG
PROG
MOV
SP,#STACK-1 . . ;A program utolsó utasítása
;A program első utasítása
;****** Adatszegmens a direkt címezhető belső memóriában RSEG V1: V2: V3:
DS DS DS DS
*****
VALT1 1 2 1 20
;Helyfoglalások a V1,V2,V3 nek ;Nevezetlen memóriaterület
;***** Adatszegmens a bit címezhető belső memóriában ***** RSEG BEM: KIM: DS
VALT2 DS
1
;Helyfoglalás a BEM és KIM nek
1
;***** Bit szegmens ***** RSEG
VALTB
52
0000 0001 0002
0000
1000 7800
0030 0031 0032 00AF 85 0030 0031 0000
F
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 86 87 88 89 90 91
B1: B2: B3:
DBIT DBIT DBIT
1 1 1
;Helyfoglalás a B1,B2,B3 nak
;***** Stack szegmens **** RSEG
STACK
DS
10H
;Stack memória lefoglalása
;***** Abszolút címmegadások **** CSEG FOLYT:
AT
DS DS DATA EQU
BSEG B4: B5: B6
1000H
MOV
DSEG BEM2: KIM2: V4 K1
AT
AT
DBIT DBIT BIT
R0,#KIM
30H 1 1 32H 0AFH 30H 1 1 BEM.0
END
XREF SYMBOL TABLE LISTING ---- ------ ----- ------N A M E T Y P E V A L U E ATTRIBUTES / REFERENCES B1 . . . . B ADDR B2 . . . . B ADDR B3 . . . . B ADDR B4 . . . . B ADDR B5 . . . . B ADDR B6 . . . . B ADDR BEM. . . D ADDR BEM2 . D ADDR FOLYT C ADDR K1 . . . . N NUMB KIM. . . D ADDR KIM2 . D ADDR PELDA_1. . ---PROG . C SEG SP . . . . D ADDR STACK.I SEG V1 . . . . D ADDR V2 . . . . D ADDR V3 . . . . D ADDR V4 . . . . D ADDR VALT1. D SEG
0000H.0 0000H.1 0000H.2 0026H.0 0026H.1 0000H.0 0000H 0030H 1000H 00AFH 0001H 0031H ---0003H 0081H 0010H 0000H 0001H 0003H 0032H 0018H
R R R A A R
SEG=VALTB 60# SEG=VALTB 61# SEG=VALTB 62# 86# 87# SEG=VALT2 88# R SEG=VALT2 53# 88 A 79# A 75# 82# R SEG=VALT2 54# 75 A 80#
A 19
REL=UNIT 29# 33 A 35 REL=UNIT 28# 35 66 R SEG=VALT1 44# R SEG=VALT1 45# R SEG=VALT1 46# A 81# REL=UNIT 25# 42
53
VALT2. D SEG VALTB.B SEG
0002H 0003H
REL=BITADDRESSABLE 26# 51 REL=UNIT 27# 58
REGISTER BANK(S) USED: 0 ASSEMBLY COMPLETE, NO ERRORS FOUND
54
7.
A 8031/51 típusú mikrokontrollerek utasításai
A 8031/51 mikrokontroller család mindegyik egyedének az utasításkészlete egyforma. Az utasítások nagyon hasonlítanak a 8080 típusú mikroprocesszoréhoz. Lényeges eltérés azonban, hogy a 8051-t elsősorban különböző vezérlési feladatokhoz fejlesztették ki, és ezért bit műveletek programozása is lehetséges. A vezérlési feladatok többségénél kétállapotú bemeneti jelek állapotát kell lekérdezni, és ezek alapján logikai műveletek elvégzése után kétállapotú vezérlőjeleket kell kiadni, reléket, lámpákat stb. vezérvezérléséhez. Az ilyen jellegű működés bitszervezést igényel. A bitműveleteket végzéséhez fejlesztették ki – a belső memória egy szegmensének bitenkénti címzési lehetőségét, és a bitekre is értelme logikai műveletek (boole utasítások). 7.1. Az utasítások, és azok 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ájt-számban a műveleti kód és - rendszerint közvetetten - az operandus -ok is benne vannak. Az utasítások között: · · ·
49 egy-bájt 45 két-bájt és 17 három-bájt
hosszúságú van. 7.1.1. 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 időtartamú. A két utasítás végrehajtásához négy gépi ciklus szükséges. A 2. fejezetben tárgyaltuk, hogy 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övetezőek szerint számolható ki: A program összes utasításaihoz tartozó ciklusok összegét szorozni kell a quartz periódusidejének 12-szeresével. A 8051 utasításai - a végrehajtási ciklusszám alapján - az alábbiak szerint oszlanak meg: · · ·
·63 egy-ciklusú, 46 két-ciklusú és 2 négy-ciklusú.
7.1.2. Címzési módok A memóriákban tárolt értékek, illetve tárolásuk helye (címeik) különböző formában adhatók meg. Ezeket nevezzük címzésnek.
55
7.2. 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ó: · · · · ·
regiszter-, direkt-, indirekt-, közvetlen-, indirekt regiszter-
cí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 ötfé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árlócella címe (szám). Az indirekt címzésnél a tárlócella címét egy regiszterben (pointer) 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 (DPTR) használata. Az adatmutatóba egy 16 bites szám irható, 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ó. A relatív címzés a strukturált programozást teszi könnyebbé. Sok esetben előnyös ez a módszer. 7.2.1. Regiszter-címzés Az aktuális bank R0 …R7 regisztereire, valamint az un processzor regiszterekre - ACC, B, PSW, DPTR - közvetlenül lehet hivatkozni. Az ilyen utasításoknál az utasításkód három legalacsonyabb helyértékű bitje határozza meg az aktuális regisztert. Például: a MOV A, 32H utasítás a Akkumulátorba (A) viszi.
32H című belső memória tartalmát az
7.2.2. 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 25, 32H utasítás a 32H című belső memória tartalmát a 25 (decimális) című rekeszbe viszi. A speciális funkcióregiszterek (SFR -k) csak a direkt címzéssel érhetők el. A belső RAM alsó 128 bájtja direkt módon is címezhető. 7.2.3. Indirekt címzés Az indirekt címzésnél egy regiszterben (pointer) van az a cím, amellyel a memória valamelyikébe írni, vagy onnan olvasni akarunk.
56
E címzésnél tehát nem az utasítás, hanem - az aktuális regiszterbank - R0, vagy R1 regisztere, illetve a DPTR tartalmazza az elérendő memóriacella címét. Az R0, R1 címzésnél a 8 bites tartalommal 256 bájt széles RAM terület címezhető. E terület lehet a teljes belső-, vagy a külső RAM egy lapja (page). A 16 bites DPTR segítségével csak külső memória (adat, vagy program) címezhető. Az indirekt címzésre példa a MOVX A , @Ri utasítás ( i értéke 0, vagy 1 ), 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 helyértékű 8 címbit ez alatt 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 Ri -be, pedig az alacsonyabb bájtot. Az indirekt címzések egy bájtosak. Segítségükkel a külső RAM 256 bájtos területe érhető el. A teljes memóriaterület - 64 Kbájt - címzése a DPTR adatmutató regiszterrel történhet, pl. MOVX A,@DPTR . A stack - terület a PUSH és POP utasításoknál is indirekt a címzés. A címe itt a stack mutatóban (SP) van. Ezen az alapon a stack - terület is a RAM tetszőleges területére helyezhető. A programozónak kell biztosítani a Stack kezdő címének megfelelő beállítását. 7.2.4. Közvetlen címzés A közvetlen címzésnél az utasításhoz tartozó adat, vagy cím az utasítás része. Ez azt jelenti, hogy a kívánt értéket - az utasítás részeként - a programmemóriában (ROM, vagy EPROM) van. Például: a MOV A, #23H utasítás 23 hexadecimális értéket ír az akkumulátorba. 7.2.5. Indirekt regiszter-címzés Az indirekt regiszter-cí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á az akkumulátor (A) tartalmát. Például: a MOVC A, @A+ DPTR utasítás hatására az Akkumulátorba másolja a program (code) –memória azon rekeszének tartalmát, amelynek a címe az Akkumulátor, és a DPTR regiszterekbe írt számok összege. Az indirekt regiszter-címzési formát rendszerint a programtárolóban lévő táblázat kezeléséhez használjuk. 7.3. A különböző utasítás fajták 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és átadó utasítások.
57
A felhasználói könyvek, katalógusok, és itt is az alábbi rövidítéseket használjuk: 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.
@Ri
az R0, vagy R1 regiszterekkel történő indirekt címzés.
#data
az utasításban megadott 8 bites adat.
#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 db bit-címezhető területen lévő bit valamelyikét, vagy az SFR területen egy I/O -,, illetve vezérlő-, vagy státuszbitet.
7.3.1. Az adatátviteli utasítások Az adatátviteli - az un. MOV - utasítások regiszter vagy memória cella tartalmát viszik át egy másik regiszterbe, vagy memória cellába. Az utasítás típus három csoportra bontható.
Ø
Az általános adatátviteli utasítások
A csoportot az alábbi utasítások alkotják: MOV
cél, forrás
egy bitet, vagy bájtot visz át a belső memóriában lévő forrás-helyről a cél-helyre. PUSH reg inkrementálja a Stack-Pointer tartalmát majd a vonatkozó regiszter tartalmát az SP által címzett memóriába, írja. POP
reg
az SP által címzett memória tartalmát átírja a vonatkozó regiszterbe, majd dekrementálja az SP tartalmát. Az 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
A , mem
(exchange) az akkumulátor és a címzett memória tartalmát cseréli fel. XCHD A , mem 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.
58
MOVX cél , forrás a külső adatmemória és az akkumulátor között végez adatátvitelt, vagyis az egyik memóriahely mindig az Akkumulátor. MOVC
A , forrás
programtárolóból visz egy bájtot az akkumulátorba. A címzésnél a DPTR -ben, vagy PCben van a báziscím.
Ø
Data-Pointer utasítás MOV
DPTR, # áll
a megadott 16 bites állandóval tölti fel a Data-Pointer -t ( DPTR ).. 7.3.2. Az aritmetikai utasítások. A 8051 mikrokontroller matematikai műveletei korlátozottak. Csupán 8 bites előjel nélküli 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 ADD
A , op2
a 2. Operandus és az akkumulátor tartalmát (1. operandus) adja össze. Az eredmény az akkumulátorba kerül. ADDC A , op2 mint az ADD utasítás, de még a CY flag értékét is az eredményhez adja. DA
A
a BCD számok összeadása után alakítja az eredményt BCD alakúra. INC
bájt
a címzett memória tartalmát inkrementálja (1-el növeli).
Ø
Kivonó utasítások DEC
bájt
A címzett memória tartalmát dekrementálja (1-el csökkenti). Az INC utasítás ellentettje. SUBB A , op2 az akkumulátor tartalmából (1. operandus) levonja a címzett 2.operanduszt. 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 közvetlenül a kontroller. MUL
AB
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étbájtos lesz. Az eredmény alacsonyabb helyértékű bájtja az ACC -be, 59
míg a magasabb helyértékű pedig a B-be kerül. A 256-nál, nagyobb eredménynél az OV 1be íródik. DIV
AB
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. 7.3.3. Logikai 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. ANL
op1 , op2
logikai ÉS művelet az operandus -ok azonos helyértékű bitjei között. Az eredmény az első operandus (op1) helyére íródik, miig a második nem változik meg. ORL
op1 , op2
az ANL -hez hasonlóan végez logikai VAGY műveletet. XRL
op1 , op2
az EXKLUSIV-OR ( kizáró-vagy) művelet két operandus azonos helyé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). SETB
bit
A direkt címzett bitet 1-be írja. CLR
bit
Törli a direkt címzett bitet. 7.3.4. Forgatás ( rotáció) RL A az akkumulátor tartalmát egy hellyel balra forgatja. RLC
A
az akkumulátor tartalmát a CY közbeiktatásával forgatja egy hellyel balra. RR
A
az akkumulátor tartalmát egy hellyel jobbra forgatja. RRC
A
az akkumulátor tartalmát a CY közbeiktatásával forgatja egy hellyel jobbra.
60
Az RLC és RRC utasításoknál a CY az akkumulátor kilencedik bitjének tekinthető. SWAP A felcseréli az akkumulátor felső- és alsó négy bitjét. 7.3.5. Vezérlés átadó utasítások. A vezérlés átadó utasítások alkalmazhatók a programokon belüli különböző ugrások végrehajtására. Ilyen lehet egy szubrutin hívása, vagy egy feltételtől függő programelágazás. A utasítások az alábbi három csoportba sorolhatók: · · ·
feltétel nélküli programelágazás, feltételes programelágazás , megszakítás kiszolgálás.
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 hiv. beutasítást. Ennek megváltoztatásával vezérelhető egy programelágazás. A program-elágazási utasítások megtörik a program tiszta sorrendi (lineáris) lefutását. Először meg kell ismerni az ugrás (JUMP), a szubrutinhívás (CALL), és a megszakítást (Interrupt) kiszolgáló rutinhívás közötti alapvető különbségeket. A különböző JUMP cím utasítások (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 cím utasítás egy szubrutin kezdetére adja át a következő utasítás hívását. Ugyanakkor a Stack -be automatikusan eltárolja a főprogram következő utasításának címét. A rutin feldolgozása egy RET utasításig tart. A RET hatására a főprogram - a Stack -ben tárolt címrő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, de ismétlődő műveletekhez használjuk a szubrutinokat. Egy szubrutin CALL utasítással történő hívása |kizárólag szoftverből történhet. A megszakítási programelá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 hardver-esemény váltja ki. A szubrutin hívása a megszakítás után azonnal megtörténik. A CALL -al való szubrutinhívásra addig kell várni, amíg a program az adott CALL -hoz nem ér.
Ø
Feltétel nélküli vezérlésátadás
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 stack -be íródik, s közben a Stack - pointer értéke kétszer inkrementálódik (16 bites cím kerül be a stack -be). A RET utasítás hatására ez a cím visszaíródik a PC-be, miközben az SP tartalma kettővel csökken. ACALL
cim11
két bájtos szubrutinhí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 helyértékű öt bit érvényes marad (együtt adják a 16 bites címet). Az ACALL hívásakor a PC taralma
61
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
cím16
három bájtos szubrutinhívó utasítás. Alkalmas a teljes 64-Kbájton belüli tetszőleges című rutin hívására a 16 bites címzés miatt. AJMP
cim11
két bájtos - 2 K-bájtos szegmensen belüli - ugrást vezérlő utasítás. LJMP
cím16
három bájtos ugrást vezérlő utasítás. Alkalmas a teljes 64-Kbájton belüli tetszőleges címre történő ugrásra a 16 bites címzés miatt. SJMP
rel
relatív ugrást vezérlő 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átortartalom egy lapot fog át. A DPTR a teljes 64 Kbájt -os programmemória tetszőleges helyére mutathat. Megjegyzés: a legtöbb assembler elfogadja a JMP, illetve a CALL utasítás mnemonic -ot is. Az ugrás távolságától függően helyettesít a megfelelő utasítással. 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 szubrutinhívást követő utasítás címe. RETI megszakítás ( interrupt ) után hívott szubrutinból való visszatérés utasítása. A visszatérésen kívül felszabadítja a megszakítástiltást.
Ø
Feltételes vezérlésátadás
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él-hely, vagyis az utasítás helyétől számítva -128, vagy +127 bájt területen belül lehet a cél cím. A 8051-nek a következő feltételes ugró-utasításai vannak: A program a megadott címre ugrik, ha teljesül a megadott feltétel JZ
rel
ha az akkumulátor tartalma 0. JNZ
rel
ha az akkumulátor tartalma nem 0.
62
JC
rel
ha a Carry - Flag értéke 1. JNC
rel
JB
bit, rel
ha a Carry - Flag 0. ha a direkt címzett bit 1. JNB
bit, rel
ha a direkt címzett bit 0. JBC
bit, rel
ha a direkt címzett bit 1, majd törli a bitet. CJNE adat1, adat2, rel összehasonlítja a megadott (címzett) két adatot. Akkor következik az ugrás, ha a két tartalom nem egyforma. Amikor az első adat (regiszter tartalom) a kisebb, akkor a CY is 1-be íródik. Ellenkező esetben törlődik. DJNZ mem , rel 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 adott címre az ugrást.
Ø
A FLAG - ket befolyásoló utasítások
A 8051 utasításai közül csak nagyon kevés változtatja a mikrokontroller flag -it. A 4.5. táblázatban foglaltuk össze, hogy az egyes flag -re melyik utasítás 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 mindig beáll a művelet hatására.
Ø
READ-MODIFY-WRITE utasítások
A READ-MODIFY-WRITE utasítások egy port tartalmát kiolvassák, a kívánt értékre változtatják, és azonnal visszaírják a port - tárolóba. A READ-MODIFY-WRITE utasításokhoz mindig egy port címe tartozik. A csoportba tartozó utasítások a 4.6. táblázatban láthatók 7.4. Az utasítások hossza és végrehajtási idejük Az 4.1 - 4.4 táblázatokban az egyes utasítások hosszát és az oszcillátor periódusában megadott végrehajtási idejét adtuk meg. A felhasználó ezek alapján kiszámíthatja a szükséges memóriaterületet és a futás időt.
63
Zalotay Péter: DIGITÁLIS TECHNIKA II
8.
Programfejlesztés
A mikrogép működését meghatározó programot az un. code-, vagy programmemóriába kell tárolni az alkalmazott mikroprocesszor, vagy mikrokontroller - a továbbiakban processzor - típusától függő gépi kódok sorozatával. A program végrehajtásakor a processzor innen olvassa ki az utasításokat, és paramétereket. A programozás célja tehát. · ·
egy olyan kódsorozat létrehozása, amelyet egy mikrogép ( mikroprocesszor bázisú programmemóriájába töltve meghatározza a mikrogép feladat szerinti működését.
·
számítógép
)
8.1. A programfejlesztés lépései A programfejlesztés az alábbiakban tömören ismertetett lépésekből áll. e. A program felép í t ésén ek megtervezése. Ezt segíti a folyamat áb ra megrajzolása. f. A szükséges memóri a- szegmen sek deklarálása g. A programban meghatározása.
használt
változók,
konstansok,
periféria-címek
h. szöveges formában - valamilyen szövegszerkesztő (editor) segítségével - kell megírni a programozási-nyelv " helyesírási " (szintaktikai), és tartalmi (szemantikai) szabályai szerint. Az így megirt szöveg a p rogram forrásn yelvi formája. A számítógépek, mikrogépek alkalmazásának széleskörű elterjedése a különböző p rogramn yelv választékot is bővítette. A programnyelveket gép közeli - (assembly), és a magas szi n t ű nyelvek csoportjába sorolhatjuk. ·
G ép közeli az a programozás, amelynél minden p rogramlép és – programsor - az alkalmazott processzor egy-egy u t así t ása . Mivel minden processzornak saját utasításkészlete van, ezért a programírás is processzorfüggő. Az ilyen programírást nevezzük assemb ly vagy más közelítésben u t así t ás – szerkezet ű programírásnak.
·
A magas szi n t ű programozási nyelvek ( Pascal, C, stb ) rendszerint a nemzetközileg elfogadott mat emat i kai , logi kai műveletek, és különböző ált alán os, a pr o gr amszer kezet et meghat ár o zó u t así t ások segítségével írják le a feladatot. Ezért e nyelveken a programozás független attól a géptől, amelyen a programot futatni akarjuk. A magas szintű nyelven történő programírást mű velet közp on t ú programozásnak is nevezhetjük.
i. A forrásnyelvi programból a különböző ford í t ó programok (assembler, compiller) állítják elő a p rogram t árgykód ú (object) alakját, illetve a programlistát, amelyek már a processzor utasításkódjait is tartalmazzák. (A leírtakból következik, hogy a magas szintű nyelveknél is a fordítóprogram már processzortól függő.)
64.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II j. A tárgykódú programból, vagy programokból (több modul esetében) a szerkeszt ő (linker) program állítja elő a fu t t at h at ó programváltozatot. k. Az így előállított programot kell beírni (letölteni) a programmemóriába. A programmemória lehet fix (ROM, EPROM), illetve irható-olvasható (RAM) kialakítású. A beégetés, vagy letöltés történhet teljes kódú (bináris), vagy tömörített (pl. HEX) alakú fájlból. Ennek megfelelően a programozás utolsó lépése a kívánt formátum-konverzió elvégzése. 8.2. A programfejlesztés eszközei A programfejlesztés leglényegesebb eszköze az ember, mivel a feladatot megvalósító program algoritmusait, felépítését, változók, konstansok meghatározását stb. csak alapos tervező, elemző munkával lehet, és kell elvégezni A programfejlesztés tárgyi eszközei ma kizárólag általános célú számítógépek PC-k, és az ezeken futó fejlesztő-programok segítségével történik. Természetesen e programok csak a technikai háttért adják. A teljesség igénye nélkül az alábbi szoftverek elengedhetetlenül szükségesek: ·
a rajzoló programok (folyamatábra rajzolás),
·
a szövegszerkesztők, editorok (forrásnyelvű állomány írásához),
·
az assemblerek, compiller -ek ( a szöveges állomány fordításához),
·
a linker -ek ( az abszolút tárgykódú állomány szerkesztéséhez),
·
az obj - hex, obj - bin átalakítók (formátum-konverzióhoz),
·
a szimulátorok (a program-szimulációhoz),
·
emulátorok, teszteléshez)
terminál-monitor
programok
(a
valós
idejű
A programfejlesztés módszerei – a sokszor az adottságoktól függően – különbözőek. A PCk elterjedésének kezdetén a fejlesztési lépések egyedi végrehajtása, esetleg un. parancsfájlok (batch) segítségével segítették a hatékonyságot. A számítógépek, a szoftvergyártás rohamos fejlődése hozta az un. integrált fejlesztői környezetek kialakítását. A nagy szoftvergyártó cégek különféle környezeteket (DOS, majd Windows operációs rendszerekben) fejlesztettek. Ezek elsősorban az elterjedt magas szintű nyelvekhez, úgymint a Pascal, C++ stb. készültek. A különböző operációs rendszerekben egymás után jelentek meg az „automatizált” programfejlesztő programcsomagok pl. DELFI, BILDER stb. A 8031/51 mikrokontroller család programfejlesztéséhez a Keil Elektronik cég másfél évtizede készít fejlesztő programokat ( a51.exe, c51.exe, l51.exe, lib51.exe, ohs51.exe), illetve integrál fejlesztő környezetet (UV3). A főiskolai oktatásban is ezeket a fejlesztői szoftvereket alkalmazzuk. Az oktatási feltételeket, és igényeket kielégítő fejlesztő környezet-családot (az XE2 különböző változatait oktatóink irányításával a hallgatók szakdolgozataikban dolgoztak ki. A továbbiakban a legújabb változatú – XE251 elnevezésű – fejlesztői környezet működését, és használatát írjuk le.
8.3. Program-blokkok 65.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II A mikroprocesszoros berendezések programjainak legkisebb egységei az utasítás-kódok, és paramétereik. Nagyobb egységek azok a program-blokkok, utasítás-csoportok, amelyek egy adott jellegű művelet végrehajtásához szükségesek. A következőkben összefoglaljuk az alapvető programblokkokat, és szemléltetjük folyamatábrával, illetve assembly nyelvű példával. ·
Műveleti blokk, .
egy logikailag összetartozó (matematikai, logikai, stb.) utasításcsoport.
; az OP1 és OP2 összeadása MOV ADDC MOV . .
·
A,OP1 A,OP2 ERED,A
művelet
31. ábra
Feltétel nélküli programelágazás
n. utasítás
A következő utasítás beolvasása a programmemória távolabbi címéről történik
n+1. utasítás
; ugrás a folytatásra . MOV LJMP . . FOLYT: MOV
ERED,A FOLYT
DPTR,#NGS
..
32. ábra ·
Feltételes programelágazás
; ha az A=0 ugrás a folytatásra . ADDC A,OP2 JZ FOLYT MOV ERED,A . . FOLYT: MOV DPTR,#NGS
Egy változó (bájtos, bites) aktuális értékétől függ, hogy az új utasítás beolvasása a program történik.
n. művelet
nem
memória következő címéről, feltétel igaz? igen n+1. művelet
·
33. ábra Többirányú programelágazás
A alkalmazásokban gyakori feladat, hogy egy változó értékétől függően különböző műveleteket kell
66.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II végrehajtani. Ilyen esetben a programban többirányú elágazást, programugrást kell beírni. A lehetséges megoldások közül két változatra mutatunk példát. a. Amikor az egyes műveletekhez tartozó változó értékek nem alkotnak sorozatot. MOV A = változó
A =1.ért? Igen
CJNE A,#E1,FO1 JMP MUV1 Nem
A =2.ért? Igen
1.
A,V1
Nem A =3.ért?
FO2: JMP
CJNE A,#E3,FO3 MUV3 . . .
A =n.ért? Igen 3.
CJNE A,#E2,FO2 MUV2
Nem
Igen 2.
FO1: JMP
Nem
Nincs változás folytatás
n. műveletre
FOn: JMP
CJNE A,#En,NV n. művelet NV
MUV1: .
;
1.
.
;
2.
művelet JMP NV MUV1:
művelet
34. ábra
JMP . NV:
67.oldal
NV . ;folytatás
Zalotay Péter: DIGITÁLIS TECHNIKA II
b. A változó értékeinek egy sorozata, (pl. 0, 1, 2, … n) alapján kell a műveleteket kiválasztani. Az eljárás során a változó éppen aktuális értékéhez tartozó művelethez vezérlésátadó (ugró) utasításon keresztül jut el a program. Az LJMP cím utasításokból álló sorozat elött - mivel az használt utasítás hossza három bájt - az elsőhöz viszonyított eltolás (offset) a változó értékének háromszorosa. MOV MOV MOV MUL JMP C_KEZD: LJMP LJMP
A = változó
DPTR,#C_KEZD A,valt B,#3 AB @A+DPTR
1_MUV 2_MUV . . LJMP n_MUV . . FOLYT: .
U = 3*A
U =0
U =3
1. művelet
U =3(n-1)
U =6
2. művelet
3. művelet
n. művelet
folytat
35. ábra
·
Összehasonlítás
. CJNE JMP NEM_E: JC NAGY: . . JMP KISEBB: . . JMP EGYEN: . . FOLYT: . .
V1,V2,NEM_E EGYEN KISEBB
Két bájtos változó relációjának (kisebb, nagyobb, egyenlő) meghatározása többszörös döntéssel végezhető el.
FOLYT FOLYT
V1 = V2 ? V1 < V2 ?
Nagyob
Kisebb
Egyenlő
36. ábra
68.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II ·
Jelváltozás meghatározása
A vezérlési feladatok között sokszor szükséges csak az adott jel valamelyik irányú változásakor kell elindítani egy folyamatot. Most röviden tárgyaljuk a jelváltás detektálásának néhány változatát. A megoldásoknál fontos alapelv, hogy a lehető legrövidebb időn belül határozzuk meg a váltás tényét és irányát. A feltételből adódik, hogy olyan megoldás nem jöhet számításba amikor a program „vár” a változásra. Az automatizálásban alkalmazott szoftverek fontos alapelve a ciklikus működés, valamint az, hogy a ciklus elején mintavételezi és tárolja a bemeneti jelek aktuális értékét. A működésből adódik, hogy egy programciklus ideje határozza meg, hogy mekkora az az idő, amelyen belül történő változást már nem lehet egyértelműen értékelni. A 37. ábrán látható idődiagram mutatja egy jel változását, és a program mintavételezéseit. V
n n+1
k k+1
t
tc ciklusidő 37. ábra
Két mintavételezés között fut le a program egy ciklusa. A ciklus elején történik a változók aktuális értékének beolvasása és tárolása a belső memóriában. A két egymást követő mintavételezésből lehet megállapítani, hogy az előző ciklusban történt-e jelváltozás. A példa szerint az n. ciklusban pozitív irányba, míg a k. ciklusban negatív irányba változik a V jel. Így a következő ciklus elején ( az n+1., ill. a k+1.) észlelhető, hogy volt jelváltozás. Most vizsgáljuk meg, hogyan lehet megállapítani a váltás tényét, és irányát. ·
A pozitív irányú változásnál az n. ciklus elején beolvasott és tárolt érték Ut = 0, és az n+1. ciklusban frissített érték Uf = 1. A pozitív váltást jelző bit B p = U t U f
·
A negatív irányú változásnál a k. ciklus elején beolvasott és tárolt érték Ut = 1, a k+1. ciklusban frissített érték Uf = 0. A negatív váltást jelző bit B n = U t U f
Összefoglalva deklarálni kell a kívánt váltást jelző bitet és ennek értékét a bemenetek frissítésekor kell meghatározni a fenti logikai összefüggések alapján. A jelzőbitek egy ciklusban használhatók jelváltás jelzésére. Minden további ciklusban értékük 0. Azokban az esetekben amikor egy bájt több bitjének változását is fel kívánjuk használni a programban, akkor az alábbiak szerint célszerű eljárni. 1. Meghatározzuk, hogy a Vt tárolt és a Vf frissített bájtok különböznek-e. A K = Vt Å Vf művelet eredményében azok a bitek 1 értékűek, amelyek a két bájban eltérőek, vagyis az adott bemenetekre kapcsol jelek valamelyik irányba változtak. Példaként nézzük a következőt:
69.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II
Vt Vf K
2.
0 1 1
1 1 0
1 0 1
0 0 0
0 0 0
0 1 1
1 1 0
1 0 1
Az eredményből szét kell választani a pozitív, illetve a negatív irányú változást jelző biteket és azokat külön bájtban tárolni ami a következő műveletekkel végezhető el. K p = K Vf illetve Kn = K Vt vagyis a pozitív változást az új érték, míg a negatívat a tárolt a tárolt érték maszkolja. Az előző példát folytatva K Vf Kp
1 1 1
0 1 0
1 0 0
0 0 0
0 0 0
1 1 1
0 1 0
1 0 0
K Vt Kn
1 0 0
0 1 0
1 1 1
0 0 0
0 0 0
1 0 0
0 1 0
1 1 1
Végezetül írjuk meg az egy bájt bitjeinek változását meghatározó frissítő rutin forrását. ; **** deklaráció **** RSEG VALT_BIT
; BITCÍMEZHETŐ MEMÓRIATERÜLET
1 1 1
; az aktuális bemeneti változók tárolt értéke ; pozitív váltásokat jelző bájt ; negatív változásokat jelző bájt
V1 V2
DS DS DS . . BIT BIT
BEM.0 BEM.6
; a V1 változó statikus értéke ; a V2 változó statikus értéke
V1p V2p
BIT BIT
BEMP.0 BEMP.6
; a V1 változó pozitív váltása ; a V2 változó pozitív váltása
V1n V2np
BIT BIT
BEMN.0 BEMN.6
; a V1 változó negatív váltása ; a V2 változó negatív váltása
BEM: BEMP: BEMN:
XSEG AT BEP: KIP:
DS DS
0C000H
1 1
; PERIFÉRIÁK ; bemeneti illesztő ; kimeneti illesztő
; **** szubrutinok **** ; xxx a bemenetek frissítését és a változást jelző rutin xxx FRISS:
MOV DPTR, # BEP MOVX A, @DPTR PUSH ACC
; az aktuális értékek beolvasása a bemeneti perifériáról
XRL MOV
A, BEM B, A
; a változott bitek meghatározása
ANL MOV
A, BEM BEMN, A
; a negatív változás maszkolása, ; tárolása
POP ANL MOV
ACC B, A BEMP, B
; a pozitív változás maszkolása, ; tárolása
70.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II
MOV RET
BEM, A
; az új érték tárolása
8.4. Programszerkezetek A matematikai, logikai feladatok elemi programszerkezetek segítségével írhatók le. Ezek a már megismert program-blokkokból építhetők. Jellegzetes elemi program-szerkezetek: ·
Lineáris (lefutó) program
elemi programblokkok sorozata, amely a program lefutása, (az elemi blokkok végrehatása) után nem tér vissza a program elejére. A program futási ideje alatt csak egyszer hajtódik végre. Pl. inicializálás stb.
·
Ciklikus program
ismétlődő - elemi blokkokból álló – programcsoport (ciklustörzs). A program futási ideje alatt ennek végrehajtása ismétlődik. Pl. a főprogram (a main) stb.
Miután minden szoftver ciklikus szervezésű, ezért ezt részletezzük. Minden programciklus alapvetően a következő elemeket tartalmazza: ·
ciklustörzs
az a programcsoport, amely ismétlődik,
·
ciklus változó
az a változó, amelynek értékének tartománya meghatározza a ciklustörzs ismétlését,
·
értékelés
a ciklusváltozó értékének összehasonlítása ciklusban maradás feltételeivel,
·
döntés
az értékelés eredményétől függő programelágazás.
a
A feladattól függően több változatban szervezhetők programciklusok. A szerkezet függ a ciklusváltozótól, az értékelés cikluson belüli helyétől. Jellegzetes ciklus típusok: tól - ig .. (for to) ciklus Kezdőértékek megadása
; 16 bájt törlése MOV ISM:
. R7,#16 MOV R0,#BEM MOV INC
olyankor használjuk, amikor a ciklusba lépés előtt ismert az ismétlések száma,
@R0,#0 R0
Ciklustörzs Ciklusváltozó módosítása
DJNZ R7,ISM .
nem Cv=érték? igen
71.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II 38. ábra · amíg .. (while) ciklus nem
. ISM:
CJNE @R1,# ’b’,TOV ; ciklustörzs . . . JMP
ISM
amíg a ciklusváltozó adott értéktartományba esik ismételten végrehajtja a ciklustörzset (a ciklusváltozó a törzsben módosul). A ciklus elöl-tesztelt.
Cv=érték? igen Ciklustörzs
39. ábra · majd-amíg...( do-while) ISM:
; ciklustörzs . . . CJNE A,BEM,ISM
.
először végrehajtja a ciklustörzset, majd amíg a ciklusváltozó adott értéktartományba esik ismétli azt ( a ciklusváltozó a törzsben módosul). A ciklus hátul tesztelt.
Ciklustörzs nem Cv=érték? igen
40. ábra A műszaki feladatokat megvalósító programok struktúrája az ismertetett elemi programszerkezetek használatával kialakítható. Egy alkalmazói program a következő alapvető egységekből áll: · inicializálás a változók kezdőértékének, programozható perifériák üzemmódjának, megszakítási rendszer szükség szerinti beállítása, stb., lefutó típusú, ·
főprogram (main) a feladatot ismétlődően végrehajtó program mindig (ciklikus), amely három fő részre bontható:
·
a bemeneti értékek frissítése, tárolása
· a feladat szerinti műveletek megoldása az aktuális bemeneti értékekkel és az új kimeneti változók tárolása, ·
kimenetek frissítése a ciklusban meghatározott kimeneti változókkal.
·
alprogramok (szubrutinok)
A részfeladatokat megoldó programrészek lefutó típusúak. A leírt általános felépítést szemlélteti a folyamatábra. 41. ábra
72.oldal
Start Inicializálás Főprogram Bemenetek frissítése, tárolás Feladatok megoldása, függő változók tárolása Kimenetek frissítése Alprogramok (szubrutinok)
Zalotay Péter: DIGITÁLIS TECHNIKA II 8.5. Példa programfejlesztésre A fejezetben bemutatjuk a program fejlesztésének menetét egy példaprogramon. A programunk assembly nyelvű forrásának neve legyen: ELSOPR.A51. 8.5.1. Mit kell csináljon a program? A mikrogép 0C000H című perifériájához csatlakozó nyolc darab LED csatlakozik. Az áramköri kialakításban az a LED világít, amelyik bit 0 szintű vezérlést kapA program indítása után a legnagyobb helyértékhez tartozó LED világítson, majd ~0,5 s késleltetéssel az eggyel kisebb helyértékű és így tovább. Az LSB hely után ismétlődjön a ciklus. A program leállítása után az utoljára kigyújtott LED világítson. Az újra indítás után innen folytatódjék a „futó fény”. 8.5.2. A programszerkezet meghatározása Első lépésként a fejlesztendő szerkezetét kell meghatároznunk. A program első lépéseként az inicializálást kell végrehajtani, majd az adott műveletek ciklikusan kell ismétlődjenek. A program felépítését szemléletesen a folyamatábra mutatja. feladatok
folyamatábra Start
Inicializálás: Stack beállítása Memória törlés Változók és periféria kezdőérték beállítása
Inicializálás Bemenetek beolvasása
Bemenet frissítés A független változók értékének beolvasása
Indítás / leállítás
Futó fény indítása-leállítása
nem
Ha nincs elindítva akkor kihagyja a léptetést, egyébként léptet Letelt a fél másodperc?
Fut ? igen nem
0,5 s ? igen
Léptetés Ha igen akkor léptetés, egyébként kihagyja. programban meghatározott függő változók kiírása a perifériára.
Kimenetek frissítése
A 0,5 másodperces késleltető rutin
Késleltető szubrutin 42. ábra
73.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II 8.5.3. Deklarálás A feladat ismerete alapján legelőszőr a szükséges függő-, és független változókat célszerű meghatározni. Meg kell állapítani a változók típusát, tárolási helyüket, a memória szegmenseket. Mindezt nevezzük deklarálásnak. A program írása közben rendszerint átmeneti változókat kell még utólag is felvennünk. Ajánlott a relokálható (áthelyezhető) szegmenseket használni, ami a szegmens bővítését és a teljes program új kezdőcímre történő áthelyezését meg könnyíti. A programokban mindig kell helyet foglalni a bemeneti változók, illetve a fő programciklus közben kiszámított függő változók átmeneti tárolására. Példánkban szükséges még változó a forgatás eredményének, illetve a vezérlés bitjeinek tárolására. Mivel kevés változót használunk ezért nem kell külön bitcímezhető és csak bájtos változók tárolása. Mindegyik elfér egy – a bitcímezhető - szegmensben. BEM: ATM: KIM: M_VALT:
DS DS DS DS
1 1 1 1
; helyfoglalás a bemeneti memória részére ; helyfoglalás az átmeneti tároló részére ; helyfoglalás a kimeneti memória részére ; helyfoglalás a munka változó részére
BE_NG KI_NG TART
BIT BIT BIT
BEM.0 BEM.7 ATM.0
; be-nyomógomb a BEM bájt LSB bit -je ; ki-nyomógomb a BEM bájt MSB bit -je ; tartó-bit az ATM bájt LSB bit –je
Az alapvetően szükséges három memória szegmens a program, a stack (zsák) és a változók részére kell. A perifériák illesztése a külső adatmemória része. Mivel ezek címeit a mikrogép hardver kialakításából adott, ezért abszolút címzésű szegmenseket választunk. VALTB
SEGMENT
?STACK PROG
SEGMENT SEGMENT
XSEG AT NGS: LEDS:
DS DS
DATA BITADDRESSABLE ; adatszegmens a bitcímezhető területen IDATA ; adatszegmens a ZSÁK - mem. részére CODE ; program szegmens
0C000H 1 1
; a memóriába ágyazott perifériák ; nyomógomb-sor címe 0C000H ; LED -sor címe 0C001H
8.5.4. Részfeladatok (algoritmusok) A program részfeladatai több módon, eltérő algoritmusok szerint is megírhatók. Ebben a feladatban a memóriatörlés, illetve a késleltetés ciklusos megoldását alkalmazzuk. Mivel ismerjük a ciklusismétlés számát, ezért a tól - ig (for to) ciklust választjuk. ·
Memória törlés
A változók kezdőértékének a 0 –t választjuk. A tárolásra használt memóriát az első változó címétől (V1) az utolsó változó címéig (Vn) kell felülírni 0-val. Szükséges lokális változó a memória mutató (pm). A ciklusban a mutatót a V1 – től egyesével a Vn –ig változtatjuk. A ciklus akkor fejeződik be, amikor az utolsó helyet is felülírta. A végérték ellenőrzéséhez a CJNE Rn, #K, rel utasítást használhatjuk. Ebben az esetben a ciklusváltozó módosítása tetszőleges érték lehet.
74.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II
MOV R0,#VALTB ; ciklus-törzs ISM: MOV @R0,#0 INC R0 ; tesztelés
kezd
; első bájt címének megadása
; a címzett bájtba 0 írása ; következő cím
CJNE R0,#?STACK,ISM
Kezdő értékek beállítása: pm = V1
; a végellenőrzés
A következő memória bájt =0 pm = pm + 1 nem
pm > Vn ? igen
43. ábra vége kezd
·
szoftver késleltetés
Külső ciklus kezdőértéke Ido1
A szoftveres késleltetés azon alapul, hogy a processzor működését stabilizált órajel ütemezi és ezért ugyanazon utasítás végrehajtási ideje bármelyik programrészben azonos.
Belső ciklus kezdőértéke Ido2
Az eljárás során egy N számértéket ciklikusan 1-el csökkentünk 0-ra. Minden egyes csökkentés után ellenőrizzük, hogy a maradék 0 -e. A leírt műveletsor te ideig tart. A T idejű késleltetéshez N ~ T/ te .
Kiegészítő műv. Ido2 = Ido2 - 1 nem
Ido2 = 0 ? igen Ido1 = Ido1 - 1 nem
Ido1 = 0 ?
A mikrokontroller család DJNZ Rn, rel utasítása a ciklusszervezéshez jól alkalmazható. Az utasítás végrehajtási ideje 2 gépi ciklus, vagyis 24 To ( To az órajel periódusideje). Tipikus órajel frekvencia a 12 MHz, amelynél te = 2 ms. Mivel az utasítás bájtra vonatkozik, ezért N maximálisan 256 lehet. Amennyiben a ciklustörzsben csak a változót 0-ig csökkentjük, akkor egy ciklussal T ~ 512 ms Nagyobb késleltetést a ciklustörzs hosszának növelésével (kiegészítő műveletekkel), vagy egymásba ágyazott ciklusokkal érhetünk el.
igen
44.vége ábra A példánknál mindkét megoldást alkalmazzuk. A belső ciklust kiegészítő műveletekkel bővítjük. A leghosszabb utasítás a szorzás (MUL AB).
75.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II A belső ciklustörzs így 10, míg a külső ciklustörzs csak 3 gépi ciklus időtartamú. A szükséges késleltetés, valamint a mikrokontroller órajelének ismeretében számolható ki az egyes ciklusok ismétlési számai. Nagyon fontos, hogy a szoftveres késleltetést időtartama alatt a program nincs kapcsolatban a környezettel. Vezérléshez, egyéb irányítási feladatokhoz készített programokban nem szabad alkalmazni!! Ilyen alkalmazásokban a meg szakításos késleltetést kell felhasználni. ; egymásba ágyazott ciklusokkal, az R7 és R6 ciklusváltozók KESL: KES1: KES2:
MOV MOV MUL MUL DJNZ DJNZ RET
R7,#IDO1 R6,#IDO2 AB AB R6,KES2 R7,KES1
IDO1 IDO2
EQU EQU
0C0H 0FFH
; kezdőértékek beállítása ; a ciklusidő növeléséhez a leghosszabb ; utasítások beiktatása ; belső ciklus ; külső ciklus ; visszatérés a főprogramba ; a külső ciklus ismétlési száma ; a belső ciklus ismétlési száma
8.5.5. Forrásállomány megírása A programfejlesztés következő lépése a program szöveges forrásállományának megírása. Az állományt csak text formátumú fájlba kell létrehozni. A különböző fejlesztői környezetekben ilyen editorokat alkalmaznak. Az alábbiak a program teljes assembly nyelvű forrásállománya. ;************************************************************ ;* BMF KVK Automatika Intézet * ;* Elektronika Szakcsoport * ;************************************************************ ;* Főprogram: Első program * ;* Változat: V1.0 * ;* Dátum: 2003.07.20 * ;* Készítette: XY * ;************************************************************ ;* A modul leírása: * ;* Az MK_GY mikrokontrolleres gyakorlón lévő * ;* LED -ek és nyomgombok használata futó-fény * ;* vezérlésére * ;************************************************************ NAME
Elsoprog
; a program modul neve
;xxxxxxx DEKLARÁCIÓK xxxxxxx ;**** Konstansok deklarációja ***** IDO1 IDO2
EQU EQU
0C0H 0FFH
; a külső ciklus ismétlési száma ; a belső ciklus ismétlési száma
76.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II ;**** SZEGMENSEK DEKLARÁLÁSA ***** ;++++ Relokálható szegmensek ++++ VALTB
SEGMENT
?STACK PROG
SEGMENT SEGMENT
DATA BITADDRESSABLE ; adatszegmens a bitcímezhető területen lévő ; változóknak IDATA ; adatszegmens a ZSÁK - mem. részére CODE ; program szegmens
;++++ Abszolút címzésű szegmensek ++++ XSEG AT NGS: LEDS:
DS DS
0C000H 1 1
; a memóriába ágyazott perifériák ; a külső memória-területen ; nyomógomb-sor címe 0C000H ; LED -sor címe 0C001H
;++++ Bit-címezhető változók szegmense ++++ RSEG VALTB BEM: ATM: KIM: M_VALT:
DS DS DS DS DS
2 1 1 1 1
; helyfoglalás 2 bájt (példaként) ; helyfoglalás a bemeneti memória részére ; helyfoglalás az átmeneti tároló részére ; helyfoglalás a kimeneti memória részére ; helyfoglalás a munka változó részére
; a bájtok egyes bitjeihez szimbólum rendelése BE_NG KI_NG TART
BIT BIT BIT
BEM.0 BEM.7 ATM.0
; be-nyomógomb a BEM bájt LSB bit -je ; ki-nyomógomb a BEM bájt MSB bit -je ; tartó-bit az ATM bájt LSB bit –je
;++++ A zsák (stack) szegmense ++++ RSEG ?STACK DS 10H ;++++ A program szegmense ++++ RSEG PROG LJMP INIT DS 10H
; ugrás az inicializálásra ; megszakítás-ugrótáblázatnak helyfoglalás
;xxxxxxx INICIALIZÁLÁS xxxxxxx INIT:
MOV
SP,#?STACK-1
; az SP beállítása
;.... memória-nullázó for- ciklus ... ; ciklus-jellemzők megadása MOV
R0,#VALTB
; első bájt címének megadása
@R0,#0
; a címzett bájtba 0 írása
; ciklus-törzs ISM: MOV
77.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II INC
R0
; következő cím
; tesztelés CJNE R0,#?STACK,ISM
; a végellenőrzés
; kezdő-értékek beállítása MOV
M_VALT,#80H
MOV DPTR,#LEDS MOV A,#0FFH MOVX @DPTR,A
; a munka változó MSB -bitje 1 ; a LED -sor sötétre vezérlése
;xxxxxxx FŐPROGRAM xxxxxxx FOPR: ;.... BEOLVAS .... MOV MOVX CPL MOV
DPTR,#NGS A,@DPTR A BEM,A
; a nyomógombok aktuális értékének ; beolvasása a BEM memóriába
;.... VEZÉRLÉS .... MOV ORL ANL MOV
C,BE_NG C,TART C,/KI_NG TART,C
; a TART -bit vezérlése a _____ ; TART = (BE_NG+TART)*KI_NG ; logikai függvény szerint;(öntartás)
TART,VEGE
; ha a TART nem 1, akkor áll a világító LED
;.... DÖNTÉS .... JNB
;.... FORGATÁS .... MOV RL MOV
A,M_VALT A M_VALT,A
; TART=1 esetén a munka- változó tartalmának ; forgatása balra
;.... KIIRATÁS .... MOV MOV CPL MOVX
DPTR,#LEDS A,M_VALT A @DPTR,A
; az M_VALT tartalmának kijelzése a LED -soron
;.... KÉSLELTETÉS .... CALL KESL VEGE:
JMP
; a forgatás ismétlésének késleltetése
FOPR
;xxxxxxx ALPROGRAMOK (szubrutinok) xxxxxxx ;.... Szoftver-késleltető rutin .... ; egymásba ágyazott ciklusokkal, az R7 és R6 ciklusváltozók
78.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II
KESL: KES1: KES2:
MOV MOV MUL MUL DJNZ DJNZ RET
R7,#IDO1 R6,#IDO2 AB AB R6,KES2 R7,KES1
; kezdőértékek beállítása ; a ciklusidő növeléséhez a leghosszabb ; utasítások beiktatása ; belső ciklus ; külső ciklus ; visszatérés a főprogramba
END
8.6. A programtesztelés A programtesztelés célja a fejlesztett program működésének ellenőrzése. Az ellenőrzés során dönthetjük el, hogy helyesen értelmeztük-e a feladatot. Figyelembe vettünk-e minden feltételt. A feladatnak megfelelő algoritmusok alapján írtuk-e meg a programot. Mindezek általában a program szimulálásával már eldönthetők.A korszerű fejlesztői környezetek mindegyikében mód van a szimulációs ellenörzésre. A program működésének lényeges eleme az, hogy megfelelő-e a programfutás ideje. Az egyes részprogramok időzítése megfelelő-e? Mindez csak a program valós környezetben történő működtetésével állapítható meg. Az ellenőrzés e formáját nevezzűk valós idejű tesztelésnek. 8.6.1. A program szimulálása A PC-n futó szimulátoroban a fejlesztett programot ellenőrzött módon lehet futtatni. 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 tudunk 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). Egy szimulációs programban rendszerint lehetőség van az assembly nyelvű forrásnyelvi program írására, és a megirt program futtatására, szimulálására. Ennek segítségével rövidebb programok, szubrutinok megírása és ellenőrzése is elvégezhető. A szimulációs programcsomagokban rendsterint van disassemble, amelyr segítségével módunk van közvetlen gépi kódú programok ( EPROM tartalom ) visszafejtésére, program elemzésére. Intel Hex, illetve bináris formátumú programok beolvasását, illetve fájlba írását is támogatják a szimulátorok.
79.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II 8.6.2. A program valós idejű tesztelése A PC-ben futó terminál-program, és a mikrogépben futó monitor-program együttműködése biztosítja azt, hogy a PC klaviatúrájáról vezérelni lehet a mikrogépben futó programot, illetve innen használható a képernyő ASCII karakteres állományok (szövegek, kvázigrafikus stb. ) megjelenítésére. A két gép közötti kommunikáció az RS232 szabvány szerinti soros vonalon bonyolódik. A terminálprogram – az indítását követően – felváltva figyeli a klaviatúrát, illetve a soros vonalat. A klaviatúrán leütött gomb scan-kódját a soros vonalra továbbítja. A sor vonalról érkező kódokat pedig a képernyőn jeleníti meg. Az inicializálást követően a monitorprogram csak a soros vonalat figyeli. Az innen érkező egy karakteres felhasználói parancs észlelése után hajtja végre a parancshoz tartozó műveletsort, és küldi vissza válaszokat ugyancsak a soros vonalon. A 10. fejezetben - a gyakorlatokon is használt - XE251 elnevezésű környezetben történő ellenörzését részletesen tárgyaljuk.. 8.7. Megszakítás (interrupt) kiszolgálásának programozása Bár az előző mintapéldában nem kellett megszakítást programozni, mégis szükséges itt tárgyalni. A megszakítás programozása is a programfejlesztés rész. Az 5.1.6. fejezetben tárgyaltuk a 8031/51 típusú mikrokontroller család megszakítás rendszerének felépítését, működését. A család alapeleme öt megszakítás forrás kiszolgálására képes. A további kontrollerek megszakítás száma különböző, de mindegyik tartalmazza az alapforrásokat, mégpedig változatlan címmel. A család elemeinél alapvetően a következő két típusú megszakítás forrást találunk: · ·
a chip -be integrált periféria pl. a T0, T1, UART stb. külső forrás fogadása pl. INT0, INT1.
A két eltérő típus alkalmazásakor már az inicializálásnál különbözőképen kell eljárnunk. A chip –be integrált változatoknál az inicializálásnál először kell beállítani az adott periféria üzemmódját, s csak ezután kell – az inicializálás utolsó utasításaival – kiválasztani a forrást és engedélyezni az adott megszakítás kiszolgálást. A külső megszakítás forrás kiszolgálásánál – az engedélyezés előtt – a megszakítás kérő jel illesztését kell meghatározni. A belső megszakítás kérő bit vagy a jel adott szintjénél (statikus), vagy a jel valamelyik élénél (dinamikus) íródik be. A beállítást az inicializálásban kell elvégezni. A programírás kezdetekor szükséges beírni a használt megszakítás ugrócímét a programmemória első lapjának megfelelő helyére. A fejlesztői környezetek többsége, megfelelő beállítás után ezt automatikusan elvégzi. A továbbiakban a T0 programozható időzítő/számláló megszakításának használatán keresztül ismertetjük a megszakítások programozásának alapjait. A különböző forrásokat kiszolgáló rutinok természetesen feladatfüggők, és azokban kevés a közös vonás. A feladat egy hétszegmensű számkijelző tartalmának frissítése. A frissítési idő 20 ms kell legyen. A megszakításos vezérlés biztosítja a program futásától független állandó frissítést.
80.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II A feladatot a T0 számláló astabil üzemmódjával oldjuk meg. Mind ismeretes ez az üzemmód maximálisa Tm = 256*12/fo – ahol Tm a megszakítási időköz, és fo az oszcillátor frekvenciája - időközönként kérhet meg szakítást. fo = 12 MHz esetén Tm = 256 µs. A 20 ms ismétlődési idő jelzését a megszakítás rutinban állíthatjuk elő. A feladat megoldásának lépései a következők: 1. A T0 megszakítás címére beírni a rutinra történő ugrást. 000BH
LJMP
T0_M
; ugrás a megszakítás rutinra
2. A szükséges változók deklarálása I_MOD: JELZO: I_bit
DS DS BIT
1 1 ATM.0
; az időzítés - a számlálás - helye ; tároló a jelző biteknek ; a 20 ms leteltét jelző bit
3. A T0 számláló modulusának kiszámítása A megszakítás idejét célszerű egész értékre választani. Mivel a rutinban csak egész számú számlálás végezhető a pontosságot ez biztosítja. A feladatban fo = 12 MHz . Válasszuk a megszakítási időt 200 µs –ra. A T0-ban a számlálás kezdő értéke:
Z k = 256 -
f o × Tm 12 × 10 6 × 200 × 10 -6 = 256 = 56 12 12
4. A számláló üzemmódjának beállítása az inicializálásban ANL ORL MOV SETB
TMOD,#0F0H TMOD,#2 TH0,#56 TR0
; T0 2. üzemmódjának beállítása ; a Zk kezdőszám beírása
5. A T0 és az általános megszakítás engedélyezése SETB SETB
ET0 EA
; megszakítás engedélyezése
6. A megszakítás rutin megírása A 200 µs –ként bekövetkező megszakításnál minden századik ismétlődik 20 ms –ként. Tehát, ha a számlálást 0 – ról kezdjük akkor a számlálás modulusa (T_MOD) 100 kell legyen. A deklarálásba be kell iktatni: T_MOD
EQU
100
A megszakítás rutint a használt regiszterek mentésével kell kezdeni. A megoldásunkban elégséges a státus regiszter (PSW) mentése, mert csak döntést hajtunk végre. T0_M:
T0_MV:
PUSH INC MOV CJNE SETB MOV POP RETI
PSW I_MOD A,I_MOD A,#T_MOD,T0_MV I_BIT I_MOD,#0 PSW
; a használt regiszterek mentése ; a számláló értékének növelése ; elérte a végértéket ? ; igen ; regiszterek visszaolvasása
81.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II
7. Az időzítés figyelése a főprogramban
A főprogram előző műveletei
A számkijelző frissítését csak akkor kell elvégezni, amikor az I_BIT =1, majd ezt a bitet törölni is kell, hogy csak újabb 20 ms múlva ismétlődjék a művelet. JNB I_bit, FO_VEG váltás ?
I_bit = 1?
CLR I_bit
I_bit=0 Kijelző frissítése
MOV DPTR,#KIJ_VAL kiválasztás MOV A,K_MUT MOVX @DPTR,A .
; kijelző
; I_bit törlése ; kijelző
.
A főprogram további műveletei
. FO_VEG: CALL JMP FOPR
82.oldal
KIIR
; folytatás
Zalotay Péter: DIGITÁLIS TECHNIKA II
9.
Programfejlesztés az XE251 környezetben.
Az Automatika Intézet oktatói, hallgatói az 1980-as évek végétől kezdve több változatát fejlesztették az XE2 elnevezésű fejlesztői környezetnek. Elsők között az I8085, és a Z80 mikroprocesszorokkal megépített gyakorló berendezésekhez készült. A következő generáció már a I8031/51 mikrokontroller családhoz alkalmaztuk. A mikrokontrollerekhez a programfejlesztés Keil Elektronik GmbH szoftvereivel végezte. A fejezetben a legújabb fejlesztési változat használatával ismerkedünk meg. A fejlesztői környezet már Windows operációs rendszerben működik. Először röviden ismertetjük a rendszer felépítését, jellemzőit. Utána a egy program fejlesztésének lépéseit követjük végig. A fejlesztői környezet menürendszerű kialakítású, és támogatja a programfejlesztés technikai részét a forrásnyelvű állomány írásától a valósidejű programellenőrzésig. Az ismertetésre kerülő XE251-környezetben assembly, forrásnyelvű programok fejleszthetőek. Az XE2 környezetet is a fejlesztés menetének sorrendjében ismertetjük. A munka az XE251.EXE program indításával történik, amely után a 45. ábra szerinti képet kapjuk, amely a mikrokontroller család egy Atmel gyártmányú kontroller alapú oktatási gyakorló készülék.
45. ábra Mintegy öt másodperc elteltével jelenik meg a 46. ábrán látható fejlesztői környezet. A megjelenő felületen öt, különböző funkciójú terület van.
83.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II 9.1. A forrásállomány írása, módosítása Első lépésként a menüket tárgyaljuk, mivel ezek használatával írhatjuk, módosíthatjuk a program szöveges forrásnyelvi állományát.
Menük
Vezérlések
Munkafelület
Választás
46. ábra Állapotjelzések ·
A fejlécen lévő Menük között van a munkaállomány megnyitására, mentésére szolgáló File almenü. A munkafelületre kiválasztott forrásállomány módosítható az Edit almenü kiválasztásával. A Tools néhány szolgáltatása használható a fejlesztés során. Az Options –ban választhatók a szövegszerkesztés módszerei. A Help a programfejlesztéshez nyújt segítséget.
·
A Munkafelületen történik a kiválasztott állomány szöveg írása, módosítása.
·
A középen található Választás fülekkel választhatók ki a munkafelületen megjeleníthető állományok.
·
Az Állapotjelzések felületre íródnak ki a fordítás, szerkesztés, konverzió jelzései.
·
A jobb oldali szegélyen lévő Vezérlések nyomógombjaival indíthatók a programfejlesztés lépései, a fordítás (assembler), a szerkesztés (linker), a konverzió (hex. generálás) és a program szimulálás folyamatai.
Az egyes menük megnyitását, vezérléseket elsősorban egérrel célszerű végrehajtani. Egyébként a Windows -ban használt további módszerek is alkalmazhatók.
84.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II 9.1.1. File (fájlkezelés) menü A menü a különböző fájlok (állományok) kiválasztását, megnyitását, mentését szolgálja. A menü megnyíló ablakában - 47. ábra – láthatók a választási lehetőségek. ·
A New Template (új sablon) megnyitásával egy új munkafájlt hozhatunk létre. A létrehozandó fájl előre elkészített sablon alapján készül, így egy kezdeti általános (és hasznos) tartalommal rendelkezik, mely programvázként szolgál.
·
Az Open ponttal választható ki és jeleníthető meg a munkafelületen az állomány, amellyel dolgozni (írni, módosítani) fogunk
47. ábra ·
A Close aktiválása zárja az állományt.
·
A Recent Files megnyitásakor az öt legutoljára megnyitott állomány közül választhatunk.
·
A Save, ill. a Save As… menüpontok szolgálnak a nyitott fájl mentésére.
·
A New Template aktiválásakor a munkaterületre íródik egy forrásnyelvi sablon.
·
Az Exit aktiválásával léphetünk ki.
A 48. ábrán látható a munkafelületen megjelenő sablon eleje. Ez az assembly nyelvű forrásállomány minden fontos részére – a fejléctől a megszakítás rutinig– mutat példát. Új program fejlesztésekor ajánlott ennek használata. Amikor egy tetszőleges állományt nyitunk meg az is a Source file fül által megjelenített munkafelületen olvasható, szerkeszthető.
48. ábra
85.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II 9.1.2. Az Edit (szövegszerkesztő) menü A menü megjelenítésekor a49. ábrán látható további választási lehetőségeink lesznek.
A menüválaszték magyarázatra nem szorul. Minden korszerű szövegszerkesztőben használják ezeket a műveleteket.
49. ábra 9.1.3. A Tools (eszközök) menü A programfejlesztés során az 50. ábrán felsorolt eszközök használhatók. · · ·
A Clean (tisztít) menüpontokkal a könyvtárból törölhetők a származtatott állományok és csak a forrásfájl marad. A Delay Calculator egy szoftver késleltető ciklust állít elő. A Firmware Menager – ben a mikrokontrolleres gyakorló programjának frissítése végezhető 50. ábra 9.1.4. Az Options menü
A menüben a szövegszerkesztés módozatai választhatók ki. A 51. ábrán látható középső mezőben jelölhetők ki az érvényes opciók. Ezek közül kevésbé ismert a Syntax Highlight, amely kiválasztásával az azonos típusú szövegrészek különböző színűek. A magyarázó szövegek (comment) zöld, az állomány direktívái kék, míg a programutasítások fekete színnel láthatók. 51. ábra
86.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II 9.1.5. Példa a forrásállomány megírására. A fejezetben az ELSOPR.A51 minta program alapján mutatjuk be a fejlesztés menetét. Az 52.a. ábra mutatja az OPEN menüpont megnyitása után megjelenő könyvtárállományt. Az ELSOPR könyvtárban van a keresett forrásfájl.
a. A b. ábrán látható az ELSOPR.A51 forrásállomány a könyvtáron belül.
b. 52. ábra A fájl megnyitását követően – a Source File munkaterületen – látható, és írható, módosítható az állomány. (53.ábra) Amennyiben az Options menüben a Syntax Highlight van bejelölve, akkor a megjelenített szöveg színezett. A színezés előnye, hogy már az írás közben is bizonyos hibákat jelez. Az a. ábra 29. illetve a 31. sorában egy-egy elírás történt. A 29. sorban a SEGMENT direktíva első betűje lemaradt, az EGMENT feketével jelenik meg. A 31. sorban a magyarázat előtti ; maradt el. Ezért itt is fekete a szöveg. ( A b. ábrán kinagyított kép látható. A c. ábra már a kijavított szöveget mutatja.
87.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II
a.
b.
c.
53. ábra A program szöveges forrásállománya az általános szövegszerkesztési eljárásokkal írható, módosítható. 9.2. A futtatható állomány létrehozása A 8.1. fejezetben tárgyaltuk részletesen a programfejlesztés lépéseit. Az előzőben a fejlesztési környezet szolgáltatást mutattuk be a szöveges forrásfájl megírásához. A forrásállományból a fordítás (assembler), a szerkesztés (linker), és a fájlkonverzió (hex generálás) után kapjuk a mikrogépben futtatható programot. Az XE2 fejlesztői környezetben a Vezérlések jelölésű gombok segítségével indíthatjuk a felsorolt lépéseket. 9.2.1. Fordítás (assembler) A forrásfájl helyességének első feltétele, hogy nincs benne szintaktikai, illetve szemantikai hiba, amit fordítás után dönthetjük el. A fordítás hozza létre a tárgykódú (*.obj), a lista (*.lst), valamint a hiba (*.err) állományokat. Amennyiben a fordításkor volt hiba a forrásanyagban, azt három helyen is rögzíti az XE251 fejlesztői környezet. A mintaprogram szöveges részébe több hibát is beírtunk. Az 54. ábrán mutatjuk be, hogyan állapíthatók meg Az a. ábrán a forrásszöveget (ELSOPR.A51) látjuk. A hibás sorokat kék
88.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II kifestéssel láthatjuk. Az állapotjelző mezőben olvasható is, hogy van e hiba ill. megjegyzés. Itt „ASSEMBLY COMPLETE 0 WARNING(S), 4 ERROR(S)” A b. ábra a fordításkor létrehozott lista (ELSOPR.LST) állományt mutatja. Itt a hibás sor alatt kék kifestés és alatta barna, a hiba mikéntjére utaló hibakód, és szöveg olvasható. A c. ábra a hibafájlt (ELSOPR.ERR) mutatja. Itt csak a hibákat sorolja fel.
a.
b.
c.
54. ábra 89.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II A hiba megállapítása és kijavítása után szabad csak továbblépni a szerkesztésbe. Mindaddig ismételni kell a javítást és a fordítást, amíg a „0 WARNING(S), 0 ERROR(S)” szöveget nem kapjuk. A fordításnál még nem adjuk meg azt, hogy a memóriában milyen fizikai címen kezdődik a program. A fordításnál minden program modul 0 címtől indul. A lista fájl jelzi is ahol a cím még ismeretlen. A következő sorok a listafájl egy részletét mutatják.
Ebben a példa részben négy kétbájtos utasítás – a forrás 114. – 117. soraiba írt fordításának eredménye látható. Mind a négy sorban látunk F betűt. Ez jelzi, hogy a fordított tartalom még nem teljes. A forrásfájl 114. sorában a MOV C,BE_NG utasítás van. A sorok számozásától balra a fordítás eredménye látható. Az első adat 002F az utasítás helyének relatív címe. A következő négy karakterből az A2 a MOV C, .. utasítás kódja, amit a forrás (BE_NG) címe követ. Itt ez még 00, mivel ez még ismeretlen, amit az F jelez. A példa alapján a lista fájl felépítését is nyomon követhetjük. Az állomány tartalmazza a szöveges forrást, valamint a fordítási kódokat. 9.2.2. Szerkesztés (linker) A program végleges címre történő szerkesztése a Linker programmal történik. A program indítása előtt kell megadni az egyes szegmensek fizikai címeit. Az itt ismertetett fejlesztői környezetben az indulási paramétereket állandónak vettük és az 55. ábra bekeretezett részében olvashatók. A program mindig a a programmemória 4000H fizikai címén kezdődik, mivel a laboratóriumi gyakorló készülékek ezt igénylik. Ez a megkötés csak erre a változatra érvényes.
55. ábra
90.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II A szerkesztés után jön létre a memória térkép (*.M51), amelynek egy részletét mutatja a 55. ábra. Innen többek között leolvasható minden programszegmens fizikai kezdőcíme, mérete. Továbbá számtalan olyan adatot is tartalmaz, amelyet a programtesztelésnél használhatunk. 9.2.3. Fájl konverzió (HEX generálás) A programfejlesztés eszköze a PC. A programot viszont egy 8051 családba tartozó mikrokontrollerre írtuk. A linkelt abszolút object állomány csak az adott mikrogépben futtatható. A programfejlesztés következő lépése tehát a letölthető formátumra történő konverzió. Erre szolgál az Ohs51.exe fordító. A konverzió eredménye a *.HEX állomány, amely az 56. ábrán látható. Az Intel Hex formátumról a Függelékben találhatnak részletes leírást. 56. ábra 9.3. A program ellenőrzése Az XE251 fejlesztői környezet a programellenőrzés mindkét módját támogatja. A fejezetben tömören ismertetjük a programtesztelés két megoldásához használt programok működését, és használatát. A fejleszett programok szimulációjához a Simula5x programot használjuk. A valósidejű teszteléshez az elmult években fejlesztett mikrokontrolleres gyakorló monitor, és terminál progjamait tárgyaljuk. A mintaprogramunk ellenőrzését mutatjuk itt be. Az ellenőrző programok kezelésének részletes leírása a Függelékben van. 9.3.1. A program szimulációja A vezérlések nyomógombjaiból a Simulator (57.a.ábra) aktíválása indítja el a programszimulációt. A Jump Table bejelőlésekor a megszakítások ugrótábláját is betölti a szimulátorba. Az utóbbi csak akkor szükséges amikor megszakításos programot ellenőrzünk. A program elindítása után az 57.b. ábra szerinti képet látjuk képernyőn:
91.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II
a. b. 57. ábra Az ALT+Enter nyomógombkombináció teljes képernyős megjelenítést eredményez. Az 58.a. ábrán a programszámláló (PC) 0000 értékétől kezdődő programrészlet listája látható. Első sorban a programra ugrás, míg nyolc bájt távolságonként az egyes megszakítás ugrások láthatók.
a. b. 58. ábra A b. ábra a program kezdetének listáját mutatja. Ekkor a PC = 4000H. Erre a helyre két módon juthatunk az indító képből. Egyikváltozat, amikor a PC tartalmát írjuk át. A másik eset, ha az aktuális ugró utasítás céljához akarunk jutni. Ilyenkor a Step (F7) aktiválására végrehajtódik az ugrás. A továbbiakban nézzük meg az egyes részletek feladatait.
92.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II ·
Menüválasztás.
Az egyes menük egérrel, vagy az ALT+ piros betű megnyomásával nyitható. ·
Regiszterek
Az az aktuális bank (R0…R7) regisztereinekk, a processzor-regisztereinek és a Flags egyes bitjeinek értéke látható. Az utóbbiak ha 1 értékűek akkor elnevezésük (pl. a Cy) jelenik meg. A regiszterben tárolt értékek felülírhatók. ·
Memóriák
A mikrogép belső – IDATA, SFR - és külső - XDATA, CODE - memóriáinak tartalma jeleníthető meg 3x16 bájtos egységekben. A kiválasztás a megfelő szövegre kattintással történik. A tartalom felülírható. ·
Munkaterület
A monitoron a letöltött program szöveges forrását, másrészt pedig az állomány fizikai tartalmát láthatjuk. Láthatók programutasítások címei, utasításkódjai, valamint operanduszai. Az egy utasításhoz tartozó gépi kódok ugyanazon sorban vannak. Innen is megállapítható az, hogy egy utasítás hány bájtos. Az itt látható adatok nem írhatók felül. ·
Portok A képernyő bal oldalán – a kiválasztott kontroller – Portjainak aktuális értéke látható binárisan. Minden bit módosítható. Természetesen a programban másodlagos funkcióban használt portok bitjeinek módosítása futási hibát okozhat!
93.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II ·
Stack memória
A mezőben az SP utolsó három értéke és a stackmemória tartalma látható. Az OP-2 és az OP-1 azta két utolsó progamcímet mutatja ahonnan hívás történt
·
Parancsok
A legalsó sor mutatja a parancsok billentyű kiosztását. A szimulációhoz az F2, F4, F7, F8, F9 funkcióbillentyűk használjuk. A funkció egérrel is működtethető ha a piros karakterre kattintunk. 9.3.2. A szimuláció végrehajtása Az eddigiekben is mintaként mutatott ELSOPR.A51 forrású program egy részének szimulálását – a teljesség igénye nélkül - mutatjuk be. A szimulálás készsége csak konkrét példák gykorlásával sajátítható el. Az előző részben (58.ábra és a magyarázat) már leírtuk, hogyan jutunk el a program kezdetéig. Innen folytatjuk. A példa szimuláció elött összefoglaljuk a legfontosabb paransokat. A szimuláció egyik lehetősége a lépésenkénti (Step) műküdés-ellenörzés, amely az F7 funkció billentyűvel végezhető. Ilyenkor csak egy utasítás hajtódik végre. A következő léptetés elött megnézhetjük a végrehajtott utasítás eredményét. A szubrutinokat elég egyszer ellenőrizni. Azokban az esetekben, amikor újból egy ellenőrzött rutinhoz érkezünk az F8 funkcióbillentyűvel (Proc) a rutin lefuttatható a visszatérésig. A program tetszőleges helyéig történő futtatás az un. töréspont (breakpoint) beiktatása teszi lehetővé. A program a beiktatott töréspontig az F9 (run) billentyűvel futtatható. Végezzük el a program inicializálásának egy részét. Az 58.b. ábra mutatott állapotban az F7 megnyomásával jutunk az inicializálás kezdetéhez (58. ábra).
59. ábra
94.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II Az ábrán látható kék sáv jelzi a következő végrehajtandó utasítást, amely itt a Stackpointer beállítása. A következő léptetéssel (F7) jutunk az 60.ábrán látható állapotba. A jobb felső sarokban látható az előző művelet eredménye: az SP tartalma 27H. ( Megjegyzés: a szimulációs program minden számot hexadecimális alakban ír, ezért nincs utána a H jelzés.)
60. ábra A következő műveletsor lesz a változóknak lefoglalt memóriaterület törlése. A szimulátor indításakor minden memóriaterületen, így az IDATA területen is 0 érték van (61.ábra)..
61. ábra A törlés eredményének ellenőrzéséhez szükséges a belső memóriaterületet 0-tól eltérő értékkel feltölteni. A felülíráshoz a cursort az első memóriacellára kell állítani, majd hexadecimális karaktereket kell beírni. A példánkban (62. ábra) FF -t írtunk, ami egy üres EPROM tartalom is lehet.
62. ábra A következő léptetéssel a pointernek használt R0-ba beíródik a törlés kezdetének (VALTB) a címe. A 63. ábra bal felső sarkában látható a 20 H érték. Itt kezdődik a bitcímezhető memóriaszegmens.
95.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II
63. ábra A művelet után a for ciklus törzsébe jutottunk, amely két utasítás. Ezek végrehajtása után ( kétszeri léptetés) jutunk a 64. ábrán szerinti állapotba. Itt látható a ciklustörzs végrehajtásának az eredménye. A belső memória 20 H című memória bájtban 00 íródott, és az R0 új értéke 21 H. Az R0 az IDATA terület legelső bájtja, mivel az aktuális regiszterbank a 0 – ás.
64. ábra Amikor a ciklustörzs működését egyszer leellenőriztük és hibátlan az eredmény, akkor a teljes for ciklust egyszerre lefuttathatjuk. Ilyenkor a ciklus után beállítunk egy töréspontot (breakpoint). A töréspont beállítását ismerhetjük meg a 65.a. ábra alapján. A töréspontot a 4013 H című programsorba kívánjuk beírni. Először az egérrel kattintunk a sor elé, ekkor megjelenik a kijelölést (Merker) jelentő piros M. betű. Utána megnyitjuk a Break menüt, kiválasztjuk a Set breakpoint sort és aktiváljuk. A leírt műveletek végrehajtása után beiktatott töréspont helyét piros sáv (b.ábra) jelzi.
96.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II
a.
b. 65. ábra Az program a futtatás F9 (run) után a kijelölt törésponton áll meg. A 66. ábrán követhető a törlés eredménye.
66. ábra A program áll, a kék sáv a 4013 H címen van. Az R0 regiszter a 28 H címre, a Stack kezdetére mutat. A belső memória 20 H – 27 H című tartomány törölt.
97.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II A programunk perifériái LED -ek és a nyomógombok a külső adatmemórián (XDATA) keresztül illesztettek. A szimulátorban az XDATA memóriából történő olvasás, illetve az oda írás is ellenőrizhető. Most a bemeneti változók frissítésén keresztül tekintjük át a külső memória használatát. Először be kell állítani a bemenet alapértékét. Az alkalmazott mikrogépben a nyomógomb illesztése olyan, hogy a lenyomott gomb ad 0 szintet. A memóriaterületek közül mindig csak az egyik látható a képernyőn. A külső adatmemória tartalma az XDATA feliratra való klikkeléssel is kiválasztható. Ekkor a memória kezdőcímétől látható 48 bájt tartalma (67.a. ábra).
a. Következő lépésben a kívánt című területet kell kiválasztani. A példánkban a 0C000H, és a 0C001H címen érhetők el a használt perifériák. Az egérrel a memória címterültére kattintva jelenik meg a 67.b. ábra szerinti kép. Itt ki kell választani a kívánt kezdő (0C000H) nyomógombok címét.
b. Befejezésként a címre beírjuk a 0FF H kezdő értéket.
c. 67. ábra Az értékbeállítás után a megismert léptetéssel leellenőrizhető a beolvasó programrész.
98.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II A szimuláció bemutatásának eddigi részében tárgyaltuk a lépésenkénti, és a töréspontos ellenőrzést. A továbbiakban a szubrutin ellenőrzést (F8) mutatjuk be. A programunkban szoftver időzítő szubrutint alkalmaztunk. Az ellenőrzés tulajdonképpen a teljes futási idő megállapításából áll. A szimulátor alkalmas a futási idő leellenőrzésére is. Mikor a szubrutin ellenőrzéséhez érünk (69. ábra), először az időzítési alapot kell beállítanunk. A View menüpontra kattintva jelenik meg a 68. a. ábra szerinti kép. A legalsó Cycle count almenüre kattintva nyílik meg a b. ábrán látható ablak. Itt kell beállítani az alkalmazott Quarzfrekvenciát. A számlálóba (Zahlerstand) 0-t kell írni és Ok.
b. a. 68. ábra A beállítást követően újból a 69. ábra szerinti képet látjuk.
69. ábra Az F8 funkcióbillentyű megnyomása után elindul a szubrutin végrehajtása (70.ábra).
70. ábra (A futás megszakítható az ESC billentyűvel.) A teljes végrehajtás után eltűnik. 99.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II A ciklusszámlálót mutató ablak ismételt megjelenítésével (71. ábra) leolvashatjuk a végrehajtott gépi-ciklusok számát decimálisan a piros mezőben, és hexadecimálisan is. A beállított órajel frekvenciából kiszámított program végrehajtási időt µs - ban.
71. ábra A program további részei is ellenőrizhetők a leírtak alapján. 9.3.3. A programok valós idejű futtatás Az XE251 fejlesztői környezetben egy program valós környezetben történő futtatása alatt is elvégezhető. Legelőször a mikrogép és a PC közötti RS32 szabványú soros vonali csatlakozást kell biztosítani. A feladat a Terminál Emulation menü kiválasztásával végezhető. A fülre kattintás után a 72. ábra szerinti kép jelenik meg.
72. ábra Az ellenőrzést a következő lépésekben kell elkezdeni. 1. A soros vonali kapcsolat elindítása, amely a Connect gombra kattintással történik.
100.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II
Hatására a képernyőn megjelenik az 552>_ promt, (73.ábra) ami azt jelzi, hogy van kapcsolat. Alaphelyzetben az _ karakter villog. Amennyiben csak az _ karaktert látjuk, akkor nincs kapcsolat.
73. ábra 2. Az ellenőrzés megkezdése előtt célszerű a mikrogépet resetelni. Utána a 74.ábra szerinti képet látjuk.
74. ábra 3. A H (help) billentyű leütése a segítséget (75.ábra) jeleníti meg, amelyről leolvashatók a monitor vezérlő billentyűi és a memóriaterületek írás-olvasás vezérlőjelei.
75. ábra
101.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II 4. A program letöltése előtt, a szimulációhoz hasonlóan célszerű a memóriaterületet 00, vagy 0FFH értékkel feltölteni. Azért jó ezt megtenni, mivel a vizsgálandó programban lehetnek nem használt területek. Itt tetszőleges értékek tárolódnak és ezek a disassamblálás - nál utasításként láthatók, miközben ilyen nincs a programban. A memóriafeltöltés az F (fill) paranccsal indítható (76. ábra). Most az XDATA memóriát 4000H címtől a 4200h címig 0FFH értékkel írtuk felül a
76. ábra 5. A létrehozott kapcsolaton keresztül letöltjük az ellenőrzendő programot. Miután megnyomjuk a Download gombot, a megjelenő ablakból (77.a.ábra) kiválasztjuk azt. A megnyitás után a b. ábrán látható Download Status jelzi a letöltést. A letöltés befejezését jelzi a c. ábra.
a.
b.
c. 77. ábra .
102.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II 6. A letöltött program assembly alakját az U (Unassembler) paranccsal jelenítjük meg. A parancs, a kezdőcím megadása és az Enter leütése után egy segítő sor (sárga) és az első utasítássor jelenik meg. További sorokat az Enter billentyűvel írathatók ki. A 78. ábrán a letöltött program első sorait látjuk. A program ismeretében a kép alapján ellenőrizhetjük a letöltés helyességét. A további visszafejtésből az ESC lépteti ki a monitorprogramot.
78. ábra A felsorolt hat lépést mind a tényleges programfuttatásnál, mind a valós idejű ellenőrzésnél végig kell csinálni. A program a G (Go) paranccsal indítható. A parancs leütése után meg kell adni a kezdő címet (79.ábra). Amennyiben a programban nincs beiktatva kilépési parancs, akkor leállítani csak Reset -tel lehet.
79. ábra A programellenőrzés lépésenkénti teszteléssel indítható az S (Step) parancs és a kezdőcím megadásával, amely után a 80. ábra szerinti kép jelenik meg. A képernyőn láthatók: · a parancs segítő (sárga sor) · a processzor regiszterek aktuális tartalma, · a program öt sora, amelyeknél a > karakter mutatja a soron következő utasítást, · a Help menüt, amelyben megtaláljuk azokat a parancsokat, amelyekkel az aktuális memóriatartalom és egyéb adat megjeleníthető.
103.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II
80. ábra A memóriatörlés részét ellenőrizzük a következőben. Az előző ábrán látható kezdő állapotból három lépés – az N vagy az Enter háromszori leütése – után jutunk a memóriatörlés kezdetéshez (81.ábra). A program eljutott a ciklustörzs első utasításáig, amit a > karakter jelez.
81. ábra Következő lépésként az belső adatmemória tartalmát kell látnunk. A D (display DATA memory) megnyomása után látható a 82. ábra szerinti kép. A változók memóriaterülete valamilyen véletlenszerű értékeket tárol.
104.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II
82. ábra A következő két léptetés után a program először végrehajtotta a ciklustörzs utasításait, aminek eredménye a 83.ábrán látható. Törölte a 20H című memóriát és R0 a 21H címre mutat.
83. ábra A ciklus végleges lefuttatásához nem tudunk töréspontot beállítani, mint ahogyan azt tettük a szimulációban. Egy módszer azonban itt is rendelkezésünkre áll. Az ellenőrzésben (debug) a G (Goto to address) + cél cím megadása után a program addig fut, amíg el nem éri a megadott címet. Így a teljes for ciklus lefuttatható, ha a 4013H címet adjuk meg a G parancs után (lásd az ábra utolsó sorában). Az Enter megnyomása után a program a megadott címen áll meg és innen folytatható a további lépésenkénti ellenőrzés. A 84. ábrán látjuk, hogy a memória kijelölt területét törölte a program és következhet a 4013H címen lévő utasítás végrehajtása..
105.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II
84. ábra Az időzítés működésének, és beállításának helyessége a működés alapján ellenőrizhető. A fejezetben példán mutattuk be az XE251 elnevezésű fejlesztési környezetben a programírás és ellenőrzések végrehajtását. A leírtak alapján végezzék el a következő fejezetben található mintaprogramok szimulációs tesztelését. A fejlesztői környezet az Automatika Intézet honlapjáról letölthető.
106.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II
10. Példák programfejlesztésre A fejezetben különböző feladatokat megoldó programok fejlesztését végezzük el. A példák megismerése, és megértése után célszerű azok szimulációját is elvégezni az ismertetett XE251 környezetben. 10.1. Kombinációs logikai feladat programozása ·
Kiinduló adatok: · A megvalósítandó feladat indexelt függvénye: 4
F = Õ (15,13, 8, 7, 5, 3,1 )
X = (14, 6, 0 )
·
A független változók és súlyozásuk H ÷ 20, I ÷ 21, J ÷ 22, K ÷ 23,
·
Függő változó
·
A függvény igazságtáblázata:
F
K J I
H F
0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
0 0 0 0 1 1 1 1 0 0 0 0 1 1 1 1
0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
0 x 0 1 1 1 1 0 0 x 0 1 0 1 0 x
A táblázat meghatározásánál nem részletezzük az adott konjunktív alakból történő átírást, valamint a legegyszerűbb függvény meghatározását. A módszer a tantárgy első félévi tananyagában található
F=(H+JK)(J+ I+H)
·
A legegyszerűbb konjunktív alakú függvény
·
A program kétféle algoritmus szerint oldja meg a feladatot:
1. bitműveletekkel függvény-érték közvetlen kiszámítása, 2. az igazságtáblázat 1 értékű soraihoz tartozó kombinációk, és az aktuális bemeneti kombináció összehasonlítása alapján. · A program feladata A mikrogépbe nyolc nyomógombon lehet adatot bevinni. A gombsor (NGSOR) alsó négy gombján legyen beírható a négy változó. A nyomógombok illesztése olyan, hogy a lenyomásnál 0 szintet ad az adatbuszra. Az eredmény kijelzés ugyancsak nyolc LED alkotta LEDSOR -on jelezhető ki. Egy LED világítson, ha a függvény értéke 1! A LED –ek vezérlésénél is 0 szint az aktív, vagyis ekkor világít. A kétféle algoritmus szerinti megoldás eredményét más-más LED jelezze!
107.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II
·
A program folyamatábrája
A fő programciklus
A függvényértéket bit műveletekkel kiszámító rutin
Belép AT_1 = (H + JK)
Start AT_2 =(J +I +H)
Inicializálás F=(AT_1)(AT_2) Bemenetek frissítése
A függvényérték kiszámítása bit műveletekkel
Vissza
A függvényértéket táblázat alapján kiszámító rutin
Belép
Ciklusváltozó, végérték, változtatás beállítása
A függvényérték kiszámítása az igazságtáblázat alapján
Bemeneti kombináció keresése a táblázatban
Kimenetek frissítése
Nem
Van ?
Cikl.v. +1 Szubrutinok Nem
Bemenet frissítés Kimenet frissítés
Igen
Vége ? Igen
F=1
F=0
Vissza
85. ábra
108.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II
·
A szükséges változók, memóriák és állandók meghatározása (deklaráció)
A program forrásállományának megírása elött célszerű meghatározni a szükséges memória szegmenseket, a használt változókat és konstansokat. A feladat megoldásában csak bit változók szükségesek. A négy független (H_V, I_V, J_V, K_V), két függő a bites algoritmus eredménye F_B, a táblázatos algoritmus eredménye F_T és átmeneti tárolásra használt AT_1. A változók tárolásához tehát három bájtnak (BEM, KIM és ATM) kell a bitcímezhető területen helyet foglalni és ezek bitjeihez rendelni a változókat. A program és a Stack részére kell még területet kijelölni. A táblázat azon bemeneti kombinációkat tartalmazza, amelyeknél a függvény IGAZ. Mivel a változók kombinációja mint bináris szám is értelmezhető. A rövid leírás érdekében megfelelő számok decimális alakját írjuk be. ·
A program assembly nyelvű forrásállománya:
;********************************************************* ;* K K M F Automatika Intézet * ;* Elektronika Szakcsoport * ;********************************************************* ;* Program: Prog_ko.a51 * ;* Változat: V1.0 * ;* Dátum: 2008.04.05 * ;* Készítette: XY * ;********************************************************* ;* A modul leírása: Kombinációs feladat programja * ;********************************************************* ; xxxxxxx Fordítási parancsok xxxxxxx $NOMOD51 ; xxxxxxx Deklarációk xxxxxxx $NOLIST $INCLUDE(C:\XE251\Include\GYAK552.INC) $LIST ; xxxxxxx Szegmensek deklarálása xxxxxxx PROG VALTB ?STACK
SEGMENT SEGMENT SEGMENT
CODE ; program DATA BITADDRESSABLE ; bitcímezhető változók IDATA ; stack memória
; xxxxxxx XDATA memóriába XSEG NGSOR: DS LEDSOR: DS
ágyazott I/O xxxxxxx
AT 0C000H 1 1
; Nyomógombok címe X:0C000H ; LED sor címe X:0C001H
; xxxxxxx Bájtos változók a BIT címezhető területen xxxxxxx RSEG
VALTB
109.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II BEM: KIM: ATM: H_V I_V J_V K_V F_B F_T AT_1
DS DS DS BIT BIT BIT BIT BIT BIT BIT
1 1 1 BEM.0 BEM.1 BEM.2 BEM.3 KIM.0 KIM.7 ATM.0
; ; ; ;
bemeneti memória kimeneti memória átmeneti tároló független változók
; függő változók ; átmeneti tároló bit
; xxxxxxx STACK szegmens xxxxxxx RSEG DS
?STACK 10H
; STACK kezdete ; 16 bájtos STACK
; xxxxxxx Program szegmens xxxxxxx
START:
RSEG
PROG
LJMP
INIT
; ugrás az inicializálása
; ****** Inicializálás ****** INIT:
MOV
SP,#?STACK-1
; a Stack -pointer beállítása
R7,#5 R0,#BEM @R0,#0 R0 R7,IN1
; a memória munkaterületek törlése
IN1:
MOV MOV MOV INC DJNZ MOV MOV MOVX
DPTR,#LEDSOR A,#0FFH @DPTR,A
; a kim. periféria alaphelyzetbe ; a LED -ek ne világítsanak
CALL
BEOLV
; bemenet frissítő rutin hívása
CALL
B_MUV
; a bitműveletes rutin hívása
CALL
T_MUV
; a táblázatos rutin hívása
CALL
KIIR
; kimenet frissítő rutin hívása
JMP
FOPR
FOPR:
VEG:
; ****** Szubrutinok ***** ; xxxxxxx A független változók (nyomógombsorról) beolvasása, ; lehelyezése a bemeneti memóriába xxxxxxx ; Használja: a DPTR, ACC regisztereket BEOLV: MOV beolvasása, MOVX memóriába CPL ANL MOV
DPTR,#NGSOR
; a nyomógombok értékének
A,@DPTR
; lehelyezése a bemeneti
A A,#0FH BEM,A
110.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II RET ; xxxxxxx A függő változók aktuális értékének kivitele ; a kimeneti memóriából a perifériára (LED -sorra) xxxxxxx ; Használja: a DPTR, ACC regisztereket KIIR:
MOV MOV ANL CPL MOVX RET
DPTR,#LEDSOR A,KIM A,#81H A @DPTR,A
; a kiszámított értékek ; kivitele a LED sorra
; xxxxxxx a bit-műveletes függvénymegoldás xxxxxxx B_MUV:
MOV
C,J_V
; az első BLOKK kiszámítása,
ANL ORL MOV
C,/K_V C,H_V AT_1,C
; JK+H
MOV
C,J_V
; a második BLOKK kiszámítása
CPL ORL ORL
C C,/I_V C,/H_V
; J+I+H
ANL MOV RET
C,AT_1 F_B,C
; a függvényérték kiszámítása ; tárolása
; és tárolása
; xxxxxxx a függvénymegoldása az IGAZSÁGTÁBLÁZAT alapján xxxxxxx ; egy for ciklusban összehasonlítja az aktuális független változó ; kombinációt az IG_T értékeivel!
CIKL:
C_VEG:
MOV MOV MOV
R6,#6 DPTR,#IG_T R7,#0
; hossz, ciklusváltozó ; a kezdőértékek, táblázat cím
MOV MOVC ANL CJNE SETB RET
A,R7 A,@A+DPTR A,#0FH A,BEM,C_VEG F_T
; ciklustörzs
INC DJNZ CLR RET
R7 R6,CIKL F_T
; a kombináció a táblázatban? ; IGEN, tehát a függvényérték 1
; ciklusismétlés? ; nincs egyező, függvényérték 0
; ****** Konstans táblázatok ****** IG_T:
DB END
3,4,5,6,11,13
; az 1 értékű kombinációi indexei ; fájl vége direktíva
111.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II
10.2. Kijelző vezérlés megszakítás (interrupt) használatával. Feladat: ·
Az egy bájtban tárolt V_B változó tartalmának kiíratása a mikrogép háromkarakteres hétszegmensű kijelzőjére (87.ábra) időmultiplex vezérléssel. · A karakterenkénti kijelzés 5 ms időtartamú legyen. Az időzítést a T0 időzítő/számláló megszakítása generálja. · A kijelzést a mikrogép nyomógombjai közül Start/Stop megnyomása indítsa, a gomb újabb megnyomása, pedig állítsa le s.i.t. · A kijelzés tiltáskor a kijelző LED –ek egyike világítson! Megoldás: Az időmultiplex kijelzés az emberi szem tehetetlenségét használja ki. Egy adott időben karakterek közül csak egyet jelenítünk meg, de rövid idő múlva a következőt és így tovább. Amennyiben a karakterváltások ideje nagyobb 1/30 sec, akkor már folytonos képet látunk. Technikai okokból az 1/50, illetve 1/100 a váltási idő. A megoldás előnye az olcsóbb hardver és kisebb teljesítményfelvétel. ·
A hardver kialakítása: Hétszegmensű kijelzők
Anód kapcsolók Kijelző választó DATA
Kód tároló
0C004H 0C000H 86. ábra
·
A hardver egységei:
Számkijelzés (KIJ1, KIJ2, KIJ3) : közösített anódú hétszegmensű LED kijelző. Tárolók (IC2, IC3): pozitív elvezérelt 8 bites Latch -ek. Az IC2 (címe: 0C004H) a kijelző kiválasztást, míg az IC3 (címe: 0C000H) a kijelzendő karakter kódját tárolja. Anódkapcsolók (T1, T2, T3): pnp tranzisztorok, amelyek az egyes kijelzők anódfeszültségét kapcsolják. A 0 szint nyit.. Mindig csak egyet kell nyitni.
112.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II A vezérlésre a 0C000H címen elérhető nyomógombok egyike, míg a kijelzésre a 0C006H címen módosítható LED –ek valamelyike használható ·
A program funkciók:
Inicializálás: memóriatörlés, a T0 számláló 2.üzemmódbeállítása. megszakítás engedélyezés Elosztás: a kijelzendő szám (V_B) számjegyeit egy tömb (K_T) elemeibe kell átírni. Időmultiplikatív vezérlés: 5 ms -ként kell a soron következő számjegyet kiírni. Lépései: a következő karakter-kijelző kiválasztása, az aktuális számjegy átírása a K_T tömbből az a kijelző kód tárolójába. A megszakítás rutin számlálja a megszakítások számát és 10 ms - ként egy bitet (ID_bit) 1-be állít és a számláló tartalmát törli. · A folyamatábra Star
V_B a kijelzendő szám K_T [ ] 3 elemű
Főprogram
Felosztó rutin
Inicializál
K _ T [2] = V _ B / 100 K _ T [1] = (%( V _ B / 100 )) / 10
A bemenetek frissítése
K _ T [ 0 ] = %( (%( V _ B / 100 )) / 10 )
Indít
nem
igen
Karakter kiíratás
Felosztás karakterekre 10 ms?
Az n. kijelző kiválasztása
nem
A K_T [n] átírása
igen Az n. karakter kiíratása
T0 int.
A kimenetek frissítése
I_D + 1 nem
Szubrutinok
I_D =I_M? igen
- felosztás, - időzítés
I_D=0 I_bit=1
87. ábra 113.oldal
Időzítés
Zalotay Péter: DIGITÁLIS TECHNIKA II ·
A szükséges változók, memóriák és állandók meghatározása (deklaráció)
A feladatot megoldó programban mind bit, mind pedig bájt típusú változókat kell deklarálni. Bit változóként kell tárolni a start/stop gomb állapotát (ST_SP), a gomb megnyomását jelzést (ST_SPE), a 10 ms elteltét jelzőt (I_bit) és a működést mutató LED tárolóját (JEL). A bitcímezhető területen három különböző bájtban (BEM, KIM, ATM) jelöljük ki a biteket. Az általános belső adatmemóriában tároljuk a kijelzendő változót (V_B), a három nagyságrendű számjegyek a hétszegmens kódra átkódolt értékeit tároló tömb (K_T), és az időzítés számlálóját (I_SZ), amelyben számláljuk megszakítások számát. A kijelző áramkörben a „kód tároló” (KOD_TAR), és a „kijelző választó” (KIJ_VAL) címeit az XDATA szegmensben kell megadni. Ugyanitt a nyomógombok (NGSOR) és a LED –ek (LEDSOR) címeit is deklarálni szükséges. A program futása közben tárolni kell a kiválasztandó kijelzőt és kiírandó adat helyét megadó mutatót. A feladatra az bankregiszterek közül az R0-t használjuk.. A kijelző kiválasztását a „kijelző választó” tárolóba írt kóddal történik. A KIJ3-t a 11111110B (0FEH), a KIJ2-t a 11111101B (0FDH) és a KIJ1-t a 11111011B (0FBH) kód választja ki. A kódsorozat forgatással (RL A) állítható elő. Az előkészítés során még a szükséges konstansokat kell meghatározni. Egyik a számok hétszegmens kódjának meghatározása. Másik az 5 ms időzítés előállításához szükséges álladók kiszámítása. A 86. ábrán látható kijelzőben nincs hétszegmens dekóder. Példánkban ezért a szám kódját karaktertáblázatból (SZ_KOD) vesszük. A számjegyek megfelelő hétszegmens kódjait is meg kell határozni és a programmemóriában lefoglalt tömbbe beírni. A 88. ábrán látható a kijelző szegmenseinek jelölése (a.), és hogy a „kód tároló” egyes bitjei melyik szegmenst vezérlik (b.).
a f
g
b c
e d
dp g f
e
d c
b a LSB
MSB
dp
a.
b. 88. ábra
A hétszegmensű kijelző közösített anódú, amiből következik, hogy egy szegmens akkor világít, ha 0 szintet kap a bemenete. A leírtakat figyelembe véve foglaljuk táblázatba az egyes számjegyek megjelenítéséhez szükséges kódokat.
114.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II
Bináris kód Szám 27 dp
0 1 2 3 4 5 6 7 8 9
1 1 1 1 1 1 1 1 1 1
26
25
24
23
22
21
20
1 1 0 0 0 0 0 1 0 0
0 1 1 1 0 0 0 1 0 0
0 1 0 1 1 1 0 1 0 1
0 1 0 0 1 0 0 1 0 0
0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 1 1 0 0 0
0 1 0 0 1 0 0 0 0 0
g
f
e
d
c
b
a
Hexadecimális kód 0C0H 0F9H 0A4H 0B0H 99H 92H 82H 0F0H 80H 90H
A programmemóriába az SZ_KOD tömbbe, szám sorrendjébe írjuk be a kódokat. Ebben az esetben a szám kódja a „tömb kezdetének címe + szám” címről olvasható ki. A V_B –ben tárolt szám egyes számjegyeit 10 hatványaival történő sorozatos osztással kapjuk. Az egyes számjegyek kódját célszerű a tömbben tárolni. A megoldás a kijelzést gyorsítja. Utolsónak hagytuk annak kiszámítását, hogy az tk = 5 ms időközönkénti karakterváltáshoz a megszakításban milyen beállításokat kell alkalmazni. A T0 számlálót 2-es üzemmódba célszerű beállítani. A megszakítások időzítését egész számra (ha lehet) választjuk. Itt legyen a megszakítások periódusideje Tm = 200 µs. A választott érték elállításához a T0 számlálásának kezdőszáma (Zk) az oszcillátor frekvenciájának (fo) ismeretében a Zk = 256 -
Tm f o összefüggésből számolható. A példa szerinti mikrogépnél fo = 11,0592 12
MHz. A számított kezdőszám 71,68, ami felfelé kerekítve Zk = 72, amivel a tényleges Tm = 199,65 µs lesz. Még meg kell határozni, hogy hány túlcsordulás (SZ_T), illetve programmegszakítás van az t 5 ms alatt. A számított érték SZ _ T = k = 25,044 . A programunkban csak egész számot, Tm vagyis SZ_T = 25 használunk. A deklarációk meghatározása után elkezdjük a szöveges forrás fájl megírását.
115.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II
·
A program assembly nyelvű forrás-állománya
;**************************************************** ;* K K M F Automatika Intézet * ;* Elektronika Szakcsoport * ;**************************************************** ;* Program: HETSZ_KIJ.a51 * ;* Változat: V1.0 * ;* Dátum: 2008.04.17 * ;* Készítette: XY * ;**************************************************** ;* A modul leírása: Egy bájt tartalmának idő* ;* multiplex kiíratása háromkarakteres hétszegmensű* ;* kijelzőre * ;**************************************************** ; xxxxxxx Deklarációk xxxxxxx ; xxxxxxx Szegmensek deklarálása xxxxxxx PROG VALTB
SEGMENT SEGMENT
VALT ?STACK
SEGMENT SEGMENT
CODE ; DATA BITADDRESSABLE ; DATA ; IDATA ;
program BIT címezhető terület bájtos változók stack memória
; xxxxxxx XDATA memóriába ágyazott I/O xxxxxxx NGSOR LEDSOR KOD_TAR KIJ_VAL
EQU EQU EQU EQU
0C000H 0C006H 0C000H 0C004H
; ; ; ;
Nyomógomb sor címe LED -sor címe A kijelző adattárolója A kijelző választás tárolója
; xxxxxxx Változók a BIT címezhető területen xxxxxxx
BEM: KIM: ATM: ST_SP ST_SPE I_bit JEL
RSEG
VALTB
DS DS DS BIT BIT BIT BIT
1 1 1 BEM.0 ATM.7 ATM.0 KIM.7
; ; ; ; ; ; ;
bemeneti memória kimeneti memória átmeneti tároló start/stop gomb start/stop változása (él) időzítő bit jelző LED
; xxxxxxx Bájtos változók a DATA területen xxxxxxx RSEG V_B: K_T: I_SZ: AV_T:
DS DS DS DS
VALT 1 3 1 1
; ; ; ;
kijelzendő változó számok tömbje az időzítés számláló anódválasztó kód tárolója
116.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II ; xxxxxxx STACK szegmens xxxxxxx RSEG DS
?STACK 10H
; STACK kezdete ; 16 bájtos STACK
; xxxxxxx Program szegmens xxxxxxx
START:
RSEG
PROG
LJMP
INIT
; ugrás az inicializálásra
ORG LJMP
START+0BH T0_M
; megszakítás rutin hívása
; ****** Inicializálás ****** INIT:
MOV
SP,#?STACK-1
; a Stack -pointer beállítása
; a memória munkaterületek törlése IN1:
FOPR:
FO_1:
MOV MOV INC CJNE
R0,#VALTB @R0,#0 R0 R0,#TACK,IN1
MOV MOV MOVX
DPTR,#LEDSOR A,#0FFH @DPTR,A
; a kimeneti periféria alaphelyzet ; a LED -ek ne világítsanak
MOV MOV
R1,#K_T+2 AV_T,#0FEF
; R1 mutat a szám-tömbre ; a legelső anódválasztó kód
ANL ORL MOV SETB SETB SETB
TMOD,#0F0H TMOD,#2 TH0,#Z_K TR0 ET0 EA
; T0 2. üzemmód beállítása
CALL
BEOLV
; bemenetek beolvasása
JNB CPL
ST_SPE,FO_1 JEL
; a számkijelzés be/ki kapcsolása
JNB
JEL,FO_VEG
JNB CLR CALL
I_bit, FO_VEG I_bit FELB
; kijelző váltás ?
MOV MOV MOVX
DPTR,#KIJ_VAL A,AV_T @DPTR,A
; kijelző kiválasztás
RL CJNE
A A,#0F7H,FO_2
; a kijelző kód módosítása ; vége?
MOV
A,#0FEH
; előröl
; a számlálás kezdő száma ; a számláló indítása ; megszakítás engedélyezése
; számjegyek szétválasztó rutin
117.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II FO_2:
FO_3:
MOV
AV_T,A
MOV MOV
DPTR,#KOD_TAR A,@R0
; adat kiíratás
DEC CJNE MOV
R1 R1,#K_T-1,FO_3 R1,#K_T+2
; következő számjegy ; vége? ; elölről
MOVX
@DPTR,A
FO_VEG: CALL JMP
KIIR FOPR
; ****** Szubrutinok ***** ; xxxxxxx A független változók beolvasása, változás figyelése, ; lehelyezés a bemeneti memóriába ; Használja: a DPTR, ACC regisztereket xxxxxxx BEOLV:
MOV MOVX CPL
DPTR,#NGSOR A,@DPTR A
; a nyomógombok beolvasása ; új érték
MOV ANL MOV
C,ACC.0 C,/ST_SP ST_SPE,C
; a változás (él) meghatározása ; az új (ACC.0) & régi (ST_SP) ; tárolás
MOV RET
BEM,A
; lehelyezése a bemeneti memóriába
; xxxxxxx A függő változók aktuális értékének kivitele a ; kimeneti memóriából a perifériára (LED -sorra) ; Használja: a DPTR, ACC regisztereket xxxxxxx KIIR:
MOV MOV CPL MOVX RET
DPTR,#LEDSOR A,KIM A @DPTR,A
; A kiszámított értékek (KIM-ben) ; kivitele a LED sorra
; xxxxxxx A kijelzendő változó helyértékekre bontása egy tömbbe ; Használja: az R0, ACC és B regisztereket xxxxxxx FELB:
MOV MOV
DPTR,#SZ_KOD R1,#K_T +2
; a számok kódtáblázatára ; a tömbmutató beállítása
MOV MOV DIV MOVC MOV DEC XCH MOV DIV MOVC MOV
A,V_B B,#100 AB A,@A+DPTR @R1,A R1 A,B B,#10 AB A,@A+DPTR @R1,A
; a 100-k együtthatójának kiszám. ; a számjegy átkódolása ; letétele a tömb harmadik elemébe ; a 10-ek együtthatójának kiszám. ; a számjegy átkódolása ; letétele a tömb második elemébe
118.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II DEC XCH MOVC MOV RET
R1 A,B A,@A+DPTR @R1,A
; a számjegy átkódolása ; az 1-k letét. az első elembe
119.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II
; xxxxxxx A 10 ms időzítés a T0 megszakítás rutinja ; Használja: az ACC és PSW regisztereket xxxxxxx T0_M:
T0_MV:
PUSH PUSH INC MOV CJNE SETB MOV POP POP RETI
ACC PSW I_SZ A,I_SZ A,#SZ_T,T0_MV I_BIT I_MOD,#0 PSW ACC
; a használt regiszterek mentése ; a számláló értékének növelése ; elérte a végértéket ? ; igen ; regiszterek visszaolvasása
;xxxxxxx Számok kódtáblázata, konstansok xxxxxxx SZ_KOD: DB
0C0H,0F9H,0A4H,0B0H,99H,82H,0F0H,80H,90H
SZ_T Z_K
25 72
EQU EQU END
; a megszakítások száma ; számlálás kezdő száma ; fájl vége direktíva
120.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II
10.3. Közlekedési jelzőlámpák vezérlése A vezérlések többségében sorrendi működést kell megvalósítani. A Digitális technika I. jegyzet utolsó példájában terveztük meg a 89. ábrán szemléltetett egyszerű útkereszteződés jelzőlámpáinak hardver vezérlését. Ma már a feladatot legtöbb esetben mikrogép, vagy PLC alkalmazásával oldják meg. A továbbiakban egy mikrokontrollerrel megépített vezérlőgép irányító programját tervezzük meg.
89. ábra A feladat egy öt állapotú sorrendi vezérlés programjának fejlesztése. A vezérlés logikai tervezését itt elhagyjuk, mert az első féléves jegyzet 5.fejezetének (Sorrendi digitális hálózatok) 7. példájában (159.oldal) részletesen megtalálható. (Megjegyzés: célszerű átismételni). A vezérlés állapotgráfja látható a 90. ábrán. Ut0 Zsv Xbe Xki Xlep
Xki Ut1 Zps Xlep
Ut4 Zp Xlep
Xki
Xlep
Ut2 Zz
Xki
Ut3 Zsp
90. ábra ·
A mikrogép fő adatai:
A mikrogép bájtos szervezésű, memóriába ágyazott periféria illesztéssel csatlakozik a vezérelt berendezéshez. A bemenetek elérési címe 0C000h, a kimenő értékeket a 0C001H címre kell kiadni. Mind a bemenetek, mind a kimenetek aktív szintje a 0. A vezérlő gombok közül az üzemmód állító a 20, a kézi léptető a 21, az indító a 26, míg a leállító a 27 helyértékre csatlakozik. A vezérelt lámpák közül a működést jelző a 27, az A irányú zöld 20 , a sárga 21 , a piros 22, míg a B irányban a zöld 24 , a sárga 25 , és a piros 26 helyértékre csatlakozik. Az órajel frekvencia f0 = 11.0592 MHz.
121.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II ·
Feladat
1. A jelzőlámpák vezérlése, a tápszültség bekapcsolása után mindkét irányban a sárga lámpák fv = 1 Hz frekvenciával, k = 0,5 kitöltési tényezővel villogjanak. 2. A jelzőlámpák üzemi működése egy nyomógomb megnyomásával induljon, illetve egy másik gombbal leállítható legyen. 3. Kétféle üzemmód – a kézi és az automatikus – közül egy újabb nyomógomb megnyomásával lehessen választani. A gomb minden működtetésekor váltson az üzemmód. Az üzemmód váltása csak leállított állapotban történhet. 4. A sorrendi vezérlés öt állapota – az állapotgráf jelöléseivel - a következő: · ·
alapütem (Ut0): első ütem (Ut1):
a sárga lámpák villognak ( Zsv), A irányban a piros és a sárga, B irányban a sárga lámpa világítson ( Zps), · második ütem (Ut2): A irányban a zöld, B irányban a piros lámpa világítson ( Zz) · harmadik ütem (Ut3): A irányban a sárga, B irányban a piros és a sárga lámpa világítson, ( Zsp) · negyedik ütem (Ut4): A irányban a piros, B irányban a zöld lámpa világítson ( Zp). 5. Az állapotváltó kombináció (Xlép) a kézi üzemmódban az üzemváltó gomb megnyomásának felfutó élénél, az automatikus üzemmódban a megszakításos időzítésének lejártakor. 6. Automatikus üzemben az Ut1 és az Ut3 ütemekben 3 sec, az Ut2 és az Ut4 ütemekben 10 sec legyen. Az értékek deklarációban módosíthatók legyenek. 7. A kimeneti kombinációkat, valamint az ütemidőzítések értékeit táblázatból kell kiolvasni. ·
A program funkciók:
Inicializálás
a változókat tároló terület törlése, a T0 számláló 2. üzemmódba állítása az időzítés a villogtatás idejére állítva, megszakítás engedélyezése. Bemenet frissítés a bemeneti készülékek aktuális állapotának beolvasása, tárolás, a pozitív jelváltás meghatározása, tárolása. Indít, leállít váltásokat nyomógombok vezérelik, a működő állapotot egy lámpa jelezze. Választások áll - működik, kézi – automatikus üzemmód, az ütemváltási feltétel teljesül, vagy nem. Időzítés választás az automatikus üzemmódban minden állapotváltáskor beállítja az ütemhez tartozó időzítést. Kimenet frissítés egy ciklusban meghatározott kimeneti értékek kivitele a perifériákra. Megszakítás rutin számlálja a T0 megszakításait, és az ütemenként megadott értéknél egy jelzőbitet állít be, és a számlálót törli.
122.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II ·
A folyamatábra Start
Inicializálás
Bemenet frissítés, élfigyelés Start / Stop Nem
Alaphelyzetbe állítás
Bekapcsolva? Igen
Az aktuális kimeneti kombináció meghatározása
Késleltetés Nem vége? Sárga lámpák váltanak
Kézi
Üzemmód váltó g.?
Igen
Automata Nem
Ütem váltó gomb?
Késleltetés vége? Igen
Következő ütem
Következő ütem
Az aktuális időzítés beállítása
Nem Elölről? Igen Első ütem
A kimeneti perifériák frissítése
Szubrutinok
123.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II ·
A szükséges változók, memóriák és állandók meghatározása (deklaráció)
A feladatot megoldó programban mind bit, mind pedig bájt típusú változókat kell deklarálni. Bit változóként kell tárolni a start (INDIT), a stop (ALL), az üzemmód váltó (U_M), a léptető (LEP) gombok állapotát. Az üzemmód és a léptető gombok pozitív (UM_P, LEP_P) váltását, az aktuális időzítés lejártát (ID_B) és a működést mutató lámpa (MUK) tárolt bitjeit. A bitcímezhető területen négy különböző bájtban (BEM, KIM, IDOJEL, POZ_EL) jelöljük ki a biteket. Az általános belső adatmemóriában tároljuk 2 bájtos megszakítások számlálóját (M_SZ), és a késleltetés értékét (KESL_M). Szükséges még egy bájtban tárolni az aktuális ütem számát (UT_J). Konstansként kell meghatározni a T0 számláló túlcsordulásának idejét. Az előző példához hasonlóan – válasszuk 200 µs –ra, akkor Zk kezdőszám itt is 72. Az egyes ütemekhez tartozó megszakítás számok: a villogtatás (500 ms) VILL=2500, az irányváltást jelző ütemek (3 s) VID= 15000 és a fő irányokban (10 s) FOID = 50000. A magas értékek miatt szükséges a szavas számlálás és komparálása programozása. A jelzőlámpák állapotait megszabó kimeneti kombinációk táblázata a megadott bekötés alapján határozhatók meg. ·
A program assembly nyelvű forrás-állománya
;******************************************************** ;* K K M F Automatika Intézet * ;* Elektronika Szakcsoport * ;******************************************************** ;* Program: Utk_mau.a51 * ;* Változat: V2.0 * ;* Dátum: 2009.04.16 * ;* Készítette: XY * ;******************************************************** ;* A modul leírása: Közlekedési lámpa vezérlése * ;******************************************************** ; xxxxxxx Szegmensek deklarálása xxxxxxx PROG VALTB
SEGMENT SEGMENT
CODE DATA BITADDRESSABLE
VALT ?STACK
SEGMENT SEGMENT
DATA IDATA
; ; ; ; ;
program változók a BIT címezhető területen bájtos változók stack memória
; xxxxxxx Konstansok xxxxxxx FOID VID VILL
EQU EQU EQU
50000 15000 2500
; FŐ ütemidő ; VÁLTÓ ütem ideje ; VILLOGTATÁS ideje
; xxxxxxx XDATA memóriába ágyazott I/O xxxxxxx XSEG NGSOR:
AT 0C000H DS
1
; Nyomógomb sor címe
124.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II LEDSOR:
DS
1
; LED -sor címe
; xxxxxxx Változók a BIT címezhető területen xxxxxxx RSEG
VALTB
BEM: KIM: IDOJEL: POZ_EL:
DS DS DS DS DS
1 1 1 1 1
; ; ; ;
bementi memória kimeneti memória időzítés jelzők pozitív váltások
U_M LEP INDIT ALL MUK ID_B U_MP LEP_P
BIT BIT BIT BIT BIT BIT BIT BIT
BEM.0 BEM.1 BEM.6 BEM.7 KIM.7 IDOJEL.0 POZ_EL.0 POZ_EL.1
; ; ; ; ; ; ; ;
ÜZEMMÓD gomb léptető gomb indítás leállítás működik időzítő jelzőbit ÜZEMMÓD pozitív váltása léptetés pozitív váltása
; xxxxxxx Bájtos változók területe xxxxxxx RSEG M_SZ: KESL_M: UT_J:
DS DS DS
VALT 2 2 1
; megszakítás számláló ; az aktuális késl. érték ; ütemjelző
; xxxxxxx STACK szegmens xxxxxxx RSEG DS
?STACK 10H
; STACK kezdete ; 16 bájtos STACK
; xxxxxxx Program szegmens xxxxxxx RSEG PROG USING 0 START:
LJMP
INIT
; 0-ás regiszterbank ; ugrás az inicializálásra
; ****** Megszakítás ugrótábla ****** ORG LJMP
START+0BH T0INT
; T0 megszakítás rutinra
; ****** Inicializálás ****** INIT:
MOV
SP,#?STACK-1 A,ACC R0,#BEM @R0,A R0 R0,#?STACK,T_ISM
; a változó memória törlés
T_ISM:
XRL MOV MOV INC CJNE MOV MOV
KESL_M,#HIGH VILL KESL_M+1,#LOW VILL
; a 0. ütem időzítése
ANL ORL MOV
TMOD,#0F0H TMOD,#2 TH0,#63
; A T0 2. üzemmódban ; 200 µs
125.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II SETB SETB SETB
TR0 ET0 EA
; megszakítás engedve
; ****** Fő programhurok ****** FOPR:
FOP:
FOP1:
CALL
BEOLV
; bemeneti memória frissítés
MOV ORL ANL MOV
C,INDIT C,MUK C,/ALL MUK,C
; a vezérlés engedélyezése
JC MOV
FUT UT_J,#0
; nem fut
JNB
U_MP,FOP
; ÜZEMMÓD váltás?
MOV MOV MOV
KIM,#0 KESL_M,#HIGH VILL KESL_M+1,#LOW VILL
; alaphelyzetbe ; a 0. ütem időzítés
CPL JNB CLR XRL
U_M ID_B,FOP1 ID_B KIM,#12H
; üzemmód váltás
JMP
VI_VEG
; sárga villog
; *** Az aktuális ütem vezérlése *** FUT:
MOV MOV MOVC ANL ORL
DPTR,#V_TAB A,UT_J A,@A+DPTR KIM,#80H KIM,A
; a kimeneti kombinációk
JNB
U_M,KEZI
JNB CLR
ID_B,VI_VEG ID_B
; időzítés vége?
INC MOV ADD JNZ MOV
UT_J A,UT_J A,#0FBH FUT_1 UT_J,#1
; következő ütem
FUT_1:
CALL JMP
IDOZ VI_VEG
; az új ütem időzítése
KEZI:
JNB
LEP_P,VI_VEG
INC MOV ADD JNZ MOV
UT_J A,UT_J A,#0FBH FUT_1 UT_J,#1
; az alsó hét bit módosítása
; 5. ütem? ; elölről
; következő ütem ; 5. ütem? ; elölről
126.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II
VI_VEG:
CALL
KIIR
JMP
FOPR
; kimenetek frissítése
127.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II ; ****** Szubrutinok ****** ; *** Az aktuális bemeneti értékek beolvasása a BEM –be és váltás meghatározása *** BEOLV:
MOV MOVX CPL
DPTR,#NGSOR A,@DPTR A
MOV XRL meghatározása ANL MOV
B,A A,BEM
KIIR:
; beolvasás a perifériáról ; új érték ; pozitív váltás
A,B POZ_EL,A
MOV RET
BEM,B
; az új érték tárolása
MOV MOV CPL MOVX RET
DPTR,#LEDSOR A,KIM A @DPTR,A
; a kimenti érték kivitele
;*** Az ütemidőket beállító rutin *** IDOZ:
MOV MOV
DPTR,#I_TABL A,UT_J
; ütemidő táblázat
RL PUSH MOVC MOV
A ACC A,@A+DPTR KESL_M,A
; szavas változó MSB
POP INC MOVC MOV RET
ACC A A,@A+DPTR KESL_M+1,A
;
;*** Megszakítás
rutin ***
T0INT:
T0I_1:
LSB érték
PUSH PUSH
ACC PSW
INC MOV JNZ INC
M_SZ+1 A,KESL+1 T0I_1 M_SZ
; a számtartalom növelése
SETB SUBB MOV SUBB JC
C A,KESL_M+1 A,M_SZ A,KESL_M T0I_2
; KESL = KESL_M ? ; lejárt a késleltetés?
SETB MOV MOV
ID_B KESL,#0 KESL+1,#0
; IGEN
128.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II
T0I_2:
POP POP RETI
PSW ACC
V_TAB:
DB
00,13H,21H,32H,0CH
I_TABL:
DW
VILL,FOID,VID,FOID,VID ; ütemidő táblázat
END
; a kimeneti kombinációk
; Fájl vége direktíva
129.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II
11. Függelék 11.1. Assembler direktívák 11.1.1.
Szimbólum definiáló direktívák:
EQU
A szimbólumhoz rendel egy értéket, vagy regiszter értéke később már nem változtatható. pl. HATAR EQU 1200
nevet. A szimbólum
SET
A szimbólumhoz úgy rendel értéket, vagy regisztert, hogy az újra definiálható. pl. TAR SET R0
DATA
A szimbólumhoz rendel egy direkt címezhető belső memória címet. pl. BEM1 DATA 20H
IDATA
A szimbólumhoz rendeli a csak indirekt címezhető belső memória egy címét. pl. OSSZEG IDATA 60H
XDATA
A szimbólumhoz rendeli egy külső memória címét. pl. TABL XDATA 100H
CODE
A szimbólumhoz rendeli a programmemória egy címét. pl. START CODE 00H
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ületen legyen, elh_tip a letöltés kezdetét határozza meg [ opcionális ]. Szegmens-típusok: CODE program memória, XDATA kü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. Elhelyezési típusok: PAGE lapkezdetre igazítás ( csak CODE és XDATA után ), INPAGE a szegmens csak egy lapon belül lehet (csak CODE és XDATA után), INBLOCK 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. 11.1.2. DS
Helyfoglaló, és inicializáló direktívák
adott számú összefüggő memóriaterületet foglal le (bármelyik memóriában), 130.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II pl. DBIT DB
[Címke:]
adott számú bitet foglal le pl. [Címke:]
DS
szám, vagy kifejezés
DBIT szám, vagy kifejezés
a programmemóriában ad kezdőértéket a felsorolt bájtoknak, használata: pl. [Címke:] DB szám[,kifejezés][,szimbólum]...
DW
a programmemóriában ad kezdőértéket a felsorolt szavaknak, használata: pl. [Címke:] DW szám[,kifejezés][,szimbólum]... 11.1.3. Modulok közötti kapcsolatok direktívái Feladatuk a különböző modulokban deklarált szimbólumok elérésének biztosítása. PUBLIC
a direktívával deklarált szimbólumok minden modulból elérhetők pl. PUBLIC Szimb[,Szimb[,....]]
EXTRN
egy másik modulban deklarált szimbólum elérését biztosítja a modulban. pl. EXTRN Szegm_tipus(Szimb_lista)
NAME
az egyes tárgy-modulok (object) megkülönböztetését teszi lehetővé. Ha nem adjuk meg, akkor a forrásállomány neve lesz az obj, fájl neve is. pl. NAME Tárgy_mod_név 11.1.4. Cím beállító és szegmens választó direktívák A direktívák segítségével adhatók meg programrészek, szegmensek kezdő címei, illetve választhatók már létező szegmensek. ORG
meghatározza a következő utasítás, vagy adat címét. pl. ORG 100H, ORG START
END
a forrásprogram végét jelzi (mindig kell használni).
RSEG
egy - már korábban definiált - relokálható szegmenst kiválaszt pl. 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 pl. CSEG [AT absz-cím] DSEG [AT absz-cím] XSEG [AT absz-cím] ISEG [AT absz-cím] BSEG [AT absz-cím] Amennyiben nincs cím, akkor a fordításnál szegmens 0 címen kezdődik. USING
az aktuális regiszterbankot választja ki. pl. USING sorsszám (a sorszám 0...3 lehet)
11.2. Fordítási parancsok 11.2.1.
Elsődleges parancsok:
DATE (rövidítve: DA) A lista minden oldalán a fejlécbe dátum írása. A dátum maximálisan 9 betűs lehet. MS-DOS szerinti írásmód pl. $ DATE (12/07/96)
131.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II 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, ha ne $ 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), ha nem $ NOEP OBJECT/NOOBJECT (rövidítve: OJ/NOOJ ) Parancs object fájl készítésére, vagy letiltására. Ha nem adunk meg nevet, akkor a forrásfájl nevén készül a fájl. Alapértelmezés: OBJECT (fájl_név.OBJ) pl. $ OBJECT (C:\XE2A51\PELDA1.OBJ), ha ne $ NOOJ PAGELENGHT (rövidítve: PL) A listázásnál egy lapra irt sorok számát határozza meg az utasítás után zárójelbe irt - 10-nél nagyobb - szám. Alapértelmezés: PL (68) pl.: $ PAGELENGHT (132), $ PL (75) PAGEWIDTH (rövidítve PW) A listázásnál egy sorba irt karakterek számát adja meg az zárójelbe irt - 8 és 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 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. $ PR(temp.lst), ha ne $ NOPR SYMBOLS/NOSYMBOLS (rövidítve: SB/NOSB ) Írjon, vagy ne írjon szimbólum táblázatot a lista végére. Alapértelmezés: SYMBOLS pl. $ SYMBOLS, ha ne $ NOSB MOD51/NOMOD51 (rövidítve: MO/NOMO) Az alapértelmezésben (MOD51) az assembler felismeri a 8051 kontroller regiszter és SFR szimbólumait. Amennyiben más típushoz készül a program, akkor a NOMOD51 parancsot kell megadni, és az alkalmazott kontroller szimbólumait tartalmazó un. include fájlt (pl.: REG552.INC) kell a program elején beolvastatni az INCLUDE másodlagos paranccsal. Alapértelmezés: MOD51 pl. $ NOMOD51 COND/NOCOND (rövidítés: nincs) A COND parancs hatására feltételes fordítás (IFELSEIF-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 macro - definíciókat. A NOMACRO –ra nem. Alapértelmezés: MACRO pl. $MACRO, $ NOMACRO REGISTERBANK/NOREGISTERBANK (rövidítve: 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 megszünteti a helyfoglalást. Alapértelmezés: REGISTERBANK(0)
132.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II pl.
$ REGISTERBANK (0,1), $ NORB
XREF/NOXREF (rövidítve: XR/NOXR) Készítsen, vagy ne keresztreferencia listát a szimbólumtáblázat után. 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 írni. Alapértelmezés: TITLE a fájl neve, vagy a 'NAME' paranccsal megadott név. pl. $ TITLE (modul meghatározás) 11.2.2. Másodlagos parancsok
EJECT (rövidítve: 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. 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 11.2.3. Feltételes fordítási parancsok 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 (ALT=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 133.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II $ ELSEIF(VALT2) 2.programrész $ ELSEIF (SWITCH=2) 3.programrész $ ENDIF 4.programrész END
A feltételes fordítási szerkezet lezáró parancsa. 11.3. A 8031/51 mikrokontroller család utasításai
A táblázatokban az egyes művelettípusok utasításainak szintaktikája, utasítások hossza bájtban, és az, hogy az utasítás végrehajtása hány oszcillátor periódusig tart. Az utóbbi adat alapján számolható ki az utasítási idő, ha ismert az oszcillátor frekvenciája. Adatmozgatás Utasítás 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
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 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
Aritmetikai műveletek 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
Utasítás ADD ADD ADD ADD ADDC ADDC ADDC ADDC SUBB SUBB SUBB SUBB INC INC INC INC INC DEC DEC DEC DEC MUL DIV DA
134.oldal
A, Rn A, direct A, @Ri A, #data A, Rn A, direct A, @Ri A, #data A, Rn A ,direct A, @Ri A, #data A Rn direct @Ri DPTR A Rn direct @Ri AB AB
Hossz 1 2 1 2 1 2 1 2 1 2 1 2 1 1 2 1 1 1 1 2 1 1 1 1
Oszcillátor periódus 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 24 12 12 12 12 48 48 12
Logikai műveletek
Vezérlésátadás
ANL ANL ANL ANL ANL ANL ORL ORL ORL ORL ORL ORL XRL
A, Rn A, direct A, @Ri A, #data direct, A direct, #data A, Rn A ,direct A, @Ri A, #data direct, A direct, #data A, Rn
1 2 1 2 2 3 1 2 1 2 2 3 1
Oszcillátor periódus 12 12 12 12 12 24 12 12 12 12 12 24 12
XRL XRL XRL XRL XRL CLR CPL
A, direct A, @Ri A, #data direct, A direct, #data A A
2 1 2 2 3 1 1
12 12 12 12 24 12 12
RL RLC RR RRC SWAP CLR CLR SETB SETB CPL CPL ANL ANL ORL ORL MOV MOV JC JNC JB JNB JBC
A A A A A C bit C bit C bit C,bit C,/bit C,bit C,/bit C,bit bit, C rel rel bit, rel bit, rel bit, rel
1 1 1 1 1 1 2 1 2 1 2 2 2 2 2 2 2 2 2 3 3 3
12 12 12 12 12 12 12 12 12 12 12 24 24 24 24 12 24 24 24 24 24 24
Utasítás
Hossz
Utasítás ACALL LCALL RET AJMP LJMP SJMP JMP JZ JNZ CJNE CJNE CJNE CJNE rel DJNZ DJNZ NOP RETI
addr11 addr16 addr11 addr16 rel rel rel A , direct, rel A, #data, rel Rn, #data, rel @Ri, #data, Rn, rel direct, rel
2 3 1 2 3 2 1 2 2 3 3 3 3
Oszcillátor periódus 24 24 24 24 24 24 24 24 24 24 24 24 24
3 3 1 1
24 24 12 12
Hossz
A flag -ket állító 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
1.oldal
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
Zalotay Péter: DIGITÁLIS TECHNIKA II 11.4. A szimulátor parancsainak részletes leírása A következőkben az egye menükön belüli alpontok jelentését tekintjük át. 11.4.1. File menü: A menüben indíthatók a különböző állományok olvasása, írása.
Intel hexa formátumú fájl betöltése. Bináris formátumú fájl betöltése. Szimbólum fájl betöltése. A szimbólumokat tartalmazó verem törlése _______________________________________________________________________________________________________________________________________________ _
A memória tartalmának Intel hexa formátumban, bináris formátumban fájlba írása ____________________________________________________________________________________________________________________________________________________________ ___
A bemeneti gerjesztéseket tartalmazó fájl betöltése A szimulációs eseményeket naplózó fájl megnyitása _______________________________________________________________________________________________________________________________________________
DOS parancs a programból való kilépés nélkül Kilépés a programból
91. ábra 11.4.2. Run menü: A menübeli parancsokkal indíthatók a programtesztelés különböző műveletei. A program lépésenkénti végrehajtása A szubrutinok egy lépésben való végrehajtása A program futtatása A program adott címére ugrása A újra indítása 92. ábra 11.4.3. View menü: A menü első két mezejében lehet kiválasztani azt a memóriaterületet, amelyen belül kívánunk tartalmat megtekinteni, vagy módosítani. A menüpont aktiválása után a kiválasztott területen, a legutoljára kiválasztott helyen villog cursor. Ettől a helytől kezdve módosíthatunk tartalmat. A harmadik mező egyes menüpontjait aktiválva a különböző memóriaterületeken deklarált szimbólumokat tekinthetjük meg. Az utolsó mezőben a kontroller és a környezet közötti kapcsolatot biztosító programok működését ellenőrizhetjük. Megadhatunk soros beolvasáshoz szöveget, kiírathatunk karaktereket, meghatározhatjuk a programrészek futási idejét, gépi ciklusainak számát. 136.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II
R0-R7 bankregiszterek Portok -
kiválasztása
_______________________________________________________________________________________________________________________________________________ _
A belső általános célú RAM Speciális funkciójú regiszterek - kiválasztása Külső adatmemória Program memória _______________________________________________________________________________________________________________________________________________ ___
A RAM- ban lévő Az SFR területen lévő A Bit területen lévő szimbólumok kijelzése A programban használt Az XDATA -n lévő _______________________________________________________________________________________________________________________________________________ ___________
Soros bemenetre küldött adatok Soros kimeneten megjelenő adatok Ciklusszám, futási idő megjelenítése 93. ábra 94. ábra A memóriaterület kiválasztása történhet a menüből, - pl. az External memory menüpontra kattintva - vagy a képernyő jobb alsó szegmensében az XData feliratra kattintva. Mindkét esetben a 95. ábra szerinti képet kapjuk. A konkrét címet ezután úgy is megkaphatjuk, hogy a ↓ gombbal görgetjük a mezőt a kívánt irányba. 95. ábra Sokkal gyorsabban jutunk célba, ha az egérrel rákattintunk a cím oszlopra. Ekkor megjelenik a kiválasztott memória szimbólumtáblája (96.a.ábra). Itt az adott szimbólumra (pl. NGSOR) kattintva, vagy a felső sorba beírva címet jutunk a kívánt memóriahelyre (b.ábra) és a változtatást végrehajthatjuk.
a.
b. 137.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II 96. ábra
11.4.4. Break menü: A menü parancsaival lehet a töréspontokat (breakpoint) kezelni, beírni, törölni, megjeleníteni. 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
97. ábra A töréspontok kezelése történhet a menüpontok szerinti parancsokkal. Az egér és a „forró” gombok használatával gyorsabban jutunk eredményre. Először kattintsunk az egérrel azon cím elé, ahova a töréspontot be akarjuk szúrni. Itt megjelenik egy M (merker) jel (98.a.ábra).
a. b. 98. ábra A bejelölés után üssük le a ctrl-B billentyű kombinációt. Hatására beíródik a töréspont (b.ábra). 11.4.5. Assemble menü A menü felső felében található pontok választásával módunk van rövid assembly „nyelvű” részprogramokat írni, programkódot visszafordítani mnemonic formátumra, vagy azt kinyomtatni. A menü második részében memóriatartalom átmásolása, illetve adott karakterrel történő kitöltésére. Assembly forráskód beírása Kódból visszafordított assembly forrás a képernyőre Kódból visszafordított assembly forrás a nyomtatóra Program memória átmozgatása Program memória feltöltése
99. ábra
138.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II A forráskód írásához (Assemble menüpont) csak nagyon leegyszerűsített editor áll rendelkezésre. Az alap írásjelek mellett csak a Space használható szóköz beiktatására. A 100. ábrán szemléltettük egy rövid program írását (a.ábra) és az Esc leütése után megjelenő képét (b.ábra).
a.
b. 100. ábra 11.4.6. Options menü: A menüben öt kontroller egyike választható. A második csoportban – a választott kontroller – egy-egy egység szimulációja választható. A harmadik csoportban esemény megjelenítés történhet.
Szimulálandó kontroller típus kiválasztása _______________________________________________________________________________________________________________________________________ ____
Kontroller RESET 80c552 Watchdog áramkörének engedélyezése 80c517 adatmutatójának beállítása a PE#SWDT láb beállítása A/D átalakító feszültségeinek megadása _______________________________________________________________________________________________________________________________________ ________
Portok naplózása a soros vonal bájtjainak ASCII alakja
101. ábra 11.4.7. Az Intel hex formátum A programozási gyakorlatban széles körűen alkalmazzák a különböző állományok Intel hex formátumban történő továbbítását. A következőkben – a teljesség igénye nélkül – összefoglaljuk a formátum legfontosabb jellemzőit.
139.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II Az Intel hex formátum a programnak csak a tényleges gépi kódú részét tartalmazza. Annak a memóriaterület amelynek tartalma 0, az nem szerepel az állományban. Az átviendő kódtartalmat rekordokba szervezik. Egy rekord változó hosszúságú lehet. A kódolás minden karakterre ASCII. A rekordban az első mező a rekordjelző mező (Record Mark Field). Ez egy kettőspont (:) kódjával jelzi a rekord kezdetét. A második mező a rekordhossz mező (Record Length Field). A mező két karaktere jelzi a rekordban lévő adatbájtok számát hexadecimálisan. (A magasabb helyértékű digit szerepel előbb.) Elvileg egy rekordban maximálisan 255 adatbájt lehet. A gyakorlatban jellemző, hogy az egy rekordban továbbított adatok számát 16-ra korlátozzák. A harmadik mező a betöltési cím mező (Load Address Field). A mező négy karakteres hexadecimális számmal adja meg betöltési kezdőcímet. A negyedik – két karakteres - mező a rekord típus mező (Record Type Field). Adatrekord esetén 00, fájlvége rekordnál 01. Az ötödik mező az adat mező (Data Field). Az adatok két karakteres hexadecimális számok. 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 komplemens - e. A rekordok száma a program hosszától függ. A fájl végét az előzőektől eltérő rekord jelzi A fájlvége (End Of File, EOF) rekordban nincsenek adatok. A rekordhossz jelző 00, a kezdőcím 0000, vagy a program tényleges kezdőcíme, a rekord típus 01 és az ellenőrző összeg FF. Az Intel hex 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 hex formátumra: :10200000455A5420455244454D455320564F4C5453 :0B201000204D454746454A54454E49C7 :00000001FF A leíráshoz kapcsolódva, az első sor mezői: 1.
2.
3.
4.
:
10
2000 00
5.
6.
455A5420455244454D455320564F4C54
53
Az első rekord tehát 16 adatot tartalmaz, amelyet a 2000H címtől kezdve kell letölteni és ellenőrző összege 53H.
140.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II 11.5. A monitor program A mikrogép programmemóriájában a 0000h címen kezdődik a monitorprogram. A tápfeszültség bekapcsolásakor, vagy a RESET gomb megnyomása után erről a címről indul a programfutás. Szoftverből is átadható erre a címre a futtatás. A monitorprogram részei: · Inicializálás. · Memóriakezelés. · Felhasználói program letöltés és futtatás. · Lépésenként történő felhasználói programfuttatás. · Perifériakezelés. 11.5.1. Inicializálás Az inicializálás a mikrokontroller reset-elésekor, vagy a program memória 0000h címére történő ugrás után történik. Az inicializáló rész: · · · · ·
törli a monitor program által használt XDATA memóriát (3E00h-3FFFh), törli a megszakítás kezelő regisztereket ( IE0,IE1,IP0,IP1), és alaphelyzetbe állítja a memóriába ágyazott perifériákat. inicializálja a soros portot, és sebességét 9600 Baud-ra állítja, végül a terminálon egy bejelentkező szöveg és a „ 552> ” promt jelzi az inicializálás befejezését (91.ábra ).
102. ábra 11.5.2. Memóriakezelés műveletei A H gomb (help) leütése tán a képernyőre is kiíródnak a parancsok, illetve a mikrogép memóriakiosztása (92. ábra).
141.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II
103. ábra Ø A memóriakiosztás A mikrogépben két 32 Kbájtos memóriatok van, egy EPROM és egy RAM. A memória kiválasztó dekóder segítségével négy 16 Kbájtos címtartományra oszlik a 64 Kbájtos teljes terület. Az ábrán azt mutatja, hogy az EPROM (CODE), illetve a RAM (DATA) egyes címtartományokban milyen vezérlőjeleket kap. A vezérlőjelek határozzák meg, hogy a területen milyen memóriaműveletet lehet végezni. Az első tartományban (0000H – 3FFFH) - az 51-es családra jellemzően - az EPROM a külső programmemória, a RAM pedig a külső adatmemória. A második területen (4000H – 7FFFH) csak a RAM érhető el, de az a PSEN vezérlőjelet is megkapja. Itt tehát mind program, mind adat tárolható, vagyis megfelel a Naumann filozófiának. A harmadik tartományban (8000H – 0BFFFH) csak EPROM –t lehet elérni. Program, vagy konstans tárolására alkalmas. A RD jel bevezetése lehetővé teszi a MOVX a,@DPTR utasítás használatát is. Ezáltal több lehetőség van tömbök (táblázatok) olvasására. Az utolsó címtartomány (0C000H – 0FFFFH) a memóriába ágyazott periféria illesztők részére használható. Ø A monitorprogram műveletei A monitorprogram egyes műveleteit a klaviaturán beadott egy betüs parancs és a megfelelő cím indítja. Az alábbi táblázatban foglaltuk össze az alkalmazható parancsokat és funkcióit. A program nem tesz különbséget kis és nagybetű között. Amennyiben a parancskészleten kívüli karaktert írunk be a „HELP ?” figyelmeztető szöveg jelenik meg. G U D M C F I H S
go from address Unassembler Display memory Modify memory Copy memory Fill memory Inputs monitoring Help Step from address
adott címtől történő programfuttatása Programkód visszafejtése Memóriaterület listáztatása Memória tartalom megváltoztatása Memóriaterület másolása Memóriaterület kitöltése Bemenetek folyamatos figyelése Segítség, felhasználói parancsok rövid összefoglalója Adott címtő történő lépésenkénti programfuttatás 142.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II Mindegyik művelet bejelentkezésekor egy segítő sor is megjelenik. Itt láthatók a műveleten belül használható parancsok. Az Esc vagy a Q mindig a műveletből való kilépést vezérli.
G - adott címtő történő programfuttatás
104. ábra A művelettel a programmemóriákban tárolt program futtatható. ·
A „G” billentyű lenyomása után be kell írnunk azt a memóriacímet – négy karakteres hexadecimális szám formájában (post-, vagy prefix nélkül) - ahol a programunk kezdő utasítása található.
·
Hibás beírást a BACKSPACE gomb segítségével korrigálhatjuk.
·
ESC gomb leütésével léphetünk vissza a főmenübe.
·
Az ENTER gomb megnyomását követően az ugrási parancs végrehajtódik, azaz a monitorprogram átadja a vezérlést az általunk előzőleg begépelt memóriacímen található programnak.
U - programkód visszafejtése
105. ábra A művelet a kódmemória tartalmát utasítás mnemonic-os alakra fejti vissza. ·
Az „U” billentyű lenyomása után be kell írnunk azt a kezdőcímet, melytől vissza szeretnénk fejteni a kódmemória tartalmát.
·
Az ENTER gomb megnyomását követően a képernyőn megjelenik az első visszafejtett sor.
D – memóriaterület listáztatás
106. ábra 143.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II A művelet a mikrokontroller memóriaterületeinek (DATA, XDATA, CODE és SFR) aktuális tartalmát jeleníti meg. · · · ·
A „D” billentyű lenyomása után a D, az X, a C vagy az S billentyű lenyomásával választhatjuk ki memóriaterületet. A memória terület kiválasztása után a program bekéri a listázandó memória kezdőcímét. A kiválasztott memóriaterület fél-laponként, azaz 128 byte-ként jelenik meg. Az SFR kiválasztásakor a cím helyett a regiszterek szimbólumait írja ki.
107. ábra M – memóriatartalom megváltoztatása
108. ábra A művelettel a kiválasztott memóriaterület tartalmát megváltoztathatjuk. · · · · ·
Az „M” billentyű lenyomása után a D, X vagy az S billentyű lenyomásával választjuk ki, hogy melyik memóriaterületen szeretnénk módosítani. A memória terület kiválasztása után a program bekéri módosítandó memória kezdőcímét. Kivétel, ha az SFR memóriaterületet módosítunk. Ekkor az SFR nevével, vagy a címével választhatunk. („SFR (NAME or ADDRESS):”.) Ezután a memória tartalmát megváltoztathatjuk bájtokként. Képernyőn megjelenik a módosításra kerülő bájt memóriacíme (SFR esetén a megnevezése is), a jelenlegi értéke, és a „New value:” szövegrész ahova írhatjuk az új értéket. A modosítás végrehajtása két módon nyugtázható: · Az ENTER billentyű leütésével beíródik az új érték, és a program felkínálja a következő című memóriahely módosítását. Amikor nem adunk új értéket, akkor a tartalom módosítás nélkül a következő memóriacímre ugrik a program. · A SPACE billentyű leütésével beíródik az új érték, de a program ugyanazon című memóriahely további módosítását kínálja fel.
144.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II
C – memóriaterület tartalmának másolása
109. ábra A művelet egy adott memóriaterületét másolhatja át egy másik memóriaterületre vagy terminálprogramon keresztül egy külső állományba. ·
A „C” billentyű lenyomása után a D, X vagy a C billentyű lenyomásával választhatjuk ki, melyik memóriaterületről szeretnénk másolni. · A memória terület kiválasztása után a program bekéri „forrásterület” kezdőcímét, majd a végcímét (A végcímként megadott byte is átmásolásra kerül.). Utána a D, X vagy a F billentyű lenyomásával választhatjuk ki, azt a memóriaterületet vagy állományt ahova másolni szeretnénk. · Ha memóriaterületre másolunk, akkor a program bekéri a „célterület” kezdőcímét. · Ha célterületként állományt választunk ki, akkor a program először a célállomány nevét kéri be, mely maximálisan 8+3 karakter hosszúságú lehet, majd a monitorprogram átadja a vezérlést a terminálprogramnak. Sikeres másolás esetén a monitorprogram „OK.” felirattal tér vissza a főmenübe. F – memóriaterület kitöltése
110. ábra A „Fill memory” parancs segítségével lehetőségünk nyílik adott memóriacímtől kezdődően a memóriaterületet egy adattal feltölteni. · · ·
Az „F” billentyű lenyomása után a D vagy az X billentyű lenyomásával választhatjuk ki, memóriaterületet. Utána a program bekéri „forrásterület” kezdőcímét, majd a végcímét (A végcímként megadott byte is módosításra kerül.). Végül meg kell adni kell feltöltő adat értékét.
145.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II I – bemenetek folyamatos figyelése
111. ábra A művelet egy kiválasztott port-, vagy analóg bemenet, illetve egy memóriába ágyazott bemeneti perifériára jutó jel értékét jeleníti meg folyamatosan. · · · · ·
Az „I” billentyű lenyomása után a P, A vagy az X billentyű lenyomásával választhatjuk ki, a folyamatosan figyelni kívánt bemenet-tipust. Port kiválasztásakor a program a következő szöveggel: „DISPLAY PORT WITH NUMBER (0-5):” kéri a port számát, majd megjelenik a bemeneti érték bináris és hexadecimális formában. Analóg bemenet választásakor, a következő sorban megjelennek az analóg bemenetek nevei, és alattuk az aktuális 10 bites értékük hexadecimális formában. Memóriába ágyazott periféria választásakor először kéri a periféria címét. Ezt követően jelenik meg a bemeneti érték bináris és hexadecimális formában. A kiválasztott bemenet értékének folyamatos kijelzése ESC vagy a Q billentyű lenyomásáig tart. Ennek hatására a program visszalép a főmenübe.
H – segítség, felhasználói parancsok rövid összefoglalója Az „H” billentyű lenyomása után a képernyőn egy táblázat jelenik meg, mely két fő részből tevődik össze. A táblázat bal oldalán a mikrokontrolleres gyakorló memória kiosztása találhatjuk meg, míg a táblázat jobb oldalán a főmenüben használható parancsok rövid összefoglalását olvashatjuk.
S - adott címtől lépésenkénti felhasználói programfuttatás
112. ábra A művelettel felhasználói programot futtathatunk lépésenként egy általunk megadott programmemória kezdőcíméről. Lépésenkénti programfuttatás esetén lehetőségünk van a memória teljes áttekintésére, megváltoztatására, végrehajtásra kerülő utasítások böngészésére, töréspont elhelyezésére. 146.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II ·
A „S” billentyű lenyomása után be kell írni a felhasználói program ellenörzésének kezdő címét. · Utána a monitorprogram a megadott címre ugrik és egy teljes képernyős felületet biztosít a felhasználó számára a lépésenkénti, illetve töréspontos futtatáshoz közbeni memória és periféria ellenörzésekhez. · A segítő sort követő sorban az ACC, B, DPTR regiszterek érvényes tartalmát bájtosan, míg a PSW regiszterét bitekre bontva jeleníti meg. · Az alatta lévő képernyőrész bal oldalán a futtatandó program utasításai láthatók, míg jobb oldalon R0 – R7 regiszterek, és a PC tartalma. · A képernyő alsó felében látható ablakban (Help) a bejelentkezéskor használható parancsok láthatók. Ezen a képernyőterületen van lehetőségünk megjelenítetni a memóriaterületeket. · A legalsó sorba kell megadni az egyes parancsok paramétereit. Lépésenkénti futtatás parancsai: BILLENTYŰ ENTER vagy N ESC vagy Q G S D X C M A U O W R H
ANGOL MEGNEVEZÉS Next step Quit Goto to address display SFRs display DATA memory display XDATA memory display CODE memory Modify memory „display memory” Address page Up memory page dOwn memory page doWn dissasembly Reset dissasembly address this Help
PARANCS LEÍRÁS Következő utasítás Vissza a főmenübe Memóriacímig történő futtatás SFR regiszterek tartalmának megjelenítése DATA memória tartalmának megjelenítése XDATA memória tartalmának megjelenítése CODE memória tartalmának megjelenítése Memóriaterület tartalmának megváltoztatása aktuális memóriaterület kezdőcímének megadás aktuális memóriaterület felfelé lapozása aktuális memóriaterület lefelé lapozása futtatandó program utasításainak felfelé lapozása futtatandó program utasításlistájának alaphelyzetbe állítása segítségablak megjelenítése
· Lépésenként (utasításokként) történő programvégrehajtás ENTER vagy N billentyű lenyomását követően a monitorprogram visszaadja a vezérlést a felhasználói programnak. Az éppen soron következő utasítás végrehajtása után ismét a monitorprogramhoz kerül a vezérlés. A képernyőn lévő adatok minden egyes lépés után frissítésre kerülnek. · Vissza a főmenübe ESC vagy Q (Quit) billentyű lenyomásával a felhasználói programfuttatás megszakad. A monitorprogram visszatér a főmenübe. · Memóriacímig – töréspontig - történő futtatás A lépésenkénti futtatás közben mód van egy megadott című utasításig (töréspont) folytonosan futtatni a felhasználói programot, majd innen folytatni az utasításonkénti működtetést. Ezt a G – Goto to address – parancs valósítja meg. ·
G billentyű lenyomása után be kell írni azt a címet ameddig a felhasználói programunkat folytonosan fusson. A törésponti cím elérésénél újból visszaveszi a vezérlést a monitorprogram.
Ha töréspont előtt meg szeretnénk szakítani a programunk futását, akkor ESC gomb megnyomásával bármikor visszakerülhetünk a monitorprogramba. 147.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II · Memóriaterületek aktuális tartalmának megjelenítése Minden lépés végrehajtása után megtekinthetőka a különböző memóriaterületekeken tárolt aktuális értékek. Igy ellenőrizhetőek, hogy a programunk valóban végrehajtja-e az esetleges módosításokat. Az S, D, X, C – display SFRs or DATA, XDATA, CODE memory – parancsokkal válkasztható ki a memóriaterület. · Memóriatartalom megváltoztatása Az M paranccsal hívott művelettel lehet a választott memória talmának módosítása. ·
M billentyű lenyomását követően a D, X, S, R vagy a P billentyű segítségével adhatjuk meg, hogy memóriaterületen lévő bájt tartalmát akarjuk megváltoztatni. Ezt követően kell megadni címet (SFR esetében a szimbólum is lehet, míg a bankregisztereknél a sorszámuk kell), majd az új értéket.
A képernyőn csak kisebb terület jeleníthető meg a vizsgált memóriából. A lapozást segítik a következő parancsok, amelyek csak kilistázott memóriaértékeknél hatásosak: Az A – paranccsal lehet megadni egy újabb kezdőcímtől történő listázást. Az U, O – parancsokkal aktuális memóriaterület felfelé vagy lefelé lapozása történik. A W – paranccsal a képernyő bal-felső részén látható programlistát lapozza Az R - paranccsal hívott művelet a programlistát állítja alaphelyzetbe. A H – parancs jeleníti a Segítő-ablakot. 11.5.3. Lépésenkénti futtatás feltételei. A monitorprogram software-s lépésenkénti futtatást alkalmaz, mivel a 80C552 mikrokontroller nem rendelkezik hardware-s töréspont funkcióval. A program a mikrokontroller soros megszakítását használja a lépésenkénti futtatás lebonyolítására. Ebből adódóan a felhasználó által írt programot csak alábbi megkötések teljesülésekor végez a monitorprogram lépésenkénti futtatást. A tesztelt felhasználói program: 1. nem módosítja a soros vonal inicializálását, 2. nem használja a hármas számú registerbank-ot, illetve az XDATA memória 3E00 – 3FFF területét, 3. a relokálható szegmens-megadásoknál a verem (stack) a bank regiszterek és a használt belső memória feletti címen kezdődjön. Mivel a lépésenkénti ellenőrzés megszakításos működtetéssel történik, ezért megszakításokat is használó programok valós idejű tesztelése ily módon nem ajánlott 11.5.4. Memóriatartalom letöltése a mikrokontrollerbe Memóriarész letöltése a mikrokontrollerbe a monitorprogram és a terminálprogram együttműködésével történik. Letöltéshez használt protokoll INTEL HEXA adatformátumon alapul. A letöltés „handshaking”, azaz kézfogásos kommunikációval történik. A terminálprogram leküld a monitorprogramnak egy teljes INTEL HEXA sort (kezdő „:” karakterrel együtt). A monitorprogram értelmezi a beérkezett sor, majd visszaválaszol a terminálprogramnak. Három féle válasz lehetséges: 148.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II ·
„O” karakter: minden rendben, a monitorprogram késszen áll a következő sor vételére (OK.).
·
„E” karakter: LRC (longitudinal redundancy check – hosszirányúredundancia ellenőrzés) hiba.
·
„T” karakter: Ismeretlen rekord típus.
Mind a három válaszkarakter után a monitorprogram készen áll a következő sor vételére. Kivételt jelenet ez alól az „állomány vége” típusú rekordot, mely után a monitorprogram „OK.” kiírással visszalép a főmenübe. Fontos még megjegyezni, hogy a főmenüben történő „:” karakter lenyomását a monitorprogram letöltési procedúra kezdetének értelmezi. Ebben az esetbe a felhasználó számára, visszajelzés hiányában, úgy tűnhet, hogy megállt reagálni a monitorprogram. 11.5.5. Memóriatartalom küldése a terminálprogramnak A monitorprogram adat küldési protokoll segítésével teszi lehetővé, hogy egy memóriaterületet le lehessen menteni számítógépen keresztül háttértárolóra. Ezt a lehetőséget a „Copy memory” parancs biztosítja a felhasználó számára. Az adatküldési protokoll egyoldalú, az-az nincs visszajelzés a terminálprogram oldaláról, hogy sikeres volt az adatfogadás vagy nem. Az adatküldési protokoll kimondottan oktatási célra lett kifejlesztve. A protokoll egyszerűsége végett könnyű a protokollt lekezelő program elkészítése, de pont a protokoll könnyűsége miatt zajérzékeny. Feltételezve, hogy a monitorprogram oktatási intézményben kerül felhasználásra, ezért a zajból keletkezett hibák szinte kizárhatók. Sebesség problémák fellépésétől is nyugodtan el tekinthetünk, hisz a fogadó oldalon lévő PC sebessége többszöröse a küldő oldalon szereplő mikrokontroller sebességének. A protokollt két részre bontható. Az első rész definiálja az adtafolyam típusát, majd a második rész a küldeni kívánt adatokat tartalmazza. Az protokoll egy ESC (¬), azaz 1Bh sorszámú ASCII karakterrel kezdődik, majd egy nagy „S” betűvel folytatódik. E két karakter jelzi, a terminálprogramnak, hogy adat letöltés fog következni. Második rész az állománynév megadására szolgál. Idézőjelek (22h ASCII számú karakter) közé beszúrva áll módunkban megadni a terminálprogramnak, hogy milyen állománynévvel történjen az adatfolyamunk mentése. Az állománynév megadása nem kötelező, csak választható opció. Következő mező az adatfolyam típusát tartalmazza. Két adatfolyam típust definiál a protokoll: ·
·
„B” – Byte – Az adatfolyam bármilyen karaktert tartalmazhat, nincs kiemelt stop karakter. Az adatfolyam hosszúságát közvetlenül a „B” karakter után kell megadni, melyet „H” karakterrel lezárt ASCII karakterből álló hexadecimális számsor határozza meg. „T” – Text – Az adatfolyamnak nincs előre definiált hossza. Az adatok végét egy EOT (End Of Text), azaz 04h karakter jelzi.
Példák: · Előre nem definiált adathossz mentése proba.txt állományba: S”proba.txt”T · 32 byte hosszúságú adattömb fejléce. Mentés proba2.txt állományba.: S”proba2.txt”B20H 149.oldal
Zalotay Péter: DIGITÁLIS TECHNIKA II · Előre nem definiált adathossz. Állománynév nincs megadva.: ST · 128 byte hosszúságú adattömb fejléce. Állománynév nincs megadva.: ¬SB80H A fejléc elküldése után a terminálprogram visszaválaszol a kérésre. Két válaszlehetőség lehetséges: · „O” – Minden rendben, jöhetnek az adatok. · „C” – A felhasználó visszautasította a kérést. Nem lehet adatokat menteni. Pozitív válaszadás esetén a terminálprogram készen áll az adatsor fogadására, a mikrokontroller által küldött adatok mentésre kerülnek a háttértárolóra.
150.oldal