Diferencia entre revisiones de «attachInterrupt()»

De ArduWiki
Saltar a: navegación, buscar
(Ejemplo)
(Advertencias)
 
(No se muestran 12 ediciones intermedias del mismo usuario)
Línea 20: Línea 20:
 
|[[DUO]]||colspan=6|Todos los pines
 
|[[DUO]]||colspan=6|Todos los pines
 
|}
 
|}
 +
 +
{{Tip|Asi como hay las INT tambien hay las PCINT (Ping Change INT). No son tan versatiles, son mas lentas pero son muchas.}}
  
 
== Sintaxis ==
 
== Sintaxis ==
Línea 42: Línea 44:
 
== Retornos ==
 
== Retornos ==
 
Nada.
 
Nada.
 +
 +
== Comentarios ==
 +
* Haz lo que quieras pero no te demores. Acaba cuanto antes y lárgate. Debes entender que una interrupción es como un estado de excepción, que se puede usar sin reparos, pero entendiendo que hay que hacer el trabajo y salir cuanto antes.
 +
* Hay cosas que no funcionan, como las funciones: [[delay()]], [[millis()]], Serial.xx y cualquier cosa que dependa de interrupciones o timers.
 +
* De hecho, una ISR o función CallBack, no puede retornar parámetros ni tampoco recibirlos.
  
 
== Advertencias ==
 
== Advertencias ==
* Dentro de la función de Interrupción, delay () no funcionará y el valor devuelto por Millis () no aumentará. Los datos serie recibidos, mientras que la función está activa se pueden perder. Usted debe declarar como volátile cualquier variable que se modifique dentro de la función de Interrupción. Vea la sección de ISR a continuación para obtener más información.
+
* Dentro de la función de Interrupción, [[delay()]] no funcionará y el valor devuelto por [[millis()]] no aumentará. Los datos serie recibidos, mientras que la función está activa se pueden perder. Usted debe declarar como [[volatile]] cualquier variable que se modifique dentro de la función de Interrupción. Vea la sección de ISR a continuación para obtener más información.
  
== Ejemplo ==
+
== Ejemplo 1 ==
 
En este ejemplo hacemos que el LED a bordo conmute con un pulsador en el pin digital 2.
 
En este ejemplo hacemos que el LED a bordo conmute con un pulsador en el pin digital 2.
  
 
<syntaxhighlight lang="c++">
 
<syntaxhighlight lang="c++">
 
const byte pulsador = 2;
 
const byte pulsador = 2;
volatile bool estado = LOW;
+
volatile bool estado = LOW;   //Sinonimo de false o 0.
 
void setup(){   
 
void setup(){   
 
   pinMode(LED_BUILTIN, OUTPUT);  
 
   pinMode(LED_BUILTIN, OUTPUT);  
Línea 62: Línea 69:
 
void loop(){   
 
void loop(){   
 
   digitalWrite(LED_BUILTIN, estado);
 
   digitalWrite(LED_BUILTIN, estado);
 +
}
 +
</syntaxhighlight>
 +
 +
== Ejemplo 2 ==
 +
En este ejemplo hacemos que el LED a bordo conmute con un pulsador en el pin digital 2 considerando el [[Rebote]]
 +
 +
<syntaxhighlight lang="c++">
 +
const byte pulsador = 2;
 +
const byte retardo = 150;
 +
volatile bool estado = LOW;  //Sinonimo de false o 0.
 +
volatile unsigned long tiempo = 0;
 +
volatile byte n = 0;
 +
volatile byte anterior = 0;
 +
 +
void setup(){ 
 +
  pinMode(LED_BUILTIN, OUTPUT);
 +
  pinMode(pulsador, INPUT_PULLUP);
 +
  attachInterrupt(digitalPinToInterrupt(pulsador), cambia, FALLING);
 +
}
 +
void cambia(){ 
 +
  if (millis() > tiempo + retardo){
 +
      estado = !estado;
 +
      tiempo = millis();
 +
      n++;
 +
  }
 +
}
 +
void loop(){
 +
  if (n != anterior){
 +
      digitalWrite(LED_BUILTIN, estado);
 +
      anterior = n;
 +
      Serial.println(n);
 +
  }
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>
Línea 70: Línea 109:
 
* [[noInterrupts()]]
 
* [[noInterrupts()]]
 
* [[digitalPinToInterrupt()]]
 
* [[digitalPinToInterrupt()]]
 +
* [[PCINT]]
  
== Referencias ==
+
== Referencias externas ==
 
* [https://www.arduino.cc/reference/es/language/functions/time/millis/ Guia de referencia de Arduino]
 
* [https://www.arduino.cc/reference/es/language/functions/time/millis/ Guia de referencia de Arduino]
 +
* [http://www.gammon.com.au/interrupts Interrupts] - Nick Gammon
 +
* [https://www.luisllamas.es/tag/interrupciones/ Interrupciones (INT)] - Luis Llamas
 +
* [https://www.luisllamas.es/interrupciones-en-todos-los-pines-de-arduino-con-pcint/ Arduino PCINT] - Luis Llamas
  
[[Category:Funciones]]
+
[[Category:Funciones interrupciones]]

Revisión actual del 21:56 7 oct 2019

Descripción

Esta función no permite traducir el pin digital real al número de interrupción específico. Normalmente, debe usar digitalPinToInterrupt(pin), en lugar de colocar un número de interrupción directamente en su boceto. Los pines específicos con interrupciones, y su asignación para interrumpir el número varía en cada tipo de placa. El uso directo de números de interrupción puede parecer simple, pero puede causar problemas de compatibilidad cuando el boceto se ejecuta en una placa diferente. Sin embargo, los bocetos más antiguos a menudo tienen números de interrupción directa.

A menudo se usaron el número 0 (para el pin digital 2) o el número 1 (para el pin digital 3). La tabla a continuación muestra los pines de interrupción disponibles en varios tableros.

Tenga en cuenta que en la tabla a continuación, los números de interrupción se refieren al número que se pasará a attachInterrupt(). Por razones históricas, esta numeración no siempre se corresponde directamente con la numeración de interrupción en el chip ATmega (por ejemplo, int.0 corresponde a INT4 en el chip ATmega2560).

Pines digitales con Interrupción.

Pines de interrupcion en Arduino
Arduino INT.0 INT.1 INT.2 INT.3 INT.4 INT.5
UNO 2 3        
MEGA 2 3 21 20 19 18
32u4 3 2 0 1 7  
DUO Todos los pines

Tip: Asi como hay las INT tambien hay las PCINT (Ping Change INT). No son tan versatiles, son mas lentas pero son muchas.


Sintaxis

attachInterrupt(digitalPinToInterrupt(pin), ISR, mode);   //recomendado
attachInterrupt(INT, ISR, modo);                    //no recomendado
attachInterrupt(pin, ISR, modo) ;                         //Solo DUE, Zero y MKR1000.

Parámetros

El primer parámetro para attachInterrupt() es el número de interrupción. Normalmente debería utilizar digitalPinToInterrupt(pin) para traducir el pin digital real al número de interrupción específica. Por ejemplo, si se conecta al pin3, utilice digitalPinToInterrupt(3) como el primer parámetro para attachInterrupt().

INT
Es el número de interrupción (int)
pin
Es el número de pin (solo DUE, Zero, MKR1000)
ISR
Función de usuario que se invoca cuando sucede la interrupción; esta función no debe tener parámetros ni devolver nada. Esta función a veces se denomina Rutina del Servicio de Interrupciones.
modo
define cuando debe ser disparada la interrupción. Existen cuatro constantes predefinidas como valores válidos
LOW dispara la interruoción cuando el pin está a nivel bajo.
CHANGE dispara la interrupción cuando el pin cambia su valor.
RISING dispara la interrupción cuando el pin pasa de nivel bajo a nivel alto.
FALLING dispara la interrupción cuando el pin pasa de nivel alto a nivel bajo.

Retornos

Nada.

Comentarios

  • Haz lo que quieras pero no te demores. Acaba cuanto antes y lárgate. Debes entender que una interrupción es como un estado de excepción, que se puede usar sin reparos, pero entendiendo que hay que hacer el trabajo y salir cuanto antes.
  • Hay cosas que no funcionan, como las funciones: delay(), millis(), Serial.xx y cualquier cosa que dependa de interrupciones o timers.
  • De hecho, una ISR o función CallBack, no puede retornar parámetros ni tampoco recibirlos.

Advertencias

  • Dentro de la función de Interrupción, delay() no funcionará y el valor devuelto por millis() no aumentará. Los datos serie recibidos, mientras que la función está activa se pueden perder. Usted debe declarar como volatile cualquier variable que se modifique dentro de la función de Interrupción. Vea la sección de ISR a continuación para obtener más información.

Ejemplo 1

En este ejemplo hacemos que el LED a bordo conmute con un pulsador en el pin digital 2.

const byte pulsador = 2;
volatile bool estado = LOW;   //Sinonimo de false o 0.
void setup(){  
   pinMode(LED_BUILTIN, OUTPUT); 
   pinMode(pulsador, INPUT_PULLUP); 
   attachInterrupt(digitalPinToInterrupt(pulsador), cambia, CHANGE);
}
void cambia(){  
   estado = !estado;
}
void loop(){  
   digitalWrite(LED_BUILTIN, estado);
}

Ejemplo 2

En este ejemplo hacemos que el LED a bordo conmute con un pulsador en el pin digital 2 considerando el Rebote

const byte pulsador = 2;
const byte retardo = 150;
volatile bool estado = LOW;   //Sinonimo de false o 0.
volatile unsigned long tiempo = 0;
volatile byte n = 0;
volatile byte anterior = 0;

void setup(){  
   pinMode(LED_BUILTIN, OUTPUT); 
   pinMode(pulsador, INPUT_PULLUP); 
   attachInterrupt(digitalPinToInterrupt(pulsador), cambia, FALLING);
}
void cambia(){  
   if (millis() > tiempo + retardo){
      estado = !estado;
      tiempo = millis();
      n++;
   }
}
void loop(){
   if (n != anterior){
      digitalWrite(LED_BUILTIN, estado);
      anterior = n;
      Serial.println(n);
   }
}

Vea también

Referencias externas