Forum: Mikrocontroller und Digitale Elektronik Fusebits XMEGA


von Matthias (Gast)


Angehängte Dateien:

Lesenswert?

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

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

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.

von Matthias (Gast)


Lesenswert?

>>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?

von Xmega Rookie (Gast)


Lesenswert?

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!

von Xmega Rookie (Gast)


Lesenswert?

CCPWrite( &CLK.CTRL, CLK_SCLKSEL_XOSC_gc) ist die Funktion die Assmbler 
enthält, ich vergaß sie zu nennen ;)

von Matthias (Gast)


Lesenswert?

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?

von Xmega Rookie (Gast)


Lesenswert?

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....

von Xmega Rookie (Gast)


Lesenswert?

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 !

von Matthias (Gast)


Lesenswert?

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

von Xmega Rookie (Gast)


Lesenswert?

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!

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

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.

von Xmega Rookie (Gast)


Lesenswert?

ah ok, hatte ich mir halt mal so auf die schnelle zusammengereimt ;)

von Matthias (Gast)


Lesenswert?

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!

von Matthias (Gast)


Lesenswert?

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.

von Xmega Rookie (Gast)


Lesenswert?

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

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Das Umschalten der Main Clock Source ist geschützt durch das 
CCP-Register. Bevor das nicht $D8 entriegelt ist, geht hier gar nichts.

von Matthias (Gast)


Lesenswert?

Verstehe ich jetzt nicht.
Im Example von Atmel wird dieser Schritt nicht zuvor gemacht.

von Matthias (Gast)


Lesenswert?

Du meinst wahrscheinlich diese Zeile, die bei mir ganz offensichtlich 
fehlt:

CCPWrite( &CLK.CTRL, CLK_SCLKSEL_XOSC_gc);

von Matthias (Gast)


Lesenswert?

Jetzt sehe ich bei System Clock
Selection: undefined value

Clock Source: auch bei 1 Khz internal

von Matthias (Gast)


Lesenswert?

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.

von Matthias (Gast)


Lesenswert?

Mein Fehler: jETZT PASST ALLES, hab den Debugger laufen lassen und die 
Register werden richtig beschrieben.

Danke für die Hilfe

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.