Hola a todos, estoy intentando realizar un programa para medir el ancho de pulso de una señal que ingresa por el pin RC2 al pic 16f876, las herramientas que uso son: MPLAB X ide v2.00 e instalé el plugin CSS en el MPLAB (descargué la versión 5 del compilador disponible en la página de CCS, la versión demo). Trabajo con MPLAB porque me es mucho más familiar y rápido de usar; cambiarme al ide del CCS me tomaría algo más de tiempo para aprender de sus herramientas...bueno, el caso es que la función de interrupción no se realiza, he realizado debug y usado el I/O analyzer para simular el flanco de subida y el de bajada, también observo los registros como el PIR1, PIE1, CCPRL1, CCPRH1, TMR1L, TMR1H y mis variables estáticas. Al correr el programa(y lo hago paso a paso), CCP1IE = 1 y corre el TIMER1( TMR1H-TMR1 incrementándose). Luego, al simular el flanco de subida, CCP1IF = 1 y se pasan datos a los registros CCPRH1-CCPRL1 desde TMR1H-TMR1, se supone que en ese momento se debe realizar la función de interrupción declarada, en un primer momento sera 'interrupción por captura de flanco de subida', luego dentro de la funcion de interrupcion se cambia a 'interrupción por captura de flanco de bajada' y así en un bucle infinito pero aparentemente no entra nunca a esta función. Probablemente algo este mal en el programa, pero no encuentro el error, porfavor alguien que tenga una idea de cual puede ser el problema, gracias
Adjunto el programa para mas claridad:
#include <16f876.h>
#use delay(clock=4000000)
#fuses XT,NOWDT,NOPROTECT
#int_CCP1
#define trigger PIN_A0
#define cap_pulse PIN_C2
#define alarm PIN_A2
long up,down;
int flag;
float reference;
void CCP1_isr()
{
if(flag == 0)
{
up = get_timer1();
setup_ccp1(CCP_CAPTURE_FE);
flag = 1;
}
else
{
down = get_timer1();
setup_ccp1(CCP_CAPTURE_RE);
set_timer1(0);
}
}
void start_trigger(void)
{
output_high(trigger);
delay_us(20);
output_low(trigger);
}
void main(void)
{
enable_interrupts(INT_CCP1);
enable_interrupts(GLOBAL);
set_tris_a(0x00);
set_tris_c(0x02);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
while(1)
{
output_low(alarm);
start_trigger();
//delay_ms(100);
set_timer1(0);
setup_ccp1(CCP_CAPTURE_RE);
flag = 0;
reference = (down-up)/58;
if(reference > 300)
{
output_high(alarm);
//delay_ms(100);
}
}
}