Tutorials - PIC

 

PIC Baseline - Set di istruzioni

Le istruzioni dei Baseline

Il set di istruzione dei PIC della famiglia Baseline comprende solo 33 opcode. Come solito per i PIC, buona parte di essi richiede un solo ciclo per la sua esecuzione, anche se esistono istruzioni di salto o scelta che ne richiedono 2.
Per un clock (Fosc) di 4MHz, il ciclo dell' istruzione dipende da Fosc/4 = 1MHz ed è quindi di 1 us. Per un clock di 8MHz il ciclo sarà di 500ns.

Le istruzione sono codificate su 12 bit (core a 12-bit). Di questi, parte sono dedicati al codice vero e proprio (i bit più significativi, da 3 a 10), mentre i rimanenti contengono alcuni elementi per l' esecuzione dell' istruzione:

  • f  è il registro (file) che concorre all' istruzione. Comprende la RAM e i registri speciali SFR.
  • d è la destinazione del risultato dell' istruzione. Una particolarità delle istruzioni PIC è quella di poter indirizzare il risultato sia al registro W sia ad un altro registro della memoria RAM
  • b è il bit su cui eseguire l' operazione
  • k è un valore inteso come costante numerica

 Da notare che, per Microchip, valgono alcune convenzioni:

  • una costante numerica prende il nome di "literal"
  • un "file" è una locazione di RAM dati o un registro SFR

ossiamo fare una divisone delle istruzioni in funzione della loro azione:

  • istruzioni speciali, necessarie per accedere a registri particolari (tris, option) e/o prive della necessità di un oggetto
  • istruzioni orientate ad operazioni logiche, con la destinazione ed il "file" su cui operare
  • istruzioni orientate al bit, con il bit ed il "file" su cui operare
  • istruzioni che operano su costanti, che hanno in oggetto la costante "literal". Utilizzano l' appoggio del registro W.
  • istruzioni di salto, che modificano il PC

La tabella seguente le raccoglie in queste divisioni:

Set istruzioni per PIC con core a 12-bit
  Bit Mnemonico Cicli Status Descrizione
11 10 9 8 7 6 5 4 3 2 1 0
 
Istruzioni
 speciali
0 0 0 0 0 0 0 0 0 0 0 0 NOP 1 - Nessuna operazione
0 0 0 0 0 0 0 0 0 0 1 0 OPTION 1 T0, PD Copia W nel registro OPTION
0 0 0 0 0 0 0 0 0 0 1 1 SLEEP 1 T0, PD Va in modalità sleep
0 0 0 0 0 0 0 0 0 1 0 0 CLRWDT 1 - Ricarica il  watchdog timer
0 0 0 0 0 0 1 0 0 0 0 0 CLRW 1 - Azzera il registro W   (W = 0)
0 0 0 0 0 0 0 0 0 1 f TRIS f 1 - Copia W nel registro tri-state (f = 1, 2 o 3)
 

Operazioni
 logiche

0 0 0 0 0 0 1 f MOVWF f 1 - Copia W nella destinazione f  (W→ f )
0 0 0 0 0 1 d f CLRf,d 1 Z Azzera la destinazione f  (f = 0)
0 0 0 0 1 0 d f SUBWF f,d 1 C, Z Scrive in f il risultato di f-W ( f - W→ dest)
0 0 0 0 1 1 d f DECF f,d 1 Z Decrementa di una unità il registro f (f−1→ dest)
0 0 0 1 0 0 d f IORWF f,d 1 Z Esegue l' OR inclusivo tra W e f ( f | W→ dest))
0 0 0 1 0 1 d f ANDWF f,d 1 Z Esegue l' AND tra W e f (f & W→ dest )
0 0 0 1 1 0 d f XORWF f,d 1 Z Esegue l' OR esclusivo tra  W e f ( f ^ W→ dest )
0 0 0 1 1 1 d f ADDWF f,d 1

C, Z,DC

