Forum: Mikrocontroller und Digitale Elektronik BOOTLOADER aus HEX-File


von B.A. (Gast)


Lesenswert?

Hallo,
ich habe einen Bootloader als HEX-File vorliegen und möchte ihn auf 
verschieden ATMEGA's (8, 32, 644) aufspielen.
Die FUSE-Bits sind auf 512 Bytes gesetzt.

Wenn ich mir das HEX-File ansehe, würde ich sagen, der Bootloader wird 
ab Adresse 0000 in den Flash geschrieben, oder ???
1
:100000002AC046C145C144C143C142C141C140C1EA
2
:100010003FC13EC13DC13CC13BC13AC139C138C1FC
3
:1000200037C136C135C11DC0FFC00000FFC0000090

Was muß ich beim Flashen der AVR's tun, damit die HEX-Datei immer 
automatisch in die Bootloader-Sektion geschrieben wird ?

Es ist gut möglich, dass diese Frage schon mal beantworten wurde, aber 
wenn ich im Forum nach BOOTLOADER suche, dann brauche ich ne Woche 
Urlaub zum lesen...

Ich habe leider keine Beschreibung gefunden, wie der Bootloader gebrannt 
werden muss...

von Stefan E. (sternst)


Lesenswert?

B.A. schrieb:
> ich habe einen Bootloader als HEX-File vorliegen und möchte ihn auf
> verschieden ATMEGA's (8, 32, 644) aufspielen.

Und das selbe HEX-File (also unveränderter Binär-Code) soll dann auf 
unterschiedlichen Controllern laufen? Das bezweifle ich.

von peterfido (Gast)


Lesenswert?

Hallo,
Du musst den Bootloader für den jeweiligen AVR kompilieren. Die 
Initialisierung verschiedener AVR ist unterschiedlich auch die Register 
sind evtl. unterschiedlich. Selbst wenn es aus irgendwelchen Gründen 
auch immer irgendwie laufen sollte, weiß der Bootloader nicht, dass er 
auf einem AVR mit weniger Speicher ist und überschreibt sich dann 
selbst, bzw bricht ab, obwohl noch mehr Platz wäre.

Codes für Bootloader gibt es ausreichend im Netz. Kostenlose Compiler 
auch.

von B.A. (Gast)


Lesenswert?

Das ist je gerade mein Problem...
Ist es möglich, einen "Standard-Bootloader" auf verschieden AVR zu 
brennen ?

Selbst wenn ich den Bootloader kompiliere, ändern sich ja im HEX-File 
die Adressen nicht...

Den Bootloader hätte ich auch als Code da...
Aber was muß ich ändern, damit der richtige Speicher genommen wird ?

von SubZeroX (Gast)


Lesenswert?

Mit dem folgenden Linker-Befehl kannst du die Code Section verschieben 
lassen:

-Wl,--section-start=.text=0x1800

Wobei 0x1800 die Addresse ist an welcher der Bootloader startet (unter 
anderem vom µC der Fusebits abhängig)

Mfg SubZeroX

von Peter II (Gast)


Lesenswert?

B.A. schrieb:
> Den Bootloader hätte ich auch als Code da...
> Aber was muß ich ändern, damit der richtige Speicher genommen wird ?
das macht ja im Normalfall der Compieler, dort sagt man ja für welchen 
Atmel er übersetzen soll.

von Michael H. (michael_h45)


Lesenswert?

B.A. schrieb:
> Ist es möglich, einen "Standard-Bootloader" auf verschieden AVR zu
> brennen ?
nur wenn er keine avr-interne peripherie nutzt, denn die kann ja von 
modell oder reihe abhängig verschieden sein. oder er informiert sich, 
auf welchem avr er denn läuft. das geht aber bei avrs afaik nicht.
ansonsten: keine timer, keine uart. und damit ist dein vorhaben schon 
den bach runter.

> Den Bootloader hätte ich auch als Code da...
schon der vernünftigere ansatz.
> Aber was muß ich ändern, damit der richtige Speicher genommen wird ?
zeile 42...
WELCHEN bootloader hast du denn?

von Michael H. (michael_h45)


Lesenswert?

B.A. schrieb:
> Ist es möglich, einen "Standard-Bootloader" auf verschieden AVR zu
> brennen ?
nur wenn er keine avr-interne peripherie nutzt, denn die kann ja von 
modell oder reihe abhängig verschieden sein. oder er informiert sich, 
auf welchem avr er denn läuft. das geht aber bei avrs afaik nicht.
ansonsten: keine timer, keine uart. und damit ist dein vorhaben schon 
den bach runter.

> Den Bootloader hätte ich auch als Code da...
schon der vernünftigere ansatz.
> Aber was muß ich ändern, damit der richtige Speicher genommen wird ?
zeile 42...
WELCHEN bootloader hast du denn?

von B.A. (Gast)


Lesenswert?

ich habe den CAN-Bootloader:
http://www.kreatives-chaos.com/artikel/can-bootloader

mein Problem...

Das HEX-Fil von meiner Application läuft (mit ISP aufgespielt) 
fehlerfrei.
Wenn ich den BOOTLOADER aufspiele, kann ich per CAN starten, die Daten 
übertagen und die Application starten.
Alles verläuft fehlerfrei, aber die Application startet nicht, sondern 
wieder der Bootloader.....
Deswegen meine Vermutung: Der Bootloader liegt im falschen Bereich...

von Michael H. (michael_h45)


Lesenswert?

Hast du die BOOTRST Fuse richtig gesetzt?

von B.A. (Gast)


Lesenswert?

Ja, er Haken ist drin.
Leider habe ich keinerlei Möglichkeit, mein Programm zu testen.
Aber Die Rückmeldung des Bootloaders kommt, die Pages wurden angeblich 
gespeichert.

Wie kann ich prüfen, ober der Bootloader im richtigen Speicher ist ???

Es gibt aber scheinbar auch kein fertiges CAN-Bootloader-Programm für 
Windows...

Ich werde mein Programm mal auf RS232 umschreiben und einen 
RS232-Bootloader zum TEST aufspielen...

von Thomas E. (thomase)


Lesenswert?

B.A. schrieb:
> ab Adresse 0000 in den Flash geschrieben, oder ???
Da gehört ja nun gar nicht hin.

Sondern dahin:
SubZeroX schrieb:
> -Wl,--section-start=.text=0x1800
Das ist aber bei jedem Controller unterschiedlich.

B.A. schrieb:
> Ich habe leider keine Beschreibung gefunden, wie der Bootloader gebrannt
> werden muss...
> Es ist gut möglich, dass diese Frage schon mal beantworten wurde, aber
> wenn ich im Forum nach BOOTLOADER suche, dann brauche ich ne Woche
> Urlaub zum lesen...
Dann hast du allerdings schon, bevor du angefangen hast zu suchen, 
festgestellt, daß du fürs Lesen eine Woche brauchst.

Da steht alles drin, was du wissen musst:
http://www.mikrocontroller.net/articles/AVR_Bootloader_in_C_-_eine_einfache_Anleitung

mfg.

von Thomas (Gast)


Lesenswert?

B.A. schrieb:
> Wie kann ich prüfen, ober der Bootloader im richtigen Speicher ist ???

Speicher über ISP auslesen?

von B.A. (Gast)


Lesenswert?

Thomas Eckmann schrieb:
> Dann hast du allerdings schon, bevor du angefangen hast zu suchen,
> festgestellt, daß du fürs Lesen eine Woche brauchst.

Ja, ich hatte 3 Wochen Urlaub geplant und eine Woche war noch übrig... !

Ne, mal langsam... nicht unfreundlich werden... es sind nicht alle so 
schlau wie du...

von Michael H. (michael_h45)


Lesenswert?

Hast du denn den Bootloader für deinen AVR konfiguriert und compiliert? 
Wenn er die Applikation an einer falschen Adresse im Flash vermutet und 
diese Adresse dann anspringt, kann auch ein Reset ausgelöst werden. Das 
würde erklären, warum sich wieder dein Bootloader meldet.

von Thomas E. (thomase)


Lesenswert?

B.A. schrieb:
> Ne, mal langsam... nicht unfreundlich werden... es sind nicht alle so
> schlau wie du...
Nun pampel hier mal nicht rum. Schliesslich stehst du hier auf dem 
Schlauch.

Michael H. schrieb:
> Wenn er die Applikation an einer falschen Adresse im Flash vermutet und
> diese Adresse dann anspringt, kann auch ein Reset ausgelöst werden.
Ein Reset wird nicht ausgelöst.
Der rauscht halt einfach durch die FFs des leeren Flash, bis er wieder 
beim Bootloader angekommen ist. Startadresse der Applikation ist immer 
0.

Aber springt denn der Bootloader auch dahin? Nach einem Reset startet 
der Bootloader. Dafür sorgt die Bootloader-Fuse. Dann muß der Bootloader 
entscheiden, ob ein Upload erfolgen oder die Applikation starten soll.

mfg.

von B.A. (Gast)


Lesenswert?

Sorry, ist mein erster Bootloader... und ich verzweifle schon seit 
Tagen...

Nochmal von vorn:
Aktuell habe ich nen ATMEGA8 und nen Bootloader mit 512Words.
Die Fuses sind OK.

Ich habe -Ttext=0x1800 und -Ttext=0x0c00 probiert, leider habe ich keine 
Ahnung, wo man die Werte her bekommt.
Ich denke mal Flash-Speicher-Bootloader...

Bei beider Varianten kann ich den Bootloader aufspielen und starten.
Aber mein Programm startet nicht.

Gibt es kein Test-Programm ?

von Michael H. (michael_h45)


Lesenswert?

B.A. schrieb:
> Aktuell habe ich nen ATMEGA8 und nen Bootloader mit 512Words.
>
> Ich habe -Ttext=0x1800 und -Ttext=0x0c00 probiert, leider habe ich keine
0x0e00 ist bei 512 Worten korrekt. Siehe Datenblatt.
Passt dein Bootloader in 512 Worte = 1024 byte?

Falls es nicht klappt, lies doch mal das Flash aus, nachdem du erst nur 
den Bootloader geladen und dann nochmal, nachdem du deine Applikation 
via Bootloader geladen hast.

von B.A. (Gast)


Lesenswert?

OK, ich probier es mal mit 0x0e00
Vielen Dank erstmal...

von Michael H. (michael_h45)


Angehängte Dateien:

Lesenswert?

Michael H. schrieb:
> Siehe Datenblatt.

von Michael H. (michael_h45)


Lesenswert?

Thomas Eckmann schrieb:
> Michael H. schrieb:
>> Wenn er die Applikation an einer falschen Adresse im Flash vermutet und
>> diese Adresse dann anspringt, kann auch ein Reset ausgelöst werden.
> Ein Reset wird nicht ausgelöst.
> Der rauscht halt einfach durch die FFs des leeren Flash, bis er wieder
> beim Bootloader angekommen ist. Startadresse der Applikation ist immer
> 0.
Da hast du völlig Recht.

von Thomas E. (thomase)


Lesenswert?

B.A. schrieb:
> OK, ich probier es mal mit 0x0e00
Probier' das gar nicht erst aus. Das funktioniert so nicht.
Das ist die Word-Adresse, die der Atmega adressiert. Im Linker muß aber 
die Byteadresse eingestellt werden: Wordadresse x 2.
Also 0xE00 x 2 = 0x1C00.
Die Befehle zum Beschreiben des Flash funktionieren auch nur im 
Bootsektor!

B.A. schrieb:
> Ich habe -Ttext=0x1800 und -Ttext=0x0c00 probiert, leider habe ich keine
> Ahnung, wo man die Werte her bekommt.
Mit rumprobieren wird das auch nichts.

Das lässt sich auch ganz einfach ausrechnen:
Atmega = 8K Flash = 8192 Bytes
8K Flash -1K Bootsektor = 8192 - 1024 = 7168
macht in Hex 0x1C00

mfg.

von B.A. (Gast)


Angehängte Dateien:

Lesenswert?

ich komme hier irgendwie nicht weiter...
Anbei der gelesene Speicher des ATMEGA8.
Irgendwas stimmt da nicht, oder ?
Muß Ich noch etwas einstellen, um den Bootloader an diese Adresse zu 
speichern ?

von Michael H. (michael_h45)


Lesenswert?

Thomas Eckmann schrieb:
> Das ist die Word-Adresse, die der Atmega adressiert. Im Linker muß aber
> die Byteadresse eingestellt werden: Wordadresse x 2.
heute ist nicht mein tag...

von Thomas E. (thomase)


Lesenswert?

B.A. schrieb:
> Muß Ich noch etwas einstellen, um den Bootloader an diese Adresse zu
> speichern ?
Ja natürlich. Woher soll der Compiler denn wissen, daß das ein 
Bootloader ist, der bei 0x1C00 anfängt? Der Compiler muß das auch nicht 
wissen, aber der Linker.

Thomas Eckmann schrieb:
> Da steht alles drin, was du wissen musst:
> http://www.mikrocontroller.net/articles/AVR_Bootlo...
Soll dir das jetzt einer vorlesen?

Da steht,was du machen musst:
Schritt 1 - Konfiguration der Projekteinstellungen

mfg.

von Thomas E. (thomase)


Lesenswert?

Michael H. schrieb:
> heute ist nicht mein tag...
Das liegt an der Zeitumstellung.

mfg.

von B.A. (Gast)


Lesenswert?

Ich bitte vielmals um Entschuldigung für die blöden Fragen...
Aber trotzdem vielen Dank für eure Hilfe ;-)

Wenn man etwas kann, ist es sehr leicht über jemanden zu spotten...
Aber dafür ist dieses Forum ja da.

Ich mache sowas eben nicht jeden Tag und deswegen bin ich froh, dass es 
euch hier gibt ...

Vielen DANK...

von B.A. (Gast)


Lesenswert?

Thomas Eckmann schrieb:
> Thomas Eckmann schrieb:
>> Da steht alles drin, was du wissen musst:
>> http://www.mikrocontroller.net/articles/AVR_Bootlo...

Auf dem LINK kommt nur ne leere Seite...
Und damit soll man was lernen ???

von Thomas E. (thomase)


Lesenswert?

B.A. schrieb:
> Wenn man etwas kann, ist es sehr leicht über jemanden zu spotten...
> Aber dafür ist dieses Forum ja da.
Es spottet niemand über dich. Und das Forum ist auch nicht dazu da.

Aber ich habe dir schon um 22.12 den Link geschickt, wo ziemlich am 
Anfang genau die Lösung dessen beschrieben ist, was dich seit du damit 
angefangen hast, verzweifeln lässt.

Lies' dir das einfach durch. Dann verstehst du das auch.

mfg.

von B.A. (Gast)


Lesenswert?

egal, welche Adresse ich reinschreibe,
in der HEX-Datei fängt es immer bei 0000 an...

von Thomas E. (thomase)


Lesenswert?

B.A. schrieb:
> Auf dem LINK kommt nur ne leere Seite...
> Und damit soll man was lernen ???

http://www.mikrocontroller.net/articles/AVR_Bootloader_in_C_-_eine_einfache_Anleitung#Schritt_1_-_Konfiguration_der_Projekteinstellungen

Das ist ja auch nur der Hinweis auf den Link oben. Hättest du schon 
lange angeklickt haben können. Der funktioniert nämlich. Und dieser 
auch.

B.A. schrieb:
> egal, welche Adresse ich reinschreibe,
> in der HEX-Datei fängt es immer bei 0000 an...
Wo schreibst du die Adresse denn hin?

mfg.

von B.A. (Gast)


Angehängte Dateien:

Lesenswert?

ich hatte den Speicher erst mit -Ttext=0x1C00festgelegt, dann mit
-Wl,--section-start=.text=0x1C00

von Stefan E. (sternst)


Lesenswert?

Falsche Stelle. Entweder unter [Linker Options], oder bei den "Memory 
Settings" eintragen. Aber Vorsicht, bei letzterem ist die Word-Adresse 
nötig.

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.