en – fr eo

Standalone Atmega328P guide

electronics, Arduino

This guide describes how to burn a program into an Atmega328P microcontroller, using an Arduino board as programmer and an external 16MHz oscillator. It's the result of the frustration that every single time I wanted to to this, it was a struggle because I couldn't find any complete tutorial. At least, the following works for me.

Materials needed


If you don't have any 22pF capacitor, you can salvage some capacitors from an old device (e.g. there are plenty in videotape readers). Unfortunately through-hole capacitors with this value look pretty rare, so you may need to salvage a bunch of unmarked surface-mounted ones and build a simple Arduino-based capacitance meter to find the wanted ones.


Circuit for programming the Atmega using an Arduino.

Check Atmega328P's pinout in the datasheet.

Triple-check the wiring. MOSI goes on MOSI and MISO goes on MISO, they are not swapped.

For normal operation

The following connections are only needed when the microcontroller is disconnected from the Arduino.


I'm using the Arduino IDE.

First, we program the Arduino board to make it operating as a relay between the computer and the microcontroller:

  1. Open the example sketch ArduinoISP.
  2. If using an Arduino Uno, uncomment the line #define USE_OLD_STYLE_WIRING.
  3. Choose your programmer board as board type (Arduino Micro in my case).
  4. Choose a regular programmer (typically AVR ISP).
  5. Upload the sketch normally.

Now we can program the microcontroller:

  1. Open the wanted sketch. (or start with the Blink example)
  2. Choose Arduino Uno as board type. (even if you're using another board as a programmer; it's because a standalone Atmega328P with a 16MHz oscillator behaves like an Arduino Uno)
  3. Choose Arduino as ISP as programmer.
  4. If your microcontroller doesn't contain a bootloader yet, upload the bootloader using Tools -> Burn bootloader.
  5. Upload the sketch using Sketch -> Upload using programmer.