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

Estoy usando un microcontrolador ATMEGA32HVB que tiene una función para el equilibrio de celdas 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 agregarle un UART para que pueda interactuar fácilmente con dispositivos en serie.

La forma de software UART descrita por user26129 se llama bit-banging .
Solo mi subjetivo $ 0.02, pero generalmente preferiría un controlador de batería dedicado por separado y un UART integrado en uC en lugar de al revés. ¿Por qué necesita la gestión de la batería integrada en el uC?
Tengo que usar baterías recargables que se cargarán con un panel solar, así que necesito 4 baterías en serie que se usarán una a la vez.
Una pregunta es cuánto desea usar el UART y en qué direcciones. Si solo desea generar un mensaje de estado o de depuración ocasional, en un momento en que su procesador no tiene mucha demanda adicional, la salida en serie de bit banging puede parecer muy atractiva. Hay puntos como el uso de interrupciones de cambio de pin que también pueden disminuir la carga promedio de tener un canal de entrada, pero si espera recibir caracteres a una velocidad de transmisión alta en un momento en que tiene otros compromisos en tiempo real, puede ser un problema.

Respuestas (5)

Como han señalado otros, 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. Sin duda, puede hacer que un UART de software 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 tanto SPI como I2C (que Atmel llama interfaz de dos hilos (TWI)). Estas serían probablemente 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 disponible una línea de dispositivos UART SPI/I2C de 1 y 2 canales, que cubre el ~1.6- Rango de operación 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) extensamente 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 a 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 evitará agregar otro IC de controlador de línea a su placa.

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

Si está buscando una solución de hardware, Maxim tiene varios circuitos integrados UART con una interfaz SPI para el microcontrolador (que se incluye en su parte). Mire MAX3100 o las otras opciones aquí: http://www.maximintegrated.com/products/interface/controllers-expanders/uart.cfm

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á de bloquear el envío/recepción semidúplex), AVR274 (impulsado por interrupciones, bastante completo), 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'

Una breve nota sobre el diseño de software "UART": hay al menos enfoques cualitativamente diferentes que se pueden tomar, según los requisitos:

  • Un controlador bit-bang "tomar el control de todo" deshabilitará todas las interrupciones y usará un código de conteo de ciclos para sincronizar cada bit. Recibir datos con un controlador "tomar el control de todo" requiere que cuando lleguen los datos, el controlador no haga nada más que esperarlos.

  • Un controlador bit-bang de "tomar el control del bucle principal" se comportará de manera muy similar al anterior, excepto que utilizará un recurso de temporizador para tiempos de bits en lugar de contar ciclos. Las interrupciones que no toman demasiado tiempo para el servicio pueden dejarse habilitadas. Para la transmisión en serie, el recurso del temporizador de tasa fija puede compartirse con otros fines; sin embargo, para la recepción en serie, el controlador de bit-bang tendrá que poder recargar el temporizador cuando llegue el bit de inicio para que expire en medio de cada bit de tiempo entrante.

  • Un controlador bit-bang totalmente controlado por interrupciones utiliza un temporizador de tasa fija que se ejecuta preferiblemente en un múltiplo de la tasa de datos (3x y 5x son mejores que 4x) y hace todo a través de ese temporizador. Tal 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 primeros dos estilos de controlador esperen eternamente por datos que quizás nunca lleguen, es común que las rutinas de lectura incluyan un valor de tiempo de espera. Tenga en cuenta que si el bucle del controlador aa hace, por ejemplo, "obtener un byte mientras espera hasta 100 ms, haga otras cosas si no llega 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 "obtener" y el controlador comienza a esperar nuevamente, ese byte se perderá; el dispositivo con el que se está comunicando 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 de alta velocidad 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, superpone una lectura y escritura de modo que el controlador envíe 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 debe buscar los siguientes 8 bits de datos y el bit de parada y, por lo tanto, 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 borde 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 aceptando cada byte tan pronto como haya capturado el último bit de datos, en lugar de esperar el bit de parada. Sin embargo, como otra forma de dar más tiempo al controlador, puede ser útil que el dispositivo que le proporciona los datos transmita con dos bits de parada en lugar de uno. Si se puede configurar la "paridad de marcas", eso agregará otro tiempo de bit adicional. La transmisión en, 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.

Simplemente puede usar el pin de E/S del uC. Lo único que debe hacer cuando cambie o transfiera datos en estos pines es que la frecuencia de los pines sea el doble de la velocidad en baudios. Así es como funciona normalmente UART, muestreará la señal de bit en el medio.