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.
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
> 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.
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.
> 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.
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
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.
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 ;-)
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.
@ 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
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.
@ 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
> 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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.