스위치가 열려 있는 상태에서  닫거나 닫혀있는 상태에서 열때.
즉 스위치의 상태가 변하는 순간 10ms 이내에 열림과 닫힘이 수회 반복되는 현상을 잡음 또는 채터링(chattering)이라고 합니다.


채터링을 처리하지 않고 그냥 AVR에서 처리한다면 한번의 S/W 누름 행동이 프로그램상에는 여러번 눌린것처럼 나타나게 됩니다. 따라서 반드시 채터링을 처리해야 합니다.

채터링을 처리하는 방법에는 하드웨어적인 방법과 프로그램적인 방법이 있습니다.
하드웨어적인 방법으로는 104 캐페시터를 연결하는 방법이 있습니다.

제가 소개할 방법은 프로그램적인 방법입니다.
프로그램으로 처리하면 부품값(얼마안하긴 합니다만)을 절약할 수 있다는 장점이 있으나 메모리를 더 소모한다는 단점도 있습니다. (사실 둘다 미미합니다. ^^)

보통은 스위치 값을 한번 읽고, 10ms 딜레이후 다시 스위치 값을 읽어 같은지 비교하여 처리합니다.
그래서 처음에는 flag 변수를 사용하여 처리했습니다만, 서핑을 통해 더 나은 방법을 발견했습니다.
다름이 아닌 스위치가 일정한 상태로 유지된 시간을 측정하는 방식입니다.
이 방식의 장점은 스위치의 On/Off 뿐만 아니라 Hold 동작도 체크할 수 있다는것이 장점입니다.




설명이 너무길어 복잡해보이지요? 실제 코드를 보죠.
while (1)
{
    i = ((0xff - inp(PORTC)) >> 4) & 0x0f;
    switch(i)
    {
    case 1:
        outp(PORTB, 0x10);
        printf("Push Button 1 (SW1) is on.\n");
        count = 0;
        do
        {
              i = ((0xff - inp(PORTC)) >> 4) & 0x01;
              if (i != 0) count++;
              delay(1);
        } while(count < 10);
        count = 0;
        do
        {
              i = ((0xff - inp(PORTC)) >> 4) & 0x01;
              if (i == 0) count++;
              delay(1);
        } while(count < 10);
        outp(PORTB, 0x00);
        break;
}
스위치가 On 또는 Off 상태에서 변하지 않고 같은 상태를 유지하면 SWCount가 증가하고,
변하면 0으로 초기화 됩니다.
따라서 SWCount값이 일정 값(hold)에 도달했다면 그만큼 누르고 있었다는 예기 이지요.

이렇게 되면 채터링이 무시되고 안정된 스위치 값을 얻을 수 있게 됩니다.
더불어 누르고 있는 시간도 측정할 수 있고요.
  1. AVR공부하자 2012.09.27 08:26

    도움 감사합니다! 자료 퍼 가겠습니다!

tiny은 가격도 싸고 칩 단독으로 회로구성이 가능해서 꼭 한번 해보고 싶었는데
ISP를 구입하게 되서 프로그래을 해봤습니다.

간단히 LED 8개가 순차적으로 왔다 갔다 하는 예제 입니다.
tiny와 isp를 연결한 모습입니다.
tiny의 1, 2, 3, 5, 6, 10 번핀을 ISP에 각 핀에 연결합니다.
VTG가 VCC 입니다.
저는 매번 결선하기 귀찮아서 핀헤더로 연결했습니다.



led는 11 ~ 20번 즉 PA0 ~ PA7번에 저항과 같이 연결했습니다.
sw는 PB6에 풀다운저항으로 연결하였습니다.
핀헤더와 isp를 제거하고 칩과 led만 남아있는 모습입니다.
전원은 충전지 4개 4.8v를 연결했습니다.
ATTiny26L-8PI는 2.7-5.5V의 전압을 허용하므로 활용도가 높습니다. 
스위치를 누르면 led가 왔다 갔다 합니다.

bascom-avr 소스

+ Recent posts