PDF de programación - 6 - Interrupciones

Imágen de pdf 6 - Interrupciones

6 - Interrupcionesgráfica de visualizaciones

Actualizado el 12 de Julio del 2020 (Publicado el 20 de Junio del 2019)
1.041 visualizaciones desde el 20 de Junio del 2019
577,1 KB
9 paginas
Creado hace 8a (09/12/2015)
6 - Interrupciones
Conceptos generales
Interrupciones externas
Interrupciones temporales
Ejemplos

©Universidad Politécnica de Madrid

s
e
.
m
p
u
@
e
c

i

Interrupciones: Conceptos generales (I)

¿Qué es una interrupción? 

 Es el desvío de la ejecución normal de un programa a petición de un periférico
 El origen de la petición es un evento externo al uP, y por tanto, asíncrono respecto al 

programa (no podemos predecir en qué parte del programa, ni cuándo, ocurrirá)

 Si el micro la acepta, ejecutará una función asociada para atender al periférico

Subrutina de servicio, 
o atención a la interrupción

Evento

uP/uC

P

S

Programa
principal

El micro debe (lo hace automáticamente):
‐ Terminar la instrucción en curso

(no en C, sino en código máquina)

‐ Guardar el estado del micro
‐ Saltar a la subrutina y ejecutarla
‐ Volver

(dejándolo todo igual, en principio)

La importancia de las interrupciones en el control 

 El control se simplifica, ya que se atiende a los periféricos cuando éstos lo 

requieren,  y no es necesario hacer polling o bloqueo

 En ocasiones, un programa de control está formado por un bucle de espera, en el 

que no se hace nada, y sólo se atienden las interrupciones que van llegando

Fundamentos de Electrónica: Microprocesadores

2

Al atender una interrupción



Memoria de
instrucciones
...
LDI r0, 0
ST r0, 200
LDI r0, 0
ST r0, 204
LD r0, 204
LD r3, 200
ADD r3, r0
ST r3, 200
INC r0
ST r0, 204
LDI r1, 20
SUB r1, r0
BRGT -7
...

400
401
403
404
406
408
40A
40B
40D
40E
410
411
412


R/W
CS

Reset

Clock

Unidad 

de 

Control
Contador
de programa
040A

R15
R14
R13

R3
R1
R0

‐‐
‐‐
‐‐
...

20
4

ALU

Qué hace el micro cuando tiene que atender una interrupción:
1 – Guarda el valor de Contador de programa
2 – Guarda los registros y el “estado” del micro 
3 – Copia en el Contador de programa la dirección donde está la subrutina de interrupción
4 – Ejecuta el código en la nueva posición hasta que aparezca un ‘return’
5 – Restauran el valor del Contador de programa, el estado del micro y los registros

Fundamentos de Electrónica: Microprocesadores

3

Interrupciones externas

▪ Casi todos los uC disponen de señales externas que pueden producir interrupciones 

en determinadas condiciones (flanco de subida o bajada, nivel…)

▪ En el caso del Atmega168, todos los 

pines de E/S permiten producir 
interrupciones externas, pero sólo 
dos del puerto D son configurables 
(por flanco de subida, bajada, 
ambos…). Sólo trataremos estos. 

Funciones de la API de Arduino para trabajar con las interrupciones externas:

Los pines 2 y 3 de la placa de Arduino están conectados a PD2 y PD3, y por lo tanto tienen la posibilidad de interrupciones 
externas

‐ attachInterrupt( int_num, isr_name, condition ); // Asocia una rutina a una interrupción bajo una determinada condición 

int_num : 0 para el pin 2, 1 para el pin 3
isr_name: nombre de la rutina de servicio (función que no debe tener parámetros)
condition: condición que produce la interrupción ( FALLING, RISING, BOTH, LOW )

‐ detachInterrupt( int_num ); // Desactiva la interrupción

Fundamentos de Electrónica: Microprocesadores

4

Ejemplo: Controlar un LED con interrupciones
▪ Utilizando la API de Arduino ¿Qué habría que hacer para conmutar 

el LED cada vez que se pulsa el botón?

+Vcc

#define LED 13
void setup() {

Arduino

Pin 2

Pin 13

10kΩ

500Ω

LED

pinMode( LED , OUTPUT );
// Asocio la función toggleLed a la interrupción por PD2
attachInterrupt( 0, toggleLed, RISING );

}
// Función que se llamará en la interrupción
// No debe tener parámetros
void toggleLed() {

int ledVal = digitalRead( LED );
digitalWrite( LED, !ledVal );

}
void loop() {
}

// Aquí no hay por qué hacer nada



Al comprobar el funcionamiento del sistema se observa que
al pulsar o soltar, el led cambia de estado de forma no
prevista, a veces cambia cuando no debe y otras no cambia
cuando debe (debería cambiar de estado sólo cada vez que
pulso)
¿A qué puede ser debido ese comportamiento?
¿Cómo podría solucionarse?

Fundamentos de Electrónica: Microprocesadores

5

