Bootloader brennen

Während der Blogartikel „Den MicroController überwachen“ entstand und dafür anfänglich der Nano V3.0 genutzt wurde, kam schnell bei den Beispielcodes für den Watchdog Frustration auf. Da der verwendete Nano älter als 5 Jahre war, kam es beim Entwickeln der Watchdog-Beispiele zu einem im Blogbeitrag beschriebenen Problem. Das Problem führte dazu, dass der Watchdog während dem Starten vom Nano V3.0 in einer Startschleife hängen blieb. Was war also nun zu tun? Die Antwort darauf war, dass der Bootloader auf den Nano V3.0 neu installiert, man sagt „gebrannt“, werden musste.

Es ist möglich, einen Nano V3.0 mit einem neuen Bootlader auszustatten, ohne einen ISP-Programmer besitzen zu müssen. Wie das geht, was Sie dazu brauchen und was es ggf. noch für interessante Informationen gibt, erfahren Sie in diesem Blogbeitrag.

Benötigte Hardware

Damit Sie ihren Nano V3 mit einem neuen Bootloader brennen können, benötigen Sie folgende Materialien, siehe Tabelle 1.

Anzahl Bauteil Anmerkung
2 Mikrocontroller Board (mit USB-Kabel), kompatibel mit Arduino Uno R3 (empfohlen) oder Nano V3.0 mit Atmega328 CH340! 100% Arduino kompatibel mit Nano V3
1 Das passende USB-Programmierkabel für Pos 1
1 Jumper Wire „Female to female“
1 OPTIONAL
Breadboard Kit mit 3 x Jumper Wire

Tabelle 1: Benötigte Materialien

Behalten Sie bitte im Hinterkopf, dass Sie zwei Mikrocontroller Boards brauchen! Einmal das Mikrocontroller Board, das mit einem Bootloader geflasht werden soll, das sogenannte Target, und das Mikrocontroller Board, das als Programmer dient. Diese Begriffe werden nachfolgend für beide Mikrocontroller Boards genutzt. 

Die Software

Für diesen Blogteil benötigen Sie lediglich eine Arduino IDE, welche Sie von der Arduino-Homepage bekommen. Bitte achten Sie darauf, dass Sie die Arduino IDE herunterladen und nicht die Web Editor – Version starten. Letzteres kann zwar den Code für den Nano V3.0, der ISP-Programmer werden soll, hochladen, aber nicht den Bootloader flashen.

Vorwort, bevor es zum Aufbau kommt

In diesem Blogbeitrag wird davon ausgegangen, dass ein Mikrocontroller Board als Programmer und ein Nano V3.0 als Target genutzt werden. Programmer bedeutet in diesem Fall, dass der Mikrocontroller die Aufgabe übernimmt, die Kommunikation zum Ziel, im englischen auch Target genannt, aufbaut und den Bootloader danach flasht. Natürlich können Sie auch jede andere Kombination nutzen, z.B. kann auch ein Nano V3.0 als Programmer für ein Mega 2560 R3 Board als Target verwendet werden. In vielen englischen Foren wird aber empfohlen, das Mikrocontroller Board als Programmer einzusetzen.

Den Bootloader flashen

Bevor Sie den Bootloader auf ein Target brennen können, braucht der Mikrocontroller erst einmal den passenden Programmcode. Dieser wird praktischerweise bei der Installation der Arduino IDE gleich mitgeliefert. Schließen Sie daher den Mikrocontroller an Ihren PC an und öffnen Sie unter Datei -> Beispiele -> 11.ArduinoICP -> ArduinoISP, siehe Abbildung 1, den Sketch.

Abbildung 1: Öffnen vom Sketch ArduinoISP

Haben Sie die aktuellste Version der Arduino IDE, beim Erstellen des Blogbeitrags war dies die Version 1.8.13, werden der angeschlossene Mikrocontroller und der zugehörige COM-Port automatisch erkannt. Laden Sie daher den Sketch direkt auf den Programmer hoch, indem Sie entweder im Menü Sketch -> Hochladen oder die Tastenkombination Strg +U oder die Funktionstaste, siehe Abbildung 2 rote Umrandung, nutzen.

Abbildung 2: Sketch auf Mikrocontroller hochladen

Damit ist der Mikrocontroller zu einem ISP-Programmer geworden. Den Quellcode können Sie sich gerne einmal ansehen; interessant ist der Ausschnitt, den Sie in Code 1 sehen.

// Configure which pins to use:

// The standard pin configuration.
#ifndef ARDUINO_HOODLOADER2

#define RESET 10 // Use pin 10 to reset the target rather than SS
#define LED_HB 9
#define LED_ERR 8
#define LED_PMODE 7

// Uncomment following line to use the old Uno style wiring
// (using pin 11, 12 and 13 instead of the SPI header) on Leonardo, Due...

// #define USE_OLD_STYLE_WIRING

#ifdef USE_OLD_STYLE_WIRING

#define PIN_MOSI 11
#define PIN_MISO 12
#define PIN_SCK 13

#endif

// HOODLOADER2 means running sketches on the ATmega16U2 serial converter chips
// on Uno or Mega boards. We must use pins that are broken out:
#else

#define RESET 4
#define LED_HB 7
#define LED_ERR 6
#define LED_PMODE 5

#endif

// By default, use hardware SPI pins:
#ifndef PIN_MOSI
#define PIN_MOSI MOSI
#endif

#ifndef PIN_MISO
#define PIN_MISO MISO
#endif

#ifndef PIN_SCK
#define PIN_SCK SCK
#endif

// Force bitbanged SPI if not using the hardware SPI pins:
#if (PIN_MISO != MISO) || (PIN_MOSI != MOSI) || (PIN_SCK != SCK)
#undef USE_HARDWARE_SPI
#endif

 Code 1: Pinbelegung um Code

An dieser Stelle wird festgelegt, welche Pins für die Programmer genutzt werden, damit dieser als ISP-Programmer funktionieren kann. Damit das klappt, braucht es immer die Pins: 

  • 5V (Spannungsversorgung)
  • GND (Spannungsversorgung)
  • Reset (Reset vom Target)
  • MOSI (Kommunikation)
  • MISO (Kommunikation)
  • SCK (Serielle Uhr)

Nachdem das Hochladen auf den Programmer abgeschlossen ist, trennen Sie die USB-Verbindung zum PC und schließen Sie das Target wie in Abbildung 3 gezeigt an.

Abbildung 3: Programmer und Target verbinden

Möglich ist auch der Anschluss über die Pins mit der Beschriftung ICSP, dazu benötigen Sie jedoch das genaue Pinout , welches Sie für den Mikrocontroller unter dem Link https://content.arduino.cc/assets/Pinout-UNOrev3_latest.pdf und für den hier verwendeten Nano V3.0 unter dem Link https://content.arduino.cc/assets/Pinout-NANO_latest.pdf finden. Der sicherere Weg ist aber tatsächlich der Anschluss über die Funktions- bzw. Digitalpins der Boards. In manchen Fällen ist ein 10µF-Kondensator zwischen dem RESET- und GND-Pin notwendig, siehe Abbildung 4.

Abbildung 4: Programmer und Target verbinden mit Kondensator

Nun muss in der Arduino IDE noch bekannt gegeben werden, dass der Mikrocontroller ein ISP-Programmer ist. Wählen Sie dazu in der Menüleiste Werkzeuge -> Programmer -> Arduino as ISP aus, siehe Abbildung 5.

Abbildung 5: Mikrocontroller in der Arduino IDE als ISP-Programmer bekannt machen

Im letzten Schritt wählen Sie den Boardtyp vom Target aus. Hierzu navigieren Sie in der Menüleiste zu Werkzeuge -> Board -> Arduino AVR Boards -> Arduino Nano, siehe Abbildung 6.

Abbildung 6: Wähle Boardtyp vom Target

Gerade bei dem Nano V3.0 und z.B. dem Mega 2560 R3 Board kann es sein, dass Sie noch den korrekten Prozessor auswählen müssen, siehe Abbildung 7.

Abbildung 7: Passenden Prozessor für Target auswählen

Nun schließen Sie wieder den Programmer mit dem USB-Kabel an dem PC an. Sie werden feststellen, dass beide Mikrocontroller nun Spannung haben, was daran liegt, dass der Programmer das Target über die Pins 5V und GND entsprechend mitversorgt. Wählen Sie nun in der Werkzeugleiste Werkzeuge -> Bootloader brennen aus, siehe Abbildung 8.

Abbildung 8: Bootloader brennen

