ورود به حساب ثبت نام جدید فراموشی کلمه عبور
برای ورود به حساب کاربری خود، نام کاربری و کلمه عبورتان را در زیر وارد کرده و روی «ورود به سایت» کلیک کنید.





اگر فرم ورود برای شما نمایش داده نمیشود، اینجا را کلیک کنید.









اگر فرم ثبت نام برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.









اگر فرم بازیابی کلمه عبور برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.





کاربران برچسب زده شده

نمایش نتایج: از 1 به 9 از 9
  1. #1
    2011/01/29
    تهران
    484
    16

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

    سلام
    من مي خوام يک زمان 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. #2
    2011/01/29
    تهران
    484
    16

    پاسخ : ايجاد زمان دقيق با تايمر

    چيزهاي جالبي هست:
    مثلا وقتي div_by_1 رو به div_by_4 تغيير مي دم ميزان زمان نصف ميشه ، نه يک چهارم!
    همينطور وقتي postscaller رو تغيير مي دم به طور نامعقولي تغيير مي کنه
    دوستان عزیزم تصمیم گرفتم تا یه مدت کمتر به تالار سر بزنم . اگر دیر جواب دادم ببخشید.
  3. #3
    2008/10/29
    2,098
    219

    پاسخ : ايجاد زمان دقيق با تايمر

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

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

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

    پاسخ : ايجاد زمان دقيق با تايمر

    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. #5
    2011/01/29
    تهران
    484
    16

    پاسخ : ايجاد زمان دقيق با تايمر

    من از 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. #6
    2008/06/02
    مشهد
    126
    1

    پاسخ : ايجاد زمان دقيق با تايمر

    نقل قول نوشته اصلی توسط محمدحسـین
    من از 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. #7
    2008/06/02
    مشهد
    126
    1

    پاسخ : ايجاد زمان دقيق با تايمر

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

    پاسخ : ايجاد زمان دقيق با تايمر

    برای 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. #9
    2011/01/29
    تهران
    484
    16

    پاسخ : ايجاد زمان دقيق با تايمر

    نقل قول نوشته اصلی توسط 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 از تايمر ها استفاده مي کنن و آيا ميشه همزمان از اونا و از تايمر ها استفاده کرد ؟
    منتظر راهنماييتون هستم . ممنون
    دوستان عزیزم تصمیم گرفتم تا یه مدت کمتر به تالار سر بزنم . اگر دیر جواب دادم ببخشید.
نمایش نتایج: از 1 به 9 از 9

موضوعات مشابه

  1. پاسخ: 2
    آخرين نوشته: 2017/10/30, 22:13
  2. مشکل با ايجاد زمان دقيق تايمر
    توسط edris.noei در انجمن میکروکنترلرهای AVR
    پاسخ: 5
    آخرين نوشته: 2014/11/12, 15:48
  3. چرا تايمر نرم افزاري دقيق نيست؟
    توسط Mahdi.Faani در انجمن میکروکنترلرهای AVR
    پاسخ: 6
    آخرين نوشته: 2013/12/04, 10:27
  4. راههاي ايجاد زمان 1 ثانيه دقيق در بيسيک ؟؟
    توسط ahmad.e.c.m در انجمن میکروکنترلرهای AVR
    پاسخ: 13
    آخرين نوشته: 2013/07/29, 17:14
  5. نحوه توليد 1 ميلي ثانيه دقيق با تايمر
    توسط Questioner در انجمن میکروکنترلرهای AVR
    پاسخ: 7
    آخرين نوشته: 2013/02/07, 23:28

کلمات کلیدی این موضوع

علاقه مندي ها (Bookmarks)

علاقه مندي ها (Bookmarks)

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •