Hallo,
ich weiss, dass das Problem schon mal in Forum angesprochen wurde,
jedoch gab es nie eine Eindeutige Lösung, nach welcher man sich richten
kann.
Ich benutze AVR Studio 6 und möchte ein CAN Bootloader von
kreatives-chaos.de einspielen.
Das Problem ist, wo und wie gebe ich an, wo das Programm anfängt? Nach
langer Suche, habe ich einige Lösungsansätze gefunden, aber diese haben
mir nicht geholfen. Der Bootloader taucht immer noch am Anfang der HEX
Datei auf.
Anbei mein Lösungsanstaz. Was mache ich falsch?
Gruss Stefan
>ambei die Datei!
Danke. Hmm, ja dein Bootloader liegt tatsächlich ganz unten.
Hät ja sein können das da noch ne Zeile mit Adressoffset
drin ist. Hast du mal das Programm komplett neu übesetzt?
Clean Project, Rebuild Project oder wie immer das beim Studio heisst.
Hallo Sebastian,
danke dir! Ich bin für jede Hilfe dankbar.
Ich bin auch etwas weiter, nun wird der Bootloader programmiert, sitzt
aber an der falschen Stelle! Siehe meine Datei!
Ich glaube mein Problem liegt, die ganze Zeit. An der Byte bzw. Wort
Adressierung.
Laut Datenblatt geht bei AT90CAN128 der Bootloader ab 0x1E000 (Byte
adressing).
Was ist die richtige Wort adresse in diesem Fall? 0xE000 ist sicherlich
faslch?
Gruss Stefan
Stefan schrieb:> Hallo Sebastian,>> danke dir! Ich bin für jede Hilfe dankbar.>> Ich bin auch etwas weiter, nun wird der Bootloader programmiert, sitzt> aber an der falschen Stelle! Siehe meine Datei!>> Ich glaube mein Problem liegt, die ganze Zeit. An der Byte bzw. Wort> Adressierung.>> Laut Datenblatt geht bei AT90CAN128 der Bootloader ab 0x1E000 (Byte> adressing).> Was ist die richtige Wort adresse in diesem Fall? 0xE000 ist sicherlich> faslch?>> Gruss Stefan
0x1E000 als Byte-Adresse entspricht 0xF000 als Wort-Adresse (0x1E000/2 =
0xF000).
Aber in deiner hex-Datei hängt die IRQ-Sprungtabelle direkt vor dem
Bootloader rum. Das ist so auch noch nicht gut.
LG, Sebastian
Ok, ich hab hier einen Ethernet-Bootloader für einen Atmega1284P
zusammen mit einem W5500 in Atmel Studio 6 (6.1.2730 SP 2).
Folgende Einstellungen waren wichtig:
C Compiler -> Miscellaneous: -fno-jump-tables
Linker -> Libraries: <empty>
Linker -> Memory Settings -> FLASH segment: .text=0xF000
Linker -> Miscellaneous: -nostartfiles
Im Quellcode bin ich folgendermassen vorgegangen:
asmvolatile("clr __zero_reg__");// GCC depends on register r1 set to 0
22
asmvolatile("out %0, __zero_reg__"::"I"(_SFR_IO_ADDR(SREG)));// set SREG to 0
23
24
// Ab hier normal weiter. Aber Achtung! Keine vorinitialisierten globalen SRAM Variablen!
25
mcusr=MCUSR;
26
MCUSR=0;
27
wdt_reset();
28
wdt_disable();
29
30
...
Anbei mal meine .map-Datei.
Ach ja, und die Fuses auf Boot reset vector enabled, boot section size
4096 words start address $F000 words (0x1E000 bytes).
Viel Erfolg!
LG, Sebastian
Eine eigene Frage?
Dieser Thread ist über 11 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.