اطلاعیه

Collapse
No announcement yet.

مشکل در پروگرام کردن بالای 30%در اتمگا 128

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

    مشکل در پروگرام کردن بالای 30%در اتمگا 128

    سلام
    دوستان وقتی که برنامه من از یه حدی (30% ) میکرو مگا 128 بالاتر میره ، بعد از پروگرام کردن روی میکرو دیگه اجرا نمیشه اما با زیر 30% مشکلی نداره . به نظر شما مشکل چیست ؟

    #2
    پاسخ : مشکل در پروگرام کردن بالای 30%در اتمگا 128

    من هم همین مشکل رو داشتم و حل نشد .لطفا جواب بدید
    نينيم به دنيا اومد

    دیدگاه


      #3
      پاسخ : مشکل در پروگرام کردن بالای 30%در اتمگا 128

      فکر میکنم ایراد از کرک کامپایلرتون
      کامپالر شما چیه ؟

      دیدگاه


        #4
        پاسخ : مشکل در پروگرام کردن بالای 30%در اتمگا 128

        نوشته اصلی توسط IRAN-HEX
        سلام
        دوستان وقتی که برنامه من از یه حدی (30% ) میکرو مگا 128 بالاتر میره ، بعد از پروگرام کردن روی میکرو دیگه اجرا نمیشه اما با زیر 30% مشکلی نداره . به نظر شما مشکل چیست ؟
        من این موضوع رو تو کامپایلرهای مختلفی دیدم، چند نکته هست که حتما به درد میخوره:
        1- در َAVR چون Data Stack, Return Stack و Heap همه در رم هستند و AVR هم قربونش برم MMU نداره، باید خیلی مواضب در استفاده از توابع malloc و توابع مشابه باشید تا Memory leakage نداشته باشید.

        2- فانکشن کالها باید از نظر نوشتاری نزدیک به هم باشند، چون پارسرها متاسفانه Function listing انجام نمیدن و چون Jump در اسمبلی محدودیت داره از نظر نوشتاری، فانکشنهایی که همدیگرو کال میکنن باید نزدیک به هم باشن( وقتی 200 کیلوبایت شد کدتون منظورم رو کاملا متوجه میشید)

        3-Handle کردن درست اینتراپتها، چون AVR در وقفه ها خاصیت Nested Interrupt نداره و همزمان نمیتونه دو و یا بیشتر وقفه رو اجرا کنه، هنگ میکنه چون Program counter و Return Stackش به هم میریزه، وقتی از دو یا چند پورت سریال استفاده کنید و روی وکتور هاشون کد بنویسید متوجه میشید که پس از مدتی با تداخل وقفه ها هنگ میکنه و راه حلش چیزی نیست جز غیر فعال کرد دیگر وقفه ها در همون وقفه ای که اتفاق افتاده و باز فعال کردنشون بعد از انجام دستورات.

        4-مطمئن باشید که با استفاده 30% ی هیچ اتفاقی برای 128 نمیفته، من با 120 کیلو کد و 4 کیلو بوتلودر هم روش جواب گرفتم وبعدش رفتم سراغ 2561، Watchdog رو فعال کنید و بعد از Reset علتش رو از رجیستر مربوطش بخونید. اگر بازم ریست نشد ایراد از کامپایلره و میکرو یه جایی تو Op-Code ها داره دور خودش میچرخه و به نظر شما هنگ کرده در حالی که داره کد حاصل از کامپایلر رو اجرا میکنه(بنده خدا).

        5- اصلا و ابدا از فانکشن کالهای Recursive استفاده نکنید، در استفاده از لیست پیوندی حتما خود پوینترها رو هم علاوه بر free برابر null قرار دهید.
        اگر از آرایه استفاده میکنید حتما Index Counter آرایه رو unsigned در نظر بگیرید که منفی نشه. حتما متغیرها رو اول کار Initialize کنید.

        بازم نکته هست.....اووووه......از کول افتادم
        در ضمن اگه برای کدتون Debugger بنویسید که خط به خط پیغام مثلا تو پورت سریال بده، راحت میفهمید که کجای کار ایراد داره.

        موفق باشید.
        اسمایل، تومورو ویل بی وُرس

        دیدگاه


          #5
          پاسخ : مشکل در پروگرام کردن بالای 30%در اتمگا 128


          سلام وقتتون بخیر و شادی .
          میبخشین وقتتون رو میگیرم .
          من با atmega 128 کار میکنم با نرم افزار بسکام . مشکل اینه که وقتی پورت سریال 1 رو کانفیگ میکنم به صورت سخت افزاری و در برنامه دستور print#1 رو مینویسم یایه ارسال داده در پورت سریال 0 به صروت خروجی فعال و یک میشود در حالی که من تمام پورت portE رو به صورت ورودی تعریف کردم .
          به دلیل شرایط سخت افزاری مجبور شدم از پورت 1 سریال 128 استفاده کنم .دلیل اینکه پایه tx0 یک میشود و به صورت خروجی فعال میشود رو نمیدونم
          ممنون میشم کمکم کنین تا دلیل این موضوع رو متوجه بشم که این دوتا پورت سریال که از هم مستقل هستند چرا همچین ناثیری پورت 1 در پورت 0 میذاره .
          سعی کردم کوتاه باشه تا وقتتون رو زیاد نگیره .نیاز به توضیح بیشتر هست بفرمایید .
          با تشکر فراوان منتظرم

          دیدگاه


            #6
            پاسخ : مشکل در پروگرام کردن بالای 30%در اتمگا 128

            از کتابخونه ای یا چیزیی استفاده میکنید؟
            اگه آره، آیا کتابخونه رو دید؟ ممکنه که روی پورتهای خروجی تغییراتی اعمال کنه. امکان نداره میکرو بدون دلیل این کارو بکنه!

            دیدگاه


              #7
              پاسخ : مشکل در پروگرام کردن بالای 30%در اتمگا 128

              یه چیزی هم میتونه باشه ...
              بعضی از پروگرامر های تو بازاز توانایی پروگرام کامل AVR های با حافظه بالا رو ندارن
              من خودم واسه این کار از MKII استفاده میکنم ، خوب هم جواب میگیرم
              دلا خو کن به تنهایی که از تنها بلا خیزد

              دیدگاه


                #8
                پاسخ : مشکل در پروگرام کردن بالای 30%در اتمگا 128

                سلام ممنون دوستان
                1_متوجه منظورتون نشدم که از کتابخونه استفاده میکنم یا نه برنامه من اینه .
                2_ من از پروگرامر هاتل usbاستفاده میکنم فکر میکنین این مشکل مربوط به پروگرامر هست .

                این یه برنامه نمونه:میبخشین چون کپی کردم نامرتب شد. اگه نیازی هست واستون میل کنم .
                توی این برنامه من پورت portE رو به صورت ورودی تعریف کردم .که در صورت صفر شدن Pine.1 به مقدار متغیر اضافه میشه و بعد از اینکه به 100 رسید همون رو ارسال میکنه از پورت 1
                اما pine.1 هیچ وقت صفر نمیشه و همیشه به صورت خروجی 1 هست . با وجود اینکه من این پایه رو دستی با صفر تحریک میکنم اجرا نمیشهیکبار هم شرط صفر شدن این پایه اجرا نمیشه .
                اگر در برنامه دستور Print #1 , Test_input_pine_1 رو حذف کنم برنامه به صورت عادی عمل میکنه و با صفر شدن pine.1 به مقدار متغییر اضافه میشه .
                همینجور که اول برنامه هم توضیح دادم pine.1 پایه ارسال داده هست برای پورت 0 ( TXD.0 PinE.1 ) اما اینجا من از پورت 0 استفاده ای نکردم. نمیدونم دلیلش چیه که اگر این دستور
                Print #1 , Test_input_pine_1 هر کجای برنامه نوشته شود دیگر این پایه pine.1 به صورت خروجی فعال و دائم 1 میشود .

                $prog &HFF , &H3F , &HCE , &HFF ' generated. Take care that the chip supports all fuse bytes.
                regfile = "m128def.dat"$
                $crystal = 20000000
                $hwstack = 128 ' default use 32 for the hardware stack
                $swstack = 128 ' default use 10 for the SW stack
                $framesize = 256 ' default use 40 for the frame space
                '/*********************************Config_LCD******* ****************************
                'LCD
                Config Lcdpin = Pin , Db4 = Pinf.7 , Db5 = Pina.0 , Db6 = Pina.2 , Db7 = Pina.1 , E = Pinf.5 , Rs = Pinf.6
                Config Lcd = 16 * 2
                Cls

                '(
                Pin_Lcd - name_pin - Pin_atmega128

                4 E 55_F.6
                6 RS 56_F.5
                11 DB4 54_F.7
                12 DB5 51_A.0
                13 DB6 49_A.2
                14 DB7 50_A.1
                &#039
                '/*********************************Config_SERIAL PORT**************************
                '(
                SERIAL PORT_1

                Pin_Main_Bord - name_pin - Pin_atmega128


                RXD.1 PinD.2 27

                TXD.1 PinD.3 28
                '---------------------------------------------------------
                SERIAL PORT_0
                RXD.0 PinE.0 2

                TXD.0 PinE.1 3
                &#039

                '---------------
                Open "com1:" For Binary As #1
                On Urxc1 Input_serial
                Enable Urxc1
                $baud1 = 9600
                Enable Interrupts
                '/*********************************Config_Shasi Floor**************************

                Config Porte = Input
                Porte = 255 : Ddre = 0
                ' PULL-UP RESISTOR(NO EXTERNAL RESISTOR NEEDED)
                '/*********************************Config_LED_Shasi_ OUT_FLoor*******************
                Dim Test_input_pine_1 As Byte
                Dim Recive_serial As Byte

                Do

                If Pine.1 = 0 Then
                Incr Test_input_pine_1 : Waitms 200
                End If
                Home : Lcd Test_input_pine_1 ; "^" ; Recive_serial ; "^"
                If Test_input_pine_1 = 100 Then
                Test_input_pine_1 = 0 : Print #1 , Test_input_pine_1
                End If


                Loop


                '/************************************************** ****************************

                Input_serial:
                Recive_serial = Udr1
                Return


                دیدگاه

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