Forum: Mikrocontroller und Digitale Elektronik DS18B20: Hintergrund Format bei negativen Temperaturen


von Frank (Gast)


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

von STK500-Besitzer (Gast)


Lesenswert?

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

1. Wie sollte man sie sonst darstellen?
2. guck dir mal an, wie ganze Zahlen im Normalfall dargestellt werden.

von Frank (Gast)


Lesenswert?

Es gibt extra Bits für das Vorzeichen. Von daher könnten abgesehen davon 
negative genauso wie positive Zahlen dargestellt werden?

Frank

von Wolfgang (Gast)


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.

von Falk B. (falk)


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!

von Peter R. (pnu)


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.

: Bearbeitet durch User
von Peter D. (peda)


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;

von Wolfgang (Gast)


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.

von Falk B. (falk)


Lesenswert?

Weil es am bequemsten für die formatierte Ausgabe ist. Wer's sparsamer 
mag, nimmt Festkommaarithmetik.

von Frank (Gast)


Lesenswert?

Vielen Dank für Eure Erklärungen!

Frank

von Peter D. (peda)


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).

von Falk B. (falk)


Lesenswert?

@ Peter Dannegger (peda)

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

Hast du Atmel-Aktien gekauft? ;-)

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.