Forum: Compiler & IDEs Bootloader Mega256


von Marcus M. (marcus67)


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

von Marcus M. (marcus67)


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

von Quentchen (Gast)


Lesenswert?

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

von Marcus M. (marcus67)


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

von Peter D. (peda)


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

von Marcus M. (marcus67)


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

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.