c. suÁrez - 148.206.53.231

59
UNIVERSIDAD AUTONOMA METROPOLITANA Unidad Iztapalapa ING. ELECTR~NICA EN COMPUTACI~N REPORTE DEL PROYECTO TERMINAL: DIGITALIZADOR DE IMÁGENES Y SPOOLER DE IMPRESI~N POR VÍA SLOT Asesores: M. c. AGUST~ SUÁREZ HERNÁNDEZ ING. VÍCTORTÉLLEZ ARRIETA. Realizaron: ANDAPIA M A R T M Z SANTIAGO ALFRED0 GONZÁLEZ AGUILAR CLODOALDO GONZÁLO MOLINA ESPINOSA ISRRAEL VIVEROS REYES ESTEBAN México, D.F. Mayo, 1995

Upload: others

Post on 14-Jul-2022

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: c. SUÁREZ - 148.206.53.231

UNIVERSIDAD AUTONOMA METROPOLITANA

Unidad Iztapalapa

ING. ELECTR~NICA EN COMPUTACI~N

REPORTE DEL PROYECTO TERMINAL:

DIGITALIZADOR DE IMÁGENES Y SPOOLER DE IMPRESI~N POR VÍA SLOT

Asesores:

M. c. A G U S T ~ SUÁREZ HERNÁNDEZ

ING. VÍCTOR TÉLLEZ ARRIETA.

Realizaron:

ANDAPIA MARTMZ SANTIAGO ALFRED0

GONZÁLEZ AGUILAR CLODOALDO GONZÁLO

MOLINA ESPINOSA ISRRAEL

VIVEROS REYES ESTEBAN

México, D.F. Mayo, 1995

Page 2: c. SUÁREZ - 148.206.53.231

UNIVERSIDAD AUTONOMA METROPOLITANA

Unidad Iztapalapa

I N D I C E

. PROPOSITO DEL PROYECTO

. MODULO CARGADOR Y ADMINISTRADOR DE TAREAS (CAT)

. MODULO MANEJADOR DE SERVICIOS DE LA TARJETA (MST)

. DESCRIPCION DEL PROYECTO Y LA INTERFAZ TARJETA-PC

. ARQUITECTURA DEL PROYECTO

Decodificación del Slot

Circuito de Decodificación

Almacenamiento de los Datos

Circuito de Requerimiento de Interrupción

Sistema Minimo para la Tarjeta

Arquitectura del Sistema

Sistema de Refresco

Programación del Sistema

Programación de la Memoria

Programación de Perifericos

Programación del Timer

Programación del DMA

Programación del Controlador de Interrupciones

Interfaz Paralela (Sistema Minimo-Impresora)

Transferencia de Datos por Hanshake

Interfaz Paralela con la Impresora

. CASO DE USO

Spooler de Impresión

Ambiente de Programación

Directorios de Trabajo

Opcion de Compilación

Codigo Fuente de Spooler

Digitalizador de Imágenes

Introducción del Digitalizador

Page 3: c. SUÁREZ - 148.206.53.231

Desarrollo

Diseño de la Parte Analógica

Etapa de Acople de Impedancias, Primera Amplificación y Filtrado

Separador de Pulsos de Sincronización de la Señal Compuesta

Muestre0 y Retención para Fijar la Señal Compuesta

Fijación de Nivel y Amplificación Final de la Señal Compuesta

Diseño Digital

Generador de Pulsos de Reloj

Control Principal de la Tarjeta

Generador de Direcciones

Subsistema de Memoria

Convertidor Analógico-Digital

Programación de la Tarjeta

Page 4: c. SUÁREZ - 148.206.53.231

PROPóSITO DEL PROYECTO.

En el uso de un sistema de computación personal todos los programas que se ejecutan

en ella utilizan de forma exclusiva en algún momento a la unidad central de proceso (CPU), aun

cuando el sistema operativo que se este usando ofrezca características de multitarea o

multiprogramación (P.e. Windows, OS/2, o alguna versión de UNlX para PC) un hilo de

ejecución (thread) de algún proceso ocupará por completo al CPU. En algunos casos cuando se

requiere realizar procesos que necesiten la mayor parte de los recursos del sistema (memoria y

tiempo de CPU principalmente), la computadora queda bloqueada para realizar otro tipo de

tareas. Debido a este problema nosotros planteamos la alternativa de agregar uno o mas

procesadores al sistema y realizar un conjunto de programas que manejaran este acoplamiento.

Nuestra propuesta consiste en agregar a una computadora personal de bus ISA una

tarjeta que contiene un procesador intel 80188 con bus independiente y provisto de su propia

memoria. La tarjeta contiene también un módulo de interfaz (vía interrupciones y DMA) para

soportar el flujo de información entre la PC y la tarjeta. Por la parte del software se consideraron

dos grandes módulos:

Módulo Cargador y Administrador de Tareas (CAT)

Consiste en el programa principal y el conjunto de rutinas encargadas de enviar y

responder mensajes de la tarjeta. Como ya se había mencionado antes, los módulos de software

que se encargan de manejar tanto a la tarjeta como a la PC, representan la ventaja de este

proyecto.

En la siguiente figura se muestra un diagrama de bloques del Cargador y

Administrador de Tareas (CAT):

Inbcrhz EvcntrDrlvcn I

Tarjeta

I

Page 5: c. SUÁREZ - 148.206.53.231

Este componente se encarga de realizar el diálogo entre el usuario vía lnterfaz Event-

Driven, permitiéndole cargar programas o realizar interacción con algún programa en ejecución

(típicamente respuesta de solicitud de entradas por teclado o mouse). Para controlar el flujo de

información de la tarjeta a la PC se dispone de un mecanismo de atención a interrupciones, ya

que cada vez que la tarjeta necesita enviar un mensaje a la PC se genera una interrupción. Este

mecanismo esta constituido por un objeto Controlador de lnterfaz que colecta los mensajes

obtenidos de la tarjeta usando una rutina ISR (Interrupf Service Roufine) y los almacena en un

objeto Buffer de Interfaz, que representa el medio de almacenamiento para mensajes aun no

procesados, adicionalmente existe un objeto Controlador de Buffer que recupera toda la

información del objeto Buffer para llevarlo al objeto Principal que se encarga de "decodificar" la

información y despacharla al dispositivo de E/S que corresponda (monitor, puerto serie, escritura

de archivos, etc ...). Cabe señalar que este componente fue construido en su totalidad en el

lenguaje de programación C++, usando el Framework TurboVision de Borland porque permite

un rápido desarrollo y una interfaz al usuario (look and feel) con muy buena apariencia.

Módulo Manejador de Servicios de la Tarjeta (MST)

Representa al núcleo de la tarjeta, provee a todo programa que se ejecute en ella un

conjunto de servicios como son: asignación y manejo de memoria, enmascaramiento de

interrupciones, rutinas de planeación de ejecución de programas para el caso de que se

encuentren en ejecución mas de un proceso, E/S para la interfaz Tarjeta-PC y finalmente un

conjunto de funciones que permiten transportar programas escritos para el sistema operativo

DOS a la tarjeta, con sólo recompilar el código. El sistema proporciona también la capacidad

para ejecutar mas de un programa en la tarjeta, mediante un planificador de tareas que forma

parte del núcleo de ella. En esta figura se muestra el componente Manejador de Servicios de la

Tarjeta (MST):

I '

run-time para Droaramas

I Buffer colector de mensajes

Page 6: c. SUÁREZ - 148.206.53.231

Como en el componente anterior la interfaz de entrada al núcleo de la tarjeta se realiza

a través de una rutina de atención a interrupción (ISR), que en este caso es representada por el

objeto ISR de interfaz el cual contiene un Buffer Colector de Mensajes para almacenar los

datos colectados por la tarjeta (mensajes que envía la PC) que no puedan ser atendidos

inmediatamente por el núcleo. El núcleo de la tarjeta ha sido mostrado como un solo módulo u

objeto por simplicidad, pero se debe señalar que éste esta compuesto por otros módulos para

soportar comunicación interprocesos (IPC), planificación de procesos y rutinas para realizar

comunicación serial o paralela. El componente MST también provee un conjunto de rutinas para

mantener compatibilidad entre programas escritos para el sistema operativo MS-DOS, haciendo

que un programa corra en la tarjeta con sólo recompilar el código fuente del programa, esta

librería equivale en otros sistemas como UNlX a la biblioteca de streams de entrada y salida

estándar (típicamente <stdio.h>), como ya se ha mencionado antes: si alguna persona lo desea

puede mejorar, robustecer o ampliar las librerías de run time provistas para así adecuadas a sus

necesidades. Para entender mejor este módulo recomendamos leer el código fuente.

Con esta configuración, la PC puede ahora ejecutar procesos como adquisición de

señales, comunicación, ejecución de programas con algoritmos de alta complejidad temporal y

otros que antes requerían casi todos los recursos de la máquina, mediante la carga del

programa o bloque de código que se necesite ejecutar en la tarjeta, quitándole así carga de

trabajo a la computadora personal. En este proyecto se realizan dos casos de uso para

demostrar lo anterior: un Digitalizador de Imágenes y un manejador de impresión (Spooler).

Con el fin de poder ejecutar también procesos interactivos con el usuario, la forma de

comunicación entre la tarjeta y la PC se basa en mensajes que identifican de forma única el

acceso a diferentes tipos de servicios que no están disponibles (por razones obvias) en la tarjeta

como son: desplegado al monitor, entradas por teclado o mouse y diversos tipos de E/S disponibles en la PC. En otras palabras es posible escribir un programa para la tarjeta que

pueda desplegar información al monitor y realizar entradas a través del mouse o teclado usando

las funciones de interfaz provistas en el núcleo y aprovechando los recursos de la misma PC.

DESCRIPCIóN DEL PROYECTO Y LA INTERFAZ TARJETA-PC.

La base de la interfaz lógica Tarjeta-PC del sistema consiste en un conjunto de

mensajes, cada uno de los cuales representa una acción a realizar, y que son interpretados ya

sea en la tarjeta o en la PC por un componente conducido por eventos (evenf-driven) incluido en

el código de sus respectivos programas manejadores. Es posible clasificar a estos mensajes

Page 7: c. SUÁREZ - 148.206.53.231

entre los que hacen llamados a servicios de la tarjeta y los que hacen llamados a servicios de la

PC, se les puede distinguir por los prefijos SMT y SMP respectivamente. Típicamente un

mensaje contiene dos parámetros que completan la especificación de la operación a realizar,

por ejemplo el mensaje SMT-PUTCHAR en su primer parámetro contiene el caracter a imprimir

en el monitor, y el segundo parámetro es nulo (no se toma en cuenta). Una descripción de los

mensajes soportados actualmente se muestra a continuación:

Mensajes de la tarjeta a la PC:

SMP-PUTCHAR SMP-GETCHAR SMP-PUTSTR SMP-GETSTR SMP-STATUS SMP-ERROR SMP-PROGEND SMP-PRNEMU

