Atxmega128A4: PLL geht nur mit dem 2 MHz RC

OP #5299638
Lesenswert?

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.
#5299680
Lesenswert?

Hi,

du hast den 32 MHz Osc. nicht aktiviert. Den musst du erst aktivieren 
wenn dann mit der PLL was machen willst.

Das nutze ich bei einem Atxmega32e5 für dein 32 MHz Osc mit der PLL
1
void Clock_Init(void)
2
{
3
  //Interner 2MHz Oszi
4
  OSC.XOSCCTRL =  OSC_X32KLPM_bm | OSC_XOSCSEL1_bm;  // 32 kHz Quarz settings.
5
  OSC.CTRL = OSC_RC32MEN_bm  | OSC_XOSCEN_bm;
6
  // Warten bis Oszillator stabil ist
7
  while ((OSC.STATUS & OSC_RC32MEN_bm) == 0);
8
  //while ((OSC.STATUS & OSC_XOSCEN_bm) == 0);
9
  
10
  // I/O Protection
11
  CCP = CCP_IOREG_gc;
12
  // Prescaler
13
  CLK.PSCTRL = CLK_Prescaler;
14
  // PLL Sorce und PLL Faktor
15
  OSC.PLLCTRL = OSC_PLLSRC_RC32M_gc | (PLL_Faktor << OSC_PLLFAC_gp);
16
  // PLL enable
17
  OSC.CTRL = OSC_PLLEN_bm ;
18
  while ((OSC.STATUS & OSC_PLLRDY_bm) == 0);
19
  // I/O Protection
20
  CCP = CCP_IOREG_gc;
21
  //System Clock selection
22
  CLK.CTRL = CLK_SCLKSEL_PLL_gc;
23
  // DFLL ein (Auto Kalibrierung)
24
  //DFLLRC32M.CTRL = DFLL_ENABLE_bm;
25
  
26
}

Gruß JackFrost

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren