Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
1
Mcs-51 mikrokontrolleres kártya programozása
Leírás és minta feladatok G.I. MCS-51 programozása
2
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 G.I. MCS-51 programozása
3
Címző jelek G.I. MCS-51 programozása
4
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]. G.I. MCS-51 programozása
5
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, ?_?_ G.I. MCS-51 programozása
6
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. G.I. MCS-51 programozása
7
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 ; címke <= adat helyfoglalás kezdőcíme BIT_ VALTOZO: DBIT 16 ; címke <= adat helyfoglalás kezdőcíme G.I. MCS-51 programozása
8
Számok G.I. MCS-51 programozása
9
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 G.I. MCS-51 programozása
10
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) G.I. MCS-51 programozása
11
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: b ; értéke: 18 ; értéke: 23 ; értéke: 11 G.I. MCS-51 programozása
12
A használható operátorok 3. csökkenő prioritás szerint rendezve
; értéke: b NOT 1 ; értéke: b 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 G.I. MCS-51 programozása
13
ASCII karakterek MOV A,#’n’ ; A <= 6Eh (n ASCII kódja)
STRING: DB ’Szia 8051’ ; 537A h kerül a memóriába G.I. MCS-51 programozása
14
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 G.I. MCS-51 programozása
15
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. G.I. MCS-51 programozása
16
Utasításkészlet [<címke:>] <mnemonik> [<operand1>] [,<operand2>] [,<operand3>] [;<kommentár>] G.I. MCS-51 programozása
17
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) G.I. MCS-51 programozása
18
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é jelzi, pl.: - MOV ; az adat címe az R0 regiszterben van (indirekt címzés) - MOVC ; az adat címe az A és a DPTR összege (indirekt regiszter címzés) G.I. MCS-51 programozása
19
Assembler direktívák <szimbólum> DIREKTÍVA <operandus1> [<,operandus2>]… [;<kommentár>] G.I. MCS-51 programozása
20
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 ; 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 R ; 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 G.I. MCS-51 programozása
21
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) G.I. MCS-51 programozása
22
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 ; belső adatmemória cím URES DATA PUFFER+16 ; aritmetikai kifejezés G.I. MCS-51 programozása
23
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 G.I. MCS-51 programozása
24
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 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 G.I. MCS-51 programozása
25
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 G.I. MCS-51 programozása
26
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. G.I. MCS-51 programozása
27
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 G.I. MCS-51 programozása
28
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 G.I. MCS-51 programozása
29
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 G.I. MCS-51 programozása
30
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. G.I. MCS-51 programozása
31
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 G.I. MCS-51 programozása
32
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 G.I. MCS-51 programozása
33
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) ; á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. G.I. MCS-51 programozása
34
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)). G.I. MCS-51 programozása
35
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 G.I. MCS-51 programozása
36
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) G.I. MCS-51 programozása
37
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. G.I. MCS-51 programozása
38
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ó. G.I. MCS-51 programozása
39
ISP programozás A letöltő kábel és az interface 2005. 10. 14
G.I. MCS-51 programozása
40
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. G.I. MCS-51 programozása
41
Az interfész SUB-D 9 csatlakozójának kiosztása:
A bekötés G.I. MCS-51 programozása
42
A letöltő-program kapcsolói
G.I. MCS-51 programozása
43
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 G.I. MCS-51 programozása
44
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. G.I. MCS-51 programozása
45
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. G.I. MCS-51 programozása
46
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 G.I. MCS-51 programozása
47
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 G.I. MCS-51 programozása
48
(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 G.I. MCS-51 programozása
49
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. G.I. MCS-51 programozása
50
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). G.I. MCS-51 programozása
51
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. G.I. MCS-51 programozása
52
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 G.I. MCS-51 programozása
53
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 ;****************************************************************************************** G.I. MCS-51 programozása
54
Keretprogram (2) ;****************************************************************************************** ; Fordítási parancsok $NOMOD ; 8051 mód tiltása $DATE(04/26/03) ; $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(AT 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! G.I. MCS-51 programozása
55
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 G.I. MCS-51 programozása
56
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 G.I. MCS-51 programozása
57
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,# b ; 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 G.I. MCS-51 programozása
58
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 AT INC fájlban az AT89S8252 SFR regiszter szimbólumok vannak definiálva az Atmel Corporation [6] dokumentációja alapján G.I. MCS-51 programozása
59
Bemenetek, kimenetek programozása
Az adatbevitelnek két formája használatos: programozott vagy lekérdezéses (polling) megszakításos (interrupt) G.I. MCS-51 programozása
60
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 G.I. MCS-51 programozása
61
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é. G.I. MCS-51 programozása
62
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 b G.I. MCS-51 programozása
63
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 b G.I. MCS-51 programozása
64
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 b, vagyis minden megszakítás tiltott, a megszakítások prioritása alacsony és a külső megszakítások szintvezéreltek. G.I. MCS-51 programozása
65
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. G.I. MCS-51 programozása
66
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: G.I. MCS-51 programozása
67
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. G.I. MCS-51 programozása
68
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,$ ; 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. G.I. MCS-51 programozása
69
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 G.I. MCS-51 programozása
70
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,# b ; 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. G.I. MCS-51 programozása
71
Számértéket ASCII-re konvertáló rutin
Hexa_ascii: ANL A,# b ; 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 G.I. MCS-51 programozása
72
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 G.I. MCS-51 programozása
73
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. G.I. MCS-51 programozása
74
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 b é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). G.I. MCS-51 programozása
75
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. G.I. MCS-51 programozása
76
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. G.I. MCS-51 programozása
77
M1 megoldása (3) A futófény programnál egy regiszterben (pl. R7) tároljuk a laplatchbe írandó értéket. A regisztert a b é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). G.I. MCS-51 programozása
78
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 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. G.I. MCS-51 programozása
79
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. G.I. MCS-51 programozása
80
Karakteres LCD modul programozása (3)
Az LCD vezérlő csatlakozó pontjai és értelmezésük G.I. MCS-51 programozása
81
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. G.I. MCS-51 programozása
82
G.I. MCS-51 programozása
83
Karakteres LCD modul programozása (6) Az előző táblázat rövidítései
G.I. MCS-51 programozása
84
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. G.I. MCS-51 programozása
85
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 ; 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 G.I. MCS-51 programozása
86
Karakteres LCD modul programozása (9) Várakoztató (busy) flag kezelése
G.I. MCS-51 programozása
87
Karakteres LCD modul programozása (10) Inicializálás lépései
G.I. MCS-51 programozása
88
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 G.I. MCS-51 programozása
89
Karakteres LCD modul programozása (12) Az LCD inicializálás adatai
G.I. MCS-51 programozása
90
G.I. MCS-51 programozása
91
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. G.I. MCS-51 programozása
92
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ó G.I. MCS-51 programozása
93
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 G.I. MCS-51 programozása
94
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. G.I. MCS-51 programozása
95
Karakteres LCD modul programozása (18)
G.I. MCS-51 programozása
96
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. G.I. MCS-51 programozása
97
Karakteres LCD modul programozása (20)
G.I. MCS-51 programozása
98
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 G.I. MCS-51 programozása
99
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/ sec, kb. 94 ns. A gépi ciklus frekvenciája ennek a 12-ed része Hz, a periódusidő kb. 1,085 s. Ennek megfelelően a számláló regiszterek tartalma másodpercenként 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. G.I. MCS-51 programozása
100
Időzítők, számlálók programozása (2)
A TMOD regiszter bitjei G.I. MCS-51 programozása
101
Időzítők, számlálók programozása (3)
G.I. MCS-51 programozása
102
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.) G.I. MCS-51 programozása
103
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,# b ; Timer 0 Mode1 /16 bites időzítő ORL TMOD,# b ; 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 G.I. MCS-51 programozása
104
Időzítők, számlálók programozása (6)
A 16 bites számláló 0-tól ig számlál, ha 0-ról indul, akkor a 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? Hz/12 = Hz - hány gépi ciklus után kell IT-t kérni? Hz/20 Hz = 46080 - milyen értékről indul a számláló? =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 G.I. MCS-51 programozása
105
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. G.I. MCS-51 programozása
106
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. G.I. MCS-51 programozása
107
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. G.I. MCS-51 programozása
108
Időzítők, számlálók programozása (10)
A Timer 2 üzemmódjai. G.I. MCS-51 programozása
109
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,# b ; Timer 2 auto-reload üzemmód MOV T2MOD,# b ; 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 G.I. MCS-51 programozása
110
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 G.I. MCS-51 programozása
111
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. G.I. MCS-51 programozása
112
Soros port programozása (2)
A soros port üzemmódjai G.I. MCS-51 programozása
113
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 G.I. MCS-51 programozása
114
Soros port programozása (4)
G.I. MCS-51 programozása
115
Soros port programozása (5)
G.I. MCS-51 programozása
116
Soros port programozása (6)
G.I. MCS-51 programozása
117
Soros port programozása (7)
G.I. MCS-51 programozása
118
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. G.I. MCS-51 programozása
119
Soros port programozása (9)
G.I. MCS-51 programozása
120
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. G.I. MCS-51 programozása
121
Soros port programozása (11)
G.I. MCS-51 programozása
122
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. G.I. MCS-51 programozása
123
Soros port programozása (13)
G.I. MCS-51 programozása
124
Soros port programozása (14)
G.I. MCS-51 programozása
125
Soros port programozása (15)
G.I. MCS-51 programozása
126
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. G.I. MCS-51 programozása
127
Soros port programozása (17)
G.I. MCS-51 programozása
128
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. G.I. MCS-51 programozása
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.