SD.h bremst Programm aus, wenn keine SD-Karte eingelegt ist

Hallo

Um bei einem Datenlogger Strom zu sparen, will ich die verwendeten Module nur dann mit Strom versorgen, wenn sie gebraucht werden.

Aktuell bin ich beim SD-Module.

Dabei habe ich folgendes Problem:
Die SD.h überprüft im Hintergrund immer, ob eine SD-Karte eingelegt ist (über den CSPin, 9).
(HIGH = Karte vorhanden, LOW = keine Karte).

Wenn keine Karte vorhanden ist, wird das Programm extrem ausgebremst.

Wenn ich nun dem danzen Module den Strom abdrehe, bekomme ich auf dem CSPin kein HIGH mehr (ist ja kein Strom mehr dafür da) und mein Programm läuft extrem langsam.

Zum testen habe ich ein kleines Probeprogramm geschrieben, das im Loop etwas auf die SD-Karte schreibt und über Serial.print die aktuellen millis() ausgibt.
Normal dauert der Loop gute 20 ms.
Wenn ich die Karte entferne (roter Strich im angehängten Bild) dauert der Loop ca. 2400 ms.
Wird die Karte wieder eingelegt, läuft der Loop wieder in 20 ms durch.

Jetzt die Fragen, warum wir der Loop so langsam, kann man da was gegen machen, und wo finde ich mehr Infos dazu?
Evtl. eine andere Bibliotek verwenden?
Ich habe mir die SD.h angeschaut, aber das ist zu hoch für mich :frowning:

  • Die verwendete SD.h ist die, die bei meinem Arduino dabei ist. Arduino - SD
  • Verwendetes SD-Module
  • Arduino-Nano-Chinaclone

Das Programm:

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

File TextdateiA;               // Variable "Textdatei" als File (dts. Datei) deklarieren

int CSpin = 9;                 //CS-Pin für SD-Module
int PowerSD = 5;               //Power-Pin für das SD-Module
int i = 1;                     //Counter

void setup() {

  Serial.begin (9600);
  pinMode(PowerSD, OUTPUT);          //Ausgang Power für SD-Module
  digitalWrite (PowerSD, HIGH);      //SD-Module an
  SD.begin(CSpin);                   //SD-Karte starten
  
  TextdateiA = SD.open("Minuten.txt", FILE_WRITE);   //Datei Minuten.txt öffnen (bzw. erstellen, wenn nicht vorhanden)
  TextdateiA.println("Test-Start");                  //Daten zum Programmstart in die Datei schreiben
  TextdateiA.close();
  //digitalWrite (PowerSD, LOW);
}

void loop()    
{
  digitalWrite (PowerSD, HIGH);                        //SD-Module an
  SD.begin(CSpin);                                     //SD-Karte starten
  TextdateiA = SD.open("Minuten.txt", FILE_WRITE);     //Datei Minuten.txt öffnen (bzw. erstellen, wenn nicht vorhanden)
  TextdateiA.print("Loop-");                           //Daten zum Programmstart in die Datei schreiben
  TextdateiA.println(i);                               //Daten zum Programmstart in die Datei schreiben
  TextdateiA.close();
  Serial.println (millis());
  i++;
}

Gruß, e0mc2

Hallo

Mit sd.begin wird die SD-Karte wieder initialisiert.
Wenn ich das im Loop nicht mache, erkennt er die SD-Karte nicht mehr, nach dem wider einlegen.
Vermutlich sollte man abgragen, ob die Karte ausgeworfen wurde, und sie nur nach dem erneuten einlegen sd.begin ausführen.
Aber so weit bin ich noch nicht...

Mein Problem, dass der Loop so langsam wird, liegt vermutlich am SPI-Bus, bin mir aber nicht sicher.
Ich suche weiter nach einer Lösung, falls jemand eine Idee hat...

Gruß, e0mc2

Hallo,

das macht so keinen Sinn. Du hast keine Kontrolle darüber die Karte sauber zu entnehmen ohne zufällig mitten im Schreibvorgang die Karte rauszunehmem mit der Chance dabei die Datei zu zerstören. Du musst per Taster o.ä. erst jeden Kartenzugriff unterbinden um dann gefahrlos die Karte zu entnehmen. Nutze dazu die end Methode. Nach erneuten Karte einstecken führe 1x begin aus.

Ich weiß nicht wie du die Spannungsversorgung der Karte schaltest. Nur dürfen dann auch keine anderen Signale anliegen. Der CS Pin liegt Idle auf High, was fatal wäre. Das Gesamtkonzept sollte überlegt sein, sonst geht am Ende mehr kaputt.