Forum: Mikrocontroller und Digitale Elektronik Zeitproblem beim AVR-Flashen via XMODEM


von Stephan W. (stephan-w)


Angehängte Dateien:

Lesenswert?

Hallo,

Ich möchte einen Bootloader auf Basis des xnutboot (Original siehe 
Anhang) für meinen ATMega 1281 entwickeln. Der Bootloader verwendet für 
die Übertragung der Daten das XMODEM-Protokoll (Standard: 128Bytes 
Datenrahmen, 1Byte Prüfsumme).Bei vielen Zwischenschritten konntet Ihr 
mir durch Eure Antworten hier im Forum bereits helfen. Dafür nochmal an 
die beteiligten vielen, vielen Dank.

Der Originalquelltext ist für den ATMega128 geschrieben also habe ich 
Ihn für meinen 1281 angepasst:

Baudratenfaktor 25 (laut Datenblatt,19200KBaud,8Bits,1StopBit, 
k.Parität)
Umbenennung der Flags UDR; UDRE; TXC; RXC in UDR0; UDRE0; TXC0; RXC0.

Möchte ich nun eine Applikation (z.B siehe Anhang 16Bit_Counter, soll 
LEDs zum Blinken bringen) zum µC hin von einem Terminal aus übertragen, 
scheint es zeitliche Übertragungsprobleme zu geben. Bei der Verwendung 
von Minicom (Linux) und TeraTerm (Windows) habe ich festgestellt, dass 
die Applikation nicht vollständig übertragen wird. Setze ich mich jedoch 
an den Debugger und debugge das ganze Prozedere von Hand durch, 
übertragen beide Applikationen die Datei korrekt. Der Algorithmus 
scheint also zu stimmen, aber irgendwo gibt es ein zeitliches Problem. 
Um diesen Verdacht zu bestätigen, habe ich vor dem Aufruf der 
Flash-Funktion künstliche Pausen eingebaut(1 Sekunde) mittels delay.h. 
Verwende ich hingegen HyperTerminal (Windows), dann klappt die 
Übertragung auf Anhieb. Hier entsteht nur bei manchen Applikationen der 
Effekt, dass das Statusfenster für die Übertragung nicht geschlossen 
wird, das Programm jedoch korrekt übertragen wurde.

Also, nochmal knackig zusammengefasst, die auftretenden Effekte:

Teraterm:

Übertragung ohne Debugging bleibt bei ca. 96 % stehen.
Übertragung mit Debugging klappt.
Übertragung ohne Debugging mit künstlichen 1s-Pausen klappt.

Minicom:

Übertragung ohne Debugging klappt nicht. (Fehlermeldung:

"Wiederholungsversuch 0: Sektor nicht bestätigt
 Wiederholungsversuch 0: Maximale Wiederholungsanzahl überschritten

 Übertragung nicht abgeschlossen")

Übertragung mit Debugging klappt.
Übertragung ohne Debugging mit künstlichen 1s-Pausen klappt hier leider 
nicht, auch nicht, wenn ich die Zeit höher schraube.

Hyperterminal: läuft.



Ich weiß nicht so recht, in welche Richtung ich nun am besten testen 
sollte. Es stellen sich mir folgende Fragen:

Wo können bei diesem Algorithmus Zeitprobleme auftreten, die die 
XMODEM-Übertragung stören? Kann es sein, dass der Code bei meinem 1281 
so nicht richtig funktionieren kann, weil ich einen 
Architekturunterschied zwischen dem 128 und dem 1281 übersehen habe? 
Gibt es jemanden unter Euch, der unter Zuhilfenahme der angehängten 
Dateien den Fehler bei sich reproduzieren oder mir seine abweichenden 
Erkenntnisse schilden kann?

Ich würde mich über Eure Unterstützung und Vorschläge freuen,

vG Stephan.


----------------
AVR-Studio: 4.17 Build 666
WINARV: Version 20090313

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Was ist den die Taktquelle welche du nutzt?
Verwendest du Hardware/Software Handshaking?

von Stephan W. (stephan-w)


Lesenswert?

Hallo Läubi,

ich verwende die interne Taktquelle vom 1281 (8MHz). Ich verwende weder 
Hardware noch Software Handshaking, sofern du damit die Flusskontrolle 
meinst. Aber natürlich verwendet XMODEM selbst ein Handshaking für die 
Rahmenübertragung.

vG Stephan

von Stephan W. (stephan-w)


Lesenswert?

Habt Ihr noch weitere Ideen oder Ansätze?

vG Stephan

von Peter D. (peda)


Lesenswert?

Stephan W. schrieb:
> ich verwende die interne Taktquelle vom 1281 (8MHz)

Das ist zumindest grenzwertig.
Es kann sein, daß wenn die Bytes hintereinander kommen, zwar das Byte 
selber noch richtig erkannt wird, aber das nächste Startbit nicht 
rechtzeitig.

Für die UART sollte man immer einen Quarz oder Resonator verwenden, wenn 
man auf Zuverlässigkeit Wert legt oder es ein kommerzielles Produkt 
werden soll und man nicht in Reklamationen sein Geld versenken will.


Peter

von Stephan W. (stephan-w)


Lesenswert?

Hallo Peter,

danke für Deine Antwort. Wenn ich heute abend meinen µC wieder zur 
Verfügung habe, dann werde ich mal andere interne Oszilatoren verwenden 
(z.B. mit 128 KHz). Andere Schwingquarze oder Resonatoren (kannte ich 
bisher noch nicht) stehen mir leider nicht zur Verfügung.

Vielleicht muss ich auch doch noch eine Flussteureung wie XON/XOFF 
implementieren, sofern das vom Terminal unterstützt werden, vielleicht 
liegt da der Hund ja begraben, denn Das Terminal sendet nach meinem 
Empfinden pausenlos, sodass wenn ich meine "Flashpause" einlege 
eventuell Daten verloren gehen könnten... eigenartig.

vlG Stephan

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.