Usando El Puerto Paralelo de Una PC

Usando el puerto paralelo de una PC Proyecto: Interfaz para el Puerto Paralelo Fecha: 3 de Setiembre de 2000 Introducci

Views 102 Downloads 63 File size 432KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

Usando el puerto paralelo de una PC

Proyecto: Interfaz para el Puerto Paralelo Fecha: 3 de Setiembre de 2000 Introducción: El puerto paralelo de una PC es ideal para ser usado como herramienta de control de motores, relés, LED's, etc. El mismo posee un bus de datos de 8 bits (Pin 2 a 9) y muchas señales de control, algunas de salida y otras de entrada que también pueden ser usadas fácilmente. Las PC's generalmente poseen solo uno de estos puertos (LPT1) pero con muy poco dinero se le puede adicionar una tarjeta con un segundo puerto paralelo (LPT2). En reglas generales la dirección hexadecimal del puerto LPT1 es igual a 0x378 (888 en decimal) y 0x278 (632 en decimal) para el LPT2. Esto se puede verificar fácilmente en el setup de la PC o bien en el cartel que generalmente la PC muestra en el momento del booteo. Puede darse el caso que el LPT1 asuma la dirección 0x3BC (956 en decimal) y el LPT2 0x378, en ese caso habrá que tratar de corregir el setup y/o los jumper de las tarjetas en caso que sea posible. De lo contrario se puede modificar el software que veremos mas adelante para aceptar esas direcciones.

Breve descripción del puerto paralelo: El puerto paralelo de un PC posee un conector de salida del tipo DB25 hembra cuyo diagrama y señales utilizadas podemos ver en la siguiente figura:

Si deseamos escribir un dato en el bus de salida de datos (pin 2 a 9) solo debemos escribir el byte correspondiente en la dirección hexadecimal 0X378 (888 en decimal) cuando trabajamos con el LPT1 y 0x278 (632 en decimal) cuando trabajamos con el LPT2. Los distintos pins (bits) de salida correspondientes al bus de datos no pueden ser escritos en forma independiente, por lo que siempre que se desee modificar uno se deberán escribir los ocho bits nuevamente. Para leer el estado de los pins de entrada (10, 12, 13 y 15) se debe realizar una lectura a la dirección hexadecimal 0x379 (889 en decimal) si trabajamos con el LPT1 o bien leer la dirección

0x279 (633 en decimal) si trabajamos con el LPT2. La lectura será devuelta en un byte en donde el bit 6 corresponde al pin 10, el bit 5 corresponde al pin 12, el bit 4 corresponde al pin 13 y el bit 3 corresponde al pin 15. En la siguiente tabla se puede ver lo antedicho en una forma más gráfica: Escritura: Salida de Datos Escritura en dirección 0x378 (LPT1) o 0x278 (LPT2) DATO

BIT 7

BIT 6

BIT 5

BIT 4

BIT 3

BIT 2

BIT 1

BIT 0

DB25

Pin 9

Pin 8

Pin 7

Pin 6

Pin 5

Pin 4

Pin 3

Pin2

CN5

TTL 7

TTL 6

TTL 5

TTL 4

TTL 3

TTL 2

TTL 1

TTL 0

CN4

No usar

HP 6

HP 5

HP 4

HP 3

HP 2

HP 1

HP 0

Lectura: Entrada de Datos Lectura en dirección 0x379 (LPT1) o 0x279 (LPT2) DATO

BIT 7

BIT 6

BIT 5

BIT 4

BIT 3

BIT 2

BIT 1

BIT 0

DB 25

No usar

Pin 10 Pin 12 Pin 13 Pin 15

No usar

No usar

No usar

CN6

No usar

Input 3 Input 2 Input 1 Input 0

No usar

No usar

No usar

Interfaz: En la archivo IPP01-CIRCUIT.PDF podemos apreciar el circuito correspondiente a la interfaz para el puerto paralelo. La interfaz nos provee 8 salidas TTL, 7 salidas de potencia (500ma) y cuatro entradas TTL. Es importante tener en cuenta que las salidas TTL entregan una tensión de 5v y solo se les puede exigir un mínimo de corriente, apenas suficiente para activar un transistor o bien un par de compuertas TTL. Así mismo las entradas TTL deben ser alimentadas con una tensión máxima de 5v o de lo contrario el chip resultará dañado. Esta tensión se obtiene desde VDD a través del regulador U1 (7805). Las 7 salidas de potencia no son mas que la amplificación mediante un array de transistores Darlington (ULN2003) de las salidas TTL 0 a 6 (la salida 7 no es usada). Este chip puede drenar una corriente máxima de 500ma, lo que es suficiente para activar un LED, un relé y hasta un motor DC de bajo consumo (tipo motor de grabador). La teoría de funcionamiento es muy simple, solo se usan unas compuertas del tipo Buffer (74HC245) para poder conectarnos con seguridad al puerto paralelo, y un array de transistores Darlington (ULN2003) para brindar una salida de mayor potencia. Cabe aclarar que los dos integrados 74HC245 se alimentan del regulador de voltaje 7805, el cual se encarga de reducir la tensión de entrada (VDD) a 5v (Vcc). La tensión VDD debe estar comprendida entre 9 y 12v.

La tensión de entrada VHH alimenta directamente al ULN2003 para obtener mayor voltaje en caso de querer manejar un relé o bien un pequeño motor. La tensión VHH debe estar comprendida entre 3 y 15v. VHH podrá conectarse directamente a VDD (y de esa forma usar solo un fuente de alimentación) siempre que esto no provoque problemas de ruido. En los siguientes diagramas se pueden apreciar un ejemplo de conexionado de un LED y un Relé a las salidas de potencia. En forma análoga podríamos conectar también un pequeño motor DC.

para interfaz:

Programa manejo de la

El siguiente es un programa hecho en Qbasic en donde se puede apreciar como se debe trabajar con el puerto paralelo y como se puede sacar provecho de la interfaz. Para visualizarlo o bajarlo a la PC haga click aquí. También puede bajar el ejecutable (.exe) directamente si así lo desea haciendo click aquí. El funcionamiento de este software es muy simple y básico. Primero le solicitará que elija el puerto a usar (LPT1 o LPT2). Luego puede elegir "Leer Port" para recuperar el estado de los pins de entrada (0 a 3) o bien "Escribir Port" para cambiar el estado de los pins de salida (0 a 7). Recuerde que si cambiamos el pin de salida 0 , también se altera el mismo pin en la salida de potencia (solo pins 0 a 6, el 7 no tiene salida de potencia). Mediante el análisis de este programa Basic se puede intentar hacer programas mas elaborados en lenguajes más modernos.

Introducción Hace años, IBM diseñó el puerto paralelo para manejar impresoras desde su gama de microcomputadores PC/XT/AT. Un conector estándar macho de 25 pines aparecía en la parte trasera del PC con el solo propósito de servir de interfaz con la impresora. El sistema operativo DOS cargado en dichos PC soporta hasta tres puertos paralelos asignados a los identificadores LPT1, LPT2 y LPT3, y cada puerto requiere tres direcciones consecutivas del espacio de E/S (entrada-salida) del procesador para seleccionar todas sus posibilidades. Desde el punto de vista del hardware, el puerto consta de un conector hembra DB25 con doce salidas latch (poseen memoria/buffer intermedio) y cinco entradas, con ocho líneas de tierra. Desde el punto de vista del software, el puerto paralelo consta de tres registros (datos, estado y control) de 8 bits cada uno, que ocupan tres direcciones de E/S (I/O) consecutivas de la arquitectura x86.

La función normal del puerto consiste en transferir datos a una impresora mediante 8 líneas de salida de datos, usando las señales restantes como control de flujo. Sin embrago, puede ser usado como un puerto E/S de propósito general por cualquier dispositivo o aplicación que se ajuste a sus posibilidades de entrada/salida.

Descripción del conector físico La conexión del puerto paralelo al mundo exterior se realiza mediante un conector hembra DB25. Observando el conector de frente y con la parte que tiene mayor número de pines hacia arriba, se numera de derecha a izquierda y de arriba a abajo, del 1 al 13 (arriba) y del 14 al 25 (abajo).

En este conector: •

8 líneas (pines) son para salida de datos (bits de DATOS). Sus valores son únicamente modificables a través de software, y van del pin 2 (dato 0, D0) al pin 9 (dato 7, D7). 5 líneas son de entrada de datos (bits de ESTADO), únicamente modificables a través del hardware externo. Estos pines son: 11, 10, 12, 13 y 15, del más al menos significativo. 4 líneas son de control (bits de CONTROL), numerados del más significativo al menos: 17, 16, 14 y 1. Habitualmente son salidas, aunque se pueden utilizar también como entradas y, por tanto, se pueden modificar tanto por software como por hardware. las líneas de la 18 a la 25 son la tierra.

• • •

En la siguiente tabla se detallan la nomenclatura y descripción de cada línea. La columna "Centronics pin" se refiere a las líneas del conector tipo Centronics usado en las impresoras. La columna E/S se refiere al dato visto desde el lado del PC. DB25 Centronics Tipo pin pin (E/S)

Señal

Descripción Si está bajo más de 0.5 µs, habilita a la impresora para que reciba los datos enviados.

1

1

S

Strobe

2

2

S

D0

Bit 0 de datos, bit menos significativo (LSB)

3

3

S

D1

Bit 1 de datos

4

4

S

D2

Bit 2 de datos

5

5

S

D3

Bit 3 de datos

6

6

S

D4

Bit 4 de datos

7

7

S

D5

Bit 5 de datos

8

8

S

D6

Bit 6 de datos

9

9

S

D7

Bit 7 de datos, bit más significativo (MSB)

10

10

E

Ack

Un pulso bajo de ~11µs indica que se han recibido datos en la impresora y que la misma está preparada para recibir más datos.

11

11

E

Busy

En alto indica que la impresora está ocupada.

12

12

E

13

13

E

14

14

S

AutoFeed

Si está bajo, el papel se mueve una línea tras la impresión.

15

32

E

Error

En bajo indica error (no hay papel, está fuera de línea, error no det.).

16

31

S

Init

Si se envía un pulso en bajo > 50 µs la impresora se reinicia.

17

36

S

Select

En bajo selecciona impresora (en gral. no se usa, ya que SelectIn se fija a alto).

18-25

19-30,33

18-25

16

Masa lógica

18-25

17

Masa chasis

PaperEnd En alto indica que no hay papel. SelectIn En alto para impresora seleccionada.

GND

Masa retorno del par trenzado.

El nombre de cada señal corresponde a la misión que cumple cada línea con relación a la impresora, el periférico para el que fue diseñado el puerto paralelo. Las señales activas a nivel bajo aparecen con la barra de negación (por ejemplo, Strobe). Cuando se indica alto o bajo se refiere a la tensión en el pin del conector. Alto equivale a ~5V en TTL y bajo a ~0V en TTL.

Acceso al puerto El puerto paralelo se identifica por su dirección de E/S (entrada/salida, I/O) base y se reconoce en sistemas MS-DOS por el número LPT (lp en Unix/Linux). Cuando arranca la máquina, la BIOS (Basic Input Output System) chequea direcciones específicas de E/S en busca de puertos paralelos y construye una tabla de las direcciones halladas en la posición de memoria 40h:8h (o 0h:0408h) (véase direccionamiento segmentado). Esta tabla contiene hasta tres palabras de 16 bits, cada palabra con el byte bajo primero seguido por el byte alto. Cada palabra es la dirección de E/S base del puerto paralelo (que denominaremos LPT_BASE en lo sucesivo). La primera corresponde a LPT1, la segunda a LPT2 y la tercera a LPT3. Hay que agregar que, en MS-DOS tenemos el dispositivo PRN que es un alias a uno de los dispositivos LPT (generalmente es LPT1, pero se puede cambiar con la orden MODE). Las direcciones base estándar para los puertos paralelos son: • • •

03BCh 0378h 0278h

chequeadas en este orden. La siguiente tabla muestra, como ejemplo, la memoria en un PC con dos puertos paralelo instalados en las direcciones hexadecimales 378 y 278.

Identificador DOS

Dirección

Byte bajo

Byte Hexadecimal Decimal alto

LPT1

0000:0408/9

78

03

378

888

LPT2

0000:040A/B

78

02

278

632

LPT3 (no instalado)

0000:040C/D

00

00

0

0

Registros El puerto paralelo estándar (SPP) consta, como se mencionó antes, de tres registros de 8 bits localizados en direcciones adyacentes del espacio de E/S del PC. Los registros se definen relativos a la dirección de E/S base (LPT_BASE) y son: • • •

LPT_BASE + 0: registro de DATOS LPT_BASE + 1: registro de ESTADO LPT_BASE + 2: registro de CONTROL

REGISTROS DATOS ESTADO DIRECCIÓN E/S

CONTROL

Nombre habitual

Puerto

378h

379h

37Ah

LPT1

Puerto

278h

279h

27Ah

LPT2

Puerto

3BCh

3BDh

3BEh

MDA con p. paralelo

Se hará referencia a cada bit de los registros como una inicial que identifica el registro seguido de un número que identifica el número de bit, siendo 0 el LSB (bit menos significativo) y 7 el MSB (bit más significativo). Por ejemplo, D0 es el bit 0 del reg. de datos, S7 es el bit 7 del reg. de estado y C2 es el bit 2 del reg. de control. Se indican con una barra de negación los bits que utilizan lógica negativa. En lógica positiva un 1 lógico equivale a alto (~5 V TTL) y un 0 lógico a bajo (~0 V TTL). En lógica negativa 1 equivale a bajo (~0 V) y 0 equivale a alto (~5 V).

Es preciso no confundir la lógica que sigue el puerto con la lógica que mantiene la impresora. Por ejemplo, la impresora pone a alto Busy (pin 11) para indicar que está ocupada. Pero en realidad, al leer el registro de estado, Busy la interpretamos como 0 (puesto que el pin 11 se corresponde con S7). Es decir, es como si fuera activa en bajo (Busy).

Registro de datos (D) El registro de estado se halla en LPT_BASE. Se puede leer y escribir. Escribir un dato en el registro causa que dicho dato aparezca en los pines 2 a 9 del conector del puerto. Al leer el registro, se lee el último dato escrito (NO lee el estado de los pines; para ello hay que usar un puerto bidireccional).

El estándar es que las salidas sean LS TTL (low schottky TTL), aunque las hay que son de tipo OC (colector abierto). La corriente que pueden entregar (modo source) es de 2,6 mA máximo y pueden absorber (modo sink) un máximo de 24 mA. n el puerto original de IBM hay condensadores de 2,2 nF a masa. Las tensiones para el nivel bajo son entre 0 y 0,8V y el nivel alto entre 2,4V y 5V. El registro de estado está en LPT_BASE+1. Es de sólo lectura (las escrituras serán ignoradas). La lectura da el estado de los cinco pines de entrada al momento de la lectura. En la tabla siguiente los nombres de los pines se dejaron en inglés porque es como generalmente se identifican.

La línea Busy tiene, generalmente, una resistencia de pull-up interna. El estándar es que sean entradas tipo LS TTL.

El registro de control se encuentra en LPT_BASE+2. Es de lectura/escritura.

