Forum: Mikrocontroller und Digitale Elektronik Automatische Takt Kalibrierung ATXmega256A3B


von ---- (Gast)


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

von Hagen R. (hagen)


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);

von Hagen R. (hagen)


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

von ---- (Gast)


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

von ---- (Gast)


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

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.