TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: Rseliman en 03 de Junio de 2013, 14:44:20

Título: Leyendo BMP085(sensor presion) en xc8
Publicado por: Rseliman en 03 de Junio de 2013, 14:44:20
Hola Amigos ....hace ya un tiempo que vengo tratando de armar una subrutina para leer el sensor de bosch BMP085 por i2c ....y primero me encontre con problemas de i2c ...aparentemente estan solucionados ....estoy usando un pic16f819 ....programo en mplabx ...la libreria  i2c compila ...no se si funciona todavia pero compila , ahora tengo una libreria del BMP085 ....y seguramente por mi falta de experiencia me encuentro con errores del tipo illegal conversion between types  non-scalar types can't be converted to other types

los errores estan en estas lineas

 msb=i2c_read(0); // Leer la direccion

 lsb=i2c_read(0); // Read address


les paso el codigo a ver si me pueden dar una mano ...muchas gracias


i2c.c

Código: [Seleccionar]
#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
#include "delay.h"
#include <delays.h>
#include "i2c.h"


#define SDA_PIN PORTBbits.RB1 //
#define SCL_PIN PORTBbits.RB4 //

#define SDA_DIR TRISBbits.TRISB1
#define SCL_DIR TRISBbits.TRISB4



// Common I2C Routines

void i2c_restart(void)
{
i2c_low_scl(); /* ensure clock is low */
i2c_high_scl(); /* ensure data is high */
SCL_DIR = 1;                        /* clock pulse high */
i2c_low_sda(); /* the high->low transition */
return;
}


void i2c_read(unsigned short r_byte)
{
   int  n;
   i2c_high_sda();
   for (n=0; n<8; n++)
   {
      i2c_high_scl();

      if (SDA_PIN)
      {
         r_byte = (r_byte << 1) | 0x01; // msbit first
      }
      else
      {
         r_byte = r_byte << 1;
      }
      i2c_low_scl();
   }
   return;
}

void i2c_write(signed char w_byte)

{
    int m ;
   for(m=0; m<8; m++)
   {
      if(w_byte&0x80)
      {
         i2c_high_sda();
      }
      else
      {
         i2c_low_sda();
      }
      i2c_high_scl();
      i2c_low_scl();
      w_byte = w_byte << 1;
   }
   i2c_high_sda();
}

void i2c_nack(void)
{
   i2c_high_sda(); // data at one
   i2c_high_scl(); // clock pulse
   i2c_low_scl();
}

void i2c_ack(void)
{
   i2c_low_sda(); // bring data low and clock
   i2c_high_scl();
   i2c_low_scl();
   i2c_high_sda();
}


void i2c_start(void)
{
   i2c_low_scl();
   i2c_high_sda();
   i2c_high_scl(); // bring SDA low while SCL is high
   i2c_low_sda();
   i2c_low_scl();
}

void i2c_stop(void)
{
   i2c_low_scl();
   i2c_low_sda();
   i2c_high_scl();
   i2c_high_sda();  // bring SDA high while SCL is high
   // idle is SDA high and SCL high
}

void i2c_high_sda(void)
{
   // bring SDA to high impedance
   SDA_DIR = 1;
   DelayUs(5);
}

void i2c_low_sda(void)
{
   SDA_PIN = 0;
   SDA_DIR = 0;  // output a hard logic zero
   DelayUs(5);
}

void i2c_high_scl(void)
{
   SCL_DIR = 1;   // high impedance
   DelayUs(5);
}

void i2c_low_scl(void)
{
   SCL_PIN = 0;
   SCL_DIR = 0;
   DelayUs(5);
}




BMP085.c

Código: [Seleccionar]
/************************************************************************
* Defines ***** Definiciones *
************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include "delay.h"
#include <delays.h>
#include <xc.h>
#include "BMP085.h"
#define BMP085_R 0xEF // Write address
#define BMP085_W 0xEE // Read address
#define OSS 0 // Oversampling Setting

/************************************************************************
* Globar Vars and Constants ***** Variables y Constates globales *
************************************************************************/
const unsigned char OSS_conversion_time[] = {5, 8, 14, 26};

signed short ac1;
signed short ac2;
signed short ac3;
signed short b1;
signed short b2;
signed short mb;
signed short mc;
signed short md;
unsigned short ac4;
unsigned short ac5;
unsigned short ac6;
signed char but,bup;
unsigned char shift;


/************************************************************************
* Function Prototypes *
************************************************************************/

void BMP085_Calibration(void);
long bmp085Read2Bytes(unsigned char address);
unsigned long bmp085Read3Bytes(unsigned char address);
long bmp085ReadTemp(void);
long bmp085ReadPressure(void);
void bmp085Convert(long *temperature, long *pressure,unsigned char readings);




/************************************************************************
* *
* Purpose: Will read two (or 3) sequential 8-bit registers, *
* and Return a 16-bit value. *
* Proposito: Leer 2 registros de 8 bits secuenciales y regresar *
* un valor de 16bits. *
* Passed: Address - Unsigned char *
* Argumento: Direccion *
* Returned: Reading - Long *
* Retorno: Lectura *
* Note: Return value must be typecast to an signed short *
* if reading a signed value! *
* *
************************************************************************/

long bmp085Read2Bytes(unsigned char address)
{
   unsigned short msb, lsb;
   long data=0;

   delay_ms(10);

   i2c_start();
   i2c_write(BMP085_W); // Escribir la direccion del sensor
   i2c_write(address); // Direccion de memoria
   i2c_start(); // Reinicio
   i2c_write(BMP085_R); // Direccion para leer del sensor
   msb = i2c_read(0); // Leer la direccion
   delay_ms(10);
   i2c_stop(); // Parar

   delay_ms(10);

   i2c_start();
   i2c_write(BMP085_W); // Write required to clock in address
   i2c_write(address+1); // Mem address
   i2c_start(); // Restart
   i2c_write(BMP085_R); // Device address for reading
   lsb=i2c_read(0); // Read address
   delay_ms(10);
   i2c_stop(); // Stop

   data = msb << 8;
   data = data | lsb;

   return data;
}

