스위치가 열려 있는 상태에서  닫거나 닫혀있는 상태에서 열때.
즉 스위치의 상태가 변하는 순간 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

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

+ Recent posts