Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- list p=16F877A
- INCLUDE <P16F877A.INC>
- TMR0_CONFIG EQU b'10000111' ;desactivado pullup, flanco asc interrupcion , reloj interno,flanco ascendente , asignado a TMR0, preescaler a 256
- INTCON_CONFIG EQU b'1101000'
- ALARMA0 EQU 0x20
- ALARMA1 EQU 0X27
- ALARMA2 EQU 0X2E
- ALARMA3 EQU 0X35
- ALARMA4 EQU 0X3C
- RESP_W EQU 0X7F
- NUM_ALARM EQU 0x6F
- CORRIMIENTO EQU 0X07
- DIRECCION EQU 0X5F
- CONTADOR_INTERNO EQU 0x4f
- ENCENDIDO EQU 0XFF
- ;CONFIGURANDO INTERRUPCIONES
- MOVLW INTCON_CONFIG
- MOVWF INTCON
- ;seteamos las alarmas a invalidas
- CLRF ALARMA0
- CLRF ALARMA1
- CLRF ALARMA2
- CLRF ALARMA3
- CLRF ALARMA4
- MOVLW 0X20
- MOVWF DIRECCION
- ;PRUEBA
- MOVLW ENCENDIDO
- MOVWF ALARMA3
- ;USANDO DIRECCIONAMIENTO INDIRECTO PARA ACCEDER A LAS ALARMAS
- ;INICIALIZANDO EL PUNTERO
- BCF STATUS, .7
- CLRF FSR
- ;poniendo a 0 el contador de la alarma leida
- CLRF NUM_ALARM
- ;MAIN DEL PROGRAMA
- main
- MOVFW DIRECCION
- MOVWF FSR
- MOVF INDF, W
- BTFSS STATUS, Z
- goto checar_alarma ;CALL
- ;SINO SEGUIR PROBANDO
- INCF NUM_ALARM
- ;SE ENCARGA DE AUMENTAR LA DIRECCION QUE SERA USADA PARA UBICAR EL PROGRAMA
- ; EN LA EJECUCION
- mult
- MOVWF RESP_W
- BTFSC NUM_ALARM, .2 ;SERA NUM_ALARM IGUAL A 4
- goto reset_counter
- MOVFW DIRECCION
- ADDLW CORRIMIENTO
- MOVWF DIRECCION
- MOVFW RESP_W
- goto main
- ;EL SIGUIENTE CONJUNTO DE INSTRUCCIONES RESETEA LOS VALORES CONTADORES A 0 Y 20
- ;PARA MANTENER EL LOOP DURANTE EL PROGRAMA
- reset_counter
- movlw 0x20
- movwf DIRECCION
- clrf NUM_ALARM
- goto main
- ;SUBRUTINA LLAMADA PARA CHECAR LA ALARMA QUE HA SIDO DETECTADA COMO ACTIVADA
- checar_alarma:
- movlw .5
- movwf CONTADOR_INTERNO
- rutina_checa:
- ;se pide el dato al reloj, el reloj responde
- ;accedemos al siguiente valor de la estructura de la alarma
- INCF FSR
- MOVF INDF, W
- MOVWF RESP_W
- ; MOVWF ;EL VALOR QUE NOS ENTREGO EL RELOJ
- MOVLW 0x00
- ;LO ANTERIOR ES SOLO PAR PROBAR
- COMF RESP_W, F
- ANDWF RESP_W, F
- btfss STATUS, Z
- goto main
- decfsz CONTADOR_INTERNO
- goto rutina_checa
- goto turn_on
- ;encendemos la alarma recordar que usaremos el PORTA y PORTB para las alarmas
- turn_on:
- ;respaldamos nuestra posicion indirecta
- movf FSR, W
- movwf RESP_W
- ;nos movemos al banco 1 para configurar el option_reg del tmr0
- movlw b'10000001'
- movwf FSR
- movlw TMR0_CONFIG
- movwf INDF
- ;reseteamos INDF a la posicion de la alarma que estamos encendiendo
- movf RESP_W, W
- movwf FSR
- ;inicializamos el timer
- ;movf INDF, W
- movlw .254
- movwf TMR0
- loop_wait
- btfss INTCON, TMR0IF
- goto loop_wait
- ;ahora apagamos la alarma que estaba encendida
- movlw .5 ;restamos para ponernos al principio de la alarma
- subwf RESP_W, W
- movwf FSR ;usamos direccionamiento indirecto para acceder a la alarma
- clrf INDF ;limpiamos los bytes de encendido/apagado
- goto main ;regresamos al main
- ;FINAL
- final
- NOP
- END
Add Comment
Please, Sign In to add comment