Frage zum SD Karte beschreiben?

Hallo,

@ skorpi
Du hast die Frage nicht verstanden.

@ all
Also wenn die Datei offen ist, wird die "alte Datei" nicht beschädigt, weil die zu schreibenden Daten erstmal in einem Puffer landen. Wie groß ist der Puffer überhaupt? Die Datei auf der Karte wird erst aktualisiert wenn ich die Datei schließe. Habe ich das richtig verstanden?
Was passiert wenn ich genau dann den Saft weg nehme wenn er schreibt, also der Sketch die Datei schließt? Dann müßte doch die Datei auf der Karte beschädigt sein.

Ich meine, einmal das alles mit der SD Karte programmiert und auf den Arduino geflasht läuft der Sketch ja endlos. Dann gibts nur noch Reset oder Saft weg. Man sieht ja nicht wann geschrieben wird. Außer programmiert eine LED Anzeige ein.

Ich möchte einfach bei meinen Versuchen vermeiden das ich im dümmsten Moment den Saft wegnehme um dann am PC den Inhalt der Karte anzuschauen ob alles so klappt wie ich mir das vorstelle. Zum Bsp.

Ich nehme für meinen DatenLogger eine LED, die mache ich zuerst an, dann versuche ich, die SD Karte zu initialisieren.
Falls OK (Karte drin): Datei öffnen, schreiben, Datei schliessen, noch 100 ms warten (damit man auch was sieht), dann LED aus.
Wenn keine Karte drin ist, bleibt die LED an, und jede Minute wird versucht, das Schreiben nachzuholen.
Ausserdem reicht der RAM, um 4 solche Datensätze zwischenzuspeichern.
Üblicherweise gibt es alle paar Minuten einen Datensatz zu schreiben/speichern.

Der Arduino läuft also weiter, während ich die Karte rausnehme, um sie am PC auszuwerten.
Während die LED kurz aufblinkt, ziehe ich natürlich nicht die Karte raus, falls das überhaupt gezielt möglich wäre.
Komme ich mit der Karte vom PC zurück, leuchtet die LED schon. Ich stecke die Karte rein, innerhalb einer Minute geht die LED aus und ich freue mich :wink:

Natürlich wäre es für die Lebensdauer der SD Karte besser, jeden Sektor (512 byte) nur einmal zu schreiben, aber selbst so
(ca. alle 10 Minuten 50 byte ), d.h. jeder Daten-Sektor wird insgesamt 10 mal beschrieben und das Dateiverzeichnis (Dateilänge etc.) so hundertmal am Tag, sehe ich vorerst keine Probleme.

Du kannst einen dicken Kondensator auf die Versorgungspannung schalten und diese über eine Diode laden. Du kontrollierst die Versorgungspannung vor der Diode und bei absinken unter einen gewissen Wert (weil die Versorgungspannung von außerhalb fehlt) springst Du in die Abschaltfunktion die die ausständigen Daten in die Sd schreibt und das Fils schließt.

Du kannst auch einen Start-Stop Taster und ein Busy LED vorsehen Geht einfacher. :wink:

Grüße Uwe

Hallo,

oaky, dann werde ich einen Taster einbauen, womit der Sketch weis das ab jetzt nicht mehr erneut geöffnet werden darf. Eine LED wie Michael das macht werde ich auch einbauen. Gute Idee. DANKE @ all

@ Michael
um die Abnutzung der Speicherzellen mußte Dir keine Sorgen machen. Der Karten interne Controller regelt das selbst. Er verteilt alle Schreibzugriffe selbstständig. Es ist nicht so wie bei mechanischen Festplatten das beim ständigen überschreiben der immer gleichen Datei immer der gleiche Sektor und damit die vermeintlich gleichen Speicherzellen beschrieben werden. Da müßte man am Karten Controller vorbei direkten Zugriff haben auf die einzelnen Flashzellen um immer wieder eine bestimmte zu beschreiben. Du kannst mehrere Jahre Deine Karte beschreiben. Dann werden die defekten Zellen ausgeblendet und erst wenn der Speicherbereich in Summe der intakten Zellen kleiner wird wie Deine Dateigröße bekommst Du ein Problem. Gute Controller und bugfreie Firmware zusammen lassen aber dann auf die defekten Zellen eh keinen Schreibzugriff mehr zu sondern nur noch lesend. Gilt für Speicherkarten wie für SSD's gleichermaßen.

Gute Controller

Meines Wissens wird vom Arduino ziemlich "roh" geschrieben, also der zu schreibende Sektor gewählt.
Ist die übliche SD library ein "guter Controller" ?

Aber Sorgen mach ich mir eigentlich nicht...

