Curso de principiante de Arduino Lección 7- Comprender las interrupciones Deja un comentario

Puede descargar nuestro e-book ‘Learn Arduino from Scratch’ de este enlazar

¿Qué son interrupciones? Bueno, interrumpen algo con seguridad, precisamente interrumpen la ejecución del programa principal de la CPU. En Arduino tenemos 2 funciones principales: setup () y loop (). Interrumpe la ejecución del código de interrupción en el bucle ().
Pero, ¿por qué deberíamos preocuparnos por las interrupciones de todos modos? No son algo temible, hacen que su código sea más limpio y funcionan mucho más eficientemente que la codificación convencional. Una interrupción escucha un evento externo y reacciona de inmediato. El programa principal pausa la ejecución e ingresa la función asociada a la interrupción. En este punto, ejecuta todo lo que hay en esta función y regresa al programa principal como si nada hubiera sucedido. Esa es la belleza de las interrupciones.

Hagamos una pequeña comparación, vamos a comparar 2 bocetos que producen el mismo resultado pero funcionan de una manera diferente.

const int buttonPin = 2;  // botón de contacto
 const int ledPin = 13;  // el pin LED


 int buttonState = 0;  // mantiene el estado de nuestro botón

 void setup () {
   pinMode (ledPin, OUTPUT);
   pinMode (buttonPin, INPUT);
 }

 void loop () {
   // lee el estado del botón
   buttonState = digitalRead (buttonPin);

   // verifica si se presiona el botón.
   // si lo es, el buttonState es ALTO:
   if (buttonState == HIGH) {
    
     digitalWrite (ledPin, ALTO);
   }
   else {
  
     digitalWrite (ledPin, BAJO);
   }
 }

En este ejemplo, estamos escuchando un botón en el pin 2, leyendo el botón digital Pin. Luego, verifica el estado del botón con una instrucción if y enciende y apaga el led.
SImple no? Pero ineficiente, se ve feo y no es en tiempo real. Las interrupciones son en tiempo real, tan pronto como se eleva la interrupción, se dispara la función adjunta.

Miremos el mismo programa escrito usando interrupciones.

const int buttonPin = 2;  // botón de contacto
 const int ledPin = 13;  // el pin LED



 volatile int buttonState = 0;  // mantiene el estado de nuestro botón

 void setup () {

   pinMode (ledPin, OUTPUT);
 
   pinMode (buttonPin, INPUT);

   // Adjuntar una interrupción al vector ISR
   attachInterrupt (0, pin_ISR, CHANGE);
 }

 void loop () {
   //vacío
 }

 void pin_ISR () {
   buttonState = digitalRead (buttonPin);
   digitalWrite (ledPin, buttonState);
 }

La función AttachInterrupt ()

Como ya habrás notado, existen algunas diferencias con respecto al ejemplo anterior. Particularmente la función loop (), que no contiene nada. Todo lo que manejaba la sentencia if se maneja ahora dentro de pin_ISR (). Ya lo habrás notado, esta es la función que se ejecuta cuando se genera la interrupción.

attachInterrupt (0, pin_ISR, CHANGE);

La función attachInterrupt () conecta la función con la interrupción. El primer parámetro es un índice para identificar a qué pin está unida la interrupción (en Arduino Uno – 0 significa pin 2 y 1 significa pin 3). El parámetro segundos es el nombre de la función que se ejecutará. El tercer parámetro es el modo por el cual se eleva la interrupción. Hay 4 + 1 modos que se pueden utilizar, estos son:

  • CAÍDO: dispara la interrupción cuando el pin está en el borde descendente
  • LEVANTANDO: dispara la interrupción cuando el pin está en el borde ascendente
  • CAMBIAR: dispara cualquier cambio en el pin
  • BAJO: dispara cuando el pin es bajo
  • ALTO: (Compatible solo debido) se dispara cuando el pin es alto

La palabra clave volátil

Es posible que haya notado que buttonState tiene otra palabra clave, que es volátil. Esta palabra clave indica que el valor de la variable no puede predecirse. ¿Por qué? Debido a que las interrupciones no pueden ser predichas por el compilador y, por lo tanto, el estado de una variable que cambia dentro de una función desencadenada por una interrupción también es impredecible. Entonces, en este caso, vale la pena agregar la palabra clave volátil.

 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

0
    0
    Tu Carrito
    Tu carrito esta vacíoVolver a la tienda
    Enviar Whatsapp
    Hola 👋
    ¿En qué podemos ayudarte?