2014-05-09 4 views
1

질문에서 언급했듯이 컨트롤러가 두 개의 버튼 누름을 동시에 감지 할 수 있는지 궁금합니다.마이크로 프로세서/마이크로 컨트롤러에 의해 동시에 두 개 이상의 버튼 누름 (GPIO)을 감지하는 방법은 무엇입니까?

저는 컨트롤러 프로그래밍을 처음 접했고 LED로 깜박이고 버튼으로 옮겨졌으며 이제는 버튼 프레스에서 놀려고합니다. 두 버튼을 함께 누르면 깃발을 하나씩 설정하고 싶었습니다..

하지만이 경우 하나의 ISR 만 호출되므로 하나의 프레스가 감지됩니다. 우리가이를 어떻게 ...

안부 메시

(일부의 전자 장치에서, 우리가 한 동시에 3 개 적절한 버튼을 누르면 전화를 다시 함께 특정 버튼을 눌러 예 때 특정 기능을 가짐)
+2

인터럽트 서비스 루틴에서 입력을 확인하여 어떤 버튼이 눌러 졌는지 확인해야합니다.또는 ISR이 플래그를 설정하면 메인 루프가 해당 플래그를 확인하고 메인 루프가 어떤 버튼이 눌려 졌는지 입력을 확인한 다음 해당 버튼에 필요한 모든 작업을 수행합니다. –

+0

ISR을 사용해야합니까? 메인 루프의 버튼 누름에 대해 폴링 * 할 수 있습니까 (그리고 디 바운스 포함)? –

+0

답변은 장치에 따라 다르지만 예. "두 개의 버튼을 함께 누르면"의미하는 것을 정의 할 필요가 있습니다. 두 번째 버튼이 상승/하강 에지에서 시작될 때 첫 번째 버튼이 여전히 눌려 있음을 의미합니다. @ JoachimPileborg는 올바른 생각을 가지고 있습니다. ISR에서 어떤 버튼이 눌러 졌는지 확인하십시오. 버튼 누르기/단추 놓기 등 모든 종류의 시나리오를 처리 할 수 ​​있습니다. – UncleO

답변

2

하나의 단일 ISR 트리거는 단일 버튼 누름을 탐지하기에 충분하지 않습니다. 모든 버튼에서 전자 기계적 신호 바운스 (bounce)로 인해, 당신은 일종의 디 - 바운싱 (de-bouncing) 알고리즘이 필요합니다.

또한 EMI로부터 영향을받지 않는 프로그램이 필요하므로 버튼에서 많은 펄스가 발생할 때마다 다중 인터럽트가 스택에 혼란을주지 않습니다. 예를 들어

: 버튼이 다른 인터럽트를주고 서로 다른 포트에 연결되어 있다면

  1. 버튼마다 하나 개의 인터럽트를 생성한다. 포트가 동일한 포트에 연결되어 있으면 보통 MCU에 따라 동일한 인터럽트를 트리거 할 수 있습니다.

  2. 당신이 어떤 신호 에지 (상승 또는 하강) ISR 에서 다음 버튼에서의 결과로 인터럽트를받을 때마다

    는 인터럽트을 해제하고 일반적으로 버튼에 따라 5-10ms의 하드웨어 타이머를 시작합니다. 타이머는 타이머 인터럽트를 트리거하는 것이 바람직하다.

    바운싱 및 잠재적 인 EMI 글리치로 인한 잘못된 인터럽트를 필터링하려면 인터럽트를 비활성화해야합니다.

    타이머가 de-bouncing에 필요합니다. 버튼 데이터 시트에서 정확한 신호 바운스 시간을 찾을 수없는 경우 (흔히 사용하지 않는 경우) 오실로스코프를 사용하여 간단히 측정하십시오.

  3. 타이머가 경과하면 포트를 읽고 결과를 변수에 저장하십시오. 버튼 인터럽트를 다시 한번 활성화하십시오.

  4. 변수를 static volatile으로 파일 범위에서 선언해야합니다. 우수한 프로그램 설계에 필요한 개인 캡슐화에 정적입니다. 컴파일러가 변수가 ISR에 의해 수정되었음을 인식하지 못하는 일반적인 컴파일러 최적화 프로그램 버그를 방지하기 위해 휘발성.

  5. 첫 번째 버튼에 대해서도 동일하게 구현하십시오. 버튼의 현재 상태를 나타내는 두 개의 변수가 있습니다. 이 두 변수를 서로 비교하기 만하면 두 버튼이 동시에 눌려 졌는지 여부를 알 수 있습니다.

+0

+1 좋은 답변입니다. 본질적으로 상태 머신이 필요합니다. –

+0

@MartinJames 반드시 그런 것은 아닙니다. 여러 가지 방법으로이 작업을 수행 할 수 있습니다. 위의 복잡성에서 볼 수 있듯이 인터럽트는 이익보다 해를 입힐 가능성이 큽니다. 매우 빠른 실시간 응답이 필요한 경우가 아니라면 배경에서 실행중인 타이머 콜백 ISR에서 버튼을 폴링하는 것이 좋습니다. 버튼과 같은 입력, 즉 외부 세계에서 GPIO에 직접 연결된 항목이 있으면 일반적으로 하드웨어에 RC 로우 패스 필터가 없으면 인터럽트를 사용하지 않습니다. 인터럽트가있는 "키보드 웨이크 업"MCU 핀에서 임의의 EMI 글리치가 발생하면 매우 나쁜 결과가 발생할 수 있습니다. – Lundin

+0

funnily, 정확히 내가 뭘 GPIO 레지스터를 폴링/초마다 RTOS에 진드기를 전달하기 전에. 비트 연산을 사용하여 debounce를 수행하는 것은 단지 몇 가지 지침 일뿐입니다. 일부 입력 상태가 긍정적으로 변경된 것으로 간주되면 세마포를 설정합니다. –

관련 문제