Técnicas de Programación - granabot.esgranabot.es/Modulos/tpr/Apuntes/TemaESpuertos.pdf · Su...

54
Técnicas de Programación Tema: Entradas y salidas a través de los puertos Índice de contenido Puertos de E/S....................................................................................................................... 3 Puerto paralelo....................................................................................................................... 5 __Norma IEE 1284............................................................................................................... 8 __Registros del puerto paralelo........................................................................................... 8 --Registro de datos.......................................................................................................... 9 --Registro de estado........................................................................................................ 9 --Registro de control........................................................................................................ 9 . Direcciones y nombres en la BIOS y en DOS......................................................... 10 . Señales en los pines y bits de los registros............................................................. 11 __Protocolo de comunicación............................................................................................ 13 --Modo compatible........................................................................................................ 13 --Modo EPP (Enhanced Parallel Port o Puerto paralelo mejorado)............................. 13 --Modo ECP (Extended Capability Port o Puerto de capacidad extendida)................. 15 __Transferencia de datos por los puertos......................................................................... 17 --Modo 1A: ................................................................................................................... 18 --Modo 1B:.................................................................................................................... 18 --Modo 1C: ...................................................................................................................19 --Modo 2: ...................................................................................................................... 20 --Modo 3A: ................................................................................................................... 21 --Modo 3B: ................................................................................................................... 22 Acceso al hardware del PC.................................................................................................. 22 __MS-DOS/Windows 3.1................................................................................................... 22 __Windows 95/98............................................................................................................... 23 __Windows NT, 2000 y XP................................................................................................ 24 __ Interface con los drivers en modo kernel....................................................................... 25 --CREATEFILE.............................................................................................................. 25 --CLOSEHANDLE......................................................................................................... 27 --READFILE..................................................................................................................27 --WRITEFILE................................................................................................................. 27 --DEVICEIOCONTROL................................................................................................. 28 --Estructura OVERLAPPED.......................................................................................... 28 Configuración de Windows 2000-XP para acceder a los puertos....................................... 29 Ejemplo 1: Acceso a puerto paralelo mediante aplicación de consola............................... 31 Puerto serie.......................................................................................................................... 34 __Propiedades del hardware............................................................................................. 34 __Los dispositivos hardware que utilizan cables de comunicación serie se dividen en dos categorías, que son:......................................................................................................... 34 __ Interconexión entre terminales....................................................................................... 37 1 de 54 Tema: Entrada y salida a través de los puertos

Transcript of Técnicas de Programación - granabot.esgranabot.es/Modulos/tpr/Apuntes/TemaESpuertos.pdf · Su...

Técnicas de Programación

Tema: Entradas y salidas a través de los puertos

Índice de contenidoPuertos de E/S.......................................................................................................................3Puerto paralelo.......................................................................................................................5

__Norma IEE 1284...............................................................................................................8__Registros del puerto paralelo...........................................................................................8

--Registro de datos..........................................................................................................9--Registro de estado........................................................................................................9--Registro de control........................................................................................................9

. Direcciones y nombres en la BIOS y en DOS.........................................................10

. Señales en los pines y bits de los registros.............................................................11__Protocolo de comunicación............................................................................................13

--Modo compatible........................................................................................................13--Modo EPP (Enhanced Parallel Port o Puerto paralelo mejorado).............................13--Modo ECP (Extended Capability Port o Puerto de capacidad extendida).................15

__Transferencia de datos por los puertos.........................................................................17--Modo 1A: ...................................................................................................................18--Modo 1B:....................................................................................................................18--Modo 1C: ...................................................................................................................19--Modo 2: ......................................................................................................................20--Modo 3A: ...................................................................................................................21--Modo 3B: ...................................................................................................................22

Acceso al hardware del PC..................................................................................................22__MS-DOS/Windows 3.1...................................................................................................22__Windows 95/98...............................................................................................................23__Windows NT, 2000 y XP................................................................................................24__Interface con los drivers en modo kernel.......................................................................25

--CREATEFILE..............................................................................................................25--CLOSEHANDLE.........................................................................................................27--READFILE..................................................................................................................27--WRITEFILE.................................................................................................................27--DEVICEIOCONTROL.................................................................................................28--Estructura OVERLAPPED..........................................................................................28

Configuración de Windows 2000-XP para acceder a los puertos.......................................29Ejemplo 1: Acceso a puerto paralelo mediante aplicación de consola............................... 31Puerto serie..........................................................................................................................34

__Propiedades del hardware.............................................................................................34__Los dispositivos hardware que utilizan cables de comunicación serie se dividen en dos categorías, que son:.........................................................................................................34__Interconexión entre terminales.......................................................................................37

1 de 54 Tema: Entrada y salida a través de los puertos

--Conexiones null módem con el puerto serie..............................................................37--Conexiones null módem con el puerto paralelo ...................................................39

__El Circuito integrado UART 8250 y compatibles........................................................... 40--Circuitos integrados....................................................................................................40--Registros de la UART 8250........................................................................................46

. RBR (Receiver Buffer Register)...............................................................................47

. BRSR (Baud Rate Select Register).........................................................................47

. THR (Transmitter Holding Register)........................................................................47

. IER (Interrupt Enable Register)................................................................................48

. IIR (Interrupt Identification Register)........................................................................48

. FCR (FIFO Control Register)...................................................................................49

. LCR (Line Control Register).....................................................................................50

. MCR (Modem Control Register)..............................................................................50

. LSR (Line Status Register)......................................................................................51

. MSR (Modem Status Register)................................................................................52

. SCR (Scratch Register)...........................................................................................52

. Circuitos de reloj típicos...........................................................................................52--Programación del 8250..............................................................................................53

2 de 54 Tema: Entrada y salida a través de los puertos

Puertos de E/SLos puertos de entrada/salida (E/S o IN/OUT) son el medio por el que el

microprocesador de un ordenador se comunica con su entorno. Existen puertos para cada interacción de la unidad de procesamiento principal con sus dispositivos auxiliares. Así, existe un puerto de entrada del teclado, un puerto de salida para el adaptador de vídeo, un puerto de entrada para el ratón, etc. Un ordenador personal o PC puede direccionar hasta 64k puertos de E/S designándose cada puerto por un número. En la tabla vemos las direcciones en hexadecimal de algunos de los puertos de E/S.

DirecciónDesde Hasta

Descripción

x0000 x000F Controlador de DMA (acceso directo a memoria)x0020 x0021 Controlador programable de interrupcionesx0040 x0043 Cronómetro del sistemax0060 x0060 Controlador del tecladox0061 x0061 Altavoz del sistemax0064 x0064 Controlador del tecladox0070 x0071 Sistema CMOS/reloj en tiempo realx0081x0087x0089x008F

x0083x0087x008B x0091

Controlador de acceso directo a memoria

x00A0 x00A1 Controlador programable de interrupcionesx00C0 x00DF Controlador de acceso directo a memoriax00F0 x00FF Procesador de datos numéricosx0200 x0207 Puerto de juegos o Creative Gameport Joystickx02F8 x02FF Puerto de comunicaciones (COM2)x0278 x027F Segundo puerto paralelo LPT2x02E8 x02EF Puerto de comunicaciones (COM4)x0378 x037F Printer Port (LPT1)x03E0 x03EF Puerto de comunicaciones (COM3)x03F2 x03F5 Controlador estándar de disquetesx03F8 x03FF Puerto de comunicaciones (COM1)

3 de 54 Tema: Entrada y salida a través de los puertos

En Windows 98, en herramientas de sistema encontramos una entrada titulada Información de sistema, donde podemos ver una información detallada de los puertos de nuestro sistema, como vemos en la figura:

En la figura siguiente vemos lo mismo que antes para un sistema con Windows 2000.

4 de 54 Tema: Entrada y salida a través de los puertos

Y en la figura vemos el detalle para un sistema con Windows XP.

Puerto paraleloEn el año1981 IBM introduce el ordenador personal o PC y con él también el puerto

paralelo (Standart Parallel Port de acrónimo SPP) para utilizarlo como controlador de las impresoras de matriz de puntos. Este puerto tenía la capacidad de transmitir 8 bits de datos simultáneos del PC a la impresora.

Paralelamente aparecieron tres grandes grupos de problemas para desarrolladores y usuarios:

▪ Primero: La máxima velocidad de transferencia alcanzable estaba en 150 kbyte/s y era extremadamente dependiente del software

▪ Segundo:No había un estándar para la interface eléctrica lo que causaba muchos problemas cuando se quería garantizar la operación en múltiples plataformas

▪ Tercero:Su diseño limitaba la distancia de los cables externos hasta un máximo de 1,8 metros.

Desde su introducción el puerto paralelo ha sufrido varias modificaciones para hacerlo más veloz. El puerto original era unidireccional y se creó el puerto bidireccional, que fue introducido con el PS/2.

Hasta la actualidad se han creado además el Enhanced Parallel Port (EPP) y el Extended Capability Port (ECP) que son al puerto estándar lo que es el Pentium al 286.

Aunque inicialmente el puerto paralelo se creó para ser utilizado en la comunicación con impresoras, en la actualidad se utiliza también para manejar otros periféricos como CD ROM, discos duros, tarjetas de red, scanners, unidades externas de almacenamiento, etc.

5 de 54 Tema: Entrada y salida a través de los puertos

Existen por tanto cuatro tipos de puerto paralelo:– Puerto paralelo estándar (Standart Parallel Port SPP)– Puerto Paralelo PS/2 (bidireccional)– Puerto paralelo mejorado (Enhanced Parallel Port EPP)– Puerto de capacidad extendida (Extended Capability Port ECP)En la tabla vemos información de cada uno de estos tipos de puertos.

SPP PS/2 EPP ECPFecha de Introducción 1981 1987 1994 1994

Fabricante IBM IBMIntelXircom Zenith Data Systems

Hewlett PackardMicrosoft

Bidireccional No Si Si SiDMA No No No SiVelocidad 150 Kbyte/seg. 2 Mbytes/seg.

Debido a la acentuada falta de estandarización del interfaz paralelo surgió Centronics como un estándar en este tipo de conexión y a raíz de este interfaz apareció la norma IEEE 1284 para el interfaz paralelo en los ordenadores personales.

La transmisión en paralelo entre un ordenador y un periférico, se basa en la transmisión de datos simultáneamente por varios canales, generalmente 8 bits. Por esto se necesitan 8 cables para la transmisión de cada uno de los bits, mas otros tantos cables para controles del dispositivo, dependiendo el numero de estos del protocolo de transmisión utilizado.

Los principales tipos y nombres de canales utilizados como control son:STROBE: El ordenador comunica, a través de el, al periférico que esta preparado

para transmitir.BUSY: El periférico comunica, a través de el, que no esta preparado para recibir

datos, es decir, que está ocupado.ACKNOWLEDGE: El periférico comunica, a través de el, que esta preparado para

recibir datos, es decir, que está disponible.SELECT y SELECTIN: Para indicar el tipo de error producido en el periférico.ERROR: Indica que se ha producido un error en el periférico.PE: En el caso de la impresora indica que no tiene papel y en general depende del

tipo del periférico.Las líneas son latcheadas, es decir, mantienen siempre el último valor establecido

en ellas salvo que se cambien expresamente, coincidiendo sus valores de tensión y corriente con los estándares TTL:

VH = 2'4 a 5V, VL = 0 a 0'8V, IOUT(max) = 2'6 mA e IIN(max) = 24 mA

En la norma Centronics se establece el nombre y las caracteristicas de 36 líneas eléctricas aunque en realidad, en la tarjeta interface paralelo, para la transferencia de señales de datos y de control solamente se requieren 18 líneas , las restantes son líneas de masa enrolladas alrededor de los cables de señal para proporcionar apantallamiento contra interferencias.

Las tarjetas en el PC incorporan un conector hembra tipo Cannon DB-25 y las impresoras un conector hembra tipo Centronics DB-36.

6 de 54 Tema: Entrada y salida a través de los puertos

Los cables de impresora se construyen con estos dos conectores según la descripción de líneas que vemos en la tabla siguiente:

DB-36 Centronics en la impresora DB-25 Cannon en el PC

DB-25 DB-36 Señal DirecciónPC-PRN Descripción

1 1 /STR → Strobe. Un nivel bajo indica a la impresora que el dato es válido

2 2 D0 → Bit 0 de datos

3 3 D1 → Bit 1 de datos

4 4 D2 → Bit 2 de datos

5 5 D3 → Bit 3 de datos

6 6 D4 → Bit 4 de datos

7 7 D5 → Bit 5 de datos

8 8 D6 → Bit 6 de datos

9 9 D7 → Bit 7 de datos

10 10 /ACK ← Acknowledge. Un nivel bajo indica que la impresora está lista para recibir datos.

11 11 BSY ← Busy. Un nivel alto indica que la impresora está ocupada y no puede recibir datos

12 12 POUT ← Paper Out o Paper End. Imprsora sin papel

13 13 OFON ← Impresora conectada y en linea

14 14 /ALF → Auto Line Feed. Un nivel bajo indica a la impresora que realice un cambio de línea.

15 32 /ERR ← Error. Un nivel bajo indica un error en la impresora.

16 31 /INI → Initialize Printer. Un nivel bajo provoca un reset en la impresora, siempre que esta lo admita.

17 36 /DSL → Select. Un nivel bajo pone en linea a la impresora, siempre que esta lo admita.

18 a 25 19 a 30 y 33 Masa Referencia de tensión para las señales.

16 0V Masa lógica

17 Chasis Conexión al chasis del equipo.

18 +Vcc + 5V DC (50 mA max)

15,34 y 35 No utilizadas

7 de 54 Tema: Entrada y salida a través de los puertos

Norma IEE 1284Es la norma "IEEE Std. 1284-1994 Standard Signaling Method for a Bi-directional

Parallel Peripheral Interface for Personal Computers la que provee una alta velocidad de comunicación bi-direccional entre el ordenador y el periférico externo lo que hace la comunicación de 50 a 100 veces mas rápida que el puerto paralelo original. Además del incremento de velocidad la gran ventaja es que la compatibilidad con todos los periféricos existentes que puedan usar el puerto paralelo.

La norma 1284 define 5 modos de transmisión de datos y cada tipo provee un método de transmisión de datos entre el ordenador y el periférico. Estos modos son:

▪ Ordenador - Periférico:Compatibility Mode: "Centronics" en modo standard

▪ Periférico - Ordenador:Byte Mode: líneas de datos de 8 bits simultáneos, algunas veces puede funcionar como un puerto bidireccional.

▪ Bidireccional.▪ EPP:

Puerto Paralelo mejorado, usado principalmente por periféricos como: CD-ROM, cintas, discos duros, adaptadores de redes, etc. excluyendo las impresoras.

▪ ECP:Puerto de Capacidad Extendida, usado principalmente por scanners e impresoras de nueva generación.

Todos los modos utilizan software solo para la transmisión de datos, el driver se encarga de escribir los datos, comprobar las líneas de unión (BUSY), hacer valer las señales de control apropiadas (STROBE) y luego pasar al siguiente byte. Este software limita la efectiva transmisión de datos a unos ratios de 50 a 100 Kbytes por segundo.

La norma 1284 nos indica lo siguiente:▪ 5 tipos de operaciones para transmitir datos.▪ Un método para el ordenador y el periférico para determinar el modo de transmisión

mantenido y negociar el modo requerido.▪ Define el interfaz físico: Cables y Conectores.▪ Define el interfaz eléctrico: Drivers, Terminación e Impedancia.

Registros del puerto paraleloEl puerto paralelo está formado por 17 líneas de señales y 8 líneas de tierra. Las

líneas de señales están formadas por tres grupos:▪ 4 Líneas de control, usadas para la interface, control e intercambio de mensajes

desde el PC a la impresora. Estas líneas son los pines 1, 14, 16 y 17.▪ 5 Líneas de estado, usadas para intercambio de mensajes, indicadores de

estado desde la impresora al PC (falta papel, impresora ocupada, error en la impresora). Estas líneas son los pines 10, 11, 12, 13 y 15.

▪ 8 Líneas de datos que suministran los datos de impresión del PC hacia la impresora. Estas líneas son los pines 2 a 9.

Las nuevas implementaciones del puerto permiten una comunicación bidireccional mediante las líneas de datos.

Cada una de estas líneas (control, estado, datos) puede ser referenciada de modo independiente mediante un registro. El puerto paralelo tiene por tanto tres registros:

▪ Registro de datos. Se trata de un registro de solo escritura, o sea que solo se puede variar mediante la programación, pero ningún dispositivo lo podrá hacer electrónicamente.

8 de 54 Tema: Entrada y salida a través de los puertos

▪ Registro de estado. Es un registro de solo entrada, o sea, que en este caso solo un dispositivo electrónico lo puede variar, pero mediante software es imposible. Este puerto es el que utiliza la impresora(o el dispositivo electrónico que tengamos conectado) para darnos información sobre su estado.

▪ Registro de control. Se puede modificar tanto por el dispositivo electrónico conectado, como por medio de software.

Registro de datos Para mandar una señal por un pin, lo que tenemos que hacer es activar (poner a uno) su bit correspondiente. Con esto se consigue que el ordenador mande una señal de 5 voltios (estado lógico alto) por el pin deseado. Pero debemos tener claro que el ordenador mantendrá ese bit a 1 hasta que lo pongamos a 0.

Para activar los bits de este registro enviamos un numero codificado en binario a la dirección del registro, que coincide con la dirección base del puerto paralelo (0x378 en LPT1).

A continuación se muestra un esquema de este registro con su distribución de pines y datos. Como se puede observar en este registro se utilizan los ocho bits.

Registro de datos o printer data output (D)bit 7 6 5 4 3 2 1 0Nombre D7 D6 D5 D4 D3 D2 D1 D0Hardware pin 9 8 7 6 5 4 3 2

Registro de estadoEste registro refleja la situación de la impresora o dispositivo conectado al puerto

paralelo permitiendo controlar su comportamiento.Este registro es solo de entrada, por lo que no podremos modificarlo mediante

software, siendo la única forma posible de modificación, la que se realice por medio de un dispositivo conectado al puerto paralelo. Su dirección se obtiene sumándole 0x01 a la dirección base del puerto (0x379 en LPT1).

También tiene una longitud de ocho bits, aunque en este caso se controlan los pins 10, 11, 12, 13 y 15 siendo útiles los bit que van desde el 3 al 7. El bit 2 es utilizado para la IRQ y los bits 1 y 2 son reservados.

A continuación se muestra un esquema de este registro con su distribución de pines y datos. Como se puede observar en este registro se utilizan cinco bits.

Registro de estado o printer status register (S)bit 7 6 5 4 3 2 1 0Nombre /BSY /ACK POUT OFON ERR IRQ (Not) Reservada ReservadaHardware pin 11 10 12 13 15 – – –

El bit BSY del registro de estado (bit 7) es invertido por el hardware y, por tanto, la línea tiene un nivel complementario al que aparece en ese bit.

Registro de controlEste registro permite controlar la transferencia de información con la impresora. Es

bidirecional, lo que quiere decir que se pueden modificar sus bits tanto por software, como por un dispositivo conectado al puerto paralelo. Su dirección se obtiene sumándole 0x02 a la dirección base del puerto (0x37A en LPT1).

9 de 54 Tema: Entrada y salida a través de los puertos

A continuación se muestra un esquema de este registro con su distribución de pines y datos.

Registro de control o printer control register (C)bit 7 6 5 4 3 2 1 0Nombre No usada No usada Bi-dir IRQ /DSL /INI /ALF /STRHardware pin – – – – 17 16 14 1

El bit 5 (C4) pone disponible la interrupción a través de la linea ACK y el bit 6 (C5) establece la bidireccionalidad del puerto.

Direcciones y nombres en la BIOS y en DOSIBM definió tres direcciones base de puerto estándar (según el espacio de

direccionamiento de entrada/salida del 80x86).El Adaptador de Impresora podía usar la dirección base 0x378 y más tarde 0x278,

mientras que la pantalla monocromática y el adaptador de impresora usan la dirección 0x3BC.

La BIOS de IBM define espacio en RAM para 4 direcciones base de puerto paralelo de impresora, almacenado como 4 palabras de 16 bit comenzando en la dirección 0x408 de la memoria principal. Durante el arranque el BIOS comprobará los puertos de impresora en las direcciones base 0x3BC, 0x378, y 0x278 en este orden y almacena las direcciones base de cada uno que encuentre en posiciones consecutivas en esta tabla.

Las entradas no usadas deben ser 0 aunque algunas BIOS las llenan con la primera dirección de puerto encontrada.

La BIOS detecta estos puertos escribiendo 0xAA en el registro de datos (en la dirección base+0 de entrada/salida) y leyendo ese mismo registro de datos en la misma dirección. Deduciendo que hay un puerto instalado si lee 0xAA.

La BIOS también cuenta el número de puertos paralelo encontrados y los guarda en los dos bits siguientes al byte 0x411.

Advertencia: Justo antes de esta tabla hay 4 palabras en 0x400 que contienen hasta 4 entradas para direcciones base de los puertos serie. Al menos debemos saber que algún software puede almacenar más de 4 entradas sucesivas solapando la tabla del puerto paralela, aunque esto es bastante raro.

El MSDOS Y EL DOS DE IBM establecen un mapa de estos dispositivos como LPTn. La primera entrada en la tabla de la BIOS en 0x408 es para LPT1, la segunda para LPT2, y la tercera para LPT3. El dispositivo de MSDOS "PRN" es realmente el alias de software para el puerto que por defecto es LPT1. Usando el comando MODE se puede cambiar este alias. Direcciones de los registros en el puerto paralelo

Registro de R/W IOAddr Bits FunciónDatos (Salida) W Base+0 D0-D7 8 salidas LS TTLEstado (Entrada) R Base+1 S3-S7 5 entradas LS TTL

Control (Salida) W Base+2C0-C3 4 salidas TTL colector abierto

C4 habitila IRQ internaC5 Dato triestado interno (PS/2)

10 de 54 Tema: Entrada y salida a través de los puertos

Señales en los pines y bits de los registros← Entrada

→ SalidaDB25pin

Centpin

Nombre de

la señal

Bit en los

registrosNotas sobre significado de los bits

→ 1 1 -Strobe C0-

Establecer un pulso a nivel bajo con duración > 0'5 us para enviarlo. Control de la linea que permite validar el dato que está en el registro de datos. La puesta a 1 indica a la impresora que el carácter del registro de datos es válido y debe aceptarlo. Es decir, para enviar un carácter, además de ponerlo en el registro de datos, debemos resetear este bit del registro de control y validar el dato volviéndolo a poner a 1.

→ 2 2 Dato 0 D0 Establece el dato menos significativo

→ 3 3 Dato 1 D1

→ 4 4 Dato 2 D2

→ 5 5 Dato 3 D3

→ 6 6 Dato 4 D4

→ 7 7 Dato 5 D5

→ 8 8 Dato 6 D6

El registro de datos es de tipo latch de 8 bits y es donde el procesador, en operaciones de salida, pone el dato que se quiere enviar a la impresora.

→ 9 9 Dato 7 D7 Establece el dato mas significativo

→ 10 10 -ACK S6+IRQ - Pulso bajo ~ 5 us después de aceptar. Indica la transferencia correcta de 1 byte pasando a nivel bajo. Estado alto indica impresora ocupada.

→ 11 11 +BSY S7- Si está a 0 indica que la impresora está ocupada.

→ 12 12 +POUT S5+ Nivel alto indica falta de papel

→ 13 13 +OFON S4+ Cuando está a 1 indica que la impresora no está lista.

→ 14 14 -ALF C1- En estado alto la impresora produce un cambio de linea (LF) cada vez que recibe un retorno de carro (CR).

→ 15 32 -ERR S3+ Cuando está a 0 indica que se ha producido un error en la impresora.

→ 16 31 -INI C2+ Para inicializar la impresora establecer un pulso > 50 us

→ 17 36 -DSL C3-

Permite activar impresoras que funcionan bajo el estándar Centronics. Las impresoras paralelo compatibles no utilizan esta línea disponiendo de su propio pulsador on-line.

=18a

25

19,30,33,16,17

Masas

En el registro de control existe un bit 4 (IRQ) que permite controlar la generación de interrupciones de tipo hardware desde el puerto paralelo. El bit a 1 provoca que el interface genere la petición de interrupción (IRQ7 en LPT1 e IRQ5 en LPT2). La petición de interrupción se produce en la transición H → L de la linea ACK.

11 de 54 Tema: Entrada y salida a través de los puertos

Algunos cables, puertos, o conectores pueden no conectar todas las masas.Si la dirección de los datos es Entrada (←) o Salida (→) se define desde el punto

de vista del PC, no de la impresora.En la tabla siguiente se dan los mismos datos agrupados por registros.

← Entrada

→ SalidaDB25pin

Centpin

Nombre de

la señal

Bit en los

registros

← Entrada

→ SalidaDB25pin

Centpin

Nombre de

la señalBit en losregistros

2 2 Dato 0 D0

3 3 Dato 1 D1

4 4 Dato 2 D2

5 5 Dato 3 D3

6 6 Dato 4 D4

7 7 Dato 5 D5

8 8 Dato 6 D6

9 9 Dato 7 D7

17 36 -DSL C3-

16 31 -INI C2+

14 14 -ALF C1-

1 1 -Strobe C0-

11 11 +BSY S7-

10 10 -ACK S6+

12 12 +POUT S5+

13 13 +OFON S4+

15 32 -ERR S3+

La figura muestra un esquema con la distribución de los pines en un conector hembra con referencia a los registros y a la lógica de cada bit.

Las referencias a cada registro del puerto se realizan de la siguiente forma:– Registro de datos (base): base+0– Registro de estado: base +1– Registro de control: base + 2

Por ejemplo, si la dirección base es 0x378, entonces las direcciones de los registros de datos, estado y control serán:

– Registro de datos: 0x378– Registro de estado: 0x379– Registro de control: 0x37A

Permitiendo cada una de ellas el acceso a los siguientes bits:– Registro de datos: D0, D1, D2, D3, D4, D5, D6, D7– Registro de estado: S3-, S4, S5, S6-, S7– Registro de control: C0-, C1-, C2-, C3-

12 de 54 Tema: Entrada y salida a través de los puertos

Protocolo de comunicaciónEl protocolo de comunicación en el PC y la impresora es el siguiente:

El PC pone el dato en el registro de datos y envía un impulso por la línea de comprobación (strobe) para indicar dato válido. La impresora lee las líneas de datos y, mientras los procesa, mantiene activa la línea busy indicando que está ocupada. Una vez procesado el dato se activa la línea de reconocimiento (acknowledge) desactivando busy. Si en la impresora se produce algún error se indica por la línea correspondiente.

Modo compatibleSe trata de la forma de transmisión descrita anteriormente y que sigue los

siguientes pasos en la fase de transmisión:1. Escribir los datos en el registro de datos.2. Leer el registro de estado para comprobar que la impresora no esta ocupada.3. Si no esta ocupada se escribe el registro de control para validar la línea

STROBE.4. Escribir el registro de control para volver a su estado anterior la línea STROBE.En la figura siguiente se describe mediante un cronograma el método de

transmisión descrito:

Como se puede observar, para sacar 1 byte de información se necesitan 4 instrucciones de E/S, limitando las capacidades de ancho de banda del puerto al orden de 150 kbytes/segundo.

Muchos controladores de E/S integrados han implementado un modo que, conservando su compatibilidad con éste, utiliza un buffer FIFO para transferir datos. Se le conoce como "Fast Centronics" o "Modo FIFO de puerto paralelo". Las velocidades que pueden alcanzarse con él son de mas de 500 kbytes/segundo, aunque este no está descrito en la norma IEEE 1284.

Modo EPP (Enhanced Parallel Port o Puerto paralelo mejorado)El protocolo EPP fue originalmente desarrollado por Intel, Xircom y Zenith Data

Systems, como una manera de obtener un puerto paralelo de alta resolución totalmente compatible con el puerto paralelo estándar. Esta capacidad fue implementada por Intel en el procesador 386SL.

Dadas sus ventajas, la mayoría de fabricantes de periféricos que utilizaban puertos paralelos lo adoptaron hasta el punto que una asociación de ochenta fabricantes se unió

13 de 54 Tema: Entrada y salida a través de los puertos

para el desarrollo de este protocolo y que se denominó Comité EPP.El protocolo EPP realiza cuatro ciclos de transferencia:

1 Ciclo de escritura de datos2 Ciclo de lectura de datos

Pensados para transferir datos tanto al ordenador como al periférico.

3 Ciclo de escritura de direcciones4 Ciclo de lectura de direcciones

Son usados para transferir direcciones, canales, comandos e información de control.

Señales EPP y sus asociadas SPPSeñal SPP Nombre EPP In/Out Descripción

Strobe Write OUT Inactivo operación de escritura. Activo ciclo de lectura.

Autofeed Datastb OUT Inactivo indica operación de lectura o escritura de datos en proceso.

Selectin Addrstb OUT Inactivo indica operación de lectura o escritura de direcciones en proceso.

Init Reset OUT Inactivo resetea periféricoAck Intr IN El periférico genera una interrupción al ordenador

Busy Wait IN Inactivo valida el comienzo del ciclo Activo valida el final del ciclo

D[8:1 Ad[8:1 BI-DI Direcciones y datos fluyen bi-direccionalmentePE

SelectError

Definido por usuario

INININ

Diferentes usos según periférico

Las fases de transmisión de un ciclo de escritura de datos son:1. El programa ejecuta un ciclo de escritura E/S al puerto 4 (Puerto de datos EPP).2. La línea Write indica la salida de datos hacia el puerto paralelo.3. Se confirma el DataStrobe ya que el canal Wait esta desactivado.4. Reconocimiento del puerto desde el periférico.5. DataStrobe se desconecta y finaliza el ciclo EPP.6. El ciclo ISA E/S finaliza.7. El canal Wait es desactivado para indicar que el próximo ciclo puede comenzar.Vemos esto gráficamente en el siguiente cronograma:

14 de 54 Tema: Entrada y salida a través de los puertos

Una de las características mas importantes es que la transferencia de datos ocurre en un ciclo ISA E/S. El resultado es que mediante el uso del protocolo EPP para la transmisión de datos un sistema puede mejorar la velocidad de transmisión desde 500 k hasta 2Mbytes por segundo, de esta manera los periféricos de puertos paralelos pueden operar tan eficientemente como un periférico conectado directamente a la placa.

En la anterior figura el canal DataStrobe puede conectarse porque el canal Wait esta desactivado, el canal Wait se desactiva en respuesta a un canal DataStrobe conectado, un canal DataStrobe se desactiva en respuesta a que un canal Wait esta siendo desconectado.

La figura siguiente muestra un ejemplo de un ciclo de lectura de direcciones:

Modo ECP (Extended Capability Port o Puerto de capacidad extendida)Este protocolo fue propuesto por Hewlett Packard y Microsoft como un modo

avanzado para la comunicación de periféricos del tipo escaner e impresora. Proporciona una alta resolución en la comunicación bidireccional entre el adaptador del ordenador y el periférico con los siguientes ciclos en ambas direccionesྭ:

Ciclos de DatosCiclos de Comandos

Las características principales del ECP incluyen:▪ RLE (Run Length Encoding) o compresión de datos en los ordenadores;▪ FIFO para los canales directo e inverso, y;▪ DMA.La característica RLE mejora la compresión de datos en tiempo real logrando una

compresión superior a 64:1.

Los pasos en la fase de transmisión directa son:

1. El ordenador sitúa los datos sobre las líneas de datos, inicia un ciclo de datos activando el HostAck.

2. El ordenador desactiva HostClk para indicar un dato valido.3. El periférico reconoce el ordenador activando PeriphAck.4. El ordenador activa HostClk. Este es el punto que debería ser usado para cerrar

los datos al periférico.5. El periférico desactiva PeriphAck indicando que esta preparado para recibir el

siguiente byte.6. El ciclo se repite pero en un ciclo de comando ya que HostAck esta

desactivado.La siguiente tabla describe las señales de este protocolo:

15 de 54 Tema: Entrada y salida a través de los puertos

Señales EPP y sus asociadas SPPSeñal SPP Nombre ECP In/Out Descripción

Strobe HostClk OUT Usado con PeriphAck para transmitir datos o direcciones en la dirección directa.

Autofeed HostAck OUT

Proporciona estado de datos y de comando en la dirección directa. Usado con PeriphClk transfiere datos en la dirección inversa.

Selectin 1284Active OUT Se activa cuando el ordenador esta en el modo de transmisión 1284.

Init ReverseRequest OUT Se desactiva para colocar el canal en dirección inversa.

Ack PeriphClk IN Usado con HostAck para transmisión de datos en la dirección inversa.

Busy PeriphAck IN

Usado con HostClk para transmisión de información de datos o direcciones en la dirección directa. Proporciona estado de comandos y datos en la dirección inversa.

Data[8:1 Data[8:1 BI-DI Usado para proporcionar datos entre el periférico y el ordenador.

PE AckReverse IN Desactivado para reconocer Reverse Request.Select Xflag IN Flag de extensibilidad.

Error PeriphRequest IN Desactivado por el periférico para indicar que es posible la transferencia inversa.

Los pasos en la fase de transmisión directaྭson:1. El ordenador sitúa los datos sobre las líneas de datos, inicia un ciclo de datos

activando el HostAck.2. El ordenador desactiva HostClk para indicar un dato valido.3. El periférico reconoce el ordenador activando PeriphAck.4. El ordenador activa HostClk. Este es el punto que debería ser usado para cerrar

los datos al periférico.5. El periférico desactiva PeriphAck indicando que esta preparado para recibir el

siguiente byte.6. El ciclo se repite pero en un ciclo de comando ya que HostAck esta

desactivado.La figura siguiente muestra los dos ciclos de transmisión de datos directos. Cuando

HostAck esta activado indica que se lleva a cabo un ciclo de datos y cuando esta desactivado se lleva a cabo un ciclo de comandos, los datos representan un calculo de RLE o un canal de direcciones. El bit 8 del byte de datos se usa para indicar una RLE, si el bit 8 es cero entonces los bits del 1 al 7 representan un calculo de la longitud de cadena de transmisión, si el bit es 1 entonces los bits 1 al 7 representan un canal de dirección.

16 de 54 Tema: Entrada y salida a través de los puertos

Los pasos en la fase de transmisión inversa son:▪ El ordenador pide una transmisión por el canal inverso desactivando

ReverseRequest.▪ El periférico señala que esta de acuerdo para proceder desactivando

AckReverse.▪ El periférico sitúa los datos sobre las líneas de datos e indica un ciclo de datos

activando PeriphAck.▪ El periférico desactiva PeriphClk para indicar un dato valido.▪ El ordenador reconoce la señal activando HostAck.▪ El periférico PeriphClk. Esta manera debería ser usada para guardar los datos en

el ordenador.▪ El ordenador desactiva HostAck para indicar que esta preparado para el

siguiente byte.▪ El ciclo se repite pero esta vez es un ciclo de comando porque PeriphAck esta

desactivado.La figura siguiente muestra el proceso inverso de transferencia. Con el protocolo

ECP los cambios en la dirección de datos deben ser negociados, el ordenador debe pedir una transmisión por el canal inverso desactivando el canal ReverseRequest, entonces esperar que el periférico reconozca la señal desactivando AckReverse. Solamente entonces puede llevarse a cabo una transmisión de datos por canal inverso.

Transferencia de datos por los puertosHay tres modos básicos de conectar puertos paralelo para transferir datos entre

ellos. El más común conecta D0-D4 (o D3-D7) de un puerto a S3-S7 de otro puerto, y viceversa. De este modo podemos enviar 4 bits de datos por uno (por ejemplo D0-D3) y leerlos en el otro (por ejemplo S3-S6). Podemos usar otro bit (por ejemplo D4/S7) para la sincronización (por ejemplo: Datos Listo).

17 de 54 Tema: Entrada y salida a través de los puertos

En este esquema debemos recordar que S3-S6 son bits de lectura y D0-D3 de escritura.

Seguidamente desglosamos los modos de transferencia y la forma de realizar los cableados para la transferencia de datos por el puerto paralelo.

Modo 1A: Utiliza para salida el registro de datos y para entrada el registro de estados.

Conector 1 Pin Dirección Pin Conector 2 ConexiónD0 2 → 15 S3+ Directa

D1 3 → 13 S4+ Directa

D2 4 → 12 S5+ Directa

D3 5 → 10 S6+ Directa

D4 6 → 11 S7- Invertida

S7- 11 ← 6 D4 Invertida

S6+ 10 ← 5 D3 Directa

S5+ 12 ← 4 D2 Directa

S4+ 13 ← 3 D1 Directa

S3+ 15 ← 2 D0 Directa

GND 25 ══ 25 GND Masa

Modo 1B:Utiliza para salida el registro de datos y para entrada el registro de estados.

Conector 1 Pin Dirección Pin Conector 2 ConexiónD3 5 → 15 S3+ Directa

D4 6 → 13 S4+ Directa

D5 7 → 12 S5+ Directa

D6 8 → 10 S6+ Directa

D7 9 → 11 S7- Invertida

S7- 11 ← 9 D7 Invertida

S6+ 10 ← 8 D6 Directa

S5+ 12 ← 7 D5 Directa

S4+ 13 ← 6 D4 Directa

S3+ 15 ← 5 D3 Directa

GND 25 ══ 25 GND Masa

18 de 54 Tema: Entrada y salida a través de los puertos

Modo 1C: Utiliza para salida el registro de datos y para entrada el registro de estados. El

cableado adicional del registro de estados es para interfaces adicionales.

Conector 1 Pin Dirección Pin Conector 2 ConexiónD3 5 → 15 S3+ Directa

D4 6 → 13 S4+ Directa

D5 7 → 12 S5+ Directa

D6 8 → 10 S6+ Directa

D7 9 → 11 S7- Invertida

S7- 11 ← 9 D7 Invertida

S6+ 10 ← 8 D6 Directa

S5+ 12 ← 7 D5 Directa

S4+ 13 ← 6 D4 Directa

S3+ 15 ← 5 D3 Directa

C0- 1 ↔(*) 1 C0- Directa

C1- 14 ↔(*) 14 C1- Directa

C2+ 16 ↔(*) 16 C2+ Directa

C3- 17 ↔(*) 17 C3- Directa

GND 25 ══ 25 GND Masa

(*) Nota: Los bits de salida del registro de control se ponen en estado alto en el receptor (incluso los invertidos, es decir: C0, C1, C3=0; C2=1). El retorno del registro de control lo puede leer el registro de control del remitente.

19 de 54 Tema: Entrada y salida a través de los puertos

Modo 2: Puerto paralelo bidireccional de 8 bits. Esta versión trabaja sólo con puerto paralelo

bidireccional cuyo registro de datos sea triestado. El conector receptor debe tener su registro de datos triestado para poder usarlo como registro de entrada de un puerto de 8 bits.

Conector 1 Pin Dirección Pin Conector 2 Conexión

D0 2 ↔(*) 2 D0 Directa

D1 3 ↔(*) 3 D1 Directa

D2 4 ↔(*) 4 D2 Directa

D3 5 ↔(*) 5 D3 Directa

D4 6 ↔(*) 6 D4 Directa

D5 7 ↔(*) 7 D5 Directa

D6 8 ↔(*) 8 D6 Directa

D7 9 ↔(*) 9 D7 Directa

S4+ 13 ← 1 C0- Invertida

S5+ 12 ← 14 C1- Invertida

S6+ 10 ← 16 C2+ Directa

S7- 11 ← 17 C3- Directa

C0- 1 → 1 13 Invertida

C1- 14 → 14 12 Invertida

C2+ 16 → 16 10 Directa

C3- 17 → 17 11 Directa

GND 25 ══ 25 GND Masa

(*) Nota: sólo tarjetas bidireccionales; el conector receptor debe ser triestado con C5=1.

Si dos puertos bidireccionales se conectan de la misma forma, y ambos están habilitados con diferentes datos en sus salidas, entonces el circuito integrado driver 74LS374 tendrá un conflicto. Debemos ser especialmente cuidadosos al hacer un cable de este tipo. Un conector RS-232 puenteado es la forma comercial de un DB25 con sus 25 líneas cableadas, usando 8 resistencias de 10k entre las líneas de Datos correspondientes para limitar la corriente. También es posible situar un dispositivo DIP de resistencias en la placa madre del PC.

20 de 54 Tema: Entrada y salida a través de los puertos

Modo 3A: Usa 8 bits como entradas siendo las salidas del registro de control en colector

abierto. Esta versión usa 4 salidas del registro de control y 4 del registro de estado como entradas.

Conector 1 Pin Dirección Pin Conector 2 Conexión

D0 2 →(*) 1 C0- Invertida

D1 3 →(*) 14 C1- Invertida

D2 4 →(*) 16 C2+ Directa

D3 5 →(*) 17 C3- Invertida

D4 6 → 13 S4+ Directa

D5 7 → 12 S5+ Directa

D6 8 → 10 S6+ Directa

D7 9 → 11 S7- Invertida

C0- 1 ←(*) 2 D0 Invertida

C1- 14 ←(*) 3 D1 Invertida

C2+ 16 ←(*) 4 D2 Directa

C3- 17 ←(*) 5 D3 Invertida

S4+ 13 ← 6 D4 Directa

S5+ 12 ← 7 D5 Directa

S6+ 10 ← 8 D6 Directa

S7- 11 ← 9 D7 Invertida

GND 25 ══ 25 GND Masa

(*) Nota: las salidas de control usadas como entradas deben programarse a estado alto: C0, C1, C3 a 0 y C2 a 1.

21 de 54 Tema: Entrada y salida a través de los puertos

Modo 3B: Usa 8 bits como entradas siendo las salidas del registro de control en colector

abierto. Esta versión usa 3 salidas del registro de control como entradas más 5 entradas del registro de estado. La otra salida del registro de control es bidireccional en el otro conector se establece en estado alto por defecto, el otro conector debe establecerse a nivel bajo con una resistencia (lógica inversa).

Conector 1 Pin Dirección Pin Conector 2 Conexión

D0 2 →(*) 1 C0- Invertida

D1 3 →(*) 14 C1- Invertida

D2 4 →(*) 16 C2+ Directa

D3 5 →(*) 15 S3+ Directa

D4 6 → 13 S4+ Directa

D5 7 → 12 S5+ Directa

D6 8 → 10 S6+ Directa

D7 9 → 11 S7- Invertida

C0- 1 ←(*) 2 D0 Invertida

C1- 14 ←(*) 3 D1 Invertida

C2+ 16 ←(*) 4 D2 Directa

S3+ 15 ←(*) 5 D3 Directa

S4+ 13 ← 6 D4 Directa

S5+ 12 ← 7 D5 Directa

S6+ 10 ← 8 D6 Directa

S7- 11 ← 9 D7 Invertida

C3- 17 ↔ 17 C3- Directa (OC)

GND 25 ══ 25 GND Masa

(*) Nota: las salidas de control usadas como entradas deben programarse a estado alto: C0, C1, C3 a 0 y C2 a 1.

Acceso al hardware del PCVamos a introducir en este punto la forma de acceso a hardware y los problemas

que conlleva bajo entorno operativo Windows. La parte que más nos interesa es la referente a W2K (Windows 2000) y Windows XP aunque introduciremos también sistemas anteriores.

MS-DOS/Windows 3.1Estos sistemas operativos se ejecutan en el anillo 0 de acceso al hardware de la

máquina. Así que cualquier proceso puede acceder directamente a los recursos hardware. De hecho con estos sistemas operativos cada programa era el encargado de implementar los drivers de periféricos que necesitara para poder acceder a dichos periféricos.

El acceso a hardware no presentaba mayor problema. En un sistema operativo como estos y un compilador ANSI C como el conocido DJGPP, un programa como el siguiente nos permitirá comprobar los niveles de tensión en las líneas de datos del puerto

22 de 54 Tema: Entrada y salida a través de los puertos

paralelo así como forzar los niveles H o L en estas líneas para comprobar si el puerto es bidireccional:#include <stdio.h>#include <conio.h>#include <dos.h>#define PARALELO1 0x378 /*Dirección base de LPT1*/void main(){

unsigned int entrada, salida;char tecla;do

{clrscr();

printf("\t\t*** EL REGISTRO DE DATOS");printf("DEL PUERTO PARALELO ***");

entrada = inp(PARALELO1); printf("\nEl dato actual en el puerto"); printf("paralelo es: 0x%0X",entrada); printf("\nDato hexadecimal para"); printf("sacarlo por el puerto paralelo:\n"); scanf("%X",&salida); printf("\nComprueba o cambia los"); printf("niveles en las lineas de"); printf("datos.\n\n"); outp(PARALELO1, salida);/*Salida del dato por el puerto paralelo */ entrada = inp(PARALELO1); printf("\n\nDato escrito: 0x%0X", entrada); printf("\Dato leido: 0x\%0X", salida); printf("\n\nPara terminar pulsar"); printf("\'ESCAPE\'. Otra tecla para"); printf("seguir"); tecla = getch();

} while (tecla != 0x1B);}Windows 95/98

Este sistema operativo sigue ejecutando todos los procesos en el anillo 0 de acceso al hardware. Se mantiene la posibilidad de que los propios programas sean los que implementen los drivers para acceso a hardware.

Se introduce un nuevo concepto:

la estructura Universal driver/minidriver.

Mediante esta estructura el sistema operativo proporciona unos drivers básicos para el hardware más común, y sobre estos drivers básicos los fabricantes de dispositivos implementan funciones de interfaz para los programas de usuario que aumentan las capacidades del driver original.

Además de esta estructura, también se introducen los llamados VxD’s (Virtualizaction Device Drivers) que son drivers de 32 bits que se ejecutan en modo protegido. Estos drivers pueden ser compartidos por más de un programa a la vez.

Con la introducción de Windows 98 se amplían los drivers básicos existentes y se introduce una nueva clase de drivers denominados HID (Human Interface Device) destinados a acceder a los dispositivos de entrada como teclados, joystics, ...

En un sistema operativo como estos y un compilador ANSI C, un programa como el anterior funcionará perfectamente.

23 de 54 Tema: Entrada y salida a través de los puertos

Windows NT, 2000 y XPEstos sistemas operativos ya utilizan dos de los anillos de acceso al hardware: el

anillo 0 y el anillo 3. Aquellos procesos que se ejecutan en el anillo 0 se dice que se ejecutan en modo kernel y los que se ejecutan en el anillo 3 se dice que se ejecutan en modo usuario.

Tan sólo los programas que se ejecutan en modo kernel pueden acceder al hardware. Para que los programas en modo usuario puedan acceder al hardware tienen que hacerlo a través de algún proceso en modo kernel. El siguiente gráfico muestra la estructura de Windows NT

Como se puede ver los procesos que se ejecutan en modo usuario no tienen comunicación directa con el hardware. Para acceder a él tienen que pasar por el módulo denominado I/O Manager. Este módulo se encarga de recibir las peticiones de acceso al hardware por parte de los procesos que se ejecutan en modo usuario y reenviar dichas peticiones a los drivers encargados del acceso requerido. Estos drivers son los que se comunican directamente con el hardware (pasando previamente por un filtro denominado HAL o Hardware Abstraction Layer que lo que hace es presentar diferentes arquitecturas hardware, como CISC o RISC, de una forma homogénea al resto de módulos).

Estos drivers que están dentro del módulo I/O Manager son lo que se denominan Kernel Mode Drivers (Drivers en Modo Kernel). Estos drivers se pueden dividir en tres categorías:

▪ Device Drivers (Drivers de dispositivos): Son los drivers que controlan directamente los dispositivos físicos.

24 de 54 Tema: Entrada y salida a través de los puertos

▪ Intermediate Drivers (Drivers intermedios): Son los drivers que no acceden directamente a los dispositivos físicos, sino que acceden a device drivers o a otros intermediate drivers.

▪ File System Drivers (FSDs, Drivers de sistemas de archivo: Son los drivers para acceder a la información de los discos según su formato (FAT, HPFS, NTFS, CDFS, ...). Al igual que los intermediate drivers no acceden directamente a los dispositivos físicos sino que se basan en otros drivers de nivel inferior.

Interface con los drivers en modo kernelComo ya hemos dicho para que nuestras aplicaciones (en modo usuario) puedan

acceder al hardware desde Windows NT, 2000 o XP necesitan hacerlo a través de drivers en modo kernel. Estos drivers deben proveer ciertas funciones para que las aplicaciones puedan acceder a ellos. En el caso de los drivers que controlan dispositivos de comunicación (puerto serie, puerto paralelo, módems, y en general dispositivos que permitan establecer un flujo bidireccional de datos) estas funciones son:

− CreateFile: Se encarga de “conectar” la aplicación en modo usuario con el driver.

− CloseHandle: Finaliza la “conexión” entre la aplicación en modo usuario y el driver.

− ReadFile: La aplicación utiliza esta función para que el driver le devuelva datos que se encuentran en el dispositivo físico al que quiere acceder.

− WriteFile: La aplicación utiliza esta función para decirle al driver que quiere enviarle datos al dispositivo físico.

− DeviceIoControl: Se utiliza para enviarle al driver comandos especiales para el propio driver o para que este realice alguna acción sobre el dispositivo físico.

Todos estos drivers de dispositivos de comunicación en modo kernel deben implementar estas funciones. Adicionalmente pueden soportar otro tipo de funciones para mejorar la gestión del dispositivo que controlan (como posteriormente veremos con los drivers del puerto serie).

Realmente los drivers lo que hacen es presentar el hardware al resto de los procesos como si fueran ficheros, de ahí que las funciones de interface tengan la apariencia de funciones para manejar ficheros.

Vamos a describir detalladamente cada una de estas funciones.

CREATEFILEEl prototipo de esta función es:

HANDLE CreateFile(LPCTSTR lpFileName,DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDistribution, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile

);Donde:

lpFileName: Nombre del recurso de comunicación al que nos vamos a conectar. La longitud de la cadena está limitada a la constante MAX_PATH.

25 de 54 Tema: Entrada y salida a través de los puertos

dwDesiredAcces: Especifica el tipo de acceso que queremos tener sobre el dispositivo. Tenemos tres posibilidades (que se pueden combinar mediante el operador OR):

0: Sólo queremos acceder a información sobre el dispositivo. No queremos leer información desde él ni enviarle información.GENERIC_READ: Queremos leer información desde el dispositivo.GENERIC_WRITE: Queremos escribir información al dispositivo.

dwShareMode: Cómo queremos compartir el dispositivo. Podemos combinar las siguientes opciones:

0: No se quiere compartir el dispositivo.FILE_SHARE_DELETE: Sólo se permitirá abrir el dispositivo para borrar.FILE_SHARE_READ: Sólo se permitirá abrir el dispositivo para leer.FILE_SHARE_WRITE: Sólo se permitirá abrir el dispositivo para escribir.

lpSecurityAttributes: Puntero a una estructura SECURITY_ATTRIBUTES en la que se indica si procesos hijos pueden heredar el “handle” del dispositivo. Si es NULL el “handle” no puede ser heredado. (Este parámetro sólo vale para Windows NT, en Windows 95 es ignorado).dwCreationDistribution: Qué hacer si el fichero no existe. Podemos usar una de las siguientes opciones:

CREATE_NEW: Crea un nuevo fichero. Se produce un fallo si el fichero ya existe.CREATE_ALWAYS: Crea un nuevo fichero. Si ya existe uno se sobrescribe.OPEN_EXISTING: Abre el fichero. Si no existe se produce un fallo.OPEN_ALWAYS: Abre el fichero. Si no existe se crea.TRUNCATE_EXISTING: Abre el fichero y lo recorta para que tenga cero bytes. Si el fichero no existe se produce un fallo. Hay que especificar por lo menos acceso GENERIC_WRITE.

dwFlagsAndAttributes: Atributos e indicadores para abrir el archivo. En el caso de los dispositivos de comunicación podemos usar:

FILE_FLAG_OVERLAPPED: Especifica que las operaciones de lectura (ReadFile) y escritura (WriteFile) se pueden realizar en modo asíncrono.

hTemplateFile: “handle” de un fichero cuyos atributos (normales y extendidos) queremos copiar a un fichero nuevo que se vaya a crear.

Si la llamada a la función tiene éxito, se devuelve un “handle” al dispositivo o fichero abierto. Si hay algún fallo entonces se devuelve el valor INVALID_HANDLE_VALUE.

En el caso de abrir un dispositivo de comunicación, siempre hay que establecer el parámetro dwCreationDistribution al valor OPEN_EXISTING, y el parámetro hTemplate al valor NULL.

26 de 54 Tema: Entrada y salida a través de los puertos

CLOSEHANDLECon esta función se cierra un archivo o dispositivo previamente abierto con

CreateFile.El prototipo de esta función es:

BOOL CloseHandle(HANDLE hObject // Manejador (handle) del objeto a cerrar

);

El parámetro hObject es el “handle” devuelto por una llamada a la función CreateFile.

READFILECon esta función leeremos datos del fichero o dispositivo abierto con con una

llamada previa a la función CreateFile. El prototipo de esta función es:

BOOL ReadFile(HANDLE hFile, // handle del fichero a leer LPVOID lpBuffer, // direccion del buffer que recibe datos DWORD nNumberOfBytesToRead, // numero de bytes a leer LPDWORD lpNumberOfBytesRead,// direccion del numero de bytes a leer LPOVERLAPPED lpOverlapped // direccion de la estructura para datos

);Donde:

hFile: “handle” del fichero o dispositivo devuelto por la función CreateFile.lpBuffer: Buffer dónde se guardarán los datos que se lean del fichero o del dispositivo.nNumberOfBytesToRead: Número de bytes que se quieren leer.lpNumberOfBytesRead: Número de bytes que se han leido. Si lpOverlapped no es NULL entonces este parámetro puede ser NULL.lpOverlapped: Puntero a una estructura OVERLAPPED. Si al abrir el dispositivo se ha usado el indicador FILE_FLAG_OVERLAPPED éste parámetro no puede ser NULL.

Si la función se ejecuta con éxito se devuelve un valor distinto de cero. Si ocurre algún error entonces se devuelve cero.

WRITEFILECon esta función escribiremos datos al fichero o dispositivo abierto con con una

llamada previa a la función CreateFile. El prototipo de esta función es:

BOOL WriteFile(HANDLE hFile,LPVOID lpBuffer,DWORD nNumberOfBytesToWrite,LPDWORD lpNumberOfBytesWritten,LPOVERLAPPED lpOverlapped

);Donde:

hFile: “handle” del fichero o dispositivo devuelto por la función CreateFile.lpBuffer: Buffer dónde están los datos que se van a escribir en el fichero o dispositivo.

27 de 54 Tema: Entrada y salida a través de los puertos

nNumberOfBytesToWrite: Número de bytes que se quieren escribir.lpNumberOfBytesWritten: Número de bytes que se han escrito. Si lpOverlapped no es NULL entonces este parámetro puede ser NULL.lpOverlapped: Puntero a una estructura OVERLAPPED. Si al abrir el dispositivo se ha usado el indicador FILE_FLAG_OVERLAPPED éste parámetro no puede ser NULL.

Si la función se ejecuta con éxito se devuelve un valor distinto de cero. Si ocurre algún error entonces se devuelve cero.

DEVICEIOCONTROLMediante esta función enviaremos directamente un código de control al driver para

que éste realice las operaciones adecuadas sobre el dispositivo. El prototipo de esta función es:

BOOL DeviceIoControl(HANDLE hDevice, // handle to device of interestDWORD dwIoControlCode, // control code of operation to performLPVOID lpInBuffer, // pointer to buffer to supply input dataDWORD nInBuffersize, // size, in bytes , of input bufferLPVOID lpOutBuffer, // pointer to buffer to receive output dataDWORD nOutBufferSize, // size, in bytes, of output bufferLPDWORD lpBytesReturned, // pointer to variable to receive byte countLPOVERLAPPED lpOverlapped // pointer to structure for async. op.

);Donde:

hDevice: “handle” del dispositivo devuelto por CreateFile.dwIoControlCode: Código de control de la operación a realizar. Este código dependerá del driver al que nos estemos refiriendo.lpInBuffer: Buffer en el que están los datos que se envían driver. El significado de los datos dependerá del código de control.nInBufferSize: Longitud, en bytes, del buffer de entrada al driver.lpOutBuffer: Buffer en el que están los datos que se reciben del driver. El significado de los datos dependerá del código de control.nOutBufferSize: Longitud, en bytes del buffer de salida del driver.lpBytesReturned: Número de bytes que realmente devuelve el driver.lpOverlapped: Puntero a una estructura OVERLAPPED.

Si la ejecución de la función es correcta entonces se devuelve un valor distinto de cero. Si tiene algún error se devuelve cero.

Estructura OVERLAPPEDEsta estructura hay que usarla para poder llamar a las funciones ReadFile,

WriteFile y DeviceIoControl de forma asíncrona. Al utilizar esta forma de llamada, inmediatamente después de realizar la llamada a la función, ésta retorna devolviendo cero como respuesta ya que la operación no se habrá completado. Sin embargo la operación que habíamos solicitado con la llamada se estará ejecutando hasta que se complete. La estructura OVERLAPPED nos ayudará a saber cuando se ha completado la operación.

28 de 54 Tema: Entrada y salida a través de los puertos

La definición de dicha estructura es la siguiente:

typedef struct _OVERLAPPED {DWORD Internal;DWORD InternalHigh;DWORD Offset;DWROD OffsetHigh;HANDLE hEvent;

} OVERLAPPED;Donde:

Internal: Reservado para el sistema operativo.InternalHigh: Reservado para el sistema operativo.Offset: Posición del fichero desde la que debe comenzar la transferencia de datos. En el caso de dispositivos de comunicación se ignora.OffsetHigh: Parte alta de la posición del fichero desde la que debe comenzar la transferencia de datos. En el caso de dispositivos de comunicación se ignora.hEvent: “handle” a un objeto de tipo “Evento” de Windows. Cuando la operación asíncrona finaliza, el “evento” se activa.

Configuración de Windows 2000-XP para acceder a los puertosYa hemos indicado que para versiones de Windows con tecnologia NT (2000 o XP)

no resulta sencillo el acceso a hardware y funciones tan básicas como outp e intp ya no resultan operativas.

Para poder leer y escribir en el puerto paralelo es necesario un driver que comunique el sofware con el hardware.

No es propósito de este curso el desarrollo de este driver, pero al resultar imprescindible tendremos que recurrir a uno ya creado, por lo que pasaremos a describir la forma de instalar un driver que permita el acceso al puerto paralelo.

En concreto vamos a utilizar uno gratuito denominado PORTTALK que está disponible en la web http://www.beyondlogic.org/porttalk/porttalk.htm como vemos en la figura:

29 de 54 Tema: Entrada y salida a través de los puertos

Una vez descargado el fichero porttalk22.zip lo descomprimimos en una carpeta cualquiera y tendremos un contenido similar a:

Ahora copiamos el archivo porttalk.sys en la carpeta de Windows donde normalmente están los drivers, es decir: C:\Winnt\System32\Drivers para Windows 2000 y XP y hacemos doble clic en el archivo porttalk.reg para ejecutarlo y permitir añadir la información que contiene al registro de Windows.

Una vez realizados los pasos anteriores deberemos reiniciar el sistema para que tengan efecto los cambios efectuados.

Para comprobar que todo está correcto accedemos a las propiedades de sistema a través del panel de control y seleccionamos según la figura siguiente.

30 de 54 Tema: Entrada y salida a través de los puertos

Si todo funciona correctamente la situación será la que vemos en la figura siguiente, donde comprobamos que se encuentra el driver Porttalk:

Si no vemos el cambio señalado podemos pulsar sobre el icono de búsqueda de cambios de hardware siguiente:

Ejemplo 1: Acceso a puerto paralelo mediante aplicación de consolaVamos a adaptar el ejemplo citado para el sistema operativo MS-DOS y un

compilador ANSI C que nos permitirá comprobar los niveles de tensión en las líneas de datos del puerto paralelo así como forzar los niveles H o L en estas líneas.

Lo primero que debemos hacer es incluir en nuestra carpeta de trabajo los dos ficheros siguientes, obtenidos del fichero porttalk22.zip:

pt_ioctl.cporttalk_IOCTL.h

Nuestro directorio de trabajo deberá tener un aspecto similar a:

31 de 54 Tema: Entrada y salida a través de los puertos

El código del programa comentado es el siguiente:#pragma hdrstop#include <condefs.h>#include <stdio.h>#include <conio.h>#include <windows.h> //Sustituye a #include <dos.h>#include "pt_ioctl.c" // Fichero de definicion del Interface con los drivers en modo kernel#define PARALELO1 0x378 /*Dirección base de LPT1*///---------------------------------------------------------------------------#pragma argsusedint main(int argc, char* argv[]){ clrscr(); printf("\t\t*** REGISTRO DE DATOS"); printf(" DEL PUERTO PARALELO ***"); printf("\n\t\t -------------------------------------\n\n"); unsigned int entrada, salida; char tecla;

do {

OpenPortTalk(); //Llamada a la función CreateFile entrada = inportb(PARALELO1); //Lectura del dato del puerto paralelo printf("\nEl dato actual en el puerto"); printf(" paralelo es: 0x%0X",entrada); printf("\n\nDato hexadecimal para escribirlo en el puerto paralelo:"); scanf("%X",&salida); printf("\n\t\t **********************************"); printf("\n\nComprobacion o cambio de los"); printf(" niveles en las lineas de datos.\n\n"); outportb(PARALELO1, salida); /*Salida del dato por el puerto paralelo */ entrada = inp(PARALELO1); printf("\tDato escrito: 0x%0X", entrada); printf("\n\tDato leido: 0x\%0X", salida); printf("\n\nPara terminar pulsar"); printf("\'ESCAPE\'. Otra tecla para seguir"); tecla = getch(); printf("\n\n*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*\n");

} while (tecla != 0x1B); //0x1B es el código Hex de la tecla ESCAPEClosePortTalk(); //Llamada a la función CloseHandle para dejar disponible el puertoreturn 0;}

En tiempo de ejecución obtenemos un resultado como el que vemos seguidamente, obtenido tras la introducción de algunos datos y partiendo del estado inicial que normalmente es FF.

32 de 54 Tema: Entrada y salida a través de los puertos

33 de 54 Tema: Entrada y salida a través de los puertos

Puerto serieRealizar un interface con un puerto serie es más complejo que hacerlo con un

puerto paralelo. En la mayoría de los casos, cualquier dispositivo que se conecte al puerto serie necesitará reconvertir la transmisión serie a paralelo para poder utilizarla, y esta es la función de una UART (acrónimo de Universal Asynchronous Receiver/Transmitter o receptor/tramsmisor asíncrono universal). Desde el punto de vista del software debemos atender a muchos más registros que en un puerto paralelo estándar (SPP). Visto lo anterior cabe preguntarse:

¿Cuáles son las ventajas de transferir datos en serie respecto a tranferirlos en paralelo?Vamos a tratar de establecer los motivos:

Los cables serie pueden ser más largos que los cables paralelo. En el puerto serie, la transmisión del nivel lógico '1' se realiza con una tensión de -3

a -25 voltios y un nivel lógico '0' como +3 a +25 voltios, mientras que un puerto paralelo se transmite un '0' como 0 voltios y un '1' como 5 voltios. Por lo tanto el puerto serie tiene un margen de tensiones de trabajo de 50 voltios y, en cambio, el margen de tensiones del puerto paralelo es de 5 voltios. Por lo tanto, las caídas de tensión en el cable no van a ser tanto problema en los cables serie como en los paralelo.Se necesitan menos hilos que en la transmisión paralelo.

Si su dispositivo va a montarse a una cierta distancia lejos del ordenador, un conductor de tres hilos (configuración Null Modem) será mucho más económica que un conductor de 19 o 25 hilos. No obstante siempre debemos considerar el coste de la electrónica de interconexión en cada extremo.El empleo cada vez más usual de dispositivos infrarrojos en la vida cotidiana y en la estructura interna de ordenadores.

Debemos imaginarnos el problema que se plantea si realizamos transmisiones simultaneas de ocho bits de datos en una habitación para descifrar cual es cual desde el punto de vista de los dispositivos. La transmisión serie solamente envía un bit a la vez. Las primeras especificaciones infrarrojas (IrDA-1) ya transmitían a 115,2 k baudios interconectadas a una UART. Sin embargo, en el estándar RS232 se redujo en 3/16 para compatibilizar en los dispositivos más usuales.El creciente empleo de micro controladores.

La mayoría integran un dispositivo SCI (Serial Communications Interfaces) para usarlo en las comunicaciones con el exterior. La comunicación serie reduce el número de pines de estos dispositivos. Normalmente solo se emplean dos pines, uno para la transmisión de datos (TXD) y otro para la recepción de datos (RXD), que son bastantes menos que los ocho necesarios en la comunicación paralelo.Propiedades del hardwareLos dispositivos hardware que utilizan cables de comunicación serie se dividen en dos categorías, que son:

▪ Data Communications Equipment (DCE): equipo de comunicación de datos, que son dispositivos tales como módem, plotter o trazador, etc.

▪ Data Terminal Equipment (DTE): equipo terminal de datos, que es el ordenador o terminal.

Las especificaciones eléctricas del puerto serie se definen en el estándar RS-232C de la asociación de la industria de la electrónica EIA (Electronics Industry Association), donde se indican todos sus parámetros, algunos de ellos los citamos a continuación:

− Un "espacio" (0 lógico) estará entre +3 y +25 voltios− Una "marca" (1 lógico) estará entre -3 y -25 voltios.− La región entre +3 y -3 voltios es indefinida.

34 de 54 Tema: Entrada y salida a través de los puertos

− Una tensión a circuito abierto nunca debe exceder los 25 voltios con referencia a masa.

− Una corriente de cortocircuito no debe exceder los 500mA. Es muy importante que el conductor pueda soportar está corriente sin sufrir daños.

Naturalmente esto no es una una lista completa de caracteristicas del estándar EIA, donde además se incluyen la capacidad de línea, las velocidades máximas, etc. Es interesante destacar sin embargo, que el estándar de RS232C especifica una velocidad máxima de 20.000 BPS, que es algo lenta para estándares actuales. Por esto se han implementado nuevos estándares, como RS-232D lanzado recientemente.

El cuadro siguiente resume los niveles lógicos para entradas y salidas que establece la norma.

En la tabla se resumen las características eléctricas.DESCRIPCIÓN MIN MAX

Tensión de salida del transmisor: Nivel alto = 0 (En circuito abierto) Nivel bajo = 1 -25 V +25 V

Tensión de salida del transmisor: Nivel alto = 0 (Con carga de 3 a 7 kΩ) Nivel bajo = 1

+5 V-15 V

+15V-5 V

Impedancia de salida del Tx sin alimentación 300 Ω

Corriente de salida del Tx en cortocircuito -500 mA +500 mA

Slew Rate (dV/dt) 4 V/μs 30 V/μs

Impedancia de entrada del Rx 3 kΩ 7 kΩ

Tensión de entrada del Rx Espacio = 0 Marca = 1

+3 V-25 V

+25 V-3 V

A continuación vamos a citar las principales caracteristicas de transmisión, es decir, los parámetros que determinan como se realiza la transmisión:

1. El número de bits de datos que se transmiten es seleccionable entre 5, 6, 7 y 8, según el número de bits necesario para codificar la información.

2. La velocidad de transmisión expresada en baudios (un baudio es el número de condiciones discretas que se transmiten por segundo. En informática un baudio es igual a un bit por segundo o bps). Las frecuencias en baudios más empleadas son: 110, 300, 600, 1200, 1800, 2400, 9600, 19200, 28800, 33600, 56000 y hasta 115200.

3. La paridad como método sencillo de detectar errores en la transmisión que consiste en enviar un bit de datos adicional que depende del tipo de paridad seleccionado y de la composición del dato que se transmite. Puede ser:– Sin paridad, en cuyo caso no se añade bit de paridad

35 de 54 Tema: Entrada y salida a través de los puertos

– Paridad par (even parity), cuando el bit de paridad tiene un valor tal que el número de bits transmitidos en estado lógico “1" es par.

– Paridad impar (odd parity), cuando el bit de paridad tiene un valor tal que el número de bits transmitidos en estado lógico “1" es impar.

– Marca (mark parity, one), si el bit de paridad que se transmite es un 1.– Espacio (space parity, zero), cuando el bit de paridad que se transmite es un 0.

4. Los bits de sincronismo se envían antes de los bits de datos y después del bits de paridad a fin de que transmisor y receptor puedan evitar los errores por las diferencias de frecuencias en sus circuitos. Estos bits son el bit de arranque, que normalmente es un único bits de valor cero y los bits de parada (stop) que pueden ser 1, 1.5 o 2.Los puertos serie se implementan bien con conectores tipo D de 25 o de 9 pines,

siendo tipo macho en la parte posterior del PC y necesitando, por tanto, conectores hembra para las interconexiones. La tabla muestra las conexiones tanto para uno como para otro tipo e imágenes de los mismos.

Nº de pin

DB25 DB9

Nombre Función

1 – Tierra de protección Se conecta al chasis del equipo

2 3 Transmit DataTransmisión de datos TD Salida de datos serie (TXD). DTE envía datos a DCE

3 2 Receive DataRecepción de datos RD Entrada de datos serie (RXD). DTE recibe datos de

DCE

4 7 Request To SendPetición de envió RTS

Esta línea informa al módem que la UART está lista para intercambiar datos. Petición de transmisión de DTE

5 8 Clear To SendPreparado para transmitir CTS Esta línea indica que el módem está listo para

intercambiar datos. Es la respuesta a RTS

6 6 Data Set ReadyModem preparado

DSR

Indica a la UART que el módem está listo para establecer una conexión. Es la respuesta a DTR

7 5 Signal Ground SG Referencia de tensión para señales

8 1Data Carrier DetectDetector portadora de datos

CDEl módem indica al DTE que recibe la portadora de otro módem vía línea telefónica. Hay conexión establecida.

20 4 Data Terminal ReadyTerminal de datos listo

DTR

Indica al módem que la UART está lista para establecer una conexión. Hace que el módem se conecte a la linea.

22 9 Ring IndicatorIndicador de llamada RI El módem detecta una señal de llamada en la línea y

se lo indica al DTE a través de esta línea.

36 de 54 Tema: Entrada y salida a través de los puertos

Interconexión entre terminalesLa norma RS-232C utiliza el termino DTE para definir al equipo origen y destino de

la información y DCE para referirse al equipo que hace viable la transmisión a través de la línea telefónica (normalmente un módem).

Es decir, una conexión estándar RS-232 deberá realizarse según vemos en la figura siguiente:

Resulta muy interesante poder realizar conexiones entre terminales DTE sin la necesidad de intercalar modems y línea telefónica, como por ejemplo conectar un ordenador con una impresora, un aparato de medida, una capturadora de datos o, incluso, conectarlo con otro ordenador. La posibilidad de realizar esta conexión entre ordenadores es utilizar los puertos serie o paralelo del ordenador. En estos casos la denominación y significado de cada una de las líneas empleadas queda desvirtuado en relación a su previsión inicial. La realización física de este tipo de conexiones recibe el nombre de null módem o módem ficticio. A continuación retomaremos el tema de comunicaciones por el puerto paralelo mediante conexiones null módem centrándonos, por ahora en el puerto serie.

Conexiones null módem con el puerto serieUna conexión null módem se utiliza comúnmente como manera barata de transferir

datos entre ordenadores usando protocolos de comunicación como Zmodem, Xmodem, etc, aunque también se puede utilizar con sistemas de desarrollo basados en microprocesador.

Se pueden realizar cables con muchos tipos de conexiones para disponer de un cable null módem En cualquier caso siempre debemos analizar las caracteristicas de los equipos a conectar para preparar el cable adecuado. En las figuras siguientes vemos algunas de las posibles realizaciones.

37 de 54 Tema: Entrada y salida a través de los puertos

Ordenador

Dat

a Te

rmin

al E

quip

men

t (D

TE)

RDTD

RTSCTSDTRDSR

RICD

GND

Modem

Dat

a C

omm

unic

atio

ns E

quip

men

t (D

CE

)RDTDRTSCTSDTRDSRRICDGND

Modem

Dat

a C

omm

unic

atio

ns E

quip

men

t (D

CE

)

RDTD

RTSCTSDTRDSR

RICD

GND

Ordenador

Dat

a Te

rmin

al E

quip

men

t (D

TE)

RDTDRTSCTSDTRDSRRICDGND

Conexión telefónica

1 2

3 4El método preferido es el de la figura 4 ya que requiere solamente 3 hilos (TD, RD

y SG) para la conexión. La forma de trabajo es razonablemente fácil y consiste en hacer creer al PC que se está comunicando con un módem y no con otro PC. Cualquier dato transmitido por PC 1 por su terminal TD se debe recibir por PC 2 en su terminal RD.

El Data Terminal Ready (DTR), Data Set Ready (DSR) y Data Carrier Detect (CD) se conectan entre sí en ambos terminales DTE. Cuando Data Terminal Ready se activa lo hacen inmediatamente Data Set Ready y Data Carrier Detect, y, en este punto, el PC “piensa” que el módem virtual con el que está conectado está listo y ha detectado la portadora del otro módem.

Siempre que ambos ordenadores se comuniquen a la misma velocidad no debemos preocuparnos de Request to Send y Clear To Send, pudiendo unir entre sí estas dos líneas. Cuando un PC desea enviar datos, la línea Request to Send (petición de envió) y Clear To Send (preparado para transmitir) están activas.

La línea Ring Indicator no es necesario conectarla en ninguno de los terminales si no tenemos una conexión a través de una línea telefónica. Esta línea se utiliza solamente para indicar al ordenador que hay una señal de sonido en la línea telefónica.

38 de 54 Tema: Entrada y salida a través de los puertos

PC 1D

ata

Term

inal

Equ

ipm

ent (

DTE

) RDTD

RTSCTSDTRDSR

RICD

GND

PC 2

RDTDRTSCTSDTRDSRRICDGND

Dat

a Te

rmin

al E

quip

men

t (D

TE)2

37846915

DB9 237846915

PC 1

Dat

a Te

rmin

al E

quip

men

t (D

TE) RD

TDRTSCTSDTRDSR

RICD

GND

PC 2

RDTDRTSCTSDTRDSRRICDGND

Dat

a Te

rmin

al E

quip

men

t (D

TE)2

37846915

DB9 237846915

PC 1

Dat

a Te

rmin

al E

quip

men

t (D

TE) RD

TDRTSCTSDTRDSR

RICD

GND

PC 2

RDTDRTSCTSDTRDSRRICDGND

Dat

a Te

rmin

al E

quip

men

t (D

TE)2

37846915

DB9 237846915

PC 1

Dat

a Te

rmin

al E

quip

men

t (D

TE) RD

TDRTSCTSDTRDSR

RICD

GND

PC 2

RDTDRTSCTSDTRDSRRICDGND

Dat

a Te

rmin

al E

quip

men

t (D

TE)2

37846915

DB9 237846915

Una conexión que puede ser sumamente práctica para escribir programas de comunicaciones con el puerto serie RS232 es la que se denomina conector de realimentación, que vemos en la figura siguiente.

Las líneas de recepción y de emisión están conectadas entre si, para que todo lo transmitido por Puerto Serie sea recibido por el mismo puerto. Si conectamos este dispositivo a un puerto serie y se ejecuta un programa de comunicación como hyper Terminal, todo que se escribe será inmediatamente mostrado en la pantalla.

Conexiones null módem con el puerto paraleloSi realizamos una conexión como la que vemos en la figura siguiente entre puertos

paralelo bidireccionales podremos transferir información entre ordenadores.

Vemos que se interconectan las líneas de datos de ambos conectores y que se utilizan las líneas C0 y S4 como líneas de protocolo. El PC que va a enviar datos indicará al receptor la validez del dato presente en el registro de datos mediante la activación de la línea C0 del emisor, mientras que S4 se utilizará para conocer si el receptor está listo para recibilirlos; mientras que en el PC receptor C0 indica la disposición de recibir datos y S4 que el dato en las líneas de entrada es válido.

Naturalmente debemos implementar el programa de emisión y recepción para poder aplicar una configuración como la anterior.

39 de 54 Tema: Entrada y salida a través de los puertos

Dat

a Te

rmin

al E

quip

men

t (D

TE) RD

TDRTSCTSDTRDSR

RICD

GND

2

7846915

3

PC 1

C0S4

1

2345678

13

D0

9

D1D2D3D4D5D6D7

PC 1

C0S4

1

2345678

13

D0

9

D1D2D3D4D5D6D7

El Circuito integrado UART 8250 y compatiblesUART es el acrónimo de Universal Asynchronous Receiver/Transmitter, y es un circuito

integrado que permite interactuar entre la placa madre y dispositivos como el módem La mayoría de placas madre tendrán un circuito integrado UART (normalmente de montaje superficial) que también permita controlar el puerto paralelo, el puerto de juegos, unidad de disquete o unidades de disco duro. La serie 8250, que incluye las UART 16450, 16550, 16650 y 16750, es la más comúnmente usada en ordenadores personales.

Una comunicación serie se realiza según el siguiente proceso:1. La línea que transmite los datos en serie está inicialmente en estado alto.2. Al comenzar la transferencia, se envía un bit de inicio (un 0). 3. Se transmiten los 8 bits de datos (en ocasiones son 5, 6 ó 7) que están espaciados

con un intervalo temporal fijo y preciso, ligado a la velocidad de transmisión que se esté empleando.

4. Se transmite un bit de paridad generado automáticamente por la UART, aunque no es obligatorio.

5. Finalmente aparecen los bits de parada o bits de stop a 1 (a veces un bit y medio ó dos bits). 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 al unisono. 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.Circuitos integrados

El circuito integrado 16550 es compatible con los 8250 y los 16450. Las únicas diferencias son los pines 24 y 29.

En el 8250 el pin 24 es una salida que funciona solamente como indicador de que la salida es activa o no. En las UARTs 8250 y 16450 el pin 29 es de tipo No Conectado. El 16550 introduce en su lugar dos nuevos pines, que son Transmit Ready y Receive Ready (preparado para recibir y/o transmitir) que pueden implementarse con DMA ((Direct Memory Access o acceso directo a memoria).

El 8250/16450/16550 son circuitos integrados CMOS Asynchronous Communications Element que integran en un solo chip una UART (Universal Asynchronous Receiver/Transmitter) y un BRG (Baud Rate Generator). Soportan 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.

La UART es un chip del puerto serie que convierte los datos de formato paralelo utilizados

40 de 54 Tema: Entrada y salida a través de los puertos

por el PC en datos de formato serie para su envío. Existen básicamente dos tipos de UARTs:

1. Sin buffer: Diseñadas cuando los módem más rápidos transmitían a 1200 bps. No tienen buffer de carácter extra por lo que dependen del procesador para borrar cada carácter enviado por el módem antes de que el siguiente carácter sea enviado. Las UARTs sin buffer comprenden las series 8250, 16450 y 16550.

▪ 8250 y 8250B: El 8250 es la UART original usada en el IBM PC/XT y el 8250B es una versión un poco más lenta. Esta UART no debe usarse en ordenadores AT o superiores, ya que muchos programas de chequeo muestran un informe erróneo, y existen riesgos ocasionales de error, e incluso pueden producirse fallos si se utilizan en estas máquinas.

▪ 8250A: Es una versión mejorada del 8250/8250B que trabaja un poco más rápido sobre el bus del PC, no sobre el módem, y con menos problemas. Este chip es lo suficientemente rápido para trabajar con máquinas basadas en el procesador 8086 diseñado entre 1.983 y 1.985, pero no es lo suficientemente rápido para ser aplicado en los tipos AT o superiores.

▪ 16450: Es una versión más rápida, también sobre el bus del 8250A que fue diseñado para su uso en máquinas del tipo AT. Un 16450 es lo suficientemente rápido para soportar las velocidades de transmisión de los ordenadores actuales.

▪ 16550: Se utilizó durante un corto período de tiempo. Esta UART tiene un buffer interno de 16 bytes que no trabaja. Muchos de los IBM PS/2 incluyen este chip.

2. Con buffer: Diseñadas como apoyo a los módem actuales más rápidos. La UART original con buffer es el circuito integrado 16550A, que puede acumular 16 caracteres en el buffer antes de que el procesador lea el dato. Esto hace que el software del PC tenga una mayor facilidad para comunicarse con el módem, creándose menos errores y una mayor velocidad de transmisión.

▪ 16550A: Versión mejorada del 16550, donde el buffer trabaja, y es el standard UART de los 90. El buffer colabora en los sistemas operativos Windows y OS/2. Existen diferentes versiones del 16550A creadas por diferentes fabricantes. Así, hay quienes han optado por poner dos UARTs en un mismo chip. Otros han hecho el "super-I/O", que incluye dos puertos serie, y los controles del disco duro y la diskettera. Estas modificaciones lo han mejorado con el paso del tiempo.

▪ StarTech 16650 UART: Este chip es una versión mejorada del 16550A UART, que posee un buffer FIFO de 32 bytes, control de flujo automático y un gran potencial en comunicaciones. Su diseño no lo hace completamente compatible con el 16550A, lo que supone que en algunas ocasiones puede no trabajar con algunas aplicaciones y drivers.

▪ Texas Instruments 16750 UART: UART totalmente compatible con el 16550A. El 16750 posee un buffer de 64 bytes y capacidad de control de flujo automático

En la figura siguiente vemos el diagrama funcional o de bloques del PC16550D (Universal Asynchronous Receiver/Transmitter con FIFOs).

41 de 54 Tema: Entrada y salida a través de los puertos

42 de 54 Tema: Entrada y salida a través de los puertos

Y a continuación la distribución de patillas en sus tres encapsulados típicos.

Seguidamente describimos la funcionalidad de cada uno de estos pines.Pines 1 a 8 - D0 a D7:

Bus de Datos: Bus triestado bidireccional de 8 líneas input/output para transmitir datos, información de control y de estado entre la CPU y la UART. Los datos, palabras de control e información del estado se transmiten a través de este bus.

Pin 9 - RCLK: Entrada de reloj para la sección receptora, equivalente a 16 veces la frecuencia empleada en la transmisión y puede proceder del BAUDOUT de la estación remota o de un reloj externo.

Pin 10 - SIN:Serial Input. Es la línea de entrada de datos desde el enlace (periférico o módem).

Pin 11 – SOUT: Serial Output: Salida de datos en serie al enlace (periférico o módem). Una marca

43 de 54 Tema: Entrada y salida a través de los puertos

es un '1' y un espacio es un '0'. SOUT está en marca cuando se realiza una operación de reset.Pin 12, 13 y 14 - CS0 ,CS1 y CS2 :Chip Select. La selección del chip se realiza con CS0 y CS1 en estado alto y CS2 en estado bajo, permitiendo la comunicación entre la UART y la CPU. Pin 15 – BAUDOUT :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 estación receptora podría emplear esta señal conectándola a RCLK (para compartir el mismo reloj).Pin 16 - XIN (External Crystal Input): Esta entrada se usa con XOUT para conexionar un circuito oscilador para general la señal de reloj del BRG. Si la señal de reloj es externa debemos introducirla por este pin. Pin 17 - XOUT (External Crystal Output): Esta entrada se usa con XIN para conexionar un circuito oscilador para general la señal de reloj del BRG. Si la señal de reloj es externa este pin quedará abierto. Pines 18 y 19 - WR y WR : Cuando WR está en estado alto o WR está en estado bajo el chip está seleccionado y la CPU puede escribir palabras (words) de control o datos en el registro seleccionado de la UART.Pin 20 – VSS: Masa o referencia de alimentación (0V).Pines 21 y 22 - RD y RD : Cuando RD está en estado alto o RD está en estado bajo el chip está seleccionado y la CPU puede leer información sobre el estado o datos del registro seleccionado de la UART.Pin 23 – DDIS: Driver Disable. Esta salida está a nivel bajo cuando la CPU lee datos de la UART. Una salida activa puede emplearse para inhibir un transceiver externo cuando la CPU está leyendo datos.Pines 24 y 29 - TXRDY y RXRDY : La señal DMA de transmisor y receptor está disponible en los pines 24 y 29. Cuando trabajamos en modo FIFO se puede seleccionar entre dos tipos de acceso DMA a través de FCR3. Si operamos en modo 16450 solamente está permitido el modo 0 de DMA. El modo 0 solo soporta transferencias DMA simples cuando se produce un ciclo de bus de la CPU. El modo 1 soporta multitransferencia DMA de forma continua hasta que se vacía el RCVR o se ha llenado XMIT. Pin 25 – ADS: Address Strobe. Cuando esta línea de entrada está activa (por flanco de subida) se enclavan o latchean las líneas A0, A1, A2 y las señales Chip Select CS0, CS1 y CS2..Pin 26, 27 y 28 - A2, A1 y A0: Register Select. Líneas de entrada que permiten direccionar el registro de la UART para las operaciones de lectura o escritura de la CPU durante la transferencia de datos. La tabla de direccionamiento es la siguiente:

DLAB A2 A1 A0 Registro0 0 0 0 Receiver Buffer (read), Transmitter Holding Register (write)

0 0 0 1 Interrupt Enable

X 0 1 0 Interrupt Identification (read)

X 0 1 0 FIFO Control (write)X 0 1 1 Line ControlX 1 0 0 MODEM ControlX 1 0 1 Line StatusX 1 1 0 MODEM StatusX 1 1 1 Scratch1 0 0 0 Divisor Latch (least significant byte)1 0 0 1 Divisor Latch (most significant byte)

44 de 54 Tema: Entrada y salida a través de los puertos

Pin 30 – INTR: Interrupt. Línea de salida que se activa cuando se produce una interrupción de alguno de estos tipos y está permitida: Flag de error de recepción, dato recibido disponible, registro de retención de transmisión vacío, y estado del módem Esta línea se desactiva (se pone a nivel bajo) con el servicio de interrupción apropiado o ante una operación Master Reset.Pin 31 - OUT2 : Esta salida de propósito general se puede activar (poner a 0) programando un 1 en el bit 3 (OUT2) del registro de control del MODEM. Un operación de reset establece está señal como desactivada (nivel alto). En el modo lazo (LOOP o bucle), está también inactiva. Con componentes XMOS se pueden alcanzar niveles TTL.Pin 32 - RTS : Request To Send. Cuando está a nivel bajo esta línea informa al MODEM que la UART está lista para intercambiar datos. Esta señal se pone en alto en respuesta a MR.Pin 33 – DTR : Data Terminal Ready. En estado bajo informa al MODEM o terminal que la UART está lista para establecer una comunicación o enlace. Línea de salida que puede activarse (poner a 0 o nivel bajo) escribiendo un 1 o nivel alto en el bit 0 del registro de control del MODEM. Una operación de reset establece esta señal como un nivel alto o inactiva. En el modo loop o lazo la señal es inactiva.Pin 34 - OUT1 : Esta salida de propósito general se puede activar (poner a 0) programando un 1 en el bit 2 (OUT1) del registro de control del MODEM. Un operación de reset establece está señal como desactivada (nivel alto). En el modo lazo (LOOP o bucle), está también inactiva. Con componentes XMOS se pueden alcanzar niveles TTL.Pin 35 – MR: Master Reset. Con la entrada a nivel alto se borran todos los registros (excepto el buffer de recepción, transmisión y latches divisores) y el control lógico de la UART. El estado de varias señales de salida ( SOUT, INTR, OUT1 , OUT2 , RTS ,

DTR ) se modifica por una activación del MR, como vemos en la tabla siguiente.

Pin 36 - 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 referencia MSR(4). Un cambio en el estado de CTS desde la última lectura

45 de 54 Tema: Entrada y salida a través de los puertos

del MSR provoca que se active DCTS (bit MSR(0)). Cuando CTS está activo (a 0) el módem indica que el dato puede ser transmitido. Pin 37 - DSR :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. Cuando DSR está activo el módem indica que está listo para intercambiar datos con la UART; lo que depende del estado del DCE (Data Communications Equipment) local y no implica que haya comunicación con la estación remota.Pin 38 - DCD : Data Carrier Detect. Línea de entrada que indica si el módem ha detectado portadora. Se puede consultar su estado lógico en MSR(7). El bit MSR(3) indica si esta línea ha cambiado desde la última lectura del MSR. Esta línea no tiene efecto sobre el receptor. Pin 39 - RI : Ring Indicator. Cuando la línea de entrada tiene un nivel bajo indica que el módem 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 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). Pin 40 – VDD: Tensión de alimentación de 5 V según especificaciones técnicas dadas por el fabricante.Registros de la UART 8250

El 16550 dispone de 12 registros (el 8250 tiene uno menos) pero sólo 3 líneas de dirección para seleccionarlos. Para distinguir unos de otros, aparte de las líneas de direcciones, se utiliza el sentido de acceso (en lectura o escritura) y el valor del bit 7 del registro LCR (DLAB). Para hacer referencia a un bit de un registro se utiliza la notación: REG(i), donde REG es el nombre del registro e (i) el número de bit, por ejemplo LCR(7) para el caso que estamos tratando. 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.

En la tabla siguiente vemos los registros y su direccionamiento. A2 A1 A0 DLAB Read/Write Nombre Función0 0 0 0 R RBR (Receiver Buffer Register) Buffer de recepción

0 0 0 1 R/W DLL (Divisor Latch LSB) LSB del divisor de velocidad

0 0 0 0 W THR (Transmitter Holding Register) Registro de retención de la transmisión

0 0 1 0 R/W IER (Interrupt Enable Register) Habilitación de interrupciones

0 0 1 1 R/W DLM (Divisor Latch MSB) MSB del divisor de velocidad

0 1 0 X R IIR (Interrupt Identification Register) Identificación de interrupciones

0 1 0 X W FCR (FIFO Control Register) Control de FIFO (1)

0 1 1 X R/W LCR (Line Control Register) Control de línea (2)

1 0 0 X R/W MCR (Modem Control Register) Control del modem

1 0 1 X R/W LSR (Line Status Register) Estado de línea

1 1 0 X R/W MSR (Modem Status Register) Estado del modem

1 1 1 X R/W SCR (Scratch Register) Registro residual

(1) Disponible solamente en el 16550(2) El bit 7 es DLAB

46 de 54 Tema: Entrada y salida a través de los puertos

RBR (Receiver Buffer Register) El circuito receptor del 8250 puede programarse para 5, 6, 7 u 8 bits de datos. En el caso de emplear menos de 8, los bits más significativos de este registro están 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).

BRSR (Baud Rate Select Register)Son los registros DLL y DLM. Estos dos registros de 8 bits conforma dos bytes o un

valor de 16 bits que será el divisor que se aplicará a la frecuencia base para seleccionar la velocidad a emplear. Las velocidades más comunes son:

Velocidad (BPS) Divisor (Decimal) Byte DLM (Hex.) Byte DLL (Hex.)50 2304 09h 00h

300 384 01h 80h600 192 00h C0h2400 48 00h 30h4800 24 00h 18h9600 12 00h 0Ch19200 6 00h 06h38400 3 00h 03h57600 2 00h 02h

115200 1 00h 01hPara obtener estas velocidades serán necesarias unas frecuencias base que se

obtienen como el producto de BRSR en decimal por 16 veces la velocidad, es decir:

Podemos despejar y obtenemos que:

THR (Transmitter Holding Register)En el registro de retención de transmisión se 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, y una vez enviado el registro de desplazamiento queda vacio

47 de 54 Tema: Entrada y salida a través de los puertos

f base=BRSR∗16∗V BPS Para 2400 BPS f base=48∗16∗2400=1843200 Hz=1,8432 MHz

BRSR=f base

16∗V BPS

Para V =50BPS BRSR=184320016∗50

=2304 d=900 h

Para V =300BPSBRSR=184320016∗300

=384 d=180 h

Para V =9600BPS BRSR= 184320016∗9600=12 d=C h

Para V =57600BPSBRSR= 184320016∗57600

=2 d=2 h

y vuelve a cargarse desde el THR para transmitir el nuevo carácter. Cuando se han transmitido todos los caracteres THR queda vacio y el bit THRE del LSR se activa. Cuando están vacíos tanto el THR como el registro de desplazamiento de transmisión se activa el bit TEMT del LSR.

IER (Interrupt Enable Register)Este registro de escritura se utiliza para seleccionar entre cinco tipos de

interrupciones de la UART y que, por consiguiente, van a ser solicitadas a la CPU. Cada interrupción (INTR) puede activarse como señal de salida individualmente. Deshabilitar el sistema de interrupciones inhibe el IIR y desactiva la salida INTR. En la tabla se muestra el contenido de IER.

Bit 7 6 5 4 3 2 1 0Estado 0 0 0 0 (*) (*) (*) (*)Nombre -- -- -- -- IER(3) IER(2) IER(1) IER(0)

Bit 0 – IER0: Cuando se pone a nivel lógico 1 se habilita la interrupción de dato disponible y las interrupciones de temporización en modo FIFO.Bit 1 – IER1: Cuando se pone a nivel lógico 1 se habilita la interrupción de registro de retención de transmisión vacío.Bit 2 – IER2: Cuando se pone a nivel lógico 1 se habilita la interrupción de estado de línea del receptor o error de recepción (bits 1 a 4 del LSR).Bit 3 – IER3: Cuando se pone a nivel lógico 1 se habilita la interrupción de estado del modem ante el cambio del registro de estado del modem MSR.Bit 4 a 7: Estos cuatro bits permancen siempre en estado lógico 0.

IIR (Interrupt Identification Register)El 8250 genera cuatro niveles de prioridad en las interrupciones:

1. Estado de la línea de recepción.2. Dato recibido disponible.3. Registro de retención de transmisión vacío.4. Estado del modem.

El IIR almacena la información que indica que hay una interrupción pendiente y el tipo de la misma e 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 estado lógico 0 del bit 0 indica si hay una interrupción pendiente y el estado lógico 1 del bit 0 que no la hay, lo que permite tratar las interrupciones consultando este bit. Los bits 1 y 2 indican el tipo de interrupción. Cuando la CPU solicita acceso se graba l interrupción pero no se cambia la indicación actual hasta que el acceso se ha completado. Bit 0: Se utiliza para indicar si hay una interrupción pendiente. Cuando está en estado lógico 0 indica interrupción pendiente y el contenido del IIR se usa como puntero para la rutina del servicio de interrupciones. Cuando su estado lógico es 1 indica que no hay ninguna interrupción pendiente.Bit 1 y 2: Estos dos bits del IIR se utilizan para identificar el nivel de prioridad de la interrupción como vemos en la tabla siguiente, en la que también se incluye el bit 3.Bit 3: Este bit es el indicador de producción de error (Framing Error -FE). En modo 16450 este bit es 0. En modo FIFO indica que está pendiente la interrupción del TIMEOUT.

48 de 54 Tema: Entrada y salida a través de los puertos

ModoFIFO

RegistroIdentificacióninterrupción

Activación de interrupciones y funciones de reset

Bit 3 Bit 2 Bit 1

Bit 0 Prioridad Tipo Fuente Control de reset

0 0 0 1 -- Ninguno Ninguna --

0 1 1 0 Primera Línea de estado del receptor

OE -Error Overrun (desborde) o PE - Error de paridad o se produce un error FE - (Framing Error) o BI- rotura de interrupición

Leer Line Status Register

0 1 0 0 Segunda Recibir dato disponible

Recibir dato disponible o nivel de disparo alacanzado

Lectura del buffer del registro receptor o nivel FIFO menor que nivel de disparo

1 1 0 0 Segunda Indicación de Interrupción de Carácter

No se han enviado carácteres desde la última entrada o al FIFO RCVR durante los últimos 4 caracteres

Lectura del buffer del registro receptor

0 0 1 0 Tercera Registro de retención de información vacio

THRE - Registro de retención de información vacio

Leer el registro IIR (si hay fuente de interrupción) o escribir el registro de retención de la transmisión

0 0 0 0 Cuarta Estado del MODEM

Clear to Send o Data Set Ready o Ring Indicator o Data Carrier Detect

Leer el MODEM Status Register

Bit 4: Indicador de rotura de interrupción (BI) que se pone en estado lógico 1 si la entrada de datos se mantiene (estado lógico 0) más tiempo que el de completar una palabra. El bit se pone a cero cuando la CPU lee el contenido de Line Status Register.Bit 5: Bit indicador de Transmitter Holding Register Empty (THRE) e indica que la UART está lista para aceptar un nuevo carácter para su transmisiónBit 6: Bit indicador de Transmitter Empty (TEMT). Se pone a 1 cuando Transmitter Holding Register (THR) y Transmitter Shift Register (TSR) están vacíos y en estado lógico 0 cuando cualquiera de los dos o ambos contienen algún dato. En modo FIFO se pone a 1 cuando el transmisor FIFO y el registro de desplazamiento están vacíos.Bit 7: En modo 16450 es un 0 y en modo FIFO pone a 1 LSR7 cuando hay un error de paridad o se produce un error o existe una indicación de ruptura en FIFO. El LSR7 se pone a cero cuando la CPU lee el LSR y no existen errores en FIFO.

FCR (FIFO Control Register)Solamente está disponible en el 16550.

Bit 0: Habilita el borrado de FIFO, XMIT y RCVR cuando se pone a 1, estado en el que debe estar para escribir los bits 1 y 2. Los registros de desplazamiento de transmisión y recepción no resultan afectados.Bit 1: Cuando se pone a 1 y está habilitado por FCR0 = 1 borra la cola RCVR. Los registros de desplazamiento de transmisión y recepción no resultan afectados.Bit 2: Cuando se pone a 1 y está habilitado por FCR0 = 1 borra la cola XMIT. Los registros de desplazamiento de transmisión y recepción no resultan afectados.Bit 3: Se pone a 1 cuando los pines RXRDY y TXRDY cambian de 0 a 1.Bit 4, 5: Reservados.

49 de 54 Tema: Entrada y salida a través de los puertos

Bit 6, 7: Estos dos bits se usan para establecer el nivel de disparo para la interrupción del RCVR FIFO, según las siguientes posibilidades:

Bit 7 Bit 6 Tamaño de la cola (Bytes)0011

0101

14814

LCR (Line Control Register)Este registro controla el formato del carácter de datos.

Bits 0 y 1: Permiten seleccionar el tamaño del dato de la recepción o transmisión serie. Se denominan WLS0 y WLS1 (WLS es el acrónimo de Word Length Select) y los tamaños de datos pueden ser:

WLS1 WLS0 Tamaño del dato (Bits)0011

0101

5678

Bit 2: Bit que se denomina STB e 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.Bits 3, 4 y 5: El bit 3, denominado PEN (Parity Enable), permite habilitar o no la generación de bit de paridad, EPS (Even Parity Select) --bit 4-- selecciona paridad par si está a 1 (o impar en caso contrario). El bit 5 se denomina Stick Parity y permite forzar el bit de paridad a un estado conocido según el valor de EPS. Las posibles combinaciones para selección de paridad con estos 3 bits son:

Stick Parity

5EPS

4PEN

3

Paridad

00011

00101

01111

Sin paridadImparPar

Marca (1)Espacio (0)

Bit 6: Cuando el bit 6 denominado Break Control se pone 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 transmitir sin caracteres erróneos o extraños siguiendo estos pasos:

1) cargar un carácter 0 en respuesta a THRE2) Activar Break Control en respuesta al próximo THRE3) Esperar a que el transmisor esté inactivo (TEMT=1) y bajar Break Control. Durante

el Break, el transmisor puede usarse como un temporizador de carácter muy preciso

Bit 7: Se trata del bit DLAB (Divisor Latch Access Bit) que 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.

MCR (Modem Control Register)Controla el interface con el modem. La descripción del registro bit a bit es la

siguiente:

50 de 54 Tema: Entrada y salida a través de los puertos

Bits 7 6 5 4 3 2 1 0Denominación -- -- -- LOOP OUT2 OUT1 RTS DTR

Las líneas de salida correspondientes a los bits 0 (Data Terminal Ready), 1 (Request To Send), 2 ( OUT1 ) y 3 ( OUT2 ) están directamente controladas por estos bits. Son activas a nivel bajo, por lo que son puestas a 0 escribiendo un 1 en estos bits y viceversa. Estas líneas sirven para establecer protocolos de comunicaciones.

El bit 4 (LOOP) pone al 8250 en modo lazo o bucle de autodiagnóstico. Con LOOP activo, SOUT pasa a estado de marca (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 ) se desconectan 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 menos significativos del MCR en lugar de las cuatro entradas de control. Estas interrupciones están aún controladas por el IER.

Los 5, 6 y 7 están permanentemente a 0.LSR (Line Status Register)

Este suele ser el primer registro consultado tras una interrupción. La descripción del registro bit a bit es la siguiente:

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

Denominación -- TransmitterEmpty

TransmitterHoldingRegisterEmpty

BreakInterrupt

FramingError

ParityError

OverrunError

DataReady

Bit 0: El bit DR está activo cuando hay un carácter listo en el RBR y es puesto a 0 cuando se lee el RBR. Bits 1, 2, 3 y 4: Los bits 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 siempre que esta interrupción esté habilitada. El bit 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. El bit PE indica si hay un error de paridad. El bit FE indica si el carácter recibido no tiene el bit de stop correcto. El bit 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).Bit 5: El bit 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. Bit 6: El bit TEMT se activa cuando los registros THR y el Transmitter Shift están vacíos, y volverá a desactivarse cuando se deje otro dato en el THR hasta que el último bit salga por SOUT.Bit 7: En modo 16450 permanece a 0. En modo FIFO LSR se pone a 1 cuando se produce un error de paridad, de desbordamiento o de ruptura. LSR se pone a 0 cuando la CPU lee el LSR y no existen errores en FIFO.

51 de 54 Tema: Entrada y salida a través de los puertos

MSR (Modem Status Register)La descripción del registro bit a bit es la siguiente:

Bits 7 6 5 4 3 2 1 0Nombre DCD RI DSR CTS DDCD TERI DDSR DCTS

Denominación DataCarrierDetect

