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
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
Hat man sofort in Zeile 42 gesehen, den Fehler. Wir wollten nur sehen ob Du selbst darauf kommst.
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.