Está en la página 1de 102

/ Interfaz IEEE-488 para PC

Aprobo (Asesor):

M.-C. J o r m o

Realización:

Angel Artur Pérez Martinez Jorge Velez Meza


Y-
Am
i * ¡ tiemPo UNIVERSIDAD AUTONOMA METROPOLITANA - IZTAPALAPA -

l/
INTERFAZ

IEEE-488

PARA PC

BIBLIOT€CB
---------
Y

,,Licenciatura en Ingenierfa Electrdnica Enero 1990


m
~ -
cam ' ~ ~
UNIVERSIDAD AUTONOMA METROPOLITANA - IZTAPALAPA -

A mis padres... A miabuelo:

Por su paciencia y Baliazar


apoyo constante. por sus palabras
de estimulo.

Angel A. Pérez M.
m
mrl UNIVERSIDAD AUTONOMA METROPOLITANA - IZTAPALAPA -

A mis padres.. . A mis tios ...

Por su comprensión J. Arturo y Mary,


y paciencia. por su apoyo.

Jorge Velez Meza.


AGRADECIMIENTOS

La realización de este proyecto ha sido una tarea ardua debido a la escasez


de la información, la cantidad que de ella misma se requería y el equipo
especial que para el desarrollo se necesitaba. La terminación de este
trabajo no hubiera sido posible sin la ayuda de otras personas.

Estamos especialmente agradecidos con nuestro asesor M. C. Jorge


Lozano Moreno, por las facilidades otorgadas tanto de orientación técnica
como de material y equipo, así como del tiempo dedicado a la revisión y
consejos para todos los borradores de este manuscrito. Así tambien
agradecemos a Miguel Angel Guzman y Gonzalo I. Duchén por sus
comentarios reflexivos y ayuda técnica brindada durante el desarrollo de
este proyecto.

Naturalmente, todos los errores que se puedan encontrar en el presente


reporte son responsabilidad nuestra, de los cuales esperamos que sean
mínimos para que la información contenida en este documento sea de
utilidad para todas aquellas personas que así lo requieran.

Jorge Velez Meza


Angel Arturo Pérez Mtz.
CONTENIDO

1. Introducción.

O. Desarrollo Teórico.

2.1 El IEEE-488.
2.2 MS-DOSpara programación.
2.2.1 Programas Residentes.
2.2.2 Drivers.
2.3 Hardware de la PC.

3. Desarrollo Experimental.

3.1 Hardware.
3.1.1 Decodificación.
3.1.2 Implementación.
3.2 Software.
3.2.1 Programación en Lenguaje C.
3.2.2 Driver.

4. Resultados.
!
5. Conclusiones.

6. Bibliograña.

Apéndices.

A. Interfaz periférica programable.


B. Controlador de interrupciones.
C. Manual de uso.
CAPfTULO 1

INTRODUCCIÓN

Como máquinas que procesan información, las computadoras


requieren caminos para la entrada y salida de datos, a fin de emitir
sus resultados. Una técnica de diseño común es crear una camino
universal dentro y fuera del procesador. Este camino es el bus de
entrada y salida (E/S).

Este concepto de diseño es muy bueno, pero introduce una


complicación: no importa el diseño del bus de E/S, la computadora
puede ser incompatible con muchos dispositivos de E/S. Algunos
dispositivos antiguos usan diferentes niveles de señales, otros
dispositivos tienen diferentes formas de datos. Muchos dispositivos
pueden ser bastantes lentos, reduciendo seriamente el
funcionamiento de la computadora, si ésta es utilizada en cada
transacción de datos.

La complicación es resuelta a través del uso de una interfaz, la cual


actúa como transformadora de niveles de tensión, formato de datos y
velocidades de transacción. La interfaz habilita a la computadora
para comunicarse con un vasto arreglo de dispositivos penféricos.

Puesto que hoy en día el avance de la tecnología es continuo, los


diseñadores de computadoras siempre se encuentran tratando de
incorporar las partes más avanzadas y la lógica más rápida en
configuraciones nuevas y diferentes. A la par de estos, los
diseñadores de periféricos siempre están creando clases de
I
capítulo 1 Intrqducci6n

dispositivos nuevos y variados. El resultado. ha sido una gran


cantidad de interfaces, cada una optimizada para una simple clase de
computadoras o periféricos, como resultado de esto, muy pocas
interfaces son compatibles unas con otras.

Debido a esto, la industria de la computación acordó crear una


interfaz estándar, la cual fué publicada en 1975 por el Instituto de
Ingenieros Eléctricos y Electrónicos (IEEE). Está fué la primera y
más cercana interfaz universal creada para computadoras e
instrumentación. La primera versión fué llamada IEEE-Standar
Digital Interface for Programmable Instrumentation (IEEE-STD-
488-1975), fué revisada y modificada ligeramente en 1978, llamada
IEEE-STD-488-1978, la cual es conocida comúnmente como IEEE-
488 o GP-IB (General Programmuble Interface Bus).

El intento del IEEE-488 es asegurar que muchas variables de una


interfaz sean posibles, manteniendo la flexibilidad y una amplia
aplicabilidad. La interfaz es definida sin hacer referencia al hardware
para su implementación. Esto permite a nuevos productos
aprovechar las más recientes tecnologías, resultando en una
construcción rápida y menos costosa de instrumentos, periféricos y
sistemas.

Entre los principales disefiadores de computadoras y periféricos se


encuentra la firma Hewllett-Packard (HP),la cual utiliza la interfaz
IEEE-488 como estándar para sus productos, a la cual nombra HP-
IB.

Puesto que existe una gran cantidad de periféricos H P los cuales no


son compatibles con las microcornputadoras IBM-PCy compatibles,
ya que éstas no utilizan el estándar IEEE-488 fué necesario
implementar un sistema (hardware y software), para que manejen el
estándar IEEE-488 y que sea transparente a nivel de MS-DOS,
sistema operativo que utilizán las PC.

2
capítulo 1 Invoduccidn

Este reporte está organizado de la siguiente forma:

El capítulo 2 presenta la especificación del estándar IEEE-488,


describiendo todas las sefiales con las cuales está formado el GP-IB.
Cómo interactúan estas en un dispositivo cualquiera. Se habla sobre
los programas residentes ya que estos están intimamente ligados a los
manejadores de dispositivos (Device Drivers) con los cuales se instala
el IEEE-488. Además, se introducen los conceptos y principios del
bus de US de la PC sobre los cuales está implantada la tarjeta.

En el capítulo 3 se describe la implementación del hardware y


software. Respecto al hardware se describen los circuitos que forman la
interfaz IEEE-488. Y en la parte de software se trata la programación
del sistema.

El capítulo 4 presenta los resultados obtenidos en la implementación


del sistema IEEE-488.

El capítulo 5 presenta las conclusiones obtenidas en la realización de


este proyecto.

3
CAPíTULO 2

DESARROLLO
TEÓRICO

2.1 IEEE- 488

El bus de interfaz estándar IEEE-488, popularmente conocido como


GPIB (General Purpose InterfaEe Bus),fué originalmente desarrollado
por la firma Hewlett-Packard para permitir una máxima flexibilidad
en la transferencia de datos entre varios instrumentos de laboratorio
y sus computadoras. El IEEE-488 permite intercambiar datos a un
número no mayor de quince dispositivos con una velocidad máxima
de 1megabyte/segundo.

Para que varios dispositivos puedan "convivir" en el bus existe un


"controlador" maestro (usualmente una computadora) el cual
coordina la transferencia de datos entre los transmisores y
receptores. El controlador (normalmente existe uno solo) puede
asignar a un dispositivo (incluyéndose a sí mismo) para que sea un
"tahr"y uno o varios para que sean "Zi.steners", que pueden transmitir
y recibir datos respectivamente. Estos tres tipos de dispositivos son
solamente atributos y pueden existir solos o en combinación dentro
de un mismo periférico.

4
capíhib.2 IEEE-488

Asignación de Papeles

El controlador, talker y listener están interconectados vía el sistema de


interfiz mostrado en la figura 2.1.1, el cual tiene cuatro dispositivos
enlazados al bus.

Figura 2.1.1. Estructura del Bus.

El dispositivo A puede ser un talker, Zktener y controlador. Como


controlador, el dispositivo A puede asignar el papel de tuZker activo a
un dispositivo en el bus capaz de emprender su papel, incluyéndose
a él mismo. Como talker, el dispositivo A puede suministrar
información a otros dispositivos en el bus. Como Zktener,. el
dispositivo A puede aceptar información de otros talkers en el bus.
Una computadora puede tener estos tres atributos.

Aunque el dispositivo A es el único controlador en la figura 2.1.1,


más de un controlador puede existir en el bus. Para prevenir
conflictos, solamente un controlador puede estar activo al mismo
tiempo. Cuando el sistema es encendido un controlador del sistema
toma el mando del bus, mientras tanto los otros controladores deben
esperar en un estado pasivo hasta que les sea asignado el control.

5
capítulo 2 IEEE-488

El dispositivo B en la figura 2.2.1, puede ser un talker y un Zistmr.


Estos pueden ser direccionados por el controlador y ser activados
como talker o Zistt?nt?r.Un tuZker activo controla la linea DAV en el
grupo de control de transferencia de datos. Un Zistener activo controla
las lineas NRFD y NDAC.

El dispositivo C únicamente puede ser un Zhtmer.


El dispositivo D está limitado a ser un talker.

Cualquiera de estos dispositivos puede ser activado por el


controlador. La transferencia de datos es controlada por el talker
activo y el Zistmr activo. El talker maneja el bus con datos, mientras el
listener acepta la información transmitida por el talker. Para evitar
conflictos solamente un tuZkm puede estar activo a la vez. Sin
embargo, algunos Zisteners pueden ser activos al mismo tiempo.

Estructura del bus

El sistema de interfaz contiene un conjunto de 16 líneas, usadas para


llevar toda la información, mensajes de interfaz y mensajes de
dispositivos.

Los mensajes puden ser codificados en una o en un conjunto de


líneas, determinadas por el contenido del mensaje en particular.

La estructura del bus está organizada dentro de tres conjuntos :

1.Bus de datos (8 líneas).


2. Control de transferencia de datos, Handshake (3 líneas).
3. Administración del bus, Control (5 líneas).

6
caprhib z IEEE-488

Bus de datos

Un conjunto de 8 lineas se utiliza para la transferencia de


información, asi como para transmitir mensajes.

Handshake

DAV (Data Vdd) es una línea de handshake que indica que el &r
activo ha colocado datos en la linea de datos (DIO1-DI08).

NRFD (Not Ready for data) indica que uno o más &enen activos no
están listos para más datos, y el talker activo debe esperar antes de
transmitir más datos hacia el bus.

NDAC (Not data accepted) indica que uno o más Zkteners no pueden
aceptar el dato actual, y el talker activo debe dejar el byte actual
insertado en la línea de datos.

Control

IFC (lnte$za char) es sometido al control exclusivo del controlador


del sistema. Todos los dispositivos de interfaz son puestos en estado
neutro (default)y el estado del bus es limpiado.

ATN (Attention) es usado primordialmente para diferenciar entre


modo comando (H') y modo dato (L').

SRQ (Sen;rtCe Request) puede ser puesto por un dispositivo en la


interfaz para indicar que necesita servicio.

REN (Remotem b l e ) puede ser puesto por el controlador del sistema


para permitir a los dispositivos que operen en modo remoto, que es
manejado por el control programado del GPIB en vez del panel
fi-ontal del dispositivo.
7
capltulo 2 IEEE-488

EO1 (End OT iddify) tiene dos usos. En el primero EO1 es insertado


en el último byte de la transferencia de datos. Esto indica a todos los
dispositivos Zistmm que ningún dato más es esperado en la
transferencia. El segundo uso es en combinación con ATN y es usado
para llevar a cabo un escrutinio en paralelo (SaraUelpoU).

Transferencia de información

La posibilidad de que algunos Zistenen reciban datos


simultáneamente representa un problema porque algunos de estos
no pueden aceptar datos con la misma velocidad. La velocidad de
transferencia de información debe ser establecida por el Zistener activo
más lento.

La velocidad de transferencia del GPIB es controlada por un sistema


de votación electrónica llamada de "colector abierto". El sistema de
votación electrónica requiere un acuerdo unánime entre Zishmers
activos y el &r activo antes de que la transferencia sea efectuada.

CMV
U I

Figurr 2.1.2. Diagrama de tiempos en el Bus IEEE-488.

8
capitub 2 IEEE-488

Para comprender el handshake y la transferencia de información


véase el diagrama de tiempos de la figura 2.1.2 y el diagrama de
flujo de la figura 2.1.3. Inicialmente el controlador activo toma
posesión del bus poniendo ATN bajo e insertando un comando en el
bus de datos. Este dice "todos los dispositivos callen y escuchen".
Todas ellos ponen a ambos NRFD y NDAC bajo en anticipación al
comando. Cuando cada dispositivo está listo para aceptar el
comando, libera a NRFD. Así NRFD es alto únicamente cuando
todos los dispositivos tienen libre a NRFD, esto es posible debido al
sistema de votación electrónica.

I 5

,
F
igu
rr 2.13. Diagrama de flujo para una transferenciade dam.

Cuando el controlador ve que NRFD es alto, este responde poniendo


DAV bajo, por lo que dice a los dispositivos que lean el comando.
Los dispositivos entonces ponen NRFD otra vez bajo en preparación

9
capítulo 2 IEEE-488

para la próxima transferencia y leer el comando. Cuando cada


dispositivo finaliza leyendo, este libera a NDAC. El tiempo de
retardo en la lectura puede ser bastante grande, dependiendo de la
velocidad de cada dispositivo. Cuando el dispositivo más lento tiene
libre a NDAC, NDAC va hacia alto, después de lo cual el controlador
libera a DAV. Enseguida los dispositivos ponen NDAC bajo, si ATN
permanece bajo. En caso contrario se prepara para una nueva
transferencia.

En esta forma el controlador puede programar un dispositivo para


ser talker y otros para ser Zkteners. Cuando la configuración es
realizada, el controlador libera a ATN.

Entonces ningún listener libera NRFD y NDAC puesto que ellos


salen del cuadro hasta que otro comando ocurre. Cuando los Zktmms
están listos para los datos, liberan NRFD, igual que cuando están
listos para leer un comando. Cuando todos están listos, NRFD sube,
y el talker activo pone DAV. LOSZktemrs ponen NRFD bajo y liberan
NDAC como cuando están leyendo los datos. Cuando todos 10s
Zktmrs tienen liberado NDAC, el tulkm libera DAV, y comienza la
próxima secuencia de transferencia.

Cuando el talker ha finalizado la transferencia de la cantidad de datos


preescrita, éste pone una de las cuatros líneas del bus restante a bajo,
llamada EOI, este dice al controlador que la transferencia ha sido
completada. Entonces el controlador emite el próximo comando.
Nótese que los dispositivos de sólo escucha (Zkteners) necesitan ser
conectados hacia las líneas de datos, las tres líneas de hanclshake y
ATN. L o s taZkers también pueden tener conectado a EOI. Además
están las líneas SRQ, REN e IFC. Un talker usa SRQ para
interrumpir al controlador ya sea para indicar una condición de
error o para anunciar que un dato está disponible. El controlador
activo usa REN para decirle al dispositivo que ignore el control de
panel frontal en favor de controles programados. El controlador usa
10
capítubz IEEE-488

IFC para regresar a todos los dispositivos a . un estado conocido


(default).Esta sefial se utiliza sólo para inicialización cuando se "cae"
el sistema.

Direccionamiento de dispositivos

El controlador de comandos consiste de bytes, de los cuales son


clasiftcados en cuatro categorias generales, de acuerdo a los valores
de los bits 5 y 6. El bit 7 (DI08) es ignorado. Si ambos bits 5 y 6 del
comando GPIB son cero, los 5 bits de más bajo orden especifican
varios comandos, tal como "dispara el tuZker activo", valores
diferentes de cero en los bits 5 y 6 causan que los 5 bits de más bajo
orden sean como direcciones de dispositivos. Típicamente estas
direcciones son especificadas por interruptores localizados en los
dispositivos. Si los bits 5 y 6 tienen el valor 01, los dispositivos que
combinan las direcciones de los 5 bits de más bajo orden son
asignados como Zkteners. Similarmente, si los bits 5 y 6 tienen el valor
10, los dispositivos que combinan las direcciones de los 5 bits de más
bajo orden son asignados como taZkers. La asignación de un talker
desactiva a los taltcers asignados previamente, para que solo un tuZker
pueda ser activo a la vez. Los 5 bits de dirección 11111, están
reservados para desactivar todos los dispositivos ya sean talkers o
listeners, lo cual es hecho con los bits 6 y 5. De aquí que el código de
comando O 111111(3FH) desactive todos los Zkteners. Si los bits 6 y 5
tienen el valor 11, los últimos 5 bits especifican una dirección
secundaria. Esto permite direccionar a sub-unidades dentro de un
instrumento "multigrupo".

Nótese que aunque hay 31 posibles direcciones primarias, un


máximo de 15 dispositivos (incluyendo el controlador) pueden ser
enlazados al GPIB al mismo tiempo.

11
Capihllo 2 IEEE-488

Polling (Escrutinio)

Puesto que la línea de petición SRQ es compartida por todos los


dispositivos, el controlador tiene que "calcular" cuál dispositivo o
dispositivos están solicitando servicio, cuando la línea está en bajo.
Este "cálculo" es llevado a través de un escrutinio en serie (ser2alpU)
o un escrutinio en paralelo (parauelpoll). Cuando 8 o unos cuantos
dispositivos no controladores son enlazados al bus cada uno puede
ser asignado a una línea única DIOn para efectuar un plrtrUel poll. El
controlador emite este poll poniendo bajo ATN y EOI,
simultáneamente. Cada dispositivo responde poniendo su línea
asignada (DIOn) bajo si y solo si ha solicitado servicio poniendo a
SRQ bajo. Este método es rápido y eficiente, y es similar al esquema
de interrupciones de una computadora de una simple línea.
Alternativamente el controlador puede direccionar un talkar y a cada
dispositivo en turno y emitir un comando s e d poU. El dispositivo
responde con un byte de estatus de 8 bits, uno de los cuales dice si el
dispositivo tiene SRQ bajo. El controlador otorga el servicio
requerido, emitiendo un comando para desactivar el s e d poU y
entonces continúa haciendo s e k l poU puesto que SRQ permanece
bajo. Aunque lento, el s e k l poll provee al controlador con más
información acerca del estatus de cada dispositivo.

12
capitulo 2 Ragramas Residentes

2.4 MS-DOS PARA PROGRAMACION

El MS-DOS estándar además de ser usado para ejecutar programas


de aplicación tales como utilerias, bases de datos, procesadores de
palabras, y hojas de cálculo entre otros, es usado para manejar y
controlar un conjunto de dispositivos estándar, incluyendo monitor,
teclado, discos y adaptadores paralelo y serie. L o s manejadores de
dispositivos estándar (device drivers) son normalmente una parte del
administrador de dispositivos del sistema operativo y no se
encuentran visibles al usuario.

MS-DOS permite al usuario instalar manejadores de dispositivos


para accesar hardware externo siguiendo un conjunto de reglas
específicas. Estas reglas proveen una interfaz uniforme hacia DOS,
las cuales permiten tratar al nuevo dispositivo de la misma forma a
los ya existentes.

En las siguientes dos secciones hablamos primeramente de los


programas residentes ya que estos nos muestran la manera en la cual
el sistema operativo maneja las interrupciones generadas por software
y hardware. En la segunda sección se presentan los manejadores de
dispositivos, presentando el formato con el cual se deben construir,
así como su funcionamiento.

2.4.1 Programas Residentes

DOS fue diseñado para soportar la ejecución de una simple tarea de


usuario a la vez. El sistema operativo maneja el cargado y la
ejecución de una tarea y responde a solicitudes de servicios de
entrada y salida.

Cuando DOS es inicializado, y antes de que cualquier programa sea


ejecutado, el espacio de memoria desde O hasta el límite superior
soportado por la PC está configurado como se muestra en la figura
13
capftulo 2 Programas Residentes

2.2.1. Las localidades de memoria más bajas (000H-400H)están


reservadas para el vector de interrupciones. Arriba del vector de
interrupciones se encuentra el DOS. Le siguen los manejadores de
dispositivos que son cargados cuando DOS se ha inicializado.
Después de los manejadores de dispositivos está la porción residente
del programa procesador de comandos del DOS. Este programa
procesa los comandos de linea del DOS y ejecuta programas, está
dividido en una porción residente y en una transitoria. El área de
porción transitoria (TPA) se encuentra arriba del procesador de
comandos residente. Cuando el usuario ejecuta un programa desde
el comando de linea el programa es cargado en el TPA. En la parte
superior del TPA está la porción transitoria del procesador de
comandos. Un programa de usuario tiene permitido utilizar el área
que ocupa el procesador de comandos transitorio. Si esa memoria es
utilizada, el procesador de comandos residente recargará al
procesador de comandos transitorio cuando termine la ejecución del
programa del usuario, el cual a ese tiempo liberó el espacio de
memoria que ocupaba.

F
igu
rr 2.2.1. Mapa de memoria de DOS.

Existe otra clase de programas llamados programas residentes


(TSR:Tminate and Stay Resident), los cuales son ejecutados como si

14
capitulo 2 Programas Residentes

fueran programas normales. De hecho ninguno de los procesadores


de comandos del DOS tiene forma alguna de saber que estos serán
residentes, sino hasta que terminan su ejecución, utilizando
cualquiera de las funciones especiales suministradas por DOS. Esta
acción simplemente incrementa la dirección baja del TPA justamente
arriba del programa de memoria residente decrementando la
cantidad de memoria disponible para nuevos programas de usuario.
Dejando este programa ya instalado en memoria como muestra la
figura 2.2.2 en la cual se muestran dos programas residentes.

Figuro 2.4.2. Mapa de memoria de DOS con dos TSR.

Como mencionamos anteriormente el MS-DOS no permite que


exista más de un programa en memoria a la vez, por lo que fué
necesario encontrar una forma para que más de un programa
pudiera estar activo en memoria.

Las dos funciones especiales suministradas por DOS permiten a un


programa declararse a si mismo residente. Estas funciones se
15
capitulo 2 Programas Residentes

proporcionan para que personas que desarrollan sistemas puedan


escribir rutinas de servicio de interrupción (ISR). Estas rutinas se
utilizan para poder manejar dispositivos de Hardware que no son
parte estándar de la arquitectura de la PC,y como tales no existe una
interfaz estándar en el DOS. Entre los dispositivos no estándar
podemos citar al mouse, joystick y tablas digitalizadoras.

El medio ambiente de las ISR puede soportar ,otra clase de


programas, no necesariamente asociados con dispositivos "extrafios",
estos son los programas residentes.

L o s programas residentes son activados a través del uso de


interrupciones, las cuales pueden ser activadas de diferentes formas.
La forma más común es usualmente llamada "tecla caliente" h ( ot by).
Una tecla caliente está formada por una 6 varias teclas, las cuales al
ser presionadas activan el programa que se encuentra residente.

Interrupciones

Para comprender la naturaleza de los programas residentes se debe


entender el sistema de interrupciones, porque tales programas usan
la estructura de interrupciones de la PC y DOS.
,

Una interrupción es una suspensión momentanea de la secuencia de


un procedimiento de un programa que nos permite ejecutar otro
procedimiento. Cuando la interrupción se ha completado, el
procedimiento que fué interrumpido continua como si ninguna
interrupción hubiese ocurrido. Los dos procedimientos pueden no
tener relación alguna; si éste es el caso, el procedimiento
interrumpido nunca debe ser afectado a causa de la interrupción.
Una interrupción puede ser generada por un evento externo al
programa actual, o como resultado de una acción del programa. Las
interrupciones pueden ser activadas por un evento de hurdwure o por
una instrucción de softwure programada.
16
capítub 2 Programas Residentes

La Eamilia de microprocessadores del 8086 soporta 256


interrupciones las cuales se encuentran vectorizadas. Una
interrupción comienza ejecutando una rutina de servicio de
interrupción, la cual se encuentra localizada en la tabla del vector de
interrupciones. A diferencia de algunos viejos procesadores que
obligan a una ISR a tener una localidad fija de memoria, una
interrupción vectorizada permite especificar la localidad de la ISR.

La tabla del vector tiene una longitud de 1024 bytes comenzando en


la localidad OOOO:OOOO. De aqui la dirección de la ISR puede ser
cualquiera en memoria requiriendo 4 bytes de longitud (32 bits de
direcciones). Entonces cada entrada en la tabla tiene 4 bytes de
ancho. Las direcciones están arregladas tales que la interrupción O
encuentra la dirección de su ISR en la dirección OOOO:OOOO, la
interrupción 1 encuentra la dirección de su ISR en la dirección
0000:0004, la interrupción 2 encuentra la dirección de su ISR en la
dirección 0000:0008, y así sucesivamente.

Cuando una interrupción ocurre esta causa que todas las


interrupciones sean deshabilitadas, por lo que la ISR debe habilitar
nuevamente las interrupciones para evitar que el sistema se destruya
o bloquee. La ISR debe finalizar con la instrucción IRET.

Diseño general de un TSR

Todos los programas TSR son realmente dos programas en uno, la


primera parte del programa TSR es usada para inicializar el
programa y salir entonces vía el llamado a la función TSR de DOS.
Esta parte del programa no es ejecutada a menos que el programa
sea nuevamente cargado. Parte de la inicialización siempre incluye
poner la dirección del programa TSR apuntada por la localidad
apropiada en la tabla del vector de interrupciones. La segunda parte
del programa es la aplicación.

17
capítulo 2 Programas Residentes

Turbo C incluye una función especial de tip.modificador llamada


interrupt que permite a una función en C ser utilizada como una
ISR.

Una función del tipo interrupt guarda automáticamente el contenido


de todos los registros y los restaura a su regreso. L a s funciones de
este tipo también usan la instrucción IRET en lugar de instrucción
RET al regresar. Por ejemplo podemos asumir que la función
musics() es nuestra rutina de manejo de interrupción, la cual se
muestra a continuación :

void interrupt musica (void)


