Autor Tema: Dht11 en assembler  (Leído 16603 veces)

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

Desconectado jo.an.

  • PIC16
  • ***
  • Mensajes: 120
Re:Dht11 en assembler
« Respuesta #30 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?

Desconectado jo.an.

  • PIC16
  • ***
  • Mensajes: 120
Re:Dht11 en assembler
« Respuesta #31 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

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Dht11 en assembler
« Respuesta #32 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:



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:



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 )

Desconectado jo.an.

  • PIC16
  • ***
  • Mensajes: 120
Re:Dht11 en assembler
« Respuesta #33 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

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Dht11 en assembler
« Respuesta #34 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

Desconectado jo.an.

  • PIC16
  • ***
  • Mensajes: 120
Re:Dht11 en assembler
« Respuesta #35 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

Desconectado jo.an.

  • PIC16
  • ***
  • Mensajes: 120
Re:Dht11 en assembler
« Respuesta #36 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

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Dht11 en assembler
« Respuesta #37 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.

Desconectado jo.an.

  • PIC16
  • ***
  • Mensajes: 120
Re:Dht11 en assembler
« Respuesta #38 en: 19 de Febrero de 2016, 20:22:16 »
Cuando puedas KILLERJC.Un saludo

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Dht11 en assembler
« Respuesta #39 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

Desconectado jo.an.

  • PIC16
  • ***
  • Mensajes: 120
Re:Dht11 en assembler
« Respuesta #40 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.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Dht11 en assembler
« Respuesta #41 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.

Desconectado jo.an.

  • PIC16
  • ***
  • Mensajes: 120
Re:Dht11 en assembler
« Respuesta #42 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

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Dht11 en assembler
« Respuesta #43 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.

Desconectado jo.an.

  • PIC16
  • ***
  • Mensajes: 120
Re:Dht11 en assembler
« Respuesta #44 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