hola steban_santiago83
hace poco tiempo yo trabaje con el sensor de temperatura DS18B20, desarrolle una pequeña libreria que hasta ahora me funciona bien; esta tiene cuatro funciones pequeñas:
ds1820_init(); // inicialiaza el sensor
ds1820_read();// retorna (int8) el valor de la temperatura en grados ºC 0 a 128 parte real
ds1820_sig();// retorna(int1) 1= -ºC ; un 0= +ºC
ds1820_dec() //retorna un valor decimal de la temperatura puede ser 0 o 5 .
solo llamaba a incializar una vez en todo el programa; cada ves que queria leer la temperatura solo tengo que llamar a de1820_read().
a continuacion el codigo:
////////////////////////////////////////////////////////////////////////////
//// Libreria para DS18B20 (sensor de temperatura ) ////
//// DS18B20 conectado al PIN_B3 ////
//// autor: carlos alberto yaco tincusi ////
//// funciones: ////
//// ds1820_init(); // inicialiaza el sensor ////
//// ds1820_read();// retorna (int8) el valor de la temperatura ////
//// en grados ºC 0 a 128 parte real ////
//// ds1820_sig();// retorna(int1) 1= -ºC ; un 0= +ºC ////
//// ds1820_dec() //retorna un valor decimal de la temperatura //// ////
//// puede ser 0 o 5 ////
////////////////////////////////////////////////////////////////////////////
#define ds1820rw PIN_B3 // PUEDES CAMBIAR AL PIN QUE DESEEA
#byte comando=0x7c
#byte portb=6
int tempe1=0;// parte entera de la temperatura
int1 tempe2=0;// parte decimal de la temperatura
int dec=0; //parte deciaml 0.0 o 0.5
int aux=0; //Variable auxiliar multipropósito
int16 tempe=0; // temperatura 16 bits
void entrada(void);//configuracion como entrada ds1820rw
void salida (void);//configuracion como salida ds1820rw
void write1(void);// escribir un bit 1 en el ds1820
void write0(void);// escribir u bit 0 en el ds1820
void leer_bit(void);// leer un bit del ds1820
void escribir_ds1820(void); //escribir ds1820
void read_ds1820(void); //leer ds1820
void conversion (void);// calculo de la temperatura
void ds1820_init(void)
{
entrada();
salida();
output_low(ds1820rw);
delay_us(480);
entrada();
delay_us(80);
delay_us(400);
}
int8 ds1820_read(void)
{
int1 tempe2=0;
ds1820_init();
comando=0xcc;//saltar rom
escribir_ds1820();
comando=0x44; //conversion A/D
escribir_ds1820();
delay_us(2000);//espero
ds1820_init();
comando=0xcc;//saltar rom
escribir_ds1820();
comando=0xbe;//inviar temperatura
escribir_ds1820();
delay_ms(750);
read_ds1820();
conversion();
return(tempe1);
}
void leer_bit(void)
{
bit_set(tempe,15);
salida();
output_low(ds1820rw);
delay_us(10);
entrada();
if(bit_test(portb,3)==0)
{
bit_clear(tempe,15);
}
delay_us(50);
}
void entrada (void)
{
set_tris_b(0b00001000);
}
void salida (void)
{
set_tris_b(0b00000000);
}
void write1(void)
{
salida();
output_low(ds1820rw);
delay_us(10);
entrada();
delay_us(50);
}
void write0(void)
{
salida();
output_low(ds1820rw);
delay_us(60);
entrada();
}
void escribir_ds1820(void)
{
for(aux=1;aux<=8;aux++)
{
if (bit_test(comando,0)==0)
{
write0();
}
else
{
write1();
}
shift_right(&comando,1,0);
}
}
void read_ds1820(void)
{
for (aux=1;aux<=16;aux++)
{
shift_right(&tempe,2,1);
leer_bit();
}
if (bit_test(tempe,15)==1)
{
tempe2=1;
}
else
{
tempe2=0;
}
if (bit_test(tempe,3)==1)
{
dec=5;
}
else
{
dec=0;
}
}
void conversion (void)
{
tempe=tempe&0b0000011111110000;
for(aux=1;aux<=4;aux++)
{
shift_right(&tempe,2,0);
}
if(tempe2==1)
{
tempe=~tempe;
tempe=tempe+1;
if (dec==5)
{
tempe=tempe-1;
}
}
bit_clear(tempe,7);
tempe1=tempe;
}
int1 ds1820_sig(void)
{
return(tempe2);
}
int8 ds1820_dec(void)
{
return(dec);
}
PD: le di la libreria a un amigo y me digo que solo funcionaba cuando se conectaba al PINB3 el ds18b20(para el cual estaba diseño la libreria en su inicio)