Page 553 - 완) I MDP 프로젝트 작품 보고서(전체과 1학년)1.6
P. 553
PORTD &= ~0x01;
}
ISR(TIMER0_OVF_vect)
{
pulse_count++; //58sec 마다 증가
}
ISR(INT0_vect)
{
if(togle == 0) //카운터 시작하고 외부인터럽트(INT0)를 다음에는 falling Edge에서 걸리도록
함.
{
pulse_count = 0; //측정된 이전 거리값 초기화
// TIMER COUNTER RESISTER
TIMSK0 = 1<<TOIE0; //Timer/Counter0 Overflow Interrupt Enable
//TCNT0 -> 256이 되면 오버플로우가 발생되게 됩니다.
TCCR0B = 1<<CS01; //분주비 8 => 8MHz->1MHz
TCNT0 = 256 - 58; /*TCNT0 한 클럭 당 시간(s = 1/f) 1/1MHz=1us 필요한 시간 58us
=>58us/1us=58
TCNT0에 숫자를 지정해주는 것은 시작하는 지점을 지정해주는 것입니다.
256 -58 = 198부터 TCNT0가 시작되어서 카운터를 하는데 결국 58번 카운터
된 후 오버플로우가 발생되게 되어서
58us를 센 후 오버플로우가 발생하는 것입니다.*/
EICRA = 1<<CS01; //외부인터럽트 INT0 falling edge에서 인터럽트 발생
togle = 1;
}
else //카운터를 정지시키고 외부 인터럽트(IN0)를 다음에는 Rising Edge에서 걸리도록 함.
{
TIMSK0 = 0x00; //All Timer Disable
togle = 0;
EICRA = (1<<CS01)|(1<<CS00); //외부인터럽트 INT0가 rising edge에서 인터럽트 발생
}
}
void main()
{
DDRD = 0x01; //Dport 0 input pulse 송신 (출력), Dport 2 output pulse 수신 (입력)
PORTD |= 0x02; //PORTD b1 pullup enable
DDRB = 0x01; //LED pin -> PB)
_delay_ms(5);
- 546 -