Forum: Mikrocontroller und Digitale Elektronik AVR Studio 6 und Bootloader


von Stefan (Gast)


Angehängte Dateien:

Lesenswert?

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

von Stefan (Gast)


Angehängte Dateien:

Lesenswert?

das geht leider auch nicht!

von holger (Gast)


Lesenswert?

>Der Bootloader taucht immer noch am Anfang der HEX
>Datei auf.

Zeig die Datei mal.

von Stefan (Gast)


Angehängte Dateien:

Lesenswert?

ambei die Datei!

von holger (Gast)


Lesenswert?

>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.

von Stefan (Gast)


Lesenswert?

ja habe ich mehrmals sogar!

von Stefan (Gast)


Lesenswert?

Hey,

kann mir echt keiner helfen?
Gibt es eine Möglichkeit das in C anzugeben?

Gruss

von Sebastian W. (wangnick)


Lesenswert?

Hallo Stefan,

ich suchs dir raus sobald ich wieder daheim bin ...

LG, Sebastian

von Stefan (Gast)


Angehängte Dateien:

Lesenswert?

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

von Sebastian W. (wangnick)


Lesenswert?

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
von Sebastian W. (wangnick)


Angehängte Dateien:

Lesenswert?

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
von Stefan (Gast)


Lesenswert?

Hey Sebastian,

vielen Dank!

Gruss Stefan

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.