Arduinoと割り込み:ピン値を取得する高速な方法


11

私はArduino Unoを使用しており、私が見つけた説明1に従って、デジタルピン2、3、4、および5の割り込みで動作するようにすでに設定しています。

void setup() 割り込みを設定する次のコードが含まれています。

  //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);

そして今、ISR(PCINT2_vect)関数はすべての割り込みでトリガーされます。それは魅力のように機能します。私の質問は、どのピンがトリガーされたかを知るための最良/最速の方法は何ですか?

私はで何かを発見した日時:ピン2、3にISR(PCINT2_vect)またはattachInterruptを使用することをお勧めしますか?、しかし私はコードを理解しておらず、そのままでは機能しません。しかし、それは印象的に見えます...

解決策は何ですか?

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

編集:

現時点では、入力ピンレジスタからピンの状態を読み取っています。

  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" );

最後に、ピンの割り込みをカウントしたいと思います。しかし、2回カウントされないことをどのように保証できますか?


エレクトロニクスでは、おそらくより多くの人々がArduinosやその他の電子機器をいじっています。
Earlz '28

あなたが思うなら、質問はあそこにあるはずです、それを報告してください。ログインの問題を解決しました。
madc

3
@Earlz:これはプログラミングの質問なので、トピックについてです。趣味のプラットフォーム用であるという事実は無関係です。参考のために、stackoverflowに関する他何百ものarduinoの質問を参照してください。
BlueRaja-Danny Pflughoeft、2011

回答:


4

私は最初の解決策を自分で持っていますが、ハードウェアのジェットが完成していないため、信頼性をテストできませんでした。

最初に、oldPinsとtickCountをグローバル変数として追加しました。

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

そして、それが現在ISRを解決した方法です。より良いソリューションは歓迎以上のものです。

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;
}

1
ISRでtickCount []を更新する場合は、「volatile」型修飾子で宣言する必要があります。
icarus74

解答内のコードを更新しました。詳細については、arduinoのドキュメントを参照してください。arduino.cc/ en
Reference
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.