Queria saber si alguien tiene experiencia con este sensor y el uC Atmega, ya que estoy teniendo problemas a la hora de leerlo. Mas que nada me interesa saber si el manejo de los puertos es el correcto, y si me estoy mandando alguna ca...ada y no me doy cuenta.
El codigo que uso es este y el uC esta configurado para que funcione con el oscilador interno de 1MHz:
Las rutinas de delay que uso son estas:
El retardo de 20mSeg lo pude comprobar con el osciloscopio.
Estas son las rutinas para el manejo del puerto:
En las hojas de datos del DHT11, me da estas curvas:
Cuando lo pruebo, siempre salta el Time-out (le puse un time out con el T0 para que no quede parado el programa en caso de error) en el While de arranque (arrq) y en el 1er Byte, nunca paso ese while.
Tambien probe usando pull-up externo como indica la figura, es decir que el puerto funcione como Alta Z y a la hora de generar un nivel logico "0" paso a modo salida. Obtuve el mismo resultado, se queda en el mismo While.
El sensor se que funciona bien porque 1ero lo use con un 8051 y no tiene problemas en leerlo, pero algo estare haciendo mal con el Atmega que no lo pudo leer bien el sensor (ni siquiera llego a la parte del checksum).
El codigo que uso es este y el uC esta configurado para que funcione con el oscilador interno de 1MHz:
Código:
#define u8 unsigned char
#define u16 unsigned int
#define dht11_data (1<<PD3)
void configura_dht()
{
DDRD|=dht11_data;
set_bits(&PORTD,dht11_data); //Queda como salida=1
}
u8 verificar_datos(struct datos_humedad valor)
{
u8 suma=0,cont;
for(cont=0;cont<4;cont++)
suma+=valor.data_humedad[cont];
if(suma==valor.data_humedad[4])
suma=1;
else
suma=2;
return suma;
}
struct datos_humedad obtiene_valor_humedad(struct datos_humedad info)
{
u8 n_bit=0,n_byte=0;
u8 bit_arranque=0;
delay_s(1);
clear_bits(&PORTD,dht11_data); //Mando salida=0
delay_ms(20);
set_bits(&PORTD,dht11_data); //Mando salida=1
DDRD&=~dht11_data; //Paso a entrada con pull-up interno
asm("nop");
configura_timer0(0xEC,5); //10mSeg de time-out
flag_timer0=0;
while((PIND&dht11_data)&&(!flag_timer0)); //Espera respuesta del Sensor
if(flag_timer0)
{
imprime_pantalla("While 1 \n","\n",0x00);
delay_s(2);
info.codigo=0;
DDRD|=dht11_data; //Queda como salida=1
return info;
}
while((!(PIND&dht11_data))&&(!flag_timer0)); //Espera pull-up del Sensor
if(flag_timer0)
{
imprime_pantalla("While 2 \n","\n",0x00);
delay_s(2);
info.codigo=0;
DDRD|=dht11_data; //Queda como salida=1
return info;
}
do{
if(!bit_arranque)
{
while((PIND&dht11_data)&&(!flag_timer0)); //Espera bit de arranque
if(flag_timer0)
{
n_byte+=0x30;
imprime_pantalla("While arrq \n","\n",0x00);
comando_lcd_4bit(0x80|12);
dato_lcd_4bit(n_byte);
delay_s(2);
info.codigo=0;
DDRD|=dht11_data; //Queda como salida=1
return info;
}
}
else
bit_arranque=0;
while((!(PIND&dht11_data))&&(!flag_timer0)); //Espera bit de datos
if(flag_timer0)
{
imprime_pantalla("While datos \n","\n",0x00);
delay_s(2);
info.codigo=0;
DDRD|=dht11_data; //Queda como salida=1
return info;
}
delay_30us();
if(!(PIND&dht11_data)) // Si el bit es 0 => implica bit de arranque y que el bit de dato fue 0
{
if(!n_bit)
info.data_humedad[n_byte]=0;
bit_arranque=1;
}
else // Si el bit no es 0 durante los 30uSec => el bit de datos es 1
{
if(!n_bit)
info.data_humedad[n_byte]=0;
info.data_humedad[n_byte]|=(0x80>>n_bit);
}//Bit=1
n_bit++;
if(n_bit==8)
{
n_bit=0;
n_byte++;
}
}while(n_byte<5);
info.codigo=verificar_datos(info);
DDRD|=dht11_data; //Queda como salida=1
return info;
}
Las rutinas de delay que uso son estas:
Código:
void delay_30us(void)
{
u8 i;
for(i=0;i<75;i++);
}
void delay_ms(u16 cont)
{
u16 aux,aux2;
for(aux=0;aux<cont;aux++)
{
for(aux2=0;aux2<50;aux2++);
}
}
void delay_s(u16 cont)
{
u16 aux;
for(aux=0;aux<cont;aux++)
delay_ms(1000);
}
El retardo de 20mSeg lo pude comprobar con el osciloscopio.
Estas son las rutinas para el manejo del puerto:
Código:
void set_bits (volatile u8 *port, u8 mask)
{
*port |= mask;
}
void clear_bits (volatile u8 *port, u8 mask)
{
*port &= ~mask;
}
En las hojas de datos del DHT11, me da estas curvas:
Cuando lo pruebo, siempre salta el Time-out (le puse un time out con el T0 para que no quede parado el programa en caso de error) en el While de arranque (arrq) y en el 1er Byte, nunca paso ese while.
Tambien probe usando pull-up externo como indica la figura, es decir que el puerto funcione como Alta Z y a la hora de generar un nivel logico "0" paso a modo salida. Obtuve el mismo resultado, se queda en el mismo While.
El sensor se que funciona bien porque 1ero lo use con un 8051 y no tiene problemas en leerlo, pero algo estare haciendo mal con el Atmega que no lo pudo leer bien el sensor (ni siquiera llego a la parte del checksum).
Última edición: