Hallo Leuts,
ich habe ein Board mit einem XMEGA128A1 jetzt aufgebaut und kann mittels
PDI auf den Controller zugreifen. Dabei lese ich nun die aktuellen
Einstellungen der Fuse Bits aus (siehe Screenshot).
Ich möchte meine Mühen nicht zerstören indem ich nun die Fusebits falsch
programmiere und habe deswegen die Frage wie ich nun die Fusebits
richtig setzte.
Ich habe einen externen Quarz 16 MHz und die zwei 27 pF Kondensatoren.
JTAg würde ich disablen nur was muss ich bei den
FUSEBYTE0
FUSEBYTE1
FUSEBYTE2
FUSEBYTE4
FUSEBYTE5
angeben.
Vielen Dank für eure Hilfe.
Matthias
Hallo erstmal. Bei dem XMega ist es unmöglich, sich per Fuseumstellung
auszusperren. Sämtliche System-Clock-Einstellungen werden per Firmware
zur Laufzeit gemacht. Lediglich die Startup-Zeit der Clock kann per
Fuses geändert werden. Der Controller selbst startet immer mit dem
internen 2Mhz Oszillator.
>>Hallo erstmal. Bei dem XMega ist es unmöglich, sich per Fuseumstellung>>auszusperren.
Danke für jemanden wi mich eine gute Sache ;-)
>> Der Controller selbst startet immer mit dem>> internen 2Mhz Oszillator.
OK, nur nachdem er gestartet ist, werde ich doch nach wie vor die Clock
Source angeben müssen oder realisiert der uC von alleine dass ein
externen Quarz mit 16 MHz der Taktgeber ist?
du musst zur laufzeit die Clock Source einstellen, am besten bevor du in
die Endlosschleife in main() gehst.
Hast du dir die Treiber bzw. Beispiel C-Files von Atmel runtergeladen?
Da kann man sich das anschauen was man machen muss um die gewüsnchte
Clock einzustellen. Da man die CCP Sequenz benötigt um an der Clock
rumzuspielen.
z.B. benutze ich einen 8MHz Resonator.
CLKSYS_XOSC_Config( OSC_FRQRANGE_2TO9_gc, FALSE,
OSC_XOSCSEL_XTAL_1KCLK_gc );
CLKSYS_Enable( OSC_XOSCEN_bm );
CLKSYS_Prescalers_Config( CLK_PSADIV_1_gc, CLK_PSBCDIV_1_1_gc );
do
{
// Wait for Ready Flag
}while( CLKSYS_IsReady( OSC_XOSCRDY_bm ) == 0 );
CCPWrite( &CLK.CTRL, CLK_SCLKSEL_XOSC_gc);
oder halt alles aus den entsprechenden Registern raussuchen und von Hand
in C oder ASM schreiben, ich fand's so deutlich angenehmer, vor allem
weil in der Funktion schon in optimiertem Assembler Code geschrieben
wurde, da die CCP Sequenz meines Wissens nach nur 4 Clock Zyklen lang
sein darf!
CLKSYS_XOSC_Config(OSC_FRQRANGE_12TO16_gc,false,OSC_XOSCSEL_EXTCLK_gc );
CLKSYS_Enable( OSC_XOSCEN_bm );
do {}
while ( CLKSYS_IsReady( OSC_XOSCRDY_bm ) == 0 );
CLKSYS_Main_ClockSource_Select( CLK_SCLKSEL_XOSC_gc );
CLKSYS_Disable( OSC_RC32MEN_bm );
So müsste das gehen, wenn ich es aus dem Beispiel richtig verstanden
habe oder?
Achtung! CLKSYS_Disable( OSC_RC32MEN_bm );
--> im Beispiel Code war der interne 32MHZ zuvor aktiv! Deswegen wird
der Disabled nachdem der externe Clock gewählt wurde!!
Also falls es überhaupt nötig ist dann den OSC_RC2MEN_bm deaktivieren.
ansonsten sollte das wohl funktionieren....
achso im AVR Studio in der I/O view das "Clock System" anschauen, da
steht ja dann deine Einstellung schön lesbar drin, dann weisst du auch
das es wirklich geklappt hat !
Ich habe wie bei den Megas zuvor an XTAL 1 und XTAL 2 die Anschlüsse des
Quarzes und die 2 27 pF Kondensatoren. Interpretiere ich das in dem DB
falsch oder wird ein externer Quarz nun beim XMEGA nur noch an XTAL 1
angeschlossen (Figure 7.3). Ich habe den Aufbau von Figure 7.2 gewählt
nur komme ich mit dem Begriff "0.4 - 16 MHz Crystal Oscillator" nicht
klar. War das bei den MEgas nicht immer NICHT der normale Quarz (fix)?
Verwirr
Figure 7.3 stellt den Anschluss eines "Rechtecksignals" dar, also quasi
Freuqenzgenerator z.B.
Dein Crystal liefert ja ne Sinusschwingung, daher XTAL1 und XTAL2
anschliessen.
Klar ist das dann keine interne Quelle sondern extern, aber es gibt halt
auch die Möglichkeit einen Externen Clock (rechteck!) draufzugeben!!!
Nicht verweirren lassen!
Die externe Clock muß keine Rechteckspannung sein, sie muß nur
mindestens +-0.5V um Vcc/2 herum schwingen und einen Duty-Cycle um 50%
haben. Die Signalform ist relativ egal.
Ich mache bei der Initialisierung folgendes:
CLKSYS_XOSC_Config(OSC_FRQRANGE_12TO16_gc,false,OSC_XOSCSEL_XTAL_256CLK_
gc);
CLKSYS_Enable(OSC_XOSCEN_bm);
do {}
while ( CLKSYS_IsReady( OSC_XOSCRDY_bm ) == 0 );
CLKSYS_Main_ClockSource_Select( CLK_SCLKSEL_XOSC_gc );
Dann wollte ich testen ob eine LED am Port eingeschalten werden kann
mit:
PORT_SetPinsAsOutput( &PORTE, 0xFF );
PORT_SetOutputValue( &PORTE, 0x06 );
Wenn ich in das I/O Fenster schaue, steht da immer noch der interne 2
MHz Clock und die LED geht nicht an. Was mache ich falsch, programmmiere
geht!
Doch geht sry war ein kleiner Fehler, jedoch sehe ich in dem I/O Fenster
immer noch nicht die externen Angaben, die Source wird aber erkannt,
sonst würde ich die nochfolgend nach der Initialisierungsroutine
geschaltete LED Blinkfolge nicht angezeigt bekommen.
also ich bin dennoch der Meinung das du bei System Clock
Selection:External Crystal Oscillator sehen soltlest!? Bei mir ist das
jedenfalls so.
Clock Source steht auf 1kHz from internal .. Keine Ahnung warum, dem
messe ich jedoch keine Bedeutung zu ;)
So also komischerweise sehe ich im I/O Viewer:
SCLKSEL[2:0] = 111
wobei bei der External Oscillator or Clock ein 011 stehen müsste.
Diese Funktion:
CLKSYS_XOSC_Config(OSC_FRQRANGE_12TO16_gc,false,OSC_XOSCSEL_XTAL_256CLK_
gc);
muss diesen falschen Eintrag generieren.