Capitulo8. USART del ATmega32 (español)

29
__________________________________________________________________________ITSP Documento traducido de la hoja de datos del ATmega32 1 USART del AVR 8.1 INTRODUCCIÓN El Transmisor/Receptor Universal Síncrono y Asíncrono (USART) es un dispositivo altamente flexible para comunicación serial. Las principales características son: Operación Full Duplex (Registros independientes de recepción y transmisión serial). Operación Asíncrona y Sincrona. Operación sincrona Maestro-Esclavo. Generador de alta resolución de Baud rate. Soporte de frames con 5, 6, 7, 8 o 9 bits de datos y 1 o 2 bits de stop. Generación de paridad Par o Impar y Chequeo soportado por hardware. Detección de datos OverRun. Detección de framing de error. Filtrado de ruido incluid, detección de bit de inicio falso y filtro pasa-bajo ideal. Tres interrupciones separadas: Finalización de Tx, Registro de datos vacío Tx, Recepción Completa Rx. Modo de comunicación Multiprocesador. Modo de comunicación de doble velocidad Asíncrona. A continuación de muestra el diagrama a bloques del transmisor USART. Registros accesibles de I/O del CPU y pines de I/O se muestran en negritas.

description

USART del ATmega32 (español) para la materia de Microcontroladores I

Transcript of Capitulo8. USART del ATmega32 (español)

Page 1: Capitulo8. USART del ATmega32 (español)

__________________________________________________________________________ITSP

Documento traducido de la hoja de datos del ATmega32 1

USART del AVR

8.1 INTRODUCCIÓN El Transmisor/Receptor Universal Síncrono y Asíncrono (USART) es un dispositivo altamente flexible para comunicación serial. Las principales características son:

• Operación Full Duplex (Registros independientes de recepción y transmisión serial).

• Operación Asíncrona y Sincrona.

• Operación sincrona Maestro-Esclavo.

• Generador de alta resolución de Baud rate.

• Soporte de frames con 5, 6, 7, 8 o 9 bits de datos y 1 o 2 bits de stop.

• Generación de paridad Par o Impar y Chequeo soportado por hardware.

• Detección de datos OverRun.

• Detección de framing de error.

• Filtrado de ruido incluid, detección de bit de inicio falso y filtro pasa-bajo ideal.

• Tres interrupciones separadas: Finalización de Tx, Registro de datos vacío Tx, Recepción Completa Rx.

• Modo de comunicación Multiprocesador.

• Modo de comunicación de doble velocidad Asíncrona. A continuación de muestra el diagrama a bloques del transmisor USART. Registros accesibles de I/O del CPU y pines de I/O se muestran en negritas.

Page 2: Capitulo8. USART del ATmega32 (español)

__________________________________________________________________________ITSP

Documento traducido de la hoja de datos del ATmega32 2

Los recuadros punteados en el diagrama de bloques muestran las tres partes principales del USART (listadas de arriba hacia abajo): Generador de reloj, transmisor y receptor. Los registros de control son compartidos por todas las unidades. La generación de reloj lógica consiste de sincronización lógica para la entrada de reloj externa usada por la operación de esclavo sincrónica. El pin XCK (reloj de transferencia) solamente se usa para el modo de transferencia sincrónica. El transmisor consiste de un solo buffer de escritura, un registro de corrimiento serial, el generador de paridad y el control lógico para manejar los diferentes formatos de frames seriales. El buffer de escritura permite una continua transferencia de datos sin ningún retardo entre frames. El receptor es la parte más compleja del módulo USART debido a su reloj unidad de recuperación de datos. La unidad de recuperación es usada para la recepción de datos asíncronos. En resumen para la unidad de recuperación, el receptor incluye un chequeador de paridad, control lógico, un registro de corrimiento y un buffer de recepción de dos niveles (UDR). El receptor soporta el mismo formato del frame como el transmisor, y puede detectar un error de frame, y errores de paridad y de overrun de datos.

Page 3: Capitulo8. USART del ATmega32 (español)

__________________________________________________________________________ITSP

Documento traducido de la hoja de datos del ATmega32 3

Generación de Reloj La generación de reloj lógica genera la base de reloj para el transmisor y receptor. El USART soporta cuatro modos de operación de reloj: Asíncrono normal, asíncrono de doble velocidad, Modo síncrono maestro y Modo síncrono esclavo. El bit UMSEL en el registro C de control de estado del USART (UCSRC) selecciona entre operación asíncrona y sincrona. La doble velocidad (en el modo asíncrono solamente) es controlado por U2X encontrado en el registro UCSRA. Cuando se usa el modo síncrono (UMSEL = 1), el registro de dirección de datos para el pin XCK (DDR_XCK) controla si la fuente de reloj es interna (Modo Maestro) o externa (Modo Esclavo). El pin XCK esta solamente activo cuando se usa el modo síncrono. La figura siguiente muestra el diagrama a bloques de la generación de reloj lógica.

Descripción de señales: txclk Reloj transmisor (Señal interna). rxclk Reloj base del receptor (Señal interna). xcki Pin de entrada de XCK (Señal interna). Usada para operación de esclavo síncrono. xcko Salida de reloj al pin XCK (Señal interna). Usada para operación maestro síncrono. fosc Frecuencia del XTAL (Reloj del sistema). Generación del Reloj Interno – Generador de Baud Rate. La generación del reloj interno se usa para los modos de operación maestro asíncrono y síncrono. La descripción se refiere a la siguiente figura. El registro de Baud Rate USART (UBRR) y el contador de bajada conectado a su función como un preescalador programable o generador de baud rate. El contador de bajada, corriendo a la frecuencia del reloj (fosc), se carga con el valor de UBRR cada vez que el contador llega a cero o cuando el registro UBRRL se escribe. Un ciclo de reloj se genera cada vez que el contador alcanza el cero. Este ciclo es el generador de baud rate a la salida del reloj (= fosc/(UBRR+1)). El transmisor divide la salida de reloj

Page 4: Capitulo8. USART del ATmega32 (español)

__________________________________________________________________________ITSP

Documento traducido de la hoja de datos del ATmega32 4

del generador de baud rate por 2, 8 o 16 dependiendo del modo. La salida del generador de baud rate se usa directamente para el reloj del receptor y unidad de recuperación de datos. Sin embargo, la unidad de recuperación usa un estado de maquina que usa 2, 8 o 16 estados dependiendo del modo colocado por el estado de los bits UMSEL, U2X y DDR_XCK. La tabla siguiente contiene las ecuaciones para calcular el baud rate (en bits por segundo) y para calcular el valor de UBRR para cada modo de operación usando una fuente de reloj generada internamente.

BAUD Baud rate (en bits por segundo, bps). fosc Frecuencia de reloj del sistema oscilador. UBRR contiene los registros UBRRH y UBRRL, (0 - 4095). Operación de Doble Velocidad (U2X) La razón de transferencia puede ser duplicada ajustando el bit U2X en el UCSRA. Ajustando este bit solamente tiene efecto sobre la operación asíncrona. Colocar este bit a cero cuando se usa la operación sincrona. Ajustando este bit reducirá el divisor del baud rate de 16 a 8, efectivamente el doble de la razón de transferencia para la comunicación asíncrona. Sin embargo note que el receptor solamente en este caso usara la mitad del número de muestras (reduce de 16 a 8) por cada dato muestreado y el reloj de recuperación, y por consiguiente más precisión para el ajuste del baud rate y el sistema de reloj son requeridos cuando este modo se usa. Para el transmisor no existen inconvenientes. Reloj externo El reloj externo se usa para el modo de operación síncrono en esclavo. Esta descripción se refiere a la figura siguiente. La entrada de reloj externo del pin XCK es muestreada por un registro de sincronización para minimizar el cambio de la meta-estabilidad. La salida del registro de sincronización debe pasar a través de un detector de flanco antes que pueda usarse en el transmisor y receptor. Este proceso introduce dos periodos de reloj de retardo del CPU y por

Page 5: Capitulo8. USART del ATmega32 (español)

__________________________________________________________________________ITSP

Documento traducido de la hoja de datos del ATmega32 5

consiguiente la frecuencia de reloj externa máxima XCK esta limitada por la siguiente ecuación: Note que fosc depende de la estabilidad de la fuente de reloj del sistema. Es por consiguiente recomendado adicionar algún margen para evitar posibles perdidas de datos debido a variaciones de la frecuencia. Operación de reloj síncrono Cuando se usa el modo síncrono (UMSEL = 1), el pin XCK se usara ya sea como entrada de reloj (esclavo) o salida de reloj (maestro). La dependencia entre el flanco de reloj y el muestreo de datos o el cambio de datos es el mismo. El principio básico es que la entrada de datos (en RxD) es muestreada en el flanco del reloj opuesto a XCK o en el flanco de la salida de datos (TxD) cuando se cambia. El bit UCPOL de UCRSC selecciona cual transición del reloj XCK se utiliza para el muestreo de datos y cual se usa para el cambio de datos. Como se muestra en la figura siguiente, cuando UCPOL es cero el dato será cambiado en la transición de subida XCK y se muestrea en la transición de bajada XCK. Si UCPOL es puesto a uno, el dato será cambiado a la transición de bajada XCK y se muestrea en la transición de subida XCK.

Formatos del frame Un frame serial se define como un carácter de bits de datos con bits de sincronización (bits de inicio y de stop), y opcionalmente un bit de paridad para el chequeo de errores. El USART acepta todas las 30 combinaciones de los siguientes formatos de frame validos:

• 1 bit de inicio.

• 5, 6, 7, 8 o 9 bits de datos.

• Bit de paridad par, impar o ninguna.

• 1 o 2 bits de stop. Un frame inicia con el bit de inicio seguido por el bit de datos menos significativo. Y los próximos bits de datos, son sucesivos, finalizando con el bit más significativo, siendo un total de nueve. Si se habilita, el bit de paridad se le inserta después de los bits de datos,

Page 6: Capitulo8. USART del ATmega32 (español)

__________________________________________________________________________ITSP

Documento traducido de la hoja de datos del ATmega32 6

antes de los bits de stop. Cuando un frame se completa se transmite, puede seguirse directamente un nuevo frame, o la línea de comunicación puede ajustarse para permanecer en estado libre (alto). La siguiente figura ilustra las posibles combinaciones de los formatos del frame. Los bits dentro de corchetes son opcionales.

St Bit de inicio, siempre en bajo. (n) Bits de datos (0 a 8). P Bit de paridad. Puede ser impar o par. Sp Bit de Stop, siempre en alto. IDLE Ninguna transferencia en la línea de comunicación (RxD o TxD). Una línea LIBRE debe de estar en alto. El formato de frame usado por el USART es ajustado a los bits de UCSZ2:0, UPM1:0 y USBS en UCSRB y UCSRC. El receptor y el transmisor usan el mismo ajuste. Note que cuando se cambia el ajuste de estos bits se corromperá todas las comunicaciones de salida para ambos receptor y transmisor. Los bits del tamaño del carácter del USART (UCSZ2:0) seleccionan el número de bits de datos dentro del frame. Los bits del modo de paridad del USART (UCSZ2:0) seleccionan y ajustan el tipo del bit de paridad. La selección entre uno o dos bits de stop se hace por el bit de selección de bit de stop del USART (USBS). El receptor ignora el segundo bit de stop. Un error de frame (FE) solamente será detectado en los casos donde el primer bit de stop es cero. Cálculo del bit de paridad. El bit de paridad se calcula haciendo una or-exclusiva a todos los bits de datos. Si la paridad impar se usa, el resultado de la or exclusiva es ivertida. La relación entre el bit de paridad y los bits de datos es como sigue:

Peven Bit de paridad usando paridad par. Podd Bit de paridad usando la paridad impar. dn Bit de datos n del carácter. Si se usa, el bit de paridad esta localizado entre el último bit de datos y el primer bit de stop del frame serial.

Page 7: Capitulo8. USART del ATmega32 (español)

__________________________________________________________________________ITSP

Documento traducido de la hoja de datos del ATmega32 7

Inicialización del USART El USART tiene que ser inicializado antes que cualquier comunicación tome lugar. El proceso de inicialización consiste normalmente de ajustar el baud rate, el formato de frame y habilitar el transmisor o el receptor dependiendo del uso. Para una operación de interrupción que conduzca el USART, las banderas de interrupción globales deberán ser limpiadas (y las interrupciones globales deshabilitadas) cuando se realiza la inicialización. Antes de la reinicialización cuando se cambie el baud rate u el formato del frame, tenga cuidado de que no se estén usando transmisiones de salida durante el periodo que los registros se cambien. La bandera TXC puede usarse para checar si el transmisor ha completado su transferencia, y la bandera de RCX puede usarse para checar que no exista un dato sin leerse en el buffer receptor. Note que la bandera TXC debe de limpiarse antes de cada transmisión (antes que el UDR se escriba) si se usa para este propósito. El siguiente código simple de ejemplo de inicialización del USART meuestra ona función en ensamblador y una en C y son iguales en cuestión de funcionalidad. Los ejemplos asumen una operación asíncrona usando el “polling” (ninguna interrupción esta habilitada) y un formato de frame fijo. El baud rate esta dado como un parámetro en la función. Para el código ensamblador, el parámetro de baud rate se asume que se almacena en los registros r17:r16. Cuando la función escribe al registro UCSRC, el bit de URSEL (MSB) debe ser ajustado debido a que comparte la localidad de I/O de UBRRH y UCSRC. Una rutina más avanzada de inicialización puede ser que incluya el formato del frame como parámetros, la deshabilitación de las interrupciones y así sucesivamente. Sin embargo, muchas aplicaciones usan un ajuste fijo de Baud rate y los registros de control, y para este tipo de aplicaciones el código de inicialización puede ser colocado directamente en la rutina main, o estar combinada con el código de inicialización para otros módulos de I/O.

Page 8: Capitulo8. USART del ATmega32 (español)

__________________________________________________________________________ITSP

Documento traducido de la hoja de datos del ATmega32 8

Transmisión de Datos – El Transmisor del USART El transmisor del USART es habilitado ajustando el bit Habilitación de Transmisión (TXEN) en el registro UCSRB. Cuando el transmisor es habilitado, la operación normal del puerto del pin TxD es “overridden” por el USART dando la función de transmisor de salida serial. El baud rate, modo de operación y el formato del frame deben establecerse antes que inicie cualquier transmisión. Si la operación sincrona es utilizada, el reloj en el pin XCK será “overridden” y usada como transmisión del reloj. Enviando Frames de 5 a 8 bits de datos Una transmisión de datos es iniciada cargando al buffer del trasmisor con los datos a ser transmitidos. El CPU puede cargar al buffer de trasmisión con solo escribir en la localidad de I/O de UDR. Los datos almacenados en el buffer de transmisión serán movidos al registro de corrimiento cuando este registro este listo para enviar un nuevo frame. El registro de corrimiento es cargado con un nuevo dato si se encuentra en el estado libre (ninguna transmisión de salida) o inmediatamente después del último bit de stop del frame previo transmitido. Cuando el registro de corrimiento es cargado con un nuevo dato, transferirá un frame completo a una razón dada por el registro del Baud, el bit U2X o por XCK dependiendo del modo de operación.

Page 9: Capitulo8. USART del ATmega32 (español)

__________________________________________________________________________ITSP

Documento traducido de la hoja de datos del ATmega32 9

El siguiente ejemplo del código muestra una función simple de transmisión del USART en “polling” la bandera del registro de datos vacío (UDRE). Cuando se usan frames con menos de ocho bits, los bits más significantes escritos en el UDR son ignorados. El USART tiene que estar inicializado antes que la función se utilice. Para el código ensamblador, el dato a ser enviado se asume que esta almacenado en el registro R16. la función simple espera que el buffer trasmita para que quede vacío checando la bandera UDRE, antes que se cargue un nuevo dato para ser transmitido. Si la interrupción de registro de datos vacío se utiliza, la rutina de interrupción escribe el dato en el buffer transmisor.

Enviando Frames con 9 bits de datos Si los caracteres de 9 bits son usados (UCSZ = 7), el noveno bit deberá ser escrito al bit TXB8 en el UCSRB antes que el byte bajo del carácter se escriba en UDR. El siguiente código de ejemplo muestra una función para transmitir caracteres de 9 bits. Para el código en ensamblador, los datos a ser enviados se asumen que están almacenados en los registros R17:R16.

Page 10: Capitulo8. USART del ATmega32 (español)

__________________________________________________________________________ITSP

Documento traducido de la hoja de datos del ATmega32 10

El noveno bit puede usarse para indicar la dirección de un frame cuando se usa la comunicación en modo multi procesador o para otro tipo de protocolo como por ejemplo la sincronización. Bandera del Transmisor e Interrupciones El trasnmisor USART tiene dos banderas que indican u estado: Registro de Datos Vacío (UDRE) y Transmisión Completada (TXC). Ambas banderas pueden usarse para generar interrupciones. La bandera del registro de datos vacía (UDRE) indica si el buffer del transmisor esta listo para recibir nuevos datos. Este bit se pone a uno cuando el buffer del transmisor esta vacío., y se limpia cuando el buffer del transmisor contiene datos para ser transmitidos que aún no se han movido al registro de corrimiento. Por compatibilidad para dispositivos futuros, siempre escriba a este bit un cero cuando se escriba al registro UCSRA. Cuando el bit de habilitación de interrupción del registro de datos vacío (UDRIE) en el UCSRB se escriba a uno, la interrupción del registro de datos vacío del USART será ejecutada tan pronto como UDRE pase a uno (siempre y cuando las interrupciones globales estén habilitadas). UDRE se limpia escribiendo en UDR. Cuando se usa una

Page 11: Capitulo8. USART del ATmega32 (español)

__________________________________________________________________________ITSP

Documento traducido de la hoja de datos del ATmega32 11

transmisión de datos dirigida por interrupción, la rutina de interrupción de registro vacío debe ya sea escribir un nuevo dato a UDR para limpiar UDRE o deshabilitar la interrupción de datos de registro vacío, de lo contrario una nueva interrupción puede ocurrir una vez que la rutina de interrupción termine. El bit de la bandera de la transmisión completada (TXC) se coloca a uno cuando el frame entero en el registro de corrimiento de transmisión ha sido enviado serialmente y ningún dato actualmente se encuentra en el buffer de transmisión. El bit de la bandera TXC automáticamente se limpia cuando una interrupción de trasmisión completa se ejecute, o puede ser borrado escribiendo a uno en esa localidad del bit. La bandera TXC es útil para interfaces de comunicación half-duplex (como el estándar RS485), donde una transmisión debe entrar a modo de recepción y se libere el bus de comunicación inmediatamente después de completar la transmisión. Cuando el bit de habilitación de interrupción de transmisión completa en el UCSRB se ponga a uno, la interrupción de transmisión completa del USART será ejecutada cuando la bandera TXC llegue a ponerse a uno (siempre y cuando las interrupciones globales estén habilitadas). Cuando la interrupción de transmisión completa se use, la rutina de del manejo de interrupción no tiene que limpiar la bandera TXC, esto se realiza automáticamente cuando la interrupción se ejecute. Generador de Paridad El generador de paridad calcula el bit de paridad para el frame de datos serial. Cuando el bit de paridad esta habilitado (UPM1 = 1), el control lógico del transmisor inserta el bit de paridad entre el último bit de datos y el primer bit de stop del frame que se envía. Deshabilitando el Transmisor La deshabilitación del transmisor (ajustando el TXEN a cero) no llevara a cabo hasta que transmisiones de salida o pendientes se hayan completado, por ejemplo, cuando el registro de corrimiento de trasmisión y el registro del buffer de transmisión no contengan datos para ser trasmitidos. Cuando se deshabilite, el transmisor no enviara más datos pro el pin TxD. El Receptor del USART – Recepción de Datos El receptor del USAR se habilita escribiendo en el bit de habilitación de recepción (RXEN) en el registro UCSRB a uno. Cuando el receptor se habilita, la operación normal del pin de RxD es “overridden” por el USART y se comporta como receptor de serial de entrada. El Baud Rate, el modo de operación y el formato del frame deben de ajustarse antes que cualquier recepción serial se lleve a cabo. Si se usa la operación sincrona, el reloj en el pin XCK se usara como transferencia de reloj. Recibiendo frames de 5 a 8 bits de datos El receptor inicia la recepción de datos cuando detecta un bit de inicio valido. Cada bit que siga al bit de inicio será muestreado a un baud rate o al reloj XCK, y se correrá dentro del registro de corrimiento del receptor hasta que el primer bit de stop de un

Page 12: Capitulo8. USART del ATmega32 (español)

__________________________________________________________________________ITSP

Documento traducido de la hoja de datos del ATmega32 12

frame se reciba. Un segundo bit de stop será ignorado por el receptor. Cuando el primer bit de stop sea recibido, por ejemplo, un frame serial completo este presente en el registro de corrimiento del receptor, el contenido de registro de corrimiento será movido dentro del buffer del receptor. El buffer del receptor puede entonces leerse por lectura de la localidad del registro de I/O UDR. El siguiente código ejemplo muestra una función de recepción simple del USART basada en la técnica de “polling” la bandera de recepción completa (RXC). Cuando se usan frames con menos de ocho bits, los bits más significativos de datos leídos en el UDR serán enmascarados a cero. El USART tiene que ser inicializado antes que la función pueda usarse.

La función simplemente espera que el dato este presente en el buffer de recepción checando la bandera RXC antes que se de lectura al buffer, retornando el valor. Recibiendo Frames con 9 bits de datos Si se usan caracteres de 9 bits (UCSZ = 7) el noveno bit debe leerse del bit RXB8 en el UCSRB antes que se lean los bits bajos del UDR. Esta regla aplica para las banderas de estado de Error de Frame, Dato Sobrescrito y Error de Paridad (FE, DOR y PE). Lea el estado de UCSRA, entonces los datos de UDR. Leyendo la localidad de I/O de UDR cambiara el estado del buffer de recepción FIFO (Cola) y consecuentemente los bits de TXB8, FE, DOR y PE, los cuales están todos almacenados en la FIFO, y cambiaran. El siguiente ejemplo de código muestra una función simple de recepción del USART que maneja los bits de los caracteres de 9 bits los bits de estado.

Page 13: Capitulo8. USART del ATmega32 (español)

__________________________________________________________________________ITSP

Documento traducido de la hoja de datos del ATmega32 13

El ejemplo de la función de recepción lee todos los registros de I/O dentro del archivo de registros antes que cualquier cálculo se realice. Esto da una utilización optima del

Page 14: Capitulo8. USART del ATmega32 (español)

__________________________________________________________________________ITSP

Documento traducido de la hoja de datos del ATmega32 14

buffer de recepción ya que la localidad de lectura del buffer estará libre para aceptar un nuevo datos tan pronto como sea posible. Bandera de Recepción Completa e Interrupción El receptor del USART tiene una bandera que indica el estado del receptor. La bandera de recepción completa (RXC) indica si existen datos presentes sin leerse en el buffer de recepción. Esta bandera esta en uno cuando existen datos sin haberse leído en el buffer de recepción y esta en cero cuando el buffer de recepción esta vacío (por ejemplo, no contiene ningún dato sin leerse). Si el receptor esta deshabilitado (RXEN = 0), el buffer receptor será “flushed” y consecuentemente el bit RXC llega a se cero. Cuando el bit de habilitación de interrupción de recepción completa (RXCIE) en el UCSRB es puesto a uno, la interrupción de recepción completa del USART será ejecutada tan pronto como la bandera RXC se ponga a uno (siempre y cuando las interrupciones globales estén habilitadas). Cuando se usa la recepción de datos dirigida por interrupción, la rutina de recepción completa debe leer el dato recibido de UDR para limpiar la bandera de RXC, de lo contrario una nueva interrupción puede ocurrir una vez que la rutina de interrupción termina. Bandera de Error en la Recepción El receptor USART tiene tres banderas de error: Error de frame (FE), Dato Sobre escrito (DOR) y Error de Paridad (PE). Todas pueden accesarse leyendo el UCSRA. Algo similar para las banderas de Error es que ellas están localizadas juntas en el buffer de recepción con el frame para las cuales ellas indican el estado del error. Debido a que las banderas de error son almacenadas, el UCSRA deberá de leerse antes que el buffer de recepción (UDR), ya que leyendo la localidad de I/O del UDR cambia la localidad de lectura del buffer. Otra similaridad para las banderas de error es que ellas no pueden ser alteradas por software poniendo una escritura e la localidad de la bandera. Sin embargo, todas las banderas deben ponerse a cero cuando el UCSRA es escrito para incrementar la compatibilidad de futuras implementaciones del USART. Ninguna de las banderas de Error pueden generar interrupciones. La bandera de error del frame (FE) indica el estado del primer bit de stop del próximo frame legible almacenado en el buffer de recepción. La bandera de error del frame es cero cuando el bit de stop fue correctamente leído (como uno), y la bandera de error del frame será uno cuando el bit de stop haya sido incorrecto (cero). Esta bandera puede ser usada para detectar condiciones de fuera de sincronización, detectando condiciones de ruptura y manejo de protocolo. La bandera de error de frame no será afectada por los ajustes del bit USBS en el UCSRC ya que el receptor ignora todo, excepto para los primeros bits de stop. Por compatibilidad con futuros dispositivos, siempre ponga a cero este bit cuando se escriba a UCSRA. La bandera de Datos Sobre escritos (DOR) indica la perdida de datos debido a la condición de buffer de recepción lleno. Una sobre escritura de datos ocurre cuando el buffer del receptor esta lleno (dos caracteres), y esta un nuevo carácter esperando en el registro de corrimiento del receptor, y un nuevo bit de inicio es detectado. Si la bandera DOR es puesta a uno entonces hubo una o más perdidas de frames seriales entre el último frame leído del UDR y el próximo frame leído de UDR. Para compatibilidad con

Page 15: Capitulo8. USART del ATmega32 (español)

__________________________________________________________________________ITSP

Documento traducido de la hoja de datos del ATmega32 15

futuros dispositivos, siempre escriba a este bit a cero cuando escriba en UCSRA. La bandera DOR se limpia cuando el frame recibido fue exitosamente movido del registro de corrimiento al buffer de recepción. La bandera de Error de Paridad (PE) indica que el próximo frame en el buffer de recepción tuvo un error de paridad cuando se recibió. Si el chequeo de paridad no esta habilitado el bit PE siempre leerá cero. Para compatibilidad con futuros dispositivos, siempre escriba a este bit a cero cuando escriba en UCSRA. Checador de Paridad El checador de paridad esta activo cuando el bit del modo de paridad alto del USART (UPM1) es puesto a uno. El tipo de paridad será ejecutado (par o impar) al seleccionarse el bit UPM0. Cuando es habilitado, el checador d eparidad calcula la paridad de los bits de datos en frames de entrada y compara el resultado con el bit de paridad del frame serial. El resultado del chequeo es almacenado en el buffer de recepción junto con el dato recibido y los bits de stop. La bandera de Error de Paridad (EP) puede entonces ser leída por software para checar si el frame tuvo un error de paridad. El bit PE es puesto a uno en el próximo carácter que es leído del buffer de recepción que tuvo un error de paridad cuando se recibió y el checador de paridad fue habilitado en ese punto (UPM1 = 1). Este bit es valido hasta que el buffer del receptor (UDR) sea leído. Deshabilitando el Receptor En contraste con el transmisor, la deshabilitación del receptor será inmediata. Los datos de las recepciones que están en proceso serán perdidos. Cuando se deshabilita el receptor (por ejemplo, RXEN se coloca a cero) la operación de recepción no se ejecutara más en el pin del puerto de RxD. El buffer receptor FIFO será “flushed” cuando el receptor se deshabilita. El resto de los datos en el buffer serán perdidos. Flushing el Buffer del Receptor El buffer del receptor FIFO será “flushed” cuando el receptor se deshabilita, por ejemplo, el buffer vaciara su contenido. Datos no leídos serán perdidos. Si el buffer tiene que ser “flushed” durante la operación normal, debido a una condición de error, lea la localidad de I/O del UDR hasta que la bandera RxC este limpia. El siguiente código ejemplo muestra como “flush” el buffer del receptor.

Page 16: Capitulo8. USART del ATmega32 (español)

__________________________________________________________________________ITSP

Documento traducido de la hoja de datos del ATmega32 16

Recepción de Datos Asíncrono El USART incluye una recuperación de reloj y una unidad de recuperación de datos para el manejo en la recepción de datos asíncronos. La lógica de recuperación de reloj es usada para la sincronización del reloj del baud rate interno generadote los frames seriales asíncronos de entrada en el pin RxD. La lógica de recuperación de datos muestrea y pasa al filtro pasa-bajos por cada bit, mejorando la inmunidad al ruido del receptor. El rango de operación de la recepción asíncrona depende de la precisión del reloj del baud rate interno, la razón de los frames de entrada y el tamaño del frame en número de bits. Recuperación del Reloj Asíncrono La lógica de recuperación de reloj sincroniza el reloj interno con los frames seriales de entrada. La figura siguiente ilustra el proceso de muestreo del bit de inicio de un frame de entrada. La razón de muestreo es 16 veces el baud rate para el modo normal, y 8 veces el baud rate para el modo de Doble Velocidad. Las flechas horizontales ilustran la variación en la sincronización debido al proceso de muestreo. Note el tiempo de variación más largo cuando se usa el modo de doble velocidad (U2X = 1). Las muestras denotadas en cero son muestras hechas cuando la línea RxD esta libre (por ejemplo, no existe actividad en la comunicación).

Page 17: Capitulo8. USART del ATmega32 (español)

__________________________________________________________________________ITSP

Documento traducido de la hoja de datos del ATmega32 17

Cuando la unidad de recuperación del reloj detecta una transición de alto (línea libre) a bajo (inicio) en la línea RxD, la detección de la secuencia del bit de inicio comienza. La muestra 1 denota la primer muestra a cero como se muestra en la figura. La lógica de recuperación del reloj usa entonces las muestras 8, 9 y 10 para el modo normal y las muestras 4, 5 y 6 para el modo de doble velocidad (se indican con números de la muestra dentro de casillas en la figura), para decidir si el bit de inicio válido se recibió. Si dos o más de estas tres muestras tienen niveles lógicos altos, el bit de inicio se rechaza como si fuera un pico de ruido y el receptor comienza su verificación hasta la siguiente transición de alto a bajo. Sin embargo, un bit de inicio valido se detecta, la lógica de recuperación d reloj se sincroniza y el de recuperación de datos comienza. El proceso de sincronización se repite por cada bit de inicio. Recuperación de Datos Asíncrona Cuando el reloj receptor se sincroniza con el bit de inicio, la recuperación de datos comienza. La unidad de datos de recuperación usa un estado de maquina que tiene 16 estados por cada bit en el modo normal y 8 estados por cada bit en el modo de doble velocidad. La figura siguiente ilustra el muestreo de los bits de datos y el bit de paridad. Cada una de las muestras esta dada por un número que es igual al estado de la unidad de recuperación.

La decisión del nivel lógico del bit recibido se toma por una votación por mayoría de los valores lógicos de las tres muestras en el centro del bit recibido. Las muestras del centro se enfatizan en la figura por números encerrados en casillas. El proceso de mayoría de votación se realiza como sigue: si dos o de las tres muestras tiene niveles lógicos en bajo, el bit recibido se registra como un cero lógico. Este proceso de votación por mayoría actúa como un filtro pasa-bajo para señales de entrada en el pin RxD. El proceso de recuperación se repite hasta que se completa el frame recibido. Incluyendo el primer bit de stop. Note que el receptor solamente usa el primer bit de stop de un frame. La figura siguiente muestra el muestreo del bit de stop y los comienzos de un posible bit de inicio del próximo frame.

Page 18: Capitulo8. USART del ATmega32 (español)

__________________________________________________________________________ITSP

Documento traducido de la hoja de datos del ATmega32 18

La misma votación por mayoría se realiza para el bit de stop como se hace para los otros bits del frame. Si el bit de stop se registra para tener un valor de 0 lógico, la bandera de error de frame (FE) será puesta a uno. Una nueva transición de alto a bajo indica el bit de inicio de un nuevo frame que puede venir justo después de los últimos bits usados para la votación por mayoría. Para el modo normal de velocidad, la primer muestra en nivel bajo puede ser como l punto marcado (A) de la figura anterior. Para el modo de doble velocidad el primer nivel bajo deberá ser desplazado a (B). (C) marca un bit de stop de la longitud completa. Al principio de la detección del bit de inicio influye en el rango de operación del receptor. Rango Operacional Asíncrona El rango de operación del receptor depende de la diferencia entre el bit recibido y el baud rate generado internamente. Si el transmisor esta enviando frames muy rápidos o a velocidad muy baja, o el baud rate internamente generado en el receptor no es similar a la frecuencia base, el receptor no será capaz de sincronizar los frames con el bit de inicio. La siguiente ecuación puede usarse para calcular la razón de la razón de datos entrantes y el baud rate interno del receptor.

D Suma del tamaño del carácter y la paridad (D = 5 a 10 bits). S Muestras por bit. S = 16 para el modo normal de velocidad y S = 8 para el modo a doble velocidad. SF Número de la primer muestra usada por mayoría de votos. SF = 8 para valocidad ormal y SF = 4 para el modo de doble velocidad. SM Número de muestra media usada por mayoría de votos. SM = 9 para velocidad normal y SF = 4 para el modo de velocidad doble. Rslow es la razón de la razón de datos entrante más baja que puede ser aceptada en relación al baud rate del receptor. Rfast en la razón de la razón de datos entrante más alta que puede ser aceptada en relación al baud rate del receptor.

Page 19: Capitulo8. USART del ATmega32 (español)

__________________________________________________________________________ITSP

Documento traducido de la hoja de datos del ATmega32 19

Las tablas siguientes listan el máximo error de baud rate para el receptor que puede ser tolerado. Note que el modo de velocidad normal tiene una mayor tolerancia de variaciones del baud rate. Table 61. Recommended Maximum Receiver Baud Rate Error for Normal Speed Mode (U2X =0).

Table 62. Recommended Maximum Receiver Baud Rate Error for Double Speed Mode (U2X = 1)

Las recomendaciones del error máximo en el receptor del baud rate fue hecha bajo la suposición que el transmisor y receptor igualmente divide el error máximo total. Existen dos posibles fuentes para el error de baud rate en el receptor. El reloj del sistema del receptor (XTAL) siempre tiene menos inestabilidad sobre el rang de la fuente de voltaje y el rango de temperatura. Cuando se usa un cristal para generar el sistema de reloj, esto rara vez es un problema, pero para un resonador el reloj del sistema puede diferir más del 2% dependiendo de la tolerancia del resonador. La segunda fuente de reloj es más controlable. El generador de baud rate no puede siempre hacer una división exacta de la frecuencia del sistema para obtener el baud

Page 20: Capitulo8. USART del ATmega32 (español)

__________________________________________________________________________ITSP

Documento traducido de la hoja de datos del ATmega32 20

rate deseado. En este caso un valor en UBRR que da un error bajo aceptable puede usarse si es posible. Accesando a los Registros UBRRH/UCSRC Los registros UBRRH y UCSRC comparten la misma localidad de I/O. por consiguiente algunas consideraciones especiales deberán ser tomadas en cuenta cuando se accesa a esta localidad de I/O. Acceso a Escritura Cuando se realiza un acceso a escritura a esta localidad de I/O, el bit alto del valor escrito, el bit del Registro de Selección del USART (URSEL), controla cual de los dos registros será escrito. Si URSEL es cero durante una operación de escritura, el valor de UBRRH será actualizado. Si URSEL es uno, el valor de UCSRC será actualizado. El siguiente código de ejemplo muestra como accesar a los dos registros.

Como ilustra el código ejemplo, el acceso a escritura de los dos registros no se afectan al compartir la misma localidad de I/O

Page 21: Capitulo8. USART del ATmega32 (español)

__________________________________________________________________________ITSP

Documento traducido de la hoja de datos del ATmega32 21

Acceso a Lectura Al realizar la operación de acceso a lectura a los registros UBRRH y UCSRC es una operación más compleja. En la mayoría de las aplicaciones, es rara vez necesario leer cualquiera de estos registros. El acceso a lectura, se controla por una secuencia de tiempo. Leyendo la localidad de I/O una vez regresa el contenido del registro UBRRH. Si la localidad del registro fue leída en un ciclo de reloj del sistema previo, leyendo el registro en el actual ciclo de reloj retornara el contenido de UCSRC. Note que la secuencia de tiempo para la lectura de UCSRC es una operación atómica. Las interrupciones deben ser controladas (por ejemplo, deshabilitando las interrupciones globales) durante la operación de lectura. El siguiente código de ejemplo muestra como leer el contenido del registro UCSRC.

El ejemplo del código en ensamblador regresa el valor de UCSRC en r16. Leyendo el contenido de UBRRH no es una operación atómica y por consiguiente puede leerse como un registro ordinario, tan pronto como la instrucción previa no accese a la localidad del registro. Ejemplos del Ajuste del Baud Rate Para un cristal estándar y frecuencias resonadoras, el baud rate usado más común para operaciones asincronas puede ser generado usando los ajustes del UBRRH. Los valores de UBRR los cuales producen un baud rate con una diferencia de menos del 0.5% de baud rate establecido, están en negritas en la tabla. Razones de error mayores

Page 22: Capitulo8. USART del ATmega32 (español)

__________________________________________________________________________ITSP

Documento traducido de la hoja de datos del ATmega32 22

son aceptables, especialmente para frames seriales largos. Los valores de error son calculados usando la siguiente ecuación:

Page 23: Capitulo8. USART del ATmega32 (español)

__________________________________________________________________________ITSP

Documento traducido de la hoja de datos del ATmega32 23

REGISTROS DEL USART Registro de Datos de E/S del USART – UDR

El buffer de registro de datos de transmisión del USART y el buffer de registro de datos de recepción del USART comparten la misma dirección de E/S referida como Registro de Datos del USART o UDR. El buffer de registro de transmisión de datos (TXB) será el destino para los datos escritos en la localidad del registro UDR. Leyendo la localidad del registro UDR retornara el contenido del buffer de registro de datos de recepción (RXB). Para los caracteres de 5-, 6- o 7- bits los bits altos no usados serán ignorados por el transmisor y se ajustaran a cero por el receptor. El buffer de transmisión solamente se puede escribir cuando la bandera UDRE en el registro UCSRA esta en alto. Los datos escritos a UDR cuando la bandera UDRE no esta en alto, seran ignorados por el transmisor del USART. Cuando el dato se escribe al buffer de transmisión, y el transmisor es habilitado, el transmisor cargara los datos

Page 24: Capitulo8. USART del ATmega32 (español)

__________________________________________________________________________ITSP

Documento traducido de la hoja de datos del ATmega32 24

dentro del registro de corrimiento del transmisor cuando el registro de corrimiento este vacío. Entonces los datos serán serialmente transmitidos por el pin TxD. El buffer de recepción consiste de una FIFO (Fila de Primero en Entrar, Primero en Salir) de dos niveles. La FIFO cambiara su estado cuando el buffer de recepción se accesa. Debido a su conducta del buffer receptor, no use instrucciones de lectura de modificación (SBI y CBI) en esta localidad. Tenga cuidad cuando use instrucciones a bits (SBIC o SBIS), ya que estas también cambian el estado de la FIFO. Registro A de Estado y Control del USART

• Bit 7 – RXC: Recepción Completa del USART Este bit de bandera se coloca a uno cuando existen datos sin leerse en el buffer de recepción y se limpia cuando el buffer de recepción esta vacío (por ejemplo, que no contenga datos sin leerse). Si el receptor se deshabilita, el buffer del receptor será limpiado y consecuentemente el bit RXC llegara a ser cero. La bandera RXC puede usarse para generar una interrupción de recepción completa.

• Bit 6 – TXC: Transmisión Completa del USART Este bit de bandera se pone a uno cuando el marco entero en el registro de corrimiento de transmisión ha sido recorrido y no existe ningún bit actualmente presente en el buffer de transmisión (UDR). El bit de bandera TXC automáticamente se limpia cuando la interrupción de transmisión completa se ejecuta, o puede limpiarse escribiendo a uno en su localidad. La bandera TXC puede generar una interrupción completa de transmisión.

• Bit 5 – UDRE: Registro de Datos Vacío del USART La bandera UDRE indica si el buffer de transmisión (UDR) esta listo para recibir un nuevo dato. Si UDRE es uno, el buffer esta vacío, y por consiguiente listo para escribirse. La bandera UDRE puede generar una interrupción de registro de datos vacío. UDRE se pone a un después de un reset para indicar que el transmisor esta listo.

• Bit 4 – FE: Error de Frame Este bit se pone a uno si el próximo carácter en el buffer de recepción tuvo un error de marco cuando se recibió. Por ejemplo, cuando el primer bit de stop del próximo carácter es cero. Este bit es valido hasta que el buffer de recepción (UDR) se lea. El bit FE es cero cuando el bit de stop de los datos recibidos es uno. Siempre ponga a cero este bit cuando escriba a UCSRA.

• Bit 3 – DOR: Datos Sobre escritos Este bit se pone a uno si la condición de datos sobrescritos se detecta. Un dato sobrescrito ocurre cuando el buffer del receptor esta lleno (dos caracteres), y esta un nuevo carácter esperando en el registro de corrimiento del receptor, y un nuevo bit de

Page 25: Capitulo8. USART del ATmega32 (español)

__________________________________________________________________________ITSP

Documento traducido de la hoja de datos del ATmega32 25

inicio se detecta. Este bit es valido hasta que el buffer del receptor (UDR) se lea. Siempre ponga este bit a cero cuando escriba a UCSRA.

• Bit 2 – PE: Error de Paridad Este bit se pone a uno si el próximo carácter en el buffer receptor tuvo un error de paridad cuando se recibe y el chequeo de paridad esta habilitado en ese punto (UPM1 = 1). Este bit es valido hasta que el buffer del receptor se lea (UDR). Siempre ponga este bit a cero cuando escriba a UCSRA.

• Bit 1 – U2X: Doble Velocidad de Transmisión del USART Este bit solamente tiene efecto para la operación asíncrona. Escriba este bit a cero cuando se usa la operación sincrona. Escribiendo este bit a uno reducirá el divisor del baud rate de 16 a 8 doblando efectivamente la razón de transferencia para comunicación asíncrona.

• Bit 0 – MPCM: Modo de Comunicación Multi-procesador Este bit habilita el modo de comunicación multi-procesador. Cuando el bit MPCM se escribe a uno, todos los marcos de entrada recibidos por el receptor del USART que no contengan la dirección serán ignorados. El transmisor no es afectado por los ajustes de MPCM. Registro B de Estado y Control del USART

• Bit 7 – RXCIE: Habilitación de Interrupción de RX Completa Escribiendo a este bit un uno habilita la interrupción en la bandera RXC. Una interrupción de recepción completa del USART será generada solamente si el bit RXCIE esta a uno, la bandera de interrupción global en SREG en uno y el bit RXC en UCSRA a uno.

• Bit 6 – TXCIE: Habilitación de Interrupción de TX Completa Escribiendo a este bit un uno habilita la interrupción en la bandera TXC. Una interrupción de transmisión completa del USART será generada solamente si el bit TXCIE esta a uno, la bandera de interrupción global en SREG en uno y el bit TXC en UCSRA a uno.

• Bit 5 – UDRIE: Habilitación de Interrupción de Registro de Datos Vacío del USART

Escribiendo a uno este bit habilita la interrupción en la bandera UDRE. Una interrupción de registro de datos vacío será generada solamente si el bit UDRIE esta a uno, la bandera de interrupción global en SREG en uno y el bit UDRE en UCSRA a uno.

Page 26: Capitulo8. USART del ATmega32 (español)

__________________________________________________________________________ITSP

Documento traducido de la hoja de datos del ATmega32 26

• Bit 4 – RXEN: Habilitación del Receptor Escribiendo este bit a uno habilita el receptor del USART. El receptor sobrescribirá la operación normal del puerto para el pin RxD cuando se haya habilitado. Deshabilitando el receptor limpiara el buffer del receptor invalidando las banderas FE, DOR y PE.

• Bit 3 – TXEN Habilitación del Transmisor Escribiendo este bit a uno habilita el transmisor del USART. El transmisor sobrescribirá la operación normal del puerto para el pin TxD cuando se haya habilitado. Deshabilitando el transmisor (escribiendo TXEN a cero) no tendrá efecto hasta que transmisiones actuales o pendientes se completen, por ejemplo, cuando el registro de corrimiento del transmisor y el registro del buffer del transmisor no contengan datos a ser transmitidos. Cuando se deshabiliten, el transmisor no sobrescribirá mas al puerto TxD.

• Bit 2 – UCSZ2: Tamaño del Carácter Los bits UCSZ2 combinados con el bit UCSZ1:0 en UCSRC ajustan el número de bits de datos (tamaño del carácter) en un marco de uso del receptor y transmisor.

• Bit 1 – RXB8: 8vo Bit de Datos de Recepción RXB8 es el noveno bit de datos del carácter recibido cuando se operan marcos seriales con 9 bits de datos. Debe ser leído antes de la lectura de los bits bajos de UDR.

• Bit 0 – TXB8: 8vo Bit de Datos de Transmisión TXB8 es el noveno bit de datos del carácter transmitido cuando se operan marcos seriales con 9 bits de datos. Debe ser escrito antes de la escritura de los bits bajos de UDR. Registro C de Estado y Control del USART

El registro UCSRC comparte la misma localidad de E/S del Registro UBRRH.

• Bit 7 – URSEL: Registro de Selección Este bit selecciona entre accesar al registro UCSRC o el registro UBRRH. Se lee como uno cuando se lee UCSRC. El URSEL debe ser uno cuando se escribe a UCSRC.

• Bit 6 – UMSEL: Selección del Modo del USART Este bit selecciona entre el modo de operación asíncrono o síncrono.

Page 27: Capitulo8. USART del ATmega32 (español)

__________________________________________________________________________ITSP

Documento traducido de la hoja de datos del ATmega32 27

• Bits 5:4 – UPM1:0. Modo de Paridad Estos bits habilitan y ajustan el tipo de generación de paridad y chequeo. Si se habilita, el transmisor automáticamente generara y enviara la paridad de los bits de datos transmitidos dentro de cada marco. El receptor generara un valor de paridad para los datos de entrada y compararlo con los ajustes de UPM0. Si una igualdad se detecta, la bandera PE en UCSRA será puesta a uno.

• Bit 3 – USBS: Selección del Bit de Stop Este bit selecciona el número de bits de stop para ser insertados en el transmisor. El receptor ignora estos ajustes.

• Bits 2:1. Tamaño del Carácter La combinación de bits UCSZ1:0 con el bit UCSZ2 en UCSRB ajustan el número de bits de datos (tamaño del carácter) en un marco del receptor o transmisor en uso.

UMSEL Modo

0 Operación Asíncrona

1 Operación Sincrona

UPM1 UPM0 Modo de Paridad

0 0 Deshabilitado

0 1 Reservado

1 0 Paridad Par Habilitada

1 1 Paridad Impar Habilitada

USBS Bit(s) de Stop

0 1 bit

1 2 bits

UCSZ2 UCSZ1 UCSZ0 Tamaño del Caracter

0 0 0 5 bits

0 0 1 6 bits

0 1 0 7 bits

Page 28: Capitulo8. USART del ATmega32 (español)

__________________________________________________________________________ITSP

Documento traducido de la hoja de datos del ATmega32 28

• Bit 0 – UCPOL: Polaridad de Reloj Este bit se usa para el modo sincronico solamente. Escriba a este bit en cero cuando el modo asincrono se use. El bit UCPOL ajusta la relación entre el cambio de datos de salida y el muestreo de datos de entrada, y el reloj síncrono (XCK).

Registro del Baud Rate del USART – UBRRL y UBRRH

El registro comparte la misma localidad de E/S como el registro UCSRC.

• Bit 15 – URSEL: Selección de Registro Este bit selecciona entre accesar al registro UBRRH o el registro UCSRC. Se lee como cero cuando se lee UBRRH. El URSEL debe ser cero cuando se escribe a UBRRH.

• Bit 14:12 – Bits Reservados Estos bits están reservados para uso futuro. Por compatibilidad con dispositivos futuros, estos bits deben escribirse a cero cuando se escriba en UBRRH.

• Bits 11:0 – UBRR11:0. Registro del Baud Rate del USART

0 1 1 8 bits

1 0 0 Reservado

1 0 1 Reservado

1 1 0 Reservado

1 1 1 9 bits

UCPOL Datos Cambiados Transmitidos (Salida del pin TxD)

Datos Muestreados Recibidos (Entrada al pin RxD)

0 Transición Positiva XCK Transición Negativa XCK

1 Transición Negativa XCK Transición Positiva XCK

Page 29: Capitulo8. USART del ATmega32 (español)

__________________________________________________________________________ITSP

Documento traducido de la hoja de datos del ATmega32 29

Este es un registro de 12 bits el cual contiene el baud rate del USART. El UBRRH contiene los cuatro bits más significativos, y el UBRRL contiene los 8 bits menos significativos del baud rate del USART. Para transmisiones actuales para el transmisor y receptor serán corrompidas si el baud rate se cambia. Escribiendo UBRRL disparara una actualización inmediata del preescalador del baud rate.