Académique Documents
Professionnel Documents
Culture Documents
6 de noviembre de 2017
Una interrupción es una señal que interrumpe la actividad normal del microprocesador y salta a atenderla, hay 3
eventos que pueden disparar una interrupción:
Cuando un evento dispara una interrupción, la ejecución normal del micro se suspende (ordenadamente para
poder volver) y salta a ejecutar una función especial que llamamos Interrupt Service Handler o ISH (Servicio de
gestión de interrupción). Cuando el ISH finaliza, el procesador vuelve tranquilamente al punto donde lo dejó
y sigue con lo que estaba como si no hubiese pasado nada.
1. Interrupciones hardware
Es una función que se va a ejecutar de forma asíncrona, sin planificación, cuando ocurra un cierto suceso elec-
trónico.
Supongamos que estas viendo televisión una película y estas esperando una pizza, si las interrupciones como el
timbre no existieran debieras pausar y levantarte cada cierto tiempo a la puerta haber si llego el pedido. El timbre
en este caso representa la interrupción por hardware ya que puedes esperar hasta que se ’dispare’ para pausar,
ir a recibirlo y continuar donde dejaste la película.
La analogía se puede apreciar en la Figura 1 donde la situación funcionaria idéntico en el caso de un microcon-
trolador.
3. Una función que se ejecutara cuando se dispare la interrupción (llamada ’callback function’)
1
Figura 1: Ejemplo ilustrativo de las interrupciones hardware
1.1. Ejemplo
A continuación un programa sencillo en el cual el pin B1 representa un programa repetitivo (while(1)) cualquiera
en ejecución, el pin B2 va a cambiar de estado cada vez que generamos una interrupción en el pin B0 .
i n t estado =0;
void c o n f i g u r a c i o n ( ) {
INTCON . GIE = 1 ; / / a c t i v o l a s i n t e r r u p c i o n e s
INTCON . INTE = 1 ; / / a c t i v o l a i n t d e l p i n b0
TRISB = 0x01 ; / / Solo e l p i n 0 es e n t r a d a
PORTB = 0 ; / / Apago todo e l p u e r t o b
}
void i n t e r r u p t ( ) {
i f ( INTCON . INTF ) { / / v e r i f i c o s i o c u r r i o l a i n t e r r u p c i o n
estado= ! estado ;
PORTB. B2 = estado ;
}
void main ( ) {
configuracion ( ) ;
while ( 1 ) {
/ ∗ ponga a q u i su codigo ∗ /
PORTB. B1 = 1 ; / / enciendo p i n b1
delay_ms ( 2 5 0 ) ; / / espero 250 ms
PORTB. B1 = 0 ; / / apago p i n b1
delay_ms ( 2 5 0 ) ; / / espero 250 ms
2
}
}
1.2. Ejercicio
Implementar un juego de luces navideño (con colores verde y rojo) con al menos 8 leds y utilizar una interrupción
para encender todas las luces en cualquier momento con una duración de 5 segundos.
2. Interrupciones timer
¿De que formas podemos medir el tiempo? Los delay son una forma de asignar un tiempo determinado a cierta
acción, sin embargo no es conveniente pues el procesador queda ’dormido’ el tiempo que este dura.
Conceptualmente el timer funciona igual que el reloj despertador (o las alarmas), es un evento programado para
ocurrir cada cierto tiempo.
3
Ventajas Desventajas
La interrupción se ejecuta por si sola Hay funciones que dependen de los ti-
en un tiempo programado mer y pueden dejar de funcionar
Esta más relacionado con el paradig- Si existe algún conflicto es complicado
ma orientado a eventos encontrar el problema
No lo afecta los delay Si tu ISR tarda más de lo que vuelve a
ocurrir la interrupción, se podría colgar
el procesador
La medida del tiempo es precisa
2.1. Ejemplo
A continuación veremos un juego de luces, junto a ellas un led cambiara de estado cada cierto tiempo sin inte-
rrumpir el normal funcionamiento del programa principal.
i n t contador = 0; / / v a r i a b l e a u x i l i a r
i n t estado = 0 ; / / v a r i a b l e
void c o n f i g u r a c i o n ( ) {
INTCON . GIE = 1 ; / / h a b i l i t o l a s i n t e r r u p c i o n e s
INTCON . TMR0IE = 1 ; / / h a b i l i t o e l t i m e r 0
OPTION_REG = 0b00000100 ; / / c o n f i g u r a c i o n d e l p r e e s c a l e r
void i n t e r r u p t ( ) {
/ ∗ Se l l a m a cada 0.008192 seg , s a l e de l a ecuacion ∗ /
i f ( INTCON . TMR0IF ) {
c o n t a d o r ++;
i f ( contador > ( 3 / 0 . 0 0 8 1 9 2 ) ) {
estado = ~estado ;
PORTB. B1 = estado ; / / l e d para i d e n t i f i c a r l a i n t e r r u p c i o n
contador = 0; / / r e i n i c i o e l contador
}
}
INTCON . TMR0IF = 0 ; / / pongo l a bandera en 0
}
4
void main ( ) {
configuracion ( ) ;
while ( 1 ) {
/ ∗ ponga a q u i s i programa ∗ /
PORTC = 0xAA ;
delay_ms ( 2 5 0 ) ;
PORTC = 0x55 ;
delay_ms ( 2 5 0 ) ;
}
Como se observa en la ecuación 1, el calculo de cada cuanto tiempo debe ocurrir la interrupción depende del
prescalador y la frecuencia del oscilador.
2.2. Ejercicio
Implementar un semáforo sin delays, solamente utilizar timers.
Finalmente realice una pequeña redacción donde explique en sus palabras el funcionamiento de las interrupciones
por hardware y las interrupciones por timer.
Nota: Ambos ejemplos se hicieron con el PIC16F877A, cualquier duda observe el datasheet anexo.
Éxitos!