How to Program a AVR (arduino) With Another Arduino

159,940

202

48

About: if you can't open - you don't own it

This instructables is usefull if:

* you've got your arduino with atmega168 and you bought an atmega328 at you local electronics store. It doesn't have an arduino bootloader

* you want to make a project that doesn't use arduino - just a regular AVR chip (like the USBTinyISP) - you have a clean attiny2313/attiny48 etc that you want to burn firmware on.

Normally  you would have to have an ISP (In System Programmer) like USBTinyISP to program your new chip.  Having the arduino you can teach it to be a programmer thank to a great work done by Randall Bohn. He created Mega-ISP - an arduino sketch that works like a programmer.

Step 1: What Do You Need ?

* a working Arduino (or a clone - i'm using the BBB - BareBonesBoard and a RBBB - RealBareBonesBoard by ModernDevices)
* a chip that you want to program (tested with atmega8,atmega168,atmega368, attiny2313, attiny13)
* a breadboard or a board with ISP header
* 3 leds + 3 resistors
* breadboard wires

Step 2: Making the Mega-isp Programmer on a Breadboard

There are two ways to connect your Arduino to program a chip.

You can plug your avr chip to a breadboard and connect 5v and GND to the respective pins (check the datasheet!) + a pullup resistor to reset and wire pins from you arduino to the chip.
These are the lines on Arduino and their function
13 - SCK
12 - MISO
11 - MOSI
10 - RST (Reset)

Or you can make a 2x3pin ISP header that you can plug into a board that provides one (another arduino board).
The pinout for the ISP header is on the third image

There are 3 leds to indicate the status of the programmer.
pin 9 - blue led - its the hearbeat of the programmer.
pin 8 - red led - indicates an error
pin 7 - green led - indicates that the programming is taking place
(i was lazy so i didn't match the colors in my setup)

Here are the drawings made in Fritzing

You can alsa make a MEGA-isp shield. Yaroslav Osadchyy designed the shield in eagle. You can get the eagle files on his site:  http://drug123.org.ua/mega-isp-shield/

Step 3: Uploading the Sketch

Download the sketch from mega-isp google code.(avrisp.03.zip at the time of writing).
Unpack it and run arduino ide and open avrisp.pde.
Upload it to your arduino board.
Heartbeat led should start beating.

Step 4: Using With Avrdude

To use with avrdude (and all GUIs that use it) you have to select the 'avrisp' programmer. the safest bitrate is 19200.

To test your your new atmega168 from commandline try:
$ avrdude -p m168 -P /dev/ttyUSB0 -c avrisp -b 19200

/dev/USB0 is the port that arduino is connected to my linux box (your's may be com5). This can be checked in arduino IDE in Tools -> Serial Port.

You should get:
[kabturek@hal-9000 ~]# avrdude -p m168 -P /dev/ttyUSB0 -c avrisp -b 19200

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.13s

avrdude: Device signature = 0x1e9406

avrdude: safemode: Fuses OK

avrdude done.  Thank you.


That means everything is ok.

If you get errors - check the last step.

Step 5: Burning USBtinyISP Firmware to an Attiny2313

The USBTinyISP is a great programmer from LadyAda thats really cheap - 22$.
I had a spare attiny2313 and some parts so i decided to make one myself. If you don't have any experience in making PCB i advice you buy the kit cause it's higher quality than you can make yourself :). At least buy the PCB if you want to build one. You can get it from Adafruit.

Connect the ATtiny2313
In the last picture you can see the attiny2313 with the pins used for ISP in red. The picture is from LadyAda avr tutorial.

Burning the firmware:

Unpack the USBTinyISP firmware.

Go to the spi dir and run
$ avrdude -p pt2313 -P /dev/ttyUSB0 -c avrisp -b 19200
to check if everything is ok with the chip.

Now set the fuses:
$ avrdude -P /dev/ttyUSB0 -c avrisp -b 19200 -pt2313 -U hfuse:w:0xdf:m -U lfuse:w:0xef:m

Now you should attach the 12mhz external oscillator to the chip.

And burn the firmware:
$ avrdude -B 1 -pt2313 -U flash:w:main.hex -P /dev/ttyUSB0 -c avrisp -b 19200

Voila. Your attiny2313 has the USBTinyISP firmware.

Step 6: Burning the Arduino Bootloader

Connecting
I cheated a bit cause i used a RBBB to simplify the connections. The schema is on picture #2.
If you use 2 arduinos use the picture #3 and connect the ISP pin to the ICSP 2x3header on the second(slave) arduino.Only connect the usb power to the first board.

The GUI way
This is a little tricky cause you can't just use Tools-> Burn Bootloader -> w/ AVR ISP cause the default speed is too big for mega-isp.
Find avrdude.conf that comes with arduino IDE  (in arduino/hardware/tools/avrdude.conf) and change the boundrate for avrisp programmer from 115200 to 19200 (around line 312 )
Find and change in avrdude.conf 
programmer
  id    = "avrisp";
  desc  = "Atmel AVR ISP";
  baudrate = 115200;    # default is 115200
  type  = stk500;
;

to:
programmer
  id    = "avrisp";
  desc  = "Atmel AVR ISP";
  baudrate = 19200;    # default is 115200
  type  = stk500;
;

Now you can use Tools-> Burn Bootloader -> w/ AVR ISP (after you select the proper board from the Tools menu)

Commanline
You can also use the commandline:
Edit arduino/hardware/bootloaders/atmega/Makefile
and change ISPTOOL/PORT/SPEED to:
# enter the parameters for the avrdude isp tool
ISPTOOL    = avrisp
ISPPORT    = /dev/ttyUSB0
ISPSPEED   = -b 19200


no you can write
$ make diecimila_isp
to burn fuses and the bootloader.

Test
Now connect you new arduino to usb and burn the blinky!

Step 7: Troubleshooting

Avrdude errors:
avrdude: ser_open(): can't open device "/dev/ttyUSB0": No such file or directory
You have the wrong port (-P) specified or your arduino isn't connected. check the connection

avrdude: Device signature = 0x000000
avrdude: Yikes!  Invalid device signature.
         Double check connections and try again, or use -F to override
         this check.

This is kind of general error. Your chip isn't recognized.
Check the connection on the board (GND/5V connected to pins ?)
You will get this error when your chip is configured to use an external oscillator and it isnt working (there isn't one or it isn't oscillating properl - 22pf caps missing ?)

Share

    Recommendations

    • Optics Contest

      Optics Contest
    • Make it Glow Contest 2018

      Make it Glow Contest 2018
    • Plastics Contest

      Plastics Contest

    48 Discussions

    0
    None
    fran52

    2 years ago

    Unpack the USBTinyISP firmware.

    from where???

    There is an alternative set of instructions that works if you have an Arduino Uno and want to transform it into an universal programmer for any stand alone AVR. Read this tutorial:

    "Arduino Uno R3 as a true ISP programmer for any Attiny and Atmega AVR"

    see:

    No boot-loader has to be first loaded into your target AVR. You can simply program the Attiny or Atmega micro-controllers, existent on the breadboard, directly with the hex file generated from the source code you wrote (Blink a led, for example).

    0
    None
    KarolisL

    6 years ago on Step 5

    Hi,

    can you help me?
    PC doesnt see my programmer. Everything is ok with wiring. I think i did something bad with firmware burning.

    As i understood i should insert hex from spi folder only or I should compile makefiles in 1 hex from all folder?

    Can u upload hex which you used?

    0
    None
    phenoptix

    6 years ago on Introduction

    Thanks for the ibble! Found it very useful for information programming an ATTiny85 (with slightly different board layout). Steps were largely the same. Cheers!

    0
    None
    carnotricecooker

    6 years ago on Step 5

    Hi kabturek, I'm a little confused on this part. I'm not quite sure through what you're sending the commands to upload firmware onto the ATTINY2313. Are you using the Arduino as an AVR programmer to upload the firmware or are you using a USBTinyISP that you bought to upload it? And after this, don't you still need the hardware support files to upload an Arduino sketch onto the ATTINY2313? Help on this section would be much appreciated.

    0
    None
    jcbed

    7 years ago on Introduction

    for the bit about burning the tiny usb isp chip ummmmm... what pullup didu use if anney and do you have a fritzing image of it or any more info .
    btw great indestrustiabel

    0
    None
    meyer_lanski

    7 years ago on Introduction

    hello,
    Great Instructables, thank you very much for this. very informative. In your poist you mention you could use this method to program attiny13 chips. How do you go about wiring it up? the image you show is an atmega chip i believe which has more pins.

    Sorry for the noob question. This is my first attempt at programming a standalone chip!

    Any help would be appreciated.
    Thank you.

    1 reply
    0
    None
    kabturekmeyer_lanski

    Reply 7 years ago on Introduction

    Hey,
    thanks!
    Look at the attiny13 datasheet:
    http://www.atmel.com/dyn/products/product_card.asp?part_id=3175
    On page 2 you've got te pinout for an atmega. You need these signals :
    13 - SCK
    12 - MISO
    11 - MOSI
    10 - RST (Reset)

    on attiny13 they are on pins::
    SCK is pin 7
    MISO - pin 6
    MOSI - pin 5
    RESET - pin 1
    GND is pin 4 and VCC pin 8
    Connect them like this and you should be ready to go. Look at step 2.

    Hope that helps.

    0
    None
    shanakaplus

    7 years ago on Introduction

    um looking for elevator avr program. Do you have example program ?

    0
    None
    andrew101

    7 years ago on Introduction

    AHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH!!!!11!!!!

    ONE FRIGGIN WIRE!!!!!!!!

    (sorry)

    I spent quite a while at this wondering where i went wrong (followed diagrams to the pin)

    I didn't realize the reset resistor was supposed to be pull up, not pull down. Please fix the diagram.

    Havne't gotten it working (yet) but made progress :)

    2 replies
    0
    None
    kabturekandrew101

    Reply 7 years ago on Introduction

    Really sorry about that, i uploaded the new version some time ago but didnt include it in the instructable.

    Whats your actual problem ?

    0
    None
    andrew101kabturek

    Reply 7 years ago on Introduction

    Well its been fixed now, but the chip was in an eternal state of resetting with a pulldown resistor instead of a pullup one

    I used the method in this video:
    http://www.youtube.com/watch?v=7LskShrK4vQ

    plus I used your tutorial for the actual programmer and stuff.

    0
    None
    dustinandrews

    8 years ago on Step 4

    I wanted to use this to upload to an ATMEGA168p from Windows 7.

    Using a Pro Mini as the programmer and the Ardunio menu option to burn the bootloader I got an error.

    avrdude: Expected signature for ATMEGA168 is 1E 94 06
    Double check chip, or use -F to override this check.

    I had to drop to a dos prompt and run the command by hand. I copied the hex file and conf file into the dir with avrdude to make things easy.

    C:\>avrdude -p m168 -c avrisp -b 19200 -P com4 -F -U flash:w:ATmegaBOOT_168_diecimila.hex

    avrdude: AVR device initialized and ready to accept instructions

    Reading | ################################################## | 100% 0.05s

    avrdude: Device signature = 0x1e940b
    avrdude: Expected signature for ATMEGA168 is 1E 94 06
    avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
    To disable this feature, specify the -D option.
    avrdude: erasing chip
    avrdude: reading input file "ATmegaBOOT_168_diecimila.hex"
    avrdude: input file ATmegaBOOT_168_diecimila.hex auto detected as Intel Hex
    avrdude: writing flash (16294 bytes):

    Writing | ################################################## | 100% 2.50s

    avrdude: 16294 bytes of flash written
    avrdude: verifying flash memory against ATmegaBOOT_168_diecimila.hex:
    avrdude: load data flash data from input file ATmegaBOOT_168_diecimila.hex:
    avrdude: input file ATmegaBOOT_168_diecimila.hex auto detected as Intel Hex
    avrdude: input file ATmegaBOOT_168_diecimila.hex contains 16294 bytes
    avrdude: reading on-chip flash data:

    Reading | ################################################## | 100% 22.43s

    avrdude: verifying ...
    avrdude: 16294 bytes of flash verified

    avrdude: safemode: Fuses OK

    avrdude done. Thank you.

    I still need to test if it worked properly since I only have the pro-mini and some loose 168p chips.

    By the way, I omited the external oscilator. So it's not mandatory for these chips.

    2 replies

    P.S. if you need to burn the fuses on an atmega128 and you are using and external resonator:

    avrdude -p m168 -c avrisp -b 19200 -P com4 -F -U lfuse:w:0xff:m -U hfuse:w:0xdd:m

    If you don't burn any fuses your chip will run at 1mhz. You can tell because 1. The blink program will take 16 seconds to blink the light AND you can't program from the arduino IDE.

    If you burn the wrong fuses, you can ruin your chip until you can get it into a high power (12v) programmer, so be sure before you burn fuses.

    heh, still having problems. You can to burn the lock bits to keep from overwriting the bootload with the sketch. I haven't got that working yet... Moral of the story: atmega169p is $3.30, but problematic with Ardunio, just buy the pre-burned ones for $5.

    0
    None
    Fast Eddy

    8 years ago on Step 4

    I think I may be just being thick but ... I have two ATMEGA8-16PC chips that I want to put a bootloader on. I successfully execute this step (using "m8" instead of "m168") but how do I upload the bootloader correctly. I am confuse (as they say).

    0
    None
    Derin

    8 years ago on Introduction

    In Arduino 0017 the avrdude.conf flie does not have anything like this:
    id    = "avrisp";
      desc  = "Atmel AVR ISP";
      baudrate = 115200;    # default is 115200
      type  = stk500;

    1 reply
    0
    None
    kabturekDerin

    Reply 8 years ago on Introduction

    When i wrote the guide 0017 was the actual version and im sure it was there. search the file for "avrisp"

    0
    None
    esbit

    8 years ago on Step 2

    Hi!

    First of all: Great project :-)

    You said, all we need is the chip, 3 leds and 3 resistors (and the arduino of course).
    I understand the additional 10kΩ resistor to prevent the chip of resetting, but what are the two capacitors at pin 9 and 10 for? Can I omit them? If I need them, what value should I use for the capacitors?

    Bye from Bavaria :-)

    1 reply
    0
    None
    kabturekesbit

    Reply 8 years ago on Step 2

    hey,
    Thanks.
    the two capacitors are 22p for the crystal oscilator. it will probably work without them but its a good design to include them. You do need the 16mhz oscilator if you're going to program the chip on a breadboard.

    If you have a Ceramic oscillator (this one has 3 legs) you don't need them cause ceramic oscilator has them built in.

    the 16mhz oscilator (with the 22p caps) and reset resistor is used on the second soon-to-be arduino (Its the minimal number of needed components on an arduino)