ATXmega128a1 kein PLL mit 32MHz/16MHz Crystal Oszi möglich

Gast #2308824
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

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.