Der beschreibene Controller sitzt in der SD-Karte zwischen Anschlüsse und Speicherchip.
Da hat der Arduino nichts zu melden.
Grüße Uwe

Hallo,

wie Uwe schon schreibt. Du verwechselt jetzt was. Ich meinte mit "guten Controller" nicht den Arduino µC. Sondern den der in jeder Speicherkarte steckt. Blöd formuliert. Gibts überhaupt noch schlechte Controller in Speicherkarten? Ich glaube nicht. Nur noch bei SSDs zusammen mit verbugter Firmware. :wink:

Meinetwegen kann der Arduino mit seiner Library immer den gleichen Sektor ansteuern. Das ändert aber nichts an der Tatsache das immer noch der Speicherkarten interne Controller, den ich meinte, dazwischen sitzt. Nur dieser hat direkten Zugriff auf seine Flashspeicherzellen wo letztlich alle Daten Bits und Bytes landen. Man hat bei Flashspeichern nicht mehr wie bei mechanischen Festplatten die volle Kontrolle wo die Daten genau landen. Du weist in welchen Sektor die Daten landen und wo Du sie abholst. Das reicht aus. Der Karten interne Controller nimmt das entgegen und verteilt intern lustig wie er möchte. Und auch nur er weis wo er die Daten wieder lesen muß wenn Du nach einem bestimmten Sektor von außen anfragst.

Mußte Dir vorstellen wie bei einer Konzertgarderobe. Du erhälst eine Blechmarke mit Nummer. Die Dame hängt Deine Jacke an irgendeinen Haken. Nur sie weis welche Marke zu welcher Jacke gehört. Die Dame wäre der Karten interne Controller. Und Du hälst die Blechmarke mit der Sektornummer in der Hand.

Nur dadurch kann der Karten interne Controller seine vorhandenen Speicherzellen gleichmäßig durch Schreibvorgänge abnutzen. Weil niemand anderes von außen dazwischen funken kann.

Nennt sich übrigens Wear-Leveling. Kannst ja mal das Internet danach befragen. :slight_smile:

Man hat bei Flashspeichern nicht mehr wie bei mechanischen Festplatten die volle Kontrolle wo die Daten genau landen.

Ich bezweifle daß man diese Kontrolle bei mechanisch-magnetischen Festplatten noch hat. Auch dort gibt es Fehlererkennungmechanismen und Resevesektoren. :wink:
Grüße Uwe

Hallo,

ach Uwe, mit Dir hab ich es auch nicht leicht. :wink:

Bei mechanischen Festplatten wechselt aber nicht ständig "der Sektor", eigentlich Block, wenn man ein und die selbe Datei immer wieder überschreibt. Man weis also wo seine Bits und Bytes landen. Solange der intakt ist bleibt er gleich. Wenn er defekt sein sollte, ja dann weicht die Platte auf Reserveblöcke aus. Aber nur dann. Auch dann weis man dennoch, wenn man das möchte, wo sie gelandet sind. Außerdem kann man bei Festplatten direkt auf die Blöcke zugreifen mit irgendwelchen Spezialtools. Bei Flashspeicher geht das nicht. Ist ein kleiner aber feiner Unterschied. Und wenn die mechanische Platte immer öfters ausweichen sollte, dann hat sie eh ein Problem. Was nicht der Normalfall ist. Bei Flashspeicher wird bewußt über den gesamten Speicherbereich geschrieben um alle Speicherzellen gleichmäßig abzunutzen.

hi,

Man weis also wo seine Bits und Bytes landen

naaajaaaa...

ich hab' eine mechanische mit 4gb ssd-speicher. der controller bestimmt selbst, welche häufig benutzten dateien dort abgelegt werden.

Außerdem kann man bei Festplatten direkt auf die Blöcke zugreifen mit irgendwelchen Spezialtools.

das machen reparaturprogramme für kaputte sd-karten aber sicher auch...

gruß stefan

Hallo,

sagtmal Leute, lest Ihr die Texte auch oder überfliegt ihr die nur noch? Mit dem Thema habt ihr Euch noch nie beschäftigt? Oder.

Neumodische Hybridfestplatten die Du meinst, kann man nun nicht gleich stellen mit herkömmlichen mechanischen Festplatten die ich meinte. Ging eigentlich klar hervor.

Reparaturprogramme, Datenrettungsprogramme die Du meinst können nur noch das lesen was der Controller (Flashspeicher) als lesend zur Verfügung stellt. Ihr wisst schon wie Wear-Leveling arbeitet?

Ihr wisst schon wie Wear-Leveling arbeitet?

Bisher nicht, daher vielen Dank an dich und Uwe, auch für eure interne Unterhaltung anschliessend.
(aber mach bitte nicht den Stefan an...) :roll_eyes:

Für mich und andere Dummies heisst das, selbst wenn ich ohne Dateistrukturen und FAT-Formatierung direkt auf feste SD Karten Blöcke schreibe, der Karten-interne Controller sich darum kümmert, dass zu häufiges Schreiben desselben Blocks kein Thema für mich ist.

Hallo,

okay, Entschuldigung an alle und Eisbaer die ich überfahren habe. Ich war nur in dem Moment sowas von gereizt. Da versucht man alles schön zu erklären und dann ... Naja, ich wollte mich mit niemanden streiten. Wirklich.

Ein Dummie wie Du das nennst ist auch niemand hier. Ich erwarte nur das man jeden Text erstmal komplett liest und nicht nur überfliegt. Das ist sicherlich nicht zu viel verlangt.

Zu Deiner Frage. Genau so ist das.

hi,

mein gott, die entschuldigung ist zwar nett, aber eine sooo dünne haut, daß ich das nicht aushalte, hab' ich auch nicht.

also überhaupt kein problem, liebe grüße

stefan

Doc_Arduino, kein Problem.
Ich hab zwar keine Eisebaer-Haut, aber ich halte sowas auch aus. :wink: :wink: 8) :wink: :wink:
Grüße Uwe

Hallo,

dann ist ja zum Glück alles wieder gut. :wink:

ja

Dann stelle ich hier auch mal eine Frage, zur SD-Karte. :.

Irgend wann will ich sie auch mal für die Waage benutzen. :slight_smile:
Bei dem angehängten Test-Sketch, werden Datalog.txt Files angelegt.

Nur warum bekommen die alle 01.01.2000 01:00 als Erstelldatum mit angehängt?

Gruß, Apus²

#include <SD.h>

// On the Ethernet Shield, CS is pin 4. Note that even if it's not
// used as the CS pin, the hardware CS pin (10 on most Arduino boards,
// 53 on the Mega) must be left as an output or the SD library
// functions will not work.
const int chipSelect = 10;

File dataFile;

void setup()
{
 // Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }

  Serial.print("Initializing SD card...");
  // make sure that the default chip select pin is set to
  // output, even if you don't use it:
  pinMode(SS, OUTPUT);
  
  // see if the card is present and can be initialized:
  if (!SD.begin(chipSelect)) {
    Serial.println("Card failed, or not present");
    // don't do anything more:
    while (1) ;
  }
  Serial.println("card initialized.");
  
  // Open up the file we're going to log to!
  dataFile = SD.open("datalog.txt", FILE_WRITE);
  if (! dataFile) {
    Serial.println("error opening datalog.txt");
    // Wait forever since we cant write data
    while (1) ;
  }
}

void loop()
{
  // make a string for assembling the data to log:
  String dataString = "";

  // read three sensors and append to the string:
  for (int analogPin = 0; analogPin < 3; analogPin++) {
    int sensor = analogRead(analogPin);
    dataString += String(sensor);
    if (analogPin < 2) {
      dataString += ",";
    }
  }

  dataFile.println(dataString);

  // print to the serial port too:
  Serial.println(dataString);
  
  // The following line will 'save' the file to the SD card after every
  // line of data - this will use more power and slow down how much data
  // you can read but it's safer!
  // If you want to speed up the system, remove the call to flush() and it
  // will save the file only every 512 bytes - every time a sector on the
  // SD card is filled with data.
  dataFile.flush();
  
  // Take 1 measurement every 500 milliseconds
  delay(500);
}

Apus_Apus:
Nur warum bekommen die alle 01.01.2000 01:00 als Erstelldatum mit angehängt?

Um ein anderes Datum als das Default-Datum zu erhalten, müßtest Du
a) eine solche SD-Library verwenden, die das Setzen eine Datei Zeitstempels erlaubt und
b) die entsprechenden Funktionen in Deinem Sketch aufrufen, die den Zeitstempel setzen

Soweit eine kurze Google-Suche ergab, kann es die SdFat-Library über eine Callback-Funktion realisieren.

Die einfachere Variante ist, den Dateien stattdessen Namen zu geben, die gleichzeitig Zeitstempel sind (und auf die Zeitstempel zu pfeifen).

Z.B. für eine Log-Datei vom 15.03. 2013 einfach den Dateinamen "20130315.txt" vergeben, wenn Du eine Logdatei pro Tag haben möchtest. Wenn man solche Dateinamen nach Namen sortiert, sind sie gleichzeitig auch nach Datum sortiert, was das spätere Auffinden eines Datums in einer Dateiliste stark erleichtert. Den genauen Zeitstempel mit Uhrzeit loggst Du dann in den Log-Zeilen mit.