Probleme mit Ethernet Shield und microSD Card

Hallo,
ich habe einen Arduino Uno R3 und ein Ethernet Shield mein Problem ist,
dass ich nicht auf die microSD Card zugreifen kann.

Der Fehler liegt daran, dass er die microSD Card nicht Initialisieren kann.
Also bei: SD.begin(4)

Ich habe 3 microSD Cards:

  • eine 2GB in FAT16
  • eine 8GB Intenso FAT32
  • eine 16GB Samsung FAT32

bei keiner funktioniert es, daher gehe ich davon aus, dass die microSD Cards nicht das Problem sind.

Ich habe das hier abgebildete Shield: http://arduino.cc/en/pmwiki.php?n=Guide/ArduinoEthernetShield.

Der Code: ( der ist aus den Bsp’s vom IDE [Internet] )

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

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(11, 0, 0, 7);
EthernetServer server(80);

File webFile;

void setup()
{
    Ethernet.begin(mac, ip); 
    server.begin();           
    Serial.begin(9600);       
    
    pinMode(4, OUTPUT);
    pinMode(10,OUTPUT);
    digitalWrite(4, HIGH);
    digitalWrite(10, LOW);
    
    // initialize SD card
    Serial.println("Lade SD Card...");
    if (!SD.begin(4)) {
        Serial.println("ERROR - keine SD Card gefunden!");
        return;    // init failed
    }
    Serial.println("SUCCESS - SD Card gefunden");
    // check for index.htm file
    if (!SD.exists("index.htm")) {
        Serial.println("ERROR - Datei: index.htm konnte nicht geunden werden!");
        return;  // can't find index file
    }
    Serial.println("SUCCESS - Datei: index.htm gefunden.");
}

void loop()
{
    EthernetClient client = server.available(); 

    if (client) {
        boolean currentLineIsBlank = true;
        while (client.connected()) {
            if (client.available()) {   
                char c = client.read(); 
                if (c == '\n' && currentLineIsBlank) {
                    client.println("HTTP/1.1 200 OK");
                    client.println("Content-Type: text/html");
                    client.println("Connection: close");
                    client.println();
                    webFile = SD.open("index.htm");
                    if (webFile) {
                        while(webFile.available()) {
                            client.write(webFile.read()); 
                        }
                        webFile.close();
                    }
                    break;
                }
                if (c == '\n') {
                    currentLineIsBlank = true;
                } 
                else if (c != '\r') {
                    currentLineIsBlank = false;
                }
            }
        } 
        delay(1); 
        client.stop();
    } 
}

Wieß jemand vil. worann es liegen kann?

S4irence:
Wieß jemand vil. worann es liegen kann?

Die Noname-Ethernet-Shields scheinen extrem schlecht damit zurecht zu kommen, wenn ein neuer Sketch hochgeladen wird und dann direkt startet.

Bei mir hilft dann dieses Vorgehen:

  1. Sketch hochladen
  2. Seriellen Monitor öffnen und auf Fehlermeldung warten
  3. SD-Karte aus dem Kartenschacht klicken
  4. Reset-Taster auf dem Board drücken und auf Fehlermeldung warten
  5. SD-Karte in den Kartenschacht klicken
  6. Reset-Taster auf dem Board drücken
    Danach funktioniert es dann mit SD-Karte und Ethernet.

Meistens sogar auch immer noch, wenn geänderte Sketche hochgeladen werden.

Wie sieht es damit bei Dir aus?

Hi,
leider funktioniert das bei mir nicht.
Ich hab vil. gedacht, dass es an meinem Code liegt gibt es einen TestCode für den Shield?
Also SD und Ethernet?

S4irence:
Ich hab vil. gedacht, dass es an meinem Code liegt gibt es einen TestCode für den Shield?
Also SD und Ethernet?

Ich habe hier schon mal Code für einen SD-Karten Webserver gepostet.

Bei mir lief das Ding. Bei rudirabbit lief das Ding. Bei vielen anderen sicher auch.

Und ansonsten kann ich mich nicht an Reklamationen erinnern, dass es bei irgendjemandem nicht lief. Aber das muss nichts heißen.

S4irence:
Ich habe 3 microSD Cards:

  • eine 2GB in FAT16
  • eine 8GB Intenso FAT32
  • eine 16GB Samsung FAT32

bei keiner funktioniert es, daher gehe ich davon aus, dass die microSD Cards nicht das Problem sind.

Die 2GB Karte hat eine Chance.
Die andern beiden kannste in dein Händi oder deine Kamera stecken. Aber im Ethernetshield tuns die nicht.

Ganz im Ernst:
Die Pegelwandler sind viel zu primitiv (zumindest auf meinem Shield)
Stabiles nutzen der Karte geht bei mir nur, wenn die SPI Frequenz deutlich gesenkt wird.

Moin,

versuch es ohne die folgenden Zeilen:

pinMode(4, OUTPUT);
pinMode(10,OUTPUT);
digitalWrite(4, HIGH);
digitalWrite(10, LOW);

Das sollte eigentlich die Library übernehmen, sowohl
die Ethenet.h als auch die SD.h.

Hallo jurs,
ich habe deinen Code ausprobiert und bekomme dann die
folgene Fehlermeldung:
Free RAM: 699
error: card.init failed!
SD error: 1,0
(Was bedeutet die 1,0?)
:confused:

Hallo Christian81,
ich habe die Codezeilen gelöscht leider gibt es keine Veränderung. :confused:

Hallo combie,
da hab ich auch schon dran gedacht, kann ich den irgendwie herausfinden welche Karte
auf jeden Fall funktioniert, oder gibt es sowas nicht?
Woran liegt das eigentlich, dass die Karten nicht funktionieren?

S4irence:
(Was bedeutet die 1,0?)

Auf die Programmausgaben die SD-Karte betreffend nach einer fehlgeschlagenen SD-Karteninitialisierung würde ich nicht allzuviel geben. Normalerweise soll dort wohl der Typ der FAT-Formatierung angegeben werden.

Aber um die FAT-Formatierung zu prüfen und mir die Ausgaben anzusehen, würde ich lieber mal den "CardInfo" Sketch laufen lassen, der als Beispiel zur SD Library mitgeliefert wird.

Bekommst Du denn den CardInfo Sketch mit der SD-Library zum Laufen?

Ist vielleicht außer dem Ethernet-Shield noch an irgendeinem Pin irgendetwas anderes angeschlossen als das Ethernet-Shield selbst?

Und was passiert, wenn Du nachdem der SS pin auf OUTPUT gesetzt wurde, diesen NICHT auf HIGH ziehst, also die Zeile mal auskommentierst:

  pinMode(10, OUTPUT);                       // set the SS pin as an output (necessary!)
//  digitalWrite(10, HIGH);                    // but turn off the W5100 chip!

Unterschied?

Und immer wenn unmittelbar nach einem Sketch-Upload der Fehler auftritt, den oben genannten Reset-Trick kurz anwenden, :

  • Karte ausklicken, Reset-Taster drücken, auf Fehler warten,
  • Karte einklicken, Reset-Taster drücken, warten was passiert
    Immer noch Fehler?

Dieses kurze Ausklicken der Karte führt dazu, dass die Karte und deren Kartencontroller kurz stromlos gemacht wird, so dass Dein Programm dann nach dem Einklicken der Karte auf einen frish resetteten Kartencontroller trifft und nicht auf einen, der vom vorher hochgeladenen Programm noch in einen falschen Zustand versetzt worden war und diesen behalten hat, weil die Karte ständig unter Strom stand.

Hi,
der CardInfo sketch läuft leider nicht. :confused:
Das auskommentieren macht leider auch keinen Unterschied. :confused:

S4irence:
der CardInfo sketch läuft leider nicht. :confused:
Das auskommentieren macht leider auch keinen Unterschied. :confused:

Wenn Deine SD-Karte nicht alleine läuft, dann läuft sie garantiert auch nicht zusammen mit den Netzwerkfunktionen. Und umgekehrt.

Was Du tun mußt, ist erstmal die SD-Karte alleine zum Funktionieren zu bringen.
Und dann die Ethernet-Funktionen alleine zum Funktionieren bringen.

Hast Du denn die Ethernetfunktionen bereits alleine für sich getestet? Funktionieren diese? Mit welchem Sketch getestet?

Wenn beides für sich funktioniert, kannst Du beides kombinieren.

Vorher ist es völlig WITZ- und ZWECKLOS, irgendein nicht funktionierendes Bauteil (SD-Karte) mit irgendwas anderem (Netzwerkkarte) kombinieren zu wollen, in der Hoffnung, dass es zusammen dann funktioniert.

Erster möglicher Fehler wäre eine fehlerhafte Formatierung Deiner SD-Karten. Fehlerhaft wäre die Formatierung beispielsweise dann, wenn

  • Du eine Nicht-FAT Formatierung mit einem anderen Filesystem durchgeführt hast
  • oder wenn Du eine "Partitionierung" der Karte durchgeführt hast

Falls Du ein Windows- oder MAC-Betriebssystem einsetzt, kannst Du eine saubere FAT-Formatierung mit dem originalen SD-Formatter der SD Association durchführen. Download hier.

Und dann würde ich erstmal den CardInfo-Sketch zum Laufen bringen.

Wenn der dann alleine funktioniert ==> Kombi-Sketch mit SD-Karte und Netzwerkfunktionen testen.

Ich sachs einfach nochmal, (komme mir dabei wie ein Papagei vor)

combie:
Die Pegelwandler sind viel zu primitiv (zumindest auf meinem Shield)
Stabiles nutzen der Karte geht bei mir nur, wenn die SPI Frequenz deutlich gesenkt wird.

Siehe: http://arduino.cc/en/pmwiki.php?n=Reference/SPISetClockDivider

combie:
Ich sachs einfach nochmal, (komme mir dabei wie ein Papagei vor)

Siehe: http://arduino.cc/en/pmwiki.php?n=Reference/SPISetClockDivider

Sowohl der CardInfo-Sketch zur SD-Library als auch der von mir gepostete Code für den SD-Webserver initialisieren die SD-Karte jeweils mit "SPI_HALF_SPEED".

Meiner Erfahrung nach ist diese SPI-Datenrate für aufgesteckte Ethernet-Shields überhaupt kein Prolem, um mit der SD-Karte einwandfrei zu kommunizieren. Das reicht selbst für den Anschluss von SD-Kartenmodulen über eine fliegende Verkabelung von einigen Zentimetern Länge.

Wie weit runter sollte er denn Deiner Meinung nach gehen?

SPI_QUARTER_SPEED
Damit tuns bei mir 3 von 3 Karten
Mit SPI_HALF_SPEED versagt eine gänzlich und eine macht sporadisch Sorgen.

Wenigstens mal ausprobieren....

Nachtrag:
So musses gebaut werden: http://www.seeedstudio.com/wiki/images/1/1f/SD_Card_Shiled_v4.0.pdf
Tuts dann angeblich bis 16GB(ungetestet)
Leider ist es oft einfach nur mit Widerständen aufgebaut.
(z.B. bei meinem Ethernet Shield)

Hallo jurs,
ja die Netzwerkfunktion klappt einwandfrei auf anhieb das hatte ich schon getestet.
Ich habe mal geguckt das mit der Partition wusste ich nicht aber es waren auch nicht
vorhanden. Ich habs jetzt übers Terminal und nicht mit GParted formatiert macht aber keinen unterschied (nutze Linux).

Hi combie,
Ich habs ausprobiert geht leider nicht.

S4irence:
Ich habe mal geguckt das mit der Partition wusste ich nicht aber es waren auch nicht
vorhanden. Ich habs jetzt übers Terminal und nicht mit GParted formatiert macht aber keinen unterschied (nutze Linux).

Nope, so kann das nix werden.

Wenn Du mit einem "Partitionseditor" eine Partition auf dem Datenträger angelegt hast, dann können "normale" Formatierungsprogramme für sich nur noch die angelegten Partitionen formatieren. D.h. Du kannst aus einer angelegten, nicht formatierten Partition eine angelegte, formatierte Partion machen. Aber Partition bleibt Partition.

Und mit Partition drauf ist der Datenträger NICHT mehr kompatibel zum simplen FAT-Dateisystem.

Kannst Du vergessen.

Wenn Du mit einem "Partitionseditor" dran warst, dann mußt Du vor dem Formatieren nochmal mit dem Partitionseditor dran: Zuerst ALLE Partionen vom Datenträger entfernen!

Und dann den nicht-partitionierten Datenträger formatieren.

Und damit das dann auch klappt und Dir keine Reste der gelöschten Partitionsdaten mehr in die Suppe spucken können, darf das dann auch keine "Schnellformatierung" sein, sondern eine "normale Formatierung", bei der der Datenträger tatsächlich komplett ausgenullt wird. Das braucht dann schon seine Zeit.

Am besten, Du nimmst Dir eine nagelneue und fabrikfrische SD-Karte aus der Herstellerverpackung: Die haben nämlich immer ab Werk bereits eine brauchbare FAT-Formatierung drauf. Du darfst die Formatierung halt nur nicht durch die Anwendung eines Partitionseditors verpfuschen.

Ich habe es mit folgenem Befehl Formartiert mkdosfs -F 32 /dev/sdb -I
und mkdosfs -F 16 /dev/sdb -I.

Also die eine 8GB Karte habe ich direkt aus der Verpackung (nicht Formatiert),
die 2GB habe ich wie oben in FAT16 und die 16GB wie oben in FAT32 Formatiert.

GPartet habe ich in nem ResparryPi tutorial gesehen.

S4irence:
Ich habe es mit folgenem Befehl Formartiert mkdosfs -F 32 /dev/sdb -I
und mkdosfs -F 16 /dev/sdb -I ist das der richtige oder macht der das gleiche?

Keine Ahnung. Wenn Du mit so einem Frickler-Betriebssystem arbeitest, musst Du doch die genauen Frickler-Befehle für Dein System kennen und nicht ein Windows-User!

Gerade mal gegoogelt, wie Du Dir anzeigen lassen kannst, ob und welche Partitionen irgendwo drauf sind. Für /dev/sdb wäre das wohl:

sudo parted /dev/sdb print

Was wird angezeigt?
Angezeigt werden muss, dass KEINE Partition drauf ist.

S4irence:
Also die eine 8GB Karte habe ich direkt aus der Verpackung (nicht Formatiert),

Wenn die Karte "direkt aus der Verpackung" kommt, dann hat sie null Partitionen und eine FAT-Formatierung. Die kannst Du direkt ins Ethernet-Shield einsetzen und verwenden.

S4irence:
Ich habe im web n tutorial gesehen wo das mit gparted gemacht wurde (für RaspberryPi)
daher dachte ich das geht hier genau so.

Ein Raspi ist ein richtiger Computer, mit Betriebssystem und 512 Megabytes an RAM-Speicher.

Ein UNO ist ein Mikrocontroller ohne Betriebssystem und mit ca. 0,002 Megabyte RAM. Das kannst Du überhaupt nicht vergleichen: Der Raspi hat ca. 256000 mal mehr RAM als der UNO. Und mit zweihundertsechsundfünfzigtausendmal mehr RAM kann der auch ein bischen mehr, zum Beispiel im Umgang mit SD-Karten, Partitionen und verschiedenen Dateisystemen.

S4irence:
Also soll ich die Partitionen löschen und dann mit (z.B. Windows Formatieren FAT32) ohne vorher eine Partition anzulegen?

Jaha, das ist doch meine Rede die ganze Zeit: Es darf keine Partition angelegt werden, die SD-Karte muss genau NULL Partitionen drauf haben und dann FAT-formatiert werden, ohne dass eine Partition drauf ist.

Also hab grad mal gefragt der Befehl ist dafür da. N grafisches Programm gibts dafür unter linux auch aber der Befehl ist (wie bei Windows oder Mac auch) die Brechstange damit klappts immer.

Ich habe mir eben ein eigenes SD-Card Modul gebaut das über die
Pins 10-13 läuft das funktioniert mit den SD Karten auf anhieb.
Jetzt meine Frage warum funktioniert der Shield nicht wo kann der Fehler liegen?

Danke an alle für die Antworten.

Jetzt meine Frage warum funktioniert der Shield nicht wo kann der Fehler liegen?

Erstmal Glückwunsch!

Und woran es liegt?

Oszilloskop oder/und Logikanalyser zur Hand?
Die könnten es dir zeigen....

N Oszi hätte ich zur Hand,
aber was ich dann messen soll ist mir nicht ganz klar.

Den Datenstrom oder alles oder n Pin?

Bin noch neu in dem ganzen.