Bit golpeando un UART

1

Estoy intentando interconectar el módulo GPS con mi placa ARM. El GPS envía señales RS232 desde su único pin (por ejemplo, el pin Z).

Quiero usar el temporizador de vigilancia para recibir y analizar el flujo en serie. ¿Alguna idea de usar el perro guardián en este contexto?

    
pregunta ctype.h

3 respuestas

6

Es probable que desee utilizar una interrupción de temporizador ordinaria y muestrear tal vez 8 veces la velocidad en baudios, aunque cuatro veces podría funcionar (en implementaciones de hardware 16x es común, pero personalmente lo he hecho en 8x).

La mayoría de los procesadores de velocidad de reloj moderna deberían poder disparar una interrupción tan rápido, al menos si su código en el ISR es eficiente y no tiene mucho más en funcionamiento impulsado por interrupciones.

Probablemente deseará ejecutar una máquina de estados, avanzando un estado en cada interrupción. Básicamente, busca la transición del bit de inicio y luego lee cada bit de datos un número apropiado de ciclos sobre muestreados más tarde. Hay muchas implementaciones de esto para FPGAs en verilog o VHDL flotando alrededor de la red, la traducción al ensamblado o C no debería ser difícil.

Sin embargo, como es probable que pueda reprogramar sus temporizadores y modos de interrupción rápidamente, hay otra opción para la optimización: puede comenzar teniendo una interrupción sensible al borde en el pin de entrada. Cuando se dispara, luego programa una interrupción de temporizador para generar retrasos de un período de bit exacto (sin sobre muestreo), y simplemente lea el estado de cada interrupción. Cuando la palabra haya concluido, vuelva a armar la interrupción del borde.

Pero hay un problema con este método optimizado: debido a que solo está "prestando atención" en los momentos importantes, debe esforzarse más para asegurarse de que la transición inicial sea un bit de inicio y que no esté detectando alguna palabra de datos en pleno vuelo cuando se inicia el código. Probablemente desee hacer esto utilizando su interrupción de borde para asegurarse de que la entrada ha estado en estado de reposo el tiempo suficiente (el tiempo desde la última interrupción); si no lo ha hecho, descarte lo que haya obtenido y espere un carácter limpio .

Algún googlear en la "máquina de estado UART" o similar sería informativo. Siempre existe la posibilidad de que encuentre un código de referencia para su procesador en particular, especialmente si no tiene UART de hardware o solo uno.

    
respondido por el Chris Stratton
4

No puede usar el temporizador de vigilancia, ya que restablece el procesador en casi (¿todos?) procesadores.

Puede insertar código en su rutina de reinicio, pero esto sería hacia atrás ya que la memoria de datos del chip generalmente se borra al reiniciar.     

respondido por el Thomas O
2

Otro método posiblemente aplicable es usar un circuito externo para seleccionar una de las dos fuentes de entrada y enviar la señal al UART.

Para que esto sea apropiado, debes saber cuándo esperas datos para poder cambiar al dispositivo adecuado.

Otra opción es agregar un UART externo y recibir datos de eso. Es un poco difícil ser más específico sin saber más de la plataforma disponible.

    
respondido por el Trygve Laugstøl

Lea otras preguntas en las etiquetas