Automatische Takt Kalibrierung ATXmega256A3B

Gast #1951769
Lesenswert?

Hallo Zusammen,

ich versuche die automatische Takt Kalibrierung eines ATXmega256A3(B) zu 
aktivieren, ohne Erfolg. Im Errata steht, dass man beide Oszillatoren 
und beide DFLL Aktivieren muss. Der Wert in CALA bleibt nach dem 
aktivieren aber unverändert, es wird nicht geregelt.

Habe die Aktivierung folgendermassen implementiert:
1
  CLKSYS_Enable(OSC_RC32MEN_bm);
2
  while (CLKSYS_IsReady(OSC_RC32MRDY_bm) == 0);
3
  CLKSYS_Enable(OSC_RC2MEN_bm);
4
  while (CLKSYS_IsReady(OSC_RC2MRDY_bm) == 0);
5
  CLKSYS_AutoCalibration_Enable(OSC_RC32MCREF_bm, 0);
6
  CLKSYS_AutoCalibration_Enable(OSC_RC2MCREF_bm, 0);

Hat jemand eine Idee, wieso sich die kalibrierung nicht aktivieren 
lässt?

Gruss
#1951996
Lesenswert?

>Im Errata steht, dass man beide Oszillatoren
>und beide DFLL Aktivieren muss. Der Wert in CALA bleibt nach dem
>aktivieren aber unverändert, es wird nicht geregelt.

Und worauf sollen die DFLLs regeln ? Also auf welche Taktreferenz regeln 
sie ein ?

Gruß Hagen

1
    // - 32MHz CLK_CPU, 64MHz CLK_PERx2, 128MHz CLK_PERx4
2
    // - 32MHz RC-Osc füttert PLL 
3
    // - 2MHz+32MHz Osc eingeschaltet
4
    // - 32KHz RTC Quartz eingeschaltet im Low Power Mode
5
    // - beide DFLLs eingeschaltet
6
    // externen 32KHz Quarz einschalten
7
    OSC.XOSCCTRL = OSC_XOSCSEL_32KHz_gc;// | OSC_X32KLPM_bm;
8
    // PLL Source = 32MHz interner RC-Osc / 4 * 16 = 128 MHz  
9
    OSC.PLLCTRL = OSC_PLLSRC_RC32M_gc | (16 << OSC_PLLFAC_gp);
10
    // CLK-Prescaler A/1 B/2 C/2 -> 128MHz -> 64MHz -> 32MHz
11
    CCP_Write(&CLK.PSCTRL, CLK_PSADIV_1_gc | CLK_PSBCDIV_2_2_gc);
12
    // 32MHz, 2MHz, ext. 32KHz RTC und PLL aktivieren
13
    OSC.CTRL = OSC_RC32MEN_bm | OSC_RC2MEN_bm | OSC_XOSCEN_bm | OSC_PLLEN_bm;
14
    while ((OSC.STATUS & (OSC_RC32MRDY_bm | OSC_RC2MRDY_bm | OSC_XOSCRDY_bm | OSC_PLLRDY_bm)) != (OSC_RC32MRDY_bm | OSC_RC2MRDY_bm | OSC_XOSCRDY_bm | OSC_PLLRDY_bm)) ;
15
    // PLL nun als Systemclock auswählen
16
    CCP_Write(&CLK.CTRL, CLK_SCLKSEL_PLL_gc);
17
    // DFLL Kalibration vom 2MHz und 32MHz RC-Osc mit externem 32KHz Uhrenquarz   
18
    OSC.DFLLCTRL = OSC_RC32MCREF_bm | OSC_RC2MCREF_bm;
19
    DFLLRC2M.CTRL = DFLL_ENABLE_bm;
20
    DFLLRC32M.CTRL = DFLL_ENABLE_bm;
21
    // nun CLK Einstellungen schützen
22
    CCP_Write(&CLK.LOCK, CLK_LOCK_bm);
#1952004
Lesenswert?

Übrigens, ein zB. externer 16MHz Quarz als Taktbasis ist weitaus 
stabiler als die DFLLs und ein externer 32kHz Uhrenquarz. Soweit meine 
Ergebnisse bei meinen Experimenten. Aus meiner Sicht lohnt es sich 
meistens also nicht gezielt mit den DFLLs zu arbeiten, es sei denn man 
hat nun schon einen externen 32KHz Quarz für andere Aufgaben und nutzt 
nebenbei noch die DFLLs.

Gruß Hagen
Gast #1952547
Lesenswert?

Hallo Hagen,

die DFFLs sollen auf den externen 32 kHz Quarz regeln. Dieser wird an 
einer anderen Stelle, beim aktivieren der RTC, eingeschaltet. Die 
Anforderung an den 32 MHz Takt sind nicht besonders gross ~0.5%. Ich 
werden deinen Code am Montag testen.

Gruss
Gast #1954992
Lesenswert?

habe es mit deinem Beispiel zum laufen gekriegt. Es reicht anscheinend 
nicht, wenn der externe 32k Oszillator über die RTC eingeschaltet wird, 
sondern muss für die Verwendung mit den DFFLs explizit eingeschaltet 
werden.

Gruss

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