Ox0 /* SMP-PUTCHAR, CHAR, O */ 0x1 /* SMP-GETCHAR, O, O */ 0x2 /* SMP-PUTSTR, SIZE, O */ 0x3 /* SMP-GETSTR, O, O */ 0x5 /* SMP-STATUS, HSTATUS, LSTATUS */ 0x6 /* SMP-ERROR, HERR, LERR */ 0x7 /* SMP-PROGEND, O, O */ 0x8 /* SMP-PRNEMU, HSIZEFILE, LSlZEFlLE */

Mensajes de la PC a la Tarjeta:

SMT-LOADFILE Ox10 /* SMT-LOADFILE, HFILESIZE, LFlLESlZE */ SMT-LOADPROG 0x1 1 /* SMT-LOADPROG, HFILESIZE, LFlLESlZE */ SMT-KILLPROC 0x12 /* SMT-KILLPROC, IDPROC, O */ SMT-GETSTATUS 0x1 3 /* SMT-GETSTATUS , O, O */ SMT-ACK 0x14 /* SMT-ACK, O, O */ SMT-RUN 0x15 /* SMT-RUN , IDPROC, O */ SMT-GETCHARACK 0x16 /* SMT-GETCHARACK, CHAR, O */ SMT-GETSRACK 0x17 /* SMT-GETS, SIZE, O */

Como puede observarse, no representa ningún trabajo especificar nuevos mensajes

para las operaciones no soportadas actualmente. A partir de los mensajes descritos

anteriormente o de sus extensiones se logra la independencia del código para tiempo de

ejecución en un programa escrito en lenguaje C, permitiendo así que se ejecute tanto en la PC

como en la Tarjeta sin importar que servicios de E/S estén disponibles en su ambiente de

ejecución. En otra sección de este reporte se incluyen ejemplos de lo anterior.

ARQUITECTURA DEL PROYECTO.

El propósito de este punto es describir cómo está diseñada la interfaz entre la tarjeta y

la PC tanto en hardware como en software. Comenzamos discutiendo la arquitectura del

proyecto a nivel de hardware:

Page 8: c. SUÁREZ - 148.206.53.231

Decodificación del SLOT. Existen dos maneras de hacer la decodificación: decodificación como dispositivo de

entrada-salida o decodificación como un dispositivo de memoria. Manejando una decodificación

de entrada-salida se consideraron las direcciones de puertos disponibles en una PC, para evitar

conflictos, con otras tarjetas mapeadas igualmente en estas direcciones.

1) OOOOH - OlFFH Mapeo de direcciones internas.

2) 0200H - 03FFH Mapeo de direcciones externas (Tarjetas en el Slot)

0201 H I NO USADO ADAPTADOR DE CONTROL DE JUEGOS

NO USADO ADAPTADOR DE 20. PTO. IMPRESORA

NO USADO ADAPTADOR DE 2 0 . PTO. SERIAL

NO USADO ADAPTADOR DE PTO. DE IMPRESORA

NO USADO ADAPTADOR MONOCROMATICO

NO USADO ADAPTADOR COLOFUGRAFICOS

NO USADO

ADAPTADOR DE DRIVE ADAPTADOR DE PTO. SERIAL

Como se habrá observado, en el rango de direcciones que ofrece un sistema PC, sólo

disponemos de 10 direcciones para mapear cualquier dispositivo de I/O.

La decodificación consiste en un circuito que mapea la tarjeta (sistema mínimo 801 88)

como puerto VO, se encarga además de evitar el conflicto del bus independiente del sistema

mínimo de la tarjeta, con el bus del Slot de la PC . Consta de:

1) Circuito de Decodificación. Decodifica el bus de direcciones del Slot de la PC. En

un mapeo de dispositivo de entrada-salida sólo se usan los 10 bits mas bajos en el campo de

direcciones (AO-A9). Es importante hacer notar que el bit 9 del bus de direcciones tiene una

función especial. Cuando está activo indica que se está direccionando un puerto I/O externo,

Page 9: c. SUÁREZ - 148.206.53.231

por Io que se habilita el bus de datos en la PC; cuando está inactivo, se inhabilitan los datos en

el Slot, por lo que sólo se puede direccionar a puertos internos, propios de la tarjeta madre.

Se emplean además de las direcciones, IOWR‘, IORD’ y AEN’ que son señales del

Slot. AEN’ (habilitación de direcciones) es usado para asegurar la decodificación del puerto,

esto es necesario para prevenir una decodificación de puerto inválida, durante los ciclos de DMA

(en los ciclos de DMA, pueden estar activas las señales IORD’e IOWR‘).

Es importante hacer notar que el bit A0 no se usa en la decodificación, para simplificar

el circuito. Con la decodificación, se mapearon dos puertos para la tarjeta: un puerto de escritura

en la dirección 0318H, y un puerto de lectura en la dirección 031AH.

La base del circuito de decodificación, está en el integrado 74LS138 (decodificador), y

el diseño digital hecho a base de compuertas NAND Y OR. De acuerdo a esta lógica se tienen

las siguientes direcciones disponibles para la tarjeta y cualquier sistema, que desea ser

mapeado:

SALIDA DEL DECODIFICADOR( YO-Y7) RANGO MAPEADO

(lógica negada)

YO ................................................................... 300..301..308..309..310..311

Y1 ................................................................... 302..303..30A..30B..312..313

Y2 ................................................................... 304..305.,30C..30D..314..315

Y3 ................................................................... 306..307..30E..30F..316..317

Y4 ................................................................... 318..319

Y5 ................................................................... 31A..31B

Y6 ................................................................... 31C..31D

Y7 ................................................................... 31E..31F

2) Almacenamiento de los datos. Mediante un latch-buffer (74LS245, 74LS373), se

habilita el bus de datos de la tarjeta, empleando las decodificación del puerto de escritura. De la

misma manera empleando un latch, se hacen disponibles los datos en el Slot, cuando se

direcciona a el puerto de salida a la PC.

Page 10: c. SUÁREZ - 148.206.53.231

MAO-MA7

slot PC

[LOGICA T T L ] DECODIF. DE DIRECCIONES

I tlOYW +

LE

LATCH DE SAL. DllT05 HllCIll EL HlCRO

DIRECC. T I

1 5

PCSO(DE LATARJ.)

RG'[DELMICRO) -

I O R U 011TOS BEL MICRO

LATCH DE EM. DATOS LE

PCSO(DELATLRJ.1

WK(DELATARJ.1

5Y. CK

- RV[DE LA TARJ.] PCSWIDE LATARJ.]

lW1 DEL MICRO

e

Usando la señal Y4 y IOWR'del Slot se habilita el latch de salida para que almacene

los datos, que están disponibles en el Slot en ese momento. Ya almacenados, pueden ser leídos

por el microprocesador de la tarjeta ( se habilita el OE' del lacth de salida enviando las señales

del microprocesador PCSO'y RD'). De la misma manera, para escribir datos de la tarjeta hacia

el Slot, se envían las señales PCSO'y WR' habilitando el LE del latch de entrada. Haciendo una

lectura del Slot en la dirección mapeada, se envían las señales Y5 y IORD'del Slot, habilitando

el latch. Cabe mencionar que el latch tiene buffer de salida, por Io que los datos se envían

directamente hacia el Slot, sin tener conflicto de bus.

3) Circuito de requerimiento de interrupción. Debido a que siempre estará

ejecutando algún proceso, es necesario diseñar un circuito de requerimiento de interrupción,

para indicar que hay datos disponibles en el buffer de entrada. Este circuito envía una señal de

interrupción al procesador, leyendo éste el dato y enviando un reconocimiento de interrupción.

Emplea la dirección del puerto 0318H y la señal IOWR' del Slot para enviar el requerimiento y

la señales PCSO y RD' (del procesador), para restablecer al flip-flop.

Hay que aclarar que los datos se leen del Slot por interrupciones hacia el

microprocesador de la tarjeta. Por Io que cualquier aplicación que envía datos, hacia la tarjeta

deberá de esperar un tiempo razonable antes de enviar el próximo dato.

Page 11: c. SUÁREZ - 148.206.53.231

Sistema Mínimo para la Tarjeta.

Sistema basado en la arquitectura del 80188. El 80188 es un procesador de alta integración de 8

bits, con código compatible con el 8086, 8088 . Esta familia contiene el mismo conjunto básico

de registros, instrucciones y modos de direccionamiento. Debido a esta compatibilidad, el código

generado para el 8088 en lenguaje "C" para una PC, es código que puede ejecutar el 80188.

Arquitectura del sistema. Se asume que el lector, está familiarizado con el

funcionamiento del procesador, y que de alguna manera, ha programado el sistema en el

lenguaje ensamblador, por Io que sólo mencionaremos, los detalles básicos del sistema.

I direcciones datos Memoria Eprom

Hacia el Slot.

I I I I

LACTH BUFFERS ,.. I

rd' I ' cs

ir

RETARDO DECQDIFIC.

I ras cas' I I

Este esquema muestra la configuración en hardware del sistema mínimo. Como se

observa, se tienen dos tipos de memorias: La memoria estática ( que contiene el código de

inicialización de programa) y una dinámica (con refresco de memoria usando DMA). El sistema

de refresco de la DRAM consta de un circuito de retardo y el decodificador de direcciones.

Sistema de Refresco. En este se tiene un sistema de retardo de las señales entre

RAS'y CAS' y el decodificador de direcciones.

Page 12: c. SUÁREZ - 148.206.53.231

Programación del sistema. La programación se hizo en el lenguaje "C" generando

código para el 8088. Dentro del esquema de la PC, la programación, está basada en la RAM,

manejando dentro de este ambiente, el stack. En un sistema como la tarjeta, inicialmente, el

código no se encuentra en la RAM, si no en la EPROM, por Io que el código de inicialización

tendrá que estar en ensamblador. Este código, después de hacer la inicialización, hará una

transferencia del resto de código a la DRAM, haciendo después una llamada al main (void ) de

"C". Debido a la llamada al main(void), éste código de inicialización en ensamblador debe estar

en el mismo segmento de código que el código en C, para poder ligarlo después. En resumen,

se cargará en la EPROM, un solo código de programa (.EXE), código que resulta de ligar el

código en ensamblador (inicialización) con el código en C. Para nuestro caso este código (.EXE)

lo llamamos Módulo Cargador y Administrador de Tareas (CAT), que inicializa y prepara la

tarjeta para la transferencia de datos con la PC.

Dentro de la arquitectura, es necesario programar al sistema, para indicar donde

estarán mapeadas las memorias (Eprom, Dram), los puertos, etc; se programan además el

requerimiento de interrupciones, y DMA (necesario para el refresco de memoria)

Programación de la memoria. EPROM: Se tiene una Eprom de 8 Kbytes, (27C64). Se rnapea en el área de memoria

alta, dado que al inicio el CS:IP apuntan a la dirección absoluta ( CS:IP=FFFFOH), se pone en

esta dirección la programación del UMCS (Registro interno del 80188), mandando la palabra

FE3FH al UMCS, la EPROM es entonces solo direccionable en el rango: FEOOOH - FFFFFH.

(Rango de 8Kb.).

Page 13: c. SUÁREZ - 148.206.53.231

DRAM: En la tarjeta la DRAM está mapeada en el área de memoria baja del sistema;

teniendo una DRAM de 256Kbyte ( TMS44C256-10N ), se manda la palabra de control 03FFFH

a LMCS.

Programación de los periféricos. Para programar los periféricos, se mandan las

palabras de control al registro PACS y MPCS. Enviando la palabra de control 0007H a PACS

se tendrán 7 chip-select mapeados de la siguiente forma, en el espacio de I/O:

Chip Select Mapeo

PCSO' 400H - 47FH Direcciona al puerto del Slot

PCSl ' 480H - 4FFH Direcciona al puerto paralelo

PCS2' 500H - 57FH Direcciona al Display

PCS3' 580H - 5FFH Lo usa el DMA como puerto de salida

PCS4' 600H - 67FH

PCS5' 680H - 6FFH

PCS6' 700H - 77FH

Se envía la palabra de control 08BFH a MPCS, para indicar que los periféricos del

80188 serán 7 mapeados en el I/O, con una tamaño de bloque en el área de memoria media de

32. El rango medio de memoria no se usa aquí, por lo que sólo se accesa a ese registro para

poder accesar a los PCS.

Programación del Timer. Necesario para el refresco de la DRAM. Se programa el

timer 2 a una frecuencia, para cuenta máxima de 15.2 microsegundos (mandando en la

dirección OFF62H, 00016H ) , a una cuenta repetitiva, para activar al DMA (se pone el registro

de control del timer a OCOOl H).

Programacibn de TIMER 2

15 O

'i Palabra de control

Operación continua No aternar Reloj interno No interrumpir Empezar la operación

Page 14: c. SUÁREZ - 148.206.53.231

Programación del DMA. Ya activado el timer se programan los registros del DMA.

Esto es necesario, debido a que el resfresco se hará por éste medio (se usará el canal O del

DMA). Los registros que se programan para activar el canal son:

Dirección (canal O) Palabra de Control

OFFC4H 0580H ;Se programa el apuntador de destino a

;un dispositivo de I/O en PCS3'

OFFCGH OOOOH ;Como es un dispositivo I/O los 4 bits más

;altos son ceros.

OFFCAH 147FH ;Programación del canal cero.

Programación del DMA

Fuente sincronizada

Activar por timer ,- Programar e iniciar

CAH Transf. de palabra

Palabra de control 1 1 I I I Alta prioridad

la cuenta

No interrumpir No parar al terminar

fuente: memoria (inc] destino: 1 1 0 (No inc]

Programación del Controlador de interrupciones de la tarjeta. Se habilitan las

interrupciones (ST1 ), y se programa la interrupción 1, lNTl (OFF3AH), en la más baja prioridad

(0007H). Es claro que la tarjeta estará mapeada en esta interrupción, y enviará esta señal

cuando haya un dato que leer en el buffer del Slot. Antes de habilitar las interrupciones del

procesador, se debe de resetear el bit de requerimiento de interrupción del Slot (haciendo la

lectura del puerto del Slot).

Interfaz Paralela (Sistema mínimo - Impresora).

Ésta interfaz está basada en el C.l. D8255AC - 5, programado en modo 1. Mediante

este modo, el C.I. interrumpirá al procesador cada vez que haya un dato a leer en el puerto. En

seguida se presentan algunos conceptos previos a la configuración del 8255.

Page 15: c. SUÁREZ - 148.206.53.231

Transferencia de Datos por Handshake en Interfaz Paralela. Se envían los datos en

paralelo y se envía la señal STROBE' al procesador. Se detecta la señal STROBE' (por polled

o por interrupciones), y se leen los datos, éste envía una señal de reconocimiento ACK' al

dispositivo periférico indicando que puede enviar el próximo dato. Este tipo de transferencia se

da así, debido a que los dispositivos en comunicación trabajan a diferentes velocidades.

Interfaz paralela con la impresora. La impresora recibe los caracteres a imprimir

almacenándolos en un buffer interno RAM. Ésta transferencia se dá como ya se dijo a través de

HANDSHAKE. Ésta debe indicarle a la computadora que su buffer está lleno, y que no envíe

más caracteres. Usualmente se tienen 36 pines. Éstos 36 pines se dividen en dos categorías:

Señales que se envían a la impresora e indican que operación se va a realizar y señales que

indican su status. Las principales señales de control que se tienen son:

INT': corresponde al pin 31. Indica a la impresora ejecutar una operación de inicialización

interna.

STROBE': corresponde al pin 1 e indica a la impresora que hay un dato a imprimir.

Las principales señales de estado de la impresora son:

ANCKLG': señal del pin 10. Cuando ésta señal está en bajo, indica que el dato a imprimir ha

sido aceptado, y que la impresora está lista para recibir el próximo dato.

BUSY: señal del pin 11. Cuando está en alto, indica que la impresora no está lista, por falta de

papel.

PE: señal del pin 12. Está en alto si el indicador de papel está activo.

SLCT: señal del pin 13 e indica que la impresora está seleccionada para recibir datos.

ERROR': señal del pin 14, que cuando está en bajo indica que hay problemas en las

condiciones de la impresora.

Asumiendo que la impresora ha sido inicializada, se debe de checar la señal BUSY, si

está en bajo indica que la impresora está lista para recibir el dato. Se envían los datos en

paralelo, y después de 0.5 microsegundos se pone la señal STROBE'en bajo para indicarle a la

impresora que el caracter ha sido enviado. La señal STROBE' en bajo causa que la impresora

envíe su señal BUSY en alto. Después de 0.5 microsegundos la señal STROBE puede volver

en alto. Note que los datos deben permanecer validos por lo menos 0.5 microsegundos después

de que la señal STROBE' se pone en alto.

Page 16: c. SUÁREZ - 148.206.53.231

Cuando la impresora se encuentra lista para recibir el próximo caracter, pone su señal

ACKNLG' en bajo, indicando al procesador que puede enviar el próximo caracter.

Con respecto al hardware, se tiene en la interfáz, buffers de colector abierto (74LS07)

que son usados en las lineas de señales y datos, desde el 8255, puesto que las salidas del 8255,

no tienen suficiente corriente de conducción, para cargar y descargar la capacitancia del cable

de conección más rápidamentre. Se usan resistencias de pull-up, en la salida del buffer de

colector abierto.

El puerto B, es usado para la salida de datos, por handshake. El bit PCO, funciona

como salida de requerimiento de interrupción al 80188 (En este sistema, la lectura de los datos

se hace por polling ). La señal de requerimiento de interrupción es conectado al PC2 del 80188.

La señal OBF', no tiene efecto en este tipo de conexión, por Io que el bit PC1 permanece sin

conectar. La señal de entrada de STROBE' de la impresora, se conecta al bit PC4. Esta señal

se generará, por setheset de este pin.

Las señales de estado de la impresora, son conectados al puerto A, por Io que

haciendo una lectura al puerto A, se determina el estado de la impresora.

La señal de entrada a la impresora, INIT', se conecta al pin PC5, por lo que el reset de

la impresora se puede controlar por programa.

La palabra de control de inicialización del 8255, se envía para programar al puerto B

en modo 1 (salida), al puerto A como entrada en modo O y los 4 bits más altos de puerto C

como salida.

D7 D6 D5 Da D3 D2 Dl DO

c Iowcr X

e: MODO I C CIPPER: O U f P.: INPUT

MODO O

D7 D6 0 5 0 4 03 D2 O1 DO

I - rrlo"PowAN I PALABRA DE CONTROL DE SETlRESET

Page 17: c. SUÁREZ - 148.206.53.231

CASO DE USO:

SDooler de Impresión.

El spooler de impresión, forma parte del módulo Manejador de Servicios de la Tarjeta

(MST). Este módulo, compilado y ligado , bajo Turbo C ver. 2.0, se envía a la tarjeta por vía

slot. Previamente, debe de existir el módulo cargador de tareas, con código compilado y ligado

bajo Turbo C ver. 2.0 y cargado en la memoria ROM del sistema.

Ambiente de programación. Se programó en el entorno de programación que ofrece Turbo C, cargando el archivo

de configuración TCSPOOL.TC, que tiene la misma configuración del archivo TCCONFIG.SYS,

con las siguientes modificaciones, para la compilación:

Directorios de Trabajo:

Directorios de archivos include:

Se pondrá el path de los archivos include del spooler. De esta forma se

ignorarán los archivos include de Turbo C y no se podrán usar funciones de la biblioteca de C..

Directorio de la biblioteca de archivos:

Se pondrá el path de los archivos lib del spooler.

Directorio de los archivos de salida:

Los archivos de compilación y ejecución (.EXE y .OBJ) se generarán en el directorio

de salida (\...\...\SALIDA).

Directorios de Turbo C. El directorio donde se encuentre el compilador y ligador de Turbo C.

Opciones de Compilación. Opciones del Ligador:

Modelo de Compilación: Conjunto de Instrucciones: Punto Flotante: Tipo de Caracter por Default: Forma del Stack Standard Prueba de Sobreflujo de Stack: Información para el Debug Segmento de Código: Segmento de Datos: Segmento BSS:

SMALL Archivo Map: Detailed 801 86/80286 Librerías Gráficas: Off Ninguno

Signed Off Off

Off

- TEXT (Class CODE) - TEXT (Class CODE)

- TEXT (Class CODE)

Page 18: c. SUÁREZ - 148.206.53.231

Archivos de Biblioteca del Spooler.

Como ya se dijo, estos se encuentran en el subdirectorio LIB. Contiene el código de

inicialización de la tarjeta y la llamada al main0 de Turbo C. Estos archivos son: cOs.obj y

cs.lib. Aquí se define Io que antes se presentó como módulo Cargador y Administrador de

Tareas (CAT).

Archivo: c0s.asm Contiene el código fuente de c0s.obj. lnicializa la tarjeta y hace la llamada al main@

;******************DEFINE CONSTANTES DE PROGRAMACIóN PARA LA TARJETA********** . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

;Constantes de la programación de los Chip-Select P-UMCS EQU OFE3FH

P-MMCS EQU 009FFH P-PACS EQU 0007FH

P”pCS EQU 080BFH

;Constantes de la programación del DMA “DES EQU 00580H P-DMA EQU 0147FH P-CUEN2 EQU 00016H ;Timer 2 para cuenta max. de 15.2 microseg. P-CROL2 EQU OCOOlH ;Cuenta repetitiva.

;Constantes del Controlador de Interrupciones INT 1 EQU 00007H

;Constantes del 8255 CTL-8255 EQU 0497H

;Dirección del Display P-DISPL EQU 0515H ;Manda el mensaje por el puerto b del 8255

- TEXT segment byte public ‘CODE’ ; Mismo segmento que el código generado en C assume cs:-TEXT; ds:-TEXT; ss:-TEXT ORG OOOOH ; Rutina principal

. * * * * * * * * X * Programa Periféricos Internos del Sistema

;Programación de LMCS para DRAM de 256Kb mov ax, P-LMCS mov dx, OFFA2H out dx, ax

