Hallo Leute, ich bin gerade ein bisschen am verzweifeln und hoffe ihr könnt mir helfen :) Ich habe folgendes Programm zum Messen der Temperatur: #include <i2cmaster.h> const int analogpin = 0; // Analog input pin void setup(){ Serial.begin(9600); Serial.println("Herzlich willkommen. Zeig mir einen Gegenstand") ; Serial.println("und ich zeig dir wie warm er ist : )"); i2c_init(); //Initialise the i2c bus PORTC = (1 << PORTC4) | (1 << PORTC5);//enable pullups } void loop(){ int dev = 0x5A<<1; int data_low = 0; int data_high = 0; int pec = 0; i2c_start_wait(dev+I2C_WRITE); i2c_write(0x07); i2c_rep_start(dev+I2C_READ); data_low = i2c_readAck(); //Read 1 byte and then send ack //read one byte from the I2C device, request more data from device data_high = i2c_readAck(); //Read 1 byte and then send ack pec = i2c_readNak(); //read one byte from the I2C device, read is followed by a stop condition i2c_stop(); //set stop conditon = release bus //This converts high and low bytes together and processes temperature, MSB is a error bit and is ignored for temps float tempFactor = 0.02; // 0.02 degrees per LSB (measurement resolution of the MLX90614) float tempData = 0x0000; // zero out the data int frac; // data past the decimal point // This masks off the error bit of the high byte, then moves it left 8 bits and adds the low byte. tempData = (double)(((data_high & 0x007F) << 8) + data_low); tempData = (tempData * tempFactor)-0.01; float celcius = tempData - 273.15; Serial.print("Celcius: "); Serial.println(celcius); delay(1000); // wait a second before printing again } Aber leider verstehe ich nciht alles davon : ( Besonders dieser Teil verwirrt mich: // This masks off the error bit of the high byte, then moves it left 8 bits and adds the low byte. tempData = (double)(((data_high & 0x007F) << 8) + data_low); tempData = (tempData * tempFactor)-0.01; Ich meine ich verstehe das soweit. Data_high wird aus dem Sensor zu einem bestimmten Zeitpunkt gelesen und dann mit der Hexadezimalzahl bitweise addiert. Das alles wird dann um 8 Stellen nach links verschoben und schlussendlich wird dann noch der 2. Byte data_low dazu addiert. Aber wiso? Was bewirkt diese Operation? Wiso muss man das verschieben? Ich hoffe ihr könnt mir helfen. Schon mal vielen Dank im Voraus ;)
> Besonders dieser Teil verwirrt mich: > > // This masks off the error bit of the high byte, then moves it left 8 > bits and adds the low byte. > tempData = (double)(((data_high & 0x007F) << 8) + data_low); > tempData = (tempData * tempFactor)-0.01; > > Ich meine ich verstehe das soweit. Data_high wird aus dem Sensor zu > einem bestimmten Zeitpunkt gelesen und dann mit der Hexadezimalzahl > bitweise addiert. Das alles wird dann um 8 Stellen nach links verschoben > und schlussendlich wird dann noch der 2. Byte data_low dazu addiert. > Aber wiso? Was bewirkt diese Operation? Wiso muss man das verschieben? Der Sensor scheint sein Ergebnis als 15-Bit Ganzzahl zu liefern und zwar als hochwertiges Datenbyte mit 7-Bit und als niederwertiges Datenbyte mit 8-Bit. Das oberste Bit des hochwertige Datenbytes ist also aus zu maskieren. Das wird mit (data_high & 0x007F) gemacht. Dann ist das hochwertige Datenbit und das niederwertige Datenbit zu dem 15-Bit Ergebnis (das in einer 16-Bit Zwischenvariable gespeichert wird) zusammen zu setzen. Das kann man machen durch hochwertiges Datenbyte * 256 + niederwertiges Datenbyte oder durch eine Schieben der Bits um 8 (256 = 2^8) nach links (hochwertiges Datenbyte << 8) + niederwertiges Datenbyte Das zusammengesetzte Ergebnis ist noch eine Ganzzahl. Die wird durch den cast (double) in ein Gleitkommaergebnis tempData umgewandelt. Anschliessend wird eine Korrektur (die wohl im Datenblatt beschrieben ist) berechnet tempData = (tempData * tempFactor)-0.01;
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.