Inhaltsverzeichnis

Fusebit Tutorial

Was sind Fusebits?

Fusebits sind im Grunde genommen nichts anderes als Speicherzellen die man Programmieren und Löschen kann. Sie dienen jedoch nicht zur Speicherung von Daten sondern mit ihrer Hilfe kann das Verhalten des AVR beeinflusst werden. Zum Beispiel können bestimmte Funktionen aktiviert und deaktiviert werden.

Was ist zu beachten?

Bevor man zum ersten mal die Fusebits eines AVR verändert, sollte man wissen das man den Controller damit nicht zerstören kann. Es ist jedoch möglich den Controller so einzustellen das man mit den normalen Werkzeugen nicht mehr darauf zugreifen kann. Grundsätzlich kann ein „verfuseter“ Controller mit dem richtigen Werkzeug aber wieder repariert werden. Ob dies wirtschaftlich jedoch sinnvoll ist steht auf einem anderen Blatt.

Besitzer eines STK500 oder eines AVR Dragon können falsch programmierte AVR mit Hilfe der parallelen Programmierung retten. Sollte man die ISP Schnittstelle und/oder die JTAG Schnittstelle deaktiviert haben hat man nur mit paralleler Programmierung eine Chance auf Rettung des Controllers.

Was anfänglich Probleme verursacht ist die „invertierte Logik“ der Fusebits. Ein programmiertes Fusebit ist nicht, wie man annehmen könnte, auf „1“ gesetzt sondern auf „0“. Eine unprogrammierte Fuse ist „1“. Manche Programme stellen programmierte Fusebits mit einem gesetzten Häkchen dar (z.B. PonyProg), welches dann als eine 0 (=programmed) interpretiert wird. Möchte man das Fusebit „setzen“ oder „programmieren“ muss man das Häkchen setzen.

Handelt es sich um ein Enable Fusebit bedeutet ein programmiertes Fusebit (0), das die Funktion eingeschaltet ist. Ist es ein Disable Fusebit bedeutet ein programmiertes Fusebit (1), das die Funkiton ausgeschaltet ist.

Was braucht man?

Die Fusebits lassen sich über ISP, JTAG oder parallel programmieren. Man kann hierfür die gleiche Hardware und Software verwenden wie zum Programmieren der des Flash Speichers oder des Eeproms, zum Beispiel PonyProg oder das AVR Studio.

Die Fusebytes

Je nach Controller stehen bis zu drei Fusebytes zur Verfügung: Fuse Low Byte, Fuse High Byte und Extended Fuse Byte. Einige der älteren Controller haben nur ein Fuse Byte und sehr wenige Fusebits.

Die Fusebits

Die folgende Beschreibung listet alle Fusebits auf die es bei den AVR Controllern gibt. Es gibt jedoch keinen Controller in dem alle Fusebits gleichzeitig zu finden sind. Ältere Controller vom Typ AT90S kennen teilweise nur 2 Fusebits.

CKSEL

Die wohl am häufigsten geänderten Fusebits sind CKSEL0 bis CKSEL3 (Select Clock Source). Mit ihrer Hilfe wählt man die Taktquelle aus der der Controller seinen Takt erhält. Hier ist etwas Vorsicht geboten da eine falsche Einstellung den Controller lähmen kann. Eine falsche Einstellung lässt sich jedoch relativ leicht beheben. Die genauen Parameter können zwischen den einzelnen Typen variieren

Default: Interner RC Oszillator mit 1MHz (bzw 8MHz bei Typen mit Vorteiler)
CKSEL0 : 0 (programmiert)
CKSEL1 : 1 (unprogrammiert)
CKSEL2 : 1 (unprogrammiert)
CKSEL3 : 1 (unprogrammiert)

Sollte man hier einen Fehler machen, kann man versuchen ihn mit einem externen Takt zu beheben. Wie man am besten vorgeht steht im Kapitel Takt falsch gesetzt

SUT

Mit SUT0 und SUT1 lässt sich die Zeit einstellen wie lange der Reset Impuls nach einem Reset oder Power Up verzögert wird. Je nach Umgebungsbedingung kann die Reset Zeit verlängert oder verkürzt werden. Zusammen mit der Brown Out Detection wird eine externe Resetschaltung (bis auf den üblichen 10kOhm PullUp Widerstand) meist überflüssig.

