InterrupciÓn por rb0 (pic16f84a)

Hola amigos, de nuevo por acá con algunas dudas.

H e estado modificando un código conocido por acá de un semaforo en lenguaje de máquinas. Debo modificar el código de tal forma que al presionar un pulsador, se me reinicie la rutina del semaforo. Una interrupción por RB0.

éste es el código en el cual he estado trabajando. La parte del semáforo funciona perfectamente:

#include <p16f84A.inc>

__CONFIG _CP_OFF & _PWRTE_ON & _WDT_OFF & _XT_OSC

; Asignacion de variables utilizadas en demora
CONT equ 0Ch
CONT2 equ 0Dh
CONT3 equ 0Eh
CONT4 equ 0Fh

ORG 0x00
GOTO inicio
ORG 0x04
BTFSC INTCON,INTF
GOTO CHECAPULSADOR
RETFIE

inicio
BSF STATUS,RP0 ; configurando puertos
MOVLW B'00000001' ; carga w con 0000 0001
MOVWF TRISB ; RB0/INT es entrada
MOVLW B'00010001' ;Activamos RA1, RA2 Y RA3
MOVWF TRISA ;como salidas
BCF OPTION_REG,NOT_RBPU ;Activa Pull-up en puerto B
BCF OPTION_REG,INTEDG ;Flanco de bajada en interrupcion. ; seleccionamos flanco descendente
BCF STATUS,RP0 ; Cambiamos de nuevo de banco

;-------Habilitación de interrupciones-------
BSF INTCON,GIE ; habilitamos todas las interrupciones
BSF INTCON,INTE ; que sean interrupciones externas
CLRF PORTB ;Limpiamos el puerto B
SUEÑO SLEEP
GOTO SUEÑO ; Dulces sueños...!!!


;-------------Rutina de servicio de interrupciones-------------

CHECAPULSADOR

BTFSC PORTB,0 ; verificamos que suelten el pulsador
GOTO CHECAPULSADOR
CLRF PORTA

ANTIRREBOTES
BTFSS PORTB,0 ; y ahora sí, si el LED está a 1 ; ire a off_led para apagarlo
GOTO ANTIRREBOTES

;-------------SEMAFORO NORMAL--------------------------
SEMAFORO
;LUZ ROJA
CLRF PORTA
BSF PORTA,1 ; sino, enciendo los LEDS del PORTA
CALL RETARDO

;LUZ ROJA_AMARILLA
BSF PORTA,2
CALL RETARDO1
BCF PORTA,1
BCF PORTA,2

;LUZ VERDE
CLRF PORTA
BSF PORTA,3
CALL RETARDO

;LUZ AMARILLA
BCF PORTA,3
BSF PORTA,2
CALL RETARDO2
BCF INTCON,INTF
RETFIE
GOTO CHECAPULSADOR

;RETARDO DE TIEMPO POR 5 SEGUNDOS
RETARDO
movlw d'10'
movwf CONT4;
CICLO4 movlw d'100'
movwf CONT3
CICLO3 movlw d'98'
movwf CONT2
CICLO2 movlw d'67'
movwf CONT
CICLO decfsz CONT,1
goto CICLO
decfsz CONT2,1
goto CICLO2
decfsz CONT3,1
goto CICLO3
decfsz CONT4,1
goto CICLO4
Return

RETARDO1
movlw d'100'
movwf CONT3
CICLO7 movlw d'100'
movwf CONT2
CICLO6 movlw d'166'
movwf CONT
CICLO5 decfsz CONT,1
goto CICLO5
decfsz CONT2,1
goto CICLO6
decfsz CONT3,1
goto CICLO7
Return

RETARDO2

movlw d'10'
movwf CONT4;
CICLO11 movlw d'100'
movwf CONT3
CICLO10 movlw d'97'
movwf CONT2
CICLO9 movlw d'33'
movwf CONT
CICLO8 decfsz CONT,1
goto CICLO8
decfsz CONT2,1
goto CICLO9
decfsz CONT3,1
goto CICLO10
decfsz CONT4,1
goto CICLO11
Return
;------------------------------------------
END


debería funcionar así: El pic está apagado, y al presionar el bottom se activan las luces del semáforo y al volverlo a presionar el bottom debe hacer corres otra rutina del semáforo (los tiempos deberían ser del doble) pero no logro que me cuente los pulsados.

De antemano muchas gracias a todos los que me puedan colaborar.
 
Atrás
Arriba