Interrupciones del puerto paralelo
| #11 |
|
Marcelo
Colaborador
|
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 |
||||||||||||
| #12 |
| #13 |
|
Marcelo
Colaborador
|
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
|
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
|
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
|
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
|
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
|
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 :
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).
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:
Si la IRQ >= 8, entonces tambien tenes que hacer
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
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
PD : te adjunto el source de TrapInt. Saludos. |
|||||||||||
|
|
||||||||||||
| #19 |
|
Marcelo
Colaborador
|
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
|
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. |
|||||||||||||
|
|
||||||||||||||
|
| Temas de interés | |
|---|---|
| amplificador para electromiografo | |
| Detectar cambio de estado (VB) | |
| Estado inicial de 555 | |
| Estado de una reactancia | |
| 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 || |
Site Map
© Foros de Electrónica
Comunidad Internacional de Electrónicos
Powered by phpBB © 2001, 2005 phpBB Group
Acerca de || Política de privacidad
© Foros de Electrónica
Comunidad Internacional de Electrónicos
Powered by phpBB © 2001, 2005 phpBB Group
Acerca de || Política de privacidad

