AVR Fuses
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.
Hinweis: | |
|
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
Hinweis: | |
Die beiden Parameter <PROGRAMMER> und <PORT> wie unter Programmer beschrieben einsetzen. |