Externer Oszillator xmega

Gast #1075926
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?
Gast #1105983
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
Gast #1106587
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.
#1119903
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)
Gast #1776026
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
#1776265
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
Persönliche Seite #1776337
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);
Gast #1777008
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren