El chip TC74 es un sensor de temperatura serie accesible a través del bus I2C fabricado por Microchip Technology que mide con una resolución de 1°C.
La temperatura está disponible en un byte que es almacenado en un registro interno.
El dato de temperatura es almacenado en formato binario con complemento a 2 y el bit más significativo es el bit de signo, que se establece en 1 para temperaturas negativas por lo tanto, la temperatura máxima positiva es de + 127 ° C (0111 1111). También existe otro registro de configuración (RWCR) que se utiliza para poner el dispositivo en bajo consumo (5μA), en este modo se detiene el convertidor A / D.

El programa para medir temperaturas con XC8 y un PIC18F460 es realtivamente simple.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/* ******************************************************************************************
**  Nombre       : TC74A3.c
**  Descripcion  : Sensor de Microchip I2C de 8 bits. (-40 a +125 grados)
**  Target       : PIC18F4620
**  Compilador   : Microchip XC8
**  XTAL         : 20MHZ 
**  www.firtec.com.ar 
** *******************************************************************************************/
#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
#include <plib/i2c.h>
#pragma config OSC=HS,PWRT=ON,MCLRE=OFF,LVP=OFF,WDT=OFF
 
#include "C:\ELECTRÓNICA\Programas PIC\2014\EJERCICIOS_XC8\TC74.X\lcd_xc8.c"
#include "C:\ELECTRÓNICA\Programas PIC\2014\EJERCICIOS_XC8\TC74.X\lcd_xc8.h"
 
#ifndef _XTAL_FREQ
 #define _XTAL_FREQ 20000000
#endif
 
void delay(unsigned int t){ // Mínimo argumento 2!!!! tarda 1mS.
while(--t)
    __delay_ms(1);
}
unsigned short num=0;
const int TC74A3 = 0x96; // Dirección I2C del sensor
 
//------------------------ FUNCIÓN PARA VERIFICAR EL SENSOR --------------------
void check_sensor(unsigned short dir){
 StartI2C();
 if (WriteI2C(dir)){
  lcd_gotoxy(1,2);
lcd_putrs("Sensor ERROR!!");     // Aviso NO hay sensor en el BUS!!!
while(1);
 }
 else {
     lcd_gotoxy(2,1);
     lcd_putrs("Sensor TC74A3");  // Cartel incial si detecta sensor.
 }
     StopI2C();
}
//---------------------- FUNCIÓN PARA LEER LA TEMPERTAURA ----------------------
unsigned short Leer_Temp(){
unsigned short dato;
 IdleI2C();                     // Pregunta si el bus está libre.
  StartI2C();                   // Pone la condición de inicio.
    IdleI2C();                  // Espera que termine.
     WriteI2C(TC74A3);          // Direcciona el sensor
 while(SSPCON2bits.ACKSTAT);    // Espera el ACK
         IdleI2C();             // Espera por el bus libre.
         WriteI2C(0x00);        // Escribe la dir 0 (registro de la temp)
while(SSPCON2bits.ACKSTAT);     // Espera el ACK
   IdleI2C();                   // Espera a que el bus esté libre
     RestartI2C();              // Re-inicio del bus
       IdleI2C();               // Espera que termine
         WriteI2C(TC74A3+1);    // Envía órden de lectura en la dir. 0
           while(SSPCON2bits.ACKSTAT);  // Espera por ACK
            dato = ReadI2C();           // Lee el registro y lo guarda en dato
             IdleI2C();                 // Espera que termine
               NotAckI2C();             // No hay ACK
                IdleI2C();              // Espera que termine
                 StopI2C();             // Condición de fin de transacción.
 return dato;                           // Retorna la temperatura
}
//--------------------- FUNCION PRINCIPAL DEL PROGRAMA -------------------------
void main() {
  char temperatura[] = "000";
 
  OpenI2C(MASTER,SLEW_OFF);  	// Modo Master
  SSPADD = 49;			// 100KHz para 20MHz
  
 lcd_init();	                // Configura el LCD a valores por defecto.
 lcd_gotoxy(1,2);
 lcd_putrs("Grados:");          // Cartel inicial II.
 check_sensor(TC74A3);          // Verifica la presencia del sensor en el BUS.
  while(1) {
    num = Leer_Temp();          // Lee la temperatura desde el sensor.
   if (num > 127) {             // Verifica si la temperatura es negativa.
       num = ~num +1;           // Complementa y ajusta la temperatura si es negativa
       sprintf(temperatura,"-%d ",num); // Completa el string para el LCD
   }
   else{
   sprintf(temperatura,"+%d ",num); // Temperatura positiva.
       }
   lcd_gotoxy(8,2);
   lcd_puts(temperatura);          // Muestra la teperatura.
   delay(500);
  } 
}
 

 

 

 

Descargar el proyecto completo para MPLAB X.