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