Default:
SUT0 : 0 (programmiert)
SUT1 : 1 (unprogrammiert)

CKDIV8

Divide Clock by 8 ist etwas irreführend. Wenn dieses Fusebit gesetzt ist wird ein Vorteiler aktiviert, der den Takt für den Controller durch 8 teilt. Es ist jedoch möglich diesen Vorteiler auf einen anderen Wert einzustellen. Dies ist dann sinnvoll wenn der Controller aus einer externen Taktquelle gespeist werden soll, die Frequenz aber zu hoch ist. Details dazu im Artikel Taktquelle.

Default:
CKDIV8 : 0 (programmiert)

CKOUT

Wird diese Fuse programmiert wird der CPU Takt an dem entsprechenden CLKO Pin ausgegeben.

Default:
CKOUT : 1 (unprogrammiert)

CKOPT

CKOPT kommt zum Einsatz wenn der AVR von einem externen Quarz getaktet wird. Wird CKOPT programmiert (0) schwingt der Oszillator mit der maximalen Amplitude. Dies kann notwendig werden wenn der AVR in einer Umgebung mit vielen Störsignalen betrieben werden soll. Ist CKOPT unprogrammiert (1) schwingt der Oszillator mit einer niedrigeren Amplitude. Dadurch verringert sich die Stromaufnahme und die Störabstrahlung.

Default:
CKOPT : 1 (unprogrammiert)

RSTDISBL

Dieses Fuse Bit steuert die Funktion des Reset Pin. Wird es programmiert kann man den Reset Pin als normalen IO Pin verwenden.

Achtung: Wird dieses Bit programmiert kann der Controller nicht mehr über die ISP Schnittstelle erreicht werden

Default:
RSTDISBL : 1 (unprogrammiert)

SPIEN

Mit SPIEN kann die ISP Schnittstelle abgeschaltet werden. Dieses Fusebit lässt sich nur über die parallele Programmierung ändern. Ist die ISP Schnittstelle einmal abgeschaltet kann der Controller nicht mehr über ISP erreicht werden.

Default:
SPIEN : 0 (programmiert)

JTAGEN

JTAGEN aktiviert/deaktiviert die JTAG Schnittstelle.

Default:
JTAGEN : 0 (programmiert)

DWEN

DWEN aktiviert/deaktiviert die debugWire Schnittstelle.

Default:
DWEN : 1 (unprogrammiert)

OCDEN

OCDEN aktiviert/deaktiviert das On-Chip Debug System. Das On-Chip Debug System kann unabhängig von der JTAG Schnittstelle deaktiviert werden. Bei abgeschaltetem OCD kann der Controller über JTAG nur programmiert werden.

Default:
OCDEN : 1 (unprogrammiert)

EESAVE

Wird EESAVE programmiert wird das EEprom bei einem Chip Erase vor dem Löschen geschützt. Ein Chip Erase löscht normalerweise den kompletten Speicher.

Default:
EESAVE : 1 (unprogrammiert)

BODEN

BODEN aktiviert/deaktiviert die Brown Out Detection. Bei manchen Controllern wird diese Funktion durch die BODLEVEL Fusebits übernommen.

Default:
BODEN : 1 (unprogrammiert)

BODLEVEL

Mit BODLEVEL kann der Spannungswert eingestellt werden bei dem der Unterspannungsschutz aktiv werden soll. Ältere Controller (zb ATmega128) haben nur zwei Schwellwerte. Mit BODLEVEL kann zwischen den Werten gewechselt werden, mit BODEN wird die Funktion komplett deaktiviert. Neuere Controller (zb ATmega168) haben 3 BODLEVEL Fusebits mit denen mehrere Schwellwerte eingestellt werden können bzw die gesamte Funktion deaktiviert wird. Ab Werk ist bei allen Typen die BOD Funktion abgeschaltet.

Default:
BODLEVEL : 1 (unprogrammed)

WDTON

Mit WDTON kann der Watchdog Timer permanent aktiviert werden. Ist dieses Fusebit nicht programmiert (1) kann der Watchdog per Software gesteuert werden.

Default:
WDTON : 1 (unprogrammiert)

BOOTRST

BOOTRST bestimmt an welche Adresse nach einem Reset gesprungen wird. Unprogrammiert (1) springt der Controller nach einem Reset an Adresse $0000. Wird das Fusebit programmiert springt der Controller nach einem Reset an den Beginn des Bootloaders. Die Adresse hängt vom Controller und von den Einstellungen der BOOTSZ Fusebits ab.

Default:
BOOTRST : 1 (unprogrammiert)

BOOTSZ

Mit BOOTSZ wird die Größe des Speicherbereiches bestimmt der für den Bootloader reserviert wird. Die Größe ist abhängig vom Controllertyp. Dieser Speicherbereich befindet sich immer am Ende des Flash Adressraumes..

Default:
BOOTSZ : siehe Datenblatt

Compatibility Bits

Viele Controller haben ein Compatibility Bit. Mit diesem Bit lässt sich der Controller in einen Modus versetzen in dem er sich exakt so verhält wie sein Vorgänger. Beim ATmega128 gibt es zB das M103C Bit. Der ATmega128 verhält sich also wie ein ATmega103.

Ob das Compatibility Bit ab Werk programmiert ist oder nicht hängt vom Controller ab.

SELFPRGEN

SELFPRGEN aktiviert/deaktiviert die Self Programming Funktion.

Default:
SELFPRGEN : 1 (unprogrammiert)

HWBEN

HWBEN aktiviert/deaktiviert die Hardware Boot Funktion

Default:
HWBEN : 0 (programmiert)

Sollte ich ein Fusebit vergessen haben oder neue dazukommen bitte ergänzen.

Fusebits mit dem AVR Studio programmieren

Fusebits im AVR Studio

Am einfachsten und intuitivsten lassen sich die Fusebits mit dem AVR Studio programmieren. Für jedes Fusebit gibt es eine kurze Beschreibung und den Default Wert. Gibt es für eine Funktion mehrere Fusebits wird für jede Kombination ein Häkchen mit Beschreibung und Bitkombination angezeigt.

In diesem Beispiel (ATmega168) sieht man zb das die Brown Out Detection auf 2,7V eingestellt wurde.

Fusebits mit PonyProg programmieren

Fusebits in Ponyprog

PonyProg ist schon etwas umständlicher beim Umgang mit Fusebits. Hier gibt es für jedes Fusebit ein eigenes Häkchen. Hier ist zu beachten, daß ein Häkchen bedeutet, daß das Bit programmiert (0) ist, kein Häkchen bedeutet unprogrammiert (1).

In diesem Beispiel (ATmega32) wurden CKSEL und SUT so konfiguriert das ein externer 16MHz Quarz und maximale Resetverzögerung aktiviert ist.

Die AVRDUDE GUI

Die Avrdude GUI

Als Beispiel für ein Konsolenprogramm soll AVRDUDE dienen. Für dieses Programm gibt es eine grafische Oberfläche. Hier können einzelne Fusebits nicht direkt eingestellt werden. Statt dessen muss eine HEX Zahl für das gesamte Fusebyte angegeben werden.

Sollen Fusebits beschrieben werden muss bei Low Fuse, High Fuse oder Extendes Fuse bei „Write“ ein Haken gesetzt werden. In das Eingabefeld darunter muss der entsprechende HEX Wert für das gesamte Byte eingegeben werden. Bei der Ermittlung der richtigen Werte kann der AVR Fuse Calculator helfen.

Zu Beachten ist hierbei, das alle Bits in dem Byte mit den vorgegebenen Werten beschrieben werden. Eventuelle andere Konfigurationen werden überschrieben.

Fusebits mit AVRDUDE programmieren

Um mit AVRDUDE die Fusebits von der Kommandozeile aus zu programmieren muss man ebenfalls HEX Werte in die entsprechenden Fusebytes schreiben. Auch hierbei hilft der AVR Fuse Calculator.

Programmieren der Low, High und Extendes Fusebytes mit AVRDUDE, ATmega32 und STK200 Programmieradapter.

avrdude -p m32 -c pony-stk200 -P lpt1 -U lfuse:w:0xFF:m 
avrdude -p m32 -c pony-stk200 -P lpt1 -U hfuse:w:0xD9:m

Dieses Beispiel mit dem AVR Fuse Calculator