www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LCD Display, komische Ausgabe.


Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Leute,

ich benutze zur Ausgabe einen LCD Display und benutze dazu eine library. 
Schreiben kann ich z.b. so etwas:
  zeile=0;
  spalte=0;
  lcd_string(PSTR("Scheinleistung  "));

Mein Problem ist jetzt folgendes:
Ich möchte in einem Array verschiedene Namen abspeichern und diese dann 
gegebenenfalls auf dem Display Anzeigen. Das ganze sieht so aus:
strcpy(registernames[0], "Configration\0");
  strcpy(registernames[1], "Cur. DC Off.\0");
  strcpy(registernames[2], "Cur. Gain\0");
  strcpy(registernames[3], "Voltage DC Off.\0");
  ...

Wenn ich jetzt die Funktion so Aufrufe:
  zeile=0;
  spalte=0;
  lcd_string(registernames[0]);
dann bekomme ich irgend einen Mist auf dem Diplay.

Die Funktion lcd_string schaut so aus:
void lcd_stringr (char *s)                              // Display String
{   while (*s) 
        lcd_writechar(*s++);
}

Wie man sieht will diese Funktionen einen Pointer haben. und genau 
diesem gebe ich ihm ja oder?

übrigens die definition von registernames schaut so aus:
extern char registernames[40][17];

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gast wrote:

Da passt was nicht zusammen

>
>   zeile=0;
>   spalte=0;
>   lcd_string(PSTR("Scheinleistung  "));
> 

laut dieser Verwendung ist lcd_string so geschrieben, dass es sich den 
Text aus dem Flash Memory holt.

> Die Funktion lcd_string schaut so aus:
>
>
> void lcd_stringr (char *s)                              // Display
> String
> {   while (*s)
>         lcd_writechar(*s++);
> }
> 

laut deiner Funktion ist dem aber nicht so.
Eines der beiden muss daher falsch sein. Deine Ausgabe von weiter oben 
kann nicht funktionieren.

Bitte poste kompletten, compililerbaren Code

> Wie man sieht will diese Funktionen einen Pointer haben. und genau
> diesem gebe ich ihm ja oder?

Im Prinzip: ja

Aber: Deine Funktion um einen String aus dem Flash auszugeben, heisst 
anscheinend lcd_string. Die Funktion um aus dem SRAM auszugeben 
anscheinend lcd_stringr (man beachte das kleine r am Ende).
Halte dich bitte an die Konventionen, dass eine Funktion, die ein 
Argument aus dem Flash holt, ein kleines _p am Funktionsnamensende hat.

Dann hast du eine Funktion
    lcd_string_p
und eine Funktion
    lcd_string

und verwendest sie so
    lcd_string_p( PSTR("Scheinleistung  ") );

bzw.
    lcd_string( registernames[0] );

und so blödsinnige Verwechslungen passieren nicht mehr so oft.

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die gepostete Funktion ist die falsche:
Die heißt lcd_stringr, die verwendete lcd_string.

PS: Kann es sein, dass die Routinen ursprünglich von mir sind?

Falls ja, dann gibt es in der 44780.h ein Makro dass das PSTR 
automatisch einbaut, wenn man lcd_stringP() verwendet.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Huch, aja!

richtige Funktion ist:
void lcd_string (const char *progmem_s)                 // Display String from flash
{   unsigned char c;
    while ((c = pgm_read_byte(progmem_s++)))
        lcd_writechar(c);
}

Und ja, beim Author steht Benedikt :) Ich habe die Bibliothek von einem 
Klassenkollegen bekommen, wusste gar nicht, dass der Author auch hier 
ist ;)

Wenn ich es jetzt ausgeben möchte mit der Funktion lcd_stringr 
funktioniert alles.
Kann mir trotzdem jemand kurz erklären wie das mit lcd_string 
funktioniert und was es mit der funktion PSTR() auf sich hat??

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger wrote:

> Halte dich bitte an die Konventionen, dass eine Funktion, die ein
> Argument aus dem Flash holt, ein kleines _p am Funktionsnamensende hat.

Hab mich vertan.
Die Konvention lautet, dass der Funktionsname mit _P endet, so wie das 
auch im Tutorial gezeigt ist.

Bitte haltet euch auch an solche Konventionen. Damit wird das Leben für 
alle leichter und es tut niemandem weh eine Konvention einfach mal zu 
übernehmen.

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
lcd_string gibt einen Text aus dem Flash aus, lcd_stringr einen Text aus 
dem RAM.
Ohne irgendwelche zusätzlichen Anweisen landen die Texte im RAM. PSTR 
sorgt dafür, dass der Text in den Flash kommt, daher muss dann 
lcd_string verwendet werden.

Schau mal in die hd44780.h, da müsste es ein define geben, sowas wie 
hier:
#define lcd_string_P(__s)       lcd_string(P(__s))

#ifndef P
#define P(s) ({static const char c[] _attribute_ ((progmem)) = s;c;})
#endif

lcd_string_P("Scheinleistung  "); funktioniert daher auch, und ist das 
gleiche wie lcd_string(PSTR("Scheinleistung  "));

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok danke.

Übrigens wollte ich mich beim Author der Bibliothek nocheinmal bedanken, 
du hast mir wirklich damit arbeit abgenommen, danke!

Eine, vielleicht etwas blöde, Frage habe ich noch:
Ich habe in einer integer Variable Errorcodes abgespeichert und die 
möchte ich auch ausgeben => Ich muss die Integerwerte in einen String 
umwandeln. sprich aus integer 13 dezimal, soll der String "13" werden. 
Wie heißt den die Funktion dafür (falls es die überhaupt gibt...) Bitte 
keine verweiße auf C Bücher, hab gerade keines zur Hand...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gast wrote:
> Ok danke.
>
> Übrigens wollte ich mich beim Author der Bibliothek nocheinmal bedanken,
> du hast mir wirklich damit arbeit abgenommen, danke!
>
> Eine, vielleicht etwas blöde, Frage habe ich noch:
> Ich habe in einer integer Variable Errorcodes abgespeichert und die
> möchte ich auch ausgeben => Ich muss die Integerwerte in einen String
> umwandeln. sprich aus integer 13 dezimal, soll der String "13" werden.
> Wie heißt den die Funktion dafür (falls es die überhaupt gibt...) Bitte
> keine verweiße auf C Bücher, hab gerade keines zur Hand...

itoa

http://www.mikrocontroller.net/articles/FAQ#Wie_ka...

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In der Datei "hd44780.h" gibt es soetwas bei mir nicht oO Vielleicht 
habe ich eine etwas ältere Version. So sieht der Inhalt aus:
extern void lcd_init(void);         //Initialize LCD

extern void lcd_setadress(void);
extern void lcd_writechar(unsigned char byte);
extern void lcd_writebyte(unsigned char byte);
extern void lcd_writecom(unsigned char byte);
extern void lcd_string (const char *txt);
extern void lcd_stringr (char *txt);

extern unsigned char zeile, spalte;

Aber lcd_stringr funktioniert auch einwandfrei, also danke. Jetzt 
bräuchte ich nur noch die Umwandlung von int to char*

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.