동작.
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 |

