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