Forum: Mikrocontroller und Digitale Elektronik ATmega8 BOOTRST ohne Funktion?


von heinz (Gast)


Lesenswert?

Hallo,

ich nutze AVR-Studio und habe ein kleines Programm für den ATmega8 
geschrieben, dass ich gerne im Boot-Bereich des Flashs ablegen möchte 
und auch von dort aus direkt nach einem Reset ausführen möchte.

Das Programm lässt nur eine LED blinken. Es funktioniert auch ganz 
prima. Später soll es zu einem Bootloader ausgebaut werden.

Wenn ich jetzt bei den Projekteinstellungen unter "Memory Settings" die 
Zeile "Flash   .text   0xc00 hinzufüge", dann sieht auch die Hex-Datei 
korrekt aus: Der Programmcode liegt nicht mehr am Anfang sondern am Ende 
in der Hex-Datei. Der Bereich vor dem Programmcode ist mit FF gefüllt.

Bei den Fusebits habe ich unter BOOTSZ folgende Einstellung: "Boot Flash 
size=1024 words Boot address=$0C00"

Außerdem setze ich noch den Haken bei BOOTRST.

Leider startet mein Programm nicht.


Meine bisheringe Fehleranalyse:
Ich habe die Einstellung bei "Memory Settings" wieder rückgängig 
gemacht, sodass das Programm wieder am Anfang der Hex-Datei steht.

Wenn ich es jetzt flashe, startet es auch sofort. Und zwar unabhängig 
davon, ob ich BOOTRST gesetzt habe oder nicht.
Das finde ich komisch, da ich erwartet hätte, dass wenn BOOTRST gesetzt 
ist, das Programm nicht startet, da der Einstiegspunkt in einem Bereich 
liegt, der keinen Programmcode enthält.


Danke,
heinz

von Stefan E. (sternst)


Lesenswert?

heinz schrieb:

> Wenn ich es jetzt flashe, startet es auch sofort. Und zwar unabhängig
> davon, ob ich BOOTRST gesetzt habe oder nicht.
> Das finde ich komisch, da ich erwartet hätte, dass wenn BOOTRST gesetzt
> ist, das Programm nicht startet, da der Einstiegspunkt in einem Bereich
> liegt, der keinen Programmcode enthält.

Das ist schon ok so. Die FFs dort werden als NOP interpretiert, und am 
Ende vom Flash springt der PC um auf Adresse 0 und dein Programm 
startet.

Blinkt die LED vielleicht mit Hilfe eines Timer-Interrupts?

von heinz (Gast)


Lesenswert?

nein, die LED blinkt folgendemaßen:
1
while(1)
2
{
3
    LED_AN;
4
    _delay_ms(250);
5
    LED_AUS;
6
    _delay_ms(250);
7
}

von Stefan E. (sternst)


Lesenswert?

Hast du auch nach dem Programmieren mal kontrolliert, ob der Code 
komplett ist und an der richtigen Stelle gelandet ist? Es gab eine 
AVR-Studio-Version, die wegen eines Bugs das Hex-File nicht korrekt 
programmiert hat, wenn es nicht an 0x0000 angefangen hat.

von heinz (Gast)


Lesenswert?

Wenn ich den Flash auslese, dann sehe ich, dass das Programm definitiv 
an der richtigen Stelle gelandet ist (Adresse 1800).

von heinz (Gast)


Lesenswert?

push

von MeinerEiner (Gast)


Lesenswert?

Also bei mir hab ich bei den Linker Options die Zeile
-Wl,--section-start=.text=0x1800
für den Bootloader. Klappt wunderbar damit.
Bei dir müssts dann eben
-Wl,--section-start=.text=0x0C00
sein.

von Hc Z. (mizch)


Lesenswert?

Müsste es gerade nicht und vielleicht liegt auch da der Hase im Pfeffer. 
Ich zitiere mal:

> Bei den Fusebits habe ich unter BOOTSZ folgende Einstellung: "Boot Flash
> size=1024 words Boot address=$0C00"

Das sind *Wort*Adressen.  Wird die gcc-Toolchain eingesetzt, müssen die 
Werte verdoppelt werden, Bootgröße ist 2 kBytes, und es kommt 
--section-start=.text=0x1800 heraus.

von Stefan E. (sternst)


Lesenswert?

Hazeh Zimmerer schrieb:

>> Bei den Fusebits habe ich unter BOOTSZ folgende Einstellung: "Boot Flash
>> size=1024 words Boot address=$0C00"
>
> Das sind *Wort*Adressen.  Wird die gcc-Toolchain eingesetzt, müssen die
> Werte verdoppelt werden, Bootgröße ist 2 kBytes, und es kommt
> --section-start=.text=0x1800 heraus.

Das AVR-Studio macht diese Verdopplung selber. Man muss also bei den 
"Memory Settings" tatsächlich 0x0c00 eintragen. Und er hat ja auch schon 
bestätigt, dass der Code bei 0x1800 liegt.

von heinz (Gast)


Lesenswert?

Ja genau. Im AVR-Studio habe ich 0xc00 angegeben und in Hex-File steht 
das dann bei 0x1800.

von heinz (Gast)


Lesenswert?

Kann mir mal einer eine Hex-Datei für den ATmega erstellen, die z.B. 
einen Doppelblitz macht, wenn der Code im Bootloaderbereich ausgeführt 
wird und einen Einzelblitz, wenn der Code im "normalen" Flash ausgeführt 
wird?

So könnte ich die Funktion von BOOTRST überprüfen.

Ich danke im Voraus für die Unterstützung! :-)

P.S.: Die LED hängt an PC1.

von heinz (Gast)


Lesenswert?

*push.*

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.