; Control de lavarropas automático
; Rev. 01 // 04-OCT-2003 //

cprog	equ	0x02		;contador de programa (parte baja)
estado	equ	0x03		;Registro de estados del micro
ptoa	equ	0x05		;Puertos de E/S
ptob	equ	0x06
ptoc	equ	0x07
tiempo1	equ	0x20		;Usados para temporizar
tiempo2	equ	0x21
tiempo3	equ	0x22
veces	equ	0x23
display	equ	0x24		;Resguarda el numero mostrado en el display
general	equ	0x25

#define	RP0	estado, 5	;Bits de selección de página de memoria
#define	SELECT	ptoa, 0		;Entrada de selección de programa
#define	START	ptoa, 1		;Entrada de inicio del proceso
#define	MEDIA	ptoa, 2		;Entrada de la llave de media carga
#define	NOCENT	ptoa, 3		;Entrada de la llave de exclusión de centrifugado
#define	PRES50	ptoa, 4		;Entrada del presostato a media carga
#define	PRES100	ptoa, 5		;Entrada del presostato a carga completa
#define	BUZZER	ptob, 7		;Control del parlante piezo
#define	MOTFAST	ptob, 6		;Motor a alta velocidad
#define	MOTSLOW	ptob, 5		;Motor a baja velocidad
#define	CALEF	ptob, 4		;Control del sistema de calentamiento del agua
#define	VALVULA	ptob, 3		;Entrada de agua (electroválvula)
#define	BOMBA	ptob, 2		;Salida de agua (desagote)
#define	SERVON	ptob, 1		;Alimentación del servo selector de producto
#define	SERVPUL	ptob, 0		;Pulsos de control del servo selector de producto
#define	PAUSA	general, 0	;Indica que entre programa y programa haga una pausa

	goto	INICIO		;Saltea la tabla del display
	
TABLA	addwf	cprog, 1	;Genera los números y caracteres en el display
	retlw	b'00111111'	; 0
	retlw	b'00000110'	; 1
	retlw	b'01011011'	; 2
	retlw	b'01001111'	; 3
	retlw	b'01100110'	; 4
	retlw	b'01101101'	; 5
	retlw	b'01111101'	; 6
	retlw	b'00000111'	; 7
	retlw	b'01111111'	; 8
	retlw	b'01101111'	; 9
	retlw	b'01000000'	; - (10)
	retlw	b'01111001'	; E (11)
	retlw	b'01110001'	; F (12)
	retlw	b'01110011'	; P (13)
	
INICIO	clrf	ptoa		;Arranca con todo apagado
	clrf	ptob
	clrf	ptoc
	clrf	general		;Flags en cero
	
	bsf	RP0		;configura los pines de E/S
	movlw	b'00000110'
	movwf	0x1F
	movlw	b'00111111'
	movwf	ptoa
	clrf	ptob
	clrf	ptoc
	bcf	RP0

	movlw	d'10'		;Coloca el '-' en el display durante 5 segundos
	call	TABLA
	movwf	ptoc
	movlw	d'10'
	movwf	tiempo3
	bsf	ptoc, 7		;Hace destellar el punto del display
	call	DEL250
	bcf	ptoc, 7		;Hace destellar el punto del display
	call	DEL250
	btfss	START		;Entra en modo pausa al presionar cualquier pulsador durante el -
	goto	SETPAP		;Acciona el mecanismo paso a paso
	btfss	SELECT
	goto	SETPAP		;Acciona el mecanismo paso a paso
	decfsz	tiempo3, 1
	goto	$ -9
	goto	AUTOM		;Saltea la sección donde coloca la 'P'
	
SETPAP	movlw	d'13'		;Coloca la P en el display
	call	TABLA
	movwf	ptoc
	bsf	PAUSA		;Acciona el flag de Paso a Paso
	call	BEEP
	call	DEL250
	btfss	SELECT		;Espera que suelte ambos pulsadores
	goto	$ -2
	btfss	START
	goto	$ -4
	
AUTOM	btfsc	PRES50		;Si hay agua en el tanque desagota totalmente
	goto	SEL1C
	movlw	d'11'		;Coloca el 'E' en el display
	call	TABLA
	movwf	ptoc
	call	BEEP
	call	DEL250
	call	BEEP
	call	DEL250
	call	BEEP
	bsf	BOMBA		;Enciende la bomba de desagote
	btfss	PRES50		;Espera que el presostato indique tanque vacío
	goto	$ -1
	call	DIEZSEG
	call	DIEZSEG
	bcf	BOMBA		;Desconecta la bomba
	
SEL1C	movlw	d'1'		;Arranca en programa corto 1
	call	TABLA
	movwf	ptoc
	call	BEEP
	call	DEL250		;Evita repeticiones por pulsadores garcha
	btfss	SELECT		;Espera que suelte el pulsador
	goto	$ -2
	btfss	SELECT		;Controla el pulsador para cambiar de programa
	goto	SEL2C
	btfss	START		;Controla el pulsador para iniciar el programa
	goto	START1C
	goto	$ -4
SEL2C	movlw	d'2'		;Programa corto 2
	call	TABLA
	movwf	ptoc
	call	BEEP
	call	DEL250		;Evita repeticiones por pulsadores garcha
	btfss	SELECT		;Espera que suelte el pulsador
	goto	$ -2
	btfss	SELECT		;Controla el pulsador para cambiar de programa
	goto	SEL3C
	btfss	START		;Controla el pulsador para iniciar el programa
	goto	START2C
	goto	$ -4
SEL3C	movlw	d'3'		;Programa corto 3
	call	TABLA
	movwf	ptoc
	call	BEEP
	call	DEL250		;Evita repeticiones por pulsadores garcha
	btfss	SELECT		;Espera que suelte el pulsador
	goto	$ -2
	btfss	SELECT		;Controla el pulsador para cambiar de programa
	goto	SEL4C
	btfss	START		;Controla el pulsador para iniciar el programa
	goto	START3C
	goto	$ -4
SEL4C	movlw	d'4'		;Programa corto 4
	call	TABLA
	movwf	ptoc
	call	BEEP
	call	DEL250		;Evita repeticiones por pulsadores garcha
	btfss	SELECT		;Espera que suelte el pulsador
	goto	$ -2
	btfss	SELECT		;Controla el pulsador para cambiar de programa
	goto	SEL5C
	btfss	START		;Controla el pulsador para iniciar el programa
	goto	START4C
	goto	$ -4
SEL5C	movlw	d'5'		;Programa corto 5
	call	TABLA
	movwf	ptoc
	call	BEEP
	call	DEL250		;Evita repeticiones por pulsadores garcha
	btfss	SELECT		;Espera que suelte el pulsador
	goto	$ -2
	btfss	SELECT		;Controla el pulsador para cambiar de programa
	goto	SEL6C
	btfss	START		;Controla el pulsador para iniciar el programa
	goto	START5C
	goto	$ -4
SEL6C	movlw	d'6'		;Programa corto 6
	call	TABLA
	movwf	ptoc
	call	BEEP
	call	DEL250		;Evita repeticiones por pulsadores garcha
	btfss	SELECT		;Espera que suelte el pulsador
	goto	$ -2
	btfss	SELECT		;Controla el pulsador para cambiar de programa
	goto	SEL1L
	btfss	START		;Controla el pulsador para iniciar el programa
	goto	START6C
	goto	$ -4

SEL1L	movlw	d'1'		;Programa largo 1
	call	TABLA
	movwf	ptoc
	bsf	ptoc, 7		;Enciende el punto decimal del display
	call	BEEP
	call	DEL250		;Evita repeticiones por pulsadores garcha
	btfss	SELECT		;Espera que suelte el pulsador
	goto	$ -2
	btfss	SELECT		;Controla el pulsador para cambiar de programa
	goto	SEL2L
	btfss	START		;Controla el pulsador para iniciar el programa
	goto	START1L
	goto	$ -4
SEL2L	movlw	d'2'		;Programa largo 2
	call	TABLA
	movwf	ptoc
	bsf	ptoc, 7		;Enciende el punto decimal del display
	call	BEEP
	call	DEL250		;Evita repeticiones por pulsadores garcha
	btfss	SELECT		;Espera que suelte el pulsador
	goto	$ -2
	btfss	SELECT		;Controla el pulsador para cambiar de programa
	goto	SEL3L
	btfss	START		;Controla el pulsador para iniciar el programa
	goto	START2L
	goto	$ -4
SEL3L	movlw	d'3'		;Programa largo 3
	call	TABLA
	movwf	ptoc
	bsf	ptoc, 7		;Enciende el punto decimal del display
	call	BEEP
	call	DEL250		;Evita repeticiones por pulsadores garcha
	btfss	SELECT		;Espera que suelte el pulsador
	goto	$ -2
	btfss	SELECT		;Controla el pulsador para cambiar de programa
	goto	SEL4L
	btfss	START		;Controla el pulsador para iniciar el programa
	goto	START3L
	goto	$ -4
SEL4L	movlw	d'4'		;Programa largo 4
	call	TABLA
	movwf	ptoc
	bsf	ptoc, 7		;Enciende el punto decimal del display
	call	BEEP
	call	DEL250		;Evita repeticiones por pulsadores garcha
	btfss	SELECT		;Espera que suelte el pulsador
	goto	$ -2
	btfss	SELECT		;Controla el pulsador para cambiar de programa
	goto	SEL5L
	btfss	START		;Controla el pulsador para iniciar el programa
	goto	START4L
	goto	$ -4
SEL5L	movlw	d'5'		;Programa largo 5
	call	TABLA
	movwf	ptoc
	bsf	ptoc, 7		;Enciende el punto decimal del display
	call	BEEP
	call	DEL250		;Evita repeticiones por pulsadores garcha
	btfss	SELECT		;Espera que suelte el pulsador
	goto	$ -2
	btfss	SELECT		;Controla el pulsador para cambiar de programa
	goto	SEL6L
	btfss	START		;Controla el pulsador para iniciar el programa
	goto	START5L
	goto	$ -4
SEL6L	movlw	d'6'		;Programa largo 6
	call	TABLA
	movwf	ptoc
	bsf	ptoc, 7		;Enciende el punto decimal del display
	call	BEEP
	call	DEL250		;Evita repeticiones por pulsadores garcha
	btfss	SELECT		;Espera que suelte el pulsador
	goto	$ -2
	btfss	SELECT		;Controla el pulsador para cambiar de programa
	goto	SEL7L
	btfss	START		;Controla el pulsador para iniciar el programa
	goto	START6L
	goto	$ -4
SEL7L	movlw	d'7'		;Programa largo 7
	call	TABLA
	movwf	ptoc
	bsf	ptoc, 7		;Enciende el punto decimal del display
	call	BEEP
	call	DEL250		;Evita repeticiones por pulsadores garcha
	btfss	SELECT		;Espera que suelte el pulsador
	goto	$ -2
	btfss	SELECT		;Controla el pulsador para cambiar de programa
	goto	SEL1C
	btfss	START		;Controla el pulsador para iniciar el programa
	goto	START7L
	goto	$ -4

START1C	call	BEEP
	call	BOX1		;Selecciona la carga de agua por el box 1 (prelavado)
	call	CARGAR		;Carga agua en el tanque
	movlw	d'6'		;Ejecuta un ciclo de lavado de 10 min.
	call	LAVAR
	call	VACIAR		;Desagota el tanque

START2C	call	BEEP
	movlw	d'2'		;Muestra el 2 en el display
	call	TABLA
	movwf	ptoc
	btfss	PAUSA		;Si esta pausado...
	goto	SIGUE2C
	btfsc	START		;Espera que presione el pulsador
	goto	$ -7
SIGUE2C	call	BOX2		;Selecciona la carga de agua por el box 2 (jabón)
	call	CARGAR		;Carga agua en el tanque
	movlw	d'6'		;Ejecuta un ciclo de lavado de 10 min.
	call	LAVAR
	call	VACIAR		;Desagota el tanque

START3C	call	BEEP
	movlw	d'3'		;Muestra el 3 en el display
	call	TABLA
	movwf	ptoc
	btfss	PAUSA		;Si esta pausado...
	goto	SIGUE3C
	btfsc	START		;Espera que presione el pulsador
	goto	$ -7
SIGUE3C	call	BOX2		;Selecciona la carga de agua por el box 2 (jabón)
	call	CARGAR		;Carga agua en el tanque
	movlw	d'6'		;Ejecuta un ciclo de lavado de 10 min.
	call	LAVAR
	call	VACIAR		;Desagota el tanque

START4C	call	BEEP
	movlw	d'4'		;Muestra el 4 en el display
	call	TABLA
	movwf	ptoc
	btfss	PAUSA		;Si esta pausado...
	goto	SIGUE4C
	btfsc	START		;Espera que presione el pulsador
	goto	$ -7
SIGUE4C	call	BOX2		;Selecciona la carga de agua por el box 2 (jabón)
	call	CARGAR		;Carga agua en el tanque
	movlw	d'51'		;Ejecuta un ciclo de lavado de 25 min.
	call	LAVAR
	call	VACIAR		;Desagota el tanque

START5C	call	BEEP
	movlw	d'5'		;Muestra el 5 en el display
	call	TABLA
	movwf	ptoc
	btfss	PAUSA		;Si esta pausado...
	goto	SIGUE5C
	btfsc	START		;Espera que presione el pulsador
	goto	$ -7
SIGUE5C	call	BOX3		;Selecciona la carga de agua por el box 3 (enjuague)
	call	CARGAR		;Carga agua en el tanque
	movlw	d'24'		;Ejecuta un ciclo de lavado de 16 min.
	call	LAVAR
	call	VACIAR		;Desagota el tanque

START6C	call	BEEP
	movlw	d'6'		;Muestra el 6 en el display
	call	TABLA
	movwf	ptoc
	btfss	PAUSA		;Si esta pausado...
	goto	SIGUE6C
	btfsc	START		;Espera que presione el pulsador
	goto	$ -7
SIGUE6C	call	CENTRIF		;Centrifugado
	movlw	d'12'		;Coloca la 'F' en el display
	call	TABLA
	movwf	ptoc
	call	BEEPFIN		;Hace tres beep's largos
	btfsc	SELECT		;Espera que presione el pulsador
	goto	$ -1
	movlw	d'10'		;Coloca el '-' en el display
	call	TABLA
	movwf	ptoc
	call	DEL250		;Previene rebotes en pulsadores garcha
	btfss	SELECT		;Espera que suelte el pulsador
	goto	$ -2
	goto	SEL1C		;Vuelve al comienzo del programa 1 corto

START1L	call	BEEP
	call	BOX1		;Selecciona la carga de agua por el box 1 (prelavado)
	call	CARGAR		;Carga agua en el tanque
	movlw	d'6'		;Ejecuta un ciclo de lavado de 10 min.
	call	LAVAR
	call	VACIAR		;Desagota el tanque

START2L	call	BEEP
	movlw	d'2'		;Muestra el 2 en el display
	call	TABLA
	movwf	ptoc
	bsf	ptoc, 7		;Enciende el punto del display
	btfss	PAUSA		;Si esta pausado...
	goto	SIGUE2L
	btfsc	START		;Espera que presione el pulsador
	goto	$ -8
SIGUE2L	call	BOX2		;Selecciona la carga de agua por el box 2 (jabón)
	call	CARGAR		;Carga agua en el tanque
	movlw	d'21'		;Ejecuta un ciclo de lavado de 15 min.
	call	LAVAR
	call	VACIAR		;Desagota el tanque

START3L	call	BEEP
	movlw	d'3'		;Muestra el 3 en el display
	call	TABLA
	movwf	ptoc
	bsf	ptoc, 7		;Enciende el punto del display
	btfss	PAUSA		;Si esta pausado...
	goto	SIGUE3L
	btfsc	START		;Espera que presione el pulsador
	goto	$ -8
SIGUE3L	call	BOX2		;Selecciona la carga de agua por el box 2 (jabón)
	call	CARGAR		;Carga agua en el tanque
	movlw	d'21'		;Ejecuta un ciclo de lavado de 15 min.
	call	LAVAR
	call	VACIAR		;Desagota el tanque

START4L	call	BEEP
	movlw	d'4'		;Muestra el 4 en el display
	call	TABLA
	movwf	ptoc
	bsf	ptoc, 7		;Enciende el punto del display
	btfss	PAUSA		;Si esta pausado...
	goto	SIGUE4L
	btfsc	START		;Espera que presione el pulsador
	goto	$ -8
SIGUE4L	call	BOX2		;Selecciona la carga de agua por el box 2 (jabón)
	call	CARGAR		;Carga agua en el tanque
	movlw	d'51'		;Ejecuta un ciclo de lavado de 25 min.
	call	LAVAR
	call	VACIAR		;Desagota el tanque

START5L	call	BEEP
	movlw	d'5'		;Muestra el 5 en el display
	call	TABLA
	movwf	ptoc
	bsf	ptoc, 7		;Enciende el punto del display
	btfss	PAUSA		;Si esta pausado...
	goto	SIGUE5L
	btfsc	START		;Espera que presione el pulsador
	goto	$ -8
SIGUE5L	call	BOX2		;Selecciona la carga de agua por el box 2 (jabón)
	call	CARGAR		;Carga agua en el tanque
	movlw	d'21'		;Ejecuta un ciclo de lavado de 15 min.
	call	LAVAR
	call	VACIAR		;Desagota el tanque

START6L	call	BEEP
	movlw	d'6'		;Muestra el 5 en el display
	call	TABLA
	movwf	ptoc
	bsf	ptoc, 7		;Enciende el punto del display
	btfss	PAUSA		;Si esta pausado...
	goto	SIGUE6L
	btfsc	START		;Espera que presione el pulsador
	goto	$ -8
SIGUE6L	call	BOX3		;Selecciona la carga de agua por el box 3 (enjuague)
	call	CARGAR		;Carga agua en el tanque
	movlw	d'90'		;Ejecuta un ciclo de lavado de 38 min.
	call	LAVAR
	call	VACIAR		;Desagota el tanque

START7L	call	BEEP
	movlw	d'7'		;Muestra el 7 en el display
	call	TABLA
	movwf	ptoc
	bsf	ptoc, 7		;Enciende el punto del display
	btfss	PAUSA		;Si esta pausado...
	goto	SIGUE7L
	btfsc	START		;Espera que presione el pulsador
	goto	$ -8
SIGUE7L	call	CENTRIF		;Centrifugado
	movlw	d'12'		;Coloca la 'F' en el display
	call	TABLA
	movwf	ptoc
	call	BEEPFIN		;Hace tres beep's largos
	btfsc	SELECT		;Espera que presione el pulsador
	goto	$ -1
	movlw	d'10'		;Coloca el '-' en el display
	call	TABLA
	movwf	ptoc
	call	DEL250		;Previene rebotes en pulsadores garcha
	btfss	SELECT		;Espera que suelte el pulsador
	goto	$ -2
	goto	SEL1L		;Vuelve al comienzo del programa 1 corto

BOX1
BOX2
BOX3
BOX4	return

CARGAR	bsf	VALVULA		;Conecta la electroválvula
	btfsc	MEDIA		;Verifica si debe cargar a media o completo
	goto	MITAD
	btfss	PRES100		;Mira el presostato a 100%
	goto	LLENO		;Si se lleno termina la carga
	goto	CARGAR		;Si no se lleno espera que termine la carga
MITAD	btfss	PRES50		;Mira el presostato al 50%
	goto	LLENO		;Si alcanzó el nivel termina la carga
	goto	CARGAR		;Si no alcanzó el nivel espera que llegue
LLENO	bcf	VALVULA		;Desconecta la electroválvula
	return

;////////////////////////////////////////////////////////////////////////////////////////
;PROCESO DE LAVADO
;Demora 6 minutos en cargar el agua y dos minutos mas en descargarla
;Por lo que el tiempo total del lavado es igual a 8 min + (W * 20 seg)
;Lavado de 10 min -> W = 6
;Lavado de 15 min -> W = 21
;Lavado de 16 min -> W = 24
;Lavado de 25 min -> W = 51
;Lavado de 38 min -> W = 90
;////////////////////////////////////////////////////////////////////////////////////////
LAVAR	movwf	veces		;Utiliza W para condicionar la cant. de ciclos de lavado
LAVAMAS	bsf	MOTSLOW		;Enciende el motor en baja velocidad durante 10 segundos
	movf	ptoc, 0		;Resguarda el numero mostrado en el display
	movwf	display
	call	DIEZANI
	bcf	MOTSLOW		;Apaga el motor durante 10 segundos
	movf	display, 0	;restaura el display a su estado normal
	movwf	ptoc
	call	DIEZSEG
	decfsz	veces, 1
	goto	LAVAMAS
	return
	
VACIAR	bsf	BOMBA		;Acciona la bomba de desagote
	btfss	PRES50		;Espera que se vacíe completamente el tanque
	goto	$ -1
	call	DIEZSEG		;Espera 20 segundos extra
	call	DIEZSEG
	bcf	BOMBA		;Desconecta la bomba
	return

CENTRIF	btfsc	NOCENT		;Si esta en modo no-centrifugar
	return			;Evita hacerlo
	btfsc	PRES50		;Mira si hay agua en el tanque
	goto	CENT2		;Si no hay agua va directamente a centrifugar
	bsf	BOMBA		;Enciende la bomba de desague
	btfss	PRES50
	goto	$ -1
	call	DIEZSEG
	call	DIEZSEG
	bcf	BOMBA		;Una vez que se vacia el tanque apaga la bomba
CENT2	bsf	MOTFAST		;Enciende el motor a alta velocidad
	bsf	BOMBA		;Activa el desagote (por si con suelte escurre algo)
	call	DIEZSEG		;Un minuto con bomba a pleno
	call	DIEZSEG
	call	DIEZSEG
	call	DIEZSEG
	call	DIEZSEG
	call	DIEZSEG
	movlw	d'4'		;Espera 2 minutos y monedas con la bomba intermitente
	movwf	veces
	bsf	BOMBA		;Enciende la bomba de desagote
	call	DIEZSEG
	bcf	BOMBA		;Apaga la bomba
	call	DIEZSEG
	call	DIEZSEG
	call	DIEZSEG
	decfsz	veces, 1
	goto	$ -7
	bcf	MOTFAST		;Apaga el motor
	return

DIEZANI	movlw	d'10'
	movwf	tiempo3
	call	ANIM
	decfsz	tiempo3, 1
	goto	$ -2
	return
	
ANIM	movlw	b'00100000'
	movwf	ptoc
	call	DEL250
	movlw	b'00000001'
	movwf	ptoc
	call	DEL250
	movlw	b'00000010'
	movwf	ptoc
	call	DEL250
	movlw	b'01000000'
	movwf	ptoc
	call	DEL250
	return

DIEZSEG	movlw	d'40'		;Demora de 10 segundos
	goto	$ +2
UNSEG	movlw	d'4'		;Demora de 1 segundo
	movwf	tiempo3
	call	DEL250
	decfsz	tiempo3, 1
	goto	$ -2
	return

DEL250	movlw	d'250'		;Demora de 1/4 de segundo
	movwf	tiempo2
TOP2	movlw	d'110'
	movwf	tiempo1
TOP1	nop
	nop
	nop
	nop
	nop
	nop
	decfsz	tiempo1, 1
	goto	TOP1
	decfsz	tiempo2, 1
	goto	TOP2
	return

BEEPFIN	movlw	d'7'		;Hace tres beep's largos
	movwf	veces
	call	BEEP
	decfsz	veces, 1
	goto	$ -2
	call	DEL250
	movlw	d'7'
	movwf	veces
	call	BEEP
	decfsz	veces, 1
	goto	$ -2
	call	DEL250
	movlw	d'7'
	movwf	veces
	call	BEEP
	decfsz	veces, 1
	goto	$ -2
	return
	
BEEP	movlw	d'75'
	movwf	tiempo2
	bsf	BUZZER
	call	DEL55
	bcf	BUZZER
	call	DEL55
	decfsz	tiempo2, 1
	goto	$ -5
	return
	
DEL55	movlw	d'55'		;Demora de medio milisegundo
	movwf	tiempo1
T1	nop
	nop
	nop
	nop
	nop
	nop
	decfsz	tiempo1, 1
	goto	T1
	return
	
	end
