여기에서는 이전 포스트에 이어서 다른 인터럽트 방식에 대한 디바운싱 방법에 대해서 알아보도록 하겠다.
rising edge 의 경우 디바운싱
이전과 같이 INT0핀에 택스위치를 연결하고, 이번에는 라이징 에지에 인터럽트가 걸리도록 설정되었다고 하자.
attachInterrupt(INT0, toggleLed, RISING); |
앞의 경우와 반대로 ISR의 함수 처음에 일정시간 지연시킨 후 스위치 신호가 LOW일 때 그냥 리턴시키는데 그 이유는 falling edge에서 발생한 것이 때문이다.
void isr() {_delay_ms(80);if (digitalRead(SW)==LOW) return;…<실제 인터럽트 처리 루틴>} |
changing edge 의 경우 디바운싱
이번에는 changing edge, 즉 falling과 rising edge 모두에서 인터럽트가 걸리도록 설정되었다고 하자.
attachInterrupt(INT0, toggleLed, CHANGE); |
이 경우는 하나의 에지에서 두 개 이상의 인터럽트가 걸리는 것을 막기 위해서 단순히 지연시키는 것으로 충분하다.
void isr() {_delay_ms(80);<실제 인터럽트 처리 루틴>….} |
low 인터럽트 의 경우 디바운싱
마지막으로 low 신호에서 인터럽트가 걸리도록 설정되었다고 하자. 이 인터럽트는 핀 신호가 low 이면 몇 번이고 반복해서 인터럽트가 걸리도록 하려는 의도로 설정되는 것이다. 즉 INT0핀이 low 상태이면 ISR을 수행한 후 그래도 low상태이면 ISR이 바로 다시 수행된다. 이런 식으로 low 상태일 경우에는 계속 ISR이 반복으로 수행된다.
attachInterrupt(INT0, toggleLed, LOW); |
따라서 이 경우는 별도의 디바운싱이 필요치 않다.
댓글 없음:
댓글 쓰기