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