Varibale im Flash speichern

boritian

Neues Mitglied
20. Juli 2010
8
0
0
Sprachen
Hallo,

ich habe das EVK1100 und möchte Varibale für einen Konfigurationswert im Flash-EEPROM speichern und bei start auslesen.

Hat jemand dies schon mal gemacht und kann mir eine Empfehlung geben, welcher Befehl/Treiber im AVR-Framework das kann. Denke man muss hier die Welt nicht neu erfinden und direkt in Adressen schreiben.

Vielen Dank für Eure Empfehlungen.

Danke
boritian
 
Hi
Also, ich habe mal Daten in den EEProm eines Atmega8 geschrieben. Daten, die nach einem Spannungsausfall und Neustart wieder verfügbar sein müssen. Allerdings ist das nicht Flash sondern EEProm.
Das läuft in etwa so ab:
Code:
;---------------------- Zeichen in EEprom schreiben --------------------
Write_EProm:	
	SBIC EECR, EEWE	; warten, bis EEProm freigegeben ist
	RJMP  Write_EProm
	OUT    EEARH, XH	; Adr. in EEProm - Adressreg. kopieren
	OUT    EEARL, XL
	OUT    EEDR, Buf_Reg	; Daten schreiben
	IN       S_Merker, SReg
	CLI                               ; Interrupts während Schreibvorgang sperren
	SBI     EECR, EEMWE	; Schreiben vorbereiten
	SBI     EECR, EEWE     ; schreiben
	OUT    SReg, S_Merker	; SReg wieder herstellen; Interrupts freigeben
   RET
;********************************************************

Code:
;----------------- Zeichen aus EEProm lesen -----------------------------
Read_EProm:
	SBIC	EECR, EEWE
	RJMP	Read_EProm	; warten, bis Eprom-Schreib beendet
	OUT	EEARH, XH
	OUT	EEARL, XL	; Adr. in EEProm - Adressreg. kopieren
	SBI	EECR, EERE	; Lesezyklus einleiten, Flag setzen
	IN 	Buf_Reg, EEDR	; EEProm-Daten übertragen
RET
;********************************************************
Um einen Datenblock zu kopieren, setzt du das Register X auf den Bockanfang.
z.B.
Dein Variablenblock ist wie folgt deklariert:
Mein_Erster_Satz: .Byte 20
und im ESEG hast du
Satzfeld: .db 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20

Dann beginnst du mit deiner Kopierroutine wie folgt:
Code:
Werte_Copy:
     LDI    Index_Reg,0

Schleife:
     LDI	XL,LOW(Mein_Erster_Satz)	; Pointer Quelle
     LDI	XH,HIGH(Mein_Erster_Satz)	
     LDI	ZL,LOW(Satzfeld)		; Pointer Ziel
     LDI	ZH,HIGH(Satzfeld)		
    ADD	XL, Index_Reg                    ; Offset addieren
    ADC	XH, Zero                           ; 16 Bit-Addition, deshalb noch 0 addieren
    ADD	ZL, Index_Reg
    ADC	ZH, Zero                           ; Zero ist ein Register auf 0 gesetzt
    LD	Buf_Reg, Z                        ; Register Buf_Reg ist Wertübergabe
    RCALL	Write_EProm                      ; und schreiben 
    INC    Index_Reg                         ; Index erhöhen
    CPI IndexReg, 20                         ; Grenze abfragen
    BREQ Zum_Ende                          ; beenden
    RJMP Schleife                              ; oder weiter
Zum_Ende: Ret
Vieleicht helfen diese beiden Codeschnipsel.
Gruß oldmax
 
Hi boritian,

schau dir mal die #include "flashc.h" und die flashc.c an. Diese liegt in FRAMEWORK\DRIVERS\FLASHC .

Da könnte für dich z.B.

volatile void *flashc_memset32(volatile void *dst, U32 src, size_t nbytes, Bool erase)

ganz nett sein als Funktion. Natürlich die anderen auch aber.. damit solltest du weiter kommen.

gruß,
Manuel
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)