; Librerias necesarias para el correcto funcionamiento del programa

;*************************AJUSTE_HUMEDAD.INC*****************
; Libreria para realizar el ajuste de humedad leido por el sensor 
; obtenido de la web www.monigot.com
;*****************************************************************

; Funciones para convertir el valor leído del sensor en un porcentaje

CBLOCK	
RXmsb		
RXlsb		
RH		
ACCaLO  	
ACCaHI  	
ACCbLO  	
ACCbHI  	
ACCcLO  	
ACCcHI  	
ACCdLO  	
ACCdHI  	
temp    	
Flags		
ENDC

;///////////////////////////////////////////////////////////////////////////
CalcRH				;RH% calculos de linealidad. (a*RH%+b)/256
movlw	.0			;0	;MultiplicLO
movwf	 ACCaHI
movf	RXlsb,W	     	;lectura 8 bits	;MultiplicHI
movwf	 ACCaLO
movlw	.108		
subwf	RXlsb,W
btfsc	STATUS,C
goto	calcA2
		
;-------------- Si lectura menor o igual a 107...
calcA1		
movlw	.143			;A		;ResultLLO
movwf	 ACCbLO
movlw	.0			;A		;ResultHHI
movwf	 ACCbHI
		
call	D_mpyS 		;multiplica (A*RH)
;el resultado esta en ACCcHI,ACCcLO		
;resta 512 del resultado
;comprueba si el dato es mayor de 512
;si fuera menor.. pone como resultado 512
;si es mayor.. resta 2 a MSB que equivale a 512
;del dato de 16bits		
movlw	.3				;resta 2
subwf	ACCcHI,W	
btfss	STATUS,C
goto 	menord2			;mayor de 2

mayord2				;	si es mayor de 512.. resta 512 al resultado
					;y luego comprueba que el resultado no sea
menor de 512
movlw	.2
subwf	ACCcHI,F			;resta 512 al dato alto 
movlw	.3				;si el resultado es 
subwf	ACCcHI,W			;menor de 512...
btfss	STATUS,C
goto 	menord2			;mayor de 2
goto	calccont			;si es mayor continua

menord2					;si es menor de 2 pone como resultado 512
movlw	.2
movwf	ACCcHI			;resultado=512
clrf	ACCcLO
goto	calccont			;continua con los calculos
goto	calccont
		
;-------------- Si lectura mayor o igual a 108...
calcA2		
movlw	.111				;A		;ResultLLO
movwf	ACCbLO
movlw	.0				;A		;ResultHHI
movwf	 ACCbHI
call	D_mpyS 			;multiplica (A*RH)
					;suma 2893 al resultado
					;suma 11 a MSB(mas acarrero de LSB) y77 a LSB
					;MSB=ACCcHI  LSB=ACCcLO para
16bits de resolucion
movlw	.11
addwf	ACCcHI,F			;suma 11 a MSB
movlw	.77				;suma 77 a LSB y si hay acarreo
addwf	ACCcLO,F			;se lo suma a LSB
btfsc	STATUS,C			;comprueba el acarreo
incf	ACCcHI,F			;suma el acarreo a MSB
					;no hay acarreo y salta
calccont					;continua con el calculo de %RH	
					;ahora divide el resultado de 16bits / 256
					;El resultado completo de 32 bits = (ACCbHI,ACCbLO,ACCcHI,ACCcLO )
					;el resutlado despues de rotar 8 bits es elmismo 
					;que el byte (ACCcHI) correspondiente albyte 2 
					;menos significativo
movf	ACCcHI,W
movwf	 RH				;RH = Relative Humidity
return					;retorna con el resultado calculado	
;==============================================================;==============================================================
;==============================================================

;*******************************************************************
;                    Double Precision Multiplication
;
;               ( Optimized for Code Size : Looped Code )
;
;*******************************************************************;
;   Multiplication : ACCb(16 bits) * ACCa(16 bits) -> ACCb,ACCc ( 32 bits )
;      (a) Load the 1st operand in location ACCaLO & ACCaHI ( 16 bits )
;      (b) Load the 2nd operand in location ACCbLO & ACCbHI ( 16 bits )
;      (c) CALL D_mpy
;      (d) The 32 bit result is in location ( ACCbHI,ACCbLO,ACCcHI,ACCcLO )
;*******************************************************************;
;
;
;*******************************************************************
;               Double Precision Multiply ( 16x16 -> 32 )
;         ( ACCb*ACCa -> ACCb,ACCc ) : 32 bit output with high word
;  in ACCb ( ACCbHI,ACCbLO ) and low word in ACCc ( ACCcHI,ACCcLO ).
;

D_mpyS        					;results in ACCb(16 msb's) and ACCc
(16lsb's)
call    setupmult
bcf	STATUS,C

mloop   
rrf     ACCdHI,F       			;rotate d right
rrf     ACCdLO,F
btfss   STATUS,C    			;need to add?
goto    No_add
movf    ACCaLO,W       		 ; Addition ( ACCb + ACCa -> ACCb )
addwf   ACCbLO,F       		;add lsb
btfsc   STATUS,C    			;add in carry
incf    ACCbHI,F
movf    ACCaHI,W
addwf   ACCbHI,F       		;add msb

No_add		
rrf     ACCbHI,F
rrf     ACCbLO,F
rrf     ACCcHI,F
rrf     ACCcLO,F
decfsz  temp,F 		       	 ;loop until all bits checked
goto    mloop
goto	end1


;         Double Precision Addition ( ACCb + ACCa -> ACCb )
;
D_add  	       
bcf	Flags,C			;Clear temp Carry bit
movf    ACCaLO,W        		; Addition ( ACCb + ACCa -> ACCb )
addwf  ACCbLO,F       		;add lsb
btfsc   	STATUS,C    			;add in carry
 incf    ACCbHI,F
btfsc	STATUS,C
bsf	Flags,C	
movf    ACCaHI,W
addwf  ACCbHI,F        		;add msb
btfsc	Flags,C
bsf 	STATUS,C
return
;
;
;*******************************************************************
;
setupmult  	
movlw  .16             			; for 16 shifts
movwf  temp
movf    ACCbHI,W       		 ;move ACCb to ACCd
movwf  ACCdHI
movf    ACCbLO,W
movwf  ACCdLO
clrf    	ACCbHI
clrf    	ACCbLO
return

end1	return
