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 ...
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.
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.
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
Aber gibt auch andere Anwendungen für einen µC.
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).
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
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: SD Karte beschreiben schneller als USB - Deutsch - Arduino Forum
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.
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.
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 ...