1

私はArduinoで作業しており、ポートレジスタで作業を始めています。速度が向上し、複数のポートを同時に変更できる機能が気に入っています。ただし、ポート レジスタを使用して 1 つのピンの変更を監視する方法がわかりません。( bitmathでできると思いますが、それから始める方法さえわかりません。)

したがって、ポートレジスタを確認すると、次のようになります。

PINB = B000xxxxx

xピンの値はどこにありますか。これらのピンのいずれかが変更された可能性があります。一番右の (最下位の?) ビットがいつ変更されたかを知りたいです。bitmath を使用して、最後の 1 つだけが a から a に切り替わったことを確認するにはどうすればよい0です1か?

4

2 に答える 2

2

「Bitmath」はまさにこの問題に対する答えです。あなたの場合:x & 0x01最下位ビットを除くすべてを「マスク」します。0結果は、必要に応じて比較することができ1ます。

一般的なイディオムは次のとおりです。

x & 0x01    // get only the lowest bit
x & ~0x01   // clear only the lowest bit
x & 0xFE    // same: clear only the lowest bit
x | 0x01    // set the lowest bit (others keep their state)
于 2012-04-12T18:14:40.233 に答える
1

ビットが変更されたかどうかを調べるには、他の人が言ったようにマスクする前の値が必要です-

int lastValue = PINB & 0x01;

次に、コードで行います

int currentValue = PINB & 0x01;

現在のピン値の LSB を取得します。

「排他的 OR」(^) 演算子が必要なビットに変更があったかどうかを判断するには、2 つのビットが異なる場合にのみ「真」になります。

if (lastValue ^ currentValue) {
  // Code to execute goes here

  // Now save "last" as "current" so you can detect the next change
  lastValue = currentValue;
}
于 2012-04-15T10:14:40.943 に答える