63 lines
3.1 KiB
Markdown
63 lines
3.1 KiB
Markdown
+++
|
||
title = "Standalone Atmega328P guide"
|
||
date = 2022-09-12
|
||
description = "Simple guide to program a standalone Atmega328P using an Arduino."
|
||
insert_anchor_links = "left"
|
||
[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_.
|