ISSN: 1579-0223
 
Sentience Research
REDcientífica
· Misión de REDcientífica
· Contacto
· Condiciones de publicación
· Consultar todos los documentos
· Consultar todos los autores
· Acceso usuarios registrados
· English version


PORTADAS
40  41  42  43  44  45  46  47  48  49  50  51  52  53 

BOLETINES
40  41  42  43  44  45  46  47  48  49  50  51  52  53 

TEMAS



ENLACES

Puerto de entrada/salida paralelo Centronics

Xabier Padern
 
ImprimirEnviar

En la actualidad, muchos circuitos robóticos usan el PC como medio sencillo y flexible para programarlos de manera rápida y segura o como control y procesamiento del sistema, evitando circuitería complementaria.


En la actualidad, muchos circuitos robóticos usan el PC como medio sencillo y flexible para programarlos de manera rápida y segura o como control y procesamiento del sistema, evitando circuitería complementaria.

Dos medios para conseguir esta conexión de un PC con un dispositivo externo es mediante el puerto RS232 (comúnmente conocido como "serie") o el puerto paralelo Centronics. De este último trataremos en el informe.

Externamente su apariencia es la siguiente:

Patillaje Centronics

La relación de los pins es la siguiente (x * significa lógica negativa):

1 - STROBE *

2 - D0

3 - D1

4 - D2

5 - D3

6 - D4

7 - D5

8 - D6

9 - D7

10 - ACK*

11 - BUSY*

12 - PE

13 - SLCT

14 - AUTO FEED *

15 - ERROR *

16 - INIT *

17 - SLCT IN

18 a 25 - GND

Ahora bien, todos estos pines no se controlan con un mismo registro de datos sino que un mismo puerto Centronics (LPT1, LPT2, etc...) tiene 3 registros para poder ser controlado; a saber: Enviar Datos, Inicializar Dispositivo y Entrar Datos. Para acceder a los tres registros de cada puerto, nos referiremos a cada registro con una dirección de memoria implícita que fija la BIOS al arrancar el ordenador. Sería conveniente disponer de un algoritmo que nos informase de la dirección de memoria de cada uno de los tres registros, ya que cada máquina es distinta de otra, aunque aquí comentaremos las más usuales. Pero comentemos cada registro con detalle:

* ENVIAR DATOS

Es quizás la función más conocida del puerto Centronics. Este registro controlará los pines de 2 a 9, que son la línea de datos de D0 a D7. El registro que lo controla es el siguiente: Primer registro de un puerto paralelo

Este es un registro de Solo Escritura, es decir solo nos servirá para enviar datos a un dispositivo externo y nunca para recibirlos, y estos datos serán enviado de byte en byte. Las direcciones más habituales son: LPT1 = 378 h , LPT2 = 278 h (direcciones en hexadecimal).

* RECIBIR DATOS

Después de intensas pesquisas hemos descubierto cómo hacer que un PC reciba datos de un dispositivo externo. Veamos primero el registro que lo controla:

Segundo registro de un puerto paralelo

Este es un registro de Solo Lectura, es decir solo nos servirá para recibir datos de un dispositivo externo y nunca para enviarlos, este registro es únicamente modificable desde el exterior y por hardware. Ahora bien, la recepción de datos ya no es tan evidente como el envío, ya que en el tiempo que se instituyó la norma del puerto Centronics no se pensó en que el dispositivo externo enviase datos al PC y solo dotó de 5 patillas al puerto Centronics para recibir datos del dispositivo externo. Vemos que al disponer de solo 5 pines de entrada, nos es imposible hacer que el PC reciba todo un byte completo a la vez desde el dispositivo externo. Por eso, lo que se suele hacer normalmente es usar un pin que haga las funciones de control, como por ejemplo BUSY *, que por cada flanco de subida o bajada el PC interpretara que el dato a su entrada es válido, como muestra la siguiente figura:

Cronograma

De esta manera, en cada ciclo el PC recibe un Nibble del dato, por lo que se tarda dos ciclos en recibir un byte. Además hemos de tener en cuenta el tiempo t1 (tiempo que tarda el dispositivo externo en cambiar los datos en sus salidas al PC) y el tiempo t2 (máximo tiempo que puede tardar el PC en "recoger" el dato). Las direcciones de memoria más usuales para este segundo registro son: LPT1=379 h , LPT2 = 279 h.

* CONTROL DE DISPOSITIVO

La estructura del registro es la siguiente:

Cronograma

Este registro es usado principalmente para el caso concreto donde el dispositivo externo es una impresora, aunque hay algún pin que nos servirá, como ya veremos en la descripción de las patillas. Este registro, contrariamente a los anteriores, es de Modo Lectura/Escritura y las direcciones más usuales para direccionarlo son: LPT1= 37A h , LPT2 = 27A h.

_________________________________

CRIPCIÓN DE LAS PATILLAS

La siguiente descripción de cada una de las patillas está comentada desde el punto de vista en que el dispositivo externo es una impresora:

* STROBE * (pin 1)

Cuando esta línea está activa a 0, está señalizando a la impresora que hay un carácter correcto a la salida del Centronics. Pero esta señal debe desaparecer inmediatamente para que la impresora no lea el carácter dos veces.

* D0 a D7 (pin 2 a 9)

Como ya se ha comentado anteriormente son las 8 líneas de datos del registro de salida.

* ACK * (pin 10)

Esta señal de Acknowledge (reconocido) es de entrada y la da la impresora al PC para comunicarle que ha recibido el dato enviado correctamente.

* BUSY * (pin 11)

Es una línea de entrada que da la impresora para indicar al PC que está busy (ocupada) para evitar que el PC le envíe mas caracteres. Habitualmente la impresora usa este recurso justo después de reconocer STROBE, para poder procesar el dato enviado con calma. * PE (pin 12)

Esta línea de entrada sirve para que la impresora comunique al PC que se ha quedado sin papel (PAPER END). Esta señal normalmente es procesada dando como resultado una pausa en la impresión para dar tiempo al usuario a poner más papel, diferente a la señal ERROR *, que suele interpretarla como un error irrecuperable, dando por anulada la impresión. En un dispositivo que no fuese una impresora, ambas señales podrían ser tratadas como diversos niveles de error del sistema.

* SLCT (pin 13)

Esta señal corresponde normalmente al interruptor ON-LINE de la impresora, para que el usuario pueda deseleccionarla.

* AUTO FEED * (pin 14)

Esta señal indica a la impresora mediante un "1" si ha de enviar automáticamente un LINE FEED después de cada CARRIAGE RETURN (código ASCII nº 13). Esto significa que si debe avanzar una línea después de cada retorno de carro, ya que hay impresoras que de no hacerlo así machacarían una línea tras otra.

* ERROR * (pin 15)

Como ya se ha comentado antes, este es un error irrecuperable, y suele ser debido a fallos de transmisión y recepción u otros más graves.

* INIT * (pin 16)

Con esta línea el PC tiene la posibilidad de realizar un RESET o inicialización a la impresora. Este bit debe cargarse con 0 brevemente para volver a cargarlo inmediatamente con un 1, ya que sino la impresora realizaría un reset tras otro indefinidamente. * SLCT IN (pin 17)

Mediante esta línea el ordenador puede poner a la impresora en modo Off-Line y realizar pausas. Esta línea debe de estar normalmente a 1.

* GND (pin 18 a 25)

Terminal de masa o tierra.

_________________________________

AS SOBRE LA MAGNITUD DE ENTRADAS/SALIDAS

Debemos tener en cuenta que las entradas y salidas del puerto Centronics se rigen por señales TTL, es decir un "1" equivale a +5 V. Los circuitos integrados internos de la controladora del PC suelen ser buffer TTL o UART, y hemos de vigilar mucho cortocircuitos o entrar y sacar señales por los pines inadecuados, que conducirían a la destrucción de la placa controladora. De ahí la importancia de aisladores eléctricos.

___________________________________

AS SOBRE LA PROGRAMACIÓN DEL CENTRONICS

Lo que se suele hacer normalmente es programar con un lenguaje de alto nivel normalmente, pero incluir pequeñas rutinas en ensamblador para leer y escribir en el puerto. De esta manera conseguimos realizar estas operaciones de lectura/escritura con mucha más rapidez que si utilizáramos una instrucción específica para ese lenguaje.

* Ensamblador

Para escribir en el puerto utilizaremos las siguientes rutinas: mov al,valor

mov dx,PortSal

out dx,al

De esta manera, colocamos el valor a sacar en el registro AL, y la dirección del registro de salida correspondiente en DX, llamando seguidamente a la instrucción OUT. Algo similar ocurre a la hora de recoger datos:

mov dx,PortEntr

in al,dx

De esta manera recogemos el estado del registro de entrada del puerto PortEntr en el registro AL.

* Pascal

Para conocer la dirección de memoria de los 4 puertos Centronics, una función útil es la siguiente:

{ Entrada: NUM = Número del puerto paralelo }

{ Salida :TRUE, cuando paralelo }

{ Var. globales: Port1, Port2 }

{ Info: Las direcciones de base de hasta 4 puertos paralelos } { se encuentran en las cuatro palabras de memoria }

{ comenzando en 0040:0008 }

function DirPort( Numero: integer ): boolean;

begin

if ( Port1 0 ) then

begin

Port2 := Port1 + 1;

GetPortAdr := TRUE;

end

else

DirPort := FALSE;

end;

De esta manera leemos las 4 posiciones de base de hasta 4 puertos paralelos que se encuentran en las 4 palabras de memoria comenzando en 0040: 0008. Para entrar y sacar datos lo haríamos con una llamada a las rutinas en ensamblador comentadas anteriormente. En lenguaje C procederíamos igualmente:

reconoceríamos las direcciones de los 4 puertos paralelo y mediante las rutinas en ensamblador leeríamos o escribiríamos en los diferentes registros.

* Basic

Como en lenguaje Basic es muy difícil incorporar rutinas en ensamblador, después de detectar la posición de memoria de los diferentes LPT, leeremos de la siguiente manera el puerto: variable = INP (Direc.puerto)

El resultado leído del registro Direc.puerto se almacena en variable. Y para escribir en el puerto:

OUT Direc.puerto , Datos

El contenido de la variable Datos es enviado al puerto

Direc.puerto.

_________________________________

STRUCCIÓN DE OPOAISLADOR DE SALIDA

Una manera de evitar posibles daños al PC en el proceso de salida de datos es dotarle de un optoaislador eléctrico para evitar cortocircuitos o daños peores.

Un posible esquema de optoaislador sería el siguiente:

Aislador óptico

Tengamos en cuenta que este optoaislador solo nos sirve para las 8 líneas de datos (de D0 a D7), y que lo ideal sería disponer de un optoaislador que nos protegiera tanto entradas como salidas.




[Evaluar este artículo]








              Misión de REDcientífica              Condiciones de publicación              E-mail de contacto



  Bookmark and Share