동작.

RB0의 스위치를 한번 눌렀다 뗄 때 마다 RD0 ~ RD7의 값이 1씩 증가한다(2진수 0~255까지 표현)

#include <16F887.h>         

#USE DELAY(clock=400000000)
               
#FUSES INTRC,NOWDT,NOPUT,NOMCLR,NOPROTECT,NOCPD,NOBROWNOUT,NOIESO,NOFCMEN,NOLVP

#byte portb=0x06
#byte portd=0x08  //스페셜 레지스터의 portd가 0x08번지입니다.

void main()
{
   int a;
   a=0;
   
   setup_adc_ports(no_analogs);
   setup_adc(adc_off);
   
   set_tris_b(0xff); //portb all input
   set_tris_d(0x00); //portd를 모두 출력으로 선택

   portd=0;
   
   for(;;){
      if(bit_test(portb,0)==0){
         a++;
      }
      portd=a;
      delay_us(1000);
   }
}

문제점. RB0의 스위치를 계속 누르고 있으면 for문이 계속 돌아간다. 마이크로 세컨드 딜레이 주기 전까지 검출 못했음....

bit_test말고 다른 방법을 쓰거나하는 방법으로 동작을 바꿔야겠습니다.



추가>>>>

추정하건데, debounce가 전자회로에서 발생할 수 있는 노이즈를 제거한다는 것 같습니다.

디지탈은 0,1 두가지 상태만 있습니다. ex)신호 있음, 신호 없음

그러나, 아날로그는 그 상태가 무한하게 있죠.

예를 들어 회로의 스위치가 눌리는 순간 전기신호가  ripple이 발생할 수 있는데 그것을 잡아주는 회로를

debounce circuit이라고 이해했습니다.



어찌 되었건 위 회로의 어셈블리 코드를 보면

LastStableState     ; keep track of switch state (open-1; closed-0)

가 나오는데, 이게 ripple을 제거해주는 코드 같네요. 정보가 잘 안나와서 찾는 중..

ccs-c에선 저걸 구현하는 방법이 혹시 없는지도 찾고 있습니다.





추가2>> CCS-C 채터링 방지 테크닉 http://blog.naver.com/rollcake99/70013638885 요술고양이님 블로그. 감사합니다.

'(취미)전자회로 공부 > PIC-44Pindemoboard' 카테고리의 다른 글

Reversible 풀이중2  (0) 2010.03.01
SETUP_ADC_PORTS()  (0) 2010.03.01
Reversible 풀이중  (0) 2010.02.24
Debounce 풀이  (0) 2010.02.24
VS Rotate  (0) 2010.02.11
A2D  (0) 2010.02.11
Rotate  (0) 2010.02.11
Blink  (0) 2010.02.11
Posted by 공돌이pooh

댓글을 달아 주세요