Pages Menu
TwitterFacebook



BANNER2_ALT

Posted by on Abr 15, 2014 in AVR | 0 comments

Comunicación serial USART AVR

Comunicación serial USART AVR

Comunicación Serial USART

 

Descripción de la Comunicación serial.

En este proyecto, se verá una de las maneras de entablar comunicación del micro controlador con la computadora, para poder realizar esta práctica se requerirá del uso de varios componentes los cuales describiremos a continuación, la comunicación serial es una de las maneras más sencillas de comunicar nuestro micro controlador hacia el exterior, ya sea con una computadora o con algún otro micro controlador.

Teraterm configuración

Para este proyecto se configurara el microcontrolador con el oscilador interno a 8 Mhz y se usara del programa Teraterm el cual es el equivalente de la hiper terminal  en Windows Vista. Básicamente el programa realizara un eco del dato mandado, si se manda una “a” el micro controlador recibirá esa “a” y la enviara de vuelta. Esto con la finalidad de aislar la comunicación de cualquier proceso, en su momento es posible mandar un dato, aplicarle algún proceso o algoritmo y regresar el resultado.

 Diagrama Esquemático de la Comunicación serial

UART USART Comunicación serial

Diagrama esquematico de comunicacion serial

Materiales

 

 

Introducción

Características de la USART del ATmega8

 

La USART o Universal Synchronous and Asynchronous serial Receiver and Transmitter es un dispositivo de comunicación serial altamente flexible, sus principales características son:

 

  • Operación Full Dulpex
  • Registros de transmisión y recepción independientes
  • Operación síncrona o asíncrona
  • Generador de Baud Rate de alta resolución
  • Detección de error
  • Filtro de ruido
  • Modo de comunicación multiproceso
  • Doble velocidad en modo de comunicación asíncrono

 

Diagrama a bloques de la USART

 

usart Comunicación serial

Diagrama de bloques

  El manejo de la comunicación serial presenta muchos beneficios, entre los que destacan, el control de sistemas a través de la computadora realizando cálculos complejos, visualizando y graficando datos, entre otros. Es importante destacar que también existen muchos programas aparte de la hyperterminal los cuales pueden entablar comunicación serial con el microcontrolador, programas como MatLab, LabVIEW, TeraTerm entre otros.

Programa en C

 

#include<avr/io.h>
#include<util/delay.h>

int dato;

void InitUART( unsigned char baudrate ) {  //Configurando la UART

UBRRL = baudrate;                  //Seleccionando la velocidad

UCSRB = (UCSRB | _BV(RXEN) | _BV(TXEN));//Habilitando la transmisión y recepción

}

unsigned char ReceiveByte( void ){ //Función para recibir un byte

while ( !(UCSRA & (1<<RXC)) );//Esperar la recepción

return UDR; //Retornar el dato tomado de la UART

}

void TransmitByte( unsigned char data ) //Funcion para transmitir dato

while ( !( UCSRA & (1<<UDRE)) ); //Esperar transmision completa

UDR = data;          //Depositar el dato para transmitirlo

}

int main (void) {
 
 InitUART( 51 );   //Inicializar la UART

while(1){

dato=ReceiveByte(); //Recibir un dato de la UART

TransmitByte(dato);  //Mandar el mismo dato

}
}

 

Detalles del programa

 

#include<avr/io.h>
#include<util/delay.h>

 int dato;

  Se inicia el programa con las librerías respectivas, y se declara una variable “dato”.

 

<pre>void InitUART( unsigned char baudrate ) {
UBRRL = baudrate;
UCSRB = (UCSRB | _BV(RXEN) | _BV(TXEN));
}

Se declara la función que configura el USART, recordemos que en este caso se trabajara el microcontrolador a una frecuencia de 8 Mhz. El primer registro a configurar es el UBRRL

UBRRL

Tabla de registros UBRRL y UBRRHs.

 

 Como se puede ver el UBRR (11:0) contiene 12 bits, en este registro se ajusta la velocidad de trabajo de la comunicación, el baud rate. Hay que substituir los valores indicados en las siguientes formulas para obtener el valor que va en el UBRR y él % de error.

 

BAUD Comunicación serial

Ecuaciones de calculos  BAUD

Como se usara el modo asíncrono normal, tomamos la primeras formulas para calcular el UBRR y después los Baudios. Primero resolvemos la del UBRR para obtener el valor calculándolo con 9600 baudios, después calculamos los baudios con el valor del UBRR (Pero el valor entero ya que en los registros solo se pueden asignar números enteros), y el resultado nos dará los baudios reales.

 El valor obtenido para 9600 baudios fue de 51.0833 por lo tanto, se tomara el valor de 51 redondeando el valor obtenido, y con el cual calculamos los baudios reales.

 

UBRR BAUD Comunicación serial

Ecuaciones UBRR y BAUD

9615.3846 Sera el valor real de baudios por segundo con los que el microcontrolador trabajara, para obtener el %de error respecto al valor de 9600 aplicamos la siguiente formula.

 

error baud Comunicación serial

Ecuacion del % del error

Como se puede ver el porcentaje de error es muy pequeño. Estas operaciones previamente realizadas es para conocer un poco más el funcionamiento del registro y el cómo calcular el valor respecto a algún baud rate deseado, pero también hay una tabla en la hoja de datos con los valores más usados.

 

Comunicación serial

Valores mas usados.

 

Como se puede ver, los valores obtenidos para el UBRR son similares a los de la tabla. Volviendo al registro,  solo se le asigna el valor al UBRRL el cual es suficiente modificar ya que el 51 en binario es 0b110011, como se puede ver solo se necesitan los bits del 0 al 6.

Para el UCSRB

 

Comunicación serial

Tabla de control y status de registro UCSRB

 

Como se observa en el código se habilitan los bits RXEN y TXEN los cuales habilitan el transmisor y el receptor de la USART además de los pines correspondientes RXD y TXD.

 

unsigned char ReceiveByte( void ){ //Función para recibir un byte

while ( !(UCSRA & (1<<RXC)) );    //Esperar la recepción

return UDR;         //Retornar el dato tomado de la UART
}

 

Comunicación serial

usart control

 

 

El uso del registro UCSRA para la función de recibir un byte, es por el bit 7 el RXC el cual indica que hay algun dato para leer en el registro. Por lo tanto el ciclo while espera hasta que haya un dato, posteriormente finaliza la función con un return, el cual regresa el valor en el UDR (donde se encuentra el dato) fuera de la misma.

 

void TransmitByte( unsigned char data ){

while ( !( UCSRA & (1<<UDRE)) );

UDR = data;

}

 

Al igual que la función de recibir un byte esta espera el UDRE en el UCSRA el cual indica que el buffer de transmisión está listo para recibir nuevos datos, una vez que salga del ciclo, se coloca el dato deseado en el UDR para transmitirlo.

 

<pre>init main (void) {

InitUART( 51 );
while(1){
dato=ReceiveByte();
TransmitByte(dato);
}
}

 

Como ya se explico, se inicializa la UART con un 51 el valor correspondiente, una vez configurada el programa entra al ciclo, en donde la función espera recibir un dato, una vez que se recibe el dato, este mismo sin sufrir modificación alguna es mandado a través de la UART.

Recordemos que se está mandando un byte esto es, que al recibir el microcontrolador una letra en una variable de tipo entero, esta variable tendrá el valor que corresponde a esa letra (ver la tabla ASCII), por ejemplo si se manda una variable con el valor 97 en la terminal veremos una “a”, pero si mandamos una variable tipo char con una ‘a’ en la terminal veremos esa misma “a”, en la tabla se muestran varios ejemplos.

Por lo tanto dependiendo del programa que estemos usando, debemos de tener cuidado si este recibe los bytes y los toma como caracteres o como enteros.

 

dec bin hex

Tabla de variables

 

Post a Reply

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *