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:
- ein Bootloader
- 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:
- Mit einem Arduino Uno als ISP
- Mit einem Raspberry Pi
- 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
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
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.