mikrocontroller.net

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


Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder du hast beim Programmieren des einen Programms das andere
gelöscht.

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Stefan,

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

Grüße
Steffen

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Steffen schrieb:
> Ist das falsch?

Ja.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe gerade folgendes Minimalbeispiel genommen:
#include <avr/io.h>
#define F_CPU 1E6
#include <util/delay.h>

int
main(void)
{
  DDRE|= (1 << LEDPIN);

  for (;;) {
    PORTE ^= (1 << LEDPIN);
    _delay_ms(100 + 100 * LEDPIN);
  }
}

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

In den Chip gebracht mit
avrdude -p atmega2560 -c stk600 -P usb -B 10 -U high.hex
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
avrdude -p atmega2560 -c stk600 -P usb -B 10 -U hfuse:w:0x98:m

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

blinkt die an PORTE1.

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.