Forum: Mikrocontroller und Digitale Elektronik Uart Bootloader für AVR über ZMODEM


von micro1 (Gast)


Lesenswert?

Hallo,

ich möchte gerne einen Bootloader für die AVRs schreiben. Und zwar einen
der über ein Terminal Programm wie TerTerm oder HyperTerminal
seine Daten empfängt. Dabei würde ich gerne das ZMODEM benutzen.
Es soll direkt das HEX Übertragen werden.
Jetzt mein Fragen

1. Gibt es sowas schon? Ich glaube nein oder. Ich habe jetzt schon alles 
abgegrast. Aber alle Bootloader die über serielle Schnittstelle gehen
nutzen nicht HyperTerminal oder TerTerm sondern ein eigens Programmierte 
Windows Applikation. Wenn sowas gibt dann mit Quellen und in C.
Ich werde aufjedenfall wenn ich erfolgreich gewesen bin diesen 
Bootloader uploaden

2. Kennt jemand eine gute Seite wo die Steuerbefehle des ZMODEM 
Standards erlautert sind?

Gruß

micro1

von Michael U. (amiga)


Lesenswert?

Hallo,

wenn Du keine speziellen Grund für ZModem hast, nimm das gut alte 
XModem.
Einfach, simple und geschmacklos. ;)

Kaum Protokoll-Overhead, 128 Byte Blockgröße usw.
Habe ich mit AVR schon öfter benutzt, noch nie ein Problem damit gehabt.

Die Vorteile von ZModem wie Übertragung des Dateinamens und bessere 
Prüfsummenbildung helfen da ja nur sehr bedingt.

Gruß aus Berlin
Michael

von micro1 (Gast)


Lesenswert?

@Michael

Kennst du gute Seiten die das Xmodem beschreiben?

von Michael U. (amiga)


Lesenswert?

Hallo,

für XModem reicht sogar die Wikipedia...
http://de.wikipedia.org/wiki/XModem

Sollte eigentlich so gehen:
Terminalprogramm starten, XMODEM-senden auswählen und HEX auswählen.
Jetzt wartet das Terminalprogramm auf ein NAK vom EMpfänger.
Also AVR in den Bootloader starten, dort sendet er ein NAK.
Am einfachsten wäre jetzt vermutlich;

XModem-Blocknummer lesen und in Register merken,
invertierte Blocknummer lesen und in Register merken,
Prüfsummenregister auf 0 setzen
Ab jetzt 128 Daten Byte in Buffer lesen und gleichzeitig zur Prüfsumme 
addieren.
Nach den 128 Byte das nächste Byte mit der berechneten Prüfsumme 
vergleichen -> wenn falsch NAK senden und neu empfangen
-> wenn ok Blocknummer mit invertierter Blocknummer vergleichen
-> wenn falsch NAK senden und neu empfangen
Blocknumemr mit erwarteter Blocknummer vergleichen
-> wenn falsch NAK senden und neu empfangen

Wenn ok sind jetzt 128 Byte Daten im Buffer.

Ist erstmal nur Beispiel.

Ich würde vermutlich das HEX-> BIN gleich beim Empfang erledigen, spart 
Ram-Platz.

Gruß aus Berlin
Michael

von micro1 (Gast)


Lesenswert?

@Michael

Ja Danke. XModem Protokoll läuft auf dem AVR.
Flash Routinen auch. Jetzt  komme ih daan das HEX File zu interpretiern.
Ih wollte direkt das Hex File senden. Aber das bin file sende wie geht 
das?
Wenn ih mit avr obj copy bins erzeuge sendet dfas Terminal nur Quatsch.

von Michael U. (amiga)


Lesenswert?

Hallo,

wenn Du direkt das Hex-File sendest, hast Du den Vorteil, daß da nochmal 
Prüfsummen drin sind.
Allerdings musst Du dann wohl einen Ringbuffer bauen, der größer ist als 
die Flashpage. Wenn Du zur Laufzeit dekodierst, kannst DU zwar als Bytes 
gleich in den Buffer schreiben, es endet aber ja nicht unbedingt 
zusammenhängend an einer 128Byte-Grenze vom XModem und auch nicht an 
einer Grenze des Buffers für die Flash-Page.
Irgendwo hatte ich sowas schonaml für was anderes gebastelt, weiß jetzt 
aber nicht, wo...

Allerdings sollte es auch binär keine Probleme geben, der Dateninhalt 
der 128Byte wird normalerweise ja nirgends vom XModem angefasst.
Ich schicke z.B. Wave-Daten zum AVR, die der in ein SPI-Flash schiebt.
Macht auch bei 1MB Dateigröße keinerlei Probleme.

Gruß aus Berlin
Michael

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.