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
>Der Bootloader taucht immer noch am Anfang der HEX >Datei auf. Zeig die Datei mal.
>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.
Hey, kann mir echt keiner helfen? Gibt es eine Möglichkeit das in C anzugeben? Gruss
Hallo Stefan, ich suchs dir raus sobald ich wieder daheim bin ... LG, Sebastian
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
:
Bearbeitet durch User
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:
1 | void init (void) __attribute__ ((naked)) __attribute__ ((section (".vectors"))); |
2 | void init (void) {asm volatile ( "rjmp start" );} |
3 | |
4 | void __do_copy_data (void) __attribute__ ((naked)) __attribute__ ((section (".text9"))); |
5 | void __do_copy_data (void) {} |
6 | void __do_clear_bss (void) __attribute__ ((naked)) __attribute__ ((section (".text9"))); |
7 | void __do_clear_bss (void) {} |
8 | |
9 | <Hier eventuell einige Funktionen, damit die Sprungadressen klein bleiben> |
10 | |
11 | // PROGMEM ist OK, aber NUR mit folgender Funktion:
|
12 | // All our PROGMEM data is in the same extended range as the FLASHEND
|
13 | #define pgm_read_byte_progmem(ptr) pgm_read_byte_far((FLASHEND&0xFFFF0000)|(uint16_t)(ptr))
|
14 | |
15 | void start (void) __attribute__ ((naked)) __attribute__ ((section (".init0"))); |
16 | void start (void) { |
17 | asm volatile ( "ldi 16, %0" :: "i" (RAMEND >> 8) ); |
18 | asm volatile ( "out %0,16" :: "i" (AVR_STACK_POINTER_HI_ADDR) ); |
19 | asm volatile ( "ldi 16, %0" :: "i" (RAMEND & 0x0ff) ); |
20 | asm volatile ( "out %0,16" :: "i" (AVR_STACK_POINTER_LO_ADDR) ); |
21 | asm volatile ( "clr __zero_reg__" ); // GCC depends on register r1 set to 0 |
22 | asm volatile ( "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
:
Bearbeitet durch User
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.