A differenza dello STATUS dei PIC16, lo STATUS dei PIC18 è
più logico e più maneggevole, dato che contiene esclusivamente flag
relativi alle operazioni dell' ALU, mentre lo switch dei banchi (che nei
mid-range era costituito da RP1:0) negli enhanced dispone di un apposito
registro BSR.
Il valore dei flag dello STATUS viene utilizzato
direttamente dalle istruzioni di salto condizionato.
STATUS contiene 5 bit utili :
STATUS bit |
b7 |
b6 |
b5 |
b4 |
b3 |
b2 |
b1 |
b0 |
Funzione |
- |
- |
- |
N |
OV |
Z |
DC |
C |
I bit b7:5 non sono
utilizzati e sono letti come 0.
Vediamo le singole funzioni.
C - Carry
Questo bit, sostanzialmente, ha le solite funzioni classiche
: è il nono bit in una operazione aritmetica o logica, ovvero contiene
il valore del resto o supero degli 8 bit di un byte; é il borrow in una
sottrazione . Inoltre può entrare a far parte degli shift per conservare il
bit espulso dal byte.
DC - Digit Carry
Ha le stesse funzioni del Carry, ma in relazione al mezzo
byte (nibble). Viene sfruttato essenzialmente nelle operazioni con valori
codificati in BCD.
Z - Zero
Assume il valore 1 (vero) quando il risultato di una
istruzione è zero. Resta a zero negli altri casi.
OV - Overflow
Questi bit, non presente nello STATUS dei PIC16, è utile
principalmente nelle operazioni con numeri con segno, indicando il
debordamento del bit 6 sul bit 7, ovvero il cambiamento di segno (in un
numero in complemento a 2 il bit 7 rappresenta il segno).
Va segnalato che nella somma di due numeri con segno, ma entrambi positivi,
si potrà avere la possibilità che il bit 7 vada a 1, il che non trasforma
il risultato in numero negativo, ma indica solo la necessità di usare il
flag OV in modo adeguato.
N - Negative
Altro bit non presente ei PIC16, va a uno quando il
risultato di una istruzione da' un risultato negativo, andando a verificare
il valore del bit 7. Per questa sua caratteristica, può essere utilizzato
anche per testare lo stato del bit 7 di un registro.
Va osservato che solo certe istruzioni modificano i flag,
mentre alte li lasciano inalterati. Occorrerà, volendo utilizzarli come
elementi di test, verificare nel set di istruzioni quali sono le
correlazioni.
Va posta anche attenzione ad una azione diretta sullo STATUS
: Il set di istruzioni dei PIC18 è decisamente più ortogonale di quello
dei PIC16, ovvero consente di agire con "qualunque" istruzione su
"qualunque" registro : questo va , però, preso con una certa
cautela, in quanto applicando allo STATUS una operazione il cui risultato
implichi una modifica dei flag dello STATUS stesso, si darà origine ad un
risultato ben diverso da quello aspettato.
Ad esempio, con un clrf
STATUS , non si otterrà l' azzeramento del registro, come ci si
potrebbe aspettare, ma si avrà come risultato il bit Z posto ad 1 ,
mentre i rimanenti bit resteranno invariati.
Per modificare i bit dello STATUS si dovrà ricorrere ad
istruzioni che non originano cambiamenti sui flag dello STATUS; bcf,
bsf, swapf,
movff e movwf
potranno essere usate positivamente.
Istruzioni che modificano
lo STATUS
Queste istruzioni non modificano i flag dello status :
-
Tutte le istruzioni di branch sui flag dello STATUS
BC,
BCF, BN,
BNC, BNN,
BNOV, BNZ,
BOV, BZ
-
Tutte le istruzioni di set e/o test su bit
BTFSC,
BTFSS, BTG,
BSF, BCF
-
Tutte le istruzioni di comparazione o modifica e salto
relative a files
CPFSEQ,
CPFSGT, CPFSLT,
DECFSZ, DCFSNZ,
INCFSZ, INFSNZ,
SETF, TSTFSZ
-
Le istruzioni di salto, chiamata e ritorno a
subroutine
BRA,
GOTO, CALL,
RCALL, RETLW,
RETURN
-
Le istruzioni specifiche relative all' FSR e BSR
LFSR, MOVLB
-
Alcune istruzioni di MOV
MOVFF,
MOVLW, MOVWF
-
Le istruzioni di moltiplicazione
MULLW, MULLWF
-
Le operazioni sullo stack e sulle tavole
POP,
PUSH, TBLRD,
TBLWT
-
Il NOP
-
L' istruzione SWAPF
Inoltre alcune istruzioni particolari hanno effetti
particolari :
-
CLRWDT
e SLEEP modificano
TO e
PD
-
RETFIE
modifica GIE/GIEH e
PEIE/GIEL in quanto la gestione dell' interrupt a priorità
modifica il nome e la funzione dei flag relativi
-
RESET
modifica tutti flag dello STATUS
Tutte le rimanenti
istruzioni modificano uno o più flag dello STATUS.
A questo proposito esistono alcune differenze tra il set di istruzione dei
mid-range e quello dei PIC18F ed è necessario tenerne conto quando si debba
convertire un sorgente per la famiglia PIC 16 in uno per la famiglia PIC18.
Essenzialmente alcune istruzioni istruzioni modificano gli stessi flag di
quelle mid-range a cui si aggiungono i nuovi flag N e OV. In questo senso si
tratta di una situazione di "legacy" per cui un sorgente dovrebbe
poter essere spostato da una famiglia all' altra senza richiedere modifiche
in questa area.
Ma altre istruzioni
che nel set mid-range modificavano un solo flag, negli enhanced modificano
anche C e/o DC, il che certamente consente una migliore flessibilità nei
test. Viene però richiesta una verifica nel passaggio da un sorgente PIC16
a uno PIC18, onde evitare che un test fallisca a causa di queste differenze,
sopratutto dove la programmazione sfrutta qualche trucco o scorciatoia non
comune.
Istruzione |
STATUS bit |
Note |
16F |
18F |
16F |
18F |
ADDLW |
C, DC, Z |
C, DC, Z, OV,
N |
Sono attivati due flag in più (OV e N) |
ADDWF |
C, DC, Z |
C, DC, Z, OV,
N |
Sono attivati due flag in più (OV e N) |
ANDLW |
Z |
Z, N |
E' attivato un flag in più (N) |
ANDWF |
Z |
Z, N |
E' attivato un flag in più (N) |
CLRF |
Z |
Z |
Non ci sono differenze |
COMF |
Z |
Z, N |
E' attivato un flag in più (N) |
DECF |
Z |
C, DC, Z, OV,
N |
Sono attivati 4 flag in più (C, DC,OV,N) |
INCF |
Z |
C, DC, Z, OV,
N |
Sono attivati 4 flag in più (C, DC, OV, N) |
IORLW |
Z |
Z, N |
E' attivato un flag in più (N) |
IORWF |
Z |
Z, N |
E' attivato un flag in più (N) |
MOVF |
Z |
Z, N |
E' attivato un flag in più (N) |
RLF |
RLFC |
Z |
C,
Z, N |
Sono attivati due flag in più (C e N) |
RRF |
RRFC |
Z |
C,
Z, N |
Sono attivati due flag in più (C e N) |
SUBLW
|
C, DC, Z |
C, DC, Z, OV,
N |
Sono attivati due flag in più (OV e N) |
SUBWF |
SUBWFB |
C, DC, Z |
C, DC, Z, OV,
N |
Sono attivati due flag in più (OV e N) |
XORLW |
Z |
Z, N |
E' attivato un flag in più (N) |
XORWF |
Z |
Z, N |
E' attivato un flag in più (N) |
Tra le istruzioni
del nuovo set, vanno a modificare lo STATUS :
Istruzione |
STATUS bit |
Note |
ADDWFC |
C, DC, Z, OV, N |
W + f con carry |
DAW |
C |
decimal adjust |
MOVF |
Z, N |
move file f |
NEGF |
C, DC, Z, OV, N |
complemento a 2 |
RLNCF |
Z, N |
rotate left senza carry |
RRNCF |
Z, N |
rotate right senza carry |
SUBFWB |
C, DC, Z, OV, N |
W - f con borrow (carry) |
SUBWFB |
C, DC, Z, OV, N |
f - W con borrow (carry) |
Istruzioni per test sullo STATUS
Il set dei PIC18F contiene un
numero di istruzioni sui flag dello STATUS più ampio di quello
del set a 35 istruzioni, che effettua i test solo con BTFSS/BTFSC.
Sono infatti
disponibili anche:
-
BC Branch on Carry
-
BN Branch on N
-
BNC Branch if No Carry
-
BNN Branch if No N
-
BNZ Branch if No Zero
-
BOV Branch if Overflow
-
BZ Branch on Zero
Quindi, quello nei PIC16 va scritto come:
btfsc STATUS, N
goto destinantion |
diventa nei PIC18 semplicemente:
Si deve tenere presente, dunque, che queste istruzioni non
sono degli skip dell' istruzione seguente, ma sono dei salti condizionati ad
una destinazione che deve essere specificata da una label.
Quindi, dovendo limitarsi al salto della sola istruzione che
segue il test, la scrittura solita:
btfsc STATUS, N
bsf target
next bcf target |
andrà comunque bene, mentre, volendo utilizzare le nuove
istruzioni si dovrà scrivere:
bn
next
bsf target
next bcf target |
senza particolare vantaggio.
AVVERTENZA:
Va notato che alcune di queste istruzioni sono presenti come pseudo istruzioni
riconosciute da MPASM per i PIC16, mentre è prassi comune usare macro per implementare
queste funzioni.
Nel caso in cui si passi un sorgente da PIC16 a PIC18
occorrerà verificare la presenza di questi mnemonici ed eventualmente eliminare
le definizione delle macro corrispondenti.
|
|
|
Copyright © afg. Tutti i diritti riservati.
Aggiornato il 03/11/10.
|