Mcs-51 mikrokontrolleres kártya programozása Leírás és minta feladatok 2005. 10. 14 G.I. MCS-51 programozása
MCS-51 kártya Címzései A 0000h-FFFFh címtartomány kiosztása: 0000h-tól 7FFFh-ig flash adatmemória (IC 13) írás/olvasás 8000h-tól 8FFFh-ig LCD utasítás írás 9000h-tól 9FFFh-ig LCD adat írás A000h-tól AFFF-ig LCD címszámláló és busy flag olvasás B000h-tól BFFFh-ig LCD adat olvasás C000h-tól FFFFh-ig laplatch (IC 11) írás 2005. 10. 14 G.I. MCS-51 programozása
Címző jelek 2005. 10. 14 G.I. MCS-51 programozása
2. Fejlesztőrendszer 2.1. Programok - Fordító (Assembler) ASM51.exe - Hexa-bináris konverter Ash2hex.exe - Letöltő ispdos.exe 2.2. Assembler MetaLink Corporation ASM51 keresztassemblerének az 1.2h változatát használjuk, mely letölthető az Atmel honlapjáról [6]. 2005. 10. 14 G.I. MCS-51 programozása
2.3. Szimbólumok A szimbólumok alfanumerikus reprezentációi a numerikus konstansoknak, címeknek, makróknak, stb. Egy szimbólum maximum 255 karakterből állhat; felhasználhatók: az angol ábécé kis- és nagybetűi A-tól Z-ig. A kis- és nagybetűk egyenértékűek, pl.: ABCD, abcd, AbCd ugyanazt a szimbólumot jelenti számjegyek 0-tól 9-ig speciális karakterek: ? (kérdőjel), _ (aláhúzás jel) A következő szabályokat kell betartani: a szimbólumok csak egyszer definiálhatók az első karakter nem lehet számjegy az első 32 karakter szignifikáns, ezért egyedinek kell lennie Pl.: PI, Soros_Port_Puffer, ?_?_ 2005. 10. 14 G.I. MCS-51 programozása
Fenntartott szimbólumok az utasítás mnemonikok, az assembler direktívák, a bennfoglalt (implicit) operandus szimbólumok: A, AB, C, DPTR, PC, R0, R1, R2, R3, R4, R5, R6, R7, AR0, AR1, AR2, AR3, AR4, AR5, AR6 és AR7 és az operátorok alfanumerikus szimbólumai: EQ, NE, GT, GE, LT, LE, HIGH, LOW, MOD, SHR, SHL, NOT, AND, OR és XOR. 2005. 10. 14 G.I. MCS-51 programozása
2.4. Címkék START: MOV A,#43h ; címke <= assembly utasítás címe SZAMJEGYEK: DB 0,1,2,3,4,5,6,7 ; címke <= adattárolás kezdőcíme SZOVEG: DB ’Szia’ ; címke <= adattárolás kezdőcíme VALTOZO: DS 10 ; címke <= adat helyfoglalás kezdőcíme BIT_ VALTOZO: DBIT 16 ; címke <= adat helyfoglalás kezdőcíme 2005. 10. 14 G.I. MCS-51 programozása
Számok 2005. 10. 14 G.I. MCS-51 programozása
Bináris operátorok (operátor = a művelet kódja). Kifejezések tagjai lehetnek: - számok, pl.: 5, 0B5h, 1001b - felhasználó által definiált szimbólumok - zárójelek közé tett kifejezések, pl.: (A*(B+C)), -(A+B) - unáris operátor, amit szimbólum, vagy szám követ, pl.: -5, -PUFFER - ASCII karakter egyes idézőjelek között (az ASCII kódjával számol), pl.: ’k’, ’H’, ’b’, ’B’ - Példák kifejezésekre: (0D0h+1)/'j', (URES+PUFFER)/'a', -'a' XOR 2 2005. 10. 14 G.I. MCS-51 programozása
A használható operátorok 1. csökkenő prioritás szerint rendezve ( ) ; zárójelek között lévő kifejezés HIGH, LOW ; a szó felső bájtja (8 bit), alsó bájtja (8 bit) *, /, MOD, SHR, SHL ; szorzás, egész osztás, léptetés (shiftelés) +,- ; összeadás, kivonás (2-es komplemens) = EQ, < LT, > GT, <= LE, >= GE, <> NE ; relációs műveletek NOT ; logikai NEM (1-es komplemens) AND ; logikai ÉS OR, XOR ; logikai VAGY, KIZÁRÓ VAGY Ahol: EQ az egyenlő, LT a kisebb, GT a nagyobb, LE a kisebb vagy egyenlő, GE a nagyobb vagy egyenlő és NE a nem egyenlő művelet szimbóluma. Pl.: (következő 2 kép) 2005. 10. 14 G.I. MCS-51 programozása
A használható operátorok 2. csökkenő prioritás szerint rendezve HIGH (0ABCDh) ; értéke: 0ABh LOW (0ABCDh) ; értéke: 0CDh 7*3 ; értéke: 21 7/3 ; értéke: 2(hányados) 7 MOD 3 ; értéke: 1 (maradék) 1000b SHR 3 ; értéke: 0001b 1010b SHL 3 ; értéke: 1010000b 15+3 ; értéke: 18 +23 ; értéke: 23 23-12 ; értéke: 11 2005. 10. 14 G.I. MCS-51 programozása
A használható operátorok 3. csökkenő prioritás szerint rendezve -1 ; értéke: 1111111111111111b NOT 1 ; értéke: 1111111111111110b 8 EQ 3, 8 = 3 ; értéke: 0 8 LT 3, 8 < 3 ; értéke: 0 8 GT 3, 8 > 3 ; értéke: 0FFFFh 8 LE 3, 8 <= 3 ; értéke: 0 8 GE 3, 8>= 3 ; értéke: 0FFFFh 8 NE 3, 8 <> 3 ; értéke: 0FFFFh 1010b AND 1101b ; értéke: 1000b 1100b OR 1001b ; értéke: 1101b 1010b XOR 1101b ; értéke: 0111b 2005. 10. 14 G.I. MCS-51 programozása
ASCII karakterek MOV A,#’n’ ; A <= 6Eh (n ASCII kódja) STRING: DB ’Szia 8051’ ; 537A69612038303531h kerül a memóriába 2005. 10. 14 G.I. MCS-51 programozása
Bitcímzés A bitcímezhető regiszterek, memóriarekeszek (és a hozzájuk rendelt szimbólumok) egyes bitjeinek a jelölésére pontot ( . ) használunk, pl.: az akkumulátor nulladik (LSB) bitjének a jelölése: ACC.0, a 88h regiszter 2. bitjének a jelölése: 88h.2 2005. 10. 14 G.I. MCS-51 programozása
Utasítás-számláló Az utasítás-számláló aktuális értékének a jelölésére a $ jelet használjuk, pl.: JMP $ ; ugrás önmagára (dinamikus stop) JNB FLAG,$ ; ugrás önmagára ha FLAG = 0 A JMP $ utasítás dinamikus stop, mivel innen továbbmenni csak megszakítással lehet. Biztosítani kell, hogy bármely módon (sorfolytonos lépéssel, vagy ugrással) ráfutva legyen engedélyezett megszakítás, és legyen megszakítás ok is. 2005. 10. 14 G.I. MCS-51 programozása
Utasításkészlet [<címke:>] <mnemonik> [<operand1>] [,<operand2>] [,<operand3>] [;<kommentár>] 2005. 10. 14 G.I. MCS-51 programozása
Az operandusok megadásának formája lehet (1): azonnali adat (immediate data), az utasítás az adatot tartalmazza, amellyel műveletet kell végezni; ezt az operandus elé tett # jelzi, pl.: - MOV A,#23h ; A legyen 23h - MOV A,#’n’ ; A legyen n ASCII kódja címzés, az utasítás egy tárolócella címét tartalmazza. Alapvetően két fajta címzés van: direkt címzés, az utasítás annak a tárolócellának a címét tartalmazza, amelyikben az adat van, pl.: - MOV A,23h ; A legyen a 23h című rekesz tartalma (direkt címzés) - MOV A,R2 ; A legyen az R2 regiszter tartalma (regisztercímzés) 2005. 10. 14 G.I. MCS-51 programozása
Az operandusok megadásának formája lehet (2): indirekt címzés, az utasítás annak a tárolócellának a címét tartalmazza, amelyikben az adat címe van; ezt az operandus elé tett @ jelzi, pl.: - MOV A,@R0 ; az adat címe az R0 regiszterben van (indirekt címzés) - MOVC A,@A+DPTR ; az adat címe az A és a DPTR összege (indirekt regiszter címzés) 2005. 10. 14 G.I. MCS-51 programozása
Assembler direktívák <szimbólum> DIREKTÍVA <operandus1> [<,operandus2>]… [;<kommentár>] 2005. 10. 14 G.I. MCS-51 programozása
A leggyakrabban használt direktívák (1) EQU (EQUate = egyenlővé tesz), a szimbólumhoz rendel egy értéket vagy regiszter nevet. A szimbólum értéke később nem változtatható meg. Általános alakja: <szimbólum> EQU <operandus> [;<kommentár>] Az operandus lehet szám, aritmetikai kifejezés, előzőleg definiált szimbólum vagy implicit (bennfoglalt) operandus szimbólum (pl.: A, B, R0, R1, … R7, stb.), pl.: TIZ EQU 10 ; szimbólum <= szám (10) MAS_TIZ EQU TIZ ; szimbólum <= előzőleg definiált szimbólum (10) TIZENEGY EQU TIZ+1 ; szimbólum <= aritmetikai kifejezés (11) SZAMLALO EQU R7 ; felhasználói szimbólum definiálása egy implicit szimbólumhoz (R7 regiszter) A_REG EQU A ; felhasználói szimbólum definiálása az akkumulátorhoz ASCII_G EQU ’G’ ; szimbólum <= karakter ASCII kódja 2005. 10. 14 G.I. MCS-51 programozása
A leggyakrabban használt direktívák (2) SET (beállít), a szimbólumhoz rendel egy értéket vagy regiszter nevet. A szimbólum értéke később újradefiniálható, pl.: SZAM SET 10 ; szimbólum <= szám (10) SZAM SET 11 ; szimbólum <= szám (11) SZAM SET SZAM+1 ; szimbólum <= aritmetikai kifejezés (12) 2005. 10. 14 G.I. MCS-51 programozása
A leggyakrabban használt direktívák (3) DATA (adat), a szimbólumhoz rendel egy direkt címezhető belső adatmemória címet Általános alakja: <szimbólum> DATA <operandus> [;<kommentár>] Az operandus lehet szám, aritmetikai kifejezés, előzőleg definiált szimbólum. Értéke 0 és 255 között kell, hogy legyen; 0-tól 127-ig a belső adatmemória bájtjaihoz, míg 128 és 255 között az SFR regiszterekhez rendelhető szimbólum, pl.: PSW DATA 0D0h ; a PSW (Program Status Word) címe PUFFER DATA 32 ; belső adatmemória cím URES DATA PUFFER+16 ; aritmetikai kifejezés 2005. 10. 14 G.I. MCS-51 programozása
A leggyakrabban használt direktívák (4) IDATA, a szimbólumhoz rendel egy indirekt címezhető belső adatmemória címet Általános alakja: <szimbólum> IDATA <operandus> [;<kommentár>] Az operandus lehet szám, aritmetikai kifejezés, előzőleg definiált szimbólum; értéke 0 és 255 között kell, hogy legyen, pl.: CIM IDATA 60h ; belső adatmemória cím CIM_2 IDATA INDIR+20h ; aritmetikai kifejezés 2005. 10. 14 G.I. MCS-51 programozása
A leggyakrabban használt direktívák (5) XDATA, a szimbólumhoz rendeli a külső adatmemória egy címét Általános alakja: <szimbólum> XDATA <operandus> [;<kommentár>] Az operandus lehet szám, aritmetikai kifejezés, előzőleg definiált szimbólum; értéke 0 és 65535 között kell, hogy legyen, pl.: TABLA XDATA 400h ; külső adatmemória egy címe TABLA_2 XDATA TABLA+4Fh ; aritmetikai kifejezés 2005. 10. 14 G.I. MCS-51 programozása
A leggyakrabban használt direktívák (6) BIT, a szimbólumhoz rendel egy bitcímezhető belső adatmemória címet Általános alakja: <szimbólum> BIT <operandus> [;<kommentár>] Az operandus lehet szám, aritmetikai kifejezés, előzőleg definiált szimbólum. Értéke 0 és 255 között kell, hogy legyen; 0-tól 127-ig a belső adatmemória bitcímezhető bitjeihez, míg 128 és 255 között a bitcímezhető SFR regiszterek bitjeihez rendel szimbólumot, pl.: CF BIT 0DFh ; CF, a Carry Flag bit a PSW-ben FLAG_ON BIT 0Dh ; bitcímezhető bit a belső adatmemóriában FLAG_OFF BIT FLAG_ON+1 ; a következő bit a belső adatmemóriában 2005. 10. 14 G.I. MCS-51 programozása
Bitcímezhető belső adatmemória a 20h-2Fh címterületen van, pl. a 0Dh című bit a 21h című rekesznek (bájt) az 5. bitje, melyre kétféleképpen lehet hivatkozni: 0Dh vagy 21h.5. Azok az SFR regiszterek bitcímezhetők, melyeknek hexadecimális címe 0-ra vagy 8-ra végződik, pl.: SCON regiszter, melynek a címe 98h; akkumulátor, melynek a címe E0h. 2005. 10. 14 G.I. MCS-51 programozása
DB (define byte), Bájt konstansot tárol a program-memóriában Általános alakja: [<címke>:] DB [<operandus1>][,<operandus2>]… [;<kommentár>] Az operandusok bájt konstansok; lehetnek számok, aritmetikai kifejezések, szimbólumok értékei, karakterek egyes idézőjelek ( ’ ) között (az ASCII kódjuk kerül tárolásra), pl.: SZOVEG: DB ‘Hello! Te ki vagy?’ ; a karakterek ASCII kódja lesz tárolva SZAMOK: DB 112, 25q, 67h, 3/5 ; számok és aritmetikai kifejezések DB 2*5, 63q, 0DFh ; a címke opcionális VEGYES: DB 56, ‘Szia’, 2/7 ; karakterek és számok vegyesen 2005. 10. 14 G.I. MCS-51 programozása
DW (define word) Szó (2 bájt) konstansot tárol a program-memóriában Általános alakja: [<címke>:] DW [<operandus1>][,<operandus2>]… [;<kommentár>] UGRO_TABLA: DW START, RESET, LOOP ; címek DW TRUE, FALSE ; a címke opcionális ALAPSZAM: DW ’G’, 4000h ; 1. bájt 0, 2. bájt 47h (G) ; 3. bájt 40h, 4. bájt 00h 2005. 10. 14 G.I. MCS-51 programozása
ORG Meghatározza a következő utasítás, vagy adat címét Általános alakja: ORG <operandus> [;<kommentár>] A operandus lehet szám, aritmetikai kifejezés, vagy előzőleg definiált kifejezés, pl.: ORG 4000h ; a következő bájt a 4000h címre lesz elhelyezve ORG RESET+100h ; kifejezés egy előzőleg definiált szimbólummal 2005. 10. 14 G.I. MCS-51 programozása
USING Az aktív regiszterbankot jelöli ki a négy (0- tól 3-ig) bank közül, pl.: USING 0 ; a 0 regiszter bank lesz aktív USING 1+2 ; aritmetikai kifejezés Használhatók - AR0-tól AR7-ig - az előre definiált regiszter szimbólumok, melyek az aktuális regiszterbank - R0-tól R7-ig - regisztereinek direkt címei, pl.: USING 2 ; AR0 <= 10h, AR1 <= 11h,… AR7 <= 17h Olyan utasításoknál használjuk ezeket a szimbólumokat, amelyekben nem használható regisztercímzés, csak direkt címzés. 2005. 10. 14 G.I. MCS-51 programozása
END A forrásprogram végét jelzi a fordítónak, pl.: END ; forrásprogram vége Minden forrásprogram egy és csakis egy END direktívát tartalmaz 2005. 10. 14 G.I. MCS-51 programozása
CODE A szimbólumhoz rendeli a programmemória egy címét CSEG (kód), DSEG (direkt belső adat), XSEG (külső adat), ISEG (indirekt belső adat), BSEG (bit), szegmensek kezdőcímét lehet megadni, illetve választhatók már létező szegmensek A fordító – inicializáláskor - nullára állítja a szegmensek címét, és aktuális szegmensként az alapértelmezett programmemória szegmenst (CSEG) választja ki. DS, az aktív szegmensben adott számú bájtot foglal le DBIT, a bitszegmensben adott számú bitet foglal le IF, ELSE, ENDIF feltételes fordítási szerkezetet hoz létre 2005. 10. 14 G.I. MCS-51 programozása
Fordítási parancsok (1) A leggyakrabban használt elsődleges parancsok $DATE (hh/nn/éé), hatására a dátum bekerül a listafájl minden oldalára, pl.: $DATE (04/26/03) ; 2003. április 26. $TITLE (string), hatására a string bekerül a listafájl minden oldalára, pl.: $TITLE (Ez egy keretprogram) ; szöveg szerepeltetése $SYMBOLS/$NOSYMBOLS, hatására készül/nem készül szimbólumtáblázat a listafájl végén. Alapértelmezett a $SYMBOLS. 2005. 10. 14 G.I. MCS-51 programozása
Fordítási parancsok (2) A leggyakrabban használt elsődleges parancsok $MOD51/$MOD52/$MOD515, … /$NOMOD, hatására az assembler felismeri az adott mikrokontroller SFR regiszter szimbólumait. Ha a mikrokontrollerhez nincs MODxx fájl (pl. AT89S8252) akkor használjuk a $NOMOD parancsot (alapértelmezett). Ilyen esetben az $INCLUDE (file) másodlagos paranccsal beilleszthetjük az általunk elkészített SFR regiszter deklarációs fájlt. $DEBUG (file) /$NODEBUG, hatására a szimbólumok bekerülnek a tárgyprogramba, a szimulátor is megjeleníti őket. Alapértelmezett a $NODEBUG. $OBJECT (file) /$NOBJECT, megválasztható a tárgyprogram típusa, alapértelmezett típus az Intel hexa fájl ( $OBJECT (source.hex)). 2005. 10. 14 G.I. MCS-51 programozása
Fordítási parancsok (3) Általános (másodlagos) parancsok: $LIST/$NOLIST, hatására az utána következő rész listázásra kerül/nem kerül a listafájlban. $INCLUDE (file), hatására az adott helyre beszerkeszti a forrásprogramba a megadott fájlt (ami lehet deklarációs fájl, a forrásprogram egy része, rutingyűjtemény), pl.: $INCLUDE (A:\RUTINOK.INC) ; a RUTINOK.INC fájl beszerkesztése 2005. 10. 14 G.I. MCS-51 programozása
Forrásprogram Minden utasítás kódja egy bájtos, melyet a fordító az utasítás mnemonikjából generál. Ha az utasításhoz tartozik operandus is akkor, először kiértékeli (pl.: elvégzi a műveleteket, kikeresi a karakter ASCII kódját, stb.) és a kapott értéket a kód után helyezi el (1-2 bájt). Így egy gépi kódú utasítás a program-memóriában 1-3 bájt helyet foglal el, pl.: MOV A,#’n’ ; 746Eh kerül a programmemóriába (74h a MOV A utasítás kódja, 6Eh az n karakter ASCII kódja) 2005. 10. 14 G.I. MCS-51 programozása
Listafájl A fordító egy listafájlt (kiterjesztése LST) is készít, mely - négy oszlopba foglalva - a következőket tartalmazza: programmemória címe, ahol a következő oszlopban levő bájt (ha több bájt van egy sorban, akkor az első bájt) tárolásra kerül generált tárgykód bájt(ok) forrásszövegen belüli sorszám forráskód kommentárral együtt Ezután található a szimbólumtáblázat ($NOSYMBOL parancsra nem készít), mely tartalmazza az előforduló szimbólumok nevét, típusát, értékét. 2005. 10. 14 G.I. MCS-51 programozása
Tárgyprogram A fordító gépi kódú tárgyprogramot készít, mely szabványos Intel hexa formátumú. Az alapértelmezett beállítás szerint a fájl neve megegyezik a forrásprogram nevével, kiterjesztése HEX lesz, pl.: ASM51 PROG.ASM, a PROG.ASM forrásprogramot lefordítja PROG.HEX tárgyprogrammá. Ez – ha a letöltő programunk támogatja - már letölthető a program-memóriába. Ha letöltőnk nem támogatja az Intel hexa formátumot, akkor a program a hexa-bin konverterrel bináris formátumra konvertálható. 2005. 10. 14 G.I. MCS-51 programozása
ISP programozás A letöltő kábel és az interface 2005. 10. 14 G.I. MCS-51 programozása
ISP programozás Az interfész leválasztó puffer áramköröket tartalmaz és előállítja a programozáshoz szükséges vezérlő jeleket; segítségükkel megoldható az SPI eszközök áramkörbeli programozása, az áramkörből való eltávolításuk nélkül. Az interfész az SPI protokolltól független RESET és ENABLE vezérlőjeleket is előállítja. A RESET jel tartja reset állapotban az eszközt, ha ez szükséges a kommunikációhoz. Az AT89S8252 programozásához a RESET jelnek magas szintűnek kell lenni. Az ENABLE jel alacsony szintje engedélyezi az interfész működését, így az interfész kommunikálhat az SPI eszközzel, míg magas szintje az interfész kimeneteit tri-state állapotba hozza, így az interfész nem befolyásolja a céláramkör működését. Az interfész egy SUB-D 25 csatlakozókkal szerelt hosszabbító kábellel csatlakoztatható a PC párhuzamos portjához. A +5V ±10% tápfeszültséget a céláramkör biztosítja. 2005. 10. 14 G.I. MCS-51 programozása
Az interfész SUB-D 9 csatlakozójának kiosztása: A bekötés 2005. 10. 14 G.I. MCS-51 programozása
A letöltő-program kapcsolói 2005. 10. 14 G.I. MCS-51 programozása
Forrásprogram A forrásprogram a következő jól elkülöníthető részekből épül fel: fordítási parancsok megszakítási (IT) vektortábla deklarációk alprogramok (szubrutinok) főprogram 2005. 10. 14 G.I. MCS-51 programozása
Fordítási parancsok A forrásprogram az elsődleges fordítási parancsokkal kezdődik, melyek csak a program elején állhatnak; előttük legfeljebb kommentár lehet. Ezután tetszőleges sorrendben következnek az általános fordítási parancsok, melyek többször is használhatók, és a program bármely részén elhelyezhetők. 2005. 10. 14 G.I. MCS-51 programozása
Megszakítási vektortábla A vektortábla feltöltése a programmemória címének a kijelölésével (ORG direktíva) kezdődik. Az ezt követő utasítások az ORG direktívában megadott címtől kezdődően lesznek elhelyezve a program-memóriában, pl.: ORG 0000h ; az utána következő utasítás a 0000h címre van elhelyezve LJMP Main ; a főprogram kezdőcíme ORG 0023h ; az utána következő utasítás a 0023h címre van elhelyezve LJMP Serial_IT ; a soros port megszakítását kiszolgáló IT szubrutin kezdőcíme Természetesen, ha valamelyik megszakításra nincs szükségünk az IT vektortáblában sem kell feltüntetni. Célszerű a nem használt IT címekről egy közös „hamis IT-t lekezelő” hibát jelző alprogramra ugrani, hogy ne lehessen ezen okból (nem definiált IT ok kialakulása) a programot teljesen „fejreállítani”. Ilyenkor ugyanis csak a reset segítene. 2005. 10. 14 G.I. MCS-51 programozása
Deklarációk A vektortábla után általában egy deklarációs rész következik, melyben: szimbólumokat deklarálunk és inicializálunk az EQU és SET direktívákkal szimbolikus neveket rendelünk a belső adatmemória címeihez és az SFR regiszterekhez a DATA, IDATA, XDATA és BIT direktívákkal memória területeket foglalunk le és inicializálunk a DB, DW, DS, DBIT direktívákkal előre elkészített állományokat töltünk be az $INCLUDE paranccsal 2005. 10. 14 G.I. MCS-51 programozása
Alprogramok Az alprogramok egy címkével kezdődnek. Meghívni őket az ACALL, LCALL utasításokkal lehet, melynek hatására: az utasítás-számláló (PC = program counter) pillanatnyi értéke (a következő utasítás kezdőcíme) a verembe mentődik a szubrutin kezdőcíme (címke) betöltődik a programszámlálóba; az utasítások végrehajtása ezen a címen folytatódik A szubrutint a RET utasítással kell lezárni, melynek hatására: az utasítás-számláló - veremben eltárolt - értéke visszatöltődik; folytatódik a program végrehajtása a CALL utasítást közvetlenül követő utasítással 2005. 10. 14 G.I. MCS-51 programozása
(IT) alprogramok Megszakítási kérelem érvényre jutásakor kerülnek meghívásra, melynek hatására: az utasítás-számláló (PC = Program Counter) pillanatnyi értéke (a nem végrehajtott – ami helyett az IT szubrutin van – utasítás kezdőcíme) a verembe mentődik a megszakítás-forráshoz rendelt cím betöltődik a programszámlálóba; az utasítások végrehajtása ezen a címen folytatódik Az IT szubrutin végén kötelezően a RETI utasítás áll, melynek hatására: a megszakítás-vezérlő értesül a megszakítás kérelem kiszolgálásáról az utasítás-számláló - veremben eltárolt - értéke visszatöltődik; folytatódik a főprogram végrehajtása, ahol abbamaradt 2005. 10. 14 G.I. MCS-51 programozása
IT alprogramok Az IT szubrutinokat (alprogram) a vektortáblában a JMP (AJMP, LJMP) utasítás után írt címkével kell kezdeni, pl.: Serial_IT: ; ezután következnek a szubrutin utasításai, amelyek a soros vonali megszakításkérelmet dolgozzák fel. IT kérés keletkezésekor az IT-t jelző flaget a hardver állítja be (1-be írja). Az IT kérelem kiszolgálásakor ezt a flaget törölni kell (0-ba írni). Vannak olyan IT források melyeknél a hardver automatikusan törli az IT-t jelző flaget a RETI utasítás végrehajtásakor (ezért kell RETI az IT szubrutin végére); ilyenek a külső megszakítás források, a 0-s és 1-es időzítő/számláló IT kérelmei. Más források esetén a megszakítást kiszolgáló alprogramban kell szoftveresen törölni (0-ba írni); ilyenek a soros vonalak (UART és SPI) és a 2-es időzítő/számláló IT kérelmei. Az IT szubrutinokban is használjuk a PUSH, POP utasításokat azon regiszterek tartalmának mentésére melyek, módosul(hat)nak a szubrutinban. 2005. 10. 14 G.I. MCS-51 programozása
Főprogram A főprogram a végrehajtandó feladattól függő utasításokat tartalmazza, vannak azonban olyan dolgok, amelyekre oda kell figyelni. A főprogramnak az IT vektortáblában az ORG 0000h után írt ugróutasításban szereplő címkével kell kezdődnie, pl.: Main: ; ezután írhatók a főprogram utasításai Az első utasítás a globális IT tiltása kell, hogy legyen, ami a CLR EA ; utasítással valósítható meg, mely törli az EA bitet (IE regiszter 7. bit), minden IT tiltva lesz. Ez azért szükséges, hogy ha a program bármely részéről ugrunk a 0000h címre, akkor is tudjuk inicializálni a mikrokontrollert (lásd később) még az első IT elfogadása előtt. A mikrokontrollert - a főprogram elején - inicializálni kell, ami alatt azoknak a regisztereknek a beállítását értjük, amelyek vezérlik a programban felhasznált eszközöket, pl. timerek, soros vonal, beállítják a megszakítások módját (él vagy szint vezérelt), prioritását, stb. Reset után az SFR regiszterek inicializálásra kerülnek. A kezdőértékek az AT89S8252 dokumentációjából megállapíthatók. Ha ezek az értékek számunkra nem megfelelőek, be kell őket állítani a kívánt értékre (MOV utasítás). 2005. 10. 14 G.I. MCS-51 programozása
Kezdeti beállítások A veremtár mutató (SP) reset után 07h értékkel töltődik fel. A PUSH utasítás végrehajtásakor először inkrementálódik a SP tartalma, majd az új címre elmenti a PUSH után álló értéket. Tehát reset után a verem a 08h címen kezdődik, és felfelé növekszik. Ha szükségünk van az 1-es, 2-es, 3-as regiszterbankra, akkor az SP értékét meg kell változtatni. A vermet a belső adatmemória bármelyik szabad területére lehet helyezni, a 80h-0FFh csak indirekt címezhető területére is (a PUSH, POP utasítások indirekt címzésűek). Ha azt akarjuk, hogy a verem a 40h címen kezdődjön, akkor a MOV SP,#3Fh ;utasítást kell végrehajtani (3Fh = 40h - 1) Az aktuális regiszterbank reset után a 0-s regiszterbank lesz, ha másra van szükségünk, ezt át kell állítani az USING direktívával vagy a PSW regiszter 3-as és 4-es bitjével. 2005. 10. 14 G.I. MCS-51 programozása
A kezdeti beállítások után Ha megszakításokat fogadni akarjuk engedélyezni kell őket A perifériák meghatározott bitjeik egybe írásával índíthatók 2005. 10. 14 G.I. MCS-51 programozása
Keretprogram (1) A példában végrehajtandó feladat „csupán annyi”, hogy a laplatchbe nullát ír. Ehhez a Latch_wr szubrutint használja fel. Ez a szubrutin a kimenetek bemutatásánál kerül majd ismertetésre. A „Fejléc”: ; Budapesti Műszaki Főiskola Kandó Kálmán Villamosmérnöki Főiskolai Kar ; Számítógéptechnikai Intézet Székesfehérvár ; Assembly keretprogram az MCS-51 fejlesztő panelhez ; Program neve: keret.asm, Verzió: 1.0 ; Assembler: 8051 Cross-Assembler, Version 1.2h, (c) MetaLink Corp. ; Copyright (c) Ferenc Délczeg 2003 ;****************************************************************************************** 2005. 10. 14 G.I. MCS-51 programozása
Keretprogram (2) ;****************************************************************************************** ; Fordítási parancsok $NOMOD ; 8051 mód tiltása $DATE(04/26/03) ; 2003.04.26. $SYMBOLS ; szimbólumtáblázat készítése $LIST ; listafájl készítése $TITLE(Keretprogram) ; cím elhelyezése a listafájlba $INCLUDE(AT898252.INC) ; SFR-regiszter deklarációk betöltése ; Bekapcsolás/Reset és megszakítás vektortábla ORG 0000h ; bekapcsolás/Reset AJMP Main ; ugrás a főprogramra ORG 0003h ; 0-ás külső megszakítás ; AJMP Extern0_IT ; törölve, mivel nem használjuk! RETI ORG 000Bh ; 0-ás időzítő/számláló túlcsordulása ; AJMP Timer0_IT ; törölve, mivel nem használjuk! ORG 0013h ; 1-es külső megszakítás ; AJMP Extern1_IT ; törölve, mivel nem használjuk! 2005. 10. 14 G.I. MCS-51 programozása
Keretprogram (3) ORG 001Bh ; 1-es időzítő/számláló túlcsordulása ; AJMP Timer1_IT ; törölve, mivel nem használjuk! RETI ORG 0023h ; soros port megszakítása ; AJMP Serial_IT ; törölve, mivel nem használjuk! ORG 002Bh ; 2-es időzítő/számláló túlcsordulása ; AJMP Timer2_IT ; törölve, mivel nem használjuk! ;****************************************************************************************** ; Deklarációk Stack EQU 40h ; Stack aljának címe /alapérték = 08h Latch EQU 0C000h ; laplatch címe String_1: DB '*BMF-KVK',0 ; a sztring után 0 van! String_2: DB '*MCS-51*',0 ; a sztring után 0 van! Cr EQU 0DH ; kocsi vissza / ASCII kódja Lf EQU 0AH ; soremelés / ASCII kódja Space EQU 20H ; szóköz / ASCII kódja 2005. 10. 14 G.I. MCS-51 programozása
Keretprogram (4) ;************************************************************************************* ; Szubrutinok Latch_wr: ; címke, itt kezdődik a szubrutin PUSH DPL ; regiszter(ek) mentése a verembe PUSH DPH MOV DPTR,#Latch ; laplatch cím betöltése MOVX @DPTR,A ; adat írás a latch-be POP DPH ; regiszter(ek) visszatöltése a veremből POP DPL RET ; szubrutin vége 2005. 10. 14 G.I. MCS-51 programozása
Keretprogram (5) ;****************************************************************************************** ; Főprogram Main: CLR EA ; globális IT tiltás / EA = IE.7 MOV SP,#(Stack-1) ; Stack pointer beállítása USING 0 ; 0-ás regiszterbank használata MOV A,#00000000b ; akkumulátor törlése ACALL Latch_wr ; Latch_wr szubrutin hívása ; ide kerülnek a további - mikrokontrollert inicializáló - utasítások SETB EA ; globális IT engedélyezés / EA = IE.7 ; ide kerülnek a feladat megoldását szolgáló utasítások Loop: ; végtelen ciklus eleje ; ide kerülnek azok az utasítások, melyeket végtelen ciklusban kell végrehajtani LJMP Loop ; ugrás a végtelen ciklus elejére SJMP $ ; főprogram vége /dinamikus stop END ; program vége 2005. 10. 14 G.I. MCS-51 programozása
Vegyes A keretprogram - lefordítva - működőképes tárgyprogramot eredményez. Az IT vektortáblában a nem használt IT-k címei utáni RETI utasítások azt a célt szolgálják, hogy ha hibás működés miatt történne megszakításkérés, akkor a végrehajtás visszatérjen a főprogramhoz. Az AT898252.INC fájlban az AT89S8252 SFR regiszter szimbólumok vannak definiálva az Atmel Corporation [6] dokumentációja alapján 2005. 10. 14 G.I. MCS-51 programozása
Bemenetek, kimenetek programozása Az adatbevitelnek két formája használatos: programozott vagy lekérdezéses (polling) megszakításos (interrupt) 2005. 10. 14 G.I. MCS-51 programozása
Programozott adatbevitel Button2_on: JB P3.5,Button2_on ; Button 2 lenyomására tovább RET ; szubrutin vége Beolvassa a P3.5 portláb állapotát, ha 1-et olvas, akkor visszaugrik a rutin elejére, ha 0-át olvas akkor a következő utasítással folytatja; a RET utasítás hatására visszatér az őt meghívó programhoz. Button2_off: JNB P3.5,Button2_off ; Button 2 felengedésére tovább 2005. 10. 14 G.I. MCS-51 programozása
Megszakítások kezelése (1) A megszakításos adatbevitelnél maga az esemény jelzi a bekövetkeztét, ez ad lehetőséget a valós idejű feldolgozására. Amint egy megszakítás érvényre jut, a mikrokontroller befejezi az éppen végrehajtás alatt álló utasítást, valamint ha ez az utasítás a RETI, vagy olyan utasítás amely befolyásolja az IE vagy IP regisztereket akkor a következő utasítást is, majd generál egy LCALL utasítást; meghívja az adott megszakítás kéréshez rendelt címen levő szubrutint. A megszakítás-forrásokhoz tartozó alprogram címek a 3.1. táblázatban lettek ismertetve. Figyeljünk arra, hogy az LCALL utasítás elmenti a programszámlálót a verembe, de a PSW regisztert nem. A megszakítási szubrutin a RETI utasítással fejeződik be, melynek hatására a mikrokontroller visszaállítja a programszámláló értékét a veremből. A program végrehajtása a megszakítás helyétől folytatódik. Ha ekkor is van érvényes megszakítás kérés a processzor a főprogramból végrehajt legalább egy utasítást mielőtt az újabb megszakítást lekezelné. 2005. 10. 14 G.I. MCS-51 programozása
Megszakítások kezelése (2) IE Regiszter Az IE regiszter bitjeinek jelentése: EXi az i sorszámú külső megszakításkérő bemenet megszakítás kérésének engedélyezése ETi az i sorszámú időzítő/számláló megszakítás kérésének engedélyezése ES az UART és az SPI port megszakítás kérésének engedélyezése EA globális megszakítás engedélyezés Az IE, regiszter reset utáni értéke 00000000b 2005. 10. 14 G.I. MCS-51 programozása
Megszakítások kezelése (3) IP Regiszter 0 = alacsony, 1 = magas prioritási osztály Az IP regiszter bitjeinek jelentése: PXi az i sorszámú külső megszakításkérés prioritásbitje PTi az i sorszámú időzítő/számláló megszakítás kérésének prioritásbitje PS az UART és az SPI port megszakítás kérésének prioritásbitje A másodlagos prioritási sorrend, csökkenő prioritás szerint a következő: IE0 0-s sorszámú külső megszakítás TF0 0-s sorszámú időzítő/számláló megszakítása IE1 1-es sorszámú külső megszakítás TF1 1-es sorszámú időzítő/számláló megszakítása RI+TI+SPIF az UART és az SPI port megszakítása TF2+EXF2 2-es sorszámú időzítő/számláló megszakítása Az IP regiszter reset utáni értéke 00000000b 2005. 10. 14 G.I. MCS-51 programozása
Megszakítások kezelése (4) A külső megszakítások vezérlését a TCON bitcímezhető regiszter alsó négy bitje végzi. A felső négy bit a 0-s és az 1-es időzítő/számláló vezérlését látja el IEi 1-es értéke jelzi, ha az INTi portlábon megszakításkérés jelentkezett ITi az megszakításkérő bemenet élre/szintre aktív vezérlése: 1-es értékre lefutó élre keletkezik megszakításkérés 0-s értékre alacsony szintre keletkezik megszakításkérés Élre aktív üzemmód esetén az IEi bitet az portlábon jelentkező lefutó él állítja 1-es értékűre. Az IT szubrutinra ugrás törli a bitet. Szintre aktív üzemmód esetén az IEi bit az portláb pillanatnyi logikai értékének a negáltja. Az IE, IP és TCON regiszterek reset utáni értéke 00000000b, vagyis minden megszakítás tiltott, a megszakítások prioritása alacsony és a külső megszakítások szintvezéreltek. 2005. 10. 14 G.I. MCS-51 programozása
Megszakítások kezelése (5) Extern1_IT egy egyszerű megszakítási szubrutin: Extern1_IT: ; Button 1 lenyomása váltja ki az IT-t ; ide kerül(nek) a végrehajtandó utasítás(ok) ACALL Button2_on ; Button 2 lenyomására tovább RETI ; IT szubrutin vége Az 1. sorszámú külső megszakítás akkor engedélyezett, ha az EA és EX1 bitek 1-es értékűek. A megszakítást az 1-es nyomógomb lenyomása váltja ki. A példában az IT szubrutin meghívja a Button2_on alprogramot, mely mindaddig nem lép tovább, amíg a 2-es nyomógombot le nem nyomjuk. Ha ez megtörtént a RETI utasítás hatására folytatja a program végrehajtását, ahol abbamaradt az 1-es gomb lenyomásakor. Vagyis az 1-es gombbal megállítjuk a program futását, míg a 2-essel folytatjuk. 2005. 10. 14 G.I. MCS-51 programozása
Kimenet programozása (1) Fizikai tartalom Az LD1-LD4 LED-ek meghajtására az IC11 74HC573 típusú latch felső négy bitje szolgál. A megfelelő bitek 1-esbe írásával a LED-ek bekapcsolhatók, illetve 0-ba írásával a LED-ek kikapcsolhatók. A latchbe írást a LAPLATCH jel engedélyezi, melyet az IC14 címdekódoló állít elő, az alábbi feltételek szerint: Ebből következik, hogy ha a C000h-FFFFh tartomány bármely címére kiküldünk egy bájtot a MOVX utasítással, akkor azt a laplatchbe (IC 11) írja. A Latch_wr szubrutin ezt a feladatot látja el: 2005. 10. 14 G.I. MCS-51 programozása
Kimenet programozása (2) A program Latch_wr: ; címke, itt kezdődik a szubrutin PUSH DPL ; regiszter(ek) mentése a verembe PUSH DPH MOV DPTR,#Latch ; laplatch cím betöltése MOVX @DPTR,A ; adat írás a latch-be POP DPH ; regiszter(ek) visszatöltése a veremből POP DPL RET ; szubrutin vége A szubrutint meghívni a CALL Latch_wr ; utasítással lehet (ACALL, LCALL) Bekapcsolás vagy Reset után a latch tartalma véletlenszerűen áll be, ezért inicializáláskor a latchbe a szükséges értéket (pl. 0-t) kell írni. 2005. 10. 14 G.I. MCS-51 programozása
Egyszerű (közelítő) időzítő szubrutinok (1) ms tartomány Delay_ms: ; kb. 1ms*B várakozás PUSH ACC ; regiszter(ek) mentése a verembe d_ms: MOV A,#0 DJNZ ACC,$ ; 500 µS @ 12 MHz DJNZ B,d_ms POP ACC ; regiszter(ek) visszatöltése a veremből RET ; szubrutin vége A szubrutin a B regiszter értékétől függő időzítést valósít meg, melynek értéke kb. B milliszekundum 12 MHz órajelfrekvencia esetén. Meghívása előtt a B regiszterbe kell tölteni a megfelelő értéket, a B értéke a rutin végén 0 lesz. Felhasználásánál ügyelni kell arra, hogy a rutin végrehajtási ideje megnő a futása közben bekövetkező megszakítások végrehajtási idejével. 2005. 10. 14 G.I. MCS-51 programozása
Egyszerű (közelítő) időzítő szubrutinok (2) kb. B Sec tartomány Delay_s: ; kb. 1s*B várakozás PUSH ACC ; regiszter(ek) mentése a verembe MOV A,B d_s: MOV B,#250 ACALL delay_ms ; 250 ms ACALL delay_ms ; 500 ms ACALL delay_ms ; 750 ms ACALL delay_ms ; 1000 ms DJNZ ACC,d_s POP ACC ; regiszter(ek) visszatöltése a veremből RET ; szubrutin vége 2005. 10. 14 G.I. MCS-51 programozása
Egyszerű számláló szubrutin R7 értékét meghívásonként növeli Count: ; 0h-tól Fh-ig számol PUSH ACC ; regiszter(ek) mentése a verembe MOV A,R7 ; számláló betöltése az A-ba INC A ; számláló léptetése ANL A,#00001111b ; felső 4 bit maszkolása /nullázása MOV R7,A ; hexa számjegy mentése R7-be ACALL Hexa_ascii ; hexa/ASCII konverzió MOV R6,A ; ASCII karakter mentése R6-ba POP ACC ; regiszter(ek) visszatöltése a veremből RET ; szubrutin vége Inicializáláskor az R7 tartalmát kezdőértékre (0-ra) kell állítani. - A szubrutin minden meghívásakor eggyel növeli az R7 értékét. - Azért, hogy az értéke ne haladhassa meg a 0Fh-t, a felső négy bitet nullázzuk (maszkolás). - Meghívja a Hexa_ascii szubrutint, mely az akkumulátorban levő hexa számjegy ASCII kódjával tér vissza, amit az R6 regiszterben tárol. - Ha erre nincs szükség, a megfelelő sort törölni kell. 2005. 10. 14 G.I. MCS-51 programozása
Számértéket ASCII-re konvertáló rutin Hexa_ascii: ANL A,#00001111b ; felső 4 bit maszkolása /nullázása CLR C ; Carry flag törlése a teszteléshez SUBB A,#0Ah ; kisebb mint Ah? JC hx_1 ; ha igen, hozzáad 30h-t ADD A,#07H ; ha nem, hozzáad 7h-t és 30h-t (41h) hx_1: ADD A,#30H RET ; szubrutin vége 2005. 10. 14 G.I. MCS-51 programozása
M1 mérési utasítás A mérés célja: a fejlesztőrendszer (hardver/szoftver) megismerése nyomógombok és LED-ek használatának programozása egyszerű programok írása, fordítása, letöltése, futtatása, tesztelése Szükséges eszközök: Mérőkártya Programok Letöltőkábel Tápegység 2005. 10. 14 G.I. MCS-51 programozása
Végrehajtandó feladatok: Tanulmányozza a kapcsolási rajz alapján a fejlesztőpanelt! Azonosítsa a mikrokontrollert és a többi funkcionális IC-t, az SPI port CS1 csatlakozóját, a nyomógombokat, a LED-eket, a tápegység csatlakozóját! Csatlakoztassa az ISP interfészt és a tápegységet! Oszcilloszkóppal vegye fel az ALE jel idődiagramját! Az oszcillátor-frekvencia ismeretében ellenőrizze az ALE jel frekvenciáját! A keretprogram és az ismertetett szubrutinok felhasználásával készítsen 4 bites bináris számlálót LED kijelzővel! Fordítsa le az assembly programot, majd töltse le a mikrokontroller flash program-memóriájába! A letöltött programot futassa, tesztelje! Alakítsa át a programot úgy, hogy az 1-es gombbal megállítható, míg a 2-es gombbal folytatható legyen a számlálás! Készítsen programot, mely a LED-eket futófényként kapcsolgatja! Alakítsa át a programot kétirányú futófénnyé! Nyomógomb segítségével lehessen az irányt változtatni! A mérési jegyzőkönyvnek tartalmaznia kell a megírt programok és rutinok forráskódját. 2005. 10. 14 G.I. MCS-51 programozása
M1 végrehajtása Az ALE jel idődiagramja lásd a következő diát!:. A bináris számláló programnál felhasználható a keretprogram, a Count, Latch_wr, Delay_ms és Delay_s szubrutinok. A főprogramban töröljük az R7 regiszter és a laplatch tartalmát, majd a Loop végtelen ciklusban meghívjuk az időzítő szubrutint, a Count majd a Latch_wr szubrutinokat. Az időzítést 250 ms és 1 s között célszerű megválasztani. Figyeljünk arra, hogy a Count szubrutin meghívja a Hexa_ascii szubrutint, ezért ezt is be kell szerkeszteni a programba vagy a Count megfelelő sorát törölni kell. Az assembly program fordítása: ASM51 <fájlnév A tárgyprogram letöltése: SPI –P8252 –E <fájlnév> A főprogramban engedélyezni kell az 1-es külső megszakítást és a globális megszakítást. Az IT szubrutin lehet az Extern1_IT alprogram. A futófény programnál egy regiszterben (pl. R7) tároljuk a laplatchbe írandó értéket. A regisztert a 00010001b értékkel inicializáljuk. A Loop végtelen ciklusban meghívjuk az időzítő szubrutint, a regiszter tartalmát shifteljük (RL utasítás), majd meghívjuk a Latch_wr szubrutint. A kétirányú futófénynél egy regiszter (pl. R6) értéke dönti el a shiftelés irányát (pl. 00 értékre balra, FFh értékre jobbra), melyet inicializálunk (0 értékkel). Az 1-es nyomógomb felhasználható az irány váltására. Engedélyezni kell az 1-es külső megszakítást és a globális megszakítást. Az IT szubrutinban a regisztert invertáljuk, majd a prellmentesítés érdekében beillesztünk egy kb. 200 ms-os időzítést. Invertáláshoz a kizáró vagy műveletet (XRL utasítás) használjuk; a regiszter és az FFh között elvégezzük a kizáró vagy műveletet. A regiszter értékétől függően változtatjuk (CJNE utasítás) a shiftelés irányát (RL balra, RR jobbra). 2005. 10. 14 G.I. MCS-51 programozása
M1 megoldása (1) ALE jel mérése Az oszcillátor frekvenciája 11,0592 MHz, az órajel periódusideje 94 ns. Az ALE jel 2 órajel periódus alatt magas, míg 4 órajel periódus alatt alacsony szinten van, vagyis 188 ns a magas, 376 ns az alacsony szint ideje. 2005. 10. 14 G.I. MCS-51 programozása
M1 megoldása (2) A bináris számláló programnál felhasználható a keretprogram, a Count, Latch_wr, Delay_ms és Delay_s szubrutinok. A főprogramban töröljük az R7 regiszter és a laplatch tartalmát, majd a Loop végtelen ciklusban meghívjuk az időzítő szubrutint, a Count majd a Latch_wr szubrutinokat. Az időzítést 250 ms és 1 s között célszerű megválasztani. Figyeljünk arra, hogy a Count szubrutin meghívja a Hexa_ascii szubrutint, ezért ezt is be kell szerkeszteni a programba vagy a Count megfelelő sorát törölni kell. Az assembly program fordítása: ASM51 <fájlnév A tárgyprogram letöltése: SPI –P8252 –E <fájlnév> A főprogramban engedélyezni kell az 1-es külső megszakítást és a globális megszakítást. Az IT szubrutin lehet az Extern1_IT alprogram. 2005. 10. 14 G.I. MCS-51 programozása
M1 megoldása (3) A futófény programnál egy regiszterben (pl. R7) tároljuk a laplatchbe írandó értéket. A regisztert a 00010001b értékkel inicializáljuk. A Loop végtelen ciklusban meghívjuk az időzítő szubrutint, a regiszter tartalmát shifteljük (RL utasítás), majd meghívjuk a Latch_wr szubrutint. A kétirányú futófénynél egy regiszter (pl. R6) értéke dönti el a shiftelés irányát (pl. 00 értékre balra, FFh értékre jobbra), melyet inicializálunk (0 értékkel). Az 1-es nyomógomb felhasználható az irány váltására. Engedélyezni kell az 1-es külső megszakítást és a globális megszakítást. Az IT szubrutinban a regisztert invertáljuk, majd a prellmentesítés érdekében beillesztünk egy kb. 200 ms-os időzítést. Invertáláshoz a kizáró vagy műveletet (XRL utasítás) használjuk; a regiszter és az FFh között elvégezzük a kizáró vagy műveletet. A regiszter értékétől függően változtatjuk (CJNE utasítás) a shiftelés irányát (RL balra, RR jobbra). 2005. 10. 14 G.I. MCS-51 programozása
Karakteres LCD modul programozása (1) HD44780 cél-mikrovezérlővel szerelt karakteres LCD modul Az LCD modulok karakteres megjelenítést tesznek lehetővé az ASCII kódrendszer felhasználásával. A karakterek 5*7 képpontból állnak, az alattuk levő pixelsor a kurzor megjelenítésére használható (5*(7+1) pixel). Kijelzők készülnek 1, 2, 4 soros kivitelben, egy-egy sorban 8, 16, 20, 24, 40 karakter jeleníthető meg. A kijelzésre szánt karakterek kódját a Display Data RAM-ba (DDRAM) kell írni, melynek kapacitása 80 bájt. Ebből egyszerre csak a kijelző típusának megfelelő számú karakter látható, pl.: 2*16-os kijelző esetén két sorban 16-16 karakter. A kijelző 160 előre rögzített mintázatú karaktert jeleníthet meg, melyek mintázata a Character Generator ROM-ban (CGROM) van tárolva; magyar ékezetes betűk nem találhatók köztük. 2005. 10. 14 G.I. MCS-51 programozása
Karakteres LCD modul programozása (2) Lehetőség van saját mintázatú karakterek létrehozására is, egy felhasználói karakter 5*7 képpontból és az aláhúzó (kurzor) sorból áll, mintázatát soronként egy-egy bájt adja, melyeket a CGRAM-ba kell írni. A CGRAM mérete 64 bájt ezért a felhasználó egyszerre legfeljebb nyolc karaktert alakíthat ki. A DDRAM és CGRAM bájtjai a felhasználó által írhatók/olvashatók, a fel nem használt rekeszek tetszőleges adat tárolására használhatók. 2005. 10. 14 G.I. MCS-51 programozása
Karakteres LCD modul programozása (3) Az LCD vezérlő csatlakozó pontjai és értelmezésük 2005. 10. 14 G.I. MCS-51 programozása
Karakteres LCD modul programozása (4) HD44780 LCD vezérlő használata A HD44780 nyolc vagy négy bites adatokkal (utasításokkal) vezérelhető, négy bites adat esetén a felső négy adatbitet (D4-D7) használja. Az utasítások típusát a felső helyiértékeken álló folyamatos nulla sorozat határozza meg, amit 1-es követ. Az 1-es után álló bitsorozat általában az utasítás végrehajtási módját határozza meg. A következő oldal táblázata összefoglalja az utasításokat. 2005. 10. 14 G.I. MCS-51 programozása
2005. 10. 14 G.I. MCS-51 programozása
Karakteres LCD modul programozása (6) Az előző táblázat rövidítései 2005. 10. 14 G.I. MCS-51 programozása
Karakteres LCD modul programozása (7) Címkiosztás A fejlesztő panelen 8 bites adatokkal dolgozunk. A modulnak adatot küldeni illetve beolvasni a MOVX utasítással lehet, a címkiosztás az alábbi. 2005. 10. 14 G.I. MCS-51 programozása
Karakteres LCD modul programozása (8) LCD címzése LCD_cmd: PUSH DPL ; regiszter(ek) mentése a verembe PUSH DPH MOV DPTR,#LCD_wr ; LCD utasítás írása cím betöltése MOVX @DPTR,A ; utasítás küldése az LCD-nek POP DPH ; regiszter(ek) vissza- töltése a veremből POP DPL RET ; szubrutin vége 2005. 10. 14 G.I. MCS-51 programozása
Karakteres LCD modul programozása (9) Várakoztató (busy) flag kezelése 2005. 10. 14 G.I. MCS-51 programozása
Karakteres LCD modul programozása (10) Inicializálás lépései 2005. 10. 14 G.I. MCS-51 programozása
Karakteres LCD modul programozása (11) inicializálás leírása Az LCD_init rutin a 8 bites inicializálást végzi el, először a megfelelő időzítések után háromszor kiküldi a 30h bájtot (lásd katalógust). Felhasználja a Delay_ms és az LCD_cmd rutinokat. Ez után már olvasható a busy flag, így a többi utasítás küldése előtt meghívjuk az LCD_busy rutint. Az inicializálás adatait a programterületen található LCD_initdata címkénél kezdődő táblázatból olvassuk ki 2005. 10. 14 G.I. MCS-51 programozása
Karakteres LCD modul programozása (12) Az LCD inicializálás adatai 2005. 10. 14 G.I. MCS-51 programozása
2005. 10. 14 G.I. MCS-51 programozása
Karakteres LCD modul programozása (14) Az inicializáló ciklust 5-ször (ennyi utasítást küldünk ki) végezzük el, bájtonként olvassuk be a programmemóriából és küldjük ki az LCD modulnak az utasításokat. 2005. 10. 14 G.I. MCS-51 programozása
Karakteres LCD modul programozása (15) A DDRAM mérete 80 bájt, a címkiosztása egysoros modulnál az alábbi táblázatban látható 2005. 10. 14 G.I. MCS-51 programozása
Karakteres LCD modul programozása (16) A fejlesztő panelhez használt 1*16-os LCD modul (L167100J típusú) kijelző pozíciói és hexadecimális DDRAM címei. A modul tulajdonságai miatt (sajnos) a modul kezelése úgy kell, hogy történjen, mintha 2 soros és 8 oszlopos lenne; ez a használatánál nehézséget jelent, mert a DDRAM címek nem folytonosak 2005. 10. 14 G.I. MCS-51 programozása
Karakteres LCD modul programozása (17) Inicializálás után a DDRAM cím 0 lesz. Adat küldésekor az aktuális DDRAM címre íródik, utána a DDRAM cím inkrementálódik vagy dekrementálódik, ahogy az a beviteli módban be van állítva. A mi esetünkben az inkrementálás lett beállítva. Amikor az LCD tetszőleges karakter-pozíciójára akarunk írni a DDRAM címet utasítással állítjuk be. Az LCD_ddram rutin az akkumulátorban levő értékre állítja a DDRAM címet. 2005. 10. 14 G.I. MCS-51 programozása
Karakteres LCD modul programozása (18) 2005. 10. 14 G.I. MCS-51 programozása
Karakteres LCD modul programozása (19) Az LCD_char szubrutin kiírja az aktuális DDRAM címre azt a karaktert, melynek a kódja az akkumulátorban van. Ha nem az aktuális DDRAM címre akarunk írni, akkor a rutin meghívása előtt be kell állítani a megfelelő címet. 2005. 10. 14 G.I. MCS-51 programozása
Karakteres LCD modul programozása (20) 2005. 10. 14 G.I. MCS-51 programozása
Karakteres LCD modul programozása (21) Az ismertetett rutinok használatára egy példa: Tároljuk a „*BMF-KVK” és az „*MCS-51*” szövegeket a program memóriában. Írassuk ki az LCD-re, egymás mellé a két szöveget. String_1: DB '*BMF-KVK',0 ; a sztring után 0 van! String_2: DB '*MCS-51*',0 ; a sztring után 0 van! MOV A,#0h ; A-ba az LCD DDRAM címe ACALL LCD_ddram ; DDRAM cím 0-ra állítás MOV DPTR,#String_1 ; DPTR-be a szöveg kezdőcíme ACALL LCD_string ; szöveg kiírás az LCD-re MOV A,#40h ; A-ba az LCD DDRAM címe ACALL LCD_ddram ; DDRAM cím 40h-ra állítás MOV DPTR,#String_2 ; DPTR-be a szöveg kezdőcíme 2005. 10. 14 G.I. MCS-51 programozása
Időzítők, számlálók programozása (1) A Timer 0, Timer 1 programozása Időzítő üzemmódban a regiszterek tartalma gépi ciklusonként eggyel nő. Egy gépi ciklus 12 órajel-periódusból áll, ezért az időzítés alapegysége az órajel-periódus 12 szerese. A fejlesztő panelnél használt 11,0592 MHz órajel frekvencia esetén az órajel-periódus 1/110592 sec, kb. 94 ns. A gépi ciklus frekvenciája ennek a 12-ed része 921600 Hz, a periódusidő kb. 1,085 s. Ennek megfelelően a számláló regiszterek tartalma másodpercenként 921600-szor (kb. 1,085 s-onként) inkrementálódik. Számláló üzemmódban a megfelelő bemeneti portlábon kialakuló lefutó él végzi a számláló léptetését. A szintváltást a mikrokontroller úgy érzékeli, hogy minden gépi ciklus S5P2 fázisában megvizsgálja a Ti portláb szintjét. Ha az egyik vizsgálatkor 1-es, a másiknál 0-ás szintet érzékel, azt lefutó élnek veszi és lépteti a számlálót. Ebből következik, hogy a legmagasabb léptetési frekvencia az oszcillátor-frekvencia 24-ed része lehet. 2005. 10. 14 G.I. MCS-51 programozása
Időzítők, számlálók programozása (2) A TMOD regiszter bitjei 2005. 10. 14 G.I. MCS-51 programozása
Időzítők, számlálók programozása (3) 2005. 10. 14 G.I. MCS-51 programozása
Időzítők, számlálók programozása (4) TCON bitcímezhető regiszter A számlálók működésének vezérlését a felső négy bitje végzi. A TCON regiszter bitjeinek jelentése: TFi a Timer i túlcsordulását jelzi, megszakítás forrás is. Az IT szubrutinra ugrás törli a bitet. TRi a Timer i működését vezérli, 1-es értékre léptethető, 0-ás értékre megáll (A Timer0_init szubrutin 16 bites időzítőnek (Mode 1) inicializálja a Timer 0-t.) 2005. 10. 14 G.I. MCS-51 programozása
Időzítők, számlálók programozása (5) Timer0_init: SETB ET0 ; Timer 0 IT maszkbit beállítása SETB PT0 ; Timer 0 IT magas prioritás beállítása ANL TMOD,#11110000b ; Timer 0 Mode1 /16 bites időzítő ORL TMOD,#00000001b ; Gate = 0, C//T = 0, Mode1 MOV TH0,#TH0_rl ; Timer 0 kezdőérték betöltése MOV TL0,#TL0_rl CLR TF0 ; túlcsordulás jelző bit törlése SETB TR0 ; Timer 0 start RET ; szubrutin vége 2005. 10. 14 G.I. MCS-51 programozása
Időzítők, számlálók programozása (6) A 16 bites számláló 0-tól 65535-ig számlál, ha 0-ról indul, akkor a 65536-dik impulzus után túlcsordul, vagyis minden bitje 1-esből 0-ás lesz. A számláló túlcsordulása írja 1-be a TF0 bitet, mely ha engedélyezett megszakítást vált ki Pl.: 50 milliszekundumonként akarunk megszakítást kérni. - mennyi a gépi ciklus frekvenciája? 11059200 Hz/12 = 921600 Hz - hány gépi ciklus után kell IT-t kérni? 921600 Hz/20 Hz = 46080 - milyen értékről indul a számláló? 65536-46080=19456=4C00h A kiszámolt értéket a TH0 és a TL0 regiszterekbe töltjük (felső bájt TH0, alsó bájt TL0). A TH0_rl, TL0_rl kezdőértékeket a deklarációs részben definiáljunk: TH0_rl EQU 4Ch TL0_rl EQU 00h 2005. 10. 14 G.I. MCS-51 programozása
Időzítők, számlálók programozása (7) A TF0 túlcsordulás jelző bitet töröljük, a TR0 bit 1-be állításával indítjuk, az időzítőt majd a RET–el visszatérünk A megszakítás elfogadásakor a TF0 bitet automatikusan törli a hardver, ezért nem szükséges programból törölni. Ha egész pontos időzítésre van szükségünk, ezen utasítások végrehajtási idejét is figyelembe kell venni. 2005. 10. 14 G.I. MCS-51 programozása
Időzítők, számlálók programozása (8) A Timer 2 programozása A T2CON regiszter bitjeinek jelentése: TF2 a Timer 2 túlcsordulásakor 1-be állítódik, megszakításforrás is, mindenképp szoftverből kell törölni. Ha RCLK=1 vagy TCLK=1 akkor nem állítódik be. EXF2 az EXEN2 1-es értékre a T2EX portlábon lefutó élre 1-be íródik, megszakításforrás is, mindenképp szoftverből kell törölni. Nem okoz megszakítást előre/hátra számláló módban (DCEN = 1). RCLK 1-es értéke esetén a Timer2 az UART vevő órajel vezérlését látja el. TCLK 1-es értéke esetén a Timer 2 az UART adó órajel vezérlését látja el. EXEN2 1-es értékénél T2EX bemenet engedélyezés, 0-ás értékénél, vagy ha RCLK = 1 vagy TCLK = 1 akkor a T2EX bemenet figyelmen kívül van hagyva. TR2 Timer 2 start/stop, 1-es értékre start, 0-ás értékre stop. 1-es értékre számláló-, 0-ás értékre időzítő üzemmód. 1-es értékre capture, 0-ás értékre reload üzemmód. Ha RCLK=1 vagy TCLK=1 akkor mindig reload üzemmód. 2005. 10. 14 G.I. MCS-51 programozása
Időzítők, számlálók programozása (9) A T2MOD regiszter bitjei A T2MOD regiszter bitjeinek jelentése: T2OE 1-es értékénél a Timer 2 a P1.0/T2 portlábon programozható frekvenciájú órajelet állít elő. DCEN 1-es értékénél a Timer 2 a P1.1/T2EX portlábbal állítható előre/hátra számlálónak; A T2EX 1-es értékénél előre, 0-ás értékénél hátra számlál. A DCEN 0-ás értékénél a Timer 2 előre számlál. 2005. 10. 14 G.I. MCS-51 programozása
Időzítők, számlálók programozása (10) A Timer 2 üzemmódjai. 2005. 10. 14 G.I. MCS-51 programozása
Időzítők, számlálók programozása (11) Timer2_init: SETB ET2 ; Timer 2 IT maszkbit beállítása SETB PT2 ; Timer 2 IT magas prioritás beállítása MOV T2CON,#00000000b ; Timer 2 auto-reload üzemmód MOV T2MOD,#00000000b ; Timer 2 előre számlál /DCEN = 0 MOV RCAP2H,#TH2_rl ; Timer 2 újratölt érték betöltése MOV RCAP2L,#TL2_rl CLR TF2 ; túlcsordulás jelző bit törlése SETB TR2 ; Timer 2 start RET ; szubrutin vége 2005. 10. 14 G.I. MCS-51 programozása
Időzítők, számlálók programozása (12) A Timer2_IT alprogramban a TF2 bitet szoftveresen kell törölni, mivel a hardver nem törli automatikusan. Timer2_IT: CLR TF2 ; Timer 2 túlcsordulás bit törlése ; ide kerülnek a végrehajtandó utasítás(ok) RETI ; IT szubrutin vége 2005. 10. 14 G.I. MCS-51 programozása
Soros port programozása (1) Az SCON regiszter bitjei - SM0, SM1 üzemmód beállítása. Az indexek ellentétesek a normál iránnyal (SM0 a 7. míg SM1 a 6. bit)! - SM2 Mode 0 üzemmódban 0-ba kell állítani. Mode 1-3 üzemmódban 1-es értékre csak akkor keletkezik vételi megszakításkérés, ha a 9. vett bit (Mode 1-ben a stop bit) 1-es. - REN 1-es értékre a vétel engedélyezett. - TB8 a 9-edik adatbit, amit az adó a 2-es és 3-as üzemmódban kiad. - RB8 a 9-edik adatbit, amit a vevő a 2-es és 3-as üzemmódban vesz. 1-es üzemmódban a stopbitet tartalmazza, 0-ás üzemmódban nem használt. - TI adóáramkör megszakítás kérő bitje, szoftverből kell törölni. - RI vevőáramkör megszakítás kérő bitje, szoftverből kell törölni. 2005. 10. 14 G.I. MCS-51 programozása
Soros port programozása (2) A soros port üzemmódjai 2005. 10. 14 G.I. MCS-51 programozása
Soros port programozása (3) A soros port adatátviteli sebessége Az adatátviteli sebesség a 0-ás módban az oszcillátor frekvencia 12-ed része. A 2-es üzemmódban az SMOD (PCON regiszter 7. bit) bit 1-es értékére az oszcillátor frekvencia 32-ed része, míg 0-ás értékére az oszcillátor frekvencia 64-ed része. Az 1-es és 3-as üzemmódokban a Timer 1 vagy/és a Timer 2 állítja elő a vételi és az adási órajelet a táblázat szerint 2005. 10. 14 G.I. MCS-51 programozása
Soros port programozása (4) 2005. 10. 14 G.I. MCS-51 programozása
Soros port programozása (5) 2005. 10. 14 G.I. MCS-51 programozása
Soros port programozása (6) 2005. 10. 14 G.I. MCS-51 programozása
Soros port programozása (7) 2005. 10. 14 G.I. MCS-51 programozása
Soros port programozása (8) A soros port programozása A soros port 1-es üzemmódjában az adás akkor kezdődik, amikor az SBUF regiszterbe adatot írunk. Amint az adatbitek elküldése befejeződött és megkezdődik a stopbit elküldése a TI bit 1-es lesz. A vételt az RXD portlábon megjelenő startbit indítja. A stopbit vétele után megvizsgálja az alábbi két feltételt: RI = 0 SM2 = 0 vagy a vett stopbit = 1 Ha teljesül a két feltétel a vett adatot az SBUF regiszterbe teszi, az RI-t 1-be állítja, az RB8-ba a vett stopbitet teszi. Ha a fenti két feltétel valamelyike nem teljesül, a vett adat elvész és a vételi áramkör az újabb adatot várja. 2005. 10. 14 G.I. MCS-51 programozása
Soros port programozása (9) 2005. 10. 14 G.I. MCS-51 programozása
Soros port programozása (10) Az adás programozott módon, a vétel megszakítással történik. A PSW regiszter F0 bitjét használjuk az adóregiszter szabad állapotának jelzésére. A vétel engedélyezéséhez a REN bitet (SCON regiszter) 1-be kell állítani. A vétel számára puffert hozunk létre a 80h-FFh indirekt címezhető RAM területen. A puffer kezeléséhez három mutatót definiálunk: írási mutató, olvasási mutató és hossz mutató, melyek az aktuális regiszterbank R0, R1 és R2 regiszterei. Inicializáláskor az írási és az olvasási mutató a 80h címre mutat, a hossz értéke nulla. 2005. 10. 14 G.I. MCS-51 programozása
Soros port programozása (11) 2005. 10. 14 G.I. MCS-51 programozása
Soros port programozása (12) A Serial_IT szubrutin lekezeli a soros port megszakítás kérését, mely akkor keletkezik, ha az adópuffer (SBUF) kiürült (TI = 1) vagy ha a vevőpufferben adat van (RI = 1). - A szubrutinban egyenként megvizsgáljuk a TI és az RI biteket. - Ha adásra kért IT-t, akkor töröljük a TI bitet, és 1-be állítjuk az F0 bitet (a PSW szabadon felhasználható bitje), mely a vevőpuffer szabad állapotát jelzi. - Ha vételre kért IT-t, akkor a vett bájtot tároljuk a vevőpufferben, azon a címen, amelyre az írási mutató mutat. - Az írási és a hossz mutatókat inkrementáljuk, majd maszkoljuk, az írási mutató értéke FFh után a 80h értéket veszi fel, míg a hossz mutató 7Fh után a 0 értéket. - Töröljük az RI bitet. 2005. 10. 14 G.I. MCS-51 programozása
Soros port programozása (13) 2005. 10. 14 G.I. MCS-51 programozása
Soros port programozása (14) 2005. 10. 14 G.I. MCS-51 programozása
Soros port programozása (15) 2005. 10. 14 G.I. MCS-51 programozása
Soros port programozása (16) A Get_char szubrutin a vevőpufferben levő adatbájt feldolgozását végzi. Ha a vevőpuffer üres, visszatér a meghívó programhoz. Ha a vevőpuffer nem üres, az akkumulátorba tölti azt a bájtot, amelyikre az olvasási mutató mutat. Végrehajtja a kijelölt utasításokat; a példában kiküldi a soros portra az akkumulátor tartalmát. Ezután az olvasási mutatót inkrementálja és maszkolja, majd a hossz mutatót dekrementálja. 2005. 10. 14 G.I. MCS-51 programozása
Soros port programozása (17) 2005. 10. 14 G.I. MCS-51 programozása
A programok kezelése: C: VC Kiválasztjuk a megfelelő könyvtárat, jelen esetben pl. a 8052-t Ráállunk a kívánt fájlra pl. Keret.asm, vagy az Eret.asm F4-el megnyitjuk Elvégezzük a szerkesztést Alt F egyidejű lenyomásával megnyitjuk a parancs ablakot. Kiválasztjuk a mentést és elmentjük a módosított fájlt. Ezután bezárjuk a szerkesztőt. Megnyitjuk az asm51.exe fájlt és elvégezzük a fordítást. Hexa fájl készül. Ash2hex.exe programmal elvégezzük a hexa bináris konverziót Ezután csatlakoztatjuk a programozandó kártyát 12 V-ra. Bekapcsoljuk a tápegységet. Begépeljük C: ispdos.exe /zz1 „ ezzel törlöm a régi tartalmat Majd: ispdos.exe /pf1 fájlnév.bin „ezzel letöltök Kikapcsoljuk a kártyát, majd újra bekapcsolva az Resetelődik, és az új program futását kipróbáljuk. 2005. 10. 14 G.I. MCS-51 programozása