Viene posta la domanda: ma la linea o le linee di configurazione, per
intenderci quelle che cominciano con __CONFIG, sono indispensabili?
La risposta è sì. Vediamo il perchè.
__CONFIG
E' uno statement (comando) dell'Assembly che costringe il compilatore a
scrive dei valori specifici in una specifica area della memoria programmabile.
Questi valori sono applicati ad uno o più Registri di Configurazione in modo da
attivare o meno alcune opzioni.
Queste opzioni hanno lo scopo di configurare alcune parti dell'harware del
microcontroller in modo tale da eseguire funzioni che sono alla base
dell'operatività del chip.
Intendiamoci bene:
- non si tratta di righe che sono eseguite come
istruzioni; il config iniziale non ha nulla a che vedere con le istruzioni e,
in un certo senso, non fa minimamente parte del programma.
In pratica, si tratta di questo: all'interno del microcontroller, i
progettisti hanno disposto la possibilità di configurare l'hardware di base
per un certo numero di scelte diverse.
Ad esempio, il clock del sistema può essere derivato da un oscillatore
interno o da uno esterno. L'oscillatore esterno necessiterà di un hardware
esterno al chip.
Ne risulta evidente che se impongo al chip di avviarsi con un oscillatore
esterno, ma poi ometto di aggiungere quanto necessario (quarzo, condensatori,
ecc), il sistema non funzionerà.
L'esempio del clock dovrebbe chiarire bene anche il fatto che la
configurazione iniziale è a monte dell'esecuzione del programma: serve a
predisporre la configurazione dell'hardware su cuoi poi dovrà girare il
programma.
Un altro esempio indicativo può essere il Watchdog Timer (WDT). In base
alla configurazione iniziale, posso attivarlo o meno. E' anche qui evidente
come, se attivo il WDT e poi nel programma non ne prevedo una gestione, avrò
seri problemi per i continui reset generati dal modulo privo di controllo.
Nella configurazione iniziale sono comprese svariate opzioni, alcune
fondamentali come la scelta della sorgente del clock, altre che possono essere
meno fondamentali.
Vediamone il meccanismo.
I registri della configurazione.
I valori che imponiamo con la riga __CONFIG sono scritti in una o più
locazioni della memoria Flash al momento della scrittura della memoria
programma del chip.
La scelta della memoria Flash è evidente: devono permanere fino ad una nuova
programmazione del chip.
Ogni bit è una "chiave" che attiva o meno una opzione e che,
all'accensione del chip, fa si che l'hardware interno si configuri come
desiderato, escludendo alcune possibilità ed abilitandone altre.
A seconda del tipo di chip, si possono avere uno o più registri di
configurazione, posti in generale ad indirizzi alti nella mappa di memoria e
non accessibili dal programma, se non per quei chip che dispongono della
possibilità più ampia di lettura/scrittura della Flash.
La non accessibilità se non durante la programmazione del componente non è
fattore negativo, in quanto protegge le opzioni sensibili da possibili danni
creati da operazioni di scrittura mal dirette.
Per contro, la possibilità di modificare bit di configurazione durante
l'esecuzione del programma, aumenta la flessibilità di impiego, anche se
richiede un accuratissimo controllo di cosa si sta facendo (e non ha senso per
alcune opzioni, come ad esempio la modalità del clock).
In ogni caso, questo comporta un fatto che dovrebbe essere noto: i bit di
una cella di memoria Flash non programmata o cancellata, si trovano a livello
logico 1.
Quindi, in queste condizioni, sono abilitate tutte le opzioni che
corrispondono al relativo bit a 1 e viceversa.
Ne deriva che, anche se non scrivo nulla nell'area della configurazione,
qualcosa è GIA' scritto: tutti i bit sono a 1e questo seleziona alcune
opzioni e ne deseleziona altre.
Vediamo cosa questo comporta.
Un esempio tra i Midrange.
Consideriamo un PIC minimale ed abbastanza diffuso come 12F675.
Il foglio dati nella sezione 9.0 Special Features of the CPU, presenta anche
le opzioni che la configurazione iniziale può gestire.
In una locazione della memoria Flash, all'indirizzo 2007h; questo indirizzo
è al di fuori dello spazio di memoria programma reso disponibile all'utente
ed appartiene allo spazio riservato (2000h - 3FFFh) a cui si può accedere solo in fase di programmazione.
Facendo parte della memoria programma, si tratta di una locazione che
contiene 14bit (ricordiamo che il core dei Midrange gestisce istruzioni a
14bit, per cui le celle della memoria programma hanno questa dimensione).
Tutti i bit possono essere lettti e programmati con uno dei tanti tools
adeguati.
Il loro valore di default, ovvero prima di una programmazione, è uguale a 1.
Bit |
Funzione |
Opzioni |
_CONFIG |
BG1:0 |
Calibrazione del generatore di tensione bandgap di POR e
BOR |
11 = valore maggiore
00 = valore minore |
- |
CPD |
Protezione della memoria dati |
1 = protezione disabilitata
0 = protezione abilitata |
_CPD_OFF
_CPD_ON |
CP |
Protezione della memoria programma |
1 = protezione disabilitata
0 = protezione abilitata |
_CP_OFF
_CP_ON |
BODEN |
Abilitazione Brown-out |
1 = abilitato
0 = disabilitato |
_BODEN_ON
_BODEN_OFF |
MCLRE |
GP3 come I/O o MCLR |
1 = MCLR
0 = GP3 |
_MCLRE_ON
_MCLRE_OFF |
PWRTE |
Abilitazione power-up timer |
1 = disabilitato
0 = abilitato |
_PWRTE_OFF
_PWRTE_ON |
WDTE |
Abilitazione Watchdog |
1 = abilitato
0 = disabilitato |
_WDTE_ON
_WDTE_OFF |
FOSC2:0 |
Selezione oscillatore |
111 = RC esterno con clockout
110 = RC esterno senza clockout
101 = INTOSC con clockout
100 = INTOSC senza clockout
011 = Oscillatore esterno in CLKIN
010 = Oscillatore HS
001 = Oscillatore XT
000 = Oscillatore LP |
_EXTRC_OSC_CLKOUT
_EXTRC_OSC_NOCLKOUT
_INTRC_OSC_CLKOUT
_INTRC_OSC_NOCLKOUT
_FOSC_EC
_FOSC_HS
_FOSC_XT
_FOSC_LP |
In grassetto le opzioni che sono selezionate al default.
Possiamo notare che alcune label sono sovralineate, il che corrisponde alla
negazione:
label sovralineata
logica negativa 1 = disabilitato 0 = abilitato
label non sovralineata logica positiva 1 =
abilitato 0 = disabilitato
Inoltre, una nota sui bit BG: i bit di calibrazione
bandgap sono programmati in fabbrica e devono essere letti e salvati prima di essere cancellati.
Come indicato nella specifica di programmazione PIC12F629/675, questi bit vengono
riportati in lettura della parola di configurazione, ma gli strumenti di sviluppo Microchip
li mantengono invariati (in effetti tutti i bit di calibrazione alla
impostazioni di fabbrica non vengono toccati).
Non è, dunque, consigliabile agire su questi senza
una ben chiara ragione, tanto che non dispongono di una label di
configurazione; quindi, attraverso il comando __config
non è possibile modificarli.
Per gli altri bit, invece, ogni opzione corrisponde ad una label di
configurazione (queste label sono reperibili nel file nomeprocessore.inc
che viene incluso ad inizio sorgente e che contiene tutte le label necessarie
alla gestione del chip, come label degli SFR, nomi dei bit, ecc.).
Posiamo osservare che, se non effettuiamo la configurazione iniziale, il
chip sarà comunque configurato, ed esattamente in questo modo:
_CPD_OFF & _CP_OFF &
_BODEN_ON & _MCLRE_ON & _PWRTE_OFF & _WDTE_ON & _EXTRC_OSC_CLKOUT
Ovvero:
- protezioni disabilitate
- BOR abilitato
- MCLR attivo
- PWRT disabilitato
- WDT abilitato
- Oscillatore RC esterno con CLOCKOUT
Se questa condizione è quella necessaria al funzionamento del nostro
programma, possiamo certamente omettere la linea di configurazione, ma se non
è quello l'oscillatore voluto o non desideriamo WDT o vogliamo proteggere
dalla copia il nostro firmware, DOBBIAMO FORZATAMENTE inserire la
configurazione voluta.
In questo esempio, l'oscillatore previsto è un RC esterno applicato al pin
CLKIN, mentre dal pin CLKOUT sarà resa la frequenza Fosc/4. Se non abbiamo
applicato fisicamente questo RC al pin CLKIN, non ci sarà alcun clock e il
programma non sarà eseguito; se ci aspettiamo di utilizzare il pin CLKOUT
come I/O, questo non sarà possibile, dato che l'opzione selezionata nel
config sovrapassa qualsiasi altra disposizione data durante l'esecuzione del
programma.
Ricordiamo ancora che le opzioni di configurazione:
- non sono istruzioni
- non sono eseguite nel programma (quindi non richiedono clock)
- sono imposizioni all'hardware che valgono all'accensione del chip e non
sono modificate fino ad una successiva programmazione.
Peraltro, i tool di programmazione, per default cancellano tutta l'area
Flash prima di programmarla (escluse le impostazione di fabbrica), quindi la situazione di "tutti i bit a
1" è sempre verificata nel momento in cui si programma o ri-programma il
chip.
Ci si può chiedere che cosa comporta una configurazione parziale. Ad
esempio, ci limitiamo a configurare l'oscillatore e la protezione:
_CPD_ON & _CP_ON & _INTRC_OSC_NOCLKOUT
Con questo abbiamo impostato:
- protezioni attivate
- oscillatore interno senza CLOCKOUT
Ma i rimanenti bit non sono spariti: semplicemente, non li abbiamo
modificati e il loro valore è rimasto quello di default, ovvero 1. Quindi
abbiamo:
- BOR abilitato
- MCLR attivo
- PWRT disabilitato
- WDT abilitato
Di nuovo, se questo è quello che vogliamo, va bene non toccare questi bit,
ma, se ad esempio non ci aspettiamo di trattare nel programma la funzione del
WDT, ci troveremo con un bel problema, dato che il default abilita il watchdog,
che, non appena il chip sarà alimentato, inizierà ad interrompere
l'esecuzione del programma con continui reset.
Quindi, è buona norma, scrivere comunque TUTTE le opzioni disponibili.
Questo consente due cose:
- non trascurare qualche opzione indispensabile
- rendersi conto delle possibili opzioni di avvio.
Ancora più pressante può essere la situazione di chip che necessitano di
più di una word di configurazione, come gli Enhanced Midrange e i PIC18F.
Se osserviamo i fogli dati degli Enhanced Midrange, scopriamo che un capitolo,
solitamente il 4, è dedicato esclusivamente alla configurazuione, il che
dovrebbe essere indicativo della sua importanza.
Ad esempio, per un 16F1509, abbiamo due words.
Configuration Word 1
Configuration Word 2
Ritroviamo voci viste nell'esempio precedente, o comunque presenti in
moltissimi PIC, come CP,
PWRTE, MCLRE, LVP.
Altre, come FOSC, WDTE, WRT, BOREN hanno
pure le stesse funzioni, ma dispongono di più bit, ovvero sono configurabili
più opzioni.
Altre ancora sono note a chi usa i PIC18F, come STVREN,
la segnalazione di errore dello stack.
Una lettura del capitolo indicato, permette di conoscere la funzioni dei bit e
delle opzioni programmabili.
Come solito, la lista delle opzioni e delle relative label è presente nel
file nomeprocessore.inc
.
Una nota a parte si può fare sull' opzione DEBUG,
che abilita il motore ICD per il debug on-chip: questa opzione non dispone,
per questo processore, di una label e quindi non è gestibile dalla linea __config.
La funzione di debug ICD, invece, è controllata automaticamente dai tools di
sviluppo in ambiente MPLAB-X quando si sceglie l'opzione di debug dal pannello
di controllo.
Per questo chip, il default delle configuration wors èquivale ad aver
scritto questa configurazione:
_FCMEN_ON & _IESO_ON &
_CLOCKOUTEN_OFF & _BOREN_ON & _CP_OFF & _PWRTE_OFF &
WDTE_ON & _FOSC_ECH
_LVP_ON & _DEBUG_OFF & _LPBOR_OFF
& _BORV_LOW & _STVREN_ON & _WRT_OFF
Ovvero, come standard, WDT è abilitato, BOR è abilitato, PWRT è
disabilitato.
Ma anche : l'oscillatore è configurato come esterno col segnale che arriva
sul pin CLKIN e se questo manca, manca il clock primario. Inoltre è abilitata
la programmazione low voltage LVP, il che fa perdere l'uso del pin RA3/MCLR.
Dunque, anche in questo caso, la mancata scrittura delle configuration
words o la loro scrittura parziale possono non combinare con quanto è
necessario per l'esecuzione del programma. Questo ne
impedisce il corretto funzionamento.
|