8051 calculadora de velocidad en baudios usando un temporizador de 16 bits para la sincronización de software UART

1

Estoy realizando un proyecto en el que los datos del haz láser pulsado se detectan a través de muchos sensores ópticos (un sensor por pin de puerto), por lo que esencialmente, voy a hacer 4 UART para detectar esto.

Actualmente estoy usando un microcontrolador AT89S52 con un cristal de 22.1184 MHz, y utilicé la calculadora de velocidad en baudios de Keil y noté que no podía darme un valor para velocidades bajas en baudios (como 100bps).

La razón por la que pido tasas tan bajas es porque los datos que se envían no son muchos (quizás 2 bytes cada 1/5 de segundo), y también, el microcontrolador está haciendo otras tareas también.

Realmente solo necesito una velocidad de 100bps, pero debo subir a 110bps porque esa es la próxima velocidad de serie estándar de computadora.

La pregunta

Si configuro el temporizador 8051 del modo 1 a 16 bits, ¿qué valores conecto en TH1 y TL1 para 110bps? Recuerde, estoy haciendo 4 UART de software aquí y el otro UART de hardware es utilizado por otros procesos, y la interrupción del temporizador 1 debe activarse en el momento adecuado para que los bits no se pierdan.

Detalles

Lo que estoy tratando de hacer sin la necesidad de microcontroladores adicionales es implementar una etiqueta láser. El chaleco de cada jugador tendrá diferentes conjuntos de sensores y trataré cada conjunto de sensores como UARTs de solo recepción separados y el láser como un UART de solo transmisión y el control remoto inalámbrico está conectado al hardware UART. Ya que los humanos no presionan un gatillo 1,000x por segundo, puedo salir adelante haciendo casi todos los UART a baja velocidad.

    
pregunta Mike

2 respuestas

0

¿Planea hacer que su UART sea programable para ambas tasas, o implementar un mecanismo de detección automática? 100bps = 10ms / bit, 110bps = 9.090ms / bit. ¿TH1 y TL1 representan los períodos de reloj de muestra, alto y bajo respectivamente? Por lo general, se sobreexplota 16 veces la velocidad de bits, pero, realmente, siempre que satisfaga a Nyquist, puede hacer lo que quiera. Si sobreexpliega 16x y tiene un período de bits de 9.09 ms, necesita un período de muestra de 9.09 ms / 16 = 568.125us, asumiendo así un ciclo de trabajo del 50%, 1/2 alto y 1/2 bajo, Th = Tl = 284us.

Entonces, no estoy seguro si puedes hacer esto en SW, pero, 22.184MHz = 45.211ns período de reloj. Para el muestreo de 110bps @ 16x, esto se traduce en 12,566 ciclos de reloj por período de muestra y 6,283 ciclos de reloj por Th y Tl. Estos valores son posibles con un temporizador de 16 bits

    
respondido por el CapnJJ
0

Su fosc es 22.1184MHz, o un período de 45.211ns. Sin embargo, si leo la especificación correctamente, el temporizador 1 usa fosc / 12 = 1.8432MHz o un período de 542.535ns. 1 / 110bps = 9.091 ms, pero necesita muestrear al menos 1/220 = 4.545ms.

4.545ms / 542.535ns = 8378. En otras palabras,

$$ \ frac {22,118,400} {2 \ cdot 110 \ cdot 12} \ aprox. 8378 $$

Este es un contador ascendente, por lo que el contador de 16 bits debe inicializarse a -8378, o 0xDF46. Entonces, TH = 0xDF y TL = 0x46.

La contabilidad de la latencia de la administración del temporizador es complicada y depende de cómo se use la interrupción entre otros factores, pero (a) no la cubriré aquí, y (b) no importa ya que el error sería muy pequeño de todos modos

    
respondido por el Reinderien

Lea otras preguntas en las etiquetas