Arduino + SDcard-reader: LED blinkt nicht

Hi,

ich habe da ein Problem und möchte hier um Rat fragen.

Umgebung: Arduino Uno mit GPS Shield Duino Peak

Es gibt auf dem Arduino eine LED, beschriftet mit L. Diese möchte ich blinken lassen, um eine Fehlersituation anzuzeigen. Unter den Beispielen gibt es das Programm Blink, das auch funktioniert, d.h. die LED blinkt.
Nun verwende ich aber auch den SD-Karten-Lessr auf dem GPS Shield, und dann funktioniert es nicht.

Präziser: Das ist der kritische Code-Teil:
// SD-card
DEBUG_PRINT2USB("use SD ");
useSDcard = SD.begin(SD_CHIP_SELECT);
DEBUG_PRINT2USB(" begin: ");
DEBUG_PRINTLN2USB( useSDcard);

if ( useSDcard )
{
useSDcard = createFile();
}
.....
// check: SD-card must be avail
if (!useSDcard )
doBlinkEmergency();

Die Funktion doBlinkEmergency() ist praktisch genau so aufgebaut wie das Beispielprogramm Blink.

Rufe ich diese Funktion auf vor dem Codeblock mit der SD-Karte, dann funktioniert der Code, d.h. die LED blinkt. Rufe ich die Funktion danach auf, dann blinkt die LED nicht.

Hat da jemand eine Idee? Was kann man da machen?

Schönen Gruß
August

PS: gleiches Problem:
ich habe das GPS shield ersetzt durch einen reinen SD-Card-reader, d.h. keine weiteren Teile am Arduino Uno. Es tritt der gleiche Effekt auf.

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
So ist er auch auf portablen Geräten lesbar. Das kannst Du auch noch nachträglich ändern.

Gib uns bitte auch vollständige kompilierbare Sketche.

Gruß Tommy

Wenn es ein kritischer Code-Teil ist, warum lässt du ihn nicht einfach weg ? :wink:

Leider können wir mit Sketch-Fragmenten nichts anfangen. Der Fehler liegt meist im geheimen Teil des Sketches.

Umgebung: Arduino Uno

Die Blink LED des UNO hängt an Pin 13.
Pin 13 ist aber auch meist Clock für das SPI, welches die SD Karte spricht.

Also:
Beides gleichzeitig, geht nicht.

ohne Gewähr, denn ich kenne das Shield nicht

Hi

Dito mit combie - die LED liegt auf dem SPI-Clock und kann deswegen NICHT gleichzeitig mit der SPI-Hardware benutzt werden.
Wenn das Geblinke NUR einen Fehler-Code ausgeben soll und NUR per Reset behoben werden soll, kannst Du VOR der Blinkerei den Pin pit SPI.end() frei geben, danach ist Der wieder für pinMode digitalWrite zugänglich!!
Das entbindet allerdings die SPI-Hardware vom Dienst - ein Reaktivieren (außer über Reset) müsste detailliert recherchiert werden, daß Das auch klappt!!

Hatte Ähnliches bei Nutzung einer CAN-Modul, Welches per SPI angesprochen wurde - bei Fehlern (CAN nicht erkannt oder einem per CAN befohlenem Reset) wollte ich die LED blinken lassen - DAS geht erst, wenn die SPI-Hardware abgeschaltet (spi.end(); ) wird, Vorher hat die Hardware die Finger auf diesem Pin!!

MfG

Hi,

Danke für die Hinweise. Das Problem ist gelöst.

Ich habe mein Programm (>800 Zeilen) mal reduziert und möchte das Testpgm hier präsentieren:

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

#define    DEBUG_PRINT2USB( ... )   Serial.print(__VA_ARGS__)
#define    DEBUG_PRINTLN2USB( ... ) Serial.println(__VA_ARGS__)

#define SD_CHIP_SELECT 4 

boolean useSDcard = false;

void setup() {
  // put your setup code here, to run once:
    Serial.begin(9600);
    while(!Serial) ;
    // SD-card
    DEBUG_PRINT2USB("use SD ");
    //SPI.begin();         // scheint nicht nötig zu sein
    useSDcard = SD.begin(SD_CHIP_SELECT);
    DEBUG_PRINT2USB(" begin: ");
    DEBUG_PRINTLN2USB( useSDcard);

// for my test
  //  if ( useSDcard ) useSDcard = false;    

    // check: SD-card must be avail
    if (!useSDcard )
        doBlinkEmergency();

}

void loop() {
  // put your main code here, to run repeatedly:

}

void doBlinkEmergency( void )
{
   Serial.println("emergency !");
   SPI.end();           // <===== das fehlte !
   while ( 1 )
   {
      delay(500);                        // wait for a 0.5 second
      digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
      delay(100);                        // wait for a 0.1 second
      digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
   }
}

Im Setup kann ich die Variable useSDcard umschalten und damit die Blink-Routine aufrufen. In dieser Routine fehlte bei mir das Statement SPI.end().

Funktioniert in beiden Fällen (d.h. ich kann es blinken lassen bzw. auf die SD-Karte zugreifen).

Danke für die Unterstützung. Ich bin ein Stück weiter.
AugustQ