Arduino 및 인터럽트 : 핀 값을 얻는 빠른 방법 작동하도록 설정했습니다 . void setup() 인터럽트를 설정하는

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) 기능이 모든 인터럽트마다 트리거됩니다. 그것은 매력처럼 작동합니다. 내 질문은, 어떤 핀이 트리거되었는지 알아내는 가장 좋은 방법은 무엇입니까?

Re 에서 무언가를 찾았습니다 . 핀 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" );

결국, 핀의 인터럽트를 계산하고 싶습니다. 그러나 두 번 계산되지 않는다는 것을 어떻게 확신 할 수 있습니까?



답변

나는 첫 번째 해결책을 가지고 있지만 하드웨어가 완성되지 않아서 신뢰성을 테스트 할 수 없었습니다.

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