04 RED 002 ANEXO 10

Anuncio
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
Descargar