Speicherprobleme

Ein großes Problem bei der PROGMEM Geschichte ist dass man keine Fehler bekommt wenn die Adressen falsch ist. Der Code läuft munter weiter, aber kopiert die falschen Sachen

Die Idee die ich am Anfang hatte, dass man erst mal den Pointer selbst aus dem Flash kopieren muss war dann doch korrekt (ich hatte es aber erst falsch gemacht):

const byte melody_1[] PROGMEM =
{
    0x00, 0x90, 0x2b,
    0x81, 0x3e, 0x90, 
    0x37, 0x32, 0x80, 
    0x2b, 0x00, 0x80, 
    0x37, 0x20, 0xff  
};

const byte melody_2[] PROGMEM =
{
    0x11, 0x12, 0x13,
    0x14, 0x15, 0x16, 
    0x17, 0x18, 0x19,
};

const byte* melodies[] PROGMEM = { melody_1, melody_2 };

void setup() 
{
  Serial.begin(115200);
}

void loop() 
{
  for(int current_melody = 0; current_melody < 2; current_melody++)
  { 
    for(int i = 0; i < 15; i++)
    {
      unsigned int pointer = pgm_read_word_near(&melodies[current_melody]);
      Serial.println(pgm_read_byte_near(pointer + i), HEX);
    }
    Serial.println();
  }
  
  Serial.println(F("--------------\n"));
  delay(5000);
}

Dabei beachten dass er beim zweiten Array mehr kopiert als eigentlich im Array definiert sind. Das ist aber nur wegen der for-Schleife.

Wie gesagt kann man das Pointer Array aber auch im RAM lassen. Das sind nur zwei Bytes pro Zeiger:

const byte* melodies[] = { melody_1, melody_2, melody_3 };

Dann geht es auch wie man erwartet:

Serial.println(pgm_read_byte_near(&melodies[current_melody][i]), HEX);