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

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

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


전자 제품에서는 더 많은 사람들이 Arduino 및 기타 전자 제품을 엉망으로 만들었습니다.
Earlz

당신이 생각한다면, 질문은 저기에 있어야합니다. 로그인 문제를 해결했습니다.
madc

3
@Earlz : 이것은 프로그래밍 문제이므로 주제에 관한 것 입니다. 그것이 취미 플랫폼을위한 것이라는 사실은 관련이 없습니다. 투시 유래 다른 아두 이노 질문 수백 참조 할 수 있습니다.
BlueRaja-대니 Pflughoeft

답변:


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/Volatile
madc
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.