Gast
#165830
Hallo zusammen! Bei meinem ATmega128 möchte ich den ungenutzten Flashspeicher "hinten" als Datenspeicher nutzen. Meine erste Begegnung mit der SPM-Anweisung. Ganz bescheiden versuche ich erstmal, eine Seite zu löschen und mit einem Bytemuster zu füllen: .include "m128def.inc" ldi r16, 0 mov r0, r16 ; r0 und r1 bilden das Datenwort, mov r1, r16 ; das durch SPM geschrieben wird ldi r16, 1 ; in die obere Speicherhälfte schreiben out RAMPZ0, r16 ldi ZH, 0xFF ; die hinterste Page auswählen ldi ZL, 00 ; Seite löschen ldi r16, (1<<PGERS) | (1<<SPMEN) sts SPMCSR, r16 spm SPM_Warteschleife: ; sicherheitshalber abfragen, ob fertig lds r16, SPMCSR sbrc r16, SPMEN rjmp SPM_Warteschleife Pufferschleife: spm inc ZL inc ZL inc r0 inc r1 inc r1 brne Pufferschleife ; Seite schreiben ldi ZL, 00 ; zum Schreiben auf Seitenanfang zurücksetzen ldi r16, (1<<PGWRT) | (1<<SPMEN) sts SPMCSR, r16 spm SPM_Warteschleife1: lds r16, SPMCSR sbrc r16, SPMEN rjmp SPM_Warteschleife1 sbi PORTB, 7 ; LED an ... Also, das Programm läuft durch, aber die letzte Flashseite bleibt leer. Ich habe sicherheitshalber noch die Warteschleife reingesetzt, ob SPMEN wieder zurückgesetzt ist (obwohl während des Flashens in der NRWW-Sektion ja ohnehin die CPU halten sollte), aber das hilft auch nichts. Alle Schreibsperren sind unprogrammiert, die Fuses sowieso. Auch ein Versuch im RWW-Teil blieb erfolglos. Grundsätzlich muß man aber ja laut Beschreibung vom RWW-Teil auch beliebig flashen dürfen, nur halt bei angehaltener CPU. Wo ist mein Verständnisfehler?