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.
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.
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.
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 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.
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
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)
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)
Wird diese Fuse programmiert wird der CPU Takt an dem entsprechenden CLKO Pin ausgegeben.
Default:
CKOUT : 1 (unprogrammiert)
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)
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)
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 aktiviert/deaktiviert die JTAG Schnittstelle.
Default:
JTAGEN : 0 (programmiert)
DWEN aktiviert/deaktiviert die debugWire Schnittstelle.
Default:
DWEN : 1 (unprogrammiert)
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)
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 aktiviert/deaktiviert die Brown Out Detection. Bei manchen Controllern wird diese Funktion durch die BODLEVEL Fusebits übernommen.
Default:
BODEN : 1 (unprogrammiert)
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)
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 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)
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
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 aktiviert/deaktiviert die Self Programming Funktion.
Default:
SELFPRGEN : 1 (unprogrammiert)
HWBEN aktiviert/deaktiviert die Hardware Boot Funktion
Default:
HWBEN : 0 (programmiert)
Sollte ich ein Fusebit vergessen haben oder neue dazukommen bitte ergänzen.
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.
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.
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.
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