176 ;*****************************************PROGRAMA******************************************* LIST INCLUDE __CONFIG p=16F628A "P16F628A.INC" 3F09 ; Procesador utilizado ; Definición de los registros del Pic ; Configuración de fusibles ;----------------------------------------------------------------------------------------------------------------------------------------;Variables CBLOCK 0x25 GRABAR_EEPROM y LEER_EEPROM Addr_EE Data_EE AUXIMPULSOS IMPULSOS PUNTO UNIDADES DECENAS CENTENAS UNIDADES_MIL DECENAS_MIL AYUDA_ENV_DATOS ENDC ; Variables para las rutinas ; Almacena la dirección de la EEPROM a leer y/o grabar ; Almacena el dato a leer y/o grabar en la EEPROM ; Variable para verificar la cantidad de impulsos ; Variable para impulsos de energía activa ; Variable para decimas de energía activa ; Variable para unidades de energía activa ; Variable para decenas de energía activa ; Variable para centenas de energía activa ; Variable para unidades mil de energía activa ; Variable para decenas mil de energía activa ; Variable de ayuda para enviar datos por RS232 ;--------------------------------------------------------------------------------------------------------------------------------#DEFINE ENTRADA_IMPULSOS #DEFINE NOLUZ_GRABAR #DEFINE LED PORTB,7 PORTB,6 PORTA,0 ; Nombrar al pin 7 del puerto B como entrada de impulsos ; Nombrar al pin 6 del puerto B como pin para sensar energía ; Nombrar al pin 0 del puerto A como salida para un led ;--------------------------------------------------------------------------------------------------------------------------------------------------ORG goto ORG GOTO 0x00 INICIO 0x04 INTERRUPCIONES ; Dirección de inicio del programa ; Ir a la etiqueta Inicio ; Dirección de Interrupciones ; Ir a la etiqueta INTERRUPCIONES ;---------------------------------------------------------------------------------------------------------------------------------------------------INICIO BSF MOVLW MOVWF MOVLW MOVWF movlw movwf movlw movwf BCF MOVLW MOVWF movlw movwf clrf CLRF CLRF BCF CALL STATUS,RP0 B'11011110' TRISA B'11111011' TRISB b'00100100' TXSTA .25 SPBRG STATUS,RP0 d'7' CMCON b'10010000' RCSTA RCREG Addr_EE Data_EE LED RET_50MS ; Cambio al BANCO 1 ; Carga valor al registro de trabajo W ; Mueve el valor de W al registro TRISA ; Carga valor al registro de trabajo W ; Mueve el valor de W al registro ; Habilitar tx USART a 8 bits ; Asincrona a alta velocidad ; Velocidad de comuicación ; a 9600 baudios con XT de 4Mhz ; Cambio al BANCO 0 ; Carga el valor al registro de trabajo W ; Se apagan los comparadores ; Carga el valor al registro de trabajo W ; Habilitar rx USART asincrona ; Limpiar registro RCREG ; Limpia el registro de dirección de la EEPROM ; Limpia el registro de datos de la EEPROM ; Apagar Led ; Retardo de 50 ms 177 ;---------------------------------------------------------------------------------------------------------------------------------INI Movlw .10 ; Carga el valor al registro de trabajo W movwf Addr_EE ; Mueve el valor de W a la variable Addr_E CALL LEER_EEPROM ; Llama a la Subrutina leer eeprom MOVFW Data_EE ; El dato leido al variable Data_EE XORLW .100 ; Es igual a 100..? BTFSS STATUS,Z ; Es igula a 100..? CALL GRABA_DATOS_INI ; No llama a la subrutina inicializar goto ANOTAR_VARIABLES ; Si, ir a la etiqueta ANOTAR_VARIABLES ;------------------------------------------------ Subrutina para grabar datos -------------------------------------------GRABAR ;#AUXIMPULSOS MOVLW MOVWF movfw MOVWF CALL B'00001000' Addr_EE AUXIMPULSOS Data_EE GRABAR_EEPROM ; Carga el valor al registro de trabajo W ; Mueve el valor de W a la variable Addr_EE ; Mueve el valor de la variable AUXIMPULSOS al registro W ; Mueve el valor de W a la variable Data_EE ; llama a la subrutina GRABAR_EEPROM MOVLW MOVWF movfw MOVWF CALL B'00000111' Addr_EE IMPULSOS Data_EE GRABAR_EEPROM ; Carga el valor al registro de trabajo W ; Mueve el valor de W a la variable Addr_EE ; Mueve el valor de la variable IMPULSOS al registro W ; Mueve el valor de W a la variable Data_EE ; llama a la subrutina GRABAR_EEPROM MOVLW MOVWF movfw MOVWF CALL B'00000110' Addr_EE PUNTO Data_EE GRABAR_EEPROM ; Carga el valor al registro de trabajo W ; Mueve el valor de W a la variable Addr_EE ; Mueve el valor de la variable PUNTO al registro W ; Mueve el valor de W a la variable Data_EE ; llama a la subrutina GRABAR_EEPROM MOVLW MOVWF movfw MOVWF CALL B'00000101' Addr_EE UNIDADES Data_EE GRABAR_EEPROM ; Carga el valor al registro de trabajo W ; Mueve el valor de W a la variable Addr_EE ; Mueve el valor de la variable UNIDADES al registro W ; Mueve el valor de W a la variable Data_EE ; llama a la subrutina GRABAR_EEPROM MOVLW MOVWF movfw MOVWF CALL B'00000100' Addr_EE DECENAS Data_EE GRABAR_EEPROM ; Carga el valor al registro de trabajo W ; Mueve el valor de W a la variable Addr_EE ; Mueve el valor de la variable DECENAS al registro W ; Mueve el valor de W a la variable Data_EE ; llama a la subrutina GRABAR_EEPROM MOVLW MOVWF movfw MOVWF CALL B'00000011' Addr_EE CENTENAS Data_EE GRABAR_EEPROM ; Carga el valor al registro de trabajo W ; Mueve el valor de W a la variable Addr_EE ; Mueve el valor de la variable CENTENAS al registro W ; Mueve el valor de W a la variable Data_EE ; llama a la subrutina GRABAR_EEPROM ;#IMPULSOS ;#PUNTO ;#UNIDADES ;#DECENAS ;#CENTENAS ;#UNIDADES_MIL 178 MOVLW B'00000010' MOVWF Addr_EE movfw UNIDADES_MIL MOVWF Data_EE CALL GRABAR_EEPROM ; Carga el valor al registro de trabajo W ; Mueve el valor de W a la variable Addr_EE ; Mueve el valor de la variable UNIDADES_MIL al registro W ; Mueve el valor de W a la variable Data_EE ; llama a la subrutina GRABAR_EEPROM MOVLW MOVWF movfw MOVWF CALL RETURN ; Carga el valor al registro de trabajo W ; Mueve el valor de W a la variable Addr_EE ; Mueve el valor de la variable DECENAS_MIL al registro W ; Mueve el valor de W a la variable Data_EE ; llama a la subrutina GRABAR_EEPROM ; Retornar ;#DECENAS_MIL B'00000001' Addr_EE DECENAS_MIL Data_EE GRABAR_EEPROM ;---------------------------------------------------- Programa principal ------------------------------------------------------------------PROGRAMA_PRINCIPAL esperar_peticion BSF BTFSC goto BTFSC LED RCSTA,OERR RESET1 RCSTA,FERR ; Encender Led ; Comprobar ¿ exite error en el Registro RCSTA bit 1 ? ; Si, ir a la etiqueta RESET 1 ; No, Comprobar ¿ exite error en el Registro RCSTA bit 2 ; trama completa ? goto RESET2 ; Si, ir a la etiqueta RESET 2 movf RCREG,w ; No, Mueve el valor del registro RCREG al registro W "caracter necesario para enviar lecturas" BTFSS STATUS,Z ; ¿ Caracter recibido es igual al necesario ? GOTO esperar_peticion ; No, ir a etiqueta esperar_petición goto ENVIAR_DATOS ; Sí, ir a etiqueta ENVIAR_DATOS CLRF goto RCREG esperar_peticion ; Reseteo de registro RCREG ; ir a etiqueta esperar_petición movf goto RCREG,w esperar_peticion ; Mueve el valor de registro de RCREG a registro W ; ir a la etiqueta esperar_petición RESET1 RESET2 ;-----------------------------------------------Subruitina para enviar datos------------------------------------------------------------------------ENVIAR_DATOS ;--------------------------------------------------Subrutina de aviso de 90.000 Kw/h --------------------------------------------------------MOVFW DECENAS_MIL XORLW BTFSS GOTO MOVLW movwf bsf .9 STATUS,Z continue .43 TXREG STATUS,RP0 ; Carga el valor de variable DECENAS MIL al registro de trabajo W ; Compara regsitro W con literal ; ¿es igual a 9 ? ; No, ir a la etiqueta continue ; Si, Carga el valor al registro de trabajo W ; Mueve en valor de regsitro W al registro TXREG ; Cambio al BANCO 1 azcp btfss TXSTA,TRMT ; ¿ Se ha terminado de envíar ? goto axcp ; No, ir a la etiqueta azcp bcf STATUS,RP0 ; Si, cambio al BANCO 0 ;--------------------------------------------------------------------------------------------------------------- 179 continue MOVFW MOVWF CALL MOVFW MOVWF CALL MOVFW MOVWF CALL MOVFW MOVWF CALL MOVFW MOVWF CALL MOVFW MOVWF CALL MOVFW MOVWF CALL MOVFW MOVWF CALL MOVLW movwf bsf DECENAS_MIL AYUDA_ENV_DATOS enviarRS232 UNIDADES_MIL AYUDA_ENV_DATOS enviarRS232 CENTENAS AYUDA_ENV_DATOS enviarRS232 DECENAS AYUDA_ENV_DATOS enviarRS232 UNIDADES AYUDA_ENV_DATOS enviarRS232 PUNTO AYUDA_ENV_DATOS enviarRS232 IMPULSOS AYUDA_ENV_DATOS enviarRS232 AUXIMPULSOS AYUDA_ENV_DATOS enviarRS232 .42 TXREG STATUS,RP0 ; Mueve valor de la variable a registro W ; Mueve valor de regsitro W a la variable ; llama a la subrutina RS232 ; Mueve valor de la variable a registro W ; Mueve valor de regsitro W a la variable ; llama a la subrutina RS232 ; Mueve valor de la variable a registro W ; Mueve valor de regsitro W a la variable ; llama a la subrutina RS232 ; Mueve valor de la variable a registro W ; Mueve valor de regsitro W a la variable ; llama a la subrutina RS232 ; Mueve valor de la variable a registro W ; Mueve valor de regsitro W a la variable ; llama a la subrutina RS232 ; Mueve valor de la variable a registro W ; Mueve valor de regsitro W a la variable ; llama a la subrutina RS232 ; Mueve valor de la variable a registro W ; Mueve valor de regsitro W a la variable ; llama a la subrutina RS232 ; Mueve valor de la variable a registro W ; Mueve valor de regsitro W a la variable ; llama a la subrutina RS232 ; Cargar el valor al registro de trabajo W ; Mueve valor de regsitro de trabajo a TXREG ; Cambio al BANCO 1 btfss goto BCF call TXSTA,TRMT EP STATUS,RP0 EnviarSuministro ; ¿Se ha terminado de enviar? ; No, ir a la etiqueta EP ; Si, Cambio al BANCO 0 ; Llama a la etiqueta EnviarSuministro EP ;------------------------------------------------Subrutina de solicitud de administración de Datos---------------------------------------awi BTFSC goto BTFSC RCSTA,OERR RESET1 RCSTA,FERR ; Comprobar ¿ exite error en el Registro RCSTA bit 1 ? ; Si, ir a la etiqueta RESET 1 ; No, Comprobar ¿ exite error en el Registro RCSTA bit 2; trama completa ? goto RESET2 ; Si, ir a la etiqueta RESET 2 movf RCREG,w ; No, Mueve el valor del registro RCREG al registro W "caracter necesario Administración de Datos" BTFSS STATUS,Z ; ¿ Caracter recibido es igual al necesario ? GOTO sigueawi ; No, ir a la etiqueta sigueawi GOTO ADMINISTRAR_DATOS ; Si, ir a la etiqueta ADMINISTRAR_DATOS ;-------------------------------------------Subrutina necesaria para retornar al Programa principal-------------------------------------sigueawi BTFSC goto BTFSC RCSTA,OERR RESET1 RCSTA,FERR ; Comprobar ¿ exite error en el Registro RCSTA bit 1 ? ; Si, ir a la etiqueta RESET 1 ; No, Comprobar ¿ exite error en el Registro RCSTA bit 2; trama completa ? goto RESET2 ; Si, ir a la etiqueta RESET 2 movf RCREG,w ; No, Mueve el valor del registro RCREG al registro W "caracter necesario para retornar al programa principal" BTFSS STATUS,Z ; ¿ Caracter recibido es igual al necesario ? 180 GOTO GOTO awi PROGRAMA_PRINCIPAL ; No, ir a la etiqueta awi ; Si, ir a la etiquta Programa principal ;---------------------------------------------------------------Subrutina enviar rs232------------------------------------------------------enviarRS232 MOVLW ADDWF AYUDA_ENV_DATOS movwf bsf espera btfss goto BCF return .48 AYUDA_ENV_DATOS,W ; Carga el valor al registro de trabajo W ; Suma valor de registro W con el valor de la variable TXREG STATUS,RP0 ; Mueve valor regsitro W a regsitro TXREG ; Cambio al BANCO 1 TXSTA,TRMT espera STATUS,RP0 ; ¿Se ha terminado de envíar? ; No, ir a etiqueta espera ; Si, Cambio al BANCO 0 ; retornar ;------------------------------------------------------Subrutina para Cargar Valores-------------------------------------------------------ANOTAR_VARIABLES movlw movwf .0 Addr_EE ; Carga el valor al registro de trabajo W ; Mueve el valor del registro W a la variable Addr_E seg MOVLW .1 ADDWF Addr_EE,W MOVWF Addr_EE CALL LEER_EEPROM MOVFW Data_EE CALL ASIGNAR movfw Addr_EE XORLW .8 BTFSS STATUS,Z GOTO seg GOTO final_anotar ; Carga el valor al registro de trabajo W ; Suma valor de la variable Addr_EE con el valor del registroW ; Mueve el valor del regsitro de W a la variable Adrr_EE ; Llamar a la subrutina LEER_EEPROM ; Mueve valor de variable Data_EE a registro W ; llamar a la subrutina ASIGANAR ; Mueve valor de variable Addr_EE a registro W ; Compara regsitro W con literal ; ¿es igual a 8? ; No, ir a la etiqueta seg ; Si, ir a la etiqueta final_anotar movfw XORLW BTFSS GOTO MOVFW MOVWF RETURN Addr_EE .8 STATUS,Z a_IMPULSOS Data_EE AUXIMPULSOS ; Mueve valor de Addr_EE a registro W ; Compara regsitro W con literal ; ¿es igual a 8? ; No, ir a etiqueta a_IMPULSOS ; Si, valor de Data_EE a registro W ; Mueve valor de registro W a AUXIMPULSOS ; retornar movfw XORLW BTFSS GOTO MOVFW MOVWF RETURN Addr_EE .7 STATUS,Z a_PUNTO Data_EE IMPULSOS ; Mueve valor de Addr_EE a registro W ; Compara regsitro W con literal ; ¿es igual a 7? ; No, ir a etiqueta a_PUNTO ; Si, valor de Data_EE a registro W ; Mueve valor de registro W a IMPULSOS ; retornar movfw XORLW BTFSS GOTO MOVFW Addr_EE .6 STATUS,Z a_UNIDADES Data_EE ; Mueve valor de Addr_EE a registro W ; Compara regsitro W con literal ; ¿es igual a 6? ; No, ir a etiqueta a_UNIDADES ; Si, valor de Data_EE a registro W ASIGNAR a_AUXIMPULSOS a_IMPULSOS a_PUNTO 181 MOVWF PUNTO RETURN ; Mueve valor de registro W a PUNTO ; retornar movfw XORLW BTFSS GOTO MOVFW MOVWF RETURN Addr_EE .5 STATUS,Z a_DECENAS Data_EE UNIDADES ; Mueve valor de Addr_EE a registro W ; Compara regsitro W con literal ; ¿es igual a 5? ; No, ir a etiqueta a_DECENAS ; Si, valor de Data_EE a registro W ; Mueve valor de registro W a UNIDADES ; retornar movfw XORLW BTFSS GOTO MOVFW MOVWF RETURN Addr_EE .4 STATUS,Z a_CENTENAS Data_EE DECENAS ; Mueve valor de Addr_EE a registro W ; Compara regsitro W con literal ; ¿es igual a 4? ; No, ir a etiqueta a_CENTENAS ; Si, valor de Data_EE a registro W ; Mueve valor de registro W a DECENAS ; retornar movfw XORLW BTFSS GOTO MOVFW MOVWF RETURN Addr_EE .3 STATUS,Z a_UNIDADES_MIL Data_EE CENTENAS ; Mueve valor de Addr_EE a registro W ; Compara regsitro W con literal ; ¿es igual a 3? ; No, ir a etiqueta a_UNIDADES_MIL ; Si, valor de Data_EE a registro W ; Mueve valor de registro W a CENTENAS ; retornar movfw XORLW BTFSS GOTO MOVFW MOVWF RETURN Addr_EE .2 STATUS,Z a_DECENAS_MIL Data_EE UNIDADES_MIL ; Mueve valor de Addr_EE a registro W ; Compara regsitro W con literal ; ¿es igual a 2? ; No, ir a etiqueta a_DECENAS_MIL ; Si, valor de Data_EE a registro W ; Mueve valor de registro W a UNIDADES_MIL ; retornar movfw XORLW BTFSS GOTO MOVFW MOVWF RETURN Addr_EE .1 STATUS,Z PROGRAMA_PRINCIPAL Data_EE DECENAS_MIL ; Mueve valor de Addr_EE a registro W ; Compara regsitro W con literal ; ¿es igual a 1? ; No, ir a etiqueta PROGRAMA_PRINCIPAL ; Si, valor de Data_EE a registro W ; Mueve valor de registro W a DECENAS_MIL ; retornar bsf CALL BCF CALL movlw movwf GOTO 0LED RET_50MS LED RET_50MS b'10001000' INTCON PROGRAMA_PRINCIPAL ; Encender led ; retardo de 50 ms ; apagar led ; reatrdo de 50 ms ; Carga el valor al registro de trabajo W ; Mueve valor de regsitro W a registro INTCON ; ir a la etiqueta PROGRAMA_PRINCIPAL a_UNIDADES a_DECENAS a_CENTENAS a_UNIDADES_MIL a_DECENAS_MIL final_anotar ;-------------------------------------------------------Subrutina Incrementar Impulso------------------------------------------------------IN_IMPULSO CONT_IMPULSOS MOVLW .1 ADDWF IMPULSOS,W ; Carga el valor al registro de trabajo W ; Suma el valor de regsitro W con variable IMPULSOS 182 MOVWF movfw XORLW BTFSS RETURN MOVLW ADDWF MOVWF movfw XORLW BTFSS GOTO GOTO IMPULSOS IMPULSOS .80 STATUS,Z .1 AUXIMPULSOS,W AUXIMPULSOS AUXIMPULSOS .2 STATUS,Z OTRAVEZ INC_PUNTO ; Mueve el valor de registro W a variable IMPULSOS ; Mueve el valor de variable IMPULSOS a registro W ; Compara registro W con literal ; ¿es igual a 80? ; No, retornar ; Si, Carga el valor al registro de trabajo W ; Suma el valor de regsitro W con variable AUXIMPULSOS ; Mueve el valor de registro W a variable AUXIMPULSOS ; Mueve el valor de variable AUXIMPULSOS a registro W ; Compara regsitro W con literal ; ¿es igual a 2? ; No, ir a la etiqueta OTRAVEZ ; Si, ir a la etiqueta INC_PUNTO OTRAVEZ movlw .0 MOVWF IMPULSOS RETURN ; Carga el valor al registro de trabajo W ; Mueve el valor de registro W a variable IMPULSOS ; retorna INC_PUNTO movlw MOVWF MOVWF MOVLW ADDWF MOVWF movfw XORLW BTFSS RETURN .0 IMPULSOS AUXIMPULSOS .1 PUNTO,W PUNTO PUNTO .10 STATUS,Z ; Carga el valor al registro de trabajo W ; Mueve el valor de registro W a variable IMPULSOS ; Mueve el valor de registro W a variable AUXIMPULSOS ; Carga el valor al registro de trabajo W ; Suma el valor de regsitro W con variable PUNTO ; Mueve el valor de registro W a variable PUNTO ; Mueve el valor de variable PUNTO a registro W ; Compara regsitro W con literal ; ¿es igual a 10? ; No, retorna movlw MOVWF MOVLW ADDWF MOVWF movfw xorlw btfss GOTO GOTO .0 PUNTO .1 UNIDADES,W UNIDADES UNIDADES .10 STATUS,Z uninormal unicero ; Si, Carga el valor al registro de trabajo W ; Mueve el valor de registro W a variable PUNTO ; Carga el valor al registro de trabajo W ; Suma el valor de regsitro W con variable UNIDADES ; Mueve el valor de registro W a variable UNIDADES ; Mueve el valor de variable UNIDADES a registro W ; Compara regsitro W con literal ; ¿es igual a 10? ; No, ir a etiqueta uninormal ; Si, ir a etiqueta unicero movlw movwf call goto .0 UNIDADES GRABAR INC_DECENAS ; Carga el valor al registro de trabajo W ; Mueve el valor de registro W a variable UNIDADES ; No, Llama a la librería GRABAR ; Si, ir a etiqueta INC_DECENAS ;INC_UNIDADES unicero uninormal ;----------------------------------------------------------------------------------------------------------------------------------------------------------call GRABAR ; Llama a la librería GRABAR movfw UNIDADES ; Mueve el valor de variable UNIDADES a registro W XORLW .10 ; Compara regsitro W con literal BTFSS STATUS,Z ; ¿es igual a 10? RETURN ; No, retornar INC_DECENAS movlw MOVWF MOVLW ADDWF .0 UNIDADES .1 DECENAS,W ; Carga el valor al registro de trabajo W ; Mueve el valor de registro W a variable UNIDADES ; Carga el valor al registro de trabajo W ; Suma el valor de regsitro W con variable DECENAS 183 MOVWF movfw XORLW BTFSS RETURN DECENAS DECENAS .10 STATUS,Z ; Mueve el valor de registro W a variable DECENAS ; Mueve el valor de variable DECENAS a registro W ; Compara regsitro W con literal ; ¿es igual a 10? ; No, retornar movlw MOVWF MOVLW ADDWF MOVWF movfw XORLW BTFSS RETURN .0 DECENAS .1 CENTENAS,W CENTENAS CENTENAS .10 STATUS,Z ; Si,Carga el valor al registro de trabajo W ; Mueve el valor de registro W a variable DECENAS ; Carga el valor al registro de trabajo W ; Suma el valor de regsitro W con variable CENTENAS ; Mueve el valor de registro W a variable CENTENAS ; Mueve el valor de variable CENTENAS a registro W ; Compara regsitro W con literal ; ¿es igual a 10? ; No, retornar .0 CENTENAS .1 UNIDADES_MIL,W UNIDADES_MIL UNIDADES_MIL .10 STATUS,Z ; Si,Carga el valor al registro de trabajo W ; Mueve el valor de registro W a variable CENTENAS ; Carga el valor al registro de trabajo W ; Suma el valor de regsitro W con variable UNIDADES_MIL ; Mueve el valor de registro W a variable UNIDADES_MIL ; Mueve el valor de variable UNIDADES_MIL a registro W ; Compara regsitro W con literal ; ¿es igual a 10? ; No, retornar .0 UNIDADES_MIL .1 DECENAS_MIL,W DECENAS_MIL DECENAS_MIL .10 STATUS,Z ; Si,Carga el valor al registro de trabajo W ; Mueve el valor de registro W a variable UNIDADES_MIL ; Carga el valor al registro de trabajo W ; Suma el valor de regsitro W con variable DECENAS_MIL ; Mueve el valor de registro W a variable DECENAS_MIL ; Mueve el valor de variable UNIDADES_MIL a registro W ; Compara regsitro W con literal ; ¿es igual a 10? ; No, retornar ;INC_CENTENAS ;INC_UNIDADES_MIL movlw MOVWF MOVLW ADDWF MOVWF movfw XORLW BTFSS RETURN ;INC_DECENAS_MIL movlw MOVWF MOVLW ADDWF MOVWF movfw XORLW BTFSS RETURN GAMEOVER SLEEP GOTO ; Si, Fin de Capacidad de lectura del registrador electrónico monofásico. GAMEOVER ;--------------------------------------------------SUBRUTINA PRINCIPAL DE INTERRUOCIONES----------------------------------------------INTERRUPCIONES bcf STATUS,RP0 ; Cambio al BANCO 0 BTFSC GOTO BTFSC CALL NOLUZ_GRABAR aNOLUZ_GRABAR ENTRADA_IMPULSOS aENTRADA_IMPULSO ; se fue la luz? ; Si, ir al etiqueta aNOLUZ_GRABAR ; No, ¿Ingreso de Impulso ? ; Si, ir a la etiqueta aENTRADA_IMPULSO bcf RETFIE INTCON,RBIF ; No, reseteo bit RBIF ; retornar de la Interrupción intgrabar heree 184 aNOLUZ_GRABAR bcf CALL bcf call bsf STATUS,RP0 GRABAR LED RET_50MS LED ; Cambio al BANCO 0 ; Llama a la subrutina GRABAR ; apagar led ; retardo de 50 ms ; encender led BTFSC goto goto NOLUZ_GRABAR Esperaluz heree ; ¿existe alimentación de energía? ; No, ir a la etiqueta Esperarluz ; Si, ir a la etiqueta heree STATUS,RP0 IN_IMPULSO ; Cambio al BANCO 0 ; Llama a la Subrutina IN_IMPULSO ENTRADA_IMPULSOS Esperaimp ; ¿acabo de ingresar impulso? ; No, ir a la etiqueta BTFSC ; Si, retornar Esperaluz aENTRADA_IMPULSO BCF CALL Esperaimp BTFSC goto return ;--------------------------------------------------------Grabar EEPROM-------------------------------------------------------------------------------GRABAR_EEPROM BANKSEL Addr_EE ; Seleciiona BANCO MOVF Addr_EE,W ; Mueve el valor del Addr_EE a W bsf STATUS,RP0 ; Cambio al BANCO 1 MOVWF EEADR ; Mueve el valor de W al registro EEADR BANKSEL Data_EE ; Selecciona BANCO MOVF Data_EE,W ; Mueve el valor del Data_EE a W BSF STATUS,RP0 ; Cambio al BANCO 1 MOVWF EEDATA ; Mueve el valor de "W" al registro "EEDATA" BSF EECON1,WREN ; Habilita el BIT de escritura en la EEPROM (WREN) MOVLW 0x55 ; Secuencia obligatoria MOVWF EECON2 ; para activar la grabación MOVLW 0xAA ; de la memoria MOVWF EECON2 ; EEPROM BSF EECON1,WR ; Inicia el ciclo de escritura Bit WR BCF STATUS,RP0 ; Cambio al BANCO 0 GRABAR_EEPROM_ESPERAR BTFSS PIR1,EEIF ; Lee ek EEIF y salta una instrucción si el valor es 1 GOTO GRABAR_EEPROM_ESPERAR ; Espera de grabación de la EEPROM BCF PIR1,EEIF ; Limpia el flag EEIF BSF STATUS,RP0 ; Cambio al BANCO 1 BCF EECON1,WREN ; Deshabilita el Bit de escritura de la EEPROM (WREN) BANKSEL Data_EE ; Selecciona BANCO GRABAR_EEPROM_VERIFICACION MOVFW Data_EE ; Coloca el valor leido en W BSF STATUS,RP0 ; Cambio al BANCO 1 BSF EECON1, RD ; Leer la EEPROM SUBWF EEDATA, W ; Compara el valor leido con el grabado BTFSS STATUS,Z ; Si son iguales, salta una instrucción GOTO GRABAR_EEPROM ; Si no son iguales, comienza de nuevo la rutina BCF STATUS,RP0 ; Cambio al BANCO 0 RETURN ;----------------------------------------------------------------Leer EEPROM---------------------------------------------------------------------------LEER_EEPROM EEPROM_LeeDato 185 MOVFW bsf movwf BSF Addr_EE STATUS,RP0 EEADR EECON1,RD ; Mueve valor de Addr_EE a registro de W ; Cambio al BANCO 1 ; Mueve valor de W a EEADR ; Inicia el ciclo de lectura bit RD EEPROM_Sigueleyendo btfsc goto movf BCF MOVWF return EECON1,RD ; ¿termino de leer? EEPROM_Sigueleyendo; No, ir a la etiqueta EEPROM_Sigueleyendo EEDATA,W ; Si, Mueve EEDATA a W STATUS,RP0 ; Cambio a BANCO 0 Data_EE ; Mueve valor de W a Data_EE ; retornar ;--------------------------------------------------------Subrutina Administrar Datos---------------------------------------------------------------ADMINISTRAR_DATOS ; Esta subrutina es la encargada de ingresar remotamente los valores de la lectura una vez ingresados los valores se retorna a la etiqueta ANOTAR VARIABLES ;por seguridad de la Empresa no se muestra las lineas de dicha subrutina, la misma que se explica teoricamente en el anexo 11. goto ANOTAR_VARIABLES ;------------------------------------------------------------------------------------------------------------------------------------------------------------INCLUDE "L:\TESIS\MICROS\RETARDOS\retardos.inc" INCLUDE "L:\TESISREMOTA\El Diseño\inicializar.inc" INCLUDE "L:\TESISREMOTA\El Diseño\suministro.inc" ; librería de retardos ; librería de inicializar ; librería de suministro END ; FIN DEL PROGRAMA 186 ;*********************************Librería Inicializar***************************************** ;………………………………………………………………..Subrutina inicializar…………………………………………………………………………… GRABA_DATOS_INI ;#AUX_IMPULSOS MOVLW MOVWF MOVLW MOVWF CALL B'00001000' Addr_EE .0 Data_EE GRABAR_EEPROM ; Carga el valor de registro de trabajo W ; Mueve el valor W a Adrr_EE ; Carga el valor al regsitro de trabajo W ; Mueve el valor de W a Data_EE ; Llama a la subrutina GRABAR_EEPROM MOVLW MOVWF MOVLW MOVWF CALL B'00000111' Addr_EE .0 Data_EE GRABAR_EEPROM ; Carga el valor de registro de trabajo W ; Mueve el valor W a Adrr_EE ; Carga el valor al regsitro de trabajo W ; Mueve el valor de W a Data_EE ; Llama a la subrutina GRABAR_EEPROM MOVLW MOVWF MOVLW MOVWF CALL B'00000110' Addr_EE .0 Data_EE GRABAR_EEPROM ; Carga el valor de registro de trabajo W ; Mueve el valor W a Adrr_EE ; Carga el valor al regsitro de trabajo W ; Mueve el valor de W a Data_EE ; Llama a la subrutina GRABAR_EEPROM MOVLW MOVWF MOVLW MOVWF CALL B'00000101' Addr_EE .0 Data_EE GRABAR_EEPROM ; Carga el valor de registro de trabajo W ; Mueve el valor W a Adrr_EE ; Carga el valor al regsitro de trabajo W ; Mueve el valor de W a Data_EE ; Llama a la subrutina GRABAR_EEPROM MOVLW MOVWF MOVLW MOVWF CALL B'00000100' Addr_EE .0 Data_EE GRABAR_EEPROM ; Carga el valor de registro de trabajo W ; Mueve el valor W a Adrr_EE ; Carga el valor al regsitro de trabajo W ; Mueve el valor de W a Data_EE ; Llama a la subrutina GRABAR_EEPROM MOVLW MOVWF MOVLW MOVWF CALL B'00000011' Addr_EE .0 Data_EE GRABAR_EEPROM ; Carga el valor de registro de trabajo W ; Mueve el valor W a Adrr_EE ; Carga el valor al regsitro de trabajo W ; Mueve el valor de W a Data_EE ; Llama a la subrutina GRABAR_EEPROM MOVLW MOVWF MOVLW MOVWF CALL B'00000010' Addr_EE .0 Data_EE GRABAR_EEPROM ; Carga el valor de registro de trabajo W ; Mueve el valor W a Adrr_EE ; Carga el valor al regsitro de trabajo W ; Mueve el valor de W a Data_EE ; Llama a la subrutina GRABAR_EEPROM MOVLW MOVWF MOVLW MOVWF CALL B'00000001' Addr_EE .0 Data_EE GRABAR_EEPROM ; Carga el valor de registro de trabajo W ; Mueve el valor W a Adrr_EE ; Carga el valor al regsitro de trabajo W ; Mueve el valor de W a Data_EE ; Llama a la subrutina GRABAR_EEPROM MOVLW MOVWF MOVLW MOVWF CALL RETURN .10 Addr_EE .100 Data_EE GRABAR_EEPROM ; Carga el valor de registro de trabajo W ; Mueve el valor W a Adrr_EE ; Carga el valor al regsitro de trabajo W ; Mueve el valor de W a Data_EE ; Llama a la subrutina GRABAR_EEPROM ; retornar ;#IMPULSOS ;#PUNTO ;#UNIDADES ;#DECENAS ;#CENTENAS ;#UNIDADES_MIL ;#DECENAS_MIL ;# 187 ;*********************************Librería Suministro***************************************** ;………………………………………………………………..Subrutina suministro…………………………………………………………………………… EnviarSuministro movlw movwf CALL .0 AYUDA_ENV_DATOS enviarRS232 ; Carga el valor al registro de trabajo W ; Mueve el valor de W a AYUDA_ENV_DATOS ; Llama a la subrutina enviarRS232 movlw movwf CALL .1 AYUDA_ENV_DATOS enviarRS232 ; Carga el valor al registro de trabajo W ; Mueve el valor de W a AYUDA_ENV_DATOS ; Llama a la subrutina enviarRS232 movlw movwf CALL .4 AYUDA_ENV_DATOS enviarRS232 ; Carga el valor al registro de trabajo W ; Mueve el valor de W a AYUDA_ENV_DATOS ; Llama a la subrutina enviarRS232 movlw movwf CALL .0 AYUDA_ENV_DATOS enviarRS232 ; Carga el valor al registro de trabajo W ; Mueve el valor de W a AYUDA_ENV_DATOS ; Llama a la subrutina enviarRS232 movlw movwf CALL .9 AYUDA_ENV_DATOS enviarRS232 ; Carga el valor al registro de trabajo W ; Mueve el valor de W a AYUDA_ENV_DATOS ; Llama a la subrutina enviarRS232 movlw movwf CALL .3 AYUDA_ENV_DATOS enviarRS232 ; Carga el valor al registro de trabajo W ; Mueve el valor de W a AYUDA_ENV_DATOS ; Llama a la subrutina enviarRS232 movlw movwf CALL .4 ; Carga el valor al registro de trabajo W AYUDA_ENV_DATOS ; Mueve el valor de W a AYUDA_ENV_DATOS enviarRS232 ; Llama a la subrutina enviarRS232 MOVLW movwf bsf .45 TXREG STATUS,RP0 ; Carga el valor al registro de trabajo W ; Mueve el valor de W a TXREG ; Cambio al BANCO 1 btfss goto bcf return TXSTA,TRMT er STATUS,RP0 ; ¿Termino de envíar? ; No, ir a la etiqueta er ; Si, Cambio al BANCO 0 ; retornar er 188 ;*********************************Librería retardo***************************************** ;………………………………………………………………..Subrutina retardo…………………………………………………………………………… CBLOCK CONTADOR_A CONTADOR_B CONTADOR_C ENDC ; variable CONTADOR_A ; variable CONTADOR_B ; variable CONTADOR_C MOVLW .1 ; Carga el valor de registro de trabajo W MOVWF CONTADOR_C ; Mueve el valor de W a CONTADOR_C MOVLW .50 MOVWF CONTADOR_B ; Carga el valor de registro de trabajo W ; Mueve el valor de W a CONTADOR_B MOVLW .249 MOVWF CONTADOR_A ; Carga el valor de registro de trabajo W ; Mueve el valor de W a CONTADOR_A NOP DECFSZ GOTO DECFSZ GOTO DECFSZ GOTO RETURN ; uSEG. ; ¿CONTADOR_A=0? ; No, ir a la etiqueta BUCLECC11: ; Si, ¿CONTADOR_B=0? ; No, ir a la etiqueta_MS111SSSSSSSS ; Si,¿CONTADOR_C=0? ; No, ir a la etiqueta RET_50 ;retornar RET_50MS: RET_REPEAT14: RET_50: RET_MS111SSSSSSSS: BUCLECC11: CONTADOR_A,F BUCLECC11 CONTADOR_B,F RET_MS111SSSSSSSS CONTADOR_C,F RET_50