Hola!
Estoy tratando de hacer algo simple pero no logro tener lecturas similares.
Quiero capturar el tiempo que esta en alto y en bajo un tren de pulsos para después procesarlos. Pero al tomar dos capturas del mismo tren son diferentes, incluso se saltea algunos cambios de alto a bajo y viceversa.
Probé cambiar la velocidad del cristal, sacarlo del proteus y hacerlo en la realidad pero sigue igual.
Alguien me sugiere algo?
#include <12f675.h>
#fuses HS, NOWDT, NOMCLR, PUT, BROWNOUT
#use delay(clock=20000000)
#use rs232(baud=9600, xmit=PIN_A0, rcv=PIN_A1)
int16 t;
int i;
#int_EXT
EXT_isr()
{
int1 k;
disable_interrupts(INT_EXT);
do{
k=input(PIN_A2);
switch(k){
case 1:
{
set_timer1(0);
WHILE (INPUT(PIN_A2));
t = get_timer1();
printf("%lu\n\r" ,t);
break ;
}
case 0:
{
set_timer1(0);
WHILE (!INPUT(PIN_A2));
t = get_timer1();
printf("%lu\n\r" ,t);
break ;
}
} while(i<10);
enable_interrupts(INT_EXT);
}
void main()
{
setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
ext_int_edge(H_TO_L);
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
while(1)
{ }
}
También probé cambiar el switch por dos if pero es peor, algunos cambios de estado los toma como "0" incluso cambie el segundo if por un else pero tampoco.
#int_EXT
EXT_isr()
{
int1 k;
disable_interrupts(INT_EXT);
do{
k=input(PIN_A2);
if (k==1)
{
set_timer1(0);
WHILE (INPUT(PIN_A2));
t = get_timer1();
printf("%lu\n\r" ,t);
}
if (k==0)
{
set_timer1(0);
WHILE (!INPUT(PIN_A2));
t = get_timer1();
printf("%lu\n\r" ,t);
}
i++;
}while(i<10);
enable_interrupts(INT_EXT);
}
Ah, me olvidaba, en lugar de los printf va una rutina que guarda el valor en un array.
Alguien tiene alguna solución?
Gracias.