Autor Tema: Leyendo BMP085(sensor presion) en xc8  (Leído 7267 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Leyendo BMP085(sensor presion) en xc8
« Respuesta #15 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.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Rseliman

  • PIC16
  • ***
  • Mensajes: 239
Re: Leyendo BMP085(sensor presion) en xc8
« Respuesta #16 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
Las Grandes Obras las sueñan los grandes locos , mientras los inutiles las critican !!

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Leyendo BMP085(sensor presion) en xc8
« Respuesta #17 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. }
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado Rseliman

  • PIC16
  • ***
  • Mensajes: 239
Re: Leyendo BMP085(sensor presion) en xc8
« Respuesta #18 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

Las Grandes Obras las sueñan los grandes locos , mientras los inutiles las critican !!

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Leyendo BMP085(sensor presion) en xc8
« Respuesta #19 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!
-
Leonardo Garberoglio

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Leyendo BMP085(sensor presion) en xc8
« Respuesta #20 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!
-
Leonardo Garberoglio

Desconectado Rseliman

  • PIC16
  • ***
  • Mensajes: 239
Re: Leyendo BMP085(sensor presion) en xc8
« Respuesta #21 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
Las Grandes Obras las sueñan los grandes locos , mientras los inutiles las critican !!

Desconectado Rseliman

  • PIC16
  • ***
  • Mensajes: 239
Re: Leyendo BMP085(sensor presion) en xc8
« Respuesta #22 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
Las Grandes Obras las sueñan los grandes locos , mientras los inutiles las critican !!

Desconectado Rseliman

  • PIC16
  • ***
  • Mensajes: 239
Re: Leyendo BMP085(sensor presion) en xc8
« Respuesta #23 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
Las Grandes Obras las sueñan los grandes locos , mientras los inutiles las critican !!

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Leyendo BMP085(sensor presion) en xc8
« Respuesta #24 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!!!
-
Leonardo Garberoglio

Desconectado Rseliman

  • PIC16
  • ***
  • Mensajes: 239
Re: Leyendo BMP085(sensor presion) en xc8
« Respuesta #25 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
Las Grandes Obras las sueñan los grandes locos , mientras los inutiles las critican !!

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re: Leyendo BMP085(sensor presion) en xc8
« Respuesta #26 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.
-
Leonardo Garberoglio