Interrupciones temporales y periódicas
▪ Los uC disponen de contadores programables que permiten producir 

interrupciones de forma periódica o pasado un cierto tiempo (en el caso del 
AtMega168, dispone de 3 contadores que permiten generar interrupciones 
periódicas y temporales de diversas formas con periodos desde pocos μseg hasta 
32 segs).

Funciones de la API de para trabajar con las interrupciones periódicas y temporales (ATENCIÓN: estas funciones son un añadido a 
la API de Arduino hecho para esta asignatura. Para trabajar con ellas es necesario instalar un parche a la API de Arduino. Seguir 
las instrucciones en la descripción del trabajo voluntario).

‐ attachPeriodicInterrupt( isr_name,  period_in_ms  ); // Asocia una rutina a una interrupción periódica

isr_name: nombre de la rutina de servicio (función que no debe tener parámetros)
period_in_ms: periodo en  milisegundos. Debe ser un entero

‐ detachPeriodicInterrupt( isr_name ); //  Elimina la asociación

‐ attachTimedInterrupt ( isr_name,  time_in_ms  );  // Asocia una rutina para que se ejecute 

// una sola vez pasado el tiempo especificado

‐ detachTimedInterrupt( isr_name  ); // Elimina la asociación

Otras funciones asociadas con las interrupciones:

‐ interrupts();      // Habilita las interrupciones a nivel global
‐ noInterrupts(); // Deshabilita las interrupciones a nivel global

Fundamentos de Electrónica: Microprocesadores

6

Ejemplo: Parpadear un LED con interrupciones
▪ Utilizando la API de Arduino ¿Qué habría que hacer para conmutar el LED cada 0,5 

segs?

Arduino

Pin 13

500Ω

LED

#define LED 13
void setup() {

pinMode( LED , OUTPUT );
// Asocio la función toggleLed a la interrupción periódica
// que ocurre cada cada 500 milisegundos
attachPeriodicInterrupt( toggleLed, 500 );

}
// Función que se llamará en la interrupción
// No debe tener parámetros
void toggleLed() {

int ledVal = digitalRead( LED );
digitalWrite( LED, !ledVal );

}
void loop() {

// Aquí se podrían hacer otras cosas, sin que
// nos interfiera lo que se hace en la interrupción
...
...

}

Fundamentos de Electrónica: Microprocesadores

7

Ejemplo: Comparando soluciones flujogramas

 Bloqueo del proceso:

 Consulta periódica:

 Interrupciones:

¿ t> 0,5S?

no



ToggleLed

¿ t> 0,5S?



no

ToggleLed

ToggleLed

Volver

 El microprocesador está

bloqueado esperando que
pase el tiempo.

 Es difícil dar cabida a otras

tareas.

 El microprocesador

comprueba cuánto tiempo ha
pasado cada vez que pasa por
ese punto del código.

 El resto del tiempo se puede
aprovechar para realizar otras
tareas.

 Sólo cuando haya transcurrido

el tiempo programado, el
microprocesador atenderá la
interrupción y cambiará el led.

Fundamentos de Electrónica: Microprocesadores

8

Ejemplo: Comparando soluciones
▪ Utilizado la API de Arduino ¿Cómo resultaría el control del LED mediante los distintos 

procedimientos de entrada salida que conocemos (bloqueo, consulta periódica e interrupciones)?

// Solución por
//--------------------------
// BLOQUEO DEL PROCCESO
//--------------------------
#define LED 13
void setup() {
}
void toggleLed() {

pinMode( LED , OUTPUT );

int ledVal = digitalRead( LED );
digitalWrite( LED, !ledVal );

}
void loop() {

// la función delay espera
// N ms, de forma bloqueante
delay(500);
toggleLed();
// El código que hay aquí
// solo se ejecutará cada
// 0,5 segs
...

}

// Solución por
//--------------------------
// CONSULTA PERIÓDICA
//--------------------------
#define LED 13
void setup() {
}
void toggleLed() {

pinMode( LED , OUTPUT );

int ledVal = digitalRead( LED );
digitalWrite( LED, !ledVal );

}
unsigned long nextTime = 500;
void loop() {

// Solución mediante
//--------------------------
// INTERRUPCIONES
//--------------------------
#define LED 13
void setup() {

pinMode( LED , OUTPUT );
attachPeriodicInterrupt(

toggleLed, 500 );

}
void toggleLed() {

int ledVal = digitalRead( LED );
digitalWrite( LED, !ledVal );

}
void loop() {

// la función millis() devuelve
// los ms pasados desde el reset
if (millis() > nextTime) {

nextTime = millis() + 500;
toggleLed();

}
// Aquí se podrían hacer
// otras cosas, siempre que no
// tarden demasiado
...

}

// Aquí se podrían
// hacer otras cosas,
// sin que nos interfiera lo que
// se hace en la interrupción
// ni viceversa
...

}

Fundamentos de Electrónica: Microprocesadores

9
  • Links de descarga
http://lwp-l.com/pdf16157

Comentarios de: 6 - Interrupciones (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad