Hallo Hie im Forum stehen ja schon einige Beiträge zum Thema Mikrokontrollerquarz leider habe ich die Lösung für mein Problem da nicht gefunden: Ich betrieb einen MSP430F2121 bis jetzt mit dem internen Oszillator. Jetzt habe ich neu einen Quarz angeschlossen. Dieser verursacht aber Probleme. Ich habe ihn wie im Datenblatt beschrieben angeschlosen und zwei Kondensatoren auf Masse geschaltet. Wenn ich den Mainclock auf einen Pin leite, kann ich dort auch die 8MHz sehen. Allerdings bricht nach einigen Millisekunden der Takt zusammen und der DCO übernimmt dieser das Kommando. Ich habe bereits verschiedene Kondensatoren ausprobiert: 8pF, 12pF, und 20pF und 30pF. Im quarzdatenblat steht folgende Zeile: Load Capacitance: Series, 16pF, 20pF, 30pF Den Quarz habe ich nach dem TI-Turorial initialisiert: BCSCTL1 |= XTS; // ACLK = LFXT1 = HF XTAL BCSCTL3 |= LFXT1S_2; // 3-16 MHz range P2DIR |= 0x01; // P2.0 = output direction P2SEL |= 0x01; // P2.0 = ACLK function do { IFG1 &= ~OFIFG; // Clear OSCFault flag for (i = 0xFF; i > 0; i--); // Time for flag to set } while ((IFG1 & OFIFG)); // OSCFault flag still set? BCSCTL2 |= SELM_3+SELS; // MCLK+SMCLS = LFXT1 (safe) Hat jemand Erfahrung mit dem Quarz am MSP430F2121? Viele Grüsse Kresley
In der Zeile BCSCTL3 |= LFXT1S_2; löscht du die XCAP Bits nicht (sind Standard auf 01). Also lieber: BCSCTL3 = LFXT1S_2; Dann sind die auch auf 0 gesetzt. Darf man fragen warum die nicht einfach die Voreingestellten 8MHz vom DCO benutzt?
Was passiert denn in der main() Schleife? Schickst du den MSP430 eventuell schlafen? Dann wird der Quarz-Oszi und je nach eingestelltem LPM der Takt deaktiviert. Poste doch mal das gesamte Programm...
Danke für die Antworten und die beiden guten Ideen. Leider lag es aber
nicht daran.
Mein MSP wird für Temperaturmessungen im Bereich -40 bis 85 Grad Celsius
verwendet und ich bin auf einen möglichst tempberaturstabilen Clock
angewiesen. Der DCO weist Frequenzunterschiede auf, die nicht so
tragisch wären, wenn sie linear wären. Leider sind sie äuserst unlinear,
weshalb ich es jetzt mit dem Quarz versuche.
Die Cap-Bits habe ich jetzt gelöscht, aber es hat leider keine
Verbesserung gebracht.
Die Lowpowermodes verwende ich nicht.
Hier ist der komplette Initialisierungsteil meines Programmcodes. Der
Watchdog wird schon vorher deaktiviert. Der restliche Programmcode ist
riesig und es wird nicht mehr viel in den Registern manipuliert sondern
nur noch Ports eingelesen und beschrieben.
-----------------------------------------------------------
void initMSP(void)
{
volatile unsigned int i;
// initGlobalVarables();
sensorState = i2c;
i2cMainState = stopped;
//HFXTAL
BCSCTL1 |= XTS; // ACLK = LFXT1 = HF XTAL
BCSCTL3 = LFXT1S_2; // 3-16 MHz range
P2DIR |= 0x01; // P2.0 = output direction
P2SEL |= 0x01; // P2.0 = ACLK function
do
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (i = 0xFF; i > 0; i--); // Time for flag to set
}
while ((IFG1 & OFIFG)); // OSCFault flag still set?
BCSCTL2 |= SELM_3+SELS; // MCLK+SMCLS = LFXT1
(safe)
// initPorts();
//Port1
P1DIR = 0x13; // P1.0,1,1 OUTPUT; P1.2 SCL; P1.3 SDA INPUT
P1SEL = 0x10; // P1.4 SMCLK
P1IE = SCL; // SDA, SCL Interrupt active
P1IES = 0x0c; // SDA,SCL falling edge
P1IFG = 0x00; // Clear all flags
P1OUT = 0x00; // Clear output
//Port2
P2DIR = 0x61;
P2SEL = 0x19; //P2.3,4 CA INPUT
P2IE = 0x00;
P2IES = 0x00;
P2IFG = 0x00;
P2OUT = 0x00;
//initAComp();
CACTL1 = CARSEL+ CAREF_2+ CAON; // Reference to inverting
input, Refererence 0.5Vcc, enable comparator, enable
comparatorinterrupts
CACTL2 = P2CA0+ CAF; // Temperature: Connect CA0 , CA1
remains unrouted, RC-filter on
P1OUT &= ~0x03; // disable ports 2.0, 2.1
while(CACTL2&CAOUT); // Wait till Capacitors are
discharged
//initTimers(void)
TACTL = TASSEL_2 + MC_2 + TACLR; // Timer A: Clock with
SMCLK, continuous Mode (0..0x0ffff), reset timer, enable timer interrupt
TACCTL1 = CM_1 + CCIS_1 + CAP; // Capture & Compare module
1: capture on rising triggeredge, triggersource is CCI1B (aComp output),
working in capture mode
//initInterrupts();
P1IE = SDA + SCL; // SDA, SCL Interrupt active
P1IES = 0x08; // SDA falling edge, SCL rising edge
P1IFG = 0x00; // Clear all flags
_EINT(); // Global interrupt enable
return;
}
Ein normaler Quarz hat auch einen nichtlinearen Temperaturgang. Wenn es wirklich genau sein soll oder muss, kannst ja mal nach TCXO oder gar OCXO suchen. TCXO gibts schon recht günstig.
Ja, ein Quarz ist auch nicht perfekt, aber der Kostendruck ist so hoch, dass nichts anderes in Frage kommt. Es war schon schwierig, den Auftraggeber davon zu überzeugen, dass ein Quarz in Betracht gezogen werden muss :-(
BCSCTL1 |= XTS; // ACLK = LFXT1 = HF XTAL
// Hier fehlt u.U. XT2OFF, da der 2121 keinen hat. Ob's stört, keine
Ahnung.
BCSCTL3 |= LFXT1S_2; // 3-16 MHz range
P2DIR |= 0x01; // P2.0 = output direction
P2SEL |= 0x01; // P2.0 = ACLK function
// Hier fehlt die Auswahl für P26 und P2.7 (XIN/XOUT)
do {
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (i = 0xFF; i > 0; i--); // Time for flag to set
} while ((IFG1 & OFIFG)); // OSCFault flag still set?
// Was passiert in der Schleife mit dem LFXT1OF-Flag aus BCSCTL3?
BCSCTL2 |= SELM_3+SELS; // MCLK+SMCLS = LFXT1
ok, ich habs: In dieser Zeile wurde der Quarzport blokiert P2DIR = 0x61; Das Bit 0x40 darf nicht gesetzt sein. Mit P2DIR = 0x21; hats dann funktioniert. danke für die antworten.
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.