Forum: Compiler & IDEs Float nach Int / Ascii


von Patrick L. (crashdemon)


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.

von Aike T. (biertrinker)


Lesenswert?

Wenn du die Nachkommastellen nicht brauchst, dann kannst du ja einfach 
zuweisen:

float f=10.42;
uint8_t i;

i=f;

Willst du mit Nachkommastellen ausgeben guck doch mal hier im Tutorial 
nach "dtostrf"

viele Grüße

Biertrinker

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von Patrick L. (crashdemon)


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.

von Aike T. (biertrinker)


Lesenswert?

> 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.

von Patrick L. (crashdemon)


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

von Stefan E. (sternst)


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.

von Aike T. (biertrinker)


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 ;-)

von Stefan E. (sternst)


Lesenswert?

Aike Terjung wrote:

>> 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 ;-)

Das wollte ich damit ausdrücken.

von Falk B. (falk)


Lesenswert?

@ 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

von Patrick L. (crashdemon)


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.

von Falk B. (falk)


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

von Patrick L. (crashdemon)


Lesenswert?

> 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

Habe anscheinden noch einige Verständnis Problem

von Aike T. (biertrinker)


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.

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.