+++ title = "Standalone Atmega328P guide" date = 2022-09-12 description = "Simple guide to program a standalone Atmega328P using an Arduino." [taxonomies] tags = ["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 * Atmega328P (the P matters) * Arduino board (I used an Arduino Micro) * 16MHz oscillator * 2× 22pF capacitors * 10kΩ resistor * 100µF capacitor ### Notes 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](https://www.instructables.com/Capacitance-Meter/) to find the wanted ones. ## Circuit {{ float_img(alt="Circuit for programming the Atmega using an Arduino.", src="circuit.png", style="max-height:100vh;max-width:100%;") }} Check Atmega328P's pinout [in the datasheet](atmega328p.pdf). * Connect the MOSI, MISO, SCK(=SCLK) pins on the Arduino to the corresponding ones on the Atmega. (on Arduino Uno, they are respectively on pins 11, 12, 13) * Connect Arduino pin 10 to Atmega's Reset pin. * Connect each pin on the oscillator to the XTAL/TOSC pins on the Atmega, and place a 22pF capacitor between each of these two pins and the GND. * Connect the GNDs together. Connect Atmega's VCC, Atmega's AVCC and Arduino's +5V together. 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. * Place a pull-up resistor on the Reset pin (10kΩ resistor between Reset and VCC). * Place a 100µF capacitor between GND and VCC. * The oscillator and ceramic capacitors are still needed. * VCC and AVCC still have to be connected. ## Program 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`. 1. If using an Arduino Uno, uncomment the line `#define USE_OLD_STYLE_WIRING`. 1. Choose your programmer board as board type (_Arduino Micro_ in my case). 1. Choose a regular programmer (typically _AVR ISP_). 1. Upload the sketch normally. Now we can program the microcontroller: 1. Open the wanted sketch. (or start with the `Blink` example) 1. 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) 1. Choose _Arduino as ISP_ as programmer. 1. If your microcontroller doesn't contain a bootloader yet, upload the bootloader using _Tools -> Burn bootloader_. 1. Upload the sketch using _Sketch -> Upload using programmer_.