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?
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.
>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.
> ,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.
...
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...
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.
...