اطلاعیه

Collapse
No announcement yet.

مشکل در راه اندازی تایمر 1

Collapse
این موضوع بسته شده است.
X
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    مشکل در راه اندازی تایمر 1

    سلام
    من این برنامه رو واسه تایمر 1 نوشتم با این فرض که ( time=4*prescaler*(1/xtal)*(65536-value پس اگه در فرکانس 20 مگا هرتز و با پرسکالر 8 ما بخواهیم 0.1 ثانیه رو تولید کنیم باید عدد 3036 رو در تایمر لود کنیم و اگه هر 0.1 ثانیه ما یه متغیر رو یک افزایش بدیم تا 10 تا میشه 1 ثانیه اما برنامه کار نمی کنه جالب اینکه من برنامه رو با تایمر 0 تست کردم و درست کار میکرد (برای تایمر0 در فرکانس 1 مگا هرتر عدد 100 رو در تایمر لود کردم ) میشه ببینید مشکل من کجاست؟

    این برنامه با تایمر 1
    #include <16F877A.h>
    #use delay(clock=20000000)
    #include <LCD.c>
    /////////////Main\\\\\\\\\\\\\\\\
    //time=4*prescaler*(1/xtal)*(65536-value)
    void main(){
    unsigned int16 a=0,b=0,on_time=0,off_time=0;
    lcd_init();
    on_time=3036;
    off_time=3036;
    setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
    set_timer1(on_time);
    while(true){
    if(get_timer1()==0){set_timer1(on_time);a++;}
    if(a==10){printf(lcd_putc,"\fSECOND=%lu ",b);b++;a=0;}
    }
    }
    و اینم برنامه برای تایمر 0
    #include <16F877A.h>
    #use delay(clock=1000000)
    #include <LCD.c>
    /////////////Main\\\\\\\\\\\\\\\\
    //time=4*prescaler*(1/xtal)*(65536-value)
    void main(){
    unsigned int16 a=0,b=0,on_time=0,off_time=0;
    lcd_init();
    on_time=100;
    off_time=100;
    setup_timer_0(RTCC_INTERNAL|RTCC_DIV_128);
    set_timer1(on_time);
    while(true){

    if(get_timer0()==0){set_timer0(on_time);a++;}
    if(a==10){printf(lcd_putc,"\fSECOND=%lu ",b);b++;a=0;}
    }
    }

    #2
    پاسخ : مشکل در راه اندازی تایمر 1

    با سلام
    دوست عزیز منم یه بار مشکلی شبیه مشکل شما رو داشتم ولی مقدار پرسکالر رو زیاد کردم مشکل برطرف شد. شما هم یه تستی بکنید امیدوارم که جواب بده، سعی کنید مقدار پرسکالر رو ماکزیمم در نظر بگیرید و مقدار دهیتون رو با در نظر گرفتن زمان مورد نظرتون تغییر بدین.

    موفق باشید :job:

    دیدگاه


      #3
      پاسخ : مشکل در راه اندازی تایمر 1


      سلام

      وقتی فرکانس میکرو 2مگا هرتز است حداقل زمانی که از تایمر 1 می شه گرفت برابر می شه با2 میکرو ثانیه که اونم با Prescale=1 بدست میاد حالا من اگه بخوام حوالی این عدد (2 میکرو ثانیه )رو داشته باشم که نمی تونم پرسکالر رو زیاد کنم تازه با فرض زیاد کردن هم که دیگه 2 میگرو ثانیه رو ندارم و ....
      به نظر من راه حل شما منطقی نمیاد.
      آیا دستورات اسمبلی که میشه رجیستر های میکرو رو ست کرد رو بلدین می خوام یه بار با اسمبلی هم تست کنم اما زیاد وارد نیستم.

      دیدگاه


        #4
        پاسخ : مشکل در راه اندازی تایمر 1

        دوست عزیز شما که تو مثال بالا میخواین 100 میلی ثانیه رو تولید کنید نه 2 میکروثانیه!!!! :eek: :eek: :eek:
        درضمن با این مقادیر برنامتون رو بنویسید ببینید که چی میشه فکر کنم که جواب بده: پرسکالر 256 مقدار 63582 و فرکانس 20 مگاهرتز، البته زمانی که بدست میاد برابر 100044.8 میکروثانیه هست که با صرفه نظر از مقادیر کوچک تقریبا برابر 100 میکروثانیه میشه.

        موفق باشید

        دیدگاه

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