mikrocontroller.net

Forum: Compiler & IDEs Float nach Int / Ascii


Autor: Patrick L. (crashdemon)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Aike T. (biertrinker)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Patrick L. (crashdemon)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Aike T. (biertrinker)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Patrick L. (crashdemon)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Aike T. (biertrinker)
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Patrick L. (crashdemon)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Patrick L. (crashdemon)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Aike T. (biertrinker)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.