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