MSP Quarz schwingt nicht

Gast #634179
Lesenswert?

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
Gast #634229
Lesenswert?

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?
Gast #634334
Lesenswert?

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;
}
#634534
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren