Forum: Mikrocontroller und Digitale Elektronik BASCOM --> Variablewert sparsam im EEPROM ablegen


von Sven Scholz (Gast)


Lesenswert?

Hallo,

mal eine ganz beknackte Frage zu Bascom.
Ich möchte gerne eine Longvariable, die unter Bascom bekanntlich 4 Byte 
benötigt, in den internen EEPROM zwischenspeichern. Der Wert der 
Variable sei mit 87654321 angenommen.

Wie lege ich jetzt diese große Zahl in mein EEPROM, sodass diese auch 
wirklich nur 4 Byte dort belegt?

Zusatz:
Vor die Zahl kommt noch der String "Datum;" (7 Byte), sodass 
"Datum;87654321" abspeicher werden soll.
Um dies zu bewerkstelligen habe ich bisher immer meine Long-Variable mit 
str() in einen String konvertiert und dann daraus mir einen neuen 
zusammengesetzten String (datumstring + longstring) geschaffen. Dies 
benötigt dann aber ungefähr 15 Byte an Speicherplatz, im Gegensatz zur 
wünschwerten besseren Alternative (7 Byte für den String + 4 Byte für 
den Long-Wert).

Ich weiß nur nicht, wie man so etwas realisiert? Was hat es eigentlich 
mit ERAM-Zusatz in der Deklaration auf sich?
etwa: bx as ERAM byte

DANKE erst einmal.

PS: Gibt es eigentlich eine Möglichkeit einen String etwa "1350" in 
einen double zu verwandeln?

von André K. (andre-)


Lesenswert?

Wenn du die Zahl 87654321 in einen String wandelst, dann hat dieser 
String in Bascom die Laenge 8 + 1 = 9Byte (+1 wegen der End-0). Dazu 
kommen die 6 Byte aus deinem anderen String, macht genau 15.

Es gibt nun die Moeglichkeit, Speicherplatz zwischen Eeprom und Flash 
hin-oder herzuschieben, je nachdem, in welchem Format du die 
gespeicherten Daten spaeter benoetigst

1. Moeglichkeit: Du Legst den String im Eeeprom als String ab, die Zahl 
als Long. Macht 6 + 1 + 4 Byte = 11 Byte.

2. Moeglichkeit: Du speicherst alles direkt als String ab, wie du oben 
beschrieben hast.

Nach Moeglichkeit 1 wuerde ich es so machen:

dim strx as eram string *6
dim longx as eram long

strx= "Datum;"  'warum legst du diesen String eigentlich in den Eeprom??
longx = 87654321

Was das Eram bedeutet, kannst du in der Hilfe unter dem Befehl 'Dim' 
nachlesen.

von Marco (Gast)


Lesenswert?

>Wie lege ich jetzt diese große Zahl in mein EEPROM, sodass diese auch
>wirklich nur 4 Byte dort belegt?

Writeeeprom Variabelnname(mit der 87654321 dirn), 1

,1 Weil die erste Zelle im EEPROM bei einem Reset gelöscht werden kann. 
Ich weiss nicht, ob das alle Typen betrifft oder nur eine bestimmte 
Serie. Von Atmel gibt es eine AppNote dazu.
Ich persönlich fange deshalb grundsätzlich immer bei 1 an.

Die nächste Variable kannst du dann an der EEPROMZelle 5 abspeichern.

Zumindest mit Words geht das. Da werden dann zwei Zellen belegt. Und 
schreiben und lesen geht so als ob es ein Byte wäre. Nur das mehr Zellen 
belegt werden.

Muss das "Datum" im EEPROM wirklich als Wort stehen?
Der Schreibzugriff und der Speicherplatz sind begrenzt.
Du kannst ja auch Merker schreiben.
1 für Datum, 2 für Zeit, 3 für was auch immer du noch so hast. Und das 
im Programm auswerten. Somit wird nur ein Byte benötigt. Das Datum 
bräuchte dann 6 Bytes.

Dann kannst du evtl auch eine Routine einbauen, die die Zellen der Reihe 
nach beschreibt und wenn sie am Ende angekommen ist, wieder bei 1 
anfängt. Somit werden die Zellen gleichmäßig belastet. Ist aber nur so 
eine Idee. Ich weiss ja nicht, wieviel EEPROM du zur Verfügung hast und 
wie oft er beschrieben wird.

von Hannes L. (hannes)


Lesenswert?

> ,1 Weil die erste Zelle im EEPROM bei einem Reset gelöscht werden kann.

Ich habe die Feststellung gemacht, dass die EEP-Zellen betroffen sind, 
auf die das Register EEAR zeigt (also die gerade adressiert sind). 
Seitdem ich nach jedem EEP-Zugriff (Schreiben wie Lesen) EEAR auf eine 
unbenutzte Zelle (0) setze, hatte ich nie wieder EEP-Datenverluste. Ich 
schreibe allerdings in ASM.

...

von Ralf Bode (Gast)


Lesenswert?

Also den internen EEPROM nutze ich zur Zeit für Datenloggeraufgaben. 
Werde dies aber später von einem externen EEprom übernehmen lassen.

Danke für die vielen Hinweise und Ideen. Wenn ich einen Zeitstempel habe 
in der Form Monat-Tag-Stunde-Minute also z.B. "12120453" (12.12. 4:53), 
kann ich diesen irgendwie in einen LONG umwandeln? Dann könnte ich ja 
diesen String auch als Zahl behandeln und der würde mir nur 4 Byte 
wegnehmen.

Wird mit dem Zusatz ERAM automatisch ein Pointer auf die Speicheradresse 
generiert? Kann ich so einfach viele Werte hintereinander ablegen? Wäre 
nicht schlecht wenn dem so wäre...

von Hannes L. (hannes)


Lesenswert?

Ralf Bode wrote:
> Wenn ich einen Zeitstempel habe
> in der Form Monat-Tag-Stunde-Minute also z.B. "12120453" (12.12. 4:53),
> kann ich diesen irgendwie in einen LONG umwandeln? Dann könnte ich ja
> diesen String auch als Zahl behandeln und der würde mir nur 4 Byte
> wegnehmen.

Wenn Du von vornherein nur die Minuten zählst, dann reicht eine 
24-Bit-Zahl für knapp 32 Jahre. Diese würde dann als minutengenauer 
Zeitstempel nur 3 Bytes beanspruchen.

Wenn Du unbedingt 4 Bytes nutzen willst, dann reicht das 8171 Jahre bei 
Minuten-Auflösung oder 136 Jahre bei Sekundenauflösung.

Du musst also nur definieren, wann Deine "Minute Null" oder "Sekunde 
Null" ist/war. Microsoft und auch Apple machen das auch nicht anders, 4 
Bytes enthalten den Tag (signed long) ab dem "Stichtag", 4 weitere Bytes 
die Uhrzeit als "Bruchteil des Tages". Nur mit dem "Stichtag" kocht 
Jeder sein eigenes Süppchen.

Wenn ich es machen müsste, dann würde ich (allerdings in ASM) den 
Zeitstempel als 24-Bit-Zahl (Minutenraster) führen und nur zur Ausgabe 
als Jahr, Monat, Tag und Uhrzeit formatieren. Diese Form der Darstellung 
spart nicht nur Speicher, sondern erleichtert auch das Suchen nach 
bestimmten Zeitstempeln oder das Berechnen von Differenzen zwischen zwei 
Zeitstempeln.

...

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.