Esegue la somma tra W e f ( f+W→ dest ))
0 0 1 0 0 0 d f MOVF f,d 1 Z Copia f nella destinazione (f → dest )
0 0 1 0 0 1 d f COMF f,d 1 Z Complementa f nella destinazione (~f → dest )
0 0 1 0 1 0 d f INCF f,d 1 Z Incrementa di una unità il registro f (f +1→ dest)
0 0 1 0 1 1 d f DECFSZ f,d 1-1 - Decrementa il registro f (f−1→ dest) e se =0 salta l' istruzione successiva
0 0 1 1 0 0 d f RRF f,d   C Ruota il file f a destra nel carry (C<<7 | f>>1 → dest)
0 0 1 1 0 1 d f RLF f,d 1 C Ruota il file f a sinistra nel carry (C<<7 | f>>1 → dest)
0 0 1 1 1 0 d f SWAPF f,d 1 - Swap nibbles (f<<4 | f>>,→ dest)
0 0 1 1 1 1 d f INCFSZ f,d 1-2 - Incrementa il registro f (f−1→ dest) e se =0 salta l' istruzione successiva
 

Operazioni
 su bit

0 1 0 0 b f BCF f,b 1   Manda a 0 il bit b nel registro f
0 1 0 1 b f BSF f,b 1   Manda a 1 il bit b nel registro f
0 1 1 0 b f BTFSC f,b 1-2   Salta istruzione successiva se il bit b è a 0
0 1 1 1 b f BTFSS f,b 1-2   Salta istruzione successiva se il bit b è a 1
 

Operazioni
 su literal

1 1 0 0 k MOVLW k 1 - Copia la costante k in W (k → W )
1 1 0 1 k IORLW k 1 Z Esegue l' OR  bitwise tra W e k ( k | W→ W )
1 1 1 0 k ANDLW k 1 Z Esegue l' AND bitwise tra W e  k  (k & W→ W )
1 1 1 1 k XORLW k 1 Z Esegue l' OR escl. bitwise tra W e k ( k ^ W→ W )
 

Chiamate
salti

1 0 0 0 k RETLW k 2 - Copia k in W e ritorna dalla subroutine
1 0 0 1 k CALL k 2 - Chiama subroutine con indirizzo k (8 bit)
1 0 1 k GOTO k 2 - Porta il PC all' indirizzo k (9 bit)

Le istruzioni che prevedono movimentazione del PC (goto, call, retlw) richiedo due cicli per l' esecuzione; quelle di branch condizionato (btfss, btfsc, decfsz, incfsz) ne richiedono due se il branch è eseguito. Questo è necessario dato che il sistema di fetch delle istruzioni deve scaricare il PC dal valore consecutivo e caricare invece quello del salto.

Alcune istruzioni modificano i flag dello STATUS, principalmente il flag Z che va a 1 se il risultato dell'operazione è 0 e il flag Carry che va a1 se esiste un riporto. Il flag DC viene utilizzato principalmente nelle conversioni hex-bcd. Non esiste un flag N.
Le istruzioni di branch condizionato (btfss, btfsc,decfsz, incfsz) non modificano lo STATUS, dato che il condizionamento serve già di per se a determinare una azione.

Una caratteristica di queste istruzioni è il concetto di destinazione d: il risultato di alcune operazioni può essere salvato sia nel registro W sia nel registro f che partecipa all' operazione. In generale:

  • se d = 0 il risultato è salvato in W
  • se d = 1 il risultato è salvato in f

Da notare che l' Assembler MPASM :

  • riserva gli opcodes esclusivamente a questa funzione. Per cui, se si cerca di usarli come label generiche, si determina un errore di compilazione
  • MPASM accetta il formato degli opcodes sia in lettere maiuscole che minuscole, per cui XORLW o xorlw sono equivalenti
  • f e k possono essere sostituiti da label
  • la forma delle istruzioni che richiedono file e destinazione viene semplificata da MPASM che non necessita dei valori 1 e 0 per d, ma li può accettare nella forma  w (per 0) e f (per 1).
    Quindi si potrà scrivere indifferentemente:
    - decf file, 1  oppure   decf file, f 
    - decf file, 0  oppure   decf file, w.
    Se si omette l' indicazione della destinazione l' Assembler genera un warning ed utilizza nella compilazione il default 1.

La sintassi per una riga contenete una istruzione è la seguente:

<label>   istruzione   <oggetto>   ;<commento>

Le regole sono:

  • l' istruzione non può iniziare nella prima colonna. Un label, invece, inizia obbligatoriamente in prima colonna.
  • occorre uno spazio almeno tra la label opzionale e l' opcode
  • tra istruzione ed oggetto va riservato almeno uno spazio

Le istruzioni, in maggiore dettaglio e in ordine alfabetico:

ADDWF Add W and f, somma W e f. Il risultato modifica i flag C, DC, Z dello STATUS

Esempio:
movlw 1         ; W = 1
movwf target    ; W -> target = 1
movlw 5         ; W = 5
addwf target,f  ; W + target -> target = 5 + 1 = 6  C,DC, Z = 0

movlw 0xFF      ; W = FFh
movwf target    ; target = W = FFh
movlw 1         ; W = 1
addwf target,W  ; W + target -> W = FFh + 1 = 0  flag Z = 1
 

ANDLW AND literal with W, esegue l' AND bitwise tra il contenuto di W e quello della costante k. Viene modificato il flag Z.

Esempio:
movlw 0xA5        ; W = A5h
andlw b'00001111' ; W = W and 0Fh = 5
 

ANDWF AND W with f, esegue l' AND bitwise tra il contenuto di W e quello del registro f. Viene modificato il flag Z.

Esempio:
movlw 1         ; W = 1
movwf target    ; W -> target = 1
movlw 5         ; W = 5
a
ndwf target,f  ; target = W  target = 5  1 = 1  
 

BCF Bit Clear on File, azzera il bit b indicato nel file f indicato. Non si applica al registro W.

Esempio:
bcf   STATUS, C  ; flag C = 0
 

BSF Bit Set on File, porta a 1  il bit b indicato nel file f indicato. Non si applica al registro W.

Esempio:
bsf   STATUS, C  ; flag C = 1
 

BTFSC Bit Test f, Skip if clear, verifica lo stato del bit b nel file f e salta l' istruzione successiva se risulta a 0. Richiede 2 cicli se il branch è eseguito.

Esempio:
btfsc   STATUS, C  ; salta istruzione successiva se C=0
 

BTFSS Bit Test f, Skip if set, verifica lo stato del bit b nel file f e salta l' istruzione successiva se risulta a 1. Richiede 2 cicli se il branch è eseguito.

Esempio:
btfsc   STATUS, Z  ; salta istruzione successiva se Z=1

CALL Subroutine Call, porta il PC all' inizio della subroutine indicata. E' una istruzione a due cicli.

Esempio:
call   subroutine1  ; salta all' esecuzione della subroutine1

L' indirizzo della subroutine ha 8 bit di spazio, quindi sono indirizzabili i primi 256 bytes di ogni pagina
Per PIC con quantità maggiori si utilizza il sistema delle pagine, con i due bit più significativi forniti per il PCLATH dai bit PR1:0 dello STATUS.

Il meccanismo di esecuzione della call consiste nel salvataggio dell' indirizzo dell'istruzione seguente nello stack e nella sostituzione nel PC con l' indirizzo della subroutine chiamata. Al termine della subroutine, una istruzione retlw sostituirà nel PC l' indirizzo successivo con quello prelevato dallo stack, facendo rientrare l' esecuzione al punto in cui era stata abbandonata.
Da osservare che i Baseline hanno uno stack a due soli livelli, quindi occorre aver cura di non utilizzare più di due chiamate di subroutine annidate. 

CLRF Clear file, azzera il contenuto del file f indicato. Il flag Z viene settato. Non applicabile a W.

Esempio:
clrf target  ; target = 0

CLRW Clear W. Come sopra, ma specifica per il registro W. Istruzione equivalente a:
movlw  0     ; W = 0

Esempio:
clrw         ; W = 0

CLRWDT Clear WD Timer, ricarica il timer del watchdog. Modifica i flag TO e PD delleo STATUS.

Esempio:
clrwdt       ; ricarica il WDT

COMF Complement f, esegue il complemento a 1 del file f indicato, ovvero l' inversione del valore dei bit contenuti. Modifica il flag Z.

Esempio:
movlw B’11001010’ ; W = CAh
movwf target      ; target = W = CAh
comf  target,w    ; W = b'00110101'

DECF Decrement file, diminuisce di uno il file f indicato.  Modifica il flag Z.

Esempio:
decf   target, f       ; target = target - 1
decf   target, w       ; W = target - 1

movlw  1               ; W = 1
movwf  target          ; target = W = 1
decf   target, f       ; target = target11=1-1=0 ,  Flag Z= 1

DECFSZ Decrement file, skip if 0, decrementa di una unità il file f indicato e salta la successiva istruzione se il f va a 0. Il risultato del decremento può andare in f o in W. Non modifica lo STATUS.

Esempio:
        movlw  8               ; W = 8
        movwf  counter         ; counter = W = 8
loop    decfsz counter, f      ; counter = counter -1 ; se counter = 0 salta
                               ;
istruzione successiva
        goto   loop            ; se counter diverso da 0 ricicla
        ....                   ; prosegue con le istruzioni

GOTO Unconditional branch, salto incondizionato. Richiede 2 cicli per l' esecuzione.
Il codice contiene l' indirizzo a 9 bit della destinazione. Questo permette di indirizzare direttamente fino a 512 k, ovvero una pagina. Questo è adeguato per i piccoli PIC che hanno appunto un massimo di 512k di memoria programma. Per PIC con quantità maggiori si utilizza il sistema delle pagine, con i due bit più significativi forniti per il PCLATH dai bit PA2:0 dello STATUS.

Esempio:
goto target         ; PC= indirizzo di target

INCF Increment file, aumenta di una unità il file f indicato. Il risultato del decremento può andare in f o in W. Modifica il flag Z dello STATUS.

Esempio:
incf   target, w       ; W = target +1

movlw  0xFF            ; W = 255 dec.
movwf  target          ; target = W = 255
incf   target, f       ; target = target+1=FFh+1=00 ,  Flag Z= 1

INCFSZ Increment file, skip if 0, incrementa di una unità il file f indicato e salta la successiva istruzione se il f va a 0. Il risultato del decremento può andare in f o in W. Non modifica lo STATUS.

Esempio:
        movlw  0xFF-8          ; W = 247 dec.
        movwf  counter         ; counter = W = 247
loop    incfsz counter, f      ; counter = counter +1 ; se counter = 0 salta 
                               ; istruzione successiva
        goto   loop            ; se counter diverso da 0 ricicla
        ....                   ; prosegue con le istruzioni

IORLW Inclusive OR literal with W, effettua l' OR inclusivo bitwise tra il contenuto di W  e la costante k. Il risultato va in W. Modifica il flag Z.

Esempio:
movlw  D3              ; W = D3
iorlw  b'11110000'     ; W = W ior F0h = F3h

IORWF Inclusive OR Wwith f, effettua l' OR inclusivo bitwise tra il contenuto di W  e quello del file f. Il risultato va in W. Il risultato può andare in f o in W. Modifica il flag Z dello STATUS.

Esempio:
movlw  0xD3            ; W = D3h
movwf  target          ; target = D3h
movlw  0x0F            ; W = 0Fh
iorwf  target, f       ; target = target ior W = D3h  0Fh=DFh

MOVF Move file, copia il contenuto del file f nella destinazione d, che può essere il registro W o il file stesso. Modifica il flag Z dello STATUS.

Esempio:
movf   target, w       ; W = target

clrf   target          ; target = 0
movf   target, w       ; W = target = 0 ,  Flag Z= 1

MOVLW Move literal to W, copia in W la costante k. Non modifica lo STATUS.

Esempio:
movlw  0xEA            ; W = EAh
movlw  .127            ; W = 127 dec
movlw  b'00011000'     ; W = 18h

MOVWF Move W to file, copia il contenuto di W nel file f. Non modifica lo STATUS.

Esempio:
movwf  target          ; target = W

NOP No operation, non esegue alcuna operazione.

Esempio:
nop                    ; spende 1 ciclo senza alcuna operazione

OPTION Load OPTION register, istruzione speciale che copia il contenuto di W nel registro OPTION. Non modifica lo STATUS.

Esempio:
movlw  b'00001101'     ; W = 0Dh
option                 ; OPTION_REG = W = 0Dh

Questo opcode non è più utilizzato nelle altre famiglie di PIC.

RETLW Return with literal in W, rientra da subroutine con la costante k in W. Richiede 2 cicli.

Esempio:
retlw    0            ; rientra da una call con W = 0 
     
Il valore di ritorno può essere usato come indicatore:
Esempio:
btfsc   STATUS, Z     ; test sul flag Z
 retlw  1             ; se Z=1, rientra con W=1 
retlw   0             ; se Z=0, rientra con W=0

Il meccanismo dell' istruzione è il seguente: il contenuto del PC viene scartato e sostituito con il contenuto dello stack. Esso dovrebbe contenere l' indirizzo di ritorno al flusso in cui era stata sospesa l' esecuzione per avviare la subroutine. Da osservare che i Baseline hanno uno stack a due soli livelli, quindi occorre aver cura di non utilizzare più di due chiamate di subroutine annidate.           

RLF Rotate left file through Carry, ruota il file f a sinistra attraverso il Carry. Il risultato può andare in f o in W. Modifica il flag C dello STATUS.


Esempio:
clrf  target     ; target = 0
bsf   STATUS, C  ; flag C = 1
rrf   target, f  ; target = b'00000001" , C=0 

RRF Rotate right file through Carry, ruota il file f a destra attraverso il Carry. Il risultato può andare in f o in W. Modifica il flag C dello STATUS.


Esempio:
movlw 0x81       ; W = b'10000001'
movwf target     ; target = W = b'10000001'
bcf   STATUS, C  ; flag C = 0
rrf   target, f  ; target = b'010000000" , C=1 

SLEEP Enter Sleep mode, forza la modalità di standby sleep a baso consumo. Modifica TO, PD.

Esempio:
sleep            ; passa in modo sleep

SUBWF Subtract W from file, sottrae il contenuto di W da quello di f. Il risultato può andare in f o in W. Modifica i flag C, Z e DC dello STATUS.

Esempio:
movlw .100      ; W = 100 dec.
movwf target    ; W -> target = 100 dec
movlw 0xFF      ; W = FFh (255 dec)
subwf target,f  ; target = W - target = 255 + 100 = 155 dec

movlw .32       ; W = 32 dec.
movwf target    ; W -> target = 32 dec
movlw 0x1F      ; W = 1Fh (31 dec)
subwf target,f  ; target = W - target = 32 + 31 = 1  Flag C=1, Z=0

SWAPF Swap nibbles in file, scambia il nibble alto e quello basso nel file f. Il risultato può andare in f o in W. Non modifica lo STATUS.

Esempio:
movlw 0x0F      ; W = b'00001111'
movwf target    ; target = W = b'00001111'
swapf target,f  ; target = b'11110000'

TRIS Load Tris register, istruzione speciale che copia il contenuto di W nel registro di direzione degli I/O digitali.

Esempio:
movlw  b'00001111'     ; W = 0Fh
tris                   ; TRIS_REG = W = 0Fh

Questo opcode non è più utilizzato nelle altre famiglie di PIC.

XORLW Exclusive OR literal with W, esegue l' OR esclusivo XOR bitwise tra i contenuto di W e la costante k.  Il risultato può andare in f o in W. Modifica il flag Z dello STATUS.

Esempio:
movlw 0xA5      ; W = A5h
xorlw 0xFF      ; W = b'10100101' b'11111111' = b'01011010' =5Ah

XORWF Exclusive OR file with W, esegue l' OR esclusivo bitwise tra i contenuto di W e quello del file f.  Il risultato può andare in f o in W. Modifica il flag Z dello STATUS.

Esempio:
movlw 0xA5      ; W = A5h
movwf target    ; target = W = A5h
movlw 0xFF      ; W = FFh
xorwf target, w ; W = W target = 5Ah

Da notare che nei Baseline:

  • non esiste gestione di interrupt e quindi istruzioni relative
  • non esiste una istruzione RETURN per il rientro da subroutine, sostituita dalla RETLW.
  • non esiste l' istruzione SUBLW, nè ADDLW.
  • data la limitatezza delle risorse, il caricamento dei registri speciali OPTION e TRIS è effettuato con due istruzioni speciali. Il due registri sono quindi scrivibili, ma non rileggibili.
  • SUBWF non effettua l' operazione W- f , bensì f - W.
  • DECF e INCF agiscono sul flag Z, ma DECFSZ e INCFSZ  non lo fanno. La ragione è evidente: queste ultime contengono in se l' analisi del risultato 0 per il registro.
  • MOVLW e RETLW non agiscono sul flag Z.
  • MOVLW registro, f sembra inutile, ma in effetti agisce sul flag Z e indica un contenuto 0 del registro.

Inoltre, l' Assembler MPASM riconosce vari pseudo opcodes.



 

 

Copyright © afg. Tutti i diritti riservati.
Aggiornato il 06/05/13.