//// Controlador para el termómetro digital Dallas DS18B20, con Dallas one ////
//// interfaz de cable. ////
//// ////
//// ds18b20_init () ////
//// Inicia el módulo y el controlador. ////
//// ////
//// int1 = ds18b20_read (firmado int16 * pTemp) ////
//// Lee la temperatura del dispositivo y guarda el valor de lectura en pTemp ////
//// puntero. Devuelve VERDADERO si hablamos con éxito con el dispositivo ////
//// y pTemp se actualizó; devuelve FALSE si hubo un error ////
//// en comunicación y pTemp no se actualiza. ////
//// Esto bloqueará el PICmicro mientras espera el ////
//// DS18B20 para devolver una conversión, que puede tomar más de 750 ms. ////
//// También esta rutina puede atascarse en un bucle infinito y no ////
//// regresa si hay un problema con el bus. ////
//// Para limitar el interbloqueo, use ds18b20_start_conversion () y ////
//// ds18b20_get_conversion () en su lugar. ////
//// La temperatura devuelta es grados C, pero fraccional; ////
//// divide entre 16 para obtener el numerador entero. ////
//// ////
//// int1 ds18b20_start_conversion (void) ////
//// Esto inicia una conversión de temperatura en el DS18B20. ////
//// Devuelve VERDADERO si la comunicación fue exitosa, FALSO si existe ////
//// había algo mal con el bus o el dispositivo. ////
//// ////
//// int1 ds18b20_get_conversion (firmado int16 * pTemp) ////
//// Después de que se inicia una conversión, puede esperar a Tconv ////
//// (que es 750 ms para la conversión de resolución máxima) o encuesta ////
//// el bus con ds18b20_read_bit () (si devuelve un valor distinto de cero ////
//// entonces la conversión ha finalizado). Una vez finalizada la conversión ////
//// entonces esta función lee la conversión almacenada en ////
//// dispositivo DS18B20. ////
//// ////
//// CONEXIONES ////
//// ////
//// PIN_DS18B20_DATA ////
//// #define esto al pin PIC GPIO conectado al DS18B20 ////
//// pin de datos. ////
//// Ejemplo: #define PIN_DS18B20_DATA PIN_D0 ////
//// ////
//////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////
//// (C) Copyright 1996,2016 Servicios informáticos personalizados ////
//// Este código fuente solo puede ser utilizado por usuarios con licencia de CCS C ////
//// compilador. Este código fuente solo se puede distribuir a otros ////
//// usuarios con licencia del compilador CCS C. Ningún otro uso, reproducción ////
//// o la distribución está permitida sin un permiso por escrito. ////
//// Programas derivados creados con este software en código objeto ////
//// forma no están restringidos de ninguna manera. ////
//// ////
//// http://www.ccsinfo.com ////
//////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////
/// begin config ///////////////////////////////////////////// //////////////
#ifndef PIN_DS18B20_DATA
#define PIN_DS18B20_DATA PIN_B5
#endif
/// end config ////////////////////////////////////////////////////////////
void ds18b20_init(void)
{
output_float(PIN_DS18B20_DATA);
}
/*
This method will initialize the DS18B20 for transactions to occur
PARAMS: none
RETURNS: TRUE if start pulse response read from unit
*/
int1 ds18b20_start(void)
{
int1 ret = FALSE;
output_low(PIN_DS18B20_DATA);
delay_us(500);
output_float(PIN_DS18B20_DATA);
delay_us(70);//wait to read the SLAVES response
if (!input(PIN_DS18B20_DATA))
{
ret = TRUE;
delay_us(430);
}
return(ret);
}
/*
This method will write a bit to the DS18B20 following write time slots
PARAMS: int1 value to write
RETURNS: none
*/
void ds18b20_write(int1 value)
{
output_low(PIN_DS18B20_DATA);//drives output low for master
delay_us(2);//delays for 2us
output_bit(PIN_DS18B20_DATA,value);//sets MASTER to input mode to release pin
delay_us(60);
output_float(PIN_DS18B20_DATA);//sets MASTER to input mode to release pin
delay_us(2);//delays for 2 microseconds which is within 15us max
}
/*
This method will call write() for each bit of a byte to be sent
PARAMS: BYTE value to write
RETURNS: none
*/
void ds18b20_write_byte(unsigned int8 value)
{
unsigned int8 i;
for(i=1;i<=8;++i)
{
ds18b20_write(shift_right(&value,1,0));
}
}
/*
This method will read a value from the DS18B20 following the read time slots
PARAMS: none
RETURNS: A bit from the DS1993
*/
int1 ds18b20_read_bit(void)
{
int1 value;
output_low(PIN_DS18B20_DATA);//drives output low for master
delay_us(2);
output_float(PIN_DS18B20_DATA);//sets MASTER to input mode to release pin
delay_us(8);//waits to read
value=input(PIN_DS18B20_DATA);
delay_us(120);
return value;
}
/*
This method will call read() and update a byte bit by bit
PARAMS: none
RETURNS: A byte from the DS1993
*/
unsigned int8 ds18b20_read_byte()
{
unsigned int8 i, value;
for(i=0; i<8; i++)
{
shift_right(&value,1,ds18b20_read_bit());
}
return value;
}
int1 ds18b20_start_conversion(void)
{
if (!ds18b20_start())
return(FALSE);
ds18b20_write_byte(0xCC);
ds18b20_write_byte(0x44);
return(TRUE);
}
int1 ds18b20_get_conversion(signed int16 *pTemp)
{
union
{
unsigned int8 b[2];
signed int16 w;
} ret;
if (!ds18b20_start())
return(FALSE);
ds18b20_write_byte(0xCC);
ds18b20_write_byte(0xBE);
ret.b[0] = ds18b20_read_byte();
ret.b[1] = ds18b20_read_byte();
*pTemp = ret.w;
return(TRUE);
}
int1 ds18b20_read(signed int16 *pTemp)
{
if (!ds18b20_start_conversion())
return(FALSE);
while(!ds18b20_read_bit());
return(ds18b20_get_conversion(pTemp));
}
/*
This method will initiate a temperature read (12 bit resolution) and convert
of the module by skipping the ROM of the module and reading from
the scratch pad
PARAMS: pTemp - where temperature is stored if valid read
RETURNS: TRUE if ds18b20 is on bus and acting properly
*/
/*
int1 ds18b20_read(signed int16 *pTemp)
{
unsigned int8 busy = 0;
union
{
unsigned int8 b[2];
signed int16 w;
} ret;
if (!ds18b20_start())
return(FALSE);
ds18b20_write_byte(0xCC);
ds18b20_write_byte(0x44);
while(busy==0)
busy=ds18b20_read_byte();
if (!ds18b20_start())
return(FALSE);
ds18b20_write_byte(0xCC);
ds18b20_write_byte(0xBE);
ret.b[0] = ds18b20_read_byte();
ret.b[1] = ds18b20_read_byte();
return(ret.w);
}
*/