Pages: [1]   Go Down
Author Topic: Problem mit PROGMEM  (Read 526 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ?

Code:
#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(){

}


« Last Edit: March 25, 2013, 02:31:10 pm by benny123 » Logged

Germany
Offline Offline
Faraday Member
**
Karma: 49
Posts: 2725
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:

Code:
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 )  smiley-wink
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:

Code:
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 )  smiley-wink

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 )

[link]
http://arduino.cc/forum/index.php/topic,153791.0.html
[/link]
Logged

Germany S-H
Offline Offline
Edison Member
*
Karma: 117
Posts: 2436
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 http://www.arduino.cc/en/Reference/PROGMEM 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.

Logged

Pages: [1]   Go Up
Jump to: