Transmisión Serial - USART

Objetivos

  • Comprender los conceptos básicos sobre transmisión serial de datos.
  • Entender el funcionamiento del módulo USART del microcontrolador.

Modos de Transmisión de Datos:

Transmisión paralela: es el envío de datos de byte en byte, sobre un mínimo de ocho líneas.
PARALELA.PNG
Transmisión en serie: es el envío de datos bit a bit sobre una interfaz serie (típicamente un cable de un solo hilo).
serial.PNG

¿Cuál es Mejor?

Es natural preguntarse cuál de los dos modos de transmisión es mejor, como primera impresión se piensa que si se hace la transmisión de forma paralela se debería transmitir datos mucho mas rápido que de manera serial, pero las interfaces paralelas sufren de interferencia intersimbólica proveniente de las lineas paralelas y de ruido, por lo tanto los data se pueden corromper en largas distancias. Además debido a que las lineas son paralelas se generan capacitancias parásitas e inductancia mutua lo cual hace que las lineas en paralelo tenga menor ancho de banda que las seriales, y sabemos que si el ancho de banda es mayor mejorará la tasa de transmisión de bits, si la linea es poco ruidosa tendrá una mejor relación señal a ruido (SNR).

UART - Universal asynchronous receiver/transmitter

UART es un módulo de hardware que traduce los datos de paralelo a serial para ser transmitidos, las UARTs son usadas comunmente en conjunto con estándares de comunicación como EIA, RS-232, RS-422 o RS-485. la designación "universal"indica que el formato de los datos y las velocidades de transmisión pueden ser configuradas.

UART es normalmente un circuito integrado individual usado para comunicaciones de un sistema de cómputo, son normalmente incluidas en microcontroladores. Un UART dual, o DUART, combina dos UART en un solo chip. Un octal UART or OCTART combina ocho UARTs un un solo empaquetado. Actualmente estos circuitos pueden comunicarse de manera sincrónica y asincrónica y son conocidos como USART. Las funciones principales de chip UART son: manejar las interrupciones de los dispositivos conectados al puerto serie y convertir los datos en formato paralelo, transmitidos al bus de sistema, a datos en formato serie, para que puedan ser transmitidos a través de los puertos y viceversa.

Formato de la trama

En comunicaciones una trama es una unidad de envío de datos, y el formato de la misma para UART es la siguiente:

frame-format.jpg

Paridad

Los códigos de paridad se usan en Telecomunicaciones para detectar, y en algunos casos corregir errores en la transmisión. Para ellos se añade en origen un bit extra llamado bit de paridad a los n bits que forman el carácter original. Este bit de paridad se determina de forma que el número total de bits 1 a transmitir sea par (código de paridad par) o impar (código de paridad impar).

  • Código de paridad par

El bit de paridad será un "0" si el número total de 'unos' a transmitir es "par" (bit "1" para un número "impar" de 'unos').

  • Código de paridad impar

El bit de paridad será un "0" si el número total de 'unos' es "impar" (bit "1" para un número "par" de 'unos').

Bits, Baudios y Símbolos

El baudio es una unidad de medida utilizada en telecomunicaciones, que representa el número de símbolos por segundo en un medio de transmisión digital. Cada símbolo puede codificar 1 o más bits dependiendo del esquema de modulación, un bit siempre representa dos estados, por lo tanto baudios por segundo no siempre es equivalente a bits por segundo, los símbolos son las unidades de información estas se representan en bits, de manera que la tasa de bits será igual a la tasa de baudios solo cuando halla 1 bit por símbolo.

USART en microcontroladores AVR

A continuación están listadas las principales características del modulo USART, para mayor información buscar en los documentos proporcionados por el fabricante (datasheet).

  • Full Duplex Operation (Independent Serial Receive and Transmit Registers)
  • Asynchronous or Synchronous Operation
  • Master or Slave Clocked Synchronous Operation
  • High Resolution Baud Rate Generator
  • Supports Serial Frames with 5, 6, 7, 8, or 9 Data bits and 1 or 2 Stop Bits.

¿Cómo configurar UART?

Antes de continuar es importante resaltar que AVR UART y USART son totalmente compatibles en términos de registros, generación de tasa de baudios, operaciones de buffer y funcionalidad de buffer en el transmisor/receptor. A continuación un resumen rápido de la configuración del módulo UART.

  1. Establecer la velocidad de transmisión en emisor y receptor debe ser la misma para poder realizar la comunicación.
  2. Establecer el número de bits de datos que deben ser enviados.
  3. Mantener el buffer listo, si es una transmisión cargarlo con el dato a transmitir, si es una recepción almacenar el dato recibido para poder recibir mas datos son perder información
  4. Por último habilitar el transmisor/receptor de acuerdo con el uso que se le desee dar.

En el caso de la transmisión sincronica (USART) es necesario enviar el reloj del sistema el microcontrolador que envía esta señal se llama Maestro y el otro se denomina esclavo; para transmisión Asíncrona no se hace esta denominación para los transmisores/receptores.

Modos de Operación

Asynchronous Normal Mode

En este modo de comunicación, el dato es transmitido/recibido asincrónicamente, el dato es transferido a la tasa de transmisión seleccionada en el registro UBRR.

Asynchronous Double Speed Mode

Este es el modo de transmisión de mas alta velocidad en para comunicación asincrónica. En este modo se establecen la tasa de baudio de manera similar a como se hace en el modo normal, con la diferencia que la velocidad de transmisión será del doble de la que se configure en el registro UBRR. Estableciendo el bit U2X del registro UCSRA se puede duplicar la tasa de transferencia, este bit solo tiene efecto para la operación asíncrona.

Synchronous Mode

Esta es la operación USART del AVR, cuando el modo sincrónico está en uso (UMSEL = 1 en el registro UCSRC), el pin XCK será usado como entrada de reloj (Slave) o salida de reloj (Master).

Generación de la tasa de Baudios.

Esta tasa se establece en el registro de 16 bits UBRR:

ubbr-register.jpg

Dado que el el microcontrolador AVR es de 8 bits cada registro tendrá un tamaño de 8 bits, por lo tanto el registro UBRR estará compuesto de dos registros UBRRH (high) y UBRRL (low) de manera similar al registro de 16 bits del ADC (ADCH y ADCL).

El "USART Baud Rate Register" (UBRR) y el contador (down-counter) conectado funcionan como un prescaler programable y así generar la tasa de baudios, el down-counter, funciona con el reloj del sistema (FOSC), y es cargado con el valor de UBRR cada vez que ha llegado a cero o cuando el registro UBRRL ha sido modificado, un reloj es generado cada vez que el contador llega a cero. Este reloj es la salida del generador de tasa de baudios (= FOSC/(UBRR+1)). El transmisor divide este reloj en 2, 8, o 16 dependiendo del modo seleccionado, a continuación aparecen las formulas usadas para calcular la tasa de baudios y el valor de UBRR.

baud-rate-calculation.jpg

Estableciendo el número de bit de datos

El tamaño de dato usado por USART se establece en los bits UCSZ2:0 en el registro UCSRC, el emisor y el receptor usan la misma configuración para su operación, es importante tener en cuenta que cambiar las configuraciones durante su operación normal puede "corromper" los datos.

data-bit-settings.jpg

Estableciendo el número de bits de parada.

El bit USBS del registro UCSRC selecciona el número de bits de parada que insertará el transmisor, el receptor ignorará esta configuración.
stop-bit-settings.jpg

Códigos Ejemplo:

Inicialización USART

#define FOSC 1843200// Clock Speed
#define BAUD 9600
#define MYUBRR FOSC/16/BAUD-1
void main( void )
{
:.
USART_Init ( MYUBRR );
:.
}
void USART_Init( unsigned int ubrr)
{
/* Set baud rate */
UBRRH = (unsigned char)(ubrr>>8);
UBRRL = (unsigned char)ubrr;
/* Enable receiver and transmitter */
UCSRB = (1<<RXEN)|(1<<TXEN);
/* Set frame format: 8data, 2stop bit */
UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
}

Transmisión USART

void USART_Transmit( unsigned char data )
{
/* Wait for empty transmit buffer */
while ( !( UCSRA & (1<<UDRE)) )
;
/* Put data into buffer, sends the data */
UDR = data;
}

Referencias y Links

  1. http://www.avrfreaks.net/forum/tut-soft-using-usart-interrupt-driven-serial-comms?page=all
  2. http://www.avrfreaks.net/forum/tut-soft-using-usart-serial-communications?page=all
  3. http://maxembedded.com/2013/09/the-usart-of-the-avr/
  4. http://www.atmel.com/Images/Atmel-8154-8-bit-AVR-ATmega16A_Datasheet.pdf
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License