안녕하세요 . ATmega8의 인터럽트와 counter를 이용하여 펄스가 들어왔을 때를 시작으로 또 한번 펄스가 들어오면 끝나는 시간을 재려고합니다.
제가 프로그래밍을 처음해보는데 .. 저렇게 하면 인터럽트는 사용가능한 상태가 되는건가요?
도움 좀 부탁드립니다
void main(void)
{
DDRB=0xf3;
DDRD=0xfe;
DDRC =0xc0;
PORTB =0;
MCUCR = 0x0f;
GIFR = 0xc0;
Serial_init();
_SEI();
while(first_flag);
while(com_end_flag);
while(1)
{
if(PORTD & 0x04)
{
cbi(PORTD,3);
}
else if(PORTD & 0x08)
{
cbi(PORTD,2);
}
}
}
올려 주신 코드는 폴링 방식으로 펄스를 체크하는 방식입니다.
이런 방식은 정확한 시간을 측정하기 어렵습니다.
INT0, INT1 을 사용하신거 같은데 상승 에지를 디텍트 하려면
기본 레지스터를 설정하고
MCUCR = 0x0F; // INT0, INT1 상승에지 사용
GICR = 0xC0 ; // INT0, INT1 인터럽트 사용
_SEI(); // 전체 인터럽트 인에이블
while(1) {} // 무한 루프
인터럽트 루틴을 따로 처리하면 됩니다.
int starttime=0;
int endtime=0;
// INT0 걸리면
ISR(INT0_vect)
{
// INT0 처리
starttime = TCNT0;
}
// INT1 걸리면
ISR(INT1_vect)
{
// INT1 처리
endtime = TCNT0;
}
시간 차 구하기
시간차 = (endtime - starttime)/ 스케일값 ; 입니다.
(이 값은 클럭 속도와 DIV 값에 따라 달라지므로 스케일값을 구해서 계산하시면 됩니다.)