Forum: Mikrocontroller und Digitale Elektronik ATxmega128A4U RC Oszillator auf 48Mhz umstellen / USB


von Piotr (Gast)


Lesenswert?

Hallo zusammen!

Mir gelingt es nicht den RC32M auf 48 MHz umzustellen,
egal welche Werte ich in die DFLLRC32M_COMP1 und DFLLRC32M_COMP1 
-Register schiebe, die Frequenz bleibt immer bei 32 MHz stehen.

LG

von Thomas F. (tomasf)


Lesenswert?

Schau dir mal im Atmel-Studio ein USB-Beispiel der ASF an. Die 
entsprechenden Stellen sollten direkt am Anfang des Programms und beim 
Initialisieren des USB-Moduls sein.

von Wolfgang (Gast)


Lesenswert?

Hallo,

hier mal aus dem ASF, osh.h:
1
if (ref_id == OSC_ID_USBSOF) {
2
  /*
3
  * Calibrate 32MRC at 48MHz using USB SOF
4
  * 48MHz / 1kHz = 0xBB80
5
   */
6
  DFLLRC32M.COMP1 = 0x80;
7
  DFLLRC32M.COMP2 = 0xBB;
8
  OSC.DFLLCTRL |= OSC_RC32MCREF_USBSOF_gc;
Servus Wolfgang

von Piotr (Gast)


Lesenswert?

Hallo again!

danke sehr für Eure Beiträge, ich habe nichts wirklich anders gemacht.
ABER - genau noch nachgemessen - UND festgestellt das sich die Frequenz 
sehr wohl verändert, jedoch ganz geringfügig und zwar auf bis auf ca. 37 
MHz.

In meinem Beispiel möchte ich den internen oscillator auf 50 MHz 
schalten,
soll lt. AU-Manual ( doc 8331 ) zw. 30 und 54 möglich sein,
ich beutze den 32 KHz internen RC oscillator als reference dür den 32 
MHz DFLL,
ohne reference kann die Frequenz überhaup nicht geändert,
hier ist die clock init routine von mir. LG

OSC_CTRL |=  OSC_RC32KEN_bm ; // enable 32KHz Oscilator
while ( !( OSC_STATUS &  OSC_RC32KRDY_bm )); // wait for 32K Oscillator 
is stable
OSC_CTRL |=  OSC_RC32MEN_bm ; // enable 32MHz Oscillator
while ( !( OSC_STATUS &  OSC_RC32MRDY_bm )); // wait for 32M Oscillator 
is stable
OSC_DFLLCTRL |= OSC_RC32MCREF_RC32K_gc; // set reference
DFLLRC32M_COMP1 = 0xbc; // change frequency to 50 MHz
DFLLRC32M_COMP2 = 0xbe;
DFLLRC32M_CTRL = DFLL_ENABLE_bm; // enable DFLL

CCP = CCP_IOREG_gc; //enable register change
CLK_CTRL = CLK_SCLKSEL_RC32M_gc; // select 32 MHz internal RC Oscillator

von Timmo H. (masterfx)


Lesenswert?

Dein Problem ist, dass du die den Referenztakt auf 
OSC_RC32MCREF_RC32K_gc stellst. Wenn du dann den DFLL aktvierst wird der 
32M über den 32K (auto) kalibieriert. Das willst du aber ja nicht. Mit 
"OSC_RC32MCREF_USBSOF_gc" wird das ganze über USB (start of frame) 
kalibriert.
Geht es dir nur um die 50 MHz? Dann verwende doch die PLL, z.B. 2MHz x 
25

von Piotr S. (piotr)


Lesenswert?

Hallo,
anscheinend habe ich die Logik des Einstellens durch die Kalibrierung 
von DFLL nicht verstanden, aber egal.
Juhu! ich habe meine 50 MHz, danke Timmo, funktioniert ganz einfach, bin 
total in der Kalibrierung versunken ohne an PLL zu denken.
Läuft jetzt auch mit 64 MHz ( 8 ( 32 ) x 8 ) PS: kann er mit so hoher 
Frequenz dauerhaft beschädigt werden? Wärmeentwicklung gibt es überhaupt 
keine.
LG Piotr

: Bearbeitet durch User
von Timmo H. (masterfx)


Lesenswert?

Einige haben die Xmegas auch schon auf > 80 MHz bekommen. Mit 3.3V ist 
aber wohl eher so 64 MHz drin. Kaputt gehen wird da nichts, aber er 
könnte dann instabil laufen. 48 MHz geht bei den USB Xmegas auf jeden 
Fall, da sie ja bei USB-Betrieb eh auf 48 MHz getaktet werden.
Probleme gibts wenn du xmegas mit mehr als 128 KB Flash betreibst und 
auch über die 128 KB Grenze mit dem Code hinaus kommst. Dann hängt er 
sich bei der Verwendung des ELPM Befehls (um auf > 128 KB zugreifen zu 
können) auf. Dann sind max. 50-52 MHz drin.

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.