DCO von MSP430F berechnen

Gast #560890
Lesenswert?

Hallo zusammen,
ich brauche dringend Hilfe.
Ich habe die Dokument von TI über DCO gelesen und habe versuche, eine 
Frequenz vob DCO anhand die Parameters, die ich in die 3 Register 
DCOCTL, BCSCTL1, BCSCTL2 schreibe.
zum Beispiel:
MOV.B  #0x80,&DCOCTL    ;ACLK/8, XT2 off,
MOV.B  #0xB5,&BCSCTL1    ;(rsel,dco,mod)=(5,4,0),
MOV.B  #0x00,&BCSCTL2    ;int. R, MCLK=SMCLK=DCO/1
aber ich bin nicht in der Lage, die Frequenz von DCO zu berechnen.
Im Dokument von TI steht auch gar kein Formel.
Grüße.
LED
Persönliche Seite #560896
Lesenswert?

Was für einen MSP430 verwendest Du denn? Bei den MSP430F20xx gibt es 
eine Tabelle im Flash, in der Initialisierungswerte für einige 
definierte Taktfrequenzen stehen (1 MHz bis 16 MHz), mit denen ist der 
DCO zu laden und fertig.

Ansonsten gibt es die Möglichkeit, mittels eines externen Uhrenquarzes 
(32768 Hz) und eines Timers den DCO im laufenden Betrieb auf eine 
gewünschte Frequenz einzustellen, dazu gibt es eine Appnote von TI.

Einen '157 und '169 betreibe ich so mit erstaunlich genauen 2 MHz.
Gast #560915
Lesenswert?

Hallo Rufus t. Firefly,
danke für die Antwort.
Ich benutze MSP430F149.

Ich denke:
wir können anhand der Parameters, die wir in 3 Register schreiben, die 
DCO-Frequenz zu berechnen.
und dann können wir wie folgende machen.
>Ansonsten gibt es die Möglichkeit, mittels eines externen Uhrenquarzes
>(32768 Hz) und eines Timers den DCO im laufenden Betrieb auf eine
>gewünschte Frequenz einzustellen, dazu gibt es eine Appnote von TI.
Aber ehrlich gesagt, ich verstehe das Verfahren nicht ganz.
und es gibt bestimmt auch eine Formel für die Einstellung, oder?
Kannst du mir vielleicht besser erklären?
Vielen Dank.
LED
#561010
Lesenswert?

Mit dem Code kannst du den auf eine Frequenz relativ zur 32,768kHz 
Frequenz des X1 einstellen, vielleicht hilft das:
1
//------------------------------------------------------------------------------
2
void Set_DCO (void)                         // Set DCO to selected frequency
3
//------------------------------------------------------------------------------
4
{
5

6
  unsigned int Compare, Oldcapture = 0;
7

8
  //BCSCTL1 |= DIVA_3;                        // ACLK= LFXT1CLK/8
9
  CCTL2 = CM_1 + CCIS_1 + CAP;              // CAP, ACLK
10
  TACTL = TASSEL_2 + MC_2 + TACLR;          // SMCLK, cont-mode, clear
11

12
  while (1)
13
  {
14
    while (!(CCIFG & CCTL2));               // Wait until capture occured
15
    CCTL2 &= ~CCIFG;                        // Capture occured, clear flag
16
    Compare = CCR2;                         // Get current captured SMCLK
17
    Compare = Compare - Oldcapture;         // SMCLK difference
18
    Oldcapture = CCR2;                      // Save current captured SMCLK
19

20
    if (DELTA == Compare) break;            // If equal, leave "while(1)"
21
    else if (DELTA < Compare)               // DCO is too fast, slow it down
22
    {
23
      DCOCTL--;
24
      if (DCOCTL == 0xFF)
25
      {
26
        //if (!(BCSCTL1 == (XT2OFF + DIVA_3)))
27
        if (!(BCSCTL1 == XT2OFF))
28
        BCSCTL1--;                          // Did DCO roll under?, Sel lower RSEL
29
      }
30
    }
31
    else
32
    {
33
      DCOCTL++;
34
      if (DCOCTL == 0x00)
35
        {
36
          //if (!(BCSCTL1 == (XT2OFF + DIVA_3 + 0x07)))
37
          if (!(BCSCTL1 == (XT2OFF + 0x07)))
38
          BCSCTL1++;                        // Did DCO roll over? Sel higher RSEL
39
        }
40
    }
41
  }
42
  CCTL2 = 0;                                // Stop CCR2
43
  TACTL = 0;                                // Stop Timer_A
44
}

DELTA ist der Übersetzungsfaktor, also bei DELTA = 125 läuft der DCO 
dann mit 4,096MHz.

Die Berechnungsformeln sind nicht im Datenblatt sondern im Family User 
Guide.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren