Forum: Mikrocontroller und Digitale Elektronik XPlain Probleme mit Quarz


von Mats M. (elektrofreak)


Lesenswert?

Hallo,

ich verwende das AVR Xplain und möchte für hohe Datenraten über den UART 
den externen Quarz verwenden.

Ich hoffe ich habe es richtig gesehen, dass ein 8MHz Quarz verwendet 
wird. Den Code zur Initialisierung habe ich aus folgendem Thread:

Beitrag "Re: XMega Clksystem"

Nun habe ich den Code so erweitert, dass die LEDs leuchten und anzeigen, 
wann welcher Punkt erreicht wurde. Der Code ist folgender;

die CPU-Geschwindigkeit ist am Anfang des Programms mit 32MHz 
"vorgegeben" (für delay-Berechnungen)
1
#define F_CPU 32000000UL

Zunächst wird auf die interne 32MHz Clocksource gestellt:
1
  CLKSYS_Enable( OSC_RC32MEN_bm ); 
2
  CLKSYS_Prescalers_Config( CLK_PSADIV_1_gc, CLK_PSBCDIV_1_1_gc );
3
  do {} while ( CLKSYS_IsReady( OSC_RC32MRDY_bm ) == 0 );
4
  CLKSYS_Main_ClockSource_Select( CLK_SCLKSEL_RC32M_gc );

die CPU-Clock-Source soll danach auf PPL gestellt werden. Diese 
verwendet als Quelle die externen 8MHz des Quarz und derTakt wird mit 
dem Faktor 4 Multipliziert. Somit landet man bei den gewünschten 32MHz. 
Der Code dafür ist folgender:
1
 LEDPORT.OUT = 0b11111111;
2
  // Oszillator XOSC konfigurieren (2..9MHz, 256 clocks startup time)
3
  CLKSYS_XOSC_Config( OSC_FRQRANGE_2TO9_gc,
4
                      false,
5
                      OSC_XOSCSEL_XTAL_256CLK_gc );
6
  LEDPORT.OUT = 0b11111110;
7
  // Oszillator XOSC enable
8
  CLKSYS_Enable( OSC_XOSCEN_bm );
9
  LEDPORT.OUT = 0b11111100;
10
11
  // Warten bis der Oszillator bereit ist
12
  do {} while ( CLKSYS_IsReady( OSC_XOSCRDY_bm ) == 0 );
13
  LEDPORT.OUT = 0b11111000;
14
15
  // PLL source ist XOSC, Multiplikator x4
16
  CLKSYS_PLL_Config( OSC_PLLSRC_XOSC_gc, 4 );
17
  LEDPORT.OUT = 0b11110000;
18
  
19
  // Enable PLL
20
  CLKSYS_Enable( OSC_PLLEN_bm );
21
  LEDPORT.OUT = 0b11100000;
22
23
  // Prescalers konfigurieren
24
  CLKSYS_Prescalers_Config( CLK_PSADIV_1_gc, CLK_PSBCDIV_1_1_gc );
25
  LEDPORT.OUT = 0b11000000;
26
27
  // Warten bis PLL locked
28
  do {} while ( CLKSYS_IsReady( OSC_PLLRDY_bm ) == 0 );
29
  LEDPORT.OUT = 0b10000000;
30
  
31
  // Main Clock Source ist Ausgang von PLL
32
  CLKSYS_Main_ClockSource_Select( CLK_SCLKSEL_PLL_gc );
33
  LEDPORT.OUT = 0b00000000;
34
  // Nun ist der System Clock 32MHz !
35
36
  _delay_ms(200);
37
   LEDPORT.OUT = 0b11111111;
38
  _delay_ms(200);

Was auffällt ist, dass beim Schritt 2 (warten auf das Okay vom 
Quarz-erzeugten Takt) die LEDs häufig einige ms bis manchmal hin zu 
einer knappen Sekunde "stehen" bleiben. Nachdem die Clock Source 
umgestellt wurde passiert fast gar nix mehr. Das togglen der LEDs zum 
Schluss passiert meistens erst nach sehr vielen Sekunden.

Meine Vermutung ist, dass der Quarz nicht richtig anschwingt aber ich 
kann mir auch vorstellen, dass der Quarz bei der Produktion getestet 
wurde. Könnt Ihr einen Fehler im Code feststellen? Habe ich irgendwas 
vergessen?

Nachtrag:
Ich habe leider kein Kältespray aber ich kann folgendes Verhalten 
feststellen:
Mit einem Fön erwärmt beginnen bei nachfolgendem Code die LEDs immer 
schneller zu togglen umso wärmer der Quarz ist. Bei hohen Temperaturen 
ist die Frequenz relativ hoch (ca. 10-20Hz). Nach dem Abkühlen mit Eis 
togglen die LEDs nur noch alle paar Sekunden oder gar nicht mehr.
1
  while (1)
2
  {  
3
   LEDPORT.OUTTGL = 0b11111111;
4
  }

Mit freundlichen Grüßen
Elektrofreak

von Mats M. (elektrofreak)


Lesenswert?

Kann zumindest mal jemand über den Code schauen, ob es grobe Schnitzer 
gibt? Sonst bleibt ja nur der Quarz :)

von Mats M. (elektrofreak)


Lesenswert?

Für alle, die das selbe Problemn haben:

Wenn man sich den Schaltplan genau ansieht, dann stellt man fest, dass 
der 8MHz Quarz am 90USB1287 angeschlossen ist. An zwei Pads sind die 
Taktsignale des XMega herausgeführt aber es ist kein Quarz 
angeschlossen.

Das Thema ist somit abgehakt ;-)

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.