Está en la página 1de 27

PROGRAMACIN DE

INTERRUPCIONES EN C

INTERRUPCIONES DE LA HCS12

En esta seccin, primeramente vamos a examinar la


diferencia entre polling e interrupcin y luego describir las
diferentes interrupciones de la HCS12.

INTERRUPCIONES DE LA HCS12
Interrupciones versus Polling
Un solo microcontrolador puede servir a varios
dispositivos. Hay dos maneras de lograr esto:
interrupciones y polling. En el mtodo de interrupcin, en
donde cualquier dispositivo necesite servicio, el
dispositivo notifica al microcontrolador mediante el envo
de una seal de interrupcin.

INTERRUPCIONES DE LA HCS12
Interrupciones versus Polling
El programa asociado con la interrupcin se llama Rutina de
Servicio de Interrupcin (siglas en ingls:ISR) o manejador
de interrupcin (interrupt handler).
En el polling, el microcontrolador continuamente monitoriza el
estado de un dispositivo dado; cuando la condicin de estado
se logra, desarrolla el servicio.

INTERRUPCIONES DE LA HCS12
Rutina de Servicio de Interrupcin
Para cada interrupcin, debe de haber una rutina de servicio de
interrupcin (ISR), o un manejador de interrupcin. Cuando una
interrupcin es invocada, el microcontrolador corre la rutina de
servicio de interrupcin. Por cada interrupcin, hay una localidad
fija en memoria que mantiene la direccin de inicio de la ISR. Al
grupo de localidades de memoria separadas para mantener las
direcciones de los ISRs se llama Tabla de Vectores de
Interrupcin.

INTERRUPCIONES DE LA HCS12
Interrupciones y el Registro Bandera
Entre los bits D0 a D7 del Registro CCR, hay dos bits que estn
asociados con la interrupcin: I y X. La bandera I es usada para
mascarar (ignorar) globalmente las peticiones de interrupcin que
puedan venir del pin de IRQ o de interrupciones mascarables
pertenecientes a los perifricos. Para permitir la peticin de
interrupcin a travs del pin IRQ y perifricos, esta bandera debe
ser borrada (I=0). Esto se logra mediante la instruccin CLI. Para
que las peticiones sean ignoradas utilizamos la instruccin SEI.

INTERRUPCIONES DE LA HCS12
Pasos en la ejecucin de una interrupcin
1.
Se termina de ejecutar la instruccin actual
2.
El registro PC es empujado hacia el Stack
3.
El registro Y es empujado hacia el Stack
4.
El registro X es empujado hacia el Stack
5.
Los registros A:B son empujados hacia el Stack
6.
El CCR actual es empujado hacia el Stack
7.
La CPU busca la direccin de la rutina de servicio de interrupcin en la tabla del vector de
interrupcin y coloca esta direccin en el Contador de Programa.
8.
El bit I del registro CCR es puesto a 1 para asegurar que otra interrupcin no afecte a la CPU
mientras sirve a la peticin actual.
9.
Con la nueva PC, la CPU inicia la bsqueda y ejecucin de las instrucciones asociadas a la
interrupcin.
10. La ltima instruccin de la ISR debe ser RTI. Se recupera lo almacenado en el Stack.

INTERRUPCIONES DE LA HCS12
Tabla de Vector de Interrupcin

INTERRUPCIONES DE LA HCS12
Categora de las Interrupciones
Los siguientes son las principales
interrupciones de la HCS12:

categoras

de

Mascarables y No-mascarables basados en pin de hardware.


Hay dos pines en la HCS12 que estn asociadas con la

interrupcin por hardware. Estos son IRQ (interrupt request) e


XIRQ. La XIRQ tambin se le refiere como Interrupcin Nomascarable (NMI).

INTERRUPCIONES DE LA HCS12
Categora de las Interrupciones
Interrupcin por Software (SWI)
Una ISR puede ser llamado como resultado de la ejecucin de

una SWI. Se le refiere como interrupcin por software debido a


que fue invocado por software, no por un hardware externo o
cualquier perifrico.

INTERRUPCIONES DE LA HCS12
Categora de las Interrupciones
Instrucciones de Excepcin Invlida (TRAP)
Esta interrupcin pertenece a la categora de interrupciones

referidas como instrucciones de excepcin. La interrupciones de


excepcin son invocadas internamente por la CPU siempre que
haya condiciones (excepciones) que la CPU no pueda manejar.

INTERRUPCIONES DE LA HCS12
Categora de las Interrupciones
Interrupciones por Perifricos
Una ISR puede ser llamado como resultado de una condicin

iniciada por un dispositivo perifrico tales como un temporizador


o conversor anlogo-a-digital.

INTERRUPCIONES DE LA HCS12
Habilitando y deshabilitando las Interrupciones
Globalmente
Al reinicio, todas las interrupciones estn deshabilitadas
(enmascaradas),
significando
que
ninguna
ser
respondida por el microcontrolador si son activadas. Las
interrupciones deben ser habilitadas por software
(instruccin CLI) para que el microcontrolador le responda.

INTERRUPCIONES DE LA HCS12
Habilitando y deshabilitando las Interrupciones
Globalmente
La mayora de las interrupciones son habilitadas
globalmente (des-enmascaradas) por el bit I del registro
CCR. El bit I es el responsable de habilitar (desenmascarar) y deshabilitar (mascarar) el IRQ y muchas
de las interrupciones de perifricos.

INTERRUPCIONES DE LA HCS12
Habilitando y deshabilitando las Interrupciones Globalmente
Para habilitar la interrupcin perteneciente al bit I, tomamos los
siguientes pasos:
El bit I del registro CCR se debe poner a cero (0) para permitir que la bandera

local de interrupcin surta efecto. Hacemos esto con la instruccin CLI.


Si I = 0, las interrupciones estn des-enmascaradas y sern respondidas si el
bit correspondiente en la bandera de interrupcin local estn tambin
habilitadas. Si I = 1, ninguna interrupcin ser respondida, aunque el bit
asociado en el registro de bandera de interrupcin local est habilitado.

PROGRAMACIN DEL TEMPORIZADOR DE


INTERRUPCIONES

En un tema anterior discutimos cmo utilizar los


temporizadores de la HCS12 con el mtodo de encuesta
(polling). En esta parte utilizaremos las interrupciones
para programar los temporizadores de la HCS12.

PROGRAMACIN DEL TEMPORIZADOR DE


INTERRUPCIONES
Usando interrupciones para volcar la bandera del temporizador
En tema anterior se indica que la bandera de desbordamiento del
temporizador del TCNT (TOF) se levanta cuando el temporizador de
vuelca. En ese tema, tambin mostramos como monitorizar TOF con
la instruccin while (! (TFLG2 & TFLG2_TOF_MASK)); . Con la
encuesta de TOF, tenemos que esperar hasta que TOF se levante. El
problema con ste mtodo es que el microcontrolador est atado a la
espera de TOF, y no puede hacer nada ms. Utilizando interrupciones
resolvemos este problema y evitamos atar al microcontrolador.

PROGRAMACIN DEL TEMPORIZADOR DE


INTERRUPCIONES
Usando interrupciones para volcar la bandera del
temporizador
Si la bandera de interrupcin del temporizador de TOI en el
registro TSCR2 es habilitado, cada vez que el temporizador
se vuelca, TOF se levanta, y el microcontrolador es
interrumpido en lo que est haciendo y salta a la direccin
$FFDE en la tabla de vector de interrupcin para servir al
ISR.

PROGRAMACIN DEL TEMPORIZADOR DE


INTERRUPCIONES

PROGRAMACIN DE LA INTERRUPCIN
EXTERNA DE HARDWARE
El HCS12 tiene dos interrupciones de hardware: IRQ y XIRQ. Se
pueden utilizar como interrupciones de hardware externos. El
IRQ es una seal de entrada a la CPU que puede ser
enmascarado (ignorado) y desenmascarado a travs del uso de
las instrucciones CLI y SEI. Sin embargo, XIRQ, que es tambin
una seal de entrada a la CPU, no puede ser enmascarado y
desenmascarado utilizando las instrucciones CLI y SEI y por sta
razn se le una interrupcin no enmascarable (NMI).

PROGRAMACIN DE LA INTERRUPCIN
EXTERNA DE HARDWARE
Interrupcin Externa IRQ
El pin PEI de la HCS12 pertenece a la interrupcin de hardware externo
IRQ. La ubicacin $FFF2 y $FFF3 en tabla de vector de interrupcin
pertenece al IRQ. El IRQ es parte del grupo de interrupciones
enmascarables que se habilitadas y deshabilitadas globalmente por el
bit I del registro CCR. Adems del bit I del registro CCR, tambin
debemos habilitar el IRQ de forma local mediante el bit IRQE del registro
INTCR (registro de control INT). El registro INTCR se muestra en la
figura. Cmo se activa? Hay dos tipos de activacin para el IRQ: (1)
activado por nivel, y (2) por flanco. Utilizamos el bit IRQEN del registro
INTCR para que sea activado por flancos o nivel.

