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?
...der beitrag ist zwar hornalt, ein neues thema möchte ich deswegen nicht öffnen, da der threadsteller genau mein problem beschreibt. für mich als anfänger ist der eingestellte code sinnig und nachvollziehbar, nur funktioniert es nicht. es kann doch nicht so schwer sein,eine page im pm zu löschen/definiert zu füllen??? vielleicht kann mir jemand einen kleinen anstupser in die richtige richtung geben? mfg lyra
lyra schrieb: > vielleicht kann mir jemand einen kleinen anstupser in die richtige > richtung geben? Bootloader mfg.
AVR unterscheidet zwischen Bootloader Section und Application Section. Der SPM Befehl funktioniert nur aus der Bootloader Section heraus. Wenn man Du so etwas machen willst, brauchst Du eine kleine Funktion am Ende des Speichers (in der BLS), die zumindest die Schreib/Lösch-Operationen übernimmt.
hallo Thomas und holger, vielen dank für die schnelle antwort! habe die zeit genutzt und das internet weiter nach für mich verwertbaren infos durchsucht. leider gibt es tatsächlich nicht allzuviel zu diesem thema,womit "anfänger" gut zurecht kämen. eure tips bzgl. des bootloaders waren prima, hab jetzt schon eine menge herausgefunden. im grunde ist es garnicht so schwer, wenn man es einmal durchschaut hat...das page löschen hat jetzt auf jeden fall geklappt ;-) habt ihr vielleicht eine idee, was genau der temporäre page-puffer ist? leider geht das aus keiner doku hervor...sollte dazu der ram genutzt werden? danke nochmal und ein schönes we lg lyra
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.