Forum: Mikrocontroller und Digitale Elektronik BOOTRST bei ATmeag1280 ohne Wirkung?


von Steffen (Gast)


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

von Stefan E. (sternst)


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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Oder du hast beim Programmieren des einen Programms das andere
gelöscht.

von Steffen (Gast)


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

von Steffen (Gast)


Lesenswert?

Hallo Jörg,

das Überschreiben kann ich ausschließen, da im ausgelesenen File beide 
Programme an der entsprechenden Adresse zu sehen sind.

Grüße
Steffen

von Stefan E. (sternst)


Lesenswert?

Im Datenblatt stehen die Word-Adressen (0xfc00), der GCC-Linker arbeitet 
aber mit Byte-Adressen (0x1f800). Also, wie sieht die 
Linker-Kommandozeilenoption zum Verschieben bei dir aus?

von Steffen (Gast)


Lesenswert?

Hallo Stefan,

sie lautet -Wl,-Ttext,0xfc00. Ist das falsch?

Grüße
Steffen

von Stefan E. (sternst)


Lesenswert?

Steffen schrieb:
> Ist das falsch?

Ja.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Steffen schrieb:

> sie lautet -Wl,-Ttext,0xfc00. Ist das falsch?

Für den ATmega1281 ist das falsch, ja.  Die GNU-Tools zählen in
Bytes (für alle CPUs, egal ob sie 8-, 16-, 32- oder 64-bittig
sind), die Atmel-Datenblätter meistens in 16-bit-Worten (Ausnahme:
LPM).

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Steffen (Gast)


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.

von Stefan E. (sternst)


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.

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.