اطلاعیه

Collapse
No announcement yet.

یه سوال کوچولو درباره تایمر 0 و 1 ^_^

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

    یه سوال کوچولو درباره تایمر 0 و 1 ^_^

    سلام :mrgreen:
    چرا تو مد CTC ....تو تایمر صفر..... هنگام برابری OCR0 با TCNT0 وقفه سرریز رخ میده؟ :question:(که یعنی مقدار OCR0 مقدار MAX رو تعیین میکنه....در حالی که من فک میکردم مقدار TOP رو تعیین میکنه ____وقفه مقایسه هم کاری باهاش ندارم چون درسته و باید رخ بده و بحثی روش نیست)

    ولی تو تایمر 1 هنگام برابری TCNT1 با OCR1A وقفه سرریز رخ نمیده؟؟؟
    اللَّهُمَّ صَلِّ عَلَى مُحَمَّدٍ وآلِ مُحَمَّدٍ وعَجِّلْ فَرَجَهُمْ

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

    #2
    پاسخ : یه سوال کوچولو درباره تایمر 0 و 1 ^_^

    مطمئنی که تو تایمر صفر، مقدار OCR0 همون TOP نیست ؟
    [code=text]The OCR0 defines the top value for the counter, hence also its
    resolution.[/code]
    دیتاشیت که میگه هست.
    تو مد CTC دیگه وقفه سرریز بی معنی میشه. همون وقفه تطابق هست.
    تو تایمر 1 هم همینه.
    ---------
    .
    .
    ...........

    دیدگاه


      #3
      پاسخ : یه سوال کوچولو درباره تایمر 0 و 1 ^_^

      ببین طبق جداول زیر، ریجستر های OCR0 و OCR1A تو مد CTC مقدار TOP رو تعیین میکنن و تو این بحثی هم نیست، سوال من اینه که تو تایمر صفر وقتی مقدار TCNT0 با OCR0 برابر میش چرا وقفه سرریز رخ میده؟ :angry: ولی تو تایمر 1 همچین خبری نیست :cry2:




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

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

      دیدگاه


        #4
        پاسخ : یه سوال کوچولو درباره تایمر 0 و 1 ^_^

        وقفه تایمرها از هم جدا هستن و باید همشون بصورت مجزا بیکره بندی بشن که دلیل اصلیش میتونه رجیسترTIMSK باشه.بیت 3و4 این رجیستر مربوط به حالت مقایسه تایمر یک هست(بیت OCIE1A-OCIE1B)از رجیسترTIMSK

        دیدگاه


          #5
          پاسخ : یه سوال کوچولو درباره تایمر 0 و 1 ^_^

          من با وقفه تطابق کار کردم و مشکلی نداشتم. برای مد CTC.
          شاید وقتی که مقدار TCNT0 با OCR0 برابر میشه هر دو شرط تطابق و سرریز برآورده میشه.پس میشه از هر دو تا وقفه استفاده کرد.
          میش چرا وقفه سرریز رخ میده؟ :angry: ولی تو تایمر 1 همچین خبری نیست :cry2:
          اینطور سرتو بکوبی، مغزت سرریز می کنه البته بدون وقفه !!! :mrgreen:
          ---------
          .
          .
          ...........

          دیدگاه


            #6
            پاسخ : یه سوال کوچولو درباره تایمر 0 و 1 ^_^

            نوشته اصلی توسط saeiddiod
            وقفه تایمرها از هم جدا هستن و باید همشون بصورت مجزا بیکره بندی بشن که دلیل اصلیش میتونه رجیسترTIMSK باشه.بیت 3و4 این رجیستر مربوط به حالت مقایسه تایمر یک هست(بیت OCIE1A-OCIE1B)از رجیسترTIMSK
            متوجه منظروتون نشدم میشه بیشتر توضیح بدید :redface:


            اینطور سرتو بکوبی، مغزت سرریز می کنه البته بدون وقفه !!! :mrgreen:
            خوشم میاد که به فکرمی :mrgreen:......دمت گرم :mrgreen:
            اللَّهُمَّ صَلِّ عَلَى مُحَمَّدٍ وآلِ مُحَمَّدٍ وعَجِّلْ فَرَجَهُمْ

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

            دیدگاه


              #7
              پاسخ : یه سوال کوچولو درباره تایمر 0 و 1 ^_^

              این از کد تایمر 0 با وقفه وقایسه....که بحثی روش نداریم......جفت کد های زیر هر دو کار میکن
              کد:
              #include <mega16.h>
              
              interrupt[TIM0_COMP] void Timer_Counter0_comp()
              {
                PORTA = PORTA + 1;
              }
              
              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/Counter0 Output Compare Match Interrupt Enable >>>>> OCIE0 = 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) | (1<<OCIE0) | (0<<TOIE0);
                //TIFR = (0<<OCF2) | (0<<TOV2) | (0<<ICF1)  | (0<<OCF1A) | (0<<OCF1B) | (0<<TOV1) | (0<<OCF0) | (0<<TOV0);
                TCNT0 = 0;
                OCR0 = 0;
              
                #asm("sei")
              
                while(1);
              }

              اما کد زیر رو کجای دلم بزارم :mrgreen:، با وقفه سرریز هستش....آخه چرا برا تایمر 0 آره ولی برا 1 نه؟
              کد:
              #include <mega16.h>
              
              interrupt[TIM0_OVF] void Timer_Counter0_ovf()
              {
                PORTA = PORTA + 1;
              }
              
              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 = 0;
              
                #asm("sei")
              
                while(1);
              }
              اللَّهُمَّ صَلِّ عَلَى مُحَمَّدٍ وآلِ مُحَمَّدٍ وعَجِّلْ فَرَجَهُمْ

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

              دیدگاه


                #8
                پاسخ : یه سوال کوچولو درباره تایمر 0 و 1 ^_^

                نوشته اصلی توسط md3848
                این از کد تایمر 0 با وقفه وقایسه....که بحثی روش نداریم......جفت کد های زیر هر دو کار میکن
                کد:
                #include <mega16.h>
                
                interrupt[TIM0_COMP] void Timer_Counter0_comp()
                {
                  PORTA = PORTA + 1;
                }
                
                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/Counter0 Output Compare Match Interrupt Enable >>>>> OCIE0 = 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) | (1<<OCIE0) | (0<<TOIE0);
                  //TIFR = (0<<OCF2) | (0<<TOV2) | (0<<ICF1)  | (0<<OCF1A) | (0<<OCF1B) | (0<<TOV1) | (0<<OCF0) | (0<<TOV0);
                  TCNT0 = 0;
                  OCR0 = 0;
                
                  #asm("sei")
                
                  while(1);
                }

                اما کد زیر رو کجای دلم بزارم :mrgreen:، با وقفه سرریز هستش....آخه چرا برا تایمر 0 آره ولی برا 1 نه؟
                کد:
                #include <mega16.h>
                
                interrupt[TIM0_OVF] void Timer_Counter0_ovf()
                {
                  PORTA = PORTA + 1;
                }
                
                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 = 0;
                
                  #asm("sei")
                
                  while(1);
                }
                من هم امتحان کردم، با تایمر 1 و تو حالت CTC وقفه سریز نداریم بلکه وقفه تطابق داریم.
                ببین اینو از دیتاشیت ATmega32 میزارم.
                [code=text]An interrupt can be generated each time the counter value reaches the TOP value by using the
                OCF0 Flag. If the interrupt is enabled, the interrupt handler routine can be used for updating the
                TOP value. [/code]
                میگه که وقفه ای که در هنگام عبور مقدار TCNT0 از TOP که اینجا همون OCR0 هستش، به وجود میاد با استفاده از فلگ OCF0 هستش. یعنی اصلا وقفه تو این حالت برای تطابق تعریف میشه (به وجود میاد) و نه سرریز.
                این هم برای تایمر 1 :
                [code=text]An interrupt can be generated at each time the counter value reaches the TOP value by either
                using the OCF1A or ICF1 Flag according to the register used to define the TOP value.[/code]
                باز هم خبری از فلگ سرریز تو این حالت CTC نیست.
                شاید به همین خاطره که تو تایمر 1 وقفه سرریز برای حالت CTC کار نمی کنه.
                ---------
                .
                .
                ...........

                دیدگاه


                  #9
                  پاسخ : یه سوال کوچولو درباره تایمر 0 و 1 ^_^

                  من هنوز متوجه نشدم چرا تو تایمر 0 تو مد Ctc وقفه سرریز دارم ؟ O_o
                  اللَّهُمَّ صَلِّ عَلَى مُحَمَّدٍ وآلِ مُحَمَّدٍ وعَجِّلْ فَرَجَهُمْ

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

                  دیدگاه


                    #10
                    پاسخ : یه سوال کوچولو درباره تایمر 0 و 1 ^_^

                    نوشته اصلی توسط Des_B
                    میگه که وقفه ای که در هنگام عبور مقدار TCNT0 از TOP که اینجا همون OCR0 هستش، به وجود میاد با استفاده از فلگ OCF0 هستش. یعنی اصلا وقفه تو این حالت برای تطابق تعریف میشه (به وجود میاد) و نه سرریز.
                    رجیستر TIMSK=0X1A باید باشه.امتحان کن ببین جواب میده

                    دیدگاه


                      #11
                      پاسخ : یه سوال کوچولو درباره تایمر 0 و 1 ^_^

                      نوشته اصلی توسط saeiddiod
                      رجیستر TIMSK=0X1A باید باشه.امتحان کن ببین جواب میده
                      ممنون از شما، آره تو این حالت جواب میده....

                      من مشکل اصلیم اینه که چرا تو تایمر صفر هنگام مقایسه موفق، وقفه سرریز رخ میده و تو تایمر 1 نه..... :cry2:
                      اللَّهُمَّ صَلِّ عَلَى مُحَمَّدٍ وآلِ مُحَمَّدٍ وعَجِّلْ فَرَجَهُمْ

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

                      دیدگاه

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