Pages: [1]   Go Down
Author Topic: SD Card hot swap - oder: wie merke ich dass die SD entfernt wurde? SOLVED!  (Read 1213 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Edison Member
*
Karma: 39
Posts: 1174
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,

ich habe da ein Problem, das ich gedanklich nicht auf die Reihe kriege.

Folgender Sachverhalt:
ich möchte, nicht immer, aber durch Menue auswählbar, Daten auf eine SD-Karte schreiben.
Das funktioniert auch alles ganz gut.

Aber: wenn ich die Karte im laufende Betrieb rausnehme, dann merkt der Arduino das nicht.
Wie kann ich prüfen, ob eine SD-Karte präsent ist?
Wenn ich SD.begin() nochmal ausführe bekomme ich einen Fehler, auch wenn die Karte steckt. Auch SD.exists hilft mir nicht weiter, weil diese Funktion ja nach einem Datei- oder Directorynamen verlangt.
Ich bräuchte einen Befehl der mir mitteilt, ob eine Karte steckt oder nicht.

Hat einer von euch eine Idee?

Grüße

Gunther
« Last Edit: April 09, 2013, 01:07:28 pm by guntherb » Logged

Grüße
Gunther

Switzerland
Offline Offline
Faraday Member
**
Karma: 111
Posts: 5236
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Wie wär's mit

Code:
boolean present = SD.exists("/");

Ansonsten solltest Du die Low-Level-Routinen verwenden, dort kannst Du direkt Kommandos an die SD-Karte schicken und CMD0 wäre dafür ein guter Kandidat.
Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 270
Posts: 21853
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Der SD-Slot hat 2 Kontakte: der erste kontrolliert ob der Schreibschutz (mechanischer Schieber auf der SD-Karte) gesetzt ist und der zweite ob eine Karte eingelegt ist. Kontrollier mal die Pins die am Slot nicht für den Datentransfer bzw Spannungsversorgung vorhanden sind.

grüße Uwe
Logged

Offline Offline
Edison Member
*
Karma: 39
Posts: 1174
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Danke für die Hilfe.

Allerdings ist mir die SW-Lösung sympatischer, weil ich da meine Verdrahtung nicht ändern muß.

Ich werde es heute abend ausprobieren.

Aber zum besseren Verständnis:
Ist "SD.exists("/");" die Abfrage, ob ein Root Verzeichnis existiert?

Und was meinst du mit CMD0?

Wäre das dann sowas?:
Code:
boolean present = cardCommand(CMD0, 0)) == R1_IDLE_STATE;

Grüße

Gunther
« Last Edit: April 08, 2013, 09:01:12 am by guntherb » Logged

Grüße
Gunther

Germany
Offline Offline
Faraday Member
**
Karma: 59
Posts: 3071
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Du solltest die Datei nach jedem Schreiben schliessen, wenn du nur von Zeit zu Zeit schreibst und zwischendurch eventuell die Karte rausnimmst.

Beim SD.open("MYFILE.TXT", FILE_WRITE); solltest du einen Fehler kriegen, wenn keine Karte drin ist.

Danach SD.begin() jede Minute (oder häufiger, nach Geschmack) wiederholen, bis die Karte wieder drin ist.
Falls erforderlich, kann ich heute abend mal wühlen, was ich brauchte, damit SD.begin() nachträglich / mehrfach geht. Ich denke da war was ...
Logged

Switzerland
Offline Offline
Faraday Member
**
Karma: 111
Posts: 5236
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Wäre das dann sowas?:

Code:
boolean present = cardCommand(CMD0, 0)) == R1_IDLE_STATE;
Beinahe. cardCommand() ist eine Methode der Klasse Sd2Card. Du müsstest also die SD-Klasse umgehen und nur noch das Low-Level-API verwenden.
Logged

Offline Offline
Edison Member
*
Karma: 39
Posts: 1174
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Wäre das dann sowas?:

Code:
boolean present = cardCommand(CMD0, 0)) == R1_IDLE_STATE;
Beinahe. cardCommand() ist eine Methode der Klasse Sd2Card. Du müsstest also die SD-Klasse umgehen und nur noch das Low-Level-API verwenden.

 smiley-eek

tut mir leid, aber das ist mir zu hoch (oder besser zu tief, weil Low-Level! smiley)
was, bitteschön, ist eine Low-Level-API???

Nein, laß stecken, das geht einfach über meinen Horizont. Ich probiert heute abend mal das mit dem "SD.exists("/");" aus, ich melde mich wieder.

@michael_X: die Datei wird jedes mal geschlossen, klar.
Aber du hast recht, ich fange den Fehler des SD.open nicht ab...  mmmh.
vielleicht reicht das ja schon.

Erstmal vielen Dank an alle, Ihr habt mir sehr weitergeholfen!

Grüße

Gunther
Logged

Grüße
Gunther

Offline Offline
Edison Member
*
Karma: 39
Posts: 1174
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Sorry, aber es funktioniert nicht.

SD.exists("/") liefert immer 0. Aus wenn ich anstelle von "/" andere, aus DOS bekannte Verzeichniszeichen versuche: "*", "?", "\\", ".", ".." etc.

auch wenn ich versuche die Fehler von SD.open auszuwerten passiert immer das gleiche:

wenn ich die Karte nach SD.begin rausziehe, dann kommt kein Fehler.

Und mit CMD0 kann ich leider nichts anfangen.

hat vielleicht noch einer eine Idee, wie ich das vorhandensein einer SD-Karte nach SD.begin abfragen kann?
@Uwe: die entsprechenden Pins sind auf meinem Breakoutboard nicht auf die Stiftleiste geführt. HW scheidet also leider aus. klar könnte ich noch ein Drähtchen anlöten, aber das muß doch auch mit SW möglich sein!

Ratschläge bitte verständlich halten. Ich habe zwar ein gutes Systemverständnis, bin aber nicht so der C-Crack.

Danke

Gunther
Logged

Grüße
Gunther

Germany S-H
Offline Offline
Faraday Member
**
Karma: 160
Posts: 3185
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Aber: wenn ich die Karte im laufende Betrieb rausnehme, dann merkt der Arduino das nicht.
Wie kann ich prüfen, ob eine SD-Karte präsent ist?
Wenn ich SD.begin() nochmal ausführe bekomme ich einen Fehler, auch wenn die Karte steckt. Auch SD.exists hilft mir nicht weiter, weil diese Funktion ja nach einem Datei- oder Directorynamen verlangt.
Ich bräuchte einen Befehl der mir mitteilt, ob eine Karte steckt oder nicht.

Wie Du die SD-Library patchen mußt, damit SD.begin() mehrfach aufgerufen werden kann, kannst Du hier in Reply #11 nachlesen:
http://arduino.cc/forum/index.php/topic,46969.0.html

Vielleicht hilft's.
Logged

Germany
Offline Offline
Faraday Member
**
Karma: 59
Posts: 3071
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Richtig, jurs. Danke.
" Da war was ... " Schwache Erinnerungen sind nur unwesentlich besser als gar keine.

Code:
boolean SDClass::begin(uint8_t csPin) {
  /*

    Performs the initialisation required by the sdfatlib library.

    Return true if initialization succeeds, false otherwise.

   */
  if (root.isOpen()) root.close();      // allows repeated calls
  return card.init(SPI_HALF_SPEED, csPin) &&
         volume.init(card) &&
         root.openRoot(volume);
}

Ich habe auch noch eine Funktion zugefügt, die den Volume-Namen der Karte liefert, daher war mir nur in Erinnerung, dass bei jedem IDE-Upgrade aufgepasst werden muss, dass nicht die original SD Library verwendet wird. Ausserdem ist es manchmal hilfreich zu wissen, ob card.init() oder volume.init() fehlschlägt...
Logged

Offline Offline
Edison Member
*
Karma: 39
Posts: 1174
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ich danke euch für die Hilfe!

Das klingt so, wie wenn es funktionieren könnte!
Ich werde es heute abend mal probieren.


Grüße

Gunther
Logged

Grüße
Gunther

Offline Offline
Edison Member
*
Karma: 39
Posts: 1174
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Es funktioniert!  smiley-grin smiley-grin smiley-grin smiley-grin smiley-grin

ich habe in die SD.cpp wie oben die Zeile eingefügt,
dann in das Beispiel "CardInfo", das ja eine leere loop() hat,
in die loop die Abfrage gesetzt:

Code:
void loop(void) { 
  if (card.init(SPI_HALF_SPEED, chipSelect)) {
    Serial.println("SD Card gefunden!");
  }else {
    Serial.println("   Keine Karte im Slot!");
  }
  delay(1000); 
}

Und siehe da:
SD Card gefunden!
SD Card gefunden!
SD Card gefunden!
   Keine Karte im Slot!
   Keine Karte im Slot!
   Keine Karte im Slot!
SD Card gefunden!
SD Card gefunden!
SD Card gefunden!
SD Card gefunden!


Wenn ich die Karte ziehe, wird das erkannt, wenn ich sie wieder reinstecke auch.
Alles so, wie ich mir das gewünscht habe!

Vielen Dank an
Jurs und Michael,
möge das Karma immer mit euch sein!

Gunther
Logged

Grüße
Gunther

Pages: [1]   Go Up
Jump to: