Forum: Mikrocontroller und Digitale Elektronik MSP Quarz schwingt nicht


von Kresley81 (Gast)


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

von Jörg S. (Gast)


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?

von Christian R. (supachris)


Lesenswert?

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

von Kresley81 (Gast)


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

von Frank (Gast)


Lesenswert?

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.

von David K. (kresley81)


Lesenswert?

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

von Arc N. (arc)


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

von David K. (kresley81)


Lesenswert?

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