PROGRAMACIN DE LA INTERRUPCIN
EXTERNA DE HARDWARE
IRQ disparado por nivel
En el modo disparado por nivel, el pin IRQ es normalmente alto, y si se aplica
una seal de bajo nivel, se dispara la interrupcin. Entonces el
microcontrolador se detiene sea lo que est haciendo y salta a la tabla de
vector de interrupcin para servir a la interrupcin. Esto se llama una
interrupcin disparado por nivel o activado por nivel. La seal de bajo nivel en
el pin IRQ se debe retirar antes de la ejecucin de la ltima instruccin de la
rutina de servicio de interrupcin, RTI; de lo contrario, se generar otra
interrupcin. En otras palabras, si no se elimina la seal de interrupcin de
bajo nivel antes de que termine el ISR, se interpreta como otra interrupcin y
el HCS12 salta a la tabla de vectores para ejecutar el ISR de nuevo.

PROGRAMACIN DE LA INTERRUPCIN
EXTERNA DE HARDWARE
Como se dijo antes, el bit IRQE en el registro INTCR determina el
nivel o el modo de disparo por flanco de la interrupcin de
hardware IRQ. Por ejemplo, la instruccin "BSET INTCR,%
11000000" o "INTCR = 0xC0" hace que IRQ haga lo que se llama
una interrupcin por flanco, con una seal de alto a bajo
aplicado al pin IRQ interrumpir el controlador y lo obligar a
saltar a la posicin $ FFF2 en la tabla de vectores para dar
servicio al ISR (asumiendo que el bit I est habilitada en el
registro CCR).

PROGRAMACIN DE LA INTERRUPCIN
EXTERNA DE HARDWARE
XIRQ interrupcin externa XIRQ
El pin PE0 de la HCS12 pertenece a la interrupcin de hardware externa XIRQ no
mascarable. Las localidades de la tabla de interrupcin SFFF4 y SFFF5 pertenecen a
XIRQ. El XIRQ es una interrupcin no mascarable y se desactiva con reset. Debemos
habilitarlo borrando el bit X del registro CCR. Al reinicio, el bit X es ALTO. lo cual hace
que no est disponible. Despus del reinicio, cuando est estabilizado la CPU la
habilitamos una sola vez y a partir de entonces cada vez que se activa el pin XIRQ
(va LOW) la CPU ir a la tabla de vectores para ir a buscar la direccin de la ISR.
Despus de habilitar la XIRQ (X bit = 0) no podemos desactivarlo para bloquear XIRQ
y esa es la razn por la que se llama la interrupcin no mascarable. Contraste esto
con el pin IRQ, que podemos utilizar el bit I para enmascarar o desenmascarar.
Observe tambin que a diferencia de la IRQ, no hay necesidad de habilitarla
localmente. Hay que destacar que la habilitacin de XIRQ se hace una vez y slo a
travs del bit X del registro CCR. El XIRQ es disparado por nivel solamente; no hay
ninguna opcin de disparo por flanco disponible para esta interrupcin.

PRIORIDAD DE INTERRUPCIN EN LA
HCS12
El siguiente tema que debemos tratar es. Qu sucede
si dos interrupciones se activan al mismo tiempo?
Cul de estas dos interrupciones se responde
primero? La prioridad de Interrupcin es el principal
tema de discusin en esta seccin.

PRIORIDAD DE INTERRUPCIN EN LA
HCS12
Prioridad de Interrupcin en el Reset
Cuando el HCS12 se enciende, las prioridades se asignan de acuerdo a la tabla
. Esta tabla muestra que el pin de reset de hardware tiene la prioridad ms
alta. De la tabla vemos tambin, por ejemplo, que si las interrupciones de
hardware externo XIRQ y IRQ se activan al mismo tiempo, la XIRQ se atiende
primero. Slo despus que XIRQ ha sido atendida es servida la IRQ ya que
tiene la prioridad ms baja. De hecho, todas las interrupciones asociadas con
bit I tienen la prioridad ms baja que XIRQ. En realidad, el esquema de
prioridades en la tabla no es ms que una secuencia de verificacin interna en
la que la HCSI2 encuestas las interrupciones en el orden indicado en la tabla, y
responde en consecuencia.

PRIORIDAD DE INTERRUPCIN EN LA
HCS12
Ajuste de prioridad de interrupcin con el registro HPRIO
No podemos alterar la prioridad asignada a las primeras seis
interrupciones mostradas en la tabla. Eso significa XIRQ tiene
menos prioridad que el reset en todo momento. Sin embargo,
podemos cambiar la prioridad asignada a la IRQ y los perifricos.
Esto se realiza mediante la programacin de un registro llamado
HPRIO (prioridad de interrupcin ms alta de E/S). La figura
muestra los bits en el registro HPRIO. Al restablecimiento del
encendido, el registro HPRIO contiene valor $F2, haciendo la IRQ la
prioridad ms alta entre los perifricos. Para dar una mayor
prioridad a alguno de los perifricos, cargaremos el valor que se
mostr en la tabla anterior en el registro HPRIO.