Forum: Mikrocontroller und Digitale Elektronik Bootloader auf Basis des xnutboot Problem


von Stephan W. (stephan-w)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

ich hoffe, Ihr könnt mir bei einem dringenden problem helfen. Ich möchte 
einen Bootloader für den ATMega 1281 in C programmieren. Da ich das 
ganze so gestalten möchte, dass er die zu flashende Applikation über ein 
Programm wie TeraTerm bezieht, kam mir der bereits existierende 
Bootloader XNUTBOOT wie gelegen (siehe hierzu: 
Beitrag "Re: AVR Bootloader selber schreiben, suche Infos..."). Ich habe ihn 
zunächst für meinen 1281 angepasst und folgendes verändert (siehe 
Anhang):

- den Baudratenfaktor auf 25 gestellt (19.2kBaud bei 8MHz Clock)
- die intern verwendeten Funktionen inb() und outb() ersetzt, da ich die 
"could not find reference to..." - Fehlermeldungen nicht beseitigen 
konnte, da ich nicht wusste, welche auf welche Headerfiles dafür 
zurückgegriffen werden muss. Zumal habe ich gelesen, dass Abfragen, ob 
ein bestimmtes Bit in einem Register gesetzt ist nun anders gemacht 
wird:

also: beispielsweise:

while (!(UCSR0A & (1<<UDRE0))) statt  while ((inb(UCSR0A) & _BV(UDRE)) 
== 0)

Nach diesen Ändeurngen brachte mir der GCC auch keine Fehlermeldungen 
beim Kompilieren. Bootloader aufgespielt und eine Applikation als 
Hexfile (entsprechendes .bin file brach beim Übertragungsversuch 
übrigens vor 100% ab...?!) mit Teraterm per XMODEM übertragen (dabei auf 
Baudrate geachtet). Die übertragene App ist lediglich ein Test mit einem 
16Bit-counter (siehe Anhang, LEDs blingen im Sekundenabstand).Wenn ich 
nun den Flash auslese, dann steht zwar eine neue Applikation an der 
gewünschten Stelle, jedoch nur "Käse".

Statt wie im Hexfile der Applikation zu sehen:

:100000000C9466000C9485000C9485000C9485007B
:100010000C9485000C9485000C9485000C9485004C
:100020000C9485000C9485000C9485000C9485003C
:100030000C9485000C9485000C9485000C9485002C
:100040000C9485000C9485000C9485000C9485001C
:100050000C9485000C9485000C9485000C9485000C
:100060000C9485000C9485000C9485000C948500FC
:100070000C9485000C9485000C9485000C948500EC
:100080000C9485000C94AA000C9485000C948500B7
...
...


lauten die ersten Zeilen des Flash_Hexdumps:

:100000003A313030303030303030433934363630B9
:100010003030433934383530303043393438353086
:1000200030304339343835303037420D0A3A3130C8
:10003000303031303030304339343835303030437F
:100040003934383530303043393438353030304356
:1000500039343835303034430D0A3A3130303032AB
:10006000303030304339343835303030433934383B
:100070003530303043393438353030304339343826
:1000800035303033430D0A3A313030303330303090
...
...

Ich bin den Quellcode schon zig mal durchgegangen und konnte keinen 
Fehler finden. Man sagt ja immer, wenn beim Übertragen per RS232 nur 
Mist ankommt, dann liegt es zumeist an einer falschen Baudrate... aber 
auf die habe ich vor allem geachtet :-(

Habt Ihr eine Ahnung, woran die Übertragung gescheitert sein könnte?
Den Quelltext der xnutboot habe ich mal angehangen. Vielleicht kann 
jemand von Euch, der einen 1281 oder einen 128 hat mal probieren, ob er 
zum gleiche Resultat kommt?

ich hoffe auf Eure Unterstützung,

vlG Stephan


P.S.: ach ja, ich benutze das AVR Studio 4.17 Built 666 mit 
WinAVR20090313

von Stephan W. (stephan-w)


Lesenswert?

Hallo zusammen,

ich habe eben noch etwas weiter geforscht und habe erkannt, dass das 
*.bin File zwar im Gegensatz zum *.hex-File nicht 100% übertragen wurde 
(Abbruch bei ca. 96%), aber hingegen zum Hex-File wurde der Inhalt 
korrekt übertragen, jedoch nur die erste Seite im Flash: Vergleicht man 
die Hexfiles des Flashdumps und des Programmcodes (16Bit-Counter) 
miteinander, dann kann man diesen Unterschied schön sehen:

Hex-File des Programms 16Bit-Counter:

:100000000C9466000C9485000C9485000C9485007B
:100010000C9485000C9485000C9485000C9485004C
:100020000C9485000C9485000C9485000C9485003C
:100030000C9485000C9485000C9485000C9485002C
:100040000C9485000C9485000C9485000C9485001C
:100050000C9485000C9485000C9485000C9485000C
:100060000C9485000C9485000C9485000C948500FC
:100070000C9485000C9485000C9485000C948500EC
:100080000C9485000C94AA000C9485000C948500B7
:100090000C9485000C9485000C9485000C948500CC
:1000A0000C9485000C9485000C9485000C948500BC
:1000B0000C9485000C9485000C9485000C948500AC
:1000C0000C9485000C9485000C94850011241FBEAF
:1000D000CFEFD1E2DEBFCDBF12E0A0E0B2E0EEE8AC
:1000E000F1E000E00BBF02C007900D92A030B10715
:1000F000D9F712E0A0E0B2E001C01D92A130B10733
:10010000E1F70E9487000C94C5000C94000080E089
:1001100090E290939B0080939A008DE080939100F1
:10012000109290008FEF80BB81BB80917100846042
:1001300080937100789441E050E021B380910002F7
:10014000BA0102C0660F771F8A95E2F72623209531
:1001500021BBF3CF1F920F920FB60F9211248F93F2
:10016000809100028F5F80930002809100028830AE
:1001700010F01092000210929500109294008F914E
:0E0180000F900FBE0F901F901895F894FFCFB0
:00000001FF


Hex-Dump des Flashs (Auszug):

:100000000C9466000C9485000C9485000C9485007B
:100010000C9485000C9485000C9485000C9485004C
:100020000C9485000C9485000C9485000C9485003C
:100030000C9485000C9485000C9485000C9485002C
:100040000C9485000C9485000C9485000C9485001C
:100050000C9485000C9485000C9485000C9485000C
:100060000C9485000C9485000C9485000C948500FC
:100070000C9485000C9485000C9485000C948500EC
:100080000C9485000C94AA000C9485000C948500B7
:100090000C9485000C9485000C9485000C948500CC
:1000A0000C9485000C9485000C9485000C948500BC
:1000B0000C9485000C9485000C9485000C948500AC
:1000C0000C9485000C9485000C94850011241FBEAF
:1000D000CFEFD1E2DEBFCDBF12E0A0E0B2E0EEE8AC
:1000E000F1E000E00BBF02C007900D92A030B10715
:1000F000D9F712E0A0E0B2E001C01D92A130B10733
:10010000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
:10011000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF
:10012000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDF
:10013000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFCF
:10014000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBF
:10015000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAF
:10016000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9F
:10017000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF8F
:10018000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7F
:10019000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6F


Jetzt muss ich noch Herausbekommen, warum nur die erste Seite 
geschrieben wird. Aber ich denke, dass ich der Sache schon ein ganzes 
Stück näher gekommen bin....

Dennoch bin ich über jeden weiteren Hinweis dankbar.

Schönes WE noch,

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.