10 de octubre de 2010

Las comunicaciones asíncronas

10/10/2010

jueves 15 de noviembre de 2007









Sin lugar a dudas, la comunicación paralela en la cual se pueden enviar simultáneamente varios dígitos binarios (bits) a la vez a través de varios alambres independientes es la que ofrece la mayor rapidez posible. Esto es precisamente lo que se hace al interior de una microcomputadora, en donde a través de un bus formado por ocho o más líneas independientes podemos enviar información en forma paralela. Sin embargo, hay ocasiones en las que esto no se puede llevar a cabo. Frecuentemente queremos enviar hacia el exterior información digital pero no contamos con el lujo de varias líneas independientes que nos permitan enviar simultáneamente dígitos binarios diferentes que representen distintos valores. Un ejemplo de ello es la línea telefónica, en donde no contamos ni siquiera con un grupo de cuatro cables que nos permitan enviar a través de la línea telefónica cuatro bits a la vez. Otro ejemplo de ello es la comunicación satelital, en donde al enviar o recibir algo de un satélite lo logramos mediante una señal electromagnética de alta frecuencia. En tales casos, nos vemos forzados a llevar a cabo la comunicación en forma serial en donde en vez de enviar varios bits a la vez tenemos que enviar de uno en uno. En principio, esto requiere del envío simultáneo de una señal de reloj que le permita al receptor saber cómo distinguir entre un bit y el siguiente. A manera de ejemplo, considérese la siguiente señal digital de 16 bits:




0011010010101110



Suponiendo que la señal sea enviada siguiendo un orden de izquierda a derecha, entonces se enviará primero un "0", tras lo cual se enviará otro "0", tras lo cual se enviará un "1" y después el "1" que le sigue, seguido de un "0", y así sucesivamente. Desde el punto de vista de presencia y ausencia de voltajes en la línea para denotar los "unos" y los "ceros", conforme avanza el tiempo esta señal mostrará el siguiente aspecto:






Si en este diagrama de tiempos borramos los "unos" y los "ceros" que están puestos encima de la señal digital, de cualquier forma podemos recuperar la información escribiéndola de nuevo gracias a los pulsos sincronizados de la "señal de reloj". Obsérvese que el envío de una "señal de reloj" es un complemento indispensable en la transmisión serial de una señal digital. Sin esta señal de reloj, el receptor no tiene forma alguna de saber cuándo y en dónde empieza un "cero" y termina un "uno" o viceversa, como tampoco tiene forma alguna de saber cuál es la duración de cada intervalo de tiempo que subdivide a los "bits" que están siendo enviados. Aunque a primera vista pudiera creerse que la subdivisión del tiempo puede ser extraída por el receptor del intervalo de tiempo más corto detectado en una señal entre un "uno" y un "cero", esto no ofrece garantía alguna. En efecto, si enviamos las siguientes señales digitales de 16 bits, una tras otra:




1111111111111111



0000000000000000



1111111100000000



0000000011111111



y el receptor se basa únicamente en la duración del intervalo más corto, que correspondería a la secuencia "11111111", erróneamente podría concluír que se le ha enviado una señal compuesta de tan sólo 8 bits, la señal "11001001", cuando en realidad se le ha enviado una señal de 64 bits. El problema que tenemos para decodificar la señal basada en los tiempos de transmisión es el mismo que el que tenían los telegrafistas de antaño para comunicarse a través de sus primitivos aparatos mediante el "código Morse". (Generalmente, los telegrafistas trataban de mantener cierto "tiempo" razonable entre la transmisión de cada letra, un "tiempo razonable" que pudiera ser leído "razonablemente" por ambos, y aún así era necesario que el receptor después de haber recibido el mensaje telegráfico retransmitiera el mensaje al que lo envió para ver si no se había cometido error alguno. El problema que tenemos aquí es que en la transmisión de datos digitales estamos transmitiendo no el equivalente de una letra del alfabeto cada dos segundos, sino el equivalente de miles de bits de información a velocidad electrónica con la cual ningún humano se podría dar abasto.)



Queda pues fuera de toda discusión la necesidad de tener que enviar una "señal de reloj" junto con la señal digital para que el receptor pueda recuperar íntegramente el mensaje. El problema estriba en que en muchas ocasiones no tenemos ni siquiera el lujo de contar con un cable extra que nos permita enviar dicha "señal de reloj". El cable telefónico consta en esencia de tan sólo dos alambres, de tan sólo dos líneas, un cable es usado para enviar la señal de corriente eléctrica, y el otro cable es utilizado como "tierra eléctrica" para recibir la corriente de retorno. No existe un tercer cable a través del cual podamos enviar una señal de reloj.



¿Entonces cómo es posible que una computadora pueda enviar y recibir una señal de Internet a través de la línea telefónica?



Hay dos respuestas a este dilema.



La primera respuesta tiene que ver directamente con la selección del formato con el cual están codificados los datos binarios, lo cual requiere tratar un tema que habíamos dejado pendiente hasta ahora.



Empezaremos hablando acerca de algunos tipos de formatos usados para la codificación de datos digitales en preparación para su transmisión a través de un canal de comunicaciones. Un esquema que es la representación más sencilla de todas es el método No Regreso al Nivel Cero (Non Return to Zero Level ó NRZ-L) en el cual el "0" es representado como ningún voltaje (o mejor dicho, cero voltaje) y el "1" es representado por un nivel alto de voltaje. Esta es una representación a la que ya deberíamos de estar acostumbrados, puesto que es precisamente la representación con la cual hemos construído casi todos los diagramas de tiempo mostrados en este libro desde el principio, es el mismo formato que se ha estado utilizando en la construcción de todo los diagramas de tiempo relacionados con el comportamiento de los circuitos digitales combinatorios y secuenciales.



Otra variante es el método NRZ-I (Non Return to Zero Inverted) en la cual solo ocurre una transición cuando aparece un "1" (un "0" no produce ningún cambio). La ventaja de este método es que es más fácil para los circuitos eléctricos detectar un cambio de voltaje que estar midiendo niveles absolutos de voltajes. Este método es el utilizado en las comunicaciones que se llevan a cabo en los puertos USB de las computadoras caseras. La desventaja de este método es que no hay cambio alguno cuando hay una secuencia formada por puros "ceros" además de que no lleva consigo ninguna información que permita al receptor sincronizar su propio "reloj" con el "reloj" con que fue construído el dato recibido. Para superar esta deficiencia, en 1949 hizo su aparición el esquema de codificación Manchester, utilizado ampliamente en las redes de computadoras conectadas bajo la convención Ethernet, en el cual se utiliza una transición de un voltaje bajo a un voltaje alto a la mitad del bit para representar un "1" y una transición de un voltaje alto a un voltaje bajo a la mitad del bit para representar un "0". Para lograr una codificación Manchester, la señal NRZ-L es sometida junto con la señal de "reloj" a una operación de OR-EXCLUSIVO, lo cual transforma a una señal codificada como NRZ-L en una señal Manchester. La ventaja del método Manchester es que envía al mismo tiempo el dato y la información sincronizadora de los pulsos del reloj con los cuales se construyó la palabra binaria, ya que tiene una transición para cada ciclo sin importar que la palabra binaria esté formada por una larga secuencia de "unos" y "ceros". La enorme desventaja es que al recurrir a transiciones a la mitad de cada bit,el ancho de banda requerido para la transmisión de la señal se duplica, de modo tal que una señal codificada en formato NRZ-L que pueda ser enviada en un ancho de banda de 200 Megahertz requerirá un ancho de banda de 400 Megahertz para poder ser enviada. A continuación se muestran los tres esquemas NRZ-L, Manchester y NRZ-I:








Una derivación del método Manchester es el esquema Manchester diferencial (differential Manchester), en el cual si un "1" es representado por una transición, entonces el "0" es representado por dos transiciones, y viceversa. En el siguiente diagrama tenemos tres palabras binarias distintas, la palabra "000", la palabra "101" y la palabra "011", codificadas bajo el esquema "Manchester diferencial":








Otro esquema es el esquema de Regreso a Cero (Return to Zero ó RZ) en el cual cada vez que aparece un "1" se eleva la señal de un nivel de voltaje bajo a un nivel de voltaje alto, tras lo cual la señal es regresada a su nivel de voltaje bajo:








Existen también otros métodos tales como NRZ-M (Non Return to Zero Mark) en el cual la polaridad de la señal cambia cuando lo que va a ser enviado es "1" y en el cual no hay cambio alguno en la polaridad de la señal cuando lo que va a ser enviado es un "0"; y NRZ-S (Non Return to Zero Space) que trabaja igual que NRZ-M excepto que la polaridad de la señal cambia cuando lo que va a ser enviado es un "0", no habiendo cambio alguno cuando lo que va a ser enviado es un "1". A continuación se presentan los diagramas de tiempo mostrando la palabra binaria enviada "101100101" en los formatos NRZ-L, NRZ-M y NRZ-S:








Así pues, con la selección de un formato de codificación de los datos binarios como el código Manchester, es posible transmitir en forma simultánea una serie de datos binarios así como los pulsos de "reloj" que permitan establecer una sincronización entre el transmisor y el receptor.



La segunda respuesta al dilema de transmitir tanto los datos digitales como la señal sincronizadora radica en uno de los muchos trucos que hay en el costal del ingeniero electrónico. Consiste en "romper" la transmisión de la señal digital que será enviada, subdividiéndola en "paquetes" iguales formados cada uno de ellos una cantidad de algo así como ocho bits (un byte), y al enviar la señal digital -bit por bit- a lo largo de la línea injertamos entre cada "paquete" una serie de pulsos sincronizadores de alta precisión de la manera como se muestra en la siguiente figura:






Como puede verse en este diagrama de tiempos, al inicio de las comunicaciones el transmisor envía cuatro pulsos "sincronizadores" de reloj al receptor para permitirle al receptor poder sincronizar su propio reloj con el reloj del transmisor, los cuales son seguidos del primer dato byte que será enviado, la palabra 00110100, tras lo cual el receptor envía nuevamente otros cuatro pulsos "sincronizadores" para permitirle al receptor volver a sincronizar nuevamente su propio reloj con el reloj del transmisor para compensar por cualquier diferencia pequeña que se haya ido acumulando debido a la imposibilidad física de poder construír dos relojes distintos con calibraciones idénticas. Esencialmente, desde el lado del "transmisor", lo que se está haciendo es convertir la información paralela que está siendo enviada por el microprocesador a información serial que puede ser enviada bit-por-bit a través de un solo canal de intercomunicación:








con pulsos sincronizadores de alta precisión añadidos entre cada "paquete". Se sobreentiende que, del lado del "receptor", habrá electrónica lo suficientemente precisa como para poder extraer del torrente digital que le está llegando las señales de reloj con las cuales se irá "sincronizando" con el reloj del "transmisor" con el fin de poder ir reconstruyendo los datos digitales que le están llegando en "paquetes". Tanto el transmisor como el receptor cuentan con relojes de alta precisión ajustados a la misma frecuencia. Al llegar la señal digital al receptor, lo primero que hace es "sincronizar" su reloj de alta precisión usando para ello la serie de pulsos sincronizadores que está recibiendo al inicio del mensaje. Hecho esto, una vez sincronizados los relojes de ambos, se envía la señal digital en el sobreentendido de que los unos y los ceros estarán subdivididos en el tiempo de acuerdo a lo que marcan los relojes sincronizados. En virtud de que no se está enviando una "señal de reloj" de manera independiente sino que se está incorporando dentro de la misma señal, a este modo de comunicaciones se les conoce como comunicaciones asíncronas.



De hecho, cuando una computadora se está conectando a Internet a través de la línea telefónica o a través de cualquier otro medio, ya sea cable, señal satelital, o cualquier otra cosa que se llegue a inventar en el futuro, después de marcar la línea telefónica la computadora lo que hace es enviar una serie de pulsos preliminares con los cuales trata de que el servidor Web del otro lado se "sincronice" con su señal. Si el receptor no "entiende" el mensaje sincronizador, entonces va ajustando su propia velocidad de diálogo -su propio "reloj interno"- hacia arriba o hacia abajo según se requiera hasta que pueda empezar a sacar sentido alguno del mensaje que está recibiendo. Esta transacción se lleva a cabo a alta velocidad hasta que ambos llegan a un "acuerdo" y se fija una velocidad de transmisión común en ambas vías. Como ya se dijo, es necesario estar enviando los pulsos sincronizadores entre cada "paquete" de información debido a que dos relojes diferentes, por precisos que sean, eventualmente se comenzarán a desfasar, porque siempre uno de ellos será un poquito más lento o más rápido que el otro, aunque sea por una diezmillonésima de segundo, y cuando se están enviando muchos datos digitales a alta velocidad, cualquier desfase se puede acumular rápidamente arruinando la recepción de la señal.



Puesto que el primer gran problema a resolver cuando hicieron su aparición las computadoras de escritorio fue el tratar de intercambiar información a través de la línea telefónica, algo indispensable para la creación de Internet, para poder llevar a cabo las primeras comunicaciones asíncronas a través de los primeros modems se diseñó un circuito integrado que al igual que el microprocesador ha ido evolucionando con el paso del tiempo hasta convertirse por cuenta propia en algo tan complejo como los primeros microprocesadores: el UART (acrónimo del inglés Universal Asynchronous Receiver Transmitter, que significa "Receptor Transmisor Asíncrono Universal).



Con el UART, dos microcomputadoras situadas en puntos remotos que tengan necesidad de comunicarse entre sí lo harán bajo la siguiente configuración:












Como puede verse en el anterior diagrama, el proceso de intercomunicación entre dos microcomputadoras (que en su nivel más básico es en realidad un proceso de intercomunicación entre dos microprocesadores) requiere de dos UARTs, uno instalado cerca de cada máquina.Cuando compramos en la tienda una tarjeta de modem para darle capacidad de intercomunicación Internet por la línea telefónica a una computadora que aún no tiene dicha capacidad, en realidad lo que estamos comprando es un sofisticado UART montado en una tarjeta de circuito impreso, junto con el programa de software driver que le permite a la computadora reconocer al modem durante el proceso de instalación.



Así como los microprocesadores Intel 8086 y Motorola 6800 marcaron la pauta a seguir para los diseños de los microprocesadores utilizados en las computadoras actuales, del mismo modo también hubo dos "grandes abuelos" que han marcado la pauta de los estándares a seguir en comunicaciones seriales asíncronas: el UART 16450 (también conocido como el circuito integrado 8250) y el UART 16550, ambos circuitos integrados de 40 pins. A continuación se muestra la relación de pins para los dos:












El empaque mostrado en ambos diseños es el tipo de encapsulamiento conocido como DIP (Dual In-line Package). El UART 16550 también se puede obtener comercialmente en un empaque "cuadrado" de 44 pins (11 pins colocados a cada lado del cuadrado):








Es común ver instalado en casi todas las computadoras de antaño en muchas tarjetas de modem un UART que está implementando para su comunicación con el mundo exterior un protocolo de comunicaciones seriales conocido como el estándard RS-232:








En este último dibujo tenemos el diseño esencial de una computadora personal (PC) de escritorio cuyo componente central es, naturalmente, un microprocesador (µP) con sus memorias RAM y ROM. La línea roja gruesa que podemos apreciar en el dibujo es esencialmente el bus de datos por medio del cual se pueden sacar datos tanto de la memoria RAM como de la memoria ROM para ser canalizados hacia afuera a través del UART, bajo la coordinación externa de otro componente esencial para que la acción del UART se pueda sincronizar con las labores llevadas a cabo por el microprocesador: el Controlador Programable de Interrupciones (simbolizado en la literatura como PIC, acrónimo del inglés Programmable Interrupt Controller).



Un Controlador Programable de Interrupciones PIC es casi una necesidad cuando se están implementando no sólo comunicaciones seriales con el mundo exterior a través de un modem sino inclusive cuando la computadora simplemente está recibiendo información serial de componentes que le son periféricos a la misma tales como el teclado. Cuando oprimimos una tecla en el teclado, esencialmente le estamos enviando al microprocesador una señal de requisición de interrupción (denotada como IRQ, acrónimo de la expresión inglesa Interrupt Request) diciéndole "necesito que detengas momentáneamente lo que estás haciendo, porque te estoy enviando un dato que necesito que proceses de manera inmediata). Si hubiera un solo componente enviándole señales de interrupción al microprocesador, la tarea sería relativamente fácil y el mismo microprocesador podría atender estas peticiones sin perder mucho tiempo en procesarlas. Pero cuando hay varios componentes tales como un teclado, un módem, una impresora serial, etc., todos ellos enviándole señales de interrupción al microprocesador, el microprocesador por potente que sea puede terminar muy atareado atendiendo estas requisiciones, distrayéndose de sus labores principales de procesamiento de información. Es por ello que, con el fin de aligerar la carga de trabajo del microprocesador, se desarrolló el Controlador Programable de Interrupciones, el cual se encarga de darles su prioridad respectiva a cada una de las interrupciones que se están efectuando en el entorno del microprocesador. Como un ejemplo de un Controlador Programable de Interrupciones, podemos citar el circuito integrado 8259 diseñado y comercializado originalmente por Intel, cuya relación de pins es la siguiente:










Este componente también es un circuito integrado sofisticado por dentro, como podemos verlo en el diagrama esquemático de su lógica interna:








Esencialmente, el Controlador Programable de Interrupciones proporciona una interfaz entre el microprocesador y otros componentes periféricos que requieran la atención del microprocesador, entre ellos el UART. A continuación tenemos un bosquejo de cómo la señal de interrupción enviada por un UART 16550 es canalizada a través del Controlador Programable de Interrupciones 8259 hacia un microprocesador 80x86:












El lector atento se habrá dado cuenta de que el anterior esquema puede manejar hasta 16 requisiciones de interrupción, desde la IRQ0 hasta la IRQ15, provenientes de hasta 16 unidades periféricas, siendo que la relación de pins dada para el PIC 8259 únicamente tiene capacidad para poder manejar hasta ocho requisiciones de interrupción, desde la IRQ0 hasta la IRQ7 (desde el pin 18 hasta el pin 25 en el circuito integrado mostrado más arriba). Y se habrá preguntado ya, ¿de dónde viene esta capacidad extra para manejar requisiciónes de interrupción? La respuesta a esto es sencilla: por diseño, se pueden conectar dos PICs en una configuración Maestro-Esclavo que permite ampliar la capacidad en el manejo de señales de interrupción. A continuación se muestra la manera en la cual se debe llevar a cabo esta inteconexión entre dos PICs:












Ahora puede ver claramente el lector cuál es el verdadero propósito de los pins 12, 13 y 15 (CAS0, CAS1 y CAS2) en el dibujo de la relación de pins del PIC 8259. Son pins para inteconexión en cascada para aumentar la capacidad en el manejo de señales de requisición de interrupción.



A continuación se muestra un diseño más completo en donde se han interconectado en una tarjeta de circuito impreso dos PICs 8259 para aumentar la capacidad de procesamiento de requisiciones de interrupción (como de costumbre, las líneas D0-D7 representan las líneas del bus de datos, para el manejo paralelo de información de los ocho bits de un byte, mientras que las líneas A0-A15 representan las líneas del bus de domicilios):












Otro componente muy popular con un elevado nivel de integración para auxiliar al microprocesador en su manejo de unidades periféricas es el conocido como Interfaz Programable Periférica (simbolizada en la literatura como PPI, acrónimo del inglés Programmable IPeripheral Inteface), de la cual el circuito integrado 8255 (o su equivalente el 82C55) es quizá uno de los más conocidos. Su relación de terminales "pins" es la siguiente:








A continuación tenemos otro diagrama que muestra al PPI 82C55 no con la asignación física de "pins" arriba mostrada sino con las terminales reacomodadas de modo funcional para que el funcionamiento de este circuito integrado sea un poco más comprensible (ampliar imagen):






Como puede verse, hay tres puertos disponibles para la canalización paralela de datos binarios, el puerto A (port A, seleccionable con una entrada de A1A0 = 00), el puerto B (port B, seleccionable con una entrada de A1A0 = 01) y el puerto C (port C, seleccionable con una entrada de A1A0 = 10). La entrada A1A0 = 11 está reservada para girarle una instrucción a este componente para que lleve a cabo alguna de las funciones que puede llevar a cabo. Las líneas D0 a la D7 son para canalizar los datos de entrada o de salida de una palabra de 8 bits a través de uno de los tres puertos. En un sistema, este componente se conectaría de una manera como la siguiente:








El siguiente diagrama nos muestra cómo se utilizaría el PPI 82C55 para construír un circuito para llevar cabo la lectura de una de las 16 teclas de un teclado externo:








Obsérvese cómo las teclas del teclado externo están dispuestas en un arreglo rectangular de renglones (conectados independientemente a cuatro de las ocho terminales del puerto A) y columnas (conectadas independientemente a cuatro de las ocho terminales del puerto B). A su máxima capacidad, este mismo diseño se puede ampliar fácilmente para leer cada una de las teclas de un teclado de 64 teclas no muy diferente al que está usando el lector en estos momentos.



Como el nombre del componente lo indica, el PPI 82C55 es programable. A continuación tenemos la forma en la cual la ejecución de las instrucciones se puede llevar a cabo:








Como ya se mencionó previamente, la entrada A1A0 = 11 está reservada para girarle una indicación al PPI 82C55 de que una instrucción será llevada a cabo. Al poner esta entrada, los ocho bits a la entrada del puerto A se convierten en un byte de comando (Command Byte A), y los ocho bits a la entrada del puerto B también se convierten en otro byte de comando (Command Byte B). Dependiendo del valor que tenga cada uno de estos ocho bits en cada uno de estos dos bytes de comando, se obtendrá un resultado diferente. Por ejemplo, si al bit 4 del byte de comando A se le pone un valor de 1 lógico, entonces el puerto A se convertirá en un puerto para la entrada de datos, y si se le pone un valor de 0 lógico, se convertirá en un puerto para la salida de datos. El bit 2 del byte de comando A es interesante, porque nos permite seleccionar uno de los modos de operación del PPI 82C55, el cual funcionalmente puede trabajar de hasta tres modos distintos (designados por los fabricantes como mode 0, mode 1, mode 2) de acuerdo con lo que indican los siguientes diagramas:








Existen otros controladores periféricos programables más recientes, además de los ya mencionados que marcaron la pauta a seguir, tales como el PIC12C508/509, el PIC16F84A, el PIC16F628 el PIC18F4550, y el PIC16F87X.



No se entrará más a fondo aquí en el estudio de este tipo de componentes porque ello requeriría de un libro como este.



Es importante señalar que para poder utilizar un UART con el fin de que el microprocesador pueda llevar a cabo comunicaciones seriales hacia el mundo exterior bajo un estandard de comunicaciones seriales como la norma RS-232 (en la cual el "1" lógico está especificado como un voltaje positivo de +15 volts, y el "0" lógico como un voltaje negativo de -15 volts), se requiere otro componente que pueda garantizar las conversiones eléctricas de los niveles de voltaje usados por los otros componentes con los que trabaja el microprocesador (por ejemplo, los niveles de cero volts para un "0" y de +3 volts para un "1" con que funcionan los circuitos integrados TTL), un componente como el transceptor (transceiver) MAX232:








Con la adición de cinco capacitores externos de bajo costo especificados por el fabricante, la conversión realizada por este circuito es llevada a cabo en forma directa sin mayor ciencia:








El diagrama funcional del circuito integrado MAX232 (ampliar imagen):








nos indica que si la terminal de entrada para convertir señales con niveles TTL/CMOS es la terminal 11 (T1IN), entonces las señales ya convertidas a niveles RS-232 se podrán obtener en la terminal 14 (T1OUT); mientras que si la terminal de entrada para convertir señales con niveles RS-232 es la terminal 13 (R1IN), entonces las señales ya convertidas a niveles TTL/CMOS se podrán obtener en la terminal 12 (RIOUT). El circuito integrado proporciona otros dos pares de terminales para lograr lo mismo, los pares 10/7 (conversión TTL/CMOS a RS-233) y 8/9 (conversión RS-232 a TTL/CMOS).



Lo interesante del circuito integrado MAX232 es que aunque puede generar las señales de voltaje RS-232 de +15 volts y -15 volts, lo puede hacer alimentado con una fuente de voltaje de +5 volts.



A continuación (ampliar imagen) se muestra la transmisión de un byte con el cambio de niveles de voltaje en el pin de salida del UART (o y +5 volts) a los niveles de voltaje mayores (-12 volts y +12 volts) requeridos para la transmisión bajo el estándard RS-232, usando el caracter ASCII que representa a la letra "J" (B7B6B5B4B3B2B1=01001010):








Consideraremos que el bit B0=0 está siendo usado como bit de paridad. Obsérvese que antes y después de la transmisión del byte se requiere agregarle dos bits al dato que será enviado:



(1) Un bit de comienzo (START) puesto antes del byte, en este caso igual a "0".



(2) Un bit de terminación (STOP) puesto después del byte, en este caso igual a "1".



Al comienzo de la transmisión de cada byte, es necesario añadir el bit de comienzo START para hacerle saber al receptor que un byte de datos va a ser enviado, el cual le permitirá al receptor poder sincronizarse con los bits posteriores. El bit de terminación STOP proporciona un período de tiempo antes de que el siguiente bit de comienzo (START) sea transmitido, y tiene un nivel (ó sentido) opuesto al bit de comienzo para permitirle al bit de comienzo el poder ser "visto" por el receptor. El proceso de "enmarcar" un dato entre un bit de comienzo START y un bit de terminación STOP es conocido en la literatura técnica como framing, y podemos representar un "marco" de la siguiente manera:








en donde el bit de comienzo START está representado a la izquierda de color verde, el bit de paridad que le sigue está representado de color marrón, los siete bits que representan un símbolo ASCII son de color ciano, y el bit de terminación STOP está representado a la derecha de color rojo.



En el siguiente diagrama esquemático simplificado de una microcomputadora tenemos la presencia ineludible de un UART, el UART 16C550, junto con el PPI 82C55 (designado en el diagrama como un bloque funcional PIO, un acrónimo del inglés que significa Programmable Input Output, lo cual para nuestros propósitos no es más que otra designación para los componentes PIC y PPI utilizados en conjunción con el UART para el manejo de las unidades periféricas), junto con el imprescindible MAX232 para el envío y recepción de señales seriales RS-232 de y hacia equipo periférico (ampliar imagen):












En el capítulo 5, vimos que un "0" lógico y un "1" lógico pueden estar representados no sólo como la ausencia de un voltaje y la presencia de un voltaje de, digamos, +5 volts, sino también como un campo magnético de cierta orientación y un campo magnético de orientación contraria. De hecho, hay muchas otras maneras en las cuales podemos representar un "0" y un "1", tales como la ausencia y la presencia de un rayo de luz. Es así como es posible transmitir señales digitales a través de un cable de fibras ópticas en las cuales el medio de tranmisión es la luz y no un potencial eléctrico. Y aunque podemos transmitir a lo largo de un alambre metálico "pulsos" de voltaje con una forma de onda cuadrada como la que hemos visto en los diagramas de tiempos (esta es precisamente la manera en la cual se llevaba a cabo la transmisión de datos a través del telégrafo mediante el código Morse), no es necesario estar limitados a este tipo de formato. La enorme flexibilidad en la forma en la cual podemos representar un "0" y un "1" nos permite elaborar otros esquemas que suelen ser mucho más eficientes que la simple transmisión de "pulsos" de voltaje de corriente directa, los cuales de cualquier manera no pueden ser utilizados para la transmisión de datos digitales a través de una antena transmisora hasta una antena receptora. El ejemplo más notorio de ello es la representación de un "1" como un "pulso" que en realidad es una onda de alta frecuencia. Esto requiere modular una señal ondulatoria continua usando el nivel de "1" lógico para convertirla en un pulso ondulatorio de alta frecuencia de una manera como la siguiente en la cual la onda portadora (carrier) del "1" es modulada por un "1" convencional produciendo un resultado modulado:








Este esquema conocido como un esquema de modulación de amplitud identifica una señal digital ondulatoria como un "1" lógico, y la ausencia de la misma como un "0" lógico. De este modo, un torrente continuo de información que empieza con la siguiente señal digital binaria mostrada de color azul siendo modulada por la señal ondulatoria de color verde producirá la señal modulada de color rojo que será transmitida hacia afuera:












El aparato transmisor que cambia a la señal digital modulándola antes de ser transmitida recibe el nombre de modulador, mientras que el aparato receptor encargado de recuperar la señal digital removiendo su componente ondulatorio se llama demodulador. Este es precisamente el origen de la palabra modem, MODulador-DEModulador, el aparato capaz de modular señales digitales para enviarlas hacia afuera a través de la línea telefónica en forma de pulsos ondulatorios, y capaz también de demodular los pulsos ondulatorios enviados desde fuera por un transmisor, el cual era un aditamento externo a las computadoras caseras:








antes de ser incorporado adentro de las mismas computadoras cuando los constantes avances de la microelectrónica permitieron miniaturizar todos los componentes de los modems para permitir su inserción en un circuito integrado de alta densidad dentro de la tarjeta madre o como una tarjeta accesoria para ser insertada dentro de una de las ranuras especiales que muchas computadoras tienen para ello.



Existe otro esquema que es precisamente el mismo que fue utilizado inicialmente para la transmisión de señales digitales a través de la línea telefónica usando para ello los primeros modems caseros: mediante señales de tonos audibles. Bajo este concepto, cuando se transmite una señal a través del cable telefónico se hace utilizando dos ondas de frecuencias diferentes para identificar al "0" y al "1". Este esquema es conocido como modulación de frecuencia (aunque también es conocido como FSK o Frequency Shift Keying), esquema en el cual la frecuencia de la señal portadora es alternada entre dos frecuencias diferentes en una manera como la que se muestra a continuación:












Uno de los primeros circuitos integrados utilizados justo para la construcción de los modems que empezaron operando mediante el concepto de tonos es el circuito integrado 4412 fabricado con tecnología CMOS por la empresa Motorola:












Este circuito integrado hoy obsoleto que fue uno de los pioneros para la construcción a gran escala de los primeros modems (externos) trabaja de la siguiente manera: el paquete convierte datos binarios seriales ("unos" y "ceros"), usualmente enviados de y hacia un UART, en el sistema de "tonos" audibles propios para la comunicación telefónica compatibles con el llamado "sistema 103". En el modo Originar, un "0" es transmitido como una señal con una frecuencia de 1070 Hertz (ciclos por segundo) y un "1" es transmitido como una señal con una frecuencia de 1270 Hertz. En el modo Contestar, un "0" es transmitido como una señal con una frecuencia de 2025 Hertz y un "1" es transmitido como 2225 Hertz. Puesto que los modems se usan en pares, el receptor responde con el grupo de tonos que no está siendo transmitido. Esta es precisamente la forma en la cual se lleva a cabo la comunicación en servicios de Internet de baja velocidad. La entrada de la transmisión es compatible con la familia de circuitos lógicos TTL y responde a una transferencia de datos de 300 bauds o menos. La amplitud de una onda típica de la señal de salida es de 300 milivolts rms hacia una carga resistiva de 100 mil ohms. La entrada al receptor debe provenir de un filtro activo sofisticado y bien diseñado y un limitador simétrico con distorsión controlado de algo llamado el "retardo del grupo" (group delay). Esta entrada es compatible con las familias lógicas TTL y CMOS. La salida del Receptor de Datos (terminal "pin" 7) sigue a esta entrada después del proceso de demodulación.



Junto con el UART podemos hablar de otro circuito integrado que además de las capacidades para comunicaciones asíncronas del UART incorpora la capacidad para poder establecer comunicaciones síncronas. Se trata del USART, cuyas siglas significan Universal Synchronous/Asynchronous Receiver-Transmitter, del cual el gran "abuelo" prototipo que marcó la pauta en los diseños posteriores que habrían de seguir es el 8251:












desarrollado originalmente por la empresa Intel, cuyo diagrama funcional de bloques es el siguiente (ampliar imagen):








Existe disponible en Internet, como una cortesía de la Universidad de Hamburgo en Alemania, un programa animado que muestra con una simulación el funcionamiento en modo asíncrono de un USART, la cual se puede accesar en el siguiente domicilio:



http://tams-www.informatik.uni-hamburg.de/applets/hades

_________/webdemos/50-rtlib/65-usart8251/usart-transmit.html



En esta demostración, si hacemos "clic" sobre el "monitor" que está bosquejado en el extremo derecho del diagrama que contiene al USART 8251, aparecerá una "ventana" típica de las ventanas de texto de la época en la que los monitores de las computadoras sólo tenían capacidad para el trazado de texto sobre un fondo negro y no de gráficos; y lo que se está simulando es una simple terminal receptora de texto a la cual le llega el mensaje clásico que dice "Hello, world!" (Hola, mundo!). Esta "estación terminal" puede ser configurada en su velocidad (baud) y en la paridad que será utilizada para la detección de errores (paridad par, paridad impar, o ninguna paridad). Al entrar en esta página se activa de inmediato el simulador de diagramas de tiempo "Hades Waveform Viewer". El botón derecho del mouse, cuando el cursor está puesto dentro de la "ventana" de simulación del circuito, abre una lista vertical de opciones de menú, en la cual el punto de inicio es la opción "simulación" (simulation) que nos dá las tres posibilidades: stop (detener la simulación), pause (pausar la simulación) y run (correr la simulación), mismas opciones que se encuentran también disponibles en el borde inferior de la ventana principal del simulador. Si la ventana de diagramas de tiempo "Hades Waveform Viewer" no aparece, en este menú del "mouse" la podemos invocar con la opción view de donde escogemos show waveform viewer; y con esta misma opción la podemos seguir invocando cuantas veces sea necesario a lo largo de una simulación. Dentro de la ventana del Hades Waveform Viewer, la punta de la flecha del cursor tiene anexadas permanentemente una línea horizontal y una línea vertical, las cuales nos permiten localizar en forma precisa dentro de la ventana del "Viewer" con el cursor vertical un tiempo específico situado dentro del tiempo de la simulación, y con el cursor horizontal uno de los parámetros (RESET, nCS, CnD, nRD, nWR, DATA, nTXC, TXD,TXRDY, TXE y nCTS) cuyo valor binario será desplegado inmediatamente en el renglón como "Value:". Hay una línea adicional aquí titulada "comment" en la cual se nos describe lo que está sucediendo en cierto intervalo de tiempo. Por su parte, la ventana principal en donde está el circuito (no la ventana Hades Viewer) tiene en su parte inferior un botón i para imprimir el status del simulador, un botón de doble flecha apuntando hacia la izquierda para "reajustar" el tiempo de simulación hasta t=o, un botón de doble flecha apuntando hacia la derecha para correr la simulación en modo "perpetuo" (interactivo) y un botón con una sola flecha apuntando hacia la derecha que nos permite seleccionar un intervalo de tiempo de simulación, el cual tenemos que especificar previamente en la ventana numérica a su derecha así como las unidades de tiempo del intervalo de simulación (nanosegundos, microsegundos, milisegundos, segundos, minutos, horas). Es necesario oprimir este "botón" dos veces para ir más allá del tiempo inicial de simulación programado por el "StimuliGen" con una duración de 0.83 segundos. Los tres "foquitos" LED a la derecha nos indican que la simulación está detenida (foquito rojo), la simulación está pausada (foquito amarillo), o la simulación está corriendo (foquito verde). Se puede afirmar que esta simulación, para haber sido elaborada con propósitos meramente educativos, es una simulación bastantes sofisticada.



Hasta ahora, al hablar acerca de las comunicaciones seriales lo hemos hecho teniendo en mente el protocolo de comunicación serial basado en el estándard RS-232. Es importante señalar aquí que, en buena medida, el protocolo RS-232 para el cual fueron diseñados varios de los circuitos integrados que hemos visto en este Suplemento está siendo superado por un nuevo estándard de comunicaciones seriales más universal, el conocidísimo estándard USB (Universal Serial Bus), el cual es implementado con sus propios circuitos integrados que también se pueden obtener comercialmente en el mercado para el desarrollo de proyectos o la construcción de computadoras.



Existen varias ventajas del estándard USB sobre el estándard RS-232. La primera ventaja es que se pueden conectar varios equipos (impresoras, cámaras digitales, escáners, teclados MIDI, etc.) a una misma computadora sin necesidad de tener que construírle a la computadora puertos de entrada adicionales, ya que se puede utilizar el mismo puerto de entrada USB de la computadora ampliando la capacidad de dicho puerto con un hub expansor:












de modo tal que es posible tener tres o cuatro unidades periféricas distintas enviando información serial a la misma computadora a través de la misma entrada USB de la computadora (anteriormente, si se quería conectar un equipo con modo de comunicación serial a una computadora, había que desconectar el equipo que ya estuviese instalado, frecuentemente la impresora, para utilizar dicho puerto de entrada como canal de intercomunicación con la computadora, lo cual hoy ya no es necesario). Bajo el estándard USB, hasta 127 piezas de equipo (lo cual incluye los hubs expansores de capacidad) se pueden conectar a una misma computadora. El estándard inicial USB fué el USB 1.0, apoyado por sistemas operativos como Windows 98, ofreciendo una capacidad de transmisión de datos de hasta 12 Megabits por segundo; el cual está siendo superado por el USB 2.0 que ofrece las mismas características pero a una velocidad de intercomunicación mucho mayor (40 veces mayor) de 480 Megabits por segundo con las unidades periféricas que se le conecten a la computadora. El siguiente paso evolutivo programado para este estándard es el USB 3.0 que debe poder ofrecer una capacidad de transmisión serial de datos de hasta 4.8 Gigabytes por segundo. Otra ventaja del estándard USB sobre el estándard RS-232 es que las unidades periféricas se pueden conectar, desconectar y volver a conectar en el orden que sea a las entradas USB de la computadora tiempo después de que haya sido encendida la máquina (esta característica es conocida en la literatura técnica como hot swapping), mejor conocida desde el punto de vista del sistema operativo Windows como PnP (Plug-and-Play), lo cual no era posible anteriormente ya que al encender la máquina los programas de "arranque" (contenidos en el BIOS) para los puertos seriales inicializaban todo al inicio y no era posible alterar posteriormente la comunicación.



En su esencia, un cable USB para comunicaciones seriales entre una computadora y una unidad periférica consta de únicamente cuatro alambres aislados en su interior: dos cables para envío de energía eléctrica identificados de la manera usual como power (voltaje) y ground (tierra eléctrica) así como dos alambres identificados como D+ y D-. Los cables de energía eléctrica son requeridos cuando la unidad periférica que está siendo conectada carece de su propia fuente de energía y tiene que ser energizada por la computadora, como es el caso de los flash drives. Cuando una unidad periférica se conecta a la computadora, la computadora (o el hub) detecta la presencia de la unidad periférica mediante una resistencia eléctrica que actúa como pullup dependiendo de que la unidad periférica sea una de baja velocidad (USB 1.0) o de alta velocidad (USB 2.0). Una resistencia pullup puesta en el cable que corresponde a la señal D- indica que se trata de una unidad de baja velocidad, mientras que una unidad periférica de alta velocidad tiene una resistencia pullup en el cable D+. Para el manejo de las señales USB, hay varios circuitos integrados en el mercado, uno de los cuales es el PIC 16C745, de la empresa Microchip. Este Controlador Programable de Interrupciones es en su interior un circuito integrado tan complejo y tan sofisticado que en la literatura técnica se le identifica también como un microprocesador, aunque en el sentido estricto de la palabra no lo es. A continuación tenemos un bosquejo de un PIC 16C745 dispuesto para el manejo de una unidad periférica de baja velocidad, con una resistencia pullup puesta en la línea D-:












A continuación tenemos en mayor detalle un proyecto construído como parte de una tarea escolar por dos estudiantes canadienses como parte de los requerimientos para poder obtener su grado en Ingeniería Física en la University of British Columbia, el cual como puede verse está configurado para ser de baja velocidad:








En la esquina superior derecha de este diagrama esquemático podemos ver las asignaciones que bajo el estandárd USB se deben hacer a cada una de las terminales de un conector USB.



Aquí puede surgir una duda sobre cómo es posible que una computadora pueda distinguir entre las diversas señales digitales que le están enviando varias unidades periféricas a través de lo que es esencialmente una sola línea de entrada. ¿Cómo evitar confundir una señal digital que le está llegando desde una cámara Web con una señal digital que le está llegando de una impresora? La respuesta radica en el hecho de que bajo el estándard USB cada pieza de equipo tiene su propio identificador, algo así como su "nombre propio" y sus apellidos, lo cual le permite a la computadora el poder distinguir -con la ayuda del sistema operativo- una unidad periférica de la otra. De hecho, la primera vez que se conecta con un cable USB una unidad periférica a una computadora en la que nunca antes se había utilizado, lo primero que hará la computadora será buscar entre su "catálogo de equipos USB" interno el "nombre propio" y apellidos de tal unidad periférica, y al no encontrarlo el sistema operativo le pedirá al usuario el disco CD de instalación de los programas drivers que le permitan al sistema operativo poder procesar la información que le envíe dicha unidad periférica. Una vez que se ha llevado a cabo este procedimiento, el sistema operativo agrega tal unidad periférica a su "catálogo interno", de modo tal que la próxima vez que tal unidad periférica se vuelva a conectar a la misma computadora se llevará a cabo la búsqueda de rigor en dicho catálogo interno, y al encontrar que los programas drivers para tal unidad periférica ya están almacenados en el disco duro el sistema operativo cargará dichos drivers en la memoria RAM para poder intercomunicarse con dicha unidad periférica.



Aunque aún es posible ver muchas computadoras que tienen en su parte trasera un puerto para interconectar las impresoras a un conector basado en el estándard RS-232, la mayoría de las nuevas impresoras en el mercado están equipadas ya con un puerto USB para ser interconectadas de este modo a la computadora. De cualquier modo, aunque el estándard RS-232 termine siendo desplazado por completo, mucho de lo que hemos aprendido en este Suplemento sigue siendo completamente válido porque los principios esenciales siguen siendo los mismos, al igual que las tres funciones lógicas básicas AND, NOT y OR sobre las cuales a fin de cuentas se viene basando el diseño de cualquier computadora.



Para obtener más datos sobre los detalles técnicos de los UART, se recomienda consultar el siguiente enlace:



http://www.freebsd.org/doc/en_US.ISO8859-1/articles/serial-uart/



Por otro lado, se puede obtener mayor información sobre el estándard de comunicaciones seriales RS-232 consultando la Wikipedia en el siguiente enlace:



http://en.wikipedia.org/wiki/RS-232



También en la misma Wikipedia se puede obtener mayor información en el siguiente enlace acerca del estándard USB que está desplazando rápidamente al estándard RS-232:











No hay comentarios:

Publicar un comentario en la entrada