Autor Tema: Codigo comunicación i2c con pcb sensores de temperatura TMP100  (Leído 345 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado javifd

  • PIC10
  • *
  • Mensajes: 4
Hola, tenía dudas al realizar el código en lenguaje c de una comunicación i2c, de dos sensores de temperatura TMP100 en paralelo con un dspic30F6014A. La verdad que no sabría ni empezar porque nunca he trabajado ni con este pic ni con la comunicación i2c. Agradecería vuestra ayuda.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7325
Re:Codigo comunicación i2c con pcb sensores de temperatura TMP100
« Respuesta #1 en: 17 de Mayo de 2019, 11:39:21 »
Si trabajaste con otros PICs entonces sabrás que tenes un modulo que te permite comunicarte con I2C e identificaras los pines necesarios.

Sobre la programación del dsPIC deberías tener funciones para iniciar el I2C, sino vas a tener que modificar registro por registro y crear las funciones para el I2C (funciones como start,enviar, recibir,stop,etc).

Sobre que enviar al TMP100 lo tenes en el datasheet:

http://www.ti.com/lit/ds/symlink/tmp100.pdf ( pagina 13 )

Tenes ejemplos de la lectura y de la escritura.

Observaras que todo comienza con un START luego un byte con la direccion del dispositivo y el ultimo bit indicando si es lectura/escritura. Luego tenes el puntero de la memoria que queres escribir y de alli irian los datos finalizando con un STOP.

Resumen:

START
Byte Direccion+R/W
(Aca te responde el TMP con un ACK o NACK)
Byte con puntero a memoria
(Aca te responde el TMP con un ACK o NACK)
Dato
(Aca te responde el TMP con un ACK o NACK)
Dato
(Aca te responde el TMP con un ACK o NACK)
STOP

Para la lectura es parecido, pero esta ves vas a tener que leer en ves de escribir en la parte de los datos. Y cambiar el estado del bit R/W a lectura.

- Algunas consideraciones, necesitas cambiarle la direccion a los TMP, lo haces con los pines ADD0/1.
- Recorda los pull-ups de ambas lineas, la de datos ( SDA) y la de clock ( SCL )

Y si nunca trabajste con el micro dsPIC entonces comenza por algo basico, la documentacion de estos PICs ya no vienen en un solo PDF, sino que cada modulo posee un PDF aparte.

Desconectado javifd

  • PIC10
  • *
  • Mensajes: 4
Re:Codigo comunicación i2c con pcb sensores de temperatura TMP100
« Respuesta #2 en: 28 de Mayo de 2019, 19:33:12 »
Muchas gracias por tu respuesta, ya hice lo que me dijiste y usando un sensor de temperatura sin problema pero cuando uso dos la verdad que no sé adaptar el código para que me devuelva ambas temperaturas haciéndolo a partir de una función definida anteriormente . :undecided: He hecho lo siguiente pero no me detecta ninguna de las variables de lectura.Es bastante básico el error pero la verdad que no se hacerlo, si alguien me pudiera ayudar... :embarrassed:.Muchas gracias. :grin:
Código: [Seleccionar]

float Temperatura1, Temperatura2;


boolean   Reconocimiento1;
boolean   Reconocimiento2;

///////////////////////////////////////////////////////////////////////

char leer_temperatura(void)
{
   char lectura1;
   char lectura2;

      i2c_start();             //Bit de start
   
 
      Reconocimiento1=i2c_write(0b1001000);     
   
   if (!Reconocimiento1)   //Si hubo respuesta, seguimos, si no no enviamos el resto
   {
         i2c_write(0x00);         //Comando: lectura registro de temperatura
         i2c_start();            //Repetición de start
         i2c_write(0b1001001);      //Dirección del sensor y bit de R/W = 1
         lectura1=i2c_read(0);      //Recogemos temperatura y colocamos NO ACK
   }
   i2c_stop();
   return (lectura1);
 
   delay_ms(50)
 
      i2c_start();             //Bit de start
   
   
      Reconocimiento2=i2c_write(0b1001110);     
   
   if (!Reconocimiento2)   //Si hubo respuesta, seguimos, si no no enviamos el resto
   {
         i2c_write(0x00);         //Comando: lectura registro de temperatura
         i2c_start();            //Repetición de start
         i2c_write(0b1001111);      //Dirección del sensor y bit de R/W = 1
         lectura2=i2c_read(0);      //Recogemos temperatura y colocamos NO ACK
   }
   i2c_stop();         //En cualquier caso, cerramos la actividad del I2C
      //Devolvemos el valor leído, si no hubo respuesta, no tiene sentido

   return (lectura2);
}






void main()
{
      //Configuraciones iniciales
      setup_adc_ports(NO_ANALOGS);
      setup_adc(ADC_OFF);
     
     
   delay_ms(500); //Esperamos 0,5 segundos antes de entrar en el bucle continuo

   while(1)   //Bucle de ejecución continuo
   {
     
      leer_temperatura()
      Temperatura1b = lectura1;   //Recogemos del sensor el valor de T
      Temperatura2b = lectura2; 
     
     
   }//cierre del while(1)
   }//cierre del main()

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7325
Re:Codigo comunicación i2c con pcb sensores de temperatura TMP100
« Respuesta #3 en: 29 de Mayo de 2019, 18:54:20 »
Cuadno llega al return(lectura1); la funcion sale, por lo que no sigue ejecutando el codigo que le sigue (2do sensor).

Por ahora... para que te sea mas simple, en ves de poner un return.. asignaselo a una variable global... Es decir cambia:

Código: C
  1. return (lectura1);

por

Código: C
  1. Temperatura1 = lectura1;

En tu funcion.. aunque sea para probarlo.

Desconectado javifd

  • PIC10
  • *
  • Mensajes: 4
Re:Codigo comunicación i2c con pcb sensores de temperatura TMP100
« Respuesta #4 en: 01 de Junio de 2019, 07:52:33 »
Y, ¿cómo calcularía la frecuencia de reloj y Fosc necesaria para ese dspic? Porque creo que me está fallando eso o porque siempre me devuelve todo unos la lectura y ya no sé que puede ser. :(. Os adjunto el código tanto el .c como el .h a ver si veis el fallo. Muchas gracias.

Código: [Seleccionar]
#include "Temperatura.h"





boolean  Reconocimiento;


float temperatura1;


int leer_temperatura(void) 

{
   int8 lectura_alta1;
   int8 lectura_baja1;
   int16 lectura;
   

      i2c_start();             //Bit de start
   
   //Enviamos Dirección del sensor: 1001101 y bit de R/W = 0, recogemos bit de ACK
   //en Reconocimiento
      Reconocimiento=i2c_write(0b10010000);
     
   
   if (!Reconocimiento)   //Si hubo respuesta, seguimos, si no no enviamos el resto
   {
         i2c_write(0x00);         //Comando: lectura registro de temperatura
         i2c_start();            //Repetición de start
         i2c_write(0b10010001);      //Dirección del sensor y bit de R/W = 1
         lectura_alta1=i2c_read();
         lectura_baja1=i2c_read(0);
         lectura=lectura_alta1;
         lectura=lectura<<8;
         lectura=lectura|lectura_baja1;
         lectura=lectura>>4;
         
         
         
   }
     
   
       
   
   i2c_stop(); 
 


   return (float) lectura*0.0665;
}





void main()
{
      //Configuraciones iniciales
      setup_adc_ports(NO_ANALOGS);
      setup_adc(ADC_OFF);
     
     
   
   delay_ms(500); //Esperamos 0,5 segundos antes de entrar en el bucle continuo
   
   while(1)   //Bucle de ejecución continuo
   {
     
      temperatura1=leer_temperatura();
     
   }//cierre del main()


Código: [Seleccionar]
#include <30F6014A.h>
#device *=16
#device adc=10

#FUSES NOWDT                  //No Watch Dog Timer
#FUSES XT                    //Crystal osc <= 4mhz
#FUSES NOPUT                  //No Power Up Timer
#FUSES NOPROTECT              //Code not protected from reading
#FUSES BROWNOUT              //Reset when brownout detected
#FUSES NOWRT                  //Program memory not write protected
#FUSES NODEBUG                //No Debug mode for ICD

#use delay(clock=400000)


#use i2c(MASTER, SCL=PIN_G2, SDA=PIN_G3, SLOW, stream=I2C_PORT2)