unsigned long bmp085Read3Bytes(unsigned char address)
{
   unsigned short msb,lsb,xlsb;
   unsigned long data=0;

   delay_ms(10);

   i2c_start();
   i2c_write(BMP085_W); // Escribir la direccion del sensor
   i2c_write(address); // Direccion de memoria
   i2c_start(); // Reinicio
   i2c_write(BMP085_R); // Direccion para leer del sensor
   msb=i2c_read(0); // Leer la direccion
   delay_ms(10);
   i2c_stop(); // Parar



   delay_ms(10);

   i2c_start();
   i2c_write(BMP085_W); // Write required to clock in address
   i2c_write(address+1); // Mem address
   i2c_start(); // Restart
   i2c_write(BMP085_R); // Device address for reading
   lsb=i2c_read(0); // Read address
   delay_ms(10);
   i2c_stop(); // Stop

   delay_ms(10);

   i2c_start();
   i2c_write(BMP085_W); // Write required to clock in address
   i2c_write(address+2); // Mem address
   i2c_start(); // Restart
   i2c_write(BMP085_R); // Device address for reading
   xlsb=i2c_read(0); // Read address
   delay_ms(10);
   i2c_stop(); // Stop





   data = (msb << 8);
   data = (data | lsb);
   data = (data << 8);
   data = (data | xlsb);
   data = (data >> (8-OSS));


   return data;
}
/************************************************************************
*
* Purpose: Calibrates the BMP085 pressure sensor.
* Passed: Void
* Returned: Void
* Note:
*
************************************************************************/
void BMP085_Calibration(void)
{
  /* ac1 = 6690;
ac2 = -1227;
ac3 = -14421;
ac4 = 33898;
ac5 = 24422;
ac6 = 22886;
b1 = 5498;
b2 = 66;
mb = -32768;
mc = -11075;
md = 2432;
*/
   ac1 = bmp085Read2Bytes(0xAA);
   ac2 = bmp085Read2Bytes(0xAC);
   ac3 = bmp085Read2Bytes(0xAE);
   ac4 = bmp085Read2Bytes(0xB0);
   ac5 = bmp085Read2Bytes(0xB2);
   ac6 = bmp085Read2Bytes(0xB4);
   b1 = bmp085Read2Bytes(0xB6);
   b2 = bmp085Read2Bytes(0xB8);
   mb = bmp085Read2Bytes(0xBA);
   mc = bmp085Read2Bytes(0xBC);
   md = bmp085Read2Bytes(0xBE);
/*
printf("%Ld \n",ac1);
printf("%Ld \n",ac2);
printf("%Ld \n",ac3);
printf("%Lu \n",ac4);
printf("%Lu \n",ac5);
printf("%Lu \n",ac6);
printf("%Ld \n",b1);
printf("%Ld \n",b2);
printf("%Ld \n",mb);
printf("%Ld \n",mc);
printf("%Ld \n",md);
*/
}


/************************************************************************
*
* Purpose: Will read the 16-bit temperature value of BMP085 sensor.
* Passed: Void
* Returned: Long
* Note:
*
************************************************************************/
long bmp085ReadTemp(void)
{
   i2c_start();

   i2c_write(BMP085_W); // Write 0xEE
   i2c_write(0xF4); // Write register address
   i2c_write(0x2E); // Write register data for temp

   i2c_stop();

   delay_ms(10); // Max time is 4.5ms

   return bmp085Read2Bytes(0xF6);
}

/************************************************************************
*
* Purpose: Will read the 16-bit pressure value from BMP085 sensor.
* Passed: Void
* Returned: Long
* Note:
*
************************************************************************/
unsigned long bmp085ReadPressure(void)
{
   i2c_start();

   i2c_write(BMP085_W); // Write 0xEE
   i2c_write(0xF4); // Write register address
   i2c_write(0x34 | (OSS << 6)); // Write register data for temp

   i2c_stop();

   delay_ms(OSS_conversion_time[OSS]); // Max time is 4.5ms

   return bmp085Read3Bytes(0xF6);

}

/************************************************************************
*
* Purpose: Will find callibrated pressure + temperature
* Passed: Long *temperature, long *pressure, unsigned char readings
* Returned: Void
* Note:
*
************************************************************************/

// The bit-shift for possibly negative numbers.
// Note that divide has a higher precedence than
// bit shift, so this is not precisely the same.

void bmp085Convert(float *temperature, float *pressure)
{
   unsigned long ut,up;
   //float32 b5, b6, x3, b3, p, b4, b7;
   signed long aux1,aux2,aux3,aux4;

   signed long c3,c4,c5,c6,bb1,mmc,mmd,x,x0,x1,x2,y,y0,y1,y2,p0,p1,p2,z,s,alpha,temp,pres;

   ut = bmp085ReadTemp();
   ut = bmp085ReadTemp();
   up = bmp085ReadPressure();
   up = bmp085ReadPressure();

   //ut = 0x7B50;
   //up = 0x883F;
   //printf("%LX \n",ut);
   //printf("%LX \n",up);

   //but = ut; //Debug var

/*NEW CALCS*/

   c3 = 160*pow(2,-15)*ac3;
   c4 = pow(10,-3)*pow(2,-15)*ac4;
   bb1 = 25600*pow(2,-30)*b1;

   //printf("%e \n",c3);
   //printf("%e \n",c4);
   //printf("%e \n",bb1);

   c5 = ac5*pow(2,-15)/160;
   c6 = ac6;
   mmc = (0.08)*mc;
   mmd = md/160;

   //printf("%e \n",c5);
   //printf("%e \n",c6);
   //printf("mmc\n");
   //printf("%e \n",mmc);
   //printf("%e \n",mmd);

   x0 = ac1;
   x1 = 160*pow(2,-13)*ac2;
   x2 = 25600*pow(2,-25)*b2;

   //printf("%e \n",x0);
   //printf("%e \n",x1);
   //printf("%e \n",x2);

   y0 = c4*32768;
   y1 = c4*c3;
   y2 = c4*bb1;

   //printf("%e \n",y0);
   //printf("%e \n",y1);
   //printf("%e \n",y2);

   p0 = 3783/1600;
   p1 = 1-7357*pow(2,-20);
   p2 = 3038*100*pow(2,-36);

   //printf("%e \n",p0);
   //printf("%e \n",p1);
   //printf("%e \n",p2);

   /*Calculamos temperatura*/
   alpha = c5*(ut-c6);
   temp = alpha + (mmc/(alpha+mmd));


   /*Calculamos presion*/
   s = temp - 25;
   x = x2*s*s+x1*s+x0;
   y = y2*s*s+y1*s+y0;
   z = (up-x)/y;
   pres = p2*z*z+p1*z+p0;



   *temperature = temp;
   *pressure = pres;


/**/


/****************BEGIN*****CALC*****TEMP*********************/

/*
aux1 = ut-ac6;
aux2 = aux1*ac5;
x1 = aux2/32768;
//x1 = ((ut - ac6) * ac5 / pow(2,15));
aux3 = x1+md;
aux4 = mc/aux3;
x2 = aux4*2048;
//x2 = (mc * (pow(2,11))) / (x1 + md);
b5 = x1 + x2;
*temperature = ((b5 + 8) / 16);

/****************END*****CALC*****TEMP***********************/


/****************BEGIN*****CALC*****PRES*********************/
/*

up = up >> (8-OSS);
//bup = up; //Debug var
b6 = b5 - 4000;
aux1 = b6*b6;
aux2 = aux1/4096;
aux3 = aux2*b2;
x1 = aux3/2048;
//x1 = (b2 * (b6 * b6 / pow(2,12))) / pow(2,11);
aux1 = ac2*b6;
x2 = aux1/2048;
//x2 = ac2 * b6 / pow(2,11);
x3 = x1 + x2;

aux1 = ac1*4;
aux2 = aux1+x3;
shift = aux2;
aux3 = shift << OSS;
aux4 = aux3+2;
b3 = aux4/4;
//b3 = ((((ac1 * 4) + x3) << OSS) + 2) / 4;
aux1 = ac3*b6;
x1 = aux1/8192;
//x1 = ac3 * b6 / pow(2,13);
aux1 = b6*b6;
aux2 = aux1/4096;
aux3 = aux2*b1;
x2 = aux3/65536;
//x2 = (b1 * (b6 * b6 / pow(2,12))) / pow(2,16);
aux1 = x1+x2+2;
x3 = aux1/4;
//x3 = ((x1 + x2) + 2) / pow(2,2);
aux1 = x3+32768;
aux2 = ac4*aux1;
b4 = aux2/32768;
//b4 = (ac4 * (unsigned long) (x3 + 32768)) / pow(2,15);
aux1 = up-b3;
aux2 = 50000>>OSS;
b7 = aux1*aux2;
//b7 = ((unsigned long) up - b3) * (50000 >> OSS);
if (b7 < 0x80000000)
{
aux1 = b7*2;
p = aux1/b4;
}
else
{
aux1 = b7/b4;
p = aux1*2;
}

aux1 = p/256;
x1 = aux1*aux1;
//x1 = p / pow(2,8);
//x1 *= x1;
aux2 = x1*3038;
x1 = aux2/65536;
//x1 = (x1 * 3038) / pow(2,16);
aux1 = -7357*p;
x2 = aux1/65536;
//x2 = (-7357 * p) / pow(2,16);
aux1 = x1+x2+3791;
aux2 = aux1/16;
p = p+aux2;
*pressure = p;
/****************END*****CALC*****PRES***********************/
}
Título: Re: Leyendo BMP085(sensor presion) en xc8
Publicado por: AngelGris en 03 de Junio de 2013, 15:15:50
Si te fijas bien, i2c_read está definida como una función que no devuelve valor

Código: C
  1. void funcion(xxxx)

Justamente delante del nombre de la función se indica el tipo de valor que devuelve..

Sin embargo es una función a la cual se le pasa un parámetro -ya que está indicado dentro del paréntesis- y, es casi seguro, que usa esa misma variable para devolver el valor.

Por lo tanto deberías probar de escribir tu código así...

Código: C
  1. i2c_read(msb);
  2. i2c_read(lsb);

supongo que entre ambas lecturas deberás intercalar i2c_ack() para indicarle al dispositivo que el micro recibió el dato y está listo para recibir el siguiente. Quedando algo así

Código: C
  1. i2c_read(msb);
  2. i2c_ack();
  3. i2c_read(lsb);
Título: Re: Leyendo BMP085(sensor presion) en xc8
Publicado por: Rseliman en 03 de Junio de 2013, 16:58:01
Gracias AngelGris ...logre que compile ...solo me da warnings --warning: local variable "_msb" is used but never given a value

si mal no recuerdo esto sucede porque la variable lsb y msb estan declaradas pero no tienen valor ?? no recuedo como se soluciona ....era haciendolas cero al principio ???

Muchas gracias
Título: Re: Leyendo BMP085(sensor presion) en xc8
Publicado por: AngelGris en 03 de Junio de 2013, 21:56:06
  Rseliman, estoy releyendo tus post y me encuentro con una duda... ¿las rutinas de I2C las has hecho tu?

  Me parece que hay un error. De hecho, creo que i2c_read() nunca funcionaría. Sinceramente me has hecho dudar  :oops: pero creo que la única forma que tiene una función para devolver un valor es definiendola para que devuelva

por ejemplo
Código: C
  1. unsigned char i2c_read();

o manejar una variable global y modificarla dentro de la función.
Título: Re: Leyendo BMP085(sensor presion) en xc8
Publicado por: Rseliman en 03 de Junio de 2013, 22:20:26
  Rseliman, estoy releyendo tus post y me encuentro con una duda... ¿las rutinas de I2C las has hecho tu?

  Me parece que hay un error. De hecho, creo que i2c_read() nunca funcionaría. Sinceramente me has hecho dudar  :oops: pero creo que la única forma que tiene una función para devolver un valor es definiendola para que devuelva

por ejemplo
Código: C
  1. unsigned char i2c_read();

o manejar una variable global y modificarla dentro de la función.

Como estas AngelGris ...la rutina i2c las he estado buscando por todos lados y la verdad es que para xc8 hay muy poco de todo ...asi que esta rutina es una mezcla de lo que encontre .......no se si funcionara todavia ...no la he probado ...pero al menos queria hacer algo para desp sobre la marcha ir modificando lo que no funcione ...voy a tener en cuenta lo que me decis ...y ovbiamente te voy a seguir consultando sobre la marcha ...a ver que sale de todo esto ...por lo menos para que alguien que busque i2c para xc8 encuentre !!!

Gracias
Título: Re: Leyendo BMP085(sensor presion) en xc8
Publicado por: Rseliman en 04 de Junio de 2013, 13:58:51
Bueno paso en limpio como va esto ....


bmp085.c

Código: [Seleccionar]
/************************************************************************
* *
* Module: BMP085.c *
* Description: BMP085-specific code. *
* *
* *
* Date: Authors: Comments: *
* 18 Feb 2012 Jose Morales Created *
* *
* *
************************************************************************/


/************************************************************************
* Defines ***** Definiciones *
************************************************************************/

#include "math.h"
#include "i2c.h"
#define BMP085_R 0xEF // Write address
#define BMP085_W 0xEE // Read address
#define OSS 0 // Oversampling Setting

/************************************************************************
* Globar Vars and Constants ***** Variables y Constates globales *
************************************************************************/
const unsigned char OSS_conversion_time[] = {5, 8, 14, 26};

signed short ac1;
signed short ac2;
signed short ac3;
signed short b1;
signed short b2;
signed short mb;
signed short mc;
signed short md;
unsigned short ac4;
unsigned short ac5;
unsigned short ac6;
signed char but,bup;
unsigned char shift;


/************************************************************************
* Function Prototypes *
************************************************************************/

//void BMP085_Calibration(void);
//long bmp085Read2Bytes(unsigned char address);
//unsigned long bmp085Read3Bytes(unsigned char address);
//long bmp085ReadTemp(void);
//unsigned long bmp085ReadPressure(void);
//void bmp085Convert(signed long *temperature, signed long *pressure);




/************************************************************************
* *
* Purpose: Will read two (or 3) sequential 8-bit registers, *
* and Return a 16-bit value. *
* Proposito: Leer 2 registros de 8 bits secuenciales y regresar *
* un valor de 16bits. *
* Passed: Address - Unsigned char *
* Argumento: Direccion *
* Returned: Reading - Long *
* Retorno: Lectura *
* Note: Return value must be typecast to an signed short *
* if reading a signed value! *
* *
************************************************************************/

long bmp085Read2Bytes(unsigned char address)
{
   unsigned short msb, lsb;
   msb,lsb = 0;
   long data=0;

   delay_ms(10);

   i2c_start();
   i2c_write(BMP085_W); // Escribir la direccion del sensor
   i2c_write(address); // Direccion de memoria
   i2c_start(); // Reinicio
   i2c_write(BMP085_R); // Direccion para leer del sensor
   i2c_read(msb); // Leer la direccion
   delay_ms(10);
   i2c_stop(); // Parar

   delay_ms(10);

   i2c_start();
   i2c_write(BMP085_W); // Write required to clock in address
   i2c_write(address+1); // Mem address
   i2c_start(); // Restart
   i2c_write(BMP085_R); // Device address for reading
   i2c_read(lsb); // Read address
   delay_ms(10);
   i2c_stop(); // Stop

   data = msb << 8;
   data = data | lsb;

   return data;
}

unsigned long bmp085Read3Bytes(unsigned char address)
{
   unsigned short msb,lsb,xlsb;
   unsigned long data=0;

   delay_ms(10);

   i2c_start();
   i2c_write(BMP085_W); // Escribir la direccion del sensor
   i2c_write(address); // Direccion de memoria
   i2c_start(); // Reinicio
   i2c_write(BMP085_R); // Direccion para leer del sensor
   i2c_read(msb); // Leer la direccion
   delay_ms(10);
   i2c_stop(); // Parar



   delay_ms(10);

   i2c_start();
   i2c_write(BMP085_W); // Write required to clock in address
   i2c_write(address+1); // Mem address
   i2c_start(); // Restart
   i2c_write(BMP085_R); // Device address for reading
   i2c_read(lsb); // Read address
   delay_ms(10);
   i2c_stop(); // Stop

   delay_ms(10);

   i2c_start();
   i2c_write(BMP085_W); // Write required to clock in address
   i2c_write(address+2); // Mem address
   i2c_start(); // Restart
   i2c_write(BMP085_R); // Device address for reading
   i2c_read(xlsb); // Read address
   delay_ms(10);
   i2c_stop(); // Stop





   data = (msb << 8);
   data = (data | lsb);
   data = (data << 8);
   data = (data | xlsb);
   data = (data >> (8-OSS));


   return data;
}
/************************************************************************
*
* Purpose: Calibrates the BMP085 pressure sensor.
* Passed: Void
* Returned: Void
* Note:
*
************************************************************************/
void BMP085_Calibration(void)
{
  /* ac1 = 6690;
ac2 = -1227;
ac3 = -14421;
ac4 = 33898;
ac5 = 24422;
ac6 = 22886;
b1 = 5498;
b2 = 66;
mb = -32768;
mc = -11075;
md = 2432;
*/
   ac1 = bmp085Read2Bytes(0xAA);
   ac2 = bmp085Read2Bytes(0xAC);
   ac3 = bmp085Read2Bytes(0xAE);
   ac4 = bmp085Read2Bytes(0xB0);
   ac5 = bmp085Read2Bytes(0xB2);
   ac6 = bmp085Read2Bytes(0xB4);
   b1 = bmp085Read2Bytes(0xB6);
   b2 = bmp085Read2Bytes(0xB8);
   mb = bmp085Read2Bytes(0xBA);
   mc = bmp085Read2Bytes(0xBC);
   md = bmp085Read2Bytes(0xBE);
/*
printf("%Ld \n",ac1);
printf("%Ld \n",ac2);
printf("%Ld \n",ac3);
printf("%Lu \n",ac4);
printf("%Lu \n",ac5);
printf("%Lu \n",ac6);
printf("%Ld \n",b1);
printf("%Ld \n",b2);
printf("%Ld \n",mb);
printf("%Ld \n",mc);
printf("%Ld \n",md);
*/
}


/************************************************************************
*
* Purpose: Will read the 16-bit temperature value of BMP085 sensor.
* Passed: Void
* Returned: Long
* Note:
*
************************************************************************/
long bmp085ReadTemp(void)
{
   i2c_start();

   i2c_write(BMP085_W); // Write 0xEE
   i2c_write(0xF4); // Write register address
   i2c_write(0x2E); // Write register data for temp

   i2c_stop();

   delay_ms(10); // Max time is 4.5ms

   return bmp085Read2Bytes(0xF6);
}

/************************************************************************
*
* Purpose: Will read the 16-bit pressure value from BMP085 sensor.
* Passed: Void
* Returned: Long
* Note:
*
************************************************************************/
unsigned long bmp085ReadPressure(void)
{
   i2c_start();

   i2c_write(BMP085_W); // Write 0xEE
   i2c_write(0xF4); // Write register address
   i2c_write(0x34 | (OSS << 6)); // Write register data for temp

   i2c_stop();

   delay_ms(OSS_conversion_time[OSS]); // Max time is 4.5ms

   return bmp085Read3Bytes(0xF6);

}

/************************************************************************
*
* Purpose: Will find callibrated pressure + temperature
* Passed: Long *temperature, long *pressure, unsigned char readings
* Returned: Void
* Note:
*
************************************************************************/

// The bit-shift for possibly negative numbers.
// Note that divide has a higher precedence than
// bit shift, so this is not precisely the same.

void bmp085Convert(float long *temperature, float long *pressure)
{
   unsigned long ut,up;
   //float32 b5, b6, x3, b3, p, b4, b7;
   signed long aux1,aux2,aux3,aux4;

      float long c3,c4,c5,c6,bb1,mmc,mmd,x,x0,x1,x2,y,y0,y1,y2,p0,p1,p2,z,s,alpha,temp,pres;

   ut = bmp085ReadTemp();
   ut = bmp085ReadTemp();
   up = bmp085ReadPressure();
   up = bmp085ReadPressure();

   //ut = 0x7B50;
   //up = 0x883F;
   //printf("%LX \n",ut);
   //printf("%LX \n",up);

   //but = ut; //Debug var

/*NEW CALCS*/

   c3 = 160*pow(2,-15)*ac3;
   c4 = pow(10,-3)*pow(2,-15)*ac4;
   bb1 = 25600*pow(2,-30)*b1;

   //printf("%e \n",c3);
   //printf("%e \n",c4);
   //printf("%e \n",bb1);

   c5 = ac5*pow(2,-15)/160;
   c6 = ac6;
   mmc = (0.08)*mc;
   mmd = md/160;

   //printf("%e \n",c5);
   //printf("%e \n",c6);
   //printf("mmc\n");
   //printf("%e \n",mmc);
   //printf("%e \n",mmd);

   x0 = ac1;
   x1 = 160*pow(2,-13)*ac2;
   x2 = 25600*pow(2,-25)*b2;

   //printf("%e \n",x0);
   //printf("%e \n",x1);
   //printf("%e \n",x2);

   y0 = c4*32768;
   y1 = c4*c3;
   y2 = c4*bb1;

   //printf("%e \n",y0);
   //printf("%e \n",y1);
   //printf("%e \n",y2);

   p0 = 3783/1600;
   p1 = 1-7357*pow(2,-20);
   p2 = 3038*100*pow(2,-36);

   //printf("%e \n",p0);
   //printf("%e \n",p1);
   //printf("%e \n",p2);

   /*Calculamos temperatura*/
   alpha = c5*(ut-c6);
   temp = alpha + (mmc/(alpha+mmd));


   /*Calculamos presion*/
   s = temp - 25;
   x = x2*s*s+x1*s+x0;
   y = y2*s*s+y1*s+y0;
   z = (up-x)/y;
   pres = p2*z*z+p1*z+p0;



   *temperature = temp;
   *pressure = pres;


/**/


/****************BEGIN*****CALC*****TEMP*********************/

/*
aux1 = ut-ac6;
aux2 = aux1*ac5;
x1 = aux2/32768;
//x1 = ((ut - ac6) * ac5 / pow(2,15));
aux3 = x1+md;
aux4 = mc/aux3;
x2 = aux4*2048;
//x2 = (mc * (pow(2,11))) / (x1 + md);
b5 = x1 + x2;
*temperature = ((b5 + 8) / 16);

/****************END*****CALC*****TEMP***********************/


/****************BEGIN*****CALC*****PRES*********************/
/*

up = up >> (8-OSS);
//bup = up; //Debug var
b6 = b5 - 4000;
aux1 = b6*b6;
aux2 = aux1/4096;
aux3 = aux2*b2;
x1 = aux3/2048;
//x1 = (b2 * (b6 * b6 / pow(2,12))) / pow(2,11);
aux1 = ac2*b6;
x2 = aux1/2048;
//x2 = ac2 * b6 / pow(2,11);
x3 = x1 + x2;

aux1 = ac1*4;
aux2 = aux1+x3;
shift = aux2;
aux3 = shift << OSS;
aux4 = aux3+2;
b3 = aux4/4;
//b3 = ((((ac1 * 4) + x3) << OSS) + 2) / 4;
aux1 = ac3*b6;
x1 = aux1/8192;
//x1 = ac3 * b6 / pow(2,13);
aux1 = b6*b6;
aux2 = aux1/4096;
aux3 = aux2*b1;
x2 = aux3/65536;
//x2 = (b1 * (b6 * b6 / pow(2,12))) / pow(2,16);
aux1 = x1+x2+2;
x3 = aux1/4;
//x3 = ((x1 + x2) + 2) / pow(2,2);
aux1 = x3+32768;
aux2 = ac4*aux1;
b4 = aux2/32768;
//b4 = (ac4 * (unsigned long) (x3 + 32768)) / pow(2,15);
aux1 = up-b3;
aux2 = 50000>>OSS;
b7 = aux1*aux2;
//b7 = ((unsigned long) up - b3) * (50000 >> OSS);
if (b7 < 0x80000000)
{
aux1 = b7*2;
p = aux1/b4;
}
else
{
aux1 = b7/b4;
p = aux1*2;
}

aux1 = p/256;
x1 = aux1*aux1;
//x1 = p / pow(2,8);
//x1 *= x1;
aux2 = x1*3038;
x1 = aux2/65536;
//x1 = (x1 * 3038) / pow(2,16);
aux1 = -7357*p;
x2 = aux1/65536;
//x2 = (-7357 * p) / pow(2,16);
aux1 = x1+x2+3791;
aux2 = aux1/16;
p = p+aux2;
*pressure = p;
/****************END*****CALC*****PRES***********************/
}




i2c.c



Código: [Seleccionar]
#include <xc.h>

// Common I2C Routines


#define SDA_PIN PORTBbits.RB1 //
#define SCL_PIN PORTBbits.RB4 //

#define SDA_DIR TRISBbits.TRISB1
#define SCL_DIR TRISBbits.TRISB4


void i2c_high_sda(void)
{
   // bring SDA to high impedance
   SDA_DIR = 1;
   DelayUs(5);
}

void i2c_low_sda(void)
{
   SDA_PIN = 0;
   SDA_DIR = 0;  // output a hard logic zero
   DelayUs(5);
}

void i2c_high_scl(void)
{
   SCL_DIR = 1;   // high impedance
   DelayUs(5);
}

void i2c_low_scl(void)
{
   SCL_PIN = 0;
   SCL_DIR = 0;
   DelayUs(5);
}

void i2c_read(unsigned short r_byte)
{
   int  n;
   i2c_high_sda();
   for (n=0; n<8; n++)
   {
      i2c_high_scl();

      if (SDA_PIN)
      {
         r_byte = (r_byte << 1) | 0x01; // msbit first
      }
      else
      {
         r_byte = r_byte << 1;
      }
      i2c_low_scl();
   }
   return;
}



void i2c_write(signed char w_byte)

{
    int m ;
   for(m=0; m<8; m++)
   {
      if(w_byte&0x80)
      {
         i2c_high_sda();
      }
      else
      {
         i2c_low_sda();
      }
      i2c_high_scl();
      i2c_low_scl();
      w_byte = w_byte << 1;
   }
   i2c_high_sda();
}

void i2c_nack(void)
{
   i2c_high_sda(); // data at one
   i2c_high_scl(); // clock pulse
   i2c_low_scl();
}

void i2c_ack(void)
{
   i2c_low_sda(); // bring data low and clock
   i2c_high_scl();
   i2c_low_scl();
   i2c_high_sda();
}


void i2c_start(void)
{
   i2c_low_scl();
   i2c_high_sda();
   i2c_high_scl(); // bring SDA low while SCL is high
   i2c_low_sda();
   i2c_low_scl();
}

void i2c_stop(void)
{
   i2c_low_scl();
   i2c_low_sda();
   i2c_high_scl();
   i2c_high_sda();  // bring SDA high while SCL is high
   // idle is SDA high and SCL high
}



void i2c_restart(void)
{
i2c_low_scl(); /* ensure clock is low */
i2c_high_scl(); /* ensure data is high */
SCL_DIR = 1;                         /* clock pulse high */
i2c_low_sda(); /* the high->low transition */
return;
}

Título: Re: Leyendo BMP085(sensor presion) en xc8
Publicado por: AngelGris en 04 de Junio de 2013, 14:19:23
 ¿Y funciona, o no?

  Insisto en que está mal definida la función i2c_read();
Título: Re: Leyendo BMP085(sensor presion) en xc8
Publicado por: Rseliman en 04 de Junio de 2013, 14:36:34
¿Y funciona, o no?

  Insisto en que está mal definida la función i2c_read();


A ver ...no te entendi bien ...

void i2c_read(unsigned short r_byte)

esto es i2c_read ...devuelve un r_byte  unsigned short ...o estoy equivocado ???

Título: Re: Leyendo BMP085(sensor presion) en xc8
Publicado por: Rseliman en 04 de Junio de 2013, 14:47:09
Una Pregunta AngelGris ....como puedo probar en proteus solamente la subrutina i2c para estar seguro que ande antes de conectar el sensor ??


Saludos y gracias
Título: Re: Leyendo BMP085(sensor presion) en xc8
Publicado por: AngelGris en 04 de Junio de 2013, 14:50:34
No. Para que te devuelva un valor debes especificar el tipo de valor a devolver antes del nombre de la función. Así...

Código: C
  1. unsigned short i2c_read();

y la implementación podría ser algo así

Código: C
  1. unsigned short i2c_read()
  2. {
  3.   unsigned short variable_temporal;
  4.   unsigned short contador;
  5.  
  6.  
  7.   i2c_high_sda();
  8.   for (contador = 0; contador < 8; contador++)
  9.   {
  10.     i2c_high_scl();
  11.     variable_temporal = variable_temporal << 1;
  12.     if (SDA_PIN == 1) variable_temporal = variable_temporal | 1;
  13.     i2c_low_slc();
  14.   }
  15.   return variable_temporal;
  16. }

  Proteus tiene una herramienta para I2C que se llama i2c debugger. Si mal no recuerdo se la puede configurar como slave y darle un address y datos a devolver.
Título: Re: Leyendo BMP085(sensor presion) en xc8
Publicado por: Rseliman en 04 de Junio de 2013, 15:10:56
a ver ahora ...

Código: [Seleccionar]
unsigned short i2c_read()
{
    unsigned short r_byte;
    int  n;
   i2c_high_sda();
   for (n=0; n<8; n++)
   {
      i2c_high_scl();

      if (SDA_PIN)
      {
         r_byte = (r_byte << 1) | 0x01; // msbit first
      }
      else
      {
         r_byte = r_byte << 1;
      }
      i2c_low_scl();
   }
   return r_byte;
}


Ahora con la i2c_write ...esta bien ???
Título: Re: Leyendo BMP085(sensor presion) en xc8
Publicado por: AngelGris en 04 de Junio de 2013, 15:17:57
  Sí, i2c_write parecería estar bien. Dicha función recibe un parámetro, por ello está indicado dentro de los paréntesis.

  Yo cambiaría el tamaño de las variables que utilizas como contadores para el ciclo for tanto de i2c_read como de i2c_write. El tipo "int" es de 16 bits y el tipo "char" es de 8 bits, así que sería suficiente utilizar variables de éste último tipo.
Título: Re: Leyendo BMP085(sensor presion) en xc8
Publicado por: jeremylf en 05 de Junio de 2013, 21:04:21
Por que no usas las de hitech? xc y hitech son lo mismo.
Título: Re: Leyendo BMP085(sensor presion) en xc8
Publicado por: Rseliman en 07 de Junio de 2013, 14:37:22
Buenas !!! recien termino mi programa ...compila , pero no logro que funcione , estoy tratando de leer el sensor , pero no estoy seguro de que el i2c este funcionando bien ....y esa es la pregunta ...como me aseguro de que lo que hice funciona ?? les paso el proyecto a ver cual es su opinion ...esta compilando en mplabx con compiler xc8 ...pic16f819

Gracias

Título: Re: Leyendo BMP085(sensor presion) en xc8
Publicado por: Rseliman en 07 de Junio de 2013, 14:53:38
Y aca va el proyecto en proteus 8
Título: Re: Leyendo BMP085(sensor presion) en xc8
Publicado por: AngelGris en 07 de Junio de 2013, 16:16:33
  Yo probaría las rutinas con una memoria tipo 24c04. Una vez que la hagas funcionar con dicha memoria, ya avanzar hacia el manejo del sensor.

  Hice unas rutinas i2c por soft para hitech hace tiempo. Ahora comencé todo de cero e hice las rutinas en xc8 (versión 1.12). Por el momento las estoy testeando en ISIS con la herramienta I2C DEUGGER y parecen funcionar bien.
Título: Re: Leyendo BMP085(sensor presion) en xc8
Publicado por: Rseliman en 07 de Junio de 2013, 16:25:08
  Yo probaría las rutinas con una memoria tipo 24c04. Una vez que la hagas funcionar con dicha memoria, ya avanzar hacia el manejo del sensor.

  Hice unas rutinas i2c por soft para hitech hace tiempo. Ahora comencé todo de cero e hice las rutinas en xc8 (versión 1.12). Por el momento las estoy testeando en ISIS con la herramienta I2C DEUGGER y parecen funcionar bien.

Buenisimo ...yo estas rutinas que hice son un enjendro de varias ...por eso no estoy seguro si funcionan o no ...tampoco se usar bien el i2c debuguer ..si podes tirame una manija !!!! gracias
Título: Re: Leyendo BMP085(sensor presion) en xc8
Publicado por: AngelGris en 07 de Junio de 2013, 22:07:56
  Te muestro un ejemplo de utilización de rutinas I2C, para comunicarme con una memoria 24C04.

  Separé tres bloques dentro del main, para que sea un poco mas legible.

  El primer bloque, se comunica con la memoria para leer un dato (1 byte). Según el comportamiento de dicha memoria, se lee la posición actual de un contador interno que posee. Como es la primera vez que se accede, el contador apunta a la dirección 0x00.
  En este bloque, el llamado a "i2cs_write(0b10100001)", corresponde a enviar -desde el micro- al bus la dirección correspondiente a la memoria. En este caso el bit de menor peso está a "1" indicando que quiero acceder como lectura.

  En el segundo bloque, me comunico para grabar un byte, según especificaciones de la memoria 24C04.
  En este bloque el llamado a "i2cs_write(0b10100000)", indica que me quiero comunicar con la memoria para escribir información. El llamado a "i2cs_write(0x02)", le indica al contador interno de la memoria que apunte a su dirección 0x02. Y el llamado a "i2cs_write(0x05)" es el propio dato a grabar.

  En el tercer bloque, el llamado a "i2cs_write(0b10100000)" indica que me comunico con la memoria para escritura. El llamado a "i2cs_write(0x02)" le indica al contador interno que apunte a la dirección 0x02. Luego realizo un RepeateStart para reiniciar la comunicación. El llamado a "i2cs_write(0b10100001)" le indica que me quiero comunicar con la memoria para lectura.

  Adjunto una captura donde se aprecia en el I2C DEBUGGER todo el proceso de la comunicación. Cada bloque de mi programa, aparece en un renglón. Realmente, cada renglón corresponde a un ciclo de comunicación, que comienza con un Start y termina con un Stop.

  Te recomiendo leer algún documento respecto al protocolo I2C, para lograr comprender mejor su funcionamiento. También sería bueno que leyeras el datasheet de la 24C04 para poder comprender mejor el funcionamiento de este ejemplo.

Código: C
  1. #include <xc.h>
  2.  
  3. #pragma config FOSC = HS        // Oscillator Selection bits (HS oscillator: High-speed crystal/resonator on RA6/OSC2/CLKOUT and RA7/OSC1/CLKIN)
  4. #pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
  5. #pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
  6. #pragma config MCLRE = OFF      // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is digital input, MCLR internally tied to VDD)
  7. #pragma config BOREN = OFF      // Brown-out Detect Enable bit (BOD disabled)
  8. #pragma config LVP = OFF        // Low-Voltage Programming Enable bit (RB4/PGM pin has digital I/O function, HV on MCLR must be used for programming)
  9. #pragma config CPD = OFF        // Data EE Memory Code Protection bit (Data memory code protection off)
  10. #pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)
  11.  
  12.  
  13. #include "swi2c.h"
  14.  
  15.  
  16. void main(void)
  17. {
  18.     unsigned char data;
  19.  
  20.     i2cs_start();            //comienzo comunicacion
  21.     i2cs_write(0b10100001);  //accedo a la memoria para lectura (posicion actual)
  22.     i2cs_read();             //leo la memoria
  23.     i2cs_nack();             //no respondo
  24.     i2cs_stop();             //termino comunicacion
  25.  
  26.     i2cs_start();            //comienzo comunicacion
  27.     i2cs_write(0b10100000);  //accedo a la memoria para escritura
  28.     i2cs_write(0x02);        //direccion que quiero escribir
  29.     i2cs_write(0x05);        //dato a escribir
  30.     i2cs_stop();             //termino comunicacion
  31.  
  32.     __delay_ms(5);           //espero para que se grabe el dato en la memoria
  33.  
  34.     i2cs_start();            //comienzo comunicacion
  35.     i2cs_write(0b10100000);  //accedo a la memoria para escritura
  36.     i2cs_write(0x02);        //direccion que quiero escribir
  37.     i2cs_start();            //comienzo comunicacion (para leer la posicion)
  38.     i2cs_write(0b10100001);  //accedo a la memoria para lectura (posicion actual)
  39.     i2cs_read();             //leo la memoria
  40.     i2cs_nack();             //no respondo
  41.     i2cs_stop();             //termino comunicacion
  42.  
  43.     while(1);
  44. }
Título: Re: Leyendo BMP085(sensor presion) en xc8
Publicado por: Rseliman en 08 de Junio de 2013, 09:13:32
excelente como siempre angel ....he estado leyendo el protocolo i2c ...pero mi aprendizaje se basa fundamentalmente en ejemplos explicados tal y cual como vos lo expones aca ....este texto vale muchisimo mas que los libros de i2c que he leido ....te agradezco un monton ...ahora si puedo reeler los textos i2c que tengo y seguramente en un par de dias saco andando mi rutina ...apenas la tengo la posteo ...

te mando un abrazo y nuevamente gracias por compartir

Título: Re: Leyendo BMP085(sensor presion) en xc8
Publicado por: elgarbe en 03 de Diciembre de 2013, 20:40:52
Ramiro, respondo acá para que quede en este post. Ya tengo funcionando la lectura de los valores de calibracion con el ARM!!!
Gracias por los fuentes, ahora estoy terminando las otras funciones para obtener los valores corregidos de presion y temperatura.

Saludos y gracias!
Título: Re: Leyendo BMP085(sensor presion) en xc8
Publicado por: elgarbe en 03 de Diciembre de 2013, 22:09:43
Ramiro, una consulta, pudiste medir presion?

no me cierra esta parte del código:

   if(OSS) {
      return bmp085ReadThreeBytes(0xF6);
   } else {
      return ((long) bmp085ReadShort(0xF6)) << 8;
   }

eso está en bmp085ReadPressure

me parece que no se condice con las formulas del datasheet, pero a lo mejor estoy malinterpretando algo. vos lo probaste?

Saludos!
Título: Re: Leyendo BMP085(sensor presion) en xc8
Publicado por: Rseliman en 04 de Diciembre de 2013, 06:51:40
Ramiro, una consulta, pudiste medir presion?

no me cierra esta parte del código:

   if(OSS) {
      return bmp085ReadThreeBytes(0xF6);
   } else {
      return ((long) bmp085ReadShort(0xF6)) << 8;
   }

eso está en bmp085ReadPressure

me parece que no se condice con las formulas del datasheet, pero a lo mejor estoy malinterpretando algo. vos lo probaste?

Saludos!


Fijate que este codigo fueron mis primeras pruebas con el sensor , con esto no pude leer presion , solo temperatura , pero con el codigo que esta escrito enel curso de xc8 , me anda perfecto , incluso estan los videos en mi canal de youtube ...en este codigo , uso una lib por soft de i2c , porque el pic que estaba usando no la tenia , en el otro codigo uso la lib de c18 de plib ....

te compila bien ??? deberia andar , ojo no este codigo , el otro si

Saludos
Título: Re: Leyendo BMP085(sensor presion) en xc8
Publicado por: Rseliman en 04 de Diciembre de 2013, 07:04:08
Ramiro, una consulta, pudiste medir presion?

no me cierra esta parte del código:

   if(OSS) {
      return bmp085ReadThreeBytes(0xF6);
   } else {
      return ((long) bmp085ReadShort(0xF6)) << 8;
   }

eso está en bmp085ReadPressure

me parece que no se condice con las formulas del datasheet, pero a lo mejor estoy malinterpretando algo. vos lo probaste?

Saludos!


Me quede pensando , que pic estas usando , donde estas mirando los valores de lectura ?? , estas usando un max232 o estas saliendo a un display ?? , por otro lado ,lo primero que yo logre antes que nada , fue visualizar los datos del sensor , los datos de calibracion , una ves que logre que los datos de calibracion esten bien , recien me dedique a hacer funcionar temperatura y presion , por otro lado , no te olvides de que esos sensores , algunos tienen resistencias de pull up y otros no ...asegurate eso ....el i2c las nesecita , otro tema ....obvimente que esto esta demas decirlo , pero algunas placas funcionan con un regulador de 3,3 y otras tenes que alimentarlas con 3,3 , no te olvdes de compartir las masas , que otra cosa ?? no se me ocurre mas nada , primero asegurate que la comunicacion i2c funciona , yo lo que hice fue simular en proteus con una memoria 24c02 ...con esto me asegure que la comunicacion i2c funcionaba como primera medida ...desp segui con el sensor , y como primero de todo leer los datos de calibracion , despues lei UT y UP , para a lo ultimo calcular presion y temp leyendo dos y tres bytes ....anda paso a paso , asi vas a encontrar el error ....a mi me costo mucho hacerlo andar ...

NO te olvides de comentarme si funciono , no lo dejaremos hasta que salga adelante ...conta conmigo ...un Abrazo
Título: Re: Leyendo BMP085(sensor presion) en xc8
Publicado por: Rseliman en 04 de Diciembre de 2013, 07:13:23
Ramiro, una consulta, pudiste medir presion?

no me cierra esta parte del código:

   if(OSS) {
      return bmp085ReadThreeBytes(0xF6);
   } else {
      return ((long) bmp085ReadShort(0xF6)) << 8;
   }

eso está en bmp085ReadPressure

me parece que no se condice con las formulas del datasheet, pero a lo mejor estoy malinterpretando algo. vos lo probaste?

Saludos!


Fijate que este codigo fueron mis primeras pruebas con el sensor , con esto no pude leer presion , solo temperatura , pero con el codigo que esta escrito enel curso de xc8 , me anda perfecto , incluso estan los videos en mi canal de youtube ...en este codigo , uso una lib por soft de i2c , porque el pic que estaba usando no la tenia , en el otro codigo uso la lib de c18 de plib ....

te compila bien ??? deberia andar , ojo no este codigo , el otro si

Saludos

Se me siguen ocurriendo cosas ...fijate que a este codigo lo saque de una persona que lo escribio para una estacion meteorologica , nunca me anduvo 100% y si te fijas en el codigo que esta escrito en el minicurso de xc8 , te vas a dar cuenta que hay partes delcodigo que no las uso ...tranquilamente se podrian sacar , yo te las escribi de todas maneras , el codigo en si es tal cual esta en el datasheets , si lo seguis , fijate que es lo mismo ....no es complicado ...pero requiere que ande todo bien como siempre ...la parte del codigo a la cual le haces referencia es ara decidir cual usar si dos o tres bytes ...fijate bien que esta en el datasheets , no de esa manera pero esta .... bueno ahora si me voy a trabajar ...Saludos
Título: Re: Leyendo BMP085(sensor presion) en xc8
Publicado por: elgarbe en 04 de Diciembre de 2013, 10:46:07
Ramiro, como andas!

Te comento que venía haciendo tal como lo sugeris, primro hice la lectura de los datos de calibracion. Como trabajo con una placa con un micro ARM (no con PIC) me costo bastante encontrar una buena librería para I2C y despues empezar a transformar el código. Antes de ayer a la madrugada dejé funcionando la lectura de los datos de calibracion.
Anoche me puse con la medicion de temperatura y presion.
La temperatura salio fácil, las formulas copie tal cual las que vos pusiste.
Pero con la presion tenia una duda ya que la parte del codigo que pegue arriba no coincide con la hoja de datos...
Despues, segui renegando y mirando más el código y encontre lo que faltaba. En donde calculas la presion real, haces el deslpazamiento de los bits en (OSS-8) cosa que no estaba en la parte del código que te copie.... en fin, tu código esta perfecto y a mí ya me quedó funcionando bien. Lo probe anoche y media 1011 hPa y 21°C. Coincidía bastante con los datos del SMN de Rosario....

Bueno, ahora pase a los otros sensores, en este momento estoy trabajando con el compas electrónico o magnetómetro...

Saludos y gracias!!!
Título: Re: Leyendo BMP085(sensor presion) en xc8
Publicado por: Rseliman en 04 de Diciembre de 2013, 10:50:08
Ramiro, como andas!

Te comento que venía haciendo tal como lo sugeris, primro hice la lectura de los datos de calibracion. Como trabajo con una placa con un micro ARM (no con PIC) me costo bastante encontrar una buena librería para I2C y despues empezar a transformar el código. Antes de ayer a la madrugada dejé funcionando la lectura de los datos de calibracion.
Anoche me puse con la medicion de temperatura y presion.
La temperatura salio fácil, las formulas copie tal cual las que vos pusiste.
Pero con la presion tenia una duda ya que la parte del codigo que pegue arriba no coincide con la hoja de datos...
Despues, segui renegando y mirando más el código y encontre lo que faltaba. En donde calculas la presion real, haces el deslpazamiento de los bits en (OSS-8) cosa que no estaba en la parte del código que te copie.... en fin, tu código esta perfecto y a mí ya me quedó funcionando bien. Lo probe anoche y media 1011 hPa y 21°C. Coincidía bastante con los datos del SMN de Rosario....

Bueno, ahora pase a los otros sensores, en este momento estoy trabajando con el compas electrónico o magnetómetro...

Saludos y gracias!!!

Bien bien Leonardo !!!!! me alegro que funcione !!!! Buenisimo !!! ....una pregunta sos de aca enfrente ?? cruzando el charco ?? ...yo estoy en Victoria ...si es asi y andas por aca ...nos tomamos unos mates en cualquier momento ....o alguna cerveza jajaja

Un Abrazo
Título: Re: Leyendo BMP085(sensor presion) en xc8
Publicado por: elgarbe en 04 de Diciembre de 2013, 11:26:26
Jaja, si, estoy a un puente de distancia (80Km de rosario mas o menos). Tenía pensado tomarme algun finde en las vacaciones para pasear con la familia por la zona. Si lo puedo cerrar para enero te aviso!!!

Saludos!

PD: Ya empecé con el camwork. La primera prueba fue exitosa, despues por correo te hago algunas consultas.