اطلاعیه

Collapse
No announcement yet.

مشکل با وقفه خارجی(INT 0)میکرو

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

    مشکل با وقفه خارجی(INT 0)میکرو

    سلام
    دوستان یه مدار دارم که میخام وقتی برق قطع میشه میکرو یه چند تا دستور رو انجام بده و بعد به حالت POWER DOWN بره .وقتی برق هم وصل شد توسطINT 0 میکرو فعال بشه و روند عادی برنامه رو طی کنه .OK؟؟؟

    شرح مدار و برنامه ::
    روی پایه INT 0 همیشه 5 ولت هست مگر اینکه برق قطع بشه .وقتی این پایه صفر میشه توسط این دستور یه سری کارها رو انجام میدیده::

    Debounce Pind.2 , 0 , Off


    OFF:
    A
    A
    A
    POWER DOWN

    من از وقفه INT 0استفاده کردم و به لبه بالا رونده Rising حساسش کردم .میخام وقتی که برق وصل شد به یه برچسب پرش کنه و چند تا دستور رو انجام بده .الان مشکلی که دارم اینکه چون دائما 5 ولت رو پایه INT 0هست ،،مدام دستور مربوطه اجرا میشه

    برنامه اینه::

    Enable Interrupts
    Enable Int0
    Config Int0 = Rising
    On Int0 On

    Debounce Pind.2 , 0 , Off


    OFF:
    A
    A
    POWER DOWN


    ON:

    A
    A
    Return

    مشکل اینه وقتی برق وصل هست دستورات ON اجرا میشه چون 5 ولت دائما رو این پایه هست.دوستان چه راه حلی رو برای حل این مشکل پیشنهاد میکنند؟؟
    یا به اندازه آرزوهایت تلاش میکنی یا به اندازه تلاشت ارزو میکنی

    #2
    پاسخ : مشکل با وقفه خارجی(INT 0)میکرو

    سلام
    اگه ولتاژ پایه اینتراپت همیشه 5 ولت باشه نباید دستورات اجرا شه!!
    احتمالا یه نویزی داره رو مدار اثر میزاره
    شما به پایه INT0 یک مقاومت PullUp وصل کن ببین باز هم دستورات on اجرا میشه؟؟
    در ضمن برای قسمت OFF هم میتونی از یه وقفه دیگه به صورت پایین رونده استفاده کنی
    موفق باشی

    دیدگاه


      #3
      پاسخ : مشکل با وقفه خارجی(INT 0)میکرو

      نوشته اصلی توسط M3R
      سلام
      اگه ولتاژ پایه اینتراپت همیشه 5 ولت باشه نباید دستورات اجرا شه!!
      احتمالا یه نویزی داره رو مدار اثر میزاره
      شما به پایه INT0 یک مقاومت PullUp وصل کن ببین باز هم دستورات on اجرا میشه؟؟
      در ضمن برای قسمت OFF هم میتونی از یه وقفه دیگه به صورت پایین رونده استفاده کنی
      موفق باشی
      نه ببیند ،همیشه 5 ولت رو پایه INT0 هست تا زمانی که برق قطع بشه ..وقتی که برق قطع بشه به برچسب OFFپرش میکنه و یه سری دستورات انجام میده و POWERDOWN میره.

      حالا وقتی که برق وصل شد پایه INT 0 ،یک میشه و این پایه همیشه 1 خواهد بود تا مجداد برق قطع بشه .وقتی که پایه 1 شد به پرچسب ON میره و بعد از اون باید به سراغ مابقی برنامه ..
      تا اینجا OK :NO: :NO:

      من فکر میکنم ایراد کار اینجاس که روی این پایه چون مدام 5 ولت هست و این باعث میشه هی وقفه ایجاد بشه .حکم این رو داره که به این پایه داره یه پالس اعمال میشه این مسله باعث میشه که دستورات ON مدام اجرا بشه
      یا به اندازه آرزوهایت تلاش میکنی یا به اندازه تلاشت ارزو میکنی

      دیدگاه


        #4
        پاسخ : مشکل با وقفه خارجی(INT 0)میکرو

        نوشته اصلی توسط اقای دکتر
        نه ببیند ،همیشه 5 ولت رو پایه INT0 هست تا زمانی که برق قطع بشه ..وقتی که برق قطع بشه به برچسب OFFپرش میکنه و یه سری دستورات انجام میده و POWERDOWN میره.

        حالا وقتی که برق وصل شد پایه INT 0 ،یک میشه و این پایه همیشه 1 خواهد بود تا مجداد برق قطع بشه .وقتی که پایه 1 شد به پرچسب ON میره و بعد از اون باید به سراغ مابقی برنامه ..
        تا اینجا OK :NO: :NO:

        من فکر میکنم ایراد کار اینجاس که روی این پایه چون مدام 5 ولت هست و این باعث میشه هی وقفه ایجاد بشه .حکم این رو داره که به این پایه داره یه پالس اعمال میشه این مسله باعث میشه که دستورات ON مدام اجرا بشه
        ببینید دوست عزیز
        وقتی شما نوشتی به لبه بالا رونده حساس باشه یعنی اینکه یه پالس بیاد روی پایه int0 که سطح ولتاژ از 0 به 1 تغییر کنه.
        حالا شما یه کاری کن:
        با یه مقاومت 10 کیلو پایه int0 رو pullup کن ببین باز هم این مشکل هست؟؟

        دیدگاه


          #5
          پاسخ : مشکل با وقفه خارجی(INT 0)میکرو

          وقفه رو در مد any change پیکر بندی کنید (ریجیستر ها رو به صورت زیر مقدار دهی کنید)
          GICR|=0x40
          MCUCR=0x01
          GIFR=0x40
          در روتین وقفه وضعیت پین وقفه رو چک کنید و طبق اون عمل کنید
          در ضمن یه مقاومت 1 کیلو به عنوان pull - down هم قرار بدید

          دیدگاه


            #6
            پاسخ : مشکل با وقفه خارجی(INT 0)میکرو

            سلام دکتر جان
            اولا با یک وقفه نمیشه دو کار رو انجام داد . چون یک وقفه یا حساس به لبه پایین رونده هست یا بالا رونده . مگر اینکه در حین اجرای برنامه اون رو تغییر بدید . یا همون چیزی که علی جان گفت .این از این .
            شما میگید وقتی برق قطع میشه پایه INT0 میکرو هم صفر میشه در حالی که قبلش یک هست . خوب این یعنی گذر 1 به صفر . یعنی لبه پایین رونده . پس شما باید وقفه رو حساس به لبه پایین رونده برای انجام این کار بذارید .
            حالا وقتی دوباره برق وصل میشه اگه بازهم شما از INT0 میکرو استفاده کردید این مشکل پیش میاد که مدار واکنشی نشون نمیده . چرا چون حساس به لبه پایین رونده هست . پس برای این کار باید از یک وقفه دیگه مثل INT1 استفاده کنید و اون رو حساس به لبه بالا رونده بذارید. تا وقتی برق وصل میشه و پایه INT1 یک گذر صفر به یک و لبه بالا رونده . پس با اومدن این لبه اون وقفه فعال میشه .
            اما حالا میدونی چرا دستورات داخل حلقه دائما تکرار میشه ؟
            چون در حالتی که دائما پایه INT0 یک هست با اولین لبه یکی که میاد وقفه فعال میشه و دستورات اجرامیشه تا آخرین دستور و بعد از زیر برنامه وقفه خارج میشه . به محض اینکه خارج میشه واز دوباره میبینه پایه INT0 یکه . واز دوباره به زیر برنامه وقفه میپره و .... واین باعث میشه دائما وقفهاجرا بشه .
            امیدوارم منظورم رو فهمیده باشی .
            تاپیک جامع سیستم مدیریت ساختمان BMS و خانه هوشمند Smart Home
            دانلود مجموعه آموزشی شرکت Altium ا (Altium Training)
            مقالات و فایل های آموزشی نرم افزار Labview
            حل مشکل درایور و راه اندازی FT232 های غیراورجینال

            دیدگاه


              #7
              پاسخ : مشکل با وقفه خارجی(INT 0)میکرو

              نوشته اصلی توسط محمد م
              سلام دکتر جان
              اولا با یک وقفه نمیشه دو کار رو انجام داد . چون یک وقفه یا حساس به لبه پایین رونده هست یا بالا رونده . مگر اینکه در حین اجرای برنامه اون رو تغییر بدید . یا همون چیزی که علی جان گفت .این از این .
              شما میگید وقتی برق قطع میشه پایه INT0 میکرو هم صفر میشه در حالی که قبلش یک هست . خوب این یعنی گذر 1 به صفر . یعنی لبه پایین رونده . پس شما باید وقفه رو حساس به لبه پایین رونده برای انجام این کار بذارید .
              حالا وقتی دوباره برق وصل میشه اگه بازهم شما از INT0 میکرو استفاده کردید این مشکل پیش میاد که مدار واکنشی نشون نمیده . چرا چون حساس به لبه پایین رونده هست . پس برای این کار باید از یک وقفه دیگه مثل INT1 استفاده کنید و اون رو حساس به لبه بالا رونده بذارید. تا وقتی برق وصل میشه و پایه INT1 یک گذر صفر به یک و لبه بالا رونده . پس با اومدن این لبه اون وقفه فعال میشه .
              اما حالا میدونی چرا دستورات داخل حلقه دائما تکرار میشه ؟
              چون در حالتی که دائما پایه INT0 یک هست با اولین لبه یکی که میاد وقفه فعال میشه و دستورات اجرامیشه تا آخرین دستور و بعد از زیر برنامه وقفه خارج میشه . به محض اینکه خارج میشه واز دوباره میبینه پایه INT0 یکه . واز دوباره به زیر برنامه وقفه میپره و .... واین باعث میشه دائما وقفهاجرا بشه .
              امیدوارم منظورم رو فهمیده باشی .
              از راهنمای تک به تک دوستان متشکرم

              بدلیل یه سری مسائل نمیتونم از پایه INT 1استفاده کنم .چون برا میکرو پایه کم میارم ..
              پس فقط میتونم از INT 0 استفاده کنم .

              شما میگید وقتی برق قطع میشه پایه INT0 میکرو هم صفر میشه در حالی که قبلش یک هست . خوب این یعنی گذر 1 به صفر . یعنی لبه پایین رونده . پس شما باید وقفه رو حساس به لبه پایین رونده برای انجام این کار بذارید .

              من توسط این دستور Debounce Pind.2 , 0 , Off به میکرو میگم که برق قطع شده و شما برو OFF رو اجرا کن

              حالا OFF چیه ؟؟اینه

              OFF:
              A
              A
              POWER DOWN
              در این حالت میکرو به حالت POWER میره

              تا اینجا افتاد؟؟

              وقتی برق وصل میشه یه 5 ولت اعمال میشه به INT 0 و این 5 ولت ،مدام رو این پایه خواهد بود چون از رگولاتور گرفتم .
              حالا چون برق وصل شده باید دستورات ON رو اجرا کنه چون ایجوری تعریف کردم

              Enable Interrupts
              Enable Int0
              Config Int0 = Rising
              On Int0 On

              ON:
              A
              A
              Return

              اگر راه حل دیگه های دوستان دارند سرپا به گوشیم
              یا به اندازه آرزوهایت تلاش میکنی یا به اندازه تلاشت ارزو میکنی

              دیدگاه


                #8
                پاسخ : مشکل با وقفه خارجی(INT 0)میکرو

                نوشته اصلی توسط M3R
                ببینید دوست عزیز
                وقتی شما نوشتی به لبه بالا رونده حساس باشه یعنی اینکه یه پالس بیاد روی پایه int0 که سطح ولتاژ از 0 به 1 تغییر کنه.
                حالا شما یه کاری کن:
                با یه مقاومت 10 کیلو پایه int0 رو pullup کن ببین باز هم این مشکل هست؟؟
                سلام
                ممنون از پاسختون
                .دوست عزیز یا من منظور شما رو متوجه نشدم یا شما منظور من رو متوجه نشدید .
                من یه 5 ولت مستقیم از رگولاتور دادم به INT 0 ..حالا اگر بخام یه مقاومتی PULL UP کنم ،این مقاومت تاثیری که نداری ،چون با 5 ولت موازی شده ..شما یه نگاهی به این بندازید ببنید شاید اشکال از طرف من باشه (اون چیزی که شما میگید اینه )

                یا به اندازه آرزوهایت تلاش میکنی یا به اندازه تلاشت ارزو میکنی

                دیدگاه


                  #9
                  پاسخ : مشکل با وقفه خارجی(INT 0)میکرو

                  من چون پایه INT 0 رو بهش 5 ولت دادم باید این پایه رو ورودی تعریف کنم؟؟CONFIG PORTD.2

                  اگر بخام ورودی تعریف کنم مشکلی تو وقفه ایجاد نمیشه ؟؟چون ما اینجاCONFIG INT 0 رو معرفی کردیم
                  حالا اگر بخایم این پایه رو ورودی تعریف کنیم اشکال داره >>
                  یا به اندازه آرزوهایت تلاش میکنی یا به اندازه تلاشت ارزو میکنی

                  دیدگاه


                    #10
                    پاسخ : مشکل با وقفه خارجی(INT 0)میکرو

                    سلام آقای دکتر ان شالله همپای اسمتون هم دکتراتون رو بگرین :nerd: هم شیرینش رو به بچه ها هم بدین خارج از شوخی امیدوارم دکترای برق بگیرین

                    خوب اول چند تا نکته:
                    1-هیچ وقت اسم لیبل ، تابع ، متغییر و ... که خودتون می تونین تعریف کنین رو با اسمای از قبل تعریف شده bascom یکی قرار ندین مثلا در این عبارت
                    On Int0 On

                    on یکی از دستورات bascom هست پس نامگذاریه لیبل اشتباه هست.شاید فکر کنین که برای برنامه نویسی بهتر می گم... هم این هست هم اینکه bascom در بعضی از مواقع به جای اینکه خطا بگیره اشتباه اجرا می کنه



                    برنامه:
                    کد:
                    $regfile = "m32def.dat"
                    $crystal = 1000000
                    '====================
                    Config Int0 = Change
                    Config Porta = Output
                    '====================
                    Enable Interrupts
                    Enable Int0
                    On Int0 Baby
                    '===================
                    Do
                    Waitms 100
                    Loop
                    
                    End
                    
                    '=================
                    Baby:
                    Select Case Pind.2
                    Case 0:
                    'A
                    'A
                    Porta = 0
                    'Powerdown
                    Case 1:
                    'A
                    'A
                    Porta = 255
                    End Select
                    
                    Return

                    آقای دکتر احتمالا تا آخر شب نرسم بیام جواب بدم برای اینکه مشکلی نداشته باشین و از صحت برنامه مطمئن بشین براتون فایل پروتئوسشم درست کردم و همینجا می زارم که تست کنین.(آخه امتحانم رو باید بخونم)بازم شرمنده

                    http://vip.eca.ir/sharing/uploads/13397798291.rar

                    یه دعای خیر هم برای آقای بلورچیان فراموش نشه که یوزر پلود کردن داخل سایت دادن تا مشکلی برای این فایل ها نداشته باشیم :job:

                    توضیح:
                    من اومدم پورت a رو همین جوری تعریف کردم تا با یک شدن اینتراپت پورت a یک بشه و بلعکس .
                    چون دیدم شما اسم کاراتون رو a گذاشتین و bascom خطا می ده اونها رو با ' غیرفعال کردم که می تونین در برنامه اصلی عبارت های زیر رو حذف کنین و برنامه رو قرار بدین



                    Config Porta = Output
                    Porta = 0
                    Porta = 255
                    هیچ دانش آموزی نیست که به در خانۀ دانشمندی آمد و شد کند, مگر این که خداوند برای هر گامی که برمی دارد عبادت یک سال را برایش رقم زند.

                    دیدگاه


                      #11
                      پاسخ : مشکل با وقفه خارجی(INT 0)میکرو

                      نوشته اصلی توسط baby_1
                      سلام آقای دکتر ان شالله همپای اسمتون هم دکتراتون رو بگرین :nerd: هم شیرینش رو به بچه ها هم بدین خارج از شوخی امیدوارم دکترای برق بگیرین

                      خوب اول چند تا نکته:
                      1-هیچ وقت اسم لیبل ، تابع ، متغییر و ... که خودتون می تونین تعریف کنین رو با اسمای از قبل تعریف شده bascom یکی قرار ندین مثلا در این عبارت
                      On Int0 On

                      on یکی از دستورات bascom هست پس نامگذاریه لیبل اشتباه هست.شاید فکر کنین که برای برنامه نویسی بهتر می گم... هم این هست هم اینکه bascom در بعضی از مواقع به جای اینکه خطا بگیره اشتباه اجرا می کنه



                      برنامه:
                      کد:
                      $regfile = "m32def.dat"
                      $crystal = 1000000
                      '====================
                      Config Int0 = Change
                      Config Porta = Output
                      '====================
                      Enable Interrupts
                      Enable Int0
                      On Int0 Baby
                      '===================
                      Do
                      Waitms 100
                      Loop
                      
                      End
                      
                      '=================
                      Baby:
                      Select Case Pind.2
                      Case 0:
                      'A
                      'A
                      Porta = 0
                      'Powerdown
                      Case 1:
                      'A
                      'A
                      Porta = 255
                      End Select
                      
                      Return

                      آقای دکتر احتمالا تا آخر شب نرسم بیام جواب بدم برای اینکه مشکلی نداشته باشین و از صحت برنامه مطمئن بشین براتون فایل پروتئوسشم درست کردم و همینجا می زارم که تست کنین.(آخه امتحانم رو باید بخونم)بازم شرمنده

                      http://vip.eca.ir/sharing/uploads/13397798291.rar

                      یه دعای خیر هم برای آقای بلورچیان فراموش نشه که یوزر پلود کردن داخل سایت دادن تا مشکلی برای این فایل ها نداشته باشیم :job:

                      توضیح:
                      من اومدم پورت a رو همین جوری تعریف کردم تا با یک شدن اینتراپت پورت a یک بشه و بلعکس .
                      چون دیدم شما اسم کاراتون رو a گذاشتین و bascom خطا می ده اونها رو با ' غیرفعال کردم که می تونین در برنامه اصلی عبارت های زیر رو حذف کنین و برنامه رو قرار بدین



                      Config Porta = Output
                      Porta = 0
                      Porta = 255
                      مرسی از لطفتون .واقعا ممنونم .انشاله که امتحاناتون رو به خوبی بدید .
                      اون قسمت A رو من همینجوری گذاشتم .اینها برنامه بوده .من به جاش a گذاشتم .حالا شما جای این نقطه........ در نظر بگیر
                      یا به اندازه آرزوهایت تلاش میکنی یا به اندازه تلاشت ارزو میکنی

                      دیدگاه


                        #12
                        پاسخ : مشکل با وقفه خارجی(INT 0)میکرو

                        ممنون و شما هم موفق باشین
                        شب خوش
                        هیچ دانش آموزی نیست که به در خانۀ دانشمندی آمد و شد کند, مگر این که خداوند برای هر گامی که برمی دارد عبادت یک سال را برایش رقم زند.

                        دیدگاه


                          #13
                          پاسخ : مشکل با وقفه خارجی(INT 0)میکرو

                          سلام
                          الان به صورت اتفاقی پست قبلی هاتون رو دیدم
                          هیچ وقت یه منبع ولتاژ زیاد رو به صورت مستقیم به میکرو وصل نکنین اگر می خواین چنین کاری رو انجام بدین که سطح منطقی یک صورت بگیره سر راه یه مقاومت برای محدود کردن جریان قرار بدین مثلا 1 کیلو اهم

                          هیچ دانش آموزی نیست که به در خانۀ دانشمندی آمد و شد کند, مگر این که خداوند برای هر گامی که برمی دارد عبادت یک سال را برایش رقم زند.

                          دیدگاه


                            #14
                            پاسخ : مشکل با وقفه خارجی(INT 0)میکرو

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

                            دیدگاه


                              #15
                              پاسخ : مشکل با وقفه خارجی(INT 0)میکرو

                              سلام داش BABY

                              الان مدار بصورت قبل عمل میکنه .یعنی اینکه وقتی پایه صفر میشه به حالت POWER DOWN میره ولی وقتی پایه 1 میشه(برق وصل میشه) میکرو رو راه اندازی نمیکنه(از SLEEP)خارجش نمیکنه :cry: :cry: :cry: :cry2: :cry2: :cry2: :cry2:

                              راستی پایه INT 0 رو PULL UP کنم یا PULL DOWN؟؟ شما خودتون PUL DOWN کردید..

                              الان برنامه این شده :

                              Enable Interrupts
                              Enable Int0
                              Config Int0 = Change
                              On Int0 In


                              In:
                              Select Case Pind.2
                              Case 0:
                              Set Portc.5
                              Waitms 900
                              Reset Portc.5
                              Waitms 900
                              Set Portc.5
                              Wait 2
                              Reset Portc.5
                              Display Off
                              Powerdown


                              Case 1:
                              Set Portc.4
                              Waitms 900
                              Reset Portc.4
                              Waitms 900
                              Set Portc.5
                              Wait 2
                              Reset Portc.4
                              End Select
                              Return

                              الان دستورات CASE 0 اجرامیشه و میکرو SLEEP میشه ولی وقتی پایه رو یک میکنم دستورات CASE1 اجرا نمیشه و میکرو راه اندازی نمیشه ؟؟

                              در ضمن پایه D.2(INT 0 رو ورودی تعریف کردم .درسته .؟ CONFIG PORTD.2=INPUT
                              یا به اندازه آرزوهایت تلاش میکنی یا به اندازه تلاشت ارزو میکنی

                              دیدگاه

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