Forum: Compiler & IDEs kommazahlen auf LCD ausgeben


von Tom (Gast)


Lesenswert?

könnt ihr mir sagen, was an dem code falsch sein könnte? ich hab einen
atmeg8535 und auf dem LCD sehe ich nur ein "?". bitte umhilfe!

int main(void)
{
  lcd_init(LCD_DISP_ON);

  float zahl;
  char buffer[16];

  zahl = 3.96;

  sprintf(buffer, "%f", zahl);

  lcd_puts(buffer);

  for(;;);
}


danke,
tom

von Joerg Wunsch (Gast)


Lesenswert?

Du hast die Doku nicht gelesen. ;-)

Sonst wüßtest Du, was man für Gleitkomma-printf machen muß...  Die
aktuelle WinAVR-Version hatte übrigens gerade dahingehend einen Bug
im Makefile-Template, daß sie die Gleitkomma-Version immer
eingebunden hat. :-/  Braucht übrigens ziemlich viel ROM, ggf.
solltest Du stattdessen die Nutzung von dtostrf() in Erwägung
ziehen.  Wiederum, ach das kennst Du ja nun schon... siehe Doku. :)

von Tom (Gast)


Lesenswert?

mit dtostrf habich es auch scho probiert, jedoch werich aus er doku
nicht schlau und weiß nicht, wie ich das anwenden soll, mit den
parametern und so... kannst du mir ein kurzes beispiel geben?

danke schon mal

gruß,
tom

von Joerg Wunsch (Gast)


Lesenswert?

Was ist denn so unverständlich daran?  Konkrete Frage halt, solange
wir nicht wissen, was man daran nicht versteht, können wir das auch
nicht besser formulieren.

width und prec entsprechen den normalen Parametern aus printf().
Den Puffer mußt Du selbst allozieren und dafür Sorge tragen, daß
er groß genug ist, das Ergebnis aufzunehmen.  Das ist bei dtostrf()
der trickreiche Teil, Du mußt eben entweder sicherstellen, daß das
Ergebnis nicht gerade 1E38 ist und Du 39 Zeichen für die Darstellung
brauchst, oder Du mußt wirklich so viel Platz reservieren.

von Tom (Gast)


Lesenswert?

seh ich das richtig, dass das eigentlich so funktionierenm müsste:

#include <stdlib.h>
#include <lcd.h>

...

char buffer[16];
double i;

i = 13.7603;

dtostrf(i, 10, 3, buffer);

lcd_puts(buffer);

...


funktioniert das auch so und was bedeuten die parameter 10 und 3
eigentlich genau, und wie muss ich das einstellen, damnit ich zum
beispiel nur 2 nachkommastellen habe und so?

danke schon mal,
Tom

von Andreas Böhme (Gast)


Lesenswert?

Vielen Dank :-)

Bin gerade dabei, das in
http://www.linuxfocus.org/English/November2002/article251.shtml
beschriebene Digital-Netzteil zu bauen und habe mich schon gewundert,
dass die Grösse nicht stimmen kann. Im Map File konnte man sehen, dass
printf_flt eingebunden wurde.. Im Makefile wurde wirklich mit "LDFLAGS
+=  -Wl,-u,vfprintf -lprintf_flt" die Floating Point Version von
printf eingebunden. Nun ist die Größe von 16kb auf 3 kb geschrumpft
:-))

von Joerg Wunsch (Gast)


Lesenswert?

Nimm die neueste Version von WinAVR, dort ist das Beispiel-Makefile
wieder OK.

von Zoltan (Gast)


Lesenswert?

Nur nebenbei:
Ich habe aus platzmangel keinen float.. verwenden wollen. Kommastellen
kann man nämlich auch "hintrixen": Die darzustellende Zahl, z.B. 12,5
wird bei mir als 125 vom restlichen Programm vorgegeben. Nun Schreibe
ich die 125 auf das Display, und überschriebe sie nochmal, aber eine
Stelle früher beginnend: 125 Dann sieht es so aus: 1255. Nun noch eine
Komma an die 3. Stelle und fertig ist die 12,5 ;-).
Das Problem ist jetzt, dass bei mehr/weniger Ziffern die Komastelle
verrutscht, aber für meine Anwendung (Akku überwachen von 10..14V) ist
diese Lösung mehr als ausreichend.

1. 125__
2. 125____
3. 1255___
4. 12,5___


-Zoltan

von Udo Drees (Gast)


Lesenswert?

Hallo, bitte maile mir doch mal dein Programm zur LCD-Ausgabe.Bin
absoluter Neuling und muß demnächst ein Projekt mit dem AVR in C
fertigen. Vielleicht kannst Du mir Tipps geben wie ich an
Prgrammlistings"zum Analysieren und lernen" kommen kann. Alles ist
hilfreich. Wo bekommt man sonst noch Infos?

Danke im vorraus  udodrees@gmx.de

von Zoltan (Gast)


Lesenswert?

Hi Udo,
ich weiß jetzt nicht wen du mit "dein" meinst, aber das Progamm, dass
ich verwende ist von Peter Fleury (
http://www.mysunrise.ch/users/pfleury/avr-lcd44780.html ) Er erklärt
die Funktion auf seiner Seite auch sehr gut, du kannst aber auch unter
http://www.mikrocontroller.net/tutorial/lcd.htm schauen, ist aber in
Assembler.

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.