Adressen von Konstanten im Flash

Hi,

Kann man Konstanten im Flash in einer Tabelle Speichern welche Adressen von anderen Tabellen haben?
Es geht um Arduino-IDE und einem AVR 32u4.

Beispiel:

const PROGMEM uintW &Paletten[2]={
&Palette1,&Palette2
};

const PROGMEM uintB Palette1[]={
255,1,0,    //rot -> gelb (grün+)
2,255,0,    //gelb -> grün (rot-)
0,255,1,    //grün -> cyan (blau+)
0,2,255,    //cyan -> blau (grün-)
1,0,255,    //blau -> magenta (rot+)
255,0,2     //magenta -> rot (blau-)
};

Palette2:
const PROGMEM uintB Palette2[]={
255,1,0,    //rot -> gelb (grün+)
2,255,0,    //gelb -> grün (rot-)
0,255,1,    //grün -> cyan (blau+)
0,2,255,    //cyan -> blau (grün-)
1,0,255,    //blau -> magenta (rot+)
255,1,255,  //magenta -> weiß (grün+)
255,2,2     //weiß -> rot (grün- blau-)
};

MfG
Andi

Ja. Bei Arrays aus Strings wird das so gemacht. Du musst aber beim Auslesen dann erst mal die Adresse des Arrays ins RAM kopieren und dann mit dieser Adresse die Daten kopieren.

EDIT:
Das geht aber nicht:

const PROGMEM uintW &Paletten[2]

Du kannst keine Arrays aus Referenzen anlegen. Arrays aus Zeigern gehen natürlich. Und Array Variablen sind automatisch Zeiger auf das erste Element

const uint8_t Palette1[] PROGMEM = {
  255, 1, 0,  //rot -> gelb (grün+)
  2, 255, 0,  //gelb -> grün (rot-)
  0, 255, 1,  //grün -> cyan (blau+)
  0, 2, 255,  //cyan -> blau (grün-)
  1, 0, 255,  //blau -> magenta (rot+)
  255, 0, 2   //magenta -> rot (blau-)
};

const uint8_t Palette2[] PROGMEM = {
  255, 1, 0,  //rot -> gelb (grün+)
  2, 255, 0,  //gelb -> grün (rot-)
  0, 255, 1,  //grün -> cyan (blau+)
  0, 2, 255,  //cyan -> blau (grün-)
  1, 0, 255,  //blau -> magenta (rot+)
  255, 1, 255, //magenta -> weiß (grün+)
  255, 2, 2   //weiß -> rot (grün- blau-)
};

const uint8_t* const PROGMEM Paletten[] = {
  Palette1, Palette2
};
const uint8_t PROGMEM PalettenLaenge[] = {
  sizeof(Palette1), sizeof(Palette2)
};

void setup() {
  Serial.begin(250000);
  for (byte i = 0; i < 2; i++) {
    Serial.print(F("Palette "));
    Serial.print(i);
    Serial.print(F(" Laenge "));
    byte len = pgm_read_byte(PalettenLaenge + i);
    Serial.print(len);
    byte* tab = (byte*)pgm_read_word(Paletten + i);
    while (len--) {
      Serial.write(' ');
      Serial.print(pgm_read_byte(tab++));
      if (len) {
        Serial.write(',');
      }
    }
    Serial.println();
  }
}

void loop() {}
Palette 0 Laenge 18 255, 1, 0, 2, 255, 0, 0, 255, 1, 0, 2, 255, 1, 0, 255, 255, 0, 2
Palette 1 Laenge 21 255, 1, 0, 2, 255, 0, 0, 255, 1, 0, 2, 255, 1, 0, 255, 255, 1, 255, 255, 2, 2

Vielen Dank, Whandall. Phenomänaaal ^^
Bist ja echt der C++-Guru :slight_smile:

Habe das benötigt, um von einem riesigen Haufen Switches und Cases wegzukommen und um Platz im Flash zu sparen.

Falls es jemanden interessiert, hier der Code:

#define uintB uint8_t
#define uintW uint16_t
#define uintL uint32_t

//Mode 0 und cindex bis 1535
const PROGMEM uintB Palette1[]={
  255,1,0,    //rot -> gelb (grün+)
  2,255,0,    //gelb -> grün (rot-)
  0,255,1,    //grün -> cyan (blau+)
  0,2,255,    //cyan -> blau (grün-)
  1,0,255,    //blau -> magenta (rot+)
  255,0,2     //magenta -> rot (blau-)
};

