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.
Eine eigene Frage?
Dieser Thread ist über 18 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.