Forum: Mikrocontroller und Digitale Elektronik Float handhaben


von Joachim .. (joachim_01)


Lesenswert?

Hi,
wie kann man am besten 3.14159 auf nem Display darstellen? Gibt's für n 
ATMega für Fließpunktzahlen was ähnliches wie itoa für int?
von Martin S. (drunkenmunky)


Lesenswert?

sprintf
von André A. (nummer5) Benutzerseite


Lesenswert?

Du könntest sprintf benutzen. Kostet aber alles (auch die 
Fließpunktzahlen) viel Speicherplatz.
Wenn du wenig Speicherplatz haben willst, dann rechne mit 
Festkommazahlen und schreib dir selber eine Ausgabefunktion. Beispiele 
findest du hier in den Artikeln und Tutorials
von Joachim .. (joachim_01)


Lesenswert?

Ich hab hier n 4x20 mit nem ollen HD44780. Wäre halt kuhl, wenn es schon 
so was wie printf() als Bibliotheksfunktion dafür geben würde. Hab 
gelesen, man kann mit fdev_open() umleiten... aber ob mir das 
weiterhilft?

Über das Problem sind schon andere gestolpert...
Beitrag "Float to String ATMega 16"
von Martin S. (drunkenmunky)


Lesenswert?

wo ist das problem mit sprintf die float in nen string zu wandeln und 
dann mit der entsprechenden Funktion auf dem LCD auszugeben?

Wenn es dich stört, dass es zwei Funktionsaufrufe sind, pack es halt in 
eine neue Funktion und taufe sie printf.
von Joachim .. (joachim_01)


Lesenswert?

Denkblockade... ich probier sprintf gleich mal aus.

Danke.
von Simon H. (simi)


Lesenswert?

Mal ganz nebenbei: Um 3.14159 darzustellen/zu verarbeiten, musst Du 
nicht unbedingt float verwenden! Da tut's ein integer genau so gut! 
Nein, genausogut nicht, anders (nicht immer schlechter). Aber sehr oft 
genügend gut.

Es ist ein seeeeeeeehr verbreiteter Irrglaube, dass alles, was einen 
Punkt hat, floating point sein soll.

Es heisst ja nicht umsonst "floating point" und "fixed point", und nicht 
"a point" und "no point". ;-)

Oh, mann, wer lesen kann.... das wurde ja schon vorgeschlagen. SORRY! 
:-)
von Roland H. (batchman)


Lesenswert?

So: π

Unicode 1d6d1, spart am meisten Platz und ist dabei sehr genau :-)
von Joachim .. (joachim_01)


Lesenswert?

>Unicode 1d6d1, spart am meisten Platz und ist dabei sehr genau :-)
Nett.


Nun noch mal zu meinem Problem:

  int inum = 3;
  double dnum = 3.14159;

  sprintf (Buffer,"int: %d", inum);
  lcd_goto(0,0);
  lcd_print (Buffer);

  sprintf (Buffer,"float: %f2.2", dnum);
  lcd_goto(0,1);
  lcd_print (Buffer);

liefert auf dem Hd44780 Display:
int: 3
float: ?2.2

float wird nicht richtig als float erkannt.
von Martin S. (drunkenmunky)


Lesenswert?

Joachim ... schrieb:
> sprintf (Buffer,"float: %f2.2", dnum);

probier mal:
sprintf (Buffer,"float: %2.2f", dnum);
von Tip (Gast)


Lesenswert?

Joachim ... schrieb:
> wie kann man am besten 3.14159 auf nem Display darstellen? Gibt's für n
> ATMega für Fließpunktzahlen was ähnliches wie itoa für int?

Gib es als string "3.14159" aus. Das ist am schnellsten. Was willst du 
da mit Fließkommazahlen?
von Martin S. (drunkenmunky)


Lesenswert?

wahrscheinlich um ein Ergebnis auszugeben. Ist doch auch erst mal ok. 
Jeder hat mal angefangen.

Wenn er das hat, kann er sich immernoch Gedanken machen, wie er es 
besser machen kann.
von Joachim .. (joachim_01)


Lesenswert?

>wahrscheinlich um ein Ergebnis auszugeben.
Das ist der nächste Schritt.


>sprintf (Buffer,"float: %2.2f", dnum);
hat nix gebracht.
von (prx) A. K. (prx)


Lesenswert?

Joachim ... schrieb:

>>sprintf (Buffer,"float: %2.2f", dnum);
> hat nix gebracht.

Alle Vorkommastellen, zwei Nachkommastellen und einen Dezimalpunkt in 
insgesamt 2 Zeichen unterzubringen ist auch etwas schwierig.
von Joachim .. (joachim_01)


Lesenswert?

>Gib es als string "3.14159" aus.

Problem ist nicht das ausgeben sondern das reinstecken - in sprintf, 
nämlich weil sprintf sich bei der "Ausgabe" sich nicht so verhält wie 
ich es erwarte.
von Vlad T. (vlad_tepesch)


Lesenswert?

Joachim ... schrieb:
> Problem ist nicht das ausgeben sondern das reinstecken - in sprintf,
> nämlich weil sprintf sich bei der "Ausgabe" sich nicht so verhält wie
> ich es erwarte.

mann musste für (s)printf erst die floating point funktionalität extra 
aktivieren. stand, glaub ich, irgendwo in den artikeln drin, wie es 
geht.
hat man das getan, fällt man erst mal vom Hocker, wenn man nach einem 
build auf die Programmgröße schaut.
von Martin S. (drunkenmunky)


Lesenswert?

von Joachim .. (joachim_01)


Lesenswert?

>mann musste für (s)printf erst die floating point funktionalität extra
aktivieren.
Yep, das isses!
Für WINAVR hat Karl Heinz Buchegger bereits eine Anleitung erstellt, muß 
mal schauen ob ich das für AVRStudio 5 auch hinbekomme.

Danke allen Beteiligten.
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Joachim ... schrieb:
> Gibt's für n ATMega für Fließpunktzahlen was
> ähnliches wie itoa für int?

Ja. dtostrf
von Joachim .. (joachim_01)


Lesenswert?

Wie gesagt, das Prob war das aktivieren der Fließpunktfunktion von 
sprintf die defaultmäßig nicht eingeschaltet ist. Die Funktion genehmigt 
sich nämlich fast 2kB. Aber wir haben's ja...

Für den nächsten der über das gleiche Prob stolpert - hier gibt's die 
Lösung:
Beitrag "Re: AVR Studio 5, sprintf, float und linken?"
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.