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.