Forum: Mikrocontroller und Digitale Elektronik XMEGA Externe Clock Source verwenden


von Matze B (Gast)


Lesenswert?

Hallo zusammen,

ich habe ein Problem mit meinem ATx128a3u. Ich will den Systemtakt über 
den externen Quarz einstellen. Leider bleibt der µC aber bei dem Code 
tot:
1
  //Enable necessary Clock sources. 13.56 Mhz external Quarz
2
  OSC.CTRL = OSC_XOSCEN_bm;
3
  //Wait for Oscillators to become stable
4
  while(!(OSC.STATUS & OSC_XOSCRDY_bm));
5
  //Set as System Main Clock
6
  CCP = 0xD8;
7
  CLK.CTRL = CLK_SCLKSEL_XOSC_gc;
8
  //Prescaling dividers off
9
  CLK.PSCTRL = 0x00;

Bei der Verwendung der normalen 2 Mhz-Clock und auch beim Umschalten auf 
den internen 32 Mhz-Oszillator funktioniert alles. Seht ihr einen Fehler 
im Code?

Der externe Oszillator ist uebrigens ein 13,56 Mhz-Quarz zwischen XTAL1 
und XTAL2.

Vielen Dank fuer die Hilfe!

Matthias

von Jonas B. (jibi)


Lesenswert?

Ich glaube du musst erst ein Security Bit schreiben, weil die 
Clocksources geschützt sind.
Google mal ne Runde da gibt es Haufenweise Code für.

Gruß Jonas

von Matze B (Gast)


Lesenswert?

Hallo Jonas,

danke fuer die Antwort. Ich habe den zitierten Code ja beim googlen 
gefunden ;-) Grundsaetzlich funktioniert der auch fuer den internen 
RC-Oszillator mit 32 Mhz, nur eben nicht wie oben angepasst fuer den 
externen Quarz. Hat sich ein fuer mich nicht ersichtlicher Fehler 
eingeschlichen? Oder sollte ich ein Oszi auftreiben um zu schauen, ob 
der Quarz ne Macke abbekommen hat?

Vielleicht hat ja noch jemand ne Idee :-)

Matze

von aaa (Gast)


Lesenswert?

schau dir mal das XOSCCTRL register an. Dort musst du noch einstellen 
dass du einen quartz hast. Beim Reset steht dieses Register auf 
"erxteral Clock" und das ist nicht das gleiche wie ein Quartz.

von Das O (Gast)


Lesenswert?

aaa schrieb:
> Quartz

->Quarz
http://de.wikipedia.org/wiki/Quarz

Die Einstellungen sind sehr schön im Xmega Manual beschrieben.

Gruß

von Matze B (Gast)


Lesenswert?

Hallo,

danke fuer die Idee. Dieses Register hat man ja beim internen Oszillator 
nicht benoetigt, daher habe ich es wohl uebersehen. Habe es jetzt 
eingefuegt. Immerhin laeuft der Bursche jetzt tatsaechlich, aber leider 
mit dem internen 2 Mhz-Takt und nicht mit den 13 Mhz des Quarzes. Es 
macht also keinen Unterschied, ob ich den Code eingefuegt habe oder 
einfach weg lasse, er bleibt jetzt die ganze Zeit auf dem internen Takt.
1
  //Define external clock source as quartz, 1K CLK start-up time 
2
  OSC.XOSCCTRL = OSC_XOSCSEL_XTAL_1KCLK_gc;
3
  //Enable necessary Clock sources. 13.56 Mhz external Quartz
4
  OSC.CTRL = OSC_XOSCEN_bm;
5
  //Wait for Oscillators to become stable
6
  while(!(OSC.STATUS & OSC_XOSCRDY_bm));
7
  //Set as System Main Clock
8
  CLK.CTRL = CLK_SCLKSEL_XOSC_gc;
9
  CCP = 0xD8;
10
  CLK.PSCTRL = 0x00;

Viele Gruesse

Matze

von aaa (Gast)


Lesenswert?

Sorry, dass ich Quarz mit "t" geschrieben habe. So früh kann das schon 
mal passieren.

Wenn sich das Programm nicht aufhängt, dann müsste der Quarz ja stabil 
schwingen. Anscheinend klappt aber das umschalten der Taktquelle nicht. 
Hast du die Codeoptimierung eingeschalten? Wenn diese nicht aktiv ist, 
dann benötigt der Prozessor vielleicht länger als 4 Takte vom setzen des 
Security bits bis zur Änderung der Taktquelle. Das kannst du auch sehr 
leicht im Simulator überprüfen.

von Tester (Gast)


Lesenswert?

In der AVR1003 ist die Prozedur beschrieben wie eine system clock 
selection zu erfolgen hat (2.4).

The procedure for changing system clock and prescalers is as follows:
1. Load the Protect IO Register signature (byte value 0xD8) into the 
Configuration
Change Protection register (CCP). This will automatically disable all 
interrupts for
the next four CPU instruction cycles.
2. Set the desired configuration for the prescaler or the system clock.
Note that writing the signature to the CCP register only leaves time for 
reconfiguring
either the prescaler or the system clock. Repeat the CCP write if both 
needs
reconfiguration. Study the example software for details.

Hoff das hilft

von Matthias B. (puupsnase)


Lesenswert?

Hallo,

erst Mal danke an alle! Habs inzwischen hinbekommen!

Grüße

Matze

von Tester (Gast)


Lesenswert?

Matthias B. schrieb:
> Hallo,
>
> erst Mal danke an alle! Habs inzwischen hinbekommen!
>
> Grüße
>
> Matze

und was war es?

von F. B. (flump)


Angehängte Dateien:

Lesenswert?

Hallo,
beschäftige mich gerade auch mit dem Xmega, deswegen hier mein Header, 
der auch nie funktionieren wollte!!!

Aber die Lösung des Rätsels ist ziemlich einfach.
Der Compiler braucht ohne optimierung einfach 5 takte um die Clock 
Source zu beschreiben, deswegen einfach die optimierung wie im 
screenshot zu sehen einschalten und viel spaß mit meinem header

  // clock init
  #include <avr/io.h>


  // Configuration zur Benutzung des externen Quarzes
  // dessen Frequenz vervierfacht wird durch PLL
  void xosc_init (void)
  {
  // Configuration des externen Oscillator durch das setzen von
  // OSC_FRQRANGE_2TO9_gc und OSC_XOSCSEL_XTAL_16KCLK_gc
  OSC.XOSCCTRL |= 0b01001011;

  // External Oscillator enable
  // OSC_XOSCEN_bm wird gesetzt
  OSC.CTRL |= 0b00001000;

  // Oscillator Ready ? OSC_XOSCRDY_bp
  //loop_until_bit_is_set(OSC.STATUS,OSC_XOSCRDY_bp);
  while (! (OSC.STATUS & 0b00001000) );

  // PLL Source and Multiplication factor
  // OSC_PLLSRC_XOSC_gc und factor werden gesetzt
  OSC.PLLCTRL |= 0b11000100;

  // PLL enable
  // OSC_PLLEN_bm wird gesetzt
  OSC.CTRL |= 0b00011000;

  // PLL Ready ? OSC_PLLRDY_bp
  //loop_until_bit_is_set(OSC.STATUS,OSC_PLLRDY_bp);
  while (! (OSC.STATUS & 0b00010000) );

  // I/O protection
  CCP = 0xD8;

  // Clock auf 32Mhz einstellen
  // CLK_SCLKSEL_PLL_gc wird gesetzt
  CLK.CTRL = 0b00000100;

  }


  // Configuration zur Benutzung des internen 32Mhz RC Oscillators
  void int32Mhz (void)
  {
  // Internal RC Oscillator enable
  // OSC_RC32_bm wird gesetzt
  OSC.CTRL |= 0b00000010;

  // Oscillator Ready ? OSC_R32MRDY_bm
  //loop_until_bit_is_set(OSC.STATUS,OSC_XOSCRDY_bp);
  while (! (OSC.STATUS & 0b00000010) );

  // I/O protection
  CCP = 0xD8;

  // Clock auf 32Mhz einstellen
  // CLK_SCLKSEL_PLL_gc wird gesetzt
  CLK.CTRL = 0b00000001;

  }

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.