Académique Documents
Professionnel Documents
Culture Documents
8.1 INTRODUCCIÓN
Generación de Reloj
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).
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.
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.
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
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.
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.
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,
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.
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.
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:
Si se usa, el bit de paridad esta localizado entre el último bit de datos y el primer bit de
stop del frame serial.
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.
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.
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.
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.
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.
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
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
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.
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.
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
buffer de recepción ya que la localidad de lectura del buffer estará libre para aceptar un
nuevo datos tan pronto como sea posible.
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.
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.
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.
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.
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).
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.
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.
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.
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
rate deseado. En este caso un valor en UBRR que da un error bajo aceptable puede
usarse si es posible.
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
Acceso a Lectura
El siguiente código de ejemplo muestra como leer el contenido del registro UCSRC.
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
son aceptables, especialmente para frames seriales largos. Los valores de error son
calculados usando la siguiente ecuación:
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.
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.
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.
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.
UMSEL Modo
0 Operación Asíncrona
1 Operación Sincrona
0 0 Deshabilitado
0 1 Reservado
0 1 bit
1 2 bits
0 0 0 5 bits
0 0 1 6 bits
0 1 0 7 bits
0 1 1 8 bits
1 0 0 Reservado
1 0 1 Reservado
1 1 0 Reservado
1 1 1 9 bits
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.