;Programación del PACS mov ax, P-PACS mov dx, OFFA4H out dx, ax

Page 19: c. SUÁREZ - 148.206.53.231

;Programación del h4PCS mov ax, P-MPCS mov dx, OFFA8H out dx, ax

;Programación del DMA canal O (REFRESCO DRAM) ACTIVADA POR TIMER) mov dx, OFFC4H ;Programación del ap-destino( 16 bits lower) mov ax,@-DES out dx, ax add dx, 2 ;Programación del ap-destino(4 bits upper) xor ax, ax out dx, ax mov dx, OFFCAH ;Direcciona DMA canal O mov ax, P-DMA out dx, ax mov ax, P-CUEN2 ;Programación del timer 2 para activar al DMA mov dx, OFF62H out dx, ax mov ax, P-CROL2 ;Se manda la palabra de control al timer2 mov dx, OFF66H out dx. ax

;Programación de registros para el controlador de ints. mov dx, OmaH mov ax, INTl out dx, ax

. * * * X * * * * * * , Programa Perifericos Externos del Sistema

;Inicializa DISPLAY mov dx, P-DISPL mov al, OOH out dx, al

;Programa al 8255 mov dx, CTL-8255 mov al, 1OOlOlOOB out dx, al

;Resetea bit de requerimiento de interrupción DEL 8255 (HACIA EL SLOT) mov al, O001 1 1Ob ; Pone el bit PC7 en cero; mov dx, CTL-8255; out dx, al;

;inicializa el requerimiento de interrupción del SLOT mov dx, 04 1 OH in al, dx ;Acciona el PCSO y el RD los cuales reestablecen los bits xor ax. ax

. n n * * n n n * * * 3 Rutina de Chequeo de la Ram Dinámica

;Direcciona mensaje mov dx, PDISPL xor ax, ax mov ds, ax

;Direcciona del dus de datos al puerto A

;Pone a DS en OOH

;Escribe 'AC' en la DRAM

inicio:

Page 20: c. SUÁREZ - 148.206.53.231

xor di, di mov cx, Offffh

mov byte ptr ds:[di], OACH inc di loop repw mov ax, ds cmp ah, 30H

add ah, 10H mov ds, ax jmp inicio

repw:

jz sal-1

;Lee código escrito de la DRAM sal-1 :

xor mov

sal-x: xor mov

rep-r: mov xor

inc jm

loop mov CmP

add mov

jz

jmp

ax, ax ds, ax

si, si cx, O f f f l h

al, byte ptr ds:[si] al, OACH error si reP-r ax, ds ah, 30II salida ah, 1 OH ds,ax sal-x

;Escribe resultado error:

mov al, OF9H out dx, al mov al, 03H mov dx, PSlot out dx, al

paro: jmp paro salida:

mov al, OF7H out dx, al mov dx, PSlot mov al, 30H mov dx, PSlot out dx, al rnov ah,07H

mov bx, OFFFFH

dec bx cmp bx, OOOOH jnz retardo-d dec ah cmp ah, OOH J ~ Z ret-dl

ret-dl :

retardo-d:

;Pone a DS en OOH

;Limpia el registro Si

;Si por algun momento ocurrió un error ;Manda el mensaje de error ('E')

;Manda código de error al Slot

;Interrumpir el programa y parar

;Visualiza una A si el estado esta bien ;Escribe 'A'

;Manda OK al slot

;Ciclo de espera antes de mandar por el display otra cosa

;Se realizó el chequeo de la DRAM (se visualiza una A o una E en el display ;Se pueden usar todos los registros generales

xor ax, ax

Page 21: c. SUÁREZ - 148.206.53.231

mov ds, ax ;Limpia la DRAM limpiaO:

mov cx, OFFFFH mov di, OOOOH

mov byte pTR ds:[di], OOH inc di loop limpia mov ax, ds cmp ah, 30H

add ah, 1OH mov ds, ax jmp limpia0

limpia:

jz SHADOW

; Iniciliza el segmento de datos a OOOOH

. * * * * * X * * * * I Shadow de Codigo a la DRAM e Inicialización de segmentos

;Inicialización de Segmentos SHADOW:

rnov ax, 40H mov es, ax mov ax, OFEOOH mov ds, ax xor di, di xor si, si mov cx, 20OOH

mov a1,byte ptr ds:[di] mov byte ptr es:[si],al inc si inc di loop load

mov ax, 004OH mov ds, ax mov es, ax mov ax, 024OH mov SS, ax mov ax, 7FFH mov sp, ax mov bp, sp

load:

;Inicialización General y de Segmentos

;Salto largo para la ejecución en DRAM

DB OEAH DW OlOFH DW 004OH

; ES=004OH

; DS=FEOOH

; Carga 8Kb

; Codigo inicia en 04OOH ; DS=04OOH ; ES=O4OOH ; 9Kb despues ; SS=024OH

; SPz7FFH 2Kb Reservados para pila ; SP=BP Al iniciar

; Define JMP FE0O:OOOO ; IP=O 1 OFH ; CS=0040H

;Bloque Principal de Inicialización call near ptr -main

INFINIT0:JMP INFINITO

;Las siguientes rutinas están en el mismo código, como funciones internas del sistema, y que se ;ejecutan haciendo una llamada a éstas funciones (llamadas al sistema) desde el ambiente de ;programación de Turbo C.

Page 22: c. SUÁREZ - 148.206.53.231
Page 23: c. SUÁREZ - 148.206.53.231

mov bP,sP mov dxSbp+41 in a1,dx

ret POP bP

- inbyte endp

. * ***** X * * * * * * * * * * * * * * X X * . . . * * I * * . * I * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ~ ~ * * * * * * ~ ~ * * * , ; * PROTOTIPO : void EOI(void); , Fin de Interrupción no especifica.

- EO1 proc near . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

mov dx,OFF22H mov ax,08000H out dx,ax sti ret

- EO1 endp

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . , ; * PROTOTIPO : void disable(void);

deshabilita interrupciones de hardware. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . * - disable proc near

cli ret

- disable endp

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . I

; * PROTOTIPO : void enable(void); , habilita interrupciones de hardware. . * . * ~ * * * a * * * * * * * * * * * * * * * * * * * * * * * * * * * * n * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * , - enable proc near

sti ret

- enable endp

. * * * * * * * * * * * * * * * * X X * * * * I * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ~ ~ * * ~ * * * * * * * * * * * * ~ , ; * PROTOTIPO : void setRegs(void);

Garantiza que CS=DS=ES=040H. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

- setRegs proc near mov ax,040H mov ds,ax mov es,ax ret

- setRegs endp

. * * * * * * * * * * * * x * * x * * x * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * n * * * * * * * , ; * PROTOTIPO : void ejecuta(void); I Ejecuta un proceso desde la dirección: 02CO:OOOO. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . - ejecuta proc near

db OEAH ; Define Jh4P 02CO:OOOO dw OOOOH dw 02COH

- ejecuta endp

;Se hacen disponibles estas funciones a cualquier programa que las necesite.

Page 24: c. SUÁREZ - 148.206.53.231

public public public public public public public public public public

extrn extrn

-TEXT end

- enable - disable - EO1 - maskint - delay - outbyte - outword - inbyte - setRegs - ejecuta

- main : near - saltoinic : near ends

Page 25: c. SUÁREZ - 148.206.53.231

Archivo: cs.asm

Contiene el código fuente de cs.lib. Hace el salto inicial para la ejecución del programa en la dirección de la ROM. El código se encuentra en el mismo segmento de COs.asm,y el so188.c compilado en modelo de compilación small ( Los segmentos de datos, código y stack comparten el mismo segmento).

- TEXT segment byte COMMON 'CODE' assume cs:-TEXT; ds:-TEXT; SS:-TEXT ORG O 1 FFOH ; Programando el salto

public -saltoinic - saltoinic proc near

CLI ; Deshabilita interrupciones MOV AX,OFE3FH ; 8Kb con 3 estados de espera MOV DX,OFFAOH ; Programando reg. UMCS OUT DX,AX DB OEAH ; Define JMP FE00:OOOO DW OOOOH DW OFEOOH DB 3 DUP (OFFH)

- saltoinic endp TEXT ends

END

Page 26: c. SUÁREZ - 148.206.53.231

Archivos INCLUDE del Spooler.

Se encuentran en el subdirectorio INCLUDE. Se tienen los archivos varsl88.h, desf188.h. defs188.h define las constantes generales del so188.c y cOs.asm. Se definen las direcciones de memoria y de entradakalida de los puertos internos y externos del sistema mínimo, las constantes del spooler de impresión, y el prototipo de las funciones usadas en el sistema.

I* * DEFS188.H : Definiciones de constantes simbólicas usadas por las * funciones básicas de entradas y salidas. * *I

#ifndef -DEFS188-H #define -DEFS 188-H

/*******************Constantes Para Uso del 80188*/ I* * Programación de los Chip Selects. *I

#define P-UMCS OxOFE3F #define PLMCS Ox03FFF #define P-MPCS Ox080BF #define P-h4MCS 0x009FF #define P-PACS Ox0007F

I* * Programación del DMA. *I

#define A I D E S 0x00580 #define P-DMA Ox0 147F #define P-CLJEN2 Ox000 16 #define P-CROL2 oxocool

I* Timer 2 para cuenta max. de 15.2 microseg.*/ I* Cuenta repetitiva. *I

I* * Controlador de interrupciones. *I

#define INTl 0x00007

/ x * * * * * * * * * * * * * * Constantes Para Periféricos Conectados en la Tarjeta*/ I* * Puerto paralelo programable 8255 *I

#define A-8255 0x0490 #define B-8255 0x0495 #define C-8255 0x0496 #define Cm-8255 0x0497

I* * Display de cristal liquido. *I

#define P-DISPL 0x05 15 I* Dirección de interfaz *I

Page 27: c. SUÁREZ - 148.206.53.231

I* * Dirección de interfaz con el slot de la PC *I

#define PSlot 0x04 1 O

I* * * * * * * * * * * ***"Constantes del Núcleo*/ I* * Constantes para el Cargador de procesos. *I

#define LOAD-ADDRESS 0x02C00000 #define TCARGA-PROC 0x05 I* Carga un programa para ejecución en la tarjeta *I

I* * Modos de operación *I

#define M-CARGAPROG O #define M-CARGAARCH 1 #define "CORRER 2

I* * Mensajes de la Tarjeta a la PC *I

#define SMP-PUTCHAR Ox0 #define SMP-GETCHAR 0x1 #define SMP-PUTSTR O x 2 #define SMP-GETSTR 0x3 #define SMP-STATUS 0x5 #define SMP-ERROR 0x6 #define SMP-PROGEND 0x7 #define SMEPRNEMU 0x8

I* * Mensajes de la PC a la Tarjeta *I #define SMT-LOADFILE Ox10 #define SMTLOADPROG 0x1 1 #define SMT-KLLPROC 0x12 #define SMT-GETSTATUS 0x1 3 #define SMTACK 0x14 #define SMT-RUN 0x1 5 #define SMTGETCHARACK Ox16 #define SMT-GETSRACK 0x17

I* * Tipos Usados en el sistema. *I

#define BYTE unsigned char #define WORD unsigned

/* SMPPUTCHAR, CHAR, O *I I* SMP-GETCHAR, O, O *I I* SMP-PUTSTR, SIZE, O *I I* SMP-GETSTR, O, O *I I* SMP-STATUS, HSTATUS, LSTATUS *I I* SMP-ERROR, HERR, LERR *I I* SMPPROGEND, O, O *I I* SMP-PRNEMU, HSIZEFILE, LSIZEFILE *I

I* SMT LOADFILE, HFILESIZE, LFILESIZE */

I* SMT-KILLPROC, IDPROC, O *I I* SMT-GETSTATUS , O, O *I I* SMT-ACK, O, O *I I* SMT-RUN , IDPROC, O *I I* SMT-GETCHARACK, CHAR, O *I I* SMTGETS, SIZE, O *I

/* SMT~LOADPROG, HFILESIZE, LFILESIZE *I

/* * Buffer del sistema. *I

#define SIZEBUF'F Ox200

Page 28: c. SUÁREZ - 148.206.53.231

/*****I Constantes del Spooler de Impresión. */

#define M C O L A OxOF #define Arch1 0x06 16 #define Arch0 0x06 18 #define FIN 0x06 1 A #define Status ox00 #define InicLptx oxo 1 #define Printer 0x02

I* * Transmisión, Recepción * I

#define RECEPCION Ox061B #define ACK OxOF #define EOF OxOFF

/ x * * * * * * * * * * * * Definición de Prototipos*/ extern void outbyte(W0RD port, BYTE byte); extern void outword(W0RD port, WORD word); extern BYTE inbyte(W0RD port); extern void EOI(void); extern void disable(void); extern void enable(void); extern int delay(int count); extern void setRegs( void); extern void ejecuta(void);

void EnableCard(void); void interrupt capdat(void); void EnableTmrl(void); void interrupt printChar(void); void outi(BYTE byte); void MandaMensaje(BYTE MSG-ID, BYTE HParam, BYTE LParam); void EnableLptx(void); void OutChar(BYTE caracter);

BYTE Status(void); BYTE daFrente(void); BYTE getByteOn(void); #endif/* -DEFS188-H * I

Page 29: c. SUÁREZ - 148.206.53.231

Archivo: vars188.h . Se definen las constantes del sistema, como las direcciones de memoria (En la Tarjeta) donde se cargarán los archivos (programas), transmitidos a la misma por vía Slot. Se hace referencia a al archivo Desf188.h.

#include <defs188.h> /********I Definicion de las Direcciones de Ejecución de Programas, Cargados por vía Slot*/

BYTE far *DirCargaProg = (BYTE far *)LOAD_ADDRESS; /* 02c0:0000 *I BYTE far *DirCargaArch = (BYTE far *)Ox12COOOOO; /* 12c0:0000 */ BYTE far *DirSpooler = (BYTE far *)Ox12COOOOO; I* 12c0:0000 */ WORD TamArchivo; WORD TAM;

I * * * * * X * * * * * * * X * * Tabla de codificacion a 7 segmentos . . . . . . . . . . . . . . . . . . . . I BYTE Tabla[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x77

,Ox7f,Ox39,Ox3f,Ox79,Ox69}; /* Para la salida al Dsiplay de 7 segmentos*/

I* * * * * * * * * * * * * **Variables Globales del Buffer del Sistema * * * * * * * * * * I BYTE Buffer[SIZEBUFF]; I* Buffer del Sistema */ WORD Frente; WORD Cola.

I * ************* Estructura para Instalar El Vector de Interrupciones* * * * * * * * * * I typedef struct {

int *p; 1 D E ;

Page 30: c. SUÁREZ - 148.206.53.231

Archivo: defs188.c. Contiene las funciones en el lenguaje C. Se tienen dos Subrutinas de Atención de Interrupción (ISR): Una para atender las interrupciones del Slot de la PC (datos enviados hacia la tarjeta) y otra para atender las interrupciones del Timer 1, que se programa para sincronizar los envíos de datos hacia la impresora, checando previamente su Status (si está lista o no para recibir el siguiente caracter).

Programa:

#include <defs188.h> #include <vars188.h>

/* * * * * * * * * * * * * * * * * * * * Enablecard : Habilita la tarjeta para establecer la comunicación */

void EnableCard(void) { I* con la PC. *I

DIR far *ptr=(DIR far *)Ox34; DIR far *CS=(DIR far *)Ox36; ptr->p=(int *)capdat; CS->p=(int *)Ox40; outword(OxFF3A, 3); /* INTl Vector Interno */ Frente=Cola=O; enable();

1 /** * * * * * * * * * * * * * * * * * * EnableTmrl : Habilita el timer 1 para disparar el spooler */ void EnableTmrl (void) {

DIR far *ptr=(DIR far *)Ox48; DIR far *CS=(DIR far *)Ox4A; ptr->p=(int *)printchar; CS->p=(int *)Ox40; outword(OxFFSA, OxFF); outword(OxFFSE, OxEOO1); outword(OxFF32,7); /* Habilita interrupción de tmr, con la mas baja prior. */ enable();

1 . . . . . . . . . . . . . . . . . . . . . capdat : Rutina de atención a interrupción para la interfaz *I

void interrupt capdat(void) { BYTE codigo; /* no inicializar ninguna variable antes */ setRegs(); /* antes de llamar a setRegs() */ codigo=inbyte(PSlot); Buffer[Cola]=codigo; Cola++; Cola&=OxlFF; E W ;

1 I * * * * * * * * * * * * * * * * * * * * printchar : Rutina de atención a interrupción para el timer 1 */ void interrupt printChar(void) { BYTE caracter; /* No inicializar ninguna variable antes */ setRegs(); /* antes de llamar a setRegs() */ if(Status()==4) {

if(TamArchiv0) { caracter=*DirSpooler; outi(caracter); /* Mensaje de impresión en condiciones normales*/ OutChar(caracter); DirSpoolertt; TamArchivo";

1 else { if(SpoolCola!=SpoolFrente) { TamArchivo=SpoolBuffer[SpoolFrente]; SpoolFrentet+,

Page 31: c. SUÁREZ - 148.206.53.231

SpoolFrente&=OxF; 3

else { outbyte(OxFFSE, 0x6001); /* Deshabilita timer y manda mensaje a la PC de fin de emulación */ MandaMensaje(SMF'-PROGEND, O, O); outbyte(PDISPL,OX02); /* Mensaje de Deshabilitación del Timer*/

3 I

I E o n

3 I* * * * * * * * * * * * * * * * * * * * daFrente: Regresa el frente del buffer. BYTE daFrente(void) {

BYTE info; info = Buffer[Frente]; Frente++; Frente&=Oxl FF; return info;

*I

I . . . . . . . . . . . . . . . . . . . . . getByteOn: Regresa el frente del buffer, esperando si esta vacio *I

BYTE getByteOn (void) { while(Frente==Cola) outbyte(PDISPL, 0x80); outbyte(PDISPL, 0x00); return daFrente();

*I *I

3 I ~ * ~ * * ~ * * x I ~ * * * * * * ~ * * outi : Transfiere a la PC un byte, generando una interrupción *I void outi(BYTE byte) {

outbyte(PSlot, byte); outbyte(CTL-8255, 0 s ) ; delay(0xF); outbyte( CTL-82 5 5 , 0 s ) ;

3 . . . . . . . . . . . . . . . . . . . . . MandaMensaje : Formato del mensaje a la PC: I* MSG-ID, HParam, LParam void MandaMensaje(BYTE MSG-ID, BYTE HParam, BYTE LParam) {

delay(0xFFF); outi(MSG-ID); delay(0xFFF); outi(HParam); delay(0xFFF); outi(LParam);

I /*****1****1******1** Habilita al puerto de impresora, inicializando al 8255 en modo adecuado*/ I* strobe=l(No hay caracteres en el buffer e init=O(inicializar) *I void EnableLptx(void){

outbyte(CTL_8255,OX94); /* manda incic. de 8255 modo O y modo 1 */ outbyte(CTL_8255,0~09); /*manda strobe'=l*/ outbyte(CTL-8255, OxOA); /* manda Init'=O */

3 / * * ~ * * f * ~ * * * * * * * * * * * *

void OutChar(BYTE caracter){ Saca un caracter del archivo actual al puerto de la impresora */

outbyte(B-8255, caracter); /* manda un caracter a imprimir por el puerto B*/ outbyte(CTL_8255,0~08); /* Strobe'=O le indica a la impresora que hay un caracter y que lo tome*/ delay(OxFF), outbyte(CTL-8255,0~09); /* Strobe'=l indica que no hay caracteres en el buffer*/

I

I* los 4 bits mas altos y el primer bit(bit de error "I . . . . . . . . . . . . . . . . . . . . .

BYTE Status(void){

Checa el estado de impresión en el puerto A(8255) enmascarando *I

Page 32: c. SUÁREZ - 148.206.53.231

BYTE Cstat=O; Cstat=inbyte(A-S255); Cstat&=OxOE; return(Cstat);

/* OE=00001110: */

e

Page 33: c. SUÁREZ - 148.206.53.231

Después de definir los archivos include (desfl88.h, vars188.h) y lib (cOs.obj, cs.lib), se define el programa del spooler de impresión, en donde se establece el protocolo de comunicación entre la tarjeta y la impresora. Cabe mencionar que el módulo que se presenta corresponde al rnanejador de servicios de la tarjeta. Este módulo se presenta en dos archivos: archivo s0188.c y desf188.c

Archivo: s0188.c. Contiene las rutinas principales que interpretan los mensajes de la PC por vía Slot y le indican que ejecución hacer. Básicamente se presentan tres tareas a realizar:

1) Cargar un archivo ( o varios) en memoria para la impresión (Spooler de impresión)

2) Ejecutar un proceso ( Archivo .EXE) para la tarjeta. El proceso se compila y liga (generando un ejecutable) desde la PC y se envía por el Slot. Este archivo, debe contener código que pueda ejecutarse en la tarjeta, esto es, debe de aprovechar las características que ofrece a tarjeta, y no contener código con direcciones de puertos o dispositivos que no están disponibles.

3) Enviar mensajes a la PC. Mediante esto, se pueden enviar avisos al usuario por el monitor de la PC.

Programa:

#include <defs188.h> extern WORD Frente; extern WORD Cola; extern BYTE far *DirCargaF'rog; /* 02CO:OOOO */ extern BYTE far *DirCargaArch; /* 12CO:OOOO */ extern BYTE far *DirSpooler; /* 12c0:0000 */ extern WORD TamArchivo; extern WORD TAM; extern WORD SpoolBuffer[]; extern WORD SpoolCola; extern WORD SpoolFrente;

/* Spooler de Impresión. hace la comunicación con la impresora y si esta está lista envía el caracter a imprimir*/ void Spooler( void) {

int i; /* Calcula el tamaño del archivo a imprimir*/ TAM=OxFFOO&(((unsigned)getByteOn())<<8); TAMI=(unsigned)getByteOn();

/* transfiere todo el archivo al buffer de impresion*/ for(i=O; iGAM; i++)

*(DirCargaArch+i)=getByteOn(); SpoolBuffer[SpoolCola]=TAM; SpoolCola++; SpoolCola&=OxF; DirCargaArch+=TAM;

MandaMensaje(SMP-PRNEMU, (BYTE)((TAM&OxFFOO)>>S), (BYTE)(TAM&OxFF)); EnableTmrlO;

/*MODO de emulacion de impresion*/

1 /* Carga un programa para su ejecución. Este programa es enviado desde el Slot de la PC. void LoadProgram(void) {

int i; TAM=OxFFOO&(((unsigned)getByteOn())<<8); TAMI=(unsigned)getByteOn(); for(i=O; i<ThM; i++)

delay(0xFFFF); outbyte(P-DISPL, 0x76); /* Muestra una ' H */ delay(0xFFFF); ejecuta();

*(DirCargaProg+i)=getByteOn();

Page 34: c. SUÁREZ - 148.206.53.231

1 /* Interpreta los mensajes de la PC enviados hacia el Slot*/ void DespachaMsg(void) 1 BYTE msg;

msg = getByteOn(); switch(msg) { case SMTLOADPROG : /* Carga un programa para ejecución */

LoadProgram(); break;

Spooler(); break;

case SMT-LOADFILE : /* Carga un archivo para imprimir */

case SMT-GETSTATUS: getByteOn0; getByteOn0; MandaMensaje(SMP-STATUS, OxOF, O x F O ) ;

break; } 1 void main() { SpoolCola=SpoolFrente=O; Enablecardo; /* Inicializa las interrupciones del Slot*/ EnableLptxO; /* Inicializa el puerto paralelo */ while( 1 ) (

1 DespachaMsgO;

I

Page 35: c. SUÁREZ - 148.206.53.231

Digitalizador de Imagenes.

Introducción.

La digitalización de imágenes es posible sobre un monitor de computadora. Las

imágenes producidas por éste y la forma en que son colocadas en un televisor es similar.

Una imagen es una formación ordenada de areas pequeñas obscuras y luminosas.

Cada área pequeña de luz o sombra es un elemento o detalle de imagen. Todos los elementos

en conjunto contienen la información visual de la imagen; similarmente en la memoria de video

de una computadora la imagen es igualmente almacenada punto por punto en registros

dedicados para éste propósito y el conjunto total conforma la imagen almacenada en la

memoria.

Para poder capturar y después digitalizar una imagen, primero se tiene que obtener de

la señal compuesta de video la información correspondiente a la imagen, haciendo una similitud

en la forma en que se realiza en un receptor de televisión. La forma de obtener la información

es por medio de la separación de la señal de imagen de las de sincronización y borrado que se

encuentran incluidas en la señal de video compuesta.

La señal de video compuesta es la forma más común en la que se encuentra modulada

una imagen, esta se puede encontrar como salida de una cámara o de una reproductora de

video (típicamente la salida tipo RCA de video); también es la señal que se separa dentro de un

receptor de televisión en la etapa final de preamplificación de video y que se utiliza para formar

la imagen.

AI tener la facilidad de obtener esta etapa de decodificación, la señal que contiene la

imagen es generada de forma mas clara y tangible: por Io tanto, el proceso para preparar la

señal de imagen para su digitalización se reduce a separar la señal que contiene el nivel de

luminicencia (Y) que es con el que se puede reproducir la imagen en blanco y negro (tanto para

un monitor a color como en uno monocromático), de los pulsos de sincronización y borrado.

Otra facilidad que se aprovecha, es el procedimiento de exploración de las imágenes,

que se realiza por medio de un barrido lineal horizontal con características de entrelazado de

lineas impares y pares. Las especificaciones de la FCC(Federa1 Comunication Convention) para

la exploración de las emisiones de televisión en Estados Unidos dan las características estandar

de exploración que indica un total de 525 lineas de exploración horizontal en un cuadro

Page 36: c. SUÁREZ - 148.206.53.231

rectangular con proporción de 4:3 y una velocidad de 30 cuadros por segundo, y en cada cuadro

se tienen dos campos entrelazados (par-impar).

En la exploración entrelazada se realizan barridos lineales en posiciones impares con

direccion de arriba hacia abajo del cuadro explorado, saltando las lineas pares en un primer

tiempo; después de este ciclo de exploración vertical, se regresa al inicio de arriba y se recorre

ahora las lineas pares saltandose las impares en un segundo tiempo, realizando el barrido total

en 1/30 de segundo. De esta manera cada campo forma una imagen con un grado de definición

menor, pero conteniendo una exploración de toda la imagen. As¡ que, al tomar un solo campo

de la imagen para ser digitalizada es posible obtener un cuadro de menor calidad a la original

pero lo suficientemente nítida para poder ser apreciada visualmente sobre un monitor.

Desarrollo

Para poder separar las señales que se utilizarán en la decodificación y digitalización de

la imagen, se tiene que conocer las características de la señal compuesta. AI decir compuesta

se entiende que la señal de video incluye diversas partes. Estas son: 1) la señal de imagen

correspondiente a la información que se desea obtener y digitalizar (luminicencia); 2) Impulsos

de sincronización, que contienen la forma de como es explorada y reproducida una imagen; y 3)

Impulsos de borrado que son señales que sirven para la reproducción de las imágenes. El

resultado que se obtiene es una señal de video llamada "compuesta". Esta señal generada en

una linea de exploración horizontal contiene informacion de color, señal de crominancia, burst,

etc.

La parte que es de interés para la digitalización de una imagen es la amplitud de la

se4al de imagen, que es una de dos secciones: El 75% inferior de la señal compuesta se utiliza

para la señal de cámara (la información de la imagen) y el 25% superior para los impulsos de

sincronización. De la sección correspondiente a la imagen las amplitudes más bajas

corresponden a las partes más blancas, mientras que las amplitudes más altas corresponden a

las más obscuras.

Page 37: c. SUÁREZ - 148.206.53.231

TRES LINEAS HORIZONTALES DE SERAL COMPUESTA

3llmpulso de bomdo

""""""- Nivel de borrado

I I 12.4% 2.4%

Circuito:

Entre los procesos que se tienen que realizar, se tiene que ajustar la información de la

imagen contenida en la señal compuesta de video a la entrada del convertidor analógico-digital,

que es el dispositivo esencial para la digitalización. AI determinar las características de entrada

del convertidor, se obtiene los niveles y amplitudes que debe tener la señal compuesta después

de ser amplificada, filtrada y separadas las señales de sincronización utilizadas para el control

de la digitalización.

El convertidor utilizado en este proyecto es el MC10319 que es un convertidor tipo

flash, analógico-digital de 8-bits y rango de velocidad de O a 25MHz; de acuerdo a sus rangos

máximos de entrada (Vi = -2v - 2v pp) se seleccionó una amplitud máxima menor o igual a 2v

pp con rango de Ov a 2v. que deberá ser entregada en las etapas de amplificación, filtrado y

separación de la señal compuesta. La selección del convertidor determinará los valores a

utilizar, el convertidor es seleccionado de acuerdo al propósito deseado.

La parte digital se realizó con tecnología TTL y la circuitería utilizada fue de la más

sencilla posible para aminorar costos, solamente se utilizaron, para el divisor de frecuencia,

chips tipo fast.

Page 38: c. SUÁREZ - 148.206.53.231

El circuito está separado en dos partes: 1) La analógica, encargada de la

amplificación, filtrado y separación de información de control a partir de la señal compuesta; 2)

Parte digital, encargada de controlar la captura y almacenar la información de la imagen

obtenida de la señal compuesta.

Parte Analógica.

La función de la parte analógica es tomar como entrada una señal compuesta,

generada por una reproductora de video en su salida tipo RCA; esta señal contiene un offset,

que es eliminado por un conjunto de resistores en una primera etapa, donde se amplifica y filtra,

después se le da una ganancia mediana. De la señal amplificada se obtienen las señales par-

impar y Burst utilizando el integrado LM1881 en una segunda etapa, que se encuentra a parte.

Hay que utilizar un divisor de voltaje para evitar la saturación en la entrada del integrado, la

configuración del LM1881 es la indicada en el manual. La salida de la primera amplificación se

utiliza en un dispositivo muestrador/retenedor (LF398) que es disparado por cada pulso Burst

proveniente de la segunda etapa, esto es, en el momento en que ocurre un pulso Burst, se

muestrea y retiene la señal compuesta de video amplificada. Finalmente tomando la señal

amplificada al principio y la salida del muestreadorhetenedor se pasan por un amplificador

diferencial que provoca a la salida una "señal compuesta de video" con las características

requeridas para la entrada del convertidor; la diferenciación es utilizada para quitar el nivel del

Burst, porque este sobrepasa la amplitud de la información de imagen; así que, a la salida se

obtiene una señal con la amplitud requerida por el convertidor. Nótese que la señal de video

compuesta es introducida de manera inversa en el circuito, así, los niveles de blanco quedan en

la parte superior de la señal y los niveles obscuros se encuentran en la parte inferior.

La parte analógica está dividida en 4 partes; 1) Etapa de acople de impedancia,

primera amplificación y filtrado; 2) Separador de pulsos de sincronización de la señal

compuesta; 3) Muestre0 y retención para fijar la señal compuesta. y 4) Fijación de nivel y

amplificación final de la señal compuesta (eliminación del offset correspondiente a los pulsos de

sincronización que acompañan a la señal compuesta). Finalmente se obtiene la señal analógica

con las características requeridas, resultado de la diferencia de la señal amplificada al principio

y el nivel de fijación del muestreador/retenedor. Esta señal final se utliliza como entrada para el

convertidor analógico-digital, y asi, obtener la digitalización de la imagen.

1) Etapa de acople de impedancia, primera amplificación y filtrado. Se tiene un

conjunto de resistencias y jumpers para acoplar la impedancia de la fuente de la señal de video

compuesto (la impedancia puede ser de 75 o 500 Ohms). Los jumpers 1 y 2 determinarán la

Page 39: c. SUÁREZ - 148.206.53.231

impedancia soportada según su posición (abierto o cerrado) que dependera de la fuente de la

señal compuesta (videograbadora, cámaras de video, reproductoras, etc.; regularmente los

jumpers se encuentran cerrados). También se amplifica y filtra el ruido por medio de un

amplificador operacional, en este caso se utiliza un LF353 que tiene las características de bajo

consumo de energía, un ancho de banda de 4" (suficiente para cubrir el margen de la señal

de video compuesto, y desechar las señales de alta frecuencia de la información de color) y

soporte de offset de señal (generalmente contenida en la señal de video compuesta). A la salida

se obtiene una señal con la mayor parte del offset eliminado, y ajustando una amplitud de salida

menor o igual a 2v pp (los valores de los elementos utilizados están indicados en el diagrama de

la figura 1); En esta etapa contiene aun pulsos de sincronía. Los Jumpers 3 y 4 son para hacer

modificaciones al ancho de banda del filtrado (regularmente abiertos). A parte de realizar ajustes

en el límite del filtro para que las señales de color no afecten, en lo general no tienen efectos

trascendentes. (Figura 1)

2) Separador de pulsos de sincronización de la señal compuesta. Esta etapa es

fácilmente superada con el uso de un separador de sincronía de video (el circuito integrado

LM1881 Video Sync Separator) y gracias a las características de entrada y salida del mismo.

Este circuito fue diseñado especialmente para la separación de pulsos de información

de sincronía en los diferentes sistemas de señales de video como NTSC, PAL, SECAM y

sistemas no estandar. El circuito recibe por entrada una señal de video compuesta con una

amplitud de 0 . 5 ~ a 2v pp. Como salida se obtiene: sincronía compuesta, sincronía vertical,

salida par-impar de imagen y salida Burst. Gracias a la flexibilidad en el voltaje de alimentación

(5v a 12v) se puede polarizar con el mínimo y as¡ obtener salidas tipo TTL, que serán utilizadas

en la parte digital.

La forma en que se utiliza el circuito es igual al del diagrama de conexión básico, que

puede encontrarse en el manual correspondiente al integrado (LM1881 en el manual de

dispositivos lineales); las salidas que se utilizan son: la salida par-impar de imagen, que será la

que de el disparo para la captura de una imagen (impar), y la salida Burst que genera el disparo

para el reloj digital de muestre0 y para el amplificador muestreador/retenedor de nivel (el pulso

que se utiliza es el negativo o el inverso a la salida del LM1881).

La señal de entrada se toma de la primera amplificación, y para evitar sobrecarga en

el circuito, se divide la amplitud de la señal compuesta de video a menos de la mitad con un

divisor de voltaje. Las dos salidas utilizadas son invertidas, para trabajar con la parte impar de la

Page 40: c. SUÁREZ - 148.206.53.231

imagen; estos pulsos identifican cuando comienza y termina un cuadro y linea de imagen. La

conexión es la básica (con los valores que muestra el manual, ver Fig. 2).

3) Muestre0 y retención para fijar la señal compuesta. El muestreo y retención de la

señal se produce mediante el circuito integrado LM398 que es un amplificador muestreador-

retenedor (sample-hold amplifier). Este circuito muestrea y retiene la señal compuesta de video,

cuando ocurre un disparo generado por cada pulsos del Burst (invertido); Esto sucede cuando se

presentan los pulsos de borrado y Burst en la señal compuesta de video. Como resultado se

genera un nivel de voltaje igual al valor de la señal compuesta en el momento que ocurre el

disparo del Burst; este nivel se utiliza para eliminar la parte de la señal que afecta la amplitud

final para la digitalización de la información.

La conexión del integrado es la típica, con los valores indicados en el diagrama, el

muestreo y la retención de la señal es activada con la compuerta de disparo (pin 8) y genera la

captura de una muestra de la señal compuesta y la retiene hasta que se genere otro disparo. A

la salida se le adiciona un seguidor de voltaje para que no existan pérdidas por el acoplamiento

con la siguiente etapa (el seguidor se construye con el integrado LF353, ver Fig. 3).

4) Fijación de nivel y amplificacion final, de la señal compuesta. Esta última etapa

analógica entrega la señal compuesta con las características necesarias para ser acoplado al

convertidor analógico-digital. Un amplificador diferencial se utiliza para obtener el resultado de

la diferencia entre la señal amplificada y filtrada en la primera parte analógica y la salida del

amplificador muestreador-retenedor. Como salida final, sólo queda la parte que contiene la

información de la imagen teniendo los límites de nivel de voltaje que soporta el convertidor. Se

utiliza un diodo rectificador y un seguidor de voltaje para evitar la caida de la señal y que no

existan saturaciones.

La conexión tiene dos resistencias que determinan la amplificación de cada señal de

entrada al amplificador diferencial (Ra y Rb). Para obtener aproximada al nivel requerido para el

convertidor (en este caso se busca un voltaje menor o igual a 2v pp), la resistencia Ra controla

esta amplitud; con la recistencia Rb se puede fijar el nivel inferior de voltaje (en el circuito se

busca un nivel igual a O). Regularmente sólo es necesario modificar el nivel superior, en este

caso con Ra. (Ver Fig. 4).

Page 41: c. SUÁREZ - 148.206.53.231

Parte Digital.

La parte digital controla la captura de la imagen previamente muestreada, almacena

los datos provenientes del convertidor analógico digital en una memoria temporal, proveé el

estado actual de la tarjeta al usuario, y comunica al usuario con la tarjeta. La parte digital se

puede dividir en cinco subsistemas interactivos: 1) Generador de pulsos de reloj, 2) Control

principal de la tarjeta, 3) Generador de direcciones, 4) Subsistema de memoria y 5) Convertidor

Analógico-Digital.

1) Generador de Pulsos de Reloj. El reloj esta formado por el cristal, por dos

compuestas NAND y por un conjunto de resistencias y capacitores que funcionan como

estabilizadores de la frecuencia del mismo; hay que notar que el reloj es habilitado por un flip-

flop que, a su vez está siendo disparado por el Burst proveniente de la señal compuesta de

video y está siendo reestablecido por los contadores cuando se llega a la cuenta de 100H o 256;

esto es con el fin de que, cada vez que se acabe de muestrear una linea 256 veces el reloj se

detiene y no vuelve a ser habilitado sino hasta la siguiente linea, es decir, cuando el Burst

dispara al flip-flop. El reloj genera una frecuencia de 20 MHz, luego es pasado a través de un

divisor de frecuencia entre 4 resultando una frecuencia de 5MHz (ver diagrama).

2) Control Principal de la Tarjeta. Esta etapa se compone de los dos flip-flops y las

dos compuertas NAND. La salida del reloj (A 5 MHz) llega a las compuertas NAND que

funcionan como habilitadoras del reloj para el sistema, es decir, el reloj no está conectado

directamente a los subsistemas que requieren el pulso del reloj. Estas compuertas tienen la

función de dejar pasar la señal de reloj dadas ciertas condiciones: como se puede ver en el

diagrama la primera compuerta NAND toma sus entradas del reloj y del flip-flop de terminación

de digitalización; este flip-flop lo dispara, a su vez, el flip-flop de control de digitalización, que

está totalmente a cargo de indicar cuando se quiere empezar la digitalización. El flip-flop de

control de digitalización es disparado por las señales de control que provienen del byte de

control, el programador es responsable tanto de generar el pulso de disparo como el de reloj

para el flip-flop; cabe decir que el diseño se puede mejorar si hacemos desaparecer este flip-flop

y a través de software encargarnos de indicar la inicialización de digitalización, solo se tendría

que pasar la señal de disparo del flip-flop de control a la entrada de disparo del flip-flop de

terminación de digitalización. El reestablecimiento de estos flip-flops lo realiza el último contador

cuando se alcanza la cuenta máxima y la digitalización está lista y la memoria llena.

Suponiendo que el flip-flop de control está habilitado, el flip-flop de terminación será activado

