Bootloader
Vor dem Start des Sensor-Programms wird ein Bootloader gestartet, der es
ermöglicht die Firmware über die RS485-*
) mit
gesetztem 9. Bit. Anschließend wartet er maximal 17 ms auf Daten vom
Host bevor er das Hauptprogramm anspringt. Dieses muss dazu unmittelbar
nach der Vektortabelle beginnen, also bei Adresse 0x0013.
17 ms scheinen sehr kurz dafür aber die Anzeigeeinheit hat nichts anderes zu tun als darauf zu warten und so ist der Zeitrahmen mehr als ausreichend.
Der ältere Bootloader war für den AT90S2313 geschrieben und sprang
nach 0x000b. In der aktuellen Firmware ist dies kein Problem da alle
Interrupt-
Wenn der Host die Firmware ändern will antwortet er mit einem Doppelkreuz und gesetztem Bit 9. Bei anderen Antworten wird das Hauptprogramm angesprungen.
Wird der Bootloader aktiviert, erhöht er das Timeout auf 1.1 s. In keinem Fall darf zwischen empfangenen Zeichen mehr als 1.1 s vergehen sonst wird der Bootloader beendet.
In den folgenden Tabellen ist Bit 9 durch die Farbcodierung angezeigt. Ein gesetztes Bit 9 wird gelb markiert, ein gelöschtes grün.
Die Daten sendet das Display binär in folgendem Format:
Daten | !(0x21) |
ADRhigh | ADRlow | Data | Checksum | 0x00 |
Länge | 1 | 1 | 1 | 32 | 1 | 1 |
Das Ausrufezeichen ist das Schreibkommando. Die Adresse ist in Bytes und muss an einem Seitenanfang liegen. Es kann immer nur eine Seite auf einmal und als ganzes geschrieben werden.
Der Sensor programmiert die entsprechende Seite und antwortet mit
+
bei Erfolg und mit -
bei einem Fehler.
Auch diesem folgt ein 0x00 um eine einheitliche
Telegrammende-Kennung einzuhalten. Wenn Sie versuchen eine Seite
im Adressbereich des Bootloaders zu ändern wird er mit P
antworten
was soviel wie protected
bedeutet. Die Seite wurde in diesem Fall
nicht programmiert.
Die Antworten des Sensors werden im Display durch Setzen der Flags BOOTLDOK, BOOTLDERROR und BOOTLDPROTECTED reflektiert. BOOTLDPROTECTED wird dabei ignoriert da das Sensor.hex-File auch den Bootloader beinhaltet.
Während des Schreibens wird die CPU angehalten. Der Host sollte daher keine Zeichen senden bevor er das Quittungsbyte erhält.
Das Display kann die Firmware auch auslesen. Dazu sendet es folgendes Telegramm:
Daten | ?(0x3F) |
ADRhigh | ADRlow | Checksum | 0x00 |
Länge | 1 | 1 | 1 | 1 | 1 |
Auch hier ist die Adresse in Bytes, sie muss jedoch nicht zwingend auf einem Seitenanfang liegen.
Der Sensor antwortet mit folgendem Telegramm:
Daten | =(0x3D) |
ADRhigh | ADRlow | Data | Checksum | 0x00 |
Länge | 1 | 1 | 1 | 32 | 1 | 1 |
Bei der ganzen Prozedur ist zu beachten, dass der Bootloader niemals länger als 1.1 s auf ein Zeichen wartet. Bei Timeout oder Telegrammfehler wird der Bootloader abgebrochen und das evtl. bis dahin geschriebene Hauptprogramm angesprungen.
Der Bootloader kann sich nicht selbst modifizieren und wird daher Daten in seinem Adressbereich ignorieren. Dies gilt auch für Unterprogramme wie etwa zum Senden und Empfangen auf der seriellen Schnittstelle! Diese wurden, da sie sowohl vom Bootloader als auch vom Hauptprogramm gebraucht werden und als ausgetestet und fehlerfrei gelten, in den Adressbereich des Bootloaders gelegt. Beim Schreiben der Page 0 wird der Resetvektor unabhängig von den empfangenen Daten auf den Bootloader gesetzt. Die einzige Möglichkeit, den Bootloader selbst oder seinen Einsprung zu verändern wäre der Download einer entsprechenden Applikation.
Im fertigen System läuft das ganze für den Benutzer ziemlich einfach ab.
Geben Sie das Kommando update. Das Display
sendet daraufhin Waiting for Intel HEX file
. Senden Sie nun das sensor.hex-File
und der Rest geht automatisch.
Das File darf keine Zeilen enthalten, die nicht mit einem Doppelpunkt beginnen (auch keine Leerzeilen), sonst schlägt die Prozedur fehl. AVR-Studio erzeugt dieses File korrekt und Sie können es direkt verwenden.
Benutzen Sie den Bootloader nicht wenn die Kommunikation mit dem Sensor
ohnehin Probleme macht! Lösen sie diese zuerst. Obwohl der Bootloader sich
nicht selbst modifizieren kann (und Sie daher nicht mit einem toten
Sensor
enden werden), kann der Sensor doch funktionslos zurückbleiben wenn
Übertragungsfehler die korrekte und vollständige Programmierung verhindern.
Das Verfahren erinnert ein wenig an das einer Raumsonde die, einmal gestartet, nicht mehr physisch erreichbar ist. Man kann nicht einfach hinfliegen, den Deckel aufmachen und Sprit nachfüllen. Das war aber auch hier das Ziel, nicht bei Schnee und Regen in die Zisterne klettern zu müssen sondern alles bequem vom Wohnzimmer aus zu erledigen.