¡¡¡
Necesito de vuestra capacidad de análisis !!!
Os ruego que pongáis vuestros cerebros a destilar jugo de neuronas y me hechéis una mano sobre un efecto que me está desquiciando los nervios, y no le veo el por qué por ninguna parte ... no sé si es que estoy mas obtuso de lo normal o es que he alcanzado mi nivel de incompetencia, y en él me mantengo.
Estoy atascado 
Voy a intentar explicaros lo mas
claramente posible el problema a ver si podéis arrojar luz sobre lo que está pasando:
Descripción del problema: Como sabéis, la sonda lógica
detecta un tren de pulsos, guardando y transmitiendo posteriormente los tiempos en que ocurren los distintos y alternados flancos de subida y bajada. Esto lo hace
perfectamente el 90% de las veces, pero hay un
10% de error, de muestreos en que se solapan dos pulsos consecutivos .... ante la imposibilidad física de que me llegen dos flancos del mismo tipo sin pasar antes por un flanco contrario imagino que el problema estriba en la forma de detectarlo y/o guardar los valores de tiempo correspondientes, pero
no veo dónde está el error ....
Elementos que intervienen:
1º.- El hardware que genera el pulso a detectar es un simple pulsador, conectado al PIN B0 mediante una resistencia Pull-Up que tira a masa cuando es pulsado. Por ello los pulsos son inversos, flanco de bajada -> flanco de subida, tantas veces como pulsaciones-rebotes se produzcan.
2º.- La Interrupción Externa en el PIC está configurada al Reset para detectar primero un flanco de bajada.
3º.- Al llegar la primera interrupción, y solo en esa primera interrupción, se pone a 0 el valor del Timer1 y se habilita la Interrupción por Desbordamiento del Timer1.
4º.- Al aparecer una Interrupción Externa se conmuta el flanco para detectar el opuesto que configura un pulso completo.
5º.- Cada flanco detectado se guarda en una tabla con dos valores: El valor en ese instante del Timer1 y el número de veces que dicho Timer1 se ha desbordado.
6º.- Al recibir el PIC cierto comando via RS232 envía al PC las tablas de datos recogidos ...
El código concreto que realiza la detección de pulsos (y que sospecho es el responsable del problema) es axactamente este:
1º.- En
Resetvoid On_reset(void){
disable_interrupts(global);
disable_interrupts(int_timer1);
disable_interrupts(int_rda);
disable_interrupts(int_ext);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_spi(FALSE);
setup_psp(PSP_DISABLED);
setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
setup_timer_0(RTCC_OFF);
setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
for(i=0;i<NMUESTRAS;i++){ TimesUpT[i]=0; TimesUpI[i]=0;}
for(i=0;i<NMUESTRAS;i++){ TimesDownT[i]=0; TimesDownI[i]=0;}
nTintext=0;
uTimeUp=0;
uTimeDown=0;
ext_int_edge(0,H_TO_L);
fedge=0;
delay_ms(100);
enable_interrupts(int_rda);
enable_interrupts(int_ext);
enable_interrupts(global);
set_timer0(0);
}
2º.- En
tratamiento de interrupciones :
#int_ext
ext_handler() {
long t;
long n;
++nTintext;
if(nTintext==1){
set_timer1(0);
nTimer1Overflow=0;
enable_interrupts(int_timer1);
}
n=nTimer1Overflow;
t=get_timer1();
if(fedge==0){
ext_int_edge(0,L_TO_H);
TimesDownI[uTimeDown]=n;
TimesDownT[uTimeDown]=t;
++uTimeDown;
}
else
{
ext_int_edge(0,H_TO_L);
TimesUpI[uTimeUp]=n;
TimesUpT[uTimeUp]=t;
++uTimeUp;
}
++fedge;
}
#int_timer1
timer1_handler(){
++nTimer1Overflow;
}
Este soft en el PIC funciona correctamente, como ya os he dicho el 90% de las veces, lamentablemente el restante 10% hace "
cosas raras" tal como podéis ver en la imagen inferior, y estimo que un 10% de error es
excesivo y tengo que corregirlo antes de continuar con este proyecto.

Fijáos que los pulsos van sucediendose de forma correcta uno tras otro, primero los flancos de bajada depués los de subida. Cada uno de ellos mas "
lejos" del inicio, 0 Interupciones + 0 Tick's,
conforme van llegando ... Por ejemplo el pulso número 04 comienza en el desbordamiento 30 y con el Timer1 a 412 ticks y se acaba en el mismo desbordamiento 30 pero con el Timer1 a 681 por lo que dura 54 uS, y el siguiente pulso, el número 5, comienza también en el desbordamiento 30 pero con el Timer1 a 813 ticks, por lo que comienza exactamente 132 ticks de Timer1 mas tarde, o sea 26,4 uS después; y acaba en el desbordamiento 33 con Timer1 a 7271 ... Todo correcto ....
Pero
los pulsos 06 y 07 se solapan .... el 06 va desde los valores de desbordamiento y timer 43/687 hasta los 43/30923 y el 07 va desde los valores 43/1055 hasta los 46/15067 ¡¡¡
Mal !!!
Según estos datos el
pulso 07 ha llegado antes de que termine el 06 ¡¡¡
Mal !!!
Parece como si realmente los datos estuviesen
intercambiados y el fin del pulso 06 fuese realmente el comienzo del 07 y simétricamente como si el inicio del 07 fuese realmente el final del 06 ¿¿¿¿¿

??????
Y por mas vueltas que le doy al código
no encuentro el por qué ocurre esto ....
¿Se os ocurre algo? ¿tenéis piedad de un pobre programador desesperado? ¿eh?
