X-Git-Url: http://git.smho.de/gw/?p=owSlave2.git;a=blobdiff_plain;f=common%2FI2C%2FBMP280.c;fp=common%2FI2C%2FBMP280.c;h=6d239461b7eed67604dd5ab3097f6657bef92162;hp=27adba56318b523d50af78f33de6fe7f11e7814c;hb=1624c8ce9acb762d2cdc0b2f6b064448561ff752;hpb=1e73b685ab7090435813defd9844a1d61e1fb909 diff --git a/common/I2C/BMP280.c b/common/I2C/BMP280.c index 27adba5..6d23946 100644 --- a/common/I2C/BMP280.c +++ b/common/I2C/BMP280.c @@ -110,6 +110,30 @@ int32_t bmp280ReadPressure(uint8_t oss) { } + +int32_t bmp280ReadPressure_simple() { + uint8_t msb, lsb,xlsb; + volatile int32_t data; + I2c_StartCondition(); + I2c_WriteByte(0xEC); + I2c_WriteByte(0xF7); + I2c_StopCondition(); + I2c_StartCondition(); + I2c_WriteByte(0xED); + msb=I2c_ReadByte(ACK); + lsb=I2c_ReadByte(ACK); + xlsb=I2c_ReadByte(NO_ACK); + I2c_StopCondition(); + + data = (int32_t)msb << 12; + data |= (int16_t)lsb<<4; + data|=xlsb>>4; + + return data; + + +} + void bmp280ConvertInt(int32_t * temperature,uint32_t *pressure,uint8_t oss) { int32_t var1,var2,T,t_fine; @@ -143,6 +167,7 @@ void bmp280ConvertInt(int32_t * temperature,uint32_t *pressure,uint8_t oss) { *pressure=p; } + void bmp280Convert(double * temperature, double * pressure,uint8_t oss) { uint32_t p; @@ -152,7 +177,63 @@ void bmp280Convert(double * temperature, double * pressure,uint8_t oss) { *pressure=p/100.0; } - - +void bmp280ConvertIntP(int32_t temp256,uint32_t *pressure) { + int32_t var1,var2,t_fine; + //T = (t_fine * 5 + 128) >> 8; + t_fine=((temp256)-128)/5; + int32_t adc_P= bmp280ReadPressure_simple(); + uint32_t p; + var1 = (((int32_t)t_fine)>>1) - (int32_t)64000; + var2 = (((var1>>2) * (var1>>2)) >> 11 ) * ((int32_t)dig_P6); + var2 = var2 + ((var1*((int32_t)dig_P5))<<1); + var2 = (var2>>2)+(((int32_t)dig_P4)<<16); + var1 = (((dig_P3 * (((var1>>2) * (var1>>2)) >> 13 )) >> 3) + ((((int32_t)dig_P2) * var1)>>1))>>18; + var1 =((((32768+var1))*((int32_t)dig_P1))>>15); + if (var1 == 0) { + return ; // avoid exception caused by division by zero + } + p = (((uint32_t)(((int32_t)1048576)-adc_P)-(var2>>12)))*3125; + if (p < 0x80000000){ + p = (p << 1) / ((uint32_t)var1); + }else{ + p = (p / (uint32_t)var1) * 2; + } + var1 = (((int32_t)dig_P9) * ((int32_t)(((p>>3) * (p>>3))>>13)))>>12; + var2 = (((int32_t)(p>>2)) * ((int32_t)dig_P8))>>13; + p = (uint32_t)((int32_t)p + ((var1 + var2 + dig_P7) >> 4)); + *pressure=p; +} + +void bmp280ConvertIntP1(uint32_t *pressure) { + int32_t var1,var2,T,t_fine; + + int32_t adc_T=bmp280ReadTemp(); + var1 = ((((adc_T>>3) - ((int32_t)dig_T1<<1))) * ((int32_t)dig_T2)) >> 11; + var2 = ((((((adc_T>>4) - ((int32_t)dig_T1)) * ((adc_T>>4) - (int32_t)dig_T1))) >> 12) *((int32_t)dig_T3)) >> 14; + t_fine = var1 + var2; + T = (t_fine * 5 + 128) >> 8; + int32_t adc_P= bmp280ReadPressure_simple(); + uint32_t p; + var1 = (((int32_t)t_fine)>>1) - (int32_t)64000; + var2 = (((var1>>2) * (var1>>2)) >> 11 ) * ((int32_t)dig_P6); + var2 = var2 + ((var1*((int32_t)dig_P5))<<1); + var2 = (var2>>2)+(((int32_t)dig_P4)<<16); + var1 = (((dig_P3 * (((var1>>2) * (var1>>2)) >> 13 )) >> 3) + ((((int32_t)dig_P2) * var1)>>1))>>18; + var1 =((((32768+var1))*((int32_t)dig_P1))>>15); + if (var1 == 0) { + return ; // avoid exception caused by division by zero + } + p = (((uint32_t)(((int32_t)1048576)-adc_P)-(var2>>12)))*3125; + if (p < 0x80000000){ + p = (p << 1) / ((uint32_t)var1); + }else{ + p = (p / (uint32_t)var1) * 2; + } + var1 = (((int32_t)dig_P9) * ((int32_t)(((p>>3) * (p>>3))>>13)))>>12; + var2 = (((int32_t)(p>>2)) * ((int32_t)dig_P8))>>13; + p = (uint32_t)((int32_t)p + ((var1 + var2 + dig_P7) >> 4)); + *pressure=p; + +}