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
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.
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
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.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.