Probleme mit Byte-Array Länge >350

Hi Leute,

ich hab ein Problem mit meinem Code.
Habe mir anhand der Anleitungen im Internet einen LED Tisch gebaut, mit 25 Feldern.
Das ganze wird über einen MAX7219 gesteuert.
Soweit funktioniert alles einwandfrei, allerdings habe ich ein Problem.
Zum besseren Verständnis habe ich den Code mal angehängt.
Ich definiere mir am Anfang einen neuen Typ Frame, welcher selbst ein Bytearray der Länge 5 ist, was einem angezeigten "Bild" entspricht, je 1 Byte für jede Zeile.
Die gesamte Animation habe ich dann in einem Frame-Array gespeichert.
Der Code läuft auch einwandfrei, sobald das Array der Frames allerdings größer als 350 wird, sprich ab 351, kompiliert er den Code zwar durch, danach macht der Arduino aber nur wirre Sachen.
Die Animation zeigt falsche Frames an, und die über Pin 7 un 8 angesprochenen Schalter, um zwischen Dauerbeleuchtung, Animation, und einem Testbild zu schalten zeigen keinerlei Wirkung mehr.

Hat jemand etwas ähnliches schonma gehabt?
Ich versteh nicht ganz wieso das genau bei einer Länge von 351 verrückt spielt.

Danke euch!

#include <LedControl.h>
LedControl lc=LedControl(12,11,10,1);

int PinMusicSync = 7;
int PinAnimation = 8;

typedef byte Frame[5];

Frame Animation2[350] = {
{B10101,
 B01010,
 B10101,
 B01010,
 B10101},

{B01010,
 B10101,
 B01010,
 B10101,
 B01010},

{B11011,
 B11011,
 B00000,
 B11011,
 B11011},
....

};
void setup() {
  lc.shutdown(0,false);
  lc.setIntensity(0,15);
  lc.clearDisplay(0);
  Serial.begin(9600);
  pinMode(PinMusicSync, INPUT);
  pinMode(PinAnimation, INPUT);
}

void playAnimation2()
{
  for(int k=0; k<350; k++)
  {
    for(int m=0; m<5; m++)
      {
        lc.setRow(0,m,Animation2[k][m]);
      }
    delay(700);
  }
}



void loop() { 
  int buttonState1 = digitalRead(PinMusicSync);
  int buttonState2 = digitalRead(PinAnimation);
  if(buttonState1 == 1)
  {
      //TESTBILD
    lc.setRow(0,0,B10001);
    lc.setRow(0,1,B11011);
    lc.setRow(0,2,B10101);
    lc.setRow(0,3,B10001);
    lc.setRow(0,4,B10001);  

  }
  else if(buttonState2 == 1)
  {
  playAnimation2();
  }
  else
  {
//
    lc.setRow(0,0,B11111);
    lc.setRow(0,1,B11111);
    lc.setRow(0,2,B11111);
    lc.setRow(0,3,B11111);
    lc.setRow(0,4,B11111); 
  }    
}

In Deinem Sketch belegt das Array bereits 1750 Byte Speicher (350*5). Falls Du einen UNO verwendest: der hat nur 2 KB RAM.

Gib die Animatonen in den Flasch.
grüße Uwe

uwefed:
http://arduino.cc/forum/index.php/topic,127552.msg965539.html#msg965539
Gib die Animatonen in den Flasch.

Das ist natürlich ein SEHR erfolgversprechender Ansatz!

Aber irgendwie führst Du ihn ganz stark aufs Glatteis, wenn Du ihm einen Link zeigst, wie String-Daten im Flash abgelegt und aus dem Flash geholt werden. Nicht, dass er jetzt in seiner Verzweiflung anfängt, seine Animationsdaten in Strings zu verpacken.

Der OP wird es vermutlich eher mit seinem zweidimensionalen Byte-Array machen wollen, das er schon im Programm hat.
Und das erfordert auch nur zwei kleine Änderungen, die ich mal kurz aufzeige.

In der Array-Deklaration die Ergänzung von PROGMEM:

Frame Animation2[350] PROGMEM = ...

Und beim Byte-Zugriff das Abholen des Bytes aus dem Flash.
Statt:

  lc.setRow(0,m,Animation2[k][m]);

Setze:

  setRow(0,m,pgm_read_byte(&(Animation2[k][m])));

Das sind meiner Meinung nach die beiden einzigen notwendigen Codeänderungen, um die Daten vom RAM ins Flash zu verlagern und damit den RAM-Speichermangel durch Verbraten von viel zu viel RAM zu vermeiden.

Außer, dass er sein "delay(700);" danach wohl um ein paar Millisekunden herabsetzen kann, damit die Animation wieder im Original-Tempo abläuft, denn die Flash-Zugriffe sind im Vergleich zu RAM-Zugriffen natürlich schneckenlangsam.

jurs, nicht immer habe ich Zeit Romane zu schreiben :wink: :wink: :wink:
Grüße Uwe

Uwe antwortet nämlich nur, um in jedem Thread vertreten zu sein :grin:

]:smiley: ]:smiley: ]:smiley: