티스토리 뷰

이번 글에서는 프로그램이 시작되는 시점의 현재 시간을 맞춰 주거나 시간 경과에 따라 시간 오차가 발생할 때, 이를 보정해주기 위하여 사용자가 푸쉬버튼을 눌러 주어 시간과 분에 해당되는 값을 조정하는 방법에 대해서 구현해 보도록 하겠다.

시간 단위 조정을 위하여 푸쉬버튼 하나를 이용하고, 분단위 값을 조정하기 위하여 푸쉬버튼을 하나 더 이용하기로 한다.

시간을 조정하기 위하여 사용자가 언제 푸쉬버튼을 누를지 알 수 없기 때문에, 버튼을 누르는 순간 즉각 이를 알아내기 위하여 external interrupt를 사용하여야 한다.

AVR에는 두가지 종류의 external interrupt를 제공하는데, 하나는 위의 그림에서 초록색 박스로 표시된 INT# 라고 되어 있는 각 핀별로 인터럽트를 발생할 수 있는 방법과 또 다른 하나의 방법인 위의 그림에서 빨간 박스로 표시된 PCINT#라는 Pin change interrupt가 있다.  Pin change 인터럽트는 여러 핀들이 하나의 인터럽트를 공유하도록 되어 있다.

이번 프로젝트에서는 PB2 핀을 Cds 값을 읽기 위하여 ADC 용도로 미리 사용하였으므로 INT0를 사용할 수 없고, PB3, PB4 핀을 이용하기 위하여 PCINT# 인터럽트를 사용하겠다.

버튼과 연결된 핀을 초기화 하기 위한 button_init() 함수를 만든다.  3번 줄은 핀을 입력으로 동작되도록 해주는 코드이고, 4번 줄은 버튼이 눌러지지 않을 때 1의 상태를 유지 시켜 주기위하여 AVR 내부 pull-up 저항을 active 시켜주는 코드이다.

6번 줄은 Pin change interrupt를 사용하기 위한 것이고, 7번 줄은 여러 PCINT#중에서 필요한 핀에 대해서만 인터럽트를 발생시키기 위한 코드이다.

11~25번 줄은 PB3과 PB4에 연결된 푸쉬버튼이 눌러졌을때 실행되는 인터럽트 서비스 루틴이다.  PB3에 연결된 버튼이 눌러지면 카운터값을 감소 되도록 하였고, PB4에 연결된 버튼이 눌러지는 경우에는 카운터 값이 증가되도록 하였다.

8번 줄에 setup() 에서 button_init()를 불러서 초기화 과정을 수행 하도록 하였고, 16번 줄에서는 button_count 값을 계속 출력시키게 해 두었다.

코드를 수정하여 보드에 다운로드 한 후 버튼을 누를때마다 그 값이 증가되거나 감소하는지 확인해 본다.

아마, 실행 시켜보면 버튼을 한번 누르더라도 값이 1만큼 증가되거나 감소되지 않고 2나 3만큼 변화되는걸 볼 수 있을것이다.  이 현상은 버튼의 물리적 특성으로 인하여 아주 짧은 시간안에 접점이 붙었다 떨어졌다를 반복하기 때문이다.

이렇게 짧은 시간안에 의도치 않게 발생되는 현상을 제거해주는 코드를 추가해 주어야 하는데, 이를 디바운스 코드라고 부른다.

눈여겨 볼 사항은 39번 줄에 추가된 delay 코드이다. 여기에서는 200msec 만큼의 시간 지연을 강제로 주었는데 이렇게 하면 최소한 200msec 안에 연속해서 발생되는 인터럽트는 모두 제거하게 만들수 있다.


main.c


'프로젝트 > Tiny Clock' 카테고리의 다른 글

Tiny Clock - 기능 통합  (0) 2018.05.21
Tiny Clock - Cds 측정  (0) 2018.05.18
Tiny Clock - 타이머 설정  (1) 2018.05.18
Tiny Clock - TM1637 동작  (0) 2018.05.17
Tiny Clock - 회로 구성  (0) 2018.05.17
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/12   »
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
글 보관함