Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
Interrupciones por Hardware Pedidos de Interrupción: Son generadas por dispositivos de Entrada / Salida Interrupciones creadas por el procesador en respuesta a ciertos eventos (ej. división por cero) Tenemos que escribir la rutina de manejo de la interrupción Interrupciones por Hardware • MSX88 utiliza un espacio de direcciones diferente para el acceso a la Entrada/Salida que para acceder a la memoria. Vector de Interrupciones Programa (variables, subrutinas, programa ppal) Pila 0000h 03FFh 8000h Memoria RAM Registros del Timer Registros del PIC Registros de otros dispositivos Memoria de ES 0010h 0020h 0011h 0027h MOV IN / OUT Interrupciones - Instrucciones OUT puerto, registro De registro a puerto de E/S out 20h,al IN registro, puerto De puerto de E/S a registro in al, 24h El único registro que se puede usar es AL Interrupciones - Instrucciones CLI Deshabilitan las interrupciones STI Habilitan las interrupciones Interrupciones por Hardware • El msx88 tiene una única línea de interrupciones • Necesitamos un intermediario entre la CPU y las interrupciones • Controlador de Interrupciones Programable (PIC) Controlador Programable de Interrupciones El PIC tiene conectados los siguientes dispositivos a sus líneas de petición de interrupción: INT0 Conectado a la tecla F-10 INT1 TIMER, Contador de Eventos INT2 HANDSHAKE INT3 Controlador de DMA Tecla F10 Timer Handshake CDMA PIC CPUINT Controlador Programable de Interrupciones(2) El encargado de administrar las interrupciones es el Controlador Programable de Interrupciones (PIC) Los dispositivos que pueden interrumpir al procesador se conectan directamente al PIC, el PIC se conecta a la CPU. El PIC puede manejar 8 peticiones de interrupción independientes, numeradas de 0 a 7 (INT0 a INT7) Se atiende una interrupción a la vez. El número de interrupción es la prioridad, teniendo prioridad los números mas bajos. El manejador de la interrupción llamado deberá indicarle al PIC cuando termina de procesar la interrupción. Hasta que no se termine de atender a esta interrupción no se podrá atender a la siguiente interrupción. Controlador Programable de Interrupciones(3) El PIC tiene conectados los siguientes dispositivos a sus líneas de petición de interrupción: INT0 Conectado a la tecla F-10 INT1 TIMER, Contador de Eventos INT2 HANDSHAKE INT3 Controlador de DMA Controlador Programable de Interrupciones(4) El PIC posee varios registros donde podemos configurar/escribir u obtener su estado (con las instrucciones OUT e IN) Tiene 12 registros en total. Los registros se encuentran ubicados en forma consecutiva a partir de la dirección base (20h). Todos los registros son de 8 bits. EOI IMR IRR ISR INT 0 .. INT 7 EOI IMR IRR ISR INT0 INT1 INT2 INT3 INT4 INT5 INT6 INT7 Memoria E/S 20h 21h 22h 23h 24h Para trabajar con Interrupciones Indicar cual de las 8 interrupciones posibles vamos a permitir Escribir la rutina que va a atender la interrupción Indicar como hallar la subrutina Registros del Controlador de Interrupciones IMR (21h) Registro de Máscara de Interrupciones. Permite enmascarar selectivamente las interrupciones que va a recibir el PIC. Cada bit de este registro representa una línea de interrupción. Si el bit N es puesto en 1, la interrupción N estará inhibida. 1 1 1 1 0 1 0 1 Int1 e Int 3 habilitadas MOV AL, F5h OUT 21H, AL EOI IMR IRR ISR INT0 INT1 INT2 INT3 INT4 INT5 INT6 INT7 Memoria E/S 20h 21h 23h 24h 22h Registros del Controlador de Interrupciones INT0..7 (24h-2Bh) Cada uno de estos registros contiene la posición en el vector de interrupción correspondiente a la dicha interrupción EOI IMR IRR ISR INT0 INT1 INT2 INT3 INT4 INT5 INT6 INT7 Memoria E/S 20h 21h 23h 24h 22h Vectorización El proceso de atención de las interrupciones en el simulador es vectorizado La tabla de vectores de interrupción es el nexo entre el tipo de interrupción y el procedimiento designado para atenderlo (manejador de interrupciones) Esta tabla esta alojada en la posición de memoria 0000h La tabla posee 256 entradas (una por cada tipo) Cada entrada ocupa 4 bytes: 2 bytes para la dirección donde esta el manejador de ese tipo de interrupción 2 bytes siempre en 00h (por compatibilidad) Dir Subrutina L Dir Subrutina H 00 00 Dir Subrutina L Dir Subrutina H 00 00 Dir Subrutina L Dir Subrutina H 00 00 0000h 0001h 0002h 0003h 0004h 0005h 0006h 0007h 0008h 0009h 000Ah 000Bh 0 1 2 ¿Como configurar INT0 / 7? En INT0/7 ponemos la posición del vector de interrupción Dir Subrutina L Dir Subrutina H 00 00 Dir Subrutina L Dir Subrutina H 00 00 Dir Subrutina L Dir Subrutina H 00 00 0000h 0001h 0002h 0003h 0004h 0005h 0006h 0007h 0008h 0009h 000Ah 000Bh 0 1 2 si en INT0 puse el valor 2 ==> en 0008h tengo que poner la dirección donde comenzará la subrutina ¿Como configurar INT0 / 7? En INT0/7 ponemos la posición del vector de interrupción Dir Subrutina L Dir Subrutina H 00 00 Dir Subrutina L Dir Subrutina H 00 00 00 30 00 00 0000h 0001h 0002h 0003h 0004h 0005h 0006h 0007h 0008h 0009h 000Ah 000Bh 0 1 2 si en INT0 puse el valor 2 ==> en 0008h tengo que poner la dirección donde comenzará la subrutina ORG 3000h <cuerpo de la subrutina> 00 25 00 00 10 0028h 0029h 002Ah 002Bh si en INT0 puse el valor Ah(10d) ==> en 0028h(10x4) tengo que poner la dirección donde comenzará la subrutina ORG 2500h <cuerpo de la subrutina> ¿Como configurar INT0 / 7? En INT0/7 ponemos la posición del vector de interrupción Como cada posición ocupa 4 bytes, tomamos dicho valor y lo multiplicamos por 4 En esa posición de memoria debo guardar la dirección de comienzo de la subrutina que va a manejar la interrupción Ejemplo : si en INT0 = 15 ORG 60 = dir de comienzo si en INT0 = 11 ORG 44 = dir de comienzo si en INT0 = 0Ah ORG 28h = dir de comienzo si en INT0 = 10 ORG 28h = dir de comienzo EOI (20h) Fin de Interrupción. Es para avisarle al PIC que finalizó la rutina que atiende la interrupción. Se debe escribir el valor 20h PIC EQU 20h ….. MOV AL, 20h OUT PIC, AL Registros del Controlador de Interrupciones(2) Registros del Controlador de Interrupciones(3) IRR (22h) Registro de Petición de Interrupciones. Almacena las interrupciones pendientes. Cada bit de este registro representa una línea de interrupción. Cuando la interrupción se satisface, el bit de dicha línea se pone a cero. ISR (23h) Registro de Interrupción en Servicio. El bit que representa la línea de interrupción que se esta atendiendo estará en 1. El resto en 0. 0 0 0 0 0 1 1 0 0 0 0 0 1 0 0 0 Int1 e Int 2 están esperando Int3 se esta ejecutando Controlador Programable de Interrupciones(4) El PIC posee varios registros donde podemos configurar/escribir u obtener su estado (con las instrucciones OUT e IN) Tiene 12 registros en total. Los registros se encuentran ubicados en forma consecutiva a partir de la dirección base (20h). Todos los registros son de 8 bits. EOI IMR IRR ISR INT 0 .. INT 7 EOI IMR IRR ISR INT0 INT1 INT2 INT3 INT4 INT5 INT6 INT7 Memoria E/S 20h 21h 22h 23h 24h ¿Como programar el PIC? Desactivamos las interrupciones Configuramos el registro IMR para tener activas solo las interrupciones que nos interesen Configuramos el o los vectores de interrupción elegidos en los registros INT0 a INT7 (según corresponda) Por último, volvemos a activar las interrupciones Rutina de atención de la interrupción La CPU debe indicarle al PIC la culminación de la rutina de atención de la interrupción <Subrutina de interrup> ….. MOV AL, 20h OUT PIC, AL IRET Se debe escribir el valor 20h en el registro EOI Debe terminar con la instrucción IRET (desapila la dir de retorno y losflags) Tecla F-10 •Conectada a INT0 •Emite un pedido de interrupción cada vez que es apretada la tecla EOI IMR IRR ISR INT0 INT1 INT2 INT3 INT4 INT5 INT6 INT7 Memoria E/S 20h 21h 22h 23h 24h Tecla F-10 – Contar cantidad de veces presionada PIC EQU 20H EOI EQU 20H N_F10 EQU 10 ORG 40 IP_F10 DW 3000H ORG 2000H CLI MOV AL, 0FEH OUT PIC+1, AL MOV AL, N_F10 OUT PIC+4, AL ; MOV DX, 0 STI LAZO: JMP LAZO Constantes Inhabilito interrupciones AL = 11111110 IMR = 1111110 (solo INT0 hab) AL = 10 INT0 = 10 (pos 10 del vector) Habilito interrupciones Lazo infinito Configuración del PIC Tecla F-10 – Contar cantidad de veces presionada ORG 3000H RUT_F10: PUSH AX INC DX MOV AL, EOI OUT EOI, AL ; PIC: registro EOI POP AX IRET END Salvo AX Aviso al PIC que termina la sub AL = 20h Finalizar la subrutina Restauro AX Incremento contador Interrupciones por Hardware • MSX88 utiliza un espacio de direcciones diferente para el acceso a la Entrada/Salida que para acceder a la memoria. Vector de Interrupciones Programa (variables, subrutinas, programa ppal) Pila 0000h 03FFh 8000h Memoria RAM Registros del Timer Registros del PIC Registros de otros dispositivos Memoria de ES 0020h 0027h MOV IN / OUT Registros EOI IMR IRR ISR INT0 INT1 INT2 INT3 INT4 INT5 INT6 INT7 Memoria E/S 20h 21h 22h 23h 24h 10h 11h Contador Comparador Timer Timer Es un dispositivo contador de eventos. Posee dos registros (de 8 bits) CONT: Registro contador, que se incrementa cada 1 segundo COMP: Registro de comparación, cuando COMP y CONT son iguales, se genera una interrupción. El registro CONT no vuelve a cero cuando se genera una interrupción. 10h 11h Contador Comparador Memoria E/S Para utilizar el Timer Habilitar la interrupción en el PIC (Registro IMR) Configurar el registro COMP para que nos llame en el intervalo deseado Poner a cero el registro CONT Programar el manejador de interrupción. Timer TIMER EQU 10H PIC EQU 20H EOI EQU 20H N_CLK EQU 10 ORG 40 IP_CLK DW RUT_CLK ORG 1000H SEG DB 30H DB 30H FIN DB ? ORG 3000H RUT_CLK: PUSH AX 00 30 40 30H 30H ? 1000h FIN SEG Timer ORG 2000H CLI MOV AL, 0FDH OUT PIC+1, AL ; PIC MOV AL, N_CLK OUT PIC+5, AL MOV AL, 1 OUT TIMER+1, AL MOV AL, 0 OUT TIMER, AL MOV BX, OFFSET SEG MOV AL, OFFSET FIN-OFFSET SEG STI LAZO: JMP LAZO END 00 30 40 30H 30H ? 1000H FIN TIMER =10H N_CLK = 10 PIC = EOI = 20H 20H 11H 21H 10H 22H 23H 24H 25H Cont Comp EOI IMR IRR ISR INT0 INT1 Memoria E/S SEG Timer ORG 3000H RUT_CLK: PUSH AX INC SEG+1 CMP SEG+1, 3AH JNZ RESET MOV SEG+1, 30H INC SEG CMP SEG, 36H JNZ RESET MOV SEG, 30H RESET: INT 7 MOV AL, 0 OUT TIMER, AL MOV AL, EOI OUT PIC, AL POP AX IRET 30H 30H ? SEG FIN 11H 10H Cont Comp Memoria E/S BX = 1000h AL = 2
Compartir