// ---------------------------------------------------------------------------- // wandelt den Messwert, der aus 2 Byte besteht, in einen String (mit einer Nachkommastelle) um. // Der Messwert steht rechtsbündig in den globalen Variablen ow_buffer[0] und ow_buffer[1], // (die Werte entsprechen scratchpad.Byte[0] / scratchpad.Byte[1]) // Das Ergebnis wird über den globalen String msg[] zurückgegeben. void DS18B20_convert_temperatur(void) { int16_t temp16; uint8_t i = 0; ow_buffer[1] = ow_buffer[1] << 4; // lower nibble im high-Byte nach links schieben // upper nibble im low-Byte nach rechts schieben und // zum high-Byte addieren. ow_buffer[1] += (ow_buffer[0] >> 4); // die Vorkommastellen stehen jetzt in ow_buffer[1] // da upper-nibble der Nachkommastellen maskieren, ow_buffer[0] &= 0x0F; // die Nachkommastellen stehen in ow_buffer[0] temp16 = (int16_t) ow_buffer[1] * 10; // die Nachkommastelle: temp_lo * 0.625 = temp_lo * 625 / 1000 = temp_lo * 640 / 1024 temp16 += (int16_t)ow_buffer[0] * 640 / 1024; // Nun das Dezimaltrennzeichen einschmuggeln: itoa(temp16, msg, 10); // die Zahl in einen String umwandeln while(msg[i]) i++; // die Position der terminierende /0 finden msg[i] = msg[i - 1]; // die Nachkommastelle nach rechts schieben msg[i - 1] = '.'; // statt dessen ein Dezimaltrennzeichen einfügen msg[++i] = 0; // Am Ende wieder eine /0 anfügen } // ----------------------------------------------------------------------------