SD Karte beschreiben schneller als USB

Hallo zusammen,

Ich wollte einmal die SD Karten Freunde unter euch fragen wie schnell man denn auf eine SD Karte schreiben kann bzw. ob es schneller ist als über USB direkt mit serial.print... es an den Computer zu senden.

Der Hintergrund ist das mein Programm Analogwerte aufnimmt und übertragen soll (oder speichern). Es ist ansich eigentlich nur ganz kurz und wird durch die serial.print Befehle ziemlich in der Zykluszeit ausgebremst, daher dachte ich ob es nicht sinnvoller wäre die Daten auf SD zu schreiben und nach der Messung auszulesen.

Derzeit bin ich bei einer Messrate von ca 1,7ms bei 256000Baud dirtekt über USB kontinuierlich.

256000Baud sind eigentlich außerhalb der max Geschwindigkeit, aber wenns funktiniert.

Wieviele Meßwerte mußt Du zwischenspeichern?
Grüße Uwe

Das is ja das Ding, es geht weniger um die Anzahl als um die Geschwindigkeit.

Primär geht es um kontinuierliche Speicherung, da ich dann nur durch den Speicherplatz begrenz bin.
nice wär aber 30 Sekunden mit 1500Hz, also 45000 Werte (je Zeit, AI0,AI1)
oder 10 Sekunden mit 4500Hz :wink:

je mehr umso besser und am besten Zeitlich uneingeschränkt um eben auch länger Dauertests fahren zu können

Wenn es um Geschwindigkeit geht, meinst du sicher binär-Übertragung mit Serial.write, nicht Serial.print.

SBond ist mit der seriellen Schnittstelle schneller als die ADC.

Baudraten sollten übrigens, aus Arduino-Sicht, Teiler von Prozessorfrequenz/16 sein, also eher
1.000.000 , 500.000 , 250.000, ...
Bei 115.200 ist allerdings der Fehler schon so gering, dass selbst der Java-basierte SerialMonitor damit zurechtkommt.

Auf SD Karten kannst du im Prinzip per SPI schneller schreiben:
The SPI.setClockDivider() allows you to change the clock speed to make your device working properly (default is 4MHz).
Aber der Overhead ( Dateiverwaltung ) ist erheblich grösser, so dass in der Praxis wohl nicht viel gewonnen wird.

Gut 1000 Messwerte (mit 1 byte Auflösung) kannst du evtl im RAM eines 328 zwischenspeichern, aber das reicht dir ja nicht...

Wie wäre es mit seriellem SRAM?
z.B. sowas hier: http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=2542&param=en539030
Auf dem 23LC1024 gibt es bei Mouser für knapp 2.30 Euro als DIP8 IC.
http://de.mouser.com/Search/ProductDetail.aspx?qs=q1LPnGnpSmYcdUMByAoiMQ%3D%3D
Im normalen SPI Mode schreiben die 1 Bit pro Sekunde. Bei 4MHz SPI-Takt sind das 500kb/s.
Speicherkapazität sind 128kb (1MBit).
Damit kannst Du die Messwerte erstmal sehr schnell zwischenspeichern und dann nach der Messung "gemütlich" als serielle Daten übertragen.

Mario.

Hmm, ich checks grad nicht ganz.

man muss dazusagen das ich erst seit knapp 4 Wochen mit der Arduiongeschichte zu tun habe.

Derzeit lese ich über USB direkt auf den Rechner aus und zwar mit Serial.print.
Dort wird es von einem Dattenlogger empfangen der halt 256000Baud max. macht, deshalb auch die Größe.

Eine Serielle Schnittstelle kommt nicht in Frage. Die Übertragung muss der einfachheithalber USB bleiben.
Die Frage ist halb ob man entweder den USB-Weg schneller machen kann, oder ob mann die Werte nicht auf SD oder EEPROM o.ä. zwischenspeichert bis die Messung vorbei ist und es dann über USB übertragen wird.

Aber wie gesagt die Materie ist neu für mich und ich hab auch keine Erfahrung mit Eeprom und externem Speicher, aber wenn einer sagen könnte "Das und das ist definitiv schneller" wär das mir schon mal eine Hilfe. Ich dachte halt an SD weil es diese ja in entsprechender Größe gibt das es ein paar Messungen reichen würde, hab allerdings noch keine Ahnung wie es funktioniert. Ebenso bei Eeprom, der wird denk ich mal schneller sein aber ist halt in der Größe begrenzt. (dazu gleich noch: was ist der Unterschied zwischen i²c und SPI, Vor- Nachteile?)

Gruß Jens

Die Frage ist halb ob man entweder den USB-Weg schneller machen kann, oder ob mann die Werte nicht auf SD oder EEPROM o.ä. zwischenspeichert bis die Messung vorbei ist und es dann über USB übertragen wird.

Das ist ja genau mein Vorschlag. Der SRAM-Chip wird an die SPI-Schnittstelle des Arduino angeschlossen. Damit hast Du 128kb Speicher auf die Du super schnell schreiben kannst (im sequentiellen Modus mit 500kb/s). SPI ist eine serielle Schnittstelle die bereits in Hardware gegossen ist und für die Du nur minimalen Programmieraufwand hast.
Nach der Messung kannst Du dann die Daten ganz einfach wieder aus dem SRAM laden und per USB (was ja am Ende auch nur seriell ist) an Deinen Rechner übertragen.
Beim Hersteller kann man auch Samples beantragen, wenn Du Glück hast bekommst Du von denen einen Chip "geschenkt" zum testen. Das hab ich bei TI (Texas Instruments) auch schon gemacht. Da kamen meine Samples (I2C Portexpander, LED-Driver, etc.) sogar portofrei aus den USA bei mir an.
Mario.

Hört sich gut an, sorry hatte schon angefangen zu schreiben als dein Vorschlag noch nicht online war.

Das is das dann das mit der EEPROM erweiterung wenn ich das richtig sehe.

Aber was ist noch der Unterschied zwischen SRAM und EEPROM und FLASH?
und was ist der Unterschied zwischen i²c und SPI, Vor- Nachteile?

DrThunderhell:
Hört sich gut an, sorry hatte schon angefangen zu schreiben als dein Vorschlag noch nicht online war.

Das is das dann das mit der EEPROM erweiterung wenn ich das richtig sehe.

Aber was ist noch der Unterschied zwischen SRAM und EEPROM und FLASH?
und was ist der Unterschied zwischen i²c und SPI, Vor- Nachteile?

EEPROM und FLASH haben begrenzte Schreibzyklen. Die sind zwar recht groß, aber trotzdem vorhanden. Da ich nicht weiss wie oft Deine Messungen stattfinden, hab ich auf einen SRAM gesetzt. SRAM hat (im Gegensatz zum DRAM) den Vorteil, das er keine refresh-Zyklen braucht, um seine Daten zu behalten. Allerdings gilt auch hier, Strom weg -> Daten weg. Da haben dann EEPROM und FLASH Speicher ihre Vorteile. Da Du aber nur einen Zwischenspeicher brauchst, ist das aber egal.

I2C braucht nur 2 Leitungen für die Kommunikation, ist aber langsamer als SPI. Bei SPI braucht man immer noch eine CS (Chip-Select) Leitung, die dem entsprechenden Gerät sagt, das es gerade gemeint ist. SPI ist aber deutlich schneller als I2C, da der Takt direkt vom Prozessortakt abgeleitet wird.

Ich hab mal um Test bei Microchip eine Sample-Bestellung gemacht, mal sehen ob die mich als "würdig" ansehen und mir 2 ICs schicken. Hab einmal den seriellen SRAM georderd und für mein "Homebrew Computer" Projekt noch ein parallelen Flash-RAM mit 4MBit (512kb).

Mario.

Die SPI Schnittstelle ist bedeutend schneller als I2C
Ich rate von EEprom ab da diese einen langsamen Schreibzyklus haben. Du kannst einen Block Daten übertragen mußt dann aber einige mS warten bis Du wieder Daten schreiben kannst.
Die Optionen sie ich sehe sind:

  1. SD-Karte
  2. SRAM oder besser FRAM (von Firma RAMTRON) mit SPI Schnittatelle. Die zweiten behalten den Speicherinhalt auch ohne Strom.
  3. Arduino Mega mit Speichererweiterung http://ruggedcircuits.com/html/megaram.html oder http://ruggedcircuits.com/html/quadram.html Der Controller auf dem Arduuino Mega kann externes RAM einbinden und hat so 64kByte RAM
    Grüße Uwe

Derzeit lese ich über USB direkt auf den Rechner aus und zwar mit Serial.print.
Dort wird es von einem Dattenlogger empfangen der halt 256000Baud max. macht, deshalb auch die Größe.

Eine Serielle Schnittstelle kommt nicht in Frage. Die Übertragung muss der einfachheithalber USB bleiben.

Das ist doch eine Serielle Schnittstelle ??? Dein Dattenlogger und Serial auf dem Arduino verwenden beide eine serielle Schnittstelle, die heutzutage aus einem USB - Kabel, einem USB Treiber auf dem PC und dem 32U4 mit passender Software auf dem Arduino UNO besteht.

Deinen Wunsch nach "kontinuierlicher Speicherung" sehe ich am einfachsten mit sofortigem Übertragen zum PC möglich.
Oder kommt für dich PC Programmieren nicht in Frage und der Arduino muss die Daten passend für deinen Datenlogger formatieren ?

Mit SD Card und offline-Auswerten gehen beliebig große Datenmengen.
Mit externem RAM (via SPI) als Zwischenspeicher und anschliessender formatierter Übertragung zum Datenlogger muss man bei deinen Anforderungen (45000 Zeilen mit je 2 Analogwerten) bei einem 1MBit = 128kB Speicher schon knausern, sollte aber auch gehen.