Foros de Electrónica

Comunidad de discusión sobre Automatización, Electrónica industrial, Microcontroladores y electrónica digital, Robótica, Domótica, Telemática, Tecnologías móviles, y muchos temas más.




Interrupciones del puerto paralelo


       



#11  
Marcelo
Colaborador
Registrado: 27 Jul 2005
Mensajes: 368
Ubicación: Venezuela
citar
Esto es lo que yo tengo.

Según la tabla:

IRQ7 --> INT 0F o INT 15

IRQ5 --> INT 0D o INT 13

INT 17 (23 en decimal) es para interrupción por software

Pero según esta página, el Bios extiende el servicio de printer hasta el 17h

http://webpages.charter.net/danrollins/techhelp/0027.HTM

En DOS la cosa no es igual que en Windows y es lógico. Windows no maneja los IRQ como el DOS- Por ejemplo, los COM en Windows son compartidos y puedes tener tantos puertos virtuales como quieras hasta 256 compartiendo IRQs. Esto no lo puede hacer DOS.

Aquí hay unos documentos que te pueden servir:

http://www.csupomona.edu/~myin.....df#search='programming DOS interrupt'

http://zone.ni.com/devzone/con.....enDocument


Ultima edición por Marcelo el Lun Nov 07, 2005 1:47 am, editado 1 vez



Este mensaje contiene archivos adjuntos, para verlos debes estar registrado.

#12  
MaMu
Moderador
Registrado: 18 Abr 2005
Mensajes: 895
Ubicación: Argentina - Buenos Aires - Capital Federal
citar
Marcelo escribió:
Si, ya veo.

Eso se establece en el Bios y el paralelo que yo sepa siempre usa el IRQ7 y si tienes un LPT2 el IRQ5.



El IRQ5 se ejecuta tambien con cada pulsación de la tecla "PrintScreen".

Saludos.

#13  
Marcelo
Colaborador
Registrado: 27 Jul 2005
Mensajes: 368
Ubicación: Venezuela
citar
Si MaMu, pero el PrintScreen es una interrupción del DOS (del teclado, luego de que DOS cargó el driver) y no del BIOS.

En el caso de los LPT, la asignación la hace el BIOS y no el DOS, por lo que la tabla de vectores puede ser redireccionada por el sistema operativo. De ahí la "extensión" del Bios que maneja DOS.

También si ves la tabla anexa, verás que el IRQ5 se lo asignan a la trajeta de sonido, pero en este caso es el Windows quien lo hace.

Es más, si en el Bios del computador haces un cambio a mano de las interrupciones de los puertos COM1 y COM2 es decir que los permutas y además, tienes establecida la opción de que los IRQ son asignados por el OS, verás como en el administrador de programas de Windows aparecen al revés nuevamente, como deberían de estar antes de haber hecho el cambo a mano.

Lo que te quiero decir es que el SO prevalece en lo que respecta a los IRQ y direcciones E/S, sobre el Bios.

No dejes de ver los dos documentos que te linkeé antes.

Saludos.


Ultima edición por Marcelo el Jue Nov 10, 2005 9:50 am, editado 3 veces

#14  
MaMu
Moderador
Registrado: 18 Abr 2005
Mensajes: 895
Ubicación: Argentina - Buenos Aires - Capital Federal
citar
Excelente todo Marcelo, mil gracias.

PD: jeje, podrias darme un sinónimo de "pokear", entiendo que significa ASIGNAR, pero nunca lo habia escuchado.

Otra cosa, 0x0Bh ? no deberia ser Base+1 (del Pic 2) 0x0A0h+1 = 0x0A1h ?

Perdón pero a esta hora ya tengo una ensalada!!! :p.

Saludos.

#15  
Marcelo
Colaborador
Registrado: 27 Jul 2005
Mensajes: 368
Ubicación: Venezuela
citar
Primero lo de la suma:

La dirección es 0x0Ah y no 0x0A0h.

0x0Ah + 1 = 0x0Bh y no 0x0A1h

esto mismo en decimal sería: 10 +1 = 11; 11 en hexa es 0B.
A1h en decimal es 161.

El otro caso 20h + 1 = 21h

en decimal: 32 + 1 = 33 que en hexa es 21h, este está correcto.

Lo del Poke:

Esa es una "degeneración" de los inicios de la programación cuando las computadoras empezaron a hacerse del dominio público. Hoy casi ya no se usa el modismo.

Las primeras máquinas tenían un Basic incluido que estaba preprogramado y era lo que permitía a los usarios, hacer algo con ellas.

Como esos lenguaje no tenían todo el potencial de alto nivel que poseen los de ahora, tenían instrucciones para actuar directamente sobre el microporcesador y la memoria, así que en realidad eran una mezcla entre Basic y Assembler.
Esto era básico en las commodore, synclair, tandy y atari por ejemplo.

