Sisteme ncorporate Curs 7 1 Sisteme ncorporate 3

  • Slides: 35
Download presentation
Sisteme Încorporate Curs 7 1

Sisteme Încorporate Curs 7 1

Sisteme Încorporate 3. 2. Limbajul de asamblare al microcontrolerului MC 9 S 12 DJ

Sisteme Încorporate 3. 2. Limbajul de asamblare al microcontrolerului MC 9 S 12 DJ 256 n Setul de registre: 2

Sisteme Încorporate n Moduri de adresare: 3

Sisteme Încorporate n Moduri de adresare: 3

Sisteme Încorporate q q Fiecare mod de adresare, cu excepţia modului inerent, generează o

Sisteme Încorporate q q Fiecare mod de adresare, cu excepţia modului inerent, generează o adresă efectivă pe 16 biţi; este adresa operandului instrucţiunii; Adresarea inerentă: operandul este fie inexistent fie conţinut în registrele UC; se mai numeşte şi adresare implicită; n q Adresare imediată: operandul este codificat în instrucţiune; simbolul #; n q q q Ex. : ldaa $55 Adresare directă extinsă: instrucţiunea conţine întreaga adresă, pe 16 biţi; n q Ex. : ldaa #$55 Adresare directă: instrucţiunea conţine adresa operandului; se mai numeşte şi adresare în pagina 0 întrucît adresa este în domeniul $0000 $00 ff; n q Ex. : clra Ex. : ldaa $5555 Adresarea relativă: instrucţiunea conţine un deplasament cu semn, pe 8 sau 16 biţi; Adresarea indexată: există multe variante; foloseşte un registru pentru a calcula adresa efectivă; Adresare indexată indirectă: adresa calculată conţine adresa efectivă; 4

Sisteme Încorporate 5

Sisteme Încorporate 5

Sisteme Încorporate n Setul de instrucţiuni: q Instrucţiuni de încărcare şi memorare: q Instrucţiuni

Sisteme Încorporate n Setul de instrucţiuni: q Instrucţiuni de încărcare şi memorare: q Instrucţiuni de mutare: 6

Sisteme Încorporate q Instrucţiuni de transfer şi interschimbare: q Instrucţiuni pentru aritmetică în BCD:

Sisteme Încorporate q Instrucţiuni de transfer şi interschimbare: q Instrucţiuni pentru aritmetică în BCD: 7

Sisteme Încorporate q Instrucţiuni de adunare şi scădere: 8

Sisteme Încorporate q Instrucţiuni de adunare şi scădere: 8

Sisteme Încorporate q Instrucţiuni de incrementare şi decrementare: q Instrucţiuni de comparare şi test:

Sisteme Încorporate q Instrucţiuni de incrementare şi decrementare: q Instrucţiuni de comparare şi test: 9

Sisteme Încorporate q Instrucţiuni logice: q Instrucţiuni de ştergere, complementare şi negare: 10

Sisteme Încorporate q Instrucţiuni logice: q Instrucţiuni de ştergere, complementare şi negare: 10

Sisteme Încorporate q Instrucţiuni de înmulţire şi împărţire: q Instrucţiuni la nivel de bit:

Sisteme Încorporate q Instrucţiuni de înmulţire şi împărţire: q Instrucţiuni la nivel de bit: 11

Sisteme Încorporate q Instrucţiuni de deplasare şi rotire: 12

Sisteme Încorporate q Instrucţiuni de deplasare şi rotire: 12

Sisteme Încorporate q Instrucţiuni pentru logică fuzzy: 13

Sisteme Încorporate q Instrucţiuni pentru logică fuzzy: 13

Sisteme Încorporate q Instrucţiuni de maxim şi minim: q Instrucţiune de multiplicare şi acumulare:

Sisteme Încorporate q Instrucţiuni de maxim şi minim: q Instrucţiune de multiplicare şi acumulare: q Instrucţiuni de interpolare: 14

Sisteme Încorporate q Instrucţiuni de salt scurte: 15

Sisteme Încorporate q Instrucţiuni de salt scurte: 15

Sisteme Încorporate q Instrucţiuni de salt lungi: q Instrucţiuni de salt condiţionat pe biţi:

Sisteme Încorporate q Instrucţiuni de salt lungi: q Instrucţiuni de salt condiţionat pe biţi: 16

Sisteme Încorporate q Instrucţiuni de buclare: q Instrucţiuni de salt şi lucru cu subrutinele:

Sisteme Încorporate q Instrucţiuni de buclare: q Instrucţiuni de salt şi lucru cu subrutinele: 17

Sisteme Încorporate q Instrucţiuni de întrerupere: q Instrucţiuni de lucru cu regiştrii de index:

Sisteme Încorporate q Instrucţiuni de întrerupere: q Instrucţiuni de lucru cu regiştrii de index: 18

Sisteme Încorporate q Instrucţiuni de lucru cu stiva: q Instrucţiuni de încărcare a adresei

Sisteme Încorporate q Instrucţiuni de lucru cu stiva: q Instrucţiuni de încărcare a adresei efective: 19

Sisteme Încorporate q Instrucţiuni de lucru cu registrul indicatorilor: q Instrucţiuni de oprire: q

Sisteme Încorporate q Instrucţiuni de lucru cu registrul indicatorilor: q Instrucţiuni de oprire: q Instrucţiuni pemtru modul Background şi instrucţiunea NOP: 20

Sisteme Încorporate n Exemple n Întîrzieri software q q q Soluţie simplă; Întîrzierea calculată

Sisteme Încorporate n Exemple n Întîrzieri software q q q Soluţie simplă; Întîrzierea calculată se modifică dacă apar întreruperi; întreruperile sunt des folosite în SI; UC trebuie să aibă timp de execuţie al instrucţiunilor deterministic (= fără pipeline); UC al HCS 12 are doar o coadă de instrucţiuni, pe 3 nivele, în care doar 1 instrucţiune este executată la un moment dat deci timpul de execuţie este deterministic; Timpul de execuţie este: Tex = N x TE, unde Tex este timpul total de execuţie, N este nr. total de impulsuri de tact iar TE este perioada tactului E care este dublă faţă de cea a tactului extern; Nu este practică soluţia întîrzierilor software în HLL; 21

Sisteme Încorporate q q q Este necesar ca rutinele de întîrziere să nu modifice

Sisteme Încorporate q q q Este necesar ca rutinele de întîrziere să nu modifice registrele; O rutină de întîrziere este caracterizată prin domeniu, rezoluţie şi eroare; Rutină de întîrziere de 100 μs (E = 8 MHz): * apel de subrutină jsr Dly 100 us; [4] **************************************** *subrutină de întîrziere, 100 μs, E = 8 MHz ****************************************** TC 100 U equ 197 ; contor ****************************************** Dly 100 us pshb ; [2] ldab #TC 100 U ; [1] d 100 ulp decb ; [1] bne d 100 ulp ; [3/1] pulb ; [3] rts ; [5] 22

Sisteme Încorporate n n n n Trebuie calculat nr. de perioade de tact ca

Sisteme Încorporate n n n n Trebuie calculat nr. de perioade de tact ca o funcţie de TC 100 U care este numărul de treceri prin buclă; rezoluţia este de 500 ns; Instrucţiunea bne durează 3 perioade de tact atunci cînd face saltul şi doar 1 atunci cînd nu face saltul; Luînd în considerare şi apelul de subrutină, numărul total de impulsuri de tact este: N = 4 + 2 + 1 + (1 + 3)(TC 100 U – 1) + (1 + 1) + 3 + 5 = 13 + 4 x. TC 100 U Pentru o întîrziere de 100 μs sunt necesare: N = Tex/ TE = 100 μs/ 125 ns = 800 perioade Se obţine: TC 100 U = (800 – 13)/ 4 = 196. 75 Rotunjind la 197, se obţine o întîrziere de 100. 125 μs adică o eroare de + 0. 125%; Se poate micşora eroarea introducînd instrucţiuni nop; de ex. introducînd 3 instrucţiuni nop în afara buclei se va obţine: TC 100 U = (800 – 16)/ 4 = 196 Soluţia este limitată de valoarea maximă ce se poate înscrie în TC 100 U (0 pentru 256 treceri prin buclă); întîrzierea maximă este 129. 6 μs; 23

Sisteme Încorporate q Rutină de întîrziere de 1 ms: * apel de subrutină jsr

Sisteme Încorporate q Rutină de întîrziere de 1 ms: * apel de subrutină jsr Dly 1 ms ; [4] **************************************** *subrutină de întîrziere, 1 ms, E = 8 MHz ****************************************** TC 1 MS equ 1996 ; contor ****************************************** Dly 1 ms pshx ; [2] ldx #TC 1 MS ; [3] d 1 mslp decx ; [1] bne d 1 mslp ; [3/1] pulx ; [3] rts ; [5] n N = 15 + 4 x. TC 1 MS; similar pentru 1 ms trebuiesc 8000 perioade → TC 1 MS = 1996. 25 → 1996, adică o eroare de – 0. 0125 μs; n Rezoluţia este tot de 500 ns, valoarea maximă este 32769 ms; 24

Sisteme Încorporate q Rutină de întîrziere de 1 s: * apel de subrutină jsr

Sisteme Încorporate q Rutină de întîrziere de 1 s: * apel de subrutină jsr Dly 1 s ; [4] **************************************** *subrutină de întîrziere, 1 s, E = 8 MHz ****************************************** TC 1 S equ 1000 ; contor ****************************************** Dly 1 s pshx ; [2] ldx #TC 1 S ; [2] d 1 slp jsr Dly 1 ms ; [7999] decx ; [1] bne d 1 slp ; [3/1] pulx ; [3] rts ; [5] n Se apelează de 1000 de ori rutina de întîrziere de 1 ms; n Pentru 1 s trebuiesc 8000000 perioade; n Numărul total din program este 8003014; se obţine o întîrziere de: T = 125 x 8003014 = 1. 000377 s, adică o eroare de + 0. 0377% n Soluţia s – a bazat pe înlănţuirea subrutinelor; este posibilă şi înlănţuirea buclelor; 25

Sisteme Încorporate q Rutină cu întîrziere programabilă: * apel de subrutină jsr Wait. Dms

Sisteme Încorporate q Rutină cu întîrziere programabilă: * apel de subrutină jsr Wait. Dms **************************************** *subrutină cu întîrziere programabilă, în ms, E = 8 MHz; * nr. de ms în ACCD ***************************************** Wait. Dms pshd msdlp jsr Dly 1 ms subd #1 bne msdlp puld rts 26

Sisteme Încorporate n Conversii de date q Detecţii de caractere: n Emulare a funcţiei

Sisteme Încorporate n Conversii de date q Detecţii de caractere: n Emulare a funcţiei isdigit(c) **************************************** *verifică dacă un caracter ASCII este numeric; * caracterul este transmis prin ACCB; rezultatul este depus în ACCB şi Z ***************************************** isdigit cmpb #’ 0’ blo isd_not isd_9 cmpb #’ 9’ bhi isd_not ldab #1 bra isd_rtn isd_not clrb isd_rtn rts 27

Sisteme Încorporate Emulare a funcţiei ishex(c) **************************************** *verifică dacă un caracter ASCII este hexa;

Sisteme Încorporate Emulare a funcţiei ishex(c) **************************************** *verifică dacă un caracter ASCII este hexa; * caracterul este transmis prin ACCB; rezultatul este depus în ACCB şi Z ***************************************** ishex cmpb #’ 0’ ; verifică dacă este între 0 şi 9 blo isnoth cmpb #’ 9’ bls ish cmpb #’A’ ; verifică dacă este între A şi F blo isnoth cmpb #’F’ bls ish cmpb #’a’ ; verifică dacă este între a şi f blo isnoth cmpb #’f’ bls ish isnoth clrb ; nu e hexa, returnează 0 bra ish_rtn ish ldab #1 ; este hexa, returnează 1 ish_rtn rts n 28

Sisteme Încorporate Conversii hexa ↔ ASCII **************************************** * converteşte un caracter hexa în ASCII;

Sisteme Încorporate Conversii hexa ↔ ASCII **************************************** * converteşte un caracter hexa în ASCII; * caracterul este transmis prin ACCB; rezultatul este depus în ACCB ***************************************** htoa cmpb #’ 9’ bhi ha_alpha addb #$30 bra ha_rtn ha_alpha addb #$37 ha_rtn rts n 29

Sisteme Încorporate **************************************** * converteşte un caracter ASCII în hexa; * caracterul este transmis

Sisteme Încorporate **************************************** * converteşte un caracter ASCII în hexa; * caracterul este transmis prin ACCB; rezultatul este depus în ACCB ***************************************** htob cmpb #’ 0’ blo hb_rtn cmpb #’ 9’ bhi hb_lw subb #$30 bra hb_rtn hb_lw cmpb #’A’ blo hb_rtn cmpb #’F’ bhi hb_up subb #$37 bra hb_rtn hb_up cmpb #’a’ blo hb_rtn cmpb #’f’ bhi hb_rtn subb #$37 bhi hb_rtn subb #$57 ha_rtn rts 30

