Forum: Mikrocontroller und Digitale Elektronik Double auf LCD?


von j3 (Gast)


Lesenswert?

Hallo Gemeinde,

ich bin ein Anfänger in Sachen MC programmiere aber schon seit einigen 
Jahren.

Mein Problem:

ich habe einen PIC 18f182550 mit einem 2x20 LCD Display C18 als Compiler 
mit mplap als Entwicklungsumgebung.

Ich versuche nun den Wert eines Temp. Fühlers auf dem LCD auszugeben
ich habe also einen double den ich gerne darstellen würde
ich habe schon mit mehreren abwandlungen von sprintf (zB 
sprintf(buf,"%6.3f",2.5);) versucht
und auch unzählige andere Funktionen die mir hier im Forum oder durch 
Google untergekommen sind.

Leider bekomme ich immer nur lustige pixel zu sehen ab und an auch ein 
@.
Langsam zweifle ich an meinem verstand.

Ich bitte um Hilfe!
von Timmo H. (masterfx)


Lesenswert?

Vermutlich machst du einen Fehler bei den Argumenten von sprintf (also 
keinen Pointer auf ein Char-Array angegeben, wäre so meine erste 
Vermutung)

Oder deine Display-Ansteuerung funktioniert noch nicht richig. Denn 
(s)printf liefert einfach nur ASCII-Zeichen, die dein Display auch so 
anzeigen kann wenn es denn richtig implementiert ist. Wenn also deine 
"lcd_puts" richtig funktioniert, dann wird wohl ersteres der Fehler 
sein.
von j3 (Gast)


Lesenswert?

danke für deine Antwort

also mein LCD zeigt mir ein char[] korrekt an sowohl wenn ich es in der 
firmware definierte als auch über usb gesendet

könntest du mir ein bsp für zb 23.48 oder so geben?

danke im voraus
von Sam .. (sam1994)


Lesenswert?

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

Etwas mehr Quelltext wäre da schon nützlich.
Wie gibst du den CHAR [] und den puffer aus ?
Wie ist BUF deklariert und definiert ?

Gruß
von Timmo H. (masterfx)


Lesenswert?

Wir wissen jetzt ja auch nicht was für einen µC du nun genau benutzt. 
Aber bei printf dingen mit Floating-Point Erweiterungen und 
Floating-Point allgemein auf µCs ohne FPU, muss man aufpassen, da dann 
alles in Software gemacht wird und der Code dann SEHR groß werden kann 
und ggf. dann nicht mehr in den meist relativ kleinen Flash-Speicher 
passt.
Hier ist dann Festkomma-Arithmetik das Zauberwort (siehe Post von 
Samuel)
von j3 (Gast)


Lesenswert?

nun bur ist einfach mit char buf[20]; (20 weil 20 zeichen pro lcd zeile) 
definiert
die ausgabe über lcd ist von spruts usb4all die ausgabe via usb basiert 
auf der microchip bsp anwendung für HID geräte incl bootloader

das alles zu posten ist etwas viel denk ich
falls nötig werd ich das aber gern
ich kann auch das ganze projekt zum downlaod zu verfügung stellen ich 
dachte nur ich würde einfach den wald vor lauter bäumen nicht sehen als 
dass das für einen mc erfahrenen coder mehr als ein lacher sein würde

danke für den link aber das umwandeln von ganzzahlen macht mir ebenso 
schwierigkeien mal ganz abgesehen dass ich die lektion der kommazahlen 
nicht auslassen kann ;)
von Mirko (Gast)


Lesenswert?

Nur interessehalber:
Von was für einem Termperaturfühler kommen deine Daten, dass du dafür 
Genauigkeit und Dynamik vom Double Datentyp brauchst?
von j3 (Gast)


Lesenswert?

von einem KTY 81-110
von Sam .. (sam1994)


Lesenswert?

j3 schrieb:
> nun bur ist einfach mit char buf[20]; (20 weil 20 zeichen pro lcd zeile)

Wenn sprintf 20 Zeichen schreiben soll schreibt es 21, da die 
abschließende 0 das Ende makiert.
von j3 (Gast)


Lesenswert?

eins muss ich jetzt mal sagen
ich habe noch kein forum erlebt dass so lebendig ist....

nun wie dem auch auch sei dann schriebt es eben 21 zeichen mit denen ich 
nichts anfangen kann ;)
von Purzel H. (hacky)


Lesenswert?

Falls den double ueberhaupt implementiert ist. Fuer normale Anwendungen 
sollte man mit Single durchkommen.

Ersten, schreib mal ein Programm, dass eine konstante anzeigen soll.

const double T = 1.2345
display(T);

Dann schieb diesen Double ueber die serielle schnittstelle und 
kontrolliere. Dann rechne die Temperatur, und schieb sie ueber die 
serielle Schnittstelle und kontrolliere. Dann zeig sie an.
von Sam .. (sam1994)


Lesenswert?

j3 schrieb:
> nun wie dem auch auch sei dann schriebt es eben 21 zeichen mit denen ich
> nichts anfangen kann ;)

Damit meine ich, dass es einen Überlauf gibt. Mit einem 20 Zeichen 
Buffer kannst du nur 19 Zeichen schreiben.
von j3 (Gast)


Lesenswert?

auch eine konstante kann ich am display nicht ausgeben
da ich sie ja so oder so durch die sprintf jagen muss da ich ein char[] 
benötige um es am display oder via usb ausgeben zu können
ein rs232 hab ich nicht getestet da 1. die usb verbindung funktioniert 
und 2. hab ich keinen seriellen port an meinem pc
von Sam .. (sam1994)


Lesenswert?

geht es mit float?
von DirkB (Gast)


Lesenswert?

Die ersten Googleergebnisse für "fließkomma c18 printf" deuten darauf 
hin, das printf vom C18 überhaupt kein double/float unterstützt.

Der erste Link: 
http://support2.microchip.com/KBSearch/KB_StdProb.aspx?ID=SQ6UJ9A003PQX
von Peter D. (peda)


Lesenswert?

j3 schrieb:
> ich habe einen PIC 18f182550 mit einem 2x20 LCD Display C18 als Compiler
> mit mplap als Entwicklungsumgebung.

Na dann stellen wir uns mal dumm und gucken einfach ins C18 Manual:

2.7.4 stdio.h Functions:
"The functions vsprintf, vprintf, sprintf, printf, fprintf and vfprintf 
do
not support floating-point conversion specifiers."

Frage beantwortet.

Hier eine Lösung:
Beitrag "Formatierte Zahlenausgabe in C"


Außerdem sollte man nur dann double nehmen, wenn man auch die 
Genauigkeit braucht.
Beim C18 ist zwar kein Unterschied zu float, aber ein anderer Compiler 
könnte dann unnötig großen Code erzeugen.


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