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."
|
|||
|
[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_.
|