Il REGISTRO OSCCON e l' OSCILLATORE SECONDARIO
Esiste una ulteriore possibilità per generare il clock ed
è quella di utilizzare i due pin programmabili come accessi al TIMER1.
Questo secondo oscillatore va configurato con componenti esterni in modo del
tutto simile alla modalità LP-XS dell' oscillatore principale, ovvero
condensatori, cristallo o risonatore e resistenza serie.. Questo oscillatore
è stato previsto appositamente per impiegare quarzi del genere utilizzato
in orologeria (valore tipico 32768 Hz).
In apparenza, nulla sulle specifiche vieterebbe di utilizzare altre
frequenze, però questo oscillatore secondario viene sempre presentato con
valori molto più bassi di quelli dei cristalli applicabili all' oscillatore
primario. Il fatto che l' uso di un quarzo low power come quelli da
orologio richieda forzatamente una resistenza Rs del valore di qualche
centinaio di kohm (typ. 220 k) indicherebbe peraltro che l' oscillatore può
fornire una certa corrente e quindi operare anche con quarzi o risonatori più
"duri" o con frequenza maggiore.
Può essere un campo per lo sperimentatore.
Per disporre di questo oscillatore occorre programmare i pin
di accesso a Timer1 (T1OSCEN in T1CON) come oscillatore e collegare i
necessari elementi esterni, ma la prima cosa da fare per utilizzarlo è
quella di predisporlo nella fase di configurazione, abilitando il bit
OSCS del registro _CONFIG1H.
Con la sintassi stile PIC16, sarebbe necessario aggiungere alla riga __CONFIG
gli elementi _CONFIG1H, _OSCS_ON, mentre con la sintassi applicabile
ai PIC18 a partire dal MPASM7 basterà aggiungere la riga: CONFIG
OSCS = ON.
Una particolarità sensibile è quella di poter far passare
il processore sotto controller software dall' oscillatore primario a questo
oscillatore ausiliario e viceversa, ottenendo la possibilità di un
funzionamento a piena velocità quando necessario, mentre una frequenza
notevolmente inferiore servirà a mantenere attivo, ma a basso consumo, il
processore stesso.
La commutazione tra le diverse sorgenti è effettuata con i
bit SCS1:0 del registro OSCCON (OSCillator CONtrol register).
Prima di commutare da una sorgente di clock all' altra
occorre considerare che l' operazione richiede un certo tempo per la
stabilizzazione. Questo tempo è calcolabile come due cicli del clock
precedente più tre cicli del nuovo clock.
OSCCON
|
bit
|
IDLEN
|
IRCF2
|
IRCF1
|
IRCF0
|
OSTS
|
IOFS
|
SCS1
|
SCS0
|
funzione
|
R/W
|
R/W
|
R/W
|
R/W
|
R
|
R
|
R/W
|
R/W
|
default
|
0
|
1
|
0
|
0
|
|
0
|
0
|
0
|
-
bit 7 IDLEN
: Idle Enable bit
1 = il dispositivo va in modalità IDLE a seguito di una istruzione
SLEEP
0 = il dispositivo va in SLEEP a seguito di una istruzione SLEEP (valore
di default al RESET)
-
bit 6-4 IRCF2:0 Selezione
della frequenza dell' oscillatore interno INTOSC
111 = 8MHz
110 = 4 MHz
101 = 2 MHz
100 = 1 MHz (valore di default al RESET)
011 = 500 kHz
010 = 250 kHz
001 = 125 kHz
000 = 31 kHz
-
bit 3 OSTS
: Oscillator Start up Time Status
1 = Tempo di start up esaurito - l' oscillatore sta operando
0 = Tempo di start up in corso - l' oscillatore non è al valore
nominale
-
bit 2 IOFS
: INTOSC Frequency stable
1 = la frequenza prodotta da INTOSC è stabile
0 = la frequenza prodotta da INTOSC non è stabile
-
bit 1-0 SCS1:0 :
System Clock Selected bit
1x = Oscillatore interno
01 = Oscillatore del Timer 1
00 = Oscillatore primario
I bit SCS1:0 permettono di selezionare la sorgente del clock
da attivare, ovvero l' oscillatore primario, quello interno o quello
ausiliario.
L' oscillatore primario è quello definito dai bit CSS1:0 del registro
CONFIG1H. In conseguenza di qualsiasi RESET, i bit SCS sono posti a 0,
quindi il default di partenza è sempre l' oscillatore primario.
I bit IRFC2:0 selezionano il divisore della frequenza dell'
oscillatore INTOSC. Se l' oscillatore generale in uso è INTOSC, l' azione
su questi bit è immediata e non ci sono tempi di attesa per il cambio di
valore del clock. Va ricordato che per default dopo il RESET il valore
impostato è 100, ovvero è selezionata la frequenza di 1MHz.
Se viene selezionata la frequenza di 31 kHz, si può
scegliere attraverso OSCTUNE<7> se inviare questa frequenza o quella
generata da INTRC al clock principale.. Questo disabilita INTOSC e riduce il
consumo del processore. (in ogni caso INTRC è sempre attivo per alimentare
watchdog, fail safe timer, ecc).
I bit OSTS, IOFS e T1RUN(T1CON<6>) indicano quale
sorgente sta fornendo il clock. OSTS indica che il tempo di assestamento
dell' oscillatore ed eventuale PLL è completato. IOFS ha la stessa funzione
in relazione all' INTOSC.
T1RUN indica che il clock sta arrivando dall' oscillatore secondario.
Nelle modalità di funzionamento a gestione del risparmio energetico, solo
uno di questi tre bit è a livello 1. Se nessuno lo è, allora il clock del
processore è fornito da INTRC oppure l' oscillatore interno INTOSC si è
appena avviato e non ha ancora esaurito il tempo di assestamento.
Il bit IDLEN controlla in che modo verrà eseguita l'
istruzione SLEEP , potendo scegliere tra uno sleep completo e un modo idle a
basso consumo.
Commutazione tra due
sorgenti di Clock
Per fare un esempio pratico, supponiamo di avere un clock
primario con un quarzo da 10 MHz e un clock secondario con un quarzo
da 32768 Hz :
; configurazione
per abilitare lo switch tra le sorgenti di clock
CONFIG IESO = ON
; configurazione per
abilitare l' oscillatore principale in modo HS
CONFIG OSC = HS ; Oscillatore
principale
........
;
il sistema si avvia per default con l' oscillatore primario
....
; passaggio dal funzionamento a 10 MHz
; a quello a 32 kHz
bsf T1CON,T1OSCEN ;
avvio oscillatore secondario
....
; attesa per il tempo di stabilizzazione
bsf OSCCON,SCS0 ;
scambio sull’oscillatore secondario
...
...
; rientro all' oscillatore primario
bcf OSCCON,SCS0 ;
scambio sull’oscillatore principale
...
; attesa per il tempo di stabilizzazione