اطلاعیه

Collapse
No announcement yet.

مشکل در نحوه ی تاخیر در Atmel Studio با تابع Delay

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

    مشکل در نحوه ی تاخیر در Atmel Studio با تابع Delay

    سلام
    میخواستم توی Atmel Studio مقدار یک متغیر رو وارد تابع delay_ms کنم ولی ارور میده ، ولی همون کد رو وارد کد ویژن میکنم بدون هیچ مشکلی اجرا میشه .
    اینم ارورش :
    Error 1 __builtin_avr_delay_cycles expects an integer constant

    اینم کدش :

    اینم عکسش :


    #2
    پاسخ : مشکل در نحوه ی تاخیر در Atmel Studio با تابع Delay

    اون متغیر رو توی تابع main تعریف کنید...

    دیدگاه


      #3
      پاسخ : مشکل در نحوه ی تاخیر در Atmel Studio با تابع Delay

      نوشته اصلی توسط علی محمد شریفی نمایش پست ها
      سلام
      میخواستم توی Atmel Studio مقدار یک متغیر رو وارد تابع delay_ms کنم ولی ارور میده ، ولی همون کد رو وارد کد ویژن میکنم بدون هیچ مشکلی اجرا میشه .
      اینم ارورش :
      Error 1 __builtin_avr_delay_cycles expects an integer constant

      اینم کدش :

      اینم عکسش :

      سلام
      دلیلش اینه که نحوه پیاده*سازی delay توی این دو کمپایلر متفاوته. در واقع اونی که اتمل استدیو یا بهتره بگیم کمپایلر avr-gcc استفاده میکنه تابع نیست؛ ماکرو هستش!
      یک راه جوابگو ولی نچندان دقیق اینه که خودتون یک تابع delay دیگه به این شکل بنویسید:

      void delay_ms(int d)
      {
      if (d < 0)
      return;

      for (; d > 0; --d)
      _delay_ms(1);
      }

      دیدگاه


        #4
        پاسخ : مشکل در نحوه ی تاخیر در Atmel Studio با تابع Delay

        پیشنهاد شما جواب نداد


        دلیل: ادغام دو پست برای جلوگیری از اسپم

        نوشته اصلی توسط hossein.m98 نمایش پست ها
        سلام
        دلیلش اینه که نحوه پیاده*سازی delay توی این دو کمپایلر متفاوته. در واقع اونی که اتمل استدیو یا بهتره بگیم کمپایلر avr-gcc استفاده میکنه تابع نیست؛ ماکرو هستش!
        یک راه جوابگو ولی نچندان دقیق اینه که خودتون یک تابع delay دیگه به این شکل بنویسید:

        void delay_ms(int d)
        {
        if (d < 0)
        return;

        for (; d > 0; --d)
        _delay_ms(1);
        }




        سلام
        کد شما کامپایل میشه ، ولی وقتی به صورت عملی تست میشه جواب نمیده اصلا

        دیدگاه


          #5
          پاسخ : مشکل در نحوه ی تاخیر در Atmel Studio با تابع Delay

          نوشته اصلی توسط علی محمد شریفی نمایش پست ها
          پیشنهاد شما جواب نداد


          دلیل: ادغام دو پست برای جلوگیری از اسپم






          سلام
          کد شما کامپایل میشه ، ولی وقتی به صورت عملی تست میشه جواب نمیده اصلا
          یعنی چی جواب نمیده؟ کد کامل رو بفرستید

          دیدگاه


            #6
            پاسخ : مشکل در نحوه ی تاخیر در Atmel Studio با تابع Delay

            نوشته اصلی توسط hossein.m98 نمایش پست ها
            یعنی چی جواب نمیده؟ کد کامل رو بفرستید

            دیدگاه


              #7
              پاسخ : مشکل در نحوه ی تاخیر در Atmel Studio با تابع Delay

              نوشته اصلی توسط علی محمد شریفی نمایش پست ها
              این کد یک اشتباه فاحش داره؛ انتهای حلقه for پین مد نظر 0 میشه ولی بعدش از تاخیر استفاده نشده که این باعث میشه بلافاصله راند بعدی حلقه اجرا بشه و دوباره پین ۱ بشه. نتیجتا روشن و خاموش شدن این پین اصلا به چشم نمیاد! مشکلی هم توی تاخیر وجود نداره.

              دیدگاه


                #8
                پاسخ : مشکل در نحوه ی تاخیر در Atmel Studio با تابع Delay

                نوشته اصلی توسط hossein.m98 نمایش پست ها
                این کد یک اشتباه فاحش داره؛ انتهای حلقه for پین مد نظر 0 میشه ولی بعدش از تاخیر استفاده نشده که این باعث میشه بلافاصله راند بعدی حلقه اجرا بشه و دوباره پین ۱ بشه. نتیجتا روشن و خاموش شدن این پین اصلا به چشم نمیاد! مشکلی هم توی تاخیر وجود نداره.
                بله ،ممنون،
                فقط دقتش پایینه، باید چیکار کرد، به نظرتون؟

                دیدگاه


                  #9
                  پاسخ : مشکل در نحوه ی تاخیر در Atmel Studio با تابع Delay

                  نوشته اصلی توسط علی محمد شریفی نمایش پست ها
                  بله ،ممنون،
                  فقط دقتش پایینه، باید چیکار کرد، به نظرتون؟
                  به طور کلی دقت این روش تاخیر (منظور استفاده از ماکرو _delay_ms) پایینه چون تاخیر با شمارش و اتلاف سیکل های کاری CPU (با استفاده از اینستراکشن NOP) به وجود میاد. اگر دقت خیلی بالا لازم دارید باید از تایمر استفاده کنید.با همه این اوصاف، اگر تاخیراتون مثلا مضربی از ۱۰ میلی ثانیه باشن، میتونید تابع تاخیری بنویسید که تعداد ۱۰ میلی ثانیه ها رو بگیره و داخل حلقه for از تاخیر ۱۰ میلی ثانیه ای به جای ۱ میلی ثانیه ای استفاده کنه. اینطوری میشه تعداد تکرار حلقه for رو کم کرد که یک مقدار دقت بهتر بشه.
                  شاید با چیزایی که گفتم ایده بگیرید و خودتون کارای بهتری بکنید؛ اما بدونید هرچه عملیات های ریاضی، منطقی ، حلقه، شرط و امثال این ها کمتر باشه و بیشتر از ماکرو _delay_ms استفاده کنید، دقت بالاتر میره.

                  دیدگاه


                    #10
                    پاسخ : مشکل در نحوه ی تاخیر در Atmel Studio با تابع Delay

                    نوشته اصلی توسط علی محمد شریفی نمایش پست ها
                    لطفا همین برنامه رو با مقدار i=0 در ابتدای حلقه for جایگزین کنید. for (i=0;i<=50000;i=i*2)

                    دیدگاه


                      #11
                      پاسخ : مشکل در نحوه ی تاخیر در Atmel Studio با تابع Delay

                      ممنون از توضیحاتتون، حالا اگر بخوام از timer استفاده کنم و یه تابع بنویسم که هرجا بخوام فراخوانی کنم، برای مثال Timer 0 از ATMEGA8 ،و هدف این باشه که بعد از دریافت ورودی از کلید تایمر فعال بشه و 50 میلی ثانیه صبر کنه ، برای چه تعداد کلید میتونم از Timer 0 استفاده کنم، البته اینو در نظر بگیرید که کلید ها هم زمان با هم فعال بشن
                      نظرتون چیه؟

                      دلیل: ادغام دو پست برای جلوگیری از اسپم

                      نوشته اصلی توسط sadra98 نمایش پست ها
                      لطفا همین برنامه رو با مقدار i=0 در ابتدای حلقه for جایگزین کنید. for (i=0;i<=50000;i=i*2)
                      دوست عزیز اگر بخوام مقدار رو از اول 0 در نظر بگیرم که زمان بالا نمیره اصلا، چون قراره در عدد 2 ضرب کنه و همیشه زمان صفرمیمونه ، و خروجی مدام با سرعت بالایی 0 و 1 میشه
                      درسته؟ اگر هم بخوام جمع کنم و ضرب نکنم میشه 0 گذاشت ولی تغییر زمان خیلی دیر خودشو نشون میده
                      جدیدترین ویرایش توسط علی محمد شریفی; ۰۰:۱۳ ۱۴۰۱/۰۴/۰۳.

                      دیدگاه


                        #12
                        پاسخ : مشکل در نحوه ی تاخیر در Atmel Studio با تابع Delay

                        نوشته اصلی توسط علی محمد شریفی نمایش پست ها
                        ممنون از توضیحاتتون، حالا اگر بخوام از timer استفاده کنم و یه تابع بنویسم که هرجا بخوام فراخوانی کنم، برای مثال Timer 0 از ATMEGA8 ،و هدف این باشه که بعد از دریافت ورودی از کلید تایمر فعال بشه و 50 میلی ثانیه صبر کنه ، برای چه تعداد کلید میتونم از Timer 0 استفاده کنم، البته اینو در نظر بگیرید که کلید ها هم زمان با هم فعال بشن
                        نظرتون چیه؟
                        باید کامل بگید قراره با کلیدها چکار کنید تا بشه راهنمایی دقیق کرد.
                        ببنید میکروکنترلر شما که در لحظه یک کار بیشتر نمیتونه بکنه چون یک CPU بیشتر نداره. با روش تاخیر معمول، هرجا از تاخیر استفاده کنید، عملا CPU زمان تاخیر رو بیکار میمونه تا زمان بگذره. اگر با تایمر، چیزی مشابه همون تابع تاخیر معمول رو پیاده کنید، عملا رفتارش شبیه به همون رفتار تابع تاخیر خواهد بود با دقت بهتر. اما با استفاده از ویژگی وقفه تایمر میشه کارهای ابتکاری بهتری کرد. اگر در مورد تایمر و وقفه اطلاعاتی ندارید، بهتره در موردش تحقیق کنید؛ چیزی نیست که بشه توی چند جمله راحت توصیفش کرد.

                        دیدگاه


                          #13
                          پاسخ : مشکل در نحوه ی تاخیر در Atmel Studio با تابع Delay

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

                          اینتراپت اورفلو تایمر باندازه یک یا نهایتا چند سیکل ( بستگی به دستورات در روتین وقفه داره ) سی پی یو رو به زیر برنامه وقفه میبره برای مثال موضوع بحث تاگل کردن کردن یک پایه از یک پورت خروجیه .
                          زیر برنامه اینتراپت عملا میشه portx.x = not portx.x که میشه همون سیستم چشمک زن ( این کد ۱ سیکل ماشین زمان میبره )
                          از دید عملکرد سی پی یو در حالت آزاد قرار داره ( یا در حال انجام پردازش و کارهای دیگه است یا استندبای مونده یا اصلا روی مدهای کاری کم مصرف رفته )
                          هر بار اینتراپت فوق رخ میده سی پی یو روند کار جاری رو رها میکنه ( پروگرام کانتر رو استک میکنه ) میاد پورت رو تاگل میکنه برمیگرده ادامه کارش که استک شده بود رو انجام میده تا وقفه بعدی و تکرار روند فوق .

                          در میکروهایی مثل avrکه محدودیت تعداد تایمر و exti دارن با همون تک ایونت تایمر اورفلو میشه از نظر تئوریک هر تعداد تایمر دیگه رو با تعریف متغیر عمومی و inc(x) تعداد نسبتا نامحدودی تایمر نرم افزاری با ریلود سایکل دلخواه هم در روتین اینتراپت تایمر اضافه کرد

                          یا بصورت مشابه یک منبع exti رو با سیستم دیودی به مجموعه ای از کلیدها متصل کرد ... با همین تک اینتراپت کل کلیدها رو سرویس با وقفه داد ( زیر برنامه اینتراپت خارجی چک میکنه کدوم پین یا مجموعه پینها گرند شده یا بالعکس با مجموعه تایمرهای نرم افزاری از زمان اکتیو بودن کلیدها دیبانس گیری و خیلی کارهای دیگه کرد )

                          برنامه نویسی میکرو همونطور که دوستمون گفتن تیریکهای خاص خودش رو داره که اگر با طریقه اصولی برنامه نویسی و امکانات سخت افزاری ، نرم افزاری اون آرشیکتکتور آشنا نباشید با قویترین پردازنده ها در اجرای ساده ترین کارها منابع سیستمی فقط هدر میرن .
                          جدیدترین ویرایش توسط Amie.s.m; ۰۷:۱۵ ۱۴۰۱/۰۴/۰۳.

                          دیدگاه


                            #14
                            پاسخ : مشکل در نحوه ی تاخیر در Atmel Studio با تابع Delay

                            نوشته اصلی توسط hossein.m98 نمایش پست ها
                            باید کامل بگید قراره با کلیدها چکار کنید تا بشه راهنمایی دقیق کرد.
                            ببنید میکروکنترلر شما که در لحظه یک کار بیشتر نمیتونه بکنه چون یک CPU بیشتر نداره. با روش تاخیر معمول، هرجا از تاخیر استفاده کنید، عملا CPU زمان تاخیر رو بیکار میمونه تا زمان بگذره. اگر با تایمر، چیزی مشابه همون تابع تاخیر معمول رو پیاده کنید، عملا رفتارش شبیه به همون رفتار تابع تاخیر خواهد بود با دقت بهتر. اما با استفاده از ویژگی وقفه تایمر میشه کارهای ابتکاری بهتری کرد. اگر در مورد تایمر و وقفه اطلاعاتی ندارید، بهتره در موردش تحقیق کنید؛ چیزی نیست که بشه توی چند جمله راحت توصیفش کرد.
                            من متوجه میشم چی فرمودید، قبلا کار کردم ، ولی نمیخوام تو محیط کد ویژن باشم، رفتم سمت Atmel Studio چون کد ویزارد نداره یکم سختمه دستی وارد کنم .ولی سختی شو به جون خریدم.
                            در توضیحات بالا :
                            فکر کنید اصلا این کلید ها میتونن جای کلید یا هر سنسوری قرار بگیرن، میخوام بعد از دادن ورودی یا 1 شدن 50 میلی ثانیه صبر کنه بعد هر کدام یکی از پایه های دلخواه رو Toggle کنن، حالا میخوام بدونم برای Timer0 و قضیه
                            سرریز شدن برای چه تعداد کلید میتونم از Timer 0 استفاده کنم .نمیخوام هیچ تداخلی و وقفه ای از نظر زمانی در هیچ جای برنامه داشته باشم به این دلیل میخوام از تایمر استفاده کنم و اون 50ms و تعداد کلیدی که میشه ساپورتشون کرد مهمه، همین

                            دلیل: ادغام دو پست برای جلوگیری از اسپم

                            نوشته اصلی توسط Amie.s.m نمایش پست ها
                            استاددر تکمیل فرمایشات شما :
                            تایمر و وقفه اش برای این استفاده میشه که سی پی یو بر خلاف تابع دیلی در حالت استوپ قرار نگیره و روند عادی کارش رو ادامه بده .

                            اینتراپت اورفلو تایمر باندازه یک یا نهایتا چند سیکل ( بستگی به دستورات در روتین وقفه داره ) سی پی یو رو به زیر برنامه وقفه میبره برای مثال موضوع بحث تاگل کردن کردن یک پایه از یک پورت خروجیه .
                            زیر برنامه اینتراپت عملا میشه portx.x = not portx.x که میشه همون سیستم چشمک زن ( این کد ۱ سیکل ماشین زمان میبره )
                            از دید عملکرد سی پی یو در حالت آزاد قرار داره ( یا در حال انجام پردازش و کارهای دیگه است یا استندبای مونده یا اصلا روی مدهای کاری کم مصرف رفته )
                            هر بار اینتراپت فوق رخ میده سی پی یو روند کار جاری رو رها میکنه ( پروگرام کانتر رو استک میکنه ) میاد پورت رو تاگل میکنه برمیگرده ادامه کارش که استک شده بود رو انجام میده تا وقفه بعدی و تکرار روند فوق .

                            در میکروهایی مثل avrکه محدودیت تعداد تایمر و exti دارن با همون تک ایونت تایمر اورفلو میشه از نظر تئوریک هر تعداد تایمر دیگه رو با تعریف متغیر عمومی و inc(x) تعداد نسبتا نامحدودی تایمر نرم افزاری با ریلود سایکل دلخواه هم در روتین اینتراپت تایمر اضافه کرد

                            یا بصورت مشابه یک منبع exti رو با سیستم دیودی به مجموعه ای از کلیدها متصل کرد ... با همین تک اینتراپت کل کلیدها رو سرویس با وقفه داد ( زیر برنامه اینتراپت خارجی چک میکنه کدوم پین یا مجموعه پینها گرند شده یا بالعکس با مجموعه تایمرهای نرم افزاری از زمان اکتیو بودن کلیدها دیبانس گیری و خیلی کارهای دیگه کرد )

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

                            دیدگاه


                              #15
                              پاسخ : مشکل در نحوه ی تاخیر در Atmel Studio با تابع Delay

                              نوشته اصلی توسط علی محمد شریفی نمایش پست ها
                              من متوجه میشم چی فرمودید، قبلا کار کردم ، ولی نمیخوام تو محیط کد ویژن باشم، رفتم سمت Atmel Studio چون کد ویزارد نداره یکم سختمه دستی وارد کنم .ولی سختی شو به جون خریدم.
                              در توضیحات بالا :
                              فکر کنید اصلا این کلید ها میتونن جای کلید یا هر سنسوری قرار بگیرن، میخوام بعد از دادن ورودی یا 1 شدن 50 میلی ثانیه صبر کنه بعد هر کدام یکی از پایه های دلخواه رو Toggle کنن، حالا میخوام بدونم برای Timer0 و قضیه
                              سرریز شدن برای چه تعداد کلید میتونم از Timer 0 استفاده کنم .نمیخوام هیچ تداخلی و وقفه ای از نظر زمانی در هیچ جای برنامه داشته باشم به این دلیل میخوام از تایمر استفاده کنم و اون 50ms و تعداد کلیدی که میشه ساپورتشون کرد مهمه، همین
                              فرقی نداره توی چه محیطی باشید. تنها فرق توی جزئیاتی مثل تعریف زیر روال وقفه و این مسائل حاشیه ای هستش. اگر کاری رو توی کدویژن میتونید انجام بدید، اینجا هم باید بتونید. در مورد محدودیت هم همه چیز به برنامه نویسی خود شما بر میگرده! این خود شمایید که در نهایت باید تصمیم بگیرید با توجه به پیچیدگی برنامه، کدوم روش بهتره.
                              برای مثال شما یک تایمر رو میتونید تنظیم کنید که فقط یک متغیر تایم گلوبال رو با فرکانس خاصی زیاد کنه و بقیه قسمت های برنامه رو با توجه به اون مقدار اون متغیر سنکرون کنید. فرض که متغیر گفته شده هر میلی ثانیه یک واحد زیاد بشه؛ هر موقع کلید زده شد، مقدار متغیر تایمر رو بررسی میکنید و هدف رو روی این قرار میدید که اگر مقدار متغیر ۵۰ تا بیشتر شد خروجی فعال بشه. از این کلیدها میتونید به تعداد زیاد در نظر بگیرید که کارکردشون با هم تداخل هم نداره؛ فقط هر کدوم احتیاج به چندتایی متغیر برای ذخیره وضعیت و تایم دارن.

                              دیدگاه

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