Optiboot Bootloader auf ATMega328P flashen

Auf manchen Platinen, die ich für meine Heimautomatisierung einsetze, befindet sich ein ATMega328P Mikrocontroller. Dieser kann entweder über die ISP-Schnittstelle oder deutlich einfacher über die serielle Schnittstelle programmiert werden.

Für die Programmierung über die serielle Schnittstelle muss vorher einmalig ein Bootloader auf den ATMega328P geflasht (programmiert) werden. Ich verwende hier den sehr verbreiteten Optiboot, welcher auch standardmäßig bei fast allen Arduinos zum Einsatz kommt.

Zum Flashen des Bootloaders und gleichzeitigen Setzen der richtigen Fuse- und Lockbits kommt ein Arduino Nano zusammen mit dem Atmega Board Programmer aus den arduino_sketches zum Einsatz.

Verkabelung

Verkabelung

Die Verkabelung zwischen dem Arduino Nano und dem zu flashenden ATMega328P erfolgt wie bereits im Beitrag Arduino als ISP-Programmer und unten in der Tabelle beschrieben.

Am SPI-Bus des ATMega328P sollten beim Flashen möglichst keine weiteren ICs angeschlossen oder aktiv sein, da dies den Flashvorgang stören könnte.

Arduino PinATMega328P Pin
D10Reset
D11MOSI
D12MISO
D13SCK
GNDGND
+5VVCC (nur wenn keine externe Spannung vorhanden)

Atmega Board Programmer

Auf den Arduino Nano muss zunächst der Atmega Board Programmer geflasht werden.

Hierzu laden wir die aktuelle Version direkt aus dem arduino_sketches GitHub Repository herunter und öffnen davon das Verzeichnis Atmega_Board_Programmer in der Arduino IDE. Anschließend öffnen wir den Seriellen Monitor und stellen die Baudrate auf 115200 ein. Nun folgt der Upload des Programms auf den Arduino über den Hochladen-Button.

Atmega Board Programmer in der Arduino IDE

Nach dem erfolgreichen Hochladen sollte dann folgendes im Monitor erscheinen:

Atmega Board Programmer im Seriellen Monitor

Flashen des Bootloaders

Zum Flashen des Bootloaders auf den ATMega328P tippen wir nun U für 16 MHz ein und bestätigen mit Enter. Anschließend folgt ein G zum Programmieren des Bootloaders.

Flashen des Bootloaders

Damit ist der Optiboot Bootloader auf den ATMega328P geflasht und die Fuse- und Lockbits sind automatisch richtig gesetzt.

Überprüfen des Bootloaders

Zum Überprüfen des Bootloaders öffnen wir das Verzeichnis Atmega_Board_Detector aus den arduino_sketches und laden dieses Programm auf den Arduino hoch.

Die Ausgaben im Seriellen Monitor sollten dann wie folgt aussehen:

Ausgaben vom Atmega Board Detector
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
Atmega chip detector.
Written by Nick Gammon.
Version 1.20
Compiled on Aug 20 2019 at 12:44:43 with Arduino IDE 10809.
Attempting to enter ICSP programming mode ...
Entered programming mode OK.
Signature = 0x1E 0x95 0x0F
Processor = ATmega328P
Flash memory size = 32768 bytes.
LFuse = 0xFF
HFuse = 0xDE
EFuse = 0xFD
Lock byte = 0xEF
Clock calibration = 0xBB
Bootloader in use: Yes
EEPROM preserved through erase: No
Watchdog timer always on: No
Bootloader is 512 bytes starting at 7E00

Bootloader:

7E00: 0x11 0x24 0x84 0xB7 0x14 0xBE 0x81 0xFF 0xF0 0xD0 0x85 0xE0 0x80 0x93 0x81 0x00
7E10: 0x82 0xE0 0x80 0x93 0xC0 0x00 0x88 0xE1 0x80 0x93 0xC1 0x00 0x86 0xE0 0x80 0x93
[...]
7FF0: 0xFF 0x27 0x09 0x94 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0x04 0x04

MD5 sum of bootloader = 0xFB 0xF4 0x9B 0x7B 0x59 0x73 0x7F 0x65 0xE8 0xD0 0xF8 0xA5 0x08 0x12 0xE7 0x9F
Bootloader name: optiboot_atmega328

First 256 bytes of program memory:

00: 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF
[...]
F0: 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF

Programming mode off.

Hochladen eines Programms auf den ATMega328P über den Bootloader

Ist der Bootloader auf den ATMega328P geflasht, dann kann ein beliebiges Programm über die serielle Schnittstelle auf den Mikrocontroller hochgeladen werden.

In der Arduino IDE muss dafür als Board dann Arduino/Genuino Uno (ATMega328, 16 Mhz) ausgewählt werden.

Anschließend sollte ein Hochladen über einen USB-TTL-Adapter problemlos funktionieren.