T&T - PIC

 

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:

  1. 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.
      
  2. 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.
      
  3. 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.

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

  1. Abilitiamo ora il tool disponibile come programmatore, dal menu Programmer -> Select Programmer ->

In questo caso abbiamo selezionato un Pickit3.

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

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

2Ch = 00101100b

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:

 


 

 

Copyright © afg. Tutti i diritti riservati.
Aggiornato il 09/07/14.