In der Arduino IDE werden Sie nun, je nach Voreinstellung, diverse Ausgabe sehen. Gleichzeitig sehen Sie, dass beim Programmer während dem Brennvorgang die LEDs RX und TX flackern und auch die eingebaute LED vom Target flackert. Auf jeden Fall sollten die letzten Meldungen wie in Abbildung 9 gezeigt aussehen.

Abbildung 9: Meldung in der Arduino IDE für Erfolg

Danach ist das Target, der Nano V3.0, fertig und sollte wieder laufen. Testen können Sie das, indem Sie z.B. das Beispiel-Sketch „Blink“ auf den Nano V3.0 laden. Sollte, trotz Erfolgsmeldung beim Brennen des Bootloaders, der Nano V3.0 nicht programmierbar sein, prüfen Sie noch einmal die Einstellungen vom Target und brennen den Bootloader erneut.

Weitere Informationen

Optiboot-Bootloader

Wer im Internet nach Informationen über den Bootloader für die Mikrocontroller-Boards sucht, der wird schnell über das Projekt optiboot stolpern. Hierbei handelt es sich für die gängigsten Mikrocontroller-Boards mit ATmega-Chipsatz um eine verbesserte Bootloadervariante. Dieser ist ebenfalls, wie beim Mikrocontroller Board, nur 0,5kByte groß.

Die Versprechen sind aber weitaus höher als bei Arduino. Bei optiboot ist die Rede davon, dass mehr Speicher auf allen Boards kompatibel mit Arduino verfügbar sein soll, dass Sketche schneller hochgeladen werden können und gerade höhere Baudraten stabiler laufen sollen. Sucht man ein bisschen weiter, stellt man fest, dass Teile von optiboot anscheinend in die offiziellen Bootloader eingeflossen sind.

Um einen optiboot-Bootloader auf den Arduino zu brennen, brauchen Sie zunächst die passende URL für eine zusätzliche Boardkonfiguration, die Sie in den Arduino IDE Voreinstellungen eintragen müssen. Die URL finden Sie unter der Adresse https://github.com/Optiboot/optiboot/releases, siehe Abbildung 10.

Abbildung 10: Optiboot-Adresse kopieren

Die Adresse fügen Sie in der Arduino IDE unter Datei -> Vorsteinstellungen wie in Abbildung 11 hinzu.

Abbildung 11: Optiboot-URL der Arduino IDE hinzufügen

Bestätigen Sie alles mit OK und installieren Sie dann über Werkzeuge -> Board -> „Boardverwaltung…“ die Boardbibliothek Optiboot, siehe Abbildung 12.

Abbildung 12: Installiere Optiboot-Boardbibliothek

Danach können Sie z.B. für den Nano V3.0, das Board „Optiboot on 28-pin cpus“ auswählen, siehe Abbildung 13, und wie schon im Hauptteil dieses Artikels erläutert, den Optiboot-Bootloader über den Mikrocontroller auf den Nano V3.0 brennen.

Abbildung 13: Passendes Optiboot-Board für Nano V3.0 suchen

Sollten Sie zu einem späteren Zeitpunkt wieder einen anderen Bootloader auf Ihr Target brennen wollen, ist das jederzeit möglich.

Weitere Bootloader

Optiboot ist nicht der einzige Dritthersteller von Bootloader für die Arduino-Produktfamilie. Es gibt noch einige mehr, die unter https://playground.arduino.cc/Main/ArduinoCoreHardware/#Bootloader einsehbar sind. Da an dieser Stelle nicht alle getestet werde können, können Sie sich einen Eindruck der Möglichkeiten machen. Der Brennvorgang dürfte in den meisten Fällen identisch zu der hier vorgestellten Variante sein.

Das Pinout der beliebtesten Arduino-Boards

Wie bereits erwähnt, soll hier noch nicht Schluss sein, sondern noch weitere Informationen folgen. Zunächst einmal, damit Sie nicht jedes Datenblatt vom Arduino durcharbeiten müssen, soll Ihnen Tabelle 2 helfen, die richtigen Pins auf den Boards zu finden. Dabei geht die Tabelle auf die beliebtesten Boards ein.

Funktion Arduino Uno Arduino Nano Arduino Micro Arduino Mega 2560 Arduino Due
MOSI Digitalpin 11 Digitalpin 11 Digitalpin 16 Digitalpin 11 Digitalpin 11
MISO Digitalpin 12 Digitalpin 12 Digitalpin 14 Digitalpin 12 Digitalpin 12
SCK Digitalpin 13 Digitalpin 13 Digitalpin 15 Digitalpin 13 Digitalpin 13

Tabelle 2: Arduino Pin-Funktionsübersicht

Unter https://store.arduino.cc/arduino-genuino/boards-modules können Sie die gesamte Arduino-Boards einsehen. Hier können Sie zu jedem Board die technischen Spezifikationen und die Dokumentation einsehen. Interessant für Sie ist bei der Dokumentation, dass Sie direkt unter dem Pinout-Bild eine PDF-Datei mit dem Pinout der letzten bekannten Revision vom Board runterladen können, siehe Abbildung 10 rote Umrandung.

Abbildung 14: Pinout-PDF letzter Boardrevision einsehen

Aktueller Stand der Bootloader

Nach aktuellem Stand ist das letzte Update eines Bootloaders mittlerweile 5 Jahre her, siehe https://github.com/arduino/ArduinoCore-avr/tree/master/bootloaders. Jedoch kann es sein, dass mit einer neueren Arduino IDE – Version auch ein neuer Bootloader kommen könnte. Erfahren können Sie das nur, wenn Sie ab und an die oben genannte Repository-Adresse kontrollieren.

Der Nano V3.0 mit dem Mikrocontroller Board Bootloader

Der Nano V3.0 kann auch mit dem Mikrocontroller Board gebrannt werden. Das liegt daran, dass das Pinout und die jeweiligen Funktionen fast identisch sind. Während der Bootloader vom Nano V3.0 aktuell 2kByte groß ist, ist der Bootloader vom Mikrocontroller Board gerade mal 0,5kByte groß ist. Gerade beim Nano V3.0, der nur 32kByte Speicher besitzt, könne Sie 1,5kByte mehr Speicher für Ihre Programme herausholen. Gleichzeitig hat der Bootloader vom Nano V3.0 auch einige ungefixte Bugs, die es aber in den Bootloader des Mikrocontroller Boards geschafft haben.

Gerade der Bug mit dem Watchdog bei niedrigen Watchdog-Zeiten sei hier zu nennen. Die Kehrseite beim Brennen vom Mikrocontroller Board Bootloader auf den Nano V3.0 ist, dass Sie bei der Auswahl vom Board in der Arduino IDE nicht mehr den Nano V3.0 auswählen dürfen, sondern das Mikrocontroller Board! Sie sollten daher den Nano V3.0 , mit geflashtem Mikrocontroller Board, entsprechend markieren.

Der richtige Programmer für die Entwicklung

Sie haben beim Flashen vom Bootloader den Programmer umgeschaltet. Der eingestellte „Arduino as ISP“ kann für das Hochladen eigener Sketche nicht weiterverwendet werden. Damit die wieder Ihren Code auf ihr Board laden können, müssen Sie wieder den Programmer umstellen auf „AVRISP mkII“, siehe Abbildung 11.

Abbildung 15: Programmer für Entwicklung auswählen

Weitere Projekte für AZ-Delivery von mir finden Sie unter https://github.com/M3taKn1ght/Blog-Repo.

10 Kommentare

St.Schulz

St.Schulz

Viele Dank für den prima Beitrag! Ich konnte damit einen Arduino Nano retten, der sich über die Arduino-IDE nicht mehr programmieren ließ. Er war durch ein schlecht geschriebenen Sketch nicht mehr ansprechbar. Der Bootloader hat ihn wieder in den Ursprungszustand versetzt.

Jörn Weise

Jörn Weise

Hallo Herr Drews,
gerade meine Beiträge können Sie auf meiner GitHub-Seite noch einmal als PDF runterladen. Die Bilder und der Quellcode sind ebenfalls alle noch einmal einzeln einsehbar.
Wenn Sie Fritzing benutzen (wollen), so habe ich auch die entsprechenden Fritzing-Dateien abgelegt. Damit sollen Sie im Grunde alles haben, was Sie für die Umsetzung meiner Projekte brauchen.

Hallo Herr Treichel,
im Grunde wusste ich das, da der Target-Nano schon relativ alt war. Der neue Bootloader hat nicht funktioniert, was ggf. an dem Chip selbst liegt. So genau kenne ich aber die Unterschiede der Bootloader-Versionen leider nicht, um da eine Qualifizierte Antwort zu geben,

Mit freundlichen Grüßen
Jörn Weise

Jörn Weise

Jörn Weise

Hallo Bent,
gerade ist mein Blogbeitrag auch via GitHub einsehbar, daher habe ich Ihre bitte gleich mit einfließen lassen und eine Grafik für ausschließlich Nanos erstellt: https://github.com/M3taKn1ght/Blog-Repo/blob/master/Flash_Bootloader_arduino/images/Nano_as_programmer_and_target.png
Damit sollte dann auch klar sein, wie Sie zwei Nanos miteinander verdrahten müssen. Die Abläufe sind identisch, da habe Sie vollkommen recht.
Hallo Herr Peter,
im Grunde schreibe ich vor dem Code1, dass hier die Konfiguration für die Pins ist. Sie selbst müssen da nichts ändern, da Sie ja Arduino-Hardware nutzen. Ihre zweite Frage wird auch direkt mit dem Text vor der Abbildung 7 erklärt. In diesem Fall wusste ich, dass ich den alten Bootloader brauche, da der verwendete Arduino Nano mit diesem ausgeliefert wurde und auch nur mit diesem ging. Manchmal kriegt man das auch nur über das try-and-error-Prinzip heraus.
Schönen Abend noch
Jörn Weise

Oliver Treichel

Oliver Treichel

Hallo,

mich würde auch interessieren, warum beim Nano der “Old Bootloader” ab Werk verwendet wird und was der Unterschied zum “normalen” Bootloader ist. Hat dieser irgendwelche Vorteile gegenüber dem Old Bootloader?

Lars Drews

Lars Drews

Hallo liebe AZ-Blogbetreiber,
den AZ-Blog verfolge ich nun schon sehr lange und finde die Ideen immer toll und teilweise auch für mich nachbaufähig.
Neuerdings habe ich Probleme mir die Blog-Beiträge oder Abschnitte daraus in eine Word-Datei zu kopieren, einwenig zu bearbeiten und für meine speziellen Zwecke auszudrucken bzw. abzuspeichern.
Oft sind die Bilder aber auch sehr groß und zeigen eigentlich nichts Wesentliches für den Beitrag. Da ist Verkleinern ein gutes Mittel zum Papier-Sparen. Zum Ausprobieren usw. sind Ausdrucke einfach praktischer.
Der Grund liegt am veränderten Handling der Bilder im Blog. In der Word-Datei sehe ich nur noch kleine leere Rechtecke.
Wenn das so gewollt ist (wegen Bild-Rechten / Kopierschutz etc.), dann wäre eine Bereitstellung der Blogbeiträge als PDF ganz toll, die kann man dann zumintestens teilweise selektiv drucken.

Mit freundlichen Grüßen
L. Drews

Jörn Weise

Jörn Weise

Hallo Herr Stricker,
Generell können Sie die Bilder auch auf meiner Github Seite finden. Normalerweise dauert es keine 24h bis der Beitrag als PDF, mit allen zugehörigen Bildern und Code, dort verfügbar ist.

Gruß
Jörn Weise

Bent

Bent

Interessanter Beitrag.
Im Eingangstext sind auch 2 Nano möglich. Anschlussschema ist aber nur für UNO und Nano (UNO z.Z. ausverkauft) dargestellt. Wäre schön, wenn Beitrag um das Anschlussschema von 2 NANO erweitert würde. Von den anderen Abläufen und Programmen gehe ich davon aus, dass diese identisch sind. Oder?
Danke

Lentner Peter

Lentner Peter

Servus Herr Weise,

Sie schreiben dass Code1 sehr interessant ist. Sie gehen aber nicht darauf ein wann hier Änderungen notwendig wären bzw verweisen nicht darauf dass noch ein weiterer Artikel folgt in dem die notwendigen Anpassungen erklärt werden.

Warum haben Sie in Abb:7 den „Old Bootloader“ ausgewählt und sind im Text nicht darauf eingegangen?

Viele Grüße

Bernd Albrecht

Bernd Albrecht

@ Peer Stricker: Die beiden Schaltbilder sind jetzt verlinkt, einfach darauf klicken, dann öffnet sich ein neues Fenster mit dem Bild in Originalgröße.

Peer Stricker

Peer Stricker

Danke für den tollen Beitrag!

Es wäre schön, wenn die Bilder etwas größer verfügbar wären, insbesondere die Schaltskizzen, um die Pin-Beschriftungen lesen zu können.

Einen Kommentar hinterlassen

Alle Kommentare werden vor der Veröffentlichung moderiert