Zugriff auf SD-Karten File nach einigen Schreibzugriffen verwehrt

Moin,
bin noch relativ neu und habe ein Problem mit einem Mega und einem SD-Karten-Modul. Ich kann auch mit dem SD-Logger Beispiel-Projekt nur rund 30 int Werte auf die Karte schreiben. Danach wird der Zugriff via open() verwehrt. Es handelt sich um eine SDHC-Karte mit 8GB. Formatiert auf FAT32.
Wie gesagt die ersten Werte werden auch geschrieben, jedoch wird dann der Zugriff verwehrt.

Vielen Dank euch!

kiteguru:
Moin,
bin noch relativ neu und habe ein Problem mit einem Mega und einem SD-Karten-Modul. Ich kann auch mit dem SD-Logger Beispiel-Projekt nur rund 30 int Werte auf die Karte schreiben. Danach wird der Zugriff via open() verwehrt. Es handelt sich um eine SDHC-Karte mit 8GB. Formatiert auf FAT32.
Wie gesagt die ersten Werte werden auch geschrieben, jedoch wird dann der Zugriff verwehrt.

Vielen Dank euch!

Was ist Deine Frage?

Meine Frage ist, ob vielleicht schonmal jemand den gleichen Fehler hatte oder eine Idee hat, woran es liegen könnte.

kiteguru:
Meine Frage ist, ob vielleicht schonmal jemand den gleichen Fehler hatte oder eine Idee hat, woran es liegen könnte.

Ja, so einen Fehler gibt es.
Idee: kaputt.

Mal ehrlich:
Was erwartest Du?

Kein Mensch kann Dir auf den Tisch schauen!
Was für einen Sketch?
Welche Hardware?
Was hast Du schon ausprobiert?
Laufen die Beispiele aus der IDE problemlos? Ziehe ich zurück...

Naja, den Tisch habe ich ja beschrieben.
Hardware: Arduino Mega, SD-Karten Modul via SPI
Software: Datalogger-Beispiel-Sketch

Ausprobiert mit SdFat.h, File nicht geschlossen sondern geflusht, File nach jedem Schreibvorgang geschlossen. SPI-Geschwindigkeit auf die Hälfte gesetzt. Datentypen die geschrieben werden geändert. Statt println() mit write gearbeitet oder nur print().
Aber nun gehen mir die Ideen aus, die ich noch testen kann.

kiteguru:
Aber nun gehen mir die Ideen aus, die ich noch testen kann.

Mein edit hat sich mit Deinem überschnitten - sorry..
Aber ich sehe noch immer keine Angaben zur Hardware. Es gibt gefühlt mehr Module, als Chinesen.
Ne Herkunft wäre toll...

Alles gut, kein Ding.
Der Hersteller ist HER.
Modellnummer lautet: HER_microsd_arduino

Der Arduino ist ein Mega 2560.

kiteguru:
Modellnummer lautet: HER_microsd_arduino

Was auch immer das ist.

kaputt? egal.
Es ist mir tatsächlich zu anstrengend Dir irgendwas sinnvolles zu entlocken.

Die SD-libs laufen seit Jahren.
Wenn die DS nicht geschrieben werden, ist was faul. Mit dem was Du zur Verfügung stellst ist nichts sinnvolles möglich.

Rate jetzt mal: Könnte das Ding hier sein.

Aber nun gehen mir die Ideen aus, die ich noch testen kann.

Da (vermutlich) alle Baugruppen und die Beispiel-SW jahrelang erprobt und ausgereift sind bleibt als naheliegende Idee: Tausche die Karte aus.

wno158:
Rate jetzt mal: Könnte das Ding hier sein.

Mit so einem (ähnlichen) habe ich das nachgebaut:
Arduino MEGA
SD-Card-Modul
Micro-SD-Card (SDHC) 16 GB (formatiert FAT32)

sdcard_u_mega.jpg

Verkabelung:

