TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: j_fernandez 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 saludo
-
Te has mirado el data sheet?
http://pdf.alldatasheet.com/datasheet-pdf/view/75085/MICROCHIP/TC74.html
y aqui el espacio que dedica Microchip a este dispositivo: http://www.microchip.com/stellent/idcplgidcplg?IdcService=SS_GET_PAGE&nodeId=1335&dDocName=en010749
Suerte!!!
-
Gracias vszener !! Lo probare y ya te dire algo
Un saludo
-
pues yo lo estoy probando, ya que este componente desde la web de PACALACONCURSO lo cita y no me va
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
-
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.....
-
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.
-
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... 
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 
un saludo
-
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.
-
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"
;
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"
;
}
}
*****************************************************************
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
-
eres un hacha, ahora lo probare yo

hasta hora
un saludo
-
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!!!!!

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
-
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
-
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;)
-
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.