{
int frec, i ;

for (i = O ; i <= 500 ; i++) {


do {
frec = rand ();

} while (frec > 5000);


sonido (frec);
1
1

void sonido ( int frec)


{
unsigned i ;
unsigned char bits;
union {
long divisor;
unsigned char c[2];
} count ;

count.divisor = 1193280 / frec ;

18
capstub 2 Programas Residentes

outportb ( 67,182 ) ;
outportb (66,count.c[0]);

bits -
outportb (66,count.c[1]);
inportb (97);
outportb (97,bits13);

for (i - 0;i < 2000; i++);

outportb (97,bits);
1

Como se menciono anteriormente DOS incluye dos hnciones que


permiten a un programa declararse residente a si mismo. Estas dos
funciones son similares y tienen muy pocas diferencias. La función
31H de la interrupción 21H termina el programa que actualmente
se está ejecutando dejándolo residente suministrándole la cantidad
de memoria que ocupa el programa. La interrupción 27H realiza la
misma función pero restringe la longitud del programa residente a
64 KB.

La siguiente función muestra cómo dejar el programa residente


utilizando Turbo C :

tsr (unsigned longitud)


{
union REGS r;

r.h.ah = 0x31;
r.h.al = O;
r.x.dx = longitud;
int86 ( 0x2 1, Lr, Lr);

19
capftulo 2 Programas Residentes

El parámetro longitud es utilizado para decirle a DOS cuánta


memoria utiliza el programa residente. Este es especificado en
párrafos, un párrafo incluye 16 bytes. La cantidad de memoria que
utiliza un programa es dificil de determinar ya que los archivos .EXE
son parcialmente ligados cuando son cargados dentro de memoria y
no son necesariamente colocados en regiones contiguas. Una manera
de aproximar la cantidad de memoria que utiliza un programa es
dividir el tamaño del archivo .EXEentre 16 y multiplicar por 2.

El siguiente paso es colocar la dirección de la rutina musics() en el


vector de interrupciones.

Capturar una localidad del vector de interrupciones es muy fácil con


Turbo C. La función setvect realiza esta tarea.

Habiendo declarado la función de interrupción, solamente debemos


conocer en qué localidad del vector queremos colocar la dirección de
la rutina musics(). Para este ejemplo utilizaremos la intern-pción
número 5. Esta interrupción es llamada cuando se presiona la tecla
PT SCR (print screen). Teniendo la rutina y el número de
interrupción capturamos la interrupción con el siguiente cddigo :

setvect (5,musica);

Puesto que el DOS es un sistema operativo no-reentrate las rutinas


ISR no deben de utilizar funciones del DOS, un intento de ésta clase
ocasionará que el sistema quede bloqueado. El BIOS permite a
algunas funciones ser reentrantes, tal es el caso de la interrupción
16H, la cual maneja la entrada del teclado, ésta puede ser usada sin
ningún efecto lateral.

Enseguida se muestra un programa residente el cual intercepta la


rutina de servicio del teclado, el programa residente genera un

20
caplnib 2 Programas Residentes

simple “beep” cada vez que una tecla es presionada después de lo


cual da servicio a la rutina del teclado.

void interrupt (*iar-key) ();

void interrupt beep (void);


void tar (unsigned);

void main (void)


{
/* guarda
isr-key - l a dirección
getvect(9);
/* coloca la nueva dirección */
*/

aetvect (9,beep);
/* termina y deja residente */
tar(706) ;
1
void interrupt beep (void)
{
int i,j ;
char originalbits,bits;
unsigned char count = 3000;

bits = originalbits = inport (0x61);


for (i = O; i <= count; i++) {
outportb (Ox61,bita L Oxfc);
for (j = O; j <= 100; j++);
outportb (Ox61,bita I 2);

for (j = O; j <=I 100; j++);


1
outportb (Ox61,originalbits);
/* llama a la rutina de interrupción del
teclado para darle servicio */
(*isr-key) ();

21
capsnil0 2 Device Drivers

2.2.2 Device Drivers

Un dispositivo es simplemente una pieza de equipo que se encuentra


enlazada hacia la computadora. Algunos ejemplos son: impresoras,
monitores, discos y teclados. Si utilizamos un dispositivo en
particular en nuestros programas de aplicación necesitamos incluir
rutinas de control de sofiuare (muy complejas) para poder soportar
las necesidades de sefialización y esquemas de tiempo, las cuales
permiten al procesador de la computadora comunicarse con el
dispositivo, tales rutinas son conocidas como manejadores de
dispositivos (device driven).

Existen dos clases de manejadores de dispositivos en la PC, estos son


el de BIOS y el de DOS.

Los manejadores de dispositivos de BIOS son usados para realizar


funciones elementales o de bajo nivel. Por ejemplo, el manejador de
discos flexibles de BIOS (BIOS diskette device driver) realiza las
funciones de lectura o escritura en un sector (o en una secuencia de
sectores). El manejador de impresora de BIOS (BIOS printer d&e
driver) realiza las funciones elementales de impresión de un caracter.

L o s manejadores de dispositivos de DOS llevan a cabo funciones de


alto nivel, ésto es, se utilizan sin hacer referencia a los
requerimientos particulares del hardware de los dispositivos.
Simplemente un comando como:

A > COPY A:REP.TXT 8:

se utiliza para copiar un archivo llamado REP.TXT del drive A hacia


el drive B, también podemos usar un comando como

A > COPY A:REP.TXT PñN


capftub 2 Dcvice I)rivtrs

para copiar el mismo archivo a la impresora.

En el primer comando, el manejador de dispositivo de DOS para


disc= flexibles es usado como fuente y destino de la transferencia. El
manejador de DOS llama al manejador de BIOS para realizar la
transferencia hacia y de los sectores apropiados. En el segundo caso,
el manejador de dispositivos de DOS para discos flexibles es usado
como fbente de la transferencia, y el de la impresora es usado como
destino. A m b o s manejadores del DOS,el de discos flexibles y el de la
impresora, llaman a sus contrapartes de BIOS para realizar la
transferencia.

Para que DOS reconozca un nuevo dispositivo y éste pueda ser


manejado al igual que el resto de los dispositivos estándares, es
necesario que el nuevo manejador del dispositivo cumpla con las
especificaciones con las cuales están construidos los manejadores de
dispositivos de DOS.

Tipos de manejadores

DOS reconoce dos tipos de manejadores, los manejadores de


caracteres (character driven) y los manejadores de bloques (bluck
drivers).

Un manejador de caracteres realiza entradas y salidas en forma serial


(carácter por carácter). Por ejemplo la impresora es un manejador de
caracteres a través del cual una cadena de caracteres es impresa; el
manejador de la impresora es llamado para transferir cada carácter.

L o s manejadores de caracteres tienen nombres específicos, tal es el


caso del sistema de la consola (teclado para entrada y monitor para
salida) el cual es definido por CON, los puertos de comunicación
auxiliar AUX y COM1 los cuales se encuentran enlazados a la

23'
capítulo 2 Device Driven

impresora serial y modems, y el puerto de impresión paralela PRN


o LPT1.

El otro tipo de dispositivo, el manejador de bloques, es una unidad


de almacenamiento masivo, tales como el disco RAM,el disco duro y
el disco flexible. En forma contraria a los manejadores de carácteres,
los manejadores de bloques transfieren paquetes (bloques) de datos a
un mismo tiempo. Usualmente cada bloque contiene un sector de
disco (512 kb) de datos. A diferencia de los manejadores de
carácteres, los manejadores de bloques no tiene nombres específicos,
éstos -únicamente son llamados por letras (A, B,C , etc.).

Estructura de un manejador de dispositivos

Un manejador de dispositivos consiste de tres partes:

* Un encabezado del dispositivo.


* Una rutina de estrategia.
* Una rutina de interrupción.

El encabezado del dispositivo

El encabezado del dispositivo (dar2ce header) es un bloque de 18 bytes


que se encuentra al inicio del manejador de dispositivo. El
encabezado es usado por DOS para instalar e identificar un
manejador en particular. El encabezado está dividido en los
siguientes cinco componentes:

Apuntador al próximo dispositivo (4 bytes): Esta dirección (offiet


seguido por el segmento) es usada por el DOS para construir un lista
ligada de todos los manejadores de dispositivos.

24
caprtub 2 Device Drivers

Atributos del dispositivo (2 bytes): Este grupo.de bits define el tipo


de dispositivo y algunos atributos especiales del dispositivo (fig.
2.2.3).

Bit significrdo

15 1 Manejador de carácter.
O Manejador de bloque.
14 1 Si soporta IOCLT.
13 1 No es formato IBM (bloque).
O No salida hasta lleno (carct)
12
11 1 si soporta abierto/cerrado/m
10 *
9
8 *
7 *
6 *
5 *
4 (especial: bit manejador CON)

3 1 si manejador es el reloj.
2 1 Dispoeitivo actual es nulo.
1 1 Dispositivo estándar actual es
de salida.
O 1 Dispositivo estándar actual es
de entrada.
~

* Actualmente indefinido.

Figurr 2.23. Atributos del dispositivo.

25
Apuntador a la rutina de estrategia (2bytes): Este es un offset dentro
del segmento del manejador del dispositivo hacia la rutina de
estrategia.

Apuntador a la rutina de interrupción (2 bytes): Este es un offset


dentro del segmento del manejador del dispositivo hacia la rutina de
interrupción.

Nombre del dispositivo (8 bytes): Este campo contiene el nombre del


dispositivo para un manejador de caracteres. Para un manejador de
bloques, el primer byte del campo contiene un contador para el
número de dispositivos soportados por el manejador, los restantes 7
bytes no son usados.

Rutina de estrategia

Cuando el DOS recibe una petición para que opere un dispositivo,


busca a través de la lista de manejadores de dispositivos, buscando al
manejador especificado en la petición. Cuando encuentra un nombre
de dispositivo igual al nombre del dispositivo solicitado el DOS
invoca a la rutina de estrategia del dispositivo con la dirección
encontrada en el encabezado del dispositivo.

Actualmente la rutina de estrategia no juega un papel muy


importante. Esta simplemente "encola" una petición de dispositivo y
regresa hacia DOS. En versiones futuras de DOS, sin embargo esta
debe asistir a operaciones tales como colas de prioridad en
multitareas y situaciones de tiempo compartido.

Rutina de interrupci6n

Después de recibir el control de la rutina de estrategia, el DOS


invoca a la rutina de interrupción. Esta rutina provee toda la

26
CapItulo 2 Device Drivers

funcionalidad para el manejador (el código para ejecutar las


operaciones del manejador del dispositivo).

Debido a que existen muchas diferentes tareas que un manejador de


dispositivos pueda realizar para un dispositivo, un mecanismo es
necesario para que el DOS pueda especificar el comando a ejecutar.
Este mecanismo se encuentra en la forma de un encabezado de
petición (request header).

Un encabezado de petición es un bloque de memoria que el DOS


inicializa. Un apuntador a este encabezado es pasado hacia el
manejador de dispositivo en el registro par ES:BX durante la
llamada a la rutina de estrategia. La rutina de estrategia guarda esta
dirección.

Cuando la rutina de interrupción recibe el control, busca la


dirección guardada en el encabezado de petición y usa el contenido
del encabezado para determinar la operación que debe realizar. El
encabezado de petición contiene los siguientes datos:

Longitud del encabezado de petición (1byte).

Unidad de C6digo (1 byte): Especifica la subunidad (para


manejadores de bloques) que la operación de petición puede usar.

Código de comando (1byte): Especifica la operación a ser ejecutada.

Estatus (2bytes): Esta palabra permite a un manejador de dispositivo


regresar el estatus de operación a DOS. Una palabra de estatus
puede indicar "ERROR", "BUSY" o "DONE".

Area reservada para DOS (8 bytes).

27
caplnilo 2 Device Drivers

&ea de datos (longitud variable): Este segmento contiene los datos


apropiados para la operación.

F i i2.4.4. Algunos manejadores de dispositivos instalados en DOS.

Soporte de DOS

DOS provee automáticamente el soporte necesario para instalar


nuevos manejadores de dispositivos. Cuando un programa de
aplicación solicita una operación de un dispositivo via una llamada a
una función de DOS, este determina qué manejador de dispositivo es
requerido y lo invoca para que realice su tarea. Para recordar a
todos los manejadores de dispositivos DOS utiliza una lista ligada.
Cuando el sistema se inicializa, DOS instala a los nuevos
manejadores de dispositivos especificados en el archivo
CONFIG.SYS (fig. 2.2.5), agregándolos al frente de la lista de
dispositivos.
capitulo 2 Device Drivels

F i 2.23. Diagrama de flujo que muestra las tareas realidas por DOS antes de emitir el
prompt yla espera para la entrada del usuario.

Después cuando DOS recibe una petición para una función de E/S, la
búsqueda comienza en el frente de la lista, cuando encuentra el
primer nombre de un dispositivo que es igual al solicitado entonces
invoca a éste para realizar la petición. Esta técnica permite remplazar
un manejador de caracteres por un manejador de dispositivo con el
mismo nombre que el dispositivo remplazado.

29
Device Drivers
capitulo 2

Figun 4.4.6. Pasosque realiza el DOS para instalar manejadores de dispositivos.

Programa ejemplo

Este manejador únicamente envía caracteres hacia monitor, usando


una llamada a la función 02H.

30
128401
Device Drivers
capítulo 2

CODE SEGMENT
ASSUHE CSrCODE, DSrCODE

CR EQU ODH ;ASCII de retorno de carro


LF EQU OAB ;ASCCI de f i n de l i n e a
EOM EQU 'S' ; F i n de mensaje

:Encabezado de dispositivo

WINTER DD - 1
ATTRIBUTE DW 800H ;manejador de caracteres
STRATEGY-PTR DW STRATEGY
INTERRUPT-PTR DW INTERRUPT

-
DRIVE NAME DB 'DRIVETST' ;8 Caracteres

;definición de datos

OFFSET-- DW ?

SEGMENT-RE DW ?

MESSAGES LABEL WORD

-
M I T MESS DB 'INICIALIZANDO DRIVETST'
DB CR,LF,EOM

OZITPUT-MESS DB ' SACANDO'


DB ,
CR, LF EOM

- -
OUT VER MESS DB 'SACANDO CON VEEUFICACION'
DB CR, LF,EOM

- -
STATUS OUT MESS DB 'STATUS DE SALIDA'
DB CR,LF,EOM

;rutina de estrategia

STRATEGY PROC FAR


MOV OFFSET-RB ,BX
31
capitulo 2 Device Drivers

MOV S E G m T - R H ES
RET
STRATEGY ENDP

;rutina de interrupción

INTERRUPT PROC FAR

;se guarda el ambiente actual

PUSH AX

PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
PUSH BP

. PUSH
PUSii
DS
ES
;inicializa DS para mensajes

PUSH CC
POP DS ; DS * CS
MOV BX ,OFFSET-RH
MOV ES,SEGHENT-RH

;recupera e interpreta el comando

MOV &,ES: [BX+2] ;obtiene


;comando
CMP AL,o ;inicia comando
JE INIT ;si
CMP AL,^ ;salida 1

JE OUTPUT ;si
CMP AL,9 tealida con
32
capíhih, 2 Device Driven

;verif icaci6n 3
JE OUTPUT-VERIFY ;ai
cm =,lo festatus de
;salida
JE -
STATUS OWTPUT ;ai
JMP NORWS-EXIT ;otro regresa
; comando no
;válido

INIT: LEA DX, INIT-MESS


MOV Ax,9
INT 21X itransmite
;mensaje

;colocando direction final

MOV WORD PTR ES:[BX+14],0FFSET BOTTOM

MOV ES:[BX+16],CS
JMP NORMAL-EXIT

OUTPUT: LEA DX ,OUTPUT-MESS


uov Ax,9
INT 218

;colocando parámetros para salida

OUTPUT2 : MOV CX,GS:[BX+18] icontador


MOV SI,ES:[BX+14] ;buffe para offaet
MOV DS,ES:[BX+16] ;buffer para seg.
OUTPUT1 : MOV AL,[SI] ;obtiene carac.
UOV DL,AL ;llamada a
;función 28
MOV Ax,2
INT 21X ;transmite carac.
INC SI ;apunta
33
Capftulo 2 Device Drivers

;al próximo
LOOP OUTPUT1
SUB $S:[BX+18],CX ;número
;traneferido
JHP NORMAL-EXIT

-
OUTPUT VERIFY: LEA DX,OUT-VER-MECS
MOV AHf9
INT 218 itransmite
;meneaje
JHP OUTPUT2 ;uaa otra rutina

STATUS-OUTPUT: LEA DX,STATUS-OUT-MESS


MOV AHf9

INT 21H
JMP NORMAL_EXIT

;status = DONE
-
NORMAL EXIT: MOV WORD PTR ES:[BX+3If0100H

;reetablece ambiente
-
INTER EXIT: POP ES
POP DS
POP BP
POP DI
POP SI
POP DX
POP cx
POP BX
POP Ax
RET
INTERRUPT ENDP
BOTTOM LABEL WORD
CODE ENDS
END
capítub 2 Device Drivers

Después de crear el código fuente del manejador de dispositivo


usando un procesador de palabras, el manejador está listo para ser
ensamblado. Usando el Macro Assembler como sigue:

A > NASM DRIVERTST

Después de ensamblar el programa el ensamblador genera un


archivo objeto llamado DRIVETST.OBJ.

El siguiente paso es convertir éste archivo objeto en un archivo


ejecutable comunmente llamado archivo .EXE. Para realizar ésto es
necesario utilizar el programa ligador LINK:

A > LINK DRIVETST.OBJ

El programa LINK produce el archivo DRIVETST.EXE así como el


error "NO STACK SEGMENT'. Un segmento de STACK puede ser
definido dentro de un programa y es usado como una área de
almacenamiento de variables. El programa LINKER fué diseñado
asumiendo que todos los programas tienen un STACK. Los
manejadores de dispositivos no definen un segmento de STACK,
porque un manejador de dispositivos es parte del DOS, y no es un
programa común, teniendo DOS definido su propio STACK interno.
Por lo que éste error es esperado.

El siguiente paso es convertir el archivo DRIVETST.EXE en un


programa con formato .COM el cual es una imagen de memoria con
la cual el driver debe ser cargado dentro de la memoria. Esto es
necesario puesto que los manejadores de dispositivos con formato
.EXE no pueden ser ejecutados por DOS.
capftulo 2 DeviceDnven

Este requerimiento de DOS es realizado utilizando la utilería


EXE2BIN.COM la cual es sumistrada por DOS.

A > EXEZBIN DRIVETST.EXE DRIVETST.SYS

La extensión .SYS es dada al manejador de dispositivo en lugar de


.COM por varias razones. La primera es que existe la posibilidad de
que accidentalmente se pueda ejecutar el manejador de dispositivo,
cuausando inevitablemente que el sistema quede bloqueado. La
segunda razón es que ha llegado a ser convención estándar para
tales programas llamarles .SYS lo que los distingue de los otros
archivos.
capítub 2 Hardwaredeb PC

2.3 MRDWAREDEIAPC

La tarea general de crear una interfaz de hardware requiere


familiaridad con la unidad del sistema. Debido a esto se introducen
los conceptos básicos referentes a la unidad de procesamiento central
(8088) y su relación con los buses de interfaz del sistema.

Buses del microprocesador

El 8088 es un microprocesador que utiliza un sistema de tres buses.


El BUS DE DIRECCIONES provee un direccionamiento hacia
memoria y dispositivos de E/S. El BUS DE DATOS suministra una
trayectoria para que los datos puedan fluir entre el microprocesador
y la memoria, o los dispositivos de US. El BUS DE CONTROL
suministra señales de control que controlan el flujo de información
en el BUS DE DATOS. I

El bus de direcciones contiene 20 líneas que se encuentran


conectadas a dos espacios lógicos, el espacio de direccionamiento de
memoria y el espacio de direccionamiento de E/S. Las 20 lineas de
dirección son activas durante un ciclo de bus de memoria,
implicando un rango de direccionamiento de OOOOOH hasta
OFFFFFH (1MB). Únicamente 16 líneas son activas durante un ciclo
de bus de E/S, lo que limita el espacio de direccionamiento de E/S
(puertos) a un rango de OOOOH a OFFFFH (64 KB). En la IBM PC
únicamente las 10 líneas menos significativas de las 16 líneas son
decodificadas durante una instrucción de US,limitando aun más el
espacio de los puertos a un rango de OOOOH a O3FFH (1KB).

El bus de datos contiene 8 líneas que se encuentran conectadas en


forma bidireccional a los dos espacios de direcciones.

El bus de control consiste de 4 líneas que corresponden a los


diferentes tipos de ciclos de bus:
37
Capftulo 2 Hardwaredeia PC

MEMR lectura de memoria.


MEHW escritura de memoria.
IOR lectura de E/S.
IOW escritura de memoria.

L a s líneas MEMR y MEMW son conectadas a los diferentes chips de


memoria, y las líneas IOR y IOW a los diferentes dispositivos de US.
Durante los ciclos del bus que controla el microprocesador
únicamente una de estas líneas se encuentra activa (activo bajo).

El bus de WS

El bus de E/S es un conjunto de 62 líneas conectadas hacia 5


conectores en la tarjeta del sistema (8 conectores en la PC XT).

Las líneas de E/S pueden ser clasificadas por la función que realizan:

DIRECCIONES bus de direcciones.


DATOS bus de datos.
CONTROL bus de control.
DMA lineas para funciones DHA.
INTERRUPCIONES llneas para implementar.
funciones de interruption.
RELOJ 14.318 Mhz y 4.77 nhz.
POTENCIA fuente de poder y tierra.

Direcciones. Líneas AO-A19 del bus de direcciones.

Datos. Líneas DO-D’7 del bus de datos bidireccional.

Control. En adición a las 4 líneas usuales MEMW, MEMR, IOR e


IOW existen otras líneas:

38
capitub 2 Hardwaredeia PC

ALE (Address W h Enable). h e d e ser usada en el bus de E/S para


encontrar el comienzo de un ciclo de bus.

AEN (Address Enable).Esta señal permite distinguir entre un ciclo de


bus y un ciclo de bus DMA. Un "alto" indica que un ciclo DMA est5
ejecutándose.

1 / 0 channel RDY. Esta línea de entrada normalmente "alta" puede


ser puesta %ajo" para insertar estados de espera para un dispositivo
lento.

1/0Channel Check. Esta línea de entrada normalmente "alta" puede


ser puesta 'bajo" para indicar error de paridad en memoria o en
dispositivos de E/S.

Reset DRV. Esta señal de salida es activo alto durante el encendido y


puede ser usada para inicialización o reinicialización de dispositivos
de E/S.

Grupo DMA. Consiste de las siguientes líneas DRQ1-DRQ3, DACKO-


DACH3 y TC. Son usadas para acceder en forma directa a la
memoria.

Grupo de interrupciones. Las líneas de petición de interrupciones


(IRQO-IRQ7) son conectadas directamente al controlador de
interrupciones (8259A) en la tarjeta del sistema. Una petición de
interrupción es generada por el "levantamiento" de la línea
apropiada IRQ. La línea puede ser retenida arriba hasta que la
petición sea realizada por la rutina de servicio de interrupción
apropiada.

Grupo de reloj. El grupo de reloj consiste de dos relojes OSC Y CLK,


que pueden ser usados por dispositivos de E/S.

39
capftulo 2 Hardwaredeía PC

Grupo de Potencia. Toda la tensión disponible en la tarjeta del


sistema se encuentra disponible en el bus de US.

+ 5 vdc ( 2 patillas).
- 5 Vdc
+12 vdc
-12 Vdc
GND Tierra (3 patillas).

Figura 23.1 Bus de E.6.

Espacio de direcciones de US (Puertos)

El microprocesador 8088 es capaz de direccionar 64K puertos


diferentes, vía 16 líneas del bus direcciones. Sin embargo la IBM PC
reconoce únicamente las 1 O líneas menos significativas, restringiendo
el número de puertos a 1024 (1K). La mitad inferior de los 1024
puertos están reservados para la tarjeta del sistema, y la mitad
superior está dedicada al bus de US.

40
128481
Capítulo 2 Hardware de la PC

Muchos de los puertos del bus de E/S se encuentran reservados para


adaptar tarjetas específicas a la PC, como muestra la figura 2.2.8.

TARJETA DEL SISTEIU

O-1F COlOTROLAOOR DHh S


-4 8237
20-3F C-0- DE INTJIRRUPCIOLSBS 84!ANA&ES 8259
404F CIRCUITO C-/REW S-8 8253
60-7F INTERFAZ PL
-A E/S 24-Lfirius 8255
80-9F REGISTRO DE PAGÍNA DE 64ii büA
OAO-OBF luscARA LATCE -B I T N&lI
OCO-oc7 GENERADOR DE SONIDO (PC jr)
OC8-OEF RESERVADO
OFO-OFF INTERFAZ DE DISCO FLEXIBLE (PC j r )
100-1FF NO USADO

BUS DE E/S

200-2OF ADAPTADOR DE JUEGOS E/S


210-211 UNIDAD DE EXPANSI&
220-24F RESERVADO
250-277 NO USA00
278-27F INTERFAL PARALELA PARA IHPRESORA (LPT2)
280-2EF NO USADO
2F0-2F7 RESERVADO
2F8-2FF INTERPAL SERIAL UART 8250 (Con?)
300-31F TARJETA PROTOTIPO
320-32F DISCO DURO
330-377 NO USA00
378-37B INTERFAZ P-L& PARA IHPRESORA (LPT1)
3ao-m~ INTERPAZ SIIOCRONA B I l U R I A SECUNDARIA
390-39P NO USA00
3A0-319 IllTERFAZ SINCRORA BIiiARIA PRIMARIA
3BO-3BF WONITOR HONOCROMTICO E 1)IpRESORA PARALeLA
3CO-3CF RESERVADO
3DO-3DF ADAPTADOR PILRA HONI'POR COIDR/GRUICAS
3EO-3EF RESERVADO
3FO-317 DISCO FLEXIBLE
-
3F8 3FF INTERFAZ SERIAL UART 8250 (COMl)

F i i 4 3 1 . Espacio de direcciones de E/S.

41
CAPíTULO 3

DESARROLLO
EXPERIMENTAL

Este capítulo describe el software y hardware que se utilizó para la


implementación del sistema sobre la PC y el sistema operativo MS-
DOS.

3.1 HARDWARE

Una de las primeras tareas para realizar cuando se va a integrar un


dispositivo al sistema de la PC es diseñar un circuito decodificador
para el bus de E/S, este circuito es mostrado en la sección 3.1.1. La
forma en la cual fue implementada la interfaz en el sistema de la PC
es descrita en la sección 3.1.2.

3.1.1 Decodificación

El circuito decodificador monitorea el bus de direcciones para


generar una señal de selección de puerto (PSEL) cuando el
dispositivo es direccionado.

El circuito decodificador está realizado a partir de 2 circuitos


comparadores ('74LS85), con los cuales es posible direccionar
únicamente 8 líneas de dirección. Puesto que se ha tomado en cuenta
la línea de control AEN (Address Enable) para poder distinguir entre

42
capítulo 3 Decodifcador

un ciclo de bus y un ciclo de acceso directo a memoria (DMA),


quedan Únicamente 7 líneas las cuales permiten la selección del
dispositivo.

Como se vio en el capítulo anterior únicamente es necesario utilizar


las 10 líneas del bus de direcciones menos significativas para poder
seleccionar un puerto, ya que las 6 líneas restantes son ignoradas por
el sistema de la PC cuando se direcciona el bus de US,debido a esto
se utilizaron las 7 últimas líneas (A3-A9), de las 10 líneas de dirección
disponibles.

Ya que el espacio de direcciones reservado por el sistema para


tarjetas prototipo se encuentra en el intervalo 300H - 3 1 FH, se eligió
el intervalo 3 18H - 3 1FH como espacio de direccionamiento para el
sistema.

La comparación de la dirección en el bus es efectuada por los


comparadores contra un conjunto de interruptores, en los cuales se
encuentra la dirección del puerto seleccionada.

La elección del conjunto de interruptores para seleccionar el puerto


fue realizada para poder hacer mas flexible el direccionamiento del
sistema y así poder cambiar la dirección del puerto, si esta se
encuentra ocupada.
*.

En la siguiente hoja se encuentra la figura 3.1, la cual muestra el


circuito decodificador.

43
f

AP
e v

1
n

Li1
I
1 c
o
o
?

L
I-

C:

-I
o
capitulo 3 Implementaci6n

3.1.2 Implementación

La implementación del sistema se realizó teniendo como base el


puerto paralelo 8255A conectado al GPIB, a través de un conjunto
de buffers. El protocolo del GPIB fué creado tanto en sof2ware como
hardware.

El flujo de información entre el PPI y el bus de E/S de la PC se


realiza a través de las líneas 27 a 34 del PPI y las líneas A2 a A9 del
bus de E/S. Mientras que el control del flujo se realiza por medio de
las líneas RD'(lectura) y WR' (escritura) de ambos dispositivos (líneas
5 y 36 del PPI y B13 y B14 del bus de E/S).

L a s líneas y Al del PPI se encuentran conectadas a la parte baja


del bus de direcciones (líneas A30 y A31 del bus de US), y son
utilizadas para indicar el tipo de función a realizar, ya sea selección
de cualquiera de los tres puertos o programación del PPI.

La línea de RESET del PPI es conectada directamente a la línea B2


del bus de E/S ( línea de RESET del sistema de la PC).

La última línea de control CS' (chip select) está conectada al circuito


decodificador por medio de la línea PSEL, la cual es utilizada para
habilitar al PPI cuando el dispositivo es direccionado.

La figura 3.2 muestra el diagrama de interfaz GPIB en el cual se


puede observar la descripción anterior.

Como el sistema se encuentra organizado en tres conjuntos de líneas


(Datos, Handshake y Control), realizaremos la descripción de este,
basándonos en esta estructura.
capítulo 3 Implementaci6n

Datos
L o s datos en el PPI son manejados a través del puerto A y los buffers
de tres estados (74LS240).

El puerto A está programado en modo 1. El acceso a este puerto se


realiza a través de una instrucción de lectura o escritura al puerto en
la dirección 318H. Las 8 líneas del puerto A se encuentran
conectadas a los buffers 74LS240. El sentido del flujo de información
en estos buffers es controlada con las líneas 24 y 25 del PPI las
cuales son parte del puerto B,y se encuentran conectadas a las líneas
SELIN y SELOUT respectivamente (figura 3.3).

Handshake

L a s tres líneas que realizan el control de transferencia de la


información son DAV, NRFD y NDAC.

DAV (DAta V'id). Esta línea es manejada como entrada en PC2 (linea
17 del PPI), cuando el controlador funciona como Zkkner, y proviene
de un buffer no inversor de colector abierto (DAVi); como salida
(DAV,) es controlada por PC7 (línea 10 del PPI) y enviada por un
buffer del mismo tipo que a la entrada, cuando el controlador trabaja
como UZker.

Para ambas líneas, se aprovecha la configuración del 8255A en el


grupo A modo 1. Para lectura, la recepción de esta señal provoca que
los datos que se encuentran presentes en el puerto A sean retenidos
para su posterior lectura. En la escritura, al colocar datos en el
puerto A la señal DAV es activada, indicando que los datos se
encuentran listos para ser leidos.

NRFD (No Ready For Datu). La línea de entrada (NRFDi) se


encuentra manejada por PCo (línea 14 del PPI), y proviene de un

46
capitulo 3 Implementaa6n

buffer inversor de colector abierto. La salida se encuentra dividida


en dos líneas NRFD1 (PC5, línea 12) y NRFD2 (PB5, lfnea 23).

NRFD1 nos proporciona una respuesta rápida indicando que los


datos han sido cargados dentro del buffer del puerto A (esto no
implica que los datos hayan sido leídos por el Zkteni?r).Esta señal pasa
a través de un biestable tipo RS (Reset-Set) para mantener el nivel de
la señal cuando los datos han sido leídos y no se ha enviado la señal
de aceptación de los datos (NDAC).

La línea NRFD2 releva a NRFD1 debido a que cuando se manda la


señal de aceptación (NDAC) ésta inicializa el biestable el cual
mantiene la señal NRFD por lo que es necesario retener el nivel con
NRFD2.

NDAC (No Data Accept). Como mencionamos en el párrafo anterior


la línea de salida NDACo (manejada por PBo, línea 18 del PPI) es
llevada a un nivel alto cuando los datos han sido leídos por el Zistewr
indicando al talker que puede seguir transfiriendo datos. La línea de
entrada NDACi, conectada a PC6 (línea 11del PPI) nos indica si los
datos han sido aceptados por el listener.

Control

IFC (ZnterFace Clear). Esta línea es manejada por PB3 (línea 21 del
PPI).

ATN (ATtmtiiON). Es manejada por PB2 (línea 20 del PPI).

SRQ (Ser& ReQwst). Es recibida por IRQ4 (línea B24 del bus de
E/S) que genera un servicio de interrupción hacia la PC, cuando
algún dispositivo periférico solicita servicio al controlador.

47
capftulo 3 Implcmentación

REN (RtmdeENdZe).Está conectada a PB4 (linea 22 del PPI).

EO1 (End Or Identijy). Debido a que esta señal es insertada al mismo


tiempo que la Ciltima transferencia de información, se manejó por
medio de IR% (línea B25 del bus de E/S), cuando se trabaja como
listener, cuando se trabaja como talker, se maneja por medio de PB1
(linea 18 del PPI).

Los tres conjuntos de líneas descritos anteriormente pueden ser


observados en las figuras 3.2 y 3.3.

48
_-

=I
In
C
a
Q
w

n
f
1
m
Ar
7
o
N
i
m
m
VI
O
m
r
on
W
~-

128401
capítulo 3 Software

3.2 SOFIWARE

La programación del sistema fue realizada de dos formas: a través de


un lenguaje de alto nivel (lenguaje C), y utilizando lenguaje
ensamblador para construir un manejador de dispositivo (device
driver) e integrarlo al sistema operativo.

3.2.1 Programación en lenguaje C

Por medio del lenguaje C fue posible desarrollar rutinas para las
diferentes funciones que realiza el sistema. Estas rutinas se
encuentran disponibles para ser utilizadas en aplicaciones especificas
de diferentes dispositivos conectados al bus.

A continuación se presentan las rutinas básicas que fueron


desarrolladas.

Control
Esta rutina permite la programación de los dispositivos, enviando
como parámetro la palabra de control.

#include <dos.h>

void control ( unsigned char comando)

{
unsigned char NRFD ;

/* Programando PPI, grupo A modo 1 : PA salida, PC4 y PC5 salida


Pc6 (NDAC (IACK)) entrada, PC7 (DAV(I0BF)) salida grupo B
modo O : PB salida, PCO (INRFD) entrada ,PC1 - PC3 entradas. */

outportb (Ox3lb,Oxal) ;
Capítulo 3 Software

outportb (Ox31b,Ox08) ; /* PC4 = L (IDAV ("entrada")) */


outportb (Ox31b,OxOa) ; /* PC5 = L (NDAC ("salida")) */
outportb (Ox31b,OxOd); /* PC6 = H (INT A PPI) */

/* Atención todos los dispositivos, callen y escuchen */

outportb (Ox319,0x64) ; /* Programando 240 como salida


(PB7 = L,PB8 = a ) , ATN = L (PB2) */

/* Esperando a que escuchen */

NRFD = inportb (Ox3la); /* Leer PC */


NRFD = NRFD C (0x01) ; /* enmascarando NRFD (PCO) */

} while (NRFD);

/* Mando comando */

outportb (Ox318,comando) ; /* lOBF = L (DAV) */


outportb (Ox319,Ox60); /* ATN = E */

Writejpib
Esta función realiza la transferencia de información entre la PC
configurada como Talker y uno o varios Zisteners.

52
Capítulo 3 Software

#include <doEi.h>

void write-gpib ( char *cadena)

I
unsigned char ӟ ;

while (*cadena I= * \ O * ) /* mientras no se termine la


información */
{
outportb (Ox318,*cadena); /* transmite un byte de
información */

/* mientras no estén listos


para recibir datos */
NRFD = inportb (Oxila);
NRFD = NRFD & (0x01) ;
} while (NRFD);

cadena++ ;

Read-ib
La función que realiza este rutina es leer información de algún
dispositivo configurado como tuZkm.

Para su utilización es necesario modificar el vector de interrupciones,


a través de la rutina I R E S , direccionando hacia ISR-3. La rutina
ISR 3 permite conocer el estado de la recepción por medio de la
variable global EOI.

53
caplhdo 3 software

Es necesario utilizar una rutina de interrupci6n porque la sefial de


fin de transferencia de mensaje (EOI)es colocada al mismo tiempo
que la última transferencia de datos, y debido a la forma en la cual
está diseñado el hardware, no es posible leer dos líneas a un mismo
tiempo.

#include <dos.h>
#include <stdio.h>
#include <stdlib.h>
#define uchar unsigned char

uchar EO1 = O: /* indica la terminación de la transferencia */

/* Rutina de servicio para la interrupción 3 del sistema


de la PC. Nos indica por medio de la variable EO1 la
terminación de la transferencia de información. */

void interrupt isr-3(void)

{
EO1 = 1;

/* Modifica el vector de interrupciones de la interrupción 3


del sistema de la PC, direccionando como rutina de
servicio a ISR-3. */

54
capítulo 3 Software

void i r e 3 (void)

void interrupt isr_3(void);

disable ( ) ;
outportb(0x2l,(inportb(Ox21) L Oxf7)): /* Habilita int 3 PIC */
enable ( ) ;

/* Esta funcidn configura la interfaz como entrada */

void config-ent (void)

{
outportb (Ox31b,Oxbl); /* configuración: PA modo 1, salida:
PB salida, PC6 y 7 salida, PC1 a PC3
entradas */

outportb (Ox31b,OxOf); /* PC7 = H */


outportb (Ox3lb,OxOa): /* PC5 = L */
outportb (Ox31b,OxOc); /* PC6 = L * /
outportb (Ox31b,Ox09): /* PC4 = H ( I N T A PPI) */
outportb (Ox31b,Ox07); /* PC3 = H */
outportb (Ox319,Oxal); /* 2 4 0 ' s programados como entradas;
NRFD - Activo - NDAC -> L */
1

55
capítulo 3 software

/* Realiza la lectura */

void read-mib (char *cadena)

{
uchar DAV;

do { /* Mientras no termine el envio


de informaci6n */
do { /* Mientras no haya un dato
válido */
DAV = inportb (Ox31a);
DAV =DAV 6 (0x04);
} while (DAV);

outportb (Ox319,Ox81); /* Pone NRFD */


*cadena++ = inportb (0x318);
outportb (Ox319,Ox80); /* Pone Libera NDAC */
outportb (Ox3lb,OxOa); /* PCS = L */
outportb (Ox319,Oxal); /* Pone NRFD y NDAC */

} while (IEOI);

*cadena = NULL;
EO1 = O;

Programa de aplicación

El siguiente programa llamado Plottype tiene como función leer un


archivo, el cual contiene instrucciones en lenguaje HP-GL (Hewlett-
Packard Graphia Language). Este lenguaje es utilizado por el Plotter
gráfico HP 7470A con el cual fueron realizadas todas las pruebas del
sistema IEEE-488 (GPIB).
56
Capítulo 3 Software

#include <etdio.h>

tdefine INC REN 160


tdefine F1 187

void main(argc,argv)

int argc ;
char *argv[];

FILE *fp;
char buffer[100],
temp[ 101 ;
int c,i,
renglon = 410:

/* Comprobación de pardmetros * /
if (argc 13: 2) {

printf("\nError en numero de parametros");


printf("\nLa sintaxis debe ser:
$8 [=chivo a imprimir]\n",argv[O]);
1
else { /* Abriendo archivo * /
fp = fopen(argv[l],"r");
i f (fp == NUU)
printf("Error : fichero $9 inaccesible",argv[l]);
else {

Control(37); /* programando para "escuchar" */

do f /* Mientras no sea fin de archivo */


/* Inicialización, selección de
pluma y posición inicial */
write-gpib("IN;SP 1;PA 425,279;");
57
Capítulo 3 Software

for (i -
/*
0;i < 56;++i) { .
Selecciona la dirección de escritura y
tamaño de carácter */
-
write gpib("D1 0,l;SI . 1 5 , . 2 5 ; " ) ;
/* comando de escritura de carácteres * /
-
write qpib("LB");
c = lee-linea(fp,buffer);
write-qpib(buffer);
renglon += -
INC REN;

itoa(renglon,temp,lO);
/* Posición absoluta */
-
write gpib(";PA ");

write-gpib(temp);
write-gpib( ",279; " ) ;
1
if (( i == 56) 6& ( c I= EOF) {

printf("\nPoner siguiente hoja y


oprimir F1 para continuar");
do {
-
i = get char();
}while (i I= Fl);
renglon = 410;
1
} while (c 1s EOF);
Capítulo 3 Software

int lee-linea(FILE *fp, char *linea)

{
char ct

while ((c=getc(fp)) I= EOF && cJ= # \ n m )


*linea++ = c;

*linea++ = '\3';
*linea = *\Om;
i f (c == EOF)
retUrn(EOF):
else
return (NULL) ;
1

3.2.2 El Driver

El manejador de dispositivo (device driver) fue construido siguiendo


las reglas específicas dadas por Microsoft, permitiendo administrar, a
través del sistema operativo, al dispositivo como una parte estándar
del sistema de la PC.

En seguida se presenta el código fuente del d.laver, en el que


únicamente se realiza la funcibn de salida.

CODE SEGMENT

ASSUME CS: CODE, DS: CODE

CR EQU ODH
LF EQU OAH
EOM EQU ,s*
Capítulo 3 Software

POINTER DD -1
ATTRIBUTE DW 8000H
STRATEGY-PTR DW STRATEGY
INTERRUPT PTR- DW INTERRUPT
DRIVER-NAME DB 'GPIB 1

-
OFFSET RH DW 1

SEGMENT-Rñ DW ?

MESSAGES LABEL WORD

INIT-MESS DB '---> DRIVER - GPIB <---'


DB LF,CR,EOM

STRATEGY PROC FAR


MOV OFFSET-RH,BX
MOV SEGMENT-RH,ES
RET
STRATEGY ENDP

; ------------------- RUTINA DE INTERRUPCI~N-------------------


INTERRUPT PROC FAR

PUSH Ax ; guardando ambiente


PUSH BX
PUSH cx
PUSH DX
60
capftulo s sofiwde63 8 4o 1

PUSH SI
PUSH DI
PUSH BP
PUSH DS
PUSH ES

PUSH cs :DS = CS
POP DS
nov BX,OFFSET-RH
nov ES,SEGMENT-RH

nov AL,ES:[BX+Z] ;leyendo comando


CMP AL, 0
J-E INIT
CMP AL, 8
JE OUTPUT
JMP NORMAL-EXIT

INIT : LEA DX,INIT-MESS


MOV m,9
INT 2 1H

nov WORD PTR ES:[BX+lQ],OFFSET BOTTOM


MOV ES:[BX+16],CS
JMP NORMAL-EXIT

OUTPUT :
;CONTROL

MOV AL, OAlH ;programando ppi


nov DX, 31BH ;outportb (Ox31b,Oxal)
61 I
capfhllo 3

OUT DX,AL
MOV AL, 88 ;outportb (Ox3lb,0x8)
MOV DX ,31BB
OUT DX,AL
MOV AL, OAH toutportb (Ox31b,OxOa)
MOV DX,31BH
OUT DX,AL
MOV AL, ODH ;outportb (Ox31b,OxOd)
MOV DX, 3188
OUT DX,AL
MOV AL, 64H ;outportb ( 0 ~ 3 1 9 ~ 0 x 6 4 )
MOV DX, 319H
OUT DX,AL
Do1 : MOV DX, 31AH ;do {
IN U,DX ; NRFD = INPORTB(OX31A)
AND AL,lH ; NRDP = NWD f 01
CUP AL, ox
JNE DO1 ;}while (NRFD)
MOV AL, 31 toutportb (Ox318,37)
MOV DX, 318H
OUT DX,AL
MOV AL,60H
MOV DX, 319H
OUT DXfAL ;outportb (Ox319,Ox60)

MOV CX,ES:[BX+18] icontador


MOV SI,ES:[BX+14] ;buffer para segmento
MOV DS,ES:[BX+16] ;buffer para segmento

OUTPUT 1 : MOV AL, [SI1


MOV DX, 3188
OUT DX,AL ;transmite carácter
capítulo 3 software

DO2 : MOV DX, 31Ni ;do { .


IN
AND
CMP
AL,DX
AL, 1H
AL,OH
i

NRDF -
NRFD

NRFD
= inportb(OX31A)
SI 01

JNE Do2 ;>while (blRPD)

INC SI
LOOP OUTPUT1
SUB ESt[BX+lS],CX ;caracteres transferidos

JMP NOW-EXIT

-
NORMAL EXIT: MOV WORD PTR ES:[BX+3],0100H ;status - DONE

POP ES ;restableciendo ambiente


POP DS
POP DI
POP SI
POP DX
POP cx
POP BX
POP Ax

RET
INTERRUPT ENDP

BOTTOM LABEL WORD


CODE ENDS
END
RESULTADOS

En este capitulo se presentan los resultados obtenidos en la


realización del sistema IEEE-488 (GPIB) .

Se construyó un dispositivo capaz de integrarse al sistema de la PC,


basado en el estandar IEEE-488. Este dispositivo se encuentra
montado en una tarjeta prototipo capaz de insertarse en alguna
ranura (slot) de expansión disponible en cualquier sistema de PC o
compatible.

Se proporciona software básico el cual se puede tomar como punto de


partida para el desarrollo de rutinas más complejas para algún
dispositivo periférico específico.

El software básico esta implementado de dos maneras distintas :

a) Un manejador de dispositivos (Device DriuerS).


b) Rutinas en lenguaje fuente.

El manejador de dispositivo, denominado GPIB.SYS, se integró al


conjunto de manejadores de dispositivos del sistema operativo MS-
DOS, con los que se tiene la capacidad de manejar el sistema a través
de llamadas a funciones estándar del mismo sistema operativo. La
tínica función implementada dentro del manejador GPIB.SYS es la
de salida.

64
capitulo 4 Resultados

L a s rutinas en lenguaje fbente son proporcionadas en lenguaje C de


manera que un usuario pueda utilizarlas para desarrollar programas
de aplicación de acuerdo a las especificaciones requeridas por su(s)
dispositivo(s).

L a s rutinas de lenguaje fuente son: Control, R e a d m , W r i t e s ; que


sirven, para mandar comandos de control a los dispositivos, enviar y
recibir información de los mismos respectivamente.

PROBLEMAS, PROBLEMAS, PROBLEMAS ...


De los párrafos anteriores se aprecia que dentro del GPIB.SYS no
existe la función de lectura. Esta función estuvo implantada dentro
del sistema, sin embargo no realizaba correctamente su función.

Para mostrar la forma en que fue tratado este problema se presentan


los siguientes tres puntos:

1.-Código del GPIB conteniendo el módulo de lectura.


2.-Forma de ejecución de un dispositivo desde MS-DOS.
3.-Programa de prueba que utiliza el módulo de lectura.

Código del GPIB

A continuación se muestra el código del GPIB conteniendo el


módulo de Lectura.

CODE SEGMENT

ASSUME CS :CODE, DS :CODE

CR EQU ODH
LP EQU OAH
EOM EQU '$I
capitulo 4 Resultados

POINTER DD -1
ATTRIBUTE DW 80008
STRATEGY-PTR DW STRATEGY
INTERRUPT-PTR DW INTERRUPT
-
DRIVER NAME DB 'GPIB *

OFFSET-Rü DW ?
SEGMENT-RH DW ?

FtAG DB ?

MESSAGES LABEL WORD

INIT MESS DB I---> DRIVER - GPIB <---I

DB LF,CR,EOM

PROC FAR
MOV -
OFFSET RX,BX
MOV -
SEGMENT RX,ES
RET
STRATEGY ENDP

INTERRUPT PROC FAR

PUSX Ax ;guardando ambiente


PUSH BX
PUSX cx
PUSü DX
PUSX SI
PUSX DI
PUSX BP
PUSH DS

66
capitulo 4 Resultados

PUSH ES

PUSX cs :DS = CS
POP DS
WOV BX ,OFFSET-RE
nov ES,SEGXENT_RB

MOV AL,ES:[BX+Z] ;leyendo coinando


CMP AL, 0
JE INIT
CMP AL,4
JE INPUT
CMP AL, 8
JNE NORMAL
JMP OUTPUT
NORMAL : JMP NORMAL-EXIT

INIT: LEA DX,INIT-MESS


uov AH, 9
INT 2 1H

uov AL, OH
uov

MOV WORD PTR ES:[BX+lQ],OFFSET BOTTOM


uov ES:[BX+16],CS
JHP -
NORMAL EXIT

INPUT :
;CONTROL

nov &,FLAG
CMP AL,2H
JE El
nov AL,2H
nov FLAG,=
nov AL, OAlH :programando ppi
UOV DX, 31BX routportb (Ox31b,Oxal)
OUT DX8
MOV AL88H ;outportb (Ox31b,Ox8)
uov DX,31BH
OUT DX8AL
uov AL, O A H ;outportb (Ox31b,OxOa)
caplhllo 4 Resultados

MOV DX,31BH
OUT DX,AL
MOV AL,ODE ;outportb (OxJlb,OxOd)
MOV DX, 3188
OUT DX,AL
MOV AL, 64H toutportb (Ox319,Ox64)
MOV DX, 3198
OUT DX,AL
Do3 : MOV üX,31Añ ;do €
IN AL,DX ; NRFD = INPORTB(OX31A)
AND AL, 1H ; NRDF = N R F D & 0 1
cwp AL, OH i

JNE Do3 ;}while (NRFd)


nov AL, 69 ;outportb (Ox318,69)
MOV DX, 318H
OUT DX,AL
MOV AL, 60H
MOV DX, 3198
OUT DX,AL

;CONFI ENTRADA
uov AL, OBlH
MOV DX, 31BH
OUT DX,AL
MOV AL, OFB
MOV DX, 31BH
OUT DX,AL
MOV AL, OAH
MOV DX, 3lBH
OUT DX,AL
MOV AL, OCB
MOV DX,31BH
OUT DX,AL
uov AL, 09H
MOV DX, 31BH
OUT DX,AL
MOV AL, O78
MOV DX, 31BH
OUT DX,AL
MOV AL, OAlH
nov DX, 319H
OUT DX,AL
capítulo 4 Resultados

;READ_GP

El: nov CX,ESt[BX+18] ; CONTADOR


nov SI,ES:[BX+14]
nov DS,ESr[BX+16]

Do4 : nov DXf031AH


IN ALI DX
AND AL*4x
cwp AL, OH
JNE Do4
nov ALf 081H
nov DX, 3198
OUT DXIAL
MOV DX, 0318H
IN ALtDX
nov [=],AL ; *BUFFER = CARACTER

nov DL,AL ; ECO DE CARACTER


nov AB, 2
INT 2 1H

MOV A x f cx ; ECO DE CONTADOR


MOV DLIAL
nov mf 2
INT 2 1H

INC SI ; BUFFER++
DEC cx
nov AL, 80H
nov DX, 319H
OUT DX,AL
nov AL, om
nov DXI31BH
OUT DXIAL
nov ALIOAlH
nov DXf319H
OUT DX,AL

MOV AL, [SI-11


cxp AL*10
JE @3
SNE DO4

LOOP Do4
JMP @6
capitulo 4 Resultados

@3: DEC cx
@ 6: MOV Ax,ex ; ECO DE CONTADOR
MOV DL, AL
MOV AX,LH
INT 2 1H
MOV ES:[BX+18],CX ; CUZACTERES TRMSPERIDOS

MOV ES:[BX+14],SI

OUTPUT:

;CONTROL

MOV AL, OAlH ;programando ppi


MOV DX ,3 1BH foutportb (Ox31bfOxal)
OUT DX,AL
MOV AL, 8H ;outportb (Ox31b,Ox8)
MOV DX, 31BH
OUT DX,AL
MOV AL, O M toutportb (0x31bt0x0a)
MOV DX, 31BH
OUT DX, AL
MOV AL, ODH ;outportb (Ox31b,OxOd)
MOV DX, 31BH
OUT DX,AL
MOV AL, 64H ioutportb (Ox319,Ox64)
MOV DX, 319H
OUT DX,AL
DO1 : MOV DX, 31~1i ;do {
IN AL, DX f NRFD = INPORTB(OX31A)
AND AL, la i NRDF = N R F D ó O1
C W AL, OH *
JNE DO1 ;}while (NRPd)
MOV AL, 37 ;outportb ( 0 ~ 3 1 8 ~ 3 7 )
MOV DX, 318H
OUT DX,AL
MOV AL,6OH
MOV DX, 319H
OUT DX,AL ;outport (Ox319,Ox60)

70

i
capitulo 4 RCSUltadOS

OU!rPuTl r nov
nov
nov
INT
nov
nov
OUT

DO2 : nov DX, 3lAR ;do €


IN AL,DX i NRFD = inportb(OX3U)
AND AL, 1H i #RPD=MVD&01
cwp AL,oa ;
JNE DO2 ; I while (NRFD)

INC SI
LOOP OUTPUT1
SUB ES:[BX+l8],CX ;caracteres transferidos

JXP -
NORMAL EXIT

NORHAL_EXIT : nov WORD PTR ES:[BX+3],0100H ;estátus = DONE

POP ES ;restableciendo ambiente


POP DS
POP BP
POP DI
POP SI
POP DX
POP cx
POP EX
POP Ax
RET
INTERRUPT ENDP

BOTTOM LABEL WORD


CODE ENDS
END

Lectura desde DOS

La ejecución del código del GPIB se realiza cuando, dentro de una


función estándar de un lenguaje de alto nivel, o directamente del
lenguaje ensamblador, se invoca la interrupción 2 1 H, función 3FH.
71
capitulo 4 RCSUltadOS

Esta fiinción lee del archivo o dispositivo asociado con un manejador


(handier) específico asignado por el DOS.

La forma en la cual se invoca la interrupción es la siguiente:

AH = 3FH
BX = Manejador
CX = Bytes a leer
DS:DX = Apuntador a buffer

Donde al registro AH contiene el número de función a ejecutar, BX


contiene el número correspondiente al manejador del que se hará la
lectura, CX es el número de bytes a leer y en DS:DX está la dirección
del buffer en donde será almacenada la información o datos leidos.

Al término de la interrupción, ésta devuelve lo siguiente:

Con la bandera de acarreo (CUT Flag)encendida:


AX = 5 (Acceso dañado)
AX = 6 (Manejador inválido)
Con la bandera de acarreo apagada:
AX = Número de bytes leidos

Si no hay error, AX regresa el número de bytes leidos; si existe un


intento para leer el comienzo de un fin de archivo, A X regresa
CERO. El número de bytes especificados en CX no es
necesariamente transferido al buffer.

Si existe un error, la bandera de acarreo (CF) es encendida y el


código de error se devuelve en AX.

72
caplnilo 4 Resultados

Programa de Prueba

A continuación se presenta uno de los programas utilizados como


prueba de lectura y escritura del sistema GPIB.

Program Pru-mib;

{ Este programa selecciona la pluma número uno del


Plotter, la posiciona en las coordenada8 425,279
y posteriormente lee la posicidn de la pluma,
desplegandola en pantalla. 1

var
pltr,apun:text;
cadena:string[ll];

begin
asaign(pltr,'gpib');
assign(apun,'gpib');
rewrite(p1tr);
writa(pltr,'IN;SPl;PA 425,279;');
write(pltr,moA;*);
reset (apun);
read(apun,cadena);
writeln('0ENA = ',cadena);
close(p1tr);
close(apun);
end.

Tratamiento del Problema

Como intento de solucionar el problema se utilizaron herramientas


de ayuda tales como depuradores de software, osciloscopio y
analizador de estados lógicos.

El depurador utilizado fue Turbo Debugger, ya que con este es


posible seguir la ejecución del programa, instrucción por instrucción,
en lenguaje fuente y en su correspondiente código en lenguaje
ensamblador.
73
capstdo 4

Con el Turbo Debugger fue posible seguir la instruccibn de lectura


("Read" de Turbo Pascal) hasta el momento en el cual se efectúa la
interrupción de lectura de dispositivo (interrupción 21H, función
3FH). En este punto se comprobó que los parámetros requeridos
para la interrupción eran correctos, ya efectuada la interrupción y
con ayuda del analizador de estados lógicos se observó que la interfaz
recibía los datos enviados por el graficador y sin embargo, al regreso
de ésta, el registro A X reporta una lectura de O caracteres, lo que
indica una lectura de fin de archivo (observando el contenido del CF,
su status se encontraba apagado).

Por la forma en que trabaja el Turbo Debugger no es posible entrar


hasta el código de servicio de interrupción, por lo que al código del
driver se le adicionó una función de despliegue en pantalla de los
datos recibidos por la interfaz y esto fué otra manera de comprobar
que los datos recibidos llegaban correctamente desde el dispositivo
de prueba (Plotter). Una función de despliegue similar fué utilizada
para comprobar que la cuenta de los carácteres recibidos era corecta
hasta antes del retorno del servicio de interrupción.

Utilizando una característica del Turbo Debugger que permite


modificar el contenido de los registros, y colocados justo despues de
la interrupción, se cambió el contenido del registro AX, de O a el
número observado como cuenta final de lectura del driver y despues
de efectuar la modificación se continuó la ejecución normal del
programa obteniendo los resultados de acuerdo a los cuales fué
diseñado este último.

Hasta la fecha se han buscado soluciones a este problema consultado


diferentes fuentes sin obtener resultados favorables, ya que la
información referente a manejadores de dispositivos (device drivers) es
muy limitada, y normalmente no incluyen lectura de dispositivos.

74
CAPfTULO 5

CONCLUSIONES

El sistema GPIB satisface los requerimientos especificados en el estándar


IEEE-488,

La interfaz GPIB consta de los dispositivos necesarios para enlazar


comunicaciones entre un computador IBM-PC y dispositivos periféricos
basados en el estándar IEEE-488. El diagrama general a bloques de esta
interfaz es mostrado en la figura 5.1.

GPIB
F m 5.1 Diagirnir geaenl a bloques del sistema GPIB.

La base del sistema de hardware de esta interfaz es el circuito integrado de


Intel 8255 (PPI). Este chip fué escogido tomando en cuenta, por una parte,
la facilidad de acoplamiento al sistema de la PC, y por otra, su capacidad
para manejar 3 puertos independientes de 8 bits cada uno, los cuales
pueden ser programados para trabajar de distintos modos, a elegir, de
acuerdo a las necesidades.

75
Otro bloque de importancia es la sección de decodificación en la que se
puede elegir, a través de interruptores, el espacio de direccionamiento en
el que trabajará la interfaz, lo que permite una mayor flexibilidad de
acoplamiento al sistema, adaptándolo para trabajar en cualquier espacio de
direccionamiento que se encuentre libre.

El último bloque es la sección de buffers. Estos son inversores de colector


abierto que permiten trabajar con lógica negativa, además de manejar la
potencia necesaria según indicaciones del estándar.

El software ha sido diseñado para una posible expansión y puede ser


modificado con una variedad de configuraciones de dispositivos sin hacer
una reescritura radical del software básico.

El software es suministrado para trabajar de dos maneras distintas. En la


primer forma se proporcionan los procedimientos en código objeto de las
funciones de control, lectura y escritura hacia los dispositivos GPIB. La
segunda forma de trabajo con el dispositivo es a través de un manejador de
dispositivos (device drivers) que proporciona al usuario un manejo
transparente de las funciones del sistema operativo. Se suministran las
funciones de control y escritura.

En lo referente al costo del sistema este fué de aproximadamente $ 70.00


(USD)para la versión prototipo y de $55.00 (USD)para el mismo circuito
montado en circuito impreso.
BIBLIOGRAF~A

IEEEStandar Digital Interface for Programmable Instrumentation


(IEEE-STD-488-1978)

The IBM Personal Computer from the Inside Out


Murray Sargent I11 & Richard L. Shomaker
Addison-Wesley Publishing Company 1984

Handbook of Software & Hardware Interacing for IBM P C s


Jeffrey P. Royer
Prentice-Hall, Inc. 1987

System Software Tools


Ted J. Biggerstaff
Printce-Hall, Inc 1986

Writing MS-DOS Device Drivers


Robert Lai / The Waite Group Inc.
Addison-Wesley Publishing Company 1987

Turbo C : Memory-Resident Utilities, Screen I/O and Programming


Techniques
Ai Stevens
Management Information Source, Inc. 1987 I

77

- I- - ’ ~”. -
".
~

Bibliografh

C : Power User's Guide


Herbert Schildt
Osborne/McGraw-Hill 1988

Advanced MS-DOS
Ray Duncan
Microsoft Press 1986

Microprocessor - based IEEE - 488 interfacing unit as a development aid


D.P. Majoe ¿kA.C. Loannides
Microprocessors and Microsystems
Vol. 6 No.6 July and August 1982, page 275

IEEE-488 Interfacing using parallel 1 / 0 ports


Philip Robertson
Microprocessors and Microsystems
Vol. 6 No.6 July and August 1982, page 281

Data acquisition system using the IEEE-488 interface bus


b a g Y. Taha & Waleed H. Abdulla
Microprocessors and Microsystems
Vol. 11 No.9 November 1987, page 493

T h e Input / Output Primer part 3: The Parallel and HPIB (IEEE-488)


Interfaces
Steve Leibson
Byte Publication Inc
April 1982, page 186
APfiNDICE A

INTERFAZ PEIUFI~ICA
PROGRAMABLE (8255A)

El 8255A es un dispositivo de E/S de propósito general programable


diseñado para usarse con los microprocesadores de Intel. El 8255A tiene
24 terminales de E/S los cuales pueden ser individualmente programados
en 2 grupos de 12 y usados en 3 modos de operación. En el primer modo
(MODO O), cada grupo de 12 terminales de E/S puede ser programado en
conjuntos de 4 para entrada o salida. En MODO 1, el segundo modo, cada
grupo puede ser programado para tener 8 líneas de entrada o salida. De las
4 terminales restantes, 3 son usadas para hundshuking y señales de control
de interrupciones. El tercer modo de operación (MODO 2) es el de bus
bidireccional el cual utiliza 8 lheas para un bus bidireccional, y 5 lfneas
tomando prestada una del otro grupo, para handshaking.

DESCRIPCION FUNCIONAL
General

El 8255A es un dispositivo para interfaz periférica programable (PPI)


diseñado para sistemas de microcomputador. Su función es el de un
componente de propósito general de E/S para interfaz de equipo periférico
hacia el bus del sistema del microcomputador. La configuración funcional
del 8255A es programada por el software del sistema así que normalmente
no es necesaria lógica externa para interfaz de dispositivos periféricos o
estructuras.

AI
Buffer del Bus de Datm

Este w e e r bidireccional de 8 bits con salida a tercer estado es usado como


UM Mterfaz del 8255A hacia el bus de datos del sistema. Los datos son
transmitidos o recibidos por el bufleer después de la ejecución de
instrucciones de entrada o salida por el CPU. Las palabras de control y el
estado de información son también transferidos a través del b@et del bus
de datos.

EscrituranRctura y Control Lógico

La función de este bloque es manejar toda la transferencia interna y


externa de datos y control o palabras de estado. Acepta entradas de las
direcciones del CPU y el bus de control, produciendo comandos para
ambos grupos de control.

CS'

Chip Select. Un "bajo" en está terminal de entrada habilita la comunicación


entre el 8255A y el CPU.

Read. Un "bajo1' en está terminal de entrada habilita al 8255A para


transmitir los datos o estado de información hacia el CPU en el bus de
datos. En esencia, permite al CPU ''leer de" el 8255A.

Write. Un "bajo" en está terminal de entrada habilita al CPU para escribir


datos o palabras de control dentro del 8255A.

A2
AOy Ai
Selección de puerto O y selección de puerto 1. Estas señales de entrada en
conjunción con las entradas RD y WR,controlan la selección de uno de los
tres puertos o de los registros de palabra de control. Estos son,
normalmente los últimos bits significativos del bus de direcciones (A0 y
Al).

Reset. Un "alto" en esta entrada limpia el registro de control y todos los


puertos (A,B,C) son puestos en el modo de entrada.

Controles grupo A y grupo B

La configuración funcional de cada puerto es programada por el sistema de


software. En esencia el CPU "manda" una palabra de control hacia el
825549. La palabra de control contiene información tal como "modo", "bit
set", "bit reset", etc., que inicializan la configuración funcional del 8255A.

Cada uno de los bloques de control (grupo A y grupo B) acepta


"comandos" de la lógica de control ReadhVEte, recibe "palabras de
control" del bus de datos interno y produce los comandos propios hacia los
puertos asociados.

Control Grupo A
Puerto A y Puerto C superior (C4 - C7)

Control Grupo B
hierto B y Puerto C inferior (CO - C3)

El registro de palabras de control puede solamente ser escrito. Ninguna


operación de lectura del registro de control es permitida.
A3
Puertos A, B y C

El 8255A contiene tres puertos de 8 bits (A,B y C). Todos pueden ser
configurados en una gran variedad de caracterfsticas funcionales por el
software del sistema pero cada uno tiene sus propias características
funcionales o "personalidad" para engrandecer el poder y flexibilidad del
8255A.

OPBRACIÓN B h I c A 8255
A1 A0 RD' WR' CS' OPBRACIbN DE ENTRADA
(u-)
O O O 1 O Puerto A = Bus de datos
O 1 O 1 O Puerto B = Bus de datos
1 O O 1 O Puerto C = Bus de datos
OPBRACI~NDE SALIDA
(ESCRITUIU)
O O 1 O O Bus de datos => Puerto A
O 1 1 O O Bus de datos => Puerto B
1 O 1 O O Bus de datos => Puerto C
1 1 1 O O Bue de datos => Puerto I)
FUNCIÓN DE DESHABIUTACIÓN
X X X X 1 BUS DE DATOS => 3 ESTADOS
1 1 O 1 O CONDICI~N ILEGAL
I x X 1 1 O BUS DE DATOS => 3 ESTADOS

Puerto A. Un b@er/latch de salida de datos de 8 bits y un latch de entrada


de datos de 8 bits.

hierto B. Un b@er/latch de entraddsalida de 8 bits y un bufer de entrada


de datos de 8 bits.

Puerto C. Un b@er/latch de salida de datos de 8 bits y un bufer de datos


de 8 bits (no latch para entrada). Este puerto puede ser dividido en dos
puertos de 4 bits sobre el modo de control. Cada puerto de 4 bits contiene
un larch de 4 bits y puede ser usado para la salida de señales de control y
entradas de señales de estado en conjunción con los puertos A y B.

A4
Apédce A

DEsCRIPCIdN OPERACIONAL

S e l d 6 n de Modo

Son tres modos básicos de operación que pueden ser seleccionados por el
software del sistema :

Modo O - EIS básica.


Modo 1 * Strobed EIS.
Modo 2 - Bus bidireccional.

Cuando la entrada de reset lleva a "írias" a todos los puertos puede ser
puesto en el modo de entrada (es decir, todas las 24 lfneas pueden estar en
el estado de alta impedancia). Antes de que el reset sea removido el 8255A
puede quedarse en el modo de entrada con ninguna inicialización adicional
requerida. Durante la ejecución del programa del sistema uno de los otros
modos puede ser requerido usando una simple instrucción de salida. Esto
permite al 8255A servir a una gran cantidad de dispositivos periféricos con
una simple rutina de mantenimiento de software.

F m A.l Definición de formato para MODO.

I
Los modos para puerto A y B pueden ser definidos separadamente,
m i e m s el puerto C es dividido dentro de dos porciones como se
requieran para las definiciones del puerto A y puerto B. Todos los
registros de salida, incluyendo los flip-flops de estado pueden ser
iniciabados siempre que el modo sea cambiado. Los modos pueden ser
combinados para que su definición funcional pueda ser adecuada hacia casi
una estructura de E/S. Por ejemplo: El grupo B puede ser programado en
MODO O hacia un simple monitor cerrando interruptores o desplegando
resubdos computacionales. El grupo A puede ser programado en MODO
1 hacia un monitor o teclado, o cinta lectora en una base manejadora de
interrupciones.

Caraderisticas simples bit setheset

Uno de los 8 bits del puerto C puede ser puesto o quitado usando una
simple instrucción de salida. Esta característica reduce requerimientos de
software en aplicaciones basadas en control. Cuando el puerto C es usado
como estadokontrol para los puertos A y B, estos bits pueden ser puestos
o borrados para usar las operaciones bit setheset justamente como si estas
fueran puertos de entrada de datos.

I 1'- O

Fisurp A3. Formato bit set/reeet.

Funciones de Control de Interrupciones

Cuando el 8255 es programado para operar en MODO 1 o MODO 2, las


señales son suministradas para que puedan ser usadas como entradas de
A6
peticiones de interrupción hacia el CPU. Las Señales de petición de
interrupción, generadas por el puerto C, pueden ser habilitadas o
deshabilitadas poniendo o "reseteando" el flip-flop asociado N E , usando
la función bit setheset del puerto C . Esta función permite al programador
rechazar o permitir a un dispositivo específico de E/S interrumpir al CPU
sin afectar alguno de los otros dispositivos en la estructura de
interrupciones.

Definición del flip-flop INTE :


(BiT-SET) - Interrupción habilitada.
(BIT-RESET) - Interrupción deshabilitada.

M0M)S DE OPERACION

Modo O. (Entrada/Salida Básica). Esta configuración funcional provee


entrada simple y operaciones de salida para cada uno de los los tres
puertos. Ningun handrhaking es requerido, los datos son simplementes
escritos hacia o leidos de un puerto específico.

Modo O. Definiciones básicas funcionales.

- Dos puertos de 8 bits y 2 puertos de 4 bits.


- Un puerto puede ser entrada o salida.
- Las salidas son latched.
- Las entradas no son hched.
- 16 diferentes configuracionesde E/S son posibles
en este modo.

Modo 1. (Strobed Znput/output). Esta configuración funcional se emplea


principalmente para transferir datos hacia o de puertos específicos en
conjunción con strobes o señales de handshaking. En MODO 1 , los
puertos A y B usan las líneas del puerto C para generar o aceptar estas
señales de handshaking.
A7
I
I
lspcILdicc A Intedk PoriftniCri Programable

Modo 1. Definiciones básicas funcionales.

- 2 gNpoS (A y B).
- Cada grupo contiene un puerto de datos de 8 bits y
un puerto de control/datos de 4 bits.
- El puerto de datos de 8 bits puede ser entrada o
salida, ambas entradas o salidas son htched.
- El puerto de 4 bits es usado para control y estado
del puerto de 8 bits.

Defmición de señales de control de entrada.

STB (Strobe Inpul.). Un "bajo" en esta entrada carga datos dentro del latch
de entrada.

iBF (Input Bufler Full F/F). Un "alto" en esta salida indica que los datos
han sido cargados dentro del latch de entrada, en esencia, una
contestación. IBF es puesto por la entrada STB comenzando con un bajo y
inicializado por el flanco de subida de la entrada RD.

INTR. (Interrupt Request.) Un "alto" en esta salida puede ser usado para
interrumpir al CPU cuando un dispositivo de entrada requiere servicio.
INTR es puesto cuando STB' es "uno", IBF es "uno" e INTE es "uno". Es
inicializado por el flanco de bajada de RD'.Este procedimiento permite a
un dispositivo de entrada solicitar servicio desde el CPU simplemente
haciendo strobing de los datos dentro del puerto.

INTE A
Controlada por el bit setheset de PC4.

INTE B
Controlada por el bit setheset de PC2.
Apeadice A

Figura A.3. MODO 1 aitndp.

Definición de señales de control de salida.

OBF' (outputBufler Full F/F). La salida OBF "baja" para indicar que el
CPU ha escrito datos en un puerto especffico. El OBF F/F es "puesto" por
el flanco de subida de la entrada WR y "reseteado" por la entrada ACK
(bajo).

ACK' (Acknowledge Inpuí). Un "bajo" en esta entrada informa al 8255A


que los datos del puerto A y puerto B han sido aceptados. En esencia, una
respuesta del dispositivo periférico que ha recibido los datos de salida por
el CPU.

INTR (Interrupt Request). Un "alto" en esta salida puede ser usado para
interrumpir al CPU cuando un dispositivo de salida ha aceptado datos
transmitidos por el CPU. INTR es puesta cuando ACK es "uno", OBF es
"uno". Esta es "reseteada" por la cafda del flanco de WR.

INTE A
Controlada por el bit setheset de FC6.

A9 I
Apéndice A
#+

INTE B
Controlada por el bit setheset de PC2.

VI'

Figin0 A.4. MODO 1 d d a .

Modo 2. (Strobed Bidirectional Bus E/S.)Esta configuración funcional está


considerada para permitir la comunicación con un dispositivo periférico o
una estructura en un bus sencillo de 8 bits, para transmitir o recibir datos
(bus bidireccional E/S). Las señales de handshaking son dadas para
mantener una disciplina en el flujo del bus en una manera similar al modo
1. La generación de interrupciones y funciones de habilitacioddeshabili-
tación están disponibles también.

Modo 2. Definiciones funcionales básicas.


- Usada en grupo unicamente.
- 8 bits en el bus del puerto bidirecional ( puerto A ) y un
puerto de control de 5 bits (puerto C).
- Las salidas y entradas son latched.
-
El puerto de control de 5 bits es usado para control y estado
control y estado de el bus de el puerto
bidireccional (puerto A).
Aphiica A

Definiciones de señales de control en el bus b i d i d o n a l E/S.

INTR (Interrupt Request). Un "alto" en esta salida puede ser usado para
interrumpir al CPU para operaciones de entrada y salida.

Operaciones de salida.

OBF'. (Output W e r Full.) La salida OBF "baja" para indicar que el CPU
ha escrito un dato en el puerto A.

ACK' (Acknowledge). Un "bajo" en esta entrada habilita al b@er de salida


a tres estados del puerto A para transmitir hacia afuera los datos. De otra
forma, el b@er de salida se puede poner en alta impedancia.

INTE 1 ( Flip-flop asociado con OBF ).


Controlado por el bit setheset de PC6.

Operaciones de entrada

STB' (Strobe Input)


STB (Strobe Input). Un "bajo" en esta entrada carga los datos dentro del
latch de entrada.
IBF (Input B@er Full F/F). Un "alto" en esta salida indica que los datos
han sido cargados dentro del latch de entrada.

INTE 2 ( Flip-flop asociado con IBF).


Controlado por bit setheset de PC4.
APÉNDICE B

CONTROLADOR DE
INTERRUPCIONES (8259A)

El controlador de interrupciones programable (PIC)provee un servicio de


soporte vital para el procesador central (8088/8086). A diferencia de las
interrupciones generadas por soMare, las interrupciones de hardware son
causadas por señales generadas por diferentes piezas (teclado, manejador
de disco, timer, etc.) dentro de la computadora. Puesto que el 8088/8086
tiene únicamente una línea para recibir señales de interrupción se presenta
un problema cuando múltiples dispositivos necesitan estar conectados al
8088/8086. El problema es resuelto a través del 8259A el cual es empleado
para manejar varias fuentes de interrupción y poder presentar una simple y
controlable señal al procesador central.

El 8259A puede aceptar un máximo de 8 señales de interrupción


independientes, numeradas de O hasta 7. Para cada interrupción el 825914
presenta una única interrupción al CPU,además de un único código de tipo
de interrupción (interrupt type code) para cada una de las 8 fuentes de
interrupción. Esto permite asignar una Única rutina de interrupción para
cada una de las 8 interrupciones diferentes. Las 8 señales de entrada del
8259A se encuentran alambradas hacia el bus de control para que cualquier
dispositivo dentro del sistema del bus pueda acceder al mecanismo de
interrupciones. En el bus de control las señales son llamadas IRQO hasta
IRQ7 (fig. B.l).
Apéadice B contfoldor de interrupciones

Figura B.1. Hardwnre de Intemupción.


w
Porque cada señal es independiente, se debe prevenir la posibilidad de que
dos o más señales ocurran al mismo tiempo. El 8259A maneja tales
eventos reteniendo la interrupción o interrupciones secundarias mientras el
procesador proporciona servicio a la primera. Cuando la interrupción ha
sido servida, la próxima es atendida. Para eventos que ocurren en el
mismo instante el procesador atiende a la interrupción según un orden de
prioridad, donde la interrupción O tiene la más alta prioridad y la
interrupción 7 la más baja.

El 8259A es configurado con los códigos de tipo de interrupciones OSH-


O F H que corresponden a las interrupciones 0-7 respectivamente. La
colocación para los dispositivos estándares es listada en la tabla B.1.
Nótese que las dos interrupciones de más alta prioridad, IRQO y IRQ1,
están alambradas directamente a la tarjeta del sistema. Las interrupciones
restantes son obtenidas a partir de tarjetas que se encuentran en las ranuras
de expansión.
OSH
09H
OAH
OBH
OCH
ODH
OEH
OFH
~

TABLA B.l Asignación de beas de iniempción.

La programación del 8259A consiste de dos acciones básicas. Primero,


para cada interrupción independiente se debe habilitar o deshabilitar su
valor dentro del registro de interrupciones enmascarable (IMR: interrupt
mask register). El IMR es un registro de 1 byte dentro del 8259A que
puede ser accesado via el puerto 21H. Cada bit en el IMR corresponde a
una interrupción (bit O-IRQO, bit 1-IRQ1, etc.). Si un bit en el IMR es O,
entonces la interrupción correspondiente está habilitada. Si el bit es 1, una
señal de interrupción no puede ser generada ya que la interrupción está
deshabilitada. El estado de la bandera de interrupción (interrupt flag)
dentro del 8088 determina cuándo una señal de interrupción es recibida.

La segunda acción de programación corresponde a la señalización del fm


de la rutina de interrupción. Esta es llevada a cabo transmitiendo el
comando "end of interrupt" (EOI) representado por 20H hacia el registro
de comandos de interrupción dentro del 8259A,éste registro es accesado
via el puerto 20H.
Apcadice B

F'igum B.2. control del meamhmo de interrupciones.

B4
A P ~ D I C Ec

lMANuAL DE USO

Este apéndice describe la forma en que el sistema GPIB es integrado y


configurado dentro de la PC, asi como tambien una breve descripción de
las funciones con las que se maneja el sistema.

Conectando el sistema a la PC

La conexión del sistema se lleva a cabo insertando la tarjeta dentro de


alguna de las ranuras (slots) disponibles de la tarjeta principal (main-board)
de la PC.

El sistema tiene la capacidad de colocarse en cualquier dirección del


espacio de direccionamiento de E/S (puertos), sin embargo, parte de este
espacio esta ocupado por otros dispositivos, por lo que se debe tener
precaución de no utilizar la direccion ocupada por otro dispositivo. Se
recomienda utilizar la dirección dentro del intervalo 300H - 31FH,ya que
este espacio esta reservado para el uso de tarjetas prototipo y generalmente
se encuentra libre.

La configuración de la dirección se efectua a través del conjunto de


interruptores que se encuentran en la tarjeta. En la siguiente figura se
muestra la forma en que los interruptores configuran al sistema para
trabajar en el espacio de direcciones 31FH-318H.

c1
C.1 ConfiguraCiónpara direccionamiento (31FH-318H).
fp

El primer interruptor debe siempre permanecer encendido (OM, ya que


este maneja la líbea de control AEN (Address Enable), que permite
distinguir entre un ciclo de bus de E/S y un ciclo de acceso directo a
memoria @MA). Con los interruptores restantes se manejan las líneas del
bus de direcciones A9 - A3, estas fijan una base de direccionamiento (en la
figura, 31FH), de acuerdo a la cual, tenemos un espacio de 8 direcciones
para el manejo del sistema.

El sistema, tanto en hardware como en software, se encuentra configurado


para trabajar en el espacio de direcciones 318H-31FH,por lo que si se
desea configurar hacia otra dirección, es necesario, además del
direccionamiento de los interruptores, modificar las direcciones E/S de
puertos, dentro del código de programación del sistema.

Uso del sistema

De acuerdo al dispositivo al que se conecte el sistema, el usuario debe


contar con un programa de aplicación específico para este.

Existen dos formas para utilizar la interfaz:

1) a traves de un manejador de dispositivos (Device Driver) 6


2) por medio de procedimientos en lenguaje de alto nivel.

La ventaja de usar un manejador de dispositivos es la de poder trabajar con


el sistema a traves de llamados estandar a funciones del sistema operativo.
En este caso se dice que el sistema es transparente al MS-DOS.
c2
Apendice C Manual de Uso

La segunda forma de trabajo para programación del sistema consiste en el


uso de funciones o procedimientos programados en un lenguaje de alto
'

nivel. Aqul existe una mayor facilidad de programación, dada la facilidad


de modificación del código.

En las dos formas de trabajo se proveen funciones básicas para el sistema.


El usuario puede adicionar funciones mas complejas, de acuerdo a su
aplicación.

Una vez integrada la targeta a la PC, el sistema puede ser conectado a


cualquier dispositivo que maneje el estantar GPIB.

También podría gustarte