اطلاعیه

Collapse
No announcement yet.

مشکل با وقفه خارجی Atmega32-Bascom

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

    مشکل با وقفه خارجی Atmega32-Bascom

    سلام
    یک مدار میکرو دارم (روی Bread Board) ,پنج تا میکرو سوییچ به عنوان حسگر موقعیت حرکت یک قطعه مکانیکی (جک پنومات) روی یک مسیر مستقیم کار گذاشتم , دو تای ابتدا وانتهای حرکت وقفه خارجی (Change) و 3 تای دیگه با Debounce
    2 تا کلید یکی برای عمل کردن جک (Expand) و دیگری برای جمع شدن جک (Retract) هم هست که اونا هم Debounce هستند.
    timer 1 هم فعال هست. با خوردن هر سوئیچ زیر روال مربوطه عمل می کنه و نهایتا زمان خوردن هر سوییچ در LCD نمایش داده میشه.
    مشکل اینجاست که از وقتی وقفه های خارجی در برنامه تعریف شده مشکلاتی پیش اومده.
    1-در ابتدای روشن کردن میکرو برنامه به زیر روال مربوط به وقفه0 میره.
    2-مجبور شدم یک متغیر (flag) تعریف کنم که وقتی کلید استارت زده میشه ,1 میشه. در زیر روال وقفه هم اول گفتم اگر متغیر شرط برابر 0 هست, دیگه ادامه نده و Return
    3-وحالا اتفاق جالب بعدی اینه که در حالیکه شرط بر قرار نشده , زدن سوییچ هایی که عامل وقفه هستند باعث به هم ریختگی در اجرا می شه. برنامه به ابتدا میره.
    :angry:

    لطفا راهنمایی بفرمایید. :cry2:


    اینم برنامه:
    http://www.4shared.com/file/xQ6kiN6N/VelocityProbe_debaunce.html

    #2
    پاسخ : مشکل با وقفه خارجی Atmega32-Bascom

    با سلام
    آقا من یه پیشنهاد میکنم :
    1. پایه های int0 و int1 رو اگر پول دان نکردین ، پول دان کنید .
    2. اون فلگی هم که تعریف کردید و بردارید و برنامه تون رو به حالت اول برگردونید .
    3.مقادیر زیر رو تغییر بدید شاید مشکل به خاطر اینه که خط کنترل بعد از رفتن به زیر برنامه ها به خاطر کم بودن حافظه استک مسیر برگشت رو گم میکنند.

    $hwstack = 64
    $swstack = 64
    $framesize = 64

    اگر براتون مقدوره برنامه تون رو کامل بزارید !

    دیدگاه


      #3
      پاسخ : مشکل با وقفه خارجی Atmega32-Bascom

      نوشته اصلی توسط mojtaba_led
      1. پایه های int0 و int1 رو اگر پول دان نکردین ، پول دان کنید .
      2. اون فلگی هم که تعریف کردید و بردارید و برنامه تون رو به حالت اول برگردونید .
      3.مقادیر زیر رو تغییر بدید شاید مشکل به خاطر اینه که خط کنترل بعد از رفتن به زیر برنامه ها به خاطر کم بودن حافظه استک مسیر برگشت رو گم میکنند.

      $hwstack = 64
      $swstack = 64
      $framesize = 64

      اگر براتون مقدوره برنامه تون رو کامل بزارید !

      سلام.
      کارایی که گفتین کردم ولی حل نشد.
      چیز دیگه ای به ذهنتون نمیرسه؟
      البته یه دوستی می گفتن Change این مشکل رو داره که البته برای من به راحتی پذیرفتنی نیست.

      دیدگاه


        #4
        پاسخ : مشکل با وقفه خارجی Atmega32-Bascom

        این برنامه رو برای آزمایش نوشتم:


        Cls
        Lcd "wait"
        Wait 2
        Cls
        '------------------------------
        Config Int1 = Falling
        Config Int0 = Falling
        '------------------------------
        On Int1 Int_1
        On Int0 Int_0

        Portd.2 = 1
        Portd.3 = 1

        Enable Interrupts

        Enable Int0
        Enable Int1

        Do
        Loop

        End

        Int_0:
        Locate 1 , 1
        Lcd "Int0"
        Set Portc.0
        Wait 2
        Reset Portc.0
        Cls
        Return

        Int_1:
        Locate 1 , 1
        Lcd "Int1"
        Set Portc.1
        Wait 1
        Reset Portc.1
        Cls
        Return



        خیلی برام جالبه که وقتی وقفه ها Rising یا Change هستن , اغلب اوقات موقع روشن شدن میکرو خود به خود عمل می کنن , اما Falling نه. oo:
        راستی هم پول پ وهم دان رو امتحان کردم.

        حالا اگر به قول دوست بنده راه حل نداشته باشه , اونوقت چه کارای دیگه ای میشه کرد که مشابه Change عمل کنه؟
        1-میکرو سوییچی که دو تا کنتاکت , یکی NO و یکی NC داره رو هر کدوم جداگانه به یک وقفه (پایه میکرو) متصل کرد و هر دو رو Falling تعریف کرد و یک زیر روال مشترک براشون نوشت. اونوقت Change شبیه سازی میشه ولی هر دو پایه اشغال می شه. :sad:
        2-شاید IC که وقتی ورودیش تغییر کنه یه پالس بفرسته باشه؟ (نخند ) اونوقت میکروسوییچ رو به IC و IC رو به یک پایه میکرو وصل می شه کرد
        3-شما چی فکر می کنین؟

        دیدگاه


          #5
          پاسخ : مشکل با وقفه خارجی Atmega32-Bascom

          اینکه میگید change , rising مشکل داره می تونه بخاطر نویز باشه
          اینتراپتهای خارجی میکرو جزو نویز پذیر ترین قسمتهای اون محسوب میشه
          برای رفع این مشکل پیشنهاد میکنم پایه های اینتراپت رو با خازن 100nf و یک مقاومت 10کیلو (پول دان ) زمین کنید
          البته موارد بسیار زیاد دیگه ای هم هست که در پست زیر به طور کامل بهشون اشاره شده
          http://www.eca.ir/forum2/index.php?topic=18456.30

          دیدگاه


            #6
            پاسخ : مشکل با وقفه خارجی Atmega32-Bascom

            سلام آقا احسان_ب
            من هم همین مشکل را داشتم !!
            و جوابش را پیدا کردم
            اول از همه بگم که مشکل خیلی به نویز و این چیزها مربوط نیست
            ببین اگر وقفه را در حالت Low Level یا Falling اجرا کنی باید یک مقاومت بالا کش داشته باشی.
            حالا توی همین مد کاری اگه مقاومت را پایین کش بکنی و یک پالس کامل به میکرو بدی طبق منطق باید جواب بده ولی نمیده !! حالا اگه وقفه را در حالت change یا rising اجرا کنی باید مقاومت پایین کش داشته باشی !!
            ولی باز هم می بینی که جواب نمیده؟؟ چراییش بخاطر اون مقاومت است .
            توی وقفه های خارجی اگه از حالت change یا rising استفاده می کنی حتما" و حتما" باید مقاومت بالاکش داشته باشی و در عوض بجای یک لبه باید یک پالس کامل بدی.
            این مشکل در حالت Low Level یا Falling وجود نداره چون بطور طبیعی باید مقاومت بالاکش بگذاری.
            نتیجه:
            برای وقفه های خارجی در هر حالتی فقط مقاومت بالاکش استفاده کنید و در صورت لزوم نوع سیگنال را عوض کنید
            حاصلظرب توان در ادعا مقداری ثابت است.هرچه توان انسان کمتر باشد ادعای او بیشتر است و هرچه توان انسان بیشتر شود ادعایش کمتر میگردد.(دکتر حسابی)

            دیدگاه

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