![]() Etwas über AVR-BootloaderEin 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
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
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.
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“,
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
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
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.
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.
Den Programmer auf den MCS- Bootloader einstellen
Mit dem MCS-Bootloader arbeiten
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 ![]() |