USART AVR Comunicación serial


Compartir: Share on Facebook8Tweet about this on TwitterShare on Google+0Share on Tumblr1Share on LinkedIn0

USART AVR conversor serial usbUSART AVR, viene de receptor transmisor síncrono asíncrono universal, es una forma de comunicación 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 comunicación serial, en esta sección se comentará sobre la comunicación serial asíncrona utilizando el módulo USART del microcontrolador AVR, con el módulo USART AVR el microcontrolador puede comunicarse e intercambiar datos con el ordenador, con otros microcontroladores, etc.

Para la comunicación serial asíncrona entre microcontroladores y para la comunicación entre el microcontrolador y el ordenador, se necesitan 2 hilos de conducción para la transmisión y recepción de datos, y un hilo de conducción para la conexión de los comunes o GND que tienen que ser los mismos,  para la comunicación serial entre el microcontrolador y el ordenador se seguirá la norma RS232.

En la comunicación USART AVR asíncrona, uno de los hilos será para la transmisión de los datos de un dispositivo a otro y el otro hilo será para la recepción de datos entre un dispositivo a otro, la transmisión y la recepción 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 transmitirán entre ambos dispositivos.

USART AVR atmega88El microcontrolador AVR utilizado como referencia será el ATmega88, los pines de este microcontrolador que trabajan con el módulo USART AVR son el pin RXD o pin receptor y el pin TXD o pin transmisor, los que en la imagen están resaltados resaltados.

El pin RXD es el pin para la recepción de datos.

El pin TXD es el pin para la transmisión 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 también tienen que estar conectados entres si.

Los niveles de tensión con los que trabajan los pines del módulo USART AVR son de 0V y 5V un bajo será 0V mientras que un alto será 5V, por eso cuando la comunicación es entre microcontroladores la conexión entre pines se puede hacer directamente, pero cuando la comunicación es entre el microcontrolador y un ordenador la conexión entre pines tiene que hacerse a través de un conversor de nivel como el MAX232, ya que los niveles de tensión para la comunicación serial del ordenador son mayores que para el AVR típicamente entre -12V y 12V, además de trabajar con lógica negativa, esto es para el ordenador un bajo será 12V mientras un alto será -12V.

usart avr comunicación

Hay otra manera de conectar el AVR con el ordenador para la comunicación serial mediante resistencias y la compuerta inversora tipo Schmitt 74HC14 como se ve en la siguiente imagen.

usart avr comunicacion con inversor

El socket donde se conectará el AVR con el ordenador para la comunicación serial es del tipo DB9 y se conoce como puerto serie, pero resulta que este tipo de puerto ya no viene en los ordenadores portátiles que son los que hoy en día la mayoría utiliza, lo que traen ahora son puertos USB, por lo que para realizar la comunicación serial con el módulo USART AVR será necesario la utilización de un conversor SERIE-USB como el que se muestra en la siguiente imagen.

Usart avr conversor serie-usbEl conector DB9 es el que se utiliza para la comunicación serial con el módulo USART AVR, este conector consta de de 9 pines, los hay  hembra y macho, de este conector solo se utilizarán 3 pines, uno para el pin RX, otro para el pin TX y el otro para el tierra, estos pines tiene una numeración que hay que respetar.

usart avr conectores DB9 hembra macho

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 través 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 módulo 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 través 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 través 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 común del conector DB9 macho que viene del ordenador, se conectará al pin GND del microcontrolador AVR.

Las conexiones del módulo USART AVR con el ordenador a través de la compuerta inversora y las resistencias, con el uso del conversor serie-USB será como se indica en la siguiente imagen.

usart avr conexion con ordenador con conversor serie USB

USART AVR PROGRAMACIÓN

Para programar el módulo 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 módulo USART, el ATmega88 sólo tiene uno y en este caso n será 0 n=0, y será lo que se utilice en la descripción 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 también se encontrará el caracter recibido, tiene esta doble función, n es reemplazado por 0.

usart avr udr0

El registro UCSR0A Registro de control y estado A del módulo USART AVR, n es reemplazado por 0.

USART AVR UCSR0A

El bit7 RXC0 Este bit se pone a 1 automáticamente cuando se ha completado la recepción de algún dato en el registro UDR0, se pondrá a 0 automáticamente cuando se haya leído el dato, si se a habilitado el uso de la interrupción por recepción del módulo USART AVR, este bit se utiliza para detectar la interrupción.

El bit6 TXC0 Este bit se pone a 1 automáticamente cuando se ha completado la transmisión de algún dato que se encontraba en el registro UDR0, se pondrá a 0 automáticamente cuando se cargue otro dato en el registro UDR0 a ser transmitido, si se a habilitado el uso de la interrupción por transmisión del módulo USART AVR, este bit se utiliza para detectar la interrupción.

