Alle neueren AVR Mikrocontroller der ATmega-Serie besitzen die Möglichkeit, einen so genannten Bootloader zu installieren. Dies ist ein Programm, welches in einem separaten Bereich des Flash-Speichers abgelegt ist
und als erstes nach einem Reset gestartet wird. Es ermöglicht die benutzerfreundliche Installation einer neuen Software ohne spezielle Programmierkabel und ohne Öffnen des Gerätes. Hier wird ein fertiger
Bootloader vorgestellt und am Beispiel des Anzeigemodul2 die Installation beschrieben.
Letzte Bearbeitung: 12.03.2006
Allgemeines
Ein Hinweis vorweg: Dies ist kein eigenständiges Projekt und die hier vorgestellte Software ist keine Entwicklung von mir. Dieser Bootloader wurde von Pascal Stang geschrieben und stellt eine gute Ergänzung für andere Projekte dar.
Eine allgemein bekannte Tatsache ist, dass es keine fehlerfreie Software gibt und so ist es oft erforderlich, die Software eines Gerätes durch eine neue Version zu ersetzen. Dies trifft mehr oder weniger auch für alle Geräte zu, die ich auf dieser Seite vorstelle. Leider ist so ein Software-Update nicht immer ganz einfach: Man muss das Gerät öffnen, um an die Programmierschnittstelle zu kommen und man muss ein passendes Programmiergerät oder Kabel bereithalten.
Nun besitzen einige meiner Geräte, wie z.B. das Anzeigemodul2 oder das EPROM-Programmiergerät bereits eine Schnittstelle zum PC. Wäre es nicht praktisch, diese Schnittstelle auch zum Updaten der Software zu benutzen? Diese Frage hat sich der Hersteller der Controller auch gestellt und bei allen aktuellen ATmegas ist eine Möglichkeit eingebaut, die allgemein als Bootloader bezeichnet wird.
Wie funktioniert das? Verwendet man den Controller im Auslieferungszustand, dann kann der gesamte Flash-Speicher für die Anwendungssoftware verwendet werden. Bei Verwendung eines Bootloaders wird der Anwendung ein Teil des Flashspeichers (je nach Controllertyp und Einstellung zwischen 256 und 8192 Byte) entzogen und für den Bootloader reserviert. Weiterhin wird der Controller durch Setzen eines Fuse-Bits veranlasst, nach einem Reset nicht mehr die normale Anwendung, sondern den Bootloader zu starten.
Bei einem Controller-Reset passiert nun folgendes: Das Programm im Bootloaderbereich wird gestartet. Dieses initialisiert die serielle Schnittstelle und wartet auf eine bestimmte Bedingung, z.B. eine festgelegte
Zeichenfolge an der Schnittstelle. Tritt diese Bedingung während einer angemessenen Wartezeit nicht ein, dann beendet sich der Bootloader und startet das normale Anwenderprogramm. Die normale Funktionalität
des Gerätes wird also nicht beeinträchtigt - es tritt allerdings eine kleine Startverzögerung im Bereich einiger Sekunden auf.
Wird die erwähnte Bedingung erfüllt, dann aktiviert der Bootloader die Updatefunktion. Dabei wird im Allgemeinen der Applikationsbereich gelöscht und alle über die serielle Schnittstelle empfangenen
Daten werden in den Applikationsbereich geschrieben.
Natürlich sind die Vorgänge beim Update viel komplizierter und weil es schon fertige und ausgereifte Software gibt, habe ich auf eine solche zurück gegriffen. Ich habe mich hier für den Bootloader von Pascal Stang entschieden. Dieser ist ziemlich genial, weil er für die Kommunikation das Protokoll des Atmel STK500 Entwicklungskits verwendet. Das STK500 benutzt eine normale serielle Schnittstelle mit 2 Leitungen (TXD/RXD), wobei auch eine virtuelle Schnittstelle über USB verwendet werden kann. Als Software kommt hier das AVR-Studio von Atmel zum Einsatz, welches ein Modul für die Kommunikation mit dem STK500 enthält. Die Programmierung mit dem STK500 Protokoll geht übrigens wesentlich schneller als über die ISP-Schnittstelle mittels PonyProg und es sind noch andere Dinge möglich, z.B. das Lesen und Schreiben von Fuse-Bits.
Installation des Bootloaders
Im Folgenden möchte ich die Installation des Bootloaders beim Anzeigemodul2 beschreiben. Falls das Anzeigemodul bereits in Betrieb ist, dann sollte zuerst die Konfiguration gesichert werden (Menü: Konfiguration - Backup - Sichern), da bei der Installationsprozedur alle Speicher des Controllers gelöscht werden (die Daten in den externen Speichern bleiben natürlich erhalten).
Weiterhin wird das AVR-Studio 4 benötigt, welches von Atmel kostenlos bereitgestellt wird. Ich benutze dieses Programm zum Entwickeln und Testen der Software meiner Projekte, an dieser Stelle werde ich jedoch nur auf das STK500 Modul eingehen, welches für die Kommunikation mit dem Bootloader verwendet wird.
Zunächst wird der Bootloader auf bewährte Art, z.B. mittels PonyProg und Programmieradapter (parallel oder seriell) in den Controller programmiert. Obwohl auf der Seite von Pascal Stang eine große Auswahl fertiger Bootloader für verschiedene Controller und Taktfrequenzen angeboten wird, ist leider keine passende Version für das Anzeigemodul2 dabei. Ich habe deshalb eine Version so modifiziert, dass sie mit der im Anzeigemodul2 verwendeten Taktfrequenz von 11,0592 MHz läuft: bootloader-m128-11mhz.zip.
War die Programmierung erfolgreich, dann kommt nun der nächste Schritt. Es müssen einige Fuse-Bits geändert werden:
So sieht die richtige Einstellung in PonyProg aus.
Damit sind alle Vorbereitungen am Anzeigemodul abgeschlossen. Das Programmierkabel wird wieder entfernt und PonyProg beendet.
Das Anzeigemodul macht jetzt einen toten Eindruck, aber das täuscht: Im Moment befindet sich nämlich nur der Bootloader im Flash-Speicher und dieser beginnt nun mit seiner Arbeit. Er versucht 3 Sekunden lang eine Kommunikation mit dem STK500 Modul des AVR-Studios aufzunehmen. Da aber noch keine Verbindung besteht, gelingt dies nicht und es wird die Anwendungssoftware gestartet. In diesem Bereich befinden sich allerdings nur leere Speicherzellen und so arbeitet der Controller diese beginnend ab Adresse 0x0000 nacheinander ab und erreicht schließlich wieder das Bootloader-Programm am Ende des Flash-Speichers - der Vorgang beginnt von vorn.
Nun wollen wir den Bootloader aus dieser Endlosschleife befreien und ihm etwas zu tun geben. Dazu stellen wir eine normale Kabelverbindung zwischen Anzeigemodul und PC her, so als wollten wir Log-Daten auslesen. Diese Verbindung kann sowohl über RS-232 als auch über USB erfolgen, wobei ich davon ausgehe, dass der FT232-Treiber bereits installiert ist und funktioniert (siehe dazu die Beschreibung des Anzeigemoduls). Jetzt wird das AVR-Studio gestartet und in der Toolbar sind die folgenden 6 Symbole zu finden:
Hier wird auf das mit "Con" bezeichnete linke Symbol geklickt. Falls diese Symbole nicht vorhanden sind, dann kann man sie aktivieren, indem man mit der rechten Maustaste auf die Toolbar klickt und "STK500" auswählt. Alternativ lässt sich die gewünschte Option auch über das Menü Tools - Program AVR - Connect... aufrufen. Danach sollte folgendes Fenster erscheinen:
Hier wird auf der linken Seite STK500 or AVRISP und auf der rechten Seite die Schnittstelle ausgewählt, wo das Anzeigemodul angeschlossen ist. Bei meinem Anzeigemodul verwende ich eine USB-Verbindung über die virtuelle COM4. Nun wird auf Connect geklickt und die Verbindung sollte hergestellt werden. Wenn man eine aktuelle Version des AVR-Studios verwendet, dann erscheint zunächst folgendes Fenster:
Auch wenn das eine Warnmeldung darstellt, so ist es doch ein gutes Zeichen dafür, dass eine Verbindung hergestellt werden konnte. Dieses Fenster bemängelt, dass sich unser Bootloader als alte STK500 Version meldet und empfiehlt ein Upgrade. Hier muss jedoch auf Abbrechen geklickt werden, denn ein Upgrade ist nicht möglich und würde eine falsche Software installieren. Es funktioniert aber trotz der alten Versionsnummer fehlerfrei und als nächstes erscheint das STK500 Fenster:
Auf dem Bild sind bereits alle nötigen Einstellungen getätigt worden, nur Pfad und Dateiname der Hex-Datei im Bereich Flash muss natürlich noch angepasst werden. Im Bereich
EEPROM braucht nichts eingetragen zu werden, wir wollen hier nur den Flashspeicher neu programmieren.
Interessant ist das Feld ganz unten, hier kann man die Kommunikation zwischen dem AVR-Studio und dem STK500 (bzw. dem Bootloader) verfolgen. Sind alle Einstellungen in Ordnung, dann wird im Bereich
Flash auf Program geklickt und der Programmiervorgang wird gestartet. Leider sieht man keine Fortschrittsanzeige oder Erfolgsmeldungen, so dass man das
Kommunikationsfeld beobachten muss. Wenn alles geklappt hat, dann sieht das so aus wie im folgenden Bild und die Meldungen sind eigentlich selbsterklärend:
Damit ist die Programmierung abgeschlossen und das Anzeigemodul kann wieder in Betrieb genommen werden. Dazu schließen wir das STK500 Fenster und drücken die Reset-Taste am Anzeigemodul2. Auch jetzt versucht der Bootloader wieder 3 Sekunden lang eine Verbindung aufzubauen und startet dann die Software des Anzeigemoduls. Hier muss jetzt nur noch über das Menü Konfiguration - Backup - Laden/Neustart die gesicherte Konfiguration geladen werden und dann kann das Modul wieder seine normale Arbeit aufnehmen.
Update mittels Bootloader
Dieser Abschnitt beschreibt den Ablauf eines Software-Updates beim Anzeigemodul2, wenn der Bootloader bereits installiert ist. Diese Prozedur ist wesentlich einfacher als die im vorherigen Abschnitt beschriebene und es
wird jetzt kein Programmierkabel und auch kein PonyProg mehr benötigt.
Und noch eine gute Nachricht ist: das EEPROM des Controllers wird beim Update mittels Bootloader nicht gelöscht. Trotzdem sollte man zuerst die Konfiguration sichern (Menü: Konfiguration
- Backup - Sichern), falls doch mal etwas schief geht.
Die Update-Prozedur beginnt mit dem Herstellen einer Kabelverbindung über RS-232 oder USB zwischen PC und Anzeigemodul. Danach wird das AVR-Studio gestartet und die bereits bekannte Toolbar für das STK500 kommt wieder zum Einsatz:
Das STK500 Modul speichert die letzte Einstellung und falls keine Veränderungen vorgenommen worden sind, dann kann man das Verbindungsmenü überspringen und das STK500 Modul direkt starten. Dies erfolgt über das mit "AVR" bezeichnete Symbol. Allerdings ist jetzt etwas Schnelligkeit gefragt, denn es muss jetzt ziemlich kurz nacheinander folgendes getan werden:
Hier wird wieder auf Abbrechen geklickt und es erscheint das STK500 Fenster:
Auch hier sollten alle Einstellungen vom letzten Start erhalten geblieben sein. In diesem Fall braucht man nur die neue Hex-Datei im Bereich Flash auszuwählen, im EEPROM Bereich kann das Feld wieder leer bleiben. Sind alle Einstellungen korrekt, dann wird im Bereich Flash auf Program geklickt und der Programmiervorgang wird gestartet.
Das Kommunikationsfeld sollte wieder so aussehen wie hier:
Damit ist die Programmierung abgeschlossen. Wir schließen das STK500 Fenster und drücken auf die Reset-Taste des Anzeigemoduls. Nach etwa 3 Sekunden startet das Anzeigemodul mit der neuen Software und da der Inhalt des EEPROM erhalten geblieben ist, beginnt das Modul sofort wieder mit der Arbeit. Die Update-Prozedur ist damit abgeschlossen.
Weitere Projekte mit Bootloader
Prinzipiell kann auch das EPROM Programmiergerät mit einem Bootloader ausgestattet werden. Hier besteht aber das Problem, dass das das Anwendungsprogramm bereits so groß ist, dass der Platz nicht mehr für den Bootloader reicht.
Alle anderen Projekte eignen sich nicht für die Installation eines Bootloaders, weil entweder keine serielle Schnittstelle vorhanden ist, z.B. bei allen Uhren, dem Gong und dem Fahrtregler oder aber die Schnittstelle unvollständig ist, wie z.B. beim Sensormodul und Anzeigemodul1. Bei zukünftigen Projekten werde ich aber versuchen, die Möglichkeit eines Bootloaders einzuplanen.