Einen blanken ATmega328p in Betrieb nehmen

Da hat man ihn nun vor sich liegen, einen brandneuen ATmega328p. Was braucht ihr nun, damit er auch was sinnvolles tut?

Auf den ATmega müssen 2 Teile Software:

  1. ein Bootloader
  2. ein Sketch

Der Bootloader

Damit der ATmega irgendwelchen Programmcode ausführen kann, muss zuerst ein Bootloader installiert werden. Da gibt es mehrere Möglichkeiten:

  • den internen Taktgeber benutzen
  • einen externen Quarz benutzen
  • einen externen Oszillator benutzen

Abhängig von der gewählten Bootloaderart, müssen die sogenannten Fuses eingestellt werden. Beschreibt man den ATmega mit den falschen Fuses reagiert er unter Umständen nicht mehr und es ist schwierig ihn wiederzubeleben. Ich hab leider auch diese Erfahrung machen müssen.  Weiter unten verlinke ich auf ein paar Seiten, die weitere Hinweise dazu geben. Das werde ich leider auch ausprobieren müssen.

Für mein erstes Projekt, den Universalsensor von Dirk  musste ich den ATmega mit einem Bootloader für den internen Takt beschreiben. Diese Bootloader sind besonders energiesparend und ein ähnlicher wird z.B. auch bei diesem MySensors Projekt  eingesetzt.

Der Universalsensor ist bereits am Laufen und ich hab mich ins nächste Projekt gestützt: Einen MySensor der nur mit 2 AA-Batterien auskommen soll: Slim 2AA Battery Node

Ich habe 3 Varianten des Schreibens ausprobiert:

  1. Mit einem Arduino Uno als ISP
  2. Mit einem Raspberry Pi
  3. Mit einem USBasp Programmer

Alle 3 Varianten nutzen das gleiche Prinzip:

  • MOSI -> PIN 17
  • MISO -> PIN 18
  • SCK -> PIN 19
  • RESET -> PIN 1
  • VCC (5V) -> PIN 7
  • GND -> PIN 8

I

Variante 1: Arduino als ISP

Bootloader_Arduino_Steckplatine

Arduino als ISP

Zum Flashen des Bootloaders wird die Arduino IDE etwas erweitert.

Sucht im Arduino Verzeichnis die Datei boards.txt im Pfad hardware/arduino und öffnet sie und ergänzt folgendes:

##############################################################

apm96.name=APM Optiboot internal 1MHz noBOD 9600baud

apm96.upload.tool=avrdude
apm96.upload.protocol=arduino
apm96.upload.maximum_size=32256
apm96.upload.speed=9600
apm96.bootloader.tool=avrdude
apm96.bootloader.low_fuses=0x62
apm96.bootloader.high_fuses=0xde
apm96.bootloader.extended_fuses=0x07
apm96.bootloader.path=optiboot_v50
apm96.bootloader.file=atmega328_1a.hex
apm96.bootloader.unlock_bits=0x3F
apm96.bootloader.lock_bits=0x2F
apm96.build.mcu=atmega328p
apm96.build.f_cpu=1000000L
apm96.build.core=arduino
apm96.build.variant=standard

##############################################################

Die Zeile

apm96.bootloader.file=atmega328_1a.hex

beschreibt den Namen des Bootloader-Files. Das File und die Fuses (low, high, extendet) müssen zusammen passen.

Die oben genannte Kombination wird z.B. für das MySensors Projekt verwendet. Den Bootloader bekommt ihr aus dem MySensors Forum. Ihr kopiert das hex-File in den bootloader-Ordner im Arduino Verzeichnis.

In der Arduino IDE taucht dann ein neuer Eintrag unter den Boards auf. Danach wird der Arduino (z.B. ein UNO) mit dem Sketch „ArduinoISP“ aus den Beispielen bespielt.

Wählt dann das neue Board „APM Optiboot internal 1MHz noBOD 9600baud“ aus und betätigt: „Bootloader Brennen“ aus dem Werkzeug-Menu.

Hat es geklappt ist der ATmega bereit für den ersten Sketch.

Variante 2: Rasperry Pi und avrdude

Bootloader_Raspberry_Steckplatine.jpg

Rasperry Pi als ISP

Ihr benötigt auf dem Rasperry Pi das commando avrdude. Ich habe die Tools vom Aksin Bootloader dazu benutzt. Da ist avrdude gleich dabei:

cd /home
git clone https://github.com/bullshit/AskSinBootloader_Flash-Tool-RaspberryPi.git

Das Git-Repo enthält avrdude, das auch über die GPIOs des Raspberrys angesprochen werden kann.

cd /home/AskSinBootloader_Flash-Tool-RaspberryPi
bin/avrdude -C bin/avrdude.conf -p atmega328p -P gpio -c gpio

Liefert das Commado ein „avrdude: safemode: Fuses OK“ kann das flashen beginnen.

Ein beherztes:

sudo bin/avrdude -Cbin/avrdude.conf -p m328p -P gpio -c gpio -U lfuse:w:0x62:m -U hfuse:w:0xde:m -U efuse:w:0x07:m -U lock:w:0x2F:m -e -Uflash:w:1443392692398-atmega328_1a.hex:i

sollte dann den neuen Bootloader auf den ATmega schreiben.

Variante 3: USBasp 2.0

Ich hatte mir für ein Bootloader Update eines Arduino Minis bereits einen USBasp  2.0 geholt. Die Verkabelung erfolgt auch hier wieder wie oben beschrieben.

Häufig ist die Belegung des USBasp wie folgt :

1 MOSI      2 5V
3 -         4 GND
5 RESET     6 GND
7 SCK       8 GND
9 MISO     10 GND

Die IDE muss um den Bootloader Eintrag erweitert werden und dann wird mit Programmer -> USBasp der Bootloader gebrannt.

Bootloader mit Fuses zerschossen

Hat man es leider geschafft, dass der ATmega nicht mehr antwortet, gibt es eventuell noch eine Rettung.

Man kann einen externen Quarz oder Oszillator anschliessen und hoffen, dass der ATmega danach wieder reagiert. Bitte schaut auf diese Seiten, wie ihr es bewerkstelligen könnt.

Beide Varianten muss ich noch ausprobieren, da bei mir noch ein ATmega herumliegt, der einen Bypass benötigt.