동작.

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
Debounce 풀이중...  (0) 2010.02.11
VS Rotate  (0) 2010.02.11
A2D  (0) 2010.02.11
Rotate  (0) 2010.02.11
Blink  (0) 2010.02.11
Posted by 도전하는 공돌이pooh

댓글을 달아 주세요