Go Down

Topic: Probleme SD.Begin (Read 612 times) previous topic - next topic

Touf2638

Bonjour,
J'ai un programme qui marchait jusqu'à maintenant et qui plante depuis 3 jours aléatoirement sur le SD.Begin. J'ai soupçonné un dépassement de RAM donc je n'ai laissé que le setup et mon loop vide mais pas mieux.
Je transfert ce code allégé deux trois fois et d'un coup ça remarche. J'ai changé de carte Arduino, d'ethernet shield, de carte SD mais toujours pareil. Lorsque ca remarche je remet tout mon code, ca remarche nickel mais après quelques transferts replantage.
Mon matériel : Arduino mega 2560 , ethernet shield rev3
Ma version de logiciel :Arduino 1.0.3

Auriez vous une idée (je joins mon code allégé au cas où)

Code: [Select]
//**********************************************************************************************************************************
//**********************************************************************************************************************************



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



/* Détails technique de la connexion ethernet */
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = {
  192,168,1, 177 };
byte gateway[] = {
  192,168,1, 1 };

// Attachement d'un objet "server"
EthernetServer server(80);






//**********************************************************************************************************************************
//**********************************************************************************************************************************

void setup()
{

  // Variables d'Usage
  int Resultat_fct = false;
 
  // Initialisation port serie
  Serial.begin(115200);
 
  // Affichage de la SRAM utilisée
//  Serial.print(F("Memoire SRAM restante :"));
//  Serial.println(freeRam());

  // Affectation des directions pins
  pinMode(53, OUTPUT); // broche de selection WIZNET
  pinMode(4, OUTPUT); // broche de selection SD card
  digitalWrite(4,LOW);
  digitalWrite(53,HIGH);

  // Initialisation de la carte SD avec broche 4 en tant que CS
  Resultat_fct=SD.begin(4);
  if (Resultat_fct!=true)
  {
    Serial.println(F("Echec initialisation SD!"));
  }
 
 
  // Initialisation de la librairie ethernet
  Ethernet.begin(mac, ip, gateway);
  server.begin();

}

//**********************************************************************************************************************************
//          MAIN
//**********************************************************************************************************************************

void loop()
{
      // Scrutation reseau
}

skywodd

Bonjour,

Pour savoir si c'est un problème de RAM :
http://playground.arduino.cc/Code/AvailableMemory

Si l'initialisation de la carte SD plante tu devrais bloquer le problème avec un for( ; ; ); ;)

Quote
Auriez vous une idée (je joins mon code allégé au cas où)

Le code complet serait plus utile si c'est un problème de RAM :smiley-roll:
Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Touf2638

Je mets le code complet (Je débute donc c'est peut être pas très propre   smiley-red) mais ce qui me surprend c'est que ce code "allegé" ne marche pas tout de suite. Il faut le transferer 2 ou 3 fois avant que ca remarche...juste transferer 2 ou 3 fois sans rien modifier...

Code: [Select]
//**********************************************************************************************************************************
//**********************************************************************************************************************************



#include <Ethernet.h>
#include <SD.h> // crée automatiquement un objet racine SD représentant la carte mémoire SD
#include <SPI.h>



/* Détails technique de la connexion ethernet */
byte mac[] = {
  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = {
  192,168,1, 177 };
byte gateway[] = {
  192,168,1, 1 };

// Attachement d'un objet "server" sur le port 1337
EthernetServer server(80);






//**********************************************************************************************************************************
//**********************************************************************************************************************************

void setup()
{

  // Variables d'Usage
  int Resultat_fct = false;
 
  // Initialisation port serie
  Serial.begin(115200);
 
  // Affichage de la SRAM utilisée
//  Serial.print(F("Memoire SRAM restante :"));
//  Serial.println(freeRam());

  // Affectation des directions pins
  pinMode(53, OUTPUT); // broche de selection WIZNET
  pinMode(4, OUTPUT); // broche de selection SD card
  digitalWrite(4,LOW);
  digitalWrite(53,HIGH);

  // Initialisation de la carte SD avec broche 4 en tant que CS
  Resultat_fct=SD.begin(4);
  if (Resultat_fct!=true)
  {
    Serial.println(F("Echec initialisation SD!"));
  }
 
  delay(1000);
 
  // Initialisation de la librairie ethernet
  Ethernet.begin(mac, ip, gateway);
  server.begin();

}

//**********************************************************************************************************************************
//          MAIN
//**********************************************************************************************************************************

void loop()
{
      // Scrutation reseau
      Com_reseau();
}

//**********************************************************************************************************************************
//          FONCTION COMMUNICATION RESEAU
//**********************************************************************************************************************************

void Com_reseau()
{

   //_____________________________________________________________________________________
 
   // Variables d'usage
   String chaineRecue="";           // réception chaine requete
   int comptChar=0;                 // comptage des caractères reçus
   int resultat_SD=0;               // resultat fonction lecture carte SD
   int index_paquet=0;              // numéro de ligne à lire dans la carte SD
   int datas[150];               // ligne lue dans la carte SD
   char c;                          // caractère récupéré par Ethernet
   
  //_____________________________________________________________________________________

   // Crée un objet client basé sur le client connecté au serveur
   EthernetClient client = server.available();
 
  // si l'objet client n'est pas vide
  if (client)
  {
      // si le client est connecté
      if (client.connected())
      {
           
            //_____________________________________________________________________________________
           
            // Initialisation variables
            comptChar = 0;
            chaineRecue = "";
           
            // Boucle sur reception client
            while (client.available())
            {
             
              // l'octet suivant reçu du client est mis dans la variable c
              c = client.read();
             
              // incrémente le compteur de caractère reçus
              comptChar=comptChar+1;

              // Concatenation caractere dans une chaine dans une limite de 50 caracteres
              if (comptChar<50)
              {
                  chaineRecue=chaineRecue+c;
              }
             
            }
           
             //_____________________________________________________________________________________
           
             // Chaine reçue est une requete GET alors affichage page Web
             if (chaineRecue.startsWith("GET / HTTP"))
             {
                  // Lecture carte SD et affichage page Web
                  while (resultat_SD!=1 && resultat_SD<100) // Tant que pas fin de fichier texte et pas d'erreur
                  {
                      resultat_SD = Lecture_ligne_SD(index_paquet,"/Web/Image.txt",datas);
                      int idx=0;
                      while(idx<150 && datas[idx]>0)
                      {
                          if (datas[idx]>0)
                          {
                            client.print((char)datas[idx]);
                            idx++;
                          }
                      }
                      index_paquet++;
                  }             
             }
         
           
            //_____________________________________________________________________________________
                   
            // Attente et libération client     
            delay(1);
            client.stop();

            //_____________________________________________________________________________________
                       
      } 
   
  }     
     
     
}

//**********************************************************************************************************************************
//          FONCTION DE RECUPERATION D'UNE LIGNE DANS UN FICHIER TXT D'UNE CARTE SD
//**********************************************************************************************************************************

int Lecture_ligne_SD(int index_paquet,char path[20], int tableau[150])
{

    //_____________________________________________________________________________________
 
    // Variables d'Usage
    int File_exist=0;
    File myFile; // objet file

    //_____________________________________________________________________________________
   
    // Selection de la SD Card
    digitalWrite(53,HIGH);
    digitalWrite(4,LOW);
   
    //_____________________________________________________________________________________
   
    // Test si le fichier existe - renvoie true/false
    File_exist=SD.exists(path);

     // Si fichier n'existe pas   
     if (File_exist!=true) 
     {
       return 100;
     }
     // Si fichier existe
     else
     {
         
          // Ouverture du fichier en lecture
          myFile=SD.open(path,FILE_READ);
          myFile.seek(index_paquet*150);

          for (int index=0;index<=150;index++)
          {
             tableau[index] = 0;
          }
         
          for (int index_c_ec=0;index_c_ec<150;index_c_ec++)
          {
             tableau[index_c_ec] = myFile.read();

             if (tableau[index_c_ec]<0)
             {
                 //tableau[index_c_ec]=0;
                 return 1;
             }
          }
          return 2;
   
     }           

     
    //_____________________________________________________________________________________

    // Selection du Wiznet
    digitalWrite(53,LOW);
    digitalWrite(4,HIGH); 
   
    //_____________________________________________________________________________________
   
}


//**********************************************************************************************************************************
//          FONCTION LECTURE SRAM UTILISEE
//**********************************************************************************************************************************

//int freeRam ()
//{
//  extern int __heap_start, *__brkval;
//  int v;
//  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
//}

Touf2638

Qu'entends tu par un for, de boucler tant que le SD begin ne marche pas ???

skywodd


Qu'entends tu par un for, de boucler tant que le SD begin ne marche pas ???

Bloquer le programme jusqu'au prochain reset (boucle infini).

Si la carte SD ne marche pas ce n'est pas la peine de continuer l'exécution du programme, tu affiches un msg d'erreur et tu bloques tout.
Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Touf2638

Ok je vais faire ça pour bloquer.
Par contre ca pourrait venir de quoi ce probleme ? Une erreur de transfert que je ne vois pas... une librairie pas à jour... c'est quand même étrange.

skywodd

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

Go Up