Carte SD et Shield Internet

Hello tous le monde,

Est ce qu'il y a des incompatibilités ou des choses spécifiques à faire pour faire fonctionner à la fois le shield internet et la carte SD?

J'utilise le même code d'exemple sans initialiser le serveur intenet placé :

  • dans le setup avec un loop à vide ca fonctionne sans
  • dans le loop avec un delay ca fonctionne aussi
    mais placé dans une fonction avec mon serveur ca ne fonctionne plus.

Ca plante soit sur le SD.begin() soit le card.init().

Si j’écris une fonction qui envoie du code html du type Serial.println("<doctype... ca fonctionne aussi.
je vous met mon bout de code mais c'est le classique des samples des fois que j'ai fais une ENORME coquille...

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

#define MYDEBUG

void ReadHttp(EthernetClient client,char *fileName)
{
#ifdef MYDEBUG
	Serial.println(fileName);
#endif	  
	
	pinMode(10, OUTPUT);
	// see if the card is present and can be initialized:
	
	if (!SD.begin(4)) 
	{
		Serial.println("Card failed, or not present");
		// don't do anything more:
		return;			
	}
#ifdef MYDEBUG
	Serial.println("Apres SD.BEGIN");
#endif	
	 // open the file. note that only one file can be open at a time,
	// so you have to close this one before opening another.
	File dataFile = SD.open(fileName);
  
#ifdef MYDEBUG
	Serial.println("Apres SD.open");
#endif

	// if the file is available, write to it:
	if (dataFile) 
	{
		while (dataFile.available()) 
		{
			client.write(dataFile.read());
		}
		dataFile.close();
	}  
	 // if the file isn't open, pop up an error:
	 else 
	 {
		Serial.println("error opening file");
	} 
} // fin de ReadHttp

N'oublie pas la page de recherche :
http://arduino.cc/forum/index.php/topic,100561.0.html

Sujet traité au moins 2 ou 3 fois depuis le début de l'année

Bonjour Barbudor,

J'avais commencé par ca. mais la compréhension que j'ai de ce post (celui de skizoh) c'est que l'on utilise soit la carte SD soit l'internet et qu'une écriture du type client.write(dataFile.read()); n'est pas possible.

j'ai rajouté le pinMode(4, OUTPUT) qu'il me manquait et ce ne fonctionne pas mieux
Je suis en arduino1.0.1

je me trompe?
S

Le SD.begin() et le Ethernet.begin() doivent être fait dans le setup() une seule fois pour toute.
Après ca devrait marcher.

card.init() ? c'est quoi ?

Sheild Officiel ?
Carte Uno officielle ?

La SD et l'Ethernet marchent-ils séparément ?

Oui ca marche separement:
J'ai fait un module pure internet avec des print pour envoyer du http et ca fonctionne (mais on sature vite en memoire ...)
J'ai repris les samples de la SD et ca fonctionne aussi. C'est quand je relie les 2 que ca merdoit...

Comme je me suis dit que je devais etre un gros blaireau, j'ai recuperer le SDWebBrowse qui etait decrit dans un des posts (SDWebBrowse/SDWebBrowse.ino at master · adafruit/SDWebBrowse · GitHub) et j'ai le meme pb avec le card.init() qui tombe en erreur.
C'est dans une librairie c++ et c'est dans l'exemple qui se trouve sur http://arduino.cc/en/Tutorial/CardInfo

Dans mon module j'utile SD.begin et il tombe aussi en erreur.
Ma carte SD est formatter sur WIN7 en 32b

Je confirme je suis un blaireau; L'exemple que j'ai telecharger fonctionne correctement, j'avais oublié de changer l'adresse mac.... :~

Je vais reanalyser mes sources, j'ai dut faire un gros sac de noeuds

J'ai l'impression que tu mélanges trop de truc dans ta casserole.

SD est une lib au dessus de Sd2Card+SdVolume+SdFile.

Donc SD.begin() inclue déjà card.init() et il ne faut pas le refaire.

  • Soit tu travailles exclusivement avec SD comme dans les exemples fournis avec l'IDE (excepté CradInfo qui utilise les libs bas niveau)
  • Soit tu travailles avec les libs de bas niveau (Sd2Card/SdVolume/SdFile) comme dans SDWebbrowse

Oui, il y a un peu de ca...

En faite c'est la déclaration #include "SD.h"

J'avais 3fichiers cpp

  • le main avec setup et loop
  • un autre avec la reprise de cardinfo
  • et un 3eme avec le readHttp (lit un fichier http sur la carte et envoi au client.

L'include de la SD.h dans les 3 fichiers provoque des violations de mémoire
je m'en suis rendu compte lorsque j'ai intégré le SD.begin() dans le setup. La carte était du coup correctement détectée mais, dès que j’accédais au serveur arduino par firefox ca me remettait les traces du setup... bizarre bizarre
J'ai effectivement viré la partie bas niveau(cardinfo) pour quand je serais grand et puis ce n’était pas nécessaire dans mon projet et j'ai réintégré mon readhttp dans le fichier principal... du coup ca roule

Je ne connais pas bien c++ mais c'est normal cette déclaration de SD ou c'est mal pensé?

Bonjour,

barbudor:

  • Soit tu travailles exclusivement avec SD comme dans les exemples fournis avec l'IDE (excepté CradInfo qui utilise les libs bas niveau)
  • Soit tu travailles avec les libs de bas niveau (Sd2Card/SdVolume/SdFile) comme dans SDWebbrowse

+1
Ne surtout pas mélanger les deux librairies bas niveau (SDfatlib) et haut niveau (SD) tu manqueras obligatoirement de mémoire et tu auras des erreurs de RESET, ou autre.

gerse:
L'include de la SD.h dans les 3 fichiers provoque des violations de mémoire
je m'en suis rendu compte lorsque j'ai intégré le SD.begin() dans le setup. La carte était du coup correctement détectée mais, dès que j’accédais au serveur arduino par firefox ca me remettait les traces du setup... bizarre bizarre

Violation de mémoire -> Ok mais comment le sait tu ? En est tu sur ? (sur un microcontrôleur une violation de mémoire ça veut tout et rien dire à la fois)
Le reset à la connexion ça sent le manque de RAM à plein nez !
Quand la librairie SD est initialisé il te reste environ 500 octets de ram disponible (enfin un peu moins de 400 en réalité vraiment utilisable).
Avec ton code source sous les yeux ce serait plus facile de t'aider :wink:

gerse:
Je ne connais pas bien c++ mais c'est normal cette déclaration de SD ou c'est mal pensé?

C'est une déclaration extern tout ce qui a de plus classique.
C'est juste que tu as foiré un truc quelque par :wink:

Hello Skywodd,

C'est juste que tu as foiré un truc quelque par smiley-wink

:slight_smile: Je veux bien te croire :slight_smile:

Pour en finir j'ai juste réintégrer mon code dans un seul fichier et supprimer la partie CardInfo.. Cette dernière action a dut résoudre le pb.

Je vais ressayer de séparer mon code en 2 fichiers demain pour voir si ca tombe toujours en marche et pour ma comprehension. En plus j'ai encore 2 / 3 trucs à ameliorer (en particulier le traitement des images) et je mettrais ca dans les projets...
S