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