zurueck

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. Das Programm dass das macht nennt man einen Bootloader. Der Bootloader muss demzufolge erst einmal selbst in den oberen Speicherbereich programmiert 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 den 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.

Der verwendete ISP-Brenner

Bid: ISP_BrennerBei den folgenden Einstellungen für den ISP-Brenner Bild: 10 auf 6 Adaptergehe ich von dem von mir verwendetem Fabrikat aus. Links ein Foto. 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 anschließen zu können benötigen Sie einen Adapter von 10 Pin auf 6 Pin. Den kann man selbst bauen wie nebenstehend gezeigt. Auch das Internet bietet da verschiedene Lösungsansätze.
Nach soviel Theorie jetzt zur Praxis. Dabei unterscheidet sich  die Vorgehensweise für den Arduino- und den MCS- Bootloader  (MCS ist der Hersteller des BASCOM). 


ARV%20loeschenDen AVR löschen.
Ehe es losgeht empfiehlt es sich den AVR zu löschen Das ist zwar nicht zwingend erforderlich; ich mache das aber um böse Überraschungen mit alten Programminhalten auszuschließen. Dazu  verwende ich das AVR Studio Version 4.18 von ATMEL (Microchip) . Des Gleichen setze ich das AVR-Studio auch für die Einstellung der Fuses ein. Kommt der ATMega328P aus dem Arduino müssen Sie ihn mit einen Quarz versehen und natürlich auch einen ISP-Brenner anschließen. Oder Sie lassen den AVR im Arduino und schließen den ISP-Brenner über die ISP-Schnittstelle des Arduino an (Siehe weiter unten).

Der Arduino-Bootloader
Wenn Sie einen Arduino Uno Ihr Eigen nennen, dann ist auf dem ATMega328P bereits ein Arduino-Bootloader installiert, der über die Arduino-IDE angesprochen und programmiert wird. Da brauchen Sie 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 Bild: Arduino-ISP-Anschlusskönnen. Das ist die sechspolige Pinleiste direkt unter dem ATMega328P. Pin 1 ist der untere rechte Pin in dem nebenstehenden Foto.

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.


Bild: Arduino Bootloader brennenIn 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 IPS-Brenners ein. Wie Sie erfahren welcher Port das ist, sehen Sie weiter unten im Artikel. 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-Port Ihres Arduino-Bords einzustellen.


Es gibt aber noch eine andere Möglichkeit der Programmierung. Wenn Sie BASIC als Programmiersprache bevorzugen, können 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
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. 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 heruntergeladen. Ich habe diesen Bootloader bezüglich der Baudrate und des verwendeten AVR modifiziert. Die Programme stehen zum Download bereit [3]. Ich bleibe jedoch weiterhin in meiner Beschreibung bei dem ATMega328P. Doch nun der Reihe nach:

Die Fuses für den ISP-Brenner einstellen.
Stellen Sie im AVR Studio die Fuses so ein, dass nur SPIEN ein Häkchen bekommt und als Taktquelle der interne Bild: Fuses ISPOszillator mit 8MHz verwendet wird. In jedem Fall müssen die Fuses wie folgt lauten:
Mega328P: Extended :0xFD, High :0xD8, Low :0xE2
Ich habe Ihnen noch die Fuses einiger anderer häufig verwendeter AVRs hinzugefügt.
Mega32  : Extended :  -      , High :0xD8, Low :0xE4
Mega88  : Extended :0xF9 , High :0xDF, Low :0xE2
Mega8    : Extended :  -      , High :0xD9, Low :0xE4

Den MCS-Bootloader brennen.
Rufen Sie (unter Windows 10 mit Cortana) den Gerätemanager auf. Prüfen Sie welchen COM-Port Ihr ISP-Brenner hat und stellen Sie unter dem Punkt „Erweitert„ die erforderliche Baud-Rate für Ihren Brenner ein. Nun 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 völlig anders sein!

Programmer ISP
Bild : BASCOM Programmer auf den ISP-Brenner einstellen

Nun kompilieren und brennen Sie den Bootloader auf ihren AVR. 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.

Die Fuses für den Bootloader einstellen.
Stellen Sie die Fuses so ein, das SPIEN ein Häkchen bekommt und als Taktquelle der interne Oszillator mit 8MHz Bild: Fuses MCS-Bootloaderverwendet wird.  Weiterhin muss der Parameter BOOTRST ein Häkchen bekommen und der reservierte Speicherbereich für den Bootloader eingestellt werden. In unserem Fall sind das 1024 Words und die Startadresse des Bootloaders lautet $3C00. In jedem Fall müssen die Fuses nun wie folgt lauten:
Mega328P: Extended :0xFD, High :0xDA, Low :0xE2
Ich habe Ihnen noch die Fuses einiger anderer häufig verwendeter AVRs hinzugefügt.
Mega 32  : Extended :  -     , High :0xDA, Low :0xE4
Mega 88  : Extended :0xF8, High :0xDF, Low :0xE2
Mega 8    : Extended :  -     , High :0xD8, Low :0xE4


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 ARV 5V betragen ist ein Pegelwandler überflüssig und sogar schädlich.

Bild: Schaltplan

Den Programmer auf den MCS-Bootloader einstellen.
Bild: Programmer-MCS%20Bootloader.Rufen Sie (unter Windows 10) mit Cortana den Gerätemanager auf. Prüfen Sie welche COM-Schnittstelle Ihr Arduino UNO R3 hat. Unter dem Reiter Anschlusseinstellungen tragen Sie die Schnittstellenparameter mit 9600 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 9600 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.
Meldung%20MCS-BootloaderMeldung%20MCS-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. Da ich die Baud-Rate mit 9600 Baud festgelegt habe dauert das eine kleine Weile.

Häufige Fehler
Ein häufiger Fehler ist es, wenn Sie vorher mit der COM-Schnittstelle gearbeitet haben und vergessen die COM-Verbindung programmäßig zu trennen. Der BASCOM-Programmer kann dann den COM-Port nicht öffnen. Es kommt vor, das auch nach dem nachträglichen schließen der Schnittstelle der Fehler bleibt. Manchmal 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.
Wenn Sie den ISP-Brenner nutzen, 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.

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. 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. 72ff.„Tipps und Tricks“

[3] Hier können Sie die MCS-Bootloader downloaden:


zurueck