Hi guys
We are changing micro in our embedded systems MSP430F149 to MSP430F249. I have a function to read internal frequency of DCO oscillator and with this new micro dosen't work. No event capture happen if I have SMCLK with DCO. All it's ok if I use SMCLK with XT2CLK. Does anyone have any idea ?
This is my function.
//-----------------------------------------------------------------------------------------------
// GetDCOFreq
// Utilizza il TimerB e ACLK(32KHz) per misurare la frequenza del DCO (torna valore in Hz)
//-----------------------------------------------------------------------------------------------
LONG MSP430_GetDCOFreq()
{
BYTE SmclkFromXt2;
WORD n1,n2;
// Setta un flag se SMCLK è ricavato da XT2
if (BCSCTL2 & SELS) SmclkFromXt2=1; else SmclkFromXt2=0;
// Ricava il clock per SMCLK da DCO
BCSCTL2 &= ~SELS;
//BCSCTL2 |= SELS;
// Accende TimerB: conteggio continuo a 16 bit, clock = SMCLK
TBCTL = TBSSEL1 | MC1 | TBCLR;
// Capture da CC16B=ACLK, rising edge
TBCCTL6 = CM1 | CCIS0 | SCS | CAP;
// Attende il primo evento di capture
while ( (TBCCTL6 & CCIFG)==0 ) {};
// Memorizza valore attuale
n1 = TBCCR6;
// Azzera flag di capture e overflow
TBCCTL6 &= ~(COV|CCIFG);
// Attende il prossimo evento di capture
while ( (TBCCTL6 & CCIFG)==0 ) {};
// Memorizza valore attuale
n2 = TBCCR6;
// Se si e' verificato un overflow azzera il valore, se no calcola la differenza
if ( (TBCCTL6 & COV) != 0 ) n2=0; else n2=n2-n1;
// Ferma il TimerB
TBCTL = 0; TBCCTL6 = 0;
// Ripristina il clock a SMCLK da XT2 se necessario
if (SmclkFromXt2 != 0) BCSCTL2 |= SELS;
// Ritorna il valore calcolato in KHertz
return( (n2*32768L)/1000L );
}