@ D. R. (misterdimi1992)
>> Der LM75 liefert ein 9-Bit Ergebnis im 2er-Komplement. Nur bezieht sich
>> das "2er-Komplement" auf dieses 9-Bit Ergebnis, nicht auf eine
>> 16-Bit-Zahl. Man muss also nach dem Bilden des 2er-Komplements die nicht
>> vorhandenen 7 oberen Bits ausmaskieren.
Jain, er muss vorzeichenrichtig erweitern, bzw. schieben.
>ich benötige die 11-Bit-Zahl, da ich die negativen Werte auch mit der
>Nachkommazahl angeben möchte. Wie genau kann ich denn die oberen Bits
>ausmaskieren, dass diese nicht mit in die "Berechnung" fallen?
Du musst eine vorzeichenbehaftete Zahl zur Speicherung nutzen. Dann kann
man auch ohne Hackertricks und kryptische Auswertung damit arbeiten. Und
mit etwa Know How kann man auch Fließkommazahlen verzichten und mit
einfacher Festkommaarithmetik arbeiten.
1 | #include <avr/io.h>
|
2 | #define F_CPU 8000000
|
3 | #include <util/delay.h>
|
4 | #include "lcd-routines.h"
|
5 | #include "i2cmaster.h"
|
6 |
|
7 | uint8_t MSByte_LM75, LSByte_LM75;
|
8 | int16_t tempdata;
|
9 | char cBuffer_LM75[16];
|
10 | char temp_min[16], temp_max[16];
|
11 |
|
12 | int main(void) {
|
13 |
|
14 | i2c_init();
|
15 | lcd_init();
|
16 |
|
17 | while (1) {
|
18 | /****Reading in values of temp register LM75 I²C ***/
|
19 |
|
20 | i2c_start(0x92);
|
21 | i2c_write(0x00);
|
22 | i2c_rep_start(0x93);
|
23 | MSByte_LM75=i2c_readAck(); // read MSB
|
24 | LSByte_LM75=i2c_readNak(); // read LSB
|
25 | i2c_stop();
|
26 |
|
27 | tempdata = MSByte_LM75<< 8) | LSByte_LM75;
|
28 | tempdata >>= 7; // Temperatur mit 0.5 °C Auflösung
|
29 |
|
30 | lcd_clear();
|
31 | lcd_setcursor(0,1);
|
32 | if ( tempdata < 0) {
|
33 | lcd_string("-");
|
34 | tempdata = -tempdata;
|
35 | } else {
|
36 | lcd_string("+");
|
37 | }
|
38 |
|
39 | // Vorkommastellen
|
40 | itoa(tempdata/2,cBuffer_LM75, 10);
|
41 | lcd_string(cBuffer_LM75);
|
42 |
|
43 | // Nachkommastelle
|
44 | if (tempdata & 0x01) {
|
45 | lcd_string(".5");
|
46 | } else {
|
47 | lcd_string(".0");
|
48 | }
|
49 |
|
50 | _delay_ms(1000);
|
51 | }
|
52 | }
|