اطلاعیه

Collapse
No announcement yet.

درخواست راهنمایی

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    درخواست راهنمایی

    سلام دوستان

    بنده ماژول 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
لطفا صبر کنید...
X