버튼은 금속 접점이라 붙는 순간 수 ms 동안 튄다.
이상 ─────┐________
실제 ──┐_┌┐_┌─┐____ 1~20ms 동안 여러 번
인터럽트로 세면 한 번 눌렀는데 카운터가 5씩 오른다.
대응 셋
소프트웨어 시간 필터 변화를 감지한 뒤 일정 시간 무시하거나,
N번 연속 같은 값일 때만 확정한다
하드웨어 RC 필터 저항+커패시터로 파형을 눕힌다
슈미트 트리거 입력 임계값을 위아래로 다르게 둬 흔들림을 흡수한다
인터럽트로 처리할 때의 정석
ISR 에서 세지 말고 플래그만 세우고 타이머로 확정한다.
void EXTI_IRQHandler(void) { pending = 1; t0 = now_ms(); } // ISR 은 짧게
/* 메인 루프 */
if (pending && now_ms() - t0 > 20) { confirm(read_pin()); pending = 0; }
디바운싱 시간은 보통 10~20ms 로 잡는다. 너무 길면 빠른 연타를 놓친다.