Sie sind auf Seite 1von 29

INTERRUPCIONES

CONCEPTOS BSICOS
MICROCONTROLADORES PIC
PROGRAMACIN EN COMPILADOR C

Ing. Junior Figueroa Olmedo

DEFINICIN
Una solicitud de interrupcin (o simplemente interrupcin)
es un evento de origen interno o externo que, si es atendido,
hace que el microcontrolador interrumpa la ejecucin del
programa en curso y en su lugar ejecute las instrucciones de
otro programa.
Una solicitud de interrupcin se puede producir en cualquier
momento mientras se ejecuta cualquier instruccin de un
programa. Por ello, no es posible prever durante qu
instruccin ocurrir una interrupcin.
El manejo de interrupciones permite realizar programas que no
tienen que estar continuamente consultando sucesos internos
o externos mediante tcnicas de consultas, las cuales provocan
retardos o paradas en la ejecucin del programa principal.

FUNCIONAMIENTO

Cuando se produce una solicitud de interrupcin y sta es atendida


por el microcontrolador, se termina la ejecucin de la instruccin en
curso y se salta al programa de atencin (rutina de atencin) a dicha
solicitud de interrupcin, previamente definida por el programador.

Cuando se termina de ejecutar dicha rutina, el microcontrolador


retorna a la ejecucin del programa principal en la misma posicin de
la memoria del programa donde se produjo la interrupcin

FUENTES DE INTERRUPCIONES

INTERRUPCIONES INTERNAS: se originan en los


mdulos de entrada y salida del microcontrolador, la memoria
o la CPU. Por ejemplo: desbordamiento de temporizadores,
fin de escritura en la memoria EEPRON de datos, eventos que
tengan lugar en la CPU (una divisin por cero), etc.
INTERRUPCIONES EXTERNAS: se originan en un
perifrico y llegan al microcontrolador por alguno de sus
terminales.

INTERRUPCIONES Y RECURSOS ASOCIADOS

INTERRUPCIONES Y RECURSOS ASOCIADOS


Los bits de control utilizados para permitir o no el paso de las
solicitudes de interrupcin hacia la CPU se denominan mscaras.
INTERRUPCIONES ENMASCARABLES: se pueden habilitar o
inhabilitar por programa.
INTERRUPCIONES NO ENMASCARABLES: no se pueden
inhabilitar por programa, es decir, que estn siempre habilitadas.
Cuando una solicitud de interrupcin es atendida, el sistema de
interrupcin queda inhabilitado (el bit de control global es puesto a 0).
Entonces no llegar a la CPU ninguna nueva solicitud de interrupcin
que se produzca.
Para poder atender otras solicitudes de interrupcin, el programador
debe habilitar nuevamente el sistema; esto suele hacerlo el propio
programa que atiende la interrupcin.

ATENCIN A LOS SOLICITUDES DE


INTERRUPCIN
La solicitud de interrupcin que llega a la CPU, se atiende cuando
termina la ejecucin de la instruccin en curso.
Como en general no se conoce de antemano cul es esta instruccin,
hay que recordar la direccin de la instruccin que le sigue, para
regresar a ella cuando termine el programa que atiende a la
interrupcin.
Esa direccin est en el contador del programa (PC). La forma de
recordarla es guardar el contenido del PC en la pila, tal como lo hacen
las instrucciones de llamada a una subrutina.
El programa de atencin a una interrupcin es una subrutina que se
llama por interrupcin.
Una solicitud de interrupcin equivale a insertar una instruccin de
llamada a una subrutina (la que atiende la interrupcin) en un lugar no
previsible del programa.

ATENCIN A LOS SOLICITUDES DE


INTERRUPCIN

ATENCIN A LOS SOLICITUDES DE


INTERRUPCIN
Las etapas que transcurren al atender una solicitud de interrupcin
son las siguientes:
1.

El microcontrolador completa la ejecucin de la instruccin en


curso.

2.

El valor del PC se guarda en la pila, para recordar la direccin de


la instruccin a la que hay que regresar cuando termine la
atencin a la interrupcin.

3.

