Mira estoy intentando controlar un sensor hcsr04 de proximidad cuando no sense el motor debe estar funcionando y cuando sense se va a parar , he estado implementando TIMER 0 para dar los pulsos al sensor y medir las distancias logre hacer funcionar el TMR1 el cual le mande que titile un led , en ves de esto iría el motor , pero tengo un problema en el bucle interrupción al poner el comando goto a las interrupciones respectivas me funciona solo el sensado del TMR0 y no el titileo del led del TMR1 le pongo call en ves de goto y me funciona el titileo pero no el sensado y nose porque, le estuve probando en simulacion. Ademas le conecto al circuito físico y no funciona nada
list p=16f877a;Listar el microcontrolador
#include P16F877a.inc; Incluyo la libreria del micro
__CONFIG _FOSC_XT & _WDTE_OFF & _PWRTE_ON & _BOREN_ON & _LVP_OFF & _CPD_OFF & _WRT_OFF & _CP_OFF
TMR0_Carga60micros EQU d'256'- d'27';
Cont equ 0x21
CBLOCK 0x0C
Distancia ; Se expresará en centímetros.
ENDC
;........................................................
Reset org 0x00; Direccion del Reset
goto Inicio
org 0x04
goto Interrupcion
org 0x05; Comienza Inicio
Inicio
; **** Configura los puertos*******************************
BSF STATUS,RP0 ; Accede a banco 0
movlw b'00000010'; Colocamos como salidas
movwf TRISB
movlw b'00000000'
movwf TRISC
movlw b'00000000' ; Prescaler de 2 para el TMR0.
movwf OPTION_REG
movlw b'00110001'
movwf T1CON
bcf PIR1,TMR1IF
BSF INTCON,GIE ; HABILITAMOS TODAS LAS INTERRUPCIONE
BSF PIE1,TMR1IE ; HABILITO LA INTERRUPCIÓN POR TIMER1
BSF INTCON, PEIE ; Habilitamos interrupción por periféricos
BCF STATUS,RP0 ; Regresa a banco 0
clrf PORTB
clrf PORTC
; Carga al TIMER 1
bcf T1CON,TMR1ON
movlw 0x0B
movwf TMR1H
movlw 0xDC
movwf TMR1L
bsf T1CON,TMR1ON
PRINCIPAL
clrf Distancia; Manda los pulsos al sensor
bsf PORTB,0
call Retardo_5micros
bcf PORTB,0
; Aqui ve el estado de los pulsos que da el sensor y mide la distancia
EsperaFlancoSubida
btfss PORTB,1 ; Espera el flanco de subida de la señal
goto EsperaFlancoSubida ; de salida del sensor.
movlw TMR0_Carga60micros ; Ya se ha producido el flanco de subida.
movwf TMR0 ; Carga el Timer 0.
movlw b'10100000' ; Autoriza interrupción del TMR0 (T0IE).
movwf INTCON
EsperaFlancoBajada
btfsc PORTB,1 ; Espera flanco de bajada de la señal de la salida
goto EsperaFlancoBajada
clrf INTCON ; Se ha producido el flanco de bajada. Prohíbe interrup.
call TITILEO
call Retardo_1ms
goto PRINCIPAL
Interrupcion
btfsc INTCON,2
call InterrupcionTMR0 ;Llama a las interrupciones de TMR0;;;;; aquí es el problema
btfsc PIR1,TMR1IF
call InterrupcionTMR1 ;lLama a las interrupcion de TMR1
goto EndInt
InterrupcionTMR0
movlw .1 ; Se utiliza instrucción "addwf", en lugar de "incf"
addwf Distancia,1 ; para posicionar flag de Carry.
bcf INTCON,2
goto EndInt
InterrupcionTMR1 ; en ves del titileo iria el motor
incf Cont,1
movlw d'2'
subwf Cont,0
btfsc STATUS,2
goto $+2
goto $+4
bsf PORTC,0
clrf Cont
goto $+2
bcf PORTC,0
bcf T1CON,TMR1ON
movlw 0x0B
movwf TMR1H
movlw 0xDC
movwf TMR1L
bsf T1CON,TMR1ON
bcf PIR1,TMR1IF
goto EndInt
EndInt
retfie
TITILEO ;;; aqui enciende un led cuando sensa, en ves de esto pararía al motor
movlw .1
subwf Distancia,0
btfsc STATUS,2
bsf PORTB,2
BTFSS STATUS,2
bcf PORTB,2
return
INCLUDE <Libreria.inc> ;**Libreria de Retardos****
end