Tips & Trick - PIC

 

 

__CONFIG : è necessario?


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


 

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