Istruzioni del PICmicro 16F84

Materie:Appunti
Categoria:Sistemi
Download:219
Data:20.03.2007
Numero di pagine:14
Formato di file:.doc (Microsoft Word)
Download   Anteprima
istruzioni-picmicro-16f84_1.zip (Dimensione: 22.53 Kb)
trucheck.it_istruzioni-del-picmicro-16f84.doc     123 Kb
readme.txt     59 Bytes


Testo

Set di istruzioni del PICmicro 16F84
Sintassi Descrizione Microchip Operazione equivalente
ADDLW k Add Literal and W W = W + k
ADDWF f,d Add W and f d = W + f (dove d può essere W o f)
ANDLW k AND Literal with W W = W AND k
ANDWF f,d AND W with f d = W AND f (dove d può essere W o f)
BCF f,b Bit Clear f f(b) = 0
BSF f,b Bit Set f f(b) = 1
BTFSC f,b Bit Test f, Skip if Clear f(b) = 0 ? Si, salta una istruzione
BTFSS f,b Bit Test f, skip if Set f(b) = 1 ? Si, salta una istruzione
CALL k Subroutine Call Chiama la subroutine all'indirizzo k
CLRF f Clear f f = 0
CLRW Clear W Register W = 0
CLRWDT Clear Watchdog Timer Watchdog timer = 0
COMF f,d Complement f d = not f (dove d può essere W o f)
DECF f,d Decrement f d = f -1 (dove d può essere W o f)
DECFSZ f,d Decrement f, Skip if 0 d = f -1 (dove d può essere W o f) se d = 0 salta
GOTO k Go to address Salta all'indirizzo k
INCF f,d Increment f d = f +1 (dove d può essere W o f)
INCFSZ f,d Increment f, Skip if 0 d = f +1 (dove d può essere W o f) se d = 0 salta
IORLW k Inclusive OR Literal with W W = W OR k
IORWF f,d Inclusive OR W with f d = f OR W (dove d può essere W o f)
MOVLW k Move literal to W W = k
MOVF f,d Move f d = f (dove d può essere W o f)
MOVWF f Move W to f f = W
NOP No Operation Nessuna operazione
OPTION Load Option Register OPTION = W
RETFIE Return from Interrupt Ritorna da un interrupt handler
RETLW k Return Literal to W Ritorna da una subroutine con W = k
RETURN Return from Subroutine Ritorna da una subroutine
RLF f,d Rotale Left f through Carry d = f > 1 (dove d può essere W o f)
SLEEP Go into Standby Mode Mette in standby il PIC-
SUBLW k Subtract W from Literal W = k - W
SUBWF f,d Subtract W from f d = f - W (dove d può essere W o f)
SWAPF f Swap f f = Swap dei bit 0123 con 4567 di f
TRIS f Load TRIS Register TRIS di f = W
XORLW k Exclusive OR Literal with W W = W XOR k
XORWF f,d Exclusive OR W with f d = f XOR W (dove d può essere W o f)

ADDLW a costante k a W
Sintassi:
addlw k
Operazione equivalente:
W = W + k
Descrizione:
Somma la costante k al valore memorizzato nell'accumulatore W e mette il risultato nell'accumulatore.
Esempio:
org 00H
start
movlw 10
addlw 12
...
Dopo aver eseguito questo programma l'accumulatore W varrà 22.
Note:
Questa istruzione influenza i bit Z, DC e C del registro STATUS.
l Z vale 1 se il risultato dell'operazione vale 0.
l DC vale 1 se il risultato dell'operazione è un numero superiore a 15.
l C vale 1 se il risultato è positivo ovvero se il bit 7 del registro contenente il risultato vale 0 e 1
se il risultato è negativo ovvero se il bit 7 del registro contenente il risultato vale 1.

