Introduction: Bootload an ATmega328

This instructable adds to any of the Arduino on a Breadboard instructables. I wrote my own breadboard-Arduino tutorial, and then I found that I was struggling to program some of the boards I made. A lot of research and dead-ends got me understanding that:

1. You either need a microcontroller with a pre-loaded Bootloader, or must load your own
2. Not all ATmega328’s are equal

(A bootloader, very simply, is a programme that sits on the chip and manages the upload of your sketches onto the chip)

There are plenty of bootloading resources, but I couldn’t find a single one that pulled everything together in a way that made sense to me.

If this instructable helped you, please visit Crash Bang Prototyping, follow us on twitter, and join in with our prototyping resources and tools.

Here goes…

Step 1: Parts

1 x Arduino on a Breadboard
1 x Arduino UNO
Connecting Wires
Arduino IDE installed on your PC

Step 2: The Approach

We’re going to use the Arduino UNO to bootload the ATmega328 that is sitting on the Arduino-on-a-Breadboard. This is fairly straightforward if you have an ATmega328P-PU, but needs an extra step for an ATmega328-PU. I’ll tackle the differences later in the Instructable.

Step 3: Program Your Arduino UNO As an ISP

We need to program the Arduino UNO to act as a an ISP (In-System Programmer), so that it can burn the bootloader onto the Breadboard chip.

  1. Open the Arduino IDE
  2. Open the ArduinoISP sketch (under File, Examples)
  3. If you’re using version 1.0 of the IDE:

search for void heartbeatand change the line that reads:

delay(40);

to

delay(20);

Connect your UNO to the PC, making sure it’s not connected to the Arduino on a Breadboard.

Ensure your UNO is selected under the Boards menu option, and upload the sketch.

Step 4: Connect Your ATmega328

Now connect your ATmega to your UNO as follows:

  • UNO 5v ---> ATmega pin 7 (VCC)
  • UNO GND ---> ATmega pin 8 (GND)
  • UNO pin 10 ---> ATmega pin 1 (RESET)
  • UNO pin 11 ---> ATmega pin 17 (MOSI)
  • UNO pin 12 ---> ATmega pin 18 (MISO)
  • UNO pin 13 ---> ATmega pin 19 (SCK)


Make sure that you don’t have anything else connected to the ATmega pins used above.

Step 5: Which ATmega328 Are You Using?

I learnt the hard way that there is more than one type of ATmega328. The two variants that are of interest to us are the ATmega328-PU and the ATmega328P-PU.

The -PU suffix means that the chips are in a PDIP package, the format we need for our breadboard.

The 328P is a picoPower processor, designed for low power consumption, and is used on the Arduino boards. Given low power consumption this is first choice.

The 328 does not have picoPower technology, and is not used on the Arduino boards – and is not explicitly supported by the Arduino IDE.

What this means is that we can easily bootload the ATmega328P, but not the ATmega328. Unfortunately the websites that sell these chips don't always differentiate between them and forums are filled with people struggling to use the ATmega328-PU.

Luckily there is a workaround - take a look at my Crash Bang website.

Step 6: ATmega328-PU Workaround

Each microprocessor has a signature – a unique code that identifies its model. When you bootload a chip (or even upload a sketch) the Arduino IDE checks that the chip selected matches the type it’s connected to. Even though the ATmega328-PU in essence functions in the same way as the ATmega328P-PU, it has a different signature, and one that isn’t recognised by the Arduino IDE.

(Behind the Scenes: The Arduino IDE actually uses AVRDUDE to programme the chips, so you’ll see error messages from avrdude)

If you try to bootload an ATmega328-PU, you’ll get a message something along the lines of:

avrdude: Device signature = 0x1e9514
avrdude: Expected signature for ATMEGA328P is 1E 95 0F
Double check chip, or use -F to override this check.

You could also get a more colourful version:

avrdude: Yikes! Invalid device signature.


The way to work around this is to “trick” the IDE into believing your 328-PU is in fact a 328P-PU. Disclaimer: I have tested this myself and it works – no guarantees however that you won’t have unforeseen consequences.

Workaround:
In your Arduino folder, find the subfolder: ..\hardware\tools\avr\etc

  1. Make a backup copy of the file: avrdude.conf
  2. Open the file avrdude.conf in a text editor
  3. Search for: “0x1e 0x95 0x0F” (this is the ATmega328P signature)
  4. Replace it with: “0x1e 0x95 0x14” (this is the ATmega328 signature)
  5. Save the file
  6. Restart the Arduino IDE
  7. Continue with the rest of the steps in the instructable, and once bootloading is complete restore the backup copy you made.

Step 7: Bootload the ATmega328

In the Arduino IDE, from the Tools menu:

  • under the Board option choose Arduino UNO
  • under the Serial Port option ensure the correct port is selected
  • under the Programmer option choose Arduino as ISP


To burn the Bootloader, choose Burn Bootloader from the Tools menu

You should see a message “Burning bootloader to I/O Board (this may take a minute)"

Once the bootloader has been burned, you’ll see a message confirming the success.
 

Congratulations: You're now ready to load sketches onto your Arduino on a breadboard!



Uploading Sketches

ATmega328P-PU: You can leave your setup as it is, and use the Arduino UNO to upload sketches to your newly bootloaded ATmega (File, Upload using Programmer).

ATmega328-PU: the IDE will notice that the signature isn’t valid – so you’ll have to either alter the avrdude.conf file again or use an FTDI board to upload. I prefer using an FTDI board anyway as it doesn’t take my UNO out of circulation and is quick to connect.

Comments

author
kylebarker82 (author)2014-01-09

IT WORKED!!!

author
AndyTallack (author)kylebarker822014-01-10

Great stuff - thanks for letting me know! Would love it if you followed Crash-Bang on Twitter as a thanks :)

author

Is that its work on new IDE

author
bhutanidivye (author)2014-02-21

Thanks a lot

author
gewkwn (author)2014-02-01

thanks for info !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

author
Antzy Carmasaic (author)2014-01-01

Thanks for this. Helped me save a wasted ATmega328

author

Excellent, pleased it helped! Thanks for letting me know.

author
Magick_67 (author)2017-07-24

I fought for DAYS to get a bootloader on my 328-AU and was beginning to wonder if I had bricked the thing or my circuit was screwed up.

Swapping out the config files is a circuitous and laborious task, but it's a winner!

author
Nelvig (author)2017-05-02

You're the man! If I were in the committee you'd get the Nobel Prize next year.

author
AmeyT (author)2017-03-12

Thanks a lot Andy Tallack, It worked, What a relief to 3 weeks of frustration.

author
SethuR1 (author)2017-02-23

ERROR! Fired?

avrdude: verification error, first mismatch at byte 0x0000 0x00 != 0x0c avrdude: verification error; content mismatch

author
kd8bxp (author)2017-02-18

Got my hands on a couple of old boards with "weird" bootloaders on them, and old ATmega328 chips - I can say that it worked with 1.6.9 of the IDE thou the avrdude.conf file was moved to a different location and took a little bit to find.

Made the old boards usable again thou, thanks

author
MayurP21 (author)2017-02-10

COMPLETLY WORKED.

author
kd8bxp (author)2017-01-25

Thanks for the info.

author
geekboy32. (author)2017-01-06

It works. Thanks a million Andy! :)

author
subhro.j.bose (author)2015-05-03

I can't save F0. it is showing this error message. now what to do? please help........

Capture.JPG
author

Wow - that's an error I've never seen before. Can you give me more info on what you were doing when it happened? Looks like some kind of security rights issue.

author

Error while bootloading avrdude: stk500_getsync() :not in sync: resp=0x00

author

actually I have done all the job but it is showing the same problem.Nothing new is showing. And inside the "etc" folder there already have “0x1e 0x95 0x14” sooooooo what to do now ?

author
KshitishD (author)2016-10-20

thanks brahhh

author
MonojitS2 (author)2016-09-23

IT'S WORK

THANK YOU SO MUCH SIR

author
jaatbuddhi (author)2016-09-11

Thanks this was helpful and it worked too!!

author
rajesh.dey.397 (author)2016-08-16

With great thanks sir I want to inform u that, after changing the signature to

0x1e 0x95 0x14 I'm not allowed to save the changes in that location. Now what I have to do?

author
Balachandra.M.Hegde (author)2016-06-09

Thanks a lot. This works perfectly..

author
RaviD7 (author)2016-03-08

avrdude: Yikes! Invalid device signature.

Double check connections and try again, or use -F to override

this check. I am still getting the same problem again and again even i tried every step mention above with 2/3 affected ATMega328P-Pu IC. Please tell me what to do now?

author
RaviD7 (author)2016-03-08

avrdude: Yikes! Invalid device signature.

Double check connections and try again, or use -F to override

this check. I am still getting the same problem again and again even i tried every step mention above with 2/3 affected ATMega328P-Pu IC. Please tell me what to do now?

author
VlatkoG (author)2016-01-16

I used this tutorial to build my own atmega based system and so i ordered a bunch of Atmegas from retail seller. All i had were 10 and 47 pF capacitors and so i used them for oscillator. I have struggled for days with avrdude: stk500_getsync(): not in sync: resp=0x00 message and after running out of ideas i went to parts store today and bought exactly 22pF capacitors. Imagine, it worked like a charm. Thank you!

author
AndyTallack (author)VlatkoG2016-01-16

Great! I've often wondered about, but never tested, the tolerance on the capacitors... good to know the datasheet doesn't lie :)

author
karthickashwath247 (author)2015-12-28

Tried all the methods. Spent a few hours working on it. Then I discovered that my UNO was responding only to the older version of the IDE. It refused to upload in the newer IDE. After discovering this, I tried it in the older IDE. Worked like a charm. Bootloaded 2 chips and also uploaded blink programmes.

Thank You so much for this tutorial!

author
Abhishek Basu (author)2015-12-20

U r a life saver. Thank a lot

author
fotherby (author)2015-10-23

Thank you so much. This finally solved my problem after hours of work!!!

author
khuffman35 (author)2015-10-15

My ATMega328 is running the internal clock at 8 MHz. I successfully installed the bootloader but can't communicate via the UART (FT230X SCI to USB circuit). I've used the circuit successfully many times before, so I don't suspect the hardware. Since the baud rate for the communications from the ATMega is derived from the system clock, I suspect the bootloader is expecting a 16 MHz crystal and is setting an incorrect baud rate (I had to modify the bootloader code and set it to an internal clock on the fuse register). Does anyone have access to the source code for the hex bootloader that is sent to the microcontroller? Any other ideas?

author
ecotack (author)2015-09-25

When I change the signature to the ATMEGA328-PU, my code compiles and uploads fine. However, the code runs very slow. PWM LEDs become a visible flicker. I'm using an external 16MHz clock. Circuit and code works fine with a ATMEGA328P-PU.

author
Abhishek Basu (author)2015-09-22

God Bless u. U r a life saver.

Thanks a lot

author
biobuilder (author)2015-09-16

Hey everyone, Here's a permanent way to fix the programming issue with ATMEL328 and still keep your UNO (ATMEL328P) programmable. You want the ATMEL328 device signature to be a Diecimila. However, the Boards.txt file included with the standard copy of Arduino (1.6.3) has a typo, which you will have to fix if you want to seamlessly program your Diecimila with ATMEL 328 instead of ATMEL 328P. Here's how you do it:

1. Find your Arduino Application

2. Go to Java, then hardware, then arduino, then avr, then find "boards.txt"

3. Make a copy of "boards.txt" in case you mess up

4. Find the line in "boards.txt" that says:

diecimila.menu.cpu.atmega328.build.mcu=atmega328p

5. Backspace the "p" off of the line so it looks like this:

diecimila.menu.cpu.atmega328.build.mcu=atmega328

6. save the txt file, restart Arduino, and you're Done!

author
biobuilder (author)biobuilder2015-09-16

Please note: Using this method will not allow you to simply plug the ATMEL328 into an old UNO shield and have it programmable via the USB cable. You will have to use a number of workarounds or program via ISP. It is possible to make your own board profile if you really want to do this, but chances are the ATMEL328 is destined for something other than a regular Arduino board.

author
biobuilder (author)2015-09-16

Hey everyone, Here's a permanent way to fix the programming issue with ATMEL328 and still keep your UNO (ATMEL328P) programmable. You want the ATMEL328 device signature to be a Diecimila. However, the Boards.txt file included with the standard copy of Arduino (1.6.3) has a typo, which you will have to fix if you want to seamlessly program your Diecimila with ATMEL 328 instead of ATMEL 328P. Here's how you do it:

1. Find your Arduino Application

2. Go to Java, then hardware, then arduino, then avr, then find "boards.txt"

3. Make a copy of "boards.txt" in case you mess up

4. Find the line in "boards.txt" that says:

diecimila.menu.cpu.atmega328.build.mcu=atmega328p

5. Backspace the "p" off of the line so it looks like this:

diecimila.menu.cpu.atmega328.build.mcu=atmega328

6. save the txt file, restart Arduino, and you're Done!

author
biobuilder (author)biobuilder2015-09-16

The reason why you can't program an ATMEL 328 inside of an UNO shield is because the avrdude.config for Diecimila doesn't match exactly what the UNO layout is. The ATMEL 328 is better off bare-bones or some other custom layout.

author
biobuilder (author)biobuilder2015-09-16

Please note: I haven't been able to make the ATMEL 328 in an UNO shield be programmable via a USB cable using this technique, but it will save you some trouble when programming via ISP (MOSI, CLK, and MISO) so that you do not have to change the device signature of your UNO ATMEL 328P.

author
NeilH5 (author)2015-08-20

Thank you. It works

author
ksnanda (author)2015-06-09

Hi,

I have an atmega328p MLF package type that's mounted on a pcb with crystal (SMD Type) and other few components.

How to upload code to this ?

author
AndyTallack (author)ksnanda2015-06-09

Hi

It may have an ISP header? Can you send a link to the product you have?

Cheers

Andrew

author
bpatil65 (author)2015-05-12

my softwear are not working

author
mdeudon (author)2015-05-03

The bootload of my arduino has been corrupted. Through this tutorial I've fixed it, especially with the STEP6.

Thank you so much for sharing your experience

Michael

author
AndyTallack (author)mdeudon2015-05-03

Awesome - thanks for letting me know - really pleased it helped

author
JPS2 (author)2014-12-06

Perhaps a better, more permanent solution: if you buy a lot of these chips is to edit avrdude.conf and add the following below the part parent "m328" section:

part parent "m328" id = "m328pu"; desc = "ATmega328PU"; signature = 0x1e 0x95 0x14; ocdrev = 1;

This should permanently add the 328PU to your supported parts for avrdude.

author
pchretien (author)JPS22015-04-03

Hi JPS2 ... I would prefer this permanent solution but I have not been able to make it work. I get a "syntax error" at the line I have the "part parent" instruction. Any suggestion?

author
AndyTallack (author)JPS22015-01-04

Thanks for the suggestion. When I originally wrote this, the GCC toolchain didn't support the m328, so while AVRDude would upload ok, the sketch wouldn't compile. I understand this has changed with the latest releases of GCC - I need to test it out and amend the Instructable as soon as I have a chance.

Thanks for the post.

author
malvai (author)2015-03-21

thanks a lot!

author
Jonoi.Ramsay (author)2015-03-19

I have the ATmega328 with Arduino Bootloader (http://tinyurl.com/o4n9cxe). I do not have the 16MHz crystal and so im using the minimun circuit wiring setup to upload sketches (http://arduino.cc/en/Tutorial/ArduinoToBreadboard). but it does not work when i try to upload on a breadboard.

About This Instructable

198,851views

193favorites

License:

Bio: I’m not a rocket scientist. I don’t have a master’s degree in Electrical Engineering. I love automating, hacking, robotics, creating, building, understanding ... More »
More by AndyTallack:Bootload an ATmega328BaW-Bot Part 3: Adding Sight and Touch to the BotBaW-Bot Part 2: Build the motor-controller & body
Add instructable to: