Hallo Forum, ich habe hier einen ATmega256 und einen Bootloder. In der Boot-Section befinden sich nur drei Funktionen, löschen, Daten schreiben und kopieren. Diese werden aus dem normalen Codebereich aufgerufen. Das Flashen klappt soweit prima. Ich schreibe die hälfte des Flashes voll, dann wird umkopiert. Aber selten, bei 1 von 10 Versuchen, passiert folgendes: Nach Schreiben einer Page wird der RWW Flash nicht wieder enabled. Was zur folge hat, dass beim Rücksprung in den normalen Code nur noch 0x00 (Nop) gelesen wird. Dann hilft nur noch ein Reset. Die Page wurde zuvor korrekt geschrieben. Durch das Auslesen nach dem Fehler konnte ich das sehen. Das RWWSB Bit ist auch immernoch gesetzt. Im Debugger lässt es sich nicht zurücksetzen. Der Fehler ist bislang nur beim Schreiben in die oberen 128k augetreten. Innerhalb der der Boot-Funktionen ist der Interrupt ausgeschaltet und der EEprom wird auch vorher geprüft. Was kann das sein?
Rangi Jones schrieb: > Was kann das sein? Für die Flash-Operationen sind Registerzugriffe innerhalb eines absichtlich (zum Schutz vor den Folgen unkontrollierter Abläufe bei Abstürzen) sehr engen Timings nötig. Dieses Timing kann nur zuverlässig sichergestellt werden in einer Sprache, bei der man die volle Kontrolle über das Zeitverhalten des Codes hat. Und höchstwahrscheinlich benutzt du keine solche Sprache, sondern C...
c-hater schrieb: > Und höchstwahrscheinlich benutzt du keine solche Sprache, sondern C... Du nervst. Rate mal, wozu im AVR-GCC die <boot.h> gedacht ist?
Peter Dannegger schrieb: > Du nervst. > Rate mal, wozu im AVR-GCC die <boot.h> gedacht ist? Nun, vermutlich wohl dazu, um den diesbezüglichen Assemblercode in boot.c hinter noch einer Schicht Syntax-Geschwalle zu verstecken... Oder was wolltest du jetzt lesen?
Rangi Jones schrieb: > Nach Schreiben einer Page wird der RWW Flash nicht wieder enabled. Könnte ein Problem mit der Taktfrequenz sein. Welche Frequenz und VCC benutzt Du? Wenn ein Quarz angeschlossen ist, ist er im Full-Swing Mode? Du kannst ja mal testweise den CPU-Prescaler wärend des Programmierens runter setzen. Das Programmieren wird ja mit dem internen RC-Oszillator getimed. Ist da noch die Factory-Calibration gespeichert oder liegt er stark daneben.
@c-hater Ich hab natürlich die Makros aus der boot.h verwendet. Das Asm-Listing sieht so aus wie man das erwartet. @Peter 16Mhz @ 3.3V Das mit der Takt kann ich mal testen.
Peter Dannegger schrieb: > Liegt außerhalb der Spezifikation des ATmega2560 Geht es denn um den? Man könnte sich auch ein RFR2 hinter die 256 denken. Der kann mit 16MHz von 1,8 bis 3,6V. Bei unklaren Angaben redet man leider schnell aneinander vorbei. Denn einen Atmega256 gibt es nicht. mfg.
Ja, sorry. Hätte ich gleich reinschreiben können, ich dachte es ist vllt ein allgemeines Problem. Es ist ein RFR2
Das Runtertackten mit CLKPR=0x80; CLKPR=0x02; scheint funktioniert zu haben. Es ist wirklich ein Problem mit der Geschindigkeit vom Flash. Thx für die Hilfe.
Errata ATmega2560 rev. A: Non-Read-While-Write area of flash not functional The Non-Read-While-Write area of the flash is not working as expected. The problem is related to the speed of the part when reading the flash of this area. Problem Fix/Workaround - Only use the first 248K of the flash. - If boot functionality is needed, run the code in the Non-Read-While-Write area at maximum 1/4th of the maximum frequency of the device at any given voltage. This is done by writing the CLKPR register before entering the boot section of the code. ^^ Das könnte es sein
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.