www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Hex Werte in Float umrechen


Autor: Noob (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi ich habe ein Problem:
ich habe Hex-Werte z.B. Buffer1=0x3f, Buffer2=0x77, Buffer3=0xcb,
Buffer4=0x5e (0b00111111011101111100101101011110).Diese will ich nun in
Float ausgeben. Mathematisch habe ich verstanden wie ich es machen muss
mit Vorzeichen (0), Exponent(01111110) und
Mantisse(11101111100101101011110) aber in der C Umsetztung hapert es
noch.
Für meinen Microcontroller habe ich schon mehrere Versuche gestartet
aber keiner hat zum Erfolg geführt. Was nicht geht ist einfach Printf
und %f, wäre auch zu einfach das ganze.

Wie kann ich an dieses Problem rangehen das ich Erfolg habe?

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zitat: "Was nicht geht ist einfach Printf und %f, wäre auch zu einfach
das ganze."

Warum eigentlich ?

Möchtest Du die komplizierten Mathematikroutinen aus dem C-Compiler
bzw. dessen Libraries selbst neu erfinden ?
Oder muss in ASM programmiert werden ?
--> Dann sind trotzdem genau diese (aufwändigen) Routinen erforderlich.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du könntest beschreiben, wie die "Hex-Werte" Deiner Ansicht nach in
einen Float-Wert umgerechnet werden sollen. Es geht jetzt erst mal
nicht um die interne Floating-Point-Repräsentation, sondern darum,
welchen Float-Wert Du beispielsweise aus den vier von Dir genannten
Werten erzeugen möchtest.

Vorausgesetzt, daß sizeof (float) == 4 kannst Du natürlich mit 'ner
Union sehr wohl printf mit %f verwenden
union 
{
  unsigned char Buffer[4];
  float FloatWert;
} bla;

bla.Buffer[0] = 0x3f;
bla.Buffer[1] = 0x77;
bla.Buffer[2] = 0xcb;
bla.Buffer[3] = 0x5e;

printf("%f", bla.FloatWert);

Aber ob das das ist, was Du erzielen willst?

Autor: Noob (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also eigentlich möchte ich es so einfach wie möglich. ich habe mich an
dem Bsp aus Wikipedia (http://de.wikipedia.org/wiki/IEEE_754)
orientiert und den Code für mich so abgeändert:

unsigned char pis [] = { Buffer[1],Buffer[2],Buffer[3],Buffer[4] };
     float * p;
     p = (float *) pis;
     sprintf (astring,"%30.20f", *p);

es sollte: 0.9679469 rauskommen aber es kommt es nicht ich bekomme
"f" angezeigt wenn ich mir astring anzeigen lasse

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann hast du die falsche printf-Library eingebunden.
Durchsuch mal das Forum danach. Es gibt verschiedene
Varianten der printf-Library, je nachdem ob floating-
point benötigt wird oder nicht. Jörg hat mal was drüber
geschrieben.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das kann daran liegen, daß Du nicht mit der floatingpoint-Variante von
printf arbeitest. Aus Gründen der erzeugten Codegröße gibt es bei
Embedded-Compilern davon unterschiedliche Varianten; die
Floatingpoint-Unterstützung bläht das ganze recht heftig aus.

Bist Du Dir mit Deinem Formatstring sicher? Zwanzig(!)
Nachkommastellen? Bei einem 32-Bit-Float-Wert?

Bist Du Dir sicher, daß der erste "Hex-Wert" in Buffer[1] und nicht
in Buffer[0] liegt?

Autor: Noob (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Buffer [0] ist bei mir der Unit code mit dem ich bestimme was für ein
Wert da dargestellt wird ( Druck Temperatur oder was auch immer mir der
Sensor liefert)

Ok 20 Nachkommastellen ist wirklich etwas übertrieben, habe nicht
dadran gedacht es zu ändern als ich das Bsp. übernommen habe.

was heißt "daß Du nicht mit der floatingpoint-Variante von
printf arbeitest" Ich nutzt den Crossarm von Rowlley. wo kann ich
rausfinde ob der das unterstützt?

Eben um die Codegröße nicht aufzu blähnen habe ich mir gedacht es
sollte doch möglich sein die mathematisch relativ einfache umrechnung
auch so zu programmieren.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah, ich nahm an, daß Du, wie die meisten hier, mit gcc-avr unterwegs
bist.

Auszug aus der printf-Formatstring-Dokumentation von Crossworks:

   Some CrossWorks library variants do not support the ‘f’
   and ‘F’ conversion specifiers in order to reduce code
   and data space requirements;
   please ensure that you have selected the correct library
   in the Printf Floating Point Support property of the
   project if you use these conversion specifiers.


Das dürfte das Thema aufklären. Viel Erfolg!

Autor: Noob (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke an alle.
jetzt kommt wenigstens schon mal ne Floatzahl raus wenn auch noch nicht
die richtige aber ich denke den Programmfehler finde ich auch noch. Aber
erst morgend für heute reicht es

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.