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.