اطلاعیه

Collapse
No announcement yet.

هنگ میکرو دراجرای برنامه های تو درتو

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

    هنگ میکرو دراجرای برنامه های تو درتو

    سلام بر همه مهندسان عزیز:
    بنده خلیلی وقته یه برنامه ای نوشتم و چند سالی ازش بدون مشکل برای شرایط صنعتی ازش استفاده می کنم. .اما جدیدا مشتریان ما از یک مشکل شکایت می کنند.درمانده شدم.(البته 2ماهی میشه که تعییراتی دادم )
    و اما مشکل:
    برنامه رو با بیسیک نوشتم.وبه این صورت هست که وقتی وارد منوی تنطیمات می شویم بصورت تو در تو باید با دستورgosub زیر منوهارو فراخوانی کرده و مقادیرمتعیر هارو تعییر می دهیم.امما مشکل اینجاست که وقتی بار اول وارد میشیم مشکلی پیش نمیاد.برای بارهای بعدی تا یه چند بار که وارد میشیم و خارج میشیم بز هم مشکلی ایجاد نمیشه اما مثلا 10بار که بریم تو تنظیمات بار 11میکرو ناجور هنگ میکنه و در شرایط هنگ باقی میمونه تا ریست بشه .من نمی دونم چرا اینجوریه؟
    نکته 1:وقتی مقادیر stack را تعییر میدم مثلا از روی 100 به 150تعییر میدم در این شرایط هنگ میکرو به 15 بار اجرای فراخوانی منوهای توتو ختم میشه.
    نکته 2:وقتی کریستال که بعد از معرفی ای سی میدم هم زیاد می کنم باز هم این منوهای تو تودر تو که اجرا میشه برای تعداد بیشتری اجرا شده و هنگ میکنن.
    نکته3:در هنگام هنگ میکرو به اصل برنامه نمی رسه به نظر میرسه در همون اول برنامه داره ریست میشه چون در اول برنامه و قبل از تابع اصلی یه چیزی تو ال سی دی نمایش داده میشه همون مرتب میاد(شاید کار تایمر نگهبان باشه)ولی در شرایط معمولی این اتفاق نم یافتته .
    eshop-hodhod.ir

    #2
    پاسخ : هنگ میکرو دراجرای برنامه های تو درتو

    سلام دوست عزیز
    شما دستوراتی که استفاده کردی رو ارسال کن
    تا دوستان و شاید بنده بتونیم مشکل رو حل کنیم
    موفق باشی
    برای آنکه کاری امکان پذیر گردد دیدگان دیگری لازم است، دیدگانی نو

    دیدگاه


      #3
      پاسخ : هنگ میکرو دراجرای برنامه های تو درتو

      نوشته اصلی توسط Namvar14 نمایش پست ها
      سلام بر همه مهندسان عزیز:
      بنده خلیلی وقته یه برنامه ای نوشتم و چند سالی ازش بدون مشکل برای شرایط صنعتی ازش استفاده می کنم. .اما جدیدا مشتریان ما از یک مشکل شکایت می کنند.درمانده شدم.(البته 2ماهی میشه که تعییراتی دادم )
      و اما مشکل:
      برنامه رو با بیسیک نوشتم.وبه این صورت هست که وقتی وارد منوی تنطیمات می شویم بصورت تو در تو باید با دستورgosub زیر منوهارو فراخوانی کرده و مقادیرمتعیر هارو تعییر می دهیم.امما مشکل اینجاست که وقتی بار اول وارد میشیم مشکلی پیش نمیاد.برای بارهای بعدی تا یه چند بار که وارد میشیم و خارج میشیم بز هم مشکلی ایجاد نمیشه اما مثلا 10بار که بریم تو تنظیمات بار 11میکرو ناجور هنگ میکنه و در شرایط هنگ باقی میمونه تا ریست بشه .من نمی دونم چرا اینجوریه؟
      نکته 1:وقتی مقادیر stack را تعییر میدم مثلا از روی 100 به 150تعییر میدم در این شرایط هنگ میکرو به 15 بار اجرای فراخوانی منوهای توتو ختم میشه.
      نکته 2:وقتی کریستال که بعد از معرفی ای سی میدم هم زیاد می کنم باز هم این منوهای تو تودر تو که اجرا میشه برای تعداد بیشتری اجرا شده و هنگ میکنن.
      نکته3:در هنگام هنگ میکرو به اصل برنامه نمی رسه به نظر میرسه در همون اول برنامه داره ریست میشه چون در اول برنامه و قبل از تابع اصلی یه چیزی تو ال سی دی نمایش داده میشه همون مرتب میاد(شاید کار تایمر نگهبان باشه)ولی در شرایط معمولی این اتفاق نم یافتته .
      دوسته عزیز مشکلاتون به احتمال زیاد اینه که وقتی با gosub میپرین میرین تو یه تابع دیگه باید بعد از اتمام اون تابع برگردین به تابع قبل . نه اینکه بیاید در اون تابع باز هم بپرید برید یه تابع دیگه و از اون تابع بپرید برید تابع دیگه و ... چون پرش از تابع قبل که کردید منتظر هست تا دوباره برگردید و اون حافظه اختصاص داده رو آزاد کنه - وقتی که شما همچنان در حال پرش هستید حافظه جدید و در نهایت باعث پرشدن حافظه و هنگ میشه دیگه.
      من خودم تو یه پروژه ای 4500 خط با بسکام کد نوشتم حتی یبار هم از هیچیک از دستورات پرش استفاده نکردم . سعی کنید بیشتر از حلقه و if استفاده کنید . حلقه های تو در تو . که مثلا اگه این حلقه شرطش درست نیست بره داخل سه حلقه دیگه و ... .
      در ضمن میتونید watchdog میکروتون رو فعال کنید و دستور reset watchdog رو هرجایی از برنامه که حلقه داره و قرار بدید . و حداکثر زمان واتچداگ که میتونه تقریبا 2 ثانیه باشه- پس delay بیشتر از این 2 ثانیه نداشته باشید و و اگه نیاز شد بیاید از for next برای وقفه استفاده کنید و reset watchdog رو داخل این for بنویسید . تا اگه هنگی رخ داد اتومات ریست شه میکروتون .

      به نظر من برای حل این مشکل باید جای gosub و هر دستور پرش دیگه بیاید الگوریتم برنامتون رو تغییر دهید.
      موفق باشید.
      به سمت نور خورشيد حرکت کن،تو ميتوني تابش خورشيد رو حس کني ،حتي اگه کور باشي.
      (پيش به سوي هدف)

      دیدگاه


        #4
        پاسخ : هنگ میکرو دراجرای برنامه های تو درتو

        نوشته اصلی توسط hossein_tomari007 نمایش پست ها
        سلام دوست عزیز
        شما دستوراتی که استفاده کردی رو ارسال کن
        تا دوستان و شاید بنده بتونیم مشکل رو حل کنیم
        موفق باشی
        دوستان فرمودن نمونه کد بذار،باید بگم که کد زیاده اگه کد بذارم به دلیل پیچیدگی مطمینمن کسی نمی خونه.ولی من هم کد اصلی رو میذارم و هم اینکه خلاصه شده کد اصلی رو اینجا میذرم.
        کد:
        $regfile = "m16def.dat"
        $crystal = 8000000
        $hwstack = 80
        $swstack = 80
        $framesize = 100
        '***********************
        Config Watchdog = 2048
        Start Watchdog
        '----------------------
        Main:
        
        Do
        '
        '
        'dastorat barname
        '
        
        If Pina.0 = 0 Then Gosub Tab1
        Loop
        End
        '***********************
        Tab1:
        Do
        '
        '
        If Pina.0 = 0 Then Gosub Tab2
        Loop
        Return
        '***********************
        Tab2:
        Do
        '
        '
        If Pina.0 = 0 Then Gosub Tab_n
        Loop
        Return
        '***********************
        '
        
        '***********************
        Tab_n:
        Do
        '
        '
        '
        '
        If Pina.0 = 0 Then Gosub Main
        Loop
        Return
        '***********************
        eshop-hodhod.ir

        دیدگاه


          #5
          پاسخ : هنگ میکرو دراجرای برنامه های تو درتو

          اینم اصل برنامه.
          http://s8.picofile.com/file/8314588318/noname2.rar.html
          eshop-hodhod.ir

          دیدگاه


            #6
            پاسخ : هنگ میکرو دراجرای برنامه های تو درتو

            دوستان عزیز لطف کنید.منتظرم.اگه برنامه نیازی به توضیح داشت درخدمتم.
            eshop-hodhod.ir

            دیدگاه


              #7
              پاسخ : هنگ میکرو دراجرای برنامه های تو درتو

              نوشته اصلی توسط Namvar14 نمایش پست ها
              دوستان عزیز لطف کنید.منتظرم.اگه برنامه نیازی به توضیح داشت درخدمتم.
              اینم یه نمونه کد. سعی کردم الگوریتم تا حدودی بهتون بگم. اگه دقت کنی میبینی که همه سابروتین ها پایان میابند و برمیگردن به روتین قبلی تا درنهایت برسن به حلقه ی main .
              بنابراین همه حافظه درخاست شده با بازگشت پاک میشن.(منظورم قابل استفاده برای فراخانی بعدی ).

              کد:
              $regfile = "m16def.dat"
              $crystal = 8000000
              $hwstack = 80
              $swstack = 80
              $framesize = 100
              '***********************
              Config Watchdog = 2048
              Start Watchdog
              
              '***
              Config Debounce = 15
              '----------------------
              
              Declare Sub Tab1
              Declare Sub Tab2
              Declare Sub Tab_n
              Declare Sub Test
              
              
              
              Dim Flagtest As Bit
              
              
              '--------------------
              '>>>>>>MAIN LOOP <<<<<<<<
              
              Do
              '
              Reset Watchdog
              '
              'dastorat barname
              '
              
               Debounce Pina.0 , 0 , Tab1 , Sub
              
              Loop
              End
              '***********************
              
              
              Sub Tab1
              
               Do
               Reset Watchdog
              '
                Debounce Pina.0 , 0 , Tab2 , Sub
               Loop
              
              End Sub
              '***********************
              
              
              
              Sub Tab2
              
               Do
                Reset Watchdog
              '
                Debounce Pina.0 , 0 , Tab_n , Sub
              
               Loop
              
              End Sub
              '***********************
              '
              
              '***********************
              
              
              Sub Tab_n
              
               Do
               Reset Watchdog
              '
              '
              '
                Debounce Pina.0 , 0 , Test , Sub
              
                If Flagtest = 1 Then
                 Flagtest = 0
                 Exit Do                                                  'az halqe do loop mire biron. va chon bade loop code ii nist be sub ham khateme mide
                End If                                                    'va barmigarde be sub qabli va hamintor az on sub be saub qable khodesh ta berese be sub asli.
              
              
               Loop
              
              End Sub
              '***********************
              
              
              Sub Test
              
               Flagtest = 1
              
              
              
              End Sub

              در ضمن سعی کنید کدتون رو یکم خاناتر بنویسید - متغییر ها رو درست نامگذاری کنید تا از اسمش بشه کارشو فهمید یا بیاید از alias برای نامگزاری پینها استفاده کنید . راستش الان من حدس زدم که pina که شما نوشتین به یه کلید وصله.- اگه بخوایید پشت هم و فاصله گذاری نکنید و یا مثلا دستوراتی که بعد از if میآد رو با یه tab جلوتر ننویسید بعدا تو خانایی به مشکل جدی بر میخورید. من که به استاندارد سی/سی++ عادت کردم و همه ی کد ویزال بیسیک رو از لحاظ ظاهری سعی میکنم مثل کامپایلرهای سی/سی++ بنویسم تا بتونم راحت اشکال یابی کنم.
              جدیدترین ویرایش توسط hosseinam; ۱۷:۰۶ ۱۳۹۶/۰۹/۲۷.
              به سمت نور خورشيد حرکت کن،تو ميتوني تابش خورشيد رو حس کني ،حتي اگه کور باشي.
              (پيش به سوي هدف)

              دیدگاه


                #8
                پاسخ : هنگ میکرو دراجرای برنامه های تو درتو

                نوشته اصلی توسط hosseinam نمایش پست ها
                اینم یه نمونه کد. سعی کردم الگوریتم تا حدودی بهتون بگم. اگه دقت کنی میبینی که همه سابروتین ها پایان میابند و برمیگردن به روتین قبلی تا درنهایت برسن به حلقه ی main .
                بنابراین همه حافظه درخاست شده با بازگشت پاک میشن.(منظورم قابل استفاده برای فراخانی بعدی ).

                کد:
                $regfile = "m16def.dat"
                $crystal = 8000000
                $hwstack = 80
                $swstack = 80
                $framesize = 100
                '***********************
                Config Watchdog = 2048
                Start Watchdog
                
                '***
                Config Debounce = 15
                '----------------------
                
                Declare Sub Tab1
                Declare Sub Tab2
                Declare Sub Tab_n
                Declare Sub Test
                
                
                
                Dim Flagtest As Bit
                
                
                '--------------------
                '>>>>>>MAIN LOOP <<<<<<<<
                
                Do
                '
                Reset Watchdog
                '
                'dastorat barname
                '
                
                 Debounce Pina.0 , 0 , Tab1 , Sub
                
                Loop
                End
                '***********************
                
                
                Sub Tab1
                
                 Do
                 Reset Watchdog
                '
                  Debounce Pina.0 , 0 , Tab2 , Sub
                 Loop
                
                End Sub
                '***********************
                
                
                
                Sub Tab2
                
                 Do
                  Reset Watchdog
                '
                  Debounce Pina.0 , 0 , Tab_n , Sub
                
                 Loop
                
                End Sub
                '***********************
                '
                
                '***********************
                
                
                Sub Tab_n
                
                 Do
                 Reset Watchdog
                '
                '
                '
                  Debounce Pina.0 , 0 , Test , Sub
                
                  If Flagtest = 1 Then
                   Flagtest = 0
                   Exit Do                                                  'az halqe do loop mire biron. va chon bade loop code ii nist be sub ham khateme mide
                  End If                                                    'va barmigarde be sub qabli va hamintor az on sub be saub qable khodesh ta berese be sub asli.
                
                
                 Loop
                
                End Sub
                '***********************
                
                
                Sub Test
                
                 Flagtest = 1
                
                
                
                End Sub

                در ضمن سعی کنید کدتون رو یکم خاناتر بنویسید - متغییر ها رو درست نامگذاری کنید تا از اسمش بشه کارشو فهمید یا بیاید از alias برای نامگزاری پینها استفاده کنید . راستش الان من حدس زدم که pina که شما نوشتین به یه کلید وصله.- اگه بخوایید پشت هم و فاصله گذاری نکنید و یا مثلا دستوراتی که بعد از if میآد رو با یه tab جلوتر ننویسید بعدا تو خانایی به مشکل جدی بر میخورید. من که به استاندارد سی/سی++ عادت کردم و همه ی کد ویزال بیسیک رو از لحاظ ظاهری سعی میکنم مثل کامپایلرهای سی/سی++ بنویسم تا بتونم راحت اشکال یابی کنم.
                سلام این اصل برنامه من نیست.اصل برنامه لینک بالا گذاشتم و دقیقا همونی هست که شما گفتید .البته درمورد متعیر ها و نام گذاری با alias
                eshop-hodhod.ir

                دیدگاه


                  #9
                  پاسخ : هنگ میکرو دراجرای برنامه های تو درتو

                  نوشته اصلی توسط hosseinam نمایش پست ها
                  اینم یه نمونه کد. سعی کردم الگ
                  خوب درسته باید هنگ کنه داری پشته رو پر میکنی !
                  وقتی یک ساب پروگرام را کال میکنی حتما باید با دستور ریترن خارج شوی شما وقتی که یک ساب را کال میکنی از داخل ان با دستور گو تو میپری به یک ساب دیگه !!!
                  اما در برنامه ات دقیقا اینجا داری ضرر میکنی Gosub Mainچون رونین مین یک ساب نیست که داری کال میکنی
                  اقا من اشتباه این پست را روی پست اقای حسینیم نقل قول کردم شرمنده. مربوط به پست نامور هست
                  جدیدترین ویرایش توسط kamy007; ۰۰:۴۴ ۱۳۹۶/۰۹/۲۸.

                  دیدگاه


                    #10
                    پاسخ : هنگ میکرو دراجرای برنامه های تو درتو

                    نوشته اصلی توسط Namvar14 نمایش پست ها
                    سلام این اصل برنامه من نیست.اصل برنامه لینک بالا گذاشتم و دقیقا همونی هست که شما گفتید .البته درمورد متعیر ها و نام گذاری با alias
                    بله. منم در حالت کلی گفتم .

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

                    کلا خیلی خیلی کم میبینیم که حتی تو برنامه نویسی های سطح بالا و میانی مثلا جاوا سی شارپ و سی++ که برای توسعه نرمافزار اندروید یا ویندوز و ... استفاده میشه بیان از دستورات پرش استفاده کنن.کلا حذف کردن. حالا تو دستورات اسمبلی بنده اطلاعاتی ندارم .

                    موفق باشید/
                    به سمت نور خورشيد حرکت کن،تو ميتوني تابش خورشيد رو حس کني ،حتي اگه کور باشي.
                    (پيش به سوي هدف)

                    دیدگاه


                      #11
                      پاسخ : هنگ میکرو دراجرای برنامه های تو درتو

                      نوشته اصلی توسط hosseinam نمایش پست ها
                      بله. منم در حالت کلی گفتم .

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

                      کلا خیلی خیلی کم میبینیم که حتی تو برنامه نویسی های سطح بالا و میانی مثلا جاوا سی شارپ و سی++ که برای توسعه نرمافزار اندروید یا ویندوز و ... استفاده میشه بیان از دستورات پرش استفاده کنن.کلا حذف کردن. حالا تو دستورات اسمبلی بنده اطلاعاتی ندارم .

                      موفق باشید/
                      gosub خطر زیادی نداره.چون من خونده بودم که gotoو jamو ...خیلی خطرناک هستن.البته این بخش از برنامه من فقط موقع انجام تنطیمات توسط کاربرانجام میشه ،و حالا اگه خطری هم باشه کاربر اونجا ست.ولی در یک بخش از برنامه که برای راه اندازی سنسوراستفاده میشه و برنامه نویسش اقای علیرضا جودی عزیز هست و فقط با دستورات gosub نوشته و تاکید دارند که موقع پرش فقط ازgosub استقاده بشه.ولی این پرش ها خیلی سازمان یافته انجام شده و به گونه ای هست که در حین بررنامه در هرثانیه شاید 100تا پرش باgosub انجام بشه و مشکلی پیش نمیاد.الان که دوستان توضیح دادند،متوجه شدم که درهر پرش gosub باید به سر جاش برگرده.البته باید بگم که دیگه مشکل قبلی برای من پیش نمیاد.واقعا ممنون از همه دوستان عزیز.,ولی منابع برای توضیحات برنلمه نویسی ساخت یافته کامل نیست.خیلی کتاب ها خودم و مطالعه من هم بدک نیست.اینو ندیده بودم.حتی موقعی که هنگ میکرد متوجه پر بدن حافظه پشته می شدم ولی خوب همش به این فک می کردم که با یک دستور این حافظه رو تخلیه کنم.
                      جدیدترین ویرایش توسط Namvar14; ۲۳:۲۹ ۱۳۹۶/۰۹/۲۸.
                      eshop-hodhod.ir

                      دیدگاه

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