Curs 9 - Micro Control Ere PIC de 8 Biti - Setul de Instructiuni

download Curs 9 - Micro Control Ere PIC de 8 Biti - Setul de Instructiuni

of 12

Transcript of Curs 9 - Micro Control Ere PIC de 8 Biti - Setul de Instructiuni

Curs 9Microcontrolere PIC de 8 bii - setul de instruciuniSetul de instruciuni ortogonal - o instruciune poate lucra cu orice registru (locaie din memoria RAM) Exist trei categorii de instruciuni: instruciuni de lucru pe octet 13 OPCOD 8 7 d 6 f 0

OPCOD cod operaie 6 bii f adres direct registru (file) 7 bii d destinaia rezultatului: 0 W; 1 f (implicit) 13 OPCOD 10 9 b 7 6 f 0

instruciuni de lucru pe bit

OPCOD cod operaie 4 bii b adres bit din octet 3 bii f adres direct registru 7 bii

instruciuni de lucru cu constante (literali) i de control

13 OPCOD

8 7 k

0

13

11 10 k

0

OPCOD

OPCOD cod operaie 6 bii k constant imediat 8 bii

OPCOD cod operaie 3 bii k adres program 11 bii (numai GOTO i CALL)

Instruciuni de transfer Nr. Crt. 1 2 3 4 5 Mnemonic, Descriere operanzi MOVF MOVWF MOVLW CLRF CLRW f,d f k f Move f Move W to f MOVe Literal to W Clear f Clear W Operaie dest f fW Wk f0 W0 Cod main Nr. Indicatori Cicli Msb Lsb de condiie 1 1 1 1 1 00 1000 dfff ffff 00 0000 1fff ffff 11 00xx kkkk kkkk 00 0001 1fff ffff 00 0001 0xxx xxxx Z Z Z Z

Observaii: dest = W dac d=0 sau dest = f dac d=1. Dac valoarea transferat a fost 0, Z=1; altfel, Z=0 Exemple: MOVF MOVF MOVF MOVWF MOVWF MOVLW MOVLW MOVLW CLRF CLRW FSR, W ; Coninutul registrului FSR se copie n W INDF, W ; Coninutul locaiei RAM de la adresa din FSR (adresare indirect) se copie n W FSR, F ; Coninutul registrului FSR este copiat n el nsui (pentru a testa valoarea din FSR) FSR ; Coninutul registrului W este copiat n registrul FSR INDF ; coninutul registrului W este copiat n locaia adresat de FSR 0x5A ; iniializeaz W cu 0x5A const ; valoarea constantei simbolice const se ncarc n W HIGH(tabel) ; octetul mai semnificativ al adresei tabelului se ncarc n W FSR ; FSR=0 ; W=0

Instruciuni aritmetice Nr. Crt. 6 7 8 9 Mnemonic, Descriere operanzi ADDWF ADDLW INCF INCFSZ f,d k f,d f,d ADD W and f ADD Literal and W Increment f Increment f, Skip if 0 Operaie dest W + f W k +W dest f + 1 dest f + 1 if dest=0, PC=PC+1 10 SUBWF 11 SUBLW 12 DECF 13 DECFSZ f,d k f,d f,d Substract W from f SUBstract W from Literal Decrement f Decrement f dest f W WkW dest f 1 dest f 1 if dest=0, PC=PC+1 Exemple: ADDWF SUBWF ADDWF SUBLW INCF INCF DECFSZ FSR, W INDF, F PCL 0x20 CNT, F INDF, W CNT, F ; ; ; ; ; ; ; Coninutul registrului FSR se adun cu cel al registrului W, rezultatul n W Din coninutul locaiei adresate de FSR se scade coninutul registrului W La valoarea din PCL se adaug valoarea din W Din valoarea 0x20 se scade W, rezultatul n W Coninutul locaiei CNT este incrementat Coninutul locaiei adresate de FSR este incrementat i ncrcat n W CNT este decrementat i dac devine 0 se sare peste instruciunea urmtoare 1 1 1 1(2) 00 0010 dfff ffff 11 110x kkkk kkkk 00 0011 dfff ffff 00 1011 dfff ffff C, DC, Z C, DC, Z Z Indicatori Nr. Cod main de condiie Cicli Msb Lsb 1 1 1 1(2) 00 0111 dfff ffff 11 111x kkkk kkkk 00 1010 dfff ffff 00 1111 dfff ffff C, DC, Z C, DC, Z Z

Instruciuni logice Nr. Crt. Mnemonic, Descriere operanzi f,d k f,d k f,d k f,d f,d f,d f,d ADD W and f AND Literal and W Inclusive OR W with f Inclusive OR literal with W eXclusive OR W with f eXclusive OR Literal with W COMplement f Rotate Left f through Carry Rotate Right f through Carry SWAP nibbles in f Operaie dest W f WWk dest W f WWk dest W f WWk dest f dest f 1 destf3:0 f7:f4 Nr. Cod main Indicatori Cicli Msb Lsb de condiie 00 0101 dfff ffff 1 Z 1 1 1 1 1 1 1 1 1 11 1001 kkkk kkkk 00 0100 dfff ffff 11 1000 kkkk kkkk 00 0110 dfff ffff 11 1010 kkkk kkkk 00 1001 dfff ffff 00 1101 dfff ffff 00 1100 dfff ffff 00 1110 dfff ffff Z Z Z Z Z Z C C

14 ANDWF 15 ANDLW 16 IORWF 17 IORLW 18 XORWF 19 XORLW 20 COMF 21 RLF 22 RRF 23 SWAPF Exemple: ANDWF IORWF XORWF ANDLW COMF RLF SWAPF

FSR, F INDF, W REZ, W 0xF0 REG,F INDF,F REG,W

; ; ; ; ; ; ;

I logic ntre coninutul registrului FSR i cel al registrului W, rezultatul n FSR SAU ntre locaia indicat de FSR i registrul W, rezultatul n W XOR ntre locaia REZ i registrul W, rezultatul n W Foreaz n 0 cei mai puin semnificativi 4 bii din W Complementeaz (fa de 1) coninutul locaiei REG Rotete spre stnga cu o poziie coninutul locaiei adresate de FSR, prin Carry W REG3:0 REG7:4

Instruciuni de lucru pe bit Nr. Crt. Mnemonic, Descriere operanzi f,b f,b f,b f,b Bit Clear f Bit Set f Bit Test f, Skip if Clear Bit Test f, Skip if Set fb=0 fb=1 if fb=0, PC=PC+1 if fb=1, PC=PC+1 Nr. Indicatori Cod main cicli Msb Lsb de condiie 01 00bb bfff ffff 1 1 1(2) 1(2) 01 01bb bfff ffff 01 10bb bfff ffff 01 11bb bfff ffff

24 BCF 25 BSF 26 BTFSC 27 BTFSS Exemple: BCF REG, 7 BSF INDF, 4 BTFSC GOTO zero ... BTFSS GOTO unu ...

; Bitul 7 din locaia REG este resetat ; Bitul 4 din locaia adresat de FSR este setat FLAG,3 bit3unu ; testeaz dac bitul 3 din locaia FLAG este 0 ; dac a fost fals, se execut instruciunea ; dac a fost adevrat, se continu de aici ; testeaz dac bitul 3 din locaia FLAG este 1 ; dac a fost fals, se execut instruciunea ; dac a fost adevrat, se continu de aici

FLAG,2 bit2zero

Instruciuni de ramificare Nr. Crt. Mnemonic, Descriere operanzi k CALL subroutineTOS PC+1 PC10:0 k PC12:11PCLATH4:3

Indicatori Cod main Nr. de condiie cicli Msb Lsb 2 10 0kkk kkkk kkkk

28 CALL

29 GOTO 30 RETURN 31 RETLW 32 RETFIE Exemple: CALL GOTO RETURN RETLW RETFIE rutina loop A

k

Go to address

PC10:0 k PC12:11PCLATH4:3

2 2 2 2

10 1kkk kkkk kkkk 00 0000 0000 1000 11 01xx kkkk kkkk 00 0000 0000 1001

RETURN from subroutine PC TOS k RETURN with Literal in W PC TOS, W k RETURN from interruptPC TOS, GIE 1

; ; ; ; ;

apeleaz secvena de cod de la adresa rutina sare la adresa loop revine la adresa din vrful stivei revine la adresa din vrful stivei cu W = A revine la adresa din vrful stivei, revalideaz ntreruperile (GIE=1)

Realizarea salturilor cu instruciuni GOTO (salt la adrese cunoscute la momentul scrierii codului) RESET movlw movwf goto nop movlw movwf goto HIGH main PCLATH main HIGH rutint PCLATH rutint ; adresa de intrare dup reset ; ncarc PCLATH cu codul paginii de memorie n care se afl main ; sare la adresa main ; adresa de intrare dup reset ; ncarc PCLATH cu codul paginii de memorie n care se afl rutint ; sare la adresa rutint

INT

Realizarea salturilor cu instruciuni de modificare explicit a registrului PCL mowlw movwf mowlw movwf HIGH eticheta PCLATH LOW eticheta PCL ; ncarc PCLATH cu octetul superior al adresei eticheta ; ncarc PCL cu octetul inferior al adresei eticheta

Accesul la date constante n memoria program folosind adresarea relativ la PC movlw movwf movf call movwf ... addwf retlw retlw retlw HIGH string PCLATH index,w string PORTB PCL,F S i r ; ; ; ; ; ; ; ; ncarc PCLATH cu octetul superior al adresei string preia n W indexul n tabel apeleaz rutina string afieaz caracterul ASCII din W calculeaz saltul revine cu S n W revine cu i n W revine cu r n W

string

Nr. Crt.

Mnemonic, Descriere operanzi Go into standby modeWDT 0 Prescaler WDT 0 /TO 1, /PD 0

Cod main Nr. Indicatori cicli Msb Lsb de condiie 1 00 0000 0110 0011 /TO, /PD

33 SLEEP

34 CLRWDT

Clear Watchdog Timer

WDT 0 Prescaler WDT 0 /TO 1, /PD 1

1

00 0000 0110 0100

/TO, /PD

35

NOP

No operation

1

00 0000 0xx0 0000

Ceasul de gard (WDT) i modul de consum redus (SLEEP)

Ceasul de gard un timer cu funcionare continu (free running timer), pilotat de un oscilator intern RC (altul dect cel al UCP), care nu necesit componente externe. WDT funcioneaz chiar dac oscilatorul principal este oprit (la execuia unei instruciuni SLEEP). WDT este validat/inhibat de un bit de configurare a dispozitivului (WDTE). Acest bit, mpreun cu ali bii de configurare a dispozitivului, nu poate fi accesat la momentul execuiei programului, ci numai n regim de programare, fiind amplasat la adresa 2007h din memoria program. Odat validat, funcionarea WDT nu poate fi inhibat prin program.

Funcii selectabile prin cuvntul de configurare: - Protecia memoriei program (CP1:CP0) - Protecia memoriei EEPROM (DP) - Validarea mecanismului brownout reset (BODEN) - Validarea timerului Power-up Timer (/PWRTE) - Validarea funciei de resetare extern pe pinul /MCLR (MCLRE) - Validarea ceasului de gard (WDTE) - Selectarea modului de pilotare a UCP (FOSC1:FOSC0 sau FOSC2:FOSC0). Se recomand ca operaia de configurare s fie legat de codul surs. La programarea dispozitivului s se ncarce att codul aplicaiei, ct i configuraia dorit. Se reduce riscul lansrii unui program de aplicaie pe un dispozitiv configurat necorespunztor. Acest lucru este posibil prin utilizarea directivei de asamblare CONFIG, recunoscut de asamblorul MPASM, ca n exemplul urmtor: LIST p=16F877 #INCLUDE __CONFIG ; definete tipul dispozitivului ; include definiiile funciilor selectabile din cuvntul de configurare

_XT_OSC & _PWRTE_ON & _BODEN_OFF & _CP_OFF & _WDT_ON

Structura intern i funcionarea WDT

WDT are o durat de time-out nominal de 18ms (poate varia cu condiiile de temperatur i de alimentare). Aceasta poate fi crescut, folosind un divizor suplimentar selectabil (postscaler) cu 2-4-8-16-64-128, cu ajutorul biilor PS2:PS0 din registrul SFR OPTION_REG. Se pot obine astfel durate de time-out de circa 2,3 secunde (18 128). Numrtorul postscaler poate fi utilizat: - de ctre WDT - dac bitul PSA=1 din registrul OPTION_REG - de ctre Timerul 0, ca prescaler - dac bitul PSA=0 Instruciunile CLRWDT i SLEEP terg WDT i numrtorul postscaler (dac este utilizat), prevenind generarea unui reset cauzate de expirarea perioadei de time-out WDT. Bitul /TO din registrul STATUS: - va fi setat (dezactivat) la tergerea forat a WDT (execuia unei instruciuni CLRWDT sau SLEEP) - va fi resetat (activat) la expirarea perioadei de time-out. Factorul de divizare folosit de numrtorul postscaler poate fi modificat prin program, on-the-fly (n timpul funcionrii). Pentru a se evita o resetare accidental cauzat de WDT, se recomand ca aceast operaie s fie precedat de o instructiunie CLRWDT. De asemenea, numrtorul postscaler poate fi comutat ntre WDT i Timerul 0. Pentru a se evita o resetare accidental cauzat de WDT, se recomand utilizarea unei secvene de cod care trebuie: - s tearg WDT, Timer 0 i numrtorul postscaler, la un factor de divizare altul dect 1:1 - s comute utilizarea numrtorului postscaler i (eventual) s seteze factorul de divizare final.

Modul de consum redus Power-down Instruciunea SLEEP oprete oscilatorul, ceea ce reduce drastic consumul dispozitivului. Dac WDT este validat, instruciunea SLEEP l rearmeaz, iar acesta continu s funcioneze. De asemenea, /PD=0, /TO=1. Ieirea din modul Power-down poate fi fcut de: - o resetare a dispozitivului - WDT - orice periferic intern care i poate activa flagul de ntrerupere n modul Power-down. Dup o resetare la conectarea alimentrii, /PD=1. Dac dup o resetare /PD=0, nseamn c resetarea s-a produs din modul Power-down. Ultimele dou situaii asigur repornirea dispozitivului fr a-l reseta (repornire din starea n care a fost oprit). Dac la repornire /TO=0, repornirea a fost cauzat de WDT, iar execuia continu cu urmtoarea instruciune de dup SLEEP. Dac la repornire /TO=1, nseamn c repornirea a fost cauzat de o cerere de ntrerupere de la un periferic care avea validat individual cererea de intrerupere. Dac ntreruperile erau inhibate la nivel global, execuia este reluat cu urmtoarea instruciune dup SLEEP. Dac intreruperile erau validate la nivel global, mai nti se va executa instruciunea de dup SLEEP, apoi se va face saltul la adresa rutinei de tratare a ntreruperii (0004h).