TODOPIC

Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: jo.an. en 05 de Febrero de 2016, 16:26:01

Título: Dht11 en assembler
Publicado por: jo.an. en 05 de Febrero de 2016, 16:26:01
Alguien tiene un ejemplo en assembler para hacer funcionar un senspr dht11 no me funciona
Título: Re:Dht11 en assembler
Publicado por: PalitroqueZ en 05 de Febrero de 2016, 20:08:21
Código: [Seleccionar]
http://www.edaboard.com/thread247608.html?__hstc=48151032.708c6e9d5b1af0269f87039dbe7e4d0c.1454713141160.1454713141160.1454713141160.1&__hssc=48151032.1.1454713141160&__hsfp=1745313190
Título: Re:Dht11 en assembler
Publicado por: jo.an. en 08 de Febrero de 2016, 22:06:30
Saludos palitroquez. Baje el ejemplo de la direccion que enviaste y no consigo que se mueva. Con que lo pueda ver en un puerto como varia la temperatura y la humedad de ahi en adelante vere como le hago. Gracias
Título: Re:Dht11 en assembler
Publicado por: PalitroqueZ en 08 de Febrero de 2016, 23:55:40
y estás usando el mismo cristal?,

recuerda que la secuencia para leer la data del DHT11 requiere de unos tiempos establecidos para cada nivel lógico (incluyendo los de inicio para engancharlo con el pic).

Título: Re:Dht11 en assembler
Publicado por: jo.an. en 09 de Febrero de 2016, 23:14:19
Estoy perdido.
       Empe    btfss 0x05,0
           Goto  empe
           Call   retardo de 50us
      Aqui     Call    retardo de 27us
                Movwf    0x08      ;puerto d
               Goto     aqui
siempre me sale el mismo valor en el puerto c  y no se varia el dato ni de humedad ni temperatura. Estoy encartado con este semsor. Si alguien a trabajado con dht11 y me pudiese pasar esta parte se lo agradeceria
Gracias de antemano
Título: Re:Dht11 en assembler
Publicado por: KILLERJC en 09 de Febrero de 2016, 23:24:25
Es muy complejo que alguien pueda ayudarte sin saber como es el codigo que tenes. Ni tampoco como lo esta conectado
Título: Re:Dht11 en assembler
Publicado por: jo.an. en 10 de Febrero de 2016, 14:46:59
Lo estoy conectando por ra,0 de un 16f877 con cristal de 4mhz el codigo para hacerlo funcionar es el que no consigo hacer. Daria igual con otro pic la cosa es verlo andar. Agradezco tu tiempo
Título: Re:Dht11 en assembler
Publicado por: KILLERJC en 10 de Febrero de 2016, 17:22:31
Es muy complejo que alguien pueda ayudarte sin saber como es el codigo que tenes. Ni tampoco como lo esta conectado

Y tambien, por que alguien en su sano juicio usaria:

Código: ASM
  1. btfss 0x05,0
  2. Movwf    0x08      ;puerto d

en ves de:

Código: ASM
  1. btfss PORTA,0
  2. Movwf    PORTD


Inclui el .inc de tu PIC, tiene todas las definiciones. Y si cometiste esos "errores" seguro que hay otros en el codigo.
Título: Re:Dht11 en assembler
Publicado por: jo.an. en 11 de Febrero de 2016, 16:10:49
Trabajo con sim84 desde hace 17 años y no admite los .inc tengo que declarar los registros,no importa. Me es mas comodo 0x05,0 que porta,0. Esto de los pics es hobby y queria hacerle un invernadero a mi señora. De todas formas gracias por vuestro tiempo ,seguire intentando
Título: Re:Dht11 en assembler
Publicado por: KILLERJC en 11 de Febrero de 2016, 18:06:35
Bueno jo.an. no puedo decirte mucho mas que necesitas actualizarte y que sin el codigo de tu proyecto no puedo determinar donde esta el problema.

Con lo cual respeto tu opinion de no querer pasarlo, pero que nos deja a mi y a cualquiera atados de mano para ayudarte. Y solo queda que vos mismo lo resuelvas.
Título: Re:Dht11 en assembler
Publicado por: jo.an. en 12 de Febrero de 2016, 13:57:16
creo que los tiempos estan bien,pero no consigo visualizar en los puertos los valores de humedad y temperatura.disculpad la forma de escribir el codigo algunos me critican pero aprendi a las malas.Hay varios ejemplos e C pero ni idea como pasarlos a assembler,seria otra opcion.Gracias a todos
Título: Re:Dht11 en assembler
Publicado por: KILLERJC en 12 de Febrero de 2016, 15:18:56
Ahora mirando el codigo se por que no te funciona. Y no te funciona por que realmente no tenes nada realizado.
Es como que crees que mandandole un pulso al sensor y poniendo el pin como entrada , los valores van a estar magicamente en W. Y eso no ocurre asi..
Es mucho mas complejo que eso. Ademas tenes que tener en cuenta que es una comunicacion con colector abierto o alta impedancia, ya que es un solo pin. y JAMAS de los JAMAS deberias poner tu pin como salida a 1, si como salida pero a 0 o como entrada ( alta impedancia ).

Leyendo el datasheet del DHT11 lo primero que dice es: Al darle alimentacion esperar 1 segundo antes de realizar la primera lectura. Lo cual jamas se espera.

Por otra parte la comunicacion la inicia el PIC poniendo el pin a 0 por un tiempo (deberia estar en alta impedancia - entrada hasta este momento me refiero para ponerlo a 0) y luego ponerlo como entrada y ver lo que llega.

Lo que llegan son 40 bits. pero estos bits no es tan facil como leer si es uno o cero. vienen "codificados".

Lo primero que llega como respuesta del sensor es.. un pulso bajo y luego alto indicando que el sensor va a transmitir. Seguido de eso cada bit viene representado por un pulso bajo y luego un pulso alto. Para saber que valor tiene ese bit. Hay que medir cuanto tarda el pulso alto.

El pulso bajo siemrpe es de 50us, y luego el alto depende, si es de 26/28us significa que es un 0 y luego comienza el otro bit, pero si tarda 70us significa que es un 1. Cuando recibas todos los bits, los 40, deberias verificar si lo que llego es correcto.

8 bits de humedad : 8 bits de humedad : 8 bits de temperatura : 8 bits de temperatura : 8 bits de paridad

Sumando los 8 +8 de humedad mas los otros 8 + 8 de temperatura te deberian dar igual a los de paridad. Sino hay un error y deberias de tirar la lectura

Comprobado esto, ya tenes tus bits de forma correcta en tu PIC. Y podes mostrarlo ahora si.

Datasheet del DHT11 donde explica esto:
http://akizukidenshi.com/download/ds/aosong/DHT11.pdf
Título: Re:Dht11 en assembler
Publicado por: jo.an. en 12 de Febrero de 2016, 17:08:08
es mas facil buscar la cuadratura del circulo que tabajar con este sensor.Seguire buscando.Gracias
Título: Re:Dht11 en assembler
Publicado por: KILLERJC en 12 de Febrero de 2016, 17:17:34
No se que buscas por que ya PalitroqueZ te paso la pagina donde la 3er/4ta respuesta masomenos hay una rutina para leer el DHT11. Que podes estudiar y ver como lo hace
Título: Re:Dht11 en assembler
Publicado por: jo.an. en 12 de Febrero de 2016, 21:36:52
Si.Lo descarge lo ensamble y no dice ni pio,no se por que.Saludos
Título: Re:Dht11 en assembler
Publicado por: PalitroqueZ en 12 de Febrero de 2016, 23:50:42
jo.an.

estuve leyendo el código que subiste, pero tengo la impresión de que falta algo

Código: [Seleccionar]
ppp             bsf      3,5                  ;banco 1
                  movlw    b'000001'      ;ra0 como entrada
                  movwf    0x05
                  bcf      3,5                  ;banco 0
                  movwf    0x08
                  call     reta
                  goto     ppp

¿dónde están las rutinas en donde se comienzan a leer las transiciones  de los estados logicos de los 40 bits que le envia el sensor al pic?

recuerda que esos tiempos son variables (con un mínimo establecido por el fabricante), por lo que es conveniente utilizar interrupciones y luego capturar el tiempo de la transición para catalogar el estado lógico y así armar la trama recibida.
Título: Re:Dht11 en assembler
Publicado por: PalitroqueZ en 13 de Febrero de 2016, 00:07:51
http://www.geekfactory.mx/tutoriales/tutoriales-pic/dht11-con-pic/

en este link explican muy bien la parte teórica concerniente al funcionamiento del sensor DHT11 y como comunicarse a través de un pic.



Título: Re:Dht11 en assembler
Publicado por: jo.an. en 13 de Febrero de 2016, 20:49:52
Un saludo:ya visualizo los bit que envia el dht11 en el portd,pero me envia 43 bit y son 40,no se por que.Estoy intentando captar los pulsos de 70us que son los 1 y 26us que son los 0.Alguna idea de por donde empezar?.Gracias
Título: Re:Dht11 en assembler
Publicado por: PalitroqueZ en 13 de Febrero de 2016, 23:59:10
no sé qué técnica estés utilizando para leer los bits

pero la forma que yo he visto en diferentes ejemplos, es midiendo el tiempo en el que cada nivel lógico se encuentra en uno o en cero y luego comparar ese tiempo con los rangos establecidos por el fabricante para asignarle el estado lógico correspondiente.

si te envía 43 bits, es porque estás leyendo demás, incluso para el dht11 no hace falta leer los 40 bits, puesto que este sensor no trabaja con valores fraccionarios, es decir, envía solo valores enteros.
Título: Re:Dht11 en assembler
Publicado por: KILLERJC en 14 de Febrero de 2016, 02:37:40
Yo ya no puedo ayudarte mas, de hacerlo deberia darte el codigo.

Tenes MUCHOS problemas. Y espero que no te lo tomes a mal lo que te voy a decir

El software:
- Tu codigo lo unico que posee son demoras.
- Te dije que no tenias que poner a 1 la salida, lo haces.
- Te dije que debias esperar 1 segundo desde el comienzo del micro a tomar medidas y no lo haces.
- Usas 0x05 para cambiar el TRISA que es un error de concepto ( a pesar que funcione y creas que usar ese compilador viejo es mejor).
- No usas un BSF para cambiar un bit y usas todo un MOVLW MOVWF.
- Tenes que agradecer a una deidad que esta por default en radix hex, sino tu codigo seria aun peor.

Vos como persona:
- No estas buscando una solucion logica, estas tirando cualquier cosa encima. No estas leyendo/viendo los diagramas de tiempo de como son las señales, asi de esa forma tratar de pensar linea a linea como hacerlo. Simplemente estas leyendo el puerto por leerlo. No por que el 1 dure 70us tenes que crear una demora de 70us !. No tiene ni sentido.
Aca nadie te va a dar un codigo 100% funcional, a no ser que realmente estes cerca de hacerlo por vos mismo.

Como estoy de buen humor te voy a dar una pista:
El codigo del dht es tan simple como esperar un 0 y luego cuando se detecta un 1 ir a una demora de 40us y leer, si es un 0, entonces es un 0, si es un 1 es un 1. Repetir 40 veces. ( 12 instrucciones tal ves , sin contar la demora ) Terminada la libreria. Esto es para leer los bits, obviamente tenes que esperar por el pulso de entrada.. que seran... 4 instrucciones mas.. Y enviar el primer pulso que seran otras 4 instrucciones.
Y si te preguntas el por que esa demora de 40us, es por que 40us es suficiente como para que el pulso alto de un 0 pase, y menor que el pulso alto de un 1. Asi que lo que leas luego de esos 40us es tu valor.

Finalmente lo que es por mi:
Cualquier pregunta/problema que tengas con gusto te ayudaria, siempre y cuando uses un compilador como la gente, y no intentes tirar codigos por tirar y pensar realmente lo que estas haciendo con el codigo.
Título: Re:Dht11 en assembler
Publicado por: jo.an. en 14 de Febrero de 2016, 18:00:01
Pues mira por donde me lo tome a mal:No hago las cosas por hacer como tu crees,quizas no sepa  interpretar las secuencias.No quiero que nadie me haga mi trabajo,solo que me oriente.Respecto al ensamblador dime cual usar para ser gente o cuales son para los que no somos gente.Saludos
Título: Re:Dht11 en assembler
Publicado por: KILLERJC en 14 de Febrero de 2016, 18:58:52
Me equivoque al decir "como la gente" por que veo que lo tomaste como personal , es una expresion Argentina para diferenciar entre algo bueno o no. Y me referia al compilador y no vos como persona.
Si tu compilador lo unico que hace es complicarte la vida, por que eso es realmente escribir 0x05 (es decir recordar al leer el codigo cual era el hexadecimal de cada registro ) y no PORTA, por no poder incluir un .inc quieras admitirlo o no es algo que afecta al entendimiento facil del codigo, tanto para vos como para las demas personas que lo leen.

El unico compilador que existe para ASM es el MPASM que viene ya de por si con el IDE de MPLAB X, incluso si no te gusta ese IDE (algunos dicen que es pesado) podes ir por el MPLAB v8.xx que aun asi no deberias hacerlo, Y si no queres IDE ( en el cual podes simular paso a paso ) podes usar el compilador/linker por linea de comandos pero no lo recomendaria. Esta es la herramienta que provee el fabricante.

Citar
No hago las cosas por hacer como tu crees,quizas no sepa  interpretar las secuencias

El tema es que no estas mostrando ningun progreso, ni tomando la ayuda prestada y presentando codigos que hacen lo opuesto o poco, yo no se el nivel de conocimiento que tengas pero me baso en lo que intentas hacer, es decir una persona que recien inicia en el mundo de la programacion, no se va a ir a meter en un proyecto que requiere tal ves demasiado conocimiento, se va a ir incorporando poco a poco. Haciendo de cosas simples a mas complejas
Y te explico el por que pense que estabas tirando codigos por tirar:

En tu primer codigo simplmente no sabias que hacen las instrucciones, Como por ejemplo imagine que solo poniendo BTFSS PORTA,0 ibas a tener todo guardado en W. Y ni siquiera tiene relacion una cosa u otra.
Tambien denota que no sabes que lo unico que podes leer de una entrada digital es un 1 o 0 en ese momento. Lo cual un ejemplo de una llave (pulsador ) + un led te hubiera dado el indicio de que podes hacer y que no.
Y me arriesgo a creer que pensabas que el microcontrolador iba a esperar que llegara un valor, pero el microcontrolador sigue su camino y no para por nadie en sus instrucciones.
No se como es que sabias que llegaron 43 bits con el codigo que pasaste, por que jamas de los jamas para, y no se como es que estarias viendo todo el valor del PORTD cada 20us o algo asi.

Observo eso y veo que simplemente le estas errando en eso que es basico. Perfecto, nadie nacio sabiendo y lo entiendo, aca se ayuda a todas las personas, pero como todos dicen, antes de aprender a correr hay que aprender a caminar.

Luego se te dio 1 codigo el cual imagino que leiste, pero que dijiste: "Lo compile y ni pio". Pero ni siquiera sabes que es lo que fallaba ahi. Es como si lo hubieras hecho un copy/paste y probado. O al menos es lo que parecio leyendolo. Y mas al decir que ibas a seguir en "tu busqueda" lo cual imagine que es de una libreria de ponerla y que funcione. Esto en ASM lo mas seguro es que no ocurra, por que cada micro es distinto, tiene distintos registros, etc. Distinto puede ser en un lenguaje como C ( y es por eso que esta lleno de liberias en C )

Entonces se intento hacer otro acercamiento, y esta ves se dio los links al datasheet del modulo, el cual explica como va la señal por el cable, como es que el micro debe iniciar la secuencia,  el por que debes esperar 1 segundo antes de leer por primera ves. Los tiempo que estan en 0 y en 1 las señales que vos tenes que capturar.
PalitroqueZ te dio un link en español ( por si no te gusta el ingles ) que tambien explica como es esa señal.
Y a pesar que te dije sobre la espera me encuentro con que tu programa no lo tiene. Pense: "bueno lo pondra despues", pero luego veo lo que te dije antes sobre NO poner a 1 el bit de salida (por que podes cortocircuitar el pin). Y es lo primero que veo en tu segundo codigo. Tal ves por que no sabia que hacian las instrucciones ?, no se por que estaba asi.

Volviendo al tema de capturar uno o cero.

Vos capturas un 1 o 0 nomas en el instante que se lee el pin (que se ejecuta la instruccion), asi que tenes que saber cuando paso de 0 a 1 o de 1 a 0, y esto lo haces leyendo la entrada esperando que cambie de nivel. No hay ninguna otra explicacion de como podes hacer lo mas que:

Código: ASM
  1. BTFSS xxx,0  ;  Estaba en 0, espero que se ponga en 1.
  2. GOTO  $-1    ; el $-1 hace que vaya a la direccion del BTFSS es para ahorrarse una etiqueta.

Ahora como decia, esos bits viene "codificados", entonces tenes que descubrir como hacer para diferenciar entre uno y otro, lo unico que queda es medir el tiempo del estado en alto. Que es lo unico que difiere entre uno u otro.. Si es lo unico que difiere uno de otro, ¿en que hay que enforcarse? Y si.. el pulso en alto. Cuando comienza? cuando pasa de 0 a 1. Cuando termina? Cuando pasa de 1 a 0.

Se me ocurren varias formas, midiendo el tiempo o usar un delay como te dije... Lo mas rapido que le debe venir a una persona que no conoce mucho de PIC que sabe que puede leer solo 0 o 1 es medir el tiempo de alguna forma e ir pensando como va llegando la señal esa al pin del PIC. las cosas que se me ocurren son timers lo mas complejo, o ir sumando algun registro. O un delay si te das cuenta que el 0 o el 1 no tardan lo mismo ( que seria para mi lo ideal )

Suponiendo que tenes un PIC que trabaja a 4Mhz, cada instruccion tarda 1us. Entonces incluso en el peor de los casos si incremento una variable tendria 70 guardado en esa variable suficiente como para 8 bits, que indicaria el 1, si es un 0 tendria menos de 30, nuevamente trazamos 40 el limite. Como el codigo que te paso aca (solo de referencia) toma 5 ciclos para preguntar de nuevo por la entrada ( es decir pregunto cada 5 us ), entonces si es mayor a 6 significa ( conte 7, a 5us cada uno son 35us + 2 cuando detecto el paso de 0 a 1, es 37us proximo a los 40) que es un 1. Y esto repetido 40 veces.

Código: ASM
  1. CLRF    Contador
  2.         BTFSC   xxx,0  ; Espero el 1, la entrada esta en 0
  3.         GOTO    $-1
  4.  
  5. PreguntoDeNuevo
  6.  
  7.         BTFSS   xxx,0  ; Si llego aca es por que la entrada llego a 1, asi que espero ahora el 0
  8.         GOTO    LLegoelcero
  9.         INCF    Contador, F
  10.         GOTO    PreguntoDeNuevo
  11.  
  12. LLegoelcero
  13.         MOVLW   0x7             ; Si llego aca es por que
  14.         SUBWF   Contador, W
  15.         BTFSx   STATUS, C
  16.         GOTO    Fue un cero
  17.         GOTO    Fue un uno
  18.         ; Guardo dato tambien

Si me hubieras presentado un codigo asi, en el que tal ves no sabias lo que tarda una instruccion y tenias problemas con los tiempos, yo hubiera entendido que punto de conocimiento tenes y proceder a arreglar la funcion. Y la otra con demora:

Código: ASM
  1. BTFSC   xxx,0  ; Espero el 0
  2.         GOTO    $-1
  3.         BTFSS   xxx,0  ; Espero el 1
  4.         GOTO    $-1
  5.         CALL    delay_40ms
  6.         BTFSS   xxx,0
  7.         GOTO    Guardar_0
  8. Guardar_1
  9.         ; Aca guardo el 1, no superar 20/30 instrucciones
  10.  
  11.  
  12. Guardar_0
  13.         ; Aca guardo el 0, no superar 20/30 instrucciones

Estos codigos no toman el pulso del entrada en cuenta. Y se debe repetir.


PD: Yo no tengo nada en contra de nadie (enojado o lo que quieras llamarle) aunque lo pueda parecer, si queres seguir con el programa yo te voy a seguir ayudando y vos sos libre de preguntar todo lo que desees, de lo mas basico que se te pueda ocurrir que te voy a seguir respondiendo e intentar explicar. Pero espero compromiso tambien de la otra parte, de nada sirve ayudar si vos no tomas la ayuda en cuenta.
Título: Re:Dht11 en assembler
Publicado por: jo.an. en 14 de Febrero de 2016, 22:43:02
No es justificacion a mi actitud pero ya estoy viejo, me desespero y se me dispara el mal genio con facilidad,disculpa.Como te comente llevo 17 años con los pic pequeños medianos y grandes,como comprenderas he hecho bastantes cosillas con ellos.Se que las cosas no son faciles unos progamas salen rapido pero otros hay que dedicarles mas tiempo,el fin lo justifica.Tenia montado lo de control de humedad y temperatura con lm35 y el hs11 pero la humedad se me desfasa mucho,por eso estoy intentando con el dht11.Voy a cacharrear con el codigo que mandaste y te comento.Un saludo
Título: Re:Dht11 en assembler
Publicado por: jo.an. en 16 de Febrero de 2016, 16:38:48
Un saludo:Ya consegui leer los 40 bit que envia el dht.Ahora estoy el la parte de contar los 8 primeros bit que envia creo que humedad,pero no puedo leerla en rd ,con un poco mas de humedad o temperatura se me altera mucho imposible  de ver grados o % de humedad.Supongo que sumarlos y comparar con el cheksum.Como podria hacer esto?.Perdona que insista se me volvio reto.Gracias
Título: Re:Dht11 en assembler
Publicado por: KILLERJC en 16 de Febrero de 2016, 17:29:06
Hay varias cosas bien encaminadas y otras no tanto. Hay tambien unos cuantos errores y cosas que se pueden mejorar.

Código: ASM
  1. btfss    PORTA, 0      
  2.                   goto     $-1         
  3.                   btfsc    PORTA, 0    
  4.                   goto     $-1

Esta al revés, Primero esperas que este en 0 y cuando estes en 0 esperas el 1, por lo cual el primero deberia ser un BTFSC y el segundo un BTFSS.

Código: ASM
  1. movf     reg2 , W      
  2.                   movwf    reg2        
  3.                   xorlw    .8          
  4.                   btfsc    STATUS, Z

Hay una instruccion que esta demas ahi, el MOVWF reg2 esta por demas. Incluso lo podrias haber realizado tambien asi:

Código: [Seleccionar]
MOVLW .8
XORWF  reg2, W

Lo demas estuvo correcto o casi correcto..

Código: ASM
  1. incf     reg2, W      
  2.                   movwf    reg2        
  3.                   incf     reg1, W      ;incrementa en el contador
  4.                   movwf    reg1        
  5.                   rlf      reg1, F      ;rota un bit a la izquierda osea un uno
  6.                   goto     as
  7.  
  8. suma1             incf     reg2, W      ;suma 1
  9.                   movwf    reg2
  10.                   rlf      reg1,1      ;rota un bit a la izquierda esta vez un 0
  11.                   goto     as

Voy a hacer notar un uso sin sentido de una instruccion, como por ejempo para incrementar un registro hiciste, INCF reg2, W y luego lo guardaste con el MOVWF, cuando simplemente necesitabas 1 sola instruccion:

Código: [Seleccionar]
INCF reg2, F
Y ahora el error.

Cuando rotas el valor del carry se introduce en el bit0, esto no es problema si el bit del carry es 0, pero si es 1 cambia TODO. especialmente si estas "sumando" 1. Observemos 2 ejemplos:

Código: [Seleccionar]
                  incf     reg1, F      ;incrementa en el contador
                  rlf      reg1, F      ;rota un bit a la izquierda osea un uno

reg1 = 0x00  y carry en 0
A la salida de ese codigo tendrias 0x01 lo cual es correcto, ahora supongamos que el carry estaba en 1. Y a la salida tendrias 0x03, que si pasa otra ves por ese codigo teminaria con el valor 0x09 pero aun.
Este problema es para ambos, cuando es 1 o es 0.
Otro problema, estarias rotando una ves mas, cuando no deberias, es decir para el ultimo bit.

Tambien otra cosa es que estas pensando en 8 bits a la vez, intenta pensar en 40 bits a llenar y no solo 8.

Estas sacando tus datos en unos milisegundos al PORTD, asi que no se como es que estas viendo que llegan tus 40 bits

---------------------------

Una mas que es "molesto" para los demas, en realidad no molesto sino que cuesta entenderle rapidamente.
Intenta escribir los nombres de los registros con nombres que tienen significado, al igual que las etiquetas, sino se pone dificil leerlo por las demas personas. Los comentarios ayudan, pero es mas facil de esta forma, para vos y para todos. Acostumbrate asi y te va a ser mas facil.

---------------------------

Te dejo un codigo para que lo leas por 2 cosas
- Para que veas como lo haria yo
- Como es mas facil leer y entenderle al programa teniendo nombres que realmente significan algo, etiquetas que tambien, incluso los nombres de los bits, PORTx.

Una cosa mas, el dato que llega esta formado por 4 bytes + 1 checksum, de esos 4 , 2 son para la temperatura y 2 para la humedad. y Cada uno de esos 2, uno es para la parte entera y la otra para la decimal. Supongamos esto:

53.35% de humedad:

Humedad Entero : 53
Humedad Decimal : 35

Los datos empiezan por el bit de mayor valor de Humedad Entero, luego Humedad Decimal, Luego Temperatura Entero, Temperatura Decimal y finalmente Checksum.

Código: ASM
  1. Leer_DHT:
  2.  
  3.         CLRF    TempEntero
  4.         CLRF    TempDecimal
  5.         CLRF    HumEntero
  6.         CLRF    HumDecimal
  7.         CLRF    Checksum
  8.  
  9.         MOVLW   .40
  10.         MOVWF   CantidadBits
  11.  
  12.  
  13.         ; Aca enviar pulso inicial ( poner como salida, y luego a 0 por un tiempo, luego pasarlo a entrada )
  14.  
  15.  
  16.         ; Agregar aca la espera del primer pulso de respuesta que no forma parte de los bits.
  17.  
  18.  
  19.         ; Ahora bit a bit
  20. Loop:
  21.         BTFSC   PORTA, 0        ; Espero que llegue el 0
  22.         GOTO    $-1
  23.         BTFSS   PORTA, 0        ; Estoy en 0, Espero que se ponga en 1
  24.         GOTO    $-1
  25.         CALL    Delay40us       ; Luego del delay pasan como maximo 17 ciclos hasta que vuelve a preguntar de nuevo, lo cual estaria dentro del rango de las 20 instrucciones para 4Mhz
  26.         BTFSS   PORTA, 0
  27.         GOTO    Es_cero
  28. Es_uno:
  29.         ; Si llego aca es 1
  30.         BSF     Checksum, 0     ; Observa que no uso INCF, sino que directamente pongo a 1 o 0 el bit
  31.         GOTO    Rotar
  32. Es_cero:
  33.         ; Si llego aca es 0
  34.         BCF     Checksum, 0
  35. Rotar:
  36.         DECF    CantidadBits, F ; Decremento la cantidad de bits restantes, cuando llega a 0 salgo, sino roto el valor, al rotar lo trato como un numero completo de 40 bits
  37.         BTFSC   STATUS,Z
  38.         RETURN
  39.         RLF     Checksum, F     ; Cuando roto por primera vez (en Checksum) el carry puede tener cualquier valor
  40.         RLF     TempDecimal,; pero no importa por que en la proxima pasada sobreescribo ese bit con BSF y BCF, los demas carrys son necesarios
  41.         RLF     TempEntero, F
  42.         RLF     HumDecimal, F
  43.         RLF     HumEntero, F
  44.         GOTO    Loop
  45.  
  46.  
  47. ; Si W = 0 indica que esta todo bien, sino borra todo por que el dato es malo.
  48. ; Esto es para comprobar con el que llama
  49.  
  50.  
  51. Checkear_datos:
  52.         MOVF    HumEntero, W
  53.         ADDWF   HumDecimal, W
  54.         ADDWF   TempEntero, W
  55.         ADDWF   TempDecimal, W
  56.         XORWF   Checksum, W
  57.         BTFSC   STATUS, Z
  58.         RETURN                  ;W = 0
  59. Mal_Checksum:
  60.         CLRF    TempEntero
  61.         CLRF    TempDecimal
  62.         CLRF    HumEntero
  63.         CLRF    HumDecimal
  64.         CLRF    Checksum
  65.         RETURN                  ;W =/= 0

Esto funcionaria bastante sencillo. simplmente es:

Código: [Seleccionar]
CALL Leer_DHT
CALL Checkear_datos
ANDLW 0xFF
BTFSS STATUS, Z
; Aca llego mal asi que leo de vuelta o hago lo que sea
; Aca llego bien

Los datos estan en los registros que se llenaron obviamente.
Título: Re:Dht11 en assembler
Publicado por: jo.an. en 16 de Febrero de 2016, 20:46:58
Tienes razon:Si no lo envio completo esta dificil que alguien ayude.Tambien tienes razon,si tengo un 1 y el siguiente es otro 1 y lo roto a la izquierda pues serian 3 y si envia otro 1 y tambien lo roto  a la izquierda serian 7.Ya capto.Gracias
Título: Re:Dht11 en assembler
Publicado por: jo.an. en 16 de Febrero de 2016, 21:05:10
Saludos:Asi leo los 40 bit
Título: Re:Dht11 en assembler
Publicado por: KILLERJC en 16 de Febrero de 2016, 23:27:08
Asi es imposible que leas los 40 bits... es mas le falta casi todo lo que me pasaste antes.

Encima tenes muchos errores..

Te dije que no debes poner el pin en alto

Código: [Seleccionar]
                  bsf      PORTA,0 ; Mal
Tambien tenes esto:

Código: [Seleccionar]
                  bcf      STATUS,RP0   ;banco 1 , error mal
                  movlw    b'000001'  ;
                  movwf    TRISA
                  bcf      STATUS,RP0   ;banco 0

Si observas los 2 son BCF, por lo cual jamas vas a pasar al banco 1.

Código: [Seleccionar]
                  incf     reg1,0
                  movwf    reg1
                  movwf    PORTD      ;lo visualizo en rd

Asi podes detectar que llegaron 40 bits, pero no determinar cuales. Con eso el resultado en el PORTD deberia ser 0x28.

Te pido nuevamente que estudies el codigo que te pase.
Título: Re:Dht11 en assembler
Publicado por: jo.an. en 17 de Febrero de 2016, 19:32:46
tienes razon no paso al banco 1 y si te digo que  en el protoboar me marca 00101000 cambie o no cambie al banco,me dirias que imposible,para mi tambien es imposible pero mis ojos lo estan viendo.Vuelvo a enviar el codigo,si no pongo bsf     oxo5,0  en la linea 50 no leo nada en el puerto d.Creo que estamos liados con el tris nunca lo utilizo, hago esto movlw b'000001' movwf 0x05 y pongo ra0 como entrada,movlw b'000000' movwf  0x05 y pongo ra0 como salida.Esto es solo para contar los 40 bit que envia el dht.Cuando a terminado de contar los 40 bit se queda en la linea 63 ya que se queda alta la entrada ra0.Estoy probando con 2 pic no creo que esten dañados los 2 pero me hacen cosas que a ti no te hacen.
Título: Re:Dht11 en assembler
Publicado por: jo.an. en 17 de Febrero de 2016, 19:45:04
casi se me olvida
Título: Re:Dht11 en assembler
Publicado por: jo.an. en 17 de Febrero de 2016, 22:46:39
13.        ; Aca enviar pulso inicial ( poner como salida, y luego a 0 por un tiempo, luego pasarlo a entrada

esta parte no entiendo
             bsf     0x05,0     ;entiendo como pulso inicial
             bcf     0x05,0     ;por que despues es 0
             call     ms18       ;tiempo que dices para pasarlo a entrada
             bsf      3,5
             movlw   b'000001'
            movwf    0x05
            bcf         3,5       ;pasado a entrada

 por que me dices que bsf   0x05,0  mal?
Título: Re:Dht11 en assembler
Publicado por: jo.an. en 17 de Febrero de 2016, 22:52:07
Como no puedo ver la temperatura en puerto d y la humedad en  c (por ejemplo) no se que estoy haciendo.Agradezco tu ayuda pero me esta quedando grande esto.Un saludo
Título: Re:Dht11 en assembler
Publicado por: KILLERJC en 17 de Febrero de 2016, 23:52:36
Citar
por que me dices que bsf   0x05,0  mal?

Vos tenes un "bus" en realidad un cable por el cual ambos dispositivos, es decir el PIC o el DHT11 deben enviar datos. Y imagina por un momento que ocurriria si vos en tu PIC pones un pin a 5V ( imaginatelo como una llave que conecta los 5V al pin ) y el DHT11 procede a poner el pin de datos a 0V ( igual que antes como una llave que conecta el pin de datos a 0V)

Estarias haciendo un cortocircuito!.

Entonces como se soluciona esto ? Para esto se usan salidas conocidas como open colector ( colector abierto ), que es esto ? Es asi:

(https://www.massflow-online.com/images/stories/wired-Opencollector.jpg)

Como observas este pin solo puede poner el pin a 0V o alta impedancia ( en caso que el transistor no conduzca ).
Esta salida es la que posee el DHT11, y es la que deberia poseer el PIC ( o la que intentamos simular )

Entonces la linea ( bus ) por donde van los datos va a estar en 1 ( 5V ) gracias a una resistencia de pull-up, si por ejemplo ocurre algun problema y ambos ( PIC y DHT11 ) actuan al mismo tiempo, lo unico que pueden hacer es conectar la linea a 0V, y de esa forma nunca tendrias un cortocircuito, ya que a corriente esta limitada por la resistencia de pull-up.

Como decia, el PIC posee una salida tottem-pole:

(http://www.engin.brown.edu/faculty/daniels/DDZO/graphics/speea.gif)

El cual si pones un 1, activaria la llave superior y desactivaria la inferior, conectando el pin a 5V, y si pones un 0 ocurriria lo contrario. Ademas de esto podes ponerlo en alta impedancia ( al ponerlo como entrada ) y ambas llaves estarian desactivadas.
Si quisieramos simular la salida open-colector, solo necesitariamos la llave inferior ( poner a 0V ) y ponerlo como entrada ( para alta impedancia ). Si uno usa la llave superior corre el riesgo del cortocircuito como ya lo hablamos.

Resumid En unos puntos mas simples:

- El que mantiene en 1 el canal ( bus, linea ) es una resistencia de pull-up.
- Tu PIC solo debe poner un 0 o alta impedancia a la salida nada mas. Poner un 1 ( 5V ) podria significar un cortocircuito en caso que el DHT11 envie ( ponga un 0 ).

Yo casi te di el codigo completo, solo le faltan un par de cosas nomas.
Recorda dejar el pin como entrada ( el de datos me refiero ) y solo ponerlo como salida cuando tengas que poner el 0.

Una que no te dije, si vas a cambiar solo 1 bit, no es necesario esto:

             movlw   b'000001'
            movwf    0x85                ; 0x85 es TRISA , 0x05 es PORTA, a pesar que el opcode no los diferencie

Podes hacer lo mismo con esto:

 BSF 0x85, 0

Aunque como dije solo pondrias como salida en un solo momento, en el reset dejarlo como entrada.

Como no puedo ver la temperatura en puerto d y la humedad en  c (por ejemplo) no se que estoy haciendo.Agradezco tu ayuda pero me esta quedando grande esto.Un saludo

Si podes pero hasta ahora tus codigos han sido muy basicos y no llegaste a tomar los bits necesarios.
Como dije antes, yo te pase el codigo casi completo, solo le faltaban rellenar algunas partes que creo que son 8 instrucciones nomas ( pasar a salida, poner un 0, esperar el tiempo necesario para que el pulso sea valido, poner como entrada, esperar un 0 y luego esperar un 1). Todo lo demas del codigo esta realizado.
Luego de eso falta mostrarlo, lo cual seran 4 instrucciones mas. ( Es decir mover de los registros creados a los puertos )
Título: Re:Dht11 en assembler
Publicado por: jo.an. en 18 de Febrero de 2016, 02:09:03
Nunca he probado el bsf   0x85,te creo.El dht11 viene montado en una targeta que tiene un condensador entre +y-,y una resistencia de 5k1  de la señal a +,creo que es lo que me sugieres.El codigo que me enviaste en la linea 38 hay un return que no se de donde le llamas,tampoco se de donde le llamas a chequear_datos.Ese par de cosas que faltan,son las que me van a llevar al suicidio.Un saludo
Título: Re:Dht11 en assembler
Publicado por: KILLERJC en 18 de Febrero de 2016, 02:14:46
El codigo que te pase son subrutinas, para que en tu loop principal ( todo progrma deberia tener un loop infinito) quedandote asi:

Código: ASM
  1. Loop_Principal
  2.     CALL Delay_1segundo
  3.     CALL Leer_DHT11
  4.     CALL Checkear_datos
  5.     ; Aca si W es 0 significa que los datos llegaron bien, sino es un error.
  6.     MOVF TempEntero, W
  7.     MOVWF PORTD
  8.     MOVF HumEntero, W
  9.     MOVWF PORTC
  10.     GOTO Loop_Principal

Los valores estarian en los registros (creados por uno obvio) :
TempEntero, TempDecimal, HumEntero, HumDecimal, Checksum

Y recorda que si el Checksum da mal yo hice que se pusieran a 0 todos los demas registros. Cualquier cosa para evitar esto, comenta el CALL Checkear_datos del loop_principal que te pase arriba
Título: Re:Dht11 en assembler
Publicado por: jo.an. en 18 de Febrero de 2016, 20:21:05
Un saludo:Le cambio los call, los return, le repito instrucciones, w por f ,btfss por btfsc y no consigo ver ningun dato por los puertos d y c.Estoy siguiendo los ejemplos que envias,no se si no se encadenarlos o que me pasa.me meti en camisa de once varas.Disculpa por tanta insistecia.Gracias por tu tiempo
Título: Re:Dht11 en assembler
Publicado por: jo.an. en 19 de Febrero de 2016, 18:46:00
Un saludo:Con este codigo si estoy leyendo los 40 bit que envia el dht11,vuelve y repite.La comunicacion esta bien,estoy liado con tu codigo.Dame el ultimo empujon KILLERJC.Gracias
Título: Re:Dht11 en assembler
Publicado por: KILLERJC en 19 de Febrero de 2016, 20:03:15
No tuve tiempo jo.an de verlo, cuando me haga un tiempito lo veo y te digo.
Título: Re:Dht11 en assembler
Publicado por: jo.an. en 19 de Febrero de 2016, 20:22:16
Cuando puedas KILLERJC.Un saludo
Título: Re:Dht11 en assembler
Publicado por: KILLERJC en 20 de Febrero de 2016, 21:08:21
Tuve tiempo de ver el archivo dht22.asm

Te voy a ser sincero jo.an. Realmente estas muy lejos, pero muy lejos, de lo que intentas hacer. El programa ni siquiera toma en cuenta el valor del dato, simplemente cuenta cuantos ciclos hubo de señal ( alto + bajo ) y cuando llega a 40 si o si lo pone en el puerto D. Es decir no tiene nada de interes poner 40 en el PORTD. Basicamente es como si fuera otro programa y para otra cosa distinta a lo que hay que hacer.

Respecto a dht31.asm, lo vi por encima y solo puedo decir esto:

Se podria decir que esta mas cerca, pero lo que tenias que rellenar es erroneo. Ya me extendere sobre este codigo cuando lo vea de nuevo.

Tambien te prepare esto para que lo pongas en tu codigo y lo empiezes a usar:

Código: ASM
  1. W       EQU     0
  2. F       EQU     1
  3.  
  4. STATUS  EQU     0x03
  5.  
  6. C       EQU     0
  7. Z       EQU     2
  8. RP0     EQU     5
  9.  
  10. PORTA   EQU     0x05
  11. PORTB   EQU     0x06
  12. PORTC   EQU     0x07
  13. PORTD   EQU     0x08
  14.  
  15. TRISA   EQU     0x85
  16. TRISB   EQU     0x86
  17. TRISC   EQU     0x87
  18. TRISD   EQU     0x88
Título: Re:Dht11 en assembler
Publicado por: jo.an. en 22 de Febrero de 2016, 17:07:05
He pasado este ejemplo que pusiste.Da el mismo valor en puerto c que en d.Caliento el sensor o le doy mas humedad y no varia en nada.No puedo con esto.Si no me ayudas,tendre que dejarlo.Son muchos dias de trabajo y no prospero.Le hecho con lo que envias y otros 40 progamas mas basados en tu informacion,y no funciona por ningun lado.No hay forma de capturar los 8 primeros bit que son de humedad y pasarlos al puerto d y que varien segun la humedad,siempre sale el mismo valor.Gracias por tu tiempo.
Título: Re:Dht11 en assembler
Publicado por: KILLERJC en 22 de Febrero de 2016, 18:37:51
Código: ASM
  1. list     p=16F877 ;Se indica el modo de procesador
  2.          radix   hex
  3.  
  4. W       EQU     0
  5. F       EQU     1
  6.  
  7. STATUS  EQU     0x03
  8.  
  9. C       EQU     0
  10. Z       EQU     2
  11. RP0     EQU     5
  12.  
  13. PORTA   EQU     0x05
  14. PORTB   EQU     0x06
  15. PORTC   EQU     0x07
  16. PORTD   EQU     0x08
  17.  
  18. TRISA   EQU     0x85
  19. TRISB   EQU     0x86
  20. TRISC   EQU     0x87
  21. TRISD   EQU     0x88
  22.  
  23. ADCON1   EQU      0X9F
  24.  
  25.  
  26. d1       equ      0x20            
  27. d2       equ      0x21
  28. d3       equ      0x22
  29. reg1     equ      0x23
  30. reg2     equ      0x24
  31.  
  32. Checksum        equ      0x25
  33. TempDecimal     equ      0x26
  34. TempEntero      equ      0x27
  35. HumEntero       equ      0x28
  36. HumDecimal      equ      0x29
  37. CantidadBits    equ      0x30
  38.  
  39. ;----------------------------------------------------------------------------
  40.         ORG     0x00            ;vector de inicio
  41.         GOTO    Setup
  42.         ORG     0x04
  43.         RETURN
  44.  
  45.          
  46. Setup:
  47.         BSF     STATUS, RP0
  48.         MOVLW   0x06            ;Puerto A en modo digital
  49.         MOVWF   ADCON1
  50.         MOVLW   b'000001'       ; RA0 entrada
  51.         MOVWF   TRISA
  52.         CLRF    TRISB
  53.         CLRF    TRISC
  54.         CLRF    TRISD           ;
  55.         CLRF    TRISE
  56.         BCF     STATUS, RP0
  57.                
  58.         CLRF    PORTA
  59.         CLRF    PORTB
  60.         CLRF    PORTC
  61.         CLRF    PORTD
  62.         CLRF    PORTE
  63.  
  64. Main:
  65.         CALL    Delay_1s
  66.         CALL    Leer_DHT
  67.         CALL    Checkear_datos
  68.         ANDLW   0xFF
  69.         BTFSS   STATUS, Z
  70.         GOTO    Mal_dato
  71.         BCF     PORTB, 0
  72.         MOVF    TempEntero, W
  73.         MOVWF   PORTD
  74.         MOVF    HumEntero, W
  75.         MOVWF   PORTC
  76.         GOTO    Main
  77. Mal_dato:
  78.         BSF     PORTB, 0
  79.         GOTO    Main
  80.  
  81.  
  82.  
  83. Leer_DHT:
  84.  
  85.         CLRF    TempEntero
  86.         CLRF    TempDecimal
  87.         CLRF    HumEntero
  88.         CLRF    HumDecimal
  89.         CLRF    Checksum
  90.  
  91.         MOVLW   .40
  92.         MOVWF   CantidadBits
  93.  
  94.  
  95.         ; Aca enviar pulso inicial ( poner como salida, y luego a 0 por un tiempo, luego pasarlo a entrada )
  96.         BSF     STATUS, RP0
  97.         BCF     TRISA, 0                ; Salida
  98.         BCF     STATUS, RP0
  99.         BCF     PORTA, 0                ; Pongo un 0 en caso que no lo hubiera tenido
  100.         CALL    Delay_80us              ; Espero los 80us necesarios
  101.         BSF     STATUS, RP0
  102.         BSF     TRISA, 0                ; Entrada nuevamente
  103.         BCF     STATUS, RP0
  104.  
  105.  
  106.         ; Agregar aca la espera del primer pulso de respuesta que no forma parte de los bits.
  107.  
  108.         BTFSC   PORTA, 0        ; Espero que llegue el 0, desde el DHT11
  109.         GOTO    $-1
  110.         BTFSS   PORTA, 0        ; Estoy en 0, Espero que se ponga en 1 el DHT11
  111.         GOTO    $-1
  112.  
  113.         ; Ahora comienzo a recibir bit a bit
  114. Loop:
  115.         BTFSC   PORTA, 0        ; Espero que llegue el 0
  116.         GOTO    $-1
  117.         BTFSS   PORTA, 0        ; Estoy en 0, Espero que se ponga en 1
  118.         GOTO    $-1
  119.         CALL    Delay35us       ; Luego del delay pasan como maximo 17 ciclos hasta que vuelve a preguntar de nuevo, lo cual estaria dentro del rango de las 20 instrucciones para 4Mhz
  120.         BTFSS   PORTA, 0
  121.         GOTO    Es_cero
  122. Es_uno:
  123.         ; Si llego aca es 1
  124.         BSF     Checksum, 0     ; Observa que no uso INCF, sino que directamente pongo a 1 o 0 el bit
  125.         GOTO    Rotar
  126. Es_cero:
  127.         ; Si llego aca es 0
  128.         BCF     Checksum, 0
  129. Rotar:
  130.         DECF    CantidadBits, F ; Decremento la cantidad de bits restantes, cuando llega a 0 salgo, sino roto el valor, al rotar lo trato como un numero completo de 40 bits
  131.         BTFSC   STATUS,Z
  132.         RETURN
  133.         RLF     Checksum, F     ; Cuando roto por primera vez (en Checksum) el carry puede tener cualquier valor
  134.         RLF     TempDecimal, F  ; pero no importa por que en la proxima pasada sobreescribo ese bit con BSF y BCF, los demas carrys son necesarios
  135.         RLF     TempEntero, F
  136.         RLF     HumDecimal, F
  137.         RLF     HumEntero, F
  138.         GOTO    Loop
  139.  
  140.  
  141. ; Si W = 0 indica que esta todo bien, sino borra todo por que el dato es malo.
  142. ; Esto es para comprobar con el que llama
  143.  
  144.  
  145. Checkear_datos:
  146.         MOVF    HumEntero, W
  147.         ADDWF   HumDecimal, W
  148.         ADDWF   TempEntero, W
  149.         ADDWF   TempDecimal, W
  150.         XORWF   Checksum, W
  151.         BTFSC   STATUS, Z
  152.         RETURN                  ;W = 0
  153. Mal_Checksum:
  154.         CLRF    TempEntero
  155.         CLRF    TempDecimal
  156.         CLRF    HumEntero
  157.         CLRF    HumDecimal
  158.         CLRF    Checksum
  159.         RETURN                  ;W =/= 0
  160.  
  161.         end
  162.  
  163.  
  164. ; ******************************************************************
  165. ;
  166. ;                       Delays
  167. ;
  168. ; ******************************************************************
  169.                        
  170.  
  171.  
  172. ; Delay = 1 seconds
  173. ; Clock frequency = 4 MHz
  174.  
  175. ; Actual delay = 1 seconds = 1000000 cycles
  176. ; Error = 0 %
  177.  
  178. Delay_1s
  179.                         ;999990 cycles
  180.         movlw   0x07
  181.         movwf   d1
  182.         movlw   0x2F
  183.         movwf   d2
  184.         movlw   0x03
  185.         movwf   d3
  186. Delay_1s_0
  187.         decfsz  d1, f
  188.         goto    $+2
  189.         decfsz  d2, f
  190.         goto    $+2
  191.         decfsz  d3, f
  192.         goto    Delay_1s_0
  193.  
  194.                         ;6 cycles
  195.         goto    $+1
  196.         goto    $+1
  197.         goto    $+1
  198.  
  199.                         ;4 cycles (including call)
  200.         return
  201.                  
  202. ; Delay = 80 instruction cycles
  203. ; Clock frequency = 4 MHz
  204.  
  205. ; Actual delay = 8e-005 seconds = 80 cycles
  206. ; Error = 0 %
  207.  
  208. Delay_80us
  209.                         ;76 cycles
  210.         movlw   0x19
  211.         movwf   d1
  212. Delay_80us_0
  213.         decfsz  d1, f
  214.         goto    Delay_80us_0
  215.  
  216.                         ;4 cycles (including call)
  217.         return
  218.  
  219. ; Delay = 35 instruction cycles
  220. ; Clock frequency = 4 MHz
  221.  
  222. ; Actual delay = 3.5e-005 seconds = 35 cycles
  223. ; Error = 0 %
  224.  
  225. Delay_35us
  226.                         ;31 cycles
  227.         movlw   0x0A
  228.         movwf   d1
  229. Delay_35us_0
  230.         decfsz  d1, f
  231.         goto    Delay_35us_0
  232.  
  233.                         ;4 cycles (including call)
  234.         return

Probalo creo que deberia funcionar.
Título: Re:Dht11 en assembler
Publicado por: jo.an. en 23 de Febrero de 2016, 23:36:21
Un saludo:Cuando se devuelve a la linea 73 y apaga rb,0 y prende ra5,2,quiere decir que la comunicacion con el dht11 esta bien,si no se quedaria en los btfss o btfsc.No sale ningun dato por ningun puerto.Le quite los delayer por que igual transmitia el dht y no capturaba los pulsos,nada.Quite los clrf por si en alguna parte limpiaba los registros,tampoco.No mareemos mas con esto.Si has trabajado con el modulo ccp en modo capturar ancho de pulsos para diferenciar los de 26 a 28us y 70us y pasarlos a un registro,me puede servir.No creo que sea facil debido a mi conocimiento,pero tan dificil como esto imposible.Gracias
Título: Re:Dht11 en assembler
Publicado por: KILLERJC en 24 de Febrero de 2016, 00:45:17
Sinceramente no se que mas decirte. Deberia funcionar , si optas por tomar el valor con un timer por ejemplo es reemplazar el CALL al delay por poner a 0 el timer y esperar el proximo valor. Y luego compararlo con un valor guardado. En fin. es practicamente lo mismo, Si deseas usar el CCP nuevamente es lo mismo, tenes que revisar el flag del CCP, tomar el valor, cuando levanta de nuevo la flag tomar el nuevo valor, restarlo y ahi tenes lo que tardo.

Pero con todo el tiempo que te llevaria eso, mas guardar el dato, seguro que con 4Mhz no lo logras hacer o estas muy pero muy justo y vas a necesitar de mayor frecuencia ( 8Mhz tal ves ).

Y tu problema no parecen ser los tiempos sino otra cosa. Como lo de poner a 1 la "salida" que te dije que no debes hacerlo. Entonces me lleva a pensar si realmente esta bien conectado, o si ya lo quemaste. Yo segui todas las especificaciones del datasheet del modulo. No puedo hacer mas nada. Sin tener el dispositivo en casa realmente no puedo ya probar mas nada.
Título: Re:Dht11 en assembler
Publicado por: jo.an. en 25 de Febrero de 2016, 01:25:07
Un saludo:En la pagina donde esta el dht cuando prende tiene 50us bajo y 26/28us alto para empezar tramsmitir,si no pongo bsf 0x05,0 no funciona niguno de los 40 ejemplos que he hecho.He puesto un dht11 nuevo,descarto que este dañado el anterior .Estoy un poco perdido.Cuando transmite los 40 bit que hace?,hay que volver a pasar puerto a como salidas y despues como entradas para que vuelva a transmitir una nueva lectura?.Gracias por todo
Título: Re:Dht11 en assembler
Publicado por: KILLERJC en 25 de Febrero de 2016, 01:43:04
El problema ya te lo dije, es insensato que pongas PORTA,0 en 1. Por que esa salida DEBERIA tener una resistencia de pull-up, por lo cual SI o SI va a estar en 1, por mas que lo pongas en 1 vos. El tema es si no se posee esa resistencia de pull-up. Pero vos me dijiste que ya tiene una resistencia de VCC a DATA  ( o el pin de datos ) el cual seria tu pull-up.

A ver si me explico mejor. Supongamos que tenes el DHT11 sin conectar al PIC. En el pin de VCC tendrias 5V, en de GND tendrias 0V y en el pin de DATA ( datos o como se llame ) deberias tener 5V. Vas y conectas tu PIC. El cual inicia como entrada (alta impedancia) el PORTA,0 y deberias tener 5V en el mismo ( un 1 ), supongamos que pones a 1 la salida PORTA,0, perfecto, estas poniendo 5V en una linea que tiene 5V. Es decir van a seguir estando los 5V alli y no va a haber diferencia entre los 5V del pull-up o los 5V de tu PIC para el DHT11, por lo cual si me decis que tenes que poner en 1 el PORTA,0 solo me queda pensar que falta la resistencia esa. Ahora si falta la resistencia de pull-up cuando pasas a entrada no vas a tener mas los 5V y va a estar flotando ( ni 1 ni 0 definido )

Si podes verlo con un osciloscopio seria ideal.

Pero ahi te explico el por que es ilogico pensar que necesitas poner a 1 la salida para que funcione, cuando ya de por si solo con la resistencia de pull-up esta en 1.
Título: Re:Dht11 en assembler
Publicado por: jo.an. en 25 de Febrero de 2016, 22:42:14
Yo lo veo asi:tenemos que enviar 50us bajo  y despues 27us alto.La resistencia pull up esta a +5v pero no trabaja por que tenemos  a 0v el ra5,0 ,por que enviamos 50us por bajo.Si no la ponemos alto no va a hacer los 27us que tienen que ser alto,por eso hay que poner bsf 0x05,0.
Saludos.
Título: Re:Dht11 en assembler
Publicado por: KILLERJC en 25 de Febrero de 2016, 23:05:02
Solamente hay un solo momento en el que el PIC deberia estar en salida. El paso a paso es asi:

Paso 1:
Inicia el modulo, esperas 1 segundo hasta poder leer por primera ves, tu linea de datos esta en 1 por el pull-up, tu PIC como entrada.

Paso 2:
Para poder leer, con el PIC tenes que poner un 0, por lo cual pones en salida, lo pones a 0 por un minimo de 18ms, terminado ese tiempo lo pones en entrada lo cual la linea de datos se va a un estado de 1 por si solo por el pull-up. Es decir Soltas la linea de datos para que lo use el DHT11. Apartir de aca siempre el PIC como entrada, es decir que el unico momento de poner el pin como salida es para esos 18ms de tenerlo en 0. ( Lo que le indica al DHT11 que envie )

Paso 3:
El DHT11 observa esto, y procede a responder con un pulso inicial de 80us en bajo, y luego 80us en alto, Esto lo produce el DHT11 !!

Paso 4:
Llegan los bits DESDE el DHT11, el PIC solo tiene que leer el pin al igual que el paso 3, asi que tiene que estar como entrada, El cual siempre tienen 50us en bajo y lo que cambia es el pulso en alto, 26-28us que representa un 0 o 70us que representa un 1. Esto para los 40 bits ( de temperatura, humedad , y checksum ). Esto tambien lo produce el DHT11

Paso 5:
El DHT11 envia un pulso en 0 al final de los 40 bits con una duracion de 50us. No TAN importante por que podes "evitarlo" entre medida y medida ya que deberias leer el sensor cada 1s masomenos, ya que la velocidad de lectura del mismo es mucho mas lenta, lei de hasta 5 segundos. Esto tambien lo produce el DHT11

Ese paso a paso esta explicado aqui (casi una traduccion lo que puse yo aca de lo que dice el PDF), el cual podes leer y corroborar lo que digo:
http://akizukidenshi.com/download/ds/aosong/DHT11.pdf

Es el link que te pase en la primera hoja del hilo del foro. Sino podes leer lo que te paso PalitroqueZ que debe estar en español, e imagino que debe decir lo mismo.

En resumen, lo unico que debe "enviar" como salida es ese pulso en 0 de 18ms, todo el otro tiempo el pin debe estar como entrada.
Título: Re:Dht11 en assembler
Publicado por: jo.an. en 26 de Febrero de 2016, 15:21:42
Saludos:Si te fijas en el link que envio palitroquez muy amablemente ,la linea en color rojo es enviada por el pic y hay un pulso de 20 a 40us alto.Si paso de salida a entrada ra5,0  si se pondria en alto ra 0x5,0 por la resistencia pero me faltaria ese pulso alto que envia el pic.Agradezco inmensamente tu interes por ayudarme,pero si tienes ocasion de tener un dht11 en tus manos y lo pruebas fisicamente,te daras cuenta que sin ese pulso alto no funciona.No es por contradecir(no llegariamos a ningun lado),pero sigo al pie de la letra tus consejos,me han ayudado bastante a entender este sensor.Me dices que el sensor se demora entre lectura y lectura 1s hasta 5s,quizas no he tenido en cuenta esto y me estoy liando.Como estube trabajando con el dh11 ( ese que es un condensador que se varia la capacitancia segun la humedad) y la respuesta es inmediata,debe ser donde tengo el lio.Muchas gracias killerjc
Título: Re:Dht11 en assembler
Publicado por: KILLERJC en 26 de Febrero de 2016, 16:26:21
Yo me estoy basando en lo que es una comunicacion de 2 vias por un mismo canal, el cual tenes que tener protecciones, y la forma de hacerlo es tener salidas open-colector. Sino mira el I2C, en el que si ambos dispositivos activan al mismo tiempo no exista problemas. En eso me estoy basando. Voy a explicar nuevamente como seria el funcionamiento.

Citar
Saludos:Si te fijas en el link que envio palitroquez muy amablemente ,la linea en color rojo es enviada por el pic y hay un pulso de 20 a 40us alto.

Voy a copiar la imagen y voy a explicar el por que lo que asumo es verdad..

(http://www.geekfactory.mx/wp-content/uploads/2013/07/dht11_sensor_protocolo_inicio.jpg)

Justamente esa imagen corresponde al paso 2 (lo del PIC) y paso 3 que te dije yo.
Lo que estoy diciendo yo es que por mas que vos pongas tu PORTA,0 en 1 o lo pases como entrada, vas a tener SI o SI 5V en el bus de datos. Nomas que con el PIC vas a "eliminar" el efecto del pull-up, ya que estarias uniendo directo el canal de datos con VCC sin resistencia de por medio.
El circuito equivalente (del sensor y micro) seria asi:

(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=45875.0;attach=25618;image)

Analicemos lo que yo digo ( Pensa nuevamente los transistores como llaves ).
- El Q del DHT11 esta abierto, es decir no hay paso. y el Q del PIC tampoco (como entrada, abierto). Por lo tanto la tension en el bus de datos es 5V.
- Comienza conduciendo el Q del pic, conectando la linea de datos a GND, para darle el pulso inciial de 18ms por eso tenes un 0 en la linea de datos.
- Aca tenes 2 opciones, pasarlo a entrada, o ponerlo en salida y en 1. Veamos la direfenrencia:
  Salida: Si pones en salida, y en 1, la linea de bus de datos va a tener 5V, por que se va a cerrar el transistor que no dibuje del PIC, el cual va a unir la linea de datos con VCC.
  Entrada: este se vuelve alta impedancia , es decir que se abre el Qpic. Por lo tanto la linea de datos no posee "conexion" a GND, y el unico voltaje es VCC a traves de la resistencia de pull-up, que como no hay corriente no hay caida de tension, por lo tanto queda con la misma tension de VCC ( la linea de datos ).

Entonces sigo sin comprender por que uno es distinto de otro cuando ambos tienen VCC en su salida.

Es interesante ademas ver como la persona que explica en español omite esa parte:

Citar
El microcontrolador debe iniciar la comunicación con el DHT11 manteniendo la linea de datos en estado bajo durante al menos 18 ms. (Aca parte faltante) Luego el DHT11 envía una respuesta con un pulso a nivel bajo de 80 uS y luego deja “flotar” la linea de datos por otros 80 uS

No dice nada de ponerlo a 1 ni pasarlo a entrada. Simplemente omite esa explicacion.
En el PDF que pase yo te lo voy a traducir:

Citar
Microprocessor I / O set to output at the same time output low, and low hold time can not be less than 18ms, then the microprocessor I / O is set to input state, due to the pull-up resistor, a microprocessor/ O DHT11 the dATA data lines also will be high

"El microcontrolador cambia el pin a salida, al mismo tiempo lo pone en bajo ( a 0 ), y mantiene ese pin en bajo por un tiempo no menor a 18ms, entonces el microcontrolador cambia el pin a entrada, que debido a la resistencia de pull-up la linea de datos del microcontrolador y del DHT11 va a estar en alto."

Y esto esta por fuera de todo lo que se podria llamar funcionamiento del DHT, la explicacion del pull-up es electronica basica. Y no posee relacion directa con como leer el sensor u otra cosa. Estamos hablando de tener 5V o no en la linea de datos, y con ambas soluciones se logra, poniendo a 1 la salida o poniendolo como entrada. Y no hay forma para el DHT11 discriminar su los 5V provienen del PIC o de la resistencia de pull-up.



Mirando un par de codigos de librerias estan poniendo la salida a 5V, justamente como yo estoy evitando. Me parece absurdo que se haga esto.
Algunos como los del link en español que paso PalitroqueZ hacen esto:

Código: C
  1. dhtlib_outhi();
  2.         dhtlib_setin(); // Turn pin to input

Es decir, lo ponen a 1, y ahi nomas lo ponen como entrada. Como dandole un pulsito. ( pulsito que no tiene sentido gracias a la resistencia de pull-up y lo que explique antes).
Este "metodo" si todo funciona bien no habria problemas. ya que es un pulsito muy muy pequeño comparado con los 28 a 40us que dice el pulso alto ( lo cual no correria riesgo de cortocircuito )

Buscando en Adafruit me encuentro con otro PEOR, en todo sentido de aplicacion, realmente estos tipos esta muy locos:

Código: C
  1. // First set data line low for 20 milliseconds.
  2.    pinMode(_pin, OUTPUT);
  3.    digitalWrite(_pin, LOW);
  4.    delay(20);
  5.  
  6.    // End the start signal by setting data line high for 40 microseconds.
  7.     digitalWrite(_pin, HIGH);
  8.     delayMicroseconds(40);
  9.  
  10.     // Now start reading the data line to get the value from the DHT sensor.
  11.     pinMode(_pin, INPUT_PULLUP);

Donde mantiene 40us el pin en alto, que supuestamente son 20 a 40 us, si es que el DHT11 se le ocurre a los 30us poner la salida a 0 es un cortocircito!. Esto no tiene explicacion realmente.

Finalmente:

Pero si queres agregarle el BSF y ver si funciona, pero para mi seria lo mismo (5V serian lo mismo desde donde vengan), hagamos la del articulo que paso PalitroqueZ. Aca le agrego el BSF y que sea momentaneo, es decir un pequeño pulsito nada mas. Tal y cual esta la otra libreria funcionando.

Código: ASM
  1. list     p=16F877 ;Se indica el modo de procesador
  2.          radix   hex
  3.  
  4. W       EQU     0
  5. F       EQU     1
  6.  
  7. STATUS  EQU     0x03
  8.  
  9. C       EQU     0
  10. Z       EQU     2
  11. RP0     EQU     5
  12.  
  13. PORTA   EQU     0x05
  14. PORTB   EQU     0x06
  15. PORTC   EQU     0x07
  16. PORTD   EQU     0x08
  17.  
  18. TRISA   EQU     0x85
  19. TRISB   EQU     0x86
  20. TRISC   EQU     0x87
  21. TRISD   EQU     0x88
  22.  
  23. ADCON1   EQU      0X9F
  24.  
  25.  
  26. d1       equ      0x20            
  27. d2       equ      0x21
  28. d3       equ      0x22
  29. reg1     equ      0x23
  30. reg2     equ      0x24
  31.  
  32. Checksum        equ      0x25
  33. TempDecimal     equ      0x26
  34. TempEntero      equ      0x27
  35. HumEntero       equ      0x28
  36. HumDecimal      equ      0x29
  37. CantidadBits    equ      0x30
  38.  
  39. ;----------------------------------------------------------------------------
  40.         ORG     0x00            ;vector de inicio
  41.         GOTO    Setup
  42.         ORG     0x04
  43.         RETURN
  44.  
  45.          
  46. Setup:
  47.         BSF     STATUS, RP0
  48.         MOVLW   0x06            ;Puerto A en modo digital
  49.         MOVWF   ADCON1
  50.         MOVLW   b'000001'       ; RA0 entrada
  51.         MOVWF   TRISA
  52.         CLRF    TRISB
  53.         CLRF    TRISC
  54.         CLRF    TRISD           ;
  55.         CLRF    TRISE
  56.         BCF     STATUS, RP0
  57.                
  58.         CLRF    PORTA
  59.         CLRF    PORTB
  60.         CLRF    PORTC
  61.         CLRF    PORTD
  62.         CLRF    PORTE
  63.  
  64. Main:
  65.         CALL    Delay_1s
  66.         CALL    Leer_DHT
  67.         CALL    Checkear_datos
  68.         ANDLW   0xFF
  69.         BTFSS   STATUS, Z
  70.         GOTO    Mal_dato
  71.         BCF     PORTB, 0
  72.         MOVF    TempEntero, W
  73.         MOVWF   PORTD
  74.         MOVF    HumEntero, W
  75.         MOVWF   PORTC
  76.         GOTO    Main
  77. Mal_dato:
  78.         BSF     PORTB, 0
  79.         GOTO    Main
  80.  
  81.  
  82.  
  83. Leer_DHT:
  84.  
  85.         CLRF    TempEntero
  86.         CLRF    TempDecimal
  87.         CLRF    HumEntero
  88.         CLRF    HumDecimal
  89.         CLRF    Checksum
  90.  
  91.         MOVLW   .40
  92.         MOVWF   CantidadBits
  93.  
  94.  
  95.         ; Aca enviar pulso inicial ( poner como salida, y luego a 0 por un tiempo, luego pasarlo a entrada )
  96.         BSF     STATUS, RP0
  97.         BCF     TRISA, 0                ; Salida
  98.         BCF     STATUS, RP0
  99.         BCF     PORTA, 0                ; Pongo un 0 en caso que no lo hubiera tenido
  100.         CALL    Delay_80us              ; Espero los 80us necesarios
  101.         BSF     PORTA, 0
  102.         BSF     STATUS, RP0
  103.         BSF     TRISA, 0                ; Entrada nuevamente
  104.         BCF     STATUS, RP0
  105.  
  106.  
  107.         ; Agregar aca la espera del primer pulso de respuesta que no forma parte de los bits.
  108.  
  109.         BTFSC   PORTA, 0        ; Espero que llegue el 0, desde el DHT11
  110.         GOTO    $-1
  111.         BTFSS   PORTA, 0        ; Estoy en 0, Espero que se ponga en 1 el DHT11
  112.         GOTO    $-1
  113.  
  114.         ; Ahora comienzo a recibir bit a bit
  115. Loop:
  116.         BTFSC   PORTA, 0        ; Espero que llegue el 0
  117.         GOTO    $-1
  118.         BTFSS   PORTA, 0        ; Estoy en 0, Espero que se ponga en 1
  119.         GOTO    $-1
  120.         CALL    Delay35us       ; Luego del delay pasan como maximo 17 ciclos hasta que vuelve a preguntar de nuevo, lo cual estaria dentro del rango de las 20 instrucciones para 4Mhz
  121.         BTFSS   PORTA, 0
  122.         GOTO    Es_cero
  123. Es_uno:
  124.         ; Si llego aca es 1
  125.         BSF     Checksum, 0     ; Observa que no uso INCF, sino que directamente pongo a 1 o 0 el bit
  126.         GOTO    Rotar
  127. Es_cero:
  128.         ; Si llego aca es 0
  129.         BCF     Checksum, 0
  130. Rotar:
  131.         DECF    CantidadBits, F ; Decremento la cantidad de bits restantes, cuando llega a 0 salgo, sino roto el valor, al rotar lo trato como un numero completo de 40 bits
  132.         BTFSC   STATUS,Z
  133.         RETURN
  134.         RLF     Checksum, F     ; Cuando roto por primera vez (en Checksum) el carry puede tener cualquier valor
  135.         RLF     TempDecimal, F  ; pero no importa por que en la proxima pasada sobreescribo ese bit con BSF y BCF, los demas carrys son necesarios
  136.         RLF     TempEntero, F
  137.         RLF     HumDecimal, F
  138.         RLF     HumEntero, F
  139.         GOTO    Loop
  140.  
  141.  
  142. ; Si W = 0 indica que esta todo bien, sino borra todo por que el dato es malo.
  143. ; Esto es para comprobar con el que llama
  144.  
  145.  
  146. Checkear_datos:
  147.         MOVF    HumEntero, W
  148.         ADDWF   HumDecimal, W
  149.         ADDWF   TempEntero, W
  150.         ADDWF   TempDecimal, W
  151.         XORWF   Checksum, W
  152.         BTFSC   STATUS, Z
  153.         RETURN                  ;W = 0
  154. Mal_Checksum:
  155.         CLRF    TempEntero
  156.         CLRF    TempDecimal
  157.         CLRF    HumEntero
  158.         CLRF    HumDecimal
  159.         CLRF    Checksum
  160.         RETURN                  ;W =/= 0
  161.  
  162.         end
  163.  
  164.  
  165. ; ******************************************************************
  166. ;
  167. ;                       Delays
  168. ;
  169. ; ******************************************************************
  170.                        
  171.  
  172.  
  173. ; Delay = 1 seconds
  174. ; Clock frequency = 4 MHz
  175.  
  176. ; Actual delay = 1 seconds = 1000000 cycles
  177. ; Error = 0 %
  178.  
  179. Delay_1s
  180.                         ;999990 cycles
  181.         movlw   0x07
  182.         movwf   d1
  183.         movlw   0x2F
  184.         movwf   d2
  185.         movlw   0x03
  186.         movwf   d3
  187. Delay_1s_0
  188.         decfsz  d1, f
  189.         goto    $+2
  190.         decfsz  d2, f
  191.         goto    $+2
  192.         decfsz  d3, f
  193.         goto    Delay_1s_0
  194.  
  195.                         ;6 cycles
  196.         goto    $+1
  197.         goto    $+1
  198.         goto    $+1
  199.  
  200.                         ;4 cycles (including call)
  201.         return
  202.                  
  203. ; Delay = 80 instruction cycles
  204. ; Clock frequency = 4 MHz
  205.  
  206. ; Actual delay = 8e-005 seconds = 80 cycles
  207. ; Error = 0 %
  208.  
  209. Delay_80us
  210.                         ;76 cycles
  211.         movlw   0x19
  212.         movwf   d1
  213. Delay_80us_0
  214.         decfsz  d1, f
  215.         goto    Delay_80us_0
  216.  
  217.                         ;4 cycles (including call)
  218.         return
  219.  
  220. ; Delay = 35 instruction cycles
  221. ; Clock frequency = 4 MHz
  222.  
  223. ; Actual delay = 3.5e-005 seconds = 35 cycles
  224. ; Error = 0 %
  225.  
  226. Delay_35us
  227.                         ;31 cycles
  228.         movlw   0x0A
  229.         movwf   d1
  230. Delay_35us_0
  231.         decfsz  d1, f
  232.         goto    Delay_35us_0
  233.  
  234.                         ;4 cycles (including call)
  235.         return
Título: Re:Dht11 en assembler
Publicado por: jo.an. en 28 de Febrero de 2016, 03:13:36
Todo el problema era que tengo una targeta con led puestos a cada pin, pulsador para porobar entradas y led para ver salidas.No cai en cuenta de haberle cortado la pista a ra5,0.Nunca habia tenido problemas con esta especie de protoboard,pero alguna vez tenia que ser.Millon de gracias y me descubro ante tu saber.Un saludo jose antonio
Título: Re:Dht11 en assembler
Publicado por: jo.an. en 04 de Julio de 2016, 23:47:45
Saludos killerjc: el dht11 me funciona a la perfeccion ,pero lo camblo por el dht22 y la temperatura me marca 00. Me podrias decir,,por favor,cual es la diferencia entre uno y otro?. Entiendo que la diferencia es que el dht22 marca decimales y el dht11 solo enteros. Muchas gracias
Título: Re:Dht11 en assembler
Publicado por: KILLERJC en 05 de Julio de 2016, 09:01:38
En la comunicacion y el formato que envia es igual, lo que no puede estar dando correcto y te esta marcando 00 es por el checksum, que el valor lo detecte como que no es correcto entonces pone todos los registros de temperatura a 0. Al menos asi lo habia realizado :P

Pero no cambia mucho, solo cambia una cosa, que el DHT11 necesita un minimo de 18ms en el pulso inicial, mienrtas que el DHT22 es de 1ms como minimo.

Y que aproximadamente cada 2 segundos cambia el valor de lectura.
Título: Re:Dht11 en assembler
Publicado por: joseydoris en 09 de Agosto de 2016, 20:56:03
Un saludo killerjc:El dht11 me funciona a la perfeccion,para el dht22 le cambie 18ms por 1ms y cuando prendo me da 55 de temp y 00 de humed. cuando le echo el aliento me pasa a 00 temp y 55 hume y se queda ahi.Te envio el pedazo de codigo con la modificacion de 1ms por 18ms.Gracias por tu tiempo
Título: Re:Dht11 en assembler
Publicado por: KILLERJC en 10 de Agosto de 2016, 09:04:07
Como dije antes, la lectura del DHT22 es igual a la del DHT11,, lo unico que cambia es que puede darse un pulso inicial mas corto.

Si estuviera leyendo cualquier cosa, entonces tendrias 00 de humedad y 00 de temperatura, ya que nunca daria el checksum.
Estuve viendo una libreria de Adafruit, que si tiene sus problemas, pero practicamente lo hace de la misma forma.

Intenta usar un cristal de alto valor y poner el delay para ese cristal, por que yo no recuerdo para que frecuencia lo pense, por que sino no daban los tiempos.

PD: Usa los nombres de los registros, no se que es 0x05 ni 3, ni 2 ni 0, Para algo estan :/
Título: Re:Dht11 en assembler
Publicado por: joseydoris en 13 de Agosto de 2016, 01:28:58
Un saludo Killerjc:Para el dht11 hay que darle 18ms para que lea.Le he ido bajando el tiempo hasta 1ms y sigue igual.Cuando prendo temp 55 hum 33.Lo caliento un poco temp 00 hum 34 y ya no va para ningun lado,si fuera el cheksun me daria temp 00 hum 00 ya que si no coinciden los limpia los registros.No se que mas hacerle.No tengo a mano un cristal mas grande,no se si sera por eso.Los veo en la red con arduino y parecen que trabajan bien no se que cristal llevaran.Si me pudieses echar una mano con esto te lo agradeceria.att jose
Título: Re:Dht11 en assembler
Publicado por: KILLERJC en 13 de Agosto de 2016, 09:59:55
Es que no es que no quiera ayudarte, no tengo ni un DHT22 presente como para probarlo y decirte que es. Asi que no puedo aportar mas.
Título: Re:Dht11 en assembler
Publicado por: joseydoris en 14 de Agosto de 2016, 22:33:48
un saludo killerjc:si no se puede no se puede,que le vamos a hacer,otra vez sera.Gracias por todo