mikrocontroller.net

Forum: Compiler & IDEs Bootloader Mega256


Autor: Marcus Müller (marcus67)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
ich habe einen Bootloader, den ich bisher mit verschiedenen Atmegas 
genutzt habe (Atmega32,64,644). Geschrieben ist er mit AVRGCC 20070525.

Ich habe jetzt ein neues Projekt mit dem Mega2561. Auch darauf 
funktioniert der Bootloader mit ein paar kleinen Anpassungen 
(Adressgrößen auf 32 Bit geändert).
Jetzt ist mein Projekt aber das erste mal größer als 32KB geworden - und 
plötzlich läuft nichts mehr. Ich habe den Inhalt des Atmels mal 
ausgelesen und festgestellt, daß alles mit Wortadressen > 0x4000 bei der 
Wortadresse 0x1C000 erscheint. Sprich alles was ab Adresse 32768 im 
Speicher liegt wird auf eine viel höhere Adresse gemappt.

Ich habe auch schon geprüft, daß die richtigen SPM Routinen verwendet 
werden (Extended Versionen). Auf einem Mega64 ist es kein Problem 
Adressen über 32768 zu schreiben.

Ist eigentlich ziemlich unlogisch - normal sollten die Probleme wenn 
erst über 65536 auftreten ...

Hat irgendjemand eine Idee woran das liegen könnte ?

Gruß, Marcus

Autor: Marcus Müller (marcus67)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich denke ich habe den Fehler gefunden ...

Ich berechne die Flash Adresse aus mehreren unsigned char und Int 
Werten. Erst das fertige Ergebnis wird in den unsigned long geschrieben.

Daher rechnet der Compiler natürlich brav (und definitionsgemäß) erst in 
Int (16 Bit signed) und speichert dann erst das (natürlich falsche) 
Ergebnis im unsigned long.

Blöder Fehler ...

Gruß, Marcus

Autor: Quentchen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat man sofort in Zeile 42 gesehen, den Fehler. Wir wollten nur sehen ob 
Du selbst darauf kommst.

Autor: Marcus Müller (marcus67)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Mega256 ist ja durchaus etwas anders als die Atmegas davor, da er 
als erstes Device mehr als 64K Worte Flash hat. - Könnte ja zu einem 
anderen Verhalten beim Flashen führen, oder ?

Gruß, Marcus

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Marcus Müller schrieb:
> Daher rechnet der Compiler natürlich brav (und definitionsgemäß) erst in
> Int (16 Bit signed)

Was spricht denn gegen "unsigned int"?

Oder hat Dein AVR negative Flash-Adressen?


Peter

Autor: Marcus Müller (marcus67)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Spezialausführung mit mit 128KB Flash mit Adresse < 0 und 128 > 0 :-)

Spaß beiseite: Die eigentliche Adresse ist ein unsigned long. Da die 
Flash Adressen Byteadressen sind ist das ab dem Mega128 nötig.

Nur innerhalb der Berechnung (in einem Ausdruck) hat der Compiler 
Defaultmäßig zunächst int genutzt. Nachdem ich es einmal gefunden hatte, 
ließ es sich leicht wegcasten.

Gruß, Marcus

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.