Many changes from 2018
[owSlave2.git] / common / I2C / BMP280.c
index 97ab51d..9fb4319 100644 (file)
@@ -4,7 +4,7 @@
 #include <util/delay.h>\r
 #include <avr/wdt.h>\r
 #include <avr/sleep.h>\r
 #include <util/delay.h>\r
 #include <avr/wdt.h>\r
 #include <avr/sleep.h>\r
-#include "USI_TWI_Master.h"\r
+#include "TWI_Master.h"\r
 \r
 uint16_t dig_T1;\r
 int16_t dig_T2;\r
 \r
 uint16_t dig_T1;\r
 int16_t dig_T2;\r
@@ -45,6 +45,12 @@ short bmp280ReadShort(unsigned char address)
 }\r
 \r
 void bmp280Init(void) {\r
 }\r
 \r
 void bmp280Init(void) {\r
+       I2c_StartCondition();\r
+       I2c_WriteByte(0xEC);\r
+       I2c_WriteByte(0xF4);\r
+       I2c_WriteByte(0b01010111); //2x Temp over 16x Press over   Normal mode\r
+       I2c_WriteByte(0b11100000);  //4s time / no IIfilter\r
+       I2c_StopCondition();\r
        dig_T1=bmp280ReadShort(0x88);\r
        dig_T2=bmp280ReadShort(0x8A);\r
        dig_T3=bmp280ReadShort(0x8C);\r
        dig_T1=bmp280ReadShort(0x88);\r
        dig_T2=bmp280ReadShort(0x8A);\r
        dig_T3=bmp280ReadShort(0x8C);\r
@@ -57,12 +63,7 @@ void bmp280Init(void) {
        dig_P7=bmp280ReadShort(0x9A);\r
        dig_P8=bmp280ReadShort(0x9C);\r
        dig_P9=bmp280ReadShort(0x9E);\r
        dig_P7=bmp280ReadShort(0x9A);\r
        dig_P8=bmp280ReadShort(0x9C);\r
        dig_P9=bmp280ReadShort(0x9E);\r
-       I2c_StartCondition();\r
-       I2c_WriteByte(0xEC);\r
-       I2c_WriteByte(0xF4);\r
-       I2c_WriteByte(0b01010111); //2x Temp over 16x Press over   Normal mode\r
-       I2c_WriteByte(0b11100000);  //4s time / no IIfilter\r
-       I2c_StopCondition();\r
+       \r
        \r
        \r
 }\r
        \r
        \r
 }\r
@@ -133,11 +134,78 @@ int32_t bmp280ReadPressure_simple() {
 \r
 \r
 }\r
 \r
 \r
 }\r
+#define BMP280_S32_t int32_t\r
+// Returns temperature in DegC, double precision. Output value of \9351.23\94 equals 51.23 DegC.\r
+// t_fine carries fine temperature as global value\r
+BMP280_S32_t t_fine;\r
+double bmp280_compensate_T_double(BMP280_S32_t adc_T)\r
+{\r
+       double var1, var2, T;\r
+       var1 = (((double)adc_T)/16384.0 - ((double)dig_T1)/1024.0) * ((double)dig_T2);\r
+       var2 = ((((double)adc_T)/131072.0 - ((double)dig_T1)/8192.0) *\r
+       (((double)adc_T)/131072.0 - ((double) dig_T1)/8192.0)) * ((double)dig_T3);\r
+       t_fine = (BMP280_S32_t)(var1 + var2);\r
+       T = (var1 + var2) / 5120.0;\r
+       return T;\r
+}\r
+// Returns pressure in Pa as double. Output value of \9396386.2\94 equals 96386.2 Pa = 963.862 hPa\r
+double bmp280_compensate_P_double(BMP280_S32_t adc_P)\r
+{\r
+       double var1, var2, p;\r
+       var1 = ((double)t_fine/2.0) - 64000.0;\r
+       var2 = var1 * var1 * ((double)dig_P6) / 32768.0;\r
+       var2 = var2 + var1 * ((double)dig_P5) * 2.0;\r
+       var2 = (var2/4.0)+(((double)dig_P4) * 65536.0);\r
+       var1 = (((double)dig_P3) * var1 * var1 / 524288.0 + ((double)dig_P2) * var1) / 524288.0;\r
+       var1 = (1.0 + var1 / 32768.0)*((double)dig_P1);\r
+       if (var1 == 0.0)\r
+       {\r
+               return 0; // avoid exception caused by division by zero\r
+       }\r
+       p = 1048576.0 - (double)adc_P;\r
+       p = (p - (var2 / 4096.0)) * 6250.0 / var1;\r
+       var1 = ((double)dig_P9) * p * p / 2147483648.0;\r
+       var2 = p * ((double)dig_P8) / 32768.0;\r
+       p = p + (var1 + var2 + ((double)dig_P7)) / 16.0;\r
+       return p;\r
+}\r
+\r
+void bmp280ConvertInt_df(int32_t * temperature,uint32_t *pressure,uint8_t oss) {\r
+               //bmp280Init();\r
+               double var1, var2, T;\r
+               int32_t adc_T=bmp280ReadTemp();\r
+               var1 = (((double)adc_T)/16384.0 - ((double)dig_T1)/1024.0) * ((double)dig_T2);\r
+               var2 = ((((double)adc_T)/131072.0 - ((double)dig_T1)/8192.0) *\r
+               (((double)adc_T)/131072.0 - ((double) dig_T1)/8192.0)) * ((double)dig_T3);\r
+               t_fine = (BMP280_S32_t)(var1 + var2);\r
+               T = (var1 + var2) / 5120.0;\r
+\r
+               int32_t adc_P= bmp280ReadPressure(oss);\r
+               double  p;\r
+               var1 = ((double)t_fine/2.0) - 64000.0;\r
+               var2 = var1 * var1 * ((double)dig_P6) / 32768.0;\r
+               var2 = var2 + var1 * ((double)dig_P5) * 2.0;\r
+               var2 = (var2/4.0)+(((double)dig_P4) * 65536.0);\r
+               var1 = (((double)dig_P3) * var1 * var1 / 524288.0 + ((double)dig_P2) * var1) / 524288.0;\r
+               var1 = (1.0 + var1 / 32768.0)*((double)dig_P1);\r
+               if (var1 == 0.0)\r
+               {\r
+                       return ; // avoid exception caused by division by zero\r
+               }\r
+               p = 1048576.0 - (double)adc_P;\r
+               p = (p - (var2 / 4096.0)) * 6250.0 / var1;\r
+               var1 = ((double)dig_P9) * p * p / 2147483648.0;\r
+               var2 = p * ((double)dig_P8) / 32768.0;\r
+               p = p + (var1 + var2 + ((double)dig_P7)) / 16.0;\r
+               *temperature=(int32_t) (T*100.0);\r
+               *pressure=(uint32_t) p;\r
+               return;\r
+}\r
+\r
+\r
 \r
 void bmp280ConvertInt(int32_t * temperature,uint32_t *pressure,uint8_t oss) {\r
        int32_t var1,var2,T,t_fine;\r
 \r
 void bmp280ConvertInt(int32_t * temperature,uint32_t *pressure,uint8_t oss) {\r
        int32_t var1,var2,T,t_fine;\r
-       \r
-       \r
        int32_t adc_T=bmp280ReadTemp();\r
        var1 = ((((adc_T>>3) - ((int32_t)dig_T1<<1))) * ((int32_t)dig_T2)) >> 11;\r
        var2 = ((((((adc_T>>4) - ((int32_t)dig_T1)) * ((adc_T>>4) - (int32_t)dig_T1))) >> 12) *((int32_t)dig_T3)) >> 14;\r
        int32_t adc_T=bmp280ReadTemp();\r
        var1 = ((((adc_T>>3) - ((int32_t)dig_T1<<1))) * ((int32_t)dig_T2)) >> 11;\r
        var2 = ((((((adc_T>>4) - ((int32_t)dig_T1)) * ((adc_T>>4) - (int32_t)dig_T1))) >> 12) *((int32_t)dig_T3)) >> 14;\r
@@ -145,7 +213,7 @@ void bmp280ConvertInt(int32_t * temperature,uint32_t *pressure,uint8_t oss) {
        T = (t_fine * 5 + 128) >> 8;\r
        *temperature=T;\r
        int32_t adc_P= bmp280ReadPressure(oss);\r
        T = (t_fine * 5 + 128) >> 8;\r
        *temperature=T;\r
        int32_t adc_P= bmp280ReadPressure(oss);\r
-       uint32_t p;\r
+       int32_t p;\r
        var1 = (((int32_t)t_fine)>>1) - (int32_t)64000;\r
        var2 = (((var1>>2) * (var1>>2)) >> 11 ) * ((int32_t)dig_P6);\r
        var2 = var2 + ((var1*((int32_t)dig_P5))<<1);\r
        var1 = (((int32_t)t_fine)>>1) - (int32_t)64000;\r
        var2 = (((var1>>2) * (var1>>2)) >> 11 ) * ((int32_t)dig_P6);\r
        var2 = var2 + ((var1*((int32_t)dig_P5))<<1);\r
@@ -164,7 +232,8 @@ void bmp280ConvertInt(int32_t * temperature,uint32_t *pressure,uint8_t oss) {
        var1 = (((int32_t)dig_P9) * ((int32_t)(((p>>3) * (p>>3))>>13)))>>12;\r
        var2 = (((int32_t)(p>>2)) * ((int32_t)dig_P8))>>13;\r
        p = (uint32_t)((int32_t)p + ((var1 + var2 + dig_P7) >> 4));\r
        var1 = (((int32_t)dig_P9) * ((int32_t)(((p>>3) * (p>>3))>>13)))>>12;\r
        var2 = (((int32_t)(p>>2)) * ((int32_t)dig_P8))>>13;\r
        p = (uint32_t)((int32_t)p + ((var1 + var2 + dig_P7) >> 4));\r
-       *pressure=p;\r
+\r
+       *pressure=(uint32_t)(p);\r
 \r
 }\r
 \r
 \r
 }\r
 \r