일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- #textLCD
- petalinux
- #Atmega128
- 인터럽트
- avr
- xilinx
- #ComportMaster
- #채터링
- Linux
- Embedded linux
- #CLCD
- SQLite Studio
- ubuntu
- ubutu
- #시리얼통신
- #문자열
- zynq
- ATMEGA128
- sqlite
- Interrupt
- Database
- github
- #PuTTY
- #UART
- #MCU
- git
- Today
- Total
재잼재잼의 티스토리
2. 버튼 채터링 해결하기 본문
환경구성도 끝냈고, LED 점멸도 테스트 해봤다.
출력을 했으니 입력을 해야하는데, 푸쉬버튼으로 해보려 한다.
예전부터 푸쉬버튼 사용할 때, 버튼 채터링 때문에 많이 해맸었는데, 이걸 또 하려하니 여전히 헷갈린다.
그래서 정리하면서 진행하려 한다.
---------------------------------
채터링은 버튼의 물리적 특성 때문에 사용자가 버튼을 눌렀을 때 값이 잠시 스프링처럼 튀었다가 안정된 값으로 들어가게 된다.
이때, 스프링처럼 값이 튈 때도 MCU는 입력으로 받아들이기 때문에, 사용자가 원하는 결과를 얻지 못하는 경우가 발생한다.
ex) 버튼을 누를때마다 LED 순차점등을 수행할 때, 한번에 여러개의 LED가 켜지는 것과 같은..(버튼입력을 여러번 한 것과 같은)
이런 채터링을 제거(디바운스)하기 위해서 소프트웨어적 방법과 하드웨어적 방법을 사용한다.
하드웨어적으로 해결하는건 간단하게 커패시터를 버튼 양단에 물려주면 된다고 하는데... 난 잘 안되는거 같다. 잘못 연결한건지..
다음에 다시 해봐야 겠다.
그래서 결국 소프트웨어적으로 해결했다.
기본적으로 버튼의 "이전 상태"를 저장하는 변수와 "현재 상태"를 저장하는 변수가 필요하다.
1. 버튼이 눌림 상태로 바뀌는시점에서 delay를 사용해 안정적인 상태에서 값을 입력받는 방법.
핵심은 if문 아래의 _delay_ms(30) 이다.
하지만 내 경우는 이렇게 해도 정상적으로 실행이 잘 안되었음... 조금 채터링 횟수를 줄여주는 정도..??
2. 버튼이 완전히 눌려진 상황을 찾아내기 위한 방법.
이건 조금 복잡한데, 버튼 상태를 짧은 시간에 두번 검사하여 둘다 1이 입력되는(풀다운 저항에서) 경우를 찾는다.
핵심은 get_btn_state 함수. 버튼이 입력됨을 확인하고 10ms 뒤에 다시 확인했을 때도 1이면 입력되었다고 인지 한다.
나는 이렇게 사용했을때 정상적으로 실행이 되었다.
아마 소프트웨어적으로 해결하려 할때는 보통 2번 방법을 사용하지 않을까...
'MCU' 카테고리의 다른 글
6. UART 문자열 송/수신 (0) | 2019.01.16 |
---|---|
5.UART 문자 송/수신 (0) | 2019.01.15 |
4. UART사용 - 초기화 (0) | 2019.01.14 |
3. UART 개요 (0) | 2019.01.13 |
1. ATmega128 환경 구성 (0) | 2019.01.09 |