Forum: Mikrocontroller und Digitale Elektronik Umrechnung von Zahlen


von Maxxe (Gast)


Lesenswert?

Hallo Freunde,
ich bekomme von einem Sensor 4 Byte á 8 Bit, also insgesammt 32 Bit 
ausgebenen.


zB.
(Binär  ) 01000011000100010000011010101111   (Dezimal) 65 232 7 66
(Float  ) 145,0261

Wie die Umrechnung auf einem Blatt Papier funktioniert weiß ich, 
allerdings möchte ich das in einem C Programm machen lassen.
Hat einer von euch einen Algorithmus der ein Array mit 4 Intzahlen an 
eine Funktion übergibt und einen Float als Rückgabewert zurück bekommt?
Oder kann man das ganze einfacher lösen??


Das ganze bräucht ich dann noch für eine 16Bit zweier Komplimentzahl aus 
zwei 8Bit Integern ;)

Danke im Vorraus
Maxxe

von Peter II (Gast)


Lesenswert?

Maxxe schrieb:
> Wie die Umrechnung auf einem Blatt Papier funktioniert weiß ich,
> allerdings möchte ich das in einem C Programm machen lassen.

dann kläre uns erst mal darüber auf wie das geht, denn eigentlich kann 
man das nicht umrechnen.

kann es sein das die 4byte schon float sind? Dann kann man sie einfach 
in ein float kopieren
1
uint8_t data[4];
2
float f;
3
4
memcpy( &f, data, sizeof(float) );

von Karol B. (johnpatcher)


Lesenswert?

Maxxe schrieb:
> Wie die Umrechnung auf einem Blatt Papier funktioniert weiß ich,
> allerdings möchte ich das in einem C Programm machen lassen.

Dann weißt du auch, dass sich der Standard IEEE 754 dahinter versteckt. 
Unter diesem Stichwort findest du mit einer Suchmaschine deiner Wahl 
auch genug Beispiele und Referenzimplementierungen. Von welcher 
Plattform sprechen wir hier eigentlich? Gibt es eine FPU, oder möchtest 
du die Fließzahlen wirklich in Software abhandeln?

Maxxe schrieb:
> Das ganze bräucht ich dann noch für eine 16Bit zweier Komplimentzahl aus
> zwei 8Bit Integern ;)

Diese Anfrage verstehe ich leider nicht. Was genau hat das 
Zweierkomplement jetzt mit o.g. Fließkommazahlen zu tun? Was hat es mit 
den 8 Bit Integern auf sich?

Mit freundlichen Grüßen,
Karol Babioch

von Maxxe (Gast)


Lesenswert?

Peter II schrieb:
> Maxxe schrieb:
>> Wie die Umrechnung auf einem Blatt Papier funktioniert weiß ich,
>> allerdings möchte ich das in einem C Programm machen lassen.
>
> dann kläre uns erst mal darüber auf wie das geht, denn eigentlich kann
> man das nicht umrechnen.


http://de.wikipedia.org/wiki/IEEE_754
Habs nachgerechnet.. Das passt soweit.

Peter II schrieb:
> kann es sein das die 4byte schon float sind? Dann kann man sie einfach
> in ein float kopieren
> uint8_t data[4];
> float f;
>
> memcpy( &f, data, sizeof(float) );

Die 4 Byte sind uint8_t. Aber mit deiner memcpy Methode Funktion scheint 
es nicht zu funktionieren :(

Karol Babioch schrieb:
> Maxxe schrieb:
>> Das ganze bräucht ich dann noch für eine 16Bit zweier Komplimentzahl aus
>> zwei 8Bit Integern ;)
>
> Diese Anfrage verstehe ich leider nicht. Was genau hat das
> Zweierkomplement jetzt mit o.g. Fließkommazahlen zu tun? Was hat es mit
> den 8 Bit Integern auf sich?

Das hat auch nichts mit einander zu tun.
Das sind zwei verschiedene Probleme.

Ich möchte aus 4 uint8_t Byte einen float machen.
Und des weiteren aus 2 uint8_t ein 16Bit zweier Komplimentzahl.

von Peter II (Gast)


Lesenswert?

Maxxe schrieb:
> Die 4 Byte sind uint8_t. Aber mit deiner memcpy Methode Funktion scheint
> es nicht zu funktionieren :(

wenn die 4byte float sind muss es klappen, da muss nichts gerechnet 
werden. Eventuell Reihenfolge tauschen.

von Karol B. (johnpatcher)


Lesenswert?

Maxxe schrieb:
> Aber mit deiner memcpy Methode Funktion scheint
> es nicht zu funktionieren :(

Was heißt "scheint nicht zu funktionieren"? Hast du die Reihenfolge der 
einzelnen Bytes beachtet (Little Endian vs Big Endian)?

Maxxe schrieb:
> Und des weiteren aus 2 uint8_t ein 16Bit zweier Komplimentzahl.

Das lässt sich zwar prinzipiell alles mit ein paar Bitoperationen 
hinbiegen (Bytes in eine uint16_t Variable schreiben, dabei 
höherwertiges Byte um 8 nach links shiften. Anschließend mit dem ~ 
(Tilde) Operator alle Bits invertieren, und anschließend noch 1 
hinzuadieren), mich würde es aber wundern, wenn dein Problem dies 
tatsächlich erfordert. Vielleicht gehst du das Ganze nur falsch an? Was 
genau hast du denn vor?

Mit freundlichen Grüßen,
Karol Babioch

von Maxxe (Gast)


Lesenswert?

Karol Babioch schrieb:
> Maxxe schrieb:
>> Aber mit deiner memcpy Methode Funktion scheint
>> es nicht zu funktionieren :(
>
> Was heißt "scheint nicht zu funktionieren"? Hast du die Reihenfolge der
> einzelnen Bytes beachtet (Little Endian vs Big Endian)?

Genau das war mein Fehler wie ich grad bemerkt hab xD
Klappt also doch ;)

Sahne Typen seid Ihr !!
Die kleine Funktion memcpy hat mir nen Haufen Arbeit erspaart ;)

Nun muss ich mal nen bissl rumzaubern das ich nun noch auf meine 
Zweierkomplimentzahl komme ;))
Aber das sollte doch dann auch mit der memcopy gehn oder nicht? xDD

von Karol B. (johnpatcher)


Lesenswert?

Maxxe schrieb:
> Nun muss ich mal nen bissl rumzaubern das ich nun noch auf meine
> Zweierkomplimentzahl komme ;))
> Aber das sollte doch dann auch mit der memcopy gehn oder nicht? xDD

Nein, da sind o.g. Bitmanipulationen (bzw. eine Addition) sinnvoller.

Ungetestet:
1
uint16_t convert(uint8_t a, uint8_t b)
2
{
3
4
    return (~((a << 8) | b) + 1);
5
6
}

Die Frage ist aber nach wie vor: Warum brauchst du solche Low-Level 
Operationen? Ich könnte mir gut vorstellen, dass du dich hier verrennst 
und die falschen Probleme zu lösen versuchst.

Mit freundlichen Grüßen,
Karol Babioch

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.