Muchas gracias por la ayuda, hice un curso intensivo de TMR0 con interrupción por Internet ya que es la primera vez con interrupciones, la cual voy a aplicar, por lo cual no usare interrupción externa a RB0, sino que la señal del pin 17 VT del Ht12D será recibida por RA4, la configuración de los puertos PORTA como entradas y PORTB como salidas. En el cuerpo principal van la lectura y manejo de los pulsadores, mantengo la bandera Activo y le agregue PORTA_T en la cual guardo PORTA y las comparo si es la misma se mantiene en el bucle de lo contrario continua, la bandera Interrupción la cual habilita o deshabilita la interrupción. En cuanto a los pulsadores el problema era la pila del control remoto aunque los pulsadores son de los más baratos. He probado el carro con el regulador de voltaje y me esta funcionado. Otra cosa es que se debe usar una fuente de 5V para el circuito y otras para los motores (PIN 8 del Puente H). Aquí dejo mi código. Cualquier sugerencia será bienvenida. Muchísimas gracias.
;---------------Encabezado-----------
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST P=16F84A
INCLUDE <P16F84A.INC>
;-------Configuración de variables-------
cblock 0x0c
Activo
Alto
Bajo
PORTA_T
Interrupcion
Timer_Contador
endc
TMR0_Valor EQU d'252' ; Valor a cargar al TMR0
ORG 0x00
GOTO Inicio
ORG 0X04 ; Atiendo la interrupción
GOTO Velocidad
Inicio
BSF STATUS,5 ; configurando puertos
MOVLW B'00011111' ; puerto A son entradas
MOVWF TRISA
MOVLW B'00000000'
MOVWF TRISB ; puerto B son salidas
movlw b'00000111' ; TMR0 con prescaler de 256.
movwf OPTION_REG
BCF STATUS,5
CLRF PORTB ; limpiamos PORTB
CLRF PORTA ; limpiamos PORTA
BCF Activo,0
Cargar
MOVLW d'3'
MOVWF Alto
MOVLW d'7'
MOVWF Bajo
CLRF PORTA_T
BCF Activo,0 ;Verifica si el carro esta parado
BCF Interrupcion,0
MOVLW d'1'
MOVWF Timer_Contador
Principal
MOVF PORTA,W ;Si PORTA es diferente a PORTA_T hay cambio
XORWF PORTA_T,W ;Si PORTA es igual a PORTA_T no hay cambio o
BTFSC STATUS,Z ;es `posible un rebote continua en el bucle
GOTO Principal
MOVF PORTA,W
XORLW 0x15 ; b'00010101' d'021'
BTFSC STATUS,Z
CALL ADELANTE
MOVF PORTA,W
XORLW 0x1A ; b'00011010' d'026'
BTFSC STATUS,Z
CALL ATRAS
MOVF PORTA,W
XORLW 0x16 ; b'00010110' d'022'
BTFSC STATUS,Z
CALL DERECHA
MOVF PORTA,W
XORLW 0x19 ; b'00011001' d'025'
BTFSC STATUS,Z
CALL IZQUIERDA
MOVF PORTA,W
XORLW 0x13 ; b'00010011' d'019'
BTFSC STATUS,Z
CALL PARAR
MOVF PORTA,W
XORLW 0x12 ; b'00010010' d'18'
BTFSC STATUS,Z
CALL Vel_1
MOVF PORTA,W
XORLW 0x1E ; b'00011110' d'30'
BTFSC STATUS,Z
CALL Vel_2
MOVF PORTA,W
XORLW 0x17 ; b'00010111' d'23'
BTFSC STATUS,Z
CALL Vel_3
MOVF PORTA,W
MOVWF PORTA_T
BTFSS Interrupcion,0
GOTO Deshabilita_interrupcion
GOTO Habilita_interrupcion
GOTO Principal
Habilita_interrupcion
MOVLW b'10100000'
MOVWF INTCON
GOTO Principal
Deshabilita_interrupcion
CLRF INTCON
GOTO Principal
ADELANTE
BSF Activo,0
BSF PORTB,7
BCF PORTB,6
BSF PORTB,5
BCF PORTB,4
BSF Interrupcion,0
RETURN
ATRAS
BSF Activo,0
BCF PORTB,7
BSF PORTB,6
BCF PORTB,5
BSF PORTB,4
BSF Interrupcion,0
RETURN
DERECHA
BSF Activo,0
BSF PORTB,7
BCF PORTB,6
BCF PORTB,5
BSF PORTB,4
BSF Interrupcion,0
RETURN
IZQUIERDA
BSF Activo,0
BCF PORTB,7
BSF PORTB,6
BSF PORTB,5
BCF PORTB,4
BSF Interrupcion,0
RETURN
PARAR
MOVLW d'3'
MOVWF Alto
MOVLW d'7'
BCF Activo,0
BCF Interrupcion,0
MOVLW b'00000000'
MOVWF PORTB
RETURN
Vel_1
BTFSS Activo,0 ; Si esta en movimiento se puede
RETURN ; afectar la velocidad
MOVLW d'3'
MOVWF Alto
MOVLW d'7'
MOVWF Bajo
BSF Interrupcion,0
RETURN
Vel_2
BTFSS Activo,0 ; Si esta en movimiento se puede
RETURN ; afectar la velocidad
MOVLW d'6'
MOVWF Alto
MOVLW d'4'
MOVWF Bajo
BSF Interrupcion,0
RETURN
Vel_3
BTFSS Activo,0 ; Si esta en movimiento se puede
RETURN ; afectar la velocidad
BSF PORTB,3
BSF PORTB,2
BCF Interrupcion,0
RETURN
CBLOCK
Guarda_W
Guarda_STATUS
ENDC
Velocidad
movwf Guarda_W ; Guarda W y STATUS.
swapf STATUS,W ; Ya que "movf STATUS,W" corrompe el bit Z.
movwf Guarda_STATUS
bcf STATUS,RP0 ; Para asegurarsede que trabaja con el Banco 0.
movlw TMR0_Valor
movwf TMR0
decfsz Timer_Contador,F ; Decrementa el contador.
goto FinInterrupcion
btfsc PORTB,3 ; Testea el anterior estado de la salida.
goto EstabaAlto
EstabaBajo
bsf PORTB,3 ; Estaba bajo y lo pasa a alto.
bsf PORTB,2
movf Alto,W ; Repone el contador nuevamente con el tiempo en
movwf Timer_Contador ; alto.
goto FinInterrupcion
EstabaAlto
bcf PORTB,3 ; Estaba alto y lo pasa a bajo.
bcf PORTB,2
movf Bajo,W ; Repone el contador nuevamente con el tiempo
movwf Timer_Contador ; en bajo.
FinInterrupcion
swapf Guarda_STATUS,W ; Restaura el STATUS.
movwf STATUS
swapf Guarda_W,F ; Restaura W como estaba antes de producirse
swapf Guarda_W,W ; interrupción.
Bcf INTCON,RBIF
Bcf INTCON,T0IF
retfie
;==========================================================================
END
;==========================================================================