VI. Interrupciones en un Microcontrolador. (R24)

Las interrupciones son recursos o mecanismos del microcontrolador para responder a eventos, permitiendo suspender temporalmente el programa principal, para ejecutar un subrutina de servicio de interrupción (ISR por sus siglas en inglés Interrupt Service Routines); una vez terminada dichas subrutina, se reanuda la ejecución del programa principal.

Las interrupciones se generan cuando dispositivos periféricos conectados a la tarjeta electrónica solicitan enviar información al microcontrolador, esto puede ser de manera asíncrona. También el proceso de interrupción se puede generar de manera periódica, es decir por medio de una señal digital (por ejemplo de un milisegundo de periodo) conectada a un pin específico del microcontrolador (INT0 o INT1) se puede atender tareas determinadas como adquisición de datos, monitoreo de sensores, cálculos numéricos, envío de comandos al robot, etc. 


Por ejemplo, para monitorear el estado lógico que tiene un pin. habrá que leer su valor continuamente; si en un momento específico este pin tiene 5V y no se lee, debido a que el microcontrolador está ejecutando otras instrucciones, se corre el enorme riesgo que cuando se lea, el valor del pin ha cambiado sin ser detectado por el microcontrolador, perdiendo información valiosa del sensor o del sistema, 

Monitorear información de un evento usando polling, genera un alto riesgo para perder lecturas o información del sistema, por lo tanto hoy en día, esta técnica resulta inadecuada e ineficiente. 

 

12.3 Rutinas de servicio de interrupción. 

Ejemplo 12.1




Una vez leída las instrucciones y haber configurado el serial Monitor a 9600 Baudios, procedemos a la programación que es la siguiente:


Evidencias de práctica:

Código escrito:

// Ejemplo 12.1.
//Usando la interrupción INTO (pin 2 de la tarjeta Arduino UNO) realizar
//el incrementro de un contador t como múltiplos de h=0.001, es decir:
// t sub k-1 +h. Exhibir el resultado en el monitor serial del ambiente de programación Arduino.
float h=0.001;
int pin=13;
volatile float t=0;
volatile int pulso=LOW;
int num_int=0; //conectar el pin2 al pin13
               //0 corresponde a la interrupción int0 (pin2)
void setup()
{
  Serial.begin(9600);
  pinMode(pin, OUTPUT);
  attachInterrupt(num_int, rutina_interruptcion, CHANGE);
}
void rutina_interruptcion(){//ISR
t=t+h;//genera contador: t subindice k-1 +h
if (t>=10.0)
t=0;
pulso=!pulso;//conmuta pulso que se envía al pin 13->pin2
}
void loop()
{
  Serial.println(t,4); //envía al monitor la variable tiempo t.
  delay(100);
  digitalWrite(pin, pulso); //pin13->pin2, envía para generar interrupción.
  if((t>5.0) && (t<5.5))
  Serial.println("Captura de evento....");
  delay(100);
}

Consultando el Serial Monitor con los ajustes pedidos, tenemos:


Evidencias de que funciona la condicional IF.



Archivo de referencia para estos ejercicios.
Todo documento e información, aclaración de dudas ha sido proporcionado y resulto por el docente a cargo de las mismas. 


Evidencia Fotográfica. 



Hicimos un pequeño diseño para una mejor referencia sobre la supuesta conexión. 











Comentarios

Entradas populares