EEPROM mit Werten jenseits der 255 belegen

Ich habe verschiedene Werte die ich gern im EEPROM sammel möchte und anschließend per USB übertragen will.

Je Messung sollen 4 Werte gespeichert werden: Zeit 0-65000, Analogwert 0-1023, Puls1 0-1, Puls2 0-1.

Die normale Adressierung ist ja Byteweise, also 0-255. Wie erweitere ich dies am einfachsten um obige genannte Werte möglichst effizent zu speichern?

Was muss ich in meinem Programm anpassen um z.B. 2 oder 3 Byte zusammenzufassen?

Gruß

Du kannst Datenstrukturen definieren, und sie als Byte array adressieren.

Und du bist nicht der erste der sowas will: Arduino Playground - EEPROMWriteAnything

Nachtrag: Falls dich templates erschrecken, schau dir dort den letzten Abschnitt an:

If you don't want to bother with a separate header file, you can use the avr eeprom library instead ...

Einen 16 bit unsigned INT Wert kannst Du mittels LowByte und HighByte in zwei 8 bit Zahlen teilen.
http://arduino.cc/en/Reference/LowByte
http://arduino.cc/en/Reference/HighByte

Mit word() kannst Du sie wieder zusammenfügen.

Natürlich kannst Du es auch mit / und % bzw >> machen.

Grüße Uwe

Ich habe verschiedene Werte die ich gern im EEPROM sammel möchte und anschließend per USB übertragen will.
Je Messung sollen 4 Werte gespeichert werden: Zeit 0-65000, Analogwert 0-1023, Puls1 0-1, Puls2 0-1.

Dafür ist ein eeprom eigentlich nicht gemacht...
eeprom ist langsamer und kleiner als ram, und verträgt nur eine begrenzte Anzahl Schreibzyklen.

Aus der Arduino Reference:

Note
An EEPROM write takes 3.3 ms to complete. The EEPROM memory has a specified life of 100,000 write/erase cycles, so you may need to be careful about how often you write to it.

Ist es denn wichtig, dass die Daten ein Ausschalten des Arduino überleben ?
Na ja, ein Batterie-Backup und sleep Modus des Arduino ist etwas aufwendiger ...

OK danke mal.

nein es ist nicht wichtig das die Daten "überleben", aber es bietet sich da da der Eeprom bereits vorhanden ist.

aber da stutz mich etwas

An EEPROM write takes 3.3 ms to complete. The EEPROM memory has a specified life of 100,000 write/erase cycles, so you may need to be careful about how often you write to it.

ich dachte der EEPROM ist schneller

DrThunderhell:
ich dachte der EEPROM ist schneller

Ein EEPROM ist halt ein ROM und damit ein READ-ONLY-MEMORY. Das es ein PROM (PROGRAMMABLE ROM) ist, bedeutet ja nur, das man ihm nachträglich noch Daten verpassen kann. und beim EEPROM geht das Ganze auch mit "elektrischem" Löschen der Daten.
Ein Schreibprozess (eigentlich ein "Einbrennen" der Daten-Bits von 1 auf 0) ist immer ein recht langsamer Prozess, verglichen mit recht schnellen Zugriffsraten beim Lesen, da das Schreiben in der Regel kein ständiger Prozess ist.
Wieviele Daten musst Du denn speichern und warum müssen diein den EEPROM, wenn sie nicht dauerhaft gespeichert werden sollen?

Mal abgesehen von der Schreib-Zeit würden mir an Deiner Stelle viel mehr die "nur" 100.000 Schreibzyklen Sorgen machen. Ich weiss ja nicht wie oft Du Daten speicherst, aber irgendwann ist der EEPROM im Eimer.

Mario.

es bietet sich da da der Eeprom bereits vorhanden ist

... dort irgendwelche Konfigurationsdaten zu speichern, damit man nicht bei gelegentlichen Änderungen, die nach einem Reset noch da sein sollen, einen neuen Sketch brennen muss.

"Leute wie wir", die alle naslang einen geänderten Sketch hochladen, brauchen eigentlich kein Eeprom :wink:
Aber gibt auch andere Anwendungen für einen µC.

Megaionstorm, wieso empfielst Du ein paralelles SRAM? Da brauchst Du 8 Datenleitungen und 15 bzw 19 Adressleitungen!

SRAM oder FRAM. Funktionieren wie SRAM behalten aber den Inhalt auch ohne Spannung.
Serielles SRAM: zb 32kByte: 23K256 (für 3,3V)
Fram: http://www.ramtron.com/products/nonvolatile-memory/serial.aspx
Grüße Uwe

Megaionstorm:
Da steht: 'Z.B. so einen' und nicht 'Ich würde den nehmen' !

zwischen den beiden sehe ich keinen großen Unterschied. Ich verstehe unter zB schon eine Empfehlung von Dir. Was meine die anderen?

Grüße Uwe

hmm, alles sehr verwirrend SRAM FRAM EEPROM hört sich für mich alles gleich an wie gehört FLASH noch dazu?

ich brauch halt etwas wo schnell die Daten schreiben kann und so lang behält bis sie nach der Messung an den Rechner übertragen sind. Dannach ist egal was damit passiert. vorerst ca 2000-10000 Messwerte in der obigen Konfiguration, aber noch mehr wär natürlich besser für später...

Ein Messwert besteht aus: Zeit (0-65000), Analogwert (0-1023), Puls1 (low-high), Puls2 (low-high).

Hier rumliegen hätt ich hier noch:

