; Control de lavarropas automático ; Rev. 01 // 04-OCT-2003 // Version funcional sin selección de productos ; Rev. 02 // 20-DIC-2003 // Manejo del servo y timeout's de carga y descarga del agua 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 intcon equ 0x0B ;Control de interrupciones 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 tout1 equ 0x26 ;Usadas para el timeout de carga y descarga de agua tout2 equ 0x27 backw equ 0x28 ;Back-up de W al interrumpir #define CERO estado, 2 ;Bit indicador de resultado cero #define RP0 estado, 5 ;Bit de selección de página de memoria #define GIE intcon, 7 ;Bit de habilitación de las interrupciones #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 SERVO ptob, 1 ;Pulsos de control del servo selector de producto #define PAUSA general, 0 ;Indica que entre programa y programa haga una pausa #define ENTRA general, 1 ;Indica si esta en modo carga (1) /descarga (0) de agua goto INICIO ;Saltea la tabla del display org 0x04 ;Vector de interrupcion movwf backw ;Guarda W incfsz tout1, 1 ;Suma 1 a TimeOut 1 goto SALEINT ;Si no llego a dar la vuelta sale incf tout2, 1 ;Suma 1 a TimeOut 2 movf tout2, 0 ;Controla si llego a 17 (aprox. 10 min) sublw d'34' btfss CERO goto SALEINT ;Si no llego a cinco minutos sale bcf VALVULA ;Apaga la electroválvula de entrada de agua bcf BOMBA ;Apaga la bomba de desagüe bcf MOTFAST ;Apaga el Motor bcf MOTSLOW bcf CALEF ;Apaga el sistema de calentamiento de agua FALLA movlw d'11' call TABLA movwf ptoc bsf BUZZER call DELOFF bcf BUZZER call DEL250 movlw d'1' ;Muestra E2 en el display btfss ENTRA movlw d'2' ;Muestra E2 en el display call TABLA movwf ptoc bsf BUZZER call DELOFF bcf BUZZER call DEL250 goto FALLA SALEINT movlw b'10100000' ;Restablece las interrupciones movwf intcon movf backw, 0 ;Restablece W retfie 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 movlw b'00100000' ;Establece las interrupciones movwf intcon movlw b'11010111' ;Asigna a TMR0 el predivisor a 256 y toma osc. desde XT movwf 0x01 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 bsf GIE ;Activa el sistema de time-out de descarga bcf ENTRA clrf tout1 ;Inicializa los contadores de timeout clrf tout2 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 bcf GIE ;Desactiva el sistema de timeout 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 (jabón 1) 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 2) 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 2) 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 2) 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 (jabón 1) 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 BOX1 ;Selecciona la carga de agua por el box 1 (jabón 1) 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 2) 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 2) 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 2) 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 movlw d'40' ;Selecciona el casillero 1 de jabón movwf tiempo3 bsf SERVO movlw d'100' call DELON bcf SERVO call DELOFF decfsz tiempo3, 1 goto $ -6 return BOX2 movlw d'40' ;Selecciona el casillero 2 de jabón movwf tiempo3 bsf SERVO movlw d'120' call DELON bcf SERVO call DELOFF decfsz tiempo3, 1 goto $ -6 return BOX3 movlw d'40' ;Selecciona el casillero de enjuague movwf tiempo3 bsf SERVO movlw d'200' call DELON bcf SERVO call DELOFF decfsz tiempo3, 1 goto $ -6 return BOX4 movlw d'40' ;Selecciona el casillero de pre-lavado movwf tiempo3 bsf SERVO movlw d'155' call DELON bcf SERVO call DELOFF decfsz tiempo3, 1 goto $ -6 return CARGAR bsf GIE ;Activa el sistema de time-out de carga bsf ENTRA clrf tout1 ;Inicializa los contadores de timeout clrf tout2 CARGA 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 CARGA ;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 CARGA ;Si no alcanzó el nivel espera que llegue LLENO bcf VALVULA ;Desconecta la electroválvula bcf GIE ;Desactiva el sistema de time-out 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 GIE ;Activa el sistema de time-out de descarga bcf ENTRA clrf tout1 ;Inicializa los contadores de timeout clrf tout2 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 bcf GIE ;Desactiva el sistema de timeout 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 BEEPFIN bsf BUZZER ;Hace tres beep's largos call DEL250 call DEL250 bcf BUZZER call DEL250 call DEL250 bsf BUZZER call DEL250 call DEL250 bcf BUZZER call DEL250 call DEL250 bsf BUZZER call DEL250 call DEL250 bcf BUZZER call DEL250 call DEL250 return BEEP bsf BUZZER call DELOFF bcf BUZZER call DELOFF return DELON movwf tiempo1 nop nop nop nop nop nop nop decfsz tiempo1, 1 goto $ -8 return DEL250 movlw d'250' ;Demora de 1/4 de segundo goto $ +2 DELOFF movlw d'50' ;Demora de 50ms 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 end