Forum: Mikrocontroller und Digitale Elektronik Kommabinärzahl in lesbares umrechnen


von Mike (Gast)


Lesenswert?

Ich möchte die Binärausgabe eines MAX31855 auswerten. Das ist ein ein 
AuswerteIC für ein Typ K Thermoelement.

Das Datenblatt sagt, dass Bit D31 Bis D18 die Temperatudaten enthält 
wobei D31 das Vorzeichen ist und Bit D18 und D17 die beiden 
Nachkommestellen.

Ich frage micht nun wie ich mit einer Kommabinärzahl in C umgehen soll. 
Normalerweise deklairiere ich sie einfach als signed und gut ist. Wie 
kann ich das aber bei der Kommabinärzahl machen? Wie rechne ich sie am 
einfachsten in was lesbares um?

Vielen Dank im Voraus.

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

printf( "%d,%d", vorkomma, nachkomma);

von R2_10k (Gast)


Lesenswert?

printf( "%d,%02d", vorkomma, nachkomma*25);

Nachkommastelle:
00b = 0.00
01b = 0.25
10b = 0.50
11b = 0.75

Du kannst natürlich auch eine 14 Bit zahl raus machen, alles mit 25 
Multiplizieren und hast dann die Temperatur in 0.01°C Einheiten.

3700 ist dann 37°C

Wie hättest Du es denn gerne?

von Mike (Gast)


Lesenswert?

Ok, meine Frage ist nun teils beantwortet.

Ich habe einen Wert:
sagen wir mal    11011,11

Mit dem Teil vor dem Komma geht der compiler ja wie gewohnt vor. Die 
erste 1 von rechts ist 2⁰ die zweite 2¹ usw. Aber ich weiss nicht wie 
ich dem Compiler sagen soll dass er die stellen hinter dem Komma eben 
anders gewichten soll. dann ist ja die erste Stelle nach dem Komma 2⁻¹ , 
zweite 2⁻² usw. Da hängt es eigentlich.

von Bastler (Gast)


Lesenswert?

Du hast 2Bit, also 1/2 und 1/4. 0..3 * 25/100 ergibt dein Ergebnis. Und 
die 100 stecken in den 2 Stellen hinterm Komma beim printf().
Klarer?

von Max H. (hartl192)


Lesenswert?


von R2_10k (Gast)


Lesenswert?

Wenn Du mit float arbeiten willst:

float f;
int vorkommastelle = 0b11011;
int nachkommastelle = 0b11;

f = vorkommastelle + float(nachkommastelle) / 4;

von Max H. (hartl192)


Lesenswert?

Mike schrieb:
> Aber ich weiss nicht wie
> ich dem Compiler sagen soll dass er die stellen hinter dem Komma eben
> anders gewichten soll. dann ist ja die erste Stelle nach dem Komma 2⁻¹ ,
> zweite 2⁻² usw. Da hängt es eigentlich.
Dem Kompiler ist das egal, da der uC mit ganzen und Festkommazahlen 
gleich rechnet. Nur die funktion zur Ausgabe muss sie als Festkommazahl 
interpretieren.

von Mike (Gast)


Lesenswert?

Ich steh voll auf dem Schlauch.
Kann mir jemand Schritt für Schritt aufschreiben wie ich 11011,11 ins 
lesbare umrechne.MSB sei das Vorzeichen.


Im Datenblatt steht als Beispeil:

0000 0110 0100 11    entspricht   +100,25 °C
1111 1111 1111 00    entspricht   -1,0 °C
1111 1111 1111 11    entspricht   -0,25 °C

wie komme ich dort hin ?

von Bastler (Gast)


Lesenswert?

Da steht:

0000 0110 0100 11    entspricht   +100,75 °C
1111 1111 1111 00    entspricht   -1,0 °C
1111 1111 1111 11    entspricht   -0,25 °C

Weil die ganze Zahl im 2er-Komplement vorliegt, mußt du bei negativem 
Vorzeichen die 2 Nachkomma-Bits negieren.
11 -> 01. D.h. 0,25. Alles passt!

von Max H. (hartl192)


Lesenswert?

Mike schrieb:
> Im Datenblatt steht als Beispeil:
>
> 0000 0110 0100 11    entspricht   +100,25 °C
> 1111 1111 1111 00    entspricht   -1,0 °C
> 1111 1111 1111 11    entspricht   -0,25 °C

Das erste sollte aber 100.75°C sein?

Wenn du die Zahl*100/4 rechnest, hast du die Temperatur in Zentigrad,
z.B. 0000 0110 0100 11 = 403
     403*100=40300
     4030/4=10075

Für die negativen Temperaturen sieh dir mal das Zweierkomplement an.

: Bearbeitet durch User
von Mike (Gast)


Lesenswert?

Ok, vielen Danke euch.

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.