2014-11-12 5 views
1

Arduinos에서 작업 중이며 인터럽트를 사용하여 로터리 엔코더을 사용하고 싶습니다. 하지만 인터럽트 코드를 최소화하고 싶습니다.Arduino에서 한 번의 중단으로 여러 번 트리거

단일 인터럽트에서 여러 트리거를 사용할 수 있습니까?

내 실제 코드를 replcace 싶습니다 :

attachInterrupt(0, FailingA, FAILING); 
attachInterrupt(0, RisingA, RISING); 

이 가능

같은 것으로

attachInterrupt(0, ChangeA, CHANGE); 

를?

+0

사용자가 사용하는 로터리 엔코더 (예 : 입력 주변 장치, 노브) 또는 모터입니까? 그리고 결과적으로 핀에서 얻을 수있는 최대 주파수는 얼마입니까? 그리고 여기에 마지막으로 그리고 가장 중요한 질문이 있습니다. 당신은이 코드를 인터럽트로 구현해야합니까? 너무 빠르고 중요해서 처리하기 위해 인터럽트가 필요합니까? 주파수가 100Hz보다 낮 으면 아마도 소프트웨어 (폴링)로 처리하는 것이 낫습니다 ... – frarugi87

+1

흠 ... 죄송 합니다만 2 개의 로터리 엔코더가 있습니다 ... 각각 1024 개의 틱이 있습니다. . 그것은 초당 2 회전 (40cm/s)을 의미하는데, 나는 8000 개의 인터럽트를 가지고 있습니다 ... 8kHz는 소프트웨어로 처리하기에는 너무 많습니다! (이건 내가이 Arduino에서해야 할 유일한 것이 아니다.) –

답변

1

아닙니다. 정확하게 가능하지 않습니다. 외부 인터럽트는 내부적으로 가능성 중 하나에 만 반응하도록 구성됩니다.

CHANGE 인터럽트 서비스 루틴을 사용하고 ISR 시작 부분에있는 핀 값을 테스트하여 FallingA() 또는 RisingA()을 수행하는 것이 좋습니다.

여기에 문제가있을 수 있습니다. 테스트하기 전에 핀이 다시 변경되었을 수 있으므로 인터럽트를 트리거 한 인터럽트가 떨어졌을 수 있으며 테스트 결과 상승 중임을 알 수 있습니다. 두 번의 빠른 인터럽트를 방지하는 한 가지 방법은 플래그가 아직 설정되어 있는지 확인하는 것입니다. 인터럽트가 시작되면 지워졌어야하며, 설정되어 있으면 변경이 다시 발생했습니다. 세 가지 빠른 변경을 방지 할 실용적인 방법은 없습니다.

두 개의 별도 ISR을 사용하려면 여분의 핀이 있습니까? 그렇다면 핀을 함께 연결하고 FALLING ISR을 하나씩 실행하고 RISING ISR을 다른 쪽에서 실행하면됩니다.

+1

그건 내가 생각한거야. 젠장! 2 개의 로터리 엔코더가 있고 2 개의 인터럽트 핀이 I2C에 사용됩니다. 어쨌든 고마워! (: –