Los cuatro bits inferiores son salidas. La lectura devuelve lo último que se escribió a dichos bits. Son TTL a colector abierto con resistencias de pull-up de 4.7 k , por lo que un dispositivo externo puede forzar el estado de los pines sin dañar el driver. Esto permite utilizar estas cuatro líneas como entradas. Para ello, se ponen en alto las cuatro salidas (escribiendo 0100b, es decir, 4h, en LPT_BASE+2) lo que hace que las salidas "floten". Ahora, un dispositivo externo puede forzar a bajo alguna de las salidas con lo que, leyendo el puerto, sabemos si esto sucedió o no. Es posible realizar esta técnica en salidas totem-pole (como D0-D7) pero no se recomienda su uso porque habría que tener un conocimiento preciso de la corriente, ya que se puede sobrecargar los transistores de salida y dañar el driver (especialmente en puertos integrados LSI). Bit de puerto bidireccional (compatible PS/2) El bit C5, está disponible sólo si se trata de un puerto bidireccional; en los puertos comunes no se utiliza, al igual que los bits C6 y C7. Si C5=1, el buffer de los datos de salida se pone en alta impedancia, "desconectando" dicho buffer de los pines 2 a 9 del conector del puerto (D0 a D7). Si se escribe al registro de datos, se escribe al buffer pero no a la salida. Esto permite que al leer el puerto, se lea el estado de las entradas y no lo que hay en buffer. Cuando C5=0 el puerto retorna al modo salida, su estado por defecto. En las computadoras IBM PS/2, para habilitar el puerto paralelo bidireccional, además de lo antes descrito, se debe poner a 1 el bit 7 del registro del puerto 102h (opciones de configuración). En computadoras que no tengan puerto paralelo bidireccional compatible PS/2 hay que modificar uno o más bits de algún puerto específico correspondiente al chipset de la placa. A veces se habilita por el Setup o por jumper en la placa del puerto. Bit de interrupción En trabajos normales de impresión ni el BIOS ni el DOS hacen uso de la interrupción. El hecho de poseer una línea de interrupción que está conectada directamente al PIC (Programmable Interrupt Controller), lo hace muy útil para experimentación en data-loggers por ejemplo. El bit de interrupción está conectado al control de un buffer de tres estados. Cuando C4=1, se activa el buffer y su entrada, S6, se conecta a la línea IRQ (en general es IRQ7 o IRQ5). La lectura del bit, nos devuelve el estado del mismo (es decir si el buffer está en alta impedancia o no). Se producirá una interrupción, cuando haya un flanco descendente en el pin correspondiente a S6. A continuación, se describen los pasos para poder utilizar interrupciones. Finalmente, se muestra una tabla que reúne las características hardware y software del puerto paralelo.

DB25 Centronics Tipo Registro bit Activo pin pin (E/S)

Señal

Descripción Si está bajo más de 0.5 µs, habilita a la impresora para que reciba los datos enviados.

1

1

Control C0 0

2

2

DO Dato 0

S

alto

D0

Bit 0 de datos, bit menos significativo (LSB)

3

3

D1 Dato 1

S

alto

D1

Bit 1 de datos

4

4

D2 Dato 2

S

alto

D2

Bit 2 de datos

5

5

D3 Dato 3

S

alto

D3

Bit 3 de datos

6

6

D4 Dato 4

S

alto

D4

Bit 4 de datos

7

7

D5 Dato 5

S

alto

D5

Bit 5 de datos

8

8

D6 Dato 6

S

alto

D6

Bit 6 de datos

9

9

D7 Dato 7

S

alto

D7

Bit 7 de datos, bit más significativo (MSB)

S

bajo

Strobe

10

10

S6 Estado IRQ 6

E

alto

Ack

Un pulso bajo de ~11µs indica que se han recibido datos en la impresora y que la misma está preparada para recibir más datos.

11

11

S7

Estado 7

E

bajo

Busy

En alto indica que la impresora está ocupada.

12

12

S5

Estado 5

E

alto

PaperEnd

En alto indica que no hay papel.

13

13

S4

Estado 4

E

alto

SelectIn

14

14

C1

Control 1

S

bajo

15

32

S3

Estado 3

E

alto

Error

En bajo indica error (no hay papel, está fuera de línea, error no det.).

16

31

C2

Control 2

S

alto

Init

Si se envía un pulso en bajo > 50 µs la impresora se reinicia.

17

36

Control C3 3

Select

En bajo selecciona impresora (en gral. no se usa, ya que SelectIn se fija a alto).

18-25

19-30,33

18-25

16

Masa lógica

18-25

17

Masa chasis

Miscelánea

S

bajo

En alto para impresora seleccionada.

Si está bajo, el papel se AutoFeed mueve una línea tras la impresión.

GND

Masa retorno del par trenzado.

El handshaking ("apretón de manos" o protocolo) es un conjunto de reglas que ambos extremos de un sistema de comunicación tienen que seguir para que la comunicación sea correcta. El puerto paralelo, usado con una impresora, transmite datos y transmite/recibe las señales de protocolo. Las principales son Strobe, Ack y Busy. La secuencia a seguir para enviar datos sería: 1. 2. 3. 4.

5.

Colocar el byte a enviar en el registro de datos. Verificar que la impresora no esté ocupada (Busy = bajo, S7 = 1). Indicarle a la impresora que acepte los datos (Strobe = bajo , C0 = 1, pulso >5us). En ese instante la impresora indica que está ocupada recibiendo los datos (Busy = alto, S7 = 0). Finalmente, la impresora envía un pulso de aceptación indicando que se recibieron los datos y que se puede volver al paso 1 (Ack = bajo, S6 = 0, pulso de entre 5 s y 15 s según impresora).

