سلام دوستان
بنده ماژول bmp180 تهیه کردم و با توجه به نمون های موجود تا حالا قادر به راه اندازی آن نشدم . در فوروم هم نمونه هایی برای bmp085 هست که حتی با کدویژن که کار میکنم با ان کدها ارور میدهد . در هر صورت از منابع خارجی به این کد رسیدم که به نظر کارامد هست . لطفا بررسی نمایید و کد را برای این که در lcd فشار را نمایش دهد تغییر نمایید. بسیار ممنونم
بنده ماژول bmp180 تهیه کردم و با توجه به نمون های موجود تا حالا قادر به راه اندازی آن نشدم . در فوروم هم نمونه هایی برای bmp085 هست که حتی با کدویژن که کار میکنم با ان کدها ارور میدهد . در هر صورت از منابع خارجی به این کد رسیدم که به نظر کارامد هست . لطفا بررسی نمایید و کد را برای این که در lcd فشار را نمایش دهد تغییر نمایید. بسیار ممنونم
کد:
// Global defines
#define F_CPU 8000000UL
#define BAUD 9600
#define UBRR_VAL (F_CPU/16/BAUD-1)
// Includes
#include <avr/io.h>
#include <util/twi.h>
#include <util/delay.h>
#include <math.h>
#include <stdio.h>
#include "i2cmaster.h"
// Macros
#define setbit(port, bit) ((port) |= (1<<bit));
#define clearbit(port, bit) ((port) &= ~(1<<bit));
#define togglebit(port, bit) ((port) ^= (1<<bit));
// Status LED Defines
#define STATUS_LED_PORT PORTC
#define STATUS_LED_PIN PORTC3
//BMP180 Defines and Variables
#define BMP180_ADDR 0b11101110
#define BMP180_WRITE (BMP180_ADDR|TW_WRITE)
#define BMP180_READ (BMP180_ADDR|TW_READ)
#define BMP180_AC1_MSB 0xAA
#define BMP180_AC1_LSB 0xAB
#define BMP180_AC2_MSB 0xAC
#define BMP180_AC2_LSB 0xAD
#define BMP180_AC3_MSB 0xAE
#define BMP180_AC3_LSB 0xAF
#define BMP180_AC4_MSB 0xB0
#define BMP180_AC4_LSB 0xB1
#define BMP180_AC5_MSB 0xB2
#define BMP180_AC5_LSB 0xB3
#define BMP180_AC6_MSB 0xB4
#define BMP180_AC6_LSB 0xB5
#define BMP180_B1_MSB 0xB6
#define BMP180_B1_LSB 0xB7
#define BMP180_B2_MSB 0xB8
#define BMP180_B2_LSB 0xB9
#define BMP180_MB_MSB 0xBA
#define BMP180_MB_LSB 0xBB
#define BMP180_MC_MSB 0xBC
#define BMP180_MC_LSB 0xBD
#define BMP180_MD_MSB 0xBE
#define BMP180_MD_LSB 0xBF
const unsigned char OSS = 0b11;
short AC1, AC2, AC3, B1, B2, MB, MC, MD;
unsigned short AC4, AC5, AC6;
long B5;
//Set up printf
static int uart_putchar(char c, FILE *stream);
static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE);
//////////////////////////// Functions ////////////////////////////
//////////////////////////// Generic Setup ////////////////////////////
int uart_putchar(char c, FILE *stream)
{
if (c == '\n') uart_putchar('\r', stream);
loop_until_bit_is_set(UCSR0A, UDRE0);
UDR0 = c;
return 0;
}
void IOInit(void)
{
//Set up status LED
setbit(DDRC, STATUS_LED_PIN);
clearbit(STATUS_LED_PORT, STATUS_LED_PIN);
//Set USART baud rate to 9600
UBRR0 = UBRR_VAL;
UCSR0B = (1<<RXEN0)|(1<<TXEN0);
//Initialize printf
stdout = &mystdout;
}
void i2c_error(void)
{
printf("Unspecified I2C Error. Going into while(1) loop.");
while(1);
}
//////////////////////////// BMP180 Pressure Sensor ////////////////////////////
uint8_t getDataFromBMP180Register(uint8_t loc)
{
uint8_t data;
i2c_start_wait(BMP180_WRITE);
i2c_write(loc);
i2c_rep_start(BMP180_READ);
data = i2c_readNak();
i2c_stop();
return data;
}
void calibrate_bmp180(void)
{
AC1 = (getDataFromBMP180Register(BMP180_AC1_MSB)<<8) + getDataFromBMP180Register(BMP180_AC1_LSB);
AC2 = (getDataFromBMP180Register(BMP180_AC2_MSB)<<8) + getDataFromBMP180Register(BMP180_AC2_LSB);
AC3 = (getDataFromBMP180Register(BMP180_AC3_MSB)<<8) + getDataFromBMP180Register(BMP180_AC3_LSB);
AC4 = (getDataFromBMP180Register(BMP180_AC4_MSB)<<8) + getDataFromBMP180Register(BMP180_AC4_LSB);
AC5 = (getDataFromBMP180Register(BMP180_AC5_MSB)<<8) + getDataFromBMP180Register(BMP180_AC5_LSB);
AC6 = (getDataFromBMP180Register(BMP180_AC6_MSB)<<8) + getDataFromBMP180Register(BMP180_AC6_LSB);
B1 = (getDataFromBMP180Register(BMP180_B1_MSB)<<8) + getDataFromBMP180Register(BMP180_B1_LSB);
B2 = (getDataFromBMP180Register(BMP180_B2_MSB)<<8) + getDataFromBMP180Register(BMP180_B2_LSB);
MB = (getDataFromBMP180Register(BMP180_MB_MSB)<<8) + getDataFromBMP180Register(BMP180_MB_LSB);
MC = (getDataFromBMP180Register(BMP180_MC_MSB)<<8) + getDataFromBMP180Register(BMP180_MC_LSB);
MD = (getDataFromBMP180Register(BMP180_MD_MSB)<<8) + getDataFromBMP180Register(BMP180_MD_LSB);
}
long getUcTemp(void)
{
long UT;
i2c_start_wait(BMP180_WRITE);
if (i2c_write(0xF4)) i2c_error();
if (i2c_write(0x2E)) i2c_error();
i2c_stop();
_delay_ms(5);
UT = ((getDataFromBMP180Register(0xF6))<<8) + (getDataFromBMP180Register(0xF7));
return UT;
}
short getTrueTemp(long UT)
{
long X1, X2, T; // B5 declared globally
X1 = (((long)UT-(long)AC6)*(long)AC5)>>15;
X2 = ((long)MC << 11)/(X1 + MD);
B5 = X1 + X2;
T = (B5+8)>>4;
return T;
}
unsigned long getUcPressure(void)
{
unsigned long UP;
unsigned char MSB, LSB, XLSB;
i2c_start_wait(BMP180_WRITE);
if (i2c_write(0xF4)) i2c_error();
if (i2c_write(0x34+(OSS<<6))) i2c_error();
i2c_stop();
_delay_ms(28);
MSB = getDataFromBMP180Register(0xF6);
LSB = getDataFromBMP180Register(0xF7);
XLSB = getDataFromBMP180Register(0xF8);
UP = (((unsigned long)MSB<<16) | ((unsigned long)LSB<<8) | ((unsigned long)XLSB)) >> (8-OSS);
return UP;
}
long getTruePressure(unsigned long UP)
{
long X1, X2, X3, B3, B6, p; // B5 declared globally. Must run getTemp() just before getPressure().
unsigned long B4, B7;
B6 = B5 - 4000;
X1 = (B2 * (B6 * B6)>>12)>>11;
X2 = (AC2 * B6)>>11;
X3 = X1 + X2;
B3 = (((((long)AC1)*4 + X3)<<OSS)+2)>>2;
X1 = (AC3 * B6)>>13;
X2 = (B1 * ((B6*B6)>>12))>>16;
X3 = ((X1+X2)+2)>>2;
B4 = (AC4 * (unsigned long)(X3 + 32768))>>15;
B7 = ((unsigned long)UP-B3)*(50000>>OSS);
if (B7<0x80000000UL) p = (B7<<1)/B4;
else p = (B7/B4)<<1;
X1 = (p>>8) * (p>>8);
X1 = (X1*3038)>>16;
X2 = (-7357*p)>>16;
p += (X1 + X2 + 3791)>>4;
return p;
}
long getPressure(void) // Returns pressure in Pascals
{
return getTruePressure(getUcPressure());
}
short getTemp(void) // Returns temperature in degrees C
{
return getTrueTemp(getUcTemp());
}
long getAltitude(void) // in feet
{
static long SLP = 101020; // Pa (get from local airport altimeter setting)
long altitude;
altitude = (float)44330 * (1-pow((float)getPressure()/SLP, (1/5.255)));
altitude *= 3.2808399; // Meters to feet
return (long)altitude;
}
//////////////////////////// Main ////////////////////////////
int main(void)
{
// Initialization and calibration
IOInit();
calibrate_bmp180();
while(1)
{
printf("Temperature in degrees C: %d\n", getTemp());
printf("Pressure in Pa: %ld\n", getPressure());
printf("Altitude in ft: %ld\n\n", getAltitude());
_delay_ms(1000);
}
}
کد:
http://www.avrfreaks.net/forum/bmp180-pressure-sensor-giving-pressure-thats-too-low

