Forum: Mikrocontroller und Digitale Elektronik ATxMega Externer Quarz


von McDonald J. (mcdonald_j)


Lesenswert?

Hallo

Ich weiss dieses Thema wurde schon 1000 mal abgehandelt, aber mit den 
anderen Forenbeiträgen klappts trotzdem nicht.

Ich verwende einen ATxMega128A3U und ein 8MHz Quarz. Folgender Code als 
Clock Initialisierung:
1
  // Clock init
2
  OSC.XOSCCTRL = OSC_FRQRANGE_2TO9_gc | OSC_XOSCSEL_XTAL_16KCLK_gc;    // Freq Range = 2MHz-9MHz, Startup Time = 16kCLK
3
  OSC.CTRL |= OSC_XOSCEN_bm;
4
5
  while(!(OSC.STATUS & OSC_XOSCRDY_bm));                // Wait for Oscillators to become stable 
6
7
  OSC.PLLCTRL = OSC_PLLSRC_XOSC_gc | 3;
8
  OSC.CTRL |= OSC_PLLEN_bm;                        // PLL = 3
9
  while (!(OSC.STATUS & OSC_PLLRDY_bm));                // Wait for PLL to become stable
10
  
11
  CCP = CCP_IOREG_gc;
12
  CLK.CTRL = CLK_SCLKSEL_PLL_gc;                    // Use PLL as system Clock
13
  
14
  OSC.CTRL &= ~(OSC_RC2MEN_bm | OSC_RC32MEN_bm | OSC_RC32KEN_bm);    //Disable unused oscillators
15
  
16
17
  CCP = CCP_IOREG_gc;
18
  CLK.LOCK = CLK_LOCK_bm;                        // Lock Clock Settings until next Reset

Irgend etwas klappt da jedoch nicht. Mit dem KO gemessen, schwingt der 
Quarz mit 8MHz und ca 1.5Vpp. Der Systemclock ist jedoch nach wie vor 
2MHz.

Sieht jemand einen Fehler im Code oder hab ich etwas grundlegendes 
vergessen?

Lg
Jérôme

von Werner (Gast)


Lesenswert?

Hier der Code, den ich verwende. Die PLL ist allerdings auf Faktor 2 
eingestellt:

void clk_init(void)
{
  OSC.XOSCCTRL = 0xDB;  // oscillator setting
  OSC.CTRL = 0x08;    // ext Clock enable
  OSC.PLLCTRL = 0xC2;    // PLL ext. Clock 2x
  while((OSC.STATUS & 0x08) != 0x08);   //warten bis  OSC ready
  OSC.CTRL = 0x18;    // PLL + ext. Clock enable
  while((OSC.STATUS & 0x10) != 0x10);   //warten bis  PLL ready
  CCP = 0xD8;        // protection freigabe
  CLK.CTRL = 0x04;    //ext.Clock
}

Probiers mal damit.

Werner

von McDonald J. (mcdonald_j)


Lesenswert?

Hab ich ausprobiert, die Quarz Spannung geht auf ca. 3Vpp (Kommt vom 
gesetzten XOSCPWR im XOSCCTRL) aber sonst ändert sich leider nichts.

von McDonald J. (mcdonald_j)


Lesenswert?

Ok habs gefunden. Scheinbar funktionierte mit dem Code Teil:
1
  // PLL als Systemclock waehlen
2
  CCP = CCP_IOREG_gc;              //Der C-Code der obigen Assebly Snippets
3
  CLK.CTRL = CLK_SCLKSEL_PLL_gc;

etwas nicht. Mit Dem folgenden Code funktionierts.
1
  // Clock init
2
  OSC.XOSCCTRL = OSC_FRQRANGE_2TO9_gc | OSC_XOSCSEL_XTAL_16KCLK_gc;    // Freq Range = 2MHz-9MHz, Startup Time = 16kCLK
3
  OSC.CTRL |= OSC_XOSCEN_bm;
4
5
  while(!(OSC.STATUS & OSC_XOSCRDY_bm));                // Wait for Oscillators to become stable 
6
7
  OSC.PLLCTRL = OSC_PLLSRC_XOSC_gc | 0x09;
8
  OSC.CTRL |= OSC_PLLEN_bm;                        // PLL = 3
9
  while (!(OSC.STATUS & OSC_PLLRDY_bm));                // Wait for PLL to become stable
10
  
11
                                    // PLL als Systemclock waehlen
12
  __asm__("LDI r24,0xD8");                      //Assembly Snippets, damit keine Codeoptimierung notwendig ist
13
  __asm__("OUT 0x34,r24");
14
  __asm__("LDI r24,0x04");
15
  __asm__("STS 0x0040,r24");
16
  
17
  OSC.CTRL &= ~(OSC_RC2MEN_bm | OSC_RC32MEN_bm | OSC_RC32KEN_bm);    //Disable unused oscillators
18
  
19
20
  CCP = CCP_IOREG_gc;
21
  CLK.LOCK = CLK_LOCK_bm;                        // Lock Clock Settings until next Reset

Möglicherweise hat AtmelStudio den Code falsch optimiert.

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.