- LiFePO4 Speicher Test         
Ergebnis 1 bis 7 von 7

Thema: ArduinoMega2560 und SD-Card Modul bringen mich zur Weissglut... ;)

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    HaWe
    Gast
    hallo,
    auch ich hatte Probleme mit einigen dieser oder ähnlicher Module.
    Es gibt allerdings unterschiedliche Hardware-Ausführungen.

    Bislang gab es Probleme mit AVR (Megas), mit ARM (Due) funktionierte es immer. Ich habe immer die SPI-Header von Mega und Due verwendet, Uno habe ich nicht getestet.

    Woran es früher gelegen haben mag, weiß ich nicht.

    Ich habe jetzt auf Sketch 1.6.1 aktualisiert, dabei wurden auch die AVR- und ARM-Treiber aktualisiert - es funktioniert nun.

    Hier ist der Testcode, der auch gleich andere Funktionen testet - er wartet auf eine korrekt eingesetzte SD-Karte, man kann auch eine bereits eingesetzte kurz rausnehmen und wieder einsetzen.
    Bislang aber keine Probleme mehr.

    ps,
    edit:
    ich habe die SD-Karten nun auch wieder über Windows formatiert, obwohl teilw. etwas anderes empfohlen wird - ich habe den Eindruck, auch deswegen könnte es jetzt zuverlässiger arbeiten.
    Getestet habe ich eine 1 GB SD mit FAT- und eine 16GB SD mit FAT32-Formatierung: beide OK.
    FATex funktionert NICHT.

    Code:
    /*
    SD card: fprintf_() und fgets_()
    ver 1.01
    */
    #include <stdarg.h>
    #include <stdio.h>
    #include <SPI.h>
    #include <SD.h>
    
    
    // SD Card
    #define SD_CSpin 4
    File myFile;
    char fname[64];
    
    char sdata[128];
    char sbuf[128];
    
    
    
    //*******************************************************************************************
    char * fgets_ ( char * str, int32_t num, File * stream ) {
      int32_t i = 0;
      int16_t   chr;
     
      strcpy(str, "");
      while (i < (num - 1)) { // got room for newline and terminating null?
        chr = stream->read();
        if (chr < 0) // end of file
          break;
        str[i++] = chr;
        if ('\n' == chr) // end of line
          break;
      }
     
      if (i) { // room in buffer for terminating null
        str[i] = 0;
        return str;
      }
      else
      return NULL; // buffer too small or immediate end of file
      // { strcpy(str, ""); return str; } // alternative
    }
    //*******************************************************************************************
    
    
    
    //******************************************************************************************* 
    int32_t  fprintf_ ( File * stream, const char fmtstr[], ... ) {
       char      str[1024];
       va_list   arguments;
       int16_t   num;
       
       va_start( arguments, fmtstr);
       num = vsnprintf(str, sizeof str, fmtstr, arguments);
       // #debug
       // Serial.println( "string to write to file="); Serial.println( str);   
       stream->print(str);
       va_end( arguments );
    
       return num;
    }
    //******************************************************************************************* 
    
    
    void setup()
    {
      int16_t  p, i, cnt;
      float    x;
      char     sval[20];
      int16_t  ival;
      double   fval;
     
      pinMode(SD_CSpin, OUTPUT); 
      Serial.begin(9600);
       
      sprintf(sbuf,"#: SD Initializing... ");
      Serial.println(sbuf); 
    
      while(!SD.begin(SD_CSpin) ) {
        sprintf(sbuf,"#: ...SD init failed ");
        Serial.println(sbuf);
        delay(1000);
      }
     
      sprintf(sbuf,"#: ...SD OK !      ");
      Serial.println(sbuf); 
      strcpy(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 strings to %s ",fname);
        Serial.println(sbuf);
       
        //---------------------------------------------------------------------------------
        // write data to file
        fprintf_(&myFile, "%s\n%d\n%d\n%f\n%f\n", "Teststring", 1, 2, PI, 4.567890);   
        //---------------------------------------------------------------------------------
       
        // 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);     
      }
     
      Serial.println();
      // 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;   
       
        while (myFile.available()) {
          strcpy(sdata, "");
          fgets_ ( sdata, 20, &myFile ); 
          Serial.print(cnt); Serial.print(": string raw="); Serial.println(sdata);
          Serial.println("rueckformatiert:");
          if (cnt==1) {Serial.print("str  ="); Serial.println(sdata); }
          if (cnt==2) {Serial.print("int  ="); Serial.println(atoi(sdata) ); }
          if (cnt==3) {Serial.print("int  ="); Serial.println(atoi(sdata) ); }
          if (cnt==4) {Serial.print("float="); Serial.println(atof(sdata) ); }
          if (cnt==5) {Serial.print("float="); Serial.println(atof(sdata) ); }
          ++cnt;
        } 
       
        // 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);
    
      }
    }
    
    void loop()
    {
      // nothing happens after setup
    }
    Geändert von HaWe (15.03.2015 um 19:28 Uhr)

  2. #2
    Erfahrener Benutzer Roboter Genie Avatar von oderlachs
    Registriert seit
    17.05.2010
    Ort
    Oderberg
    Alter
    75
    Beiträge
    1.175
    Blog-Einträge
    1
    Danke HaWe !!

    Zu Pindaten zum ArduinoMega sind selbst auf arduino.cc sehr widersprüchlich...also Würfeln was richtig ist ...und richtig ist jedenfalls der ISP Header !!

    Gruss
    Gerhard
    Arduinos, STK-500(AVR), EasyPIC-40, PICKIT 3 & MPLABX-IDE , Linux Mint

  3. #3
    HaWe
    Gast
    funktioniert es denn jetzt?

    BTW, ich verwende keine Levelshifter, meine Module sehen aus wie deine, sind aber 3.3 und 5V kompatibel.
    Allerdings hat der SPI-Header immer 5V, auch auf dem Due.

    ps,
    Pinouts sind hier auf dieser Seite, habe ich gerade gegoogelt:
    http://forum.arduino.cc/index.php?topic=146511.0

    die Pinnummern sind forlgendermassen zugeordnet:

    Code:
    // SPI header                        |--|
    // SPI pins Due           -----------|  |------------
    //#define MISO     74 //  |  RES   76_SCK   74_MISO |
    //#define MOSI     75 //  | -GND   75_MOSI   Vc+5V  |
    //#define SCK      76 //  ---------------------------
    
    // SPI pins Mega
    //#define MISO     50
    //#define MOSI     51
    //#define SCK      52
    
    //#define SS       53
    Geändert von HaWe (16.03.2015 um 09:31 Uhr)

  4. #4
    Erfahrener Benutzer Roboter Genie Avatar von oderlachs
    Registriert seit
    17.05.2010
    Ort
    Oderberg
    Alter
    75
    Beiträge
    1.175
    Blog-Einträge
    1
    Danke HaWe !!
    es läuft und läuft jetzt...warum ????? Das mit den Widersprüchen bei den Pinangaben in Sachen IRQs habe ich lösen können...mit Probieren , nicht nach den Angaben auf dem Pinout

    Nun ja ich bin erst mal ein grosses stück weitergekommen. Das war für mich am Wichtigsten...

    Vielen Dank allen für Ihre Hilfe !!!

    Gruss Gerhard
    Arduinos, STK-500(AVR), EasyPIC-40, PICKIT 3 & MPLABX-IDE , Linux Mint

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    Was sind denn deine durch Probieren herausgefundenen Pin-Zuordunungen?

  6. #6
    Erfahrener Benutzer Roboter Genie Avatar von oderlachs
    Registriert seit
    17.05.2010
    Ort
    Oderberg
    Alter
    75
    Beiträge
    1.175
    Blog-Einträge
    1
    Muss ich mal Raussuchen..in Verbindung mit den verschiedenen Angaben macht es erst Sinn das hier aufzulisten.

    Das wäre dann was für einen neuen Beitrag..würde hier nicht so ganz in de Ramen passen..hatte das auch nur nebenbei erwähnt.

    Gerhard
    Arduinos, STK-500(AVR), EasyPIC-40, PICKIT 3 & MPLABX-IDE , Linux Mint

Ähnliche Themen

  1. Int zu String bringt mich zur Weissglut
    Von oderlachs im Forum C - Programmierung (GCC u.a.)
    Antworten: 2
    Letzter Beitrag: 30.06.2013, 20:12
  2. Fragen zu AVR Dos und schreiben auf SD Card und Zwischenspei
    Von Lordcyber im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 9
    Letzter Beitrag: 29.04.2008, 14:19
  3. Microchip's TCP/IP Stack und SD/MMC-Card
    Von EinsamerUser im Forum PIC Controller
    Antworten: 2
    Letzter Beitrag: 24.05.2006, 21:49
  4. IS471- Modul?????? macht mich fertig
    Von nana33sy im Forum Sensoren / Sensorik
    Antworten: 17
    Letzter Beitrag: 24.01.2006, 13:39
  5. SD Card mit Pic beschreiben und lesen
    Von Obi Wan im Forum PIC Controller
    Antworten: 2
    Letzter Beitrag: 12.03.2005, 21:39

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen