Problem mit PROGMEM

Hallo , ich habe folgendes Problem mit der PROGMEM Funktion
im ersten Fall , übergebe ich an die Stringvariable LCDText[0]=Loks[4]; (direkt den Wert "4" ,funktioniert)
ersetze ich die "4" durch die Variable "aktiv" ,die ebenfalls den Wert 4 besitzt , funktioniert es nicht
( die Stringvariable LCDText[0] bleibt leer ).
Weiß vielleicht jemand weiter ?

#include <avr/interrupt.h>
#include <avr/io.h>
#include <LiquidCrystal.h>
#include <avr/pgmspace.h>
#define NUM_LCD 4

LiquidCrystal lcd[NUM_LCD] = {
  LiquidCrystal(23, 24, 25, 29, 30, 31, 32),
  LiquidCrystal(23, 24, 26, 29, 30, 31, 32),
  LiquidCrystal(23, 24, 27, 29, 30, 31, 32), 
  LiquidCrystal(23, 24, 28, 29, 30, 31, 32)};

prog_char* Loks[64] PROGMEM={
  "-------","Adler","AE3/6","AE 8/14","BR01","BR03","BR03 Stroml",  "BR05","BR10","BR17","Rheingold","BR18.1","BR38","BR41","BR50","BR52 grau","BR53","BR80","BR81","BR85",
  "BR86","BR89","BR93","BR96","BR120","BR194", "BR212Trak","BR360","CargoSpri","DR212","E04","E19 blau","E19 Rot","E40","E52","E69","E70","E91","E103","E118b ",
  "E120","E151","Geisling","Heizerlok","Koef","Krokodil","Museumlok","ICE","Pendolino","Rottenkraft","Schienenbus","SVT137","Torflok","Unicef","V36","V100.20","VT11.5","V160 grau","V160 rot","V221",
  "Zeppelin","----","----","----"   };

int aktiv=4;
String LCDText[5];

void setup(){
  for (int i = 0; i < NUM_LCD; i++){
    lcd[i].begin(20, 4);
    lcd[i].clear();
  }
  LCDText[0]=Loks[4]; // funktioniert in dem Fall erscheint BR01 auf dem Display
  lcd[1].setCursor(2, 0);
  lcd[1].print(LCDText[0]);// Ausgabe LCD 1
  
  
  LCDText[0]=Loks[aktiv]; // funktioniert nicht
  lcd[0].setCursor(2, 0);
  lcd[0].print(LCDText[0]);// Ausgabe LCD 0
  
  
}
void loop(){

}

Die Variable Loks besteht aus 64 Zeigern, die sich im PROGMEM befinden, die Texte selbst sind im RAM.

Ein String kann seinen Text nicht im Flash - Speicher haben.
Wofür du String - Objekte brauchst, und dazu noch 4 Stück gleichzeitig, weiss ich nicht.
Warum nimmst du nicht eine char* Variable?

Vermutlich arbeitest du mit Variablen, damit so was geht:

int index[NUM_LCD] = {3,5,19,1 };  // als Beispiel:    lcd[4] würde "Adler" anzeigen
for ( int i = 0; index < NUM_LCD; i++)
{
  char* aktuelleLok = Loks[index[i]];
  lcd[i].print(aktuelleLok);
}

Dieses Beispiel geht erstmal ohne PROGMEM, da PROGMEM nur sinnvoll ist, wenn die Texte selbst im Flash liegen.

Wenn du die Texte mit unterschiedlicher Länge im PROGMEM haben willst, bräuchtest du erstmal 64 prog_char[] Variable, die du dann als Pointer in einem Array zusammenfasst...
Ob das Array schon zur Compilezeit fest ist und auch in den Flash gehen kann, oder erst in setup() im RAM zusammengebaut werden muss, kriegen wir später.
( Oder jurs arbeitet schon an einer ausgefuchsten Version ) :wink:

michael_x:
Die Variable Loks besteht aus 64 Zeigern, die sich im PROGMEM befinden, die Texte selbst sind im RAM.

Ein String kann seinen Text nicht im Flash - Speicher haben.
Wofür du String - Objekte brauchst, und dazu noch 4 Stück gleichzeitig, weiss ich nicht.
Warum nimmst du nicht eine char* Variable?

Vermutlich arbeitest du mit Variablen, damit so was geht:

int index[NUM_LCD] = {3,5,19,1 };  // als Beispiel:    lcd[4] würde "Adler" anzeigen

for ( int i = 0; index < NUM_LCD; i++)
{
  char* aktuelleLok = Loks[index[i]];
  lcd[i].print(aktuelleLok);
}




Dieses Beispiel geht erstmal ohne PROGMEM, da PROGMEM nur sinnvoll ist, wenn die Texte selbst im Flash liegen. 

Wenn du die Texte mit unterschiedlicher Länge im PROGMEM haben willst, bräuchtest du erstmal 64 prog_char[] Variable, die du dann als Pointer in einem Array zusammenfasst... 
Ob das Array schon zur Compilezeit fest ist und auch in den Flash gehen kann, oder erst in setup() im RAM zusammengebaut werden muss, kriegen wir später.
( Oder jurs arbeitet schon an einer ausgefuchsten Version ) ;)

Hallo , erstmal vielen Dank , aber wirklich viel habe ich nicht verstanden ,
mir geht's darum ,den RAM - Speicher zu entlasten ( in der Hoffnung , das mit PROGMEM zuerledigen )
hier mal ein Link zum eigentlich Projekt , das soweit ganz gut läuft ( ohne PROGMEM )

http://arduino.cc/forum/index.php/topic,153791.0.html

benny123:
Hallo , erstmal vielen Dank , aber wirklich viel habe ich nicht verstanden ,
mir geht's darum ,den RAM - Speicher zu entlasten ( in der Hoffnung , das mit PROGMEM zuerledigen )

Wie das mit String-Arrays im PROGMEM funktioniert, steht auf PROGMEM - Arduino Reference unter "Arrays of strings".

Und damit sind C-typische C-Strings (nullterminierte Strings) gemeint und keine String-Objekte.

String-Objekte wie in
String LCDText[5];
solltest Du bei der Arduino-Programmierung besser komplett vermeiden, denn einerseits neigen diese dynamischen Stringobjekte sowieso schon zum Aufbrauchen des RAM-Speichers, wenn Du viel von der dynamischen Längenänderung Gebrauch machst, und zweitens ist die Implementierung dieser String-Objektklasse auf der Arduino-Plattform fehlerhaft, so dass bei Gebrauch bestimmter Zuweisungen (hauptsächlich im Zusammenhang mit der Umwandlung numerischer Variablen in Strings) ein rasanter RAM-Speicherverbrauch eintreten kann, der das Programm vielfach schon nach kurzer Laufzeit "durchdrehen" läßt, weil kein RAM-Speicher mehr frei ist.