Programar el puerto paralelo con interrupciones

Hola, mi nombre es Silvia y necesito programar el puerto paralelo para que a través de las interrupciones de la pc, cuando por el pin ack lo indique, se levante un evento que me dispare un proceso que realice algo, lo necesito para los distintos win. Yo he trabajado en win 98, y leo el puerto sin problemas, pero no se la parte de interrupciones. En Win xp, con algunas dll, puedo acceder al puerto pero no a las interrupciones.
Desde ya Gracias

1 Respuesta

Respuesta
1
En c así se escribe
#include <stdio.h>#include <dos.h>int puerto(int direcc);int seleccion;int main(){ unsigned int __far *puntero_a_direccion; int i, direccion[3]={0,0,0}, disponible[3]={0,0,0}; puntero_a_direccion = (unsigned int __far *)0x00000408; printf("Seleccione el puerto:\n"); /* ¿Cuantos puertos existen? */ for (i=0; i<3; i++) { if (*puntero_a_direccion == 0) printf("Puerto LPT%d...............no disponible\n", i+1); else { disponible = 1; direccion = *puntero_a_direccion; printf("Puerto LPT%d...............%d\n", i+1, i+1); } puntero_a_direccion++; } printf("Salir del programa........0\n"); scanf("%d", &seleccion); do { switch(seleccion) { case 0:/* Salir del programa */ printf("Adios!!!\n"); return 0; break; case 1:/* Puerto LPT1 */ if(disponible[0]==1) puerto(direccion[0]); else { printf("ERROR: PUERTO NO DISPONIBLE\n"); return 0; } break; case 2:/* Puerto LPT2 */ if(disponible[1]==1) puerto(direccion[1]); else { printf("ERROR: PUERTO NO DISPONIBLE\n"); return 0; } break; case 3:/* Puerto LPT3 */ if(disponible[2]==1) puerto(direccion[2]); else { printf("ERROR: PUERTO NO DISPONIBLE\n"); return 0; } break; default: printf("ERROR: OPCION INCORRECTA!\n"); break; } if(seleccion!=0) { printf("Seleccione otra opcion\n"); scanf("%d", &seleccion); } } while(seleccion!=0); return 0;}int puerto(int direcc){ unsigned char valor; /* Solo valores entre 0 y 255 */ printf("Ahora puede escribir cualquier valor\n"); printf("entre 1 y 255, 0 para terminar el programa\n"); do { printf("Valor al puerto?\n"); scanf("%d", &valor); outp(direcc, valor); printf("Se ha escrito %d al puerto\n", valor); } while(valor!=0); return seleccion=0;}
y asi se lee
#include <stdio.h>#include <dos.h>unsigned char Lectura(int);int nPuertos(void);int main(){ int direccion, lectura; if((direccion = nPuertos()) != 0) { lectura = Lectura(direccion); printf("La lectura tomada es de: %d\n", lectura); } return 0;}unsigned char Lectura(int direccion){ int control = (direccion + 2), estado = (direccion + 1); unsigned char a; /* Colocar línea strobe en 1 para leer el LSB */ outp(control, inp(control) | 0x01); /* Leer valor del puerto de estado */ a = (inp(estado) & 0xf0); /* Recorrer los bits 4 posiciones a la derecha */ a = a >> 4; /* Colocar línea strobe en 0 para leer el MSB */ outp(control, inp(control) & 0xFE); /* Leer valor del puerto de estado */ a = a | (inp(estado) & 0xf0); /* Ordenar los bits */ a = a ^ 0x88; return a;}int nPuertos(void){ unsigned int __far *pDireccion; int i, direccion[3] = {0, 0, 0}, disponible[3] = {0, 0, 0}, seleccion; pDireccion = (unsigned int __far *)0x00000408; printf("Seleccione el puerto:\n"); /* ¿Cuantos puertos existen? */ for(i = 0; i < 3; i++) { if(*pDireccion == 0) printf("Puerto LPT%d...............no disponible\n", i + 1); else { disponible = 1; direccion = *pDireccion; printf("Puerto LPT%d...............%d\n", i + 1, i + 1); } pDireccion++; } printf("Salir del programa........0\n"); scanf("%d", &seleccion); do { switch(seleccion) { case 0: /* Salir del programa */ printf("Adios!!!\n"); return 0; case 1: /* Puerto LPT1 */ if(disponible[0] == 1) return direccion[0]; else { printf("ERROR: PUERTO NO DISPONIBLE\n"); return 0; } case 2: /* Puerto LPT2 */ if(disponible[1] == 1) return direccion[1]; else { printf("ERROR: PUERTO NO DISPONIBLE\n"); return 0; } case 3: /* Puerto LPT3 */ if(disponible[2] == 1) return direccion[2]; else { printf("ERROR: PUERTO NO DISPONIBLE\n"); return 0; } default: printf("ERROR: OPCION INCORRECTA!\n"); break; } if(seleccion != 0) { printf("Seleccione otra opcion\n"); scanf("%d", &seleccion); } } while(seleccion != 0); return 0;}
en visual basic que te sirve para todos los windows incluido xp
en un modulo
Public Declare Sub PortOut Lib "IO.DLL" (ByVal Port As Integer, ByVal Data As Byte)
Public Declare Sub PortWordOut Lib "IO.DLL" (ByVal Port As Integer, ByVal Data As Integer)
Public Declare Sub PortDWordOut Lib "IO.DLL" (ByVal Port As Integer, ByVal Data As Long)
Public Declare Function PortIn Lib "IO.DLL" (ByVal Port As Integer) As Byte
Public Declare Function PortDWordIn Lib "IO.DLL" (ByVal Port As Integer) As Long
Public Declare Sub SetPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte)
Public Declare Sub ClrPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte)
Public Declare Sub NotPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte)
Public Declare Function GetPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte) As Boolean
Public Declare Function RightPortShift Lib "IO.DLL" (ByVal Port As Integer, ByVal Val As Boolean) As Boolean
Public Declare Function LeftPortShift Lib "IO.DLL" (ByVal Port As Integer, ByVal Val As Boolean) As Boolean
Public Declare Function IsDriverInstalled Lib "IO.DLL" () As Boolean
en el formulario
Option Explicit
Public Out_TTL As Byte 'contiene el BYTE a sacar por el puerto
Public In_Port As Integer 'continen la direccion de lectura del LPT
Public Out_Port As Integer 'contiene la direcc.para escribir al LPT
Private Sub Form_Load() 'procedimiento inicial
'Configura la COMBOLIST cmbLptSelect
cmbLptSelect.AddItem "0x378"
cmbLptSelect.AddItem "0x278"
cmbLptSelect.AddItem "0x3BC"
'Establece LPT1 como default
cmbLptSelect.ListIndex = 0
SetLPTAddress 'estable dirección base del LTP
Port_Reset 'reseteo salidas TTL
End Sub
Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Cancel = 1 'evita que se salga mediante la 'X'
End Sub
Private Sub Form_Unload(Cancel As Integer) 'si sale del programa
Port_Reset 'entonces reseteo salidas TTL
End
End Sub
Private Sub cmdSalir_Click() 'si presiono SALIR, reseteo
Port_Reset 'las salidas TTL y salgo del programa
End
End Sub
Private Sub Port_Reset() 'procedimiento para resetear salidas TTL
PortOut Out_Port, 0
End Sub
Private Sub cmbLptSelect_Click()
SetLPTAddress 'llamo rutina para determinarar la direccion
'base del nuevo LPT elegido
End Sub
Private Sub SetLPTAddress() 'establece la direccion correpondiente
'al puerto seleccionado
Select Case cmbLptSelect.ListIndex
Case Is = 0
Out_Port = &H378
Case Is = 1
Out_Port = &H278
Case Is = 2
Out_Port = &H3BC
End Select
In_Port = Out_Port + 1
End Sub
Private Sub Chkttl0_Click() 'invierto estado de TTL0
If chkTTL0.Value = 1 Then
SetPortBit Out_Port, 0
chkTTL0.Caption = "Salida TTL0 = 1 - ALTO"
Else
ClrPortBit Out_Port, 0
chkTTL0.Caption = "Salida TTL0 = 0 - BAJO"
End If
End Sub
Private Sub Chkttl1_Click() 'invierto estado de TTL1
If chkTTL1.Value = 1 Then
SetPortBit Out_Port, 1
chkTTL1.Caption = "Salida TTL1 = 1 - ALTO"
Else
ClrPortBit Out_Port, 1
chkTTL1.Caption = "Salida TTL1 = 0 - BAJO"
End If
End Sub
Private Sub Chkttl2_Click() 'invierto estado de TTL2
If chkTTL2.Value = 1 Then
SetPortBit Out_Port, 2
chkTTL2.Caption = "Salida TTL2 = 1 - ALTO"
Else
ClrPortBit Out_Port, 2
chkTTL2.Caption = "Salida TTL2 = 0 - BAJO"
End If
End Sub
Private Sub Chkttl3_Click() 'invierto estado de TTL3
If chkTTL3.Value = 1 Then
SetPortBit Out_Port, 3
chkTTL3.Caption = "Salida TTL3 = 1 - ALTO"
Else
ClrPortBit Out_Port, 3
chkTTL3.Caption = "Salida TTL3 = 0 - BAJO"
End If
End Sub
Private Sub Chkttl4_Click() 'invierto estado de TTL4
If chkTTL4.Value = 1 Then
SetPortBit Out_Port, 4
chkTTL4.Caption = "Salida TTL4 = 1 - ALTO"
Else
ClrPortBit Out_Port, 4
chkTTL4.Caption = "Salida TTL4 = 0 - BAJO"
End If
End Sub
Private Sub Chkttl5_Click() 'invierto estado de TTL5
If chkTTL5.Value = 1 Then
SetPortBit Out_Port, 5
chkTTL5.Caption = "Salida TTL5 = 1 - ALTO"
Else
ClrPortBit Out_Port, 5
chkTTL5.Caption = "Salida TTL5 = 0 - BAJO"
End If
End Sub
Private Sub Chkttl6_Click() 'invierto estado de TTL6
If chkTTL6.Value = 1 Then
SetPortBit Out_Port, 6
chkTTL6.Caption = "Salida TTL6 = 1 - ALTO"
Else
ClrPortBit Out_Port, 6
chkTTL6.Caption = "Salida TTL6 = 0 - BAJO"
End If
End Sub
Private Sub Chkttl7_Click() 'invierto estado de TTL7
If chkTTL7.Value = 1 Then
SetPortBit Out_Port, 7
chkTTL7.Caption = "Salida TTL7 = 1 - ALTO"
Else
ClrPortBit Out_Port, 7
chkTTL7.Caption = "Salida TTL7 = 0 - BAJO"
End If
End Sub
Private Sub Timer1_Timer() 'timer de 50ms para refrescar en
Dim Lectura As Byte 'pantalla el estado de las
Dim Estado(3) As Byte 'entradas INPUT 0 a 3
Dim Estado_Str(3) As String
Dim Bucle As Byte
Lectura = PortIn(In_Port) 'leo el puerto de entrada
'filtro solo los bit's que necesito conocer
Estado(0) = Lectura And &H8 '= 00001000 en Binario
Estado(1) = Lectura And &H10 '= 00010000 en Binario
Estado(2) = Lectura And &H20 '= 00100000 en Binario
Estado(3) = Lectura And &H40 '= 01000000 en Binario
For Bucle = 0 To 3
If Estado(Bucle) <> 0 Then
Estado_Str(Bucle) = "1 - ALTO"
Else
Estado_Str(Bucle) = "0 - BAJO"
End If
Next Bucle
lblInput0.Caption = "INPUT 0 = " & Estado_Str(0)
lblInput1.Caption = "INPUT 1 = " & Estado_Str(1)
lblInput2.Caption = "INPUT 2 = " & Estado_Str(2)
lblInput3.Caption = "INPUT 3 = " & Estado_Str(3)
End Sub
Y en la misma carpeta colocas la io.dll
Hola: quisiera saber cual parte del código de visual basic, ¿es la que levanta las interrupciones de la pc? Si no entiendo mal, lo que vos pusiste es un timer que pregunta cada 50 ms para altualizar
Lo que necesito es que cuando una interrupción se produzca, relacionada con el bit ACK
La interrupción que tengo que utilizar es
INT 0F: IRQ 7: LPT1
Gracias
Te mando el programa a tu mail y te explico cuando la impresora va a imprimir manda una orden por el puerto de control y ahí es cuando se produce la interrupción si no mando orden del puero de control no lo tomara el pc aunque cambie el ack
El puerto paralelo esta dividido en tres puertos el de datos control y estado
si estuviéramos en lpt1 serian la 378 379h 37 en hexadecimal ya la
Acknowledge es el bit 6 del puerto de estado que tienen la direccion H1, H2, H3, H4, H8, H10, H20, H40
y H80 por lo tanto el bit Acknowledge es el h40 y esta seria la linea en que actua
Estado(3) = Lectura And &H40 '= 01000000 en Binario

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas