;Programa que saque por PORTA la siguiente secuencia cuando se produzca interrupción externa
;por flanco de bajada:
;10101
;espera medio segundo
;01010
;espera mediosegundo
;y la siguiente secuencia cuando se produzca interrupción por cambio de nibble pero solo en RB6,
;si se produce en RB7, RB5 ó RB4 debe volver a donde ocurrió la interrupción.
;11011
;espera medio segundo
;00100
;espera medio segundo
;cada secuencia se debe quedar ejecutando hasta que se produzca la otra interrupción, o sea que si se está
;ejecutando la primera secuencia (por interrupción externa), esta no parará hasta que se produzca la otra
;interrupción por cambio de nibble en RB6 y así sucesivamente.
LIST P=16F84A
#INCLUDE "P16F84A.INC"
TMR0_OPT EQU 1H ;EN EL BANCO1 TMR0, EN EL BANCO0 REGISTRO OPTION
;###########################DEFINICION DE REGISTRO ###########################
CBLOCK 0X0C
CONTAR
ENDC
;##############################################################################
ORG 0
GOTO INICIO
;################################### INTERRUPCION ##############################
ORG 0X04
BTFSS INTCON,INTF
GOTO NIBBLE
GOTO REPONER
REPONER BCF INTCON,INTF
BSF INTCON,GIE
RUTINA1 MOVLW B'00010101'
MOVWF PORTA
CALL MEDIO
MOVLW B'00001010'
CALL MEDIO
GOTO RUTINA1
NIBBLE BTFSS PORTB,6
GOTO FIN
GOTO REPONER2
REPONER2 BCF INTCON,RBIF
BSF INTCON,GIE
RUTINA2 MOVLW B'00011011'
MOVWF PORTA
CALL MEDIO
MOVLW B'00000100'
MOVWF PORTA
CALL MEDIO
GOTO RUTINA2
FIN BCF INTCON,RBIF
MOVF PORTB
RETFIE
;################################################################################
INICIO BSF STATUS,5
CLRF PORTA
MOVLW 0XFF
MOVWF PORTB
MOVLW B'00000010'
MOVWF TMR0_OPT
BCF STATUS,5
CLRF PORTA
CLRF PORTB
MOVLW B'10011000'
MOVWF INTCON
LOOP GOTO LOOP
;###################### MEDIO SEGUNDO CON TMR0 ###########################
MEDIO MOVLW .250
MOVWF CONTAR
NON CALL DOSMI
DECFSZ CONTAR,1
GOTO NON
RETURN
DOSMI MOVLW .6
MOVWF TMR0_OPT
NO BTFSS INTCON,2
GOTO NO
BCF INTCON,2
RETURN
;#########################################################################
END LIST P=16F84A
#INCLUDE "P16F84A.INC"
TMR0_OPT EQU 1H ;EN EL BANCO1 TMR0, EN EL BANCO0 REGISTRO OPTION
;###########################DEFINICION DE REGISTRO ###########################
CBLOCK 0X0C
PDel1
PDel0
CONTAR
STATUS_TEMP
W_TEMP
ENDC
;##############################################################################
ORG 0
GOTO INICIO
;################################### INTERRUPCION ##############################
ORG 0X04
PUSH MOVWF W_TEMP ;SALVO REGISTROS
SWAPF STATUS, W ;
MOVWF STATUS_TEMP ;
BTFSS INTCON,INTF ; JERARQUIA DE INTER, INTERRUPCION EXTERNA?
GOTO NIBBLE ; NO, FUE POR CAMBIO NIBBLE
REPONER BCF INTCON,INTF ; REPONGO FLAG DE INTER EXT
BSF INTCON,GIE ;HABILITO INTERRUPCIONES, PARA QUE PUEDA
;ACTUAR INTER POR CAMBIO NIBBLE
RUTINA1 MOVLW B'00010101'
MOVWF PORTA
CALL MEDIO
MOVLW B'00001010'
MOVWF PORTA
CALL MEDIO
GOTO RUTINA1
NIBBLE BTFSS PORTB,6 ;CAMBIÓ EL RB6?
GOTO POP ;NO,
;
REPONER2 BCF INTCON,RBIF ;REPONGO FLAG DE INTER POR CAMBIO NIBBLE
BSF INTCON,GIE ;;HABILITO INTERRUPCIONES, PARA QUE PUEDA
;ACTUAR INTER EXTER
RUTINA2 MOVLW B'00011011'
MOVWF PORTA
CALL MEDIO
MOVLW B'00000100'
MOVWF PORTA
CALL MEDIO
GOTO RUTINA2
POP SWAPF STATUS_TEMP,W ;REPONGO LOS REGISTROS
MOVWF STATUS
SWAPF W_TEMP, F
SWAPF W_TEMP, W
FIN BCF INTCON,RBIF ;REPONGO FLAG DE CAMBIO DE NIBBLE
MOVF PORTB ;LECTURA DE PUERTO, NECESARIA PARA SALIR
;DE LA INTERRUPCION
RETFIE
;################################################################################
INICIO BSF STATUS,RP0
CLRF PORTA
MOVLW 0XFF
MOVWF TRISB
BCF STATUS,RP0
CLRF PORTA
CLRF PORTB
MOVLW B'10011000'
MOVWF INTCON
LOOP GOTO LOOP
;###################### MEDIO SEGUNDO CON TMR0 ###########################
MEDIO movlw .239 ; 1 set numero de repeticion (B)
movwf PDel0 ; 1 |
PLoop1 movlw .232 ; 1 set numero de repeticion (A)
movwf PDel1 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2 goto PDelL3 ; 2 ciclos delay
PDelL3 clrwdt ; 1 ciclo delay
decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
PDelL4 goto PDelL5 ; 2 ciclos delay
PDelL5 goto PDelL6 ; 2 ciclos delay
PDelL6 goto PDelL7 ; 2 ciclos delay
PDelL7 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
;#########################################################################
END
INTERR_RB4B7
MOVF PORTB,F
BCF INTCON,RBIF ;REPONGO FLAG DE INTER POR CAMBIO NIBBLE
BTFSS PORTB,6
RETURN
MOVF PORTB,F????