I²C serieller EEPROM Microchip 24LC16B/P Gehäuseart DIP-8 Format (Kapazität) 16 kBit Organisation 2 K x 8
http://www.conrad.de/ce/de/product/150180/?insert=62&insertNoDeeplink&productname=IC-serieller-EEPROM-Microchip-24LC16BP-Gehaeuseart-DIP-8-Format-Kapazitaet-16-kBit-Organisation-2-K-x-8

oder

SPI serieller EEPROM Microchip 25LC040-I/P Gehäuseart DIP-8 Format (Kapazität) 4 kBit Organisation 512 x 8
http://www.conrad.de/ce/de/product/150260/SPI-serieller-EEPROM-Microchip-25LC040-IP-Gehaeuseart-DIP-8-Format-Kapazitaet-4-kBit-Organisation-512-x-8

aber ist halt EEPROM und kein SRAM oder FRAM

Die EEprom die Du zitierst haben 512 Byte bzw 2048 Byte, da machst Du nichts mit 10000 Werte abspeichern.

EEprom Flash schreiben langsam (ca 5ms pro Page also auch mehrere Byte; größe der Page von Modell abhängig) die Anzahl der Speichervorgänge ist begrenzt Lesezugriffe sind unbegrenzt, Datenerhalt ohne Spannungsversorgung 10 bis 100 Jahre
SRAM Schreiben und lesen schnell, Schreib und Lesezugriffe unbegrenzt. Verliert Daten ohne Spannungsversorgung
FRAM Schreiben und lesen schnell, Schreib und Lesezugriffe unbegrenzt. Behält Daten ohne Spannungsversorgung

Grüße Uwe

Ein Messwert besteht aus: Zeit (0-65000), Analogwert (0-1023), Puls1 (low-high), Puls2 (low-high).

Rechnen wir mal zusammen:

Zeit (0-65535) -> 2 Byte (16 bit)
Analogwert (0-1023) -> 2 Byte (10 bit)
Puls1 + Puls 2 -> 1 Byte (je 2 bit)

Allerdings benötigt der Analogwert nur 10 der 16 Bit, daher könnte man die beiden Puls1 und Puls2 dort mit unterbringen.
Am Ende also minmal 4 Byte pro Messung. Bei 10.000 Messungen reden wir von 40kb Messwerten.

Eine Frage noch zum Zeit-Wert. In welcher Einheit soll denn die Zeit gespeichert werden? Microsekunden, Millisekunden? Wie lang dauert denn eine Messreihe und wie genau soll die Zeitauflösung sein?
Ggf. reicht es nämlich die Start und die Endzeit der Messreihe zu sichern (millis() oder micros(). Wenn man davon ausgeht das die einzelnen Messungen immer gleich lang dauern, kann man die Zeit der einzelnen Messwerte interpolieren und muss sie nicht speichern. Die Genauigkeit als eine 16 Bit Auflösung für 10.000 Messwerte dürfte dabei auch nicht schlechter sein. Mit einem 1024kBit Chip wären dann bei 2 byte pro Messwert könntest Du dann 65.535 Messwerte speichern.

Das Thema hatten wir doch schonmal hier: http://forum.arduino.cc/index.php?topic=166134
Ich würde einen FRAM oder SRAM mit SPI Schnittstelle verwenden.
Meine Samplebestellung für diesen SRAM ist von Microchip gestern verschickt worden. Allerdings wird es erstmal einen Monat dauern bis ich damit spielen kann, da ich erstmal 4 Wochen im Urlaub bin.

Mario.

vorerst ca 2000-10000 Messwerte in der obigen Konfiguration, aber noch mehr wär natürlich besser für später...
Ein Messwert besteht aus: Zeit (0-65000), Analogwert (0-1023), Puls1 (low-high), Puls2 (low-high).

Das sind 4 byte / event. Für 8000 Events brauchst du schon 32kB

Stellt sich noch die Frage nach der Erfassungsgeschwindigkeit.
Normales analogRead dauert über 100 µs.

Wenn die Zeit in millis ist und du max. einen Wert / Millisekunde hast, sehe ich den einfachsten externen Speicher in deinem PC.
Eine Übertragung mit 115200 reicht sogar leicht für 2 Events / ms.

Bei 8 Events / ms mit 500000 Bd (kontinuierlich) hat man die Grenze der normalen Analogerfassung sowieso erreicht, und noch nicht ausgenutzt, dass mindestens in deinem Zeitstempel bei dem Tempo viel Komprimierungspotential steckt.

Und die Frage nach den 10000 Events ( wofür brauchst du so viel Datenschrott ; = ) stellt sich da erst gar nicht.

Es geht um eine hochdynamische Wegmessung genauer darf ich nicht drauf eingehen und ist auch unwichtig.

hmm, 500.000 Baud.... aber da spielt der Serielle Monitor von der ArduinoSoftware doch nicht mit oder?

Dieser Thread könnte für dich interessant sein.

Grüße
Nighti

DrThunderhell:
Es geht um eine hochdynamische XXX genauer darf ich nicht drauf eingehen und ist auch unwichtig.

hmm, 500.000 Baud.... aber da spielt der Serielle Monitor von der ArduinoSoftware doch nicht mit oder?

Der SerialMonitor benutzt die Java RxTxComm, die erlaubt max 115200.
Aber du willst ja "hochdynamisch" Binärdaten speichern, nur eben mehr als in einen FRAM passen, oder ...

Da frage ich mich, ob es nicht einfacher ist, eine Audiokarte als A/D Wandler zu mißbrauchen.
Grüße Uwe