Externer Oszillator xmega

Gast #1075926
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 #1077104
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)
Gast #1105983
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
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
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
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.