Go Down

Topic: uSD auf Ethernetshield mit SD-Lib? (Read 2376 times) previous topic - next topic

gehtdas

Hi,
ich krieg's nicht hin :-(
Arduino Mega 2560 R3
Ethernetshield "MEGA compatible" (vermutlich von Adafruit, neu)

Den Sketch https://github.com/adafruit/SDWebBrowse (Webserver, der die Dateien auf der SD-Karte im Browser anzeigt) habe ich zum Laufen gekriegt, aber der benutzt die Libraries SdFat.h, SdFatUtil.h und Ethernet.h, nicht jedoch SD.h.

Nun wollte ich mit der SD-Library Messwerte auf die Karte schreiben, so wie in http://arduino.cc/en/Tutorial/ReadWrite , aber ich kann die Karte nicht ansprechen. Ich denke, das simpelste müsste sein:
Code: [Select]

#include <SD.h>

void setup(){
  Serial.begin(9600);
  pinMode(53, OUTPUT);     //nötig?
  Serial.print(SD.begin(4));
}
 
void loop(){}


Aber SD.begin(4) ergibt als Resultat 0, was wohl ein Fehler ist (ReadWrite sagt dann "initialization failed!")

Was mache ich falsch?
Danke für Antworten.

uwefed

Es gibt SD-Karten bis 2GB (FAT16), SDHC-Karten bis 32GB(FAT32) und SDXC (größer).
Außerdem unabhängig von der Speichergröße in verschiedenen Gehäußegrößen (SD, SDmini und SDmicro).
Ältere Versionen der SD- Bibiothek können nur mit SD-Karten umgehen, aber nicht mit SDHC. Neuerere Versionen schon.
Welche Version vom IDE verwendest Du? Hast Dus mit einer kleineren Karte als 2GB verrsucht?
Gibst Du uns den ganzen Kode und den Link des Verkäufers für das Shield.
Grüße Uwe


gehtdas

#2
Dec 21, 2012, 02:14 am Last Edit: Dec 21, 2012, 03:11 am by gehtdas Reason: 1
Also, ich bin jetzt ein bißchen weiter, aber verstehe es nicht...:

Es scheint - nach etlichen Versuchsreihen - so, dass jene "53", die wohl den SS (Slave Select) Pin von dem SPI(Serial Peripheral Interface) definiert, mit dem Arduino mit der SD-Karte kommuniziert, nicht mal falsch gewesen sein darf (z.B. probeweise "10"), denn dann nützt kein neuer upload vom korrigierten Sketch, kein Reset-Knopf auf dem Ethernet-Shield sondern nur noch, die USB-Verbindung zu kappen. Erst nach einem echten Kaltstart (der dann meist auch noch mit einem Wechsel des COM-Ports verbunden ist) wird die Korrektur auf "53" wirksam.

Wäre nett, wenn mir das jemand erklären könnte. ich trink jetzt erstmal ein Viertele Roten.  :~

---

Danke Uwe für Deine zwischenzeitliche Antwort:
ist ne kleine 1GB micro-SD FAT16, deren Inhalt mir dies SdWebBrowse auch anzeigt.
IDE  benutze ich 1.0.2
Der ursprüngliche Code ist (hier noch mit der "10" für die "most Arduino boards")
Code: [Select]
/*
  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 <SD.h>

File myFile;

void setup()
{
// Open serial communications and wait for port to open:
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }


  Serial.print("Initializing SD card...");
  // On the Ethernet Shield, CS is pin 4. It's set as an output by default.
  // Note that even if it's not used as the CS pin, the hardware SS pin
  // (10 on most Arduino boards, 53 on the Mega) must be left as an output
  // or the SD library functions will not work.
   pinMode(10, OUTPUT);
   
  if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }
  Serial.println("initialization done.");
 
  // 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("test.txt", FILE_WRITE);
 
  // if the file opened okay, write to it:
  if (myFile) {
    Serial.print("Writing to test.txt...");
    myFile.println("testing 1, 2, 3.");
// close the file:
    myFile.close();
    Serial.println("done.");
  } else {
    // if the file didn't open, print an error:
    Serial.println("error opening test.txt");
  }
 
  // re-open the file for reading:
  myFile = SD.open("test.txt");
  if (myFile) {
    Serial.println("test.txt:");
   
    // 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:
    Serial.println("error opening test.txt");
  }
}

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

Aber ich meine ich hätte den beschriebenen Effekt ("stabile Fehldefinition bis Kaltstart") auch bei meinem kleinen Schnipsel beobachtet, bin aber nach dem vielen Hin&Her bisserl rammdösig im Kopp...

Das Ethernet-shield habe ich Ende November "irgendwo in Fernost" gekauft, vermutlich über ebay, genaueres weiß ich aber nicht mehr :-(

Gruß, Manfred

uwefed

Die SPI-Schnittstelle arbeitet mit 4 Pins: eine Dateneingng, einen Datenausgang einem Takt und einem Pin der das angesprochene IC definiert (ENABLE oder SS (Slave Select)).
Im Falle des orginalen Arduino Ethernetshield sind das Pin 10 für das EthernetIC und 4 für die SD-Karte. Wie's bei Deiner Karte ist mußt Du selbst kontrollieren. Sicher ist das nicht pin 53.
Die SPI schnittstelle ist beim ATmega328 ( Arduino UNO) auf den Pins 11,12, und 13; SS ist frei definierbar aber normalerweise Pin 10. Beim ATmega2560/1280 (Arduino MEGA) sind das die Pins
50, 51 und 52; SS oft 53. Die richtigen Pins außer SS sind am ICSP-Stecker herausgeführt und drum funktioniert das Shield auf beiden Arduino Versionen.

Versuchs mal mit Pin 4.
Grüße Uwe

gehtdas

... SS (Slave Select)). ...Sicher ist das nicht pin 53...
Beim ATmega2560/1280 (Arduino MEGA) sind das die Pins ... SS oft 53.
Hm, da stehe ich jetzt auf dem Schlauch. Oft 53 aber sicher nicht?
Dabei habe ich gedacht, die Schwierigkeiten kommen erst noch, wenn ich per Ethernet die Zeit holen will und mit dem Zeitstempel dann die Messdaten in die SD-Karte schreiben, wobei ich ja zwischen den beiden Funktionalitäten (Slave Selects) hin- und herschalten muß...? Evtl. muss man nicht nur die eine Funktionalität wählen, sondern auch die andere abwählen, habe ich im Hinterkopf, aber erstmal schlafen...
LG

uwefed

Kontrolliere mal: das Ethernetshield ist ja nicht mit dem Pin 53 verbunden. Pin 53 ist rechts unten.
Grüße Uwe

sven1977

#6
Dec 21, 2012, 02:57 pm Last Edit: Dec 21, 2012, 03:03 pm by sven1977 Reason: 1
Bei Mega kommt das Ethernetshild eigendlich nicht an den Pin53 ran. Also ist nicht verbunden.
Pin4 ist SS für die SD-Karte und Pin10 für den EthernetChip (Arduino Mega).

Wenn du die SD-Karte und den EthernetChip initialisieren möchtest, solltest du noch
ne Kleinigkeit beachten, sonst könnten Probleme auftauchen.

Das pinMode(53, OUTPUT); und pinMode(4, OUTPUT); ist wichtig....

Bevor du Ethernet.begin machst, schalte die SD-Karte ab, in dem du pin4 auf HIGH schaltest.
Und andersrum genauso... pin10 auf HIGH und dann SD.begin.
Das brauchst du aber nur beim initialisieren machen.

digitalWrite(10, LOW); // Ethernet aktiviert
digitalWrite(10, HIGH); // Ethernet aus

digitalWrite(4, LOW); // SD-Karte an
digitalWrite(4, HIGH); // SD-Karte aus.

Beim SD.begin quatsch wohl der Ethernetchip dazwischen.... ;)

gehtdas

Danke, Uwe und Sven!
Ich weiß nicht, wann ich die nächsten Trubeltage wieder dazu komme, mich intensiv damit zu beschäftigen, aber bevor der Fred abtaucht wollte ich den Dank noch loswerden, bin jetzt guten Mutes :-)
Manfred

Go Up