Codigo://////////////////////////////////////////////////////
#include <delays.h>
#include "1wire.h"
#define Pin_LOW PORTAbits.RA4=0; TRISA = 0b00000000;
// Pin RA4 esta en 0 y es salida
#define Pin_Entrada TRISA = 0b00010000;
// Pin RA4 es entrada y con nivel alto puesto por la resistencia 4,7K
#define Pin_Lee PORTAbits.RA4;
// Pin donde esta conectado el sensor (pin6 de pic18F4550)
extern unsigned char puntero_array;
extern unsigned char ROM_DATA [9];
/***************************** Reset_1Wire *****************************/
/*Esta función inicializa el buz 1wire */
/*Argumentos: ninguno */
/*Retorna: 0 si todo OK */
/***********************************************************************/
int Reset_1wire(void)
{
int result=1;
Pin_LOW
Delay10TCYx(250); // 500uS. El pin RA4 baja al menos 480 uS
Pin_Entrada; // Coloca RA4 como entrada, resit.de 4k7 pone el pin en alto
Delay10TCYx(30); // 60uS. Entre 15 y 60uS, DS1820 pone el pin en 0
result = (int)Pin_Lee // Lee el estado del pin
Delay10TCYx(120); // 240uS. Espera para asegurar el estado del pulso de presencia
return (result); // 0 = DS1820 Encontrado!!!
}
/*********************** Escribir_Bit() ******************************/
/* Esta función escribe un bit en el sensor. */
/* Argumentos: Un bit (El bit a escribir en el bus 1-wire) */
/* Retorna: nada */
/***********************************************************************/
void Escribir_Bit(int bit)
{
if (bit) // Escribe un '1'
{
Pin_LOW // RA4 baja para generar la ventana de tiempo
Delay10TCYx(3); // 5uS.
Pin_Entrada // Libera el pin para que la resit de 4.7k ponga un 1
Delay10TCYx(30);// 60uS. Espera para asegurar el bit en el DS1820
}
else
{ // Escribe un '0'
Pin_LOW // RA4 baja para generar la ventana de tiempo
Delay10TCYx(30);// 60uS. El pin en 0 escribe en el bus un 0
Pin_Entrada // Libera RA4 que pasa a 1 por la resist. de 4.7k
}
Delay10TCYx(5); // 10uS Tiempo de recuperación
}
/*********************** Leer_Bit() ******************************/
/* Esta función lee un bit desde el sensor. */
/* Argumentos: ninguno */
/* Retorna: El estado del bit en el pin DQ del sensor */
/***********************************************************************/
int Leer_Bit(void)
{
int result=0;
Pin_LOW // RA4 Baja
Delay10TCYx(3); // 5uS espera
Pin_Entrada // Libera RA4 para generar la ventana de de tiempo de lectura
Delay10TCYx(3); // 5uS Espera para validar la ventana de lectura
result = (int)Pin_Lee // Lee el bus 1-wire
Delay10TCYx(30); // 60uS. Espera para completar la ventana de tiempo
return (result); // Retorna el bit
}
/*********************** Escribir_Byte() ******************************/
/* Esta función escribe un byte en el sensor. */
/* Argumentos: byte (El byte a escribir en el bus 1-wire) */
/* Retorna: nada */
/***********************************************************************/
void Escribir_Byte(int data)
{
int loop;
// Bucle para escribir cada bit del byte
for (loop = 0; loop < 8; loop++)
{
Escribir_Bit(data & 0x01);
data >>= 1;
}
}
/*********************** leer_Byte() **********************************/
/* Esta función lee 8 bit´s desde el sensor 1-wire. */
/* Argumentos: ninguno */
/* Retorna: 8 bit´s (1-byte) los datos desde el sensor */
/***********************************************************************/
int Leer_Byte(void)
{
int loop, result=0;
for (loop = 0; loop < 8; loop++)
{
result >>= 1;
if (Leer_Bit())
result |= 0x80;
}
return result;
}
/*********************** Medir_Temperatura() ***************************/
/* Esta función inicia la conversión para medir la temperatura. */
/* Argumentos: ninguno */
/* Retorna: nada */
/***********************************************************************/
void Medir_Temperatura(void)
{
Reset_1wire(); // Reset del bus
ENVIAR_ROM_CODE(); // Envía el código ROM
Escribir_Byte(0x44); // Iniciar Conversión
while(Leer_Bit() == 0); // Termino de Medir???
Reset_1wire(); // Reset del bus
}
/*********************** Leer_DS18S20() ***************************/
/* Esta función lee la temperatura de un sensor DS1820. */
/* Argumentos: ninguno */
/* Retorna: La temperatura con signo */
/***********************************************************************/
float Leer_DS18S20(void)
{
unsigned char get[10];
int k, temp;
float ftemp;
ENVIAR_ROM_CODE(); // Envía el código ROM
Escribir_Byte(0xBE); // Lee Scratch Pad
for (k=0; k<9; k++) // Lee 9 bytes desde scratchpad
get[k]=Leer_Byte();
temp = get[0]; // Carga los 8 bits menos significativos
if (get[1] > 0x80) // Bit del signo seteado si temp es negativa
temp = temp * -1;
ftemp = temp;
return (ftemp/2);
}
/*********************** Leer_DS18B20() ***************************/
/* Esta función lee la temperatura de un sensor DS18B20. */
/* Argumentos: ninguno */
/* Retorna: La temperatura con signo */
/***********************************************************************/
float Leer_DS18B20(void)
{
unsigned char get[10];
int k;
long temp;
float ftemp;
ENVIAR_ROM_CODE(); // Envía el código ROM
Escribir_Byte(0xBE); // Lee scratch pad
for (k=0; k<9; k++) // Lee 9 bytes desde scratchpad
get[k]=Leer_Byte();
temp = get[1] & 0x7;
temp = temp << 8;
temp = (temp | get[0]);
if (get[1] > 0x80)
temp = temp * -1;
ftemp = temp;
return (ftemp/16);
}
/********************** ENVIAR_ROM_CODE *************************/
/* Esta función envía los 64 bit's del ROM CODE */
/* Argumentos: Ninguno */
/* Retorna: Nada */
/****************************************************************/
void ENVIAR_ROM_CODE(void){
Reset_1wire();
Escribir_Byte(0x55);
puntero_array=0;
for(puntero_array=0;puntero_array<=7;puntero_array++){
Escribir_Byte(ROM_DATA[puntero_array]);
}
}
fin de codigo///////////////////////////////////////////////////////////////////