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;
}