AVR fuse bits

For Beginners Fuse bits seems to be very confusing but they are not so!

Just like to make some pins of microcontroller as output we have to set some bits in a DDR register, in order to microcontroller to work properly we have to set some fuse bits.In other words fuse bits are master registers whose values directly affects functioning of microcontroller.

ATmega32 microcontroller has two fuse bytes namely high fuse and low fuse. Both of them are 8 bits.

The default value of ATmega32 fuse bit is 0x99E1 i.e. high fuse =0x99 and low fuse =0xE1.

Firstly we will understand what this is and then how to change it!

NOTE: In fuse bits 0 means programmed and 1 means not programmed.

Bit No. 7 6 5 4 3 2 1 0
High Fuse OCDEN JTAGEN SPIEN CKOPT EESAVE BOOTSZ1 BOOTSZ0 BOOTRST
Default Value 1 0 0 1 1 0 0 1
Bit No. 7 6 5 4 3 2 1 0
Low Fuse BODLEVEL BODEN SUT1 SUT0 CKSEL3 CKSEL2 CKSEL1 CKSEL0
Default Value 1 1 1 0 0 0 0 1

OCDEN : This pin is used to enable or disable on chip debugging. On chip debugging provides a real time emulation of microcontroller when running in target system. By default it is disabled as 1 means not programmed.

JTAGEN : There is a built in JTAG interfaces for debugging. It is enabled in new microcontroller. This is the reason why some newbies say “PORTC of ATmega32 not working!!” Disable it if you are not using JTAG by making JTAGEN bit 1(high).

SPIEN : 0 value (programmed) means Serial programing of ATmega32 is enabled. Don’t change this unless you have a parallel programmer! Because once disabled ATmega32 can’t be programmed using serial programmer.

EESAVE : If programmed (0) it will save EEPROM from erasing during chip erase else EEPROM would also be erased with flash.

BOOTSZ0 and BOOTSZ1 : These are used to set the boot loader size.

CKSEL [3-0] : These bits are used to select different clock options available.

Device clocking options CKSEL 3..0
External crystal/ceramic resonator 1111-1010
External low frequency crystal 1001
External RC oscillator 1000-0101
Calibrated Internal RC oscillator 0100-0001
External clock 0000

The default value of CKSEL3..0 is 0001 i.e. internal RC oscillator running at 1 MHz. If you want to add external crystal you need to change these values according to the table above. Some common fuse bits values are given in the end of the article.

CKOPT : The CKOPT Fuse Selects between two different oscillator amplifier modes. When CKOPT is programmed, the oscillator output will oscillate with a full rail-to-rail swing on the output. When not programmed, the oscillator has a smaller output swing. If you are using external crystal oscillator it is better to program CKOPT i.e. CKOPT=0.

BODEN : ATmega32 has an On-chip Brown-out Detection (BOD) circuit for monitoring the VCC level during operation by comparing it to a fixed trigger level. When the BOD is enabled (BODEN programmed), and VCC decreases to a value below the trigger level, the Brown-out Reset is immediately activated. When VCC increases above the trigger level, it starts the microcontroller again.

BODLEVEL : The trigger level for the BOD can be selected by this fuse bit. When programmed (0) the trigger level is 4V and when not programmed (1) the trigger level is 2.7V.

BOOTRST : If BOOTRST bit is programmed (0), the device will jump on first address boot-loader block.

Some fuse bits values are

Low Fuse High Fuse Comments
0xE1 0x99 Default, Internal 1MHz
0xE2 0x99 Internal 2MHz, rest all default
0xE3 0x99 Internal 4MHz, rest all default
0xE4 0x99 Internal 8MHz, rest all default
0xEE 0xC9 External 12/16MHz, JTAG disabled
0xE1 0xD9 Internal 1MHz, JTAG disabled
0xE2 0xD9 Internal 2MHz, JTAG disabled
0xE3 0xD9 Internal 4MHz, JTAG disabled
0xE4 0xD9 Internal 8MHz, JTAG disabled

Disclaimer: This tutorial is for informational purpose; do fuse bits settings at your own risk.

Frequently Asked Questions (FAQs):

1. Do I have to change fuse bit if I want to use external crystal oscillator?

Ans. Yes, you have to write appropriate fuse bit value corresponding to your crystal frequency.

2. Do I need to write Fuse bits value every time after programming microcontroller?

Ans. No, their value will not change during writing/reading flash/EEPROM memory.

Hope this was helpful to you! Any questions ? Comment here!