Aller au contenu


Photo
- - - - -

Pin change Interrupt sur Arduino Mega et Uno.


  • Veuillez vous connecter pour répondre
Aucune réponse à ce sujet

#1 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 8 252 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 01 octobre 2019 - 04:41

Il existe des pins d'interruption qui permette de déclancher une action quand un pin est changé grâce à une fonction : 

attach interrupt : https://www.arduino....ttachinterrupt/

 

Sur l'arduino uno ces pins d'interruptions sont aux nombre de 2 il s'agit des pins 2 et 3. 

 

Sur l'arduino mega ces pins d'interruptions sont aux nombre de 6 ce sont les pins 2, 3, 18, 19, 20 et 21

cependant 4 de ces pins ont d'autre fonctionnalités qu'il peut être dérangeant de sacrifier : 

18 et 19 sont les pins RX3 et TX3 
20 et 21 sont les pins SDA et SCL pour l'i2C ... 

Du coup si on a besoin de tous nos ports série et de l'I2c et de plus de deux interruptions est ce qu'on est coincé pour autant ? 

Non car il existe les Pin Change Interrupt => https://playground.a...hangeInterrupt/

Pin Change Interrupt permet de déclencher des interruptions sur n'importe quel pin de l'arduino uno  ou sur certains pins de l'arduino mega. 
Un seul détail : Il n'y a que 3 fonctions d'interruption qui peuvent être déclenchée de cette façon et donc une même interruption et générée par plusieurs groupes de pins. 

Ces trois fonctions sont :  PCINT0 , PCINT1 et PCINT2

Sur une uno : 

 

PCINT0  est lancé par un changement sur les pins D8 à  D13 (PORT B : B0 à B5)

PCINT1 est lancé par un changement sur les pins  A0 à A5    (PORT C : C0 à C5)
PCINT2 est lancé par un changement sur les pins D0 à D7    (PORT D : D0 à D7)

 

Sur une arduino Mega : 

PCINT0  est lancé par un changement sur les pins PIN 53 52 51 50 10 11 12 13 ( PORT B : B0 à PB7)  

PCINT1 est lancé par un changement sur des pins  qui ne sont pas accessible par défaut  
PCINT2 est lancé par un changement sur les pins A8 à A15 (PORT K : K0 à K7)

 

 

On notera que sur la mega les pins 50 -53 sont utilisé pour le SPI : MISO MOSI SCK SS

 

 

Il y a déjà un exemple simple de code utilisant les pin change interrupt pour une uno ici : https://playground.a...hangeInterrupt/

 

 

Donc je vais poster qu'une structure de code adapté à la mega que vous pourrez utiliser si vous avec besoin de Pin Change interrupt : 

// Example of code using Pin change interrupt on arduino Mega provided by Mike118
// helpfull documentation :
// Arduino Mega Pinout https://www.arduino.cc/en/Hacking/PinMapping2560
// Arduino Mega PCINT Pinout table : https://github.com/NicoHood/PinChangeInterrupt/blob/master/Readme.md
// Arduino uno simple PCINT example : https://playground.arduino.cc/Main/PinChangeInterrupt/
 
void pciSetup(byte pin)
{
    *digitalPinToPCMSK(pin) |= bit (digitalPinToPCMSKbit(pin));  // enable pin
    PCIFR  |= bit (digitalPinToPCICRbit(pin)); // clear any outstanding interrupt
    PCICR  |= bit (digitalPinToPCICRbit(pin)); // enable interrupt for the group
}
 
// ISR Routine to handle each group
 
ISR (PCINT0_vect) // handle pin change interrupt for PB0 to PB7 (PIN 53 52 51 50 10 11 12 13) 
 {    
     // Do what you want here, it will be triggered whenever one of the eight pins change. 
 }

/* PCINT1 is not usable by default on arduino mega 
ISR (PCINT1_vect) 
 {    
     
 }
 */
ISR (PCINT2_vect) // handle pin change interrupt for PK0 to PK7 ( PIN A8 to A15)
 {
     // Do what you want here, it will be triggered whenever one of the eight pins change. 
 }  
 
void setup() {  

// init all pin change interrupt pin available 
  for (int i=10; i<=13; i++) {
      pinMode( i, INPUT);    // INPUT is already on by default but ...
      digitalWrite(i,HIGH);  // set pullups, if necessary ...
      pciSetup(i);           // enable interrupt for pin...
  }

  for (int i=50; i<=53; i++) {
      pinMode( i, INPUT);    // INPUT is already on by default but ...
      digitalWrite(i,HIGH);  // set pullups, if necessary ...
      pciSetup(i);           // enable interrupt for pin...
  }
 
  for (int i=A8; i<=A15; i++) {
      pinMode( i, INPUT);    // INPUT is already on by default but ...
      digitalWrite(i,HIGH);  // set pullups, if necessary... 
      pciSetup(i);           // enable interrupt for pin...
  }

}
 
 
void loop() {
  // Do your usual stuff here
}

Ce genre des chose peut particulièrement être utile quand vous souhaitez lire la valeur de plusieurs signaux sur une arduino comme lire plusieurs signaux RC sur une radiocommande ou bien lire des encodeurs et faire un seul et même traitement quelque soit le pin qui a changé.

Si vous avez uniquement besoin de déclencher une fonction donnée quand un des pins donné  parmi les pin change interrupt change dans ce cas soit vous faites vous même la petite routine qui permet de savoir quel pin à déclencher l'interruption pour savoir quel fonction appeler, soit vous utiliser des petites librairies toute faites qui font cela pour vous comme :

enableInterrupt ou pinChangeInterrupt .

 

 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 

 

Les réalisations de Mike118  

 

 

 





0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users