L’oscillatore interno sul PIC12F675 : a cosa serve OSCCAL?
L’oscillatore interno sul PIC12F675 ha un’ unica opzione: 4MHz. Il che significa che non è possibile settare altre frequenze per l’oscillatore interno al di fuori dei 4MHz. Molti altri pic, invece, hanno la possibilità di poter impostare l’oscillatore interno a diverse frequenze utilizzando il registro OSCCON (OSCillator CONtrol).
Quando sul PIC12F675 utilizziamo nella config word una di queste due opzioni:
// INTOSC oscillator: CLKOUT function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN #define FOSC_INTRCCLK 0x31FD // INTOSC oscillator: I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN #define FOSC_INTRCIO 0x31FC |
l’oscillatore interno girerà automaticamente a 4MHz senza dover impostare alcun altro registro. La prima opzione (FOSC_INTRCCLK) permette di avere sul pin GPIO4 una frequenza in uscita pari al clock utilizzato dalle periferiche (FOSC/4), la seconda opzione (FOSC_INTRCIO) permette invece di utilizzare anche GPIO4 come normale IO.
L’oscillatore interno del PIC12F675 è calibrato in fabbrica. Cosa vuol dire? La Microchip, in pratica, regola finemente l’oscillatore affinchè giri esattamente a 4MHz piuttosto che a 4,01 o 3,98. Difatti questo PIC ha un registro di calibrazione chiamato OSCCAL che serve appunto a regolare in maniera fine l’oscillatore interno affinchè giri esattamente a 4MHz.
In condizioni normali non è necessario agire sul registro OSCCAL dal momento che, come dicevo, l’oscillatore è regolato in fabbrica. Il PIC12F675 ha difatti una locazione nella memoria programma in cui viene salvato il valore di calibrazionedi fabbrica e, utilizzando programmatori Microchip, tale valore viene trasferito automaticamente da questa locazione di memoria verso il registro OSCCAL. Utilizzando l’applicazione standalone del pickit2 possiamo notare, per questo ed altri PIC, una cosa:
Vedete che in basso appare “OSCCAL: ” seguito da un numero. Il valore mostrato dal software comincia sempre con 34, seguito dal valore di calibrazione di fabbrica. I numeri sono da intendersi in esadecimale. Il primo 0x34 è l’opcode dell’istruzione assembler RETLW, il secondo valore (0x34 in questo esempio) rappresenta invece il valore di calibrazione di fabbrica.
Grazie all’utente NOBOOT che ci ha aiutato a capire il significato del valore mostrato dal software
Il PICkit durante una cancellazione, preserva il valore di calibrazione di fabbrica. Si legge difatti a pagina 15 del manuale del PICkit2:
Erase Performs a Bulk Erase of the target MCU. OSCCAL and band gap values are preserved on parts with these features.
Ovvero: “Il comando ERASE esegue una cancellazione di massa della MCU. I valori OSCCAL e band gap sono invece preservati sulle MCU aventi tali caratteristiche“. Alcuni programmatori non microchip potrebbero non avere questa opzione e quindi il valore di fabbrica può essere cancellato definitivamente dato che fa parte della memoria programma.
Ovviamente, trattandosi di un valore di calibrazione, non è detto che un altro PIC12F675 abbia lo stesso valore mostrato sopra, difatti inserendo nel programmatore un altro PIC12F675, ecco che questo ha il proprio valore di calibrazione di fabbrica:
Per cui: volendo utilizzare l’oscillatore interno del PIC12F675, non bisogna fare nessuna impostazione nei registri. E’ necessaria unicamente la word di configurazione dato che il PIC12F675 ha solo la possibilità di utilizzare l’oscillatore interno a 4MHz. L’oscillatore interno a 4MHz è inoltre già calibrato in fabbrica per cui non c’è necessità di utilizzare il registro OSCCAL che serve invece per la regolazione FINE (e non per il settaggio della frequenza come molti credono).
Facciamo una prova con l’oscilloscopio. Utilizzo il seguente semplice programma:
#include <htc.h> __CONFIG(FOSC_INTRCCLK & WDTE_OFF & PWRTE_OFF & MCLRE_OFF & BOREN_OFF & CP_OFF & CPD_OFF); void main(void) { while(1) {continue;} } |
Questo programma di test non fa nient’altro che impostare l’oscillatore interno permettendo di avere sul pin GPIO4 il clock (FOSC/4). Come vedete non ho usato OSCCAL dato che voglio usare l’impostazione di fabbrica e sto usando solo programmatori microchip che non mi cancellano tale valore. Sull’oscilloscopio ho quindi questo:
Vedete che la frequenza in uscita dal pin è esattamente 1.000 MHz (FOSC/4). Ovvero l’oscillatore è settato correttamente a 4MHz. Precisi!
Facciamo una cosa che fanno in pochi: leggere il datasheet. Vediamo quindi cosa dice il datasheet riguardo al nostro amato OSCCAL:
Il datasheet dice: “il registro di calibrazione dell’oscillatore (OSCCAL) è utilizzato per calibrare l’oscillatore interno a 4MHz. Contiene 6 bit per regolare la frequenza verso l’alto o verso il basso in modo da ottenere 4MHz“. Leggendo le impostazioni si capisce inoltre che mettendo a tutti “1” i bit, si ottiene la massima regolazione verso l’alto. Mettendo a tutti zero si ottiene la massima regolazione verso il basso (o la minima regolazione…).
Facciamo quindi un’altra prova con quest’altro programma:
#include <htc.h> __CONFIG(FOSC_INTRCCLK & WDTE_OFF & PWRTE_OFF & MCLRE_OFF & BOREN_OFF & CP_OFF & CPD_OFF); void main(void) { OSCCAL=0xFF; while(1) {continue;} } |
Ho in pratica messo OSCCAL al massimo valore (i bit 0 e 1 comunque non vengono utilizzati perchè la regolazione è a 6bit, quindi scrivere 0b11111100 è lo stesso!), quindi mi aspetto una frequenza sicuramente superiore a 4MHz (ma non so di quanto, è necessario un oscilloscopio per saperlo!). Difatti all’oscilloscopio ho questa situazione:
Vedete che ora FOSC/4 vale 1.449MHz, ovvero l’oscillatore interno mi sta girando a 1.449*4 = 5.796MHz. Su un altro PIC12F675, però, questo valore potrebbe non essere lo stesso!!
Ora mettiamo OSCCAL a zero. Sull’oscilloscopio ora ho questo:
Ora FOSC/4 vale 877.2Khz, ovvero l’oscillatore interno sta girando a 877.2*4=3,509MHz.
Togliendo il settaggio di OSCCAL viene di nuovo presa l’impostazione di fabbrica e l’oscillatore gira a 4MHz precisi.
Non girerà a 4MHz precisi solo se abbiamo programmato il PIC con un programmatore che cancella anche la locazione dove è incluso il settaggio di fabbrica. Spero che ora sia chiara la differenza tra OSCCAL, che CALIBRA l’oscillatore interno in maniera tale da ottenere 4MHz precisi (sul PIC12F675) e i registri OSCCON, presenti su altri PIC, che servono invece a settare l’oscillatore interno su altri valori diversi da quello di default.