String im Flash

Gast #465518
Lesenswert?

Hi

Texte ans LCD senden ist kein Problem, das funktioniert einwandfrei. 
Doch leider liegen die Texte ja immer im RAM, deswegen würd ich die nun 
gerne in den Flashbereich verlagern.

Habe dafür meine Routine angepasst:
void lcd_ausgabe(unsigned char zeile,unsigned char *text)
habe ich zu
void lcd_ausgabe(unsigned char zeile,const unsigned char *text)
gemacht.

Nun hier mein Test mit den Strings:

char Text1[] PROGMEM="Test 1 bla da blubb blubb";
char Text2[] PROGMEM="Test 21234";

//Die beiden Strings müssten doch im Flash liegen, oder?

int main(void)
{
  lcd_initialisieren();  //starte LCD
  _delay_s(1); //selbstprogrammierte delay-Routine für Sekunden
  char ausgabetext[25];
  strcpy(ausgabetext,Text1);
  lcd_ausgabe(1,ausgabetext); //Test 1: Kopiere Text vom Flash in RAM, 
gebe dann aus
  _delay_s(1);

  lcd_ausgabe(2,Text2); //Test 2: Gebe Flashtext direkt aus
  _delay_s(1);
  strcpy(ausgabetext,PSTR("blubb")); //Test 3: Der Text müsste doch auch 
aus dem Flash kommen und direkt in den RAM gehen?
  lcd_ausgabe(1,ausgabetext);
  _delay_s(1);
  lcd_ausgabe(2,"blubbb"); //Test 4: Direktausgabe aus dem RAM
  while (1)  //Endlosschleife, damit das Programm nicht beendet wird und 
unkontrollierte Zustände auftreten
  {
  }
  return 1;
}


Nur der 4. Test gibt eine lesbare, sinnvolle Ausgabe auf dem LCD.

Woran kann das liegen?

Ciao Tobias
Gast #465533
Lesenswert?

char Text1[] PROGMEM="Test 1 bla da bl";
char Text2[] PROGMEM="Test 21234";

int main(void)
{
  lcd_initialisieren();  //starte LCD
  _delay_s(1);
  char ausgabetext[16];
  strcpy_P(ausgabetext,Text1);
  lcd_ausgabe(1,ausgabetext);
  _delay_s(1);
  lcd_ausgabe(2,Text);
  _delay_s(1);
  strcpy_P(ausgabetext,PSTR("blubb"));
  lcd_ausgabe(1,ausgabetext);
  _delay_s(1);
  lcd_ausgabe(2,PSTR("blubbb"));
  _delay_s(1);
  lcd_ausgabe(2,"blubbb");
  while (1)  //Endlosschleife, damit das Programm nicht beendet wird und 
unkontrollierte Zustände auftreten
  {
  }
  return 1;
}

Soo... 1 geht bestens, 2 müll, 3 geht, 4 gibt müll und 5 gar nix.
Also muss ich immer erst strcpy_P verwenden, ohne gehts nie?
Gast #465550
Lesenswert?

Im prinzip ja.
Du kannst dir das so vorstellen:
Die Polizei deines Wohnortes sucht Peter Müller in der Schillerstrasse 
4.

strcpy   sucht in deiner Stadt - dort wohnt aber kein Peter Müller
strcpy_P ist für die Nachbarstadt zuständig - dort wohnt in der 
Schillerstrass 4 ein Peter Müller. Was strcpy_P jetzt macht ist, dass er 
den Peter Müller in deine Stadt bringt damit ihn die Polizei in der 
Schillerstrasse 4 finden und verhaften kann ;-)


Und jetzt ersetzte das Wort "Polizei deines Wohnortes" durch 
"lcd_ausgabe" und verhaften durch "am LCD ausgeben".

Man kann natürlich auch das BKA beauftragen, dass ist dann eine andere 
Polizeibehörde die direkt im Nachbarort suchen.
Ersetzte BKA durch "lcd_ausgabe_aus_progmem". (z.B. mit pgm_read_byte)
Gast #465558
Lesenswert?

Ok, danke, das ist verständlich :-)

ich denke, da ist strcpy_P wesentlich einfacher zu handhaben als 
pgm_read_byte

Kann man strcpy_P irgendwie mit in die Unterroutine (lcd_ausgabe) 
einbinden? Schlecht, oder? Weil an die Routine muss ich ja direkt schon 
den Inhalt, also den "verhafteten" weitergeben.

Ciao Tobias
Gast #465569
Lesenswert?

Hehe

Das BKA lass ich mal lieber aus dem Spiel, kann zwar "alles", ist aber 
zu kompliziert. Macht nur Fehler...

Da lob ich mir dann doch die Polizei aus dem Nachbarort, auch wenn ich 
die immer extra anrufen muss.

Damit ist mein Problem komplett geklärt, vielen Dank!

Ciao Tobias
Gast #465570
Lesenswert?

Folgendes gibts in der LCD-Routine von Fleury:

lcd.c:
1
void lcd_puts_p(const char *progmem_s)
2
/* print string from program memory on lcd (no auto linefeed) */
3
{
4
    register char c;
5

6
    while ( (c = pgm_read_byte(progmem_s++)) ) {
7
        lcd_putc(c);
8
    }
9

10
}/* lcd_puts_p */
lcd.h:
1
#define lcd_puts_P(__s)         lcd_puts_p(PSTR(__s))

Das benutze ich so:
1
lcd_puts_P("TESTSTRING");

Bei Fragen nochmal fragen

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren