Forum: Mikrocontroller und Digitale Elektronik xmega interner 32 MhZ Takt geht nicht


von soso (Gast)


Lesenswert?

Hallo,

ich habe ein Problem und zwar möchte ich den internen Takt von 32MhZ 
eines xmegas benutzen.

Hierzu nutze ich folgende Initialisierungsrutine
1
  CCP = 0xD8;
2
  OSC.CTRL = OSC_RC32MEN_bm;                  // Enable internal 32 Mhz Ring Oszilator
3
                                //(Kalibriert 1% Abweichung bei 25° und 3 V)
4
5
6
  while((!(OSC.STATUS & OSC_RC32MRDY_bm)) == OSC_RC32MRDY_bm){};  // Warten, bis der Takt steht
7
8
  // Nun noch die Clock als Systemclock waehlen
9
  CCP = 0xD8;                          // Protected Register durefen beschrieben werden
10
  CLK.CTRL  = CLK_SCLKSEL_RC32M_gc;              // Takt auswaehlen (Intern 32Mhz) (Prescaler brauchen wir nicht)
11
  CCP = 0xD8;                          // Protected Register durefen beschrieben werden
12
  CLK.LOCK   =  0x01;                    // Lock auf das Clock register setzen


Wenn ich mit meine JTAG ICE Debugge und durch den Code steppe, sehe ich 
wie alles gesetzt wird.

Drücke ich auf Run und dann irgendwann auf Pause ist das CLK.CTRL 
Register wider auf den internen 2 mhz Takt gesetzt. WARUM ??

Wieso geht das nicht??

Ich habe sogar einen LOCK gesetzt.

Ich verwende im laufenden noch einen Timer und einen Watchdog

Compileroptimirungsstufe Os (Ich habs Disasemblieren lassen Zwischen 
Setzen des CCP und dem Setzen des Registers vergehen exakt 2 Takte also 
absolut im Ramen.)


Danke und Gruß

von Helmut R. (heru01)


Lesenswert?

Hallo soso,

das Problem hatte ich auch.
Benutz (und entrümpel) die Fkt. von Atmel,

bei mir hat funktioniert:
1
CLKSYS_Enable( OSC_RC32MEN_bm );  
2
CLKSYS_Prescalers_Config( CLK_PSADIV_1_gc, CLK_PSBCDIV_1_1_gc );
3
do {} while ( CLKSYS_IsReady( OSC_RC32MRDY_bm ) == 0 );
4
CLKSYS_Main_ClockSource_Select( CLK_SCLKSEL_RC32M_gc );  
5
CLKSYS_Disable( OSC_RC2MEN_bm );

Interessanterweise musste ich den 2 Mhz disablen und dann hats 
funktioniert.
Test mit Wechsel Clk_ext und Clk_int + Timer ISR und Kältespray. (der 
interne Osc. läuft mit max. +/-1,5% schnell bei T_Wechseln weg)

Freue mich über Rückmeldung wenns bei Dir auch geht.

Gruß
Helmut

von Simon K. (simon) Benutzerseite


Lesenswert?

Komisch. Ich habe das eigentlich genau so wie der TO und bei mir klappt 
das auf einem xMega128A1 und xMega32A4
1
  /* Enable necessary Clock sources. 32MHz and 32kHz Oscillator */
2
  OSC.CTRL = OSC_RC32MEN_bm;
3
  /* Wait for Oscillators to become stable */
4
  while(!(OSC.STATUS & OSC_RC32MRDY_bm));
5
6
  /* Start Calibrating the 32MHz Clock using
7
   * the internal calibrated 32kHz Oscillator */
8
  OSC.DFLLCTRL = (0 << OSC_RC32MCREF_bp);
9
  DFLLRC32M.CTRL = DFLL_ENABLE_bm;
10
  /* Set as System Main Clock */
11
  CCP = CCP_IOREG_gc;
12
  CLK.CTRL = CLK_SCLKSEL_RC32M_gc;
13
14
  /* Lock Clock Settings until next Reset */
15
  CCP = CCP_IOREG_gc;
16
  CLK.LOCK = CLK_LOCK_bm;

Welchen Chip benutzt du? Evtl mal ins Erratasheet geguckt? Vielleicht 
gibt es Probleme wegen dem Debugging?

von Helmut R. (heru01)


Lesenswert?

Hallo Simon,

siehe Thread
Beitrag "XMega Clksystem"
da hatte ich das leidige Thema schon... :-)
Ich setzte den XMega128A1 Rev. H ein und da gabs das Phänomen, dass der 
Chip nur wie gewünscht lief wenn ich die unbenutzen Osc. lahmlege.
Ich habe das an Atmel weitergeleitet, aber da kam keine Antwort darauf.

Welche Rev. des 128A1 hast Du denn?

Gruß Helmut

von Simon K. (simon) Benutzerseite


Lesenswert?

Helmut Ru schrieb:
> Hallo Simon,
>
> siehe Thread
> Beitrag "XMega Clksystem"
> da hatte ich das leidige Thema schon... :-)
Ich bin nicht so der Freund von den Atmel Funktionen. ;)
Komisch, das Problem hatte ich nie in der Form. Der 2MHz Oszillator ist 
doch standardmäßig gar nicht an, oder irre ich?

> Ich setzte den XMega128A1 Rev. H ein und da gabs das Phänomen, dass der
> Chip nur wie gewünscht lief wenn ich die unbenutzen Osc. lahmlege.
> Ich habe das an Atmel weitergeleitet, aber da kam keine Antwort darauf.
>
> Welche Rev. des 128A1 hast Du denn?

Auch Rev H, soweit ich mich erinnere.

von Allegron S. (allegron)


Lesenswert?

Hallo Leute,

es passt vielleicht nicht ganz hierhin, aber habt ihr schonmal die 
autocalibration mit dem externen 32kHz quartz gemacht? Beim xmega128A1.

Benutze die Protoypfunktion von atmel, aber er spuckt mir jedesmal einen 
error bei numeric constant. Ich nehm mal an das hat was mit bool zu tun. 
Nur weiß ich grad nicht was ich da setzen soll. Bei true, 1 , und 
OSC_RC32KEN_bm das gleiche.


void CLKSYS_AutoCalibration_Enable( uint8_t OSC_RC32MCREF_bm, bool 
OSC_RC32KEN_bm ){

  OSC.DFLLCTRL = ( OSC.DFLLCTRL & ~OSC_RC32MCREF_bm ) |
                 ( OSC_RC32KEN_bm ? OSC_RC32MCREF_bm : 0 );

if (OSC_RC32MCREF_bm == OSC_RC2MCREF_bm) {
    DFLLRC2M.CTRL |= DFLL_ENABLE_bm;
  } else if (OSC_RC32MCREF_bm == OSC_RC32MCREF_bm) {
    DFLLRC32M.CTRL |= DFLL_ENABLE_bm;
  }
}

von Simon K. (simon) Benutzerseite


Lesenswert?

Siehe mein Code oben.

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.