VOC Optimation
[owSlave2.git] / common / I2C / BMP280.c
index 3fdc81d..27adba5 100644 (file)
-#define F_CPU 8000000UL
-#include <avr/io.h>
-#include <avr/interrupt.h>
-#include <util/delay.h>
-#include <avr/wdt.h>
-#include <avr/sleep.h>
-#include "USI_TWI_Master.h"
-
-uint16_t dig_T1;
-int16_t dig_T2;
-int16_t dig_T3;
-uint16_t dig_P1;
-int16_t dig_P2;
-int16_t dig_P3;
-int16_t dig_P4;
-int16_t dig_P5;
-int16_t dig_P6;
-int16_t dig_P7;
-int16_t dig_P8;
-int16_t dig_P9;
-
-
-
-
-short bmp280ReadShort(unsigned char address)
-{
-       char msb, lsb;
-       short data;
-       I2c_StartCondition();
-       I2c_WriteByte(0xEC);
-       I2c_WriteByte(address);
-       I2c_StopCondition();
-       I2c_StartCondition();
-       I2c_WriteByte(0xED);
-       lsb=I2c_ReadByte(ACK);
-       msb=I2c_ReadByte(NO_ACK);
-       I2c_StopCondition();
-       
-
-       
-       data = msb << 8;
-       data |= lsb;
-       
-       return data;
-}
-
-void bmp280Init(void) {
-       dig_T1=bmp280ReadShort(0x88);
-       dig_T2=bmp280ReadShort(0x8A);
-       dig_T3=bmp280ReadShort(0x8C);
-       dig_P1=bmp280ReadShort(0x8E);
-       dig_P2=bmp280ReadShort(0x90);
-       dig_P3=bmp280ReadShort(0x92);
-       dig_P4=bmp280ReadShort(0x94);
-       dig_P5=bmp280ReadShort(0x96);
-       dig_P6=bmp280ReadShort(0x98);
-       dig_P7=bmp280ReadShort(0x9A);
-       dig_P8=bmp280ReadShort(0x9C);
-       dig_P9=bmp280ReadShort(0x9E);
-       I2c_StartCondition();
-       I2c_WriteByte(0xEC);
-       I2c_WriteByte(0xF4);
-       I2c_WriteByte(0b01010111); //2x Temp over 16x Press over   Normal mode
-       I2c_WriteByte(0b11100000);  //4s time / no IIfilter
-       I2c_StopCondition();
-       
-       
-}
-int32_t bmp280ReadTemp(void) {
-       uint8_t msb, lsb,xlsb;
-       volatile int32_t data;
-       I2c_StartCondition();
-       I2c_WriteByte(0xEC);
-       I2c_WriteByte(0xFA);
-       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;
-
-       
-}
-int32_t bmp280ReadPressure(uint8_t oss) {
-               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;
-       
-       
-       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;
-       *temperature=T;
-       int32_t adc_P= bmp280ReadPressure(oss);
-       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 bmp280Convert(double * temperature, double * pressure,uint8_t oss) {
-
-       uint32_t p;
-       int32_t T;
-       bmp280ConvertInt(&T,&p,oss);
-       *temperature=T/100.0;
-       *pressure=p/100.0;
-}
-               
-               
-               
-
-       
+#define F_CPU 8000000UL\r
+#include <avr/io.h>\r
+#include <avr/interrupt.h>\r
+#include <util/delay.h>\r
+#include <avr/wdt.h>\r
+#include <avr/sleep.h>\r
+#include "USI_TWI_Master.h"\r
+\r
+uint16_t dig_T1;\r
+int16_t dig_T2;\r
+int16_t dig_T3;\r
+uint16_t dig_P1;\r
+int16_t dig_P2;\r
+int16_t dig_P3;\r
+int16_t dig_P4;\r
+int16_t dig_P5;\r
+int16_t dig_P6;\r
+int16_t dig_P7;\r
+int16_t dig_P8;\r
+int16_t dig_P9;\r
+\r
+\r
+\r
+\r
+short bmp280ReadShort(unsigned char address)\r
+{\r
+       char msb, lsb;\r
+       short data;\r
+       I2c_StartCondition();\r
+       I2c_WriteByte(0xEC);\r
+       I2c_WriteByte(address);\r
+       I2c_StopCondition();\r
+       I2c_StartCondition();\r
+       I2c_WriteByte(0xED);\r
+       lsb=I2c_ReadByte(ACK);\r
+       msb=I2c_ReadByte(NO_ACK);\r
+       I2c_StopCondition();\r
+       \r
+\r
+       \r
+       data = msb << 8;\r
+       data |= lsb;\r
+       \r
+       return data;\r
+}\r
+\r
+void bmp280Init(void) {\r
+       dig_T1=bmp280ReadShort(0x88);\r
+       dig_T2=bmp280ReadShort(0x8A);\r
+       dig_T3=bmp280ReadShort(0x8C);\r
+       dig_P1=bmp280ReadShort(0x8E);\r
+       dig_P2=bmp280ReadShort(0x90);\r
+       dig_P3=bmp280ReadShort(0x92);\r
+       dig_P4=bmp280ReadShort(0x94);\r
+       dig_P5=bmp280ReadShort(0x96);\r
+       dig_P6=bmp280ReadShort(0x98);\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
+int32_t bmp280ReadTemp(void) {\r
+       uint8_t msb, lsb,xlsb;\r
+       volatile int32_t data;\r
+       I2c_StartCondition();\r
+       I2c_WriteByte(0xEC);\r
+       I2c_WriteByte(0xFA);\r
+       I2c_StopCondition();\r
+       I2c_StartCondition();\r
+       I2c_WriteByte(0xED);\r
+       msb=I2c_ReadByte(ACK);\r
+       lsb=I2c_ReadByte(ACK);\r
+       xlsb=I2c_ReadByte(NO_ACK);\r
+       I2c_StopCondition();\r
+               \r
+       data = (int32_t)msb << 12;\r
+       data |= (int16_t)lsb<<4;\r
+       data|=xlsb>>4;\r
+               \r
+               return data;\r
+\r
+       \r
+}\r
+int32_t bmp280ReadPressure(uint8_t oss) {\r
+               uint8_t msb, lsb,xlsb;\r
+               volatile int32_t data;\r
+               I2c_StartCondition();\r
+               I2c_WriteByte(0xEC);\r
+               I2c_WriteByte(0xF7);\r
+               I2c_StopCondition();\r
+               I2c_StartCondition();\r
+               I2c_WriteByte(0xED);\r
+               msb=I2c_ReadByte(ACK);\r
+               lsb=I2c_ReadByte(ACK);\r
+               xlsb=I2c_ReadByte(NO_ACK);\r
+               I2c_StopCondition();\r
+               \r
+               data = (int32_t)msb << 12;\r
+               data |= (int16_t)lsb<<4;\r
+               data|=xlsb>>4;\r
+               \r
+               return data;\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
+       \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
+       t_fine = var1 + var2;\r
+       T = (t_fine * 5 + 128) >> 8;\r
+       *temperature=T;\r
+       int32_t adc_P= bmp280ReadPressure(oss);\r
+       uint32_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
+       var2 = (var2>>2)+(((int32_t)dig_P4)<<16);\r
+       var1 = (((dig_P3 * (((var1>>2) * (var1>>2)) >> 13 )) >> 3) + ((((int32_t)dig_P2) * var1)>>1))>>18;\r
+       var1 =((((32768+var1))*((int32_t)dig_P1))>>15);\r
+       if (var1 == 0) {\r
+               return ; // avoid exception caused by division by zero\r
+       }\r
+       p = (((uint32_t)(((int32_t)1048576)-adc_P)-(var2>>12)))*3125;\r
+       if (p < 0x80000000){\r
+               p = (p << 1) / ((uint32_t)var1);\r
+               }else{\r
+               p = (p / (uint32_t)var1) * 2;\r
+       }\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
+}\r
+void bmp280Convert(double * temperature, double * pressure,uint8_t oss) {\r
+\r
+       uint32_t p;\r
+       int32_t T;\r
+       bmp280ConvertInt(&T,&p,oss);\r
+       *temperature=T/100.0;\r
+       *pressure=p/100.0;\r
+}\r
+               \r
+               \r
+               \r
+\r
+       \r