RingIndicator

DataSetReady

ClearTo Send

DeltaDataCarrierDetect

TrailingEdge ofRingIndicator

DeltaDataSetReady

DeltaClearToSend

Bit 0, 1, 2 y 3: Además de la información de estado del modem, los 4 bits menos significativos (DDCD, TERI, DDSR, DCTS) indican si la línea correspondiente, en los 4 bits de mayor peso, han cambiado de estado desde la última lectura del MSR; en el caso de TERI sólo indica transiciones de nivel bajo a alto y no las contrarias. Bit 4: La línea CTS del modem indica si está listo para recibir datos del 8250 a través de SOUT. En modo loop o lazo este bit equivale al bit RTS del MCR.Bit 5: La línea DSR del modem indica que está listo para dar datos al 8250. En modo lazo o loop equivale al bit DTR del MCR.Bit 6 y 7: RI y DCD indican el estado de ambas líneas. En modo loop se corresponden con OUT1 y OUT2 respectivamente. Al leer el MSR, se borran los 4 bits de menor peso pero no los bits de estado o mayor peso.

Los bits de estado o más significativos (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.SCR (Scratch Register)

Este registro no es utilizado por el 8250, y de hecho no existía en las primeras versiones del integrado. Los 8 bits de lectura/escritura pueden ser empleados por el programador como un byte de memoria temporal.Circuitos de reloj típicos

Externo Con cristal

Osciladores a cristal típicosCristal Rp RX2 C1 C2

3.1 MHz 1 MΩ 1.5k 10-30 pF 40-60 pF1.8 MHz 1 MΩ 1.5k 10-30 pF 40-60 pF

52 de 54 Tema: Entrada y salida a través de los puertos

Programación del 8250El 8250 se programa a través de los registros de control LCR, IER, DLL, DLM y

MCR. Aunque los registros de control pueden ser escritos en cualquier orden, IER debe ser escrito al final porque controla la habilitación de las interrupciones. Una vez que el 8250 ha sido programado, los registros pueden ser actualizados en cualquier momento en que el 8250 no se encuentre enviando o recibiendo datos.

En ordenadores compatibles puede haber conectados, de manera normal, hasta 4 puertos serie, nombrados de COM1 a COM4. En el área de datos de la BIOS (segmento 40h) y justo al principio de la misma, hay 4 palabras con la dirección de memoria base de los puertos serie. A esta dirección de memoria base habrá que sumar el desplazamiento relativo del número de registro a ser accedido.

El principal problema reside en que sólo están previstas 2 interrupciones para los puertos serie. Ello implica que generalmente sólo 2 de los puertos podrán emplear interrupciones a un tiempo, debido a la arquitectura del bus ISA. Generalmente COM1/COM3 compartirán la IRQ4 (INT 0Ch) y COM2/COM4 la IRQ3 (INT 0Bh). Estas asignaciones pueden ser cambiadas por el usuario actuando sobre los switches de configuración de las tarjetas (que en ocasiones permiten incluso elegir la IRQ5). Por tanto, no está de más tener cuidado en los programas y permitir un cierto grado de configuración en estas cuestiones.

En la tabla siguiente muestra los offsets o desplazamientos que hay que sumar a la dirección E/S base del puerto serie para acceder a sus registros. COM1 suele estar en 3F8h, COM2 en 2F8h, COM3 en 3E8h y COM4 en 2E8h. Sin embargo, es mejor acceder a las variables de la BIOS para obtener la dirección, lo que podemos hacer de la misma forma que hicimos para el puerto paralelo y que en un PC concreto con un solo puerto serie vemos en la imagen siguiente.

53 de 54 Tema: Entrada y salida a través de los puertos

Offset DLAB Read/Write Nombre Función del Registro0 0 R RBR (Receiver Buffer Register) Buffer de recepción

0 1 R/W DLL (Divisor Latch LSB) LSB del divisor de velocidad

0 0 W THR (Transmitter Holding Register) Registro de retención de la transmisión

1 0 R/W IER (Interrupt Enable Register) Habilitación de interrupciones

1 1 R/W DLM (Divisor Latch MSB) MSB del divisor de velocidad

2 X R IIR (Interrupt Identification Register) Identificación de interrupciones

2 X W FCR (FIFO Control Register) Control de FIFO (1)

3 X R/W LCR (Line Control Register) Control de línea (2)

4 X R/W MCR (Modem Control Register) Control del modem

5 X R/W LSR (Line Status Register) Estado de línea

6 X R/W MSR (Modem Status Register) Estado del modem

7 X R/W SCR (Scratch Register) Registro residual

(1) Disponible solamente en el 16550(2) El bit 7 es DLAB

El cristal que gobierna el 8250 oscila a 1.8432 MHz. Nosotros debemos considerar esta frecuencia dividida por 16 de cara a calcular el valor para el divisor. Por tanto, la velocidad máxima que puede alcanzar el puerto serie de los PC es:

Con datos de 8 bit se pueden empaquetar los bytes en 10 baudios (1 bit de inicio, 8 de datos, 1 de stop), lo que permite alcanzar 11520 bytes/seg (11.25 Kb/seg). Para distancias de pocos metros no habrá problemas, incluso para distancias algo mayores si los cables se diseñan con cuidado.

54 de 54 Tema: Entrada y salida a través de los puertos

Velocidad=184320016

=115200 baudios