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