Sisteme Încorporate n Rutine de bază pentru interfaţa SCI: q Registre implicate: SCIBDH, SCIBDL

Sisteme Încorporate n Rutine de bază pentru interfaţa SCI: q Registre implicate: SCIBDH, SCIBDL pentru rata de transfer, SCICR 1 cu rangurile RE şi TE, SCISR 1 cu rangurile RDRF şi TDRE şi SCIDRL pentru date (SCIDRH este necesar doar dacă se programează caracter serial pe 9 biţi); n n Relaţia pentru rata de transfer este: SCI baud rate = SCI module clock / (16 x BR) Rutina de programare **************************************** *programare SCI: 9600 bps, 8 biţi de date, paritate impară, E = 25 MHz; ***************************************** sci_prog movb #0, SCIBDH movb #$a 2, SCIBDL movb #$06, SCICR 1 movb #$0 c, SCISR 1 rts 31

Sisteme Încorporate n Rutina de citire caracter: **************************************** *caracterul citit este încărcat în ACCB;

Sisteme Încorporate n Rutina de citire caracter: **************************************** *caracterul citit este încărcat în ACCB; ***************************************** sci_read clrb read brclr SCISR 1, RDRF, read ldab SCIDRL rts n Rutina de scriere caracter: **************************************** *caracterul este luat din ACCB; ***************************************** sci_write brclr SCICR 1, TDRE, sci_write stab SCIDRL rts 32

Sisteme Încorporate n Rutina getchar() **************************************** *citeşte de la SCI pînă primeşte un caracter;

Sisteme Încorporate n Rutina getchar() **************************************** *citeşte de la SCI pînă primeşte un caracter; preia caracterul în ACCB; ***************************************** getchar jsr sci_read ; aşteaptă caracterul cmpb #0 beq getchar rts n Rutina putchar() **************************************** *caracterul este luat din ACCB; ***************************************** putchar brclr SCISR 1, TDRE, sci_write stab SCIDRL rts 33

Sisteme Încorporate n Rutina purstrg() **************************************** *trimite un şir terminat cu NULL; indicatorul este

Sisteme Încorporate n Rutina purstrg() **************************************** *trimite un şir terminat cu NULL; indicatorul este în ACCD; ***************************************** putstrg pshx ; salvează în stivă reg. IX tfr d, x ; indicatorul este transferat în IX ps_nxt ldab 1, x+ cmpb #NULL ; trimite pînă la caracterul NULL beq puts_rtn jsr putchar bra ps_nxt puts_rtn tfr x, d pulx ; reface IX rts n Program pentru trimitere mesaj: **************************************** *trimite mesajul Hello world; ***************************************** ldd #Hello. Msg jsr putstrg. . Hello. Msg fcc ‘Hello world’ fcb 0 34

Sisteme Încorporate n Monitorizarea activităţii seriale: **************************************** *aprinde un led, conectat la PORTP, bitul

Sisteme Încorporate n Monitorizarea activităţii seriale: **************************************** *aprinde un led, conectat la PORTP, bitul 0, dacă este transfer pe Rx. D sau Tx. D; ***************************************** main bset PORTP, BIT 0 bset DDRP, BIT 0 smon_lp brset PORTS, Rx. D_BIT �Tx. D_BIT, sm_idle ; [4] bclr PORTP, BIT 0 ; [4] bra smon_lp ; [3] sm_idle bset PORTP, BIT 0 ; [4] bra smon_lp ; [3] n Timpul între 2 citiri este: TS = 125 ns x (4 + 3) = 1. 375 μs; n Valoarea maximă a ratei de transfer trebuie să fie: Rmax = 1/ 1. 375 μs = 727. 27 kbps; ratele de transfer de la interfaţa SCI sunt mult mai mici; n Timpul de răspuns este: TR = TS + TD = 1. 375 + 1. 02 = 2. 377 μs, unde TD = TTD + t. PWD = 125 ns(4 + 4) + 20 = 1. 02 μs; TD este timpul de întîrziere al taskului (calculat la 8 MHz) iar t. PWD este timpul de întîrziere la port; n Timpul de întîrziere pare mare dar este potrivit pentru această aplicaţie. 35