No tengo UART en mi microcontrolador, ¿cómo puedo agregar uno?


13

Estoy usando un microcontrolador ATMEGA32HVB que tiene una instalación para el equilibrio de células mediante el cual podemos conectar 4 baterías en serie y usar una a la vez. Eso es muy útil para la administración de energía, por lo que no puedo usar un microcontrolador diferente. Sugiera algunos métodos para agregar un UART para que pueda interactuar fácilmente con los dispositivos en serie.


11
El modo UART de software descrito por user26129 se llama bit-banging .
Johan. A

44
Solo mis muy subjetivos $ 0.02, pero generalmente preferiría un controlador de batería dedicado separado y UART integrado en uC en lugar de lo contrario. ¿Por qué necesita la gestión de la batería integrada en la uC?
Mels

Tengo que usar baterías recargables que se está cargando el uso de un panel solar, así que necesito 4 battries en serie apartada se utilizarán uno a la vez
user27475

44
Una pregunta es cuánto desea usar el UART y en qué direcciones. Si solo desea generar un mensaje de depuración o estado ocasional, en un momento en que su procesador no tiene mucha demanda adicional, la salida en serie de bits puede parecer muy atractiva. Hay ticks como el uso de interrupciones de cambio de pin que pueden disminuir la carga promedio de tener un canal de entrada también, pero si espera recibir caracteres a una alta velocidad en baudios en un momento en que tiene otros compromisos en tiempo real, puede ser un problema.
Chris Stratton

Respuestas:


17

Como otros han señalado, puede agregar hardware adicional a su sistema para proporcionar la funcionalidad UART, o puede emular uno en el software. Si tiene el control del diseño general del hardware y agregar otro IC es una opción, consideraría seriamente el enfoque basado en hardware. Ciertamente, puede hacer que un software UART funcione utilizando bit-banging , pero es posible que no desee dedicar los recursos de la CPU a generar el tiempo requerido.

De un vistazo a la hoja de datos, parece que su microcontrolador tiene SPI e I2C (que Atmel llama una interfaz de dos hilos (TWI)). Estas probablemente serían las mejores interfaces para usar para conectar un UART externo. Dichos dispositivos están disponibles de varios fabricantes. Algunos ejemplos:

  • Exar ( http://www.exar.com/connectivity/uart-and-bridging-solutions/i2c-spi-uarts ) tiene una línea de dispositivos UART SPI / I2C de 1 y 2 canales disponibles, que cubren el ~ 1.6- Rango operativo de 3.3V. No he usado ninguna de estas partes específicamente, pero he usado dispositivos Exar en el pasado (con interfaces de bus de memoria paralelas), y han funcionado bien.

  • NXP ( http://ics.nxp.com/products/bridges/i2c.spi.slave.uart.irda.gpio/ ) tiene una línea de dispositivos SPI / I2C UART / IrDA / GPIO disponibles, también en 1- y 2 variedades de canales en un par de rangos de voltaje. He usado estas partes (específicamente el SC16IS762) ampliamente en el pasado con gran éxito.

  • Maxim ( http://www.maximintegrated.com/datasheet/index.mvp/id/2052 ) tiene los dispositivos MAX3110E y MAX3111E, que son UART conectados por SPI. Una característica única de estos dispositivos es que tienen un controlador de línea RS-232 integrado. Por lo tanto, si necesita que su UART se conecte a un dispositivo que usa voltajes de línea RS-232 en lugar de niveles lógicos (por ejemplo, una PC), esto podría ser útil, ya que le ahorrará agregar otro controlador de línea IC a su placa.


Wow, nunca supe que Maxim tenía esos artículos, haría +2 si pudiera.
Tevo D


8

Deberá utilizar un controlador UART de software. Dependiendo exactamente de lo que espere de este UART, podría usar AVR305 (extremadamente compacto, pero sin características más allá del bloqueo de envío / recepción semidúplex), AVR274 (controlado por interrupción, función bastante completa), podría escribir su propio controlador UART de software o puede usar uno que encuentre en Internet, por ejemplo, buscando en Google 'avr software uart'


3

Una breve nota sobre el diseño del software "UART": existen al menos enfoques cualitativamente diferentes que uno puede adoptar, según los requisitos:

  • Un controlador de bit-bang "hacerse cargo de todo" deshabilitará todas las interrupciones y usará un código de conteo cíclico para registrar cada bit. La recepción de datos con un controlador "hacerse cargo de todo" requiere que cuando lleguen los datos, el controlador no haga nada más que esperarlos.

  • Un controlador de bit-bang "take over main loop" se comportará de manera muy similar a lo anterior, excepto que utilizará un recurso de temporizador para temporizaciones de bits en lugar de contar el ciclo. Las interrupciones que no demoran demasiado en el servicio pueden dejarse habilitadas. Para la transmisión en serie, el recurso del temporizador de velocidad fija puede compartirse con otros fines; para la recepción en serie, sin embargo, el controlador de bit-bang tendrá que poder volver a cargar el temporizador cuando llegue el bit de inicio para que expire en el medio de cada tiempo de bit entrante.

  • Un controlador de bit-bang completamente controlado por interrupciones utiliza un temporizador de velocidad fija que se ejecuta a un múltiplo de la velocidad de datos preferiblemente (3x y 5x son mejores que 4x), y hace todo a través de ese temporizador. Dicho controlador puede ejecutarse simultáneamente con todo lo demás, pero requerirá una CPU más rápida que la que requerirían los tipos de controladores anteriores.

Para evitar que los dos primeros estilos de controlador esperen para siempre datos que nunca llegarán, es común que las rutinas de lectura incluyan un valor de tiempo de espera. Tenga en cuenta que si el bucle de un controlador, por ejemplo, "obtiene un byte mientras espera hasta 100 ms, haga otras cosas si no llegó ninguno, luego obtenga el siguiente byte, etc." y llega un byte entre el momento en que se agota el tiempo de espera de la rutina "get" y el controlador comienza a esperar nuevamente, ese byte se perderá; el dispositivo con el que se comunica tendrá que esperar esa posibilidad.

Solo el tercer estilo de controlador podrá manejar la posibilidad de que un byte de datos comience a llegar mientras se transmite un byte de datos. Sin embargo, los primeros dos estilos se pueden usar para algunos protocolos de comunicación full-duplex a velocidad completa si el controlador solo tiene que hablar cuando se le habla. El truco consiste en tener una rutina de "lectura y escritura de datos" que esperará un bit de inicio entrante, y cuando se detecta uno superpuesto, una lectura y escritura de tal manera que el controlador envía cada bit justo cuando está a punto de examinar los datos entrantes. Una vez que el controlador detecta el bit de inicio entrante, sabrá exactamente cuándo buscará los siguientes 8 bits de datos y el bit de parada, y sabrá que puede usar el tiempo entre ellos para generar sus propios datos.

Una nota de despedida: un controlador que utiliza uno de los dos primeros estilos de bit-bang uart para recibir datos debe procesar cada byte de datos antes del límite descendente del bit de inicio del siguiente byte para evitar la pérdida de datos. Si el controlador sabe que el procesamiento tomará al menos medio bit de tiempo, puede maximizar el tiempo disponible para el procesamiento al aceptar cada byte tan pronto como haya capturado el último bit de datos, en lugar de esperar el bit de parada. Sin embargo, como otro medio de darle más tiempo al controlador, puede ser útil tener el dispositivo que le está transmitiendo datos con dos bits de parada en lugar de uno. Si se puede configurar "marcar paridad", eso agregará otro tiempo de bit adicional. La transmisión a, por ejemplo, 115200-8-M-2 permitirá más tiempo de procesamiento que 57600-8-N-1, aunque alimentará datos más de 1.6 veces más rápido.


1

Simplemente puede usar el pin de E / S de la uC. La única cosa al cambiar o transferir datos en estos pines debe tener la frecuencia de los pines el doble de la velocidad en baudios. Así es como normalmente funciona UART, muestreará la señal de bit en el medio.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.