El bit5 UDRE0 Este bit al ponerse a 1 en forma automática indica que el registro UDR0 está vacío por lo que se le podrá cargar con algún dato. Cuando se cargue con algún valor el registro UDR0 este bit se pondrá automáticamente a 0. Se puede habilitar la interrupción por detección de que el registro UDCR0 está vacío y este bit será el que indique esa interrupción.

El bit4 FE0 Este bit se pondrá a 1 automáticamente cuando hay un error en la recepción de algún 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 algún dato.

El bit3 DOR0 Este bit se pondrá a 1 automáticamente cuando se sobreescribe algún dato del registro UDR0 que no haya sido leído, se pondrá a 0 automáticamente cuando se lea el dato, se recomiendo poner este bit a 0 antes de recibir algún dato.

El bit2 UPE0 Este bit se pondrá a 1 automáticamente cuando se produce un error de paridad en la recepción de algún dato, se pondrá a 0 automáticamente cuando se lea el dato, se recomiendo poner este bit a 0 antes de recibir algún 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 comunicación 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 síncrono y es para detectar cual de los microcontroladores esclavo a sido elegido. en modo asíncrono se pondrá a 0.

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

USART AVR UCSR0B

El bit7 RXCIE0 Al poner este bit a 1 se habilita el uso de la interrupción USART AVR por recepción.

El bit6 TXCIE0 Al poner este bit a 1 se habilita el uso de la interrupción USART AVR por transmisión.

El bit5 UDRIE0 Al poner este bit a 1 se habilita el uso de la interrupción USART AVR la detección de que el registro UDR0 se quedó vacío.

El bit4 RXEN0 Al poner este bit a 1 se habilita el uso del pin RXD para la recepción del módulo USART AVR. Se habilita es uso de la recepción.

El bit3 TXEN0 Al poner este bit a 1 se habilita el uso del pin TXD para la transmisión del módulo USART AVR. Se habilita es uso de la transmisión.

El bit2 UCSZ02 Este bit junto con los bits 2 y 1 del registro UCSR0C son para elegir de cuantos bits serán los datos a recibir o transmitir en la comunicación serial.

El bit1 RXB80 Si se elige la comunicación serial a 9 bits, este será el noveno bit en la recepción del dato.

El bit0 TXB80 Si se elige la comunicación serial a 9 bits, este será el noveno bit en la transmisión del dato.

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

USART AVR UCSR0C

El bit7 UMSEL01 y el bit6 UMSEL00 son para elegir el modo de trabajo del módulo USART AVR, según la siguiente tabla.

USART AVR UMSEL

Se verá el modo asíncrono por lo que las combinaciones de estos bits serán 00.

El bit5 UPM01 y el bit4 UPM00 son para elegir si se utilizará o no algún bit de paridad para la detección de errores según la siguiente tabla:

USART AVR UPM

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

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

USART AVR USBS

El bit2 UCSZ01 y el bit1 UCSZ00 junto con el bit2 UCSZ02 del registro UCSR0B son para elegir de cuantos bits serán los datos a recibir o transmitir en la comunicación serial, según la siguiente tabla:

USART AVR UCSZ

El bit0 UCPOL0 Este bit es utilizado en el bit síncrono, en el modo asíncrono 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 transmisión de los datos, esto es los baudios o la cantidad de bits por segundo que se enviarán en la comunicación serial con el módulo USART AVR, trabaja junto con el bit U2X0 del registro UCSR0A.

El valor a cargar en el registro UBRR se calcula con las siguientes fórmulas que dependerán de la velocidad elegida con el bit U2X0, de la frecuencia del oscilador utilizado y de si la comunicación será síncrona o asíncrona.

USART AVR UBRR

Los ejemplos que se harán serán para la transmisión asíncrona en el modo normal por lo que la fórmula que se utilizará será:

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

Es importante recordar que la velocidad en baudios de los dispositivos que se estén comunicando tienen que ser iguales, la mas común es la de 9600 baudios, si en la fórmula 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 síncrono y asíncrono dependiendo de la frecuencia del oscilador utilizado y de la velocidad elegida.

USART AVR UBRR tabla

USART AVR PROGRAMACIÓN en el ATMEL STUDIO

Para la programación del módulo USART AVR en el ATMEL STUDIO, en este caso se comentará como se puede proceder para utilizar el módulo USART AVR en modo asíncrono  del ATmega88, lo aquí comentado es muy similar para otros microcontroladores AVR.

Para iniciar el módulo USART AVR.

Los pines del ATmega88 para el manejo del módulo USART AVR son el pin PD0 para la recepción de datos por lo que en este caso se le llama pin RXD, y el pin PD1 para la transmisión de datos, en este caso se le llama pin TXD.

Configuración del registro UCSR0A Todos los bits de este registro se pondrán a 0 ya que a excepción del bit bit1 U2X0 y el  bit0 todos los demás bits trabajan en forma automática, 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 asíncrono.

Luego en la inicialización del módulo USART AVR el registro UCSR0A en el ATMEL STUDIO quedará así:

UCSR0A=0b00000000;// velocidad normal

Configuración del registro UCSR0B no se utilizarán interrupciones, se habilitarán los pines RXD y TXD para la comunicación serial y la comunicación será a 8 bits

El bit7 se pondrá a 0 porque no usará la interrupción USART AVR por recepción.

El bit6 se pondrá a 0 porque no usará la interrupción USART AVR por transmisión.

El bit5 se pondrá a 0 porque no usará la interrupción USART AVR la detección de que el registro UDR0 se quedó vacío.

El bit4 se pondrá este bit a 1 para habilitar el uso del pin RXD en la recepción del módulo USART AVR. Se habilita es uso de la recepción.

El bit3 se pondrá este bit a 1 para habilitar el uso del pin TXD para la transmisión del módulo USART AVR. Se habilita es uso de la transmisión.

El bit2 Este bit junto con los bits 2 y 1 del registro UCSR0C son para elegir de cuantos bits serán los datos a recibir o transmitir en la comunicación serial, se utilizará la comunicación 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 recepción del dato, si la comunicación es a 9 bits.

El bit0 se  pone a 0 ya que este bit será el noveno bit en la transmisión del dato, si la comunicación es a 9 bits.

Luego en la inicialización del módulo USART AVR el registro UCSR0B en el ATMEL STUDIO quedará así:

UCSR0B=0b00011000;//transmisión y recepción habilitados a 8 bits

Configuración del registro UCSR0C se elegirá el modo asíncrono, sin bit de paridad, un bit de parada

Los bits 7 y 6 se ponen a 0 para elegir el modo asíncrono del módulo 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 comunicación serial será a 8 bits.

El bit0 Este bit es utilizado en el bit síncrono, en el modo asíncrono se pondrá a 0.

Luego en la inicialización del módulo USART AVR el registro UCSR0B en el ATMEL STUDIO quedará así:

UCSR0C=0b00000110;//asíncrono, 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 comunicación serial, como será a velocidad normal por lo que el bit U2X0 del registro UCSR0A se puso a 0 y en forma asíncrona, se utilizará la fórmula.

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

Al despejar se tendrá

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

En los ejemplos que se harán 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 módulo USART AVR en el ATMEL STDIO de la siguiente manera:

La inicialización podría hacerse dentro de una función a la que se le puede dar el nombre que se quiera, en este caso se la llamará iniciar_usart(), además 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í:

Para la recepción de datos con el módulo USART AVR.

Los datos que se reciben son de tipo caracter, cuando se va recibir un dato a través 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 recepción del dato, el dato recibido es de tipo caracter char y estará en el registro UDR0, cuando se lee el dato guardándolo en alguna variable de tipo caracter char este bit se pondrá automáticamente a 0, la recepción de los datos en el ATMEL STUDIO se hará en una función a la que se le puede llamar como se desee, en este caso se le llamará recibe_caracter_usart().

Para la transmisión de datos con el módulo USART AVR.

Los datos que se transmiten son de tipo caracter, cuando se va transmitir un dato a través del pin TXD se tendrá que esperar a que el registro UDR0 donde se ponen los datos que se van a enviar esté vacío, esto se hace esperando a que el bit5 UDRE0 del registro UCSR0A se ponga a 1, este bit indica que se ha completado la transmisión 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á automáticamente a 0, la transmisión de los datos en el ATMEL STUDIO se hará en una función a la que se le puede llamar como se desee, en este caso se le llamará envia_caracter_usart().

Para la transmisión de cadenas de caracteres con el módulo USART AVR se puede utilizar la función vista anteriormente para la transmisión de caracteres para enviar cadenas de caracteres, para ello se creará otra función que se puede llamar  como se desee pero en este caso se le llamará envia_cadena_usart().

ARCHIVO DE CABECERA PARA EL USO DEL MÓDULO USART AVR EN EL ATMEL STUDIO

Se puede agrupar todas la funciones vistas anteriormente para el uso del módulo USART AVR en el ATMEL STUDIO para el ATMEGA88 con una Fosc=8Mhz, en forma asíncrona, 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 realizarán con el ATMEGA88, si se utiliza otro AVR u otra velocidad de comunicación es fácil hacer los cambios que se necesiten dentro del archivo usart.h, se verá algún ejemplo.

USART AVR PROGRAMACIÓN Ejemplos en el ATMEL STUDIO

Para ver los ejemplos del manejo del módulo USART AVR visitar este enlace.

Si he podido ayudarte con el uso del módulo USART AVR, comparte este enlace para poder ayudar a muchas personas mas. Muchas Gracias.

Atte: MrElberni.

Compartir: Share on Facebook8Tweet about this on TwitterShare on Google+0Share on Tumblr1Share on LinkedIn0