Las otras señales sirven para verificar el estado de la impresora (Error, PaperEnd), para reiniciarla (Init) y para configurarla (AutoFeed, Select). En los nuevos puertos, estas señales adquieren otra función, a veces parecida y otras totalmente distintas.

Interrupciones con el puerto paralelo En primer lugar, se debe habilitar el buffer que conecta la línea ACK con la línea IRQ. Esto lo hacemos poniendo a 1 el bit 4 del registro de control (LPT_BASE+2). Luego se debe preparar una ISR (Interrupt Service Routine) que atienda la interrupción recordando enviar la señal EOI (20h) al registro de control del PIC (puerto 20h) al salir de la rutina. La interrupción software corresponde a la número 0Dh para IRQ5 y 0Fh para IRQ7. Finalmente se habilita con 0 la interrupción IRQ5 (o IRQ7) escribiendo al bit 5 (o 7) del registro de interrupciones del PIC (puerto 21h). Para desinstalar la ISR, se deshabilita la IRQ5 (o IRQ7) escribiendo un 1 al bit 5 (o 7) del registro de interrupciones del PIC (puerto 21h). Luego se hace que C4=0. Velocidad Un puerto paralelo ISA normal toma un ciclo-ISA para leer o escribir. En un sistema cuya velocidad de bus sea 1,3 Mhz, se puede decir que la lectura se puede hacer cada 1 s (idealmente, ya que siempre existen otras instrucciones software, etc; En la práctica pueden ser desde 1.2 s a 2 s). Algunos puertos soportan un modo "turbo" que elimina los 3 estados de espera de la CPU, con lo que la velocidad de lectura/escritura del puerto se duplica (2,7 MHz).

Envio y lectura de datos del puerto

Envío de datos al puerto El puerto paralelo puede ser usado como una comunicación directa con el PC, de este modo es posible desarrollar aplicaciones en tiempo-real que necesiten un rápido tiempo de respuesta. El acceso se realiza escribiendo un byte (8 bits) en registro determinado. Este byte debe referirse a cada uno de los bits del registro. Esto significa que se debe definir el byte a escribir en sistema binario. Por ejemplo si queremos escribir en el registro de datos el bit D0 y el bit D2 entonces el byte es:

0

0

0

0

0

1

0

1

= 5 En decimal

D7

D6

D5

D4

D3

D2

D1

D0

Registro de datos

Luego, se debe escribir 5 en el registro de datos (dirección base): Notas: dir_base y dir_estado es de tipo word, y dato es de tipo byte. En Turbo Pascal Port[dir_base]:=5; En C Outportb(dir_base, 5); En ensamblador mov dx, dir_base {Direccionar en dx la dirección base} mov al, 5 {Colocar en ² al ² el número 5} out dx, al {Enviar al puerto}

Lectura de datos del puerto La lectura de datos se realiza accesando un byte del registro determinado. Al hacer la lectura se debe convertir el byte a binario para determinar él o los bits que interesen. Note que sólo se debe leer el registro de estado, o sea, la dirección base+1. En Turbo Pascal Var dato: byte; dato:=Port[dir_estado];

En C unsigned int dato; dato=inportb(dir_estado); En ensamblador mov dx, dir_estado {Direccionar dx con el registro de estado del puerto} in al, dx {Leer del puerto. En el registro ² al ² está el dato leído}

Por ejemplo, si el dato leído es igual a 96, significa que los bits S5 y S6 están activos(tienen un nivel alto, un 1). 0

1

1

0

0

0

0

0

= 96 En decimal

S7

S6

S5

S4

S3

S2

S1

S0

Registro de estado

Enmascaramiento Tanto en el envío como recepción de datos binarios, se realizan operaciones a nivel de bits. Estas operaciones permiten aislar uno más bits. Este proceso se denomina enmascaramiento. Por ejemplo, para saber si determinado bit que se ha leído del registro de estado está en un nivel alto (1 lógico) se puede hacer la operación "Y" lógica (AND) de la lectura con un valor que resulta de elevar 2 a la posición que ocupa ese bit en el byte, y luego realizar la comparación. Si el bit que se desea conocer es el bit 5, entonces la operación es: Masc:=2^5=32 (Byte_leido AND masc) En el caso que el bit 5 esté en un nivel alto: Byte_leido 0

