Actualmente estoy trabajando en un proyecto, donde tengo un dispositivo externo (POCSAG pager - protocolo POCSAG) que está emitiendo una señal de onda cuadrada digital (5V - 0V). Tengo un microcontrolador ATmega2560 (Arduino) y quiero leer la señal para poder decodificarla en texto.
Ya terminé este proyecto donde el dispositivo externo funciona en "condiciones de laboratorio" perfectas, lo que significa que un bit se transmite en exactamente 833 microsegundos (1200 Hz). Leí todos los bits correctamente con un simple temporizador y luego los decodifiqué.
El problema es que, cuando lo intento en un buscapersonas del mundo real, ¡la velocidad de bits varía mucho! De 750 microsegundos a 870 microsegundos, y cada bit está en algún punto intermedio, lo que significa que recibo muchos errores al leer la señal, ya que un mensaje tiene una longitud de hasta 5000 bits. No olvidemos que siempre hay ruido en la línea de datos cuando la señal real no está presente, cuando no hay mensajes transmitidos.
Logré que funcionara en "condiciones de laboratorio" al medir 3 bits, y si todos los bits coinciden con 833 microsegundos, conecté una interrupción que activaría un temporizador con un período de 833 microsegundos que muestrea la señal y la guarda en un array de caracteres (sí, lo sé, mala solución). Como dije, esto funciona perfectamente siempre que la frecuencia sea estable.
Intenté medir de 10 a 20 bits, que estaban entre 750 y 860 microsegundos, calculando la velocidad de bits promedio y muestreando la señal con esa velocidad después ... Tampoco funcionó.
La señal digital siempre tiene un preámbulo de 576 bits alternos (0101010101 ...) para que pueda detectar cuándo se está transmitiendo un mensaje real.
¿Alguna idea sobre cómo debo abordar esto?
Lo siento si no lo expliqué lo suficiente ... Si tienes más preguntas, ¡avísame!
EDITAR: Esta es la forma en que se codifica la señal. En resumen, un bit se transmite en 833 microsegundos (supuestamente) y el mensaje inicia los bits alternos de los bits 576, denominado preámbulo (010101010101 ...). Después de eso, se transmite una palabra de código Frame Sync de 32 bits (la palabra de código FS es siempre la misma) que señala el comienzo del primer lote de datos. Hay 8 cuadros (cada cuadro contiene 2 palabras de código, 2 x 32 bits) que contienen 16 palabras de código de datos. Después de esos 8 cuadros, si el mensaje continúa, se transmite otra palabra de código FS y así sucesivamente ...