Explora Libros electrónicos
Categorías
Explora Audiolibros
Categorías
Explora Revistas
Categorías
Explora Documentos
Categorías
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.
El 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.
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 comentó líneas 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 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 más 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.
El registro UCSR0A Registro de control y estado A del módulo USART AVR, n es reemplazado por 0.
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 ha 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 sobrescribe 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 baudios 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 cuál de los
microcontroladores esclavo ha 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.
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.
El bit7 UMSEL01 y el bit6 UMSEL00 son para elegir el modo de trabajo del módulo USART AVR, según
la siguiente tabla.
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:
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:
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:
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.
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 más 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 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.
A partir de este momento ya se puede utilizar el archivo de cabecera usart.h para realizar la
comunicación serial con el módulo USART AVR
El circuito utilizado para el USART AVR ejemplos 1 es el siguiente:
Con el pulsador del pin PB0 del AVR1 se encenderá el led del pin PC5 del AVR2, con el pulsador del pin
PB1 del AVR1 se apagará el led del pin PC5 del AVR2.
En el código para el AVR1 se tiene que hacer que al presionar el pulsador para encender el led se
transmitirá el carácter ‘e’ al AVR2, al presionar el pulsador para apagar el led se transmitirá el carácter
‘a’ al AVR2, el siguiente será el código para el AVR1.
En el código para el AVR2 se tiene que hacer que cuando reciba el carácter ‘e’ el led se encienda y
cuando reciba el carácter ‘a’ el led se apague. El siguiente será el código para el AVR2
USART AVR ejemplos 2 En este segundo ejemplo se realizará la comunicación serial entre 2
microcontroladores PIC, uno de ellos será el ATMEGA328P y el otro será el ATMEGA88, en el
ATMEGA88 se creará una variable cuyo valor aumentará en una unidad cada medio segundo, el tiempo
estará controlado por la interrupción por desborde del timer1 del ATMEGA88, cada 2 segundos se
transmitirá un carácter desde el ATMEGA88 que puede ser ‘1’, ‘2’, ‘3’ o ‘4’ al ATMEGA328P, de
acuerdo al carácter recibido por el ATMEGA328P se encenderá un led en el puerto C de este, ambos
AVR trabajarán a 8Mhz y a una velocidad de comunicación de 9600 baudios.
Para el ATMEGA328P no será necesario modificar en el archivo de cabecera usart.h dentro de la
función iniciar_usart() ya que la ubicación de los pines TXD y RXD son los mismos que para el
ATMEGA88.
El circuito utilizado para el USART AVR ejemplos 2 es el siguiente:
En el código para el ATMEGA88 se creará la variable que aumentará en una unidad cada medio
segundo, cuando aumente en cuatro unidades se transmitirá un carácter al ATMEGA328P, el código es
el siguiente:
En el código para el ATMEGA328P se encenderá un led en el puerto C dependiendo del carácter recibido
del ATMEGA88, el código para el ATMEGA328P es el siguiente:
USART AVR ejemplos 3 En este tercer ejemplo se realizará la comunicación serial entre el
microcontrolador ATMEGA88 y el ordenador utilizando el archivo de cabecera usart.h, en este caso solo
se enviará un mensaje para ser visto en el ordenador.
Se necesitará una ventana conocida como terminal donde se podrá ver lo que se transmite del
microcontrolador al ordenador, y también para ver los datos que se transmiten del ordenador al
microcontrolador.
Si se está programando en Windows XP se utilizará el hyper terminal, si se está programando en el
Windows 7 u 8 no se tendrá el hyper terminal, y habrá que buscarse algún programa que cumpla la
función del hyper terminal, en nuestro caso se está programando en Windows 8 y este no tiene el
hyper terminal, por lo que se utilizará el TERA TERM el que se puede descargar desde aquí, en la
siguiente imagen se puede ver el tera term.
Se utilizará el conversor serial-usb para la comunicación entre el ATMEGA88 y el ordenador; en el tera
term se irá a setup luego a serial port para configurar el puerto serial donde se ubica el conversor
serial-usb, normalmente lo detecta solo, también se puede establecer la comunicación serial utilizando
el visual basic, el java, el matlab y muchos más, pero para empezar se usará el tera term.
El circuito a utilizar será el siguiente, hay que ser muy cuidadoso en cuanto a las conexiones a realizar
entre el ordenador, el conversor serial-usb, la compuerta inversora, las resistencias y el
microcontrolador.
En el código realizado en el ATMEGA88 para este ejemplo se enviará un mensaje al ordenador mediante
la función enviar_cadena_usart() que se encuentra dentro del archivo de cabecera usart.h, el código
es el siguiente:
La siguiente es la imagen del mensaje visto en pantalla en el tera term
USART AVR ejemplos 4 En este cuarto ejemplo se realizará la comunicación serial entre el
microcontrolador ATMEGA88 y el ordenador utilizando el archivo de cabecera usart.h, se encenderá y
apagará un led conectado en el microcontrolador, al presionar la tecla + del ordenador se encenderá
el led, al presionar la tecla – del ordenador se apagará el led, se utilizará el TERA TERM para realizar
la comunicación.
El circuito a utilizar será el siguiente, hay que ser muy cuidadoso en cuanto a las conexiones a realizar
entre el ordenador, el conversor serial-usb, la compuerta inversora, las resistencias y el
microcontrolador.
En el código realizado en el ATMEL STUDIO se utilizará la función recibe_caracter_usart() que está
dentro de la función de cabecera usart.h para recibir el carácter transmitido por el ordenador, cuando
el carácter sea ‘+’ se encenderá el led conectado al pin PB0, cuando el carácter sea ‘-‘ se apagará el
led. El código es el siguiente:
La siguiente es la imagen del carácter enviado por el ordenador y del mensaje visto en pantalla en el
tera term, para poder ver el carácter enviado, en el tera term hay que ir a setup -> terminal y habilitar
Local echo.
Interrupción USART AVR
Interrupción USART AVR, es necesario comprender la utilización del módulo USART para la
comunicación serial del microcontrolador AVR, este es un tema que se ha tratado y se puede ver aquí,
también se han realizado algunos ejemplo sencillos sin el uso de la interrupción USART AVR que se
pueden ver aquí, de no ser así se recomienda antes de continuar revisar los enlaces indicados.
En esta sección se comenta como utilizar la interrupción USART AVR, que puede ser producida cuando
se transmite o se recibe un caracter al realizar la comunicación serial utilizando el módulo USART AVR.
La forma de trabajo del módulo USART AVR a utilizar en esta sección será en modo asíncrono, los
ejemplos serán para la comunicación serial entre el microcontrolador AVR y el ordenador, siendo la
idea la misma si se quiere realizar la comunicación serial entre microcontroladores, solo hay que estar
muy atentos a las conexiones a realizar.
Se utilizará como referencia el ATMEGA88, en caso de utilizar otro microcontrolador AVR que cuente
con un módulo USART AVR el procedimiento será muy similar, siempre hay que estar atentos a cuales
son los pines RXD y TXD del microcontrolador utilizado, los registros involucrados en la comunicación
serial y en este caso los registros involucrados en la interrupción USART AVR por ello siempre hay que
tener a mano la hoja de datos del AVR.
La programación de la interrupción USART AVR se hará en C/C++ con el ATMEL STUDIO, se utilizará
la librería interrupt.h
dato=UDR0; //al dato de tipo char se le asigna el valor del registro UDR0
//otras tareas a realizar
}
Si se utiliza la interrupción por transmisión USART AVR, la rutina de interrupción se realizará dentro
de la siguiente función:
ISR(USART_TX_vect){
UDR0 = caracter; //en el registro UDR0 se carga el caracter a transmitir
//otras tareas a realizar
}
Si se utiliza la interrupción por vaciado del registro UDR0 USART AVR, la rutina de interrupción se
realizará dentro de la siguiente función:
ISR(USART_UDRE_vect){
//tareas a realizar dentro de la rutina de interrupción por vaciado del registro UDR0
}
En el código realizado con el ATMEL STUDIO se creará una función para iniciar el módulo USART AVR,
en la rutina de atención a las interrupciones de la interrupción por transmisión del AVR, se transmitirá
al ordenador un carácter cada segundo y se deshabilitará esta interrupción, en el ciclo del programa
se cambiará el estado del led conectado al pin PB0, con la ayuda de una variable auxiliar se habilitará
el uso de la interrupción USART AVR por transmisión cada segundo y se incrementará el valor del
carácter a transmitir al ordenador mediante la interrupción.