ELEMANIA
PIC16F690 - File include e costanti letterali
Indirizzi e registri

Come abbiamo già accennato, per accedere a un registro del PIC bisogna specificare:

  1. il banco su cui si trova il registro;
  2. l'indirizzo relativo del registro sul banco stesso.

Per esempio la sequenza di istruzioni necessaria per azzerare tutti i bit del registro che si trova all'indirizzo 0C (esadecimale) del banco 1 è la seguente:

         BSF 03,5 ; setta a 1 il bit 5 di SR
         BCF 03,6 ; resetta a 0 il bit 6 di SR
 
         CLRF 0C ;  pulisce (azzera) il contenuto del registro (usando l'indirizzo relativo)

Questa notazione è tuttavia abbastanza scomoda in quanto richiede al programmatore di ricordarsi gli indirizzi in memoria dei diversi registri del PIC.

File include

E' possibile semplificare notevolmente la scrittura di un programma in assembly usando etichette letterali (cioè nomi) al posto degli indirizzi in memoria. Tale procedimento può essere ulteriormente automatizzato utilizzando un file include contenente tutte le definizioni delle costanti da utilizzare.

Un file include non è altro che un file di testo contenente una serie di definizioni di etichette che può essere incluso all'inizio di un sorgente assembly. La maggior parte degli assemblatori e degli ambienti di sviluppo fornisce file include già definiti e contenenti tutte le costanti di uso più comune.

Nel caso del PIC16F690 il file include si chiama P16F690.INC e si trova nella cartella di installazione di MPLAB-IDE, oppure il può essere scaricato qui. Ecco come lo spezzone di programma precedente potrebbe essere riscritto usando le costanti predefinite nel file include:

         INCLUDE <P16F690.INC>

         BSF STATUS,RP0 ; setta a 1 il bit 5 di SR
         BCF STATUS,RP1 ; resetta a 0 il bit 6 di SR
 
         CLRF PIE1 ;  pulisce (azzera) il contenuto del registro

La direttiva INCLUDE dev'essere posta all'inizio del programma (come mostrato nella precedente lezione) e in ogni caso prima della prima istruzione che utilizza le costanti predefinite. Si osservi che, usando il file include, per accedere allo Status Register si può usare il nome mnemonico STATUS (invece dell'indirizzo 03). Allo stesso modo si usa PIE1 invece di 0C. Inoltre anche i bit 5 e 6 dello Status Register hanno un nome (RP0 e RP1) che può essere comodamente usato al posto del valore numerico.

NOTA:

Un piccolo fastidio, che si verifica usando le costanti letterali definite nel file include, è la comparsa di una serie di avvertimenti (warning) quando si assembla il programma (con Build All):

Message[302] F:\DOWNLOAD\PIC\PROVA.ASM 7 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] F:\DOWNLOAD\PIC\PROVA.ASM 12 : Register in operand not in bank 0. Ensure that bank bits are correct.
Message[302] F:\DOWNLOAD\PIC\PROVA.ASM 19 : Register in operand not in bank 0. Ensure that bank bits are correct.

Questi warning sono dovuti al fatto che le costanti definite nel file include utilizzano gli indirizzi assoluti dei registri, invece dei più corretti indirizzi relativi. Per esempio il registro ANSEL, che si trova sul banco 1, è specificato in questo modo nel file P16F690.INC:

ANSEL EQU H'011E'

In effetti 011E è l'indirizzo assoluto di ANSEL (cioè l'indirizzo rispetto all'inizio della RAM nel banco 0), mentre l'indirizzo relativo all'interno del banco è 1E. Il motivo per cui nel definire le costanti sono usati gli indirizzi assoluti è che usando gli indirizzi relativi non sarebbe più possibile usare la direttiva BANKSEL per selezionare automaticamente il banco di memoria.

Per evitare di ricevere i messaggi di warning, si può usare la direttiva errorlevel all'inizio del codice assembly, in modo da disabilitare i warning stessi, in questo modo:

        errorlevel -302 ; Disabilita i warning

 

Direttiva EQU

Mediante l'uso del file include è possibile semplificare notevolmente l'indirizzamento dei registri speciali SFR del PIC, usando il loro nome al posto del loro indirizzo. Tuttavia questa semplificazione non può essere automaticamente applicata ai registri GPR (General Purpose) utilizzati dal programmatore.

Supponiamo per esempio di voler usare un registro generico all'indirizzo 20 esadecimale sul banco zero. Per azzerare questo registro possiamo senz'altro scrivere (supponendo di usare il file include):

         BCF STATUS,RP0 ; setta a 0 il bit 5 di SR
         BCF STATUS,RP1 ; resetta a 0 il bit 6 di SR

         CLRF 20 ;  pulisce (azzera) il contenuto del registro di indirizzo 20

Tuttavia in questo modo il programmatore è costretto a ricordare a memoria l'indirizzo di ogni registro GPR utilizzato nel programma. Una soluzione più semplice consiste nell'uso della direttiva EQU, la quale consente di attribuire un nome letterale a una costante numerica.

Si consideri la seguente riscrittura dell'esempio precedente:

TMP   EQU 20

         BCF STATUS,RP0 ; setta a 0 il bit 5 di SR
         BCF STATUS,RP1 ; resetta a 0 il bit 6 di SR

         CLRF TMP ;  pulisce (azzera) il contenuto del registro di indirizzo 20

Nel nostro esempio TMP è il nome di un'etichetta scelta a piacere. La direttiva EQU consente di usare il nome mnemonico TMP al posto dell'indirizzo 20 per indirizzare il nostro registro.

NOTA:

In effetti il file include P16F690.INC contiene nient'altro che una serie di direttive EQU usate per definire i valori degli indirizzi dei registri SFR del PIC e le altri costanti numeriche. Qui sotto, a titolo di esempio, riportiamo il contenuto delle alcune righe di tale file dove si può osservare chiaramente il meccanismo usato:

;----- Register Files------------------------------------------------------

INDF EQU H'0000'
TMR0 EQU H'0001'
PCL EQU H'0002'
STATUS EQU H'0003'
FSR EQU H'0004'
PORTA EQU H'0005'
PORTB EQU H'0006'
PORTC EQU H'0007'
...

 

precedente - successiva

Sito realizzato in base al template offerto da

http://www.graphixmania.it