Forum: Mikrocontroller und Digitale Elektronik Externer Oszillator xmega


von Anfänger (Gast)


Lesenswert?

Ich möchte gerne den externen Oszillator des ATxmega ansprechen. Habe 
folgenden Code:


OSC.CTRL = OSC_XOSCEN_bm; //Externer Oszillator
while( !(OSC.STATUS & OSC_XOSCRDY_bm)) //Warten bis eingeschwungen

CCP = 0xD8;  //Schutz (Konfiguration übernehmen)
CLK.CTRL = CLK_SCLKSEL1_bm | CLK_SCLKSEL0_bm;  // Externer Clock
CLK.PSCTRL = 0x00;  //Prescaler 1

Leider funktioniert mein Programmcode. Kann mir jemand helfen?

von Simon K. (simon) Benutzerseite


Lesenswert?

Anfänger wrote:
> Leider funktioniert mein Programmcode. Kann mir jemand helfen?

Ja ne is klar.

von YS-500 (Gast)


Lesenswert?

> Leider funktioniert mein Programmcode.
Na, ist doch schön.

Was willst Du uns damit sagen?

von Klaus (Gast)


Lesenswert?

Meine Glaskugel sagt mir, dass da ein 'nicht' fehlt.

von Anfänger (Gast)


Lesenswert?

Leider funktioniert mein Programmcode NICHT! Soll es heißen! 
Entschuldigung... Wie sieht es aus kann mir jeman helfen?

von Mike J. (Gast)


Lesenswert?

8-o Wo haste den Xmega her ?

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Du mußt, bevor Du den externen Oscillator über das OSC_CTRL-Register 
einschaltest, das OSC_XOSCTRL-Register passig einrichten.

von Simon K. (simon) Benutzerseite


Lesenswert?

Leider hast du nur spärlich Informationen gegeben. Quarz oder externer 
Takt? Welche Frequenz? Du musst auch noch Prescaler/PLL einstellen. 
Siehe OSC.XOSCCTRL u.a..

von YS-500 (Gast)


Lesenswert?

Es wird warscheinlich wieder ext. Oszillator mit ext. Quarz verwechselt.

von ce (Gast)


Lesenswert?

Der externe Quarz darf nur max. 16MHz haben (nicht etwas 32MHz)!

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

>Der externe Quarz darf nur max. 16MHz haben (nicht etwas 32MHz)!

Nee, das nicht, aber es muß ein Grundtonquarz sein und da ist bei 25Mhz 
Schluß. Ist aber gerade nicht die Frage gewesen.

von Simon K. (simon) Benutzerseite


Lesenswert?

Travel Rec. wrote:
>>Der externe Quarz darf nur max. 16MHz haben (nicht etwas 32MHz)!
>
> Nee, das nicht, aber es muß ein Grundtonquarz sein und da ist bei 25Mhz
> Schluß. Ist aber gerade nicht die Frage gewesen.

Also das XMega Datenblatt sagt 0.4 - 16MHz darf der Quarz max. haben.

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Die Praxis sagt etwas anderes ;-). Spezifikationen sind aber so, wie Du 
sagst.

von Ganz neu (Gast)


Lesenswert?

Also meine Spezifikationen sind:

Ich habe einen Oszillator (kein Quarz) mir 14,7546Mhz. 
Takt-angeschlossen an Xtal1 (External Clock). Ich benötige den vollen 
Takt (Prescaler = 1)

von Mikel86 (Gast)


Lesenswert?

Hi,

hat schon jemand den Quarz oder Oszillator zum laufen gebracht?
Ich habe das gleiche Problem dass mir der xmega nicht auf 16Mhz extern 
läuft.
Habe einen 16Mhz Quarz an xtal1 und xtal2 dran.
1
//CPU
2
OSC.XOSCCTRL |= (1<<OSC_FRQRANGE0_bp) | (1<<OSC_FRQRANGE1_bp); //Frequency Range 12-16 MHz
3
OSC.XOSCCTRL |= (1<<OSC_XOSCSEL0_bp)| (1<<OSC_XOSCSEL1_bp); //0,4 - 16Mhz XTAL 256CLK
4
5
6
OSC.CTRL |= (1<<OSC_XOSCEN_bp); //extern Oszillator enable
7
8
for(;(OSC_STATUS & (1<<OSC_XOSCRDY_bp)) == 0;); //warten bis Quarz ready
9
OSC.PLLCTRL |= (1<<OSC_PLLSRC0_bp) | (1<<OSC_PLLSRC1_bp); //Clock Source
10
CCP = 0xD8;
11
12
CLK.CTRL |= (1<<CLK_SCLKSEL0_bp) | (1<<CLK_SCLKSEL1_bp); //System Clock Selection
13
OSC.CTRL &= ~(1<<OSC_RC2MEN_bp); //Disable 2MHz internal RC

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Angehängte Dateien:

Lesenswert?

So sieht´s in ASM mit aktivierter PLL und RTC aus. Vielleicht hilft´s
ja.

von Mikel86 (Gast)


Lesenswert?

Ich habe das Problem jetzt gelöst.
statt
CLK.CTRL |= (1<<CLK_SCLKSEL0_bp) | (1<<CLK_SCLKSEL1_bp);
muss man
CLK.CTRL = 0x03;
schreiben.
Warum weis ich zwar auch noch nicht, aber ich denk mal dass die erste 
Schreibweise zu lange dauert.

von R--- S. (rene66)


Lesenswert?

Ich habe das hier versucht um den Controller mit einem exteren Quarz 
(16Mhz) laufen zu lassen.

ldi temp,0x03          ;
sts CLK_CTRL,temp

aber wenn ich im Simulator duchkickere lässt sich so das Register 
CLK_CTRL nicht setzten.

(einach nur externer Takt für den Controller)

von funky (Gast)


Lesenswert?

Hi,

kann mir jemand evtl. auf die Sprünge helfen was ich falsch mache?
Ich habe einen 7,372MHz QUarz an XTAL1,2 angeschlossen
und möchte PLL als Systemclock benutzen
1
OSC.XOSCCTRL |= (1<<OSC_FRQRANGE0_bp) ; //Frequency Range 2-9 MHz
2
  OSC.XOSCCTRL |= (1<<OSC_XOSCSEL0_bp)| (1<<OSC_XOSCSEL1_bp) |((1<<OSC_XOSCSEL3_bp)); //0,4 - 16Mhz XTAL 256CLK
3
4
  OSC.PLLCTRL |= (1<<OSC_PLLSRC0_bp) | (1<<OSC_PLLSRC1_bp)| (1<<OSC_PLLFAC0_bp) |(1<<OSC_PLLFAC1_bp); //PLL ext. CLK Faktor3
5
  OSC.CTRL |=  (1<<OSC_XOSCEN_bp) |(1<<OSC_PLLEN_bp); //extern Oszillator enable
6
7
  for(;(OSC_STATUS & (1<<OSC_XOSCRDY_bp)) == 0;); //warten bis Quarz ready
8
  
9
  CCP = 0xD8; //IOProtect
10
  CLK.CTRL |= (1<<CLK_SCLKSEL2_bp);// | (1<<CLK_SCLKSEL1_bp); //SYSCLK PLL
11
  OSC.CTRL &= ~(1<<OSC_RC2MEN_bp) & ~(1<<OSC_RC32MEN_bp); //Disable 2MHz&32MHz internal RC

Ich gebe mir meine Clock mit CLKEVOUT auf einem Pin aus, und bekomme 
immer nur 2MHz wenn ich die PLL Clk auswähle.
Konfiguriere ich direkt den externen Quarz dann sehe ich da aber meine 
7,x MHz als Systemclock.

Was mache ich denn falsch das meine PLL Clock nicht funktioniert?

Danke schonmal

von A. B. (funky)


Lesenswert?

ich poste die Lösung nochmal...habs aber noch hinbekommen. Hatte 
irgendwo noch paar Dreher drinne.

Und hiermit widerspreche ich auch mal der Behauptung das
1
OSC.PLLCTRL |= (1<<OSC_PLLSRC0_bp) | (1<<OSC_PLLSRC1_bp)| (1<<OSC_PLLFAC0_bp) |(1<<OSC_PLLFAC1_bp);

einfacher zu lesen ist als

OSC.PLLCTRL = 0x43

oder so, da OSC_PLLSRC0_bp keinerlei Rückschluss auf die eigentliche 
Bitposition im Byte mehr zuläßt.
Ist sicherlich Ansichts&Gewöhnungssache aber ich finde OSC.PLLCTRL = 
0x43  samt gutem Kommentar Einleuchtender als so ewig lange 
Bezeichnungen

von Simon K. (simon) Benutzerseite


Lesenswert?

A. B. schrieb:
> ich poste die Lösung nochmal...habs aber noch hinbekommen. Hatte
> irgendwo noch paar Dreher drinne.
>
> Und hiermit widerspreche ich auch mal der Behauptung das
>
1
> OSC.PLLCTRL |= (1<<OSC_PLLSRC0_bp) | (1<<OSC_PLLSRC1_bp)|
2
> (1<<OSC_PLLFAC0_bp) |(1<<OSC_PLLFAC1_bp);
>
> einfacher zu lesen ist als
>
> OSC.PLLCTRL = 0x43
>
> oder so, da OSC_PLLSRC0_bp keinerlei Rückschluss auf die eigentliche
> Bitposition im Byte mehr zuläßt.

Schreib doch einfach
1
 
2
OSC.PLLCTRL |= OSC_PLLSRC_XOSC_gc | (3<<OSC_PLLFAC_gp);

von funky (Gast)


Lesenswert?

1
 
2
  OSC.XOSCCTRL |=  (1<<OSC_FRQRANGE1_bp) | (1<<OSC_XOSCSEL0_bp) | (1<<OSC_XOSCSEL1_bp) | (1<<OSC_XOSCSEL3_bp); //0,4 - 16Mhz XTAL 256CLK
3
4
  OSC.PLLCTRL = 0xC4;
5
6
  OSC.CTRL =  (1<<OSC_XOSCEN_bp) | (1<<OSC_PLLEN_bp); //extern Oszillator&PLL enable
7
  while (!(OSC.STATUS & OSC_PLLRDY_bm));  // wait until PLL stable   
8
  CCP = 0xD8; //IOProtect
9
  CLK.CTRL |= 0x04;

hiermit wird PLL als Clocksource ausgewählt. Die PLL multipliziert den 
externen Takt mal 4 in dem Beispiel.

stimmt...das mit den GroupPosition Masken wäre noch ne Alternative

von Simon K. (simon) Benutzerseite


Lesenswert?

funky schrieb:
> stimmt...das mit den GroupPosition Masken wäre noch ne Alternative

Und vor allem die GroupConfigurations benutzen!

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.