LCD Display, komische Ausgabe.

Gast #1223276
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];
#1223283
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.
Gast #1223294
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??
#1223308
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.
#1223309
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  "));
Gast #1223310
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...
#1223312
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
Gast #1223313
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*

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