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


von Gast (Gast)


Lesenswert?

Hi Leute,

ich benutze zur Ausgabe einen LCD Display und benutze dazu eine library. 
Schreiben kann ich z.b. so etwas:
1
  zeile=0;
2
  spalte=0;
3
  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:
1
strcpy(registernames[0], "Configration\0");
2
  strcpy(registernames[1], "Cur. DC Off.\0");
3
  strcpy(registernames[2], "Cur. Gain\0");
4
  strcpy(registernames[3], "Voltage DC Off.\0");
5
  ...

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

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

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:
1
extern char registernames[40][17];

von Karl H. (kbuchegg)


Lesenswert?

Gast wrote:

Da passt was nicht zusammen

>
1
>   zeile=0;
2
>   spalte=0;
3
>   lcd_string(PSTR("Scheinleistung  "));
4
>

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:
>
>
1
> void lcd_stringr (char *s)                              // Display
2
> String
3
> {   while (*s)
4
>         lcd_writechar(*s++);
5
> }
6
>

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.

von Benedikt K. (benedikt)


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.

von Gast (Gast)


Lesenswert?

Huch, aja!

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

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??

von Karl H. (kbuchegg)


Lesenswert?


von Karl H. (kbuchegg)


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.

von Benedikt K. (benedikt)


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  "));

von Gast (Gast)


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...

von Karl H. (kbuchegg)


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_kann_ich_Zahlen_auf_LCD.2FUART_ausgeben.3F

von Gast (Gast)


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:
1
extern void lcd_init(void);         //Initialize LCD
2
3
extern void lcd_setadress(void);
4
extern void lcd_writechar(unsigned char byte);
5
extern void lcd_writebyte(unsigned char byte);
6
extern void lcd_writecom(unsigned char byte);
7
extern void lcd_string (const char *txt);
8
extern void lcd_stringr (char *txt);
9
10
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*

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.