(puesto en "H") cuando la señal par-impar proveniente del LM1881 cambie de "L" a "H" (ya que

hay un negador entre el LM1881 y éI, esta señal viene invertida). La función de los flip-flops es

Page 42: c. SUÁREZ - 148.206.53.231

la de sólo habilitar a la primera compuerta NAND cuando la señal par-impar sea impar,

asegurando asi, la digitalización de sólo un campo. la salida de la primera compuerta NAND va

directamente a la entrada de reloj del convertidor analógico-digital y al pin de escritura de las

memorias. Asi, las memorias y el ADC están funcionando cuando se está llevando un barrido de

campo (en este caso impar). La segunda compuerta NAND toma su entrada de la primera

compuerta NAND y de la señal de control proveniente del byte de control, así que, aunque la

primera compuerta esté habilitando al ADC y las memorias, los contadores no correrán hasta

que la entrada de control que habilita a la segunda compuerta NAND sea puesta en "H";

además, una vez terminada la digitalización, es a través de este flip-flop que generamos los

pulsos de reloj para los contadores, es decir, la segunda compuerta NAND cumple con dos

funciones, la de iniciar a los contadores y posteriormente la de generar el pulso de reloj de los

contadores.

Resumiendo, se tienen tres señales de control para el sistema; dos para el flip-flop de

control y otra para el reloj de los contadores, pudiendose mejorar el diseño y sólo utilizar dos de

estas tres señales.

3) Generador de Direcciones. Los contadores están configurados para contar desde

OOOOH hasta FFFFH (65536 eventos). La entrada de reestablecimiento de los contadores está

conectada a la última señal de control que pone en OOOOH a los contadores para empezar la

digitalización, y los contadores sirven como generadores de dirección para las memorias.

4) Subsistema de Memoria. El bus de direcciones de las memorias está conectado a

los contadores y se utliliza el pin de "chip enable" (habilitador de chip) y un negador para

generar la última linea de dirección (ver diagrama). el pin de "output enable" (habilitación de

salida) de las memorias está conectado a la salida del flip-flop de control; así, cuando el sistema

esté digitalizando, las memorias estarán habilitadas para recibir los datos provenientes del ADC,

y cuando se acabe de digitalizar, las memorias estarán listas para ser leidas.

5) Convertidor Analógico-Digital. El convertidor analógico-digital es habilitado por el

flip-flop de control. El pin de habilitación del ADC está conectado a la salida del flip-flop,

permitiendo que el ADC esté activo al momento de llevarse la digitalización, y al bajar el flip-flop

de "H" a "L" (al terminar el ciclo de digitalización), el ADC se pone en tercer estado, permitiendo

asi la lectura de las memorias sin que haya contingencia de bus. Para determinar los rangos de

entrada de voltaje a ser digitalizados se polariza al ADC entre los rangos deseados; en este

caso, para la señal a ser muestrada, se requeria un rango de O a 2 volts, para lo cual se utilizó al

Page 43: c. SUÁREZ - 148.206.53.231

LM317 que es un regulador ajustable poniendolo a 2 volts, y la otra referencia a tierra. (Ver

diagrama).

Los puertos de salida, tanto el de datos como el de señales de estado del sistema son

mapeados a través de lógica combinacional y habilitados por medio de buffers de tres estados.

( Lógica previamente detallada en la sección de Arquitectura de del proyecto).

La lógica de direcciones para los puertos utilizados está integrada a la tarjeta principal.

De ella se obtienen dos direcciones de puerto:

PTO-IN =OXNC; Puerto de lectura de señales de control. PTO-OUT = O X ~ I C ; Puerto de escritura de señales de control. PTO_DATA=Ox31A; Puerto de lectura de datos.

El digitalizador está planeado de tal manera que se pueda conectar con cualquier tipo

de rnicroprocesador o microcontrolador, aun con la PC. Este modelo se hizo así para que se

tenga un acceso a éI mediante dos puertos, ambos con un byte de ancho. Estos puertos se

utilizan, uno para adquisición de datos y otro para el control de rnuestreo; los comandos que

puede realizar el control son: disparo de captura de nueva imagen, inicializacion del circuito,

comandos de lectura de memoria (lectura de imagen almacenada), etc.

Se puede reducir a un puerto si se reduce la definición en los datos de imagen

reduciendo los bit's de datos, y agregando los de control al mismo puerto.

Programación de la tarjeta. La programación de la tarjeta se hizo completamente en

lenguaje IC', aunque el compilador utilizado fue Turbo C++, asi que, el programa tiene algunas

características de C++. Para controlar la tarjeta, como ya se mencionó, se cuentan con cuatro

bits de entrada para el control y cuatro bits de salida para monitorear el estado de la tarjeta. A

continuación veremos el funcionamiento de estos bits.

Los bits de entrada (a la tarjeta):

IO: Clock/Stop

11: Enable

12: Clock-enable

13: Reset

Page 44: c. SUÁREZ - 148.206.53.231

El bit de Reset (13) lo Único que hace es reestablecer a los contadores en OOOOH que

actuan como un generador de direcciones para la memoria junto con el reloj (mas detalles

abajo). Los bit's de Enable (11) y Clock-enable (12) son los más importantes ya que son los que

dan la condición para que empieze la digitalición, cuando el bit Enable esta habilitado. El bit

ClocWStop detiene al reloj y genera los pulsos de reloj una vez terminada la digitalización.

Los bits de salida (de la tarjeta):

00 : EOD (End Of Digitalitation)

O1 : Overflow

02: Burst

03 : Odd/Even

El bit 0 3 muestra el campo impar/par, esto con el fin de que, si está presente este bit

(es decir, si presenta cambios de "H" "L" "H"), quiere decir que la señal de video está presente

en la entrada y además está corriendo; también tiene un propósito similar el bit 0 2 (Burst), ya

que si no está presente indica que no hay video. El bit Overflow (01) nos indica cuando la

entrada al ADC está sobrepasando los límites esperados, requiriendo un ajuste, ya sea en el

LM317 o bien a la ganacia de la parte analógica. El bit EOD indica cuando se ha acabado de

digitalizar una imagen.

A continuación se presenta un programa mostrando la utilización de las palabras de

control y su secuencia para digitalizar imágenes:

Page 45: c. SUÁREZ - 148.206.53.231

Ejemplo de la utilización de los comandos de programación y de las palabras de respuesta del digitalizador.

#include <graphics.h> #include <dos.h> #include <stdio.h> #include <conio.h> #include <bios.h>

/*

constantes utilizadas dentro del programa: (comandos de control) Reset Clock-enable Enable Clock/Stop Significado

...............................................................................................

O O O O 0x0: CUENTA-1 O O O 1 0x1 : CUENTA-2, ARRANCA-1 1 O O O 0x8: BORRAR 1 O 1 O O x A : INICIA-1 1 1 O O OxC: ARRANCA-2 1 1 1 O OxE: INICIA-2 ................................................................................................ */

const PTO-IN =Ox31 C; const PTO-OUT =Ox31 C; const PTO_DATA=Ox31 A; const INICIA-1 = O x A ;

const INICIA-2 =OxE;

const ARRANCA-1 =Ox1 ; const ARRANCA-2 =OxC;

const BORRAR =Ox8; const CUENTA-1 =Ox1 ; const CUENTA-2 =OXO;

/*puerto de lectura de senales de control*/ /*puerto de escritura de senales de control*/ /*puerto de solo lectura de datos*/ /*reestablece contadores, y hace primer ciclo de habilitación*/ /*del flip-flop de control, teniendo la entrada de éste flip-flop*/ /*habilitada*/ /*los contadores siguen reestablecidos y hace el segundo ciclo*/

/*del flip-flop de control, teniendo para al reloj (Clock/Stop=O) */ /*habilita al reloj (Clock/Stop=l), deja correr a los contadores */ /*segunda parte de arranca. introduce un O al flip-flop*/

/*reestablece a los contadores */ /*primer ciclo de generación de pulsos de reloj, para leer la RAM /*segundo ciclo de generación de pulso de reloj */

/*de control*/

int x, y;

/*guarda el modo texto, y prepara para inicializar el modo grafito*/ int slmagen(void)

int gdriver = CGA/*DETECT*/, gmode = CGACI, errorcode; initgraph( &gdriver, &gmode, "" ); errorcode = graphresulto; if( errorcode != grOk) return -1; return O;

{

1; /*recupera el modo texto antes guardado en buff*/ void rlmagen(void)

closegrapho; {

1

/*regresa un valor diferente de cero si hay alguna anomalía al iniciar la tarjeta */

Page 46: c. SUÁREZ - 148.206.53.231

int Verifica-Tarjeta(void) { unsigned char dato,aux; int i ;

for (¡=O; i<5;i++) /*checa la senal de burst para comprobación*/ { /*de existencia de tarjeta y funcionamiento correcto*/ int cont=O; dato=inportb(PTO-IN) & 0x4; while (1)

{ aux=inportb(PTO-IN) & 0x4; if (aux!=dato)

break; cont++; if (cont>5000)

I return(-I); /*error: tarjeta no instalada o video no listo*/

1

{ /*que el video este corriendo*/ for (¡=O; i<5;i++) /*checa la sena1 odd/even para verificar*/

int cont=O; dato=inportb(PTO-IN) & 0x8; while (1)

{ aux=inportb(PTO-IN) & 0x8; if (aux!=dato)

break; cont++; if (cont>5000)

I return(-2); /*error: video en pausa*/

1

{ /*sobrecarga de la senal de video*/ for (¡=O; i<5;i++) /*checa la senal de overflow del ADC que indica*/

int j=1; int cont=O; dato=inportb(PTO-IN) & 0x2; while (1)

{ aux=inportb(PTO-IN) & 0x2; if (aux!=dato)

{ j=-I ; break;

I cont++; if (cont>5000)

{ j=1; break;

1 1

if (i>=4 && j==-1) return (-3); /*error: aviso de sobrecarga de serial*/

1

Page 47: c. SUÁREZ - 148.206.53.231

return(0); 1

/*todo esta correcto:*/

/*inicializa la tarjeta e inicia digitalización */ void Digitalizao

{ unsigned char dato=l; outportb(PT0-OUT,BORRAR); outportb(PT0-OUT,INIClA-I); outportb(PTO-OUT,INIClA-2); outportb(PT0-OUT,ARRANCA-I); outportb(PTO-OUT,ARRANCA-2); while (1)

{ dato=inportb(PTO-IN); if ((dato&l)==O)

break; 1

1

/*grafica un cuadro de 256x256 y comensando en x,y obtenido del puerto*/ void Despliega(void)

int z; outportb(Ox31 c,Ox5); outportb(Ox31 c,Ox4); z=inportb(PTO-DATA)/64; switch (z)

{

{ case 3: putpixel(x,y,Ox3); /* OxF*/

case 2: putpixel(x,y,Oxl); /* Ox7*/

case 1 : putpixel(x,y,Ox2); /* OX8*/

case O: putpixel(x,y,OxO); /* OXO*/

1

break;

break;

break;

break;

x++; if(x==256) { x=O; y++; }

1 void main0

int c, cdato=l; char valor;

{

x=o; y=o; clrscro; c = Verifica-Tarjeta();

gotoxy(l ,I); printf("e1 valor de Verifica-Targeta es: %d\n",c);

Page 48: c. SUÁREZ - 148.206.53.231

while(cdato>=O) { gotoxy(1,4);

gotoxy(21,4); printf("dat0 al puerto 31C: ' 7 ;

scanf("%x",&cdato); if(cdato>=O) { outportb(PT0-OUT,cdato); printf("\n");

cdato=inportb(PTO-IN);

printf("dat0 del puerto 31 C: %x\n",cdato); gotoxy(l,5);

cdato=inportb(PTO-DATA);

printf("dat0 del puerto 31A: %x\n",cdato); printf("\n");

gotoxy(l,6);

I I

gotoxy(l,8); printfydesea dibujar n:para no, cualquier otra letra para si: 'I);

valor=getchO; if(valor!='n') { slmageno; Digitalizao; while ((inportb(Ox31 c)&Ox8)!=Ox8); outportb(Ox31 c,OxO); outportb(Ox31 c,Ox8); outportb(Ox31 c,Oxa); outportb(Ox31 c,Oxe); outportb(Ox31 c,Ox6); outportb(Ox31 c,Ox5); getcho; outportb(Ox31 c,Ox8); outportb(0x31c,0xc); while(!bioskey(l)) Despliega(); rlmageno;

I I

Page 49: c. SUÁREZ - 148.206.53.231

+ o r a H H

/m

-J P

o m h)

r

t

"

rt o

Page 50: c. SUÁREZ - 148.206.53.231

I I

I

-4 P

m w N

r -4 o m O N

r

-4 P

1

m o I- o) oa

I I L

J

Page 51: c. SUÁREZ - 148.206.53.231

kLLd N310- . JP < m bl N

-.I P

m bl N

r

T

I I I I

Page 52: c. SUÁREZ - 148.206.53.231

L t

I U

m

Page 53: c. SUÁREZ - 148.206.53.231

n i n

I- t !

Yo

+ n 3 6

T

td

F a

I- m 9. 3

m c I-

D 1 U

H I H

r

O c

I H CI

O D H

o Z P

I H r "I m D U o

Page 54: c. SUÁREZ - 148.206.53.231
Page 55: c. SUÁREZ - 148.206.53.231

1 I-

1

L-

Page 56: c. SUÁREZ - 148.206.53.231

I- O x

" Z

P c P m

I- x

F

I) 1 U Í H I H

H o Z I

Z I)

H

r

I H c

H o Z

I H G l r

P

U m

Z H .= m Í

Page 57: c. SUÁREZ - 148.206.53.231

............... 1 .............. ... .."."...",

..............................................................................

M " , , ,

I L

t i OdNIOUUIUh 00000000

L

L

I L -?+ L 1

4 3 N

, .................................. , I

r

> m

I 1 I I

IL

3

O

I I

Page 58: c. SUÁREZ - 148.206.53.231

UNIVERSIDAD A UTONOM METROPOLITANA

Unidad Iztapalapa

ING. ELECTR~NICA EN COMPUTACI~N

REPORTE DEL PROYECTO TERMINAL:

DIGITALIZADOR DE IMÁGENES Y SPOOLER DE IMPRESI~N POR VÍA SLOT

Autorizó:

.A

Asesor:

//' ' Profesor de tiempo completo. U.A.M. Unidad Iztapalapa.

FIRMA:

Page 59: c. SUÁREZ - 148.206.53.231

UNIVERSIDAD A UTONOM METROPOLITANA

Unidad Iztapalapa

ING. ELECTR~NICA EN COMPUTACI~N

REPORTE DEL PROYECTO TERMINAL:

DIGITALIZADOR DE IMÁGENES Y SPOOLER DE IMPRESI~N POR V ~ A SLOT

Autorizó:

Asesor:

M. c. AGUSTÍN s u m z HERNÁNDEZ.

Profesor de tiempo completo. U.A.M. Unidad Iztapalapa.