You are on page 1of 9

6 - Interrupciones

Conceptos generales
Interrupciones externas
Interrupciones temporales
cei@upm.es

Ejemplos

Universidad Politcnica de Madrid


Interrupciones: Conceptos generales (I)
Quesunainterrupcin?

Eseldesvodelaejecucinnormaldeunprogramaapeticindeunperifrico
ElorigendelapeticinesuneventoexternoaluP,yportanto,asncronorespectoal
programa(nopodemospredecirenqupartedelprograma,nicundo,ocurrir)
Sielmicrolaacepta,ejecutarunafuncinasociadaparaatenderalperifrico
Subrutinadeservicio,
oatencinalainterrupcin
Evento uP/uC S
P Elmicrodebe(lohaceautomticamente):
Terminarlainstruccinencurso
(noenC,sinoencdigomquina)
Guardarelestadodelmicro
Programa Saltaralasubrutinayejecutarla
principal Volver
(dejndolotodoigual,enprincipio)

Laimportanciadelasinterrupcionesenelcontrol
Elcontrolsesimplifica,yaqueseatiendealosperifricoscuandostoslo
requieren,ynoesnecesariohacerpolling obloqueo
Enocasiones,unprogramadecontrolestformadoporunbucledeespera,enel
quenosehacenada,ysloseatiendenlasinterrupcionesquevanllegando

FundamentosdeElectrnica:Microprocesadores 2
Al atender una interrupcin

Memoria de
instrucciones R15
R14
R13
... R/W
400 LDI r0, 0 ...
401 ST r0, 200 CS Unidad 6 R3
403 LDI r0, 0
404 ST r0, 204 de 20
4
R1
R0
406 LD r0, 204
408 LD r3, 200 Control
40A ADD r3, r0
40B ST r3, 200 Reset
40D
Contador
INC r0
40E
de programa
ST r0, 204
410 LDI r1, 20
040A ALU
411 SUB r1, r0 Clock
412 BRGT -7
...

Quhaceelmicrocuandotienequeatenderunainterrupcin:
1 GuardaelvalordeContadordeprograma
2 Guardalosregistrosyelestadodelmicro
3 CopiaenelContadordeprogramaladireccindondeestlasubrutinadeinterrupcin
4 Ejecutaelcdigoenlanuevaposicinhastaqueaparezcaunreturn
5 RestauranelvalordelContadordeprograma,elestadodelmicroylosregistros

FundamentosdeElectrnica:Microprocesadores 3
Interrupciones externas

CasitodoslosuC disponendesealesexternasquepuedenproducirinterrupciones
endeterminadascondiciones(flancodesubidaobajada,nivel)

EnelcasodelAtmega168,todoslos
pinesdeE/Spermitenproducir
interrupcionesexternas,peroslo
dosdelpuertoDsonconfigurables
(porflancodesubida,bajada,
ambos).Slotrataremosestos.

FuncionesdelaAPIdeArduinoparatrabajarconlasinterrupcionesexternas:
Lospines2y3delaplacadeArduinoestnconectadosaPD2yPD3,yporlotantotienenlaposibilidaddeinterrupciones
externas

attachInterrupt(int_num,isr_name,condition);//Asociaunarutinaaunainterrupcinbajounadeterminadacondicin
int_num:0paraelpin2,1paraelpin3
isr_name:nombredelarutinadeservicio(funcinquenodebetenerparmetros)
condition:condicinqueproducelainterrupcin(FALLING,RISING,BOTH,LOW)

detachInterrupt(int_num);//Desactivalainterrupcin

FundamentosdeElectrnica:Microprocesadores 4
Ejemplo: Controlar un LED con interrupciones
UtilizandolaAPIdeArduinoQuhabraquehacerparaconmutar
elLEDcadavezquesepulsaelbotn?
+Vcc #define LED 13

Arduino void setup() {


pinMode( LED , OUTPUT );
// Asocio la funcin toggleLed a la interrupcin por PD2
attachInterrupt( 0, toggleLed, RISING );
Pin2 }

10k // Funcin que se llamar en la interrupcin


// No debe tener parmetros
500 void toggleLed() {
int ledVal = digitalRead( LED );
Pin13 digitalWrite( LED, !ledVal );
}

void loop() {
LED // 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 (debera cambiar de estado slo cada vez que
pulso)
A qu puede ser debido ese comportamiento?
Cmo podra solucionarse?

FundamentosdeElectrnica:Microprocesadores 5
Interrupciones temporales y peridicas
LosuC disponendecontadoresprogramablesquepermitenproducir
interrupcionesdeformaperidicaopasadounciertotiempo (enelcasodel
AtMega168,disponede3contadoresquepermitengenerarinterrupciones
peridicasytemporalesdediversasformasconperiodosdesdepocosseg hasta
32segs).

