اطلاعیه

Collapse
No announcement yet.

سرعت اجرای دستورات avr

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

    سرعت اجرای دستورات avr

    با سلام
    من یک برنامه نوشتم که شکل موج دندانه اره ای تولید میکنه و این کار رو با تایمر انجام میدم.
    مثلا فرض کنید هر 100us باید به زیر برنامه تولید موج بپرم پس باید تایمر تنظیم شود و من این کار رو با دقت بالا انجام دادم اما یک مشکل:
    وقتی این زمان مثلا 10us میشه میکرو با دقت موج رو تولید نمیکنه البته خود اجرای هر خط دستور 1us زمان میبره که من این رو هم در نظر گرفتم اومدم به جای کریستال 12M کریستال 16M گذاشتم یک مقدار بهتر شد ولی خوب باز هم به دقت مورد نظر نرسیم.(تمام محاسبات دقیق دقیق هست شک نکنید)ولی میکرو رفتار ثابتی ندارد.
    یکی از مواردی که به ذهنم خورد اینکه به جاری نوشتن دستورات بیسیک از دستورات اسمبلی استفاده کنم آیا فایده ای دارد؟
    راه حل؟ :cry2:
    من خیلی زحمت کشیدم تقزیبا 4 هفته اما دقتش بالا نیست. :cry2: :cry2: :cry2: :cry2:
    با تشکر

    #2
    پاسخ : سرعت اجرای دستورات avr

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

    دیدگاه


      #3
      پاسخ : سرعت اجرای دستورات avr

      دوستان اگر ممکنه این چند خط برنامه زیر رو به بهترین حالت به اسمبلی تبدیل کنید:
      میخوام در بسکام بنویسم.
      میکرو atmega16 هست.
      زیر برنامه wave خیلی مهم هست.
      زیربرنامه prog مربوط به بخش سریال هست و فکر کنم نیازی به تبدیلش نیست.
      '*******************
      Dim Steps As Byte , Send_steps As Byte
      Dim Send_wave As Byte , Wave As Byte
      Dim Send_value As Byte , Value As Byte
      Dim Send_prescale As Byte , Prescale As Byte
      Dim X As Byte , P As Bit
      '*******************
      Do

      Loop
      End
      '*******************
      Prog:
      Inputbin Send_wave
      Inputbin Send_value
      Inputbin Send_prescale
      Inputbin Send_steps
      Wave = Send_wave
      Value = Send_value
      Prescale = Send_prescale
      Steps = Send_steps
      X = &H00
      P = 0
      Tccr2 = &H00
      Tcnt2 = Value
      Tccr2 = Prescale
      Return
      '*******************
      Wave:
      Tccr2 = &H00
      Tcnt2 = Value
      Tccr2 = Prescale
      If Wave = &H01 Then
      Porta = X
      Incr X
      If X > Steps Then X = 0
      End If
      If Wave = &H02 Then
      Porta = X
      If P = 1 Then
      If X = 0 Then
      Incr X
      P = 0
      End If
      Decr X
      End If
      If P = 0 Then
      Incr X
      If X > Steps Then
      Decr X
      P = 1
      End If
      End If
      End If
      If Wave = &H03 Then
      If P = 0 Then Porta = 0
      If P = 1 Then Porta = Steps
      Toggle P
      End If
      Return
      '*******************
      خواهش میکنم کمک کنید فرصتم کمه :cry2:

      دیدگاه


        #4
        پاسخ : سرعت اجرای دستورات avr

        فکر کنم کسی نیست؟

        دیدگاه


          #5
          پاسخ : سرعت اجرای دستورات avr

          من فکر می کنم اگه با سی بنویسی تا 40 درصد بهبودی باشه
          البته اگه فکر میکنی تو دستورات صرفه جویی بشه
          هرچه سعی کنیم لایه های نرم افزاری زیاد کرده و از سخت افزار دور کنیم مشکلات(باگ ها) کمتر خواهد شد(امنیت بیشتری خواهید داشت)
          بهترین جواب دهنده برای سوال شما، خود شما هستید البته بعد تلاش،پشتکار و مطالعه بیشتر
          میدونی مشکل ما کجاست؟سرمایه و مغز ها رو نمیتونیم یکجا جمع کنیم...

          تعدادی ماژول GPS GP5MX1513F1 با بالاتریت حساسیت -170db به قیمت خرید بفروش میرسد

          دیدگاه


            #6
            پاسخ : سرعت اجرای دستورات avr

            سلام
            دوست عزیز شما برای تبدیل این موج به صورت انالوگ از چی استفاده کردید .

            دیدگاه


              #7
              پاسخ : سرعت اجرای دستورات avr

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

              دیدگاه


                #8
                پاسخ : سرعت اجرای دستورات avr

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

                دیدگاه


                  #9
                  پاسخ : سرعت اجرای دستورات avr

                  یکی اینکه شما هر مرتبه که در زیر برنامه مربوطه می روید سه تا شرط را چک می کنید که ببینید کدام موج را باید تولید کنید در صورتی که اگر از IF AND ELSE IF استفاده می کردید این موضوع حداقل برای یکی زودتر انجام می شد و دیگه دو تا شرط دیگه رو چک نمی کرد و زمان بالاتری رو داشتی .

                  دیدگاه


                    #10
                    پاسخ : سرعت اجرای دستورات avr

                    من چه جوری میتونم برای یک تایمر 3 تا زیر برنامه بزارم؟مثلا:
                    if k=1 then On Ovf1 P1
                    if k=2 then On Ovf1 P2
                    if k=3 then On Ovf1 P3
                    آیا سرعت اجرای دستورات C از Basic بیشتره؟(فرض کنید انجام دستورات همین چیزهاست)
                    سرعت اجرای دستورات در Xmega بیشتر هست؟

                    دیدگاه


                      #11
                      پاسخ : سرعت اجرای دستورات avr

                      راستش من خیلی با basic ننوشتم و کار با ان فکر کنم برمیگرده به 4 یا 5 سال پیش . در مورد اینکه سرعت اجرای دستور توی کدام یک سریع تر است .خوب خیلی ساده است یک کد توی c بسیار کمتر حجم می گیرد تا basic و عموما هر چه ما به زبان ماشین نزدیک تر می شویم می توانیم از سرعت بیشتر در اجرای برنامه بهره ببریم .
                      راستش در مورد xmega اطلاع ندارم ولی بسته به میزان فرکانس کاری cpu میکرو کنترلرها شما می توانید در c به یک سوم ان سرعت و در بیسیک به یک ششم برسید .البته تحت شرایطی .( این چیزی است که به طور تجربی میگم و ممکن است کمتر یا بیشتر باشد ) .
                      اگر شما بگید که در چه رنجی می خواهید تولید موج کند بهتر می توانم کمک کنم .

                      دیدگاه


                        #12
                        پاسخ : سرعت اجرای دستورات avr

                        من یه سوال داشتم..
                        چه جوری میشه زمان اجرای یک دستور(کلی تر زمان اجرای یک تابع) رو محاسبه کرد؟

                        دیدگاه


                          #13
                          پاسخ : سرعت اجرای دستورات avr

                          احتیاج به محاسبه نیست. زمان هر دستور(کلی تر بگم همون دستور) رو تو یه برگه ی اطلاعاتی از طرف کارخونه بهت میدن.
                          ?Why not

                          دیدگاه


                            #14
                            پاسخ : سرعت اجرای دستورات avr

                            سلام
                            مشکل سرعت مربوط به هدر فایل و نحوه تولید هگز کد 32 و 18 در کامپایلر مورد نظر هست
                            در زبان بیسیک و C زبان دقیق رو نمی شه تعیین کرد و حتما باید از اسکوپ برای دیدن خروجی و تنظیم مقادیر مورد نظر استفاده کرد اما دز زبان اسمبلی با مراجعه به دیتاشیت و مشاهده طول هر دستور بر اساس RISC (که اکثرا هم در یک سیکل ساعت با توجه به معماری RISC اجرا می شون)می توان زمان دقیقتری رو نسبت به زبان های سطح بالا به دست و محاسبه کرد.

                            من افراد کمی رو دیدم (از انگشت شمار بودن هم گذشتن) که با اسمبلی کار می کنن چون همین برنامه شما به چندین صفحه کد اسمبلی باید تبدیل بشه و نهایتا زمان بیشتری صرف نوشتن و تصحیح هست.پیشنهادم برای دقیق تر شدن استفاده از زبان C به جای basic هست متاسفانه من برای AVR از بیسیک استفاده می کنم و برای کارهای دقیق از PIC و با زبان C ،

                            ان شالله که بچه های C نویس AVR بتونن کمکتون کنن
                            هیچ دانش آموزی نیست که به در خانۀ دانشمندی آمد و شد کند, مگر این که خداوند برای هر گامی که برمی دارد عبادت یک سال را برایش رقم زند.

                            دیدگاه


                              #15
                              پاسخ : سرعت اجرای دستورات avr

                              سلام
                              من دو سوال دارم :دی
                              یه جذر اگر از یه عدد بگیریم چقد زمان طول میکشه؟
                              مثلا
                              sqrt(5)=a
                              -------------------------------------------------------------
                              سوال دوم
                              اگر از ADC استفاده کنیم، و بخوایم انالیزی رو دیتا دریافتی به صورت real time انجام بدیم وفرکانس نمونه برداری 6 کیلو باشه..
                              چقد زمان فرصت داریم تا انالیز دیتاها( تا وقفه بعدی ADC که صورت بگیره) انجام بدیم؟ یعنی وسط انالیز وقفه ADC صورت نگیره.
                              (جواب خودم :166میکروثانیه)

                              ممنون

                              دیدگاه

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