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
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
> 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
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