;**************************************************************************************************
;MEDIDOS LA PRESIÓN
;------------------
;A SABER:
;
;EL SENSOR DE PRESIÓN MPX201 SE CONECTA A UNA FUENTE DE 3 VOLTIOS.
;ENTREGA EN SU SALIDA DE 0 A 70 MILIVOLTIOS. EL RANGO DE PRESIÓN SENSADO ES DE
;0 A 2.000,00Hpa (0 A 29 PSI) POR LO TANTO, 1 PSI = 68,96 Hpa PARA MÁS INFORMACIÓN CHEQUEAR http://www.convertworld.com/es/
;
;COMO LA SEÑAL RECIBIDA ES MUY PEQUEÑA, UTILIZAREMOS UN AMPLIFICADOR DE INSTRUMENTACIÓN. UN EJEMPLO ES EL AD620. CON ESTE CI
;AMPLIFICAREMOS LA SEÑAL DE SALIDA DEL SENSOR DE PRESIÓN POR 30 O EL VALOR QUE CORRESPONDA. LUEGO DE HABER CONVERTIDO EL VALOR
;A TENSIÓN, TENEMOS QUE DIVIDIRLO POR 30 O EL VALOR UTILIZADO, ASI PODREMOS TRABAJAR SIN PROBLEMAS MÁS TARDE.
;
;LA FÓRMULA DE LA TENSIÓN DE SALIDA ES:
;
;Vout = Voff + (SENSIBILIDAD x P)
;
;Vout ES LA TENSIÓN DE SALIDA.
;Voff ES LA TENSIÓN DE OFFSET. TÍPICO ES DE 10 mV PARA 3 VOLTIOS DE TENSIÓN EN EL SENSOR.
;SENSIBILIDAD ES 0,3 mV/Kpa LA FÓRMULA PARA OBTENER ESTO ES V a máxima presión/PRESIÓN máxima = SENSIBILIDAD = 0,03mV/Hpa
;P ES LA PRESIÓN.
;
;DESPEJANDO LA FÓRMULA PARA OBTENER LA PRESIÓN ES:
;
;P = Vout - Voff / SENSIBILIDAD.
;
;ES OBVIO QUE DEBEMOS ELEGIR LA SENSIBILIDAD DE ACUERDO A LA UNIDAD A TRABAJAR, QUE EN ESTE CASO SERÁ Hpa.
;LUEGO TENEMOS LA CORRECIÓN POR TEMPERATURA. A 25°C, EL ERROR POR TEMPERATURA ES 0, PERO POR ENCIMA DE ESTA TEMPERATURA, VARÍA 0,22%/°C, ESTO QUIERE DECIR QUE
;CUANDO AUMENTA LA TEMPERATURA, PARA UNA MISMA PRESIÓN, DISMINUYE LA TENSIÓN DE SALIDA DEL SENSOR EN UN 0,22%. CUANDO LA TEMPERATURA ES MENOR A 25°C, PARA UNA MISMA
;PRESIÓN, LA SALIDA DEL SENSOR AUMENTA LA TENSIÓN DE SALIDA EN UN 0,22%. VEAMOS COMO VAMOS A APLICAR LA CORRECIÓN DE TEMPERATURA.
;
;UNA VEZ QUE HEMOS SENSADO LA TENSIÓN DEL SENSOR POR MEDIO DE LA ENTRADA ANOLÓGICA, ANALIZAREMOS LA TEMPERATURA DEL AIRE Y APLICAMOS LA CORRECIÓN POR TEMPERATURA
;PARA LUEGO UTILIZAR LA FÓRMULA DE LA PRESIÓN PARA OBTENER EL MISMO.
;VEAMOS AHORA LA FÓRMULA PARA APLICAR LA CORRECIÓN POR TEMPERATURA:
;
;(T x CT x Vout / 100) + Vout - K = Vr
;
;DONDE:
;
;T ES LA TEMPERATURA DEL AIRE EN °C
;CT ES EL COEFICIENTE DE TEMPERATURA A 0,22mV/°C.
;Vout ES LA TENSIÓN OBTENIDA DESDE EL CAD.
;Vr ES LA TENSIÓN REAL CON CORRECIÓN POR TEMPERATURA.
;K ES UNA CONSTANTE IGUAL A 3,85
;
;RESUMIENDO.
;-----------
;
;PRIMERO DEBEMOS OBTENER EL VALOR CORRESPONDIENTE DEL CAD PARA LUEGO PASARLO A VOLTIOS. ESTO NOS DA V
;SEGUNDO, EL VALOR OBTENIDO EN VOLTIOS DEBEMOS DEIVIDIRLO POR 30 O AL VALOR UTILIZADO POR EL AMPLIFICADOR DE INSTRUMENTACIÓN.
;EL SIGUIENTE PASO ES AJUSTAR A V CON LA CORRECCIÓN DE TEMPERATURA. ESTO NOS DA Vr = Vout
;LUEGO OBTENER LA PRESIÓN CON LA FÓRMULA CORRESPONDIENTE. ESTO NOS DA P.
;COMO PASO FINAL, DEBEMOS OBTENER 42 MUESTRAS PARA HACER UN PROMEDIO Y DEL RESULTADO DEL PROMEDIO, TENDREMOS EL VALOR CORRECTO DE LA PRESIÓN.
;
;PASOS A SEGUIR.
;---------------
;
;01. AJUSTAR A CERO LAS 42 POSICIONES DE MEMORIA QUE SE UTILIZARÁN PARA GUARDAR LAS DIFERENTES MUESTRAS.
;02. AJUSTAR EL CAD A AN5 PARA SENSAR LA PRESIÓN.
;03. SENSAR LA PRESIÓN
;04. LO PASAMOS A VOLT MULTIPLICANDO POR 977
;05. LO DIVIDIMOS POR 30 (O AL VALOR CORRESPONDIENTE)
;06. APLICAR LA CORRECIÓN POR TEMPERATURA.
;07. APLICAR LA FÓRMULA PARA OBTENER LA PRESIÓN
;08. GUARDAR LA PRESIÓN OBTENIDA EN EL BANCO 2 DE LA RAM.
;09. REPETIR LOS PASOS DEL 2 AL 8 HASTA OBTENER 42 MUESTRAS.
;10. OBTENER EL PROMEDIO DE LAS 42 MUESTRAS.
;11. GUARDAR EL PROMEDIO EN LAS POSICIONES presiónAL y presiónBA PARA SER ENVIADA POR LA USART.
;12. DIRIJIRNOS A LA RUTINA DE ENVÍO POR LA USART.
;
PRESION
;*********************************************************************
;BORRO LA MEMORIA DEL BANCO 2 DE LA RAM.
;*********************************************************************
			CALL		BORRO_MEMOB2	;LLAMO A LA RUTINA PARA BORRAR LAS POCICIONES DE MEMORIA DEL BANCO 2
			CALL		AJUS_MEMO
;*********************************************************************
;AJUSTO EL CAD PARA SENSAR A AN5 Y CON EL VALOR DE REF+ A 5V
;*********************************************************************
DATO_MUESTRAS_PRESION
			MOVLW		.42
			MOVWF		muestras
;
ADQ_PRES	BSF			STATUS,RP0
			BCF			STATUS,RP1		;BANCO 1
			MOVLW		B'00101000'
			MOVWF		TRISA			;RA5 y RA3 COMO ENTRADA, DEMÁS SALIDAS
			MOVLW		B'00000000'		;+VREF A VDD, ALINEACIÓN A LA IZQUIERDA Y PORTA TODAS ANALÓGICAS.
			MOVWF		ADCON1			;Y LO PASO AL ADCON1
			BCF			STATUS,RP0		;BANCO 0
			MOVLW		B'10100001'		;ADC ENC. CANAL AN4. FREC Fosc/32
			MOVWF		ADCON0			;Y LO PASO AL ADCON0
			BCF			PIR1,ADIF		;INDICO QUE LA CONVERSIÓN NO ESTÁ ECHA
			NOP							;PARA ESTABILIZAR
			CALL		ADQUISICIÓN		;COMIENZO LA CONVERSIÓN
;-----------------------------------------------------------
;RECUPERAMOS LA CONVERSIÓN. TRABAJAMOS CON 8 BITS
;-----------------------------------------------------------
			MOVFW		ADRESH
;***********************************************************
;DESCOMPONEMOS EL NÚMERO
;***********************************************************
;-----------------------------------------------------------
;MULTIPLICAMOS POR 977 PARA PASARLO A TENSIÓN. LA UNIDAD ES CASI VOLTIOS. TAMPOCO ES EN mV
;-----------------------------------------------------------
DESCOMP_PRESION									;PRIMERO DEBEMOS PASARLO A VOLTS.
			MOVWF		multiplicadorBA
			CLRF		multiplicadorAL
			MOVLW		H'3'
			MOVWF		DATO3
			MOVLW		H'D1'
			MOVWF		DATO4					;MENOS SIGNIFICATIVO
			CALL		MULTIPLICAR				;MULTIPLICAMOS Y OBTUVIMOS UN RESULTADO DE 16 BIT EN DATO3, DATO4 (MENOS SIGNIFICATIVO)
;************************************************************
;DIVIDIMOS POR 100 PARA PASARLO A mV
;************************************************************
			MOVLW		H'64'
			MOVWF		FUNC4
			CLRF		FUNC3
			CALL		DIVISION
			MOVFW		DATO4
			MOVWF		PTEMP4
;------------------------------------------------------------
;CORRECCIÓN POR TEMPERATURA.
;---------------------------
;APLICAMOS LA FÓRMULA: (T x CT x Vout / 100) + Vout - K
;COMO EL DIVIDENDO TIENE NÚMERO CON COMA, LOS MULTIPLICAREMOS PARA ELIMINARLOS, LUEGO TENDREMOS QUE DIVIDIR POR 100.000
;
;LA TEMPERATURA YA TRABAJAMOS SI COMA, POR EJEMPLO 25,0°C VIENE EXPRESADO 250 DECIMAL.
;CT = 0,22mV/°C, PERO COMO ES UNA CONSTANTE, YA TRABAJAMOS CON 22.
;Vout YA LO PASAMOS A mV POR LO QUE NO HAY QUE HACER NINGUNA MULTIPLICACIÓN. NOS QUEDA APLICAR LA FÓRMULA PERO ANTES DEBEMOS CHEQUEAR SI
;LA TEMP ES POSITIVA O NEGATIVA. EN CASO DE SER NEGATIVO, AJUSTAMOS EL BIT 7 A 0 PARA TRABAJARLO COMO SI FUERA POSITIVO, PERO UNA VEZ
;QUE HALLAMOS DIVIDIDO POR 100.000 (UNA VEZ DIVIDIDO POR 10.000 Y LA SEGUNDA VEZ POR 10) DEBEMOS RECORDAR QUE EL VALOR ES NEGATIVO.
;PARA ELLO HAREMOS LA NEGACIÓN DEL VALOR Y LUEGO APLICAMOS EL RESTO DE LA FÓRMULA.
;K = 3,85. COMO ES UNA CONSTANTE TRABAJAREMOS CON 385, PERO ANTES, EL RESULTADO DE LA SUMA DE Vout TENDREMOS QUE MULTIPLICARLO POR 100
;PARA LUEGO RESTARLE LA CONSTANTE K (385) Y LUEGO DIVIDIREMOS POR 100 QUEDANDO LA TENSIÓN CORREGIDA POR TEMPERATURA.
;*************************************************************
;MULTIPLICAMOS LA TEMP POR 22, PERO ANTES CHEQUEAMOS EL BIT 7 PARA AJUSTAR O NO EL BIT 7 DE LA TEMPERATURA PARTE ALTA
;************************************************************
			MOVFW		temperaturaBA
			MOVWF		DATO4
			MOVFW		temperaturaAL
			MOVWF		DATO3
			BTFSC		temperaturaAL,7			;¿ES NEGATIVO LA TEMP? ¿ES 1 EL BIT 7?
			BCF			DATO3,7					;SI, AJUSTAMOS A 0 EL BIT 7
			CLRF		DATO2					;ES POSITIVO.
			CLRF		DATO1
			MOVLW		.22
			MOVWF		multiplicadorBA
			CLRF		multiplicadorAL
			CALL		MULTIPLICAR
;************************************************************
;EL RESULTADO ANTERIOR QUEDÓ GUARDADO EN DATO1;2;3;4
;AHORA LO MULTIPLICAMOS POR Vout QUE QUEDÓ GUARDADO EN PTEMP4
;************************************************************
			MOVFW		PTEMP4
			MOVWF		multiplicadorBA
			CLRF		multiplicadorAL
			CALL		MULTIPLICAR
;************************************************************
;AHORA DIVIDIMOS POR 10.000 2710 EN HEX AL RESULTADO ANTERIOR GUARDADO EN DATO1;2;3;4
;************************************************************
			MOVLW		H'27'
			MOVWF		FUNC3
			MOVLW		H'10'
			MOVWF		FUNC4
			CALL		DIVISION
;************************************************************
;AHORA DIVIDIMOS POR 10
;************************************************************
			CLRF		FUNC3
			MOVLW		.10
			MOVWF		FUNC4
			CALL		DIVISION
;************************************************************
;EL SIGUIENTE PASO ES VER SI LA TEMPERATURA ES NEGATIVA
;EN CASO DE SER NEGATIVA, AL RESULTADO ANTERIOR TENEMOS QUE
;HACERLO NEGATIVO, EN CASO DE SER POSITIVO, SE CONTINÚA NORMALMENTE
;************************************************************
			BTFSC		temperaturaAL,7			;¿ES NEGATIVA LA TEMP?
			GOTO		TEMP_POSITIVA			;NO, ES POSITIVA
			MOVFW		DATO4					;SI, DEBO NEGAR EL RESULTADO ANTERIOR PARA PROCEDER NORMALMENTE.
			MOVWF		DATO2
			MOVFW		DATO3
			MOVWF		DATO1
			CALL		neg_A1
TEMP_POSITIVA
			MOVFW		PTEMP4					;RECUPERAMOS LA TENSIÓN DEL SENSOR
			MOVWF		DATO4
			CLRF		DATO3
			CALL		D_addF					;RESULTADO EN DATO1;2
			CLRF		DATO2
			CLRF		DATO1
;************************************************************
;PARA PODER RESTAR EL RESULTADO ANTERIOR CON LA CONSTANTE 385, DEBEMOS MULTIPLICAR EL RESULTADO ANTERIOR POR 100
;PARA LUEGO RESTARLA CON LA CONSTANTE Y EL RESULTADO DIVIDIRLO POR 100.
;************************************************************
			MOVLW		.100
			MOVWF		multiplicadorBA
			CLRF		multiplicadorAL
			CALL		MULTIPLICAR
;************************************************************
;RESTAMOS EL RESULTADO ANTERIOR CON 385 (DATO3,DATO4 - DATO1,DATO2 = DATO3,DATO4)
;************************************************************
			MOVLW		H'01'
			MOVWF		DATO1
			MOVLW		H'81'
			MOVWF		DATO2
			CALL		RESTA
;************************************************************
;DIVIDIMOS POR 100
;************************************************************
			MOVLW		.100
			MOVWF		FUNC4
			CLRF		FUNC3
			CLRF		DATO2
			CLRF		DATO1
			CALL		DIVISION				;RESULTADO EN DATO1;2;3;4 PERO COMO EL RESULTADO ES EN 16 BIT, QUEDA EN DATO3;4
;************************************************************
;YA TENEMOS LA CORRECCIÓN POR TEMPERATURA. AHORA NOS QUEDA APLICAR LA FÓRMULA PARA OBTENER LA PRESIÓN.
;P = Vout - Voff / SENSIBILIDAD.
;LA SENSIBILIDAD ES 0,03mV/Hpa. PARA ELIMINAR LA COMA, TENEMOS QUE MULTIPLICAR POR 100 AL RESULTADO DE
;Vout - Voff. UNA VEZ QUE HALLAMOS MULTIPLICADO, DIVIDIMOS POR 3, Y YA NOS DA EN Hpa
;************************************************************
			MOVLW		.10
			MOVWF		DATO2
			CLRF		DATO1
			CALL		RESTA
;************************************************************
;AL RESULTADO LO MULTIPLICAMOS POR 100
;************************************************************
			MOVLW		.100
			MOVWF		multiplicadorBA
			CLRF		multiplicadorAL
			CALL		MULTIPLICAR
;************************************************************
;DIVIDIMOS POR 3 Y OBTENEMOS EL VALOR DE LA PRESIÓN.
;************************************************************
			MOVLW		.3
			MOVWF		FUNC4
			CLRF		FUNC3
			CALL		DIVISION
;************************************************************
;GUARDAMOS LOS DATOS EN EL BANCO 2
;************************************************************
SALVAR_MEMO_2
			BCF			STATUS,RP0				;
			BSF			STATUS,RP1				;BANCO 2
			MOVFW		dir1					;DIRECCIÓN A APUNTAR
			MOVWF		FSR						;APUNTAMOS
			BCF			STATUS,RP1				;BANCO 0
			MOVFW		DATO3					;RECUPERO EL RESULTADO MAS SIGNIFICATIVO
			BSF			STATUS,RP1				;BANCO 2
			MOVWF		INDF					;GUARDAMOS EL DATO EN LA POCICIÓN APUNTADA EN FSR
			INCF		FSR,F					;INCREMENTAMOS EL FSR PARA GUARDAR EL RESULTADOS MENOS SIGNIFICATIVO
			BCF			STATUS,RP1				;BANCO 0
			MOVFW		DATO4					;RECUPERO EL RESULTADO MENOS SIGNIFICATIVO
			BSF			STATUS,RP1				;BANCO 2
			MOVWF		INDF					;PASAMOS EL VALOR A LA POCICIÓN APUNTADA EN FSR
			INCF		prom_pos,F				;INCREMENTO EN 1 A PROM_POS
			INCF		FSR,F
			MOVFW		FSR						;PASAMOS EL DATO A W
			MOVWF		dir1					;Y LO SALVAMOS PARA SU POSTERIOR USO
			BCF			STATUS,RP1				;BANCO 0
;
TOTAL_MUESTRAS_PRESION
			DECFSZ		muestras,F				;¿TOMÉ LAS 42 MUESTRAS?
			GOTO		ADQ_PRES				;NO, SIGO MIDIENDO LA PRESION
			CALL		AJUS_MEMO				;SI, DEJO INICIALIZADA LAS DIRECCIONES A APUNTAR PARA PODER PROMEDIAR LAS MUESTRAS.
;************************************************************
;SUMAMOS LOS VALORES CENSADOS. EL RESULTADO ESTÁ EN DATO3, DATO4
;************************************************************
			BCF			STATUS,RP0				;SI HAY
			BSF			STATUS,RP1				;BANCO 2
			MOVFW		prom_pos				;SALVAMOS LA CANTIDAD DE DATOS POSITIVOS
			BCF			STATUS,RP1				;BANCO 0
			MOVWF		prom_pos_alt			;PARA SABER CUANTAS VECES HAY QUE SUMARLAS, PARA LUEGO DIVIDIRLAS.
			BSF			STATUS,RP1				;BANCO 2
			MOVFW		dir1
			MOVWF		FSR						;DIRECCIÓN A LEER
			MOVFW		INDF					;EL VALOR EN FSR SE GUARDA EN W
			BCF			STATUS,RP1				;BANCO 0
			MOVWF		DATO3
			BSF			STATUS,RP1				;BANCO 2
			INCF		FSR,F					;DIRECCIÓN A APUNTAR SEGUNDO DATO
			MOVFW		INDF
			BCF			STATUS,RP1				;BANCO 0
			MOVWF		DATO4
			BSF			STATUS,RP1				;BANCO 2
			INCF		FSR,F
			MOVFW		FSR
			MOVWF		dir1
;
SUMAR_PROM_PRESION
			BSF			STATUS,RP1				;BANCO 2
			MOVFW		dir1
			MOVWF		FSR
			MOVFW		INDF
			BCF			STATUS,RP1				;BANCO 0
			MOVWF		DATO1
			BSF			STATUS,RP1				;BANCO 2
			INCF		FSR,F
			MOVFW		INDF
			BCF			STATUS,RP1				;BANCO 0
			MOVWF		DATO2
			BSF			STATUS,RP1				;BANCO 2
			INCF		FSR,F
			MOVFW		FSR
			MOVWF		dir1
			BCF			STATUS,RP1				;BANCO 0
			CALL		D_addF
			DECFSZ		prom_pos_alt,F
			GOTO		SUMAR_PROM_PRESION
;**********************************************************
;OBTUVIMOS LA SUMA EN DATO3, DATO4, AHORA HACEMOS EL PROMEDIO DIVIDIENDO POR LA CANTIDAD DE MUESTRAS OBTENIDAS EL RESULTADO EN DATO
;**********************************************************
			CLRF		FUNC3
			MOVLW		.42
			MOVWF		FUNC4
			CALL		DIVISION
			MOVFW		DATO4
			MOVWF		presiónBA				;GUARDAMOS LOS DATOS ACÁ POR SI TENEMOS QUE PROMEDIAR CON VALORES NEGATIVOS
			MOVFW		DATO3
			MOVWF		presiónAL				;IDEM ANTERIOR
;**************************************************************************************************
;FIN SENSADO PRESIÓN
;**************************************************************************************************