اطلاعیه

Collapse
No announcement yet.

نوشتن وقفه برای یک پین

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

    نوشتن وقفه برای یک پین

    با سلام

    می خواستم بدونم امکان داره برای یک پین وقفه نوشت - مثلا وقتی یک شد به یک زیر روال بره؟
    یا نه باید از ففه های خارجی استفاده کرد - مثلا مگا32 از 3 تا وقفه خارجی استفاده کرد.

    با تشکر
    دوست عزیز اگه مفید بود روی تشکر بزن

    #2
    پاسخ : نوشتن وقفه برای یک پین

    منظورتون اینجوریه؟:
    کد:
       if (!PIND.6) {
         f=1;
         printf("at%c",Enter);
        }
    هم میشه از وقفه استفاده کرد هم از صفر و یک شدن پین. منتها وفقه بیشتر برای ورودی ها و اتفاقاتی استفاده میشه که یا بصورت لحظه ای و سریع اتفاق میفتند و یا اینکه به محض رخ دادن باید بلافاصله یه کاری توی میکرو انجام بشه.
    ولی بررسی صفر یا یک شدن پین اینجوری نیس. از این روش وقتی استفاده میشه که 2تا ویژگی بالا نیاز نباشه و میکرو به روش سرکشی و طبق روال داره خطوط برنامه رو اجرا میکنه و وقتی به پین رسید اون رو هم بررسی میکنه و با توجه به وضعیتش اجرا میکنه.
    www.gam-co.blogsky.com

    دیدگاه


      #3
      پاسخ : نوشتن وقفه برای یک پین

      به صورت نرم افزاری که فکر می کنم بشه. اما من 1 راه بهتون پیشنهاد میکنم. (چون میخواهید مثل وقفه باشه، یعنی سریع احساس بشه).
      وقفه تایمر رو فعال کنید و توی وقفه تایمر وضعیت پایه رو همون طور که دوستمون گفتند چک کنید.
      ---------
      .
      .
      ...........

      دیدگاه


        #4
        پاسخ : نوشتن وقفه برای یک پین

        سلام
        ممنون از جوابتون

        منظورم این نیست - به قول خودتون تو مسیر برنامه چک میکنیم.
        اما زمانی که نیاز به این است که اگر صفر یا یک شد به زیر روال برود(بدون مکس) - آیا بدون وقفه خارجی میشود یا نه وقفه خارجی(3وقفه مگا32) برای همینه و برای همین گذاشته اند و راه دیگه ای ندارد؟
        دوست عزیز اگه مفید بود روی تشکر بزن

        دیدگاه


          #5
          پاسخ : نوشتن وقفه برای یک پین

          اینکه بلافاصله این اتفاق بیفته بدون وقفه خارجی ممکن نیس. البته شاید بتونید از وقفه مقایسه کننده آنالوگ هم استفاده کنید.
          اینکه توی وقفه تایمر وضعیت پین بررسی بشه تاخیر کار بیشتر میشه. چون حتی اگه هر 500 میکرو ثانیه هم وارد وقفه بشه و وضعیت رو چک کنه باز هم نسبت به وقتی که توی وایل اصلی چک بشه تاخیرش بیشتره. چون توی وایل اصلی بسته به برنامه و کلاک زمانی که از بالای وایل تا پایین میاد چیزی در حدود نانو ثانیه تا چند میکرو ثانیس. همچنین وقتی وقفه تایمر فعال کنید تا مرتبا وارد وقفه بشه باعث میشه از سرعت کل برنامه کاسته بشه.
          www.gam-co.blogsky.com

          دیدگاه


            #6
            پاسخ : نوشتن وقفه برای یک پین

            نوشته اصلی توسط david24
            سلام
            ممنون از جوابتون

            منظورم این نیست - به قول خودتون تو مسیر برنامه چک میکنیم.
            اما زمانی که نیاز به این است که اگر صفر یا یک شد به زیر روال برود(بدون مکس) - آیا بدون وقفه خارجی میشود یا نه وقفه خارجی(3وقفه مگا32) برای همینه و برای همین گذاشته اند و راه دیگه ای ندارد؟
            خوب شما زمان وقفه تایمر رو کمتر کنید، میشه گفت یه جورایی میشه بدون مکث و شبیه وقفه.
            یک راه دیگه هم هست. البته اینم سخت افزاریه.
            استفاده از وقفه واحد Input Capture تایمر 1. می تونید حساس به لبه بالارونده تنظیم کنید، وقتی روی پایه ICP1 لبه دیده بشه (همون صفر و یک شدن) درست مثل وقفه خارجی عمل می کنه و یک وقفه برای میکرو ارسال میشه.
            ---------
            .
            .
            ...........

            دیدگاه


              #7
              پاسخ : نوشتن وقفه برای یک پین

              شما زمان وقفه تایمر رو که کمتر کنید دیگه cpu باید دائما توی وقفه سیر کنه و سرعت اجرای دستورات حلقه وایل کم میشه.
              ولی اون مد کپچر رو خوب امدی!
              www.gam-co.blogsky.com

              دیدگاه


                #8
                پاسخ : نوشتن وقفه برای یک پین

                نوشته اصلی توسط vahidabedi
                شما زمان وقفه تایمر رو که کمتر کنید دیگه cpu باید دائما توی وقفه سیر کنه و سرعت اجرای دستورات حلقه وایل کم میشه.
                آخه دیگه راهی نمی موند برای شناسایی سریع تر پین.
                به هر حال یک حالت بینابینی باید انتخاب بشه.
                مثلا آی سی های دیگه که برای زیاد کردن پین میکرو به کار میرن (IO Expander) هم یک زمان رفرش دارند. مثلا هر 20 میلی ثانیه یکبار ورودی هارو چک می کنند. من هم از همین منظر به قضیه نگاه کردم. در هر صورت حرف شما هم درسته.
                ---------
                .
                .
                ...........

                دیدگاه


                  #9
                  پاسخ : نوشتن وقفه برای یک پین

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

                  بعضی جاها برنامه منتظره یک دریافتی از سریال است که صفر و یک شدن که حدود 200 تا 500 میلی ثانیه هست را از دست می دهد.
                  فکر کنم فقط وقفه خارجی چاره ساز باشه.
                  میخواستم کمتر از وقفه خارجی استفاده کنم بخاطر محدود بودن تعداد وقفه خارجی و اینکه باید وقفه سراسری را فعال کرد و اختلال در برنامه ایجاد میکند.

                  ممنون از جوابتون
                  دوست عزیز اگه مفید بود روی تشکر بزن

                  دیدگاه


                    #10
                    پاسخ : نوشتن وقفه برای یک پین

                    نوشته اصلی توسط Des_B
                    آخه دیگه راهی نمی موند برای شناسایی سریع تر پین.
                    به هر حال یک حالت بینابینی باید انتخاب بشه.
                    مثلا آی سی های دیگه که برای زیاد کردن پین میکرو به کار میرن (IO Expander) هم یک زمان رفرش دارند. مثلا هر 20 میلی ثانیه یکبار ورودی هارو چک می کنند. من هم از همین منظر به قضیه نگاه کردم. در هر صورت حرف شما هم درسته.
                    با سلام

                    از نظر شما هم ممنون

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

                    دیدگاه


                      #11
                      پاسخ : نوشتن وقفه برای یک پین

                      استفاده از کانتر هم میشه .باید مقدار TCNT رو برابر 255 قرار بدید و از طریق پایه(T0,T1) مقدار ورودی رو بخونی و با اینکار وقفه سرریز رو فعال کنی تا مثل اینتراپت عمل کنه

                      دیدگاه


                        #12
                        پاسخ : نوشتن وقفه برای یک پین

                        اگر از میکروهای سری جدید AVR مثل Atmega48 استفاده کنی که روی تمامی پایه ها وقفه هست و میتونی باهاش کار کنی ولی روی سری های قدیمی باید به صورت پیوسته چک بشه.
                        Aristar Group - Always And Forever

                        دیدگاه


                          #13
                          پاسخ : نوشتن وقفه برای یک پین

                          نوشته اصلی توسط saeiddiod
                          استفاده از کانتر هم میشه .باید مقدار TCNT رو برابر 255 قرار بدید و از طریق پایه(T0,T1) مقدار ورودی رو بخونی و با اینکار وقفه سرریز رو فعال کنی تا مثل اینتراپت عمل کنه
                          ممنون از جوابتون
                          یه سوال از شما داشتم
                          میخواستم برنامه میکرو مگا32 به یک خط مشخص از برنامه که میرسه یک تایمر فعال بشه و دستورات بعدی همینطور ادامه بده تا 30 ثانیه(که به تایمر دادیم) بعد زیرروال تایمر اجرا بشه و بعد از خروج از تایمر - تایمر را غیر فعال کنیم و ادامه برنامه.

                          بطور کلی یک تایمر با تنظیمات 30 ثانیه و در خط مشخصی از دستورات فعال بشه یعنی تا قبل این فعال نباشه و بعد از اینکه زیرروال تایمر اجرا شد تایمر غیر فعال شه.

                          اگه میتونید یه کمکی بکنید زیاد با ریجیسترای تایمر اشنا نیستم.
                          با تشکر
                          دوست عزیز اگه مفید بود روی تشکر بزن

                          دیدگاه

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