;***************************************************************************************
;	CALCULO DEL VALOR DE FUERZA MEDIA
;***************************************************************************************

;Los valores adquiridos se van sumando, para finalmente dividir este resultado entre
;el número total de valores (Media aritmética). Como los valores adquiridos son de
;10 bits, se trabajará en todo momento con dos registros de 8 bits para cada valor.


;VARIABLES Y REGISTROS

adHI	EQU		20h			;Valor adquirido. Parte alta
adLO	EQU		21h			;Valor adquirido. Parte baja
sumHI	EQU		22h			;Sumatorio de valores y valor final. Parte alta
sumLO	EQU		23h			;Sumatorio de valores y valor final. Parte baja
contmd	EQU		24h			;Contador
clk		EQU		25h			;valor de tiempo restante mostrado por LCD
binHI	EQU		26h			;parte alta del valor binario 16b para pasar a BCD
binLO	EQU		27h			;parte baja del valor binario 16b para pasar a BCD
centenas	EQU	28h
decenas	EQU		29h
unidades	EQU	33h	

status	EQU		03h			;Registro de estado

linea1H	EQU		2Fh			;dirección de inicio de la 1ª linea de texto del LCD
linea1L	EQU		30h
linea2H	EQU		31h			;idem de la 2ª linea
linea2L	EQU		32h


MEDIA
		CLRF	sumHI
		CLRF	sumLO		;borramos el registro del sumatorio y el contador
		
		MOVLW	0x78
		MOVWF	contmd		;tomaremos 120 muestras (78h),es decir,dos cada segundo
		MOVLW	0x3C		;cargamos 60 (segundos restantes) en clk
		MOVWF	clk
		
		MOVLW	0x0D
		MOVWF	linea1H		;cargamos las direcciones de inicio de las lineas de texto
		MOVWF	linea2H		;que se mostraran durante el proceso: "Fuerza" en la
		MOVLW	0x23		;linea superior y "T. Restante" en la inferior. Junto a estos
		MOVWF	linea1L		;textos se mostrará el valor numérico correspondiente y la
		MOVLW	0x35		;unidad de medida (kilogramos o segundos)
		MOVWF	linea2L	

		CALL	DISPLAY		;se llama a la funcion display para que muestre el texto		

		
SUMA	CALL	ADQUIS		;la funcion de adquisicion devuelve en los registros
							;adHI y adLO el valor binario de la fuerza
			
		MOVF	adLO,0
		ADDWF	sumLO,1
		BTFSC	status,0	;si no hay acarreo, continuamos con la suma de la parte alta 
		INCF	sumHI,1		;si hay acarreo, sumamos 1 a la parte alta (sumHI)
		MOVF	adHI,0
		ADDWF	sumHI,1
		
		BTFSC	contmd,0	;cálculo de clk en funcion de contmd.Si contmd es par, se salta
		DECF	clk,1		;se decrementa clk cada dos muestras (1 vez cada segundo)
		
		CALL	DATALCD		;esta función muestra en el LCD los carácteres numericos 
							;correspondientes a los valores de fuerza adquirida (en kg)
							;y al tiempo restante de ejercicio(en segundos).Los muestra
							;en los espacios libres de las lineas de texto que se han car
							;gado en el LCD al inicio de la función.
						
		CALL	TMUESTRA	;llamamos a un temporizador para consumir el tiempo restante
							;hasta la adquisicion del siguiente valor. Debe tenerse en
							;cuenta el tiempo de adquisición y visualización.El objetivo es
							;que transcurran 500ms entre muestra y muestra.
				
		DECFSZ	contmd		;se repite el proceso 120 veces
		GOTO	SUMA
				
		MOVF	sumHI,0
		MOVWF	DIVIDENDHI
		MOVF	sumLO,0
		MOVWF	DIVIDENDLO
		CLRF	DIVISORHI
		MOVLW	0x78		;dividiremos el sumatorio entre el numero de muestras (120)
		MOVWF	DIVISORLO	
		
		CALL	DIV			;llamada a rutina de division	

		MOVF	QUOTIENTHI,0
		MOVWF	sumHI
		MOVF	QUOTIENTLO,0
		MOVWF	sumLO		;el resultado del valor medio de la fuerza prénsil se guarda
							;en los registros sumHI y sumLO
		
		;Sólo queda mostrar por el LCD el resultado. Cargamos en el LCD los datos
		;necesarios
		
		MOVLW	0x0D
		MOVWF	linea1H
		MOVLW	0x47
		MOVWF	linea1L
		CALL	DISPLAY			;cargamos el texto
		
		MOVF	sumHI,0
		MOVWF	binHI
		MOVF	sumLO,0
		MOVWF	binLO
		
		MOVLW	0x8A			;situamos el cursor en la primera línea
		CALL	LOADCONFIG
		
		CALL	BINBCD			;funcion binario -> BCD
		
		MOVF	centenas,0
		IORLW	0x30			;esta máscara es para poner delante de cada dato BCD
		MOVWF	caracter
		CALL	MOSTRAR			;la cadena 0011, con lo que se podrá pasar el dato
		
		MOVF	decenas,0		;directamente al LCD.
		IORLW	0x30
		MOVWF	caracter
		CALL	MOSTRAR
		
		MOVLW	0x2E			;código ASCII del carácter "." (punto). Punto decimal
		MOVWF	caracter
		CALL	MOSTRAR
		
		MOVF	unidades,0
		IORLW	0x30
		MOVWF	caracter
		CALL	MOSTRAR
		
		RETLW	0h				;FIN DE LA FUNCION		
			
		
		
		
		
;---------------------------------------------------------------------------------------

;****************************************************************************************
;	FUNCION DATALCD
;****************************************************************************************

;Esta función se encarga de rellenar los espacios dejados en las lineas de texto del 
;LCD con los valores actualizados de fuerza adquirida y tiempo restante. Para ello carga
;en las posiciones correctas de la DDRAM del LCD los caracteres numéricos ASCII 
;correspondientes.

		MOVLW	0x89			;dirección de inicio. Es la posición en la que se
		CALL	LOADCONGIG		;mostrará el primer carácter numérico de la linea1
								;configuración del LCD
		MOVF	adHI,0
		MOVWF	binHI,0
		MOVF	adLO,0
		MOVWF	binLO
		CALL	BINBCD			;esta función pasa el número de binario a BCD con
								;centenas, decenas y unidades.
		MOVF	centenas,0
		IORLW	0x30			;esta máscara es para poner delante de cada dato BCD
		MOVWF	caracter
		CALL	MOSTRAR			;la cadena 0011, con lo que se podrá pasar el dato
		
		MOVF	decenas,0		;directamente al LCD.
		IORLW	0x30
		MOVWF	caracter
		CALL	MOSTRAR
		
		MOVLW	0x2E			;código ASCII del carácter "." (punto). Punto decimal
		MOVWF	caracter
		CALL	MOSTRAR
		
		MOVF	unidades,0
		IORLW	0x30
		MOVWF	caracter
		CALL	MOSTRAR
		
		;ya hemos cargado los valores numéricos de la fuerza en la primera linea.
		;cargaremos ahora el valor del tiempo restante en la segunda linea de manera
		;análoga
		
		MOVLW	0xCC			;direccion de inicio del primer caracter
		CALL	LOADCONFIG
		
		CLRF	binHI
		MOVF	clk,0
		MOVWF	binLO
		CALL	BINBCD			;esta función pasa el número de binario a BCD con
								;centenas, decenas y unidades.
		MOVF	decenas,0
		IORLW	0x30
		MOVWF	caracter
		CALL	MOSTRAR
		
		MOVF	unidades,0
		IORLW	0x30
		MOVWF	caracter
		CALL 	MOSTRAR
		
		;se han cargado los valores numéricos correspondientes al tiempo restante
		;hasta finalizar el ejercicio.
		
		RETLW	0h				;FIN DE LA FUNCION

;****************************************************************************************
;	FUNCION BINBCD
;****************************************************************************************

;Esta función pasa un número de 16 bits a 3 numeros BCD: centenas, decenas y unidades.
;Suponemos que a esta funcion se le pasa un número comprendido entre 0 y 999 (0 kg y 
;99.9 kg). El valor binario se le pasa a la función en los registros binHI y binLO

		MOVF	binHI,0
		MOVWF	DIVIDENDHI
		MOVF	binLO,0
		MOVWF	binLO
		MOVLW	0x64			;dividimos entre 100
		MOVWF	DIVISORLO
		CLRF	DIVISORHI		 
		
		CALL	DIV
		
		CLRF	QUOTIENTHI
		MOVF	QUOTIENTLO,0
		MOVWF	centenas
		CLRF	REMAINDERHI
		MOVF	REMAINDERLO,0
		MOVWF	DIVIDENDLO
		CLRF	DIVIDENDHI
		CLRF	DIVISORHI
		MOVLW	0x0A
		MOVWF	DIVISORLO
		
		CALL	DIV
		
		MOVF	QUOTIENTLO,0	
		MOVWF	decenas
		CLRF	QUOTIENTHI
		MOVF	REMAINDERLO,0
		MOVWF	unidades
		CLRF	REMAINDERHI
		
		RETLW	0h				;FIN DE LA FUNCIÓN
	
		



;****************************************************************************************

;TABLAS DE MEMORIA
;Las frases se encuentran al final del mapa de memoria del PIC, junto con las del menu
;de opciones

		ORG		0xD23
		MOVF	cont,0		;este contador es distinto al usado en el calculo
		ADDWF	pcl,1
		RETLW	'F'
		RETLW	'u'
		RETLW	'e'
		RETLW	'r'
		RETLW	'z'
		RETLW	'a'
		RETLW	' '
		RETLW	' '
		RETLW	' '
		RETLW	' '			;en estos espacios en blanco se mostrará el valor de la
		RETLW	' '			;fuerza adquirido en cada momento durante el ejercicio
		RETLW	' '
		RETLW	' '
		RETLW	' '
		RETLW	'k'
		RETLW	'g'
		
		ORG		0xD35
		MOVF	cont,0		;este contador es distinto al usado en el calculo
		ADDWF	pcl,1
		RETLW	'T'
		RETLW	'.'
		RETLW	'R'
		RETLW	'e'
		RETLW	's'
		RETLW	't'
		RETLW	'a'
		RETLW	'n'
		RETLW	't'
		RETLW	'e'
		RETLW	' '
		RETLW	' '			;en estos espacios se mostrará el tiempo restante hasta
		RETLW	' '			;la finalización del ejercicio
		RETLW	' '
		RETLW	' '
		RETLW	's'

		ORG		0xD47
		MOVF	cont,0		;este contador es distinto al usado en el calculo
		ADDWF	pcl,1
		RETLW	'F'
		RETLW	'.'
		RETLW	'M'
		RETLW	'e'
		RETLW	'd'
		RETLW	'i'
		RETLW	'a'
		RETLW	':'
		RETLW	' '
		RETLW	' '
		RETLW	' '			;en estos espacios se mostrará el valor de la fuerza media
		RETLW	' '			;resultado del ejercicio
		RETLW	' '
		RETLW	' '
		RETLW	'k'
		RETLW	'g'
