Mechatronika és mikroszámítógépek 2016/2017 I. félév Bevezetés az assembly nyelvbe
Makro utasítások felépítése - emlékeztető Általános forma: operation code (Általános forma: instruction 3 című utasítás: operands 1. operandus, 2. operandus, eredmény címe 2 című utasítás : destination, source) 1. operandus, 2. operandus, eredmény az első operandus helyén 1 című utasítás: 1. operandus, eredmény az operandusban 2016.09.21. Bevezetés az assembly nyelvbe 2
Memóriacímzési módok Addressing Modes Címzési mód Instruction /Utasítás Register Regiszter MOV A, B Direct Direkt pl. SFR regiszterek MOV 30H,A Indirect Indirekt pl. felső 128 B RAM, pointer ADD A,@R0 Immediate Constant Konstans/Literál ADD A,#0x80 Relative Relatív SJMP AHEAD Absolute Abszolút AJMP BACK Long Távoli LJMP FAR_AHEAD Indexed Indexelt MOVC A,@A+DPTR 2016.09.21. Bevezetés az assembly nyelvbe 3
Memóriacímzési módok Regiszter címzés Pl. MOV P5, A F5 85 Legyen <A> = 2CH, ez lesz áttöltve a P5 portra. Direkt címzés Pl. MOV A, 20H E5 20 Legyen <20H> = B7H, ez lesz áttöltve az akkumulátorba. Indirekt címzés - pointer Pl. MOV @R0,A F6 Legyen <R0> = 82H; <A> = A9H; Eredmény : 82H című rekesz tartalma A9H lesz. Fontos : indirekt címzéshez csak az R0, R1 és DPTR használható. 2016.09.21. Bevezetés az assembly nyelvbe 4
Memóriacímzési módok Külső memória (64 k) elérése: Pl. MOVX A,@DPTR E0 Legyen <DPTR> = 1200H; <1200H> = C5H; Eredmény : A = C5H lesz. Indexelt címzés Pl. MOVC A,@A+DPTR 02 80 02 A kód szegmensnek (ROM) az <A> + DPTR című memória értéke lesz áttöltve az akkumulátorba. Az akkumulátor index regiszterként használatos Ciklus szervezéséhez (vagy táblázat kezeléséhez) használjuk 2016.09.21. Bevezetés az assembly nyelvbe 5
Memóriacímzési módok Konstans/Literál címzés Pl. ADD A,#25 24 19 Legyen <A> = 20H; Az eredmény A = 39H lesz. Legyen <A> = F0H; Az eredmény A = 09H és CY=1 lesz. Relatív címzés Pl. SJMP #25 80 17 és nem 19! Előre ugrik 23-at a jelen utasítás (2 byte) végétől! Pl. SJMP #-20 80 EA -16H és nem -14H! Visszafelé ugrik 22-őt a jelen utasítás (2 byte) végétől! Az ugrás -128.. 127 címtartományban lehet (8 bit komplemens) Ugró és feltételes ugró utasítások használják (CJNE, DJNZ, JZ stb.) 2016.09.21. Bevezetés az assembly nyelvbe 6
Memóriacímzési módok Abszolút címzés Pl. AJMP #200H 02 00 Előre ugrik a 200H címre Az ugrás 0..2047 (0..=7FFH) címtartományban lehet (11 bit) Az AJMP és ACALL utasítások használják Távoli címzés Pl. LJMP #8002H 02 80 02 Előre ugrik a 8002H címre A cím 16 bit, ugrás 0..=FFFFH címtartományban lehet (16 bit) Az LJMP és LCALL utasítások használják 2016.09.21. Bevezetés az assembly nyelvbe 7
Utasítás csoportok - emlékezetető Arithmetic Operations - Aritmetikai Logical Operations - Logikai Data Transfer Operations - Adatmozgatás Boolean Variable Op. - Bit szintű logika Program Branching Op. - Elágazások Általános forma: instruction destination, source 2016.09.21. Bevezetés az assembly nyelvbe 8
Aritmetikai utasítások Mnemonic Description Mnemonic Description ADD A, Rn A = A + [Rn] INC A A = A + 1 ADD A, direct A = A + [direct memory] INC Rn [Rn] = [Rn] + 1 ADD A,@Ri A = A + [memory pointed to by Ri] INC direct [direct] = [direct] + 1 ADD A,#data A = A + immediate data INC @Ri [@Ri] = [@Ri] + 1 ADDC A,Rn A = A + [Rn] + CY DEC A A = A - 1 ADDC A, direct A = A + [direct memory] + CY DEC Rn [Rn] = [Rn] - 1 ADDC A,@Ri A = A + [memory pointed to by Ri] + CY DEC direct [direct] = [direct] - 1 ADDC A,#data A = A + immediate data + CY DEC @Ri [@Ri] = [@Ri] - 1 SUBB A,Rn A = A - [Rn] - CY MUL AB Multiply A & B SUBB A, direct A = A - [direct memory] - CY DIV AB Divide A by B SUBB A,@Ri A = A - [@Ri] - CY DA A Decimal adjust A SUBB A,#data A = A - immediate data - CY 2016.09.21. Bevezetés az assembly nyelvbe 9
Logikai utasítások Mnemonic Description Mnemonic Description ANL A, Rn A = A & [Rn] XRL A, Rn A = A XOR [Rn] ANL A, direct A = A & [direct memory] XRL A, direct A = A XOR [direct memory] ANL A,@Ri A = A & [memory pointed to by Ri] XRL A,@Ri A = A XOR [@Ri] ANL A,#data A= A & immediate data XRL A,#data A = A XOR immediate da ta ANL direct,a [direct] = [direct] & A XRL direct,a [direct] = [direct] XOR A ANL direct,#data [direct] = [direct] & immediate data XRL direct,#data [direct] = [direct] XOR immediate data ORL A, Rn A = A OR [Rn] CLR A Clear A ORL A, direct A = A OR [direct] CPL A Complement A ORL A,@Ri A = A OR [@Ri] RL A Rotate A left ORL A,#data A = A OR immediate data RLC A Rotate A left (through C) ORL direct,a [direct] = [direct] OR A RR A Rotate A right ORL direct,#data [direct] = [direct] OR immediate data RRC A Rotate A right (through C) SWAP A Swap nibbles 2016.09.21. Bevezetés az assembly nyelvbe 10
Adat mozgató utasítások Mnemonic MOV @Ri, direct MOV @Ri, #data MOV DPTR, #data 16 MOVC A,@A+DPTR MOVC A,@A+PC MOVX A,@Ri MOVX A,@DPTR MOVX @Ri, A MOVX @DPTR,A PUSH direct POP direct XCH A,Rn XCH A, direct XCH A, @Ri XCHD A,@Ri Description [@Ri] = [direct] [@Ri] = immediate data [DPTR] = immediate data A = Code byte from [@A+DPTR] A = Code byte from [@A+PC] A = Data byte from external ram [@Ri] A = Data byte from external ram [@DPTR] External[@Ri] = A External[@DPTR] = A Push into stack Pop from stack A = [Rn], [Rn] = A A = [direct], [direct] = A A = [@ Rn], [@Rn] = A Exchange low order digits 2016.09.21. Bevezetés az assembly nyelvbe 11
Bit vezérelt utasítások Mnemonic Description CLR C Clear CY CLR bit Clear direct bit SETB C Set CY SETB bit Set direct bit CPL C Complement CY CPL bit Complement direct bit ANL C,bit AND bit with CY ANL C,/bit AND NOT bit with CY ORL C,bit OR bit with CY ORL C,/bit OR NOT bit with CY MOV C,bit MOV bit to CY MOV bit,c MOV CY to bit JC rel Jump if CY set JNC rel Jump if CY not set JB bit,rel Jump if specified bit set JNB bit,rel Jump if specified bit not set JBC bit,rel if specified bit set then clear it and jump 2016.09.21. Bevezetés az assembly nyelvbe 12
Elágazások Mnemonic Description ACALL addr11 Absolute subroutine call LCALL addr16 Long subroutine call RET Return from subroutine RETI Return from interrupt AJMP addr11 Absolute jump LJMP addr16 Long jump SJMP rel Short jump JMP @A+DPTR Jump indirect JZ rel Jump if A=0 JNZ rel Jump if A NOT=0 CJNE A,direct,rel CJNE A,#data,rel CJNE Rn,#data,rel Compare and Jump if Not Equal CJNE @Ri,#data,rel DJNZ Rn,rel DJNZ direct,rel Decrement and Jump if Not Zero NOP No Operation 2016.09.21. Bevezetés az assembly nyelvbe 13
8051 ASM alapstruktúrák 1. Egyszerű elágazás (If-Then-Else) If a=2 then p5:=255 else p5:=31; cjne a,#2,else ; ha a<>2 ugrás az else-re mov P5,#0xFF ; then ág sjmp forward else: mov P5,#31 ; else ág forward: If r1>=r2 then r2:=r2+1 else r2:=r2-1; clr c mov a,r1 subb a,r2 jc else inc r2 sjmp forward else: dec r2 forward: ; Carry=0, ha r1>=r2 ; then ág ; else ág 2016.09.21. Bevezetés az assembly nyelvbe 14
8051 ASM alapstruktúrák 2. Értékvizsgálat (Case) Case r1 of 1 : P5:=$1F; 2 : P5:=$2F; 4 : P5:=$3F; 8 : P5:=$4F else P5:=$5F; end; case_1: cjne r1,#1,case_2 orl P5,#0x1F sjmp forward case_2: cjne r1,#2,case_4 orl P5,#0x2F sjmp forward case_4: cjne r1,#4,case_8 orl P5,#0x3F sjmp forward case_8: cjne r1,#8,case_else orl P5,#0x4F sjmp forward case_else: orl P5,#0x5F forward: 2016.09.21. Bevezetés az assembly nyelvbe 15
8051 ASM alapstruktúrák 3. Feltételes Ciklusok while r2<>[0xa8] do [0xA8]:=[0xA8]+1; r0:=$80 repeat r0:=r0/2; until r0=$10 whileloop: mov a,r2 cjne a,0xa8,loopkernel sjmp forward loopkernel: inc 0xA8 sjmp whileloop forward: mov r0,#0x80 repeat_loop: mov a,r0 mov b,#2 div ab mov r0,a cjne r0,#0x10,repeat_loop 2016.09.21. Bevezetés az assembly nyelvbe 16
GPIO Konfigurálása Port Addr GPIO mode Addr Info P0 (bit add) 0x80 P0MDOUT.[7:0] 0xA4 bitenként 0:Open-Drain 1:PushPull P1 (bit add) 0x90 P1MDOUT.[7:0] 0xA5 bitenként 0:Open-Drain 1:PushPull P1MDIN.[7:0] 0xBD bitenként 0:Analog in 1:GPIO P2 (bit add) 0xA0 P2MDOUT.[7:0] 0xA6 bitenként 0:Open-Drain 1:PushPull P3 (bit add) 0xB0 P3MDOUT.[7:0] 0xA7 bitenként 0:Open-Drain 1:PushPull P3IF 0xAD Port 3 interrupt flag register P4 (byte ) 0x84 P74OUT 0xB5 P74OUT.1 -> P4[7:4]; P74OUT.0->P4[3:0] P5 (byte ) 0x85 P74OUT 0xB5 P74OUT.3 -> P5[7:4]; P74OUT.2->P5[3:0] P6 (byte ) 0x86 P74OUT 0xB5 P74OUT.5 -> P6[7:4]; P74OUT.4->P6[3:0] P7 (byte ) 0x96 P74OUT 0xB5 P74OUT.7 -> P7[7:4]; P74OUT.6->P7[3:0] XBR2.6 XBARE Crossbar Enable Bit. 0: Crossbar disabled. All pins on Ports 0, 1, 2, 3, are forced to Input mode. 1: Crossbar enabled. 2016.09.21. Bevezetés az assembly nyelvbe 17
Portok vezérlésének beállítása P74OUT (Port 7 4 output mode) regiszter Alapéretelmezett értéke: 0x00 (reset után ide áll vissza) Px (Ports x data) regiszter x: 7 4 (P4, P5, P6, P7) 2016.09.21. Bevezetés az assembly nyelvbe 18
Watchdog timer Watchdog Timer Control Register (WDTCN) 0xFF Engedélyezés, újraindítás: mov WDTCN,#0xA5 Letiltás: mov WDTCN,#0xDE mov WDTCN,#0xAD Letiltás letiltása: mov WDTCN,#0xFF Tankönyv 89. oldaltól.. 2016.09.21. Bevezetés az assembly nyelvbe 19
Első ASM program Első ASM program: LED villogtatás (mindegyik/csak 1) 1 sec időközzel A mai óra lépései: Ismerkedés a fejlesztői környezettel Általános programváz kialakítása valamennyi programot ez alapján írjuk majd meg RAM SFR memóriaterületek definiálása Kódszegmens megadása Inicializáló szubrutin megírása Programtörzs (végtelen ciklus!!!!!!!) megírása Nagyon egyszerű időzítés megírása (ZH-n nem elfogadható) A megírt program működtetése 2016.09.21. Bevezetés az assembly nyelvbe 20
Új project Silabs IDE 1. Eszköz összeállítása, számítógépre majd csatlakoztatása USB kábelen keresztül a 2. Fejlesztői környezet elindítása 3. Option/Connection Options USB adapter ellenőrzése Ugyanitt Debug Interface-almenüben C2 helyett JTAG kiválasztása. 4. Project/Tool Chain Integration - SDCC ellenőrzése Assembler: Program Files(x86)/SDCC/bin/asx8051.exe Compiler és Linker: Program Files(x86)/SDCC/bin/sdcc.exe 5. Project/New Project: C80510F2x és Blank Project (név és hely megadásával) 6. File/New File: ASM Source File és Add to Project (név és hely megadásával) 7. Program megírása, Rebuild All, Connect, DL, Zöld gomb 8. Mentés, végén kimentés wordpad (.txt) formátumba, így elegendő egy projekt az egész ASM félévre 2016.09.21. Bevezetés az assembly nyelvbe 21
1 másodperces villogtatás eszköz elindítása órajel, portok, gombok, kapcsolók stb... kezdeti értékeinek definiálása 1 másodpercig várunk ez alatt nem csinálunk semmit sem - számolás ha lejárt az 1 másodperc, a LED - eken állapotot váltunk addig fut a program, amíg le nem állítjuk ( ciklus) 2016.09.21. Bevezetés az assembly nyelvbe 22
1 másodperces időzítő működése egymásba ágyazott for ciklusok djnz: csökkentsd eggyel a regiszter tartalmát, és ugorj, ha az eredmény nem zérus! Egy djnz parancs 3 órajel alatt fut le. A keso0 be van ágyazva a keso1 alá, ami a keso2 alá. A keso0 ciklus (benne a djnz parancs) ezért lefut összesen 256*256*10=655 360 alkalommal (=R0*R1*R2), ez összesen 1 966 080 órajel (=R0*R1*R2*3) Ha az órajel 2 MHz, akkor 1 másodperc alatt 2 000 000 órajel fut le, a különbség 33 920 órajel, azaz kb. 0,017 másodperc 2016.09.21. Bevezetés az assembly nyelvbe 23
1 másodperces időzítő szubrutin működése djnz R1,keso1 djnz R2,keso2 djnz R0,keso0 3 órajel ciklus 2016.09.21. Bevezetés az assembly nyelvbe 24
A következő órára Otthoni EGYÉNI - feladat: Módosítsuk a mai órán megírt programot úgy, hogy a LED-ek az alábbi sorrendben világítsanak egy végtelen ciklusban!: P5.4, P5.6, P5.5, P5.7 A programot a lehető legegyszerűbben írjuk meg, egy időzítéssel! Egy másodpercig világít, majd jön a következő, amely szintén egy másodpercig világít, stb. Most még használjuk az órán megírt időzítést! Ha időnk engedi, írjuk meg a programot (az órait is) többféleképpen is! (Többféle, egymástól alig különböző megoldás is lehetséges.) Lehet játszani különböző ciklikus LED kiírásokkal, álmodjátok meg Beküldés:.txt formátumban: gyakot megelőző este 8 óra! Tankönyv 3. fejezete (kb. 30 oldal). Következő alkalom: Gombkezelés Szekvenciák 2016.09.21. Bevezetés az assembly nyelvbe 25
Bevezetés az assembly nyelvbe Vége a második gyakorlatnak. 26