Está en la página 1de 27

USART AVR Comunicacin serial

Compartir: 6 3 1 0

USART AVR, viene de receptor transmisor sncrono asncrono universal, es una


forma de comunicacin entre dispositivos que tengan esta capacidad, donde los datos pueden ser enviados en grupos de
5, 6, 7, 8 o de 9 bits pero bit por bit, esto es en serie, por eso se dice que esta es una comunicacin serial, en esta
seccin se comentar sobre la comunicacin serial asncrona utilizando el mdulo USART del microcontrolador AVR, con el
mdulo USART AVR el microcontrolador puede comunicarse e intercambiar datos con el ordenador, con otros
microcontroladores, etc.

Para la comunicacin serial asncrona entre microcontroladores y para la comunicacin entre el microcontrolador y el
ordenador, se necesitan 2 hilos de conduccin para la transmisin y recepcin de datos, y un hilo de conduccin para la
conexin de los comunes o GND que tienen que ser los mismos, para la comunicacin serial entre el microcontrolador y
el ordenador se seguir la norma RS232.

En la comunicacin USART AVR asncrona, uno de los hilos ser para la transmisin de los datos de un dispositivo a
otro y el otro hilo ser para la recepcin de datos entre un dispositivo a otro, la transmisin y la recepcin pueden ocurrir
en forma simultanea, lo que si se tiene que cumplir es que la frecuencia de trabajo de ambos dispositivos tiene que ser la
misma, a esto se le conoce como los baudios que viene a ser la cantidad de bits por segundo que se transmitirn entre
ambos dispositivos.

El microcontrolador AVR utilizado como


referencia ser el ATmega88, los pines de este microcontrolador que trabajan con el mdulo USART AVR son el pin RXD
o pin receptor y el pin TXD o pin transmisor, los que en la imagen estn resaltados resaltados.
El pin RXD es el pin para la recepcin de datos.
El pin TXD es el pin para la transmisin de datos.

El pin RXD del AVR tiene que ser conectado al pin TX o TXD del otro dispositivo.

El pin TXD del AVR tiene que ser conectado al pin RX o RXD del otro dispositivo

Los comunes GND de ambos dispositivos tambin tienen que estar conectados entres si.

Los niveles de tensin con los que trabajan los pines del mdulo USART AVR son de 0V y 5V un bajo ser 0V mientras que
un alto ser 5V, por eso cuando la comunicacin es entre microcontroladores la conexin entre pines se puede hacer
directamente, pero cuando la comunicacin es entre el microcontrolador y un ordenador la conexin entre pines tiene que
hacerse a travs de un conversor de nivel como el MAX232, ya que los niveles de tensin para la comunicacin serial del
ordenador son mayores que para el AVR tpicamente entre -12V y 12V, adems de trabajar con lgica negativa, esto es
para el ordenador un bajo ser 12V mientras un alto ser -12V.

Hay otra manera de conectar el AVR con el ordenador para la comunicacin serial mediante resistencias y la compuerta
inversora tipo Schmitt 74HC14 como se ve en la siguiente imagen.
El socket donde se conectar el AVR con el ordenador para la comunicacin serial es del tipo DB9 y se conoce como
puerto serie, pero resulta que este tipo de puerto ya no viene en los ordenadores porttiles que son los que hoy en da la
mayora utiliza, lo que traen ahora son puertos USB, por lo que para realizar la comunicacin serial con el mdulo USART
AVR ser necesario la utilizacin de un conversor SERIE-USB como el que se muestra en la siguiente imagen.
El conector DB9 es el que se utiliza para la
comunicacin serial con el mdulo USART AVR, este conector consta de de 9 pines, los hay hembra y macho, de este
conector solo se utilizarn 3 pines, uno para el pin RX, otro para el pin TX y el otro para el tierra, estos pines tiene una
numeracin que hay que respetar.
El conversor serie-USB viene con el conector DB9 macho, si el cable que trae es corto se tendr que conseguir un cable
serie DB9 del que la hembra se conectar al conector DB9 macho del conversor serie-USB y el DB9 macho del cable serie
DB9 al microcontrolador AVR ya sea a travs del MAX232 o con el uso de la compuerta inversora como se comento lineas
arriba, por lo que los pines a conectar del DB9 macho con el mdulo USART AVR son en el siguiente orden:

El pin 2 que es pin receptor RX del conector DB9 macho que viene del ordenador, se conectar a travs del MAX232
o con el uso de la compuerta inversora y la resistencia de 1K al pin transmisor o pin TXD del microcontrolador AVR.

El pin 3 que es pin transmisor TX del conector DB9 macho que viene del ordenador, se conectar a travs del
MAX232 o con el uso de la compuerta inversora y la resistencia de 22K al pin receptor o pin RXD del microcontrolador
AVR.

El pin 5 que es pin GND o tierra o comn del conector DB9 macho que viene del ordenador, se conectar al pin
GND del microcontrolador AVR.

Las conexiones del mdulo USART AVR con el ordenador a travs de la compuerta inversora y las resistencias, con el uso
del conversor serie-USB ser como se indica en la siguiente imagen.
USART AVR PROGRAMACIN
Para programar el mdulo USART AVR se recomienda mucho leer la hoja de datos del AVR utilizado, como referencia se
ver para el ATmega88, del que se utilizan los siguientes registros, se ver que estos tienen una n, esto es porque
algunos otros microcontroladores AVR tienen mas de un mdulo USART, el ATmega88 slo tiene uno y en este caso n ser
0 n=0, y ser lo que se utilice en la descripcin de los registros, los registros son: el registro UDRn, el registro UCSRnA,
el registro UCSRnB, el registro UCSRnC, los registros UBRRnL y UBRRnH, se pueden producir interrupciones USART
AVR.

El registro UDR0 en este registro se pondr el caracter que se quiera transmitir, y tambin se encontrar el caracter
recibido, tiene esta doble funcin, n es reemplazado por 0.
El registro UCSR0A Registro de control y estado A del mdulo USART AVR, n es reemplazado por 0.

El bit7 RXC0 Este bit se pone a 1 automticamente cuando se ha completado la recepcin de algn dato en el registro
UDR0, se pondr a 0 automticamente cuando se haya ledo el dato, si se a habilitado el uso de la interrupcin por
recepcin del mdulo USART AVR, este bit se utiliza para detectar la interrupcin.

El bit6 TXC0 Este bit se pone a 1 automticamente cuando se ha completado la transmisin de algn dato que se
encontraba en el registro UDR0, se pondr a 0 automticamente cuando se cargue otro dato en el registro UDR0 a ser
transmitido, si se a habilitado el uso de la interrupcin por transmisin del mdulo USART AVR, este bit se utiliza para
detectar la interrupcin.

El bit5 UDRE0 Este bit al ponerse a 1 en forma automtica indica que el registro UDR0 est vaco por lo que se le podr
cargar con algn dato. Cuando se cargue con algn valor el registro UDR0 este bit se pondr automticamente a 0. Se
puede habilitar la interrupcin por deteccin de que el registro UDCR0 est vaco y este bit ser el que indique esa
interrupcin.

El bit4 FE0 Este bit se pondr a 1 automticamente cuando hay un error en la recepcin de algn dato, el error se
detecta cuando el bit de parada del dato es un 0, el que normalmente debe de ser un 1. Se recomienda siempre poner
este bit a 0 antes de recibir algn dato.
El bit3 DOR0 Este bit se pondr a 1 automticamente cuando se sobreescribe algn dato del registro UDR0 que no haya
sido ledo, se pondr a 0 automticamente cuando se lea el dato, se recomiendo poner este bit a 0 antes de recibir algn
dato.

El bit2 UPE0 Este bit se pondr a 1 automticamente cuando se produce un error de paridad en la recepcin de algn
dato, se pondr a 0 automticamente cuando se lea el dato, se recomiendo poner este bit a 0 antes de recibir algn dato.

El bit1 U2X0 Este bit interviene en la velocidad de los datos, esto es en los baudio que es la cantidad de bits por segundo
en la comunicacin serial, si es puesto a 0 se dice que la velocidad ser normal y si es puesto a 1 se dice que ser a
doble velocidad.

El bit0 MPCM0 Este bit es utilizado en el modo sncrono y es para detectar cual de los microcontroladores esclavo a sido
elegido. en modo asncrono se pondr a 0.

El registro UCSR0B Registro de control y estado B del mdulo USART AVR, n es reemplazado por 0.

El bit7 RXCIE0 Al poner este bit a 1 se habilita el uso de la interrupcin USART AVR por recepcin.

El bit6 TXCIE0 Al poner este bit a 1 se habilita el uso de la interrupcin USART AVR por transmisin.

El bit5 UDRIE0 Al poner este bit a 1 se habilita el uso de la interrupcin USART AVR la deteccin de que el registro UDR0
se qued vaco.

El bit4 RXEN0 Al poner este bit a 1 se habilita el uso del pin RXD para la recepcin del mdulo USART AVR. Se habilita es
uso de la recepcin.

El bit3 TXEN0 Al poner este bit a 1 se habilita el uso del pin TXD para la transmisin del mdulo USART AVR. Se habilita
es uso de la transmisin.
El bit2 UCSZ02 Este bit junto con los bits 2 y 1 del registro UCSR0C son para elegir de cuantos bits sern los datos a
recibir o transmitir en la comunicacin serial.

El bit1 RXB80 Si se elige la comunicacin serial a 9 bits, este ser el noveno bit en la recepcin del dato.

El bit0 TXB80 Si se elige la comunicacin serial a 9 bits, este ser el noveno bit en la transmisin del dato.

El registro UCSR0C Registro de control y estado C del mdulo USART AVR, n es reemplazado por 0.

El bit7 UMSEL01 y el bit6 UMSEL00 son para elegir el modo de trabajo del mdulo USART AVR, segn la siguiente
tabla.

Se ver el modo asncrono por lo que las combinaciones de estos bits sern 00.
El bit5 UPM01 y el bit4 UPM00 son para elegir si se utilizar o no algn bit de paridad para la deteccin de errores
segn la siguiente tabla:

En los ejemplos a realizar no se utilizar el bit de paridad por lo que la combinacin de estos bits ser 00.

El bit3 USBS0 Este bit selecciona el nmero de bits de parada que se inserta por el transmisor. El receptor ignora este
ajuste, segn la siguiente tabla:

El bit2 UCSZ01 y el bit1 UCSZ00 junto con el bit2 UCSZ02 del registro UCSR0B son para elegir de cuantos bits sern
los datos a recibir o transmitir en la comunicacin serial, segn la siguiente tabla:
El bit0 UCPOL0 Este bit es utilizado en el bit sncrono, en el modo asncrono se pondr a 0.

Los registros UBRR0L y UBRR0H Juntos estos registros hacen un solo registro de 16 bits el UBRR0, es donde se debe
cargar el valor con el que se elige la velocidad de transmisin de los datos, esto es los baudios o la cantidad de bits por
segundo que se enviarn en la comunicacin serial con el mdulo USART AVR, trabaja junto con el bit U2X0 del
registro UCSR0A.

El valor a cargar en el registro UBRR se calcula con las siguientes frmulas que dependern de la velocidad elegida con el
bit U2X0, de la frecuencia del oscilador utilizado y de si la comunicacin ser sncrona o asncrona.
Los ejemplos que se harn sern para la transmisin asncrona en el modo normal por lo que la frmula que se utilizar
ser:

Velocidad en baudios=Fosc/(16*(UBRR0+1))

Es importante recordar que la velocidad en baudios de los dispositivos que se estn comunicando tienen que ser iguales,
la mas comn es la de 9600 baudios, si en la frmula anterior se reemplaza y se despeja se tendr:

UBRR0=(Fosc/(16*9600))-1

de donde:

UBRR0=(Fosc/153600)-1

Por ejemplo si el oscilador es de 8MHz se tendr

UBRR0=(8000000/153600)-1=51

Por lo que para obtener un una velocidad de 9600 baudios se tendr que cargar el registro UBRR0 con 51.

Hay un cuadro en la hoja de datos donde se tienen algunos valores a cargar en este registro para el modo sncrono y
asncrono dependiendo de la frecuencia del oscilador utilizado y de la velocidad elegida.
USART AVR PROGRAMACIN en el ATMEL STUDIO
Para la programacin del mdulo USART AVR en el ATMEL STUDIO, en este caso se comentar como se puede proceder
para utilizar el mdulo USART AVR en modo asncrono del ATmega88, lo aqu comentado es muy similar para otros
microcontroladores AVR.

Para iniciar el mdulo USART AVR.

Los pines del ATmega88 para el manejo del mdulo USART AVR son el pin PD0 para la recepcin de datos por lo que en
este caso se le llama pin RXD, y el pin PD1 para la transmisin de datos, en este caso se le llama pin TXD.

Configuracin del registro UCSR0A Todos los bits de este registro se pondrn a 0 ya que a excepcin del bit bit1
U2X0 y el bit0 todos los dems bits trabajan en forma automtica, el bit1 se pone a 0 porque se trabajar en la
velocidad de los baudios en forma normal, y el bit 0 se pone a 0 porque se usar el modo asncrono.

Luego en la inicializacin del mdulo USART AVR el registro UCSR0A en el ATMEL STUDIO quedar as:

UCSR0A=0b00000000;// velocidad normal

Configuracin del registro UCSR0B no se utilizarn interrupciones, se habilitarn los pines RXD y TXD para la
comunicacin serial y la comunicacin ser a 8 bits

El bit7 se pondr a 0 porque no usar la interrupcin USART AVR por recepcin.

El bit6 se pondr a 0 porque no usar la interrupcin USART AVR por transmisin.

El bit5 se pondr a 0 porque no usar la interrupcin USART AVR la deteccin de que el registro UDR0 se qued vaco.

El bit4 se pondr este bit a 1 para habilitar el uso del pin RXD en la recepcin del mdulo USART AVR. Se habilita es uso
de la recepcin.

El bit3 se pondr este bit a 1 para habilitar el uso del pin TXD para la transmisin del mdulo USART AVR. Se habilita es
uso de la transmisin.

El bit2 Este bit junto con los bits 2 y 1 del registro UCSR0C son para elegir de cuantos bits sern los datos a recibir o
transmitir en la comunicacin serial, se utilizar la comunicacin serial a 8 bits, por lo que este bit se pondr a 0.
El bit1 se pone a 0 ya que este bit ser el noveno bit en la recepcin del dato, si la comunicacin es a 9 bits.

El bit0 se pone a 0 ya que este bit ser el noveno bit en la transmisin del dato, si la comunicacin es a 9 bits.

Luego en la inicializacin del mdulo USART AVR el registro UCSR0B en el ATMEL STUDIO quedar as:

UCSR0B=0b00011000;//transmisin y recepcin habilitados a 8 bits

Configuracin del registro UCSR0C se elegir el modo asncrono, sin bit de paridad, un bit de parada

Los bits 7 y 6 se ponen a 0 para elegir el modo asncrono del mdulo USART AVR.

Los bits 5 y 4 se ponen a 0 para no utilizar bit de paridad.

El bit3 se pone a 0 para elegir un solo bit de parada.

Los bits 2 y 1 se ponen a 1 para elegir que la comunicacin serial ser a 8 bits.

El bit0 Este bit es utilizado en el bit sncrono, en el modo asncrono se pondr a 0.

Luego en la inicializacin del mdulo USART AVR el registro UCSR0B en el ATMEL STUDIO quedar as:

UCSR0C=0b00000110;//asncrono, sin bit de paridad, 1 bit de parada a 8 bits

Carga del registro UBRR0 para los baudios o la cantidad de bits por segundo para la comunicacin serial, como ser a
velocidad normal por lo que el bit U2X0 del registro UCSR0A se puso a 0 y en forma asncrona, se utilizar la frmula.

Velocidad en baudios=baudios=Fosc/(16*(UBRR0+1))

Al despejar se tendr

UBRR0=(Fosc/(16*baudios))-1

En los ejemplos que se harn se utilizar una Fosc de 8Mhz y la velocidad ser de 9600 baudios, por lo que al reemplazar
se tendr que el valor a cargar en el registro UBRR0 ser de 51, luego en el ATMEL STUDIO ser:

UBRR0=51;//para una velocidad de 9600 baudios con un oscilador de 8Mhz

Entonces se puede iniciar el mdulo USART AVR en el ATMEL STDIO de la siguiente manera:
1 ////////////////////////////////////////////
2 //////////////////////////////////////////////

3 //inicializacin del mdulo USART AVR en el ATMEL STUDIO modo asncrono, a 8bits,

4 //a 9600 baudios, sin bit de paridad, 1 bit de parada

6 UCSR0A=0b00000000; // velocidad normal

7 UCSR0B=0b00011000; //transmisin y recepcin habilitados a 8 bits

8 UCSR0C=0b00000110; //asncrono, sin bit de paridad, 1 bit de parada a 8 bits

9 UBRR0=51; //para una velocidad de 9600 baudios con un oscilador de 8Mhz


La inicializacin podra hacerse dentro de una funcin a la que se le puede dar el nombre que se quiera, en este caso se la
llamar iniciar_usart(), adems el registro UCSR0A siempre se inicia a 0 por lo que no es necesario inicializarlo en este
caso ya que se necesita que sea 0, lo que en el ATMEL STUDIO ser as:
1
//////////////////////////////////////////////
2
//inicializacin del mdulo USART AVR modo asncrono
3
//en una funcin, a 8bits,a 9600 baudios, sin bit de paridad
4
//1 bit de parada
5
/////////////////////////////////////////////////////
6
void iniciar_usart(){
7
UCSR0B=0b00011000; //transmisin y recepcin habilitados a 8 bits
8
UCSR0C=0b00000110; //asncrono, sin bit de paridad, 1 bit de parada a 8 bits
9
UBRR0=51; //para una velocidad de 9600 baudios con un oscilador de 8Mhz
1
}
0
Para la recepcin de datos con el mdulo USART AVR.
Los datos que se reciben son de tipo caracter, cuando se va recibir un dato a travs del pin RXD se tendr que esperar a
que el bit7 del registro UCSR0A se ponga a 1, este bit indica que se ha completado la recepcin del dato, el dato recibido
es de tipo caracter char y estar en el registro UDR0, cuando se lee el dato guardndolo en alguna variable de tipo
caracter char este bit se pondr automticamente a 0, la recepcin de los datos en el ATMEL STUDIO se har en una
funcin a la que se le puede llamar como se desee, en este caso se le llamar recibe_caracter_usart().
1

2
////////////////////////////////////////////////////////////
3
///////////////////////////////////////////////
4
//recepcin de datos del mdulo USART AVR modo asncrono
5
////////////////////////////////////////////////////////////
6

7
unsigned char recibe_caracter_usart(){
8
if(UCSR0A&(1<<7)){ //si el bit7 del registro UCSR0A se ha puesto a 1
9
return UDR0; //devuelve el dato almacenado en el registro UDR0
1
}
0
else//sino
1
return 0;//retorna 0
1
}
1

2
Para la transmisin de datos con el mdulo USART AVR.

Los datos que se transmiten son de tipo caracter, cuando se va transmitir un dato a travs del pin TXD se tendr que
esperar a que el registro UDR0 donde se ponen los datos que se van a enviar est vaco, esto se hace esperando a que el
bit5 UDRE0 del registro UCSR0A se ponga a 1, este bit indica que se ha completado la transmisin de un dato, el dato
transmitido es de tipo caracter char, cuando se vuelve a cargar otro dato en el registro UDR0 este bit se pondr
automticamente a 0, la transmisin de los datos en el ATMEL STUDIO se har en una funcin a la que se le puede llamar
como se desee, en este caso se le llamar envia_caracter_usart().
1 ///////////////////////////////////////////////////////

2 ///////////////////////////////////////////////

3 //transmisin de datos del mdulo USART AVR modo asncrono

4 ///////////////////////////////////////////////

6 void envia_caracter_usart(unsigned char caracter){

7 while(!(UCSR0A&(1<<5))); // mientras el registro UDR0 est lleno espera

8 UDR0 = caracter; //cuando el el registro UDR0 est vacio se envia el caracter

9}
Para la transmisin de cadenas de caracteres con el mdulo USART AVR se puede utilizar la funcin vista
anteriormente para la transmisin de caracteres para enviar cadenas de caracteres, para ello se crear otra funcin que
se puede llamar como se desee pero en este caso se le llamar envia_cadena_usart().
1 ///////////////////////////////////////////////////////

2 //////////////////////////////////////////////

3 //transmisin de cadenas de caracteres con el mdulo USART AVR modo asncrono

4 ///////////////////////////////////////////////

6 void envia_cadena_usart(char* cadena){ //cadena de caracteres de tipo char

7 while(*cadena !=0x00){ //mientras el ltimo valor de la cadena sea diferente

8 //a el caracter nulo


9

0 envia_caracter_usart(*cadena); //transmite los caracteres de cadena

1 cadena++; //incrementa la ubicacin de los caracteres en cadena

1 //para enviar el siguiente caracter de cadena

1 }

2 }

ARCHIVO DE CABECERA PARA EL USO DEL MDULO


USART AVR EN EL ATMEL STUDIO
Se puede agrupar todas la funciones vistas anteriormente para el uso del mdulo USART AVR en el ATMEL STUDIO para el
ATMEGA88 con una Fosc=8Mhz, en forma asncrona, 8 bits, a 9600 baudios, sin bit de paridad, 1 bit de parada, en un
archivo de cabecera al que se le llamar en este caso usart.h, aunque se le puede dar el nombre que se desee, se har
uso de este archivo de cabecera en los ejemplos que se realizarn con el ATMEGA88, si se utiliza otro AVR u otra
velocidad de comunicacin es fcil hacer los cambios que se necesiten dentro del archivo usart.h, se ver algn ejemplo.
1 ///////////////////////////////////////////////////////////////////

2 ////////////////////////////////////////////////////////////////////

3 //Archivo de cabecera para el uso del mdulo USART AVR con el ATMEL STUDIO///

4 ///////////////////////////////////////////////////////////////////

5
6 #ifndef USART_H

7 #define USART_H

9 void iniciar_usart(); //funcin para iniciar el USART AVR asncrono, 8 bits, 9600 baudios,

1 //sin bit de paridad, 1 bit de parada

1 unsigned char recibe_caracter_usart(); //funcin para la recepcin de caracteres

1 void envia_caracter_usart(unsigned char); //funcin para la transmisin de caracteres

1 void envia_cadena_usart(char*); //funcin para la transmisin de cadenas de caracteres

1 /////////////////////////////////////////////

3 //inicializacin del mdulo USART AVR modo asncrono

1 //en una funcin, a 8bits,a 9600 baudios, sin bit de paridad

4 //1 bit de parada

1 /////////////////////////////////////////////////////

5 void iniciar_usart(){

1 UCSR0B=0b00011000; //transmisin y recepcin habilitados a 8 bits

6 UCSR0C=0b00000110; //asncrono, sin bit de paridad, 1 bit de parada a 8 bits

1 UBRR0=51; //para una velocidad de 9600 baudios con un oscilador de 8Mhz

7 }

1
8 ///////////////////////////////////////////////////////////

1 ///////////////////////////////////////////////

9 //recepcin de datos del mdulo USART AVR modo asncrono

2 ////////////////////////////////////////////////////////////

2 unsigned char recibe_caracter_usart(){

1 if(UCSR0A&(1<<7)){ //si el bit7 del registro UCSR0A se ha puesto a 1

2 return UDR0; //devuelve el dato almacenado en el registro UDR0

2 }

2 else//sino

3 return 0;//retorna 0

2 }

2 //////////////////////////////////////////////////////

5 ///////////////////////////////////////////////

2 //transmisin de datos del mdulo USART AVR modo asncrono

6 ///////////////////////////////////////////////

7 void envia_caracter_usart(unsigned char caracter){

2 while(!(UCSR0A&(1<<5))); // mientras el registro UDR0 est lleno espera

8 UDR0 = caracter; //cuando el el registro UDR0 est vacio se envia el caracter


2 }

3 //////////////////////////////////////////////////////

0 //////////////////////////////////////////////

3 //transmisin de cadenas de caracteres con el mdulo USART AVR modo asncrono

1 ///////////////////////////////////////////////

2 void envia_cadena_usart(char* cadena){ //cadena de caracteres de tipo char

3 while(*cadena !=0x00){ //mientras el ltimo valor de la cadena sea diferente

3 //a el caracter nulo

3 envia_caracter_usart(*cadena); //transmite los caracteres de cadena

4 cadena++; //incrementa la ubicacin de los caracteres en cadena

3 //para enviar el siguiente caracter de cadena

5 }

3 }

3 #endif /* USART_H */

3
9

9
5

6
0

USART AVR PROGRAMACIN Ejemplos en el ATMEL


STUDIO