Arduino ATmega 328P Fuse Settings
I've finally got myself a virgin ATMega328p and without uploading a bootloader, I've uploaded a simple variation of Blink and thought it was broken until I realised that because I hadn't set the fuses, the MCU was just using internal clock and running at 1MHz intead of 16MHz (I've included a crystal on my board).
Arduino ATmega 328P fuse settings
It is important to remember that some of the fuse bits can be used to lock certain aspects of the chip and can potentially brick it (make it unusable). However, with a bit of care it is fairly straight forward to understand and use the fuse settings.
The high byte fuse has several different settings. The ones of normal interest (to me as a hobbyist at least) are the watchdog timer, preserving or erasing eeprom and the boot loader attribute settings.
The RSTDISBL, SPIEN and DWEN fuses have the potential to brick the ATmega chip, or at least make the chip very very difficult to use again. For general use, and especially if you are just starting out with programming stand-alone chips, you should not change these fuse settings. You should also double check that you are not changing them when you re-write the other fuse settings.
When the ATmega chip is programmed the memory is erased just before the new code is uploaded. Under normal circumstances the eeprom memory is erased as well as the program memory. The EESAVE fuse can be used to tell the chip not to erase the eeprom. This is useful when you want to upgrade code but keep user settings that are stored in eeprom.
and both have a fuse calculator where you select what options you want and the page gives you the fuse settings to use. I prefer not to use the calculators as I think it may be easy to make mistakes but this is my personal opinion only.
NIck Gammon also has a useful sketch that detects ATmega chip types. The sketch can be found at =11633. The sketch displays the fuse settings, the lock bits and gives information about the boot loader if one is present. I found this sketch very useful when I first started programming chips directly.
My question is do i need to plug the atmega328p out of the Arduino board and connect on a bredboard in order to feed an external clock source ? or connecting the function generator to XTAL1 ( pin9) on Arduino board works as well ?
In this instructable you will learn how to change the fuse bits of Atmega328p microcontroller. I am using Arduino mega as a programmer to program Atmega328P-PU on breadboard. It comes with a default 1MHz Internal calibrated oscillator frequency. I will change the fuses to work with 8MHz Internal calibrated Oscillator.
WARNING: The RSTDISBL, SPIEN and DWEN fuses have the potential to brick the ATmega chip, or at least make the chip very very difficult to use again. For general use, and especially if you are just starting out with programming stand-alone chips, you should not change these fuse settings. You should also double check that you are not changing them when you re-write the other fuse settings.
Before uploading the sketch we have to make a few changes. Now we don't have a board that operates at 8 MHz internal oscillator. The standard arduino UNO uses the atmega328p microcontroller but it operates at 16 MHz external crystal oscillator. So we have to add a new board to the tools menu.
Now go to C:\program files\Arduino\hardware\arduino\avr\variants\standard and copy the file "pins_arduino" and paste it in the location C:\program files\Arduino\hardware\arduino\avr\variants\Atmega328p
Now open arduino IDE and go to tools menu "tools > boards > Atmega328p". Again go to tools option and select the correct COM port and check the programmer Arduino as ISP (tools > programmer > Arduino as ISP).
A very useful article, but possibly dated.In my case (Arduino IDE v1,8,12 / Windows 10) the boards.txt and variants directory (step 7) were not in the program files directory. Rather, they were in "c:\users\\AppData\Local\Arduino15\packages\arduino\hardware\avr\1.8.3"I should add that even though the IDE does not appear to be using the boards.txt and variants directory in c:\program files..., they do exist. I spent ages trying to figure out why the most innocuous changes (e.g. adding an X to the leonardo's menu name) to these files did not have any affect whatsoever - including completely deleting them (only after backing them up of course).Secondly, I found that when running avrdude, I had to manually specify where its configuration file was on the command line. This is achieved using the -C option... For example:avrdude -P com37 -b 19200 -c stk500 -p m328p -C "C:\Program Files (x86)\Arduino\hardware\tools\avr\etc\avrdude.conf" -vIn the above command I was using an stk500 as the programmer (as opposed to an Arduino Mega). If you are using an Arduino Mega as the programmer, then you should still probably use -c arduino (as opposed to -c stk500) in the command line. And obviously you should use whatever COM port your programmer is connected to, not just copy my specific example of COM37!Again very useful article - apart from those two minor points, everything else worked as advertised. Thanks for putting this together - I wish I'd seen it before I bought 25 Crystal oscillators and 50 capacitors! :-)
There are a couple ways we can go about setting the fuses on an ATmega328P Arduino. We can use a programmer along with the command-line avrdude utility to explicitly set fuse values, or we can create an additional Arduino board specification with the desired fuse settings, then burn a bootloader using the Arduino IDE, which will also set the fuses for us.
Specs for Arduino boards, including fuse bit settings, are found in various board.txt files, themselves found in various hardware folders. This can get a little confusing as there are number of these folders and files that you'll find on your computer. I'll try to go through the differences below.
This file has board descriptions written in a syntax the IDE understands for default boards Arduino supported at the time the package was released. This is not where you will add descriptions for your custom board or existing board with modified fuse settings, but it's good place to look to begin to grok the syntax.
Following that are a number of lines starting with uno. These are all parameters that describe the specifics of the Arduino/Genuino Uno board. Knowing this, you can probably make at least partial sense of some of the parameters. The lines that begin uno.bootloader. are where the fuse settings are given. You can see hexadecimal entries for the low bits, high bits, and extended bits along with the lock and unlock bits.
Arduino uses low fuse setting of 0xff for ATMega328p, which is the same as 0xf7 except crystal is not programmed as full swing. Full swing is recommended for speeds over 8MHz and especially if multiple units use same clock source.
An arduino board like the Uno can be a programmer for a standalone ATmega chip. For the ATmega328P that is used in the Uno there is a tutorial on the arduino homepage. This lets you burn the bootloader into the chip without the need for other hardware. This post shows how to use the same configuration for reading and writing the fuses on the chip.
-v is the verbose mode of avrdude and tells you a lot about the programmer and also the chip that is connected. At the end of this report the device signature and the settings of the fuses are displayed: lfuse is the Low Byte fuse, hfuse is the High Byte fuse and efuse is the Extended Byte fuse. With the signature you can check which controller you really have.
I have not been able to use the avrdude tool that is included with Arduino in order to flash the fuse settings of the ATmega 328P. I therefore also use the vanilla avrdude, Version 5.11.1, that is included with openSUSE 13.1.
Whenever you set the fuses of an MC, it is therefore a good idea to keep a note of its clock settings so that you remember which kind of oscillator or clock signal it needs. Without the correct clock provided, you will not be able to use an ISP in order to change the fuses back.
For the fuses, we need the tool avrdude, but in the vanilla version that has nothing to do with Arduino. In our case, this is version 5.11.1 as contained in openSUSE 13.1. By typing which avrdude, we get /usr/bin/avrdude and can therefore confirm that by simply typing avrdude, we execute the vanilla version. The Arduino IDE contains a different, patched, version of avrdude, unfortunately under the same name. But that executable would be located somewhere in the directories of the Arduino IDE at /arduino-1.0.5/hardware/tools/avrdude. I have not managed to set the fuses of the standalone ATmega 328P with the Arduino version of avrdude.
Here the option -c specifies the type of programmer we use. For the Arduino ISP, we use stk500v1. The option -p gives the type of the Atmel microcontroller that we are programming. Here m328p stands for the Atmega 328P. The option -P specifies the serial device at which the Arduino ISP is connected, and -b is the baud rate at which we are communicating with the ISP. The three arguments with -U are finally the three bytes that encode the configuration of the fuses.
What made the troubleshooting difficult was the fact that the Arduino patched version of avrdude got the signature right and only produced errors later on when it finally verified the fuse settings. So I thought for quite some time that switching to the Arduino version of avrdude had gotten me closer to the solution. In fact it had not. The vanilla avrdude is the only one that works for my standalone setup.