Autor Tema: Interrupcion por captura en RC2(CCP) no se ejecuta  (Leído 2111 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado ALFREDOSKY

  • PIC16
  • ***
  • Mensajes: 118
Interrupcion por captura en RC2(CCP) no se ejecuta
« en: 26 de Mayo de 2014, 14:37:45 »
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:
Código: [Seleccionar]
#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);
        }
    }
}

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Interrupcion por captura en RC2(CCP) no se ejecuta
« Respuesta #1 en: 26 de Mayo de 2014, 14:44:26 »
Hola Alfredo, no revisé todo tu código, pero el primer error que veo es tu definición de #int_CCP1, esta la debes de poner justo antes de la función que quieras que se ejecute al ocurrir la interrupción, seria algo así
Código: C
  1. ...
  2. #int_CCP1
  3. void CCP1_isr()
  4. {
  5. ...

Saludos
"Nada es imposible, no si puedes imaginarlo"

Desconectado ALFREDOSKY

  • PIC16
  • ***
  • Mensajes: 118
Re: Interrupcion por captura en RC2(CCP) no se ejecuta
« Respuesta #2 en: 26 de Mayo de 2014, 15:16:59 »
Woaw!! no sabia ese pequeño detalle, que pelotudo que soy, muchas gracias rivale!  ((:-)) ya funciona correctamente!  :-/

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Interrupcion por captura en RC2(CCP) no se ejecuta
« Respuesta #3 en: 26 de Mayo de 2014, 16:05:59 »
por nada, que bueno que solo era ese el error
"Nada es imposible, no si puedes imaginarlo"

Desconectado ALFREDOSKY

  • PIC16
  • ***
  • Mensajes: 118
Re: Interrupcion por captura en RC2(CCP) no se ejecuta
« Respuesta #4 en: 26 de Mayo de 2014, 17:19:26 »
Si, ese era el corazon del problema  :shock:...debo corregir la ubicacion de algunas variables para una correcta lectura, pero el problema prinicipal lo resolviste rivale, gracias nuevamente! :mrgreen: