Forum: Mikrocontroller und Digitale Elektronik ATXmega128a1 kein PLL mit 32MHz/16MHz Crystal Oszi möglich


von spovi1 (Gast)


Lesenswert?

Hallo,
ich möchte bei meinem ATXmega128a1 den Systemclock einstellen. Bis jetzt 
habe ich alle zum laufen bekommen. Die PLL bereitet jedoch ein paar 
schwierigkeiten.

PLL mit 2MHz internem Referenztakt funktioniert. (mögliche PLL Faktor: 
2...22)
1
#define PLL_Faktor (1,2,3,....)
2
int CLK_Prescaler = (0x00,.....)
3
4
  OSC.CTRL = OSC_RC2MEN_bm;
5
  // Warten bis Oszillator stabil ist
6
  while ((OSC.STATUS & OSC_RC2MRDY_bm) == 0);
7
  // I/O Protection
8
  CCP = CCP_IOREG_gc;
9
  // Prescaler
10
  CLK.PSCTRL = CLK_Prescaler;
11
  nop();    
12
  // PLL Sorce und PLL Faktor
13
  OSC.PLLCTRL = OSC_PLLSRC_RC2M_gc | (PLL_Faktor << OSC_PLLFAC_gp);
14
  // PLL enable
15
  OSC.CTRL = OSC_PLLEN_bm ;
16
  while ((OSC.STATUS & OSC_PLLRDY_bm) == 0);
17
  // I/O Protection
18
  CCP = CCP_IOREG_gc;
19
  // System Clock selection
20
  CLK.CTRL = CLK_SCLKSEL_PLL_gc;
21
  // DFLL ein (Auto Kalibrierung)
22
  DFLLRC2M.CTRL = DFLL_ENABLE_bm;

PLL mit dem internen 32MHz Oszi
1
  OSC.CTRL = OSC_RC32MEN_bm;
2
  // Warten bis Oszillator stabil ist
3
  while ((OSC.STATUS & OSC_RC32MRDY_bm) == 0);
4
        // I/O Protection
5
  CCP = CCP_IOREG_gc;
6
  // Prescaler
7
  CLK.PSCTRL = CLK_Prescaler;
8
  nop();    
9
  // PLL Sorce und PLL Faktor
10
  OSC.PLLCTRL = OSC_PLLSRC_RC32M_gc | (PLL_Faktor << OSC_PLLFAC_gp);
11
  // PLL enable
12
  OSC.CTRL = OSC_PLLEN_bm ;
13
  while ((OSC.STATUS & OSC_PLLRDY_bm) == 0);
14
  // I/O Protection
15
  CCP = CCP_IOREG_gc;
16
  // System Clock selection
17
  CLK.CTRL = CLK_SCLKSEL_PLL_gc;
18
  // DFLL ein (Auto Kalibrierung)
19
  DFLLRC32M.CTRL = DFLL_ENABLE_bm;

und dem externen 16MHz Quarz funktionieren nicht.
1
  // Crystaloszillator (16MHz) auswählen
2
  OSC.XOSCCTRL = 0xCB;
3
  OSC.CTRL = OSC_XOSCEN_bm;
4
  // Warten bis Oszillator stabil ist
5
  while ((OSC.STATUS & OSC_XOSCRDY_bm) == 0);
6
  // I/O Protection
7
  CCP = CCP_IOREG_gc;
8
  // Prescaler
9
  CLK.PSCTRL = CLK_Prescaler;
10
  nop();    
11
  // PLL Sorce und PLL Faktor
12
  OSC.PLLCTRL = OSC_PLLSRC_XOSC_gc | (PLL_Faktor << OSC_PLLFAC_gp);
13
  // PLL enable
14
  OSC.CTRL = OSC_PLLEN_bm ;
15
  while ((OSC.STATUS & OSC_PLLRDY_bm) == 0);
16
  // I/O Protection
17
  CCP = CCP_IOREG_gc;
18
  // System Clock selection
19
  CLK.CTRL = CLK_SCLKSEL_PLL_gc;

Die einzelnen Oszi/Quarz kann ich wie gesagt ohne Probleme als CPU Takt 
einstellen, auch beide 32,768kHz, sowie Prescaler.
Zum Test lass ich immer nen Zähler hochzählen und aller 1s nen Interrupt 
generieren (LED Toggle).

Hat jmd eine Idee, warum die PLL für die letzten beiden Fälle nicht 
funktioniert?
Optimierungseinstellungen im AVR Studio sind schon alle ausprobiert 
wurden. Ist es möglich dass die PLL defekt ist, da ich zb mit dem 2MHz 
Taktgeber nur PLL Faktoren bis 22 fahren kann (theoretisch müsste er ja 
aber bis min 24 ( = 48MHz) gehen.

????
Danke

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.