Forum: Mikrocontroller und Digitale Elektronik PROGMEM in C++


von Martin M. (ats3788)


Lesenswert?

Hallo
Letzte Woche habe ich ein wenig mit PROGMEM und dem Uno herum gespielt 
um Speicher zu sparen. Eine nette Sache die in Pascal so nicht geht.
Heute wollte ich das ganze in eine Klasse verpacken und leider geht das 
nicht so wie ich mir das vorgestellt habe.
Ich erlaube mir das hier zu posten weil es mehr ein Programmier Problem 
ist und kein eigentliches Arduino Problem



 struct tButton {
  uint16_t x;
  uint16_t y;
  uint16_t h;
  uint16_t w;
  uint16_t KeyCol;
  uint16_t Shadow;
  uint16_t SColor;
  uint16_t TColor;
};


 const struct tButton KeyButton[40] PROGMEM = { ........ };

// Die Function mit der ich den Programm Speicher auslese
  tButton KeyboardClass::SetFromPROGMEM(uint8_t Value)
{
  tButton Result;
  Result.x = pgm_read_word(&(KeyButton[Value].x));
  Result.y = pgm_read_word(&(KeyButton[Value].y));
  Result.h = pgm_read_word(&(KeyButton[Value].h));
  Result.w = pgm_read_word(&(KeyButton[Value].w));
  Result.KeyCol = pgm_read_word(&(KeyButton[Value].KeyCol));
  Result.Shadow = pgm_read_word(&(KeyButton[Value].Shadow));
  Result.SColor = pgm_read_word(&(KeyButton[Value].SColor));
  Result.TColor = pgm_read_word(&(KeyButton[Value].TColor));
  return (Result);

}

In der Arduino Routine funktioniert das Wunderbar, leider nicht als 
Klasse. Da wird nur Blödsinn ausgelesen. Wo mache ich meinen Ansatz 
Fehler ????

von Oliver S. (oliverso)


Lesenswert?

Ein compilierbares Beispiel, das Blödsinn ausliest, wäre nicht schlecht.

Oliver

von Martin M. (ats3788)


Lesenswert?

Hallo
Wenn ich es folgendermaßen mache funktioniert es

tButton KeyboardClass::SetFromPROGMEM(uint8_t Value)
{
  tButton Result;
  Result.x = KeyButton[Value].x; // 
pgm_read_word(&(KeyButton[Value].x));
  Result.y = KeyButton[Value].y;// 
pgm_read_word(&(KeyButton[Value].y));
  Result.h = KeyButton[Value].h; // 
pgm_read_word(&(KeyButton[Value].h));
  Result.w = KeyButton[Value].w; 
//pgm_read_word(&(KeyButton[Value].w));
  Result.KeyCol = KeyButton[Value].KeyCol; // 
pgm_read_word(&(KeyButton[Value].KeyCol));
  Result.Shadow = KeyButton[Value].Shadow; // 
pgm_read_word(&(KeyButton[Value].Shadow));
  Result.SColor = KeyButton[Value].SColor; // 
pgm_read_word(&(KeyButton[Value].SColor));
  Result.TColor = KeyButton[Value].TColor; // 
pgm_read_word(&(KeyButton[Value].TColor));
  return (Result);

}
Sind die Daten im RAM oder Programmspeicher ????

von Oliver S. (oliverso)


Lesenswert?

Martin M. schrieb:
> Sind die Daten im RAM oder Programmspeicher ????

Die Frage kannst du dir dann doch selber beantworten;)

Oliver

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Da tButton trivial kopierbar ist und die gesamte Struktur eingelesen 
wird, kann man auch einfach:
1
tButton KeyboardClass::SetFromPROGMEM (uint8_t Value)
2
{
3
  tButton Result;
4
  memcpy_P (&Result, &KeyButton[Value], sizeof (Result));
5
  return Result;
6
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.