ADDWFW con il valore contenuto nel registro F
Sintassi:
addwf f,d
Operazione equivalente:
d = W + f (dove d può essere W o f)
Descrizione:
Questa istruzione somma il valore contenuto nell'accumulatore W con il valore contenuto nel registro indirizzato dal parametro f. Il parametro d è un flag che indica su quale registro deve essere memorizzato il risultato.
Per d = W il risultato viene memorizzato nel registro W Per d = F il risultato viene memorizzato nel registro f
Esempio:
Vediamo un esempio di somma tra due registri:
add1 equ 0CH
add2 equ 0DH
org 00H

movlw 10 ;Primo addendo = 10
movwf add1
movlw 15 ;Secondo addendo = 15
movwf add2
movf add1,W ;W = add1
addwf add2,W ;W = W + add2
Note:
Questa istruzione influenza i bit Z, DC e C del registro STATUS.
l Z vale 1 se il risultato dell'operazione vale 0.
l DC vale 1 se il risultato dell'operazione è un numero superiore a 15.
l C vale 1 se il risultato è positivo ovvero se il bit 7 del registro contenente il risultato vale 0 e 1
se il risultato è negativo ovvero se il bit 7 del registro contenente il risultato vale 1.

ANDLW a W ed una costante k
Sintassi:
andlw k
Operazione equivalente:
W = W AND k
Descrizione:
Effettua l'AND tra il valore contenuto nell'accumulatore W ed il valore costante k. Il risultato viene memorizzato nell'accumulatore.
Esempio:
org 00H
start
movlw 10101010B
andlw 11110000B
...
Dopo aver eseguito questo programma l'accumulatore W varrà 10100000B.
Note:
Questa istruzione influenza il bit Z del registro STATUS.
l Z vale 1 se il risultato dell'operazione vale 0.

ANDWF
Sintassi:
andwf f,d
Operazione equivalente:
d = W AND f (dove d può essere W o f)
Descrizione:
Questa istruzione effettua l'AND logico tra il valore contenuto nell'accumulatore W ed il valore contenuto nel registro indirizzato dal parametro f. Il parametro d è un flag che indica su quale registro deve essere memorizzato il risultato.
Per d = W il risultato viene memorizzato nel registro W Per d = F il risultato viene memorizzato nel registro f
Esempio:
Spesso l'AND logico viene utilizzato per mascherare il valore di alcuni bit all'interno di un registro. Se ad esempio volessimo estrarre dal numero binario 01010101B i quattro bit meno significativi al fine di ottenere il seguente valore 00000101B, basterà preparare una maschera del tipo 00001111B e farne l'AND con il nostro valore di partenza, vediamo come:.
movlw 01010101B ;Memorizza nel registro ; all'indirizzo
movwf 0CH ;0CH il valore iniziale da mascherare
movlw 00001111B ;Prepara la maschera di bit andwf 0CH,W ;Effettua l'AND e memorizza il ;risultato nell'accumulatore W
Il risultato in W sarà 00000101B come rischiesto.
W = 00001111 AND f = 01010101 = ----------------
W = 0000010101
La ANDWF influenza il bit Z del registro STATUS che varrà 1 se il risultato dell'operazione è 0.

BCF un bit nel registro F
Sintassi:
bcf f,b
Operazione equivalente:
f(b) = 0
Descrizione:
Questa istruzione azzera il bit b del registro all'indirizzo f.
Esempio:
parm1 equ 0CH
org 00H

movlw 11111111B ;Valore iniziale
movwf parm1
bcf parm1,0 ;D0=0
Al termine del programma il registro parm1 varrà 11111110B.
Note:
Questa istruzione non influenza alcun bit di stato

BSF n bit nel registro F
Sintassi:
bsf f,b
Operazione equivalente:
f(b) = 1
Descrizione:
Questa istruzione mette a uno il bit b del registro all'indirizzo f.
Esempio:
parm1 equ 0CH
org 00H

movlw 00000000B ;Valore iniziale
movwf parm1
bsf parm1,0 ;D0=1
Al termine del programma il registro parm1 varrà 00000001B.
Note:
Questa istruzione non influenza alcun bit di stato

