하나의 단일 ISR 트리거는 단일 버튼 누름을 탐지하기에 충분하지 않습니다. 모든 버튼에서 전자 기계적 신호 바운스 (bounce)로 인해, 당신은 일종의 디 - 바운싱 (de-bouncing) 알고리즘이 필요합니다.
또한 EMI로부터 영향을받지 않는 프로그램이 필요하므로 버튼에서 많은 펄스가 발생할 때마다 다중 인터럽트가 스택에 혼란을주지 않습니다. 예를 들어
: 버튼이 다른 인터럽트를주고 서로 다른 포트에 연결되어 있다면
버튼마다 하나 개의 인터럽트를 생성한다. 포트가 동일한 포트에 연결되어 있으면 보통 MCU에 따라 동일한 인터럽트를 트리거 할 수 있습니다.
당신이 어떤 신호 에지 (상승 또는 하강) ISR 에서 다음 버튼에서의 결과로 인터럽트를받을 때마다
는 인터럽트을 해제하고 일반적으로 버튼에 따라 5-10ms의 하드웨어 타이머를 시작합니다. 타이머는 타이머 인터럽트를 트리거하는 것이 바람직하다. 바운싱 및 잠재적 인 EMI 글리치로 인한 잘못된 인터럽트를 필터링하려면 인터럽트를 비활성화해야합니다.
타이머가 de-bouncing에 필요합니다. 버튼 데이터 시트에서 정확한 신호 바운스 시간을 찾을 수없는 경우 (흔히 사용하지 않는 경우) 오실로스코프를 사용하여 간단히 측정하십시오.
타이머가 경과하면 포트를 읽고 결과를 변수에 저장하십시오. 버튼 인터럽트를 다시 한번 활성화하십시오.
변수를 static volatile
으로 파일 범위에서 선언해야합니다. 우수한 프로그램 설계에 필요한 개인 캡슐화에 정적입니다. 컴파일러가 변수가 ISR에 의해 수정되었음을 인식하지 못하는 일반적인 컴파일러 최적화 프로그램 버그를 방지하기 위해 휘발성.
첫 번째 버튼에 대해서도 동일하게 구현하십시오. 버튼의 현재 상태를 나타내는 두 개의 변수가 있습니다. 이 두 변수를 서로 비교하기 만하면 두 버튼이 동시에 눌려 졌는지 여부를 알 수 있습니다.
인터럽트 서비스 루틴에서 입력을 확인하여 어떤 버튼이 눌러 졌는지 확인해야합니다.또는 ISR이 플래그를 설정하면 메인 루프가 해당 플래그를 확인하고 메인 루프가 어떤 버튼이 눌려 졌는지 입력을 확인한 다음 해당 버튼에 필요한 모든 작업을 수행합니다. –
ISR을 사용해야합니까? 메인 루프의 버튼 누름에 대해 폴링 * 할 수 있습니까 (그리고 디 바운스 포함)? –
답변은 장치에 따라 다르지만 예. "두 개의 버튼을 함께 누르면"의미하는 것을 정의 할 필요가 있습니다. 두 번째 버튼이 상승/하강 에지에서 시작될 때 첫 번째 버튼이 여전히 눌려 있음을 의미합니다. @ JoachimPileborg는 올바른 생각을 가지고 있습니다. ISR에서 어떤 버튼이 눌러 졌는지 확인하십시오. 버튼 누르기/단추 놓기 등 모든 종류의 시나리오를 처리 할 수 있습니다. – UncleO