Explora Libros electrónicos
Categorías
Explora Audiolibros
Categorías
Explora Revistas
Categorías
Explora Documentos
Categorías
Microprocesadores
Práctica #5
Integrantes:
Maestro: Saucedo F.
1
INTRODUCCION
Programa principal
I1
I2 señal de interrupción
.Ii
Ii+1
Rutina de
tratamiento i1
i2
Podemos, pues, ver una interrupción como un salto a subrutina (rutina de tratamiento)
ocasionado por una señal externa, y no por una instrucción del programa. De esta forma se pueden
eliminar los tiempos muertos de consulta de la E/S programada
La implementación de un sistema de interrupciones implica introducir una fase de consulta de
las líneas de interrupción al final de la ejecución de cada instrucción. En un procesador sin sistema de
interrupciones, se podría conseguir un efecto similar introduciendo una instrucción de consulta y la
correspondiente de salto sobre el valor de la consulta, detrás de cada instrucción natural del programa.
De esta forma se garantizaría la respuesta al dispositivo de E/S en el momento que pasa a estado
disponible, al tiempo que la CPU ejecuta instrucciones útiles del programa. El precio a pagar sería el
recargo introducido por la ejecución de las parejas de instrucciones de consulta y salto introducidas
detrás de cada instrucción útil del programa. Sería algo así como una E/S programada en la que en
lugar de preguntar en el mismo punto del programa por el estado del periférico, se replica la consulta
por todo el programa, intercalándose con la ejecución de las instrucciones útiles.Pues
2
bien, un sistema de interrupciones podemos verlo como la integración en hardware del supuesto
software anterior, es decir, la integración de la consulta y posible salto dentro de la ejecución de cada
instrucción del repertorio.
El mecanismo de interrupción de un procesador tiene que implementar todas las medidas que
hagan que se pueda bifurcar a la rutina de tratamiento y recuperar el estado del programa interrumpido
cuando la rutina finaliza su ejecución. En el siguiente esquema se detallan las fases que tienen lugar
en la atención a una interrupción producida por algún dispositivo periférico:
petición de interrupción
programa programa
rutina de tratamiento
(1) El programa en ejecución (CPU) activa el sistema de interrupciones utilizando instrucciones que
operan (ponen a 1 y a 0) sobre el bit de capacitación de las interrupciones I del registro de estado
(RE):
I C N Z
bit de interrupción
(2) Se produce la petición de interrupción por parte de algún dispositivo periférico en un instante
de tiempo impredecible para la CPU.
CPU
señal de interrupción
PC línea de interrupción (INT)
3
(4) La CPU salva automáticamente el estado en la pila, es decir, el contador de programa (PC) y el
registro de estado (RE):
CPU Memoria
PC
SP
PC
1 RE
(5) La CPU obtiene la dirección de la rutina de tratamiento a partir del vector de interrupción (VI),
que usualmente se ubica en memoria.
CPU Memoria
PC
vector de interrupción
dirección r.t.
(6) La CPU descapacita las interrupciones (I = 0) para que durante la ejecución de la primera
instrucción de la rutina de tratamiento no se vuelva a detectar la misma interrupción y provoque un
bucle infinito.
CPU
PC
4
Memoria
PC
PC
RE
RE SP
(9) La CPU continúa la ejecución del programa interrumpido, quedando las interrupciones
capacitadas automáticamente al recuperarse el valor I = 1 del RE.
5
Memoria
Tabla de vectores de Interrupción d.r.t. interrupción 0
d.r.t. interrupción 1
d.r.t. interrupción 2
Autovectorizadas
d.r.t. interrupción 3
vector de interrupción
d.r.t. interrupción i
d.r.t. interrupción N
CPU
control control control
6
+5Vcc
INT
Programa
Eliminar fuente
de interrupción
interrupción
Leer estado de E/S n
RTI
Eliminar fuente
RTI de interrupción
RTI
7
2.2 Interrupciones vectorizadas:
Disponen de dos líneas de interrupción, una de petición y otra de reconocimiento.
El vector de interrupción es generado por el dispositivo que produce la interrupción.
Utiliza un mecanismo de daisy chaining en la transmisión de la señal de reconocimiento.
bus de datos
RINT
línea de reconocimiento de vector
+ prioridad -
La lógica interna del paso de la señal de reconocimiento por encadenamiento (daisy chain) para cada
módulo se representa en la siguiente figura:
INT
CPU
vector INT
RE
RINT
8
2.3 Prioridades
Cuando dos o más dispositivos de E/S generan una petición de interrupción, el sistema de
prioridades determina la interrupción que se atiende en primer lugar.
Interrupciones no vectorizadas: la prioridad la establece el software de encuesta con el orden de
recorrido de todos los dispositivos de E/S salida conectados a una línea. Es decir, se establece por
software.
Interrupciones vectorizadas: la prioridad la determina el orden de proximidad a la CPU establecido
por la línea de retorno de interrupción Es decir, se establece por hardware.
Cuando existen más de una línea de interrupción, la prioridad viene establecida por hardware en el
diseño del procesador:
INT1
INT2
.
prioridad
.
.
INTn
CPU
E/S 1 E/S 1
E/S 1
Aunque suele ser frecuente, para minimizar el número de pines del chip, que las diferentes
líneas entren codificadas a la CPU, siendo necesario el uso de un codificador externo:
INT1
INT2
INT
COD 1
INT
m = log2 n 2
CPU RINT (reconocimiento)
INT
código reconocido
3
En estos casos suele existir una única señal de reconocimiento RINT, generándose por las líneas menos
significativas del bus de direcciones el código de la interrupción reconocida, que será la más prioritaria entre
las que realizaron la petición.
9
3. Enmascaramiento de interrupciones
El sistema de interrupciones de un procesador dispone en general de la posibilidad de ser
inhibido, es decir, impedir que las interrupciones sean atendidas por la CPU. Esta posibilidad hay que
utilizarla en determinadas ocasiones en las que por ningún concepto se puede interrumpir el programa
en ejecución. Además de la inhibición total del sistema, existe la posibilidad de enmascarar
individualmente algunas de las líneas de interrupción utilizando un registro de máscara:
CPU
RE
INT 0
INT 2
Registro de Máscara
La descapacitación de algunas interrupciones también se puede realizar a nivel local del
propio módulo de E/S, actuando sobre su registro de control.
A nivel software también se pueden inhibir las interrupciones producidas sobre una misma
línea por diferentes periféricos, en la fase de identificación de la rutina de tratamiento correspondiente.
4. Anidamiento de interrupciones
Un tema importante en un sistema de interrupciones es el de la capacidad de anidar
interrupciones, es decir, la posibilidad de interrumpir la rutina de tratamiento de una interrupción
por la generación de otra interrupción. Tal posibilidad viene determinada por el sistema de prioridades:
"un dispositivo sólo puede interrumpir a otro cuando su nivel de prioridad es mayor que el que se está
atendiendo"
prioridad
CPU
prioridad
INT1
La CPU dispone de tres bits en su registro de estado para permitir la inhibición de forma
independiente cada línea:
Las interrupciones con menor prioridad no podrán interrumpir la rutina de tratamiento de una de
mayor prioridad, por lo que la secuencia de peticiones y servicios será la que aparece en el siguiente
esquema:
dir1
dir1+1
d2 Rutina INT2
11
La evolución consiguiente de la pila y el estado de la CPU (CP y RE) será el siguiente:
llega INT1 llega INT2
llega INT0 fin INT0 fin INT1 atiende INT2 fin INT2
dir1+1
011
12
INT7
INT6
INT5
INT4
INT3
INT2
INT1 IRQ
INT0
R/W
CS
E
Z4
A4
A3 Z3
Z2
A2
Z1
A1
13
MARCO TEORICO
void TMR0_ISR(void)
TMR0_flag=0;
14
void TMR1_ISR(void)
PORTCbits.RC1=~PORTCbits.RC1;
TMR1_flag=0;
#pragma code
Ahora hay dos comprobaciones en la función ISR para ver si es TMR0 o TMR1 el
causante de la llamada. En cada caso se ejecuta un código distinto y se pone a
0 la bandera (IF) correspondiente. Notad que al contrario de lo que pasaba con
TMR0, la ISR del TMR1 no se demora apenas. Simplemente cambia el valor del
pin RC1 y vuelve.
void main() {
TRISC=0; PORTC=0x00;
15
// Starts TMR0, rolls over every 128x65536 machine cycles = 1.67 sec @ 20 Mhz
T0CON = 0b10000110;
// Starts TMR1, rolls over every 2x65536 machine cycles = 0.02 sec @ 20 Mhz
T1CON= 0b10010001;
enable_global_ints; enable_perif_ints;
while(1);
16
llegan muy rápidamente es posible que algunos lleguen mientras estamos en la
segunda tarea. Como dicha tarea no se interrumpirá (ella misma es una
interrupción) algunos pulsos no serán contados y perderemos dicha información.
La solución será usar prioridades en las interrupciones.
La elección de un modo u otro depende del valor del bit IPEN (Interrupt Priority
Enable) del registro RCON. Como siempre, en el fichero int_defs_C18.h tenemos
algunas definiciones para facilitarnos la tarea:
17
// High priority interruption
#pragma code
#pragma code
También habrá que hacer algunos (pocos) cambios en el programa principal para
activar el modo de prioridades:
18
void main() {
TRISC=0; PORTC=0x00;
// Starts TMR0, rolls over every 128x65536 machine cycles = 1.67 sec @ 20 Mhz
T0CON = 0b10000110;
// Starts TMR1, rolls over every 2x65536 machine cycles = 0.02 sec @ 20 Mhz
T1CON= 0b10010001;
enable_priority_levels;
enable_high_ints;
enable_low_ints;
while(1);
19
En la solución:
1. Lista de partes
Descripción Cantidad
Trajeta USB 1
Tablilla 1
Push Butoon N.A 4
LED 2(120-220)
Buzzer 1
2. Procedimiento.
20
3. Resultados claramente indicados.
- Una vez corregido el programa pasa a conectar nuevamente cada puerto para ver su
funcionamiento y esta vez logramos el resultado esperado.
21
4. Código
#include "..\int_defs_C18.h"
//#include "..\tipos.h"
void TMR0_ISR(void)
{
PORTCbits.RC0=1; Delay10KTCYx(255); PORTCbits.RC0=0;
TMR0_flag=0;
}
void TMR1_ISR(void)
{
PORTCbits.RC1=~PORTCbits.RC1;
TMR1_flag=0;
}
22
void main() {
TRISC=0; PORTC=0x00;
// Starts TMR0, rolls over every 128x65536 machine cycles = 1.67 sec @
20 Mhz
T0CON = 0b10000110;
// Starts TMR1, rolls over every 2x65536 machine cycles = 0.02 sec @ 20
Mhz
T1CON= 0b10010001;
enable_priority_levels;
enable_high_ints;
enable_low_ints;
while(1);
}
23
6. Tabla de función
7. Conclusiones
24
procesando una interrupción, aunque se produzca otra, tendrá que esperar. Esta
es una de las razones por las que un código de interrupción debe ser lo más
reducido posible.
Ahora hay dos comprobaciones en la función ISR para ver si es TMR0 o TMR1 el
causante de la llamada. En cada caso se ejecuta un código distinto y se pone a
0 la bandera (IF) correspondiente. Notad que al contrario de lo que pasaba con
TMR0, la ISR del TMR1 no se demora apenas. Simplemente cambia el valor del
pin RC1 y vuelve.
8. Bibliografia
http://www.zator.com/Hardware/H2_4.htm
http://galia.fc.uaslp.mx/~cantocar/ARQUI_COM_II/LIBRO%20IBM-PC/1204.htm
http://raulalejandroql.webcindario.com/atmel/8_Interrupciones.pdf
25