BTFSC successiva se un bit nel registro F vale 0
Sintassi:
btfsc f,b
Operazione equivalente:
f(b) = 0 ? Si, salta una istruzione
Descrizione:
Testa il bit b contenuto nel registro all'indirizzo f e salta l'istruzione successiva se questo vale 0.
Esempio:
parm1 equ 0CH
org 00H

movlw 11111110B ;Valore iniziale
movwf parm1
loop btfsc parm1,0 ;D0 = 0 ? Si, esce
goto loop ;No, esegue il loop
Questa programma esegue un loop infinito lo stesso programma non esegue il loop se sostituiamo l'istruzione:
movlw 11111110B ;Valore iniziale
con l'istruzione:
movlw 11111111B ;Valore iniziale
Note:
Questa istruzione non influenza alcun bit di stato

BTFSS successiva se un bit nel registro F vale 1
Sintassi:
btfss f,b
Operazione equivalente:
f(b) = 1 ? Si, salta una istruzione
Descrizione:
Testa il bit b contenuto nel registro all'indirizzo f e salta l'istruzione successiva se questo vale 1.
Esempio:
parm1 equ 0CH
org 00H

movlw 11111111B ;Valore iniziale
movwf parm1
loop btfss parm1,0 ;D0 = 1 ? Si, esce
goto loop ;No, esegue il loop
Questa programma esegue un loop infinito lo stesso programma non esegue il loop se sostituiamo l'istruzione:
movlw 11111111B ;Valore iniziale
con l'istruzione:
movlw 11111110B ;Valore iniziale
Note:
Questa istruzione non influenza alcun bit di stato

CALL
Sintassi:
call k
Descrizione:
Richiama in esecuzione una subroutine memorizzata all'indirizzo k.Il parametro k può essere specificato utilizzando direttamente il valore numerico dell'indirizzo oppure la relativa label.
Esempio:
org 00H

call ledOn
...
;Subroutine di accensione di un led
ledOn bsf PORTB,LED1
return
Quando la CPU del PIC incontra una istruzione CALL, memorizza nello STACK il valore del registro PC + 1 in modo da poter riprendere l'esecuzione dall'istruzione successiva alla CALL, quindi scrive nel PC l'indirizzo della subroutine saltando all'esecuzione di quest'ultima.
Il valore originale del PC viene ripristinato all'uscita della subroutine con l'esecuzione dell'istruzione di ritorno RETURN o RETLW.
Nel PIC16F84 sono disponibili 8 livelli di stack, per cui il numero massimo di CALL rientranti, ovvero di istruzioni CALL all'interno di subroutine che a loro volta contengono altre CALL, è limitato ad 8 livelli.
Note:
Questa istruzione non influenza nessun bit di stato.

CLRF
Sintassi:
clrf f
Operazione equivalente:
f = 0
Descrizione:
Questa istruzione azzera il valore contenuto nel registro indirizzato dal parametro f.
Esempio:
Ipotizziamo di voler azzerare il registro TMR0 il cui indirizzo è 01H esadecimale, l'istruzione da eseguire sara:
clrf 01H
Oppure, se si include all'inizio del nostro source il file P16F84.INC, potremo utilizzare il nome simbolico del registro TMR0.
clrf TMR0
Dopo l'esecuzione di questa istruzione il bit Z del registro STATUS viene messo a 1.

CLRW W
Sintassi:
clrw
Operazione equivalente:
W = 0
Descrizione:
Azzera il valore contenuto nel registro W.
Note:
Dopo l''esecuzione di questa istruzione il bit Z del registro STATUS viene messo a 1.

CLRWDT
Sintassi:
clrwdt
Descrizione:
Questa istruzione deve essere utilizzata quando programmiamo il PIC con l'opzione Watchdog abilitata (fusibile WDTE). In questa modalità il PIC abilita un timer che, una volta trascorso un determinato tempo, effettua il reset del PIC. Per evitare il reset il nostro programma dovrà eseguire ciclicamente l'istruzione CLRWDT per azzerare il timer prima di detto tempo. Se non azzeriamo il timer in tempo, la circuiteria di watchdog (dall'inglese cane da guardia) interpreterà questo come un blocco del programma in esecuzione ed effettuerà il reset per sbloccarlo.
Esempio:
org 00H
loop
clrwdt
goto loop
Note:
Questa istruzione non influenza nessun bit di stato.

COMF del registro F
Sintassi:
comf f,d
Operazione equivalente:
d = NOT f (dove d può essere W o f)
Descrizione:
Questa istruzione effettua il complemento del valore contenuto nel registro indirizzato dal parametro f. Il parametro d determina la destinazione del valore ottenuto.
Per d = W il valore viene memorizzato nel registro W Per d = F il valore viene lasciato nel registro f.
Esempio:
parm1 equ 0CH
org 00H

movlw 01010101B
movwf parm1
comf parm1,F
...
Al termine dell'esecuzione del programma il valore del registro parm1 sarà 10101010B.
Note:
Questa istruzione influenza il bit Z del registro STATUS.
l Z vale 1 se il risultato dell'operazione vale 0.

DECF del registro F
Sintassi:
decf f,d
Operazione equivalente:
d = f -1 (dove d può essere W o f)
Descrizione:
Questa istruzione decrementa il contenuto del registro indirizzato dal parametro f. Il parametro d è un flag che indica su quale registro deve essere memorizzato il risultato.
Per d = W il risultato viene memorizzato nel registro W Per d = F il risultato viene memorizzato nel registro f
Esempio:
Con il seguente programma scriviamo il valore 23H nel registro all'indirizzo 0CH e quindi lo decrementiamo di uno. Al termine dell'esecuzione il registro alla locazione 0CH conterrà il valore 22H.
movlw 23H ;Scrive in W il valore 23H movwf 0CH ;Copia nel registro 0CH il valore di W decf OCH,F ;Decremente il valore contenuto nel ;registro 0CH
Esempio:
Questa istruzione influenza il bit Z del registro STATUS.
l Z vale 1 se il risultato dell'operazione vale 0.

DECFSZ valore del registro f e salta l'istruzione successiva se il risultato vale zero
Sintassi:
decfsz f,b
Operazione equivalente:
d = f -1 (dove d può essere W o f) se d = 0 salta
Descrizione:
Decrementa il valore del registro all'indirizzo f e se il risultato vale zero salta l'istruzione successiva. Il risultato del decremento può essere memorizzato nello stesso registro f oppure nell'accumulatore W in base al valore del flag d.
Per d = W il risultato viene memorizzato nel registro W Per d = F il risultato viene memorizzato nel registro f
Esempio:
counter equ 0CH
org 00H

movlw 10 ;counter = 10
movwf counter
loop decfsz counter,F ;counter = counter -1
;counter = 0 ? Si esce
goto loop ;No, continua
Questa programma esegue per 10 volte l'istruzione decfsz finchè esce per counter = 0.
Note:
Questa istruzione non influenza alcun bit di stato.

GOTO Vai in esecuzione all'indirizzo k
Sintassi:
goto k
Descrizione:
Determina un salto del programma in esecuzione all'indirizzo k. Il parametro k può essere specificato utilizzando direttamente il valore numerico dell'indirizzo oppure la relativa label.
Esempio:
org 00H
loop
goto loop
Questro programma esegue un ciclo (loop) infinito.
Note:
Questa istruzione non influenza nessun bit di stato.

INCF del registro all'indirizzo F
Sintassi:
incf f,d
Operazione equivalente:
d = f +1 (dove d può essere W o f)
Descrizione:
Incrementa il contenuto del registro all'indirizzo f e memorizza il risultato nello stesso registro o nell'accumulatore W in base al valore del flag d:
Per d = W il risultato viene memorizzato nel registro W Per d = F il risultato viene memorizzato nello stesso registro F
Note:
Questa istruzione influenza il bit Z del registro STATUS..
l Z vale 1 se il risultato dell'operazione vale 0.

INCFSZ registro f e salta l'istruzione successiva se il risultato vale zero
Sintassi:
incfsz f,b
Operazione equivalente:
d = f +1 (dove d può essere W o f) se d = 0 salta
Descrizione:
Incrementa il valore del registro all'indirizzo f e se il risultato vale zero salta l'istruzione successiva. Il risultato dell'incremento può essere memorizzato nello stesso registro f oppure nell'accumulatore W in base al valore del flag d.
Per d = W il risultato viene memorizzato nel registro W Per d = F il risultato viene memorizzato nel registro f
Esempio:
counter equ 0CH
org 00H

movlw 250 ;counter = 250
movwf counter
loop incfsz counter,F ;counter = counter + 1
;counter = 0 ? Si esce
goto loop ;No, continua
Questa programma esegue per 256 - 10 = 6 volte l'istruzione incfsz finchè esce per counter = 0. Essendo counter un registro a 8 bit quando viene incrementato dal valore 255 assume nuovamente valore 0 da qui la formula 256 - 10 = 6.
Note:
Questa istruzione non influenza alcun bit di stato.

IORLW l'OR inclusivo tra W ed una costante k
Sintassi:
iorlw k
Operazione equivalente:
W = W OR k
Descrizione:
Effettua l'OR inclusivo tra il valore contenuto nell'accumulatore W ed il valore costante k.
Esempio:
org 00H
start
movlw 00001111B
iorlw 11110000B
...
Dopo aver eseguito questo programma l'accumulatore W varrà 11111111B.
Note:
Questa istruzione influenza il bit Z del registro STATUS.
l Z vale 1 se il risultato dell'operazione vale 0.

IORWF
Sintassi:
iorwf f,d
Operazione equivalente:
d = f OR W (dove d può essere W o f)
Descrizione:
Questa istruzione effettua l'OR inclusivo tra il valore contenuto nell'accumulatore W ed il valore contenuto nel registro indirizzato dal parametro f. Il parametro d determina dove viene memorizzato il risultato dell'operazione:
Per d = W il risultato viene memorizzato nell'accumulatore W. Per d = F il risultato viene memorizzato nel registro f.
Esempio:
parm1 equ 0CH
org 00H

movlw 00001111B
movwf parm1
movlw 11111111B
iorwf parm1,F
Al termine dell'esecuzione il valore del registro parm1 sarà 11111111B.
Note:
Questa istruzione influenza il bit Z del registro STATUS.
l Z vale 1 se il risultato dell'operazione vale 0.

MOVLW Assegna a W un valore costante
Sintassi:
movlw k
Operazione equivalente:
W = k
Descrizione:
Assegna all'accumulatore W il valore costante k.
Esempio:
org 00H
start
movlw 20
...
Dopo aver eseguito questo programma l'accumulatore W varrà 20.
Note:
Questa istruzione non influenza nessun bit di stato.

MOVFdel registro F
Sintassi:
movf f,d
Operazione equivalente:
d = f (dove d può essere W o f)
Descrizione:
Questa istruzione copia il contenuto del registro indirizzato dal parametro f o nell'accumulatore W o nello stesso registro F. Il parametro d determina la destinazione.
Per d = W il valore viene memorizzato nel registro W Per d = F il valore viene lasciato nel registro f. In questo caso l'utilità dell'istruzione sta nel fatto che viene alterato il bit Z del flag STATUS in base al valore contenuto nel registro f.
Esempio:
L'esempio seguente copia il valore contenuto nel registro all'indirizzo 0CH nell'accumulatore W:
movf 0CH,W

MOVWF del registro W nel registro F
Sintassi:
movwf f
Operazione equivalente:
f = W
Descrizione:
Questa istruzione copia il contenuto del registro W nel registro indirizzato dal parametro f.
Esempio:
Ipotizziamo di voler scrivere il valore 10H ( esadecimale) nel registro TMR0. Le istruzioni da eseguire sono le seguenti.
movlw 10H ;Scrive nel registro W il valore 10H movwf 01H ;e lo memorizza nel registro TMR0
Per i registri utilizzati dal PIC per funzioni specifiche, solitamente non viene inserito direttamente l'indirizzo ma il relativo nome simbolico definito nel file P16F84.INC. Il codice diventa quindi il seguente:
movlw 10H ;Scrive nel registro W il valore 10H movwf TMR0 ;e lo memorizza nel registro TMR0
Note:
L'esecuzione della MOVWF non influenza nessun bit di stato.

NOP
Sintassi:
nop
Descrizione:
Questa istruzione non esegue nessuna operazione ma è utile per inserire ritardi pari ad un ciclo macchina .
Esempio:
Utilizzando un quarzo da 4MHz potremo ottenere un ritardo pari ad 1µs per ogni istruzione NOP inserita nel nostro source..
nop ;Esegue un ritardo pari ad 1µs
Note:
La NOP non influenza nessun bit di stato.

OPTION W al registro OPTION
Sintassi:
option
Operazione equivalnte:
OPTION = W
Descrizione:
Questa istruzione memorizza nel registro speciale OPTION il valore contenuto nell'accumulatore W.
Esempio:
org 00H
start movlw 01000100B
option
...
Note:
Questa istruzione esiste per mantenere la compatibilità con i PIC prodotti finora, la Microchip ne sconsiglia l'uso. In alternativa è consigliabile usare le seguenti istruzioni.
org 00H
start
bsf STATUS,RP0 ;Attiva il banco registri 1
movlw 01000100B
movwf OPTION_REG
...
In pratica si consiglia di scrivere direttamente nel registro OPTION presente nel banco 1 dei registri del PIC utilizzando la MOVWF anziche l'istruzione OPTION che in futuro potrebbe non essere più implementata.
Questa istruzione non influenza nessun bit di stato.

RETFIE
Sintassi:
retfie
Descrizione:
Questa istruzione deve essere inserita al termine di ogni subroutine di gestione degli interrupt per ridare il controllo al programma principale.
Esempio:
org 00H
loop
goto loop ;Loop infinito
org 04H ;Interrupt vector
intHandler
retfi ;Ritorna dall'interrupt
In questo source il programma principale esegue un loop infinito. Se abilitiamo uno degli interrupt del 16F84 non appena esso si verificherà il controllo verrà dato automaticamente al programma allocato dall'indirizzo 04H (nell'esempio intHandler), l'istruzione RETFI determinerà quindi il ritorno al loop principale.
Note:
Questa istruzione non influenza alcun bit di stato.

RETLW una costante in W
Sintassi:
retlw k
Descrizione:
Questa istruzione ritorna il controllo da una subroutine al programma principale. A differenza dell'istruzione RETURN essa consente di passare, tramite l'accumulatore W, il valore costante k al programma principale.
Esempio:
rtc equ 0CH
org 00H

call mySub1
movwf rtc
...
mySub1 nop
retlw 10
Una volta eseguito questo programma memorizza nel registro rtc il valore 10 passato dalla subroutine mySub1.
Note:
Questa istruzione non influenza alcun bit di stato
Vedi anche l'istruzione RETURN.

RETURN
Sintassi:
return
Descrizione:
Questa istruzione deve essere inserita al termine di ogni subroutine per riprendere l'esecuzione del programma principale.
Esempio:
org 00H

call mySub1
....
mySub1 nop
return
Note:
Nel PIC16F84 possono essere annidate fino ad 8 chiamate a subroutine del tipo:
org 00H

call mySub1
....
mySub1 call mySub2
return
mySub2 call mySub3
return
mySub3 return
Note:
Questa istruzione non influenza alcun bit di stato.

RLF
Sintassi:
rlf f,b
Operazione equivalente:
d = f

Esempio