interruptions externes et internes Arduino

Salut à tous
j'utilise un Arduino Uno et j'avais quelques apprehensions sur les interruptions

Arduino possède deux types d'interruptions:

  • externes (INT 0 et INT1) qui sont relié sur la broche 2 et 3 de la carte
  • Interne qui sont des timers généralement..
// Include the TimerOne Library from Paul Stoffregen
#include "TimerOne.h"
const byte MOTOR1 = 2;  // Motor 1 Interrupt Pin - INT 0
const byte MOTOR2 = 3;  // Motor 2 Interrupt Pin - INT 1
 
// Integers for pulse counters
unsigned int counter1 = 0;
unsigned int counter2 = 0;
 
// Float for number of slots in encoder disk
float diskslots = 20;  // Change to match value of encoder disk
 
// Interrupt Service Routines
 
// Motor 1 pulse count ISR
void ISR_count1()  
{
  counter1++;  // increment Motor 1 counter value
} 
 
// Motor 2 pulse count ISR
void ISR_count2()  
{
  counter2++;  // increment Motor 2 counter value
} 
 
// TimerOne ISR
void ISR_timerone()
{
  Timer1.detachInterrupt();  // Stop the timer
  Serial.print("Motor Speed 1: "); 
  float rotation1 = (counter1 / diskslots) * 60.00;  // calculate RPM for Motor 1
  Serial.print(rotation1);  
  Serial.print(" RPM - "); 
  counter1 = 0;  //  reset counter to zero
  Serial.print("Motor Speed 2: "); 
  float rotation2 = (counter2 / diskslots) * 60.00;  // calculate RPM for Motor 2
  Serial.print(rotation2);  
  Serial.println(" RPM"); 
  counter2 = 0;  //  reset counter to zero
  Timer1.attachInterrupt( ISR_timerone );  // Enable the timer
}
 
void setup() 
{
  Serial.begin(9600);
  
  Timer1.initialize(1000000); // set timer for 1sec
  attachInterrupt(digitalPinToInterrupt (MOTOR1), ISR_count1, RISING);  // Increase counter 1 when speed sensor pin goes High
  attachInterrupt(digitalPinToInterrupt (MOTOR2), ISR_count2, RISING);  // Increase counter 2 when speed sensor pin goes High
  Timer1.attachInterrupt( ISR_timerone ); // Enable the timer
} 
 
void loop()
{
  // Nothing in the loop!
  // You can place code h

En écrivant Timer1.detachInterrupt() je stoppe le timer , je voudrais savoir également si elle blogue les interruptions externes (ISR_count1 & ISR_count2() ) ? Ou bien ces interruptions externes continuent de fonctionner en arrière-plan.

Que se passe-t-il donc lorsqu'on écrit nointerrupts() ? Cette instruction blogue-t-elle les interruptions internes et externes ?

Vous pouvez désactiver les interruptions individuellement (heureusement, sinon, par exemple votre compteur de millisecondes casserait, le temps suspendant son vol).
nointerrupts() , au contraire, arrêtera toutes les interruptions (plus celles dont vous n'avez pas l'idée de l'existence, et qui peuvent vous simplifier la vie). Elle ne devrait porter que sur de toutes petites portions de code, pour que votre vie informatique reste simple et confortable ... et uniquement si vous voulez garantir un temps d'execution de ces tout petits bouts de code (ex : certains bandeaux de LEDS ont besoin d'impulsion de temps fixées très précisément-, une interruption sèmerait un désordre incroyable); à moins que vous n'envisagiez d'écrire vos propres bibliothèques, cette gestion fine du temps est déjà fournie pour la multitude de périphèriques disponibles pour Arduino (un fabricant ou lady ADda font les bibliothéques arduino avant même que les périphèriques ne sortent)

"Vous pouvez désactiver les interruptions individuellement"

Les interruptions donc vous mentionnez dans votre phrase sont-elles externes ou internes? Est ce possible de desactiver seulement les interruptions externes ?

On peut désactiver les interruptions sur chacun des périphériques individuellement (les IO sont des périphériques) mais il faut se plonger dans la datasheet du processeur pour identifier quels bits dans quels registres il faut manipuler.

Le fait qu'elles soient internes ou externes n'a pas d'importance (autrefois, les timers étaient à l'exterieur des boîtiers, pour infliger des tonnes de câblage aux bidouilleurs, en punition de leurs péchés).

Ce qui est important, c'est que vous pouvez les désactiver nominativement, une par une, ou en bloc (sections critiques, qui ne doivent pas être interrompues et qui ddoivent rester brèves)

L'essentiel, c'est de pouvoir les maîtriser à bon escient (le moins possible, voire pas du tout,si vous n'en avez pas besoin).
Des tas de discussions passionnantes (comment invalider une interruption, puis toutes, puis remettre les interruptions sauf celle qui a été invalidée) sont sur l'étrange toile:

a l'air très bien.
Mais vous devriez vous poser ces questions :
ai je besoin d'interruptions?
vais je perturber les interruptions existantes (Serial, times() ont besoin d'interruptions; nointerrupt() les tura jusqu'àce que interrupt() les reçoive ... et active une éventuelle interruption en latence)