Forum: Mikrocontroller und Digitale Elektronik Hex Werte in Float umrechen


von Noob (Gast)


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?

von Klaus (Gast)


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.

von Rufus Τ. F. (rufus) Benutzerseite


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
1
union 
2
{
3
  unsigned char Buffer[4];
4
  float FloatWert;
5
} bla;
6
7
bla.Buffer[0] = 0x3f;
8
bla.Buffer[1] = 0x77;
9
bla.Buffer[2] = 0xcb;
10
bla.Buffer[3] = 0x5e;
11
12
printf("%f", bla.FloatWert);

Aber ob das das ist, was Du erzielen willst?

von Noob (Gast)


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

von Karl H. (kbuchegg)


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.

von Rufus Τ. F. (rufus) Benutzerseite


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?

von Noob (Gast)


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.

von Rufus Τ. F. (rufus) Benutzerseite


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!

von Noob (Gast)


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

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.