COMUNICACIÓN SERIAL POR LA USART Hay dos métodos para la comunicación serial de datos: síncrona y asíncrona. En el método de comunicación síncrona son enviados bloques completos (caracteres) al mismo tiempo. No se requiere ningún bit adicional (inicio, parada, paridad) para la sincronización de la trama. Los dispositivos son sincronizados por bloque. Y en la comunicación asíncrona la transmisión de datos es hecha byte por byte, es decir un byte a la vez. Hay bits adicionales para completar la trama. En la comunicación síncrona la trama consiste de bits de datos, mientras que en la comunicación asíncrona el total de número de bits en una trama puede tener más que solamente los bits de datos
Hay tres formas en la cual la comunicación serial puede hacerse: 1. Simplex: La transmisión se hace en e n una sola dirección.
2. Half duplex: La transmisión puede hacerse en ambas direcciones pero hacia un lado a la vez.
3. Full duplex: La transmisión puede hacerse en am bos sentidos simultáneamente.
El ATMEGA16 está equipado con tres diferentes clases de sistemas periféricos para la comunicación serial: -
Serial USART
-
SPI (Interfaz periférica serial)
-
TWI (Interfaz de dos hilos)
Serial USART (Universal Synchronous Asynchronous Receiver and Transmission/Transmitter) La USART proporciona comunicación full-duplex entre el transmisor y el receptor. Tiene hardware independiente para la comunicación serial localizados en el pin 14 (RXD) y el pin 15 (TXD) para la interfaz de transmisión y recepción hacia/desde el microcontrolador.
La USART del ATMEGA16 provee modo de comunicación asíncrona y no tiene una línea de reloj dedicada entre los puntos finales de transmisión y recepción. La sincronización es lograda por la apropiada configuración de la tasa de baudios, bits de inicio y parada en una secuencia de transmisión.
Tasa de baudios: En simples palabras es la velocidad en bits por segundo a la cual se transmiten los datos.
Bit de inicio y parada: Estos bits son usados para sincronizar la trama de datos. El bit de inicio es un simple bit en nivel bajo y está presente siempre al inicio de la trama indicando que los siguientes bits son los bits de datos. El bit de parada puede ser uno o dos bits en alto al final de la trama indicando el final de la misma.
La USART del ATMEGA16 tiene las siguientes características: -
Diferentes tasas de baudios.
-
Tamaño de datos variable con opciones de 5 a 9 bits de datos.
-
Uno o dos bits de parada.
-
Hardware para chequeo de paridad.
-
Configuración síncrona o asíncrona.
-
Interrupciones separadas para: recepción completa, transmisión completa y registro de datos vacío.
Registros de la USART Como en los demás módulos de trabajo se requiere configurar la USART por medio de los siguientes registros:
UCSR (USART control and status register) Este está básicamente dividido en tres partes UCSRA, UCSRB y UCSRC. i.
UCSRA
RXC (USART Receive Complete) Es un bit de bandera que se pone en 1 automáticamente cuando hay un dato en el buffer de recepción que no ha sido leído, y se pone a 0 si está vacío. TXC (USART Transmit Complete) Es un bit de bandera que se pone en 1 automáticamente cuando un dato ha sido transmitido completamente. UDRE (USART Data Register Empty) Es un bit de bandera que se pone automáticamente en 1 cuando el buffer de transmisión está vacío, indicando que está listo para recibir nuevos datos. Este es borrado cuando se escribe en el registro UDR. ii.
UCSRB
RXCIE (RX Complete Interrupt Enable) Es un bit que cuando vale 1 habilita la interrupción por recepción completa.
TXCIE (TX Complete Interrupt Enable) Es un bit que cuando vale 1 habilita la interrupción por transmisión completa.
UDRIE (USART Data Register Empty Interrupt Enable) Es un bit que cuando vale 1 habilita la interrupción por registro de datos vacío.
RXEN (Receiver Enabled) Buffer de recepción habilitado. TXEN (Transmitter Enabled) Buffer de transmisión habilitado. iii.
UCSRC
El transmisor y el receptor son configurados con las mismas características de datos que se configuran en este registro para la apropiada transmisión de datos.
URSEL (USART Register Select) Este bit debe ser puesto a 1 cuando se escribe en el UCSRC, ya que esta locación de memoria se comparte con UBRRH. UMSEL (USART Mode Select) 1 para modo síncrono y 0 para modo asíncrono. UPM[1..0] (USART Parity Mode) Como se muestra en la figura: 00 sin paridad, 10 Paridad par y 11 Paridad Impar. USBS (USART Stop Select Bit) Indica la cantidad de bits de parada: 1 para dos bits, 0 para un bit. UCSZ[2..0] (USART Caracter Size) Se combina con el bit 2 del registro UCSRB para fijar el tamaño de la trama de datos o los bits de datos. Así:
UDR (USART Data Register)
Los registros de la USART para recibir y transmitir datos comparten la misma dirección referenciada como el registro UDR. Cuando un dato es escrito al registro, este se escribe en el buffer de transmisión (TXB). Cuando un dato se recibe, este debe leerse del buffer de recepción (RXB).
UBRR (USART Baud Rate Registers) Basicamente se usan para ajustar la tasa de baudios para la USART.
El registro UBRRH comparte la misma dirección que el registro UCSRC. La diferencia se basa en el valor del bit URSEL, si es 0, el registro que se escribe es UBRRH, mientras que cuando es 1, el registro que se escribe es el UCSRC. Los registros UBRRH y UBRRL almacenan entre los dos el valor de la tasa de baudios como un dato de 12 bits que contiene los 4 bits de mayor peso en UBRRH y los 8 bits de menor peso en UBRRL. La tasa de baudios debe ser la misma en el receptor y el emisor de datos para que exista una comunicación exitosa. El valor del registro UBRR se calcula mediante la siguiente fórmula:
Ejemplo: Escriba un programa que permita mostrar en un LCD conectado al microcontrolador ATMEGA16 cualquiera de los caracteres enviados desde en computador por medio del teclado usando el puerto serial RS232. Los caracteres son enviados uno a uno. La conexión del MAX232 con el ATMEGA16 es mostrada en el circuito.
El MAX232 es usado para convertir niveles de voltaje. El pin 11 (T1IN) del MAX232 es conectado al pin 15 (TX) del microcontrolador AVR y el pin 12 (R1IN) del MAX232 es conectado al pin 14 (RX) del AVR. En el computador puede usarse el hyperterminal para enviar datos hacia el microcontrolador.
Explicación del código: Paso 1. Seleccionar la tasa de baudios. En este caso se hará con 9600 baudios. Paso 2. Calcular el correspondiente valor del registro UDRR. De acuerdo a la formula mostrada, y con el cristal de 4MHz típico, el valor será 25d = 19h ó 0x19.
Paso 3. Para inicializar la USART en el microcontrolador: 1. Habilite el hardware de transmisión y recepción. 2. Seleccione el número de bits de parada. Se usarán 2. 3. Fije el tamaño de los datos. Se usarán 8 y sin paridad. 4. Cargue el valor de UDRR.
Paso 4. Obtener los datos de la USART. Para este paso se debe monitorear el estado de la bandera RXC, este bit se hace 1 automáticamente cuando recibe la señal del bit de parada. Así que si RXC es alto significa que hay un dato en el registro UDR. Este dato debe colocarse en un registro interno o sino se pierde o se sobreescribe por otro dato. ;******************************************************************************************** ;* Descripcion: Programa de prueba con ATMEGA16 AVR RISC Processor, ;* Ejemplo de manejo de USART. ;* ;* Fecha: 30-05-2011 ;* Dispositivo: ATMEGA16 ;* Autores: Lewin Lopez ;* ;* Pin RS del LCD se conecta a PB0 ;* Pin R/W del LCD se conecta a PB1 ;* Pin E del LCD se conecta a PB2 ;* Pines D0-D7 del LCD se conecta a PORTA PA0-PA7 ;* ;* Configuración de puertos: ;* PORTA: 0xFF SALIDAS ;* PORTB: 0x0F SALIDAS ;* ;* Registros: R16 y R17 -> Retardos LCD ;* R19 -> Intermediario para comandos y/o datos al LCD ;******************************************************************************************** ;DIRECTIVAS EN ENSAMBLADOR .INCLUDE "m16def.inc" ;ATmega16 .DEVICE ATMEGA16 ;reset-vector address $0000 .ORG $0000 JMP INICIO ;va al inicio RETARDO_LCD: ;SUBTRUTINA DE RETARDO PARA LCD LDI R16, $1F CICLO0: LDI R17, $55 CICLO1: DEC R17 BRNE CICLO1 DEC R16 BRNE CICLO0
NOP NOP RET LCD_RW: ;SUBRUTINA PARA ENVIAR DATO O COMANDO AL LCD OUT PORTA, R19 ;ENVIO POR PUERTO A SBI PORTB, $02 ;PONE EN 1 PB2 (ENABLE) CALL RETARDO_LCD ;ESPERA 2 ms CBI PORTB, $02 CALL RETARDO_LCD RET ;PROGRAMA PRINCIPAL ;Cargar el puntero de pila INICIO: LDI R19,HIGH(RAMEND) OUT SPH,R19 LDI R19,LOW(RAMEND) OUT SPL,R19
;...la pila: Stack: $045F=RAMEND
;Configuracion de Puertos LDI R19,$FF OUT DDRA,R19 OUT DDRB,R19
;r16 <- $FF ;portA y portB de salida ;portB salidas
;Inicializacion de Puertos CLR R19 OUT PORTA,R19 OUT PORTB,R19 CLR R20 CBI PORTB,$00 ;Inicializacion del LCD CONF_LCD: LDI R19, $0E CALL LCD_RW LDI R19, $1C CALL LCD_RW LDI R19, $06 CALL LCD_RW LDI R19, $38 CALL LCD_RW
;Configuracion de...
;PARA ENVIAR COMANDOS
;CONTROL ON/OFF ;DESPLAZAMIENTO DEL CURSOR ;MODO DE FUNCIONAMIENTO ;MODO DE TRANSFERENCIA
;Inicializacion de la USART LDI R19, $18 OUT UCSRB, R19 LDI R19, $8E OUT UCSRC, R19 LDI R19, $19 OUT UBRRL, R19 LDI R19, $0E OUT UCSRC, R19 CLR R19 OUT UBRRH, R19 ;SE INICIA EL CURSOR AL INICIO DE LA PRIMERA LINEA Y BORRA TODO BORRAR: LDI R19, $01 CALL LCD_RW ;Lectura del buffer de recepcion CICLO: SBIC UCSRA, $07 JMP MOSTRAR JMP CICLO ;imprimir en el LCD el dato recibido MOSTRAR: IN R19, UDR CBI UCSRA, $07
SBI CALL INC CPI BRNE CBI CLR JMP
PORTB,$00 LCD_RW R20 R20,$11 CICLO PORTB,$00 R20 BORRAR
;PARA ENVIAR DATOS
Ejercicios de Clase: a) Escriba un programa que encienda un LED conectado a D7 cuando reciba una ‘P’ por el puerto serial USART y que lo apague cuando reciba una ‘a’ por el puerto serial. Cada vez que se recibe un dato este debe mostrarse en el LCD. b) Escriba un programa que si se presiona un pulsador conectado a D2 (por interrupción externa) envíe un mensaje hacia el PC por el puerto serial de la USART y luego espere por recibir una ‘W’ desde el PC para mostrar ese mismo mensaje en el LCD. Luego de 500 ms se regresa a las condiciones iniciales del programa.