Float nach Int / Ascii

#992896
Lesenswert?

Hallo,

will meine Messwerte (float) per UART ausgeben, allerdings kommt die 
benutzung von sprintf() für mich nicht in frage, da diese Funktion nicht 
gerade Resourcenschonend ist und den Flashspeicher meines Atmega8 
überschreiten würde.

Habe schon viele beiträge dazum im Forum gelesen wobei nirgends eine 
konkrete Antwort / bzw. eine  eigene Funktion abgebildet war mit der ich 
das bewerkstelligen kann.

Frage hat jemand eine Funktion geschrieben mit der man float nach ascii 
oder int umwandeln kann, wenn ja dann wäre es nett wenn er mir diese 
zukommen lassen könnte.

Ein funktion die float nach int umwandelt würde auch in frage kommen, da 
ich dann mittels itoa, in ascci umwandeln könnte, was deutlich weniger 
speicher als die sprintf funktion schlucken würde.
Moderator (Firma: Titel) Persönliche Seite #992916
Lesenswert?

> meine Messwerte (float) per UART ausgeben
Machst du da nicht schon einen prinzipiellen Fehler?
Welcher Sensor oder AD-Wandler liefert dir floats als Messwert?

Schon allein, dass du float im Programm verwendest, deutet auf einen
> nicht gerade Resourcenschonend
-en Programmierstil hin. Da bringt printf() das Fass dann nur noch zum 
Überlaufen. Voll wars vorher schon.

Überleg doch mal, ob du nicht Festkommaarithmetik einsetzen kannst.
Siehe http://www.mikrocontroller.net/articles/Festkommaarithmetik
Und die Ausgabe dann mit itoa() machst.
#992928
Lesenswert?

Lothar Miller wrote:
>> meine Messwerte (float) per UART ausgeben
> Machst du da nicht schon einen prinzipiellen Fehler?
> Welcher Sensor oder AD-Wandler liefert dir floats als Messwert?
>
> Schon allein, dass du float im Programm verwendest, deutet auf einen
>> nicht gerade Resourcenschonend
> -en Programmierstil hin. Da bringt printf() das Fass dann nur noch zum
> Überlaufen. Voll wars vorher schon.
>
> Überleg doch mal, ob du nicht Festkommaarithmetik einsetzen kannst.
> Siehe http://www.mikrocontroller.net/articles/Festkommaarithmetik
> Und die Ausgabe dann mit itoa() machst.

Ja im Prinzip hast du recht der Sensor liefert mir kein float, sonder 
int allerdings wird durch die berechnung, die mit dem Messwert gemacht 
werden, ein Wert den ich nur als float ausdrücken kann, wenn ich jetzt 
z.B. einen Beschleunigungssensor habe der mir sagen wir mal die 
beschleunigung anhand desen stellung anzeigen soll, sind für mich werte 
wie 1g unzureichend, schöner wäre es wenn ich dann z.B 0,67g per UART 
ausgeben könnte.

Denn Artikel mit der Festkommaarithmetik habe ich mir bereicts 
durchgelesen, wenn ich das richtig verstanden habe, werden dann aus 
floats (6,55), int's gemacht indem das komma verschoben wird z.B. (float 
(6,55) * 100) = int (655)
damit hätte ich dann den nachteil das ich wenn ich die werte per UART 
übertrage, diese zurückrechnen müsste, um auf meinen float zu kommen.
#992948
Lesenswert?

Aike Terjung wrote:
>> damit hätte ich dann den nachteil das ich wenn ich die werte per UART
>> übertrage, diese zurückrechnen müsste, um auf meinen float zu kommen.
>
> Dann bastel dir doch eine Funktion die in den String zwei stellen vor
> Ende ein Kommen einfügt.

will aber die messwerte per hyperterm auswerten, eine spezielle app. zu 
schreiben die die wert einließt und dann das komma korrigiert fände ich 
zu umständlich
#992949
Lesenswert?

Patrick Langosch wrote:

> damit hätte ich dann den nachteil das ich wenn ich die werte per UART
> übertrage, diese zurückrechnen müsste, um auf meinen float zu kommen.

Ja, da ist dann ein echt tierischer Aufwand nötig. Ein "/" für den 
Ganzzahlanteil, und ein "%" für den Nachkommaanteil.
#992971
Lesenswert?

Stefan Ernst wrote:
> Patrick Langosch wrote:
>
>> damit hätte ich dann den nachteil das ich wenn ich die werte per UART
>> übertrage, diese zurückrechnen müsste, um auf meinen float zu kommen.
>
> Ja, da ist dann ein echt tierischer Aufwand nötig. Ein "/" für den
> Ganzzahlanteil, und ein "%" für den Nachkommaanteil.

Wohl deutlich weniger aufwändig als der Aufwand für Floats ;-)
#993088
Lesenswert?

Falk Brunner wrote:
> @ Patrick Langosch (crashdemon)
>
>>will aber die messwerte per hyperterm auswerten, eine spezielle app. zu
>>schreiben die die wert einließt und dann das komma korrigiert fände ich
>>zu umständlich
>
> Im AVR, nicht im PC!
>
> MFg
> Falk

ja das ist mir klar, das man die dezimalstelle im avr korrigiert, 
allerdings wird dann doch die ganzzahl übertragen.
#993093
Lesenswert?

@  Patrick Langosch (crashdemon)

>ja das ist mir klar, das man die dezimalstelle im avr korrigiert,
>allerdings wird dann doch die ganzzahl übertragen.

???

Wenn ich 655 als Integer habe und weiss, dass es eigentlich 6,55 ist, 
dann übertrage ich

6,55

Wo ist das Problem?

MFG
Falk
#993115
Lesenswert?

ganz einfach, du teilst als erstes den Wert durch 100, dann erhälst du 
den Ganzzahlanteil, anschließend lässt du dir mit Modulo (%) den Rest 
der ganzzahligen Division zurückgeben:

uint16_t a=655,b,c;

b=a/100; // b ist dann gleich 6
c=a%100; // c= 55

jetzt hast du den Teil der vor das Komma gehört und den Teil der hinter 
das Komma gehort, das kannst du jetzt mit itoa in einen String packen 
und über den UART raushauen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren