Forum: Mikrocontroller und Digitale Elektronik Atxmega128A4: PLL geht nur mit dem 2 MHz RC


von M. K. (sylaina)


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.

von Bastian W. (jackfrost)


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

: Bearbeitet durch User
von M. K. (sylaina)


Lesenswert?

Ja...also jetzt wo du es sagt...oh man, ich mach Feierabend...danke fürs 
Brett-vorm-Kopf-Einschlagen...klar, ich hatte ja den Oszilator gar nicht 
eingeschaltet...

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.