Tips & Trick - PIC

 

 

__CONFIG in modo diverso


Normalmente le linee del comando __config, in Assembly, raggiungono una lunghezza tale da superare quella della linea stampata e quindi essere rimandate a capo, cosa che, a parte l'aspetto disordinato, le rende meno facilmente leggibili.

Per i PIC18F il formato della configurazione comprende delle linee singole, una per opzione, nella forma descritta qui.

Si può fare qualcosa di simile anche per gli altri PIC a 8 bit, cosa che diventa apprezzabile sopratutto per gli Enhanced Midrange che hanno più opzioni.


Configurazione classica.

Prendiamo, ad esempio, la configurazione per un PIC12F1571. Sono necessarie due configuration words. La scrittura classica è la seguente:

 __config _CONFIG1,_FOSC_INTOSC & _CLKOUTEN_OFF & _WDTE_OFF & _MCLRE_ON & _PWRTE_ON & _BOREN_ON & _CP_OFF
 __config _CONFIG2,_WRT_OFF & _PPLEN_OFF & _STVREN_OFF & _BORV_LO & _LPBOR_OFF & _LVP_OFF

E' possibile che vi troviate ad usare una versione dell'Assembler non recente, che segnalerà il tentativo di scrivere una parola da 16 bit  risultante da una espressione come quella sopra, in una locazione ampia 14 bit (che è quella del core dei PIC16): l' errore [303] .

In effetti, più che un errore, si tratta di un warning, ovvero una segnalazione che avvisa l'utente di una operazione effettuata autonomamente dall'Assembler per "aggiustare" una situazione impropria.
Si ottiene nella finestra di uscita un messaggio del genere:

Message[303] /PIC/Sorgenti/Source.asm 4: Program word too large.  Truncated to core size. (FFAC)

Questo comunica che alla riga 4 del file indicato una parola di 16 bit (FFACh) viene troncata alla dimensione del core (14 bit, ovvero 3FACh), scartando i due bit più alti.

In  questo caso, la cosa non ha effetti sulla compilazione, salvo la situazione, sempre spiacevole, di avere segnalazioni nel risultato.  Da notare che la segnalazione [303] non è relativa solo a questa situazione, ma appare ogni volta che si tenti di caricare un valore di dimensione maggiore della destinazione. In tutti i casi MPASM non sospende la compilazione, ma agisce troncando il valore al numero di bit disponibili nella destinazione. E' una segnalazione di cui tenere conto in quanto è possibile che il troncamento non sia accettabile ed occorra correggere, invece, la logica del sorgente che ha portato alla segnalazione.

Nel caso della configurazione, per risolvere il problema occorre o utilizzare una versione più recente di MPASM oppure inibire la segnalazione stessa. La via più immediata è quella di disabilitare la segnalazione:

 errorlevel -303 ; suppress wordsize warning

 __config _CONFIG1,_FOSC_INTOSC & _CLKOUTEN_OFF & _WDTE_OFF & _MCLRE_ON & _PWRTE_ON & _BOREN_ON & _CP_ON 
 __config _CONFIG2,_WRT_OFF & _PPLEN_OFF & _STVREN_OFF & _BORV_LO & _LPBOR_OFF & _LVP_OFF 

 errorlevel 303  ; restore warning

errorlevel -303 blocca la segnalazione, mentre errorlevel 303  la ripristina per le fasi successive della compilazione.

In alternativa, si potrà semplicemente limitare a 14 bit il valore da trasferire, aggiungendo un AND con 03FFFh (valore che ha i due bit più alti a 0):

 __config _CONFIG1,_FOSC_INTOSC & _CLKOUTEN_OFF & _WDTE_OFF & _MCLRE_ON & _PWRTE_ON & _BOREN_ON & _CP_ON & H'03FFF'
  __config _CONFIG2,_WRT_OFF & _PPLEN_OFF & _STVREN_OFF & _BORV_LO & _LPBOR_OFF & _LVP_OFF & H'03FFF'

In ogni caso abbiamo la solita sequenza di label piuttosto lunga e decisamente poco simpatica.


Configurazione "diversa".

Possiamo, però, utilizzare le possibilità di MPASM per scrivere un config simile a quello dei PIC superiori o del C.

Questo è l'aspetto delle righe che generano le stesse Configuration Words di quanto visto sopra:

#define CONFIG1 cfgword1=cfgword1 &
 variable cfgword1=0x3fff     ; initialize CONFIG to core limit
;now the individual options                         alternative

CONFIG1 _FOSC_INTOSC          ; INTOSC oscillator  _ECL _ECM _ECH
CONFIG1 _CLKOUTEN_OFF         ; no CLKOUT          _ON
CONFIG1 _WDTE_OFF             ; no WDT             _SWDTEN _NSLEEP _ON
CONFIG1 _MCLRE_ON             ; MCLR               _OFF
CONFIG1 _PWRTE_OFF            ; no PWRT            _ON
CONFIG1 _BOREN_ON             ; BOR                _SBODEN _NSLEEP _OFF
CONFIG1 _CP_OFF               ; no code protect    _ON
 __config _CONFIG1, cfgword1  ; set config word 1.

#define CONFIG2 cfgword2=cfgword2 &
 variable cfgword2=0x3fff     ; initialize CONFIG to core limit
;now the individual options
                                                        alternative
CONFIG2 _WRT_OFF              ; no WRT             _ALL _HALF _BOOT
CONFIG2 _PLLEN_OFF            ; no PLL             _ON
CONFIG2 _STVREN_OFF           ; no stack error     _ON
CONFIG2 _BORV_LO              ; BOR lowest voltage _HI
CONFIG2 _LPBOR_OFF            ; no BOR lp          _ON
CONFIG2 _LVP_OFF              ; no LVP             _ON
 __config _CONFIG2, cfgword2  ; set config word 2. 

La prima azione è quella di definire una label CONFIG1 come un AND & tra una variabile locale cfgword1  e le linee successive (non aggiungete un commento a questa linea).

La variabile locale è definita con il comando variable  e viene inizializzata con 0x3fff, che porta a zero i due bit più alti, limitando l'ampiezza del risultato dell'AND a 14 bit.

Le label successive sono definite nel file nomeprocessore.inc  incluso inizialmente nel sorgente.
Ogni riga aggiunge all'AND un nuovo valore. La scrittura su righe diverse è accettata dal Macro Assembler MPASM.  
Da notare che ogni riga CONFIG1 deve partire in prima colonna per evitare di avere una segnalazione di errore [202] (label non in prima colonna).
 
Chiudiamo l'operazione con lo statement di configurazione  __config  (inizia con due _ _) che invia alla locazione  _CONFIG1 il valore complessivo di cfgword1  come risulta dalla sequenza di AND. 

Da notare che anche  _CONFIG1 è una label definita nel file nomeprocessore.inc  e corrisponde alla locazione di memoria in cui il dispositivo di programmazione scriverà il valore ottenuto. Ad esempio, per 12F1571, il file p12f1571.inc  conterrà:

; The following is an assignment of address values for all of the
; configuration registers for the purpose of table reads
_CONFIG1     EQU      H'8007'
_CONFIG2     EQU      H'8008'

La stessa operazione si effettua per la seconda Configuration Word

Ovviamente, se esiste una sola configuration word, non ne  saranno necessarie altre
Se occorrono più configuration word, esse si aggiungeranno seguendo le regole indicate.

Da notare che ogni opzione può disporre di un chiaro commento, il che facilita la comprensione; inoltre, nel commento alle varie opzioni, potrebbe essere utile, come nell'esempio, inserire le alternative possibili, dato che molte di esse non si limitano ai soli _ON  e _OFF

Con questo metodo possiamo ottenere una fase di configurazione iniziale molto più ordinata e leggibile di quella classica, al costo di una piccola complicazione strutturale.

Questa modalità funziona anche con i Baseline: l'unica variazione sarà quella di sostituire 0x3fff con 0x0fff, dato che il core è a 12bit.

Per evitare la riscrittura della configurazione per ogni sorgente si potrà usare un template oppure salvare le linee della configurazione voluta in un file da includere nel sorgente, con notevole comodità e risparmio di tempo.


da una idea apparsa nel forum di Microchip.

Copyright © afg . Tutti i diritti riservati.
Aggiornato il 09/08/18 .