10- Comunicación Serial 10 COMUNICACIÓN SERIAL Una característica importante en todo microcontrolador es la capacidad de poder comunicarse con otros componentes (memorias, convertidores, RTC, etc) o con otros dispositivos (computadora personal, u otros microcontroladores). Los PIC32MX poseen varios módulos de comunicación serial diseñados para permitir la comunicación del microcontrolador con otros componentes o dispositivos esternos. El PIC32MX534F064H posee: • 6 módulos para comunicación serial asíncrona UART (Universal Asynchronous Receiver and Transmitter). • 3 módulos para comunicación serial síncrona SPI (Serial Peripheral Interface). • 4 módulos para comunicación serial síncrona I2C (Inter-Integrated Circuit). • 1 módulo para comunicación CAN (Controller Area Network). • 1 módulo para comunicación USB OTG (Universal Serial bus On-the-go). La diferencia principal entre una interface síncrona (como SPI o I2C) y una asícrona (como UART, CAN o USB) es la forma en la que la información de sincronización es pasada del transmisor al receptor. Los periféricos síncronos necesitan una línea física (un cable) dedicada a la señal de reloj, proporcionando la sincronización entre los dos dispositivos. Los periférico asíncronos no usan una señal de reloj, la información de sincronización es extraida de los mismos datos. Se agregan bit de inicio y de parada, además de un formato preciso a una tasa de transferencia fija. Ing. Juan Ramon Terven Salinas 152 10- Comunicación Serial UART El módulo UART de la siglas en Ingles Universal Asynchronous Receiver Transmitter permite comunicación serial asíncrona full-duplex con otros dispositivos, o componentes tales como computadoras, convertidores, módulos inalámbricos, etc. Las caracteristicas principales del módulo UART son: • • • • • • • • • • Transmisión Full-duplex de 8- o 9-bits a través de los pines UxTX and UxRX. Opciones de paridad Par, Impar o Sin paridad para datos de 8 bits. Uno o dos bits de parada (Stop bits). Detección automática de la tasa de baudios. Un generador de baudios integrado con prescaler de 16 bits. Tasas de transferencia de desde 76 bps hasta 20 Mbps a 80 MHz. Detección de errors de paridad y desbordamiento de buffer. Soporte para modo de 9 bits con detección de dirección (bit 9 en 1). Interrupciones de transmission y recepción. Modo de circuito cerrado (Loopback) para diagnóstico y depuración. La Figura 10-1 muestra el diagrama simplificado del UART, el cual consiste de los siguientes elementos principales: • • • Generador de Baudios Transmisor Asíncrono Receptor Asíncrono Figura 10-1. Diagrama de bloques simplificado (tomado de[12] ). Ing. Juan Ramon Terven Salinas 153 10- Comunicación Serial Protocolo serial RS-232 Un uso común que se le da al módulo UART es comunicar el microcontrolador con una computadora usando el puerto serie. El protocolo RS-232 es el que usa el Puerto Serie de la computadora. Este puerto ha sido una parte integral de todas las computadoras por más de 20 años. A pesar de que muchos sistemas nuevos han abandonado el puerto serie completamente y adoptado conexiones por USB, el puerto serie sigue siendo usado en la industria, en los equipos de instrumentación y en módulos embebidos, debido a su sencillez en comparación con protocolos seriales modernos como el USB o el IEEE1394. En el protocolo RS-232, el dispositivo a conectar es llamado DCE (Data Communication Equipment) y la computadora es llamada DTE (Data Terminal Equipment). Todos los sistemas operativos en uso hoy en día suportan los puertos serie, porque estos puertos se han usado por décadas. El término "serial" viene del hecho de que el puerto serie "serializa" los datos. Esto quiere decir que toma un byte de datos y transmite un bit a la vez. La ventaja del puerto serie es que necesita únicamente 1 solo cable para transmitir los 8 bits (mientras que un puerto paralelo necesita 8). La desventaja es que dura 8 veces más para transmitir el dato que si tuviéramos 8 cables. En el protocolo RS-232, antes de cada byte de información, se envia un bit de Start, el cual es un bit con valor de 0, después se envía el octeto y finalmente se envía un bit de Stop para indicar que el byte ha sido completado como se muestra en la Figura 10-2. Algunas veces también se manda un bit de paridad para verificación de errores. Figura 10-2. Serialización de un byte Ing. Juan Ramon Terven Salinas 154 10- Comunicación Serial El conector serial El conector externo para un puerto serie puede ser de 9 o de 25 pines (Figura 10-3). Originalmente el uso de un puerto serie era para conectar un modem a la computadora. La asignación de los pines refleja esta conexión como se muestra en la Tabla 10-1 y Tabla 10-2. Comúnmente se usa un conector DB9 hembra para conectarlo en el conector serial DB9 macho que poseen las computadoras. Figura 10-3. Conector Serie Tabla 10-1. Conector de 9 pines PIN ABREV. NOMBRE 1 CD Carrier Detect 2 RD Receive Data 3 4 TD DTR 5 6 SG DSR Transmit Data Data Terminal Ready Signal Ground Data Set Ready 7 RTS Request To Send 8 CTS Clear To Send 9 RI Ring Indicator Ing. Juan Ramon Terven Salinas FUNCIONAMIENTO Determina si el modem está conectado a una línea telefónica en funcionamiento. La computadora recibe la información enviada por el modem. La computadora envía información al modem. Esta señal le dice al MODEM que el UART está listo para establecer una conexión. Tierra Esta señal le dice al UART que el MODEM está listo para establecer una conexión. Esta línea le informa al MODEM que el UART está listo para intercambiar datos. Esta línea indica que el MODEM está listo para intercambiar datos. Una vez que una llamada ha tomado lugar, la computadora reconoce por esta señal (enviada por el modem) que una llamada es detectada. 155 10- Comunicación Serial Tabla 10-2. Conector de 25 pines PIN ABREV. NOMBRE 1 2 3 TD RD No utilizado Transmit Data Receive Data 4 RTS Request To Send 5 CTS Clear To Send 6 DSR Data Set Ready 7 8 SG CD Signal Ground Carrier Detect 9-19 20 21 22 DTR RI 23-25 No utilizado Data Terminal Ready No utilizado Ring Indicator FUNCIONAMIENTO La computadora envía información al modem. La computadora recibe la información enviada por el modem. Esta línea le informa al MODEM que el UART está listo para intercambiar datos. Esta línea indica que el MODEM está listo para intercambiar datos. Esta señal le dice al UART que el MODEM está listo para establecer una conexión. Tierra Determina si el modem está conectado a una línea telefónica en funcionamiento. Esta señal le dice al MODEM que el UART está listo para establecer una conexión. Una vez que una llamada ha tomado lugar, la computadora reconoce por esta señal (enviada por el modem) que una llamada es detectada. No utilizado Control de Flujo Un aspecto importante de la comunicación serial es el concepto de control de flujo. Esta es la capacidad de sincronización entre transmisor y receptor con la finalidad de que el receptor no se sature. Existe el control de flujo por software y control de flujo por hardware. Imagine un MODEM que se comunica a 56Kbps con la red, y la conexión serial entre la computadora y el modem es de a 115Kbps, el cual es mas del doble de rápido que lo que el MODEM puede transmitir hacia la red. Esto significa que el modem está recibiendo más información de la computadora que la que puede transmitir por la línea telefónica. Aun si el modem tuviera un buffer grande para almacenar datos, este rápidamente se llenaría y sería incapaz de funcionar correctamente con toda la información recibiendo de la computadora. Esta es una aplicación clásica donde se requiere control de flujo. Imagine otra aplicación en donde se tiene conectado un PIC32MX a una computadora con el sistema operativo Windows® y se está realizando una comunicación serial de alta velocidad (por ejemplo 20 MHz), el SO Windows es multitarea y debido a esto sus aplicaciones pueden experimentar largos retardos provocando pérdidas de datos enviados por el PIC32MX. Aquí también necesitamos un control de flujo. Ing. Juan Ramon Terven Salinas 156 10- Comunicación Serial Control de Flujo por Software Algunas veces llamado Xon/Xoff, usa dos caracteres Xon y Xoff. El carácter Xon comúnmente es el ASCII17 y el carácter ASCII 19 es el Xoff. Cuando la computadora llena el buffer del MODEM, este envía el carácter Xoff indicandole a la computadora que deje de enviar datos. Una vez que el MODEM tiene espacio para más datos envía el carácter Xon y la computadora reanuda el envio de datos. Este tipo de control de flujo tiene la ventaja de que no requiere más cables, ya que los caracteres Xon y Xoff son enviados por las líneas TD/RD. La desventaja de este control de flujo es que tenemos que enviar más datos haciendo la transmisión más lenta. Control de Flujo por Hardware También llamado Control de flujo RTS/CTS. Usa dos cables más en la conexión, los pines RTS y CTS. Cuando la computadora desea enviar datos activa la línea RTS (Request to send), si el MODEM tiene espacio para los datos, contesta activando CTS (Clear to send) y la computadora comienza a enviar datos. Si el MODEM ya no tiene espacio entonces desactiva la línea CTS. Ing. Juan Ramon Terven Salinas 157 10- Comunicación Serial Conexión de MODEM nulo La conexión de MODEM nulo se usa para conectar dos DTEs, proporciona una manera económica de conectar dos computadoras o bien una computadora con un dispositivo Embedded, en nuestro caso un PIC32MX a la computadora. Figura 10-4. Conexión Modem nulo La conexión de MODEM nulo mostrada en la Figura 10-4 solo requiere de 3 cables: 1. Transmit Data (Transmisión) 2. Receive Data (Recepción) 3. Signal Ground (Tierra) La teoría de funcionamiento es sencilla, la meta consiste en hacer que la computadora piense que está “hablando” con un MODEM, en lugar de con otra computadora. Todo dato transmitido de una computadora debe ser recibido por la otra, de tal forma que TD está conectado con RD en ambas computadoras, la señal de tierra también debe estar unida entre ambas. El pin Data Terminal Ready está interconectado con el pin Data Set Ready y con Carrier Detect en ambos extremos. De tal forma que cuando el pin Data Terminal Ready se active, entonces Data Set Ready y Carrier Detect se activarán inmediatamente. En este punto, la computadora “piensa” que el “MODEM” al cual está conectada está listo y ha detectado la portadora de la línea telefónica. Ing. Juan Ramon Terven Salinas 158 10- Comunicación Serial Los pines que quedan son Request to Send y Clear To Send. Como ambas computadoras se comunican a la misma velocidad, el control de flujo no es necesario de tal forma que estos dos pines están también interconectados. Cuando la computadora desea enviar datos, envía la señal Request To Send y esta misma señal es atrapada en el pin Clear To Send de tal forma que siempre obtiene la respuesta del “MODEM” que está listo para recibir datos. Note que el pin Ring Indicador no está conectado a nada. Esta línea solo se usa para decirle a la computadora que hay una señal en la línea telefónica, pero como no tenemos un MODEM conectado a la línea telefónica, lo dejamos desconectado. Conexión del PIC32MX con una computadora por puerto serie La conexión de MODEM nulo la podemos usar para conectar el PIC32 con una computadora. El modulo UART del PIC32 usa el formato non-return-to-zero (NRZ) (donde un nivel TTL alto indica un “1” y un nivel TTL bajo indica un “0”, vea Figura 10-5) con un bit de Start, ocho o nueve bits de datos y uno o dos bits de Stop (el modo más comun es 8 bits, sin paridad, 1 bit de Stop denotado como 8,N,1, el cual es el modo predeterminado al Reset). Figura 10-5. Formato tipo NRZ (tomada de [25] ). Sin embargo todos los pines del puerto serie de la computadora usa niveles RS-232, en los cuales un voltaje de +3 a +25 indican un “0” (espacio) y de -3 a -25 volts indican un “1” (marca). Cualquier voltaje entre -3 y 3 volts es un bit indefinido. Debido a esto es necesario un Convertidor de niveles RS-232. Ing. Juan Ramon Terven Salinas 159 10- Comunicación Serial Convertir de niveles RS-232 Uno de los convertidores mas comunes es el MAX3232, este convertidor convierte niveles de TTL a niveles RS-232 y viceversa. Incluye 2 receptores y 2 transmisores en el mismo encapsulado. Existen muchas variaciones de este convertidor dispositivo inclusive algunos con capacitores internos. En la Figura 10-6 se muestra el diagrama de pines de un MAX3232 y una vista interna de los componentes que lo conforman, además de los componentes externos que debe tener. Figura 10-6. MAX3232 Ing. Juan Ramon Terven Salinas 160 10- Comunicación Serial Usando el MAX 232 y control de flujo por hardware, el diagrama de conexión sería como el de la Figura 10-7. Figura 10-7. Conexion del dsPIC con la computadora Ing. Juan Ramon Terven Salinas 161 10- Comunicación Serial Generador de Baudios Regresando al módulo UART, el generador de Baudios controla la velocidad de transmisión o recepción de los datos. Por medio del registro UxBRG controlamos la tasa de baudios (bits por segundo). Los PIC32MX manejan 2 velocidades: Baja (bit BRGH=0) y Alta (bit BRGH=1). El bit BRGH se encuentra en el registro UxMODE. La Figura 10-8 muestra la fórmula para calcular el valor de UxBRG para una determinada tasa de transferencia en baja velocidad. Figura 10-8. Formula para calcular la tasa de baudios en baja velocidad (BRGH=0) [12] La Figura 10-9 muestra la fórmula para calcular el valor de UxBRG para una determinada tasa de transferencia para alta velocidad. Figura 10-9. Formula para calcular la tasa de baudios en alta velocidad (BRGH=0) [12] Ing. Juan Ramon Terven Salinas 162 10- Comunicación Serial Por ejemplo: Se desea una tasa de transferencia de 9600 bits/seg trabajando con una FPB de 80 MHz. Baud Rate = 9600 FPB = 80 x106 Como se trata de una velocidad muy lenta, usamos las fórmulas de la Figura 10-8. 1. Primero calculamos el valor de UxBRG: UxBRG = 80 ×10 6 − 1 = 519.83 ≈ 520 16 ⋅ 9600 2. Como no dio exacto y solamente podemos usar valores enteros, calculamos el error: Con 520 en UxBRG la tasa de transferencia es: BaudRate = El Error en % se define como Entonces el error es E = 80 × 10 6 = 9596.93 16 ⋅ (520 + 1) TasaCalculada − TasaDeseada ×100 TasaDeseada 9596.92 − 9600 × 100 = 0.03% 9600 El protocolo RS-232 tiene una tolerancia de ± 2% , por lo tanto, el valor obtenido de 520 para el UxBRG es adecuado. Ing. Juan Ramon Terven Salinas 163 10- Comunicación Serial Ejemplo 1. Comunicación Serial Para el siguiente ejemplo se usó una librería llamada uartP32.h la cual proporciona varias funciones útiles para implementar comunicación serial. El siguiente ejemplo muestra el uso de todas las funciones de la librería uartP32. Este ejemplo está hecho para ser probado usando la Hyperminal. Programa 10-1. Ejemplo de transmisión serial /***************************************************************** * DEMOSTRACIÓN DE COMUNICACIÓN SERIAL USANDO UART * REALIZA UNA COMUNICACIÓN SERIAL A 9600 BPS *****************************************************************/ #include <p32xxxx.h> #include "../librerias/retardos/retardos.h" #include "../librerias/uart/uartP32.h" //Bits de configuracion #pragma config POSCMOD = HS, FNOSC = PRIPLL, FPLLMUL = MUL_20 #pragma config FPLLIDIV = DIV_2, FPLLODIV = DIV_1 #pragma config FPBDIV = DIV_1, FWDTEN = OFF, UPLLEN = ON #pragma config UPLLIDIV = DIV_2, FVBUSONIO = ON, FUSBIDIO = ON #pragma config FSOSCEN = OFF, CP = OFF, FCKSM = CSECMD int main(void) { char cadena[] = "Probando la comunicacion serie"; unsigned char contador, datoLeido; AD1PCFG = 0xFFFF; // configura pines como digitales //Inicia UART2 con FPB de 80MHz y una tasa de transferencia de 9600bps openUART(UART2, 80000000, 9600); //Espera un breve retardo retardoms(10); //Limpia consola de Hyperterminal clearConsoleUART(); //Envia variable cadena putsUART(cadena); //Inicia contador en el primer caracter visible (ASCII 32 = espacio en blanco) contador = 32; while(1) { putcUART(contador); datoLeido = getUART(); //Envia dato de 8 bits //Lee dato del UART //Si el dato fue una 'A', limpia hyperterminal e imprime "Hola" if(datoLeido == 'A') { clearConsoleUART(); putsUART("Hola"); } //pero si el dato leido es 'B' regresa el cursor al inicio del hyperterminal else if(datoLeido == 'B') { returnHomeUART(); } contador++; retardoms(100); //incrementa contador que envia por puerto serie } } Ing. Juan Ramon Terven Salinas 164 10- Comunicación Serial HyperTerminal El sistema operativo Windows incluye un programa llamado HyperTerminal el cual permite comunicarnos por puerto serie. Este programa se encuentra en Inicio> Todos los programas> Accesorios> Comunicaciones> HyperTerminal. Pasos para configurar la HyperTerminal 1. Abra el programa HyperTerminal 2. Escriba nombre a la “Nueva Conexión”. 3. Seleccione el puerto COMx que está usando. 4. Seleccióne las propiedades de la comunicación. En este caso 9600 baudios, 8 bits, sin paridad, 1 bit de parada y control de flujo ninguno como se muestra en la Figura 10-10. Figura 10-10. Propiedades de la comunicación 5. Encienda su circuito con el Ejemplo1 grabado y ¡listo!. La siguiente figura muestra el ejemplo 1 en Hyperterminal. Ing. Juan Ramon Terven Salinas 165 10- Comunicación Serial Figura 10-11. HyperTerminal funcionando con el ejemplo 1 Ing. Juan Ramon Terven Salinas 166