;===============================================================================
; Programa de gestion de la energia en la CV
;===============================================================================
;===============================================================================
; Distribucion de la RAM y definiciones de bits
;===============================================================================
PROCESO EQU 0x10 ; Contador de proceso atendido
PROCTEMP EQU 0x12 ; Temporal proceso atendido
TIEMPO EQU 0x11 ; Contador de tiempo
#DEFINE PIÑA PORTA,0x00 ; Pin 9 de la piña (piña conectada)
#DEFINE MOTOR PORTA,0x01 ; Pin 12 de la piña (motor en marcha)
#DEFINE BATERIA PORTA,0x02 ; Bateria de la CV conectada
#DEFINE FRENO PORTA,0x03 ; Micro en el freno de la CV
#DEFINE BATBAJA PORTA,0x04 ; Pin 9 de la piña (piña conectada)
;===============================================================================
; Vector de reset
;===============================================================================
ORG 0x0000
GOTO RESET ; Saltamos a la rutina de reset
;===============================================================================
; Vector de interrupcion
;===============================================================================
ORG 0x0004
;===============================================================================
; Interrupcion TMR0. Se produce una interrupcion cada 256 uS
; con un cuarzo de 4 MHz. Con un contador reducimos la ejecucion
; de la INT solo a una vez cada 65 ms,
;===============================================================================
INT_TMR:
BTFSS INTCON,T0IF ; Si no es T0IF
GOTO FIN_INT ; salimos de la rutina de interrupcion
DECFSZ TIEMPO,F ; Si no es momento
GOTO FIN_INT ; salimos de la rutina de interrupcion
;===============================================================================
; Seleccion del proceso a ejecutar
;===============================================================================
INCF PROCESO,W ; Proceso siguiente
ANDLW 0x07 ; limitamos el numero de procesos a 8
MOVWF PROCESO
MOVWF PROCTEMP ; Guardamos el proc. actual
;===============================================================================
; Proceso 1 ATC
;===============================================================================
PROC_1:
DECFSZ PROCTEMP,F ; Si no es el 1
GOTO PROC_2 ; Pasamos al siguiente
BTFSS PIÑA ; Si al piña esta conectada...
GOTO NO_ATC
BTFSS MOTOR ; El motor esta en marcha...
GOTO NO_ATC
BTFSC FRENO ; El freno esta quitado...
GOTO NO_ATC
BSF RELE_ATC ; se conecta el ATC
GOTO FIN_INT ; y terminamos
NO_ATC:
BCF RELE_ATC ; caso contrario desconecta el ATC
GOTO FIN_INT ; y terminamos
;===============================================================================
; Proceso 2 ALUMBRADO desde la piña
;===============================================================================
PROC_2:
DECFSZ PROCTEMP,F ; Si no es el 2
GOTO PROC_3 ; Pasamos al siguiente
BTFSS PIÑA ; Si al piña esta conectada...
GOTO NO_ALP
BTFSC MOTOR ; y el motor esta parado...
GOTO NO_ALP
BSF RELE_ALP ; se conecta el alumbrado a la piña
GOTO FIN_INT ; y terminamos
NO_ALP:
BCF RELE_ALP ; caso contrario desconecta el alumbrado
GOTO FIN_INT ; y terminamos
;===============================================================================
; Proceso 3 ALUMBRADO desce la bateria de la CV
;===============================================================================
PROC_3:
DECFSZ PROCTEMP,F ; Si no es el 3
GOTO PROC_4 ; Pasamos al siguiente
BTFSC PIÑA ; Si al piña esta desconectada...
GOTO NO_ALB
BTFSS BATERIA ; y la bateria de la CV esta conectada...
GOTO NO_ALB
BTFSC BATBAJA ; y la bateria no esta baja...
GOTO NO_ALB
BSF RELE_ALB ; se conecta el alumbrado a la piña
GOTO FIN_INT ; y terminamos
NO_ALB:
BCF RELE_ALB ; caso contrario desconecta el alumbrado
GOTO FIN_INT ; y terminamos
;===============================================================================
; Proceso 4 MOVEDOR
;===============================================================================
PROC_4:
DECFSZ PROCTEMP,F ; Si no es el 4
GOTO PROC_5 ; Pasamos al siguiente
BTFSC PIÑA ; Si al piña esta desconectada...
GOTO NO_MOV
BTFSS BATERIA ; la bateria de la CV esta conectada...
GOTO NO_MOV
BTFSC BATBAJA ; la bateria no esta baja...
GOTO NO_MOV
BTFSC FRENO ; y no esta puesto el freno de la CV...
GOTO NO_MOV
BSF RELE_MOV ; se conecta el movedor
GOTO FIN_INT ; y terminamos
NO_MOV:
BCF RELE_MOV ; caso contrario desconecta el movedor
GOTO FIN_INT ; y terminamos
;===============================================================================
; Proceso 5
;===============================================================================
PROC_5:
DECFSZ PROCTEMP,F ; Si no es el 5
GOTO PROC_6 ; Pasamos al siguiente
; Aqui se pone el codigo correspondiente al proceso cinco
; Debe terminar con un salto a FIN_INT
GOTO FIN_INT
;===============================================================================
; Proceso 6
;===============================================================================
PROC_6:
DECFSZ PROCTEMP,F ; Si no es el 6
GOTO PROC_7 ; Pasamos al siguiente
; Aqui se pone el codigo correspondiente al proceso seis
; Debe terminar con un salto a FIN_INT
GOTO FIN_INT
;===============================================================================
; Proceso 7
;===============================================================================
PROC_7:
DECFSZ PROCTEMP,F ; Si no es el 7
GOTO PROC_8 ; Pasamos al siguiente
; Aqui se pone el codigo correspondiente al proceso siete
; Debe terminar con un salto a FIN_INT
GOTO FIN_INT
;===============================================================================
; Proceso 8
;===============================================================================
PROC_8:
; Aqui se pone el codigo correspondiente al proceso cinco
; Debe terminar con un salto a FIN_INT
GOTO FIN_INT
;===============================================================================
; Salir de la interrupcion
;===============================================================================
FIN_INT:
BCF INTCON,T0IF ; Restauramos los bits de interrupcion
RETFIE ; Terminamos interrupcion
;===============================================================================
; Preparacion de la interrupcion y bucle principal
;===============================================================================
RESET:
MOVLW 0x00
MOVWF PROCESO ; El primer proceso a ejecutar es el 0
BSF STATUS, RP0
MOVLW 0x1F
MOVWF TRISA ; Puerto A es entrada en todos sus bits
MOVLW 0x00
MOVWF TRISB ; Puerto B es salida en todos sus bits
MOVLW b'11011111' ; Ajuste del timer
MOVWF OPTION_REG
BCF STATUS,RP0
MOVLW b'10100000'
MOVWF INTCON ; Habilitamos interrupcion del TMR0
BUCLE:
SLEEP
GOTO BUCLE ; Sueño eterno...
END