Sistemas Basados en
Microprocesadores
Manejo de Interrupciones
http://paginaspersonales.deusto.es/jonathan.garibay/
Interrupciones
Una interrupción es un evento que es identificado
por el µcontrolador, y que interrumpe el proceso
normal de un programa.
Cuando finaliza la atención de la interrupción se continua
en el punto donde se había interrumpido el programa.
Los eventos o fuentes de interrupción son muchos y
muy variados:
Interrupción externa por flanco, por cambio de estado,
por fin de temporización…
http://paginaspersonales.deusto.es/jonathan.garibay/
Interrupciones (continuación…)
Los µcontroladores PIC incluyen un sistema de
interrupciones basado en dos niveles de prioridad.
Una interrupción de alta prioridad puede interrumpir el
tratamiento de una de baja prioridad pero no a la inversa.
Por compatibilidad, el sistema de interrupciones con
prioridades está desactivado por defecto de forma
que se trabaja sin prioridades.
El bit IPEN del registro RCON habilita (1) o no (0) el
sistema de prioridades de los PIC18.
http://paginaspersonales.deusto.es/jonathan.garibay/
Interrupciones (continuación…)
Cuando se produce una interrupción, se realiza una
llamada automática a la rutina de interrupción.
Las rutinas de interrupción tienen una posición específica
dentro de la memoria de programa.
0x0008 para la rutina de interrupción de alta prioridad.
0x0018 para la rutina de interrupción de baja prioridad.
Si no se usan prioridades, sólo existe un único vector y está
situado en la posición 0x0008.
http://paginaspersonales.deusto.es/jonathan.garibay/
Interrupciones (continuación…)
Cada fuente de interrupción se controla por medio de 3 bits: Bit de prioridad: permite asignar a cada fuente de
interrupción una prioridad alta (1) o baja (0).
Siempre se llama xxIP (donde “xx” es el nombre de la fuente de interrupción).
Bit de habilitación: permite habilitar (1) o no (0) cada fuente de interrupción.
Siempre se llama xxIE
Bit de señalización o “Flag”: informa que se ha detectado (1) o no (0) una interrupción.
Siempre se llama xxIF
http://paginaspersonales.deusto.es/jonathan.garibay/
Interrupciones (continuación…)
Las interrupciones tienen un habilitador global
además del habilitador individual de cada fuente de
interrupción:
El bit GIE/GIEH del registro INTCON:
Si se usan prioridades (bit GIEH). habilita las interrupciones
configuradas como de alta prioridad.
Si no se usan prioridades (bit GIE), habilita todas las
interrupciones que tenga su habilitador individual activado.
El bit PEIE/GIEL del registro INTCON:
Si se usan prioridades (bit GIEL), habilita las interrupciones
configuradas como de baja prioridad.
Si no se usan prioridades (bit PEIE), habilita las interrupciones
relacionadas con periféricos del µcontrolador.
http://paginaspersonales.deusto.es/jonathan.garibay/
Interrupciones (continuación…)
Los habilitadores globales se ponen a 0 cuando se
produce una interrupción.
Si no hay prioridades sólo el bit GIE.
Si hay prioridades, el bit GIEH o el GIEL, dependiendo de
la prioridad de la interrupción generada.
Los flags individuales se ponen a 1 cuando se
produce su interrupción correspondiente.
Es necesario ponerlos a 0 manualmente para que no
salte de nuevo la interrupción (sin haberse producido).
Aunque la interrupción no esté habilitada, el flag se pone
a 1 cuando sucede el evento, pero no salta la
interrupción.
Se pone a 1 con la
instrucción retfie
http://paginaspersonales.deusto.es/jonathan.garibay/
Interrupciones (continuación…)
Instrucciones de control
retfie: regreso de interrupción con habilitación (pone a 1
los bits GIE, GIEH o GIEL según corresponda)
Tipo de evento Bits afectados
No hay prioridades GIE
Hay prioridades y se ha generado una
interrupción de alta prioridadGIEH
Hay prioridades y se ha generado una
interrupción de baja prioridadGIEL
http://paginaspersonales.deusto.es/jonathan.garibay/
Interrupciones de E/S
Hay dos tipos de interrupciones de E/S diferentes en los PIC18: 3 interrupciones externas independientes (INT0 con la
línea RB0, INT1/RB1 e INT2/RB2).
Se produce al detectar un flanco, ascendente o descendente, configurable por medio del bit INTEDGx.
Se puede utilizar para el control de interruptores, pulsadores o cualquier dispositivo que genere un señal digital.
La interrupción INT0 no dispone del bit de prioridad, y se considera siempre como de prioridad alta.
Interrupción por cambio de estado en <RB4:RB7>.
Se produce cuando cambia el estado (pasar de „0‟ a „1‟ o de „1‟ a „0‟) de cualquiera de las 4 líneas.
Se utiliza principalmente para el control de teclados matriciales.
http://paginaspersonales.deusto.es/jonathan.garibay/
Interrupciones de E/S (continuación…)
Trabajo personal:
Diferenciar entre la E/S programada y la E/S por
interrupción.
http://paginaspersonales.deusto.es/jonathan.garibay/
Registros de Manejo de Interrupciones
Depende del valor
del bit IPEN
FlagsHabilitadores
individualesHabilitadores
globales
http://paginaspersonales.deusto.es/jonathan.garibay/
Registros de Manejo de Interrupciones (Continuación…)
Prioridades
Bits de configuración
específicos de una
interrupción
http://paginaspersonales.deusto.es/jonathan.garibay/
Registros de Manejo de Interrupciones (Continuación…)
…
…
http://paginaspersonales.deusto.es/jonathan.garibay/
Ejemplo de funcionamiento
org 0x00
0x0000 inicio goto inicio
…
0x0008 btfss INTCON,RB0IF
0x000A retfie
0x000C bcf INTCON,RB0IF
0x000E incf PORTA, F
0x0010 retfie
…
0x003A inicio clrf TRISA
0x003C movlw 0xF0
0x003E movwf TRISB
0x0040 clrf PORTA
0x0042 bsf INTCON,RBIE
0x0044 bcf INTCON,RBIF
0x0046 bsf INTCON,GIE
0x0048 bucle goto bucle
…
PCPila
31
30
29
…
0
INTCON
PORTA PORTB
http://paginaspersonales.deusto.es/jonathan.garibay/
Resumen
Cuando se produce una interrupción:
Se pone a „1‟ el bit de flag de la interrupción causante.
Se pone a „0‟ el bit global de habilitación.
Si no hay prioridades, se pone a „0‟ el bit GIE.
Si hay prioridades, se pone a „0‟ el bit GIEH o GIEL, según
corresponda.
Se carga en el PC la dirección del vector de interrupción.
Si no hay prioridades, se carga la dirección 0x0008.
Si hay prioridades, se carga la dirección 0x0008 o 0x0018,
según corresponda.
http://paginaspersonales.deusto.es/jonathan.garibay/
Resumen (Continuación…)
Para atender una interrupción:
Se busca la interrupción causante mirando el bit de flag.
Se va a la rutina de interrupción específica:
Se pone a „0‟ el bit de flag de la interrupción.
Se atiende la interrupción.
Se finaliza la rutina con la instrucción retfie.
Si no se encuentra la interrupción se finaliza la rutina con
la instrucción retfie.Si se da este caso, esto
nos indica que hay un
error en la programación.