Vous êtes sur la page 1sur 5

Los microcontroladores y las interrupciones

Prof. Diego Enrique Guzmán

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:

Un evento hardware previamente definido (Sección 1).

Un evento programado (Sección 2).

Una llamada de software.

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.

Para definir una interrupción necesitamos 3 cosas:

1. Un pin que recibirá la señal de disparo

2. Una condición de disparo

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 ;
}

INTCON . INTF = 0 ; / / bandera de l a i n t e r r u p c i o n


}

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
}
}

El montaje correspondiente se observa en la Figura 2.

Figura 2: Ejemplo de una interrupción hardware

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.

Las ventajas y desventajas de los timer se observan en la Tabla 1:

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

Tabla 1: Ventajas y desventajas de los timer

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

TRISB = 0x00 ; / / Puerto como s a l i d a


PORTB = 0x00 ; / / Todos l o s p i n e s apagados
TRISC = 0x00 ; / / Puerto como s a l i d a
PORTC = 0x00 ; / / Todos l o s p i n e s apagados
}

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.

Tmax = (256) ∗ P rescaler ∗ (4/F recOsc) (1)

El montaje correspondiente se observa en la Figura 3.

Figura 3: Ejemplo de una interrupción por timer

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!

Vous aimerez peut-être aussi