Tutorials - PIC18 by Data Sheet

 

Lo STATUS

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 :

  1. Tutte le istruzioni di branch sui flag dello STATUS
    BC, BCF, BN, BNC, BNN, BNOV, BNZ, BOV, BZ

  2. Tutte le istruzioni di set e/o test su bit
    BTFSC, BTFSS, BTG, BSF, BCF

  3. Tutte le istruzioni di comparazione o modifica e salto relative a files
    CPFSEQ, CPFSGT, CPFSLT, DECFSZ, DCFSNZ, INCFSZ, INFSNZ, SETF, TSTFSZ

  4. Le  istruzioni di salto, chiamata e ritorno a subroutine
    BRA, GOTO, CALL, RCALL, RETLWRETURN

  5. Le istruzioni specifiche relative all' FSR e BSR
    LFSR, MOVLB

  6. Alcune istruzioni di MOV
    MOVFF, MOVLW, MOVWF

  7. Le istruzioni di moltiplicazione
    MULLW, MULLWF

  8. Le operazioni sullo stack e sulle tavole
    POP, PUSH, TBLRD, TBLWT

  9. Il  NOP

  10. 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:

    bn      destination

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.