Te respondo pero que algun moderador pase el tema a Almacen de Assembler..
BTFSC PIR2,CCP2IF; PREGUNTA POR BANDERA, SI SON IGUALES=1 SINO=0
GOTO INTERRUPCION
BCF PORTB,0 ;SE MANTENDRA APAGADO EL LED MIENTRAS NO ESTE ACTIVADA LA INTERRUPCION
- El unico GOTO que debes tener hacia la interrupcion es el del vector de interrupcion en 0x04, no deberia haber nada que llame a la interrupcion.
- Deberias usar el CCP1, ya que la funcion especial del CCP1 es el reset del TMR1, mientras que el del CCP2 es de reset de TMR1 + disparo del ADC. La idea es que vos nunca recargues el TMR1, solo configuras el valor a igualar en el CCP y luego te olvidas de tocar esos registros.
- Siempre activa todas las interrupciones, limpias flags y como final activas la global.
El codigo quedaria asi:
LIST p=16F877A
#INCLUDE <P16F877A.INC>
__CONFIG _CP_OFF & _DEBUG_OFF & _WRT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_ON & _PWRTE_ON & _WDT_OFF & _HS_OSC
ORG 0x00
GOTO INICIO
ORG 0x04
GOTO INTERRUPCION
INICIO
; Configuracion de puertos
BANKSEL TRISB
CLRF TRISB
CLRF TRISC
BANKSEL PORTB
CLRF PORTB
CLRF PORTC
; Configuracion del CCP
MOVLW 0x0B ; MODO COMPARACION: CCP2 SE PONE A 1 EN IGUALDAD, TMR1 = 0 por si solo
MOVWF CCP1CON ;CCP2IF SE PONE A UNO
MOVLW 0xFF
MOVWF CCPR1L ;CARGA A LA PARTE BAJA DE CCPR A IGUALAR
MOVLW 0xFF
MOVWF CCPR1H ;CARGA A LA PARTE ALTA DEL CCPH A IGUALAR
BANKSEL PIE2 ; Banco 1
bsf PIE2,CCP2IE ;ACTIVA INTERRUPCION DEL CCP2
BANKSEL PIR2 ; Banco 0
bcf PIR2, CCP2IF ;LIMPIA LA INTERRUPCION DEL CCP2
; Configuracion del Timer
MOVLW 0x00
MOVWF T1CON ; Aca configuramos preescaler,etc del timer, no lo activamos
CLRF TMR1L ;CARGA A LA PARTE BAJA DE TIMER1
CLRF TMR1H ;CARGA A LA PARTE ALTA DE TIMER1
BSF T1CON,TMR1ON ;TIMER1 ENCENDIDO
; Configuracion de interrupciones
bsf INTCON,GIE ;ACTIVA INTETTUPCIONES GLOBALES
bsf INTCON,PEIE ;ACTIVA INTERRUPCIONES POR PERIFERICO
Loop ;bucle infinito
goto Loop
INTERRUPCION
MOVLW 0x01
XORWF PORTB,0
BCF PIR2, CCP2IF ;LIMPA BANDERA CCP2
RETFIE ;RETORNO DE LA INTERRUPCIÓN
END
Consideraciones que tenes que tener con el codigo, si queres cambiar el tiempo en que cambia el estado del led, tal ves por que sucede muy rapido, deberias cambiar el preescaler del TMR1 y/o cambiar el valor que se carga en los CCPR1H y CCPR1L.
El codigo que pase tiene una salvedad, si dentro de Loop no vas a hacer nada como ahora, entonces funciona bien, lo que hace es invertir el valor de RB0 cada ves que entra en la interrupcion.
Si vas a hacer algo en el Loop te recomiendo que busques el codigo de entrada y salida de la interrupcion que da Microchip en el datasheet. Ya que sin eso tendrias problemas en la ejecucion. Si buscas como W_TEMP en el datasheet lo vas a encontrar, es un codigo que guarda W/STATUS/PCLATH al entrar y los devuelve a sus valores originales antes de salir.