94. Por qué usar las interrupciones en Arduino, todo lo que necesitas saber
Scarica e ascolta ovunque
Scarica i tuoi episodi preferiti e goditi l'ascolto, ovunque tu sia! Iscriviti o accedi ora per ascoltare offline.
Descrizione
Ya escribí un artículo donde explicaba con un caso práctico para usar las interrupciones en Arduino. En este capítulo del podcast vamos a ver todo lo que necesitas saber sobre...
mostra di piùEn el proyecto que estoy llevando a cabo, el tiesto inteligente, me han surgido varios problemas que debo de resolver. Sobre todo a la hora de implementar el algoritmo que permita que el DFRobot se mueva solo. La idea es poder usar interrupciones en Arduino que me permitan centrarme en lo verdaderamente importante y organizar el código de una manera más limpia y eficaz.
Antes de continuar te quiero hacer dos recomendaciones. La primera es que escuches el capítulo 42 del podcast La Hora Maker, donde César y Uribex tratan un tema muy interesante pero a la vez, muy controvertido.
Por otro lado, el día 8 de octubre de 2016 se celebra en Murcia el Mur Mak, la Murcia Maker Fest a la cual asistiré como visitante. Si estás por los alrededores te recomiendo que vayas. Habrán talleres, cursos y exposiciones muy interesantes.
Y ahora si, vamos a comenzar el capítulo por qué usar las interrupciones en Arduino.
¿Qué son las interrupciones en Arduino?
Vamos a verlo con un símil de la vida real. Imagínate que estás viendo una película o una serie en el salón de tu casa. Te abres una cerveza y estás dispuesto a pasar unas cuantas horas de evasión y fuera de la rutina. Pero estás esperando que te llegue una carta muy importante, tan importante que en cuanto la tengas en tus manos la tienes que abrir sin demora.
Lo normal es que tengas dos opciones. La primera sería que el cartero dejara la carta en el buzón y tu fueras a por ella. Al ser tan importante, si quieres leerla inmediatamente nada más que la deje, tendrías que ir a comprobar cada dos por tres si ha llegado la carta al buzón. Esto sería un poco incómodo ya que deberías parar la película, ir al buzón y comprobar si está. Pero existe una segunda opción, que la carta te llegue con acuse de recibo es decir, que el cartero llame a tu puerta y tu recibas la carta firmando el recibo.
Esto es lo que sucede dentro del código de nuestro proyecto. Cuando queremos leer un pin digital lo podemos hacer de dos maneras. Estar leyendo constantemente el pin con la función digitalRead(numPin) o usar un mecanismo por el cual, se interrumpa la ejecución del programa normal o principal para hacer algo concreto.
Las interrupciones permiten que el microcontrolador esté pendiente de un evento para realizar una acción concreta. No hace falta estar consultando constantemente el pin digital que queramos leer. El sistema es totalmente automático y está implementado dentro de la electrónica del microcontrolador.
¿Por qué usar las interrupciones en Arduino?
Lo primero que hay que decir es que no siempre es conveniente usar las interrupciones en Arduino. Dependerá de cada situación. La norma dice que siempre que el código que se vaya a ejecutar interrumpa el funcionamiento normal, deberemos utilizar una interrupción. Si por el contrario, ese código es como consecuencia de que se termina una acción, no se deben utilizar interrupciones.
Se trata de un proceso asíncrono, algo que sucede en cualquier momento mientras se ejecuta el programa normal. El microcontrolador es el encargado de estar pendiente del evento que lanza la interrupción. Nosotros solo indicamos cuándo y qué se tiene que ejecutar.
No hay que confundir esta técnica con la multitarea. Los microcontroladores en la mayoría de los Arduino, no soportan la ejecución de procesos en paralelo. El funcionamiento normal consiste en ejecutar una tarea tras otra, de forma secuencial.
Por lo tanto, usar interrupciones en Arduino, no vamos a conseguir multitarea. Pero si que vamos a conseguir que nuestro código sea más eficiente y más legible. Aunque sea un proceso asíncrono, nos permitirá sincronizar de una manera precisa ya que capturamos el evento justo en el momento que se produce evitando así que se pierda en el olvido.
El ejemplo típico es capturar un pulsador. Si queremos capturarlo en cualquier momento, de forma asíncrona, el método más optimo es a través de interrupciones.
Dentro de las interrupciones existen varios tipos.
Tipos de interrupciones en los microcontroladores
Podemos catalogar las interrupciones en 3 tipos.
Interrupciones externas
Ya hemos visto el símil de la carta que llega a nuestra casa. Este sería el caso de una interrupción externa. Es algo que sucede fuera del microcontrolador y que es captado por los pines destinados a las interrupciones.
Arduino UNO tiene dos pines, el 2 y el 3. Para configurar las interrupciones lo haremos a través del software. Podemos hacerlo de dos maneras, a través de la SDK de Arduino o a través de registros. Se recomienda la primera opción por facilidad.
Básicamente debemos de tener en cuenta tres parámetros, el pin que vamos a utilizar, la función ISR (Interrupt Service Routine) que será el código que se ejecuta y el modo, que indica qué evento lanzará la interrupcion (si están estado bajo, si pasa de bajo a alto, si pasa de alto a bajo, etc....)
Se pueden utilizar en muchos cosos, cambiar la velocidad de parpadeo de un LED a través de botones, detectar movimiento a través de un sensor PIR, contar revoluciones de un motor, etc....
Interrupciones con temporizador
Funcionan igual que las interrupciones externas y también es un proceso asíncrono. La diferencia es que el evento, en este caso, es temporal. Cada cierto intervalo de tiempo se ejecuta la función asociada a la interrupcion, ISR.
Para conseguir determinar si ha pasado el tiempo utiliza los ciclos de reloj del procesador. Arduino cuenta con varios temporizadores que se utilizan para diferentes fines. Par controlar la función delay() o millis(), para generar señales PWM, etc...
Si queremos utilizar interrupciones temporales deberemos hacer uso de estos temporizadores. La librería TimerOne nos facilita el uso de este tipo de interrupciones.
Un ejemplo muy típico es cuando en algún proyecto necesitamos un LED parpadeando como notificación de que todo funciona correctamente. Lo más conveniente es utilizar una interrupción temporal para encender y para apagar el LED. Esto permite que no se entorpezca la ejecución normal del programa.
Interrupciones por software
Son las que se producen a través de una instrucción dentro del programa. Arduino y los microcontroladores de 8 bits no soportan este tipo de interrupciones. Pero podemos simularlas de una manera muy sencilla.
Si configuramos un pin como interrupción, solo debemos poner dicho pin en el estado adecuado para que el evento se dispare y pare la ejecución normal del programa. Esto sería la manera de simular este tipo de interrupciones.
Interrupciones Internas
En el capítulo 93 donde hablaba del ESP8266, comentábamos que una de las ventajas que tienen las placas como Arduino es que eran Plug&Play, conectar y listo. Cuando estamos programando con el módulo ESP-01, uno de los inconvenientes es que si quieres cargar un nuevo programa debes resetear de forma manual la placa. Esto no sucede en Arduino.
Precisamente es debido a las interrupciones internas. Una de ellas es la función de reset, que se ejecuta cuando queremos cargar un sketch nuevo al microcontrolador.
Pero existen multitud de interrupciones internas a las cuales, podemos tener acceso. Pero esto es un tema algo complicado y complejo de programar. Si no es necesario, no recomiendo acceder a ellas bajo ningún concepto ya que podemos dejar la placa bloqueada.
Si quieres profundizar más sobre este tipo de interrupciones puedes ver la hoja de especificaciones técnicas del microcontrolador Atmel.
Buenas prácticas para usar interrupciones en Arduino
Tarde o temprano vamos a tener que utilizar esta técnica en alguno de nuestros proyectos. Yo te voy a dar unos consejos muy básicos que te ayudarán a que tu código sea más óptimo, eficaz y legible.
La función asociada (ISR) debe ser lo más breve posibles. Mientras se está ejecutando el resto del programa está parado.
No utilizar dentro de las rutinas las funciones de tiempo delay(), millis(), etc...
Tener en cuenta la prioridad e las interrupciones. Al no poder ejecutar diferentes procesos en paralelo, las interrupciones tienen una prioridad de ejecución, tenlo en cuenta.
Mientras se esté ejecutando una rutina asociada a una interrupción, Arduino no podrá capturar otra interrupción.
Las variables que utilicemos tanto dentro como fuera de las funciones ISR deben ser declaradas globales con la palabra reservada volatile.
Puedes escuchar este programa en, iVoox, iTunes y en Spreaker. Si lo haces, por favor valora y comenta, así podremos llegar a más gente.
Conocer como funciona el mundo es la única manera de poder cambiarlo.
Informazioni
Autore | La tecnología para todos |
Organizzazione | La tecnología para todos |
Sito | - |
Tag |
Copyright 2024 - Spreaker Inc. an iHeartMedia Company