///////////////////////////////////////////////////////////////////////////////////
/// VsZeNeR'06 ///
/// 23/Mayo/06 ///
/// vszener@gmail.com ///
/// ///
/// Libreria: vs_DS1620.C Compilador: CCS ///
/// Version: 1.0 ///
/// ///
/// Notas: Controlador para temperatura del dispositivo ds1620 ///
/// de Dallas Instruments ///
/// ///
/// Funciones: temp= read_ds1620(); -> lee la temperatura (float) ///
/// ///
/// ///
/// ·Libreria solamente provada en simulador PROTEUS ///
///////////////////////////////////////////////////////////////////////////////////
#ifndef DS1620_DQ
#define DS1620_DQ PIN_B5 //declaracion...
#define DS1620_CLK PIN_B6
#define DS1620_RST PIN_B7 //...de pines por defecto
#endif
///FUNCION QUE ESCRIBE LOS COMANDO EN EL DS1620/////////////////////////
void write_ds1620_byte(BYTE cmd) {
BYTE i;
for(i=0;i<8;++i) { //se escribe siempre...
output_bit(DS1620_DQ, shift_right(&cmd,1,0) ); //mando el comando al ds1620
output_high(DS1620_CLK); //los datos se escriben...
output_low(DS1620_CLK); //...en el flanco descendente de CLK
} //...8bits para la escritura
}
///FUNCION QUE DEVUELVE LA TEMPERATURA DEL DS1620 FORMATO FLOAT/////////
float read_ds1620() {
float temp; //dato donde se almacena la temperatura
BYTE i,data_lsb; //i contador; data_lsb dato leido ds1620
boolean bit_sig; //solo interesa el bit menos significativo del byte msb
output_high(DS1620_RST); //activo RST para la transmision/recepcion de datos
write_ds1620_byte(0xAA); //mando el comando de leer temp
//////BYTE LSB DE TEMPERATURA///////////////////////
for(i=0;i<8;++i) { //nos dara lsb byte
shift_right(&data_lsb,1,input(DS1620_DQ)); //almaceno el estado pin DQ en la variable data_lsb
output_high(DS1620_CLK); //el dato se da...
// delay_us(1);
output_low(DS1620_CLK); //...en el flanco de bajada del CLK
// delay_us(1);
}
//////BYTE MSB DE SIGNO////////////////////////////
for(i=0;i<7;++i) { //los 7bits mas significativos de msb...
output_high(DS1620_CLK);
// delay_us(1);
output_low(DS1620_CLK); //...no interesan, solo interesa el bit menos significativo
// delay_us(1);
}
bit_sig=input(DS1620_DQ); //bit menos significativo de MSB[1=negativo ; 0=positivo]
output_low(DS1620_RST); //fin de la comunicacion!
////EL ULTIMO BIT DE LSB NOS DICE SI ES NUMERO ENTERO o X.5//////////
if(bit_test(data_lsb,0)==0) //¿es numero entero?
i=0; //SI -> flag que indica numero es entero
else
i=1; //NO -> flag que indica numero decimal X,5
////LA VARIABLE bit_sig NOS DICE SI ES POSITIVA O NEGATIVA LA TEMP////////////
if(bit_sig==0){ //¿es positivo? bit_sig=0 -> temp positiva
data_lsb>>=1; //SI -> tratamiento del dato
if(i==0) //¿es temperatura entera?
temp=data_lsb+0.0; //SI -> temp= x.0
else
temp=data_lsb+0.5; //NO -> temp= x.5
}
else{ //NO -> temp negativa: tratamiento de la informacion:
data_lsb>>=1; //desplazo el dato hacia la derecha 1bit
data_lsb|=0x80; //el bit mas significativo lo pongo a 1 (por bit_sig)
data_lsb-=1; //complemento a 2
data_lsb=(~data_lsb); //complemento a 1
if(i==0) //¿es temperatura entera?
temp=-(data_lsb+0.0); //SI -> temp= -x.0
else
temp=-(data_lsb+0.5); //NO -> temp= -x.5
}
return temp; //devuelve temperatura
}