دوست عزیز اگر یکی از تایمرهای 16بیتی میکرو آزاد باشد، با استفاده از Input Capture میکرو میتوانید براحتی اینکاررا انجام دهید کافیست تنظیمات آن را انجام داده و کدهای زیر را به برنامه اضافه کنید . دراین مثال از تایمر1 استفاده شده است. البته خروجی ماژول مربوطه باید به پایه IC1 میکرو وصل شود.
int measure; //SRF05 Result in cm
//*********************************
// Speed of sound in 20 degree =34000 cm/s
// (1/34000) * 1000000 = 29.4
// if Timer1_Period =2 us , scale_factor= 29.4 * 2 = 59
flash int scale_factor = 59 ; // scale_factor = 29.4 * Timer1_Period(uSecond)
//*********************************
interrupt [TIM1_CAPT] void timer1_capt_isr(void)
{ int t_meas;
if (TCCR1B & 0x40) { //if Start Edge
TCCR1B &= ~(0x40); //Change trigger edge
TCNT1 = 0; //Initialize Timer1
}
else { //if End Edge
TCCR1B |= 0x40; //Change trigger edge
t_meas = (ICR1H << 8) | ICR1L ;
measure = (int)(t_meas / scale_factor); //Calculate distance
}
}