BASIC4MCU | 질문게시판 | 안녕하세요 atmega128 chattering에 대해서 궁금한게있습니다.
페이지 정보
작성자 tony 작성일2022-06-01 19:22 조회1,614회 댓글4건본문
sw= PINE & 0x30;
switch(sw) {
case 0x10:
delay_ms(50);
...
while(1)
case 0x20:
delay_ms(50);
....
while(1)
case 0x00:
스위치 동시에 누를 때 즉 case 0x00인 부분이
다른 버튼이 먼저눌러져서
작동이 잘 안되는데 혹시 어떻게 하는지
예 하나만 보여주실수 있나요?
댓글 4
조회수 1,614master님의 댓글
master 작성일제대로된 코드를 첨부하세요
tony님의 댓글
tony
while(1) {
sw= PINE & 0x30;
switch(sw) {
case 0x10:
delay_ms(50);
while((~PINE)&0x30); delay_ms(50); //sw2 on
PORTD.0=1; PORTD.0=0;//falling
break;
case 0x20:
delay_ms(50); //sw1 on
PORTA=0x00;
TCCR1A=0;
TCCR1B=5; // TIMER1 clock is /1024
TCNT1=55536;
TIFR=0; // clear TIMER1 interrupts flags
TIMSK=0x04; // enable TIMER1 overflow interrupt
SREG = 0x80;
PORTC=0x00;
while(PINE&0x30);
break;
case 0x00:
PORTG=0x08; PORTC = 0x71; delay_ms(2);
PORTG=0x04; PORTC = 0x09; delay_ms(2);
PORTG=0x02; PORTC = 0x73; delay_ms(2);
PORTG=0x01; PORTC = 0x77; delay_ms(2);
PORTA= 0x00;
break;
default :
PORTC= 0x00;
PORTA=0xFF;
}
위와같습니다.!!
master님의 댓글
master 작성일
동시에 누를 때
어느 한 스위치를 먼저 누르는 것은 당연한 것인데
두 스위치의 시간 차를 얼마나 둘 것인지를 정해야 합니다.
예를들어서 최대 0.5초 이내로 누른다고 하면
어느 스위치를 입력받았을 때 0.5초를 기다린 후에 다른 스위치를 누르는지 안누르는지를 체크합니다.
다른 스위치를 누르면 동시에 두개의 스위치를 누른 것이고, 아니라면 해당 스위치만 누른 것이 됩니다.
이 시간이 길면 처리가 느려서 답답하게 됩니다.
master님의 댓글
master 작성일
char mode=0;
while(1){
if((PINE&0x10)==0){ //sw1 on
delay_ms(200);
if((PINE&0x20)==0)mode=3; // 0.2초 이내에 sw2를 누르면 동시에 누른 것 임
else mode=1;
}
//------------
if((PINE&0x20)==0){ //sw2 on
delay_ms(200);
if((PINE&0x10)==0)mode=3; // 0.2초 이내에 sw1를 누르면 동시에 누른 것 임
else mode=2;
}
//------------
if(mode==1){
PORTA=0x00; PORTC=0x00;
TCCR1A=0; TCCR1B=5; TCNT1=55536; TIFR=0xFF; TIMSK=0x04; SREG=0x80;
}
//------------
if(mode==2){
PORTD.0=1; PORTD.0=0; //falling
}
//------------
if(mode==3){
PORTG=0x08; PORTC=0x71; delay_ms(2);
PORTG=0x04; PORTC=0x09; delay_ms(2);
PORTG=0x02; PORTC=0x73; delay_ms(2);
PORTG=0x01; PORTC=0x77; delay_ms(2); PORTA=0x00;
}
//------------
if(mode){ // 스위치를 눌렀다면
while((PINE&0x30)!=0x30); // 스위치에서 손을 뗄 때까지 대기
delay_ms(50); // 뗄 때의 채터링 방지용 딜레이
}
}