# برنامه نویسی میکروکنترلر (MicroController) ها و MicroProcessor ها > برنامه نویسی سیستم های Embeded > مباحث عمومی کار با سخت افزارها، سنسورها و لوازم جانبی >  برنامه مربوط به سنسور SRF05

## poya121

سلام.من دارم يك ربات مين ياب درست ميكنم،كه از سنسور SRF05 براي اون  استفاده كردم.حالا براي برنامه نويسي اين سنسور گير كردم!در ضمن ميخوام  برنامه به زبان سي باشه!كسي ميتونه توبرنامه نويسيش بهم كمك كنه؟اگه نمونه  كد هم داريد برام خواهشن بفرستيد.فقط دوستان من خيلي خيلي عجله دارم!!خواهش  ميكنم يكي زود جوابمو بده!!ممنون.

----------


## Abbas Amiri

دوست عزیز اگر یکی از تایمرهای 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         
    }
}

----------


## poya121

ممنون دوست عزيز.فقط يك سوال ديگه هم دارم؟
ميكرو من ATmega128 است،اين دستورات روش جواب ميده؟

----------


## Abbas Amiri

> ميكرو من ATmega128 است،اين دستورات روش جواب ميده؟


باتوجه به راهنمای ماژول SRF05 به احتمال خیلی زیاد مشکلی نخواهدداشت . فقط بایستی اینتراپت  ICP تایمر موردنظر فعال شده باشد . همچنین ارسال پالس تحریک ماژول میتواند در یکی ازوقفه های  تایمرها در فواصل زمانی  باتوجه به اقتضای پروژه بایستی انجام شود (با عرض حداقل 10میکروثانیه )

----------


## poya121

ممنونم از راهنماييتون.

----------


## h.torabi

سلام داداش دمت گرم من از روش capture استفاده نکردم میشه یه اموزش معرفی کنی برای کار باهاش ؟؟؟؟؟
من  ازتایمر 1 برای اندازه گیری زمان سطح 1 پالس استفاده کردم 
ولی هرکاری میکنم یک عدد ثابت بمن نشون میدهد
ااز وقفه خارجی 1 در atmega32l استفاده کردم 
به این صورت که با دیدن لبه بالا رونده تایمر 1 از اول شروع به کار کنه وبا دیدن لبه پایین رونده مقدار تایمر1 بخوانه وبعد اون 0کنه ولی اصلا جواب نداد
باید چیکار کنم.........................

----------


## Abbas Amiri

> سلام داداش دمت گرم من از روش capture استفاده نکردم میشه یه اموزش معرفی کنی برای کار باهاش ؟؟؟؟؟
> من  ازتایمر 1 برای اندازه گیری زمان سطح 1 پالس استفاده کردم 
> ولی هرکاری میکنم یک عدد ثابت بمن نشون میدهد
> ااز وقفه خارجی 1 در atmega32l استفاده کردم 
> به این صورت که با دیدن لبه بالا رونده تایمر 1 از اول شروع به کار کنه وبا دیدن لبه پایین رونده مقدار تایمر1 بخوانه وبعد اون 0کنه ولی اصلا جواب نداد
> باید چیکار کنم.........................


ممکنه دوره کاری تایمر خیلی کوتاه باشد . از تقسیم فرکانس  بزرگتر و تایمر 16 بیتی  استفاده کنید

----------

