اطلاعیه

Collapse
No announcement yet.

هنگ کردن mega32

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

    #16
    پاسخ : هنگ کردن mega32

    ممنون
    برنامه وقتی کامپایل می شود 8 تا warning مده اما مربوط به جاهای دیگه است(توابعی که خوب کار می کنند) برنامه من 30kbyte است و گذاشتنش اینجا مقدور نیست

    دیدگاه


      #17
      پاسخ : هنگ کردن mega32

      سلام ................

      اون قسمتی که گفتید رو بذارید یا یه توضیحی در اون مورد بدید .
      دوستان! مدتی کمتر به سایت میام ..

      دیدگاه


        #18
        پاسخ : هنگ کردن mega32

        انگار نمی خوای مشکلت حل بشه.
        Difficult But possible
        به اميد ايراني آباد.
        http://art-net.ir

        دیدگاه


          #19
          پاسخ : هنگ کردن mega32

          من دو تا از تابع هامو حذف کردم تا درست شد:
          تو یکی که تو تایمر / کانتر 1 با زمان سریز 1 ثانیه اجرا می شود من 3 تا flagآ‌ئارم بعداز 2 ثانیه flag1 یک میشود بعد از 2 ثانیه flag1 صفر می شود بعد از 2 ثانیه flag2 یک می شود بعد از 2 ثانیه flag2 صفر می شود بعد از 2 ثانیه flag3آ‌یک می شود بعد از 2 ثانیه flag3 صفر می شود.
          در تابع دوم که در حلقه ( while(1 اجرا می شود flag های 1و2و3 چک می شود اگر هر یک از flag ها یک باشند یک متن روی LCD کاراکتری نشان می دهد
          :question: :angry:

          دیدگاه


            #20
            پاسخ : هنگ کردن mega32

            احیانا تابعی که نوشتی آخرش Return; گذاشتید.
            Difficult But possible
            به اميد ايراني آباد.
            http://art-net.ir

            دیدگاه


              #21
              پاسخ : هنگ کردن mega32

              نوشته اصلی توسط علی-
              احیانا تابعی که نوشتی آخرش Return; گذاشتید.
              فکر نکنم از اون باشه ، چون باید ایراد سینتکس میگرفت ، یا نهایتا warning میداد . ولی ایشون میگه که وارنینگ مال جای دیگه بوده .

              جناب "تراشه" بذارید یه کم روش فکر کنم ، خدمتتون عرض می کنم .
              دوستان! مدتی کمتر به سایت میام ..

              دیدگاه


                #22
                پاسخ : هنگ کردن mega32

                اگه JTag کنترل بکنید دیگه حل میشه.
                Difficult But possible
                به اميد ايراني آباد.
                http://art-net.ir

                دیدگاه


                  #23
                  پاسخ : هنگ کردن mega32

                  من MKII JTAG دارم اما مشکل اینجاست که LCD را به پورت c وصل کرده ام و ...

                  دیدگاه


                    #24
                    پاسخ : هنگ کردن mega32

                    خوب چند دلیل اصلی میتونه داشته باشه اوش اینه که توی اون لحظه STACK پر میشه
                    خوب STACK توی AVR و اکثر پردازنده های دیگه از ادرس بالا به سمت پایین پر میشه رجیستر stack pointer(اشاره گر پشته) به اخرین بایت push شده داخل پشته اشاره میکنه اولین قدم برای پیدا کردن این مشکل اینه که فایل با پسوند ASM رو در دایرکتوری برنامت باز کنی بعدش عبارت STACK POINTER INITIALIZATION رو سرچ کن تنظیمات اولیه STAK POINTER باید مثل زیر باشه

                    ;STACK POINTER INITIALIZATION
                    LDI R30,LOW(0x85F)
                    OUT SPL,R30
                    LDI R30,HIGH(0x85F)
                    OUT SPH,R30

                    دقت کن که عدد 0x85F اخرین بایت حافظه رمت است البته برای M32
                    بعدش باید مطمئن باشی که داده های برنامت با این STACK تداخل نداره برای روشنتر شدن فرض کن کامپایلرت یه متغیر رو در ادرس 0X850 ذخیره میکنه حالا اگر توی برنامت 8 تابع رو به صورت تو در تو فراخونی کنی (ممکنه تو خودت 8 تا رو به صورت تودرتو فراخونی نکنی و کامپایلر برات این دسته گل رو به اب بده) ادرس برگشت 8 امین تابع با اون متغیر تداخل پیدا میکنه در نتیجه اگه تو اون متغیر عددی رو بذاری موقع برگشت به جای ادرس واقعی برگشت برنامت به یه ادرسی که اصلا فکرش رو هم نمیتونی بکنی برمیگرده!
                    برای فهم بیشتر این تایپیک مفیده.
                    http://www.eca.ir/forum2/index.php?topic=18232.0

                    برای جلوگیری از این مشکل اگه برنامت فراخونی زیاد داره باید حداقل اون 5F اخر رم رو به هیچ عنوان استفاده نکنی (به اندازه 47 فراخونی تودرتو) که برای جلوگیری از این کار برو توی CONFIGURE در لبه مربوط به کامپایلرت DATA STACK SIZE رو که برایM32 خودش 512 بایت میذاره بذار 128 دقت کن که این اون پشته ای که از اون موقع راجع به اون بحث میکنیم نیست این یه پشته مجازیست که کامپایلر برای متغیر های محلی از اون استفاده میکنه و POINTER اون هم رجیستر Y که جز رجیسترهای WOKING است(R28,R29)
                    این پشته مجازی در ابتدای RAM تعریف میشه و توی فایل اسمبلی برنامت هم کامپایلر دقیقا بعد از پشته سخت افزاری تعریف میشه و اگه روی همون 512 بایت اولیه باشه اینطوریه
                    ;DATA STACK POINTER INITIALIZATION
                    LDI R28,LOW(0x260)
                    LDI R29,HIGH(0x260)

                    دقت کن که RAM از ادرس 0X60 شروع میشه و اگه 0X200 باقیمونده رو به مبنای 10 برگردونی همون 512 بایت میشه
                    خوب با تغییر این پشته به (256 یا 128) قصد داریم تمام داده هات رو به همین اندازه به بالا شیفت بدیم و از پشته اصلی دور کنیم
                    راه دیگه ای که وجود داره اینه که اگه حافظه FLASH کم نیاورد قسمت OPTIMIZE FOR رو روی SPEED بذار فراخونی های برنامت کم میشه.
                    کاری که FOR SIZE انجام میده اینه که چند خط از بزنامت رو که میبینه توی قسمت های مختلف شبیه همه خودش سرخود و بدون اینکه تو بخوای یه تابع درست میکنه و توی برنامت این تابع رو صدا میزنه حتی بعضی وقتها این توابع (که توی اسمبلی SUBROTIN نامیده میشن) کمتر از 3 دستور اسمبلی است که با عقل هیچ ادمیزادی جور درنمیاد که این کار رو بکنه ولی کامپایلر برای اینکه 6 بایت در حافظه FLASH صرفه جویی کنه این کار رو انجام میده و پردازش بیشتری رو به CPU تحمیل میکنه
                    بعضی جاهای دیگه هم بخصوص توی اعمال محاسباتی و شرطی برنامه رو به قدری میپیچونه که انسان در مقابل کامپایلر انگشت به دهن میمونه
                    این توابعی که الان ذکر خیرش بود توی اخر فایل اسمبلی (یعنی بعد از MAIN) دسته گل های کامپایلر با نامهای SUBOPT_0x0 و SUBOPT_0x1 و... البته اگه روی OPTIMIZE FOR SIZE باشه میتونی ببینی
                    این دو کار رو انجام بده انشالاه که مشکلت حله
                    من خودم 3 ساله که با اسمبلی AVR کار میکنم و این مشکلاتو به این صورت نداشتم ولی 2 سال پیش روی یه پروژه کار میکردم که و یه BUZZER هم با یه ترانزیستور به یکی از پایه های میکرو وصل بود و در شرایطی باید هر 5 ثانیه یک صدا ایجاد میکرد گاهی وقتها در همین موقع میکرو هنگ میکرد و ریست میشد اولش فکر کردم به خاطر کمبود جریانه که باعث افت ولتاژ میشه و ولتاژ میکرو از حد مجاز کمتر میشه و ریست میشه .
                    ولی بلاخاره به این نتیجه رسیدم که نوسان تولید شده به وسیله BUZZER که یه پایش مستقیم به + وصل بود باعث یه نویز خیلی شدید روی تغذیه میشد که میکرو رو ریست میکرد مقاومت بین خروجی میکرو و بیس ترانزیستور رو بیشتر کردم حل شد در حالی که من با PIC این مشکلو با همون مقاومت و ترانزیستور و BUZZER نداشتم.
                    این رو هم یاداوری کردم که بدونی نقش نویز توی عملکرد میکرو چقدر بالاست و میکروهای AVR هم طبق تجربیات شخصی من نویز پذیری بیشتری لاقل نسبت به PIC دارن. :eek:


                    Qt - A cross-platform application and UI framework

                    با کامپایلرهای قدرتمند GCC در Linux و MinGw در Windows

                    دیدگاه


                      #25
                      پاسخ : هنگ کردن mega32

                      سلام .................
                      اگه براتون امکان داره برای تایمر یک ثانیه از تایمر دو استفاده کنید . (با کریستال ساعت) . این کار باعث میشه که در گیری میکرو از بابت کلاک ساعت داخلی میکرو کمتر بشه .
                      بعد یه نکته ی دیگه . شما دو ثانیه ، دوثانیه flag ها رو بار گذاری می کنید ؟ درسته؟!
                      اگه این کار رو می کنید ، از سرریز تایمر در وقفه استفاده می کنید یا نه؟
                      از نوع منطقی که در روال برنامتون پیاده سازی شده ، فکر کنم به دلیل اینکه بلافاصله با بار گذاری flag ها کار می کنید ، این اتفاق میفته . یعنی عمل مقایسه در زمانی صورت می گیره که فاکتور مبنا در حال تغییره و این یه ناهماهنگی رو در روال قیاس ایجاد می کنه . ( اگه درست منظور برنامتون رو متوجه شده باشم) .
                      اگه سه تا متغییر جدا تعریف کنید که اینا وظیفه ی قفل کردن در زمان چک رو بر عهده بگیرن ، فکر کنم مشکل یه جورایی حل بشه . یعنی کاری کنید که در زمان بار گذاری یکی ، اون دو تای دیگه کاملا برن هواخوری!!!! این طوری فکر کنم دیگه مشل برطرف بشه .
                      در مورد نویز پذیری هم که جناب sallysat فرمودن باید بگم که درسته . من توی پروژه هایی که با AVR انجام میدم خیلی مراقب ایزوله کردن مدار هستم . اما این جواب ها بر فرض اینه که شما ایزو له کردن رو رعایت کرده باشین (اونم به خوبی ) . موفق باشید
                      دوستان! مدتی کمتر به سایت میام ..

                      دیدگاه


                        #26
                        پاسخ : هنگ کردن mega32

                        من با کمبود H/O روبرو هستم و نمی توانم از تایمر 2 استفاده کنم این پروژه یک LCDآ‌ یک keypad هشت تا کلید 2 تا خروجی رله 4تا خروجی تریاک 2 تا سنسور دما یک ورودی برای خواندن برق شهر یک ورودی برای خواندن ولتاژ ارت و ریموت کنترل مادون قرمز و... دارد!

                        دیدگاه


                          #27
                          پاسخ : هنگ کردن mega32

                          سلام ...............

                          عجب مداریه!!!! ببینید یه بار بدون رله مدارتون رو تست کنید ، اصولا رله میتونه مشکل ساز باشه . به خاطر جریانی که میکشه .
                          دوستان! مدتی کمتر به سایت میام ..

                          دیدگاه


                            #28
                            پاسخ : هنگ کردن mega32

                            تغذیه رله ها را از تغذیه برد اصلی جدا کرده ام

                            دیدگاه

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