Arduino: Atmel-Flash-Station

Endlich mal nicht immer Arduinos verbauen:
Immer wenn ich ein Projekt beinahe abgeschlossen habe, ärgere ich mich, dass wieder mal ein Arduino irgendwo verbaut ist, der Unmengen an Platz verbraucht und eigentlich total unnötig ist. Ein kleinerer Stand-Alone-Controller reicht meistens völlig aus. Zum Prototypen ist die kleine Platine natürlich super, aber wenn alles fertig gebaut ist, dann nimmt das PCB einfach nur enorm viel Platz in der Höhe weg, den man anders hätte nutzen können. Zum Beispiel mit weniger Gehäuse.

Nach etwas Recherche, wie man einen Mikrocontroller mittels Arduino selbst beschreiben kann, ging es direkt zu Conrad, um ein paar Bauteile zu kaufen, die man für das Unterfangen so braucht:

Das stöpselt man dann so auf's Steckbrett:

Wichtig ist vorallem der 10μF Kondensator zwischen Reset und GND. Ohne den war ich nicht in der Lage auch nur einen Controller zu flashen.
Hinweis: Zum Beschreiben des Arduinos, muss der Kondensator jedoch entfernt werden, sonst passiert da nämlich gar nix mehr.

Leider sieht das bei mir in Wirklichkeit immer ziemlich wüst aus und gar nicht so, wie auf der obigen Skizze:

Das Mapping der Ausgänge des Atmegas ist wie folgt:

Nun muss der ISP-Sketch zuerst mal auf den Arduino. Der Sketch ist direkt in den Beispielen unter "Datei -> Beispiele" zu finden:

Das funktioniert wie gewohnt:
Unter "Werkzeuge" die Platine auswählen, den richtigen Port anklicken und hochladen.


Jetzt muss die Arduino IDE angepasst werden, damit der Atmel aus Board auch auswählbar ist.
Dazu öffnet man im Editor seines Vertrauens die boards.txt
Diese Configdatei liegt (logischerweise) im Arduinoverzeichnis unter:

Arduino\hardware\arduino\avr\boards.txt

Anscheinend wurde irgendwann am Parsing der Datei etwas verändert, zumindest funktionierten bei mir etliche Beispiele aus dem Netz nicht (mehr). Nach ein bisschen Rumprobieren und lesen, kam ich zu folgender Config:

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

atmegasa16.name=ATmega328P Stand Alone (Arduino as ISP)

atmegasa16.vid.0=0x2341
atmegasa16.pid.0=0x0043
atmegasa16.vid.1=0x2341
atmegasa16.pid.1=0x0001
atmegasa16.vid.2=0x2A03
atmegasa16.pid.2=0x0043

atmegasa16.upload.tool=avrdude
atmegasa16.upload.protocol=stk500
atmegasa16.upload.maximum_size=32768
atmegasa16.upload.maximum_data_size=2048
atmegasa16.upload.speed=115200

atmegasa16.bootloader.tool=avrdude
atmegasa16.bootloader.low_fuses=0xFF
atmegasa16.bootloader.high_fuses=0XDF
atmegasa16.bootloader.extended_fuses=0x05
atmegasa16.bootloader.unlock_bits=0x3F
atmegasa16.bootloader.lock_bits=0x0F
atmegasa16.bootloader.file=optiboot/optiboot_atmega328.hex

atmegasa16.build.mcu=atmega328p
atmegasa16.build.f_cpu=16000000L
atmegasa16.build.board=AVR_UNO
atmegasa16.build.core=arduino
atmegasa16.build.variant=standard

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

Dies fügt man am Ende der Config ein und speichert diese. Dannach muss die Arduino IDE neugestartet werden, um die Änderungen auch sehen zu können.
Nun taucht der Atmega, als neuer Eintrag, in der Platinenauswahl auf:

Nachdem der Atmega in der Auswahl angeklickt wurde, stellt man nun auch den Programmer auf "ISP" um:

Als nächstes muss nun der Bootloader auf den Atmega geschrieben werden. Dazu genügt ein Klick auf "Bootloader brennen" im Menü "Werkzeuge".
Eigentlich wird da gar kein richtiger Bootloader gebrannt, sondern lediglich die Fuses und die Taktrate gesetzt:

Fertig. Nun kannst du deine Sketches auf den Atmel flashen. Am besten nutzt man dazu allerdings den Punkt "Hochladen mit Programmer" im Reiter "Datei":

Hinweis: Die grüne LED leuchtet im Heartbeat; Orange als TX/RX-Anzeige beim Beschreiben und Rot im Fehlerfall.


ATtiny flashen
Den Atmega zu flashen funktioniert ja nun schonmal. Manchmal macht es aber keinen Sinn, so ein riesen Viech zu nutzen; beispielsweise, wenn man nur eine LED an/aus schalten will, oder lediglich einen Sensor auslesen möchte. Da eignen sich die kleineren Atmels viel besser:
Sie sind zwar langsamer und haben nur fünf Pinouts, sind dafür aber auch kleiner und billiger.
Um jetzt beispielsweise einen ATtiny beschreiben zu können steckt man ein paar Kabel auf'm Steckbrett um:

Die Pins des ATtiny-85 sind wie folgt angeordnet:

Will man den ATtiny zusätzlich mit einem externen Quarz betreiben, dann werden dafür die Pins 2 und 3 genutzt (zwischen Reset und Ground).
Das Flashen mittels Arduino IDE ist hier etwas "komplizierter" als mit dem Atmega. Aber auch kein Hexenwerk:
Unter "Datei -> Voreinstellungen" fügt man am Ende des Textfeldes "Additional Boards Manager URLs" folgende URL hinzu/ein:

https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json

Sollte da bereits eine URL hinterlegt sein, dann trennt man die Adressen mittels Komma.

Nun wechselt man zu "Werkzeuge -> Platine -> Boards Manager" und sucht hier nach attiny. Das Paket installiert man und startet die IDE einmal durch. Nun ist der Attiny ebenfalls in der Platinenübersicht auswählbar:

Sobald der ATtiny angeklickt ist, muss im neuen Menüpunkt noch ausgewählt werden, welchen ATtiny-Typen man nun im speziellen beschreiben will.
Im Grunde beginnt nun das gleiche Spiel:
Bootloader drauf brennen und von nun an den Arduino als ISP-Programmer nutzen.



Weil ich das Zeugs nicht so auf'm Steckbrett lassen wollte, hab ich dann alles noch auf Lochraster gelötet und das Ganze in einem schwarzem, kleinem Gehäuse versteckt:

Die Dateien zum Drucken des Gehäuses, findest du auf Thingiverse.

Je nachdem welchen Controller man beschreiben will, steckt man das Flachbandkabel um:
Die mittlere Buchse ist zum Flashen des Atmegas gedacht, die obere Buchse, logischerweise für den ATtiny.
Zusätzlich ist der Quarz austauschbar, je nachdem ob man mit oder ohne Quarz beschreiben will. Hier noch ein Einblick in meine krassen Lötkünste:



Und weil ich mal wieder ein bisschen Bock drauf hatte, gibt's von dieser Bastelei auch Video: