Forum: Mikrocontroller und Digitale Elektronik LFXT1 32,768kHz am MSP430F54x -> 33,059kHz


von Martin (Gast)


Lesenswert?

Hallo,

ich verwende folgenden Quelltext um meinen Uhrenquarz am XT1 zu 
betreiben:
Quelle: Codebeispiele von TI msp430x54x_UCS_4.c

1
  P1DIR |= BIT0;                            // P1.0 output
2
  P11DIR |= 0x07;                           // ACLK, MCLK, SMCLK set out to pins
3
  P11SEL |= 0x07;                           // P11.0,1,2 for debugging purposes.
4
5
  // Initialize LFXT1
6
  P7SEL |= 0x03;                            // Select XT1
7
  UCSCTL6 &= ~(XT1OFF);                     // XT1 On
8
  UCSCTL6 |= XCAP_3;                        // Internal load cap
9
10
  // Loop until XT1 fault flag is cleared
11
  do
12
  {
13
    UCSCTL7 &= ~XT1LFOFFG;                  // Clear XT1 fault flags
14
  }while (UCSCTL7&XT1LFOFFG);               // Test XT1 fault flag
15
16
  // Initialize DCO to 2.45MHz
17
  __bis_SR_register(SCG0);                  // Disable the FLL control loop
18
  UCSCTL0 = 0x0000;                         // Set lowest possible DCOx, MODx
19
  UCSCTL1 = DCORSEL_3;                      // Set RSELx for DCO = 4.9 MHz
20
  UCSCTL2 = FLLD_1 + 74;                    // Set DCO Multiplier for 2.45MHz
21
                                            // (N + 1) * FLLRef = Fdco
22
                                            // (74 + 1) * 32768 = 2.45MHz
23
                                            // Set FLL Div = fDCOCLK/2
24
  __bic_SR_register(SCG0);                  // Enable the FLL control loop
25
26
  // Worst-case settling time for the DCO when the DCO range bits have been
27
  // changed is n x 32 x 32 x f_MCLK / f_FLL_reference. See UCS chapter in 5xx
28
  // UG for optimization.
29
  // 32 x 32 x 2.45 MHz / 32,768 Hz = 76563 = MCLK cycles for DCO to settle
30
  __delay_cycles(76563);
31
32
  // Loop until XT1,XT2 & DCO fault flag is cleared
33
  do
34
  {
35
    UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG);
36
                                            // Clear XT2,XT1,DCO fault flags
37
    SFRIFG1 &= ~OFIFG;                      // Clear fault flags
38
  }while (SFRIFG1&OFIFG);                   // Test oscillator fault flag


Wenn das Programm gestartet wird, steht die Frequenz fest auf 32,768kHz.
Sobald ich ganz kurz mit dem Finger über die Quarzanschlüsse streife, 
oder mit dem Tastkopf berühre, ändert sich die Frequenz auf 33,06kHz und 
verbleibt dort, bis ich das Programm neu starte. Klar könnte man jetzt 
sagen: "Dann fass halt dort nicht hin..." aber ich bin der Meinung, dass 
die Frequenz eigentlich wieder auf ihren normalen Wert zurückgehen 
sollte.
Der verwendete Quarz ist dieser hier:
http://docs-europe.origin.electrocomponents.com/webdocs/0d2c/0900766b80d2cbae.pdf

Ich greife die Frequenz per Oszi+Frequenzzähler am ACLK ab.
Der Quarz ist ca. 3mm vom Controller entfernt, die Leiterbahnen sind 
vollständig von Flussmittelresten gereingt. Drumherum ist Massefläche.


Ich verwende keine Serienwiderstände bzw. keinen Parallelwiderstand zum 
Quarz. Die internen Kapazitäten sind mit 12pF aktiviert. Ich habe aber 
bereits alle Kombinationen mit 1MOhm bzw. 47k-Serienwiderständen und 
externen Kapazitäten (interne dann deaktiviert) getestet, was aber zum 
gleichen Ergebnis führt.

Der DCO läuft erstmal auf 2,45MHz, ändert sich im Fehlerfall aber auf 
2,479Mhz. d.h. der interne Abgleich per FLL funktioniert...

Einenn anderen Typ Quarz habe ich auch schon eingesetzt, mit exakt dem 
gleichem Ergebnis.
Wer kann mir einen Tipp geben, wonach ich noch schauen sollte?


Martin

von Jörg S. (joerg-s)


Lesenswert?

>Ich greife die Frequenz per Oszi+Frequenzzähler am ACLK ab.
Also der gepufferte Ausgang am MSP und nicht direkt am Quarz?

von Erik (Gast)


Lesenswert?

also ich würde
wenn der quarz ein Metallgehäuse hat ,das gehäuse mit AVss 
(Masse)verbinden

gibt es bei dem Chip sowas wie ein Fehlerflag (LFOF / XT1OF ..)?
ändern die sich beim berühren ?
richtigen Bereich (XTS_FLL) eingestellt ?

mfg Erik

von Martin (Gast)


Lesenswert?

> Also der gepufferte Ausgang am MSP und nicht direkt am Quarz?
Ja.

>wenn der quarz ein Metallgehäuse hat ,das gehäuse mit AVss (Masse)verbinden
Der Chip hat ein Metallgehäuse,welches auf einer potentialfreien 
Kupferfläche aufgelötet ist, so wie es der Footprint des Hersteller 
angibt.
Da ich schon an dem Quarz gezweifelt habe, habe ich auch schon ein 
einfaches SMD-Chip-Uhrenquarz eingesetzt und exakt das gleiche Verhalten 
bekommen. Ich gehe davon aus, das es sich nicht um ein Problem mit dem 
Quarz handelt, sondern eher die Einstellung des MSP betrifft.

> richtigen Bereich (XTS_FLL) eingestellt ?
Ja, außer TI hat fehlerhafte Codebeispiele..... Nachdem ich mit meiner 
Initialisierung die gleichen Probleme hattte habe ich das TI-Beispiel 
1:1 übernommen.

>gibt es bei dem Chip sowas wie ein Fehlerflag (LFOF / XT1OF ..)?
Ja gibt es. XT1 fault flag: "XT1LFOFFG".
Ich verstehe es so, dass laut Datenblatt das fault-flag sicher gesetzt 
wird, wenn die Frequenz unter 10Hz liegt. Sobald die Frequenz auf einen 
Wert unter  10000Hz absinkt, kann das Flag gesetzt werden.
Demnach wird eine Änderung von 32 auf 33kHz das fault flag eher nicht 
setzen.
http://focus.ti.com/lit/ds/symlink/msp430f5438.pdf  Seite 46


Martin

von Martin (Gast)


Lesenswert?

Die Lösung des Problems steht hier auf Seite 97:
http://focus.ti.com/lit/ug/slau208g/slau208g.pdf
>When using XT1 operation in LF mode as the reference source into the FLL
>(SELREF = {0}), a crystalfault automatically causes the FLL reference
> source, FLLREFCLK, to be sourced by the REFO. XT1LFOFFG is set.


Es gibt einen internen Oszillator mit ca. 32,768 kHz, genauergesagt bei 
mir 33,059kHz.
Dieser wird aktiviert, wenn es zu einer Störung am Quarz kommt. 
Zeitgleich wird das fault-flag gesetzt. (Danke an Erik für den Tipp)

Ich überwache jetzt das fault flag und starte den Quarz einfach wieder 
neu, wenn es zu einem Ausfall kommt.

Martin

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
Noch kein Account? Hier anmelden.