× MSP430, Microcontrollori 16 bit Ultra Low Power

Settare la frequenza del DCO

11 Anni 2 Mesi fa #1 da Blu
Settare la frequenza del DCO è stato creato da Blu
Settare la frequenza del DCO è una delle operazioni più comuni nell’ambito di un programma per i microcontrollori.
Ad esempio, per avere una frequenza calibrata di 1MHz si procede in questo modo:

BCSCTL1= CALBC1_1MHZ;
DCOCTL = CALDCO_1MHZ;

Questo è ciò che ho letto ogni volta, spesso accompagnato da una raccomandazione:
“The write to BCSCTL1 affects the whole byte, not just the RSELx bits, and clears the
other bits. It may therefore be necessary to reconfigure the other functions controlled by
this register (XT2OFF, XTS, and DIVAx) but the defaults are usually satisfactory.” (John Davies, MSP430 Microcontroller Basics).

Il registro BCSCTL1, a parte la funzione appena descritta, permette di agire anche sull’oscillatore XT2 (non presente nella Value Line) e sul DIVAx, che divide il segnale proveniente da LFXT1S prima ancora che giunga all’ ACLK.
Ho fatto una semplice prova, in cui il led verde della Launch Pad si accendeva su output del TA0.1, che aveva come sorgente l’ ACLK (quindi, TASSEL_1).
La prova aveva 3 varianti.
Nella prima, davo l’istruzione:

BCSCTL1 |= DIVA_3

e la luce del led aveva una certa frequenza.
Nella seconda, l’istruzione BCSCTL1 |= DIVA_3 veniva seguita dall’istruzione:

BCSCTL1= CALBC1_1MHZ;
DCOCTL = CALDCO_1MHZ;

ed il led lampeggiava molto più frequentemente, a riprova del fatto che era stato modificato il registro BCSCTL1 (era stata cancellata l’istruzione DIVA_3).
Nella terza, l’istruzione BCSCTL1 |= DIVA_3 veniva seguita dall’istruzione:

BCSCTL1 |= CALBC1_1MHZ;
DCOCTL |= CALDCO_1MHZ;

con l’operatore di bitwise OR ( | ) ed il led ha ripreso a lampeggiare come nella prima prova, mantenendo quindi l’istruzione DIVA_3.

Domanda:

c’è un motivo per cui nella formula per settare la frequenza del DCO non ho mai visto usare l’operatore OR? Non sarebbe più comodo modificare i dati di tale registro (BCSCTL1) così come facciamo per qualunque altro, anzichè preoccuparci di “riconfigurare le altre funzioni controllate da questo registro”?

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Blu
  • Junior Member
  • Junior Member
Di più
11 Anni 2 Mesi fa #2 da Mauro Laurenti
Risposta da Mauro Laurenti al topic Settare la frequenza del DCO
Ciao,

l'approccio che usi e' certamente giusto e segue le raccomandazioni sullo scrivere i registri.
Normalmente il valore per il DCO viene caricato senza OR semplicemente perche' e' una delle prime operazioni svolte.
Le successive dovranno poi accedere per mezzo dell'operatore OR.

Per evitare ogni problema e' meglio fare come hai fatto tu.

Saluti,

Mauro

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Moderator
  • Moderator
Di più
11 Anni 2 Mesi fa - 11 Anni 2 Mesi fa #3 da Blu
Risposta da Blu al topic Settare la frequenza del DCO
Ciao Mauro, e grazie per la risposta.

Questo mi fa venire in mente quanto letto sullo stesso libro di Davies:
“ ... you frequently have to refer to data sheets and user’s guides while writing and debugging, which would warrant a second screen if you do not have the documents on paper.”
Da buon pivello qual sono, oggi sto imparando come scrivere/leggere la memoria flash, e come tutti i principianti mi avvalgo degli esempio forniti dalla TI, in particolare il file “msp430g2xx3_flashwrite_01” contenuto nella cartella slac485b (usata, credo, da tutti i principianti come me).
Come comando per il flash timing generator viene scritto:

FCTL2 = FWKEY + FSSEL0 + FN1; // MCLK/3 for Flash Timing Generator

Sul forum della e2e è pieno di programmi che contengono questa esatta istruzione, e non riescono a capire per quale motivo il programma non funziona come dovrebbe.

Non sarà perchè con FSSEL0 si sta prendendo come sorgente l’ ACLK e non il MCLK?

E tutti quelli che intervengono nel forum non li correggono, probabilmente perchè hanno imparato sullo stesso esempio. Anche chi ha scritto dei tutorial sugli MSP430 (ad esempio, il tutorial di Gustavo Litovsky) riporta esattamente questa stessa istruzione.

Perciò ribadisco il concetto di Davies: consultate sempre i data sheet e la user’s guide!!!


P.S.
Ciliegina sulla torta: nello stesso file, subito prima del comando per il flash timing generator, viene anche dato il solito comando per calibrare la frequenza del DCO:

BCSCTL1 = CALBC1_1MHZ; // Set DCO to 1MHz
DCOCTL = CALDCO_1MHZ;

con tutte le conseguenze di cui parlavamo prima.
Ultima Modifica 11 Anni 2 Mesi fa da Blu.

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Blu
  • Junior Member
  • Junior Member
Di più
11 Anni 2 Mesi fa #4 da Mauro Laurenti
Risposta da Mauro Laurenti al topic Settare la frequenza del DCO
Scrivere nella memoria flash richiede un clock di frequenza ad hoc in un determinato intervallo, per cui mantenendo un esempio identico ad uno funzionante ma cambiando la sorgente del clock o la sua frequenza, puo' causare un malfunzionamento del programma.

Questa specifica non esiste piu' negli ultimi modelli degli MSP430 della famiglia MSP430F5xx perche' possiedono un clock interno che viene utilizzato dal flash controller durante la fase di scrittura.
Lo stesso clock potrebbe essere usato anche come clock principale.

...fidarsi e' bene non fidarsi e' meglio! :)
Io possiedo sempre la user guide e datasheet sootomano! :)

Saluti,

Mauro

Si prega Accedi o Crea un account a partecipare alla conversazione.

  • Mauro Laurenti
  • Avatar di Mauro Laurenti
  • Moderator
  • Moderator
Di più
Moderatori: Mauro LaurentiMatteo Garia

Registrati al sito

Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.

Registrati al sito LaurTec.

Login