اطلاعیه

Collapse
No announcement yet.

{آموزش} چگونه میشه میکرو رو ریست نرم افزاری کرد؟ ( ساده ترین راه حل )

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

    #16
    پاسخ : {آموزش} چگونه میشه میکرو رو ریست نرم افزاری کرد؟ ( ساده ترین راه حل )

    نوشته اصلی توسط مهدی رهی
    این قضیه رو مطمئن هستین؟
    قبلا با بچه ها صحبت کردیم گفته شد که این روش فقط خط برنامه رو از خونه صفر شروع میکنه و رجیستر ها و مقادیر static تغییر نمیکنن؟
    مقادیر متغیرهای local و volatile و stattic در این روش ریست میشن. یعنی بر میگردن به مقدار اولیه شون.

    برای اینکه از صحت حرف من مطمئن بشید کافیه یه پروزه خیلی ساده رو با atmel studio دیباگ کنید و توش سه تا مغیر فوق رو تعریف کنید.
    با trace کردن خط به ط برنامه مقادیر متغیرها رو مشاهده کنید.
    ....
    با تشکر
    برای جوینده ی علم محدودیتی نیست. "ولو بالسین"

    دیدگاه


      #17
      پاسخ : {آموزش} چگونه میشه میکرو رو ریست نرم افزاری کرد؟ ( ساده ترین راه حل )

      نوشته اصلی توسط yousef55
      فقظ برنامه جابه جا میشه و متغییر ها میمونند
      مثلا اگه اینتراپت زده شده باشه و return نکرده باشی و این دستور رو اجرا کنی به مشکل میخوری
      همون طور که مستحضرید ریست هم خودش یه اینتراپت هستش ولی با اولویت high. کار ما دقیقا مثل ران کردن یک اینتراپت درون یک اینتراپت دیگه همانند دستور تابع SIGNAL که دردرون خودش تابع sei رو هم تعریف میکنه که بشه در داخل یک اینتراپت یک وقفه ی با اولویت بالاتر هم رخ بده.
      ...
      با تشکر
      برای جوینده ی علم محدودیتی نیست. "ولو بالسین"

      دیدگاه


        #18
        پاسخ : {آموزش} چگونه میشه میکرو رو ریست نرم افزاری کرد؟ ( ساده ترین راه حل )

        راستی اینم بگم که اگه کسی دوست داشت که متغیرهاش ریست نشن میتونه از دستور زیر استفاده کنه:
        کد:
        __attribute__((naked,section(".vectors"))) void start(void) {
          asm("rjmp main");
        }
        برای فراخونی این تابع هم به شکل زیر استفاده کنه:
        کد:
        start();
        این تابع برنامه رو میبره به ابتدای main
        برای جوینده ی علم محدودیتی نیست. "ولو بالسین"

        دیدگاه


          #19
          پاسخ : {آموزش} چگونه میشه میکرو رو ریست نرم افزاری کرد؟ ( ساده ترین راه حل )

          نوشته اصلی توسط m52r65
          راستی اینم بگم که اگه کسی دوست داشت که متغیرهاش ریست نشن میتونه از دستور زیر استفاده کنه:
          کد:
          __attribute__((naked,section(".vectors"))) void start(void) {
            asm("rjmp main");
          }
          برای فراخونی این تابع هم به شکل زیر استفاده کنه:
          کد:
          start();
          این تابع برنامه رو میبره به ابتدای main
          ممنون حتما امتحان میکنیم
          در مورد همه میکروهای مگا صادق است؟
          دوست عزیز اگه مفید بود روی تشکر بزن

          دیدگاه


            #20
            پاسخ : {آموزش} چگونه میشه میکرو رو ریست نرم افزاری کرد؟ ( ساده ترین راه حل )

            نوشته اصلی توسط david24
            ممنون حتما امتحان میکنیم
            در مورد همه میکروهای مگا صادق است؟
            خواهش میکنم.
            در مورد میکروهایی که من امتحان کردم بله.
            برای جوینده ی علم محدودیتی نیست. "ولو بالسین"

            دیدگاه


              #21
              پاسخ : {آموزش} چگونه میشه میکرو رو ریست نرم افزاری کرد؟ ( ساده ترین راه حل )

              با اجازه دوستان من آموزش رو تکمیل ترش میکنم :
              لذا سوال زیر رو مطرح میکنم.
              --------------------------------
              سوال :
              فرض کنید که در داخل برنامه مون توابع وقفه ی خارجی صفر و یک و دو و همچنین وقفه ی دریافت یوزارت رو نوشتیم.
              حالا می خوایم با این توابع مثل توابع عادی رفتار کنیم . مثلا هر وقت خواستیم تابع وقفه ی صفر رو اجرا کنیم.
              البته اینم بگم که اصلا هیچ کدوم از وقفه ها رو کانفیگ نکردیم و فعالشون نکردیم . فقط توابعشو نوشتیم. (مثل تموم توابعی که می نویسیم )
              ---
              سوال اینه: اگر شما بخواید هر کدوم از اون توابع وقفه رو (بدون به وجود آمدن شرایط وقفه ) هر وقت که دوست داشتید اجرا کنید چکار می کنید؟
              برای جوینده ی علم محدودیتی نیست. "ولو بالسین"

              دیدگاه


                #22
                پاسخ : {آموزش} چگونه میشه میکرو رو ریست نرم افزاری کرد؟ ( ساده ترین راه حل )

                نوشته اصلی توسط m52r65
                با اجازه دوستان من آموزش رو تکمیل ترش میکنم :
                لذا سوال زیر رو مطرح میکنم.
                --------------------------------
                سوال :
                فرض کنید که در داخل برنامه مون توابع وقفه ی خارجی صفر و یک و دو و همچنین وقفه ی دریافت یوزارت رو نوشتیم.
                حالا می خوایم با این توابع مثل توابع عادی رفتار کنیم . مثلا هر وقت خواستیم تابع وقفه ی صفر رو اجرا کنیم.
                البته اینم بگم که اصلا هیچ کدوم از وقفه ها رو کانفیگ نکردیم و فعالشون نکردیم . فقط توابعشو نوشتیم. (مثل تموم توابعی که می نویسیم )
                ---
                سوال اینه: اگر شما بخواید هر کدوم از اون توابع وقفه رو (بدون به وجود آمدن شرایط وقفه ) هر وقت که دوست داشتید اجرا کنید چکار می کنید؟
                سلام.
                بهتره که این کار رو انجام ندیم. اما می تونیم یک اشاره گر به تابع تعریف کنیم و آدرس وکتور اون وقفه رو بهش بدیم و بعد تابع رو اجرا کنیم.
                There is nothing so practical as a good theory. — Kurt Lewin, 1951

                دیدگاه


                  #23
                  پاسخ : {آموزش} چگونه میشه میکرو رو ریست نرم افزاری کرد؟ ( ساده ترین راه حل )

                  سلام. اگر امکانش هست این کدهایی رو که نوشتید( هم صفحه قبل و هم این صفحه) رو یه کم توضیح بدید که نحوه عملکردشون چطوری هست. ممنون

                  دیدگاه


                    #24
                    پاسخ : پاسخ : {آموزش} چگونه میشه میکرو رو ریست نرم افزاری کرد؟ ( ساده ترین راه حل )

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

                    دیدگاه


                      #25
                      پاسخ : پاسخ : {آموزش} چگونه میشه میکرو رو ریست نرم افزاری کرد؟ ( ساده ترین راه حل )

                      نوشته اصلی توسط رضا سپاس یار
                      سلام.
                      بهتره که این کار رو انجام ندیم. اما می تونیم یک اشاره گر به تابع تعریف کنیم و آدرس وکتور اون وقفه رو بهش بدیم و بعد تابع رو اجرا کنیم.
                      همیشه آقای سپاس یار بهترین جوابو میدن.
                      من هم از ایشون تشکر میکنم.
                      و دوباره جوابشونو با کد نویسی تکمیل میکنم.
                      ---------------------------------------------
                      خب برای مبحث آموزشی این سوال میخوام ارجاعتون بدم به دیتاشیت میکروکنترلر.
                      دیتاشیت میکرو کنترلر مورد نظرتون رو باز کنید (به عنوان مثال ساده مثلا اتمگا 8 )
                      برید به قسمت interrupt vectors
                      خب تو این جدول شما انواع وقفه های قابل اجرا تو سط این میکرو کنترلر رو به همراه آدرس اونها می بینید. (به ترتیب : ریست- وقفه 0 و...)
                      در این قسمت آدرس هر بردار برای ما مهمه . به عنوان مثال وقفه خارجی صفر آدرش یک هستش ، وقفه ی خارجی یک آدرسش دو هستش و همچنین تا حداکثر آدرس مربوط به حاضر بودن SPM جهت پروگرمینگ که آدرسش 12 هگز و یا 18 هستش.
                      اگه یادتون باشه من یه تابع به نام software_reset رو قبلا تعریف کردم و بهش مقدار 0 دادم. 0 در حقیقت همون آدرس وقفه بود. حالا شما اگه بهش مقدار 1 بدید . وقفه صفر بدون پیش اومدن شرایطش اجرا میشه.کافیه اون تابع رو نوشته باشید تابتونید نتیجه شو ببینید.
                      --------------------------------------------
                      موفق باشید.
                      برای جوینده ی علم محدودیتی نیست. "ولو بالسین"

                      دیدگاه


                        #26
                        پاسخ : {آموزش} چگونه میشه میکرو رو ریست نرم افزاری کرد؟ ( ساده ترین راه حل )

                        نوشته اصلی توسط E.N
                        سلام. اگر امکانش هست این کدهایی رو که نوشتید( هم صفحه قبل و هم این صفحه) رو یه کم توضیح بدید که نحوه عملکردشون چطوری هست. ممنون
                        چشم.
                        من سعی میکنم تموم این مباحث رو به صورت یک فایل متنی و یک جا تقدیمتون کنم.
                        برای جوینده ی علم محدودیتی نیست. "ولو بالسین"

                        دیدگاه


                          #27
                          پاسخ : {آموزش} چگونه میشه میکرو رو ریست نرم افزاری کرد؟ ( ساده ترین راه حل )

                          نوشته اصلی توسط m52r65
                          خواهش میکنم.
                          در مورد میکروهایی که من امتحان کردم بله.
                          میشه میکروهای که تست کرددین بگید؟
                          دوست عزیز اگه مفید بود روی تشکر بزن

                          دیدگاه


                            #28
                            پاسخ : {آموزش} چگونه میشه میکرو رو ریست نرم افزاری کرد؟ ( ساده ترین راه حل )

                            نوشته اصلی توسط david24
                            میشه میکروهای که تست کرددین بگید؟
                            Atmega8
                            Atmega16
                            Atmega32
                            Atmega48
                            Atmega88
                            Atmega64
                            Atmega128
                            Atmega2560
                            Atmega2561
                            Attiny13
                            Attiny2313
                            atxmega128a1
                            و ...
                            ...............
                            باقیش رو خودتون امتحان کنید
                            برای جوینده ی علم محدودیتی نیست. "ولو بالسین"

                            دیدگاه


                              #29
                              پاسخ : {آموزش} چگونه میشه میکرو رو ریست نرم افزاری کرد؟ ( ساده ترین راه حل )

                              نوشته اصلی توسط m52r65
                              همیشه آقای سپاس یار بهترین جوابو میدن.
                              من هم از ایشون تشکر میکنم.
                              و دوباره جوابشونو با کد نویسی تکمیل میکنم.
                              ---------------------------------------------
                              خب برای مبحث آموزشی این سوال میخوام ارجاعتون بدم به دیتاشیت میکروکنترلر.
                              دیتاشیت میکرو کنترلر مورد نظرتون رو باز کنید (به عنوان مثال ساده مثلا اتمگا 8 )
                              برید به قسمت interrupt vectors
                              خب تو این جدول شما انواع وقفه های قابل اجرا تو سط این میکرو کنترلر رو به همراه آدرس اونها می بینید. (به ترتیب : ریست- وقفه 0 و...)
                              در این قسمت آدرس هر بردار برای ما مهمه . به عنوان مثال وقفه خارجی صفر آدرش یک هستش ، وقفه ی خارجی یک آدرسش دو هستش و همچنین تا حداکثر آدرس مربوط به حاضر بودن SPM جهت پروگرمینگ که آدرسش 12 هگز و یا 18 هستش.
                              اگه یادتون باشه من یه تابع به نام software_reset رو قبلا تعریف کردم و بهش مقدار 0 دادم. 0 در حقیقت همون آدرس وقفه بود. حالا شما اگه بهش مقدار 1 بدید . وقفه صفر بدون پیش اومدن شرایطش اجرا میشه.کافیه اون تابع رو نوشته باشید تابتونید نتیجه شو ببینید.
                              --------------------------------------------
                              موفق باشید.
                              دوست عزیز ممنون بابت آموزش مفیدت
                              مورد زیر من رو گیج کرده:
                              اینکه میگی اگر آدرس 1 رو بهش بدیم وقفه صفر بدون پیش اومدن شرایطش رخ میده !
                              آدرس 1 (0x0001) مگه مربوط به وقفه INT0 نمیشه؟ oo:
                              ای خدا ، من باید از نظر علم از همه برتر باشم، تا مبادا که دشمنان مرا از این راه طعنه زنند. باید به آن سنگدلانی که علم را بهانه کرده و به دیگران فخر میآ*فروشند، ثابت کنم که خاک پای من هم نخواهند شد. باید همه آن تیره دلان مغرور و متکبر را به زانو در آورم، آنگاه خود خاضع ترین و افتاده ترین مرد روی زمین باشم.
                              شهید دکتر مصطفی چمران
                              اللهم صل علی محمد و ال محمد و عجل فرجهم
                              ; C is not for children

                              دیدگاه


                                #30
                                پاسخ : {آموزش} چگونه میشه میکرو رو ریست نرم افزاری کرد؟ ( ساده ترین راه حل )

                                نوشته اصلی توسط مهدی رهی
                                دوست عزیز ممنون بابت آموزش مفیدت
                                مورد زیر من رو گیج کرده:
                                اینکه میگی اگر آدرس 1 رو بهش بدیم وقفه صفر بدون پیش اومدن شرایطش رخ میده !
                                آدرس 1 (0x0001) مگه مربوط به وقفه INT0 نمیشه؟ oo:
                                خواهش میکنم دوست من.
                                دقیقا همونه .
                                منظور من هم همون وقفه ی خارجی صفر INT0 هستش.
                                به عنوان مثال برای اجرای تابع وقفه ی مربوط به TWI باید به اون تابع مقدار 0x0011 رو بدید.
                                برای جوینده ی علم محدودیتی نیست. "ولو بالسین"

                                دیدگاه

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