Forum: Mikrocontroller und Digitale Elektronik ATmega256 RWW Enable funktioniert selten nicht


von Rangi J. (rangi)


Lesenswert?

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?

von c-hater (Gast)


Lesenswert?

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...

von Peter D. (peda)


Lesenswert?

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?

von c-hater (Gast)


Lesenswert?

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?

von Peter D. (peda)


Lesenswert?

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.

von Rangi J. (rangi)


Lesenswert?

@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.

von Peter D. (peda)


Lesenswert?

Rangi Jones schrieb:
> 16Mhz @ 3.3V

Liegt außerhalb der Spezifikation des ATmega2560.

von Thomas E. (thomase)


Lesenswert?

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.

von Rangi J. (rangi)


Lesenswert?

Ja, sorry. Hätte ich gleich reinschreiben können, ich dachte es ist vllt 
ein allgemeines Problem.
Es ist ein RFR2

von Rangi J. (rangi)


Lesenswert?

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.

von Rangi J. (rangi)


Lesenswert?

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
Noch kein Account? Hier anmelden.