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
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.
Oder du hast beim Programmieren des einen Programms das andere gelöscht.
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
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
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?
Hallo Stefan, sie lautet -Wl,-Ttext,0xfc00. Ist das falsch? Grüße Steffen
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).
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.