RAM Probleme

Ich habe mir eine LED-Matrix von Adafruit besorgt um 16x16 Bilder darzustellen. Dazu habe ich mir ein C#-Programm geschrieben das 16x16 Bilder nimmt und jeden einzelnen Pixel in eine Textdatei schreibt. Immer drei Zeilen ergeben einen Pixel. Die Dateien lese ich von einer SD Karte ein. Jetzt ist es allerdings so dass es immer nach einer bestimmten Zeit passiert dass das ganze Programm irgendwie weiterläuft jedoch die LEDs nicht mehr aktualisiert werden. Meine Vermutung ist dass es irgendwie mit dem Puffer zusammenhängen müsste in den die Datei zeilenweise eingelesen wird. Jedoch habe ich auch nach einiger Zeit nichts hilfreiches gefunden. Oder ich bin zu verwöhnt vom automatischen RAM-Management von anderen Sprachen. Um das ganze besser zu verstehen unten stehend der gesamte Code den ich benutze.

Was mich darauf bringt dass es irgendwie mit dem RAM zusammenhängen muss ist einfach die Tatsache dass es schneller crasht wenn ich mehr RAM verbrauche.

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
#include <SD.h>

#define PIN            3
#define NUMPIXELS      256

Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
int delayval = 50;
int intensity = 10;
File dir;
File file;
String fileBuffer;

void setup() 
{
  // put your setup code here, to run once:
  pixels.begin();
  Serial.begin(9600);

  Serial.println("Init SD-Card");

  if (!SD.begin(53)) 
  {                                  
    Serial.println("Init failed");    
    return;
  }
  Serial.println("Init success");
  dir = SD.open("/");
}

void loop() 
{
  showPicture();
  //delay(500);
}

void showPicture()
{
  Serial.println("show");
  int countLED=0;
  int countColor=0;
  int r=0;
  int g=0;
  int b=0;
  getNextFile();
  while (file.available())
  {
    
    if (countLED == NUMPIXELS)
    {
      Serial.println("break");
      break;
    }
    
    fileBuffer = file.readStringUntil('\n');
    switch (countColor)
    {
      case 0:
        r = fileBuffer.toInt();
        countColor = 1;
        break;

      case 1:
        g = fileBuffer.toInt();
        countColor = 2;
        break;

      case 2:
        b = fileBuffer.toInt();
        fillLed(countLED, r, g, b);
        countColor = 0;
        countLED++;
        break;
    }
  }
  pixels.show();
}

void getNextFile()
{
  file =  dir.openNextFile();
  if (!file)
  {
    dir = SD.open("/");
    file =  dir.openNextFile();
    
  }
  if(file.isDirectory())
  {
      file =  dir.openNextFile();
  }
  Serial.println(file.name());
}

void fillLed(int p, int r, int g, int b)
{
  r = map(r, 0, 255, 0, intensity);
  g = map(g, 0, 255, 0, intensity);
  b = map(b, 0, 255, 0, intensity);
  pixels.setPixelColor(p, pixels.Color(r, g, b));
}

Der Debug Output sieht zum Zeitpunkt des Crashs folgendermaßen aus:

038.TXT
show
039.TXT
show
040.TXT
show

show

Verzichte auf den "String" Typ und benutze die C typischen char Arrays. Das dürfte schon mal helfen.

Hi

Anscheinend bekommst Du keine neue Datei geöffnet.
Hast Du Das geprüft?
Hast Du nur die Bilder bis zur Nummer 40?
Wird an den LEDs was geändert, wenn kein File-Name ausgegeben wird?
Was passiert, wenn Du nach der Bild-Anzeige einige Pixel schwarz färbst (oder in eine sonstige Farbe) - bleiben Die 'für das nächste Bild' so erhalten, oder werden Diese überschrieben?

Alles in Allem etwas wenig Informationen.

Packe Serial.print-Ausgaben in Deinen Sketch, damit Du siehst, WAS Er WO macht - z.B., ob das Ende des Ordner erreicht wurde und Er versucht, das Root-Verzeichniss wieder zu öffnen ect.pp.

MfG

PS: String war auch mein erster Verdächtiger - so Viel macht Er ja nicht damit - klar: Eine Fragmentierung des RAM wird dadurch trotzdem gefördert.

Edit
Das 'DU' in ein 'Du' getauscht - will hier doch Niemanden anschreien :), liest Sich auch gleich viel besser.

Ich vermisse das close des Files.

Gruß Tommy

Tommy56:
Ich vermisse das close des Files.

Gruß Tommy

Vielen Dank das war anscheinend genau das Problem. Und ich hab tagelang verzweifelt zu kompliziert gedacht.

postmaster-ino:
Hi

Anscheinend bekommst Du keine neue Datei geöffnet.
Hast Du Das geprüft?
Hast Du nur die Bilder bis zur Nummer 40?
Wird an den LEDs was geändert, wenn kein File-Name ausgegeben wird?
Was passiert, wenn Du nach der Bild-Anzeige einige Pixel schwarz färbst (oder in eine sonstige Farbe) - bleiben Die 'für das nächste Bild' so erhalten, oder werden Diese überschrieben?

Alles in Allem etwas wenig Informationen.

Packe Serial.print-Ausgaben in Deinen Sketch, damit DU siehst, WAS Er WO macht - z.B., ob das Ende des Ordner erreicht wurde und Er versucht, das Root-Verzeichniss wieder zu öffnen ect.pp.

MfG

PS: String war auch mein erster Verdächtiger - so Viel macht Er ja nicht damit - klar: Eine Fragmentierung des RAM wird dadurch trotzdem gefördert.

Tut mir wirklich Leid. Ich war einfach viel zu festgefahren auf dem Problem dass Strings in C doof sind dass ich nicht darüber nach gedacht hatte was es sonst sein könnte. Beim nächsten Mal versuche ich die Sache besser anzugehen.

htffan:
Und ich hab tagelang verzweifelt zu kompliziert gedacht.
Tut mir wirklich Leid. Ich war einfach viel zu festgefahren ...

Gräm Dich nicht :slight_smile:

Ich habe gut 10 Jahre lang u. A. den Mailserver einer 30-köpfigen Werbeagentur betreut. Bis zuletzt habe ich immer wieder mit Fehlern gekämpft, von denen ich nicht geglaubt hätte, dass sie auftreten können. Wenn man sich nur fest genug in einen Gedanken verbissen hat, ist man für andere Sachen vernagelt.

Was immer wieder hilft, ist ein gewisser Abstand. Leibniz soll seine besten Einfälle bei Spaziergängen in der Natur gehabt haben. Und ich hätte nie einen Job angetreten, bei dem ich nicht wenigstens einmal pro Stunde eine hätte rauchen und in die Wolken gucken können.

Gruß

Gregor