Introduction: How to Program a AVR (arduino) With Another Arduino

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:

Step 3: Uploading the Sketch

Download the sketch from mega-isp google code.( 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

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 
  id    = "avrisp";
  desc  = "Atmel AVR ISP";
  baudrate = 115200;    # default is 115200
  type  = stk500;

  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)

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.

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 ?)