I have been using the bit-banging method to boot-load ATmega328p with Arduino bootloader for a while, and Kimo’s method worked quite well for me. If you need to flash a lot of chips however, you might not want to swap out the chip on your Arduino board every single time you need to flash another chip as you do not want to accidentally damage the socket (or the board) in the process. After all, the DIP socket is not designed for this kind of repetitive use.

So, I decided to make a separate ICSP board just for programming ATmega328p. The concept is quite simple, as you can see in the schematics below it basically is a bare bone ATmega328 board with a reset button and ICSP headers. I added an LED to pin 19 (Arduino pin 13) so that if the boot loader is flashed successfully, the LED will blink just as would on an Arduino board. The LED will also serve as an indicator during flashing.

ATmega328p ICSP Board
ATmega328p ICSP Board

The following is the board with the ICSP header based on the schematics shown above. This board is not just limited to burning Arduino boot loader or other Arduino programs though, it can serve as a standard template for any ATmega328 based system you build. Ideally, you probably want to replace the standard DIP socket with a ZIF socket so that it is more suitable to be used as a programmer board.

ATmega328 ICSP Board
ATmega328 ICSP Board

Here is a picture taken while I was testing flashing boot loader with the bit-banging method. Since I kept the ICSP header pin layout the same as on the Arduino board, I can use the same cable as I used before. You can find more details on how to make the cable and here.

Testing the ICSP board
Testing the ICSP board

I decided to add voltage regulation circuitry so that I can use different power sources. The finished ICSP board with case is shown below:

Finished ATmega328 ICSP Board
Finished ATmega328 ICSP Board

Here’s another picture of the ICSP board in action:

Finished ATmega328 ICSP Board
Finished ATmega328 ICSP Board

And of course, you can also use a regular programmer to program chips on this ICSP board as well.

Be Sociable, Share!

9 Thoughts on “An Arduino ICSP Board”

  • Hi, I’m trying to program an ATmega8515 with my arduino. Do you know if this method would work? I have an Uno R2 and a Diecimila. thanks.

    • It should (I haven’t tried it though) as we are using the FT232’s built-in bit-banging capability here so as long as the target chip (in your case ATmega8515) supports ICSP it should work. Why not give it a try and let me know how it goes?

      • hi, thanks for the reply. I got it to work using kimo’s method, which is a huge relief ’cause none of the official Arduino tutorials were successful.

    • The short answer is yes. All this is doing is to use the ICSP headers to program the ATMega328p. So you can use it to program pretty much any Arduino chips (not just limited to ATMega328p).

  • Hi,
    Thanks for your page on making your own Arduino ICSP Programming Board.
    I want to build this with a ZIF socket. I have an Arduino UNO R3 and it has two sets of 6 pins:
    A) The one nearest the Reset button (ICSP for USB Interface) and
    B) The one nearest pin 1 of the ATMega328 chip (ICSP for ATMega328).

    Can I connect a cable from either of these to the 6 pins on your Programming Board? If so which pins go to which?
    If not, can you tell me how to connect my Arduino to the Programming Board to upload scripts?
    The link in your page ‘here’ (for making the cable) no longer links to the original page and what it links to now is not clear and does not match my Arduino.
    Thanks Chris

    • Hi Chris,

      This ICSP works by utilizing the FT232RL chip on the original Arduino Duemilanove. Unfortunately, the latest Arduino board no long uses RT232RL for the USB/Serial interface so you cannot use it as a programmer using the same method anymore. That said, you can take a look at http://arduino.cc/en/Tutorial/ArduinoISP at how to use the standard Arduino board as a programmer.

Leave a Reply

Your email address will not be published. Required fields are marked *