PDA

Ver la Versión Completa : interrupcion del puerto paralelo


candia
17-02-2009, 16:01:42
hola amigos.. tengo una duda..
cuando se ve el tema de las interrupciones, existe una que es para el puerto paralelo.. pero como la utilizo?

quiero hacer una aplicasion en la cual cualdo active (con un 0 o 1) un bit del puerto paralelo se genere una interrupcion, y que de como un evento que pueda programar..

¿es esto posible?, yo se que si... solo diganme como.

cHackAll
17-02-2009, 20:37:39
...cuando se ve el tema de las interrupciones, existe una que es para el puerto paralelo.. pero como la utilizo?...

No es posible acceder a una IRQ con Delphi. El concepto de "interrupciones" en güindos ha sido desechado. Creo que debes buscar algo asi;

hDevice := CreateFile('\\.\COM1', GENERIC_READ or //...
ReadFile(hDevice, Buffer, SizeOf(Buffer), Count, @Overlapped);
//...

y el manejo de Overlapped.hEvent (talvez en un hilo) con WaitForSingleObject

Suerte

MaMu
03-04-2009, 07:03:54
hola amigos.. tengo una duda..
cuando se ve el tema de las interrupciones, existe una que es para el puerto paralelo.. pero como la utilizo?

quiero hacer una aplicasion en la cual cualdo active (con un 0 o 1) un bit del puerto paralelo se genere una interrupcion, y que de como un evento que pueda programar..

¿es esto posible?, yo se que si... solo diganme como.

Si, es facil, pero en Pascal (TB7 por ejemplo)


Manejo de la interrupción del puerto paralelo.
El bit 4 del puerto de control, según la tabla 5, se denomina IRQEN. Este bit habilita o permite que se produzca la interrupción asociada a la entrada ACK#. Cuando este bit está a 1 y la señal ACK# pasa del nivel lógico 1 al nivel 0 se produce una petición de interrupción, que es la IRQ7.
En el diseño original del PC, IBM reservó 8 interrupciones hardware, comenzando por la interrupción 08h, para expansión de interrupciones, que son comúnmente conocidas como IRQ0 a IRQ7. Así la IRQ0 se corresponde con la interrupción 08h, la IRQ1 con la 09h, etc. La IRQ7 se corresponde pues con la 0Fh, estando sus vectores a partir de la dirección 0000:003Ch.
Para que una petición de una IRQ llegue a la CPU, ésta debe estar permitida, no enmascarada. El puerto 021h está asociado con la máscara de interrupciones de las IRQ. Para habilitar una determinada interrupción se deberá escribir un cero en la posición correspondiente, sin modificar el resto. Así, si lo que se quiere es permitir la IRQ7 habrá que poner a cero el bit más significativo del puerto 021h, como muestra el código siguiente:
in al,021h ; lee la máscara de las IRQ
and al, 01111111b ; impone un 0 en el bit más significativo, IRQ7. No modifica el resto
out 021h, al ; escribe la máscara
Con estas operaciones quedará habilitada la IRQ7. Una vez atendida de la forma que se haya previsto, el programa debe indicar a la CPU que la interrupción ya ha sido procesada, para ello debe escribir un 1 en el bit 5 del puerto 020h, es decir:
mov al, 020h ; carga en al 0010 0000 b
out 020h, al ; lo escribe en al puerto 020h
Finalmente, tan sólo queda por activar el bit que permite que la señal ACK# genere una petición de IRQ7. Para ello se deberá poner a 1 el bit 4 del puerto de control , sin modificar el resto. Cuando no se quiera que se produzca una IRQ7, basta con poner a cero este bit.
Al finalizar el programa, no sólo se deben restablecer los vectores de interrupción modificados, sino que también se debe inhibir la IRQ7, dejando la máscara del puerto 021h como estaba.
Un programa que utilice la interrupción del puerto paralelo puede tener esta estructura, en lo que se refiere al manejo de dicha interrupción:
Al comienzo:
modificar vectores de la interrupción 0Fh (IRQ7)
permitir la interrupción IRQ7, poner a 0 el bit 7 del puerto 021h
Durante la ejecución, siempre que haga falta:
habilitar la interrupción en el puerto de control, bit 4
repetir
procesar la interrupción
escribir 020h en el puerto 020h
hasta que se deba inhibir
inhibir la interrupción, poniendo un cero en el bit 4 del puerto de control
Al terminar
inhabilitar la IRQ7, poner a 1 el bit 7 del puerto 021h recuperar los vectores de interrupción anteriores

Saludos