zurueck.gif

Etwas über AVR-Bootloader


Ein Bootloader wirkt auf den ersten Blick im Vergleich zu einem ISP-Brenner etwas umständlich. Die Einrichtung ist kein Plug and Play und zugegebenermaßen eine kleine Herausforderung. Außerdem benötigt man zum Einrichten des Bootloaders einen ISP-Brenner und von daher stellt sich die Frage: Warum nicht gleich einen ISP-Brenner verwenden? Wenn der AVR jedoch erst einmal für den Bootloader eingerichtet ist, dann ist die weitere Handhabung recht simpel. Wenn Sie zum Beispiel eine Applikation für Ihren Kunden geschrieben haben, dann kann Ihr Kunde ein Update installieren, ohne das er dafür einen ISP-Brenner benötigt. Nicht ohne Grund verwendet der Arduino standardmäßig einen eigenen Bootloader. Denn damit ist der Aufwand für den Anschluss minimal. Das gilt sowohl für das Brennen als auch für die Kommunikation mit dem AVR.
Ich habe für mich den MCS- Bootloader entdeckt, weil ich viel mit dem BASCOM programmiere und mit dem Bootloader dann nur eine USB-Schnittstelle sowohl für die Programmierung, als auch für die Kommunikation mit dem AVR über die serielle Schnittstelle nutzen kann und das auch noch für viele verschiedene ATMega- Typen.


Was ist ein Bootloader?
Die AVRs der neueren ATMega- Serie verfügen über die Möglichkeit sich selbst zu programmieren. Das geschieht indem nach einem Reset ein Programm in dem oberen Flashspeicher aufgerufen wird, das den Programmcode z.B. von der seriellen Schnittstelle einliest und in den normalen Bereich des Flash-Speichers, also beginnend bei $0000, ablegt. Stellt das Programm fest, dass kein Programmcode programmiert werden muss, dann startet es die eigentliche Programmausführung an der Adresse $0000. Ein Programm dass das macht nennt man einen Bootloader. Der Bootloader ist also selbst ein Programm und muss demzufolge erst einmal in den oberen Speicherbereich gespeichert werden. Ferner muss dem AVR mitgeteilt werden, dass nun nach einem Reset der Controller nicht an der Adresse $0000 mit der Programmausführung beginnt, sondern an einer Adresse im oberen Speicherbereich. Das teilt man dem AVR in seinen Fuses mit. Und zwar sowohl die Bootadresse an der der Bootloader beginnt, als auch dessen Größe. Dabei wird die Größe nicht in Bytes, sondern in Words angegeben, wobei ein Word zwei Byte entspricht.

Verwendeter ISP-Brenner und Programme

Bild: 10 auf 6 Adapter
Bid: ISP_Brenner
10%20auf%206%20Adapter.JPGBild: 10 auf 6 Adapter

Bei den folgenden Einstellungen für den ISP-Brenner gehe ich von dem von mir verwendetem Fabrikat aus. Sie finden ihn bei diversen Hardwareanbietern, aber auch bei Amazon oder bei e-Ebay. Neben diesem Brenner gibt es noch eine Vielzahl anderer Brenner, die ggf. völlig andere Einstellungen erfordern, auf die ich in diesem Artikel nicht eingehen kann. Um den Brenner an den Arduino anzuschließen benötigen Sie einen Adapter von 10 Pin auf 6 Pin. Den kann man selbst bauen wie in dem Bild 10 auf 6 Adapter gezeigt. Auch das Internet bietet da verschiedene Lösungsansätze. Zum Einstellen der Fuses verwende ich das AVR Studio Version 4.18 und zum Brennen der Bootloader die Arduino- IDE Version 1.8.9 bzw, den BASCOM- AVR Version 2.0.8.0.

Nach soviel Vorbemerkungen jetzt zur Praxis. Dabei unterscheidet sich die Vorgehensweise für den Arduino- und den MCS- Bootloader (MCS ist der Hersteller des BASCOM- AVR, kurz BASCOM genannt).

Der Arduino-Bootloader

Wenn Sie sich einen Arduino Uno kaufen, dann ist auf dem ATMega328P bereits ein Arduino-Bootloader installiert, der über die Arduino- IDE angesprochen und programmiert wird. Da brauchen Sie gar nichts mehr zu machen. Etwas anders sieht das aus, wenn Sie einen neu gekauften ATMega328P-PU in Ihrem Arduino verwenden wollen, sei es weil das Original zerschossen ist oder in eine andere Applikation eingebaut wurde. Dann müssen Sie zunächst den neuen ATMega328P-PU in den Arduino einbauen und die Fuses des ATMega richtig einstellen. Damit Sie diese Einstellungen überhaupt vornehmen können, benötigen Sie einen ISP-Brenner über den Sie die Fuses einstellen und den Bootloader brennen können. Der Arduino verfügt über einen ISP-Anschluss an dem Sie den ISP-Brenner anschließen können. Das ist die sechspolige Pinleiste direkt unter dem ATMega328P. Pin 1 ist der untere rechte Pin in dem Foto Arduino- ISP-Anschluss.

Arduino- ISP-Anschluss
Bild: Arduino- ISP-Anschluss
Zurück zu den Fuses. Der neue ATMega328P-PU kommt mit folgender Einstellung zu Ihnen:
Extended; 0xFF, High: 0x D9, Low: 0x 62
d.h. der ATMega328P wird mit seiner internen Taktquelle, mit 1MHz betrieben, der Bootloader ist deaktiviert und eine serielle Programmierung ist vorgegeben. Die Arduino-IDE erwartet jedoch folgende Einstellungen:
Extended; 0xFD, High: 0x DE, Low: 0x FF
d.h. der ATMega328P wird mir einer externen Taktquelle betrieben (der 16-MHz Quarz), der Bootloader ist aktiviert, die Größe der Boot Flash- size beträgt 256 Words, die Startadresse ist $3F00 und eine serielle Programmierung ist vorgegeben. Auf diese Werte stellen Sie die Fuses ein,
Haben Sie die Fuses richtig eingestellt, dann können Sie den Arduino-Bootloader auf den ATMega328P brennen. Das machen Sie mit der Aruino-IDE.


Arduino%20Bootloader%20brennen.jpg
Bild: Arduino Bootloader brennen
In der Arduino- IDE finden Sie unter dem Reiter Werkzeuge die Punkte „Port“, „Programmer“ und „Bootloader brennen“. Mit dem Punkt „Port“ stellen Sie den COM- Port Ihres ISP- Brenners ein. Gut gesagt, aber wie finden Sie heraus welchen COM- Port Ihr ISP- Brenner verwendet?
Rufen Sie den Gerätemanager auf (Unter Windows 10 machen Sie das mit der App Einstellungen. Suchen Sie dort nach dem Begriff „Gerätemanager“. Schließen Sie Ihren ISP- Brenner an die USB- Schnittstelle Ihres PCs an. Prüfen Sie unter „Anschlüsse (COM & LPT)“ welchen COM- Port Ihr ISP-Brenner hat und stellen Sie unter dem Punkt „Erweitert„ ggf. die erforderliche Baud-Rate für Ihren Brenner ein). Sie können an dieser Stelle auch eine andere Portnummer vergeben, falls Sie das wünschen). Wenn Sie nicht sicher sind welches der angezeigten Gerät Ihr Brenner ist, dann ziehen Sie ihn aus der USB- Schnittstelle. Das Gerät das nun auf dem Bildschirm verschwindet, ist Ihr Brenner. Das funktioniert natürlich auch mit jedem anderen seriellen Gerät und auch in der Arduino-IDE.
Doch nun zurück zur Arduino- IDE. Mit dem Punkt „Programmer“ stellen Sie den von Ihnen verwendeten ISP-Brenner ein. Bei mir ist das ein STK500- kompatibler Brenner. Ist das geschehen, dann starten Sie den Punkt „Bootloader brennen“. Die Arduino-IDE programmiert nun Ihren ATMega328P mit dem Arduino Bootloader. Ist das erfolgreich abgeschlossen, können Sie den ISP- Brenner entfernen und Ihren Arduino wieder ganz normal über die USB-Schnittstelle verbinden und über die Arduino- IDE Arduino Sketche programmieren. Vergessen Sie nicht vorher wieder den COM- Parameter Ihres Arduino- Bords einzustellen.

Es gibt aber noch eine andere Möglichkeit den Arduino über einem Bootloader zu programmieren . Wenn Sie BASIC als Programmiersprache bevorzugen, können Sie den Arduino auch über den BASCOM- AVR in BASIC programmieren und zwar direkt über die USB-Schnittstelle, ohne einen ISP-Brenner! (Siehe hierzu auch die Elektor- Artikelserie von Burghard Kainka in [1]).
Wählen Sie dazu, im BASCOM, unter dem Reiter Optionen den Punkt „Programmer“,


Programmer-Arduino.jpg
Bild: Programmer-Arduino
Dort wählen Sie als Programmer die Option ARDUINO aus. Machen Sie einen Haken bei „Autoverify“ und „Programm after compile“. Als COM- Port wählen Sie den vom Arduino verwendeten COM- Port aus, die Baud-Rate legen Sie mit 115200 fest, das Timeout mit 100. Alle anderen Felder lassen Sie leer. Notieren Sie sich vorher die bisherigen Einstellungen, damit Sie ggf. den alten Zustand wieder herstellen können. Anschließend können Sie, wie gewohnt, Ihre BASIC-Programme schreiben und auf den ATMega328P des Arduino brennen. Dabei sollten Sie es vermeiden, den Chip zu löschen, denn dann entfernen Sie auch den Arduino- Bootloader wieder. Prüfen Sie vorher ob der Programmer Ihren AVR als den richtigen Typ erkennt. Falls das nicht der Fall ist stimmt etwas nicht und Sie sollten auf keinen Fall versuchen den AVR trotzdem zu brennen. Suchen Sie den Fehler und beseitigen Sie ihn.

Der MCS- Bootloader
Die Entwickler des BASCOM haben ebenfalls einen Bootloader entwickelt. Mit ihm stehen Ihnen weitere ATMega- Typen zur Verfügung. Er wird mit dem BASCOM von der MCS- Seite [3] heruntergeladen. Ich habe diesen Bootloader bezüglich der verwendeten AVRs modifiziert. Die Urheberschaft verbleibt selbstverständlich trotzdem bei MCS. Die Programme stehen zum Download bereit [4]. Obwohl Sie mit dem MCS- Bootloader auch andere ATMegas brennen können bleibe ich jedoch weiterhin in meiner Beschreibung bei dem ATMega328P. Doch nun der Reihe nach:

Die Fuses für den ISP- Brenner einstellen

 
Fuses ISP
Bild: Fuses ISP

Stellen Sie im AVR Studio die Fuses so ein, dass nur SPIEN ein Häkchen bekommt und als Taktquelle der interne Oszillator mit 8MHz verwendet wird.
In jedem Fall müssen die Fuses wie folgt lauten:
Mega328P: Extended :0xFD, High :0xDB, Low :0xE2
Hier noch die Fuses einiger anderer häufig verwendeter AVRs:
Mega32 : Extended : - , High :0xDB, Low :0xE4
Mega88 : Extended :0xF9 , High :0xDF, Low :0xE2
Mega8 : Extended : - , High :0xD9, Low :0x64

Den MCS-Bootloader brennen
Bild : Programmer-ISP
Bild : Programmer-ISP
Laden Sie den MCS-Bootloader für den ATMega328P in den BASCOM. Dort stellen Sie, unter Optionen, den Programmer wie folgt ein: Wählen Sie als Programmer die Option "STK500 native driver" aus. Machen Sie einen Haken bei „Autoverify“ und „Programm after compile“. Als COM- Port wählen Sie den von Ihrem ISP-Brenner verwendeten COM-Port aus, Clock mit 12500, das "Timeout USB" mit 200, das "Timeout Seriell" mit 300 und machen Sie ein Häkchen bei USB. Alle anderen Felder lassen Sie leer. Diese Einstellung gilt für meinen STK 500 kompatiblen Brenner. Wenn Sie einen anderen Brenner benutzen, können die erforderlichen Einstellungen natürlich anders sein! Beachten Sie bitte weiterhin dass Sie den Quellcode des MCS- Bootloaders nur mit der Vollversion des BASCOM- AVR kompilieren und brennen können. Für die Demoversion ist Datei leider zu groß, da Sie den gesamten Speicher des AVRs brennen müssen. Ich habe deshalb auch die HEX- Files mit beigefügt. Nun kompilieren und brennen Sie den Bootloader auf ihren AVR. Prüfen Sie auch hier vorher ob der Programmer Ihren AVR als den richtigen Typ erkennt. 

Die Fuses für den MCS- Bootloader einstellen
Stellen Sie die Fuses so ein, das SPIEN ein Häkchen bekommt und als Taktquelle der interne Oszillator mit 8MHz verwendet wird. Weiterhin muss der Parameter BOOTRST ein Häkchen bekommen und der reservierte Speicherbereich für den Bootloader eingestellt werden. Für den ATMega328P sind das 1024 Words und die Startadresse des Bootloaders lautet $3C00.

Fuses%20MCS-Bootloader.jpg
Bild: Fuses MCS-Bootloader
In jedem Fall müssen die Fuses nun wie folgt lauten:
Mega328P: Extended :0xFD, High :0xDA, Low :0xE2
Ich füge auch hier noch noch die Fuses einiger häufig verwendeter AVRs hinzu:
Mega 32 : Extended : - , High :0xDA, Low :0xE4
Mega 88 : Extended :0xF8, High :0xDF, Low :0xE2
Mega 8 : Extended : - , High :0xD8, Low :0x64

Entfernen Sie den ISP-Brenner und stellen Sie die Verbindung zur seriellen Schnittstelle her.
Da die heutigen Computer keine serielle Schnittstelle mehr besitzen, benötigen Sie einen Schnittstellenwandler von USB zu RS232. Ich verwende zu diesem Zweck einen modifizierten Arduino UNO R3, aus dem ich den ATMega 328P-PU entfernt habe. Näheres siehe in dem Elektor- Artikel [2] „Tipps und Tricks“. Die Schaltskizze zeigt wie das gemacht wird. Wichtig ist, dass die Leitungen RX und TX NICHT gekreuzt werden dürfen. Da die Signalpegel sowohl bei dem Arduino als auch bei dem zu brennenden AVR 5V betragen ist ein Pegelwandler nicht nur überflüssig sondern sogar schädlich.

Schaltplan Schnittstellenwandler
Bild: Schaltplan Schnittstellenwandler

Den Programmer auf den MCS- Bootloader einstellen

Programmer-MCS Bootloader
Bild: Programmer-MCS Bootloader
Prüfen Sie, wie oben beschrieben, welche COM- Schnittstelle Ihr Schnittstellenwandler Arduino UNO R3 hat. Im Gerätemanager tragen Sie die Schnittstellenparameter mit 34800 Baud, 8 Datenbits, keine Parität, 1 Stopbit und keine Flusssteuerung ein. Gehen Sie in dem BASCOM unter Optionen auf den Punkt Programmer und führen Sie folgende Einstellungen durch: Wählen Sie als Programmer die Option MCS Bootloader aus. Machen Sie einen Haken bei „Autoverify“ und „Programm after compile“. Als COM- Port wählen Sie den vom Arduino verwendeten COM- Port aus, die Baud-Rate legen Sie mit 34800 fest, das Timeout mit 100. Alle anderen Felder lassen Sie leer. Notieren Sie sich vorher die bisherigen Einstellungen damit Sie ggf. den alten Zustand wieder herstellen können. Unter dem Reiter Communication stellen Sie die gleichen Schnittstellenwerte ein.

Mit dem MCS-Bootloader arbeiten

Bild: Meldung MCS-Bootloader-1
Bild: Meldung MCS-Bootloader
Bild: Meldung MCS-Bootloader-1
Bild: Meldung MCS-Bootloader-1

Schreiben Sie Ihr Programm, wie gewohnt auf dem BASCOM. Um das Programm zu kompilieren und auf den AVR zu brennen legen Sie den Reset-Pin des AVR auf Masse. Dann klicken Sie den Compilieren Button an oder drücken F7. Sobald die Meldung "Sending Init byte" kommt, entfernen Sie die Masseverbindung von dem Reset-Pin. Das kompilierte Programm wird jetzt über den MCS-Bootloader in den AVR gebrannt. Wenn Sie wollen, können Sie eine LED mit Vorwiderstand an den Port D.7 des zu brennenden AVRs anschließen. Die blinkt dann wenn der Bootloader aktiv ist.

Häufige Fehler
Ein häufiger Fehler ist es, wenn Sie zuvor mit der COM-Schnittstelle gearbeitet haben und vergessen die COM- Verbindung programmmäßig zu trennen. Der BASCOM- Programmer kann dann den COM- Port nicht öffnen. Schließen Sie die COM- Schnittstelle. In hartnäckigen Fällen hilft es hier, wenn Sie Ihren Computer herunterfahren und neu starten, sowie alle Verbindungen zu Ihrem AVR lösen und nach dem Neustart wieder anschließen.
Eine weitere Fehlerquelle sind die COM- Parameter. Sie müssen an allen Stellen identisch sein. Sowohl im Gerätemanager, als auch im den BASCOM- Programmereinstellungen.
Mir passiert es zuweilen das ich schlicht und einfach vergesse die COM-Schnittstelle des Arduino mit dem AVR zu verbinden. Dann funktioniert selbstredend keine Programmierung und auch keine Kommunikation. Eine vergessene Stromversorgung fällt in die gleiche Kategorie.
Wenn Sie den gleichen ISP-Brenner nutzen wie ich, dann sollten Sie die Verbindung zwischen Brenner und dem AVR trennen, wenn Sie die USB-Verbindung zu Ihrem PC getrennt haben. Zumindest bei meinem ISP-Brenner funktioniert sonst der AVR nicht.
Weiterhin funktioniert der ISP-Brenner nach dem Einschalten des PCs nicht, wenn er an dem PC (und dem AVR) angeschlossen bleibt während der PC ausgeschaltet ist.

Ein besonderes Ärgernis sind falsch eingestellte Fuses. Man bemerkt es bei der Programmierung nicht sofort und wundert sich nur was mit dem AVR los ist. Schauen Sie also bei „komischen Fehlern“ einmal nach den Fuses.

Fazit
Obwohl ich gerne mit dem MCS- Bootloader arbeite bevorzuge ich den Arduino- Bootloader wenn ich einen ATMega328P programmiere. Er erspart mir das gedrückt halten des Resetbuttons beim Kompilieren und Brennen des AVRs bis zur Rückmeldung des AVRs. (Es gibt jedoch mittlerweile neuere Versionen des MCS- Bootloaders, die ich noch nicht getestet habe. Sie finden Sie auf der Homepage von MCS unter dem Punkt Download.) Mit dem Arduino- Bootlloader habe ich die gleiche Funktionalität wie bei der Benutzung des ISP-Brenners. Weiterhin benötige ich keinen weiteren Schaltungsaufbau zum Brennen des ATMega328P. Statt dessen verwende ich einfach den Arduino in den ich den zu brennenden ATMega328P-PU platziere.
Zum Schluss noch eine Randbemerkung: Ich verwende immer Arduinos R3, die einen ATMega328P-PU, also die DIL- Ausführung enthalten und nicht die Versionen mit der SMD-Ausführung.

Quellen
[1] Elektor April 2014, S. 54 ff. „Mikrocontroller für Einsteiger (1)"
[2] Elektor Mai/Juni 2018, S. 72 ff.„Tipps und Tricks“
[3] Homepage der Fa. MCS 
[4] Download der angepassten MCS- Bootloader 



zurueck.gif