[erledigt] Sichtbarkeit/scope von Variablen?

Hallo zusammen!

Ich stehe mal wieder vor einem Rätsel:

In meinem Programm gibt es eine globale Variable (ein zweidimensionales Feld mit Zeichendefinitionen), das auszugsweise so aussieht:

const static uint8_t glyphs[128][11] PROGMEM =
{
...
   { 0x00, 0x00, 0x10, 0x28, 0x44, 0x7C, 0x44, 0x44, 0x44, 0x00, 0x00 }, //  65 (A)
...
}

In einer Funktion möchte ich nun auf dieses Feld zugreifen, um den Buchstaben A auf ein Display zu bringen:

void putC(uint8_t xCoord_, uint8_t yCoord_, uint8_t asciiCode_)
{
  Serial.print("[putC()] glyphs[65][5]="); //  Diese Zeilen erzeugen die Ausgabe
  Serial.println(glyphs[65][5], HEX);     //   [putC()] glyphs[65][5]=7C
  
  Serial.println();                      
  
  for(uint8_t line=0; line != 11; line++)
  {
    Serial.print  ("[putC()] glyphs[");                 //
    Serial.print  (asciiCode_);                        //
    Serial.print  ("][");                             //
    Serial.print  (line);                            //
    Serial.print  ("]=");                           // Diese Zeilen erzeugen die Ausgabe
    Serial.println(glyphs[asciiCode_][line], HEX); //  [putC()] glyphs[65][5]=0

    uint8_t testBit=1;
    for(uint8_t bitPos=0; bitPos != 8; bitPos++)
    {
      if((uint8_t)(glyphs[asciiCode_][line] & testBit) != 0)
      {
        displ.setPixel(xCoord_+bitPos, yCoord_+line);
      }
      testBit=testBit*2;
    }
  }
}

Wenn ich die Funktion mit 'putC(0, 0, 65)' aufrufe, erhalte ich jedoch unterschiedliche Ergebnisse für IMO identische Zugriffe (s. Kommentare im Code).

Stehe ich mal wieder auf der Leitung?

Gruß

Gregor

Das Array steht im Flash!

Korrekt:

Serial.println(pgm_read_byte(&glyphs[asciiCode_][line]), HEX);
if((uint8_t)(pgm_read_byte(&glyphs[asciiCode_][line]) & testBit) != 0)

Also die Adresse des Bytes an pgm_read_byte() übergeben damit du den Inhalt hast

Serenifly:
Das Array steht im Flash!

Korrekt:

Serial.println(pgm_read_byte(&glyphs[asciiCode_][line]), HEX);
if((uint8_t)(pgm_read_byte(&glyphs[asciiCode_][line]) & testBit) != 0)

Also die Adresse des Bytes an pgm_read_byte() übergeben damit du den Inhalt hast

Uh! Shit! Da fehlt mir wohl noch Erfahrung mit Zeug, das im Flash steht.

Danke!

Gregor