//Mode 1 und cindex bis 1791
const PROGMEM uintB Palette2[]={
  255,1,0,    //rot -> gelb (grün+)
  2,255,0,    //gelb -> grün (rot-)
  0,255,1,    //grün -> cyan (blau+)
  0,2,255,    //cyan -> blau (grün-)
  1,0,255,    //blau -> magenta (rot+)
  255,1,255,  //magenta -> weiß (grün+)
  255,2,2     //weiß -> rot (grün- blau-)
};

//Mode 2 und cindex bis 1535
const PROGMEM uintB Palette3[]={
  1,0,0,      //schwarz -> rot (rot+)
  2,0,0,      //rot -> schwarz (rot-)
  0,1,0,      //schwarz -> grün (grün+)
  0,2,0,      //grün -> schwarz (grün-)
  0,0,1,      //schwarz -> blau (rot+)
  0,0,2,      //blau -> schwarz (rot-)
};

//Mode 3 und cindex bis 1535
const PROGMEM uintB Palette4[]={
  255,2,2,    //weiß -> rot
  255,1,1,    //rot -> weiß
  2,255,2,    //weiß -> grün
  1,255,1,    //grün -> weiß
  2,2,255,    //weiß -> blau
  1,1,255     //blau -> weiß
};

//Mode 4 und cindex bis 3583
const PROGMEM uintB Palette5[]={
  1,0,0,      //schwarz -> rot
  2,0,0,      //rot -> schwarz
  0,1,0,      //schwarz -> grün
  0,2,0,      //grün -> schwarz
  0,0,1,      //schwarz -> blau
  0,0,2,      //blau -> schwarz
  1,1,0,      //schwarz -> gelb
  2,2,0,      //gelb -> schwarz
  0,1,1,      //schwarz -> cyan
  0,2,2,      //cyan -> schwarz
  1,0,1,      //schwarz -> magenta
  2,0,2,      //magenta -> schwarz
  1,1,1,      //schwarz -> weiß
  2,2,2       //weiß -> schwarz
};

//Mode 5 und cindex bis 3583
const PROGMEM uintB Palette6[]={
  255,2,2,    //weiß -> rot
  255,1,1,    //rot -> weiß
  2,255,2,    //weiß -> grün
  1,255,1,    //grün -> weiß
  2,2,255,    //weiß -> blau
  1,1,255,    //blau -> weiß
  255,255,2,  //weiß -> gelb
  255,255,1,  //gelb -> weiß
  2,255,255,  //weiß -> cyan
  1,255,255,  //cyan -> weiß
  255,2,255,  //weiß -> magenta
  255,1,255,  //magenta -> weiß
  2,2,2,      //weiß -> schwarz
  1,1,1       //schwarz -> weiß
};

//Mode 6 und cindex bis 1791
const PROGMEM uintB Palette7[]={
  2,0,0,      //rot -> schwarz
  0,2,0,      //grün -> schwarz
  0,0,2,      //blau -> schwarz
  2,2,0,      //gelb -> schwarz
  0,2,2,      //cyan -> schwarz
  2,0,2,      //magenta -> schwarz
  2,2,2       //weiß -> schwarz
};

//Mode 7 und cindex bis 1791
const PROGMEM uintB Palette8[]={
  255,0,0,    //rot
  0,255,0,    //grün
  0,0,255,    //blau
  255,255,0,  //gelb
  0,255,255,  //cyan
  255,0,255,  //magenta
  255,255,255 //weiß
};

const uintB* const PROGMEM Paletten[] = {
  Palette1, Palette2, Palette3, Palette4, Palette5, Palette6, Palette7, Palette8
};

void Extra1Color(uintW cindex, uintB mode, uintW Pos){
  uintB a=cindex;
  byte* tab = (byte*)pgm_read_word(Paletten + mode)+((cindex>>8)*3);
  uintB r=pgm_read_byte(tab++);
  uintB g=pgm_read_byte(tab++);
  uintB b=pgm_read_byte(tab);
  if(r==1)r=a; else if(r==2)r=255-a;
  if(g==1)g=a; else if(g==2)g=255-a;
  if(b==1)b=a; else if(b==2)b=255-a;
  strip.setPixelColor(Pos,r,g,b);
}

Die Funktion setzt mit einem "cindex" (Color-Index) von 0 bis n einen Pixel an der Position "Pos" aus dem Mode n (0-7).

MfG
Andi