www.mikrocontroller.net

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


Autor: soso (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

Hierzu nutze ich folgende Initialisierungsrutine
  CCP = 0xD8;
  OSC.CTRL = OSC_RC32MEN_bm;                  // Enable internal 32 Mhz Ring Oszilator
                                //(Kalibriert 1% Abweichung bei 25° und 3 V)


  while((!(OSC.STATUS & OSC_RC32MRDY_bm)) == OSC_RC32MRDY_bm){};  // Warten, bis der Takt steht

  // Nun noch die Clock als Systemclock waehlen
  CCP = 0xD8;                          // Protected Register durefen beschrieben werden
  CLK.CTRL  = CLK_SCLKSEL_RC32M_gc;              // Takt auswaehlen (Intern 32Mhz) (Prescaler brauchen wir nicht)
  CCP = 0xD8;                          // Protected Register durefen beschrieben werden
  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ß

Autor: Helmut Ru (heru01)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo soso,

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

bei mir hat funktioniert:
CLKSYS_Enable( OSC_RC32MEN_bm );  
CLKSYS_Prescalers_Config( CLK_PSADIV_1_gc, CLK_PSBCDIV_1_1_gc );
do {} while ( CLKSYS_IsReady( OSC_RC32MRDY_bm ) == 0 );
CLKSYS_Main_ClockSource_Select( CLK_SCLKSEL_RC32M_gc );  
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

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Komisch. Ich habe das eigentlich genau so wie der TO und bei mir klappt 
das auf einem xMega128A1 und xMega32A4
  /* Enable necessary Clock sources. 32MHz and 32kHz Oscillator */
  OSC.CTRL = OSC_RC32MEN_bm;
  /* Wait for Oscillators to become stable */
  while(!(OSC.STATUS & OSC_RC32MRDY_bm));

  /* Start Calibrating the 32MHz Clock using
   * the internal calibrated 32kHz Oscillator */
  OSC.DFLLCTRL = (0 << OSC_RC32MCREF_bp);
  DFLLRC32M.CTRL = DFLL_ENABLE_bm;
  /* Set as System Main Clock */
  CCP = CCP_IOREG_gc;
  CLK.CTRL = CLK_SCLKSEL_RC32M_gc;

  /* Lock Clock Settings until next Reset */
  CCP = CCP_IOREG_gc;
  CLK.LOCK = CLK_LOCK_bm;

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

Autor: Helmut Ru (heru01)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Allegron S. (allegron)
Datum:

Bewertung
0 lesenswert
nicht 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;
  }
}

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Siehe mein Code oben.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.