1

1

0

0

0

0

0

96

S7

S6

S5

S4

S3

S2

S1

S0

Posición

0

0

Máscara = 32

AND 0

0

1

0

0

0

Resulta

0

0

1

0

0

0

0

0

32= máscara

En el caso que el bit 5 no esté en un nivel alto: Byte_leido 0

1

0

1

0

0

0

0

80

S7

S6

S5

S4

S3

S2

S1

S0

Posición

0

0

Máscara = 32

0

0 máscara

AND 0

0

1

0

0

0

Resulta 0

0

0

0

0

0

0

Si el bit 5 es 1, entonces el resultado es 16, o igual a masc. Haciendo la comparación: Si (Byte_leido AND masc) = masc entonces Inicio /* las acciones a realizar cuando el 4to bit es 1 */ Fin Si el bit 5 es 0, entonces el resultado siempre es 0, lo cual es diferente a masc. En caso que se desee realizar el enmascaramiento de más de un bit, se realiza la suma los valores. Ej. Máscara para el bit 5 y el 7 Masc= 2^5+2^7=160

Expansión a 8 entradas digitales para el puerto paralelo

Como ya es sabido, el puerto paralelo estándar sólo tiene 4 entradas digitales. Algunas aplicaciones pueden necesitar más de las 4 entradas. En este caso es posible expandir las entradas mediante un sencillo circuito basado en un componente electrónico como el buffer 74LS157 para alimentar los datos en forma de dos nibbles (medio byte, 4 bits) mediante las entradas del registro de estado (4 o 5 líneas) hacia el puerto paralelo. Se puede usar el registro de datos o el registro de control para seleccionar el nibble.

Descripción del buffer 74LS157

Fig. El buffer 74LS157

Referencias Entradas Salidas I0a Entrada 0a Qa Salida Qa I0b Entrada 0b Qb Salida Qb I0c Entrada 0c Qc Salida Qc I0d Entrada 0d Qd Salida Qd I1a Entrada 1a I1b Entrada 1b I1c Entrada 1c I1d Entrada 1d

Alimentación y operación S Selección de nibble. (Bajo selecciona I0. Alto selecciona I1) -Enable Habilitación del componente (mantener señal en bajo)

Vcc 5 voltios Gnd Tierra La fuente de 5 voltios para alimentar este circuito se puede obtener directamente de la fuente de poder del PC, o del puerto de juegos (ver fuente de alimentación).

Modo de operación Con el 74LS157 la selección se realiza a través del registro de control o de datos. En la figura que está a continuación se muestra en caso de que la selección sea a través del registro de control.

Fig. Conexión sugerida del 74LS157

Programación El siguiente algoritmo permite leer los ocho bits de la entrada del 74LS157 /* Inicio */ /* Selección del primer nibble */ Colocar 0 en el bit C3- para seleccionar el nibble N1 Leer el registro de estado en una variable, por ejemplo d_leido Realizar la operación d_leido XOR con 128, para corregir el signo de S7Este resultado operar con AND 240, para descargar bits no deseados Desplazar a la derecha 4 bits para colocarlo en el nibble de abajo

Almacenar el resultado de un lado /* Selección del segundo nibble */ colocar 1 en el bit C3-, para seleccionar el nibble N2 Leer el registro de estado en una variable, por ejemplo d_leido Realizar la operación d_leido XOR con 128, para corregir el signo de S7Este resultado operar con AND 240, para descargar bits no deseados Realizar la operación OR del resultado con el nibble almacenado previamente En el resultado final están los 8 bits leídos.

Funcionamiento Explicación del funcionamiento mediante el BIOS y el MS-DOS