Dos de esas instrucciones eran "PEEK" y "POKE"; con una leías y con otra escribías en memoria.

Podías hacer cosas como POKE 0x020h, 0xFFh para colocar FF en 20h, o leer PEEk 0x020h lo que había en 20h.

Entonces, "Pokear" se usaba para decir "escribir en la dirección o registro" y "Peekear" era "leer el registro". En esos tiempos (los 80) si programabas, era común tener en el escritorio al menos 4 cosas:
1) El manual del Basic
2) El mapa de memoria de la computadora
3) La tabla de interrupciones
4) El manual de assembler del micro (6502, 6510 y otros)

Esas computadoras eran increibles y de hecho lo siguen siendo.

http://en.wikipedia.org/wiki/PEEK_and_POKE

(pareciera que lo que escribí aquí, me lo copié de este link de wikipedia pero es de mi creación, ojo)

Saludos,
Marcelo

#16  
MaMu
Moderador
Registrado: 18 Abr 2005
Mensajes: 895
Ubicación: Argentina - Buenos Aires - Capital Federal
citar
Gracias Marcelo por la aclaración y por la tan interesante literatura acerca de la Jurassica era de las PC. (Te imaginas si uno pudiese viajar en el tiempo? de seguro no se llamarían Transistor, se llamarían MaMustor!!! o la Ley de MaMohm!!!! jejeje :D)

PD : seguro que fue la hora de la madrugada la que no me dejo sumar.

Saludos.

#17  
Marcelo
Colaborador
Registrado: 27 Jul 2005
Mensajes: 368
Ubicación: Venezuela
citar
De nada MaMu,

Si, y también hubieras podido "inventar" y sacar al mercado la MaMudore 256 para competir con las Commodore 64 y 128 y llenarte de guita.

Una cosa que me olvidé decirte es que cuando te digo en los posts que "Pokees" quiere decir que uses el método en Pascal para hacer eso, escribir en una dirección de memoria.

¿Ya aclaraste como usar lo de los IRQ y los Registros en DOS?. ¿Me lo explicas cuando lo tengas?.

Saludos.
Marcelo.

#18  
MaMu
Moderador
Registrado: 18 Abr 2005
Mensajes: 895
Ubicación: Argentina - Buenos Aires - Capital Federal
citar
Si, ya he probado los procedimientos con resultados óptimos, y con la mínima inclusión de assembler posible (ya que la idea es explotar el pascal), los procedimientos que apliqué son :

Código: Seleccionar todo

PROCEDURE HabilitaIRQ(Num:Byte);
VAR Mask:Byte;
BEGIN
   IF Num<=7 THEN
     BEGIN
           Mask:=NOT(1 SHL Num);
           ASM CLI END;
           Port[$21]:=Port[$21] AND Mask;
           ASM STI END;
     END
   ELSE
     BEGIN
          { IRQ>7}
          Num:=Num-8;
          Mask:=NOT(1 SHL Num);
          ASM CLI END;
          Port[$A1]:=Port[$A1] AND Mask;
          ASM STI END;
          HabilitaIRQ(Num);
     END;
END;


Este primero, es para habilitar el número de IRQ que deseo. Nota que ha aparecido una nueva función de Pascal : SHL (tambien esta SHR), la cual realiza un corrimiento hacia izquierda (su contraparte la hace hacia derecha).

Código: Seleccionar todo

PROCEDURE DeshabilitaIRQ(Num:Byte);
VAR Mask:Byte;
BEGIN
      IF Num<=7 THEN
        BEGIN
             Mask:=1 SHL Num;
             ASM CLI END;
             Port[$21]:=Port[$21] OR Mask;
             ASM STI END;
        END
      ELSE
        BEGIN
             {IRQ>7}
             Num:=Num-8;
             Mask:=1 SHL Num;
             ASM CLI END;
             Port[$A1]:=Port[$A1] OR Mask;
             ASM STI END;
             DeshabilitaIRQ(Num);
        END;
END;

Este segundo procedimiento es para deshabilitar la IRQ que deseo. Nota ademas que he incluido la menor cantidad de ASM posible (para ganar tiempo...) y que tranquilamente se puede usar la sentencia "inline".

Al principio se tildaba la pc, pero leyendo un poco en la web, he notado que Turbo Pascal tiene algunos problemas para manejar variables Assembler de 32 bits en interrupciones, por lo que casi todo programador Pascal se vuelca al uso de la librería TrapInt.

El finalizado de la interrupción se realiza con la instrucción Port:
Código: Seleccionar todo

Port[$20]:= $20 {para PIC1}

Si la IRQ >= 8, entonces tambien tenes que hacer
Código: Seleccionar todo

Port[$A0]:= $20; {para PIC2}


Pero en fin, la idea era explotar al máximo el amado Pascal para DOS.


