You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
As I see, you are reading a byte value for MSB, LSB, XLSB to compose the pressure. In Java they are signed. The values are not meant to be signed, so it helps to change the following lines to get it working properly
change line 171-173
int msb = mDevice.readRegByte(BMP180_PRESSURE_DATA);
int lsb = mDevice.readRegByte(BMP180_PRESSURE_DATA + 1);
int xlsb = mDevice.readRegByte(BMP180_PRESSURE_DATA + 2);
to
int msb = ( mDevice.readRegByte(BMP180_PRESSURE_DATA) & 0xff);
int lsb = ( mDevice.readRegByte(BMP180_PRESSURE_DATA + 1) & 0xff);
int xlsb = ( mDevice.readRegByte(BMP180_PRESSURE_DATA + 2) & 0xff);
Similar to the calculation on B4 and B7. As in Java int has 4 bytes that should be big enough to store the unsigned long values in C as in the datasheet (page 15)
line 229-230
long B4 = (AC4 * (X3 + 32768)) >> 15;
long B7 = (UP - B3) * (50000 >> mode);
to int B4 = (((AC4 * (X3 + 32768)) >> 15)& 0xffffffff); int B7 = ((UP - B3) * (50000 >> mode)& 0xffffffff);
As I see, you are reading a byte value for MSB, LSB, XLSB to compose the pressure. In Java they are signed. The values are not meant to be signed, so it helps to change the following lines to get it working properly
change line 171-173
int msb = mDevice.readRegByte(BMP180_PRESSURE_DATA);
int lsb = mDevice.readRegByte(BMP180_PRESSURE_DATA + 1);
int xlsb = mDevice.readRegByte(BMP180_PRESSURE_DATA + 2);
to
int msb = ( mDevice.readRegByte(BMP180_PRESSURE_DATA) & 0xff);
int lsb = ( mDevice.readRegByte(BMP180_PRESSURE_DATA + 1) & 0xff);
int xlsb = ( mDevice.readRegByte(BMP180_PRESSURE_DATA + 2) & 0xff);
Similar to the calculation on B4 and B7. As in Java int has 4 bytes that should be big enough to store the unsigned long values in C as in the datasheet (page 15)
line 229-230
long B4 = (AC4 * (X3 + 32768)) >> 15;
long B7 = (UP - B3) * (50000 >> mode);
to
int B4 = (((AC4 * (X3 + 32768)) >> 15)& 0xffffffff);
int B7 = ((UP - B3) * (50000 >> mode)& 0xffffffff);
See
https://ae-bst.resource.bosch.com/media/_tech/media/datasheets/BST-BMP180-DS000-12.pdf
https://stackoverflow.com/questions/4266756/can-we-make-unsigned-byte-in-java
Similar problems may occur with AC4, AC5, AC6 as they are unsigned short and read as byte (signed in JAVA)
The text was updated successfully, but these errors were encountered: