         list     p=16F877 ;Se indica el modo de procesador
         errorlevel-302
          radix   hex
ADCON1   EQU      0X9F
d1       equ      20            
d2       equ      21
d3       equ      22
reg1     equ      23
reg2     equ      24
Checksum equ      25
TempDecimal        equ      26
TempEntero        equ      27
HumEntero         equ      28
HumDecimal        equ      29
CantidadBits      equ      30
;----------------------------------------------------------------------------
		org 	0x00		;vector de inicio
                  goto     inicio
		org 	0x05		;despues del vector de interrupcion
         
inicio            clrf     0x08
                  bsf      3,5
                  movlw    0x06              ;Puerto A en modo digital
		movwf	ADCON1
                  movlw    B'00000000'
                  movwf    0X08
                  movlw    b'000000'   ;todo salidas
                  movwf    0x05
                  movlw    b'00000000'
                  movwf    0x06
                  movlw    b'00000000'
                  movwf    0x07
                  movlw    b'000'
                  movwf    0x09
                  bcf      3,5
		
                  clrf     0X05            
                  clrf     0X06           
                  clrf     0X07
                  clrf     0x08
                  clrf     0x09
                  clrf     reg1
                  clrf     reg2
                  clrf     Checksum 
                  clrf     TempDecimal    
                  clrf     TempEntero   
                  clrf     HumEntero     
                  clrf     HumDecimal   
                  clrf     CantidadBits  

segun    movlw    .255
         movwf    d1
qqq      movlw    .240
         movwf    d2
ttt      movlw    .4
         movwf    d3             ;1 segundo
ddd      decfsz   d3,1
         goto     ddd
         decfsz   d2,1
         goto     ttt
         decfsz   d1,1
         goto     qqq
         
;Leer_DHT:
 
;        CLRF    TempEntero
;        CLRF    TempDecimal
;        CLRF    HumEntero
;        CLRF    HumDecimal
;        CLRF    Checksum
 
;        MOVLW   .40
;        MOVWF   CantidadBits

 ; Aca enviar pulso inicial ( poner como salida, y luego a 0 por un tiempo
;loop_principal
                  bcf      0x05,0
                  call     ms18       ;tiempo para activar el dht11
                  bsf      0x05,0
                  call     us27
 ;luego pasarlo a entrada )
                  bsf      3,5        ;banco 1
                  movlw    b'000001'  ;ra,0 como entrada
                  movwf    0x05
                  bcf      3,5     
 ; Agregar aca la espera del primer pulso de respuesta que no forma parte de los bits.
;loop_principal
                  btfss    0x5,0
                  goto     $-1
                  btfsc    0x05,0  ;los 2 primeros pulsos
                  goto     $-1
                  call      us27
; Ahora bit a bit
loop_principal
                  btfss    0x05,0
                  goto     $-1
                  btfsc    0x05,0    ;espera a que de ponga bajo ra,0
                  goto     $-1
                  ;call     us30

                  ;call     segun1         ;delay 1 segundo
                  call     leer_dht11
                  call     chequear_datos
                  movf     TempEntero,0
                  movwf    0x08
                  movf     HumEntero,0
                  movwf    0x07
                  goto     loop_principal

leer_dht11
        CLRF    TempEntero
        CLRF    TempDecimal
        CLRF    HumEntero
        CLRF    HumDecimal
        CLRF    Checksum
 
        MOVLW   .40
        MOVWF   CantidadBits

        BTFSC   0x05,0        ; Espero que llegue el 0
        GOTO    $-1
        BTFSS   0x05,0        ; Estoy en 0, Espero que se ponga en 1
        GOTO    $-1
        CALL    us40       ; 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
        BTFSs   0x05,0    ;-----------------
        GOTO    Es_cero
Es_uno:
        ; Si llego  aca es 1
        BSF     Checksum, 0     ; Observa que no uso INCF, sino que directamente pongo a 1 o 0 el bit
        GOTO    Rotar
Es_cero
        ; Si llego aca es 0
        BCF     Checksum, 0
Rotar
        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
        BTFSC   3,2
        RETURN
        RLF     Checksum, F     ; Cuando roto por primera vez (en Checksum) el carry puede tener cualquier valor
        RLF     TempDecimal, F  ; pero no importa por que en la proxima pasada sobreescribo ese bit con BSF y BCF, los demas carrys son necesarios
        RLF     TempEntero, F
        RLF     HumDecimal, F
        RLF     HumEntero, F
        return
 
 
; Si W = 0 indica que esta todo bien, sino borra todo por que el dato es malo.
; Esto es para comprobar con el que llama
 
 
chequear_datos
        MOVF    HumEntero, W
        ADDWF   HumDecimal, W
        ADDWF   TempEntero, W
        ADDWF   TempDecimal, W
        XORWF   Checksum, W
        BTFSC   3,2
        RETURN                  ;W = 0
Mal_Checksum:
        CLRF    TempEntero
        CLRF    TempDecimal
        CLRF    HumEntero
        CLRF    HumDecimal
        CLRF    Checksum
        RETURN                  ;W =/= 0
 
;--------------------------------------------------------------------       
ms18     movlw    0x0f
         movwf    d1
         movlw    0x0f
         movwf    d2
l6                              ;retardo de 18ms
         decfsz   d1,1
         goto     $+2
         decfsz   d2,1
         goto     l6
         goto     $+1
         return   
;------------------------------------------------------------
us80     movlw    0x19
         movwf    d1            ;retardo de 80us
l5       decfsz   d1,1
         goto     l5
         return   
;--------------------------------------------------------------                  
us50     movlw    0x0f
         movwf    d1             ;retardo de 50us
l4       decfsz   d1,1
         goto     l4
         return   
;-----------------------------------------------------------
us40     movlw    0x0d
         movwf    d1
l7       decfsz   d1,1          ;retardo de 40us
         goto     l7
         return   
;------------------------------------------------------------------------
us70     movlw    0x15
         movwf    d1
l3       decfsz   d1,1          ;retardo de 70us
         goto     l3
         goto     $+1
         return   
;-----------------------------------------------------------                                                                                            
us30     movlw    0x08
         movwf    d1       ;retardo de 30us
l2       decfsz   d1,1
         goto     l2
         nop
         return   
;----------------------------------------------------------------         
us27     movlw    0x07
         movwf    d1
l1       decfsz   d1,1     ;retardo de 27us
         goto     l1
         nop
         return
;----------------------------------------------------------------------
segun1   movlw    .255
         movwf    d1
qq      movlw    .240
         movwf    d2
tt      movlw    .4
         movwf    d3             ;1 segundo
dd      decfsz   d3,1
         goto     dd
         decfsz   d2,1
         goto     tt
         decfsz   d1,1
         goto     qq
         return
;----------------------------------------------------------------------
         end
                       



                  
		
