ايران ويج

نسخه‌ی کامل: (سؤال)راه اندازی سنسور SRF05 با AVR
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
صفحه‌ها: 1 2
سلام
من ميخوام با استفاده از سنسورSRF05 فاصله سنجی کنم ولی چيزه زيادی از اين سنسور بلد نيستم

من اين زير دتاشيت و يه سورس کد که تو اينترنت گير آوردم رو گذشتم اگه کسی فهميد که چجوری اينو مثلاً با مگا 16 استفاده کنم لطف کنه يه توضيحی بده البته روی کد C
--------------------------
من ميدونم که اول بايد يه پالس بفرستم بد پالس اکو رو بگيرم
و بد با استفاده از زمانه اکو و سرعت صوت بگم فاصله چقده
ولی نميدونم اين کارو چه جوری با کد سی انجام بدم
----------------------------
----------------------------
ملاحظات:
من خيلی خنگم لطف کنيد کامل توضيح بديد

کد php:
#define ENABLE_INT #asm("sei")

#define TRUE 1
#define FALSE 0
#define PORTBDDR 0d11111110
#define TRIGGER PORTD.1
#define ECHO PIND.0
#define LIMITLESS 25000
#define WAIT_FOR_ECHO 1
#define ECHO_MEASURE 2

// Timer 0 output compare interrupt service routine


int mS10 0;
int mS 0;
int sec 0;

int echomeasure FALSE;
int echotimer;
int distance LIMITLESS/58//divide by 58 to get the distance in cm

//-----
interrupt [TIM0_COMPvoid timer0_comp_isr(void)
{
 
 if (
echomeasure == WAIT_FOR_ECHO)
 { 
 if (ECHO == 
1)
 {
 
echotimer 0;
 
echomeasure ECHO_MEASURE;
 } 
 } 
 
 if (
echomeasure == ECHO_MEASURE)
 {
 if (ECHO == 
0)
 {
 
distance = (echotimer*100)/58//How to get the time i uS and then in cm??
 
echomeasure FALSE
 }
 else
 
echotimer++;
 }
 
 
 
 if (++
mS10 == 10)
 {
 
mS10 0;
 
 if ((
mS 50) == 0// How many times measureing are starting per sec.?
 
{
 
TRIGGER 1
 
echotimer 0;
 
echomeasure WAIT_FOR_ECHO
 
delay_us(10);
 
TRIGGER 0
 } 

 
 if (++
mS == 1000)
 {
 
mS 0;
 
sec++;
 }
 }
 


لينکی هم که اين زير گذشتم باز اطّلاعاتی بيشتر همراه با سورس کد سی گذشته
ولی گويا واسه PIC زده کد رو


http://www.glacialwanderer.com/robots/sensors/srf05
دوستان و خرد ورزان عزيز بازم يه سرچ کردم و يه مثال گير اوردم که
اين کار رو باSRF04 کرده بود و با توجه به اينکه SRF04بهSRF05 دقيقاً در مد 1 يکسان عمل ميکنن يکی بياد راهنمايی بده که چجوری کدشو واسه مگا 16 و LCD بزنم

من الان ميدونم که مسئله حال شدس ولی ميخوام يه نابغه بياد راهنمايی بده
يه وقت نزنم بسوزنمش آخه کلّی پول رفته پاش
پایه ارسال امواج رو به یکی از خروجی های میکرو وصل می کنی. مثلا A0
این کد 30 میکرو ثانیه پایه رو 1 میکنه. برای اینکه امواج ارسال بشه.
کد:
PORTA.0 = 1;
delay_us(30);
PORTA.0 = 0;

بعد از ارسال امواج باید تایمر میکرو فعال کنی. تایمر 1 که 16 بیتی هست بهتره. بیشتر می شمره ...
کد:
TCCR1B = 0x01;
do{
}while (PINA.1);
پایه دریافت امواج به A1 وصل شده. اگه موج دریافت بشه A1 صفر میشه و از حلقه بیرون میاد.
بعد از دریافت باید تایمر رو غیرفعال کنی و مقدارش رو بخونی...
کد:
TCCR1A = 0x00;
itoa(TCNT1,str);
lcd_puts(str);

خودم تا جالا نبستم! بعد از خوندن تایمر باید زمان رو محاسبه کنی و ضربدر سرعت صوت و ... از این کارا کنی تا فاصله بدست بیاد.
یه سری ریزه کاری های دیگه هم داره. تنظیم وقفه سر ریز تایمر (که ّاگه موج دریافت نشد...)...
فعلا ببند ببین چی میشه...
من الان بايد از چه فرکانسی استفاده کنم که اين 30 ميکرو درست در بياد؟
کريستال خارجی بايد بزارم؟
شما ميگی موج دريافت بشه پايه صفر ميشه ولی تو ديتا شيت نوشته يک؟
نقل قول: من الان بايد از چه فرکانسی استفاده کنم که اين 30 ميکرو درست در بياد؟
کريستال خارجی بايد بزارم؟
باید کریستال میکرو درست معرفی کنی. برای avr اگه از کریستال خارجی استفاده نکردی و کریستال داخلی هم تغییر ندادی 1 مگ معرفی کن.
نقل قول: شما ميگی موج دريافت بشه پايه صفر ميشه ولی تو ديتا شيت نوشته يک؟
خب بستگی به ماژول داره. هرچی تو دیتا شیت نوشته درسته.
من يه مسئله اي رو درک نميکنم وقتی من از 1 مگ استفاده کنم خود ميکرو ميفهمه که چه جوری اون 10us رو درست کنه
چون بايد اون 10us که ميکرو داره توليد ميکنه با واقعيت بخونه ديگه ,نه؟

اگه خوده ميکرو ميفهمه پس اصلاً من هيچ فرکانسی تعريف نکنم بهتره ديگه
همون 1 مگ بمونه نه؟
واسه همین فرکانس رو به کامپایلر تعیین می کنیم !

کامپایلر با توجه به زمان پالس میکرو وتاخیر تو برنامه حلقه ای می سازه که زمان انجامش اونقدر طول می کشه و پالس دریافت می کنه تا با زمان تو برنامه یکی بشه !

نمی دونم مفهوم رو گفتم یا نه !

تو میکروپروسسور ها چجوری تاخیر درست می کردین !
حالا خود کامپایلر همون کارها رو می کنه !!!

اگه شما فرکانس رو دو برابر معلوم به کامپایلر تعیین کرده باشین مدت زمان انجام تاخیرها نصف میشه !!

و میکرو اگه فیوزبیتش رو عوض نکرده باشین فابریکی رو یک مگ داخلی هستش !!!
اگه از کدویزارد استفاده نمی کنی حتما باید از Porject - configure قسمت c compiler مقدار clock رو تنظیم کنی. چون مثل بیسکام، تو کد برنامه معرفی نمیشه، خیلی ها به این موضوع دقت نمی کنن.
کامپایلر باید بفهمه چه حلقه ای برای ایجاد تاخیر بسازه. میکرو که چیزی حالیش نیست!!Biggrin
گرفتم!!!!

آقا يکی بياد يه حالی بده اين کدی که واسهSRF04 تو PDF -srf04andlcd گذاشتم که ماله مگا 128 هست رو اديت کنه يه LCDبزنه تنگش و ماله مگا 16 بکنه يه راهنمايی هم بده ما چه جوری اينو ران کنيم کد تو صفحه 7 از ebook دوم(ُSRF04andLCD) هست

راستی SRF05همون SRF04هستش البته تو مد 1


خير از جوونيد ببينی جوون همه چی حاضره هاا ولی اين کد رو من ميترسم خودم تغيير بدم اشتباه کار کنم اينSRF 05 نازنين بسوزه داغش رو دلم بمونه


با تشکر خیلی فراوان
نگران نباش. شزط می بندم نمی تونی با کدنویسی بسوزونیش! Biggrin من تضمین می کنم!
اول با یک پالس با پهنای 20 میکرو ثانیه پایه تریگر را فعال کن بعد منتظر باش تا پایه اکو یک بشه تایمر 16 بیتی را روشن کن منتظر باش تا پایه اکو صفر بشه اگه زمان بالاتر 30 میلی ثانیه مانع نیست اگه کمتر 24 میلی ثانیه زمان را بر 2 تقسیم کن ضرب کن در 330 m/s مثل 5میلی ثانیه * 330 برابر 0.165m
صفحه‌ها: 1 2