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

13

Estoy usando un microcontrolador ATMEGA32HVB que tiene una función para el balance de células mediante el cual podemos conectar 4 baterías Series y uso uno a la vez. Eso es muy útil para la administración de energía, así que no puedo usar un microcontrolador diferente. Por favor, sugiera algunos métodos para agregarle un UART para que pueda interactuar fácilmente con los dispositivos serie.

    
pregunta user27475

5 respuestas

17

Como han dicho 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 el enfoque basado en hardware. Ciertamente, puede hacer que un software UART funcione con bit banging , pero es posible que no desee dedicar los recursos de la CPU a generar tiempo requerido.

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

  • Exar ( enlace ) tiene una línea de dispositivos UART SPI / I2C de 1 y 2 canales disponibles, que cubren el rango operativo de ~ 1.6-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 ( enlace ) tiene una línea de dispositivos SPI / I2C UART / IrDA / GPIO disponibles, también en variedades de 1 y 2 canales en un par de rangos de voltaje. He usado estas partes (específicamente el SC16IS762) ampliamente en el pasado con gran éxito.

  • Maxim ( enlace ) tiene el MAX3110E y dispositivos 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 use voltajes de línea RS-232 en lugar de niveles lógicos (por ejemplo, una PC), esto puede ser útil, ya que le evitará agregar otro IC de controlador de línea a su tablero.

respondido por el Jason R
10

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). Vea MAX3100 u otras opciones aquí: enlace

    
respondido por el Tut
8

Necesitará usar un controlador UART de software. Dependiendo de lo que espere exactamente de este UART, puede usar AVR305 (extremadamente compacto, pero no hay funciones más allá del bloqueo de la mitad - Enviar / recibir en dúplex), AVR274 (dirigido por interrupciones, bastante característica completa), puede escribir su propio software UART o puede usar uno que encuentre en Internet, por ejemplo, busque en Google 'avr software uart'

    
respondido por el user36129
3

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

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

  • Un controlador de bit-bang de "toma de control principal" se comportará como el anterior, excepto que usará un recurso de temporizador para temporizaciones de bits en lugar de ciclos de conteo. 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 se puede compartir con otros propósitos; para la recepción en serie, sin embargo, el controlador bit-bang tendrá que poder volver a cargar el temporizador cuando llegue el bit de inicio para que caduque en el medio de cada bit de tiempo entrante.

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

Para evitar que los dos primeros estilos de controlador esperen para siempre 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 un bucle de un controlador lo hace, por ejemplo. "obtenga un byte mientras espera hasta 100 ms, haga algunas otras cosas si no llega ninguna, luego obtenga el siguiente byte, etc." y un byte llega entre el momento en que la rutina "get" finaliza el tiempo de espera 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 dos primeros estilos pueden usarse para algunos protocolos de comunicación full-duplex de velocidad completa si el controlador solo tiene que hablar cuando se le habla. El truco es tener una rutina de "lectura y escritura de datos" que esperará un bit de inicio entrante, y cuando se detecte uno se superpondrá una lectura y escritura de manera que el controlador envíe cada bit justo cuando está a punto de examinar los datos entrantes. Una vez que el controlador detecte el bit de inicio entrante, sabrá exactamente cuándo buscará los siguientes 8 bits de datos y el bit de parada y, por lo tanto, sabrá que puede usar el tiempo intermedio para generar sus propios datos de manera segura.

Una nota de despedida: un controlador que utiliza uno de los dos primeros estilos de uart bit bang 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, 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 un medio adicional para darle al controlador más tiempo, puede ser útil que el dispositivo que le está dando los datos transmita con dos bits de parada en lugar de uno. Si se puede configurar "marca de paridad", eso agregará otro tiempo de bit adicional. Transmisión a, por ejemplo, 115200-8-M-2 permitirá más tiempo de procesamiento que 57600-8-N-1, a pesar de que alimentará datos más de 1.6 veces más rápido.

    
respondido por el supercat
1

Simplemente puede usar el pin de E / S de la unidad de usuario. Lo único que ocurre al conmutar o transferir datos en estos pines es que la frecuencia de los pines se duplique a la velocidad de transmisión. Así es como funciona normalmente UART, muestreará la señal de bit en el centro.

    
respondido por el nitin

Lea otras preguntas en las etiquetas