Tengo un 2 uC (LPC1778 y un PIC), que realizan 2 funciones separadas. El PIC genera pulsos que se codifican, donde cada bit del código tiene una duración de pulso de 1 ms y un código completo tiene una longitud de 8 bits (8 ms). Los impulsos generados por el PIC, viajan a través de un relé (con contactos frontal y posterior) y se envían al LPC1778 como entradas.
Al final del LPC1778, muestro los pines de entrada cada 200uS (usando una interrupción del temporizador) y capturo el estado del pin por 32 ms (en el ISR del temporizador), antes de procesar si hay un pulso válido disponible o no. Una vez que se captura una muestra de 32 ms, tomo la mayoría de cada 5 muestras para determinar cuál es el valor de bit real del código. Si el código está presente en cualquier duración de 8 ms de los 32 ms capturados, está bien.
Esta lógica (a mi entender) puede funcionar bien siempre y cuando el período para cada código permanezca en 1 ms.
¿Cuál es mi duda, cuáles son las posibilidades de que el período de tiempo de un pulso pueda variar? Entiendo que mientras mi software genere 1 ms de salida desde un pin (PIC), la entrada en un pin (LPC1778) también debe ser 1 ms porque no es una onda de alta frecuencia y también se conoce de antemano el período de tiempo de cada código .
¿Qué otras consideraciones se deben tener en cuenta para garantizar que lea el código correctamente?
¿Cuáles son las posibilidades de que este patrón simétrico se convierta en asimétrico?
Actualización:
No lo estoy utilizando como UART donde los datos pueden variar y, por lo tanto, el tiempo es importante. Sé de antemano qué datos deberían estar siempre en ese pin y, por lo tanto, simplemente estoy comprobando ese valor de 8 ms en una ventana de muestra de 32 ms. No siempre tengo que seguir comprobándolo.
void Read_FCBC(void)
{
static U8 bSampleNo1=0;/*1st 200us*/
static U8 bSampleNo2=0;/*2nd 200us*/
static U8 bSampleNo3=0;/*3rd 200us*/
static U8 bAllDone=0;
static U8 bBufferCtrl=1;
static U8 bBufferCtrl1=0;
static U8 bBufferCtrl2=0;
if(bBufferCtrl)
{
dwFC1[bSampleNo1]=dw1Port1;/*200us*/
dwBC1[bSampleNo1]=dw1Port1;
bSampleNo1++;
}
if(bBufferCtrl1)
{
dwFC2[bSampleNo2]=dw2Port1;/*captured after delay of 200us wrt to sample 1*/
dwBC2[bSampleNo2]=dw2Port1;
bSampleNo2++;
}
if(bBufferCtrl2)
{
dwFC3[bSampleNo3]=dw3Port1;/*captured after delay of 400us wrt to sample 1*/
dwBC3[bSampleNo3]=dw3Port1;
bSampleNo3++;
}
bAllDone++;
if(bAllDone == 1)
{
bBufferCtrl1=1;
}
if(bAllDone == 2)
{
bBufferCtrl2=1;
}
if(bSampleNo1==160)
{
bBufferCtrl=0;
}
if(bSampleNo2==160)
{
bBufferCtrl1=0;
}
if(bSampleNo3==160)
{
bBufferCtrl2=0;
}
if((bSampleNo1==160) && (bSampleNo2==160) && (bSampleNo3==160))
{
bMeasureDone=0xFF;
bSampleNo1=0;
bSampleNo2=0;
bSampleNo3=0;
bAllDone=0;
bBufferCtrl=1;
}
}
El código de muestra para el proceso en ISR. Nota: Tengo 16 FC y 16 BC conectados a un puerto de la UC y, por lo tanto, tengo que procesar en main (). Si hay 2 búferes de acuerdo entre sí, utilizaremos lo mejor de 2oo3 dwFCX y dwBCX