Autor Tema: Sensor de temperatura TC74  (Leído 5321 veces)

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

Desconectado j_fernandez

  • PIC12
  • **
  • Mensajes: 89
Sensor de temperatura TC74
« en: 26 de Octubre de 2005, 03:06:00 »
Hola a tod@s, quiero trabajar con el sensor de temperatura TC74 cuyo funcionamiento se basa en comunicacion I2C y no se muy bien como va.

Si alguien me pudiera decir algo se lo agradecería.

Gracias y un saludoHelado

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
RE: Sensor de temperatura TC74
« Respuesta #1 en: 26 de Octubre de 2005, 07:28:00 »
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado j_fernandez

  • PIC12
  • **
  • Mensajes: 89
RE: Sensor de temperatura TC74
« Respuesta #2 en: 02 de Noviembre de 2005, 01:56:00 »
Gracias vszener !! Lo probare y ya te dire algo

Un saludo

Desconectado garlic_74

  • PIC10
  • *
  • Mensajes: 33
RE: Sensor de temperatura TC74
« Respuesta #3 en: 08 de Noviembre de 2005, 13:23:00 »
pues yo lo estoy probando,  ya que este componente desde la web de PACALACONCURSO lo cita y no me va Llorica aqui pongo todo lo que he hecho aver si veis algun error

gracias

He usado CSS, y el pic 16F877

los pines del TC74 son estos:

  |     |      |      |         |
NC SDA  GND SCLK VCC

he conectado el CLK al pin
he conectado el SDA al pin
SDA va conectada al pin C4 y con una R de 4K7 a Vcc
SCLK va conectada al pin C3 y con una R de 4K7 a Vcc

Vcc 5 v
GND 0 v

y las siguentes instrucciones en C (copiado de PACALACONCURSO):

#define SDA PIN_C4
#define SCL PIN_C3

#use i2c(MASTER, sda=SDA, scl=SCL)




i2c_Start(); // INICIAR EL BUS I2C
i2c_Write(0b10011010); // DIRECCION DEL SENSOR Y Write Flag
i2c_Write(0x00); // REGISTRO DE TEMPERATURA
i2c_Start(); // INICIAR EL BUS I2C
i2c_Write(0b10011011); // DIRECCION DEL SENSOR Y Read Flag
printf("%u", i2c_Read(); // LEER TEMPERATURA
i2c_stop();

bueno esas son las lineas basicas que intervienen,
recibo siempre 255, es de todo unos

un saludo

Desconectado j_fernandez

  • PIC12
  • **
  • Mensajes: 89
RE: Sensor de temperatura TC74
« Respuesta #4 en: 09 de Noviembre de 2005, 02:33:00 »
Hola, yo he hecho un programa pero aun no lo he probado, supongo que en estos dias lo are.

Primero, nada mas empezar el programa configuro el dispostitivo para que trabaje en normal no esté en bajo consumo:

i2c_start();
i2c_write(escribir_dispositivo);// selecciono dispositivo
i2c_write(0x01);// para ir al registro de conf.
i2c_write(0x00); // para ponerlo en modo normal
i2c_stop()

Despues cada vez que quiero leer la temperatura cojo y llamo a una subrrutina que contiene:

i2c_start ();
i2c_write(leer_dispositivo);
i2c_write(0x00);// leer temperatura
tmp=i2c_read();

Insisto en decir que no lo he probado, lo hice en un rato, espero que te ayude y si ves algun fallo o te funciona otra version te ruego pongas un mensaje para ver mi error.

Hasta otra y suerte.....

Desconectado omix

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 244
RE: Sensor de temperatura TC74
« Respuesta #5 en: 10 de Noviembre de 2005, 13:05:00 »
Hola, aqui les pego una función que hice para leer la temperatura de un sensor TCN75, que supongo que sera equivalente al TCN74, por lo menos ambos funcionan por I2C.

void leeTemperatura(void){   
   Start_i2c();   
   Write_i2c(0x90);      //Selecciona dispositivo a escribir (TCN75 addr = 0x00)         
   Write_i2c(0x00);      //Selecciona registro de temperatura del TCN75      
   Restart_i2c();
   Write_i2c(0x91);      //Selecciona TCN75 para leer
   tempHight = Read_i2c(1);    
   tempLow = Read_i2c(0);
   Stop_i2c();

   if((tempLow & 0x80) == 0x80){       //comprobamos si el bit 7 es 1 => 0.5ºC
            printf("TEMP: %d.5 C
",tempHight);
      }else{
            printf("TEMP: %d.0 C
",tempHight);
      }
}

La función esta hecha en C para el HI-TECH, pero pero para el CCS sera muy parecido.

Un saludo.

Desconectado garlic_74

  • PIC10
  • *
  • Mensajes: 33
RE: Sensor de temperatura TC74
« Respuesta #6 en: 10 de Noviembre de 2005, 18:47:00 »
gracias por contestar omix, la unica duda que veo en tu codigo es que en el hitech le pones i2c_Read(x) donde x has puesto un 0 o un 1
en canvio en el CCS i2c_read() es unica

¿en el CCS ya devuelve 16 bits i en el Hitehc da los 8 altos i 8 bajos por separado?

diria k qestoy en lo cierto... Avergonzado

omix entre hoy y mañana lo pruebo y te digo algo

tendre k mirar en el datasheet cual es la direccion del TC74 que alo mejor es lo que falla Rebotado

un saludo

Desconectado omix

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 244
RE: Sensor de temperatura TC74
« Respuesta #7 en: 11 de Noviembre de 2005, 02:14:00 »
Hola garlic_74, si el 1 o 0 que se le pasa a la función I2C_Read es para que genere el ack o no, es decir, como tenemos que leer 2 bytes, en el primero se genera el ack para confirmarle al TCN75 que hemos recibido el primer byte y en el segundo ya no se genera ack sino que directamente el microcontrolador genera la condicion de stop para indicarque que hemos terminado de leer los datos. En el caso del CCS, puede ser que internamente haga lo mismo que yo de forma que sea transparente para el usuario y de esa forma no te tengas que preocupar de generar el ack cada vez que recibas un byte.

Un saludo.

Desconectado j_fernandez

  • PIC12
  • **
  • Mensajes: 89
RE: Sensor de temperatura TC74
« Respuesta #8 en: 11 de Noviembre de 2005, 04:31:00 »
Ya lo tengo!!! A ver aqui va el programa :
***************************************************************

#include <16F873.h>
#FUSES HS,NOWDT,NOPROTECT, NOPUT, NOBROWNOUT, NOLVP

#use delay(clock=16000000)
#include "lcd_PB.c"
#define EEPROM_SDA  PIN_C4
#define EEPROM_SCL  PIN_C3
#use i2c(master,sda=EEPROM_SDA, scl=EEPROM_SCL,FORCE_HW,slow)


#define escribir_dispositivo 0b10010000 // ya que la capsula es TC74A0
#define leer_dispositivo 0b10010001 // ya que la capsula es TC74A0

int signo = 0xDF;
int tmp=0;




void temperatura(){

   i2c_start();
   i2c_write(escribir_dispositivo);
   i2c_write(0x00);
   i2c_start();
   i2c_write(leer_dispositivo);
   tmp=i2c_read();
   i2c_stop();
   lcd_gotoxy(3,2);
   printf(lcd_putc,"Temp : %2D%cC",tmp,signo);
}

void main(){
   int i = 0;
   output_float(EEPROM_SDA);
   output_float(EEPROM_SCL);
   lcd_init();
   lcd_putc("f"Giño;
   i2c_start();
   i2c_write(escribir_dispositivo); // selecciono dispositivo
   i2c_write(0x01); // le digo que voy al registro configuracion
   i2c_write(0x00); // configuro en modo normal
   i2c_stop(); // paro


   while (true){
        i++;
        temperatura();
        lcd_gotoxy(1,1);
        printf(lcd_putc,"i = %2u ",i);
        delay_ms(1000);
        lcd_putc("f"Giño;
  }
}

*****************************************************************

El registro "i" solo lo utilizo para ver por pantalla que no se me ha quedado colgado ya que antes lo que me pasaba es que se me quedaba penchado.

A ver si hay suerte!!! A mi me funciona

Desconectado garlic_74

  • PIC10
  • *
  • Mensajes: 33
RE: Sensor de temperatura TC74
« Respuesta #9 en: 11 de Noviembre de 2005, 04:42:00 »
eres un hacha, ahora lo probare yo Flash

hasta hora

un saludo

Desconectado garlic_74

  • PIC10
  • *
  • Mensajes: 33
RE: Sensor de temperatura TC74
« Respuesta #10 en: 11 de Noviembre de 2005, 06:16:00 »
todo ok!

la lie pq no mire la direccion AX en el datsheet tenia la 0 y le ponia vete a saber k :S


gracias J_Fernandez!!!!!
Rebotado
HE SUBIDO la temperatura hasta 70º grados!!! jejeje con el soldador yo no voi tan caliente

alguien sabe kuanto vale este integrado mas o menos, es k lo pedi de sample


un saludo

Desconectado j_fernandez

  • PIC12
  • **
  • Mensajes: 89
RE: Sensor de temperatura TC74
« Respuesta #11 en: 11 de Noviembre de 2005, 09:13:00 »
Jejeje, yo le puesto un mechero y lo he pasado de escala, ya que pasando de noventa y pico se me ha puesto en -1ºC.

No tengo ni idea de lo que vale ya que en RS no esta y en Farnell viene con algo mas y vale 42 Euros, pero puedes seguir con sample...

Adeuuuuuuuuuuuuuuu

Desconectado carlekes

  • PIC10
  • *
  • Mensajes: 14
Re: Sensor de temperatura TC74
« Respuesta #12 en: 26 de Mayo de 2008, 13:41:01 »
hola amigos, intento compilar el programa que a todos hos funciona y me aparece (el tema del LCD esta resuelto):

Clean: Deleting intermediary and output files.
Clean: Deleted file "i2c.$$$".
Clean Warning: File "D:\tarjeta\10 - I2C\i2c.o" doesn't exist.
Clean: Deleted file "i2c.ERR".
Clean: Done.
Executing: "C:\Program files\Picc\CCSC.exe" +FM "i2c.c" +DF +LN +T +A +M +Z +Y=9 +EA
*** Error 18 "i2c.c" Line 207(18,20): File can not be opened
    Not in local "D:\tarjeta\10 - I2C\lcd_PB.c"
    Not in "C:\PROGRA~1\PICC\devices\lcd_PB.c"
    Not in "C:\PROGRA~1\PICC\drivers\lcd_PB.c"
[/color]
*** Error 12 "i2c.c" Line 36(4,14): Undefined identifier  lcd_gotoxy
*** Error 12 "i2c.c" Line 37(11,19): Undefined identifier   lcd_putc
*** Error 12 "i2c.c" Line 44(4,12): Undefined identifier  lcd_init
*** Error 12 "i2c.c" Line 45(4,12): Undefined identifier  lcd_putc
*** Error 12 "i2c.c" Line 56(9,19): Undefined identifier  lcd_gotoxy
*** Error 12 "i2c.c" Line 57(16,24): Undefined identifier   lcd_putc
*** Error 12 "i2c.c" Line 59(9,17): Undefined identifier  lcd_putc
      8 Errors,  0 Warnings.
Halting build on first failure as requested.
BUILD FAILED: Mon May 26 18:38:56 2008

No entiendo que es #include "lcd_PB.c" , una libreria¿?¿? para que sirve¿?¿ Si lo quito funcionara¿?¿? De donde lo puedo sacar¿?¿?

si me pueden ayudar estare muy agradecido.

Gracias;)
« Última modificación: 26 de Mayo de 2008, 15:32:21 por carlekes »

Desconectado carlekes

  • PIC10
  • *
  • Mensajes: 14
Re: Sensor de temperatura TC74
« Respuesta #13 en: 26 de Mayo de 2008, 16:08:16 »
Buenas amigos.

yo tengo la placa PICDEM 2 PLUS y al final he podido hacerlos de la siguiente manera:

#include <16f877a.h>

#fuses XT,NOWDT,PUT,NOPROTECT,BROWNOUT,NOLVP,NOCPD,NOWRT
#use delay (clock = 4000000)

#define EEPROM_SDA  PIN_C4
#define EEPROM_SCL  PIN_C3

#use i2c(master,sda=EEPROM_SDA, scl=EEPROM_SCL,FORCE_HW,slow)

#define escribir_dispositivo 0b10011010 //direccion del sensor y Write flag
#define leer_dispositivo 0b10011011 // direccion del sensor y read flag

//--------------------------------------------------------------------------//
//               CONFIGURACION LCD                              //
//--------------------------------------------------------------------------//

#define LCD_POWER       PIN_D7
#define LCD_EN        PIN_D6
#define LCD_RS        PIN_D4
#define LCD_DB4       PIN_D0
#define LCD_DB5       PIN_D1
#define LCD_DB6       PIN_D2
#define LCD_DB7       PIN_D3
#define LCD_RW         PIN_D5

#define lcd_type 2                           // 0=5x7, 1=5x10, 2=2 lineas
#define lcd_line_two 0x40                     // LCD RAM direccion para la 2ª linea.

int8 const LCD_INIT_STRING[4] =
{
 0x20 | (lcd_type << 2),                     // Func set: 4-bit, 2 lines, 5x8 dots
 0xc,                                         // Display on
 1,                                       // Clear display
 6                                       // Increment cursor
 };

void lcd_send_nibble(int8 nibble)
{
 
 output_bit(LCD_DB4, !!(nibble & 1));
 output_bit(LCD_DB5, !!(nibble & 2)); 
 output_bit(LCD_DB6, !!(nibble & 4));   
 output_bit(LCD_DB7, !!(nibble & 8));   

 delay_cycles(1);
 output_high(LCD_EN);
 delay_us(2);
 output_low(LCD_EN);
}

void lcd_send_byte(int8 address, int8 n)
{
output_low(LCD_RS);

#ifdef USE_LCD_RW
while(bit_test(lcd_read_byte(),7)) ;
#else
delay_us(60); 
#endif

if(address)
   output_high(LCD_RS);
else
   output_low(LCD_RS);
     
 delay_cycles(1);

#ifdef USE_LCD_RW
output_low(LCD_RW);
delay_cycles(1);
#endif

output_low(LCD_EN);

lcd_send_nibble(n >> 4);
lcd_send_nibble(n & 0xf);
}

void lcd_init(void)
{
int8 i;

output_low(LCD_RS);

#ifdef USE_LCD_RW
output_low(LCD_RW);
#endif

output_low(LCD_EN);

delay_ms(15);

for(i=0 ;i < 3; i++)
   {
    lcd_send_nibble(0x03);
    delay_ms(5);
   }

lcd_send_nibble(0x02);

for(i=0; i < sizeof(LCD_INIT_STRING); i++)
   {
    lcd_send_byte(0, LCD_INIT_STRING);
   
    #ifndef USE_LCD_RW
    delay_ms(5);
    #endif
   }

}
void lcd_gotoxy(int8 x, int8 y)
{
int8 address;

if(y != 1)
   address = lcd_line_two;
else
   address=0;

address += x-1;
lcd_send_byte(0, 0x80 | address);
}
void lcd_putc(char c)
{
 switch(c)
   {
    case '\f':
      lcd_send_byte(0,1);
      delay_ms(2);
      break;
   
    case '\n':
       lcd_gotoxy(1,2);
       break;
   
    case '\b':
       lcd_send_byte(0,0x10);
       break;
   
    default:
       lcd_send_byte(1,c);
       break;
   }
}
       
#ifdef USE_LCD_RW
char lcd_getc(int8 x, int8 y)
{
char value;

lcd_gotoxy(x,y);

while(bit_test(lcd_read_byte(),7)); 

output_high(LCD_RS);
value = lcd_read_byte();
output_low(lcd_RS);

return(value);
}
#endif

//--------------------------------------------------------------------------//
//               FINAL CONFIGURACION LCD                           //
//--------------------------------------------------------------------------//


int signo = 0xDF;
int tmp=0;

void main()
{
   output_high(LCD_POWER);                  // Encendemos el "power" del LCD
   output_low(LCD_RW);                     // Ponemos el pin R/W del LCD a nivel bajo
   lcd_init();                           // Inicializamos el LCD.                                 
   
while (1)
   {
   i2c_start();                        // Iniciamos el bus I2C.                  
   i2c_write(escribir_dispositivo);         //
   i2c_write(0x00);
   i2c_start();
   i2c_write(leer_dispositivo);
   tmp=i2c_read();
   i2c_stop();
   lcd_gotoxy(3,2);
   printf(lcd_putc,"Temp : %2D%cC",tmp,signo);
   delay_ms(50);                        //Actualizamos cada 50 milisegundos.
   }
}


Gracias a las aportaciones de los compañeros del foro.


 

anything