FuncionesdelaAPIdeparatrabajarconlasinterrupcionesperidicasytemporales(ATENCIN:estasfuncionessonunaadidoa
laAPIdeArduinohechoparaestaasignatura.ParatrabajarconellasesnecesarioinstalarunparchealaAPIdeArduino.Seguir
lasinstruccionesenladescripcindeltrabajovoluntario).

attachPeriodicInterrupt(isr_name,period_in_ms);//Asociaunarutinaaunainterrupcinperidica
isr_name:nombredelarutinadeservicio(funcinquenodebetenerparmetros)
period_in_ms:periodoen milisegundos.Debeserunentero

detachPeriodicInterrupt(isr_name);//Eliminalaasociacin

attachTimedInterrupt (isr_name, time_in_ms);//Asociaunarutinaparaqueseejecute


//unasolavezpasadoeltiempoespecificado

detachTimedInterrupt(isr_name );//Eliminalaasociacin

Otrasfuncionesasociadasconlasinterrupciones:

interrupts();//Habilitalasinterrupcionesanivelglobal
noInterrupts();//Deshabilitalasinterrupcionesanivelglobal

FundamentosdeElectrnica:Microprocesadores 6
Ejemplo: Parpadear un LED con interrupciones
UtilizandolaAPIdeArduino QuhabraquehacerparaconmutarelLEDcada0,5
segs?
#define LED 13

void setup() {

Arduino pinMode( LED , OUTPUT );

500 // Asocio la funcin toggleLed a la interrupcin peridica


// que ocurre cada cada 500 milisegundos
Pin13
attachPeriodicInterrupt( toggleLed, 500 );
}
LED // Funcin que se llamar en la interrupcin
// No debe tener parmetros
void toggleLed() {
int ledVal = digitalRead( LED );
digitalWrite( LED, !ledVal );
}

void loop() {
// Aqu se podran hacer otras cosas, sin que
// nos interfiera lo que se hace en la interrupcin
...
...
}

FundamentosdeElectrnica:Microprocesadores 7
Ejemplo: Comparando soluciones flujogramas

Bloqueo del proceso: Consulta peridica: Interrupciones:

ToggleLed
s
t> 0,5S? no t> 0,5S?

s no
ToggleLed
ToggleLed

Volver

El microprocesador est El microprocesador Slo cuando haya transcurrido


bloqueado esperando que comprueba cunto tiempo ha el tiempo programado, el
pase el tiempo. pasado cada vez que pasa por microprocesador atender la
Es difcil dar cabida a otras ese punto del cdigo. interrupcin y cambiar el led.
tareas. El resto del tiempo se puede
aprovechar para realizar otras
tareas.

FundamentosdeElectrnica:Microprocesadores 8
Ejemplo: Comparando soluciones
UtilizadolaAPIdeArduino CmoresultaraelcontroldelLEDmediantelosdistintos
procedimientosdeentradasalidaqueconocemos(bloqueo,consultaperidicaeinterrupciones)?

// Solucin por // Solucin por // Solucin mediante


//-------------------------- //-------------------------- //--------------------------
// BLOQUEO DEL PROCCESO // CONSULTA PERIDICA // INTERRUPCIONES
//-------------------------- //-------------------------- //--------------------------

#define LED 13 #define LED 13 #define LED 13

void setup() { void setup() { void setup() {


pinMode( LED , OUTPUT ); pinMode( LED , OUTPUT ); pinMode( LED , OUTPUT );
} } attachPeriodicInterrupt(
toggleLed, 500 );
void toggleLed() { void toggleLed() { }
int ledVal = digitalRead( LED ); int ledVal = digitalRead( LED );
digitalWrite( LED, !ledVal ); digitalWrite( LED, !ledVal ); void toggleLed() {
} } int ledVal = digitalRead( LED );
digitalWrite( LED, !ledVal );
void loop() { unsigned long nextTime = 500; }

// la funcin delay espera void loop() { void loop() {


// N ms, de forma bloqueante
delay(500); // la funcin millis() devuelve // Aqu se podran
toggleLed(); // los ms pasados desde el reset // hacer otras cosas,
if (millis() > nextTime) { // sin que nos interfiera lo que
// El cdigo que hay aqu nextTime = millis() + 500; // se hace en la interrupcin
// solo se ejecutar cada toggleLed(); // ni viceversa
// 0,5 segs } ...
... }
} // Aqu se podran hacer
// otras cosas, siempre que no
// tarden demasiado
...
}

FundamentosdeElectrnica:Microprocesadores 9

You might also like