Arduino et interruptions: moyen rapide d'obtenir les valeurs des broches

11

J'utilise un Arduino Uno et déjà mis en place pour travailler avec les interruptions sur les broches numériques 2, 3, 4 et 5 selon une explication 1 j'ai trouvé.

void setup() contient le code suivant pour configurer les interruptions.

  //Endable Interrupts for PCIE2 Arduino Pins (D0-7)
  PCICR |= (1<<PCIE2);

  //Setup pins 2,3,4,5
  PCMSK2 |= (1<<PCINT18);
  PCMSK2 |= (1<<PCINT19);
  PCMSK2 |= (1<<PCINT20);
  PCMSK2 |= (1<<PCINT21);

  //Trigger Interrupt on rising edge
  MCUCR = (1<<ISC01) | (1<<ISC01);

Et maintenant, la fonction ISR (PCINT2_vect) est déclenchée à chaque interruption. Cela fonctionne comme un charme. Ma question est la suivante: quel est le meilleur moyen / le plus rapide de savoir quelle broche a été déclenchée?

J'ai trouvé quelque chose dans Re: vaut-il mieux utiliser ISR (PCINT2_vect) ou attachInterrupt sur les broches 2, 3? , mais je ne comprends pas le code et il ne fonctionne pas hors de la boîte. Mais ça a l'air impressionnant ...

Quelle est la solution?

[2] http://arduino.cc/forum/index.php/topic,72496.15.html#lastPost

Éditer:

En ce moment, je lis l'état de la broche à partir du registre de broches d'entrée:

  if (PIND & 0b00000100)
    Serial.println( "PIN 2" );
  if (PIND & 0b00001000)
    Serial.println( "PIN 3" );
  if (PIND & 0b00010000)
    Serial.println( "PIN 4" );
  if (PIND & 0b00100000)
    Serial.println( "PIN 5" );

Au final, je veux compter les interruptions sur les broches. Mais comment puis-je assurer qu'il n'y en a pas compté deux fois?

madc
la source
À l'électronique, plus de gens ont probablement joué avec Arduinos et d'autres choses électroniques.
Earlz
Si vous pensez, la question devrait être là-bas, signalez-la. J'ai résolu mes problèmes de connexion.
madc
3
@Earlz: C'est une question de programmation, donc c'est sur le sujet . Le fait que ce soit pour une plate-forme amateur n'est pas pertinent; voir les centaines d'autres questions Arduino sur stackoverflow pour référence.
BlueRaja - Danny Pflughoeft

Réponses:

4

J'ai moi-même une première solution, mais je n'ai pas pu tester la fiabilité car le matériel n'est pas fini jet.

J'ai d'abord ajouté oldPins et tickCount comme variables globales:

static byte oldPins = 0;
volatile unsigned int tickCount[4] = { 0, 0, 0, 0 };

Et c'est comme ça que j'ai résolu l'ISR en ce moment. De meilleures solutions sont plus que bienvenues.

ISR( PCINT2_vect ) {
  //Read values from digital pins 2 to 7
  const byte actPins = PIND;
  //Match this values agaist the oldPins bitmask (XOR and AND for raising edge)
  const byte setPins = (oldPins ^ actPins) & actPins;

  if (setPins & 0b00000100)
    tickCount[0]++;
  if (setPins & 0b00001000)
    tickCount[1]++;
  if (setPins & 0b00010000)
    tickCount[2]++;
  if (setPins & 0b00100000)
    tickCount[3]++;

  oldPins = actPins;
}
madc
la source
1
Si vous mettez à jour tickCount [] dans un ISR, vous devez le déclarer avec le qualificatif de type «volatile».
icarus74
J'ai mis à jour le code dans la réponse. Pour plus d' informations , consultez la documentation arduino: arduino.cc/en/Reference/Volatile
CCAM