Tema 08 - Comunicaciones Seriales

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 24

Tema 8

Comunicaciones seriales

Un dispositivo muy útil en cualquier PC es el puerto serial. Este permite comunicar


la computadora con dispositivos de datos externos en forma serial, esto es, bit a bit.

En el PC original, los puertos serie se basaban en el chip USART 8250A,


actualmente, se basan en el USART 16550 que es más rápido que el anterior, pero
totalmente compatible. En este capitulo se discutirá con detalle las características del
chip 8250, a nivel de programación stand-alone (individual) y usando las rutinas de
soporte que ofrece el ROM BIOS del PC. No se discutirá el 16550 ya que escapa del
alcance de la materia.

La transmisión de datos en serie es una de las más comunes para aquellas


aplicaciones en las que la velocidad no es demasiado importante, o no es posible
conseguirla (por ejemplo, vía red telefónica). Para simplificar el proceso de enviar los
bits uno por uno han surgido circuitos integrados que realizan la función, teniendo en
cuenta todos los tiempos necesarios para lograr una correcta comunicación y
aliviando a la CPU de esta pesada tarea. El circuito que estudiaremos es el 8250 de
National, fabricado también por Intel, aunque las diferencias respecto al 16550 serán
brevemente señaladas. Esta última UART es más reciente y mucho más potente -
aunque solo sea por unos pequeños detalles- y cada vez está más extendida, en
particular en las actuales placas base.

La línea que transmite los datos en serie está inicialmente en estado alto. Al
comenzar la transferencia, se envía un bit a 0 ó bit de inicio. Tras él irán los 8 bits de
datos a transmitir (en ocasiones son 7, 6 ó 5): estos bits están espaciados con un
intervalo temporal fijo y preciso, ligado a la velocidad de transmisión que se esté
empleando. Tras ellos podría venir o no un bit de paridad generado automáticamente
174 Microprocesadores de 16 bits y tecnología PC

por la UART. Al final, aparecerá un bit (a veces un bit y medio ó dos bits) a 1, que
son los bits de parada o bits de stop. Lo de medio bit significa que la señal
correspondiente en el tiempo a un bit dura la mitad; realmente, en comunicaciones se
utiliza el término baudio para hacer referencia a las velocidades, y normalmente un
baudio equivale a un bit. La presencia de bits de inicio y parada permite sincronizar la
estación emisora con la receptora, haciendo que los relojes de ambas vayan a la par.
A la hora de transmitir los bytes de datos unos tras otros, existe flexibilidad en los
tiempos, de ahí que este tipo de comunicaciones se consideren asíncronas. La
transmisión de los 8 bits de datos de un byte realmente es síncrona, pero las
comunicaciones en serie siempre han sido consideradas asíncronas.

Para una transmisión en serie básica bastan tres hilos. Sin embargo, el software
que controla el puerto serie a través de la interfaz RS-232-C podría requerir más
señales de control para establecer la comunicación, al igual que para controlar un
modem telefónico pueden hacer falta más líneas (de control, no telefónicas...).
Bromas aparte, sobre comunicaciones en serie existe todo un mundo; acerca de este
tema se han escrito muchos libros completos. Lógicamente, aquí no vamos a dar
ningún curso de comunicaciones en serie. Sin embargo, los menos introducidos en la
materia no deben temer: ¿qué mejor manera de aprender sobre las comunicaciones en
serie que examinar cómo funciona un chip que las soporta?. Desde luego, también se
podría partir desde el punto de vista contrario, pero como entendido en sistemas
digitales, el lector puede que tenga menos problemas con este interesante enfoque.

El conector serial
Para poder usar el puerto serial, es necesario conocer las conexiones eléctricas del
mismo para poder establecer comunicación hardware con el dispositivo externo.
El conector de puerto serial del PC es normalmente un conector de 9 pines (DB-9
macho) o de 25 pines (DB-25 macho). La razón de esto es que, IBM tenia planes de
expandir el puerto serial con señales especiales (en el conector DB-25), cosa que hizo
con la serie PS/2. Lamentablemente, esta expansión no se normalizo, pero las
posibles mejoras que iban a introducirse han sido cubiertas con el chip 16550.

Chasis Ground 1
14
Transmit Data 2
15
Receive Data 3
16
Ready To Send 4
17
Clear To Send 5 Carrier Detect 1
18 6 Data Set Ready
Data Set Ready 6 Receive Data 2
19 7 Ready To Send
Signal Ground 7 Transmit Data 3
20 Data Terminal Ready 8 Clear To Send
Carrier Detect 8 Data Terminal Ready 4
21 9 Ring Indicator
9 Signal Ground 5
22 Ring Indicator
10
23
11
24
12
25
13

Conector DB-25 Conector DB-9

Ing. Antonio Román V. – UNEXPO PUERTO ORDAZ


Comunicaciones seriales 175

Las conexiones a efectuar dependen del tipo de comunicación deseada. Por ejemplo,
si se desea conectar el puerto serial a módem externo, con un conector DB-9, el
cableado es así

Conector Conector Modem


Computador Externo
(DB-9) (DB-25)
1 Carrier Detect 8
2 Receive Data 3
3 Transmit Data 2
4 Data Terminal Ready 20
5 Ground 7
6 Data Set Ready 6
7 Ready To Send 4
8 Clear To Send 5
9 Ring Indicator 22
Cable Ground 1

Si lo que se desea es conectar dos computadoras directamente, existen básicamente


dos alternativas. Una es usar la configuración TX/RX de 3 hilos

Conector Conector
Computador DB-9 Computador DB-9
(DB-25) (DB-25)
3(2) TX -> RX 2(3)
2(3) RX <- TX 3(2)
5(7) Ground 5(7)

este tipo de conexión es muy útil para interconexiones simples, con hand-shaking
(protocolo de manejo) por software.

La otra alternativa es usar la configuración null módem, la cual aprovecha todos los
terminales de control del puerto
Conector
Conector
Computador DB-9
Computador DB-9
(DB-25)
(DB-25)
1 Cable Ground
3(2) TX -> RX 2(3)
2(3) RX <- TX 3(2)
5(7) Ground 5(7)
6 y 8(6 y 5) Carrier Detect 4(20)
4(20) Data Terminal Ready 6 y 8(5 y 6)

Ing. Antonio Román V. – UNEXPO PUERTO ORDAZ


176 Microprocesadores de 16 bits y tecnología PC

Descripción de los pines del conector serial


Cada pin tiene una función especifica. A continuación se describirá la funcionalidad
de cada uno de ellos. Hay que tomar en cuenta que, cada pin responde a niveles de
tensión de máximo ±12 voltios a un mínimo de ±3 voltios, con una carga máxima de
24mA.

TX : Transmit Data
Es la línea de salida de datos del puerto.

RX : Receive Data
Es la línea de recepción de datos del puerto.

RTS : Ready To Send


Es una señal de salida del puerto para indicar al dispositivo externo que la
computadora esta lista para enviar datos por RX.

CTS : Clear To Send


Es una señal de entrada hacia el puerto. La usan los dispositivos externos para indicar
a la computadora que se le van a enviar datos.

DSR : Data Set Ready


Es una señal de entrada hacia el puerto. La usan los dispositivos externos para indicar
a la computadora que están listos para operaciones de comunicación. Con esta línea
se puede verificar si el dispositivo tiene energía, y por lo tanto, esta disponible.

SG : Signal Ground
Es la referencia común para todas las señales.

DCD : Data Carrier Detect


Es una señal de entrada. La usan los dispositivos externos para indicar la recepción de
portadora. Los módem la usan para indicar a la computadora el acuse - recibo de otro
módem en el otro extremo de la línea telefónica.

DTR : Data Terminal Ready


Es una señal de salida. La envía la computadora a los dispositivos externos para
indicar que este esta listo para ser usado. Normalmente indica que la computadora
esta energizada.

RI : Ring Inidicator
Es una señal de entrada. La usan los dispositivos externos (módem en este caso) para
indicar que se esta solicitando comunicación (llamada telefónica externa). Cuando la
computadora recibe esta señal, normalmente se envía una interrupción para activar el
programa o rutina para contestar la llamada.

Ing. Antonio Román V. – UNEXPO PUERTO ORDAZ


Comunicaciones seriales 177

Formato de datos serial


El bloque o frame de datos serial consiste en un bit de inicio, los bits de datos (5, 6, 7
u 8 bits) un bit de paridad (opcional) y uno o dos bits de parada (también puede ser
1.5 bits)

Bit de Bit de parada


Bit de inico Bits de datos (5, 6, 7 u 8 bits) paridad (1, 1.5 o 2,
(opcional) usualmente 1)

Bloque (frame) de datos serial

Normalmente se usan para comunicación de datos, 8 bits de datos, ninguna paridad, y


un bit de parada (formato 8N1). Esto permite que el frame de datos por cada byte sea
de 10 bits.

Puertos seriales: E/S e Interrupciones


Un PC puede tener hasta cuatro (4) puertos seriales soportados a nivel de BIOS. Esto
no quiere decir que no se puedan conectar más puertos. Para tal caso, es necesario
integrar hardware adicional a la computadora, sobre todo a nivel de manejo de
interrupciones.

A continuación se listan las direcciones E/S y líneas de interrupción para los puertos
estándar del PC (esquema de direcciones basado en USART 8250).

Puerto Dirección E/S Interrupción

1 03F8h a 03FFh 4
2 02F8h a 02FFh 3
3 03E8h a 03EFh 4 (o 10)
4 02E8h a 02EFh 3 (u 11)

Subsistema de registros de los puertos seriales


Registro Puerto 1Puerto 2Puerto 3Puerto 4

Buffer de transmisión 03F8H 02F8H 03E8H 02E8H


Buffer de recepción 03F8H 02F8H 03E8H 02E8H
Latch de división LSB 03F8H 02F8H 03E8H 02E8H
Latch de división MSB 03F9H 02F9H 03E9H 02E9H
Habilitar interrupción 03F9H 02F9H 03E9H 02E9H
Interrupción ID 03FAH 02FAH 03EAH 02EAH
Línea de control 03FBH 02FBH 03EBH 02EBH
Control de modem 03FCH 02FCH 03ECH 02ECH
Línea de estado 03FDH 02FDH 03EDH 02EDH
Estado del modem 03FEH 02FEH 03EEH 02EEH
Reservado 03FFH 02FFH 03EFH 02EFH

Ing. Antonio Román V. – UNEXPO PUERTO ORDAZ


178 Microprocesadores de 16 bits y tecnología PC

El estándar RS-232
Una vez hecha la discusión técnica del puerto serial, a nivel físico y lógico, se hace
necesario extender un poco la definición del mismo, a nivel del PC.
Aunque no es critico el entender en gran detalle el estándar de comunicaciones serie
sincronas RS-232, para cubrir la meta (de uso) es importante comprenderlo lo
suficiente para ver cómo y por qué aparecen tantos problemas al usar los puertos
serie.
La configuración de la mayoría de los puertos serie se basa en el estándar RS-232
usando un conector de 25 pines (DB-25) en cada extremo. (El IBM AT usa un
conector de 9 pines DB-9.) Sin embargo, una gran cantidad de los puertos serie no
emplea todas las señales especificadas en el estándar RS-232. Algunas de estas
señales no se usan por no tener utilidad en la aplicación prevista. Otras no se
emplean debido a que el fabricante prefiere ofrecer un conjunto mínimo, en lugar de
suministrar soporte completo para RS-232.
La existencia de tantas señales se debe al hecho de que el puerto serie se diseño
inicialmente para soportar un módem. Por ello, cuando se usa con otros dispositivos,
muchas de esas señales no sirven de nada. Esas señales se utilizan normalmente para
establecer un protocolo de hardware entre el módem y la computadora, de forma que
ésta:
• No envíe información antes de que pueda transmitirla.
• No lea información del módem antes de que esté lista

Un error de configuración se produce si los relojes internos que controlan los dos
puertos son muy diferentes el uno del otro. Como puede imaginar, el puerto serie,
una vez que ha detectado el bit inicial, muestra el registro de entrada una vez cada
ciclo de reloj para leer los siguientes bits. La longitud de cada ciclo viene
determinada por la velocidad de transmisión. Sin embargo, el tiempo que cada bit
permanece en el registro viene determinado por el reloj que controla el sistema. Si la
velocidad del reloj de la computadora que recibe no está suficientemente cerca de la
del que envía, puede sobre-escribirse un bit, dando un error de configuración.

Dialogo Hardware
La forma adecuada de transmitir datos a través de un puerto serie es controlar el
estado de la señal línea de control del puerto receptor. No debe enviar datos hasta
que la señal línea de control indique que es seguro hacerlo. De esta forma, cuando se
usa el dialogo hardware, la rutina de transmisión (en pseudo-codigo) tiene el siguiente
aspecto:
1. Mientras (no CTS) esperar;
2. Enviar(byte)
3. Si quedan datos, ir al paso 1
Si se tiene un cable con las conexiones adecuadas, y en cada extremo el hardware
adecuado para soportar el estándar RS-232, debe usar sin dudas el diálogo hardware.
Sin embargo, en ocasiones puede ser difícil hacerlo.

Ing. Antonio Román V. – UNEXPO PUERTO ORDAZ


Comunicaciones seriales 179

Problemas con la comunicación


Para permitir la comunicación vía módem, se usan varias señales para determinar
cuando los datos están listos o cuando se puede enviar el próximo byte. Sin embargo,
cuando la comunicación se lleva a cabo entre computadoras, es posible (aunque no
necesariamente recomendable) el usar sólo las señales GND, TX y RX. La razón que
hay detrás de esto es que tender tres cables es bastante más barato que tender cinco o
seis. Si dos computadoras del mismo tipo están en comunicación entre sí, cuando una
está lista para enviar datos, la otra lo está, en teoría, para recibirlos. Sin embargo, al
obviar el protocolo de señales inmerso en el estándar RS-232, empiezan a aparecer
los problemas. El peor de todos es el error de sincronización.

Sobre-escribiendo el registro de recepción


Cuando se usan sólo tres hilos para conectar entre sin dos puertos serie, es necesario
‘engañar’ al puerto que transmite, haciéndole creer que el puerto receptor está listo.
Esto se lleva a cabo conectando los pines 6, 8 y 20 del conector DB-25.
Desafortunadamente, este método hace que aparezca muy a menudo un error de
sobreescritura. Supongamos que la computadora A es más rápida que la computadora
B. Si no se utiliza el diálogo hardware, posiblemente la computadora A puede enviar
a la B un segundo byte antes de que ésta haya leído la información del registro de
buffer de entrada de su puerto serie. Este es el denominado error de sincronización.
Este tipo de error se puede producir incluso siendo la computadora B más rápida que
la A, si el software de la B fuera demasiado lento.
Este problema aparece debido a que los pines 6, 8 y 20 se han ligado entre sí y, por
tanto, el puerto transmisor cree que el receptor está listo para recibir datos siempre.

Uso de los puertos


En primer lugar, para poder usar un puerto serie, este debe ser inicializado, ya sea por
medio del BIOS (Servicio 00h, INT 14h) o por vía directa (software manejador
alterno). El siguiente paso es comprobar el estado del puerto para verificar su
disponibilidad (Servicio 03h, INT 14h). Para transmitir y/o recibir se usan los
servicios 01h y 03h de INT 14h, respectivamente.
Si el puerto se va usar en forma directa, esto es, transmisión/recepción en el
momento, no es necesario definir buffers de E/S en memoria para almacenar
temporalmente los datos, como tampoco se hace necesario activar las interrupciones
de servicio. Por otro lado, si la aplicación debe hacer varias tareas y no puede estar
pendiente continuamente el puerto, es preferible hacer una rutina de servicio,
manejada por la interrupción asignada al puerto, a fin de que almacene los datos
recibidos (y los que se van a transmitir) en un buffer temporal, con tamaño suficiente
como para contener el flujo se información durante la unidad de tiempo en la cual la
aplicación no puede atender el puerto. Por supuesto, esto implica crear un manejador

Ing. Antonio Román V. – UNEXPO PUERTO ORDAZ


180 Microprocesadores de 16 bits y tecnología PC

(programa residente o driver) instalable en memoria y un interface software de


intercambio de información.

Descripción de pines del 8250


El ACE 8250 (Asynchronous Communication Element) integra en un solo chip una
UART (Universal Asynchronous Receiver/Transmitter) y un BRG (Baud Rate
Generator). Soporta velocidades de hasta 625000 baudios con relojes de hasta 10
MHz. El BRG incorporado divide la frecuencia base para conseguir las velocidades
estándar de la RS-232-C.

Funciones de los pines del 8250


Data In Strobe. Línea de entrada que indica al 8250 que deje los datos en el bus (D0..D7), los
DISTR datos dejados dependen del registro seleccionado con A0..A2. Son necesarias CS0..CS2 para
habilitar DISTR. En vez de DISTR se puede usar -DISTR, pero sólo una de las dos.
DOSTR Data Out Strobe. Idéntico a DISTR pero en salida.
Data Bits 0..7: Bus triestado bidireccional de 8 líneas para transmitir datos, información de
D0..D7
control y de estado entre la CPU y el 8250. El primer bit enviado/recibido es D0.
A0..A2 Register Select. Líneas de entrada que indican el registro del 8250 usado en la operación.
Crystal/Clock: Conexiones para el cristal del cuarzo del BRG. XTAL1 puede actuar como
XTALx
entrada de reloj externa, en cuyo caso XTAL2 debería quedar abierto.
Serial Data Output: Salida de datos en serie del 8250. Una marca es un '1' y un espacio es un
SOUT '0'. SOUT está en marca cuando el transmisor está inhibido, MR está a 1, el registro de
transmisión está vacío o en el modo lazo (LOOP) del 8250. No es afectado por -CTS.
Clear To Send: Línea de entrada. El estado lógico de esta señal puede consultarse en el bit
CTS del Modem Status Register (MSR) -como el bit CTS es el bit 4 del MSR se
CTS referencia MSR(4)-. Un cambio en el estado de -CTS desde la última lectura del MSR
provoca que se active DCTS (bit MSR(0)). Cuando -CTS está activo (a 0) el modem indica
que el dato en SOUT puede ser transmitido. -CTS no afecta al modo lazo (LOOP) del 8250.
Data Set Ready: Línea de entrada. El estado lógico de esta señal puede consultarse en
MSR(5). DDSR (bit MSR(1)) indica si -DSR ha cambiado desde la última lectura del MSR.
DSR Cuando -DSR está activo el modem indica que está listo para intercambiar datos con el 8250;
ello depende del estado del DCE (Data Communications Equipment) local y no implica que
haya comunicación con la estación remota.

Ing. Antonio Román V. – UNEXPO PUERTO ORDAZ


Comunicaciones seriales 181

Data Terminal Ready. Línea de salida que puede activarse (poner a 0) escribiendo un 1 en
MCR(0), y desactivarse escribiendo un 0 en dicho bit o ante la activación del pin MR. Con -
DTR DTR activo se indica al DCE que el 8250 puede recibir datos. En algunas circunstancias, esta
señal se usa como LED de 'power on'. Si está inactivo, el DCE desconecta el modem del
circuito de telecomunicaciones.
Request To Send. Línea de salida que habilita el modem. Se activa (poner a 0) escribiendo
un 1 en MCR(1). Esta señal se pone en alto en respuesta a MR. -RTS indica al DCE que el
RTS
8250 tiene un dato listo para transmitir. En la modalidad half-duplex, esta señal se utiliza
para controlar la dirección de la línea.
Esta línea de salida contiene una señal de reloj 16 veces mayor que la frecuencia usada para
transmitir. Equivale a la frecuencia de entrada en el oscilador dividida por el BRG. La
BAUDOUT
estación receptora podría emplear esta señal conectándola a RCLK (para compartir el mismo
reloj).
Estas dos salidas de propósito general se pueden activar (poner a 0) escribiendo un 1 en
OUTx MCR(2) y MCR(3). Son desactivadas por la señal MR. En el modo lazo (LOOP o bucle),
están también inactivas.
Ring Indicator. Esta línea de entrada indica si el modem ha detectado que llaman por la línea
y puede consultarse en MSR(6). El bit TERI (MSR(2)) indica si esta línea ha cambiado
desde la última lectura del MSR. Si las interrupciones están habilitadas (IER(3) activo) esta
RI patilla provoca una interrupción al activarse. -RI permanece activo durante el mismo
intervalo de tiempo que la zona activa del ciclo de llamada e inactivo en los intervalos de la
zona inactiva (o cuando el DCE no detecta la llamada). El circuito no se corta por culpa de -
DTR.
Data Carrier Detect. Línea de entrada que indica si el modem ha detectado portadora. Se
puede consultar su estado lógico en MSR(7). El bit MSR(3) indica si esta línea ha cambiado
DCD
desde la última lectura del MSR. Esta línea no tiene efecto sobre el receptor. Si las
interrupciones están permitidas, una interrupción será generada ante el cambio de esta línea.
Master Reset. Esta línea de entrada lleva el 8250 a un estado inactivo interrumpiendo su
posible actividad. El MCR y las salidas ligadas al mismo son borradas. El LSR es borrado en
MR
todos sus bits salvo THRE y TEMT (que son activados). El 8250 permanece en este estado
hasta volver a ser programado.
Interrupt Request. Línea de salida que se activa cuando se produce una interrupción de
alguno de estos tipos y está permitida: Recepción de banderín de error, dato recibido
INTRPT
disponible, registro de retención de transmisión vacío, y estado del modem. Esta línea se
desactiva con el apropiado servicio de la interrupción o ante MR.
Serial Data Input. Es la línea de entrada de datos desde el modem. En el modo lazo (LOOP o
SIN
bucle) están inhibidas las entradas en SIN.
Chip Select. Estas entradas actúan como líneas de habilitación para las señales de escritura
CS0..2
(DOSTR, -DOSTR) y lectura (DISTR, -DISTR).
Chip Select Out. Esta línea de salida se activa cuando el chip ha sido seleccionado con
CSOUT
CS0..2. No comenzará transferencia de datos alguna hasta que CSOUT se active.
Driver Disable. Esta salida está inactiva cuando la CPU lee datos del 8250. Una salida activa
DDIS
puede emplearse para inhibir un transceiver externo cuando la CPU está leyendo datos.
Address Strobe. Cuando esta línea de entrada está activa se enclavan las líneas A0..A2 y
CS0..2; esto puede ser necesario si los pines de selección de registro no son estables durante
ADS
la duración de la operación de lectura o escritura (modo multiplexado). Si esto no es preciso,
esta señal se puede mantener inactiva (modo no-multiplexado).
Esta línea se corresponde con la entrada de reloj para la sección receptora, equivalente a 16
RCLK veces la frecuencia empleada en la transmisión y puede proceder del BAUDOUT de la
estación remota o de un reloj externo.

Ing. Antonio Román V. – UNEXPO PUERTO ORDAZ


182 Microprocesadores de 16 bits y tecnología PC

Registros del 8250


El 8250 dispone de 11 registros (uno más el 16550) pero sólo 3 líneas de dirección
para seleccionarlos. Lo que permita distinguir unos de otros será, aparte de las líneas
de direcciones, el sentido del acceso (en lectura o escritura) y el valor de un bit de
uno de los registros: el bit DLAB del registro LCR, que es el bit 7 de dicho registro.
La notación para hacer referencia a un bit de un registro se escribe REG(i); en este
ejemplo, el bit DLAB sería LCR(7). Realmente, DLAB se emplea sólo puntualmente
para poder acceder y programar los registros que almacenan el divisor de velocidad;
el resto del tiempo, DLAB estará a 0 para acceder a otros registros más importantes.

A2 A1 A0 DLAB MODO NOMBRE SIGNIFICADO


0 0 0 0 R RBR Receiver Buffer Register (Registro buffer de recepción)
0 0 0 1 R/W DLL Divisor Latch LSB (Divisor de velocidad, parte baja
Transmitter Holding Register (Registro de retención de
0 0 0 0 W THR
transmisión
Interrupt Enable Register (Registro de habilitación de
0 0 1 0 R/W IER
interrupciones)
0 0 1 1 R/W DLM Divisor latch MSB (Divisor de velocidad, parte alta)
Interrupt Identification Register (Registro de identificación de
0 1 0 X R IIR
interrupciones)
FIFO Control Register (Registro de control FIFO) - SOLO
0 1 0 X W FCR
16550 -
Line Control Register (Registro de control de línea) ¡¡EL
0 1 1 X R/W LCR
BIT 7 ES DLAB!!
1 0 0 X R/W MCR Modem Control Register (Registro de control del modem)
1 0 1 X R/W LSR Line Status Register (Registro de estado de la línea)
1 1 0 X R/W MSR Modem Status Register (Registro de estado del modem)
1 1 1 X R/W SCR Scratch Register (Registro residual)
Registros del 8250

Line Control Register (LCR)

Break Stick
DLAB control Parity
EPS PEN STB WLS1 WLS0
7 6 5 4 3 2 1 0

0 0 0 Sin paridad 0 0 Datos de 5 bits


0 0 1 Paridad Impar 0 1 Datos de 6 bits
0 1 1 Paridad Par 1 0 Datos de 7 bits
1 0 1 Marca "1" 1 1 Datos de 8 bits
1 1 1 Espacio "0"

Este registro controla el formato del carácter de datos. Los bits WLS seleccionan el
tamaño del dato empleado. STB indica el número de bits de stop, que pueden ser 1
(STB=0) ó 2 (STB=1), al trabajar con datos de 5 bits STB=1 implica 1.5 bits de stop.
PEN (Parity Enable) permite habilitar o no la generación de bit de paridad, EPS
(Even Parity Select) selecciona paridad par si está a 1 (o impar en caso contrario).

Ing. Antonio Román V. – UNEXPO PUERTO ORDAZ


Comunicaciones seriales 183

Stick Parity permite forzar el bit de paridad a un estado conocido según el valor de
EPS. Cuando Break Control es puesto a 1, la salida SOUT se pone en estado espacio
(a 0), sólo afecta a SOUT y no a la lógica de transmisión. Esto permite a la CPU
alertar a un terminal del sistema sin transmitir caracteres erróneos o extraños si se
siguen estas fases: 1) cargar un carácter 0 en respuesta a THRE, 2) activar Break
Control en respuesta al próximo THRE, 3) esperar a que el transmisor esté inactivo
(TEMT=1) y bajar Break Control. Durante el Break, el transmisor puede usarse como
un preciso temporizador de carácter.
El bit DLAB (Divisor Latch Access Bit) puesto a 1 permite acceder a los Latches
divisores DLL y DLM del BRG en lectura y escritura. Para acceder al RBR, THR y al
IER debe ser puesto a 0.

Line Status Register (LSR)

0 TEMT THRE BI FE PE OE DR
7 6 5 4 3 2 1 0

Transmitter Transmitter Overrun Error


Empty Holding Parity Error
Register Data Ready
Framing Error
Empty
Break Interrupt

