PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Array in EEPROM / ERAM schreiben



2512708
13.10.2009, 05:12
Hallo,

ich habe folgendes Problem:
Bei meinem Höhenmesser speichere ich die Messdaten in einem Array welches im RAM abgelegt ist. Nun möchte ich, damit die Daten bei fehlender Betriebsspannung erhalten bleiben, diese Werte in das ERAM schreiben.

Wegen der begrenzten Anzahl an Schreibvorgängen auf ein ERAM soll man dieses ja nicht mit Hilfe einer Schleife, sondern blockweise beschreiben (deshalb auch mein Umweg über das Array im RAM). Leider lässt sich aber das Array nicht einfach kopieren a´la



Dim ESpeicher(800) as Eram Integer
Dim Speicher(800) as Integer

Speicher(800) = ESpeicher(800)



Gibt es eine andere Möglichkeit?

Danke

for_ro
13.10.2009, 06:48
Hallo,
Wegen der begrenzten Anzahl an Schreibvorgängen auf ein ERAM soll man dieses ja nicht mit Hilfe einer Schleife, sondern blockweise beschreiben (deshalb auch mein Umweg über das Array im RAM).
Es ist nicht die Zahl von Schreibvorgängen auf das EEPROM an sich, sondern die Zahl auf jede einzelne Zelle ist beschränkt (min. 100000).
Daher ist es vollkommen unerheblich, ob du einzelne Bytes in einer Schleife oder ein ganzes Array schreiben würdest.
Außerdem ist nicht klar, bei welchen µC Typen der bekannte Fehler mit dem ersten EEPROM Byte besteht. Daher sollte diese besser nicht benutzt werden.

2512708
13.10.2009, 11:39
Ok.

Das heist aber, dass ich das erste Byte auslassen muss und mit dem 2. beginne.
Wie mach ich das denn?
Ich wollte eigentlich nur meine Array-Schleife direkt ins ERAM schreiben, so wie ich es ins RAM gemacht habe. Kann ich dazu das "Start-Byte", oder vielleicht sogar den ganzen Bereich, definieren?
Noch was anderes: Stimmt es dass man in das ERAM nur einzelene Bytes schreiben kann? Ich hab das irgendwo in einem anderen Zusammenhang mal gelesen. Dort wurde deshalb eine Word- Variable in zwei Bytes zerlegt und beim Auslesen wieder zusammengesetzt.

ikarus_177
13.10.2009, 17:39
Hi,


Stimmt es dass man in das ERAM nur einzelene Bytes schreiben kann? Ich hab das irgendwo in einem anderen Zusammenhang mal gelesen. Dort wurde deshalb eine Word- Variable in zwei Bytes zerlegt und beim Auslesen wieder zusammengesetzt.

Microcontroller sind (meist) 8-bit Systeme. Daher werden alle Werte/Variablen bei der Speicherung in einzelne Bytes "aufgeteilt", da ja die Speicherstellen nur 8 bit breit sind. Es können also gar keine 16-bit Werte gespeichert werden (physikalisch), auch wenn es vielleicht im Programm den Anschein hat, hier erledigt der Compiler nämlich die ganze Arbeit mit der "Aufteilerei".

Viele Grüße

for_ro
13.10.2009, 19:11
Nur um das nochmal richtig klar zu machen:
Du kannst natürlich von deinem Programm aus andere Wert als Bytes in das EEPROM schreiben. Die benötigen dann dort, ebenso wie im SRAM, eben mehrere Bytes. Also z.B. so:

Dim dummy As Eram Byte 'Dies landet in der EEPROM Zelle 0
Dim X_Eram As Eram Word 'Dies landet in den EEPROM Zellen 1 + 2
Dim X_Sram As Word
X_Sram = &HAA55
X_Eram = X_Sram

2512708
17.10.2009, 11:20
Im Simulator kann ich nun beobachten wie die Werte ins SRAM und ERAM geschrieben werden.
Leider lässt sich anschließend mit dem Print Befehl nur der SRAM ausgeben.
Bei


Print Espeicher(index)


kommt schon beim kompilieren die Fehlermeldung:

Numeric Parameter expected [ESPEICHER(INDEX)]

Was ist denn das nun wieder?

Hier noch die relevanten Codeabschnitte:



Dim Speicher(8) As Integer
Dim Espeicher(8) As Eram Integer
Espeicher(8) = Speicher(8)
Dim Index As Word

...
Speicher(index) = Alt
Espeicher(index) = Speicher(index)
...

...
For Index = 1 To 8
Print Espeicher(index)
Next Index
...


Wie gesagt, das geht komischerweise:



For Index = 1 To 8
Print Speicher(index)
Next Index

for_ro
17.10.2009, 12:54
Noch mal zur Klärung:
ERAM-Variablen kannst du nur in Zuweisungen mit SRAM-Variablen nutzen. Ausschließlich.

Also dies hier

Espeicher(1) = x
x = Espeicher(3)

Alles andere geht nur über SRAM Variablen.

2512708
17.10.2009, 14:58
Danke, jetzt hab ichs endlich gecheckt!

Keine math. Berechnungen, Funktionen o.ä. mit ERAM.
Alles mit SRAM machen.

1. Code mit SRAM schreiben
2. Gleiche Speicherplätze im ERAM reservieren
3. ERAM mit SRAM füllen
4. Zum Auslesen des ERAM zuerst den SRAM mit den gespeicherten Werten füllen und dann SRAM auslesen.



Dim Speicher(8) As Integer '1.
Dim Espeicher(8) As Eram Integer '2.

Espeicher(index) = Speicher(index) '3.

For Index = 1 To 8 '4.
Speicher(index) = Espeicher(index)
Print Speicher(index)
Next Index



Ganz schön umständlich und speicherfressend finde ich. Jetzt verstehe ich auch was damit gemeint ist, wenn von den Nachteilen von BASCOM gegenüber C gesprochen wird. Naja, macht nix. Vorerst bleibe ich bei BASCOM, funktioniert ja.

Danke nochmal an alle.