IBM especificó direcciones base para el puerto paralelo estándar (dentro del espacio de direccionamiento de Entrada/Salida del 80x86). El adaptador de impresora podría usar la dirección base 3BCh, o más tarde 378h o 278h. El BIOS (Basic Input Output System) de IBM crea en el momento de arranque o POST (Power On Seft Test) una tabla en el espacio de la memoria principal (RAM) para 4 direcciones base de puerto paralelo de impresora, estos se almacenan como 4 bytes empezando con la dirección de memoria 408h. Durante el arranque, el BIOS comprueba si hay puertos paralelos en las direcciones base 3BCh, 378h, y 278h, en ese orden, y almacena la dirección base de cualesquiera que hayan sido encontrados en posiciones consecutivas de la tabla. Las posiciones que no son usadas pueden estar en 0, o como algunos BIOS lo hacen, le colocan la dirección del primer puerto encontrado. Algunos programas pueden ignorar esta tabla, pero esta es usada por lo menos por el propio BIOS (mediante la INT 17 de E/S de impresora) y por el MS-DOS. El BIOS detecta estos puertos escribiendo AAh al registro de datos (en la dirección de E/S Base + 0), y luego si en el registro de datos se lee AAh. Significa que hay un puerto. Normalmente la asignación de direcciones es como sigue: Dirección

Nombre

Ubicación

3BCh

LPT1

Adaptador de impresión primario

378h

LPT2

Adaptador de impresión secundario

Las referencias a cada registro del puerto se realizan de la siguiente forma: o o o

Base (datos)=base+0 Estado=base+1 Control=base+2

Por ejemplo, si encontramos que la dirección base es 378h, entonces las direcciones del registro de datos, estado y control serán: o o o

Base (datos)=378h Estado=379h Control=37Ah

Cada una de ellas permite accesar a los siguientes bits (descritos en la tabla general): o o o

Base (datos)=D0, D1, D2, D3, D4, D5, D6, D7 Estado=S3, S4, S5, S6, S7 Control=C0, C1, C2, C3

******************************************

El Conversor Analógico Digital ADC0804CN y el puerto Paralelo

Si se desea capturar señales analógicas en el orden de los 0 a 5 voltios, es posible utilizar el conversor Analógico / Digital ADC0804CN Para ello se propone el esquema eléctrico de un conversor analógico-digital básico como el de la siguiente figura:

Esquema del interfaz de control de entradas analógicas mediante p. paralelo Dicho circuito se alimenta a +5v y convierte señales analógicas en el intervalo entre 0 y 5v. Como núcleo se utiliza el circuito integrado ADC0804CN, un conversor A/D de 8 bit, barato y habitualmente disponible. Por defecto, el intervalo de entrada está entre 0 y +5V pero, usando una referencia externa y/o elevando la señal Vin- respecto a GND, se puede conseguir un amplio intervalo de niveles de entrada. Trabaja con una frecuencia máxima de 8 kHz, de modo que se puede utilizar incluso con señales de audio de baja calidad. A efectos de prueba, la señal analógica a convertir proviene del potenciómetro R2; variando éste se modifica la señal entre 0 y 5 voltios. Dicha señal se introduce en el conversor ADC0804. Una vez convertida, el valor digital es presentado en las líneas D0 a D7 y deberá ser leído a través del puerto paralelo según el protocolo explicado a continuación. Para el correcto funcionamiento de la conversión se debe respetar un protocolo entre el PC y el conversor. Básicamente es el siguiente: •

Petición de comienzo de conversión: el PC debe enviar esta petición al ADC. Para ello se activa la señal CS (a nivel bajo) y, dentro del período de activación, se activa la señal WR durante un mínimo de 100 ns. El conversor activará la línea INTR (la señal es activa a nivel bajo) para indicar que ha terminado la conversión (ver figura siguiente). A partir de ese momento el PC puede leer el dato.

Diagrama de tiempos para el inicio de la conversión •

Proceso de lectura: se selecciona el conversor a través de la línea CS y se envía un pulso negativo por la línea RD. Tras unos 200 ns (tACC: tiempo de acceso) el dato está disponible para lectura y se desactiva la señal de lectura.

Diagrama de tiempos para la lectura del dato Los ciclos anteriores se repetirán tantas veces como datos se quieran capturar. Con objeto de simplificar la circuitería y, puesto que se cuenta con un solo ADC, se puede mantener permanentemente la señal CS a nivel bajo conectándola directamente a tierra