Tema 6. Entradas/Salidas por puerto serie Comunicaciones

Anuncio
Tema 6. Entradas/Salidas por puerto serie
Comunicaciones Asíncronas (UART's)
El
receptor/transmisor
asíncrono
universal
(Universal
Asynchronous
Receiver/Transmitter, UART) es el dispositivo clave de un sistema de comunicaciones
serie. Su función principal es convertir los datos serie a paralelos cuando se trata de
datos recibidos (de entrada) y de convertir datos paralelos a serie para transmisión (de
salida). En la figura 6.3.1. se muestra el esquema general con los bloques básicos de un
UART. Se distinguen los registros de datos, tanto de recepción como de transmisión y
sus correspondientes registros de desplazamiento (RxD, TxD), los registros de control
de transmisión y recepción y señales de sincronización para comienzo de la
transmisión/recepción (RTS, CTS).
CLK
R/W
Chip
Select
D0
D1
D2
D3
D4
D5
D6
D7
D8
UART
Buffer
Bus
de
Datos
Control
Transmisión
Registro
Transmisión
de datos
Registro
de
Desplazamiento
TxD
RTS
Control Transmisión
Control Recepción
CTS
Registro
Recepción
de datos
Registro
de
Desplazamiento
RxD
Control
Recepción
Figura 6.3.1. Diagrama de bloques de un Receptor/Transmisor Asíncrono Universal
Los UART's también suministran otran funciones como las señales handshaking
necesaria para interfaces RS-232-C. Ejemplos de UART's son el MC6850 de Motorola,
llamado ACIA (Asynchronous Communication Interface Adapter) y el i8256 de Intel,
por citar los más conocidos. El M16C/60 dispone de dos UART's, cada uno con su
propio temporizador y con dos modos de operación: modo síncrono serie y modo
asíncrono serie (modo UART propiamente dicho). El M16C/62 tiene tres UART’s. En
ambos sistemas de desarrollo, siempre la UART 1 está dedicada a la comunicación del
microcontrolador con el programa monitor. No es aconsejable su uso.
Los parámetros que se han de definir para el correcto diseño de un interfaz de
comunicaciones usando un UART son los siguientes:
-
Sincronismo entre el receptor y el transmisor.
-
Codificación de los datos.
Prioridad en el envío de los bits.
Tasa de envío de datos.
Señales handshaking.
Señales eléctricas de los valores lógicos.
La sincronización en la transmisión de los datos se lleva a cabo colocando en primer
lugar un bit de comienzo (start bit), después se envían los datos (data bits) usualmente
entre 5 y 9 bits empezando siempre por el bit menos significativo, LSB, y por último, se
envía un bit de parada (stop bit). Los UART's que trabajan con 8 bits añaden un bit de
detección de error o bit de paridad. Esto se realiza secuencialmente hasta completar la
transmisión. En la figura 6.3.2. se muestra el esquema de transmisión del M16C/60.
1 o 2 B IT S
D E P A R A D A
M A R C A
L S B
M S B
7 a 9 B IT S D E D A T O S
E S P A C IO
B IT D E
C O M IE N Z O
B IT D E
P A R ID A D
Figura 6.3.2. Esquema de transmisión/recepción asincrona serie de los UART's del M16C.
La codificación puede ser cualquier código binario. El más utilizado es el código ASCII
(American Standard Code for Information Interchange) que utiliza 7 bits para codificar
96 caracteres imprimibles y 32 caracteres de control.
Los niveles eléctricos para definir valores lógicos se suelen llamar marcas (1-lógico)
(mark) y espacios (0-lógico) (space). Cuando no se realiza transmisión se mantiene el
estado de marca (llamado también estado iddle). El comienzo de la transmisión se
realiza con el estado de espacio o 0-lógico (figura 6.3.2).
La tasa de transmisión se mide en baudios o número de bits que se taransmiten por
segundo (bps). (J.M. Baudot inventó el código de 5 bits para el sistema telegráfico
francés, convirtiéndose posteriormente en un estándar de las comunicaciones
telegráficas). En principio puede ser cualquier valor, pero las tasas estándares son: 110,
150, 300, 600, 900, 1.200, 2.400, 4.800, 9.600, 14.400, 19.200, 28.800, 31.250, 38.400
y 57.800. El M16C tiene un registro generador de la tasa de bits (UiBRG) de 8 bits para
cada uno de los dos UART´s. La tasa de baudios viene dada como:
baudios =
fi
16 * (n + 1)
donde fi es la frecuencia de reloj (tanto interno como externo (pin CLKi)) y n puede ser
cualquier valor entre 0016 y FF16, que coinncide con el contenido del registro UiBRG de
8 bits (dirección de memoria 03A116 y 03A916). En la tabla 6.3.1. se muestran los
valores de n en hexadecimal para la frecuencias de reloj de 10 MHz para conseguir
algunas de las tasas estándares de transmisión.
n
Tasa de baudios (bps)
8116
4807
4016
9615
2A16
14534
2016
18939
1516
28409
1316
31250
Tabla 6.3.1. Tasa de transmisión para distintos valores de n y para una frecuencia de reloj de 10 MHz.
Inicialización de transmisión/recepción serie
El registro del modo de operación de transmisión/recepción (UiMR, i=0,1) permite
configurar a cada UART en modo de E/S serie con los bits SMD0, SMD1 y SMD2.
También se pueden seleccionar el tipo de reloj utilizado, interno o externo (pin CLKi),
la longitud de los bits de parada, la paridad y su tipo, par o impar. En la figura 6.3.3 se
muestra de forma detallada este registro.
7
UiMR
(Dirección: 03A016 a 03A816)
SLEP PRYE PRY
STPS
0
CKDIR SMD2 SMD1 SMD0
SMD2, 1, 0: Bits de selección del modo E/S serie. El modo síncrono se selecciona con 001,
y con 100,101,110 se selecciona el modo asíncrono de longitud de transferencia de
7, 8 y 9 bits,respectivamente.
CKDIR:
Bit de selección del tipo de reloj. 0 para reloj interno y 1 para reloj externo.
STPS:
Bit de selección de la longitud del bit de parada. Inválido para modo síncrono,
y para modo asíncrono 0 se refiere a 1 bit de parada y 1 a dos bits de parada.
PRYE, PRY: Bits de habilitación de paridad y tipo de paridad, respectivamente. Inválido en modo
síncrono y para modo asíncrono: 0X sin paridad, 10 paridad impar y 11 paridad par.
SLEP:
Bit de selección modo reposo (sleep). Debe ser cero para modo síncrono. En modo
asíncrono se selecciona con 1
Figura 6.3.3. Registro del modo de operación del M16C.
Consulta los manuales para ver los registros de control y leer las aplicaciones de
transmisión y de recepción.
Práctica 6.1. Transmisión UART0
Configurar UART0 para enviar datos periódicamente por la línea TxD0 (modo
transmisión asíncrono). Con la ayuda del osciloscopio se debe verificar la transmisión.
Inicialización:
mov.b #45h U0MR
mov.b #10h, U0C0
mov.b #00h, UCON
mov.b #81h, U0BRG
;modo asíncrono de transmisión, de 8 bits, con 1 bit de parada y
;paridad impar con frecuencia del reloj interno.
;f1 como reloj interno, sin función CTS/RTS, puesto que el receptor
;(osciloscopio) no envía señal de ready
;señales CTS/RTS por el mismo pin. Las demás funciones son
;inválidas.
;tasa transmisión/recepción. Para 10 MHz es 4870Hz. f1/(16(n+1)).
Activar modo transmisión:
or.b #01h, U0C1
; habilita transmisión UART0.
Se debe esperar que el buffer de transmisión esté vacío, antes de enviar el siguiente dato. Por ello, realiza
con un temporizador una espera de ¿? segundos, o bien chequear el bit de fin de transmisión de U0C1.
Transmitir el dato:
mov.b #55h, U0TB
;transmite 01010101 para facilitar su observación en el osciloscopio.
;marca(1), inico(0), LSB(1),0,1,0,1,0,1, MSB(0), paridad(1).parada (1)
Contesta a esta cuestión: ¿Es posible ver en el depurador el contenido de lo que se
transmite (contenido del registro UiTB)?
Práctica 6.2. Recepción UART0
Configurar una UART para enviar datos periódicamente por la línea TxDi (modo
transmisión asíncrono) y otra UART para recibirlos (línea RxDi). Con la ayuda del
osciloscopio se debe verificar la recepción. También, se puede usar algún dispositivo
para verificarlo (led, altavoz, motor paso a paso, display, …). Además, se puede
chequear la paridad de los datos recibidos y si ha habido errores en la
transmisión/recepción (overrun error, framing error, parity error, error-sum flag).
Nota: puentear P6_0 con P6_4 y P6_3 con P6_6 si usas UART0 para transmisión y
UART1 para recepción. Si usas otras UART comprueba las señales a puentear.
Práctica 6.3. Opcional. Generar señales handshaking para interfaces RS-232-C.
Descargar