Il set di istruzioni del PIC16F690 è composto da solo 35 istruzioni:
Istruzione | Descrizione | Operazione | Flag | CLK |
---|---|---|---|---|
Istruzioni di trasferimento dati | ||||
MOVLW k | Carica la costante k in W | k -> w | 1 | |
MOVWF f | Carica W in f | W -> f | 1 | |
MOVF f,d | Carica f in W o in f (a seconda di d) | f -> d | Z | 1 |
CLRW | Resetta W | 0 -> W | Z | 1 |
CLRF f | Resetta f | 0 -> f | Z | 1 |
SWAPF f,d | Scambia i nibble (semi-byte) in f | f(7:4),(3:0) -> f(3:0),(7:4) | 1 | |
Istruzioni aritmetico-logiche | ||||
ADDLW k | Somma la costante k a W | W+k -> W | C, DC, Z | 1 |
ADDWF f,d | Somma W e f | W+f -> d | C, DC ,Z | 1 |
SUBLW k | Sottrae k da W | k-W -> W | C, DC, Z | 1 |
SUBWF f,d | Sottrae W da f | f-W -> d | C, DC, Z | 1 |
ANDLW k | AND logico fra W e la costante k | W AND k -> W | Z | 1 |
ANDWF f,d | AND logico fra W e f | W AND f -> d | Z | 1 |
IORLW k | OR logico fra W e la costante k | W OR k -> W | Z | 1 |
IORWF f,d | OR logico fra W e f | W OR f -> d | Z | 1 |
XORLW k | OR-esclusivo logico fra W e k | W XOR k -> W | Z | 1 |
XORWF f,d | OR-esclusivo logico fra W e f | W XOR f -> d | Z | 1 |
INCF f,d | Incrementa f di 1 | f+1 -> f | Z | 1 |
DECF f,d | Decrementa f di 1 | f-1 -> f | Z | 1 |
RLF f,d | Rotazione a sinistra di f con il bit CARRY | C | 1 | |
RRF f,d | Rotazione a destra di f con il bit CARRY | C | 1 | |
COMF f,d | Complementa f | f -> d | Z | 1 |
Istruzioni orientate ai bit | ||||
BCF f,b | Resetta il bit b di f | 0 -> f(b) | 1 | |
BSF f,b | Setta il bit b di f | 1 -> f(b) | 1 | |
Istruzioni di controllo di programma | ||||
BTFSC f,b | Testa il bit b di f. Salta l'istruzione successiva se vale zero. | Skip if f(b) = 0 | 1 (2) | |
BTFSS f,b | Testa il bit b di f. Salta l'istruzione successiva se vale uno. | Skip if f(b) = 1 | 1 (2) | |
DECFSZ f,d | Decrementa f. Salta l'istruzione successiva se vale Z=1 (cioè se f si azzera). | f-1 -> d skip if Z = 1 | 1 (2) | |
INCFSZ f,d | Incrementa f. Salta l'istruzione successiva se vale Z=0. | f+1 -> d skip if Z = 0 | 1 (2) | |
GOTO k | Salta all'indirizzo k | k -> PC | 2 | |
CALL k | Chiamata a subroutine all'indirizzo k | PC -> TOS, k -> PC | 2 | |
RETURN | Return da subroutine | TOS -> PC | 2 | |
RETLW k | Return con constante k salvata in W | k -> W, TOS -> PC | 2 | |
RETFIE | Return da interrupt | TOS -> PC, 1 -> GIE | 2 | |
Altre istruzioni | ||||
NOP | No operation | TOS -> PC, 1 -> GIE | 1 | |
CLRWDT | Resetta il timer watchdog | 0 -> WDT, 1 -> TO, 1 -> PD | TO, PD | 1 |
SLEEP | Manda il PIC in modo sleep | 0 -> WDT, 1 -> TO, 0 -> PD | TO, PD | 1 |
Le istruzioni sono composte dallo mnemonico (il nome dell'istruzione stessa) e da uno o due operandi (a volte nessuno). Esempi:
SLEEP ; istruzione senza operandi
GOTO etichetta ; istruzione con un operando
BCF STATUS,RP0 ; istruzione con due operandi
Gli operandi sono indicati nella tabella precedente in quattro modi diversi che riassumiamo qui sotto. Negli esempi seguenti facciamo uso sia di valori numerici che delle costanti predefinite nel file include (quest'ultima modalità è in generale preferibile in quanto produce codice più leggibile ed è più semplice da memorizzare):
All'inizio i nomi delle istruzioni del PIC sono difficili da memorizzare. Per questa ragione conviene abituarsi subito alla logica delle convenzioni di nomi utilizzate:
MOVLW 1Fh ; carica il valore esadecimale 1F nel
registro W
ADDLW .10 ; somma 10 al registro W e salva
il risultato in W
IORLW B'11110000' ; OR bit a bit fra W e la
costante binaria (risultato in W)
ADDWF 0x0E, 1 ; somma il registro all'indirizzo 0x0E con W e
salva il risultato nel
; registro stesso
ADDWF 0x0E, F ; identica alla precedente, ma usa
F al posto di 1
ADDWF 0x0E, 0 ; somma il registro all'indirizzo 0x0E con W e
salva il risultato in W
ADDWF 0x0E, W ; identica alla precedente, ma usa W al posto di 0
Tutte le istruzioni sono lunghe 14 bit, comprensivi di codice operativo e di operandi. I 14 bit sono diversamente suddivisi all'interno dell'istruzione a seconda della tipologia dell'istruzione stessa. I formati possibili si possono raggruppare in quattro diverse tipologie:
Per esempio l'istruzione BCF (gruppo 2)
BCF f, b
azzera il bit b del registro f. Il numero b del bit varia da 0 a 7 ed è codificato con 3 bit. Il registro invece può valere da 0 a 127 ed è codificato con 7 bit:
Facciamo un altro esempio. L'istruzione GOTO di salto incondizionato (gruppo 4)
GOTO k
codifica l'indirizzo k con 11 bit (da 0 a 2047) nel seguente modo:
Come ultimo esempio consideriamo l'istruzione ADDWF (gruppo 1)
ADDWF f,d
Questa istruzione somma il contenuto del registro W col contenuto della locazione di memoria f e memorizza il risultato della somma in W (d=0) oppure in f (d=1). Il formato dell'istruzione è il seguente:
Nell'elenco delle istruzioni la colonna CLK riporta il numero di cicli di istruzione (instruction cycle) necessari per eseguire ogni istruzione. Nel PIC un ciclo di istruzione corrisponde a quattro periodi di clock. La maggior parte delle istruzioni ha un tempo di esecuzione di un singolo ciclo.
Facciamo un esempio per chiarire il concetto. Supponiamo un clock interno standard a 4 MHz. In questo caso il periodo di clock è dato da:
Tclk = 1/fclk = 1/4M = 250 ns
Come si è detto la maggior parte delle istruzioni impiega un ciclo per essere eseguita. In questo caso il tempo di esecuzione (cioè la durata di un ciclo di istruzione) è dato da:
Texe = 4 * Tclk = 4 * 250 ns = 1 µs
Fanno eccezione alla regola precedente le istruzioni la cui esecuzione può modificare il Program Counter (istruzioni di salto). In questi casi il tempo di esecuzione richiede un ciclo di istruzione se il salto non viene eseguito e 2 cicli di istruzione (il doppio del tempo) se il salto viene eseguito.
Conoscere il tempo impiegato per l'esecuzione di ciascuna istruzione è particolarmente importante quando si vuole realizzare un ciclo di ritardo.
Sito realizzato in base al
template offerto da
http://www.graphixmania.it