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
voidlcd_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:
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
>voidlcd_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.
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.
voidlcd_string(constchar*progmem_s)// Display String from flash
2
{unsignedcharc;
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??
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.
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 "));
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...
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