AVR Fuses: Unterschied zwischen den Versionen

Aus Wiki
Zur Navigation springen Zur Suche springen
(Die Seite wurde neu angelegt: =Allgemein= Mittels sog. Fuses kann auf die Funktionsweise eines AVR Controllers entscheidend Einfluss genommen werden. So wird z.B. die Taktquelle - Externes CLK-Signa...)
 
Keine Bearbeitungszusammenfassung
Zeile 37: Zeile 37:
| NA || 3 || - || 1
| NA || 3 || - || 1
|-
|-
| BODLEVEL2 || 2 || Brownout Detektor Level || 1
| BODLEVEL2 || 2 || [[AVR_Fuses#BODLEVEL|Brownout Detektor Level]] || 1
|-
|-
| BODLEVEL1 || 1 || Brownout Detektor Level || 1
| BODLEVEL1 || 1 || [[AVR_Fuses#BODLEVEL|Brownout Detektor Level]] || 1
|-
|-
| BODLEVEL0 || 0 || Brownout Detektor Level || 1
| BODLEVEL0 || 0 || [[AVR_Fuses#BODLEVEL|Brownout Detektor Level]] || 1
|}
|}


Zeile 62: Zeile 62:
| EESAVE || 3 || EEPROM wird beim Chip Erase nicht gelöscht || 1 (EEPROM wird gelöscht)
| EESAVE || 3 || EEPROM wird beim Chip Erase nicht gelöscht || 1 (EEPROM wird gelöscht)
|-
|-
| BOOTSZ1 || 2 || Bootloader Size || 0
| BOOTSZ1 || 2 || [[AVR_Fuses#BOOTSZ|Bootloader Size]] || 0
|-
|-
| BOOTSZ1 || 1 || Bootloader Size || 0
| BOOTSZ1 || 1 || [[AVR_Fuses#BOOTSZ|Bootloader Size]] || 0
|-
|-
| BOOTRST || 0 || Jump to Bootloader during Reset || 1 (disabled)
| BOOTRST || 0 || Jump to Bootloader during Reset || 1 (disabled)
Zeile 81: Zeile 81:
| CKOUT || 6 || Clock Output || 1 (disabled)
| CKOUT || 6 || Clock Output || 1 (disabled)
|-
|-
| SUT1 || 5 || Select Startup Time || 1
| SUT1 || 5 || [[AVR_Fuses#SUT|Select Startup Time]] || 1
|-
|-
| SUT0 || 4 || Select Startup Time || 0
| SUT0 || 4 || [[AVR_Fuses#SUT|Select Startup Time]] || 0
|-
|-
| CKSEL3 || 3 || Select Clock Source || 0
| CKSEL3 || 3 || [[AVR_Fuses#CKSEL|Select Clock Source]] || 0
|-
|-
| CKSEL2 || 2 || Select Clock Source || 0
| CKSEL2 || 2 || [[AVR_Fuses#CKSEL|Select Clock Source]] || 0
|-
|-
| CKSEL1 || 1 || Select Clock Source || 1
| CKSEL1 || 1 || [[AVR_Fuses#CKSEL|Select Clock Source]] || 1
|-
|-
| CKSEL0 || 0 || Select Clock Source || 0
| CKSEL0 || 0 || [[AVR_Fuses#CKSEL|Select Clock Source]] || 0
|}
|}


===BODLEVEL===
===BODLEVEL===
Liegt die Betriebsspannung des AVR's unterhalb der Brownout-Schwelle, führt dieser einen Reset aus.
:{| border="1"
|-
!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.
:{| border="1"
|-
!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) left 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.
:{| border="1"
|-
!CKSEL3
!CKSEL2
!CKSEL1
!CKSEL0
!Description
!Beschreibung
|-
| 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 ||
|-
| 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
:{| border="1"
|-
!Fuse
!Bit
!Wert
|-
| NA || 7 || 1
|-
| NA || 6 || 1
|-
| NA || 5 || 1
|-
| NA || 4 || 1
|-
| NA || 3 || 1
|-
| BODLEVEL2 || 2 || 1
|-
| BODLEVEL1 || 1 || 0
|-
| BODLEVEL0 || 0 || 0
|}
* Fuse High Byte
:{| border="1"
|-
!Fuse
!Bit
!Wert
|-
| OCDEN || 7 || 1
|-
| JTAGEN || 6 || 1
|-
| SPIEN || 5 || 0
|-
| WDTON || 4 || 1
|-
| EESAVE || 3 || 0
|-
| BOOTSZ1 || 2 || 0
|-
| BOOTSZ1 || 1 || 0
|-
| BOOTRST || 0 || 0
|}
* Fuse Low Byte
:{| border="1"
|-
!Fuse
!Bit
!Wert
|-
| CKDIV8 || 7 || 1
|-
| CKOUT || 6 || 1
|-
| SUT1 || 5 || 1
|-
| SUT0 || 4 || 0
|-
| CKSEL3 || 3 || 0
|-
| CKSEL2 || 2 || 1
|-
| CKSEL1 || 1 || 1
|-
| CKSEL0 || 0 || 0
|}
Extended Fuse = 11111100 = 0xFC (hex)
High Fuse    = 11010000 = 0xD0 (hex)
Low Fuse      = 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.
==AVRDude (Linux)==
Unter Linux werden die Fuses mit AVRDude programmiert [[AVR_Programmer|(→ 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 [[AVR_Programmer|Programmer]] beschrieben einsetzen.}}

Version vom 10. April 2010, 15:40 Uhr

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) left 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 Description Beschreibung
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
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
Fuse Bit Wert
NA 7 1
NA 6 1
NA 5 1
NA 4 1
NA 3 1
BODLEVEL2 2 1
BODLEVEL1 1 0
BODLEVEL0 0 0
  • Fuse High Byte
Fuse Bit Wert
OCDEN 7 1
JTAGEN 6 1
SPIEN 5 0
WDTON 4 1
EESAVE 3 0
BOOTSZ1 2 0
BOOTSZ1 1 0
BOOTRST 0 0
  • Fuse Low Byte
Fuse Bit Wert
CKDIV8 7 1
CKOUT 6 1
SUT1 5 1
SUT0 4 0
CKSEL3 3 0
CKSEL2 2 1
CKSEL1 1 1
CKSEL0 0 0


Extended Fuse = 11111100 = 0xFC (hex)
High Fuse     = 11010000 = 0xD0 (hex)
Low Fuse      = 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.


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.