;****************SHT11.INC*********************
; Libreria especifica del sensor SHT11 para su
; correcto funcionamiento.
;*********************************************

CBLOCK
SHT11_COMMAND		
SHT11_BITCOUNT		
SHT11_READ1			
SHT11_READ2			
SHT11_COUNTER		
SHT11_BYTE			
HUMEDAD1			
HUMEDAD2			
TEMPERATURA1		
TEMPERATURA2		
ENDC

; Subrutina de inicialización del SHT11 ---------------------------
Sht11Inicializa
bsf	STATUS, RP0				; register page 1
bcf	SHT11_TRIS, SHT11_CLK	; SHT11_CLK es salida
bsf	SHT11_TRIS, SHT11_DATA	; SHT11_DATA es entrada
bcf	STATUS, RP0				; register page 0
bcf	SHT11_PORT, SHT11_CLK	; a cero
bsf	SHT11_PORT, SHT11_DATA	; a uno???
clrf	HUMEDAD1
clrf	HUMEDAD2
clrf	TEMPERATURA1
clrf	TEMPERATURA2
return

;Subrutina de Lectura de la Temperatura ----------------
Sht11GetTemperatura
call	Sht11TxStart
movlw	0x03
movwf SHT11_COMMAND
call	Sht11SendCommand2
call	Sht11Read2Bytes
call	Sht11ConvierteTemperatura
return

; Subrutina de Lectura de la Humedad
Sht11GetHumedad
call	Sht11TxStart
movlw	0x05
movwf	SHT11_COMMAND
call	Sht11SendCommand
call	Sht11Read2Bytes
call	Sht11ConvierteHumedad
return

; Subrutina de configuración de la precisión a 8 bits
Sht118bitPrecission
call	Sht11TxStart
movlw	0x06					; Valor para escribir en el registro de estado 
movwf	SHT11_COMMAND
call	Sht11SendCommand
movlw	0x01					; Valor para configurar precisión de 8 bits
movwf	SHT11_COMMAND
call	Sht11SendCommand
return

; Subrutinas para el protocolo de comunicaciones
Sht11TxStart
bsf	STATUS, RP0				; register page 1
bcf	SHT11_TRIS, SHT11_DATA	; SHT11_DATA es salida
bcf	STATUS, RP0				; register page 0
bsf	SHT11_PORT, SHT11_CLK
bcf	SHT11_PORT, SHT11_DATA
bcf	SHT11_PORT, SHT11_CLK
nop
bsf	SHT11_PORT, SHT11_CLK
bsf	SHT11_PORT, SHT11_DATA
bcf	SHT11_PORT, SHT11_CLK
return

; Enviar comando al SHT11
Sht11SendCommand
movlw	7
movwf	 SHT11_BITCOUNT

data_out
bcf	SHT11_PORT, SHT11_DATA
btfsc	SHT11_COMMAND, 7
bsf	SHT11_PORT, SHT11_DATA
nop
bsf	SHT11_PORT, SHT11_CLK
rlf	SHT11_COMMAND, F
bcf	SHT11_PORT, SHT11_CLK
decfsz	SHT11_BITCOUNT,F
goto	data_out
bcf	SHT11_PORT, SHT11_DATA
btfsc	SHT11_COMMAND, 7
bsf	SHT11_PORT, SHT11_DATA
nop
bsf	SHT11_PORT, SHT11_CLK
bsf	STATUS, RP0				; register page 1
bsf	SHT11_TRIS, SHT11_DATA	; SHT11_DATA es entrada
bcf	STATUS, RP0				; register page 0
bcf	SHT11_PORT, SHT11_CLK
call	Sht11EsperaAck
return

; Leer con precisión de 2 bytes 
Sht11Read2Bytes
btfsc	SHT11_PORT, SHT11_DATA
goto	Sht11Read2Bytes
movlw 8
movwf SHT11_BITCOUNT

high_byte
rlf	SHT11_READ2, F
bcf	SHT11_READ2, 0
bsf	SHT11_PORT, SHT11_CLK
btfsc	SHT11_PORT, SHT11_DATA
bsf	SHT11_READ2, 0
bcf	SHT11_PORT, SHT11_CLK
decfsz	SHT11_BITCOUNT, F
goto	high_byte
bsf	STATUS, RP0				; register page 1
bcf	SHT11_TRIS, SHT11_DATA		; SHT11_DATA es salida
bcf	STATUS, RP0				; register page 0
bcf	SHT11_PORT, SHT11_DATA
nop
bsf	SHT11_PORT, SHT11_CLK
nop
bcf	SHT11_PORT, SHT11_CLK
bsf	STATUS, RP0				; register page 1
bsf	SHT11_TRIS, SHT11_DATA		; SHT11_DATA es entrada
bcf	STATUS, RP0				; register page 0
movlw	8
movwf	 SHT11_BITCOUNT

low_byte
rlf	SHT11_READ1, F
bcf	SHT11_READ1, 0
bsf	SHT11_PORT, SHT11_CLK
btfsc	SHT11_PORT, SHT11_DATA
bsf	SHT11_READ1, 0
bcf	SHT11_PORT, SHT11_CLK
decfsz	SHT11_BITCOUNT, F
goto	low_byte
bsf	STATUS, RP0				; register page 1
bcf	SHT11_TRIS, SHT11_DATA		; SHT11_DATA es salida
bcf	STATUS, RP0				; register page 0
bsf	SHT11_PORT, SHT11_DATA
nop
bsf	SHT11_PORT, SHT11_CLK
nop
bcf	SHT11_PORT, SHT11_CLK
return

