Arduino ICSP programming header pinout

jwatte's picture

I've been wanting to put the ICSP 6-pin header onto a soldered Arduino circuit.

This is so that I can make "emergency" fixes even if I've removed the Atmega MCU from the USB-powered board I normally use to prototype and program. Also, even if I socket it on the destination board, moving it too many times back and forth risks significant damage to the pins!

However, finding the actual pinout on the Arduino site seemed to be almost impossible. In the end, I found some documentation not on the Arduino site, but in a SparkFun data sheet PDF for the "Arduino Pro" board. The image for this part is here:

arduino icsp header pinout

Note: where it says "3.3V" you really want 5V when using the 16 MHz, 5V version of the MCU.

To reference those signals, tie it to the names of the pins found in this Atmega328 pinout diagram (from the Atmel datasheet PDF):

arduino atmel atmega328 pinout

Pins 17, 18 and 19 are the ones you're looking for (plus 1 for Reset, and power/ground). These translate to digital pins 11, 12 and 13 on the Arduino.

Note that, if you want to support programming while in the circuit, you probably don't want to actually use digital pins 11, 12 and 13 for anything -- the data book warns about "low impedance" loads on those pins. Not only does it depend on the capabilities of your programmer (which may not be able to put out even the 40 mA per pin that the Arduino can), but also on what it does -- you don't want re-programming the chip in place to pulse the control circuit for a mains power relay, say :-)

A low-current LED (say, a 10 mA version with a ~500 Ohm current limiting resistor) is probably about as far as you should take it. Using those pins as inputs for panel buttons that default not-connected with a 47 kOhm pull-down would probably also be a good choice.

I hope this saves someone some time in the future!

arduino-icsp-programming-header-pinout.png8.98 KB
arduino-atmega328-pinout.png36.09 KB