La direccin de la subrutina de atencin a la interrupcin se pone


en el PC, con lo cual se salta a esa direccin y comienza la
ejecucin de la subrutina.

4.

Se ejecuta la subrutina de atencin a la interrupcin. Como toda


subrutina, termina (su ejecucin) con una instruccin de retorno.

5.

Con la ejecucin de la instruccin de retorno, se regresa al


programa interrumpido.

INTERRUPCIONES FIJAS Y VECTORIZADAS


INTERRUPCIONES FIJAS: La subrutina que atiende la
interrupcin se coloca en un lugar fijo de la memoria de programa,
conocido de antemano por la CPU. En esa direccin debe estar la
primera instruccin de la subrutina de atencin a la interrupcin.
Puede haber una direccin de memoria diferente para cada fuente de
interrupcin o puede haber una direccin nica para todas las
solicitudes, como en los PIC; pero siempre son direcciones fijas..
INTERRUPCIONES VECTORIZADAS: En esta solucin, junto a
la solicitud de interrupcin, se le proporciona a la CPU la direccin de
la subrutina de atencin a la interrupcin, o alguna informacin que le
permita construirla.
Este dato que se le suministra a la CPU se conoce como vector de
interrupcin. Esta solucin, aunque es ms flexible que la primera, es
tcnicamente mucho ms compleja de implementar.

INTERRUPCIONES EN EL PIC16F877A
Maneja interrupciones enmascarables y fijas.
Tiene 14 fuentes de interrupcin.
El sistema se habilita o inhabilita globalmente mediante el bit GIE del
registro de funciones especiales INTCON.
Las interrupciones se habilitan o inhabilitan individualmente mediante bits
de los registros INTCON, PIE1 y PIE2.
Al ser todas las interrupciones fijas, todas las solicitudes, si estn
habilitadas, hacen que el microcontrolador pase a ejecutar
automticamente la instruccin que est en la direccin 0X04h de la
memoria de programa.
Dentro de la subrutina de atencin a la interrupcin, el programador debe
averiguar la fuente de la interrupcin consultando los bits apropiados en
los registros de funciones especiales (INTCON, PIR1 y PIR2) asociados al
sistema de interrupcin del PIC.

INTERRUPCIONES EN EL PIC16F877A

INTERRUPCIONES EN EL PIC16F877A
Entre las posibles fuentes de interrupcin estn las siguientes:
Interrupcin externa por el terminal RB0/INT.
Interrupcin por cambio en el nivel lgico de las entradas RB4:RB7
del puerto B.
Interrupcin por el desbordamiento de los temporizadores Timer0,
Timer1 y Timer2.
Interrupcin por algn evento en el mdulo CCP.
Interrupcin por el puerto serie USART.
Interrupcin por el convertidor A/D.
Interrupcin por escritura en la memoria interna EEPRON de datos.

INTERRUPCIONES EN EL PIC16F877A
Cuando se produce una solicitud de interrupcin, si el sistema en su
conjunto y la fuente particular estn habilitados, el microcontrolador
termina la instruccin en curso, guarda en la pila el valor del contador de
programa y salta a la direccin 04h de la memoria de programa.
El PIC16F877A tiene un nico
vector de interrupcin situado en la
direccin 04h del programa.
Al poseer un nico vector de
interrupcin, el PIC posee unos
registros
de
control
donde
mediante la utilizacin de banderas
o flags, el usuario puede determinar
que es lo que ha producido la
interrupcin. Adems en estos
registros se puede habilitar o no las
distintas fuentes de interrupcin e
incluso permite la habilitacin
general.

REGISTROS ASOCIADOS AL MANEJO DE


INTERRUPCIONES

GIE (Global Interrupt Enable): con este se habilita (con GIE=1) o inhabilita (con
GIE=0) el sistema global de interrupciones.
PEIE (Peripheral Interrupt Enable): con este bit se habilitan (PEIE=1) las
interrupciones de otras fuentes que no estn presentes en el registro INTCON sino
en los registros PIE.
TMR0IE, TMR0IF: Bits relacionados con la interrupcin del Timer0. Con el
TMR0IE puesto a 1 se habilita la interrupcin del Timer0. TMR0IF es el indicador de
desbordamiento del Timer0.
INTE, INTF: Bits relacionados con la interrupcin externa RB0/INT.
INTE=1habilita la interrupcin externa RB0/INT y INTF=1 informa que se ha
producido esta interrupcin.
RBIE, RBIF: Bits relacionados con la interrupcin por cambio de nivel en los bits
RB4 a RB7. El bit RBIE puesto a 1 habilita esta interrupcin. RBIF es el bit indicador.

REGISTROS ASOCIADOS AL MANEJO DE


INTERRUPCIONES
En los registros PIE (PIE1, PIE2) estn los bits para habilitar o inhabilitar las
interrupciones de los perifricos.
En los registros PIR (PIR1, PIR2) estn los bits indicadores de que ha sido
solicitada una interrupcin por los diferentes perifricos.

ATENCIN A UNA SOLICITUD DE


INTERRUPCIN EN EL PIC16F877A
a.

En primer lugar, el sistema de interrupcin del PIC debe estar habilitado,


es decir, el bit GIE del registro INTCON debe ser 1.

b.

En segundo lugar, la fuente de la interrupcin debe estar tambin


habilitada. Por ejemplo, si se trata de una interrupcin externa, el bit
INTE del registro INTCON debe ser 1.

c.

Si se dan estas condiciones, la solicitud progresa y el microcontrolador


guarda en la pila la direccin almacenada en el contador de programa y
salta a la direccin 04h de la memoria de programa. El bit GIE pasa
automticamente a 0, con lo cual se inhabilita el sistema de interrupcin y
no se atendern nuevas solicitudes.

d.

El sistema se habilita de nuevo cuando se ejecuta la instruccin retfie de


retorno al programa interrumpido desde la subrutina de atencin a la
interrupcin. La instruccin retfie pone el bit GIE a 1 y as el sistema de
interrupcin queda nuevamente habilitado, y con ello el PIC est listo
para atender nuevas solicitudes de interrupcin.

MANEJO DE INTERRUPCIONES MEDIANTE EL


COMPILADOR C
La directiva habitual en el manejo de las interrupciones es #INT_xxxx,
y especifica que la funcin que le sigue es una funcin de interrupcin;
adems, no se necesita ms parmetros.
Para los microcontroladores PIC16F877A hay 14 posibles directivas
que se muestran en la siguiente tabla.

MANEJO DE INTERRUPCIONES MEDIANTE EL


COMPILADOR C
Existe una directiva #INT_DEFAULT que implica que se utilizar la
funcin que le acompaa si se activa una interrupcin y ninguno de los
flags est activo.
La directica #INT_GLOBAL indica que la funcin que va a
continuacin sustituye todas las acciones que inserta el compilador al
aceptarse una interrupcin. Slo se ejecuta lo que vaya en dicha
funcin. GLOBAL equivale a GIE = PEIE = 1 y debe activarse de forma
independiente.
Si se utilizan las directivas de interrupcin, el compilador genera el
cdigo necesario para ejecutar la subrutina que sigue a la
interrupcin.
Adems genera el cdigo necesario para dejar intactos los valores de
los registros con los que el programa principal estaba trabajando y
para guardar el valor del PC en la pila y restituir al final el contexto;
tambin borrar el bit indicador que se activ con la interrupcin.

MANEJO DE INTERRUPCIONES MEDIANTE EL


COMPILADOR C
El programador debe encargarse nicamente de habilitar las
interrupciones y establecer las sentencias que se ejecutarn en cada
subrutina de las interrupciones que sern atendidas.
El formato para definir y declarar cada una de las subrutinas de atencin a
las interrupciones es el siguiente:
void xxxx_isr(void)
{
Instrucciones;
}
Donde xxxx puede ser cualquiera de las 14 posibles interrupciones
(constantes). El tipo de datos void puede o no tomarse en consideracin
(escribirse) segn este formato.
Si el programador no se acuerda de este formato, puede utilizar la opcin
Project Wizard para generar de forma automtica estas funciones cuando
se han realizado las configuraciones correspondientes, segn la
interrupcin a utilizar.

MANEJO DE INTERRUPCIONES MEDIANTE EL


COMPILADOR C
enable_interrupts (nivel);
nivel es una constante definida en el fichero de cabecera 16F877A.h y genera el cdigo
necesario para activar las mscaras correspondientes, afectando a los registros ITCON,
PIE1 y PIE2.
disable_interrupts(nivel);
Realiza la accin contraria a la funcin anterior, poniendo a 0 las mscaras relacionadas
con la interrupcin indicada.

INTERRUPCIN EXTERIOR POR EL PIN


RB0/INT

La solicitud de interrupcin externa se hace a travs del terminal INT, que


comparte funciones con el terminal RB0 del puerto B.
Esta interrupcin se produce con los flancos de la seal en el terminal
RB0/INT. El flanco que produce la interrupcin puede ser de subida o de
bajada, lo cual se programa mediante el bit INTEDG del registro OPTION.
La interrupcin externa queda reportada mediante el bit INTF del registro
INTCON y se habilita mediante el bit INTE de ese mismo registro.

INTERRUPCIN EXTERIOR POR EL PIN


RB0/INT
La directiva que se utiliza el compilador C es #INT_EXT y se debe
acompaar de las siguientes funciones (afectan al bit 6 del registro
OPTION_REG):
ext_int_edge(H_TO_L);
La interrupcin es activada por flanco de bajada (activa el bit indicador INTF).
ext_int_edge(L_TO_H);
La interrupcin es activada por flanco de subida (activa el bit indicador INTF).

INTERRUPCIN EXTERIOR POR EL PIN


RB0/INT - EJEMPLO
Ejemplo 1: Encender y apagar, consecutivamente, un LED conectado en las patilla
RB7 cuando se produzca un cambio de nivel en la patilla RB0 (ver figura).

INTERRUPCIN EXTERIOR POR EL PIN


RB0/INT - EJEMPLO
Ejemplo 1: Encender y apagar, consecutivamente, un LED conectado en las patilla
RB7 cuando se produzca un cambio de nivel en la patilla RB0 (ver figura).

INTERRUPCIN POR CAMBIO EN EL NIVEL


LGICO DE LAS ENTRADAS RB4 A RB7
Si los terminales RB4 a RB7 estn programados como entradas y se
produce un cambio en el nivel lgico de la seal en cualquiera de estas
entradas, es decir, de 0 a 1 o viceversa, habr una solicitud de
interrupcin.
Al producirse la interrupcin por cambios en RB4 a RB7, el bit RBIF
del registro INTCON se pone a 1. La interrupcin puede habilitarse
o inhabilitarse mediante el bit RBIE de ese mismo registro.
Esta interrupcin se puede utilizar para despertar al
microcontrolador si se halla en el modo de bajo consumo (modo
sleep). Adems este recurso hardware es muy utilizado para el control
de teclados.
La directiva utilizada pr el compilador C es #INT_RB.

INTERRUPCIN POR CAMBIO EN EL NIVEL


LGICO DE LAS ENTRADAS RB4:RB7 - EJEMPLO
Ejemplo 2: Realizar la gestin de un mini teclado haciendo uso de
interrupciones por cambio en el nivel lgico de las entradas RB4 a RB7. El mini
teclado est formado por cuatro teclas (del 1 al 4) representadas por cuatro
pulsadores y que estn conectados a los pines RB4:RB7 respectivamente (ver
figura). El valor en decimal de la tecla pulsada se mostrar en un display de 7
segmentos de ctodo comn.

INTERRUPCIN POR CAMBIO EN EL NIVEL


LGICO DE LAS ENTRADAS RB4:RB7 - EJEMPLO
Ejemplo 2: PROGRAMA

INTERRUPCIN POR CAMBIO EN EL NIVEL


LGICO DE LAS ENTRADAS RB4:RB7 - EJEMPLO
Ejemplo 2: PROGRAMA

Das könnte Ihnen auch gefallen