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.