Microcontroller flashen: Arduino Uno als In-System-Programmer
Seite 2: Fremdgänger
Für die Steuerung von MISO, MOSI und SCK dienen beim Arduino UNO die Pins 11, 12 und 13, den RST-Eingang des Mikrocontrollers steuert Pin 10. Die klassische Belegung eines sechspoligen ISP-Wannensteckers zum Programmieren eines AVR-Controllers in einer fertigen Schaltung ist im Bild rechts zu sehen. Auf einem Steckbrett würde die Verkabelung wie auf dem Bild darunter aussehen.
Der unter dem Menüpunkt Beispiele verfügbare Sketch ArduinoISP steuert die Pins gemäß der Spezifizierung von Atmel. Der Sketch wird über die normale Upload-Funktion auf den Arduino gebracht. Beim Arduino Uno muss man für die weiteren Schritte einen Kondensator (Elko mit 10µF) zwischen GND und Reset legen. Er fängt den Reset-Impuls (Low) ab, den der USB-Seriell-Wandler auf dem Board des Arduino Uno beim Starten der seriellen Kommunikation sendet. Der Reset-Impuls führt nämlich dazu, dass der Mikrocontroller auf dem Arduino-Board seinen Bootloader zur Neuprogrammierung startet, statt den Arduino-Sketch zu starten.
Das Arduino-Board arbeitet jetzt selbst als Programmer. Wie kommen damit nun die eigenen Programme auf einen neu zu flashenden Controller? Praktischerweise unterstützt die Arduino-IDE selbst die Ansteuerung eines als ISP-Programmer arbeitenden Arduinos. Unter dem Menüpunkt Tools wählt man als Programmer "ArduinoISP" aus. Um einen übersetzten Sketch über den ArduinoISP-Programmer zu übertragen, muss man vor dem Klick auf den Upload-Button zusätzlich die Shift-Taste drücken.
Leider funktioniert dieser einfache Weg nur mit Programmen, die man innerhalb der Arduino-IDE erstellt hat. Mit anderen Compilern oder IDEs erstellte Binär-Dateien (in der Regel Hex-Dateien) lassen sich nicht über die Upload-Funktion der Arduino-IDE auf einen Controller hochladen. Dafür bietet sich das Open-Source-Tool Avrdude an. Es ist ein Werkzeug für die Befehlszeile.
Mit dem Befehl
avrdude -c avrisp -p atmega8 -P COM5 -b 19200 -U flash:w:main.hex
schreibt (:w) man die Hex-Datei main.hex via ArduinoISP (-c avrisp) am (virtuellen) COM-Port 5 in den Programm-Speicher (-U flash) eines ATmega8. Avrdude prüft den Erfolg des Vorgangs, indem er den Speicher anschließend ausliest und mit der vorgegebenen HEX-Datei vergleicht. Möchte man Werte aus der Datei eeprom.hex in den EEPROM schreiben, gibt man als Parameter -U eeprom:w:eeprom.hex an.
Mit der simplen Beschaltung wie im Bild oben funktioniert es freilich nur, wenn der ATmega frisch aus dem Regal stammt. Dann nämlich sind seine sogenannten Fuses auf eine interne Takterzeugung eingestellt und der Mikrocontroller beginnt, beim Anlegen der Versorgungsspannung zu arbeiten. Ansonsten muss man keine weiteren Einstellungen ändern oder Fuses aktivieren.
Ist der Controller jedoch bereits für einen Quarz oder eine externe Taktquelle eingestellt, muss man diese zusätzlich zur Verfügung stellen. Die Beschaltung mit einem Quarz ist im Bild rechts zu sehen. Auch wenn die eingestellte Taktrate von 1 MHz nicht ausreicht, muss man Hand anlegen. Dazu muss man sich allerdings mit den Fuses auskennen.
Tipp
Der Leonardo lässt sich auf ähnliche Weise zum Programmer umfunktionieren. Allerdings muss man dazu andere Pins auf dem Board verkabeln und den Sketch ArduinoISP anpassen. Im Netz gibt es eine Anleitung, die zusätzlich zeigt, wie man ATTinys in die Arduino-IDE einbindet.