AVR Fuses

Aus Wiki
Zur Navigation springen Zur Suche springen

Allgemein

Mittels sog. Fuses kann auf die Funktionsweise eines AVR Controllers entscheidend Einfluss genommen werden. So wird z.B. die Taktquelle - Externes CLK-Signal, ext. Resonator, ext. Quarz, ext. Quarzoszillator, ext, RC-Oscillator oder interner RC-Oscillator mittels der Fuses festgelegt. Falsch programmierte Fuses können zu einem Fehlverhalten führen bzw. sogar zur kompletten funktionslosigkeit. Z.B. wenn der AVR (versehentlich) auf ein externes CLK-Signal programmiert wurde, aber ein externer Quarz angeschlossen ist. In diesem Fall wird der AVR mit keinem Takt versorgt und wird einfach stehen bleiben. Die Fuses können dann auch nicht mehr umprogrammiert werden. Es muss ein externer Rechteckgenerator angeschlossen werden, der das erweartete CLK-Signal generiert, damit der AVR wieder ansprechbar und damit die Fuses wieder änderbar sind. Es gibt auch die Möglichkeit die Fuses mittels eines sog. High Voltage Programmers zu ändern, dies soll hier aber nicht weiter vertieft werden.

Standardmäßig werden die AVR Controller mit sicheren Fuse-Settings (z.B. interner RC-Oscillator) ausgeliefert, sodass diese problemlos auf die gewünschte Zielplattform angepasst werden können.


Bestimmung der nötigen Fuses

Die Belegung der Fuses hängt zum einen vom Controller und zum anderen von der Zielhardware ab. Die verfügbaren Fuses und deren Funktion sind ausführlich in den Datenblättern eines jeden AVR Controllers aufgeführt. Es gibt leider kein eigenes Kapitel für die Fuses, sondern die Fuses sind quer über das gesamte Datenblatt verstreut.

Bulbgraph.png Hinweis:
  • Die Fuses werden Byteweise angegeben.
  • Fusebit 1: Fuse nicht programmiert
  • Fusebit 0: Fuse programmiert


Fuses ATMega644

Hier beispielhaft die Fuses eines ATMega644 (Seite 285 im Datenblatt) :

Extended Fuse Byte
Fuse Bit Description Default-Wert
NA 7 - 1
NA 6 - 1
NA 5 - 1
NA 4 - 1
NA 3 - 1
BODLEVEL2 2 Brownout Detektor Level 1
BODLEVEL1 1 Brownout Detektor Level 1
BODLEVEL0 0 Brownout Detektor Level 1


Fuse High Byte
Fuse Bit Description Default-Wert
OCDEN 7 Enable OCD (On Chip Debugging) 1 (OCD disabled)
JTAGEN 6 JTAG Enable 0 (JTAG enabled)
SPIEN 5 Enable Serial Programming Interface 0 (SPI enabled)
WDTON 4 Watchdog Timer always on 1 (disabled)
EESAVE 3 EEPROM wird beim Chip Erase nicht gelöscht 1 (EEPROM wird gelöscht)
BOOTSZ1 2 Bootloader Size 0
BOOTSZ1 1 Bootloader Size 0
BOOTRST 0 Jump to Bootloader during Reset 1 (disabled)


Fuse Low Byte
Fuse Bit Description Default-Wert
CKDIV8 7 Clockteiler 8fach 0 (enabled)
CKOUT 6 Clock Output 1 (disabled)
SUT1 5 Select Startup Time 1
SUT0 4 Select Startup Time 0
CKSEL3 3 Select Clock Source 0
CKSEL2 2 Select Clock Source 0
CKSEL1 1 Select Clock Source 1
CKSEL0 0 Select Clock Source 0


BODLEVEL

Liegt die Betriebsspannung des AVR's unterhalb der Brownout-Schwelle, führt dieser einen Reset aus.

BODLEVEL2 BODLEVEL1 BODLEVEL0 Beschreibung
1 1 1 disabled
1 1 0 1,8V
1 0 1 2,7V
1 0 0 4,3V
0 1 1 Reserved
0 1 0 Reserved
0 0 1 Reserved
0 0 0 Reserved


BOOTSZ

Mit den beiden BOOTSZ Fuses wird die Größe des Bootloaders festgelegt. Der Bootloader wird am Ende des 64KByte großen Flashspeichers abgelegt.

BOOTSZ1 BOOTSZ0 Beschreibung
1 1 512 Words (1024 Byte)
1 0 1024 Words (2048 Byte)
0 1 2048 Words (4096 Byte)
0 0 4096 Words (8192 Byte)


SUT

Die Startup Time (SUT) legt fest, nach welcher Zeit der AVR mit der Programmabarbeitung beginnt. Mit niedriger SUT beginnt der AVR schneller mit der Programmasuführung nach dem Anlegen der Betriebsspannung. Es besteht allerdings die Gefahr, dass zu diesem Zeitpunkt der Oszillator noch nicht stabil läuft und somit zu Problemen führen könnte. Die Bedeutung der SUT-Fuses hängt von der Wahl der Clock Source ab. Die Bedeutung sollte dem Datenblatt entnommen werden.


CKSEL

Mittels CKSEL wird die Taktquelle des AVR festgelegt.

CKSEL3 CKSEL2 CKSEL1 CKSEL0 Beschreibung Anwendung
1 0 0 x Low Power Crystal Oscillator Keramik Resonator 0,4 ...0,9 MHz
1 0 1 x Low Power Crystal Oscillator Keramik Resonator 0,9 ...3,0 MHz
1 1 0 x Low Power Crystal Oscillator Keramik Resonator 3,0 ...8,0 MHz
1 1 1 x Low Power Crystal Oscillator Keramik Resonator 8,0 ...16,0 MHz
0 1 1 x Full Swing Crystal Oscillator Resonator / Quarz 0,4 ... 20 MHz
0 1 0 x Low Frequency Crystal Oscillator 32,768 KHz Uhrenquartz
0 0 1 1 Internal 128KHz RC Oscillator
0 0 1 0 Calibrated internal RC Oscillator int. 8MHz RC-Oszillator (Default Setting)
0 0 0 0 External Clock ext. Rechteckgenerator / Quarz-Oszillator
0 0 0 1 Reserved


Beispiel

  • Brownout = 4,3V
  • On Chip Debugging disabled
  • JTAG disabled
  • SPI enabled
  • Watchdog Timer disabled
  • EESave aktiv
  • 4096 Words Bootloader
  • Bootloader Reset
  • 8-fach Clockteile deaktiviert
  • Clockoutput disabled
  • Externer 8MHz Quarz
  • 14 Clock-Zyklen (Brownout Detektion aktiv)
  • Extended Fuse Byte
BODLEVEL=100
  • Fuse High Byte
OCDEN=1
JTAGEN=1
SPIEN=0
WDTON=1
EESAVE=0
BOOTSZ=00
BOOTRST=0
  • Fuse Low Byte
CKDIV8=1
CKOUT=1
SUT=10
CKSEL=0110


Extended Fuse EFUSE = 11111100 = 0xFC (hex)
High Fuse     HFUSE = 11010000 = 0xD0 (hex)
Low Fuse      LFUSE = 11100110 = 0xE6 (hex)


Fuse Programmieren

AVR-Studio (Windows)

AVR Studio bietet im Programmier Dialog eine komfortable Möglichkeit zur Programmierung der Fuses. Die möglichen Fuses werden übersichtlich dargestellt. Die gwünschten Fuses können mit der Maus aktiviert bzw. deaktiviert werden. Fuses mit Wert=0 müssen in WinAVR angeklickt werden.


AVRDude (Linux)

Unter Linux werden die Fuses mit AVRDude programmiert (→ siehe auch hier). Folgende Zeile programmiert die Fuses aus obigen Beispiel in einen ATMega644.

avrdude -c <PROGRAMMER> -P <PORT> -p ATMega644  -U efuse:w:0xFC:m -U lfuse:w:0xE6:m -U hfuse:w:0xD0:m
Bulbgraph.png Hinweis:
Die beiden Parameter <PROGRAMMER> und <PORT> wie unter Programmer beschrieben einsetzen.