Forum: Mikrocontroller und Digitale Elektronik String im Flash


von Tobias H. (Gast)


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

von Werner B. (Gast)


Lesenswert?


von Werner B. (Gast)


Lesenswert?

@ Tobias H.

nachdem du jetzt hoffentlich (nochmal) das Tutorial wegen PROGMEM durch 
hast:  Es geht doch (fast) so einfach. Nimm strcpy_P  :-)

von Tobias H. (Gast)


Lesenswert?

Hi

Ja, die Passage habe ich schon 3x oder sogar 4x durchgelesen.

Auf die Idee bin ich noch nicht gekommen - ich teste es sofort!

Ciao Tobias

von Tobias H. (Gast)


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?

von Werner B. (Gast)


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)

von Tobias H. (Gast)


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

von Ulrich (Gast)


Lesenswert?

Das war die Sache mit dem BKA ;-)

von Tobias H. (Gast)


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

von Ulrich (Gast)


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

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.