mikrocontroller.net

Forum: Compiler & IDEs Datenausgabe auf LCD-Display


Autor: Fredi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gibt es dtostr (...) bzw. dtostrf (...)?

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Argh, bitte meinen obigen Beitrag ignorieren. Hab gelesen dass du GCC
nimmst.

Autor: Fredi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alexander (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag:

die zeile:
startwert=counter_buchstabe+startwert;

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

Autor: Fredi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marco (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Fredi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.