mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik String im Flash


Autor: Tobias H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So einfach strcpy nehmen ist nicht :-(

Wie... siehe
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Tobias H.

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

Autor: Tobias H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tobias H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Tobias H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das war die Sache mit dem BKA ;-)

Autor: Tobias H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Folgendes gibts in der LCD-Routine von Fleury:

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

    while ( (c = pgm_read_byte(progmem_s++)) ) {
        lcd_putc(c);
    }

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

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

Bei Fragen nochmal fragen

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.