Der Thread-Titel beschreibt ziemlich genau mein Problem grade. Da ich
mit Atxmegas praktisch keine Erfahrung habe, erhoffe ich mir hier Rat.
Mein Code bisher:
1 | int main(void)
|
2 | {
|
3 | setUpAvr();
|
4 |
|
5 | for(;;){
|
6 | /* insert your main loop code here */
|
7 | // Pin toggeln um zu sehen ob der Atmega angelaufen ist
|
8 | // mit Oszi ueberprueft
|
9 | PORTB.OUTTGL = (1 << PIN1);
|
10 | }
|
11 | return 0; /* never reached */
|
12 | }
|
13 | void setUpAvr(void){
|
14 | /* insert your hardware initialization here */
|
15 | OSC.PLLCTRL = OSC_PLLSRC_RC32M_gc | 0x01;
|
16 | OSC.CTRL |= OSC_PLLEN_bm;
|
17 | while (!(OSC.STATUS & OSC_PLLRDY_bm));
|
18 | CCP = CCP_IOREG_gc;
|
19 | CLK.CTRL = CLK_SCLKSEL_PLL_gc;
|
20 |
|
21 | PORTB.DIR |= (1 << PIN1);
|
22 | }
|
Und genau der Code läuft nicht.
Ersetze ich
1 | OSC.PLLCTRL = OSC_PLLSRC_RC32M_gc | 0x01;
|
gegen
1 | OSC.PLLCTRL = OSC_PLLSRC_RC2M_gc | 0x10;
|
läuft obiger Code.
Intention ist, dass ich einen externen 14,7456 MHz Quarz am Atxmega habe
und diesen mittels PLL verdreifachen will. Auch das geht nicht. Dass der
Quarz aber ansich geht habe ich schon geprüft indem ich nicht die PLL
als Taktquelle wähle sondern nur den Quarz:
1 | void setUpAvr(void){
|
2 | /* insert your hardware initialization here */
|
3 | OSC_XOSCCTRL = OSC_XOSCSEL_XTAL_16KCLK_gc | OSC_FRQRANGE_12TO16_gc;
|
4 | OSC.CTRL |= OSC_XOSCEN_bm;
|
5 | while (!(OSC.STATUS & OSC_XOSCRDY_bm));
|
6 | CCP = CCP_IOREG_gc;
|
7 | CLK.CTRL = CLK_SCLKSEL_XOSC_gc;
|
8 |
|
9 | PORTB.DIR |= (1 << PIN1);
|
10 | }
|
Mit diesem Code läuft der Atxmega. Auch wenn ich so als Taktquelle den
32 MHz RC wähle läuft der Atxmega. Aber warum geht das mit der PLL nicht
bzw. warum geht das mit PLL nur mit dem 2 MHz RC? Ich hab da sicher noch
was falsch drin, nur was? Ich sehe es grade nicht wirklich, vielleicht
kann mir hier jemand helfen.