Por lo general, este es primer registro consultado después de una interrupción. DR


está activo cuando hay un carácter listo en el RBR y es puesto a 0 cuando se lee el
RBR. Los bits 1 al 4 de este registro (OE, PE, FE y BI) son puestos a 0 al consultarlos
-cuando se lee el LSR- y al activarse pueden generar una interrupción de prioridad 1
si ésta interrupción está habilitada. OE se activa para indicar que el dato en el RBR no
ha sido leído por la CPU y acaba de llegar otro que lo ha sobreescrito. PE indica si
hay un error de paridad. FE indica si el carácter recibido no tiene los bit de stop
correctos. BI se activa cuando la entrada de datos es mantenida en espacio (a 0)
durante un tiempo superior al de transmisión de un carácter (bit de inicio + bits de
datos + bit de paridad + bit de parada).

THRE indica que el 8250 puede aceptar un nuevo carácter para la transmisión: este
bit se activa cuando el THR queda libre y se desactiva escribiendo un nuevo carácter
en el THR. Se puede producir, si está habilitada; la interrupción THRE (prioridad 3);
INTRPT se borra leyendo el IIR. El 8250 emplea un registro interno para ir
desplazando los bit y mandarles en serie (el Transmitter Shift Register), dicho registro
se carga desde el THR. Cuando ambos registros (THR y el Transmitter Shift) están
vacíos, TEMT se activa; volverá a desactivarse cuando se deje otro dato en el THR
hasta que el último bit salga por SOUT.

Ing. Antonio Román V. – UNEXPO PUERTO ORDAZ


184 Microprocesadores de 16 bits y tecnología PC

Modem Control Register (MCR)

0 0 0 LOOP OUT2 OUT1 RTS DTR


7 6 5 4 3 2 1 0

Request To Send

Data Terminal Ready

Este es el registro de contro para modems. Las líneas de salida DTR, RTS, OUT1 y
OUT2 están directamente controladas por estos bits; como se activan a nivel bajo, son
puestas a 0 escribiendo un 1 en estos bits y viceversa. Estas líneas sirven para
establecer diversos protocolos de comunicaciones.

El bit LOOP introduce el 8250 en un modo lazo (o bucle) de autodiagnóstico. Con


LOOP activo, SOUT pasa a estado de marca (a 1) y la entrada SIN es desconectada.
Los registros de desplazamiento empleados en la transmisión y la recepción son
conectados entre sí. Las cuatro entradas de control del modem (CTS, DSR, DC y RI)
son desconectadas y en su lugar son internamente conectadas las cuatro salidas de
control del modem (DTR, RTS, OUT1 y OUT2) cuyos pines son puestos en estado
inactivo (alto). En esta modalidad de operación (modo lazo o bucle), los datos
transmitidos son inmediatamente recibidos, lo que permite comprobar el correcto
funcionamiento del integrado. Las interrupciones son completamente operativas en
este modo, pero la fuente de estas interrupciones son ahora los 4 bits bajos del MCR
en lugar de las cuatro entradas de control. Estas interrupciones están aún controladas
por el IER.

Modem Status Register (MSR)

DCD RI DSR CTS DDCD TERI DDSR DCTS


7 6 5 4 3 2 1 0

Data Ring Data Clear Delta Trailing Delta Delta


Carrier Indicator Set To Data Edge Data Clear
Detect Ready Send Carrier of Ring Set To
Detect Indicator Ready Send

Además de la información de estado del modem, los 4 bits bajos (DDCD, TERI,
DDSR, DCTS) indican si la línea correspondiente, en los 4 bits superiores, ha
cambiado de estado desde la última lectura del MSR; en el caso de TERI sólo indica
transiciones bajo-<alto en -RI (y no las de sentido contrario). La línea CTS del
modem indica si está listo para recibir datos del 8250 a través de SOUT (en el modo
lazo este bit equivale al bit RTS del MCR). La línea DSR del modem indica que está
listo para dar datos al 8250 (en el modo lazo -o LOOP- equivale al bit DTR del
MCR). RI y DCD indican el estado de ambas líneas (en el modo lazo se corresponden

Ing. Antonio Román V. – UNEXPO PUERTO ORDAZ


Comunicaciones seriales 185

con OUT1 y OUT2 respectivamente). Al leer el MSR, se borran los 4 bits inferiores
(que en una lectura posterior estarían a 0) pero no los bits de estado (los 4 más
significativos).

Los bits de estado (DCD, RI, DSR y CTS) reflejan siempre la situación de los pines
físicos respectivos (estado del modem). Si DDCD, TERI, DDSR ó DCTS están a 1 y
se produce un cambio de estado durante la lectura, dicho cambio no será reflejado en
el MSR; pero si están a 0 el cambio será reflejado después de la lectura. Tanto en el
LSR como en el MSR, la asignación de bits de estado está inhibida durante la lectura
del registro: si se produce un cambio de estado durante la lectura, el bit
correspondiente será activado después de la misma; pero si el bit ya estaba activado y
la misma condición se produce, el bit será borrado tras la lectura en lugar de volver a
ser activado.

Baud Rate Select Register (BRSR)


Son los registros DLL (parte baja) y DLM (parte alta). Estos dos registros de 8 bits
constituyen un valor de 16 bits que será el divisor que se aplicará a la frecuencia base
para seleccionar la velocidad a emplear. Dicha frecuencia base (por ejemplo, 1.8432
MHz) será dividida por 16 veces el valor almacenado aquí. Por ejemplo, para obtener
2400 baudios:
1843200 / (16 x 2400) = 48 => DLL=48, DLM=0

Receive Buffer Register (RBR)


El circuito receptor del 8250 es programable para 5, 6, 7 u 8 bits de datos. En el caso
de emplear menos de 8, los bits superiores de este registro quedan a 0. Los datos
entran en serie por SIN (comenzando por el bit D0) en un registro de desplazamiento
gobernado por el reloj de RCLK, sincronizado con el bit de inicio. Cuando un
carácter completa el registro de desplazamiento de recepción, sus bits son volcados al
RBR y el bit DR del LSR es activado para indicar a la CPU que puede leer el RBR.
El diseño del 8250 permite la recepción continua de datos sin pérdidas: el RBR
almacena siempre el último carácter recibido dando tiempo suficiente a la CPU para
leerlo mientras simultáneamente está cargando el registro de desplazamiento con el
siguiente; si la CPU tarda demasiado un nuevo dato podría aparecer en el RBR antes
de haber leído el anterior (condición de overrun, bit OE del LSR).

Transmitter Holding Register (THR)


El registro de retención de transmisión almacena el siguiente carácter que va a ser
transmitido en serie mientras el registro de desplazamiento de transmisión está
enviando el carácter actual. Cuando el registro de desplazamiento se vacíe, será
cargado desde el THR para transmitir el nuevo carácter. Al quedar vacío THR, el bit
THRE del LSR se activa. Cuando estén vacíos tanto el THR como el registro de
desplazamiento de transmisión, el bit TEMT del LSR se activa.

Ing. Antonio Román V. – UNEXPO PUERTO ORDAZ


186 Microprocesadores de 16 bits y tecnología PC

Scratchpad Register (SCR)


Este registro no es empleado por el 8250, y de hecho no existía en las primeras
versiones del integrado. Puede ser empleado por el programador como una celdilla de
memoria.

Interrupt Identification Register (IIR)


Existen 4 niveles de prioridad en las interrupciones generables por el 8250, por este
orden:

• Estado de la línea de recepción


• Dato recibido disponible
• Registro de retención de transmisión vacío
• Estado del modem

La información que indica que hay una interrupción pendiente y el tipo de la misma
es almacenada en el IIR. El IIR indica la interrupción de mayor prioridad pendiente.
No serán reconocidas otras interrupciones hasta que la CPU envíe la señal de
reconocimiento apropiada. En el registro IIR, el bit 0 indica si hay una interrupción
pendiente (bit 0=0) o si no la hay (bit 0=1), esto permite tratar las interrupciones en
modo polled consultando este bit. Los bits 1 y 2 indican el tipo de interrupción. Los
restantes están a 0 en el 8250, pero el 16550 utiliza alguno más.

DSD RI DSR CTS DDCD


7 6 5 4 3 2 1 0
1 Interrupcion pendiente
1 1 Cola FIFO activada en 16550 x x Identificación de la interrupción
0 0 Cola FIFO no activada
A 1 en el 16550 si esta
pendiente la interrupcion
TIMEOUT

Identificación de Activación / Reconocimiento de la interrupción


interrupción
Bit 2 Bit 1 Bit 0 Prioridad Bandera Origen Reconocimiento
x x 1 Ninguna Ninguna
1 1 0 Primera Línea de estado del receptor OE, PE, FE o BI Lee LSR
1 0 0 Segunda Recibido dato disponible Recibido dato disponible Lee RBR
0 1 0 Tercera THRE THRE Lee IIR si es la fuente de
interrupción, o escribir THR
0 0 0 Cuarta Estado del modem CTS, DSR, RI, DCD Lee MSR

Interrupt Enable Register (IER)


Este registro de escritura se utiliza para seleccionar qué interrupciones activan
INTRPT y, por consiguiente, van a ser solicitadas a la CPU. Deshabilitar el sistema
de interrupciones inhibe el IIR y desactiva la salida INTRPT.

Ing. Antonio Román V. – UNEXPO PUERTO ORDAZ


Comunicaciones seriales 187

0 0 0 0 IER(3) IER(2) IER(1) IER(0)


7 6 5 4 3 2 1 0

IER0: a 1 si se habilita interrupcion de dato disponible


IER1: a 1 si se habilita interrupcion de registro de retencion de transmision vacio
IER2: a 1 si se habilita interrupcion de error de recepcion (bits 1 al 4 del LSR)
IER3: a 1 si se habilita interrupcion ante el cambio del MSR (Modem Status Register

El 16550 genera también una interrupción de TIMEOUT (prioridad 1) si hay datos en


la cola FIFO y no son leídos dentro del tiempo que dura la recepción de 4 bytes o si
no se reciben datos durante el tiempo que tomaría recibir 4 bytes.

FIFO Control Register (FCR)


Sólo disponible en el 16550, no en el 8250

7 6 5 4 3 2 1 0

Habilita el borrado de colas


0 0 1 byte A 1 si hay cambio en los pines 1 FIFO, XMIT y RCVR
READY y TXRDY de modo 0
0 1 4 bytes
al modo 1 1 Borrar cola RCVR
1 0 8 bytes
1 1 14 bytes 1 Borrar cola XMIT
Tamaño de la cola

El bit 0 debe estar a 1 para escribir los bits 1 ó 2. Cuando el bit 1 ó el 2 son activados,
la cola afectada es borrada y el bit es devuelto a 0. Los registros de desplazamiento de
la transmisión y la recepción, en cada caso, no resultan afectados.

Transmisión y recepción de datos


La sección de transmisión del 8250 consiste en el Registro de Retención de
transmisión (THR), el Registro de Desplazamiento de la Transmisión (TSR) y en la
lógica de control asociada. Dos bits en el LSR indican si está vacío el THR (bit
THRE) o el TSR (bit TEMT). El carácter de 5-8 bits a ser transmitido es escrito en el
THR; la CPU debería realizar esta operación sólo si THRE está activo: este bit es
activado cuando el carácter es copiado del THR al TSR durante la transmisión del bit
de inicio.

Cuando el transmisor está inactivo, tanto THRE como TEMT están activos. El primer
carácter escrito provoca que THRE baje; tras completarse la transferencia vuelve a
subir aunque TEMT permanecerá bajo mientras dure la transferencia en serie del
carácter a través de TSR. Si un segundo carácter es escrito en THR, THRE vuelve a
bajar y permanecerá bajo hasta que el TSR termine la transmisión, porque no es
posible volcar el contenido de THR en TSR hasta que este último no acabe con el
carácter que estaba transmitiendo. Cuando el último carácter ha sido transmitido fuera

Ing. Antonio Román V. – UNEXPO PUERTO ORDAZ


188 Microprocesadores de 16 bits y tecnología PC

del TSR, TEMT vuelve a activarse y THRE también lo hará tras un cierto tiempo (el
que tarda en escribirse THR en TSR).
En la recepción, los datos en serie asíncronos entran por la patilla SIN. El estado
inactivo de la línea se considera el '1' lógico. Un circuito de detección de bit de inicio
está continuamente buscando una transición alto-<bajo que interrumpa el estado
inactivo. Cuando la detecta, se resetea un contador interno y cuenta 7½ pulsos de
reloj (tener en cuenta que la frecuencia base es dividida por 16), posicionándose en el
centro del bit de inicio. El bit de inicio se considera válido si SIN continúa aún bajo
en ese momento. La validación del bit de inicio evita que un ruido espúreo en la línea
sea confundido con un nuevo carácter.
El LCR tiene toda la información necesaria para la recepción: tamaño del carácter (5-
8 bits), número de bits de stop, si hay paridad o no... la información de estado que se
genere será depositada en el LSR. Cuando un carácter es transmitido desde el
Registro de Desplazamiento de la Recepción (RSR) al Registro Buffer de Recepción
(RBR), el bit DR del LSR se activa. La CPU lee entonces el RBR, lo que hace bajar
de nuevo DR. Si el carácter no es leído antes de que el siguiente carácter que se está
formando pase del RSR al RBR, el bit OE (overrun) del LSR se activa. También se
puede activar PE en el LSR si hay un error de paridad. Finalmente, la circuitería que
chequea la validez del bit de stop podría activar el bit FE del LSR en caso de error.

El centro del bit de inicio se define como 7½ pulsos de reloj; si los datos que entran
por SIN constituyen una onda cuadrada simétrica, el centro de las celdas que
contienen los bits se desviará a lo sumo un ±3.125% del centro real, lo que deja un
margen de error del 46.875%; el bit de inicio puede comenzar, como mucho, 1 ciclo
de reloj (de los 16) antes de ser detectado.

Baud Rate Generator (BGR)


El BRG genera las señales de reloj para el funcionamiento de la UART, permitiendo
los ratios de transferencia del estándar ANSI/CCITT. Se puede conectar un cristal a
XTAL1 y XTAL2 ó una señal de reloj a XTAL1. La salida -BAUDOUT puede
excitar la línea XTAL1 de otro 8250.

La velocidad es determinada por los registros DLL y DLM almacenando un valor


divisor de la frecuencia del reloj conectado al 8250. El resultado debe ser 16 veces
mayor que la frecuencia en baudios deseada, ya que el 8250 utiliza 16 pulsos de reloj
para cada bit. El siguiente cuadro resume los valores que hay que asignar al divisor
para lograr las frecuencias más usuales con los cristales más comunes.

Cristal de 18.432 MHz Cristal de 2.4576 MHz Cristal de 3.072 MHz


Baudios Divisor usado % error si Divisor usado % error si Divisor usado % error si
Finales para 16xReloj lo hay para 16xReloj lo hay para 16xReloj lo hay
50 2304 3072 3840
75 1536 2048 2560
110 1047 0.026 1396 0.026 1745 0.026
134.5 857 0.058 1142 0.0007 1428 0.034
150 768 1024 1280

Ing. Antonio Román V. – UNEXPO PUERTO ORDAZ


Comunicaciones seriales 189

300 394 512 640


600 192 256 320
1200 96 128 160
1800 64 85 0.392 107 0.315
2000 58 0.69 77 0.260 96
2400 48 64 80
3600 32 43 0.775 53 0.628
4800 24 32 40
7200 16 21 1.587 27 1.23
9600 12 16 20
19200 6 8 10
38400 3 4 5
56000 2 2.86 - -

Iniciar (RESET) el 8250


Tras dar corriente al 8250 hay que tenerlo unos 500 ns con MR alto para resetearlo.
Un nivel alto en MR provoca:

• Se inicializan los contadores internos de transmisión y recepción


• Se limpia el LSR salvo en sus bits TEMT y THRE (que son puestos a 1).
MCR, todas las líneas discretas, elementos de memoria y demás son puestos a
0. DLL y DLM, RBR y THR no son afectados
• Tras el reset (MR llevado a estado bajo) el 8250 permanece en estado inactivo
hasta ser programado. Un reset hardware activa THRE y TEMT: cuando las
interrupciones sean habilitadas, THRE provocará una

Por software se puede forzar al 8250 a retornar a un estado totalmente conocido.


Dicho reset consiste en escribir el LCR, DLL y DLM, así como MCR. LSR y RBR
deberían ser leídos antes de habilitar las interrupciones para borrar cualquier
información residual (datos o estado) de las operaciones anteriores.

Registro / Señal Control del reset Efecto del reset en el 8250


IER MR Todos los bits a 0
IIR MR Bit 0=1, Bits 1 y 2=0, los demás=0
LCR MR Todos los bits a 0
MCR MR Todos los bits a 0
LSR MR Todos los bits a 0, excepto 5 y 6=1
MSR MR Bits 0-3=0, bits 4-7 señal entrada
SOUT MR En alto
INTRPT (RCVR) Leer LSR / MR En bajo
INTRPT (RCVR dato listo) Leer RSR / MR En bajo
INTRPT (THRE) Leer IIR / Escribir THR /MR En bajo
INTRPT (Cambios status modem) Leer MSR / MR En bajo
OUT2 MR En alto
RTS MR En alto
DTR MR En alto
OUT1 MR En alto

Ing. Antonio Román V. – UNEXPO PUERTO ORDAZ


190 Microprocesadores de 16 bits y tecnología PC

Rutinas BIOS del puerto serial


El BIOS del PC proporciona 6 funciones para controlar la transmisión y recepción de
datos del puerto serial. Estas funciones están divididas en 2 categorías: las que
proporcionan control de protocolo o status, y las que transmiten y reciben datos.
Estas funciones son:

Función Etiqueta Definición

00 INIT Inicializa el puerto serial.


01 XMIT Envía un carácter.
02 RECV Recibe un carácter.
03 STATUS Obtiene el estado del puerto serial.
04 EXTENDED_INIT Inicialización extendida del puerto serial.

INIT
Esta función establece la rata de baudios(baud rate), el número de bits de parada
(stop), paridad y longitud del carácter en un puerto serial especifico. Esta retorna el
contenido del registro de estado de línea y el registro de estado de modem del puerto
especificado.

MOV AH, 00H ; Servicio #00


MOV AL, ATRIBUTO_PUERTO ; Atributos del puerto
MOV DX, NUMERO_PUERTO ; No. de puerto (0=COM1, 1=COM2,...)
INT 14H ; Llama al servicio de puerto serial.

Retorna:
AH = Estado de línea
AL = Estado del módem

ATRIBUTOS DEL PUERTO

Bits Dato Definición

7-5 111 9600 baudios


110 4800 baudios
101 2400 baudios
100 1200 baudios
011 600 baudios
010 300 baudios
001 150 baudios
000 110 baudios

4-3 x0 sin paridad


11 paridad par

Ing. Antonio Román V. – UNEXPO PUERTO ORDAZ


Comunicaciones seriales 191

01 paridad impar

2 0 1 bit de parada
1 2 bits de parada

1-0 00 5 bits de datos


01 6 bits de datos
10 7 bits de datos
11 8 bits de datos

REGISTRO AH

Bit Dato Definición

7 1 Timeout Error
6 1 Transmit Shitf Register Empty
5 1 Transmit Hold Register Empty
4 1 Break Received
3 1 Character framing Error
2 1 Parity Error
1 1 Overrun Error
0 1 Data Set Ready

REGISTRO AL

Bit Dato Definición

7 1 Receive Line Signal Detected


6 1 Ring Indicator Line State
5 1 Data Set Ready Line State
4 1 Clear To Send Line State
3 1 Change in Receive Line Detected
2 1 Trailing Edge of Ring Detected
1 1 Change in Data Set Ready
0 1 Change in Clear To Send State

Ing. Antonio Román V. – UNEXPO PUERTO ORDAZ


192 Microprocesadores de 16 bits y tecnología PC

Ejemplo:

MOV AH, INIT ; AH = 00h


MOV AL, 11100111B ; 9600 baudios, sin paridad, 2 bits de parada, 8 bits
; de datos.
MOV DX, 0 ; Enviarlo al puerto COM1
INT 14h ; Llama al manejador serial.

XMIT
Esta función transmite un byte de datos a través del puerto serial definido por el
registro DX.

MOV AH, 01h ; Función XMIT


MOV AL, DATO ; Dato a enviar
MOV DX, PUERTO ; Puerto a usar (0=COM1, 1=COM2,...)
INT 14h ; Llama al servicio

Retorna:
AH = Estado de línea
AL = Estado de modem
AX (alterado)

RECV
Esta función lee un byte de datos del puerto definido por DX.

MOV AH, 02h ; Función RECV


MOV DX, PUERTO ; Puerto a usar (0=COM1, 1=COM2,...)
INT 14h ; Llama al servicio.
Retorna:
AH = Estado de línea
AL = Si no hay error: Byte de datos recibido
AX (alterado)

STATUS
Esta función proporciona el estado del puerto serial definido en DX.

MOV AH, 03h ; Función STATUS


MOV DX, PUERTO ; Puerto a usar (0=COM1, 1=COM2,...)
INT 14h ; Llama al servicio

Ing. Antonio Román V. – UNEXPO PUERTO ORDAZ


Comunicaciones seriales 193

Retorna:
AH = Estado de línea
AL = Estado del modem
AX (alterado)

EXTENDED_INIT
Esta función ajusta el operación del puerto serial (paridad, parada, datos y velocidad)
en el puerto serial definido. Esta función proporciona más opciones que la función
INIT, pero requiere muchísimos más datos en varios registros.

MOV AL, BREAK ;Define posibilidad de suspender


; la transmisión/recepción
MOV BH, PARIDAD ; Define la paridad
MOV BL, PARADA ; Define bits de parada
MOV CH, DATOS ; Define la longitud del dato a transmitir/recibir
MOV CL, BAUDIOS ; Define la velocidad en baudios
INT 14h ; Llama al servicio

Definiciones:

AL = BREAK
00h = No break
01h = Break

BH = PARIDAD
00h = Sin paridad
01h = Paridad impar
02h = Paridad par
03h = Engancha en paridad impar
04h = Engancha en paridad par
BL = PARADA
00h = 1 bit de parada
01h = 2 bits de parada si el dato es de 6, 7, u 8 bits
1,5 bits de parada si el dato es de 5 bits

CH = DATOS
00h = 5 bits
01h = 6 bits
02h = 7 bits
03h = 8 bits

CL = BAUDIOS
00h = 110 baudios
01h = 150 baudios

Ing. Antonio Román V. – UNEXPO PUERTO ORDAZ


194 Microprocesadores de 16 bits y tecnología PC

02h = 300 baudios


03h = 600 baudios
04h = 1200 baudios
05h = 2400 baudios
06h = 4800 baudios
07h = 9600 baudios
08h = 19200 baudios

Autodiagnóstico del 8250


El siguiente programa de ejemplo coloca el 8250 en modo lazo (LOOP) y
seguidamente comienza a transmitir datos de 8 bits (desde 0 hasta 255) comprobando
que le llegan los mismos datos que envía y sin que se produzcan errores. Se permite
elegir el puerto deseado así como la velocidad de transmisión.
/*********************************************************************
* *
* 8250T.C 1.0 - UTILIDAD DE AUTODIAGNOSTICO DEL 8250 EN TURBO C *
* *
*********************************************************************/

#include <dos.h>
#include <conio.h>

#define LCR (base+3) /* registro de control de línea */


#define IER (base+1) /* registro de activación de interrupciones */
#define DLL (base+0) /* parte baja del divisor */
#define DLM (base+1) /* parte alta del divisor */
#define MCR (base+4) /* registro de control del modem */
#define LSR (base+5) /* registro de estado de línea */
#define RBR (base+0) /* registro buffer de recepción */
#define THR (base+0) /* registro de retención de transmisión */

#define DR 1 /* bit dato disponible del LSR */


#define OE 2 /* bit de error de overrun del LSR */
#define PE 4 /* bit de error de paridad del LSR */
#define FE 8 /* bit de error en bits de stop del LSR */
#define BI 0x10 /* bit de error de break en el LSR */
#define THRE 0x20 /* bit de THR vacío */

void error()
{
printf ("\r ¡¡Fallo del puerto serie!!\n");
exit (2);
}

void main()
{
unsigned com, base, divisor, dato, entrada, lsr;

printf("\n8250 Test v1.0 - (c) 1993 Ciriaco García de Celis.\n");

printf("- Elige COM (1, 2, ...): "); scanf ("%d", &com);


base=peek(0x40, (com-1)*2);
if (base==0) {
printf("\n ¡El COM elegido no existe para la BIOS!.\n");
exit (1);
}

Ing. Antonio Román V. – UNEXPO PUERTO ORDAZ


Comunicaciones seriales 195

printf("- Elige divisor (1-65535): ");


scanf ("%d", &divisor); if (!divisor) divisor=1;

printf("\nComprobando 8250 en %03Xh a %lu baudios.\nEspera...",


base, 1843200L/divisor/16);

outportb (LCR, 0x83); /* DLAB=1, 8 bits, 1 stop, sin paridad */


outportb (IER, 0);
outportb (DLL, divisor % 256);
outportb (DLM, divisor >> 8);
outportb (MCR, 8+16); /* modo LOOP */
outportb (LCR, 0x03); /* DLAB=0, 8 bits, 1 stop, sin paridad */

for (dato=0; (dato<0x100) && !kbhit(); dato++) {

do { /* esperar por THR vacío */


lsr=inportb(LSR);
if (lsr & (OE|PE|FE|BI)) error();
} while (!(lsr & THRE));

outportb (THR, dato); /* enviar carácter */

do { /* esperar por RBR lleno */


lsr=inportb(LSR);
if (lsr & (OE|PE|FE|BI)) error();
} while (!(lsr & DR));

entrada=inportb (RBR); /* recibir carácter */

if (dato!=entrada) error();
printf ("\rEnviado y recibido byte %d",dato);
}

if (!kbhit())
printf("\rAutodiagnóstico del 8250 en COM%d superado.\n", com);
else
{ getch(); printf("\rTecla pulsada - prueba abortada.\n");}
}

Ejercicios propuestos

1. Utilizando un cable modem nulo, haga un programa que permita comunicar


dos computadoras de tal forma que estas intercambien archivos entre ellas.

2. Diseñe un dispositivo que permita compartir un puerto serial con dos equipos.
Para ellos, deberá hacer un conmutador de puertos, controlado totalmente por
software, que gestione la negociación entre el equipo maestro y los dos
remotos.

3. Utilizando un diodo láser y un fotodiodo, diseñe el hardware y el software


necesarios para establecer una comunicación serial entre dos computadoras
usando un enlace óptico punto a punto.

Ing. Antonio Román V. – UNEXPO PUERTO ORDAZ


196 Microprocesadores de 16 bits y tecnología PC

Ing. Antonio Román V. – UNEXPO PUERTO ORDAZ

También podría gustarte