MEGA     SD-Card-Modul
52 ........ SCK 
51 ........ MOSI
50 ........ MISO
 4 ........ CS 
GND ....... GND 
5V ........ VCC

Sketch "Datalogger" aus den Beispielen auf den MEGA draufgespielt:

/*
  SD card datalogger

 This example shows how to log data from three analog sensors
 to an SD card using the SD library.

 The circuit:
 * analog sensors on analog ins 0, 1, and 2
 * SD card attached to SPI bus as follows:
 **            UNO   MEGA
 ** MOSI - pin  11    51
 ** MISO - pin  12    50
 ** CLK - pin   13    52
 ** CS - pin    4     4    (for MKRZero SD: SDCARD_SS_PIN)

 created  24 Nov 2010
 modified 9 Apr 2012
 by Tom Igoe

 This example code is in the public domain.

 */

#include <SPI.h>
#include <SD.h>

const int chipSelect = 4;

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


  Serial.print("Initializing SD card...");

  // 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.");
}

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 += ",";
    }
  }

  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  File dataFile = SD.open("datalog.txt", FILE_WRITE);

  // if the file is available, write to it:
  if (dataFile) {
    dataFile.println(dataString);
    dataFile.close();
    // print to the serial port too:
    Serial.println(dataString);
  }
  // if the file isn't open, pop up an error:
  else {
    Serial.println("error opening datalog.txt");
  }
}

Das Ganze 5 Minuten arbeiten lassen. Dann den Inhalt der Karte am PC inspiziert.
Es wurden etwa 1400 14000 Datensätze geschrieben. Z.B:

255,246,249
253,250,251
276,278,275
303,308,303
320,321,316
314,311,307
288,279,279
259,250,251

Alles wie zu erwarten.

Also prinzipiell funktionert das.

Wie ist deine Verkabelung, dein Sketch usw. ?

sdcard_u_mega.jpg

Alles klar, dann schaue ich mal, dass ich heute eine neue Karte zum Testen bekomme.

Meinen Aufbau habe ich als Bild angehängt.
Die 5V und GND greife ich links und rechts von den Digital GPIOs ab.
CS = 53
SCK = 52
MOSI = 51
MISO = 50

/*
  SD card datalogger

  This example shows how to log data from three analog sensors
  to an SD card using the SD library.

  The circuit:
   analog sensors on analog ins 0, 1, and 2
   SD card attached to SPI bus as follows:
 ** MOSI - pin 11
 ** MISO - pin 12
 ** CLK - pin 13
 ** CS - pin 4 (for MKRZero SD: SDCARD_SS_PIN)

  created  24 Nov 2010
  modified 9 Apr 2012
  by Tom Igoe

  This example code is in the public domain.

*/

#include <SPI.h>
#include <SD.h>

const int chipSelect = 53;

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


  Serial.print("Initializing SD card...");

  // 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.");
}

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 += ",";
    }
  }

  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  File dataFile = SD.open("datalog.txt", FILE_WRITE);

  // if the file is available, write to it:
  if (dataFile) {
    dataFile.println(dataString);
    dataFile.close();
    // print to the serial port too:
    Serial.println(dataString);
  }
  // if the file isn't open, pop up an error:
  else {
    Serial.println("error opening datalog.txt");
  }
}

Das ist der Gesamte Beispiel-Code. Außer den Chip-Select habe ich nichts geändert.

Den Output der Serial habe ich auch mit angehängt. Hier erkennt man schön das Verhalten. Er hat teilweise Probleme sich zu verbinden, dann läuft er kurz und geht dann in den Fehler.

Nachschub Aufbau.

Habe es nun mit einer neuen SD-Karte probiert und es funktioniert, die war wohl ab Werk defekt.
Danke Euch, dass ihr Euch die Zeit genommen habt und Anregungen gegeben habt.

Super, dass es jetzt funktioniert!
Danke für die Rückmeldung.

kiteguru:
war wohl ab Werk defekt.

oder gefälscht...

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.