DS18B20: Hintergrund Format bei negativen Temperaturen

Gast #4288788
Lesenswert?

Hallo Zusammen,

der digitale Thermometer-IC Maxim DS18B20 stellt negative Temperaturen 
im "two’s complement" - Format dar. Es werden daher zusätzliche 
Verarbeitungsschritte (bitweise Invertierung und eine Addition von 1) 
nötig. Positive Werte hingegen können "direkt" ausgelesen werden.

Was ist der Hintergrund einer solchen Darstellung negativer Zahlen, 
warum (bzw. in welchen Fällen) ist sie vorteilhaft?

Frank
Gast #4288814
Lesenswert?

Frank schrieb:
> Von daher könnten abgesehen davon negative genauso wie positive Zahlen
> dargestellt werden?

Nimm mal den Wert 0xff und erhöhe die Zahl um eins. Egal ob du das als 
-1 oder 255 interpretierst, muss der µC genau das selbe machen. Ob du 
die 0xff als negative Zahl oder als positive Zahl interpretierst, ist 
alleine deine Sache.
#4288815
Lesenswert?

@ Frank (Gast)

>der digitale Thermometer-IC Maxim DS18B20 stellt negative Temperaturen
>im "two’s complement" - Format dar.

Sieht so aus.

> Es werden daher zusätzliche
>Verarbeitungsschritte (bitweise Invertierung und eine Addition von 1)
>nötig.

Eben NICHT! Mit dem 2er Komplement kann man ganz normal rechen wie mit 
vorzeichenlosen Zahlen! Soagr in ASM!

>Was ist der Hintergrund einer solchen Darstellung negativer Zahlen,
>warum (bzw. in welchen Fällen) ist sie vorteilhaft?

Siehe oben!
#4288834
Lesenswert?

Frank schrieb:
> Was ist der Hintergrund einer solchen Darstellung negativer Zahlen,
> warum (bzw. in welchen Fällen) ist sie vorteilhaft?

Stell Dir die Ziffernfolge bei einem  Binärzähler vor (hier, als 
Beispiel, 4-stellige FF-Kette, der hat dann nach 0000 die 1111 als 
nächsten Schritt)

0011   3    3     >erste Spalte binär
0010   2    2     >zweite Spalte nur Zuordnung für pos. Zahlen
0001   1    1     >dritte Spalte Zuordnung der neg.Zahlen
0000   0    0
1111   ?   -1     > dann ist doch die Zuordnung ganz logisch, oder?
1110   ?   -2
1101   ?   -3
1100   ?   -4


Wenn Du dann die binärfolge abwärts gehst, kommen die Zahlen 3-2-1-0-?
Welche Zahl kommmt da nach 0, wenn auch negative Zahlen möglich sind?

Bei einer 8-stelligen Zahl folgt beim Abwärtszählen also logischerweise 
ff nach 00, so wie beim Abwärtszählen nach 0 die -1 kommt.

An der Viererreihe sieht man auch den Versatz von 1 in der Nummerierung, 
weshalb die komische Addition von 1 notwendig ist.

und wenn man die 256 Zahlen von 0 bis 255 gleich aufteilt, gilt halt 0 
bis 127 als positiv und 128 bis 255 als negativ.
praktisch ist dann gleich, dass das erste bit als Vorzeichenbit wirksam 
wird.


und noch toller wird es, wenn Du 0000 0010  und 1111 1111 adddierst. 
Dann kommt 0000 0001 (mit Übertrag ins 9.bit) heraus, also eine brave 1, 
so wie bem Addieren von 2 und -1

Man opfert zwar den Zahlenumfang der pos.Zahlen zur Hälfte zugunsten der 
negativen, hat aber eine klare Markierung ,ob pos oder neg und dazu 
funktionieren einige Rechenoperationen wie zuvor.
#4288891
Lesenswert?

Frank schrieb:
> Es werden daher zusätzliche
> Verarbeitungsschritte (bitweise Invertierung und eine Addition von 1)
> nötig.

Nur wenn Du in Assembler ohne Standard-Libs unterwegs bist.

Das "two’s complement" - Format ist das Leib und Magen Format einer CPU 
und quasi der Standard.
Man kann daher direkt die Temperatur mit Vorzeichen anzeigen:
1
  int16_t val = read_DS18B20;
2
  printf("Temperatur: %5.1f °C\n", ((float)val) / 16.0;
Gast #4288912
Lesenswert?

Peter D. schrieb:
> Man kann daher direkt die Temperatur mit Vorzeichen anzeigen:  int16_t
> val = read_DS18B20;
>   printf("Temperatur: %5.1f °C\n", ((float)val) / 16.0;

Wieso eigentlich der Datentyp float für eine Zahl, die gerade mal den 
Dynamikbereich von -55 °C bis 125 °C umfasst. Da wird eine 16 Bit-Zahl 
ohne Notwendigkeit auf 32 Bit aufgebläht und dabei noch 8 Bit für einen 
völlig nutzlosen Exponenten verschwendet, ganz zu schweigen von dem 
erheblichen Rechenaufwand für den Umgang mit Float-Zahlen.
#4289382
Lesenswert?

Wolfgang schrieb:
> Wieso eigentlich der Datentyp float

Weil man damit am einfachsten Kommazahlen ausgeben kann. Zu beachten ist 
die Wandlung nach float vor der Division / 16.0.
Für ganze °C kann man natürlich bei int bleiben.

Es gibt auch keinen Grund mehr, float/printf zu fürchten, schließlich 
haben selbst 8-Pinner üppig Flash (ATtiny85: 8kB).

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren