TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: ALFREDOSKY 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:
#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);
}
}
}
-
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í
...
#int_CCP1
void CCP1_isr()
{
...
Saludos
-
Woaw!! no sabia ese pequeño detalle, que pelotudo que soy, muchas gracias rivale! ((:-)) ya funciona correctamente! :-/
-
por nada, que bueno que solo era ese el error
-
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: