1 #define F_CPU 8000000UL
3 #include <avr/interrupt.h>
4 #include <util/delay.h>
7 #include "USI_TWI_Master.h"
25 short bmp280ReadShort(unsigned char address)
31 I2c_WriteByte(address);
35 lsb=I2c_ReadByte(ACK);
36 msb=I2c_ReadByte(NO_ACK);
47 void bmp280Init(void) {
48 dig_T1=bmp280ReadShort(0x88);
49 dig_T2=bmp280ReadShort(0x8A);
50 dig_T3=bmp280ReadShort(0x8C);
51 dig_P1=bmp280ReadShort(0x8E);
52 dig_P2=bmp280ReadShort(0x90);
53 dig_P3=bmp280ReadShort(0x92);
54 dig_P4=bmp280ReadShort(0x94);
55 dig_P5=bmp280ReadShort(0x96);
56 dig_P6=bmp280ReadShort(0x98);
57 dig_P7=bmp280ReadShort(0x9A);
58 dig_P8=bmp280ReadShort(0x9C);
59 dig_P9=bmp280ReadShort(0x9E);
63 I2c_WriteByte(0b01010111); //2x Temp over 16x Press over Normal mode
64 I2c_WriteByte(0b11100000); //4s time / no IIfilter
69 int32_t bmp280ReadTemp(void) {
70 uint8_t msb, lsb,xlsb;
71 volatile int32_t data;
78 msb=I2c_ReadByte(ACK);
79 lsb=I2c_ReadByte(ACK);
80 xlsb=I2c_ReadByte(NO_ACK);
83 data = (int32_t)msb << 12;
84 data |= (int16_t)lsb<<4;
91 int32_t bmp280ReadPressure(uint8_t oss) {
92 uint8_t msb, lsb,xlsb;
93 volatile int32_t data;
100 msb=I2c_ReadByte(ACK);
101 lsb=I2c_ReadByte(ACK);
102 xlsb=I2c_ReadByte(NO_ACK);
105 data = (int32_t)msb << 12;
106 data |= (int16_t)lsb<<4;
113 void bmp280ConvertInt(int32_t * temperature,uint32_t *pressure,uint8_t oss) {
114 int32_t var1,var2,T,t_fine;
117 int32_t adc_T=bmp280ReadTemp();
118 var1 = ((((adc_T>>3) - ((int32_t)dig_T1<<1))) * ((int32_t)dig_T2)) >> 11;
119 var2 = ((((((adc_T>>4) - ((int32_t)dig_T1)) * ((adc_T>>4) - (int32_t)dig_T1))) >> 12) *((int32_t)dig_T3)) >> 14;
120 t_fine = var1 + var2;
121 T = (t_fine * 5 + 128) >> 8;
123 int32_t adc_P= bmp280ReadPressure(oss);
125 var1 = (((int32_t)t_fine)>>1) - (int32_t)64000;
126 var2 = (((var1>>2) * (var1>>2)) >> 11 ) * ((int32_t)dig_P6);
127 var2 = var2 + ((var1*((int32_t)dig_P5))<<1);
128 var2 = (var2>>2)+(((int32_t)dig_P4)<<16);
129 var1 = (((dig_P3 * (((var1>>2) * (var1>>2)) >> 13 )) >> 3) + ((((int32_t)dig_P2) * var1)>>1))>>18;
130 var1 =((((32768+var1))*((int32_t)dig_P1))>>15);
132 return ; // avoid exception caused by division by zero
134 p = (((uint32_t)(((int32_t)1048576)-adc_P)-(var2>>12)))*3125;
136 p = (p << 1) / ((uint32_t)var1);
138 p = (p / (uint32_t)var1) * 2;
140 var1 = (((int32_t)dig_P9) * ((int32_t)(((p>>3) * (p>>3))>>13)))>>12;
141 var2 = (((int32_t)(p>>2)) * ((int32_t)dig_P8))>>13;
142 p = (uint32_t)((int32_t)p + ((var1 + var2 + dig_P7) >> 4));
146 void bmp280Convert(double * temperature, double * pressure,uint8_t oss) {
150 bmp280ConvertInt(&T,&p,oss);
151 *temperature=T/100.0;