Calibrazione dell' oscillatore interno
|
Questa nota riguarda essenzialmente i PIC Baseline e Midrange dotati di
oscillatore interno e registro OSCCAL.
Molti PIC dispongono di un oscillatore interno (INTOSC) per il clock principale.
Si tratta di un RC calibrato in fabbrica, con una buona precisione ed in grado di
sostituire il classico oscillatore a cristallo in moltissime applicazioni.
L' uso dell' oscillatore interno evita di aggiungere al circuito un quarzo e due condensatori, salvando costo e spazio. Inoltre permette
di risparmiare i due pin dell' oscillatore esterno per utilizzarli come I/O,
cosa molto utile in tutti i chip con un numero limitato di piedini.
|
I componenti di un oscillatore esterno possono essere aggiustati dall'
utente per ottenere la frequenza voluta; un oscillatore a cristallo si basa
sulla precisione e stabilità del quarzo ed è aggiustabile finemente
variando i condensatori.
Una rete RC esterna è altrettanto aggiustabile, anche se meno
precisa e stabile del cristallo.
|
E sappiamo che la frequenza generata da un oscillatore RC dipende sia dalla precisione
dei componente, sia dalla temperatura, per cui è possibile che si renda
necessaria una qualche calibrazione per ottenere il valore di frequenza voluto.
E' evidente che aggiustamenti non sono
possibili per i componenti dell' oscillatore interno, dato che non sono
accessibili. Come fare?
Microchip ha risolto il problema associando all' oscillatore interno un registro (OSCCAL o OSCTUNE): variando il contenuto del registro si potrà
ritoccare il valore della frequenza generata attorno ad un valore centrale.
In generale, l' oscillatore interno ha una frequenza base di 4 o 8 MHz, ma molti
chip dispongono di sistemi più complessi, in grado di generare
frequenze tra 32kHz e 64MHz o più, associando sia divisori che moltiplicatori PLL.
Dobbiamo distinguere tre diverse tipologie di PIC in relazione alle modalità
possibili dell' oscillatore primario:
- Chip privi di oscillatore interno: vari componenti datati, principalmente Baseline
(16F54/57/59) e Midrange (16F72/73, 16F84/84a, ecc.) non dispongono di oscillatore interno: sono
indispensabili per il funzionamento sistemi di oscillatore esterno. Così,
quanto indicato in queste pagine non si applica.
- Chip dotati di oscillatore interno da calibrare: componenti Baseline
(10F200/202, 12F508/509, ecc.) o Midrange (12F629/675, 16F88/628/630/676) piuttosto noti dispongono di vari modi per l' oscillatore
primario, tra cui quello interno. Con questi chip possiamo usare i
classici oscillatori esterni, ma il modulo interno permette di
risparmiare due pin per usi generali, cosa spesso fondamentale per i
package a 8 pin e obbligatoria nei componenti a 6 pin, che prevedono
essenzialmente solo l'oscillatore interno. In questi componenti, la calibrazione dell' oscillatore è effettuata in
fabbrica per ogni singolo chip in questo senso: durante il collaudo del
componente viene rilevato il
valore migliore da applicare al registro di calibrazione OSCCAL.
Questo valore è associato ad ogni chip nel modo che vedremo più avanti.
Peraltro, il registro consente di variare la frequenza di una buona
percentuale (anche 10%) per adeguarsi alle più varie situazioni.
Per questi chip si deve applicare la calibrazione dell' oscillatore se
si vuole ottenere la precisa frequenza dichiarata.
- Chip dotati di oscillatore interno pre calibrato ed aggiustabile:
vari PIC Midrange (16F722/723/728 12F609/615/617 ecc.), Enhanced Midrange
e PIC18F
hanno molteplici modi per l' oscillatore, tra cui quello interno. Qui, il
componente viene tarato in fabbrica singolarmente in questo modo: i
componenti RC sono trimmati per il valore ottimale e
non è richiesta una calibrazione successiva. In ogni caso è disponibile
un registro OSCTUNE il cui contenuto
permette una variazione della frequenza generata. Il registro OSCTUNE
genere ha un suo valore fondamentale (in genere a 00h), che viene caricato
nel registro per default al POR, e che è stato fatto corrispondere al valore nominale della frequenza.
Quindi, automaticamente al POR il registro dell' oscillatore è caricato
con il valore migliore, che è anche quello di default.
Anche qui sono possibili
variazioni sensibili attorno al valore centrale modificando il contenuto
del registro; questi possibili aggiustamenti sono previsti per cambiare la
frequenza.generata dove sia necessario per esigenze del circuito o
problemi di temperatura.
Per questi chip non è necessaria una calibrazione dell' oscillatore;
l' aggiustamento è possibile, ma non obbligatorio.
Ci sono poi alcuni chip che, pur disponendo di un oscillatore interno, sono
privi di registro di calibrazione.
In una tabella:
OSC |
Baseline |
Midrange |
Enhanced
& PIC18F |
no INTOSC |
16F54/57/59 |
16F72/73/74/77/84/84a/ HV540/716/876/877 |
- |
OSCCAL |
10F200/202/204/206/220/222, 12F508/509/510/519/529,
16F505/526/570/707 |
12F629/675, 16F88/628/630/676 |
- |
OSCTUNE |
- |
16F722/723/728 12F609/615/617 12F610/616 12F752 16F753 16F720/721,
12F635 16F636/639, 16F631, 16F677/685/687/689/690, 16F684, 16F688 16F785 16F882/883/884/886/887,
16F913/914/916/917/946. |
tutti |
pre calibrati |
- |
10F320/322, 12LF1552, 16F627/628/648/a |
|
In sostanza si può estrapolare che, con il progredire della tecnologia
costruttiva, le difficoltà di ottenere RC interni di precisione si sono
ridotte: se nel passato dapprima non c'era oscillatore interno, poi aggiunto,
ma con la necessità della calibrazione, nelle versioni più recenti questa
operazione è resa inutile dai sistemi di taratura in fabbrica.
In breve, possiamo riassumere così:
- Nel caso in cui abbiamo disponibile un registro OSCTUNE(OSCillator
TUNining), esso ha funzione di aggiustamento (tuning) della
frequenza generata dall' oscillatore interno; una calibrazione non è
richiesta obbligatoriamente. Ne vediamo più avanti le caratteristiche.
- Nel caso in cui abbiamo disponibile il registro OSCCAL(OSCillator
CALibration), già il nome stesso indica che questo registro è
dedicato alla calibrazione dell' oscillatore interno: per ottenere un clock preciso, occorre copiare
nel registro il
valore di calibrazione determinato in fabbrica.
Vediamo come operare nei diversi casi.
La prima istruzione : calibrazione dell' oscillatore
Per l' oscillatore interno, il costruttore può effettuare durante la
costruzione del chip, una taratura di precisione dei componenti. Questo, probabilmente
comporta un costo addizionale per vari chip di fascia bassa, ma è una soluzione comune ai chip più recenti delle famiglie Midrange e ai
PIC18F che evidentemente sono realizzati con tecnologie più sofisticate.
Però, per svariati PIC Baseline e Midrange abbastanza diffusi, Microchip ha
implementato un
meccanismo diverso per correggere finemente ogni problema dovuto alle
tolleranze costruttive.
Si tratta dei PIC in cui abbiamo disponibile il registro OSCCAL.
Per questi chip viene determinata in fase di collaudo il valore preciso da
applicare al registro per ottenere la frequenza voluta. Siccome questo valore
è diverso da chip a chip, possiamo chiederci dove lo troviamo e questo rende necessario capire il meccanismo che ha utilizzato Microchip per far si
che ogni chip abbia accoppiato il suo specifico valore di calibrazione.
Nei PIC non ci sono
registri a sola lettura disponibili con facilità, mentre abbondano le aree
Flash.
Di conseguenza il costruttore ha scelto una via che sembra bizzarra, ma è molto
funzionale: il valore di calibrazione è scritto in memoria programma nell'
ultima cella disponibile, sotto forma di una istruzione.
Questa istruzione intrinseca e il suo impiego dipende se abbiamo a che fare
con Baseline o Midrange.
BASELINE
Nei Baseline (12F5108/509/510/10F2xx/ecc.) si tratta di una
istruzione del genere:
movlw
valore_di_calibrazione
Questa famiglia ha un set di istruzioni codificate su 12 bit, di cu 4 sono
dedicati all' opcode vero e proprio e gli ultimi 8 al valore in oggetto all'
istruzione.
Sembrerebbe, come abbiamo detto, una scelta bizzarra, ma dobbiamo
considerare quanto segue: nei PIC il
vettore di reset punta all' indirizzo della prima locazione di memoria programma
(000h), ovvero, il Program counter, al reset dovuto all' arrivo della tensione di alimentazione o altro,
viene caricato con l' indirizzo
0 e
da qui parte la scansione della sequenza delle istruzioni.
Nei Baseline dove esiste
un oscillatore interno, al reset il Program Counter viene fatto puntare non a 00h, ma all' ultima locazione
della memoria programma dove si trova contenuto il valore di calibrazione dell'
oscillatore sotto forma dell' istruzione sopra indicata. Questo valore è
stato scritto in fabbrica nella Flash prima di rilasciare il chip.
Al reset, dunque, l' ALU raccoglie ed esegue per prima
cosa l' istruzione "implicita" movlw
(move literal to W), ritrovandosi
con il registro WREG che contiene un "literal" che è il valore
numerico della calibrazione.
Quindi, a monte del classico
RESVEC ORG
0x00 ; Vettore del
Reset
completamente in modo trasparente per l' utente, sarà stata già eseguita l'
istruzione
;
movlw valore_calibrazione , prima istruzione intrinseca
|
In sostanza, appena avviato, il chip esegue "da solo" questa
istruzione, che
non ha necessità di apparire nel programma sorgente.
Il passo successivo del clock incrementa il Program Counter di una unità; se, ad esempio, la
fine memoria programma si trovava a 3FFh, il PC viene incrementato di uno e,
non essendoci altra memoria oltre l' indirizzo indicato, assume il valore 000h.
Questa situazione in inglese prende il nome di wrap around ;
chi ha dei dubbi sul meccanismo può visualizzare la situazione della memoria programma come
se fosse scritta su un cilindro: arrivati alla fine del testo, si riprende
dall' inizio.
E 000h è la locazione di inizio del
nostro programma vero e proprio, dove, attraverso i comandi ORG del sorgente, posizioniamo le
istruzioni del nostro programma.
Dunque, al reset ci troviamo con il valore di calibrazione caricato dall'
istruzione intrinseca in WREG. Possiamo
semplicemente utilizzare questo valore per calibrare l' oscillatore interno, copiando il contenuto di
WREG nel
registro OSCCAL.
Questo registro è uno degli SFR (Special
File Register) che, come abbiamo detto, ha lo scopo di controllare la frequenza generata dall' oscillatore
interno; semplicemente muovendo WREG nell' SFR (movwf
- move W to file), assicuriamo che la frequenza dell' oscillatore
sia quanto più precisa possibile.
;
movlw valore_calibrazione , prima istruzione intrinseca
RESVEC
ORG
0x00 ; Vettore
del Reset
; calibrazione oscillatore interno
movwf OSCCAL |
Semplice ed efficace.
Va tenuto presente che al POR il registro WREG contiene il valore di
calibrazione e quindi il suo trasferimento nel registro OSCCAL
va fatta immediatamente, prima di modificare WREG con altre istruzioni: il
valore di calibrazione è in memoria programma e non i memoria dati e quindi
non altrimenti recuperabile durante il funzionamento.
MIDRANGE
Nei Midrange con un basso numero di pin, come 12F675, 12F629, 12F683
non c'è il carico automatico dell' istruzione contenente il valore di calibrazione e il Program Counter
all' avvio (vettore del reset) sarà impostato sul classico 0000h. Però, anche in questo caso, l' istruzione di codifica
che si trova sempre nell' ultima locazione della memoria programma nella forma:
retlw
valore_di_calibrazione
Qui, per la calibrazione sarà necessario agire completamente in
"manuale", inserendo in testa al sorgente le prime istruzioni:
RESVEC
ORG
0x00 ; Vettore
del Reset
; calibrazione oscillatore interno
call
0x3FF ;
ultima locazione di memoria programma
movwf
OSCCAL |
La call
ritorna con il valore di calibrazione in WREG, che poi sarà trasferito a OSCCAL
dall' istruzione successiva.
Va osservato che per questi processori le cose possono essere
più complicate che per i Baseline, per cui è probabile che il registro di
calibrazione si trovi non nel
banco 0, ma nel banco 1.
Dato che al reset viene posizionato per default l' accesso al banco 0, occorre
commutarlo:
RESVEC
ORG
0x00 ; Vettore
del Reset
; calibrazione oscillatore interno
call
0x3FF ;
ultima locazione di memoria programma
banksel
OSCCAL ;
banco 1 per accedere a OSCTUNE
movwf
OSCCAL
banksel
0
; ritorno al banco 0 |
dove banksel
è una pseudo istruzione disponibile nel macro Assembler MPASM e che in questo caso sostituisce bsf/bcf
STATUS,RP0.
Anche in un linguaggio diverso da Assembly, l' operazione è
semplicissima. Ecco, ad esempio, per MikroBasic:
OSCCAL =
OSCCAL 'consenti al linker di riconoscere
il registro
asm
bsf STATUS, RP0 'Bank 1
call 0x3FF
'Get the cal value
movwf OSCCAL 'calibrate
bcf STATUS, RP0 'Bank 0
end asm |
Da notare che la posizione del valore di calibrazione è sempre all'
ultima cella della memoria programma, il cui indirizzo varia a seconda della
quantità implementata in quel chip:
Program Memory |
Ultima posizione |
512 |
1FFh |
1k |
3FFh |
2k |
7FFh |
4k |
FFFh |
8k |
1FFFh |
per cui sarà necessario puntare la call
sulla locazione opportuna.
Da notare che esistono Midrange che non dispongono di oscillatore
interno (16F87x, 16F84, ecc.), ma che però hanno modelli del tutto analoghi che ne dispongono
(16F88x, 16F88, ecc.) e che possono essere usati vantaggiosamente per la
sostituzione.
Informazioni precise si troveranno sul foglio dati nella sezione dedicata
ai modi dell' oscillatore.
In questo caso l' operazione di calibrazione, sempre necessaria per
ottenere il valore corretto di frequenza, può essere effettuata in qualsiasi
momento del programma, dato che l' accesso è con una chiamata a subroutine e
un rientro con il valore in WREG. Per contro, se il valore dell' ultima
locazione di memoria è stato danneggiato si possono avere seri problemi al funzionamento
del programma; basta pensare ad una call
verso una locazione che, invece di retlw
per un corretto rientro, contenga altri valori, che, come minimo, generano
un wrap-around sulla locazione di reset. Quindi, nei PIC questo sistema di
calibrazione per OSCCAL è
fondamentale che l' ultima cella di memoria contenga l' istruzione
adeguata.
OSCTUNE
Nei Midrange meno datati o più evoluti e nei
più recenti Enhanced Midrange, il
registro di controllo dell'oscillatore diventa OSCTUNE.
Per questi chip, durante la costruzione, viene effettuata una taratura
hardware dell' oscillatore.
Al reset, il valore di default del registro è fissato dalla fabbrica su un
valore, identico per tutti i chip della famiglia, che corrisponde al valore
centrale di una variazione tra un massimo ed un minimo, come nell' esempio
seguente (sotto, famiglia 16F88x):
dove i valori dei 5 bit (meno significativi) sono in complemento 2 ed
aggiustano l' oscillatore interno tra il massimo ed il minimo.
Dunque, il valore centrale è calibrato alla produzione e non ha
necessità di essere modificato; dato che è caricato come default al POR, non
è richiesta alcuna azione nel programma per aggiustarne il valore.
Però è possibile comunque variare la frequenza di clock
rispetto al default modificando il valore contenuto in OSCTUNE.
Nota: Il valore di OSCTUNE viene
portato al valore di default da un Power On Reset, ma non viene toccato da un reset
dovuto a MCLR, WDT, BOR o dal wakeup dopo sleep. Quindi, se il
suo valore è
stato modificato dal programma dopo il POR, sarà necessario adeguarlo solamente
dopo un' altro POR, mentre resterà intatto in tutte le altre
condizioni di reset. Questo consente, una volta impostato un valore
particolare in OSCTUNE, che esso
resti inalterato durante il normale funzionamento del programma. |
PIC18F
La situazione dei PIC18F è analoga a quella appena descritta, ovvero non
è richiesta calibrazione iniziale, ma è possibile sempre un aggiustamento dell'
oscillatore interno attraverso il registro OSCTUNE
.
|
Da notare che questi PIC di fascia alta, come altri PIC superiori, possono
integrare periferiche particolari (USB, Ethernet) ed avere sistemi di clock
molto complessi, per i quali è opportuno consultare il
capitolo relativo del foglio dati, onde evitare problemi nella configurazione
e nei comandi ai vari registri. A lato è riportato il diagramma dell'
elaborato sistema di clock di 18F2455/4550, dove esistono varie sorgenti
esterne ed una rete di PLL e postscaler e prescaler divisori
programmabili che permettono di ottenere frequenze da 31kHz a 96MHz. Qui, l' oscillatore interno INTOSC,
che ha una frequenza base di 8MHz, può venire elaborato
successivamente con i divisori di un postscaler per ottenere frequenze tra 31kHz e 8MHz. |
OSCCON, OSCTUNE & OSCCAL
Va evitata ogni confusione tra i registri OSCTUNE
e OSCCON.
All' oscillatore interno, oltre a OSCTUNE, si associa anche un registro OSCCON, che
ha lo scopo di controllare alcune funzioni dell' oscillatore stesso, come
lo stato. Con questo registro si può modificare anche la frequenza generata,
non nel senso di un aggiustamento, ma del suo valore fondamentale, come
abbiamo visto nel paragrafo precedente.
Qui, ad esempio, i bit da 4 a 6 di OSCCON
hanno la funzione di selezionare la frequenza dalla catena dei divisori del
postscaler, ma questo non ha nulla a che vedere con l' aggiustamento del
valore: resta sempre compito di OSCTUNE quello di
effettuare questo aggiustamento attorno al valore fondamentale, dove richiesto.
Altri bit di OSCCON hanno funzioni diverse
e il foglio dati le specifica. Da notare che in questo esempio il bit 7 di OSCTUNE
viene utilizzato per discriminare la sorgente del clock a 31kHz. E' quindi
possibile, dato che solitamente solo alcuni bit sono usati per l'
aggiustamento, i rimanenti bit di siano dedicati ad altri scopi. E'
sempre necessario dare almeno una occhiata al foglio dati.
Nota: i bit usati per l' aggiustamento in OSCTUNE
o OSCCAL possono essere posti
diversamente per i vari PIC, oltre ad essere anche in quantità
diversa. Così pure in OSCCON
i bit di switch delle varie frequenze base possono essere in posizione
e quantità diverse. Inoltre i bit non utilizzati per le
regolazioni possono essere inutilizzati, per cui la loro scrittura è
indifferente, ma possono anche essere dedicati a funzioni specifiche.
E' opportuno, prima di toccare questi registri, consultare le pagine
relative del foglio dati del componente che si sta utilizzando. |
Conoscere il valore della frequenza
Dato che l' oscillatore interno non è accessibile, è possibile verificare il valore della Fosc generata internamente?
In
molti casi è facilmente verificabile in modo diretto.
|
In vari chip con oscillatore interno è, infatti, possibile impostare semplicemente
dalla configurazione iniziale l'uscita di Fosc/4 dal pin OSC2.
In questo modo si potrà misurare la frequenza dell' oscillatore interno con
un frequenzimetro o un oscilloscopio collegato al pin.
In questa
configurazione, il pin OSC1 avrà funzioni di I/O generico. |
In generale, la variazione agli
estremi valori di OSCTUNE è del 8-12% o più rispetto alla frequenza centrale.
Ad esempio, in un PIC16F887 con frequenza centrale di 4MHz, agli estremi della
regolazione si va da 3.44 a 4.5MHz (circa 8%). Nota: durante le misure,
ricordare che la frequenza in uscita dal pin dedicato è la Fosc/4 ,
quindi, per un clock interno a 4MHz, la Fosc/4 sarà 1MHz.
Ma a che serve conoscere il valore di calibrazione ?
Ma a cosa mi serve conoscere il valore di calibrazione che Microchip ha
scritto all' interno del componente?
Essenzialmente ad evitarne la perdita. Infatti dovrebbe essere chiaro che
la memoria programma è Flash, ovvero cancellabile e riscrivibile. Quindi, per
una qualsiasi manovra errata o per un problema del software del dispositivo di
programmazione, è possibile che la cella dove è conservato il valore di
calibrazione sia cancellata. In questo caso, per ripristinare il valore
corretto, occorre attivare delle procedure che richiedono comunque tempo e
risorse.
Per evitare questo, è opportuno disporre di un qualche sistema per un
"backup" del valore di calibrazione, che, ripetiamo, non è un
valore generico o legato al modello, ma è specifico per ogni singolo chip.
La cosa è molto semplice: basta leggere l' ultima locazione della memoria
programma. Questo si ottiene facilmente attraverso un qualsiasi tool di
programmazione con la funzione Read.
Vediamo due esempi, basati sul Pickit e sull' ambiente MPLAB o sul software
stand alone Pickit Programmer.
Lettura con MPLAB
Vediamo ad esempio come si può
operare con un Pickit e l' ambiente MPLAB-IDE. In
questo caso non occorre aggiungere alcun software addizionale, in quanto il
Pickit sarà controllabile direttamente dall' ambiente MPLAB in cui è
integrato.
- Avviamo MPLAB e selezioniamo il tipo di chip che vogliamo leggere dal
menu Configure -> Select Device
Ad esempio, selezioniamo un 12F675, Midrange a 8 pin
la finestra ci informa anche dei tools che potremo usare per programmare o
per il debug. Per questo chip, non recente, vanno bene praticamente tutti, a
partire dal Pickit1
- Abilitiamo ora il tool disponibile come programmatore, dal
menu Programmer -> Select Programmer ->
In questo caso abbiamo selezionato un Pickit3.
- Dobbiamo aver ovviamente collegato il Pickit al chip
attraverso una connessione ICSP.
Il chip dovrà essere alimentato: questo è possibile con un alimentazione
esterna e in tal caso non occorre alcuna manovra addizionale.
oppure si potrà comodamente alimentare il tutto direttamente dal Pickit,
abilitando la funzione dal menu Programmer -> Settings -> Power
Il corretto funzionamento del tutto sarà visualizzato dalla finestra Output
con un messaggio Device connected
Occorre utilizzare l' alimentazione da parte del Pickit solo ed
esclusivamente quando il chip non sia alimentato da un' altra sorgente; se
questa esiste, non si deve abilitare la Vdd dal Pickit per evitare possibili
danni al tools.
- Procediamo ora alla lettura del chip agendo sul tasto Read
del menu principale.
Il risultato dell' operazione sarà visibile attivando la finestra Program
Memory dal menu View. Nella finestra cercheremo l' ultima
locazione:
In modalità Machine o Symbolic, la finestra ci darà la
posizione come linea, il valore esadecimale dell' indirizzo, il valore
esadecimale del contenuto e anche il relativo disassembly.
Osserviamo che in questo esempio l' ultimo indirizzo si trova a 3FFh
(1k di memoria programma disponibile nel chip) e che contiene il valore 342Ch,
che è disassemblato nell' istruzione retlw 0x2C.
Trattandosi di un Midrange, l'istruzione è codificata su 14bit di cui i
primi 6 riguardano l' opcode vero e proprio e gli ultimi 8 (meno
significativi) l' oggetto dell' istruzione.
Quindi il valore di calibrazione cercato è 2Ch.
Ripetiamo che questo non è un valore generico, ma quello relativo a questo
specifico chip; un' altro 12F675 potrà avere un valore di calibrazione
differente.
12F675 è un Midrange; se analizziamo un Baseline, ad esempio 16F526, il
codice dell' istruzione finale sarà differente, non solo per il valore di
calibrazione. Per questo processore, la selezione del modello ci comunica che
la programmazione non è eseguibile con Pickit1 e 2.
Useremo allora il Pickit3.
Leggendo la memoria programma come indicato in precedenza, osserviamo che
il codice contenuto nell' ultima cella è questo:
che la finestra stessa ci disassembla in:
movlw
0x6
che è quanto abbiamo indicato in relazione ai Baseline.
Da notare che la
codifica delle istruzioni nei Baseline è su 12 bit, di cui i soliti 8 più
bassi (lower bits), in questo caso, costituiscono l' oggetto e i rimanenti 4
(upper bits) l' opcode vero e proprio.
Tra le altre cose, è interessante notare che la finestra Output ci
comunica anche se il valore di calibrazione è stato danneggiato nel momento
in cui viene collegato il chip:
Nel caso in esempio, il contenuto dell' ultima cella di memoria era 00h,
valore non valido.
Queste stesse operazioni sono fattibili con qualsiasi altro tool Microchip
in ambiente MPLAB-IDE e in ambiente MPLAB-X.
Lettura con Pickit Programmer
I Pickit sono previsti per essere usati anche al di fuori dell' ambiente
MPLAB.
Vediamo, allora, la stessa operazione effettuata sempre con un Pickit, ma
separatamente da MPLAB, attraverso il software di programmazione stand alone Pickit
2 Programmer.
|
Pickit 2 Programmer, scaricabile gratuitamente dal sito di Microchip,
dovrà essere installato e avviato attraverso la sua icona. Apparirà
una finestra di controllo come quella a lato.
Per prima cosa, attraverso il menu principale e il comando Device
Family, scegliamo la famiglia di appartenenza del chip,
in questo caso un Baseline.
Nella finestra Device selezioniamo il chip; qui è un
10F204.
Attiviamo la lettura col pulsante Read e nella
finestra Program Memory apparirà il contenuto della
memoria, mentre appariranno altre informazioni relative al contenuto
del chip stesso.
Nella finestra Program Memory ricerchiamo l' ultima
locazione, che in questo caso è all' indirizzo 0FFh e contiene C1Eh,
dove 1Eh è il valore di calibrazione di questo specifico chip.
La stessa operazione è effettuabile in modo identico con Pickit3
ed il relativo software Programmer. |
Nell' esempio, è stato utilizzato un Pickit2 clone auto costruito, a cui
è sovrapposto uno zoccolo ZIF che consente di collegare chip in qualsiasi
package. L' insieme costituisce un comodo ed economico stand alone per
programmare una buona quantità di modelli.
Come sappiamo, i Pickit sono alimentati dalla porta USB e possono
alimentare il carico collegato; per leggere il chip, in queste condizioni,
dato che non ci sono alimentazioni esterne, occorre attivare la funzione di
alimentazione attraverso il Pickit.
|
Questo si ottiene facilmente selezionando la casella On
della finestra Vdd Pickit2:
Se non alimentiamo il chip, ovviamente questo non potrà essere
letto ! |
Come detto in precedenza, occorre utilizzare l' alimentazione da parte del
Pickit solo ed esclusivamente quando il chip non sia alimentato da un' altra
sorgente; se questa esiste, bisogna evitare di abilitare la Vdd dal Pickit per
evitargli possibili danni.
E' utile avere una indicazione della presenza di questa tensione; nel caso del
sistema usato in questo esempio, si tratta di un LED a bassissima corrente,
posto in parallelo all' alimentazione del chip sullo zoccolo.
Dove si utilizzi un Pickit2 standard o occorra il Pickit3, la basetta che
supporta lo zoccolo potrà essere collegata direttamente al tool.
Questa soluzione è risultata in ogni caso la più pratica per programmare
i chip al di fuori del circuito stampato.
Altri semplici supporti per programmare chip stand alone sono
descritti qui.
Gli altri tools di Microchip, come ICD e RealIce sono
altrettanto utilizzabili allo stesso modo per questa funzione, ma solo all'
interno dell' ambiente MPLAB, dato che non hanno software stand alone; inoltre
richiedono una alimentazione esterna per il chip, dato che non sono previsti
per fornirla
Ovviamente, attraverso una connessione ICSP, sarà possibile leggere
la memoria del chip anche quando questo è installato o saldato su un circuito
stampato, senza rimuoverlo. Qui altre informazioni su ISCP-ICD.
Si potrà usare anche qualsiasi altro dispositivo di programmazione di
terze parti che
abbia un software in grado di leggere il contenuto della memoria programma.
Come faccio a salvare il valore di calibrazione ?
Una volta che il valore di calibrazione proprio di quel determinato chip è stato
letto, dobbiamo salvarlo in stretta relazione con il chip stesso.
Ci possono essere due vie: la prima, più semplice, è quella di applicare una
piccola etichetta sul lato inferiore del chip (il che lascia leggibile la
sigla sul lato superiore), sulla quale scriveremo la calibrazione.
Un secondo metodo è il seguente: consideriamo per prima cosa che il valore di
calibrazione è a 8 bit e i chip sono al minimo dello stesso numero di pin, se
non maggiore. Possiamo allora associare le due cose.
Il valore esadecimale della calibrazione è convertibile facilmente nell' equivalente binario.
Prendiamo ad esempio il valore visto prima:
Facciamo una associazione fra pin e cifra binaria:
Pin |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
Valore |
0 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
Riportiamo ora la situazione sui pin fisici del chip, applicando una
macchia di colore alla base di ogni pin a cui abbiamo associato il valore 1:
Pin |
8 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
Valore |
0 |
0 |
1 |
0 |
1 |
1 |
0 |
0 |
Colore |
|
|
x |
|
x |
x |
|
|
Useremo un pennarello indelebile bianco o rosso oppure lo smalto rosso che
si impiega per sigillare punti regolabili o viti (genere RS 196-5245). Si
avrà cura di non far colare il colore sul pin, ma di limitarlo solamente alla
parte superiore, in modo tale da non presentare problemi nell' inserzione in uno zoccolo.
Ecco il risultato in pratica:
In questo modo chip e valore di calibrazione sono associati in modo
indelebile e facilmente leggibile.
Se capitasse di cancellare la calibrazione in Flash, basterà riprogrammare la
locazione finale con l' istruzione adatta.
Per un PIC con più pin, come il 16F526 esemplificato sopra, non ci sono
problemi e si potrà utilizzare lo stesso sistema, considerando i pin iniziali
o (1,2,3,4,14,13,12,11). In questo caso, dato che 06h equivale a 00000110
binario, ci sarà la corrispondenza seguente:
Pin |
14 |
13 |
12 |
11 |
4 |
3 |
2 |
1 |
Valore |
0 |
0 |
0 |
0 |
0 |
1 |
1 |
0 |
Colore |
|
|
|
|
|
x |
x |
|
che da origine a questa marcatura.
Si tratta solo di una possibile indicazione di come fare ad associare chip
valore di calibrazione leggibile e non corrisponde ad alcuno standard. Quindi
chiunque potrà implementare una diversa soluzione. Certamente la marcatura
con colore è
applicabile a packages con un minimo di 8 pin, mentre per i chip SMD a 6 pin
ovviamente non è fattibile. Nel caso di impiego di PIC minimali come la serie
10F, che sono in SOT23-6, è opportuno usare questi per la produzione e
sviluppare o sperimentare (cioè quando è più facile incorrere nella cancellazione
non voluta del valore di calibrazione) con le versioni in DIP-8, dove etichetta o
marcature di colore sono possibili. E' utile fare le operazione di
salvataggio della calibrazione per ogni chip non appena lo
abbiamo in laboratorio; in questo modo non dobbiamo temere la perdita del
valore di calibrazione per una ragione qualsiasi, perdita che richiederebbe un
lavoro non semplicissimo di ricerca del valore adeguato.
Come lo ripristino ?
Molto semplice.
Supponiamo che il valore di calibrazione sia 1Ch. A questo va aggiunto
il codice dell' istruzione che, come abbiamo visto, varia a seconda si tratti
di codifiche a 12 o 14 bit.
Se il PIC è un Baseline, con istruzione codificata a 12bit, l' ultima
locazione della memoria programma dovrà contenere C1Ch.
Se il PIC è un Midrange, con istruzione codificata a 14bit, l' ultima
locazione della memoria programma dovrà contenere 341Ch.
Con i programmi visti prima, scriviamo l' ultima locazione della memoria
programma col valore voluto e programmiamo il chip. Se stiamo ripristinando
solo questo valore, non occorre toccare alcuna altra cella di memoria.
Ovviamente possiamo riscrivere il valore di calibrazione anche durante la
programmazione del chip con un determinato firmware. Quello che è
necessario tenere presente è che è sempre opportuno, anche se abbiamo
"salvato" il valore di calibrazione, evitare che durante la
cancellazione/programmazione del chip venga cancellato anche questo valore.
I programmi di gestione dei tools di Microchip, sia attraverso MPLAB sia stand
alone hanno questa caratteristica.
Per altri programmatori di terze parti, controllate che la cancellazione possa
escludere l' ultima cella della memoria programma.
Come faccio a recuperare il valore di calibrazione
quando è stato perso ?
Se il valore di calibrazione è andato perso, esistono parecchi modi di ri calibrazione attraverso programmi che vanno
caricati nel chip ed eseguono automaticamente la ricerca del valore più
adatto. Un esempio è dato dalla AN244. Esiste
comunque una via molto più
pratico e immediatamente accessibile ai
possessori di Pickit 2 e 3 e che consente di ripristinare lil valore
di calibrazione con poche semplicissime manovre.
Altre informazioni per i perplessi
Il foglio dati è lo strumento essenziale per reperire le informazioni che
sono alla base di queste pagine.
Troviamo, consultando il foglio dati, che non tutti i chip, pure essendo
elementi di una stessa famiglia, ad esempio Baseline, presentano situazioni
uguali.
Ad esempio, la pubblicazione Microchip DS41190C-page 16,
riporta per il PIC12F675 la seguente informazione:
Si nota come nel registro OSCCAL i
bit di aggiustamento sono quelli da 7 a 2, mentre i bit 1 e 0 non hanno alcuna
funzione. Quindi, per portare ad esempio tutti i bit significativi a 1 andrà
bene sia FFh che FCh che FEh o FDh, dato che i due bit meno significativi non
sono considerati e possono assumere qualsiasi valore.
Inoltre, come si rileva dalla TABLE 9-7 (DS41190C-page 54),
il valore indicato come Center frequency è quello che viene
caricato come default al POR o BOR, come si rileva dalla Table2.1, DS41190C-page
10:
Questo valore di default viene caricato al POR, al Reset da MCLR, BOR e WDT.
Non viene modificato dopo un wake-up. Quindi, se il contenuto di OSCCAL
è stato cambiato rispetto al default, occorre considerare la necessità di
una ricalibrazione.
Se analizziamo la documentazione di 16F526 (DS41326E)
notiamo che i bit di calibrazione sono 7 e non 6 (DS41326E-page 17):
e che è pure diverso il valore del Center frequency :
Con più bit a disposizione sarà possibile un aggiustamento più fine dell'
oscillatore.
Inoltre questo chip dispone di una doppia frequenza interna, 4 o 8MHz; non
esistendo un registro OSCCON, la scelta
della frequenza fondamentale dovrà essere effettuata nella configurazione
iniziale. Così
per gli altri chip dotati di OSCCAL,
ovvero non esiste uno "standard", ma ogni famiglia di chip ha la sua
soluzione caratteristica, che evidentemente dipende dalla tecnologia
costruttiva applicata.
Però
queste differenze non condizionano quanto detto sulla calibrazione, in quanto
essa avviene sempre copiando il valore scritto nell' ultima locazione di
memoria nel registro di calibrazione. In tutti i casi, il foglio dati
precisa chiaramente le modalità della calibrazione.
12F675 - DS41190C-page 54 |
16F526 - DS41326E-page 47 |
|
|
dove si specifica chiaramente che l' oscillatore interno provvede a
generare la frequenza nominale di 4MH "when calibrated", ovvero una
volta che sia stato calibrato, nel primo caso anche con un esempio di codice
Assembly relativo.
L' indicazione dei valori massimo-medio-minimo della figura REGISTER2-7
può creare perplessità in relazione al valore di Center frequency. Però
questo valore è un default generico che può essere diverso dal valore di
calibrazione; non è detto che con il valore di default del Center
frequency si ottengano esattamente 4MHz. Questo si avrà quando in OSCCAL
verrà scritto il valore di calibrazione presente nell' ultima
locazione della memoria programma.
E il valore di calibrazione non si scrive da sè nel registro, per il
meccanismo che abbiamo descritto prima; il PC alla prima operazione preleva l'
istruzione movlw, ma se non la facciamo
seguire nel programma dal movwf OSCCAL, il
valore di calibrazione NON andrà da solo in OSCCAL
e alla prima operazione con WREG andrà perso.
Si potrà obiettare che il sistema è un poco strano, ma così è; è una
scelta del costruttore e non si può fare altro che adeguarsi.
Problemi & C
- Esistono parecchie imprecisioni sul WEB a riguardo della calibrazione
dell' oscillatore interno.
Ad esempio si ritiene erroneamente che l' istruzione intrinseca movlw
valore_di_calibrazione
di per se carichi il valore di calibrazione in OSCCAL,
ma questo non è. Per calibrare l' oscillatore occorre che le prime
istruzioni effettuino questa copia, altrimenti l' oscillatore sarà
regolato da un valore di default che, come abbiamo visto, può non essere
quello più adatto.
- Questa convinzione errata può dipendere dal fatto che compilatori di
linguaggi evoluti (ad es. Hi-Tech per i Baseline) provvedono in modo
trasparente all' utente a introdurre le istruzioni necessarie alla calibrazione. Se questa può
essere intesa come una delle varie azioni di supporto del compilatore al
programmatore, in realtà essa, come altre, fa si che aumenti la distanza
tra utente e hardware, del quale si perde la comprensione delle relative caratteristiche e necessità.
- Altrettanto, azioni del genere:
OSCCAL = 0x80; // set internal
oscillator to mid frequency
non hanno alcun senso. La "mid frequency", dove esiste un
valore di calibrazione pre fissato in memoria programma, non è il valore
migliore, ma solo il default al POR; dove si voglia una frequenza più
corretta possibile l' unica procedura è quella descritta sopra.
Tra l' altro, la scelta di un valore medio come 80h è una scelta del tutto
arbitraria e senza senso, in quanto, abbiamo visto, il default può variare
tra i diversi tipi di chip.
Un Center frequency è valido solamente per i chip con OSCTUNE,
ma non per quelli con OSCCAL.
- Infatti, solo i chip Enhanced Midrange e PIC18F che sono realizzati con
oscillatori pre tarati, non richiedono alcuna manovra di calibrazione,
dato che solo qui il valore di default è realmente quello adeguato. L'
azione su OSCTUNE diventa opzionale se
si desidera variare la frequenza generata dal default, ma non è un
obbligo per la precisione, che è intrinseca.
- Nel caso dei Baseline la calibrazione va fatta come prima operazione del
programma, in quanto al POR il registro WREG conterrà il valore di
calibrazione. Più avanti nel programma, una volta che il contenuto di
WREG sia modificato, non sarà possibile accede a quello di calibrazione,
che sta in memoria programma e non in memoria dati.
- Nel caso dei Midrange, dove l' istruzione intrinseca è un retlw
e che occorre chiamare con un call,
questo può essere fatto in qualsiasi punto del programma.
- Se l' istruzione di calibrazione è stata sovrascritta altro o
cancellata, nel caso del movlw
l' esecuzione iniziale non comporta solitamente alcun problema, dato che
si verifica il wrap around che comunque riporta i Program Counter alla
locazione 00h. Solamente se si utilizzasse un valore casuale di WREG
per la calibrazione si avrebbe una frequenza di clock non corretta.
Nel caso in cui sia un retlw , la
situazione è più critica, in quanto chiamando con un call
una locazione che non contiene un return, gli effetti potrebbero essere
rovinosi; nel caso migliore, si avrebbe anche qui un wrap around, ma con
lo stack ancora contenente un indirizzo non utilizzato.
In ogni caso è opportuno non lasciare il contenuto di questa cella di
memoria fuori posto e se cancellata, riscriverla in modo corretto come
indicato prima. In particolare, la funzione di recupero del software di
Programmer per i Pickit rende l' operazione semplice e rapida.
- In aiuto all' utente intervengono i programmi di gestione dei
programmatori: cercando di programmare uno chip con oscillatore interno
con uno dei tanti tool di Microchip, il sistema verifica che nell' ultima
locazione di memoria ci sia una istruzione adeguata. Se così non fosse,
viene data una segnalazione di errore, in modo tale da poter correre ai
ripari.
Attenzione: se la locazione viene caricata con una movlw
o retlw, a seconda del chip, ma che
hanno per oggetto un valore qualunque diverso da quello specifico per il
chip, non viene segnalato alcun errore, in quanto il programma verifica
che ci sia l' istruzione adeguata, ma non può verificarne il contenuto.
Quindi, per recuperare il valore corretto, se è stato cancellato o
modificato erroneamente, ricorrete alle tecniche descritte prima e non
introducete valori casuali, dai quali si otterrebbe una frequenza
probabilmente diversa da quella attesa.
- Durante l' emulazione con ICD, headers o ICE il valore di calibrazione
ovviamente sarà quello del tools di emulazione e non quello del
chip reale. Le istruzioni di calibrazione non avranno effetto se non nel
componente definitivo.
Ma è preciso questo oscillatore interno ?
I fogli dati parlano di precisioni migliori dell' 1%. Questo dato, se
rispettato, consente di utilizzare l' oscillatore interno anche per il baud
rate di scambio dati seriali senza errori di comunicazione e per elementi di
tempo non critici.
E' stata fatta una prova con vari chip per verificare come si comporta l'
oscillatore interno al variare del registro di aggiustamento. Vediamone
alcuni.
Per tutti, è stato impostato il modo con oscillatore interno ed uscita
della Fosc/4 al pin OSC2 con
un config iniziale del genere:
__config
... & _IntRC_OSC_CLKOUT ...
Ecco alcuni risultati per 16F526. E' stata misurata la
frequenza in uscita per un clock interno di 8MHz con i seguenti risultati:
Chip |
valore
di
calibrazione |
Fosc/4 @ |
min.
80h |
max.
7Eh |
center
00h |
calib. |
#1 |
06h |
127857 |
267510 |
197329 |
200320 |
#2 |
06h |
127533 |
267420 |
197307 |
200488 |
#3 |
0Eh |
125293 |
261615 |
192657 |
200184 |
#4 |
08h |
127330 |
265489 |
196241 |
200297 |
Come si vede, anche considerando che la misura, effettuata con un
oscilloscopio digitale, avrà una sua tolleranza propria, il valore di default
del Center frequency determina una frequenza meno precisa del valore di
calibrazione; con questo valore si ottengono tolleranze rispetto al valore
nominale dell' 1%, come indicato sulle caratteristiche del foglio dati. Altri
chip Baseline hanno mostrato tolleranze migliori, ma anche peggiori. E'
stato verificato pure qualche chip con OSCTUNE
, ovvero che non necessita di calibrazione, ma il cui oscillatore può essere
manipolato attraverso questo registro. Ad esempio un PIC18F, il 18F14K22
ha dato i seguenti risultati:
Chip |
Fosc/4 @ |
max. |
calib. |
min. |
1Fh |
00h |
20h |
18F14K22 |
205843 |
200438 |
193110 |
La frequenza interna è stata selezionata a 8MHz con OSCCON.
Qui la sintonia occupa i primi sei bit meno significativi di OSCTUNE,
mentre i due rimanenti sono dedicati ad altre funzioni. Un Midrange, 12F683,
in cui la frequenza interna è impostata a 8MHz con OSCCON.
La sintonia occupa i primi 5 bit meno significativi di OSCTUNE
, mentre i due rimanenti non sono utilizzati:
Chip |
Fosc/4 @ |
max. |
calib. |
min. |
0Fh |
00h |
10h |
18F14K22 |
221247 |
199975 |
1768170 |
Si conferma che nei processori dotati del registro OSCTUNE
, ovvero con l' oscillatore pre tarato in fabbrica, il valore di default è il
migliore, mentre sono possibili aggiustamenti più o meno ampi attorno al
valore centrale. Quindi, si può riassumere che, per ottenere la frequenza
nominale:
- i chip con il registro OSCCAL richiedono
la calibrazione secondo la modalità vista. Il valore di default può non
essere quello corretto.
- i chip con registro OSCTUNE non
richiedono calibrazione. Il valore di default è quello migliore.
Un' ultima nota per dissipare ogni dubbio: i registri OSCTUNE
e OSCCAL riguardano solamente l' oscillatore
interno. Quando sono selezionati modi di oscillatore esterno, i bit
di calibrazione/sintonia dell' oscillatore non hanno alcuna
funzione.
|
Altre informazioni utili:
|