Autor Tema: DHT22 y pic 16f876a  (Leído 3405 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado martinsalazar7

  • PIC10
  • *
  • Mensajes: 6
DHT22 y pic 16f876a
« en: 03 de Marzo de 2016, 20:37:25 »
Buenas Tardes gente. Ante todo me presento me llamo Martin soy de Argentina estoy estudiando en la facu y iniciandome en PIC. Los molesto por lo siguiente me tiene recontra trabado esto y no encuentro el problema!. Tengo un sensor DHT22 el cual compre para arduino pero bueno en la facu enseñan pic asique busque y sirve igual bueno la cuestion es que eh encontrado una libreria para CCS la cual voy a adjuntarles en el post. y tengo un display de 16x2 hasta ahi una maravilla je. la cuestion es que no puedo hacer que me lea los datos del sensor. estoy usando un pic 16f876a con un oscilador de 20mhz. Estoy simulando con proteus 8.3sp2. Tambien les adjunto el codigo que hice el cual es simplemente mostrar la temp y hum que me manda el sensor. Lo tengo conectado a la pata RA0 lo modifique dentro de la libreria del DRIVER_DHT22. La verdad que es rarisimo. Bueno agradezco de antemano. Saludos!!!

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:DHT22 y pic 16f876a
« Respuesta #1 en: 03 de Marzo de 2016, 21:09:04 »
Por ahora hasta que lo vea mejor te tengo que decir unas cosas:

- Si queres aprender PIC, crea tus propias librerias
- Lo que es de "Arduino" es para cualquier micro, nomas que tiene tanta fama "Arduino" que te dan todo servido, libreria, etc. Solo conectas y bajas libreria.
- Lo raro no es que no funcione, lo raro es que funcione una libreria bajada de internet asi como asi.
- CCS me parece algo brusco para alguien que recien comienza y tiene que aprender mucho del datasheet del PIC, especilamente por que pasan algunas cosas por detras del usuario y que si no se maneja con CCS ocasionan problemas.

Luego veo el codigo, no uso CCS, pero voy a ver si le encuentro algo malo, Como por ejemplo el dht_init() no es una inicializacion como lo tenes puesto vos, es para pedirle los datos al DHT22, algo que esta incorporado en leer_dht22(), pero no en leer_datos_dht(). Asi que si queres usar el leer_datos_dht() tenes que hacerlo asi:

Código: C
  1. dht_init();
  2. leer_datos_dht();

Sino podes usar directamente leer_dht22();

Código: C
  1. void main()
  2. {
  3.  
  4. float dhthum, dthtemp;
  5.  
  6. setup_adc_ports(AN0);
  7. lcd_init();
  8. delay_ms(500);
  9.  
  10. while(true)
  11.    {
  12.    
  13.    delay_ms(500);
  14.    leer_dht22(dhthum, dthtemp);
  15.    delay_ms(100);
  16.    printf(lcd_putc,"\f Humedad = %f %%",dhthum);
  17.    delay_ms(11);
  18.    printf(lcd_putc,"\nTemperatura = %f %cC", dthtemp,223);
  19.    delay_ms(11);
  20.  
  21.    }
  22. }

el PIN_A0 deberia ser digital, lo estas poniendo como analogico me parece. Asi que es otro problema mas.
Y aunque le acertaste recorda siempre esperar 1 segundo hasta la primer lectura ( si es que es igual que el DHT11 )
« Última modificación: 03 de Marzo de 2016, 23:20:04 por KILLERJC »

Desconectado martinsalazar7

  • PIC10
  • *
  • Mensajes: 6
Re:DHT22 y pic 16f876a
« Respuesta #2 en: 06 de Marzo de 2016, 12:56:28 »
Comprendo... mira en la facu nos enseñaron PICC el tema es que no me funciona en mi pc asique tengo que usar CCS. Me baje el datasheet como planteaste y me lo puse a estudiar para tratar de hacer la libreria. Me gustaria que me digas haber si estoy entendiendo bien..

1-El micro le manda una señal baja durante 20 ms para decirle al dht que va a empezar a sensar?
2-luego le manda una señal alta durante 20 US.
3-Luego le responde el DHT con una señal baja durante 85us.
4-Luego le responde el DHT con una señal alta durante 85us.
y luego comenzaria el sensor a enviarle los datos de temp y hum puede ser que este en lo correcto?.
ahora mi duda es la siguiente para que me sirve el paso 3 y 4 osea yo tengo que leer esas 2 y preguntarle si mando un 0 o un 1? para seguir o como seria esa parte... nose si me explico.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:DHT22 y pic 16f876a
« Respuesta #3 en: 06 de Marzo de 2016, 14:01:16 »
Tenes que pensar que la comunicacion se realiza por un solo hilo. Para evitar problemas las salidas deberian ser colector abierto. Y la linea de datos poseer una resistencia a VCC.

Una salida a colector abierto tiene 2 estados, alta impedancia y ponerlo a 0V. En el caso del PIC para simular esto seria, ponerle como entrada ( colector abierto ) y ponerlo como salida y 0.
Ya que si pones a 1 la salida del PIC corres el riesgo que el DHT22 ponga a 0 la salida de datos produciendose un cortocircuito. Uniendo 5V con 0V.

Con esto dicho voy por los pasos que enviaste. y los corrigo si veo algo malo

Citar
1-El micro le manda una señal baja durante 20 ms para decirle al dht que va a empezar a sensar - Es correcto
2-luego le manda una señal alta durante 20 US - La señal "alta" es en realidad el pin puesto en alta impedancia (entrada), la resistencia de pull-up lo lleva a 5V
3-Luego le responde el DHT con una señal baja durante 85us. Correcto, aunque lo vi en 80us al igual que abajo
4-Luego le responde el DHT con una señal alta durante 85us.

Citar
ahora mi duda es la siguiente para que me sirve el paso 3 y 4 osea yo tengo que leer esas 2 y preguntarle si mando un 0 o un 1? para seguir o como seria esa parte... nose si me explico.

El paso 3 y 4 a vos no te sirve de mucho, solo para saber que el DHT22 recibio la orden de envio de los datos, igual al final de los 40bits se envia un pulso bajo mas si no tengo mal entendido. La mayoria termina haciendo algo asi:

Código: C
  1. output_low(PIN_xx);  // Si esta en standart_io lo pasa a salida solo
  2. delay_ms(20);
  3. input(PIN_xx);  // Si esta en standart_io lo pasa a entrada solo, sino cambiar el tris aca.
  4. delay_us(10);
  5. while(input(PIN_xx)!=0);     // Espero que se ponga en 0
  6. while(input(PIN_xx)!=1);     // Terminado el 0 espero que se ponga en 1.
  7. // Aca recibo los datos

Luego leer los datos es facil tambien. Por que lo unico que varia del dato es el tiempo que esta en "1", por lo tanto, esperas que se ponga en 0, luego que se ponga en 1, usas un delay por ejemplo de 30us y lees de nuevo, Si es 0 es por que paso al otro bit (el 0 tarda entre 26-28us) y corresponde a un 0 leido, si todavia sigue en 1 ( como tarda 70us ) entonces es un 1.
Para recibir el otro volves a repetir esto, es decir esperas el 0, que en el caso que hubiera sido un 0 antes ya estaria. y luego el 1.

OJO. Por ahi dependiendo de la velocidad de tu PIC ( si por ejemplo elegis usarlo a 4Mhz ) tal ves te quedes corto haciendolo en C. Es decir que le tomaria mas tiempo. Para mejorar un poco mas el tiempo deberias usar FAST_IO y no STANDART_IO, y tambien aumentar la frecuencia (o directamente aumentar la frecuencia solo), En ASM una persona lo pidio hace poco y no quedaba demasiado tiempo libre con 4Mhz.

Una cosa mas que me olvidaba, al comienzo hay que esperar un buen tiempo antes de pedirle los datos, creo que 1 segundo desde que se la da tension a todo y luego Cada 2 segundos actualiza todo dentro el DHT22, Por lo cual no te sirve de nada leerlo 100 veces en 1 segundo.

Respecto al compilador, C es lo mismo en cualquier compilador, nomas que CCS como te decia tiene algunas cosas que lo hace por detras del usuario, ejemplo con STANDART_IO cada ves que usar output_high/low/a/b/c/d, o input, inserta codigo para cambiarle el estado al pin. Esto lo podes notar cuando queres tener una salida a un valor y luego preguntar el valor de esa salida.

Con STANDART_IO:

Código: C
  1. output_low(PIN_B0);    // Aca lo pone como salida
  2. //... varias instrucciones
  3. if(input(PIN_B0)==0){}    // Al usar input, lo convierte en entrada pasandolo a alta impedancia, y no es lo que queriamos hacer

Con FAST_IO:

Código: C
  1. #use FAST_IO(b)
  2.  
  3. set_tris_b(0b00000000);     // Todas salidas
  4. output_low(PIN_B0);           // Aca simplemente cambia la salida
  5. //... varias instrucciones
  6. if(input(PIN_B0)==0){}    // Al usar input, esta ves solamente lee el estado de la salida, sin pasarlo a entrada

Otras cosas mas que tambien ocurren creo que es la limpieza de la flag de interrupcion. Al menos estoy acostumbrado a XC8 y esto no ocurre.
« Última modificación: 06 de Marzo de 2016, 14:09:28 por KILLERJC »

Desconectado martinsalazar7

  • PIC10
  • *
  • Mensajes: 6
Re:DHT22 y pic 16f876a
« Respuesta #4 en: 07 de Marzo de 2016, 09:12:38 »
Muchisimas gracias!ya me pongo a trabjar en eso!! cualquier cosa te consulto


 

anything