اطلاعیه

Collapse
No announcement yet.

تحلیل مد CTC تایمر....

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

    تحلیل مد CTC تایمر....

    سلام
    کلاک میکرو رو من گزاشتم رو پایه T0 رو لبه بالا رونده...و مقدار TOP رو هم که با OCR0 تعیین میشه مقدار 1 بهش دادم

    لذا با یه بار تغییر حالت پایه T0 (یه لبه بالا رونده رخ بده) باید وقفه سرریز رخ بده ... و مقدار پورت A یه واحد بهش اضافه بشه

    ولی 2 بار باید لبه بالا رونده رخ بده.....چرا؟
    چیزی که به فکرم میرسه اینه که یه کلاک برا افزایش مقدار TCNT0 و یه کلاک برا رخ دادن وقفه و اجرای کد های داخلش صرف میشه....درست میگم؟
    ممنون میشم دوستان راهنمایی کنن.



    اینم از کد های پروژه
    کد:
    #include <mega16.h>
    
    interrupt[TIM0_OVF] void Timer_Counter0_ovf()
    {
      TCCR0 = 0; // Stop
    
      PORTA = PORTA + 1;
      TCNT0 = 0;
    }
    
    void main(void)
    {
      DDRA = 0XFF;
      PORTA = 0X00;
    
      // TIMER0
      // External clock source on T0 pin (rising edge) >>>>> CS00 = 1, CS01 = 1, CS02 = 1
      // Mode = CTC                  >>>>> WGM00 = 0, WGM01 = 1
      // Timer/Counter Overflow Interrupt Enable    >>>>> TOIE0 = 1
      TCCR0 = (0<<FOC0) | (0<<WGM00) | (0<<COM01) | (0<<COM00) | (1<<WGM01) | (1<<CS02) | (1<<CS01) | (1<<CS00);
      TIMSK = (0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (0<<TOIE1) | (0<<OCIE0) | (1<<TOIE0);
      //TIFR = (0<<OCF2) | (0<<TOV2) | (0<<ICF1)  | (0<<OCF1A) | (0<<OCF1B) | (0<<TOV1) | (0<<OCF0) | (0<<TOV0);
      TCNT0 = 0;
      OCR0 = 1;
    
      #asm("sei")
    
      while(1);
    }
    اللَّهُمَّ صَلِّ عَلَى مُحَمَّدٍ وآلِ مُحَمَّدٍ وعَجِّلْ فَرَجَهُمْ

    اگه دوس دارید سریع به جواب برسید :
    1) قبل از پرسیدن سوال، بسرچید.
    2) سوالاتون رو با جزئیات کامل مطرح کنید.

    #2
    پاسخ : تحلیل مد CTC تایمر....

    دلیل این مشکل شما این هست که طبق دیتا شیت مگا32 صفحه 71 گذشتن TCNT0 از مقدار OCR0 باعث 1 شدن flag وقفه خواهد شد . بنابراین برابری مدنظر نیست و برای ایجاد وقفه با شرایط شما حد اقل به دو کلاک تایمر نیاز هست .

    A match will set the
    Output Compare Flag (OCF0) at the next timer clock cycle

    دیدگاه


      #3
      پاسخ : تحلیل مد CTC تایمر....

      ممنون از شما
      مثل این که مشکل همینه
      تو مگا 16 برا تایمر 0 هم که دیدم جمله زیر رو نوشته بود و حرف شما رو تایید کرده بود
      Whenever TCNT0 equals OCR0, the comparator signals a match.
      A match will set the Output Compare Flag (OCF0) at the next timer clock cycle.


      اضافه شده در تاریخ :

      خوب یه تحیلیل دیگه : ببین ما هر دو ریجستر TCNT0 و OCR0 (تایمر 0 و مد ctc) مقدار صفر بهش میدم------یه کلاک میخوره و بعد چون از قبل مقدار دو ریجستر با هم برابر بودن لذا وقفه مقایسه رخ داده و کد های داخل وقفه مقایسه اجرا میشه و در ته وقفه مقایسه دوباره مقدار TCNT0 برابر 0 شده، و تو کلاک بعدی بازم وقفه وقایسه رخ میده و لذا به ازای هر کلاک مقدار PORTA یه واحد زیاد میشه.

      مشکل کار :چرا تو اول کار برا این که PORTA مقدارش 1 بشه باید 2 تا کلاک بدیم و برا دفعه های بعد 1 دونه لازمه؟؟؟.....اون دفعه اول چرا 2 تا کلاک میخواد؟

      اللَّهُمَّ صَلِّ عَلَى مُحَمَّدٍ وآلِ مُحَمَّدٍ وعَجِّلْ فَرَجَهُمْ

      اگه دوس دارید سریع به جواب برسید :
      1) قبل از پرسیدن سوال، بسرچید.
      2) سوالاتون رو با جزئیات کامل مطرح کنید.

      دیدگاه

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