Como usar interrupções com Arduino

Cómo usar interrupciones con Arduino

Los microcontroladores están diseñados para ejecutar firmware conciso dedicado a una aplicación específica. El firmware es software integrado, que se escribe en la memoria del programa. Los códigos de firmware suelen ser cortos y están diseñados para gestionar y ejecutar diversas microtareas hasta el nivel de hardware.

Como los microcontroladores están dedicados a una única aplicación, estos dispositivos no cuentan con computación paralela y, por defecto, el código se ejecuta de forma secuencial. Esto significa que cualquier cambio externo (hardware) o condición del software se sondea en orden lineal a través del bucle de programación.

En el ecosistema Arduino, este bucle de programación se escribe y ejecuta dentro de la función de bucle.

El sondeo es el patrón mediante el cual funciona un microcontrolador. El sondeo es el proceso en el que el controlador espera su estado o la siguiente tarea desde el dispositivo externo. Esto puede resultar problemático cuando el controlador necesita responder a una situación en poco tiempo o inmediatamente.

Esto puede ocurrir cuando hay un cambio repentino en las condiciones de programación o el estado del hardware. Afortunadamente, los microcontroladores tienen una función para afrontar estos desafíos, llamada interrupciones.

¿Qué es una interrupción?

Una interrupción en relación con los microcontroladores es un mecanismo que suspende temporalmente el programa principal, pasando el control al código temporal.

En términos de Arduino, esto significa que el código típico definido en el bucle de programación (es decir, la función de bucle) se suspende y se ejecuta un código de respuesta, relacionado con la condición específica del software o el cambio de hardware. Esta respuesta se define en un bloque de código bien estructurado llamado Rutina de servicio de interrupción (ISR).

Supongamos que un microcontrolador de un vehículo robótico está programado para navegar por terreno accidentado y superar varios obstáculos. El rover rastrea su estado monitoreando datos, utilizando sensores ultrasónicos y acelerómetros. En un momento, se detecta un agujero oscuro a lo largo del camino.

Sin embargo, el pozo sólo se nota cuando el rover está a unos 30 centímetros de él, lo cual es un problema. Los datos de los sensores se monitorean en un circuito programado regularmente, lo que significa que este mensaje sobre el pozo normalmente se retransmitiría demasiado tarde para que el controlador responda a tiempo.

Afortunadamente, un apagón le salva el día a este rover. El sensor acelerómetro, en este caso, genera una interrupción cada vez que hay un cambio repentino en la orientación del rover robótico, indicándole que se detenga. El código de eliminación salvó al rover de caer en el agujero en el último minuto.

Entendiendo la ISR

Una rutina de servicio de interrupción (ISR) es un bloque de código ejecutado en respuesta a una interrupción. Por supuesto, existen diferentes tipos de interrupciones.

La clave es que las interrupciones de un microcontrolador siempre deben estar bien definidas y corresponder a una condición de software o estado de hardware específico.

En Arduino, las interrupciones se identifican mediante vectores de interrupción.

Arduino interrumpe

Hay varias placas diferentes en la cartera de Arduino, cada una con microcontroladores diferentes. Esta tabla resume varias de estas plataformas...

Nota: Esta tabla no incluye placas Arduino retiradas como Arduino Esplora, Arduino Industrial 101, Arduino 101, Arduino Ethernet Rev3, LilyPad Arduino, LilyPad Arduino Simple, LilyPad Arduino USB, LilyPad Arduino SimpleSnap, Arduino Gemma, Arduino Yún Mini, Arduino Yún. , Arduino Leonardo ETH, Arduino Tian, ​​Arduino M0, Arduino M0 Pro, Arduino Mega ADK Rev3, Arduino Robot, Arduino Pro, Arduino Mini y Arduino Pro Mini.

Dado que cada microcontrolador tiene un conjunto de periféricos integrados e interfaces de entrada/salida, tiene sentido que las interrupciones sean diferentes para cada plataforma de microcontrolador.

El controlador central de Arduino Uno y Arduino Nano, ATmega328, admite estas interrupciones...

Todas las interrupciones son generadas por los periféricos integrados o las interfaces de E/S del ATmega328, que son diferentes en otros microcontroladores.

La prioridad de interrupción indicada en la tabla anterior es importante cuando se genera más de una interrupción al mismo tiempo. Cuando esto sucede, se ejecuta la interrupción de mayor prioridad mientras se suprime la interrupción de menor prioridad.

"Reset" es la interrupción de mayor prioridad y no tiene vector de interrupción. Esto significa que al reiniciar/reiniciar, no se pueden ejecutar rutinas definidas por el usuario.

En términos generales, las interrupciones se clasifican en dos categorías.

1. Interrupciones de hardware:

generado por los pines de entrada/salida del microcontrolador. Un hardware/componente externo desencadena un cambio en la señal de voltaje al pin de entrada/salida del Arduino.

En Arduino, existen dos tipos de interrupciones de hardware: interrupciones externas e interrupciones de cambio de pin.

2. Interrupciones del software:

generado por instrucciones de programa definidas por el usuario. Siempre van asociados a los periféricos integrados y al puerto de comunicación del microcontrolador. Estas interrupciones son

No

impulsado por un componente de hardware externo, sino por cambios en los periféricos integrados o en la configuración del software.

Los periféricos integrados deben configurarse para generar interrupciones escribiendo instrucciones del programa. De lo contrario, la interrupción se genera automáticamente al completar una instrucción de software asociada con un puerto/periférico de comunicación.

Por ejemplo, las interrupciones del temporizador son interrupciones de software. Las interrupciones del temporizador deben configurarse mediante instrucciones del programa definidas por el usuario. Las interrupciones generadas por los puertos de comunicación también son interrupciones de software, ya que se activan cuando el proceso de comunicación de datos se completa mediante instrucciones del programa definidas por el usuario.

Implementación de interrupciones en Arduino

Los ISR se definen como bloques de código separados más allá de la función de bucle principal. Las interrupciones ya están habilitadas de forma predeterminada. Todas las interrupciones de software requieren una programación definida.

Por ejemplo, los temporizadores se pueden configurar para generar interrupciones solo cuando los programa el usuario. Las interrupciones de hardware (es decir, interrupciones externas y de cambio de pin) deben configurarse en la función de configuración.

También es posible habilitar o deshabilitar interrupciones en la función de bucle para evitar interrupciones en la ejecución del programa o reactivar interrupciones.

Para deshabilitar las interrupciones, llame a la función noInterrupts dentro de la función de bucle de la siguiente manera...

enlace {

sin interrupciones;
}

Cuando las interrupciones están deshabilitadas, el código crítico y urgente debe seguir y ejecutarse ininterrumpidamente. Las interrupciones se pueden reactivar en la función de bucle llamando a la función de interrupciones.

enlace {

noInterrupts ;//deshabilita las interrupciones
// código crítico y urgente..
interrupciones //reactivando interrupciones
}

Las interrupciones se pueden atender escribiendo una rutina, en la que una interrupción particular se identifica pasando su vector de interrupción como parámetro. Normalmente, esta rutina se llama ISR.

Por ejemplo, para atender la interrupción del temporizador, configúrelo en la función de bucle y en el ISR. Sin embargo, la interrupción del temporizador debe configurarse fuera del bucle.

enlace {

//instrucciones para configurar y activar la interrupción de desbordamiento del Temporizador/Contador0

}
ISR(TIMER0_OVF_vect){
//Código que sirve interrupción de desbordamiento del temporizador/contador0
}

Tanto las interrupciones de software como las de hardware se pueden atender utilizando sus vectores de interrupción. Para configurar y activar interrupciones de software, el usuario debe modificar o programar los registros integrados asociados con Arduino.

Las interrupciones externas se configuran llamando a la función adjuntoInterrupt en la función de configuración. Las interrupciones externas se desactivan en la función de bucle, utilizando la función detachInterrupt. Las interrupciones de cambio de pin se configuran o activan modificando o programando los registros integrados asociados con el Arduino.

interrupciones externas

Hay dos tipos de interrupciones de hardware: interrupciones externas e interrupciones de cambio de pin. Las interrupciones externas están disponibles en los pines selectivos de Arduino.

Aquí hay una lista de los pines utilizables para interrupciones externas en diferentes placas Arduino.

Las interrupciones externas deben configurarse usando la función adjuntoInterrupt en la configuración.

para configurar {

adjuntoInterrupt(digitalPinToInterrupt(pin), ISR, modo);
}

El archivo adjuntoInterrupt acepta tres parámetros.

1. El primer parámetro especifica el número de pin en el que se activa la interrupción externa. Este número de pin debe pasarse como parámetro a la función digitalPinToInterrupt.

2. El segundo parámetro es el nombre de la rutina de servicio de interrupción que atiende la interrupción externa en un pin determinado.

3. El tercer parámetro es el modo de interrupción o transición de señal en el que se debe generar la interrupción.

Estos son los posibles modos de una interrupción externa...

  • BAJA : La interrupción se genera cuando la señal digital en el pin es baja.

  • CAMBIO : La interrupción se genera cuando los valores de los pines cambian.

  • ARRIBA : La interrupción se genera cuando la señal digital en el pin se mueve de bajo a alto.

  • CAÍDA: La interrupción se genera cuando la señal digital en el pin se mueve de mayor a menor.

Las tarjetas Due, Zero y MKR1000 también admiten un quinto modo.

  • ALTA : La interrupción se genera cuando la señal digital en el pin es alta.

Una interrupción externa definida para el pin 2 del Arduino Uno es la siguiente…

interrupción int volátilPin = 2;

para configurar {



pinMode(interruptPin, INPUT_PULLUP);


adjuntoInterrupt(digitalPinToInterrupt(interruptPin), ISR, modo);


}

enlace {



}

ISR {


//Código para manejar la interrupción externa en el pin 2



}

Si es necesario, las interrupciones externas también se pueden desactivar en la función de bucle llamando a la función detachInterrupt.

enlace {

separarInterrupt(digitalPinToInterrupt(interruptPin))

}

Escribir ISR
Hay varias consideraciones importantes al escribir rutinas de servicio de interrupción.

  • Hazlos breves y concisos.

    Los ISR están destinados a respuestas repentinas y de emergencia. No están destinados a ejecutar largos bloques de código. Por tanto, los ISR deben ser breves, precisos y relevantes.

  • Evite las funciones de sincronización.

    Las funciones de temporización (como milisegundos, micros, retardoMicrosegundos o retardo) nunca deben utilizarse en un ISR. Esto se debe a que utilizan interrupciones de temporizador. No puede llamar ni utilizar una interrupción dentro de otra interrupción. Por lo tanto, no tiene sentido utilizar funciones de temporización con ISR.

  • Evite los protocolos de comunicación en serie.

    . Las interfaces de comunicación generan sus propias interrupciones, que son de menor prioridad y no pueden reemplazar las interrupciones de hardware o de temporizador. Además, se perderán todos los datos intercambiados durante la ejecución de un ISR. Si es importante almacenar la fecha mientras se ejecuta un ISR, esto sólo se puede hacer cambiando las variables globales. En la función de bucle, el estado de estas variables se puede utilizar para imprimir o comunicar mensajes.

  • Recuerde: los ISR no tienen parámetros.

    Las rutinas del servicio de interrupción no pueden aceptar ningún parámetro excepto el vector de interrupción. Solo se pueden pasar argumentos adicionales a un ISR a través de variables globales.

  • Los ISR no devuelven nada.

    Los ISR tienen un tipo de datos nulo. No pueden devolver ningún valor. Si es necesario pasar un valor del ISR al bucle principal, solo se puede pasar modificando las variables globales. (Aunque es posible leer y escribir pines de entrada/salida digitales dentro de un ISR).

  • Utilice variables volátiles.

    Las variables utilizadas dentro y fuera de los ISR deben ser variables globales y estar definidas como volátiles. El compilador no optimiza las variables volátiles y no corren el riesgo de eliminarse durante la compilación del código fuente. Sin embargo, es importante evitar definir todas las variables en un ISR como volátiles porque ralentizan el código. Por lo tanto, defina únicamente las variables dentro y fuera del ISR como volátiles.

Conclusión

Las interrupciones proporcionan una función importante en el mundo de los microcontroladores. Son el único recurso cuando se trata de situaciones críticas o desafiantes.

Hay interrupciones de hardware y software. Las interrupciones de hardware son generadas por componentes externos en los pines de entrada/salida del controlador. Arduino tiene dos tipos, interrupciones externas e interrupciones de cambio de pin.

Las interrupciones de software están relacionadas con los periféricos integrados y los puertos de comunicación del microcontrolador. Estas interrupciones deben activarse y configurarse mediante instrucciones del programa definidas por el usuario.

Conteúdo Relacionado

A Samsung Electronics, fornecedora de tecnologia de memória avançada,...
ESP32-CAM es un módulo de cámara compacto que combina...
A Infineon Technologies AG apresenta os novos MOSFETs CoolSiC...
En cada vehículo hay una red de sensores integrada...
El controlador del motor es uno de los componentes...
La evolución de los estándares USB ha sido fundamental...
SCHURTER anuncia una mejora de su popular serie SWZ...
Visual Communications Company (VCC) ha anunciado sus nuevos tubos...
A Sealevel Systems anuncia o lançamento da Interface Serial...
A STMicroelectronics introduziu Diodos retificadores Schottky de trincheira de...
Determinar uma localização precisa é necessário em várias indústrias...
O novo VIPerGaN50 da STMicroelectronics simplifica a construção de...
O mercado embarcado tem uma necessidade de soluções de...
Você provavelmente já se deparou com o termo “diodo”,...
Quando você explora a área de Controle V/F dos...
Probablemente se haya encontrado con el término " resistencia...
Regresar al blog

Deja un comentario

Ten en cuenta que los comentarios deben aprobarse antes de que se publiquen.