INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Lib für SPI-SD-Karten
15.02.2015, 11:39
Beitrag #25
RE: Lib für SPI-SD-Karten
(15.02.2015 10:43)HaWe schrieb:  unter 20cm wird es wschl wegen Handling nicht gehen..
Probier's doch wenigstens mal aus. Nur weil Du willst, dass es funktioniert wird es noch lange nicht funktionieren.

Zitat:der Due hat damit aber offenbar kein Problem, und SPI clock ist ja in beiden Fällen per default identisch (4 MHz)
Es kommt ja nicht nur darauf an. Weisst Du z.B. ganz sicher, dass die Flanken gleich steil sind?
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.02.2015, 12:21 (Dieser Beitrag wurde zuletzt bearbeitet: 15.02.2015 12:22 von HaWe.)
Beitrag #26
RE: Lib für SPI-SD-Karten
wenn ich die Karte beim Systemstart nicht einegesteckt habe, geht es nicht, klar.
wenn ich jetzt den Due (ohne SD Karte) an USB angesteckt lasse, dann den serial Monitor starte, zeigt er den ini Fehler, klar.

wenn ich die Karte aber jetzt nachträglich einstecke, findet er sie spontan (wie "hot swap") und arbeitet auch damit:

Code:
/*
  SD card read/write

This example shows how to read and write data to and from an SD card file
The circuit:
* SD card attached to SPI bus as follows:
** MOSI - pin 11
** MISO - pin 12
** CLK - pin 13
** CS - pin 4

created   Nov 2010
by David A. Mellis
modified 9 Apr 2012
by Tom Igoe

This example code is in the public domain.

*/

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

File myFile;
char fname[64];

char sbuf[64];
char sdata[128];
char cln[]="                    ";


void setup()
{
    
  Serial.begin(9600);
  

  sprintf(sbuf,"#: SD Initializing...");
  Serial.println(sbuf);
  // On the Ethernet Shield, CS is pin 4. It's set as an output by default.


  while(!SD.begin(4) ) {
    sprintf(sbuf,"#: ...SD init failed");
    Serial.println(sbuf);
    delay(1000);
  }
  
  sprintf(sbuf,"#: ...SD OK !          ");
  Serial.println(sbuf);

  sprintf(fname,"test.txt");
  
  if (SD.exists(fname) ) {
    sprintf(sbuf,"#: %s exists     ",fname);
    Serial.println(sbuf);
    sprintf(sbuf,"#: Removing %s      ",fname);
    Serial.println(sbuf);
    SD.remove("test.txt");
    // removed: success ?
    if (SD.exists(fname) ) {
       sprintf(sbuf,"#: %s  exists     ",fname);
       Serial.println(sbuf);  
    }
    else {
       sprintf(sbuf,"#: %s  N/A     ",fname);
       Serial.println(sbuf);
     }
  }
  
  
  
  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  
  myFile = SD.open(fname, FILE_WRITE);
  
  if (myFile) {
    // if the file opened okay, write to it, then close file:
    sprintf(sbuf,"#: Writing string to %s ",fname);
    Serial.println(sbuf);
    
    // write data to file
    sprintf(sdata, "neu test string 1, 2, 3.");
    myFile.println(sdata);
    
    
    // close the file:
    myFile.close();
    sprintf(sbuf,"#: %s closed.   ",fname);
    Serial.println(sbuf);
  }  
  else {
    // if the file didn't open, print an error:
    sprintf(sbuf,"#: error opening %s   ",fname);
    Serial.println(sbuf);
  }
  

  // re-open the file for reading:
  myFile = SD.open(fname);
  if (myFile) {
    sprintf(sbuf,"#: reading %s ",fname);
    Serial.println(sbuf);

    // read from the file until there's nothing else in it:
    while (myFile.available()) {
      Serial.write(myFile.read());
    }
    // close the file:
    myFile.close();
  } else {
    // if the file didn't open, print an error:
    sprintf(sbuf,"#: error opening %s   ",fname);
    Serial.println(sbuf);
  }
}

void loop()
{
  // nothing happens after setup
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
15.02.2015, 14:02 (Dieser Beitrag wurde zuletzt bearbeitet: 15.02.2015 14:07 von HaWe.)
Beitrag #27
RE: Lib für SPI-SD-Karten
Ich besitze noch keine Jumperkabel < 20cm.

Zitat:Es kommt ja nicht nur darauf an. Weisst Du z.B. ganz sicher, dass die Flanken gleich steil sind?
Gruß,
Thorsten

was bedeutet das? Wie könnte ich es so für den Mega ändern, dass es wie beim Due funktioniert?

Man kann es übrigens reproduziern:
beim mega muss die Karte kurz vor serial-reset raus und wieder neu eingesteckt werden,
wenn man dann reset macht, geht es immer einwandfrei.

wenn man das nicht vorher macht, aber bei laufendem gerade gestartetem Programm, dann passiert es manchmal (eher selten), dass sie nachträglich erkannt wird, meist aber nicht.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.02.2015, 10:04
Beitrag #28
RE: Lib für SPI-SD-Karten
Hi,
was das mit den Flanken auf sich hat kannst Du selber googeln. Es war ohnehin nur ein Beispiel, dass es noch einige Unterschiede zwischen den Geräten geben kann.
Was passiert, wenn Du die Stromversorgung zur SD Karte trennst? Dasselbe wie beim Raus- und Reinstecken?
Ich würde das mal mit kurzen Kabeln und sauberer Pegelumsetzung versuchen.
Gruß,
Thorsten

Falls ich mit einer Antwort helfen konnte, wuerde ich mich freuen, ein paar Fotos oder auch ein kleines Filmchen des zugehoerigen Projekts zu sehen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.02.2015, 11:59 (Dieser Beitrag wurde zuletzt bearbeitet: 16.02.2015 12:00 von HaWe.)
Beitrag #29
RE: Lib für SPI-SD-Karten
ja, nach an- und abstöpseln passiert beim mega dasselbe wie wenn ich einfach nur resette.

ich muss immer erst Karte raus/rein schieben, dann reset (über serial-Window am PC oder reset-Knopf am Mega), dann geht es 1x

starte ich danach neu (egal wie) muss ich wieder erst Karte raus/rein schieben, dann reset (über serial-Window am PC oder reset-Knopf am Mega), dann geht es wieder bis zum Programmende.

Das heißt aber:
weil es, nachdem es erstmal richtig initialisiert wurde, danach immer funktionier mit lesen/schreiben auch mehrmals, bis zum Programmende,
=> kann es folglich nicht an Lese/Schreibfehlern liegen.

Es ist einzig und allein die Erst-Initialisierung, die nie auf Anhieb klappt, wenn die Karte vorher nicht rausgenommen und wieder frisch eingesteckt wurde.
Hat die Initialisierung erstmal geklappt, klappt der Rest anschließend auch einwandfrei.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.02.2015, 17:08 (Dieser Beitrag wurde zuletzt bearbeitet: 16.02.2015 22:09 von HaWe.)
Beitrag #30
RE: Lib für SPI-SD-Karten
habe nun Sketch 1.6 installiert.

Die schlechten Nachrichten:

1.) jetzt habe ich den selben init-Fehler auch mit dem Due !! Sad
2.) scanf ergibt völlig falsche Werte !! Sad
3.) Serial.print erzeugt bei dem string einen unbegründeten Zeilenumbrauch Sad

Die guten Nachrichten:
1.) Serial erlaubt formatierte float-Ausgabe auch ohne Patch! Smile
2.) atoi und atof konvertieren korrekt aus dem SD-File-String Smile
3.) die Ausgabe mit sprintf erfolgt automatisch mit allen Dezimalstellen vor und nach dem Komma!

der Code:
Code:
/*
  SD card read/write

This example shows how to read and write data to and from an SD card file
The circuit:
* SD card attached to SPI bus as follows:
** MOSI - pin 11
** MISO - pin 12
** CLK - pin 13
** CS - pin 4

created   Nov 2010
by David A. Mellis
modified 9 Apr 2012
by Tom Igoe

This example code is in the public domain.

*/

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

#define SD_CSpin 4

File myFile;
char fname[64];

char sbuf[64];
char sdata[128];
char cln[]="                    ";



void setup()
{
  pinMode(SD_CSpin, OUTPUT);  
  
  Serial.begin(9600);
  
  sprintf(sbuf,"#: SD Initializing...");
  Serial.println(sbuf);
  // CS is pin 4. It's set as an output by default.


  while(!SD.begin(SD_CSpin) ) {
    sprintf(sbuf,"#: ...SD init failed");
    Serial.println(sbuf);
    delay(1000);
  }
  
  sprintf(sbuf,"#: ...SD OK !          ");
  Serial.println(sbuf);

  sprintf(fname,"test.txt");
  
  if (SD.exists(fname) ) {
    sprintf(sbuf,"#: %s exists     ",fname);
    Serial.println(sbuf);
    sprintf(sbuf,"#: Removing %s      ",fname);
    Serial.println(sbuf);
    SD.remove("test.txt");
    // removed: success ?
    if (SD.exists(fname) ) {
       sprintf(sbuf,"#: %s  exists     ",fname);
       Serial.println(sbuf);  
    }
    else {
       sprintf(sbuf,"#: %s  N/A     ",fname);
       Serial.println(sbuf);
     }
  }
  
  
  
  // open the file. note that only one file can be open at a time,
  // so you have to close this one before opening another.
  int16_t  p, i, cnt=0;
  float    x;
  
  myFile = SD.open(fname, FILE_WRITE);
  
  if (myFile) {
    // if the file opened okay, write to it, then close file:
    sprintf(sbuf,"#: Writing string to %s ",fname);
    Serial.println(sbuf);
    
    // write data to file
    sprintf(sdata, "%d",1);
    myFile.println(sdata);
    Serial.println(sdata);
    sprintf(sdata, "%d", 2);
    myFile.println(sdata);
    Serial.println(sdata);
    sprintf(sdata, "%f", PI);
    myFile.println(sdata);
    Serial.println(sdata);
    sprintf(sdata, "%f", 987.654);
    myFile.println(sdata);
    Serial.println(sdata);
        
    
    // close the file:
    myFile.close();
    sprintf(sbuf,"#: %s closed.   \n",fname);
    Serial.println(sbuf);
  }  
  else {
    // if the file didn't open, print an error:
    sprintf(sbuf,"#: error opening %s   ",fname);
    Serial.println(sbuf);
  }
  

  // re-open the file for reading:
  myFile = SD.open(fname);
  if (myFile) {
    sprintf(sbuf,"#: reading %s ",fname);
    Serial.println(sbuf);

    // read from the file until there's nothing else in it:
    i=0;
    cnt=1;
    strcpy(sdata, "\0");
    
    while (myFile.available()) {
      sdata[i]=myFile.read() ;
      if(sdata[i] == '\n')   {      // end of string: CR
         sdata[i]  = '\0';          // Null-Terminierung ??    
         Serial.print(cnt); Serial.println(": ");
        
         Serial.print(sdata);       Serial.println("                    // Ausgabe als String");
        
         if(cnt<3) {
           p=atoi(sdata);           // 1+2: Ausgabe als Integer Zahl
           Serial.print(p);         Serial.println("                    // Ausgabe direkt als Zahl");
           sprintf(sbuf,"%d",p);
           Serial.print(sbuf);      Serial.println("                    // Ausgabe als formatierte Zahl");
         }
         else {
           x=atof(sdata);           // 3+4: Ausgabe als float-Zahl
           Serial.print(x);         Serial.println("                    // Ausgabe direkt als Zahl");
           sprintf(sbuf,"%f",x);
           Serial.print(sbuf);      Serial.println("                    // Ausgabe als formatierte Zahl");
         }
         ++cnt;
         i=0;
         strcpy(sdata, "\0");
      }
      else ++i;
    }
    // close the file:
    myFile.close();        
    sprintf(sbuf,"#: %s closed.   \n",fname);
    Serial.println(sbuf);
  } else {
    // if the file didn't open, print an error:
    sprintf(sbuf,"#: error opening %s   ",fname);
    Serial.println(sbuf);

  }
}

void loop()
{
  // nothing happens after setup
}


die Serial-Ausgabe:
Code:
#: SD Initializing...
#: ...SD init failed
#: ...SD OK !          
#: test.txt exists    
#: Removing test.txt      
#: test.txt  N/A    
#: Writing string to test.txt
1
2
3.141593
987.654000
#: test.txt closed.  

#: reading test.txt
1:
1
                    // Ausgabe als String
1                    // Ausgabe direkt als Zahl
1                    // Ausgabe als formatierte Zahl
2:
2
                    // Ausgabe als String
2                    // Ausgabe direkt als Zahl
2                    // Ausgabe als formatierte Zahl
3:
3.141593
                    // Ausgabe als String
3.14                    // Ausgabe direkt als Zahl
3.141593                    // Ausgabe als formatierte Zahl
4:
987.654000
                    // Ausgabe als String
987.65                    // Ausgabe direkt als Zahl
987.653992                    // Ausgabe als formatierte Zahl
#: test.txt closed.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.02.2015, 19:49 (Dieser Beitrag wurde zuletzt bearbeitet: 16.02.2015 22:24 von HaWe.)
Beitrag #31
RE: Lib für SPI-SD-Karten
update:
der obige jetzt optimierte Code läuft auch unter 1.5.8, mit lib.c float patch, und zusätzlich ist die SD Karte stabiler und die Serial-Ausgabe sogar besser (kein ungewollter Zeilenvorschub).

Ich bleibe also bei 1.5.8 plus patch.

Leider kann ich die 1.6.0 Bugs wegen der Blödk**** dort nicht nicht an Arduino berichten, Wink
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.02.2015, 15:17 (Dieser Beitrag wurde zuletzt bearbeitet: 21.02.2015 15:20 von HaWe.)
Beitrag #32
RE: Lib für SPI-SD-Karten
update (Sketch 1.5.8):
ich habe jetzt auch eine 1GB SD Karte alternativ durchgetestet.
Ergebnis:
mit dem Due kein Problem, jederzeit wird die Karte korrekt erkannt, alle Funktionen (File suchen, löschen, schreiben, lesen) laufen einwandfrei.

Auf dem Mega aber läuft gar nichts mehr,
entweder wird die Karte überhaupt nicht erkannt,
oder, nach raus/reinschieben:
File wird gefunden, altes File wird korrekt gelöscht, aber anschließend kann das File nach Schreiben der Daten jetzt überhaupt nicht mehr gelesen werden (file open error):

Code:
#: SD Initializing...
#: ...SD OK !          
#: test.txt exists    
#: Removing test.txt      
#: test.txt  N/A    
#: Writing string to test.txt
1
2
3.141593
987.653990
#: test.txt closed.  

#: error opening test.txt


wird allerdings stattdessen die 16GB SD Karte wieder eingesetzt, läuft - nach den bekannten init.Problemen - immerhin wieder korrekt der auch Rest der Leseaktionen:

Code:
#: SD Initializing...
#: ...SD OK !          
#: test.txt exists    
#: Removing test.txt      
#: test.txt  N/A    
#: Writing string to test.txt
1
2
3.141593
987.653990
#: test.txt closed.  

#: reading test.txt
1:
1
                    // Ausgabe als String
1                    // Ausgabe als Zahl
1                    // Ausgabe als formatierte Zahl
2:
2
                    // Ausgabe als String
2                    // Ausgabe als Zahl
2                    // Ausgabe als formatierte Zahl
3:
3.141593
                    // Ausgabe als String
3.14                    // Ausgabe als Zahl
3.141593                    // Ausgabe als formatierte Zahl
4:
987.653990
                    // Ausgabe als String
987.65                    // Ausgabe als Zahl
987.653990                    // Ausgabe als formatierte Zahl
#: test.txt closed.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  SD-Karten-Shield über I2C ansteuern? alpenpower 4 1.061 21.07.2015 06:43
Letzter Beitrag: alpenpower

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste