اطلاعیه

Collapse
No announcement yet.

ایجاد زمان دقیق با تایمر

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

    ایجاد زمان دقیق با تایمر

    سلام
    من می خوام یک زمان 400 میکرو ثانیه ای ایجاد کنم .
    برای محاسبه از تامیر دو استفاده کردم با مشخصات زیر:
    کد:
    setup_timer_2(t2_div_by_1,25,2);
    و در اینترپت متغیر t2 را یک بار افزایش می دهم.
    و در نهایت در برنامه از دستورات زیر برای ایجاد تاخیر 400 میکروثانیه ای ( و تاخیر های دیگر) استفاده می کنم:
    کد:
    t2=0;
       while(t2<20))
       {
       }
    [hr]
    ولی در عمل می بینم که تاخیر 600 میکروثانیه طول می کشه.
    محاسبه ی من هم اینطوری بود که
    10 مگاهرتز کریستال دارم
    تقسیم بر 4 میشه
    تقسیم بر 1 میشه
    برعکس میشه
    ضربدر 25 میشه
    ضربدر 2 میشه------- در نهایت میشه 20 میکرو ثانیه.که نشد :surprised:
    از دوستان و مهندسان گرامی طلب راهنمایی دارم.
    ممنون
    دوستان عزیزم تصمیم گرفتم تا یه مدت کمتر به تالار سر بزنم . اگر دیر جواب دادم ببخشید.

    #2
    پاسخ : ایجاد زمان دقیق با تایمر

    چیزهای جالبی هست:
    مثلا وقتی div_by_1 رو به div_by_4 تغییر می دم میزان زمان نصف میشه ، نه یک چهارم!
    همینطور وقتی postscaller رو تغییر می دم به طور نامعقولی تغییر می کنه
    دوستان عزیزم تصمیم گرفتم تا یه مدت کمتر به تالار سر بزنم . اگر دیر جواب دادم ببخشید.

    دیدگاه


      #3
      پاسخ : ایجاد زمان دقیق با تایمر

      سلام
      برای بدست آوردن زمان 400 میکروثانیه
      فرکانس کاری:
      10 مگاهرتز تقسیم بر 4 می شه 2.5 مگاهرتز و به طبع زمان هر کلاک خوردن تایمر به پری اسکیل یک (یا بدون پری اسکیل) برابر خواهد بود با .4 میکروثانیه
      یعنی برای داشتن زمان 400 میکرو ثانیه باید مقدار تایمر رو با مقدار 1000 پر کنین که چون اکثر تایمرهای 2 خانواده PIC هشت بیتی هستن این مقدار رو نمی تونین بار کنین و باید از تایمر دیگه استفاده کنین

      حالا اگر پری اسیکل 4 رو استفاده کنیم شما باید در تایمر مقدار 250 رو قرار بدین تا براتون 400 میکرو ثانیه زمان ایجاد کنه

      البته باید مد نظر داشت که مقدار 250 هم مسلما عدد 400 میکرو ثانیه رو برای شما تامین نمی کنه و این به دلیل پرشهای با دو سیکل و دیگر دستوراتی هست که در زمان اجرای وقفه تایمر میکرو باید صرف کند تا آنها انجام و مجددا تایمر رو راه اندازی کنه و دلیل دیگر هدر زبان های سطح بالا هست که این خطا رو پدید می آورن
      برای داشتن خطای کمتر
      1-سعی کنین برای زمان های بیشتر از تایمرهای 16 بیتی به جای 8 بیتی استفاده کنین
      2-به جای افزایش متغییر برای پی بردن چندین مرتبه سریز تایمر سعی کنین از تایمر های بیت بیشتر یا پری اسکیل به جای این منظور استفاده کنین
      3-و در آخر با چک کردن خروجی توسط اسکوپ با تابع کامل شده عدد درست تایمر رو کمی تصحیح کنین
      هیچ دانش آموزی نیست که به در خانۀ دانشمندی آمد و شد کند, مگر این که خداوند برای هر گامی که برمی دارد عبادت یک سال را برایش رقم زند.

      دیدگاه


        #4
        پاسخ : ایجاد زمان دقیق با تایمر

        2-به جای افزایش متغییر برای پی بردن چندین مرتبه سریز تایمر سعی کنین از تایمر های بیت بیشتر یا پری اسکیل به جای این منظور استفاده کنین
        آخه من در برنامه وقفه های 20 میکرو ثانیه ای ، 220 میکرو ثانیه ای و 9200 میکرو ثانیه ای هم دارم !
        -سعی کنین برای زمان های بیشتر از تایمرهای 16 بیتی به جای 8 بیتی استفاده کنین
        از طرف دیگه تایمر 0 و یک رو هم برای کار دیگه استفاده میکنم ( تایمر صفر پالس های ورودی رو میشمره و تایمر 1 زمان کلی رو به ثانیه و دقیقه بهم میده-میکرو877 )
        3-و در آخر با چک کردن خروجی توسط اسکوپ با تابع کامل شده عدد درست تایمر رو کمی تصحیح کنین
        از این روش که فرمودید هم استفاده کردم ولی این هم جزو همون عجایبی است که خدمتتون عرض کردم. مقدار 25 را در setup_timer_2(t2_div_by_1,25,2 به 17 تغییر دادم ، همینطور به 50 و 13 تغییر دادم ولی نتیجه اصلا به اون چیزی که می خوام نزدیک نشد ، حتی یک بار میکرو با این تنظیم هنگ کرد ! یعنی اگر مقدار 13 رو براش قرار می دادم بدون اینکه به دستور تاخیر برسه ، میکرو قفل می کرد و حتی در ابتدای کارش که باید با ال سی دی و کیبورد کار کنه هم کار نمی کرد.
        دیگه دارم به جن و اجنه اعتقاد پیدا می کنم :twisted:
        فکر کنم اگه از دستور for و از دستور delay_cycle استفاده کنم بهتر باشه.
        نظر شما چیه؟
        یه سوالی می تونم از دستور delay_us استفاده کنم یا اینکه در این دستور از تایمر ها برای ایجاد تاخیر استفاده شده و باعث اختلال در کارم میشه ؟
        دوستان عزیزم تصمیم گرفتم تا یه مدت کمتر به تالار سر بزنم . اگر دیر جواب دادم ببخشید.

        دیدگاه


          #5
          پاسخ : ایجاد زمان دقیق با تایمر

          من از delay_cycles و از delay_us استفاده کردم ولی هر دو مشکل داشتند و درست کار نکردند.
          ولی بلاخره این تایمر کوفتی در تنظیمات زیر کار کرد: :wow:
          کد:
          setup_timer_2(t2_div_by_16,31,1);//6.4us*31.2=200us
          البته زمان تاخیر های 20 میکرو ثانیه ای رو هم با یه چیز دیگه درست می کنم . ولی نمی دونم چطور با div_1 کار نکرد؟؟؟؟؟ :question:
          و یا اینکه چرا با عدد سرریز زیر 20 نیز مشکل داشت و هنگ می کرد . به هر حال یا علم من به این چیزا قد نمی ده یا اینکه این میکروکنترلر ها مشکل دارندو ناقص اند.
          و به احتمال قوی هر دو گزینه صحیح است. :biggrin:
          به هر حال اگر می دونید دلیل این موارد چی بود به من بفرمایید
          دوستان عزیزم تصمیم گرفتم تا یه مدت کمتر به تالار سر بزنم . اگر دیر جواب دادم ببخشید.

          دیدگاه


            #6
            پاسخ : ایجاد زمان دقیق با تایمر

            نوشته اصلی توسط محمدحسـین
            من از delay_cycles و از delay_us استفاده کردم ولی هر دو مشکل داشتند و درست کار نکردند.
            ولی بلاخره این تایمر کوفتی در تنظیمات زیر کار کرد: :wow:
            کد:
            setup_timer_2(t2_div_by_16,31,1);//6.4us*31.2=200us
            البته زمان تاخیر های 20 میکرو ثانیه ای رو هم با یه چیز دیگه درست می کنم . ولی نمی دونم چطور با div_1 کار نکرد؟؟؟؟؟ :question:
            و یا اینکه چرا با عدد سرریز زیر 20 نیز مشکل داشت و هنگ می کرد . به هر حال یا علم من به این چیزا قد نمی ده یا اینکه این میکروکنترلر ها مشکل دارندو ناقص اند.
            و به احتمال قوی هر دو گزینه صحیح است. :biggrin:
            به هر حال اگر می دونید دلیل این موارد چی بود به من بفرمایید
            بهتره مشکلات خودمون رو سر چیزای دیگه ای که مشکل ندارن ، خالی نکنیم !
            تا به حال به اندازه ی موهای کله ی کچلم (!) به همه گفتم برین دیتاشیت های میکروتون رو بخونین . چه AVR چه PIC چه ARM .
            من برات برنامه ی وقفه ای با همون تایمر 2 رو میزارم با تنظیمات کامل به C : برای کل 18F ها و 16F ها با توضیح ؟!! :
            16F:
            10MHZ CRYSTAL :

            //Timer2
            //Prescaler 1:1; Postscaler 1:4; TMR2 Preload = 249; Actual Interrupt Time : 400 us

            //Place/Copy this part in declaration section
            void InitTimer2(){
            T2CON = 0x1C;
            PR2 = 249;
            TMR2IE_bit = 1;
            INTCON = 0xC0;
            }

            void Interrupt(){
            if (TMR2IF_bit){
            TMR2IF_bit = 0;
            //Enter your code here
            }
            }


            16F:
            4MHZ CRYSTAL :

            //Timer2
            //Prescaler 1:1; Postscaler 1:2; TMR2 Preload = 199; Actual Interrupt Time : 400 us

            //Place/Copy this part in declaration section
            void InitTimer2(){
            T2CON = 0x0C;
            PR2 = 199;
            TMR2IE_bit = 1;
            INTCON = 0xC0;
            }

            void Interrupt(){
            if (TMR2IF_bit){
            TMR2IF_bit = 0;
            //Enter your code here
            }
            }


            18F:
            4MHZ CRYSTAL :

            //Timer2
            //Prescaler 1:1; Postscaler 1:2; TMR2 Preload = 199; Actual Interrupt Time : 400 us

            //Place/Copy this part in declaration section
            void InitTimer2(){
            T2CON = 0x0C;
            TMR2IE_bit = 1;
            PR2 = 199;
            INTCON = 0xC0;
            }

            void Interrupt(){
            if (TMR2IF_bit){
            TMR2IF_bit = 0;
            //Enter your code here
            }
            }

            18F:
            10MHZ CRYSTAL :

            //Timer2
            //Prescaler 1:1; Postscaler 1:4; TMR2 Preload = 249; Actual Interrupt Time : 400 us

            //Place/Copy this part in declaration section
            void InitTimer2(){
            T2CON = 0x1C;
            TMR2IE_bit = 1;
            PR2 = 249;
            INTCON = 0xC0;
            }

            void Interrupt(){
            if (TMR2IF_bit){
            TMR2IF_bit = 0;
            //Enter your code here
            }
            }


            18F:
            48MHZ CLOCK:

            //Timer2
            //Prescaler 1:4; Postscaler 1:5; TMR2 Preload = 240; Actual Interrupt Time : 400.416666667 us

            //Place/Copy this part in declaration section
            void InitTimer2(){
            T2CON = 0x25;
            TMR2IE_bit = 1;
            PR2 = 240;
            INTCON = 0xC0;
            }

            void Interrupt(){
            if (TMR2IF_bit){
            TMR2IF_bit = 0;
            //Enter your code here
            }
            }


            18F:
            48MHZ CLOCK: 416NS

            //Timer2
            //Prescaler 1:1; Postscaler 1:1; TMR2 Preload = 4; Actual Interrupt Time : 416.666666667 ns

            //Place/Copy this part in declaration section
            void InitTimer2(){
            T2CON = 0x04;
            TMR2IE_bit = 1;
            PR2 = 4;
            INTCON = 0xC0;
            }

            void Interrupt(){
            if (TMR2IF_bit){
            TMR2IF_bit = 0;
            //Enter your code here
            }
            }

            166NS :

            //Timer2
            //Prescaler 1:1; Postscaler 1:1; TMR2 Preload = 1; Actual Interrupt Time : 166.666666667 ns

            //Place/Copy this part in declaration section
            void InitTimer2(){
            T2CON = 0x04;
            TMR2IE_bit = 1;
            PR2 = 1;
            INTCON = 0xC0;
            }

            void Interrupt(){
            if (TMR2IF_bit){
            TMR2IF_bit = 0;
            //Enter your code here
            }
            }





            if all men are the same
            then
            why do women take so long to choose one ?

            دیدگاه


              #7
              پاسخ : ایجاد زمان دقیق با تایمر

              بسه ؟ در ضمن توجه داشته باشید من منظورم از کریستال ، کلاک CPU هستش ! اشتباهی چندتا رو زدم .
              زبان های دیگه یا تایم های دیگه هم ، همشون مثل همین ها هستن . برای DS ها و 32 ها هم اگه کسی خواست میتونم بذارم .
              موفق و شاد باشید .
              if all men are the same
              then
              why do women take so long to choose one ?

              دیدگاه


                #8
                پاسخ : ایجاد زمان دقیق با تایمر

                برای dsPIC24_33 :

                برای کلاک CPU برابر 4 مگ

                //Timer2
                //Prescaler 1:1; PR2 Preload = 800; Actual Interrupt Time = 400 us

                //Place/Copy this part in declaration section
                void InitTimer2(){
                T2CON = 0x8000;
                T2IE_bit = 1;
                T2IF_bit = 0;
                IPC0 = IPC0 | 0x1000;
                PR2 = 800;
                }

                void Timer2Interrupt() iv IVT_ADDR_T2INTERRUPT{
                T2IF_bit = 0;
                //Enter your code here
                }

                ________________________________

                //Timer2
                //Prescaler 1:1; PR2 Preload = 2; Actual Interrupt Time = 1 us

                //Place/Copy this part in declaration section
                void InitTimer2(){
                T2CON = 0x8000;
                T2IE_bit = 1;
                T2IF_bit = 0;
                IPC0 = IPC0 | 0x1000;
                PR2 = 2;
                }

                void Timer2Interrupt() iv IVT_ADDR_T2INTERRUPT{
                T2IF_bit = 0;
                //Enter your code here
                }

                ___________________________________

                برای کلاک CPU برابر با 2 مگ :

                //Timer2
                //Prescaler 1:1; PR2 Preload = 1; Actual Interrupt Time = 1 us

                //Place/Copy this part in declaration section
                void InitTimer2(){
                T2CON = 0x8000;
                T2IE_bit = 1;
                T2IF_bit = 0;
                IPC0 = IPC0 | 0x1000;
                PR2 = 1;
                }

                void Timer2Interrupt() iv IVT_ADDR_T2INTERRUPT{
                T2IF_bit = 0;
                //Enter your code here
                }


                _________________
                //Timer2
                //Prescaler 1:1; PR2 Preload = 20; Actual Interrupt Time = 20 us

                //Place/Copy this part in declaration section
                void InitTimer2(){
                T2CON = 0x8000;
                T2IE_bit = 1;
                T2IF_bit = 0;
                IPC0 = IPC0 | 0x1000;
                PR2 = 20;
                }

                void Timer2Interrupt() iv IVT_ADDR_T2INTERRUPT{
                T2IF_bit = 0;
                //Enter your code here
                }
                if all men are the same
                then
                why do women take so long to choose one ?

                دیدگاه


                  #9
                  پاسخ : ایجاد زمان دقیق با تایمر

                  نوشته اصلی توسط josef2600
                  بسه ؟ در ضمن توجه داشته باشید من منظورم از کریستال ، کلاک CPU هستش ! اشتباهی چندتا رو زدم .
                  زبان های دیگه یا تایم های دیگه هم ، همشون مثل همین ها هستن . برای DS ها و 32 ها هم اگه کسی خواست میتونم بذارم .
                  موفق و شاد باشید .
                  جوزف جان ، بعد از تشکر از راهنمایی شما باید عرض کنم خدمتتون که من می تونم محاسبه کنم که مقدار pre و post و div رو چقدر بدم و زمان رو در بیارم . ولی مشکل من اینجاست که با یک سری از این تنظیمات زمان درست بدست میاد ، با یکسری دیگه اشتباه و حتی با یک سری اصلا میکروم هنگ می کنه!
                  مثلا برای کریستال 10 مگاهرتز :
                  setup_timer_2(t2_div_by_16,31,1);//6.4us*31.2=200us
                  درست کار می کنه و 200 میکرو ثانیه می ده ، با
                  (setup_timer_2(t2_div_by_1,25,2
                  اشتباه کار می کنه و 20 میکرو ثانیه نمی ده و با
                  setup_timer_2(t2_div_by_1,13,2 میکرو اصلا هنگ می کنه و کار نمی کنه.
                  دیتا شیت ها رو هم خوندم ولی چیزی نیافتم ، از فرمایشات شما هم نفهمیدم مشکل دقیقا کجاست ؟ اگر میشه بفرمایید.
                  در ضمن سه تا سوال دیگه :
                  - فرق می کنه که ما تنظیمات رو با دستور setup_timer بدیم یا دونه دونه دستی خودمون رجیستر ها رو تنظیم کنیم ؟
                  - آیا ممکنه مقدار اولیه ی تایمر در هنگام کار برنامه و با دستورات دیگر ( بغیر از pr2=xxx و یا setup_timer ) به هم بریزه و این دلیل هنگ میکرو بوده باشه ؟
                  - آیا دستورات delay از تایمر ها استفاده می کنن و آیا میشه همزمان از اونا و از تایمر ها استفاده کرد ؟
                  منتظر راهنماییتون هستم . ممنون
                  دوستان عزیزم تصمیم گرفتم تا یه مدت کمتر به تالار سر بزنم . اگر دیر جواب دادم ببخشید.

                  دیدگاه

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