Hallo Freunde,
ich versuche nun die Temperatur von einem "BMP180" Drucksensor aus zu lesen.
Dieser hat in seinem EPROM einige Kalibriertwerte gespeichert, die ich vorher auslesen muss und mit verrechnen muss.
Die Kalibrationswerte & den Wert der Temperatur "UT" bekomme ich.
Leider bekomme ich als Ergebniss "truetemperature" ständig ne "0" raus. Das deutet doch eigentlich darauf hin das der Wert nicht in die Variable rein passt oder ?
Hier den Quellcode den ich im Internet gefunden hab..
[CCODE]
// addresses of the BMP180 calibration MSB reigisters
uint8_t BMP180_regaddress[11] =
{
0xAA, 0xAC, 0xAE, 0xB0,
0xB2, 0xB4, 0xB6, 0xB8,
0xBA, 0xBC, 0xBE
};
uint16_t BMP180_cal[11]; // holds all BMP180 calibration data
uint8_t BMP180_init(void)
{
unsigned char ID;
i2c_start(BMP180_address + I2C_WRITE);
i2c_write(BMP180_ID);
i2c_start(BMP180_address + I2C_READ);
ID = i2c_readNak();
i2c_stop();
if(ID == 0x55)
{
for(uint8_t i = 0; i < 11; i++)
{
i2c_start(BMP180_address+I2C_WRITE);
i2c_write(BMP180_regaddress);
i2c_start(BMP180_address+I2C_READ);
BMP180_cal = i2c_readAck()<<8;
BMP180_cal |= i2c_readNak();
i2c_stop();
}
return 1;
}
else
{
return 0;
}
}
uint16_t BMP180_read(uint8_t oversampling_setting, uint8_t select)
{
uint16_t UP; // holds the raw pressure value read from BMP180
int16_t UT; // holds the raw temperature value read from BMP180
long B6, X1, X2, X3, B3, B5, B7;
unsigned long B4;
int16_t truetemperature;
uint16_t truepressure;
i2c_start(BMP180_address+I2C_WRITE);
i2c_write(BMP180_CTRL);
i2c_write(0x2E);
_delay_us(50);
i2c_start(BMP180_address+I2C_WRITE);
i2c_write(BMP180_OUTMSB);
i2c_start(BMP180_address+I2C_READ);
UT = i2c_readAck()<<8;
UT |= i2c_readNak();
i2c_stop();
i2c_start(BMP180_address+I2C_WRITE);
i2c_write(BMP180_CTRL);
i2c_write(0x34+(oversampling_setting<<6));
_delay_us(80);
i2c_start(BMP180_address+I2C_WRITE);
i2c_write(BMP180_OUTMSB);
i2c_start(BMP180_address+I2C_READ);
UP = i2c_readAck()<<8;
UP |= i2c_readNak();
i2c_stop();
UP >>= (8-oversampling_setting);
X1 = (UT-BMP180_cal[5]) * BMP180_cal[4] / 32768;
X2 = BMP180_cal[9] * 2048 / (X1 + BMP180_cal[10]);
B5 = X1 + X2;
truetemperature = (B5 + 8) / 16;
[/CCODE]
Die Funktion wird als "uint16_t" deklariert... Das kann bei negativen Temperaturen doch schon in die Hose gehen oder?
Dann, werden die ausgelesenen Kalibrierwerte ebenfalls in einem "uint16_t" gespeichert... Im Datenblatt sehe ich aber auch negative Werte... Oder Interpretiere ich mal wieder was falsch?
ich versuche nun die Temperatur von einem "BMP180" Drucksensor aus zu lesen.
Dieser hat in seinem EPROM einige Kalibriertwerte gespeichert, die ich vorher auslesen muss und mit verrechnen muss.
Die Kalibrationswerte & den Wert der Temperatur "UT" bekomme ich.
Leider bekomme ich als Ergebniss "truetemperature" ständig ne "0" raus. Das deutet doch eigentlich darauf hin das der Wert nicht in die Variable rein passt oder ?
Hier den Quellcode den ich im Internet gefunden hab..
[CCODE]
// addresses of the BMP180 calibration MSB reigisters
uint8_t BMP180_regaddress[11] =
{
0xAA, 0xAC, 0xAE, 0xB0,
0xB2, 0xB4, 0xB6, 0xB8,
0xBA, 0xBC, 0xBE
};
uint16_t BMP180_cal[11]; // holds all BMP180 calibration data
uint8_t BMP180_init(void)
{
unsigned char ID;
i2c_start(BMP180_address + I2C_WRITE);
i2c_write(BMP180_ID);
i2c_start(BMP180_address + I2C_READ);
ID = i2c_readNak();
i2c_stop();
if(ID == 0x55)
{
for(uint8_t i = 0; i < 11; i++)
{
i2c_start(BMP180_address+I2C_WRITE);
i2c_write(BMP180_regaddress);
i2c_start(BMP180_address+I2C_READ);
BMP180_cal = i2c_readAck()<<8;
BMP180_cal |= i2c_readNak();
i2c_stop();
}
return 1;
}
else
{
return 0;
}
}
uint16_t BMP180_read(uint8_t oversampling_setting, uint8_t select)
{
uint16_t UP; // holds the raw pressure value read from BMP180
int16_t UT; // holds the raw temperature value read from BMP180
long B6, X1, X2, X3, B3, B5, B7;
unsigned long B4;
int16_t truetemperature;
uint16_t truepressure;
i2c_start(BMP180_address+I2C_WRITE);
i2c_write(BMP180_CTRL);
i2c_write(0x2E);
_delay_us(50);
i2c_start(BMP180_address+I2C_WRITE);
i2c_write(BMP180_OUTMSB);
i2c_start(BMP180_address+I2C_READ);
UT = i2c_readAck()<<8;
UT |= i2c_readNak();
i2c_stop();
i2c_start(BMP180_address+I2C_WRITE);
i2c_write(BMP180_CTRL);
i2c_write(0x34+(oversampling_setting<<6));
_delay_us(80);
i2c_start(BMP180_address+I2C_WRITE);
i2c_write(BMP180_OUTMSB);
i2c_start(BMP180_address+I2C_READ);
UP = i2c_readAck()<<8;
UP |= i2c_readNak();
i2c_stop();
UP >>= (8-oversampling_setting);
X1 = (UT-BMP180_cal[5]) * BMP180_cal[4] / 32768;
X2 = BMP180_cal[9] * 2048 / (X1 + BMP180_cal[10]);
B5 = X1 + X2;
truetemperature = (B5 + 8) / 16;
[/CCODE]
Die Funktion wird als "uint16_t" deklariert... Das kann bei negativen Temperaturen doch schon in die Hose gehen oder?
Dann, werden die ausgelesenen Kalibrierwerte ebenfalls in einem "uint16_t" gespeichert... Im Datenblatt sehe ich aber auch negative Werte... Oder Interpretiere ich mal wieder was falsch?