====== AN31009 - 레더 타이머를 이용한 키입력 채터링 제거 ====== 큐블록 베이직 언어 프로그래밍시 키입력 체터링 제거를 위한 keyin 명령어가 있습니다. Const Device = CB280 Do If Keyin(24,1000) = 0 Then High 16 Else Low 16 Endif Loop 이런식으로 사용하며, 24번 포트가 1초동안 입력이 안정되었을때, 비로소 입력을 받아들이는 구조입니다. 실제로 keyin 은 아래와 같이 번역됩니다. Function Keyin(__pt As Byte, __dl As Integer) As Byte Dim __dl1 As Integer For __dl1 = 0 To __dl If In(__pt) = 1 Then Keyin = 1 Exit Function End If Next Keyin = 0 End Function 즉 for..next 문을 돌면서 입력이 안정될 때 까지 기다리는 것입니다. 이 방법은 프로그램의 흐름을 방해합니다. 키 하나를 입력받기 위해서 한곳에 오래 머물러야 한다는 단점이 있습니다. 한 10개의 키를 입력받는 상황이라고 생각해보세요. 그러면 각각 1초씩 10초가 걸립니다. 도저히 쓸 수가 없는 상황이 되고 맙니다. 채터링을 하드웨어적으로 제거하려면 각각의 키마다 콘덴서와 저항을 붙어주어야 합니다. 이 방법은 회로가 복잡해지고, 추가비용이 들어가기 때문에 별로 권하고 싶지 않습니다. 그럼 하드웨어적으로 저항/콘덴서를 붙이지 않고, 흐름도 방해하지 않으면서 채터링을 제거할 수는 없을까요? ===== 레더로직과의 협동 ===== 레더로직의 타이머기능을 이용하면 됩니다. 레더로직의 on타이머는 입력이 일정시간 유지되었을때만 출력이 붙는 기능인데, 채터링제거용으로 많이 사용합니다. 다음과 같이 프로그래밍하세요. Const Device = CB280 Usepin 24,In Set Ladder On Do If _M(0) = 1 Then High 16 Else Low 16 Endif Loop {{ :cublocapp:an31009:tonladder1.png?nolink |}} 베이직에서는 M0 만 검사하기 때문에, 흐름을 방해하지 않습니다. 레더에서 P24 입력이 1초동안 유지 되었을때 T0 를 ON 해줍니다. 그걸 M0로 옮겨주기만 하는 것입니다. 눈으로 효과를 확인하기위해서 1초간 채터링을 제거하는걸로 했지만, 실제로는 100밀리초 정도이면 충분합니다. 그러면 TON 명령어 부분을 TON T0,10 으로 사용하시면 됩니다. 다음은 위 프로그램을 실행한 동영상입니다. 키를 여러번 짧게 누르는 것은 일부러 채터링을 재현해 본 것입니다. 이렇게 짧게 누르는 것은 입력으로 인식되지 않습니다. 길게 1초이상 누르고 있어야 비로소 입력으로 인식됩니다.
[[cublocapp:index|한단계 뒤로가기]]