BOOTRST bei ATmeag1280 ohne Wirkung?

Gast #1647722
Lesenswert?

Hallo,

das Problem mit der scheinbaren Wirkungslosigkeit der BOOTRST-Fuse, ist 
hier im Forum schon für andere ATmega-Typen beschrieben worden. Leider 
hat bisher niemand eine Erklärung dafür gefunden.

Folgendes: Ich habe ein ganz kleines Programm geschrieben, dass jeweils 
eine LED einschaltet und dann in eine Endlosschleife geht. Interrupts 
werden nicht benutzt.

Dieses Programm habe ich nun in jeweils zwei Versionen compiliert. Eine 
startet bei Adresse 0x0000 und die andere bei 0xfc00. Beide schalten 
weiterhin jeweils eine andere LED an. Man kann daher genau sagen, 
welches Programm ausgeführt wird. Die Endlosschleife nach dem 
LED-Einschalten verhindert weiterhin, dass die CPU die ff's als NOPs 
interpretiert und durch den Speicher läuft, bis es ein Programm gefunden 
hat.

So weit, so gut. Diese beiden Programme habe ich nun in den ATmega 
geladen. Anschließend habe ich den Flash ausgelesen, und kontrolliert, 
dass beide Programme an der richtigen Stelle liegen.

Durch Ändern der BOOTRST-Fuse sollte nun einmal die eine, und dann die 
andere LED leuchten. Tut es aber nicht. Es läuft immer das Programm, 
welches bei Adresse 0x0000 steht. Offenbar lässt sich der Reset-Vektor 
durch den Wert der BOOTRST-Fuse nicht beeindrucken.

BOOTSZ ist dabei auf 0xfc00 eingestellt. Ich benutze AVR-Studio.

Hat jemand irgend eine Ahnung was das sein kann??

Viele Grüße
Steffen
#1647728
Lesenswert?

Steffen schrieb:
> Durch Ändern der BOOTRST-Fuse sollte nun einmal die eine, und dann die
> andere LED leuchten. Tut es aber nicht. Es läuft immer das Programm,
> welches bei Adresse 0x0000 steht. Offenbar lässt sich der Reset-Vektor
> durch den Wert der BOOTRST-Fuse nicht beeindrucken.

Nö, sehr wahrscheinlich liegt das eine Programm nur nicht an der 
Adresse, wo es sein sollte, weil du beim Verschieben nicht an die 
Word/Byte-Adressen-Sache gedacht hast.
Gast #1647756
Lesenswert?

Hallo Stefan,

danke für die Antwort! Das mit der Word/Byte-Sache hatte ich schon in 
einem anderen Thread gelesen, aber nicht verstanden. Ich habe gerade das 
Datenblatt vor der Nase, aber etwas in der Art finde ich da nicht. 
Kannst Du es kurz erklären?

Viele Grüße
Steffen
Moderator Persönliche Seite #1647793
Lesenswert?

Ich habe gerade folgendes Minimalbeispiel genommen:
1
#include <avr/io.h>
2
#define F_CPU 1E6
3
#include <util/delay.h>
4

5
int
6
main(void)
7
{
8
  DDRE|= (1 << LEDPIN);
9

10
  for (;;) {
11
    PORTE ^= (1 << LEDPIN);
12
    _delay_ms(100 + 100 * LEDPIN);
13
  }
14
}

Compiliert mit:
1
avr-gcc -mmcu=atmega2560 -Os -DLEDPIN=1 -o low.elf ledblink.c
2
avr-gcc -mmcu=atmega2560 -Os -DLEDPIN=3 -Wl,--section-start=.text=0x3e000 -o high.elf ledblink.c
3
avr-objcopy -O ihex low.elf low.hex
4
avr-objcopy -O ihex high.elf high.hex

In den Chip gebracht mit
1
avrdude -p atmega2560 -c stk600 -P usb -B 10 -U high.hex
2
avrdude -p atmega2560 -c stk600 -P usb -B 10 -D -U low.hex

(Hätte man sicher auch in einem Kommando machen können.)

Mit
1
avrdude -p atmega2560 -c stk600 -P usb -B 10 -U hfuse:w:0x98:m

blinkt die LED an PORTE3, mit
1
avrdude -p atmega2560 -c stk600 -P usb -B 10 -U hfuse:w:0x99:m

blinkt die an PORTE1.
Gast #1647797
Lesenswert?

Mit anderen Worten, ich habe das zweite Programm an die Adresse 0x7e00 
gelegt. Da dahinter NOPs kommen, loopt der Prozessor bis er wieder an 
Adresse 0x0000 ankommt. Daher startet es immer dort.

Gut dann probiere ich mal -Wl,-Ttext,0x1f800 aus.

Danke Euch beiden.
#1647812
Lesenswert?

Steffen schrieb:
> Gut dann probiere ich mal -Wl,-Ttext,0x1f800 aus.

Alternativ kannst du auch AVR-Studio die Option automatisch generieren 
lassen. Dazu in den "Configuration Options" unter "Memory Settings" für 
.text eine neue Adresse angeben, und zwar die Word-Adresse, wie sie auch 
im Datenblatt steht.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren