اطلاعیه

Collapse
No announcement yet.

ماژول اولتراسونیک

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    ماژول اولتراسونیک

    سلام
    در http://www.eca.ir/forum2/index.php?topic=84522.0 دوستان یه کد برای کار با ماژول اوتراسونیک گذاشتن که بخش اصلیش هم اینه:
    کد:
    PORTC.0 = 1;
       delay_us(20);
       PORTC.0 = 0;
       
       while(PINC.1 == 0);
       
       TCNT0 = 0;
       TCCR0=0x01;
    
       while(PINC.1 == 1) {  
       };
       TCCR0=0x00;
    من هم همیشه با همین روش با اولتراسونیک ها کار می کنم .توی این کد پایه ی تریگر رو یک می کنن بعد به کمک یه حلقه ی while اینقدر ثبر می کنن تا پایه ی اکو از 1 به صفر بره و مدت زمان رو با تایمر کانتر می شمارن. بعد از روی زمان و سرعت صوت فاصله رو می گیرن.
    حالا 2 تا سوال:
    1- این تنها روش کار با این ماژوله(جور دیگه ای نمیشه باهاش کار کرد؟؟؟)
    2- این روشی که گفته شد یه ایراد بزرگ داره! فرض کنید وقفه ی میکروتون هم فعاله و در شرایط خاصی یه وقفه ی خارجی میاد که روتینش باید یه عالمه دستور کند رو انجام بده. اگه از شانس وقفه دقیقا توی این while ها رخ بده یه دفعه میکرو میره سراغ وقفه و وقتی برمیگرده دیگه اولتراسونیک موجش رو دریافت کرده و پایه هاش تغییر نمی کنن و به همین دلیل توی while بی نهایت گیر می افته!!! من این مشکل رو تویه یه ربات با سه تا لولتراسونیک دارم!!!

    #2
    پاسخ : ماژول اولتراسونیک

    نوشته اصلی توسط saate777
    سلام
    در http://www.eca.ir/forum2/index.php?topic=84522.0 دوستان یه کد برای کار با ماژول اوتراسونیک گذاشتن که بخش اصلیش هم اینه:
    کد:
    PORTC.0 = 1;
       delay_us(20);
       PORTC.0 = 0;
       
       while(PINC.1 == 0);
       
       TCNT0 = 0;
       TCCR0=0x01;
    
       while(PINC.1 == 1) {  
       };
       TCCR0=0x00;
    من هم همیشه با همین روش با اولتراسونیک ها کار می کنم .توی این کد پایه ی تریگر رو یک می کنن بعد به کمک یه حلقه ی while اینقدر ثبر می کنن تا پایه ی اکو از 1 به صفر بره و مدت زمان رو با تایمر کانتر می شمارن. بعد از روی زمان و سرعت صوت فاصله رو می گیرن.
    حالا 2 تا سوال:
    1- این تنها روش کار با این ماژوله(جور دیگه ای نمیشه باهاش کار کرد؟؟؟)
    2- این روشی که گفته شد یه ایراد بزرگ داره! فرض کنید وقفه ی میکروتون هم فعاله و در شرایط خاصی یه وقفه ی خارجی میاد که روتینش باید یه عالمه دستور کند رو انجام بده. اگه از شانس وقفه دقیقا توی این while ها رخ بده یه دفعه میکرو میره سراغ وقفه و وقتی برمیگرده دیگه اولتراسونیک موجش رو دریافت کرده و پایه هاش تغییر نمی کنن و به همین دلیل توی while بی نهایت گیر می افته!!! من این مشکل رو تویه یه ربات با سه تا لولتراسونیک دارم!!!
    سلام
    راه حل اینه که بیخودی وقت میکرو رو تلف نکنیم و پایه اکو رو به اینتراپت وصل کنیم متاسفانه روی ربات ها زیاد جوابگو نیست چون اینتراپت هاشون معمولا پر هست. یه راهی هست که از ماژول هایی که ارتباط i2c دارن استفاده کنید توشون رجیستر هایی دارن که میشه ازشون اطلاعات رو خوند و خب چون از i2c استفاده میکنن سنسور های زیادتری میشه استفاده کرد. به همین اندازه که خوبی دارن کارباهاشون سخت تر هم هست ...
    اگه سر میکروتون زیاد شلوغ نیست میتونید تمامی اینتراپت ها رو غیر فعال کنید موقع اندازه گیری و بعد از اون فعالشون کنید یا در وقفه اورفلو تایمرتون فلاگی رو ست کنید که اگر اور فلو شد و اکویی دریافت نکرد از اندازه گیری بیاد بیرون
    خلاصه راه زیاد هست ...

    head<=
    ...تشکر خدا...
    [img width=97 height=100]http://mahdi3d.persiangig.com/image/5280543_t.jpg[/img]

    دیدگاه


      #3
      پاسخ : ماژول اولتراسونیک

      نوشته اصلی توسط saate777
      سلام
      در http://www.eca.ir/forum2/index.php?topic=84522.0 دوستان یه کد برای کار با ماژول اوتراسونیک گذاشتن که بخش اصلیش هم اینه:
      کد:
      PORTC.0 = 1;
         delay_us(20);
         PORTC.0 = 0;
         
         while(PINC.1 == 0);
         
         TCNT0 = 0;
         TCCR0=0x01;
      
         while(PINC.1 == 1) {  
         };
         TCCR0=0x00;
      من هم همیشه با همین روش با اولتراسونیک ها کار می کنم .توی این کد پایه ی تریگر رو یک می کنن بعد به کمک یه حلقه ی while اینقدر ثبر می کنن تا پایه ی اکو از 1 به صفر بره و مدت زمان رو با تایمر کانتر می شمارن. بعد از روی زمان و سرعت صوت فاصله رو می گیرن.
      حالا 2 تا سوال:
      1- این تنها روش کار با این ماژوله(جور دیگه ای نمیشه باهاش کار کرد؟؟؟)
      2- این روشی که گفته شد یه ایراد بزرگ داره! فرض کنید وقفه ی میکروتون هم فعاله و در شرایط خاصی یه وقفه ی خارجی میاد که روتینش باید یه عالمه دستور کند رو انجام بده. اگه از شانس وقفه دقیقا توی این while ها رخ بده یه دفعه میکرو میره سراغ وقفه و وقتی برمیگرده دیگه اولتراسونیک موجش رو دریافت کرده و پایه هاش تغییر نمی کنن و به همین دلیل توی while بی نهایت گیر می افته!!! من این مشکل رو تویه یه ربات با سه تا لولتراسونیک دارم!!!
      اگر برای روبات میخوای یک راه دیگه هم هست
      اینکه برای او while که داره میشمره یک حد بالا بذاری, یعنی مثلا بگب اگه از 10000 بالاتر رفت از while خارج بشه و مقدارش رو در نظر نگیری یا آخرین مقدار رو در نظر بگیری. این حد بالا باید بیشتر از زمانی باشه که سنسور در بیشترین برد خودش جواب میده. اینطوری مشکل لوپ while حل میشه. (البته اگر این کار رو نکنی در صورتی که مانعی در برد سنسور نباشه بازم میری تو لوپ.
      حالا اکه با رفرش بالایی سنسور رو بخونی عملا اون دفعاتی که با اینتراپت تداخل میکنه و تعداد کمی نسبت به کل خوندن ها داره حذف میشه.

      دیدگاه


        #4
        پاسخ : ماژول اولتراسونیک

        راه خوب و بی دردسرش استفاده از اینتراپته :agree:
        اما همینطور که دوستمون گفتن ، معمولا در ربات ها همه ی اینتراپت ها درگیر هستن
        چاره ی این کار هم ساده اس
        میای خروجی سنسورهایی که میخوای به اینتراپت وصل کنی رو به عنوان ورودی میدی به میکرو ، بعد AND اونا رو میگیری و میدی به یکی از اینتراپت ها
        توی روتین اینتراپت میری تک تک پایه های سنسورها رو چک میکنی و بر اساسشون تصمیم گیری میکنی
        به همین خوشمزگی ... :icon_razz:

        موفق باشی :nice:

        دیدگاه

        لطفا صبر کنید...
        X