viernes, 27 de abril de 2012

USART en microcontroladores AVR

Como su nombre lo indica, el módulo USART soporta la transmisión sincrónica y la transmisión asincrónica, así como también soporta el modo de reloj maestro y esclavo.

En la USART, un baudio equivale a un bit por segundo y esta tasa de transferencia depende de la frecuencia de reloj y de los valores de configuración almacenados en los registros de control. Se pueden generar tramas de 5, 6, 7, 8 y 9 bits con uno o dos bits de parada que señalan el final de una trama (en la comunicación asincrónica) según la configuración que ingrese el usuario.

El bit de paridad es un bit de control opcional que se envía al final de una trama antes del bit de parada para verificar si existe algún error en la comunicación. Este bit se calcula contando el número de bits '1' que se envían: si se escoge paridad par, este bit será '1' si el número de '1's es par, y será '0' en caso contrario; si se escoge paridad impar, el bit de paridad será '0' si el número de '1's es par y '1' en caso contrario.

El bit de paridad se genera por hardware en el transmisor de la USART realizando una or exclusiva entre todos los bits de una trama; y es verificado en el receptor también por hardware. Este bit sirve para detectar si ocurrió un error en la comunicación, pero no sirve para asegurar que todos los bits llegaron correctamente.

En una transmisión asincrónica, una trama de datos inicia con un bit de arranque, seguido del bit menos significativo de información y cada uno de los siguientes bits hasta un máximo de 9, terminando con el bit más significativo. Si la paridad está habilitada, el bit de paridad se envía inmediatamente después de los datos, seguido de los bits de parada. Cuando se termina de enviar la trama, se puede enviar otra inmediatamente o se puede dejar el canal libre esperando otra trama.

A continuación se muestra un ejemplo de uso de transmisión y recepción serial entre el ATMEGA16.

Para realizar este ejemplo se creó una librería con funciones comunes de la USART: inicializar el módulo, transmitir un dato, recibir un dato y transmitir una cadena. Estas funciones se muestran en el código a continuación:

/* usart.h: Librería para el manejo del USART */
#ifndef USART_H
#define USART_H

#include<avr/io.h>

void USART_Init( unsigned int baud);
void USART_Transmit( unsigned char data);
unsigned char USART_Receive( void );
void USART_TransmitString(char cadena[]);

/* Función inicializar USART */
void USART_Init( unsigned int baud )
{
    // Se establece la tasa de baudios con el valor ingresado a
    // la funcion
    UBRRH = (unsigned char)(baud>>8);
    UBRRL = (unsigned char)baud;
    // Se habilita la recepción y la transmisión de datos
    UCSRB = (1<<RXEN)|(1<<TXEN);
    // Se establece el formato de la trama: 8 bits de datos, 
    // 2 bits de parada, sin bits de paridad
    UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
}

/* Función transmitir datos */
void USART_Transmit( unsigned char data )
{
    // Espera hasta que el buffer esté vacio
    while ( !( UCSRA & (1<<UDRE)) );
    // Pone el dato en el buffer de transmisión, envía el dato
    UDR = data;
}

/* Función recibir datos */
unsigned char USART_Receive( void )
{
    // Espera a recibir datos
    while ( !(UCSRA & (1<<RXC)) );
    // Devuelve el dato leido
    return UDR;
}

/* Transmitir una cadena */
void USART_TransmitString(char cadena[])
{
    int i; // Índice

    for(i=0;cadena[i]!='\0';i++) // Recorre la cadena
        USART_Transmit(cadena[i]); // Transmite el dato
}
#endif

El programa principal se muestra a continuación:

//***************************************************************
// Programa de prueba de envío y recepción de datos por USART
//
// Descripción: Este programa inicializa el módulo USART, envía
// datos caracter por caracter para formar la cadena "hola". 
// Luego envía una cadena de prueba y a continuación queda en un 
// ciclo infinito a la espera de los datos que ingresa el usuario
// y los envía nuevamente por el USART.
//    
// Creado:        04/06/2010
// Modificado:    21/06/2010
// Autor:         L.A. Mongua - A.F. Quiceno
//***************************************************************

// Dispositivo = ATMEGA16
// Fclk = 8.0MHz
#include "usart.h" // Librería con las funciones del USART

int main()
{
    // Se declaran las variables en las que se almacenarán los
    // datos recibidos
    unsigned char recibido;
    // Se ajusta la tasa de baudios en 9600
    USART_Init(51); //Tabla 70 hoja de datos ATMEGA16 (pag. 164)
    // Se transmite la cadena "hola"
    USART_Transmit('h');
    USART_Transmit('o');
    USART_Transmit('l');
    USART_Transmit('a');
    USART_Transmit(' '); // Se transmite un espacio
    USART_TransmitString("esto es una prueba");
    USART_Transmit(13); //Fin de línea
    while(1){
        // Cada vez que se reciba un dato
        recibido=USART_Receive();  
        // Se transmite nuevamente el mismo dato
        USART_Transmit(recibido);
    }    // El programa se queda esperando a que un nuevo dato 
        // sea recibido
}

1 comentario:

  1. hola disculpa una pregunta no tendras el diagrama de conexiones de tu programa

    ResponderEliminar