اطلاعیه

Collapse
No announcement yet.

مشکل در روند اجرای یک حلقه با چند شرط در میکروی واقعی

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

    مشکل در روند اجرای یک حلقه با چند شرط در میکروی واقعی

    سلام
    من در این حلقه شروط ها را بر اساس 3 ورودی با توجه به لبه پایین رونده در پایه های Pd.2 , Pd.3 , Pd.4 یک مگا8 نوشتم ولی میکرو به آنی که شرط اول را خواند بدون اینکه سوئیچ متصل به آن پایه تا زمین مدار فشرده شده باشه برنامه مربوط به آن شرط اجرا میکنه خب به نظر شما مشکل از چی میتواند باشد؟
    (این تکه ای از برنامه من هست پیکربندی پین های ورودی، تغییر نام آنها و زمان تاخیر به متغییر آن اختصاص داده شده)



    کد:
    Menu:
    
    Cls
    Locate 1 , 6
    Lcd "Select"
    Locate 2 , 1
    Lcd "Lock Menu Temp"
    Do
    If Lsw = 0 Then
      Waitms Wms
      Gosub Chl
      End If
    If Ssw = 0 Then
      Waitms Wms
      Goto Menu1
      End If
    If Rsw = 0 Then
      Waitms Wms
      Gosub Adc
      Goto Menu
      End If
    Loop

    #2
    پاسخ : مشکل در روند اجرای یک حلقه با چند شرط در میکروی واقعی

    اگر Lsw و Ssw و Rsw
    به صورت
    alias
    برای پورت ها تعیین شده باشند

    برنامه کاملا درست هست موارد زیر رو چک کنید که انشالله مشکلتون حل بشه(با توجه به محدود بودن کدها کلی می گم)
    1-ابتدا پورت ها رو باید به صورت ورودی تعریف کنید و بعد alias کنید
    2-اگر می خواید با سطح صفر دستوراتتون اجرا بشه باید از قبل پورت مورد نظر با یک مقاومت 10 کیلو پول پ شده باشه و با اعمال پالس با لبه کمتر پورت رو به سطح منطقی صفر ببرید
    3-بهتر در انتهای حلقه یک تاخیر رو 1 میلی ثانیه رو اعمال کنید
    4-اگر از کلید استفاده می کنید حتما روی دو سر کلید یک خازن 100 نانو فاراد قرار بدین
    5-مطمئن از عملکرد صحیح میکرو و پروگرام کردن صحیح ان بشید
    6-از لحظا نویز مدارتون رو چک کنید که احیانان منابع نویز باعث ایجد خط صفر روی مدار نشود
    هیچ دانش آموزی نیست که به در خانۀ دانشمندی آمد و شد کند, مگر این که خداوند برای هر گامی که برمی دارد عبادت یک سال را برایش رقم زند.

    دیدگاه


      #3
      پاسخ : مشکل در روند اجرای یک حلقه با چند شرط در میکروی واقعی

      صددرصد مشکل به خاطر نبود پول پ هستش .
      خازن هم بذاری خیلی خوب میشه

      دیدگاه


        #4
        پاسخ : مشکل در روند اجرای یک حلقه با چند شرط در میکروی واقعی

        البته بگم که در کامپایل این برنامه هیچ خطایی ندارم پروتئوس هم به خوبی کار شبیه سازی را بدون هیچ مشکلی انجام میده.
        1) پورت های ورودی

        کد:
        Ddrd.0 = 0 : Portd.0 = 1
        Ddrd.1 = 0 : Portd.1 = 1
        Ddrd.2 = 0 : Portd.2 = 1
        Ddrd.3 = 1
        Ddrd.4 = 1
        Ddrd.5 = 1
        Ddrd.6 = 1 : Portd.6 = 1
        
        Lsw Alias Pind.0
        Ssw Alias Pind.1
        Rsw Alias Pind.2
        1) کلا بهتره با کدام سطح کار کنم 0 یا 1 به ورودی بدم؟
        2) پول پ به همون مقاومت 10k میگن یا قطعه دیگه ای هم هست؟ لطفا درباره پالس با لبه کمتر کمی توضیح بفرمایید؟
        4) از SW استفاده می کنم ظرفیت خازن بر اساس خاصی تایین میشه؟
        5) خطایی در پروگرم ندارم.
        6) سخت افزار روی بردبرد دارای (ال سی دی، میکرو، اسیلاتور کریستالی، lm335 , l7805 ) هستش ممکنه نویزی از سمت این ها پیش بیاد

        دیدگاه


          #5
          پاسخ : مشکل در روند اجرای یک حلقه با چند شرط در میکروی واقعی

          مقاومت پول پ یه مقاومته که به اون پین وصل میشه تا رو هوا نباشه . با برنامه ریزی DDRX , PORTX پول پ داخلی رم میشه تو avr فعال کرد .

          اون برنامه ای که شما نوشتین به لبه مربوط نمیشه . برنامه ی شما همواره چک میکنه هر موقع او پایه 0 شد ، عمل کنه .
          مفهوم لبه در وقفه ی خارجی هستش . شما تو برنامتون از لبه استفاده نکردین .

          دیدگاه


            #6
            پاسخ : مشکل در روند اجرای یک حلقه با چند شرط در میکروی واقعی

            1) منظور شما از برنامه ریزی DDRX , PORTX جهت راه اندازی پول پ داخلی به چه شکله لطفا مثالی بزنید.
            2) من برام مهمه که در صورتیکه کلید فشرده شد شرط مربوط به آن اجرا بشه حال آنکه بدون فشردن هیچ کلیدی میکرو از حلقه خارج میشد
            3) کمی هم درباره لبه و وقفه و مثالی کاربردی از آن بیان بفرمایید ممنون میشم چون می خواهم بدونم مزیت در استفاده از کدام حالت هست (0یا1) یا لبه به ورودی بدم ؟

            دیدگاه


              #7
              پاسخ : مشکل در روند اجرای یک حلقه با چند شرط در میکروی واقعی

              اگر بیت PUD در رجیستر SFIOR صفر باشه و مثلا DDRA=0xFF و PORTA=0xFF باشه تمام مقاومت بالاکش داخلی همه پینهای پورت A فعال میشن .

              فکر کنم فرقی در مزیت نداشته باشن . در این باره چیز خاصی نمی دونم .

              وقفه بر خلاف برنامه ی شما وضعیت یک پین رو بررسی نمی کنه . بلکه هر موقع یک لبه ی بالا رونده یا پایین رونده (بسته به تنظیمات) به اون پایه اعمال شد ، به subroutine مربوطه پرش کرده و دستورات نوشته شده در اونو اجرا میکنه .
              فرض کنیم با لبه ی پایین رونده کار میکنه . خوب قبل از زدن کلید تکلیف اون پایه باید معلوم باشه . یعنی 1 باشه . واسه همین از مقاومت پول پ استفاده میشه .

              در ضمن مگه مدارتون خونه نیست . پول پو امتحان کردین یانه که ببینین اون مشکلو بازم میده یا نه ؟

              من بسکام بلد نیستم . اون Wms چیه . نکنه تاخیرش خیلی که ، فکر می کنین کار نمی کنه ؟

              دیدگاه


                #8
                پاسخ : مشکل در روند اجرای یک حلقه با چند شرط در میکروی واقعی

                وقتی از مقاومت پول پ استفاده کردم بدون معطلی و حتی فشردن سوئیچ اولین شرط را اجرا کرد که این بازم همون مشکل منه.
                مقدار 250 را به متغیی Wms اختصاص دادم تا به میلی ثانیه در هربار فشردن کلید تاخیر بوجود بیاد تا انگشت از روی کلید برداشته بشه

                دیدگاه


                  #9
                  پاسخ : مشکل در روند اجرای یک حلقه با چند شرط در میکروی واقعی

                  این دفعه که مدار رو با همون مقاومت پول پ دوباره راه انداختم مشکل حل شد ( ) ممنون از راهنمایی مفیدتون
                  یک سوال دیگه. برای بدست آوردن دمای محیط من از LM35 استفاده کردم و پایه اولی از ADC ها، برنامه زیر می تونه دمای دقیق محیط رو تشخیص بده؟


                  کد:
                  Adc:
                     Do
                      Start Adc
                      Temp = Getadc(0)
                      Ti = Temp * .488758553
                      Temp = Round(ti)
                      Stop Adc
                      Waitms 200
                      Cls
                      Lcd Temp ; Chr(4) ; "C"
                     Loop

                  دوم ) دستور JMP و CALL چه تفاوت یا مزیتی نسبت به GoSub داره اگر ممکنه مثالی هم بفرمایید ممنون میشم

                  دیدگاه


                    #10
                    پاسخ : مشکل در روند اجرای یک حلقه با چند شرط در میکروی واقعی

                    برای اندازه گیری دقیق نکات زیر رو حتمن باید رعایت کنی
                    از سالم بودن منبع تغذیه کاملن مطمئن شوید ( بیشتر منظور نویز و ولتاژ ریپل ولتاژ خروجی منبع و .... است )
                    از اون سلف و خازن در مدار avcc حتمن استفاده کنید
                    با وجود اینکه تمام این موارد رو رعایت می کنید باز هم یه کمی نویز و خطا وجود داره
                    برای رفع اون ها که تقریبن چاره ای براش نیست از نومنه گیری بیشتری استفاده کنید
                    مثلن 10 بار یه مقدار رو اندازه بگیرید بعدش تقسیم بر 10 کنید اینهم به مقدار دقت کمک می کنه


                    دستور gosub فراخوانی زیر برنامه با بازگشت ه
                    دستور goto فراخوانی برچسب بدون بازگشت به محل برش ه
                    دستور call فراخوانی یه زیر برنامه با بازگشت ه که توی اون میشه تابع و ... هم کار کرد





                    اگه مردم می دونستن زمان چقدر با ارزشه دیگه هیچ وقت کفش بند دار نمی خریدن البرت انیشتن

                    دیدگاه


                      #11
                      پاسخ : مشکل در روند اجرای یک حلقه با چند شرط در میکروی واقعی

                      1) یعنی 10 بار از دستور GETADC(0) با فاصله زمانی کوتاه استفاده و آنرا درون ده متغییر متفاوت و بعد میانگین آنها را در 0.488758553 ضرب کنم؟
                      2) JMP و Call نیاز به Return هم دارن؟
                      3) در یک حلقه در جای دیگری از برنامه که شروط آن بر اساس مقدار متغییر Temp (در زیر برنامه ADC: که نوشتم) احتیاج هست بهتره برای بررسی هرلحظه زیربرنامه ADC: از کدامیکی (Gosub , Call , JMP) استفاده نمایم؟

                      دیدگاه


                        #12
                        پاسخ : مشکل در روند اجرای یک حلقه با چند شرط در میکروی واقعی

                        نوشته اصلی توسط jahromy
                        1) یعنی 10 بار از دستور GETADC(0) با فاصله زمانی کوتاه استفاده و آنرا درون ده متغییر متفاوت و بعد میانگین آنها را در 0.488758553 ضرب کنم؟
                        2) JMP و Call نیاز به Return هم دارن؟
                        3) در یک حلقه در جای دیگری از برنامه که شروط آن بر اساس مقدار متغییر Temp (در زیر برنامه ADC: که نوشتم) احتیاج هست بهتره برای بررسی هرلحظه زیربرنامه ADC: از کدامیکی (Gosub , Call , JMP) استفاده نمایم؟

                        1- نه می تونی تمام اون 10 تا رو توی یک متغیر بریزی و با هم جمع کنی و بعد تقسیم بر 10 کنی
                        02- JMP رو نمیدونم ولی CALL توی زیر برنامه کاربرد داره و با دستور END SUB برگشت می کنه
                        3- به نظر من CALL
                        اکثر برنامه نویس ها ترجیح می دن یه سری از عملیات در زیر روال خودش انجام بشه
                        مثلن

                        فرض کن یه دریل عملیات سوراخ کاری روی یه قطعه رو 100 بار میخواد انجام بده البته در مکان های مختلف
                        برنامه نویسی صحیح اینه که برنامه سوراخ کاری رو در یه زیر روال بنویسی و 100 بار فراخانی کنی
                        با همین مثال و یه کمی ذهن خلاق تر می تونی برنامه های بهتری بنویسی


                        اگه مردم می دونستن زمان چقدر با ارزشه دیگه هیچ وقت کفش بند دار نمی خریدن البرت انیشتن

                        دیدگاه

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