Inline:Inline es una sentencia de Turbo Pascal que hace que sus argumentos del tipo byte,sean volcados directamente en el momento de la compilación,de este modo las órdenes

Código: Seleccionar todo

a:=a+1;
Inline($CO,$31);
write(A);


Produce unas instrucciones máquina tal que así:
[ como se traduzca a:=a+1]
$CO,$31
[ como se traduce write(A)]

Importante: Para usar Inline es necesario conocer los códigos de cada instrucción
lo que dificulta de manera inpensable la programación .En realidad el sistema de Usar Inline era el usado en Compiladores anteriores al 6.0, pero ahora es inútil e incómodo.

Inclusiones de Assembler :Es la mejor manera para incorporar assembler a los programas en Pascal. Cuando quiera hacer una inclusión en Assembler, puede poner algo de código ensamblador por la palabra reservada asm, y seguido de esta todo el código que se quiera y para finalizar se pone un END y un punto y coma (Ojo!!! este método sólo funciona con Turbo Pascal 6.0 o superior ya que el 5.5 no contempla como palabra reservada a "asm")

Estructura de la inclusión en assembler
Código: Seleccionar todo

asm
{

código assembler

}
end;




PD : te adjunto el source de TrapInt.

Saludos.



Este mensaje contiene archivos adjuntos, para verlos debes estar registrado.

#19  
Marcelo
Colaborador
Registrado: 27 Jul 2005
Mensajes: 368
Ubicación: Venezuela
citar
Ahora si sigue lo que hablamos.
Gracias por la explicación y el código. Ya lo corté y lo pegué en un archivo Word para guardarlo.
Me imagino que si lo quieres usar en Delphi7, es la misma cosa.

¿Por qué usas la dirección A0h y A1h para PIC2? entonces era OxOA0h para PIC2 y no 0x0Ah, ¿no? (¿PIC2 está en Decimal 160 y no en Dec. 10 ????).

Aclárame esto porque me enredó la dirección.

Saludos,
Marcelo.

#20  
MaMu
Moderador
Registrado: 18 Abr 2005
Mensajes: 895
Ubicación: Argentina - Buenos Aires - Capital Federal
citar
Marcelo escribió:
¿Por qué usas la dirección A0h y A1h para PIC2? entonces era OxOA0h para PIC2 y no 0x0Ah, ¿no? (¿PIC2 está en Decimal 160 y no en Dec. 10 ????).


Efectivamente, la dirección del PIC2 era el offset 0x0A0h (resolve) 0x0A1h (set). Después de leer algunos apuntes, no me quedaba todavia muy claro, ya que en algunos tenía 0x0Ah y 0x0Bh como vos lo mencionaste, pero... ante la duda, se me ocurrió averiguarlo mediante el uso de GetIntVec y SetIntVec, a nivel de Assembler, tomando como INT 21h, donde Ah=35h -> GetIntVec y Ah=25h -> SetIntVec. En la función Ah=35h, donde Al=Nº de IRQ , devuelve en CS:BS el puntero de la interrupción (segmento y corrieminto), dándome como dirección del PIC1 (para cualquier IRQ de 0 a 7) la dirección 0x020h / 0x021h, y para el PIC2 (para cualquier IRQ de 8 a 15) la dirección 0x0A0h / 0x0A1h. Luego de obtener las 2 direcciones, probé un "Pokeeo" sin enmascarar para producir un cuelgue intencional de la pc, utilizando simplemente la rutina Port[$21] y Port[$A1]. De todas maneras y más aún que implementé estas rutinas en un 80486DX (procesador Ciryx - MS-DOS 6.22 Win 3.11), recomendaría verificar bien, cual es la dirección del PIC2.

Saludos.

 Responder



Google
 


 Temas de interés 
No hay mensajes nuevos amplificador para electromiografo
No hay mensajes nuevos Detectar cambio de estado (VB)
No hay mensajes nuevos Estado inicial de 555
No hay mensajes nuevos Estado de una reactancia
No hay mensajes nuevos Diseño de un relé de estado solido DC

Foros de Electronica
|| Cuestiones Elementales de Electrónica || Fuentes de alimentacion || Circuitos de radio || Diseño de circuitos en general ||
|| Sistemas de Audio: Preamplificadores, Ecualizadores || Amplificadores || Reparación || Discusión ||
|| Microcontroladores y sistemas embebidos || Circuitos logicos combinacionales y secuenciales || Interfaces y Programacion || Dudas en general || Sistemas de Video || PC Hardware || Telematica y comunicaciones || Tecnologias moviles || Software Electronico || Robotica, Domotica y Mecatronica || Autotrónica || Automatizacion, Electronica industrial y de Potencia || Documentacion, circuitos y esquemas || Donde Las Ideas Convergen... || Tutoriales y Manuales || Proyectos Prácticos ||