;****************************
Sht11ConvierteTemperatura
movlw	0xa0
subwf	SHT11_READ1, W
movwf	 TEMPERATURA1
movf	SHT11_READ2, W
btfss	STATUS, C
addlw	0 - 1
movwf	 TEMPERATURA2
movlw	0x0f
subwf	TEMPERATURA2, F
return

;****************************
Sht11ConvierteHumedad
movf	SHT11_READ1, W
movwf HUMEDAD1
movf	SHT11_READ2, W
movwf	HUMEDAD2
bcf	STATUS, C
rrf	HUMEDAD2, F
rrf	HUMEDAD2, F
bcf	STATUS, C
rrf	HUMEDAD2, F
rrf	HUMEDAD2, F
bcf	STATUS, C
rrf	HUMEDAD2, F
rrf	HUMEDAD2, F
bcf	STATUS, C
rrf	HUMEDAD2, F
rrf	HUMEDAD2, F
bcf	STATUS, C
rrf	HUMEDAD2, F
rrf	HUMEDAD2, F
return

;****************************
Sht11EsperaAck
bsf	SHT11_PORT, SHT11_CLK
nop
bcf	SHT11_PORT, SHT11_CLK
return

;****************************
Sht11GetByte
clrf	SHT11_BYTE
movlw	8
movwf	 SHT11_COUNTER

get_byte_loop
bsf	SHT11_PORT, SHT11_CLK
btfss	SHT11_PORT, SHT11_DATA
goto	get_zero_bit
bsf	SHT11_BYTE, 0
goto	got_bit

get_zero_bit
bsf	SHT11_BYTE, 0

got_bit
bcf	SHT11_PORT, SHT11_CLK
decfsz	SHT11_COUNTER, F
goto	next_bit
goto	byte_done

next_bit
rlf	SHT11_BYTE, F
goto	get_byte_loop

byte_done
return

;****************************
Sht11SendAck
bsf	STATUS, RP0
bcf	SHT11_TRIS, SHT11_DATA	; output
bcf	STATUS, RP0
bcf	SHT11_PORT, SHT11_DATA
bsf	SHT11_PORT, SHT11_CLK
bcf	SHT11_PORT, SHT11_CLK
bsf	STATUS, RP0
bsf	SHT11_TRIS, SHT11_DATA	; input
bcf	STATUS, RP0
return
	
;****************************
Sht11SendCommand2
bsf	STATUS, RP0
bcf	SHT11_TRIS, SHT11_DATA	; output
bcf	STATUS, RP0
bcf	SHT11_PORT, SHT11_CLK
; connection reset
bsf	SHT11_PORT, SHT11_DATA
bsf	SHT11_PORT, SHT11_CLK
bcf	SHT11_PORT, SHT11_CLK
bsf	SHT11_PORT, SHT11_CLK
bcf	SHT11_PORT, SHT11_CLK
bsf	SHT11_PORT, SHT11_CLK
bcf	SHT11_PORT, SHT11_CLK
bsf	SHT11_PORT, SHT11_CLK
bcf	SHT11_PORT, SHT11_CLK
bsf	SHT11_PORT, SHT11_CLK
bcf	SHT11_PORT, SHT11_CLK
bsf	SHT11_PORT, SHT11_CLK
bcf	SHT11_PORT, SHT11_CLK
bsf	SHT11_PORT, SHT11_CLK
bcf	SHT11_PORT, SHT11_CLK
bsf	SHT11_PORT, SHT11_CLK
bcf	SHT11_PORT, SHT11_CLK
bsf	SHT11_PORT, SHT11_CLK
bcf	SHT11_PORT, SHT11_CLK
bsf	SHT11_PORT, SHT11_CLK
bcf	SHT11_PORT, SHT11_CLK
; transmission start
bsf	SHT11_PORT, SHT11_DATA
bsf	SHT11_PORT, SHT11_CLK
bcf	SHT11_PORT, SHT11_DATA
bcf	SHT11_PORT, SHT11_CLK
bsf	SHT11_PORT, SHT11_CLK
bsf	SHT11_PORT, SHT11_DATA
movlw	8
movwf	 SHT11_BITCOUNT

send_bit_loop
bcf	SHT11_PORT, SHT11_CLK
btfss	SHT11_COMMAND, 7
goto	SHT11SendZero
bsf	SHT11_PORT, SHT11_DATA
goto	SHT11SendBit

SHT11SendZero
bcf	SHT11_PORT, SHT11_DATA

SHT11SendBit
bsf	SHT11_PORT, SHT11_CLK
rlf	SHT11_COMMAND, F
decfsz	SHT11_BITCOUNT, F
goto	send_bit_loop
bcf	SHT11_PORT, SHT11_CLK
bsf	STATUS, RP0
bsf	SHT11_TRIS, SHT11_DATA		; input
bcf	STATUS, RP0					; ack
bsf	SHT11_PORT, SHT11_CLK


wait_ack
btfss	SHT11_PORT, SHT11_DATA 		; deberia ser 0?
goto	got_ack
return

got_ack
bcf	SHT11_PORT, SHT11_CLK
movlw	255
movwf	 SHT11_COUNTER

wait_data
btfss	SHT11_PORT, SHT11_DATA
goto	data_ready
return

data_ready
call	Sht11GetByte
movf	SHT11_BYTE, W
movwf TEMPERATURA1
call	Sht11SendAck
call	Sht11GetByte
movf	SHT11_BYTE, W
movwf	 TEMPERATURA2
call	Sht11SendAck
call	Sht11GetByte
	return
