Vous êtes sur la page 1sur 29

__________________________________________________________________________ITSP

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.

Documento traducido de la hoja de datos del ATmega32 1


__________________________________________________________________________ITSP

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.

Documento traducido de la hoja de datos del ATmega32 2


__________________________________________________________________________ITSP

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

Documento traducido de la hoja de datos del ATmega32 3


__________________________________________________________________________ITSP

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

Documento traducido de la hoja de datos del ATmega32 4


__________________________________________________________________________ITSP

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,

Documento traducido de la hoja de datos del ATmega32 5


__________________________________________________________________________ITSP

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.

Documento traducido de la hoja de datos del ATmega32 6


__________________________________________________________________________ITSP

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.

Documento traducido de la hoja de datos del ATmega32 7


__________________________________________________________________________ITSP

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.

Documento traducido de la hoja de datos del ATmega32 8


__________________________________________________________________________ITSP

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.

Documento traducido de la hoja de datos del ATmega32 9


__________________________________________________________________________ITSP

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

Documento traducido de la hoja de datos del ATmega32 10


__________________________________________________________________________ITSP

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

Documento traducido de la hoja de datos del ATmega32 11


__________________________________________________________________________ITSP

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.

Documento traducido de la hoja de datos del ATmega32 12


__________________________________________________________________________ITSP

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

Documento traducido de la hoja de datos del ATmega32 13


__________________________________________________________________________ITSP

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

Documento traducido de la hoja de datos del ATmega32 14


__________________________________________________________________________ITSP

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.

Documento traducido de la hoja de datos del ATmega32 15


__________________________________________________________________________ITSP

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).

Documento traducido de la hoja de datos del ATmega32 16


__________________________________________________________________________ITSP

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.

Documento traducido de la hoja de datos del ATmega32 17


__________________________________________________________________________ITSP

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.

Documento traducido de la hoja de datos del ATmega32 18


__________________________________________________________________________ITSP

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

Documento traducido de la hoja de datos del ATmega32 19


__________________________________________________________________________ITSP

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

Documento traducido de la hoja de datos del ATmega32 20


__________________________________________________________________________ITSP

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

Documento traducido de la hoja de datos del ATmega32 21


__________________________________________________________________________ITSP

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

Documento traducido de la hoja de datos del ATmega32 22


__________________________________________________________________________ITSP

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

Documento traducido de la hoja de datos del ATmega32 23


__________________________________________________________________________ITSP

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

Documento traducido de la hoja de datos del ATmega32 24


__________________________________________________________________________ITSP

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.

Documento traducido de la hoja de datos del ATmega32 25


__________________________________________________________________________ITSP

• 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.

Documento traducido de la hoja de datos del ATmega32 26


__________________________________________________________________________ITSP

UMSEL Modo

0 Operación Asíncrona

1 Operación Sincrona

• 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.

UPM1 UPM0 Modo de Paridad

0 0 Deshabilitado

0 1 Reservado

1 0 Paridad Par Habilitada

1 1 Paridad Impar Habilitada

• 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.

USBS Bit(s) de Stop

0 1 bit

1 2 bits

• 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.

UCSZ2 UCSZ1 UCSZ0 Tamaño del Caracter

0 0 0 5 bits

0 0 1 6 bits

0 1 0 7 bits

Documento traducido de la hoja de datos del ATmega32 27


__________________________________________________________________________ITSP

0 1 1 8 bits

1 0 0 Reservado

1 0 1 Reservado

1 1 0 Reservado

1 1 1 9 bits

• 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).

Datos Cambiados Transmitidos Datos Muestreados Recibidos


UCPOL
(Salida del pin TxD) (Entrada al pin RxD)
0 Transición Positiva XCK Transición Negativa XCK

1 Transición Negativa XCK Transición Positiva 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

Documento traducido de la hoja de datos del ATmega32 28


__________________________________________________________________________ITSP

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.

Documento traducido de la hoja de datos del ATmega32 29

Vous aimerez peut-être aussi