martes, 13 de enero de 2009

Interface de Puerto Paralelo

Puerto de 8 Bits

El puerto paralelo de la PC permite la comunicación de 8 bits por vez y, aunque es generalmente utilizado para conectar la impresora, también permite la conexión de otros dispositivos, tales como: discos rígidos, CD-ROM, dispositivos de cinta, cámaras de video e incluso otra computadora. En este artículo propongo utilizar el Puerto Paralelo como un generador de sonido, por medio de una señal de onda cuadrada, en una modalidad similar a la que usa el 8253 (ver Gestión de Entrada/Salida).

Fig. 1 Interface “analógica” en el Puerto Paralelo

Para activar el puerto paralelo utilizaremos un programa sencillo escrito en lenguaje Assembler (ver Ejercicio 2). La PC puede utilizar 3 direcciones alternativas para sus puertos paralelos: 378h, 3BCh o 278h (todos hexadecimales). Para averiguar el puerto que utiliza la PC, podemos buscar en el Administrador de Sistema de Windows (que se encuentra en el panel de control) o podemos ejecutar el programa de diagnostico MSD (parte de DOS) y seleccionamos LPT. También podemos observar los puertos por medio de Debug con el comando D (dump) a partir del segmento 40 entre 8 y F (en la línea de comando de Debug –D 40:8,F ver Fig. 2)

Fig. 2 Debug del Segmento 40

En mi caso dispongo de 3 puertos (ver Fig. 2), pero el que realmente está conectado es 378h, y es el que voy a utilizar.

Conector DB-25

El Conector DB-25 Hembra y sus Pines

Fig.3 Líneas de Entrada y Salida del DB-25

Descripción de los Pines del DB-25

01 Strobe. Este pin está normalmente en 1 (+5V) y cuando hace strobe, es decir, la línea baja a 0 (0V) le indica a la impresora que se está enviando un carácter.
02 Bit de datos 0, es decir, el menos significativo.
03 Bit de datos 1.
04 Bit de datos 2.
05 Bit de datos 3.
06 Bit de datos 4.
07 Bit de datos 5.
08 Bit de datos 6.
09 Bit de datos 7, es decir, el mas significativo.

10 ACK (cuando está en 0).
11 Ocupado (cuando está en 1)
12 Fin de página (cuando está en 1)
12 Seleccionar (cuando está en 1)
14 Autoalimentación del papel (cuando está en 0).
15 Error (cuando está en 0).
16 Iniciar (cuando está en 0).
17 Selección (cuando está en 0).

18 Tierra (Ground), siempre en 0.
19 Tierra (Ground) , siempre en 0.
20 Tierra (Ground) , siempre en 0.
21 Tierra (Ground) , siempre en 0.
22 Tierra (Ground) , siempre en 0.
23 Tierra (Ground) , siempre en 0.
24 Tierra (Ground) , siempre en 0.
25 Tierra (Ground) , siempre en 0.


En nuestro ejercicio sólo utilizaremos el Pin 2 correspondiente a las líneas de datos (DATA 0) y uno de los pines de tierra o Ground (del pin 18 al 25).

Agrupación de Señales

El puerto paralelo dispone (ver Fig. 4) de tres grupos de señales: Datos (solamente para salida o Output), Status (solamente para entrada Input) y Control (solamente para salida Output).

Fig. 4 Las Señales Disponibles

Primero vamos a realizar un retardo por medio de los registros, que es un procedimiento habitual en el trabajo con microprocesadores o microcontroladores. Realizaremos dos loops en los que reduciremos el valor de un registro tantas veces como indique el otro registro, al estar los dos registros en cero, se sale del loop de retardo. Luego determinamos (a ojo) con el reloj de Windows el tiempo que toma ejecutar el programa.

Ejercicio 1

Este ejercicio está destinado solamente a determinar el tiempo que tardan en caer dos contadores de 16 bits, en nuestro caso, los registros BX y CX multiplicados entre sí (debido a que las máquinas actuales son muy rápidas), esto hace que el loop CX se repite BX veces. Como cargamos los registros con valores máximos FFFF, el total de loops que dará el programita es de FFFE0001h o 4294836225 en decimal.

NP.COM
A
MOV BX,FFFF
MOV CX,FFFF
DEC CX
JNZ 106
DEC BX
JNZ 103
MOV AX,4C
INT 21

RCX
11
W
Q

Resultados del Código Precedente

En mi caso, con los programas que se ejecutaban en ese momento, unos 3 segundos. Yo busco el orden de los milisegundos, de modo que divido 65535 (FFFF) por 3000 y lo convierto a hexadecimal, me da una cifra 15h (recuerden que al debug le hablamos en hexadecimal).

Es importante destacar que estos valores son absolutamente empíricos y dependen tanto de la máquina como de los programas que se encuentren en ejecución en el momento de la prueba. En el caso de los microprocesadores y microcontroladores, no hay ningún otro programa en ejecución.

Ejercicio 2

Este ejercicio consiste en utilizar el puerto paralelo como un generador de tono rudimentario de un bit. Este tipo de componente se denomina Convertidor Digital Analógico o CDA debido a que convierte señales digitales (patrones de ceros y unos) en sonido (que es analógico). Hay que destacar que este CDA es absolutamente rudimentario, pero es un buen ejemplo de interface no convencional de la PC.

En base a los datos que obtuve en mi primera prueba, para estar en el orden del milisegundo, debo aplicar un retardo de 15h en BX. Por ejemplo, si quiero realizar una onda cuadrada de 500Hz. debo cambiar entre 0 y 1 mil veces (la mitad del tiempo estará en 1 y la otra mitad estará en 0), es decir que debo enviar un valor cambiado cada milisegundo, y esto explica el retardo de 15h en AX.

NP.COM
A
MOV AL,1
MOV DX,378
MOV BX,15
MOV CX,FFFF
DEC CX
JNZ 10B
DEC BX
JNZ 108
XOR AL,1
OUT DX,AL
JMP 105
MOV AX,4C
INT 21

RCX
1C
W
Q

Muy bien, conecto el circuito que se ve en la Fig. 1 y ¡Voila! Escucho una frecuencia, aunque se parece mas a un sonido de una película de ciencia ficción que a un tono puro. Si queremos un tono puro, podemos emplear el 8253 tal como vimos en nuestra entrega Gestión de Entrada/Salida. En este artículo, la intención es realizar una interfase pseudo analógica.

El transistor está configurado como un simple amplificador para alimentar al parlante. La forma de conexión del transistor está explicitada en la Fig. 1 y el costo total de todos los componentes es de menos de un dólar. Algunos lectores me consultaron respecto de la alimentación; cualquier valor entre los 4V y los 9V debe funcionar. En otras entregas pondré las fotos del "engendro" y ejemplos del sonido que se obtiene.

Que tengan un gran día,

Sergio Otaño

0 comentarios: