Introducción
Las interrupciones, como su nombre indica, son un método para detener el proceso que está ejecutando el procesador con el fin de ejecutar una subrutina más pequeña. Este método tiene muchas aplicaciones en el mundo real y es una parte importante de la automatización. Estas interrupciones pueden ser generadas externamente con la ayuda de hardware, como un interruptor o un sensor, o pueden ser generadas por software cuando se cumple una condición particular o se ha ejecutado un conjunto de instrucciones.
En este tutorial, aprenderás cómo utilizar las interrupciones de hardware en un PLC Arduino de Industrial Shields. Se trata de una visión general con un código de ejemplo para demostrar las capacidades con respecto a la gestión de las interrupciones y la ejecución de las placas que soportan esta característica. Para facilitar la comprensión y la demostración, haremos un bucle de una cadena de texto en el monitor de serie y lo interrumpiremos con algunos botones de hardware.
Requisitos
Configurar el IDE de Arduino con las librerías de Industrial Shields y su placa específica. Puedes encontrar el enlace al tutorial aquí
Hardware
Para este tutorial, el controlador industrial a utilizar es un M-DUINO PLC Arduino Ethernet 58 IOs Analógico/Digital PLUS
Si estás utilizando una placa diferente, asegúrate de que las entradas de interrupción están habilitadas y comprueba el estado del interruptor DIP. Puedes ir a la página de detalles técnicos de tu producto específico y comprobar la sección de hardware para asegurarte de que las interrupciones están habilitadas.
Sintaxis
Para inicializar la entrada de interrupción en la placa, debes utilizar la función attachInterrupt() con los siguientes parámetros::
attachInterrupt(digitalPinToInterrupt(pin), ISR, mode)
digitalPinToInterrupt(pin) --> Sirve para inicializar el pin dado y asignarlo como la interrupción.
pin --> En este caso, no se utilizará el número de pin de Arduino, sino los escritos en sus respectivas placas. Por ejemplo, "I1_5" para la placa que estás utilizando.
ISR --> ISR --> Esto significa Rutina de Servicio de Interrupción, es una función que es llamada cuando se dispara la interrupción. Esto no debe tomar ningún parámetro y no devuelve nada, sin embargo, puede pasar variables globales.
mode --> Especifica cuándo debe activarse una interrupción.
LOW para activar la interrupción siempre que el pin esté bajo.
CHANGE para activar la interrupción cuando el pin cambia de valor.
RISING para disparar cuando el pin pasa de bajo a alto.
FALLING para cuando el pin pasa de alto a bajo
Las placas Due, Zero y MKR1000 también permiten:
HIGH para disparar la interrupción siempre que el pin esté alto.
ATENCIÓN: La placa Leonardo NO PERMITE:
LOW para activar la interrupción siempre que el pin esté bajo
Código
// Interrupt Example. Industrial Shields PLCs.
// Board used M-DUINO PLC Arduino Ethernet 58 IOs Analog/Digital PLUS
int val1,val2,val3,val4 = 0;
///////Setting up the board and the pins
void setup() {
Serial.begin(9600L);
//Initalizing interrupt I1_5
attachInterrupt(digitalPinToInterrupt(I1_5), isrI1_5, LOW);
//Initalizing interrupt I1_6
attachInterrupt(digitalPinToInterrupt(I1_6), isrI1_6, CHANGE);
//Initalizing interrupt I2_6
attachInterrupt(digitalPinToInterrupt(I2_5), isrI2_5, RISING);
//Initalizing interrupt I2_6
attachInterrupt(digitalPinToInterrupt(I2_6), isrI2_6, FALLING);
}
/////// Printing a String every seconds in a loop continuously to interrupt
void loop() {
Serial.println("*****/Industrial Shields PLCs // Open Source Technologies/*****");
delay(1000);
}
///////Interrupt Service Routines
void isrI1_5(){
Serial.println("!!!!INTERRUPT 1_5!!!!!"); //ISR for I1_5
}
void isrI1_6 (){
Serial.println("!!!!INTERRUPT 1_6!!!!!"); //ISR for I1_6
}
void isrI2_5(){
Serial.println("!!!!INTERRUPT 2_5!!!!!"); //ISR for I2_5
}
void isrI2_6 (){
Serial.println("!!!!INTERRUPT 2_6!!!!!"); //ISR for I2_6
}
/////////////End//////////////