Forum: Compiler & IDEs Datenausgabe auf LCD-Display


von Fredi (Gast)


Lesenswert?

Hallo,
habe folgendes Problem:
Möchte Daten auf dem LCD-Display (4X16)ausgeben.
Integer und Text kein Problem, aber mit float, double und long
habe ich Probleme.
Im Programm selbst wird mit float gerechnet, aber die Ausgabe finkt.
nicht. Vermutlich liegt dies am Display.

Verwende den SDCC-Compiler und das Board von Dr.Rakers mit dem Infinion
C517A.



Source:
#include <float.h>
float f1;
chr   str1[16];
sprintf (str1,"xyz %3.2f",f1);
dstrout (0,str1);
Anzeige: <NO FLOAT>

Diese Nachricht kommt auch bei double. Bei long wird nichts angezeigt.
Formatstring natürlich angepasst bei verschiedenen Typen.
Habe gesucht ob es eine Routine zum konvertieren gibt (ftoa).

Vielen Dank
Gruß Fredi Nüßle

von Alex (Gast)


Lesenswert?

Gibt es dtostr (...) bzw. dtostrf (...)?

von Chris (Gast)


Lesenswert?

Such im Makefile mal nach PRINTF_LIB und ergänz die Zeile zu:

PRINTF_LIB = $(PRINTF_LIB_FLOAT)

Nur dann kennt printf Formatbefehle für Fließkommazahlen.

von Chris (Gast)


Lesenswert?

Argh, bitte meinen obigen Beitrag ignorieren. Hab gelesen dass du GCC
nimmst.

von Fredi (Gast)


Lesenswert?

Hallo,
habe nochmals bei SDCC nachgeschaut.
Leider gibt es noch keine Ausgabe-Routine für Float.
(z.B. ftoa, dtostr, dtostrf oder ähnliches).

Ich kann mir nur damit behelfen indem ich den Vor- Nachkommaanteil
in integer oder char ausgebe.

Hat jemand schon mal so etwas programmiert???

Wäre dankbar wenn mir da jemand helfen könnte, da ich noch Anfänger und
total auf mich alleine gestellt bin.

Gruß Fredi

von Alexander (Gast)


Lesenswert?

Wo ist das Problem?
Wenn du bspw. 2 Kommastellen haben willst, dann multipliziert die
float-Zahl mit 100. Dann fürst du bspw. itoa (...) aus. Bei der Ausgabe
fügst du einfach vor den letzten beiden Zeichen (Zahlen) ein Komma per
Software ein.

von Marco (Gast)


Lesenswert?

Versuche es mal so:

#include <stdlib.h>

void StringDisplay(char *str)  // Ausgabe von Zeichenketten
{
       while(*str!=0)          // solange String-Ende(0)
                                   noch nicht erreicht,
   {
   Befehl(*str);
   str++;                 }
   startwert=counter_buchstabe+startwert;
}

void FloatDisplay(double x,int vk, int nk)   //Ausgabe einer
                                                 Kommazahl über die
                                                 String-Ausgabe
{
  char buffer[20];
  StringDisplay(dtostrf(x, vk, nk, buffer));  // vk Vorkommastellen, nk
Nachkommastellen
}

Wenn Du nun die Funktion FloatDisplay aufrufst mit der Übergabe einer
Zahl oder Variablen sowie der Vor und Nachkommastellen
FloatDisplay(XYZ,VK,NK);
dann sollte das klappen...bei mir klappt es mit jedem Display.

Für Verbesserungsvorschläge bin ich natürlich zu haben :-)
Marco

von Marco (Gast)


Lesenswert?

Nachtrag:

die zeile:
startwert=counter_buchstabe+startwert;

muss raus... die gehört noch zu meiner Cursorpositionierung... die ja
hier keine Rolle Spielte :-)

von Fredi (Gast)


Lesenswert?

Danke
Alexander, Marco für eure Hilfe.

Marco deinen Vorschlag kann ich nicht nehmen da mir die Funktion
dtostrf vom sdcc.compiler nicht geboten wird. Trotzdem Danke.

Werde den Vorschlag von Alexander mal versuchen. Klingt sehr einfach.
Nur ist mir noch nicht klar wie ich die Berechnung in Float auf
eine bestimmte Anzahl von Nachkommastellen begrenzen kann.

Aber ich werde es versuchen, kann ja nur dabei lernen.
Werde mich da einlesen. Bestimmt ist es ganz einfach.

Gruß Fredi

von Marco (Gast)


Lesenswert?

Gern geschehen.

Die Funktion dtostrf ist doch meiner Meinung nach in der stdlib.h und
wenn man die einbindet sollte doch jeder Compiler das verstehen ???
Oder nicht?

Marco

von Fredi (Gast)


Lesenswert?

Hallo Marco,

habe ich auch immer gedacht. Aber in der stdlib.h vom SDCC ist
diese Funktion nicht enthalten.
Würde mir die ganze Sache viel einfacher machen.

***********************************
#ifndef __SDC51_STDLIB_H
#define __SDC51_STDLIB_H 1

#ifndef NULL
# define NULL (void *)0
#endif

#include <malloc.h>

extern float atof (char *);
extern int atoi (char *);
extern long atol (char *);

extern void _uitoa(unsigned int, char*, unsigned char);
extern void _itoa(unsigned int, char*, unsigned char);

extern void _ultoa(unsigned long, char*, unsigned char);
extern void _ltoa(unsigned long, char*, unsigned char);
#endif
*****************************************
Das ist alles was in der stdlib.h steht!!!


Fredi

von Peter D. (peda)


Lesenswert?


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.