اطلاعیه

Collapse
No announcement yet.

راه اندازی تایمر کانتر صفر

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

    راه اندازی تایمر کانتر صفر

    با سلام خدمت دوستان عزیز
    من کار با AVR رو یه مدتی میشه شروع کردم، تو بحث تایمر کانتر ها به مشکل برخورد کردم. از Mega8 استفاده میکنم و میخوام تایمر کانتر صفر رو استفاده کنم برای تولید تاخیر، یعنی یه Led روشن میکنم و میخوام حدود 1 ثانیه که با تایمر تولید میکنم روشن بمونه بعد حدود یک ثانیه خاموش بمونه. برنامه ای که نوشتم اینه:
    #include <mega8.h>
    #include <delay.h>

    void main(void)
    {
    DDRB=0xFF;
    PORTB=0x00;
    TCCR0=0x00;
    TCNT0=0x00;
    while (1)
    {
    TCCR0=0x05;
    while(!(TIFR&0x02))
    {
    PORTB=0x01;
    }

    PORTB=0x00;
    TIFR|=0x02;
    delay_ms(500);
    }
    }

    ولی کار نمیکنه و Led همینطور روشن میمونه. از اسیلاتور داخلی 1 مگ استفاده میکنم که با توجه به اینکه TCCR0=0x05 گذاشتم فرکانسی کع تایمر باید با اون شمارش رو انجام بده حدود 976 هرتز میشه ، یعنی هر شمارش حدود 1 میلی ثانبه طول میکشه و تا سرریز شدن تایمر 256میلی ثانیه باید Led روشن بمونه. ولی کار نمیکنه. مشکل از کجاست، میتونین راهنماییم کنین؟

    #2
    پاسخ : راه اندازی تایمر کانتر صفر

    خواهش میکنم یکی کمک کنه، اینجا ماشاا.. همه استاد AVR هستند. هر کاری میکنم جواب نمیده

    دیدگاه


      #3
      پاسخ : راه اندازی تایمر کانتر صفر

      500 برای دستور delay زیاده بکنش 20
      البته انتظار نداشته باش با کریستال داخلی نتیجه کاملا مورد نظرت بدست بیاد
      *یادگیری علم زمانی مشکل است که قبل از یادگیری آن را پیچیده تصور کنیم.
      *چرا فکر میکنیم مباحث مهم و پیشرفته و سطح بالا باید پیچیده باشند.

      دیدگاه


        #4
        پاسخ : راه اندازی تایمر کانتر صفر

        خودم بالاخره فهمیدم ، :wow: من از کتاب مهندس پرتوی فر استفاده میکنم، ظاهرا بیت TOV0 بیت اول رجیستر TIFR هست ولی تو این کتاب اشتباها بیت دوم نوشته که همین باعث میشد برنامه کار نکنه

        دیدگاه


          #5
          پاسخ : راه اندازی تایمر کانتر صفر

          سلام مجدد خدمت دوستان عزیزم
          با اجازه دوستان و مدیران میخوام به جای اینکه چند تا تاپیک جداگانه ایجاد کنم هر سوالی راجع به تایمر کانتر دارم همینجا بپرسم. یه مشکل عجیبی برام پیش اومده، من میخوام تایمر کانتر صفر رو در حالت نرمال استفاده کنم، خروجی OC0 رو به یک LED وصل کردم و در حالت toggle OC0 on compare match تنظیم کردم. وقتی Prescaler رو از 128 بزرگتر میزارم LED فقط روشن میمونه(تو پروتئوس البته چک کردم) و چشمک نمیزنه ولی وقتی prescaler رو 128 یا کمتر قرار میدم LED چشمک میزنه. فرکانس میکرو هم از اسیلاتور داخلی 1 مگ استفاده میکنه. برنامه ای که نوشتم اینه:
          #include <mega32.h>
          #include <delay.h>

          void main(void)
          {
          DDRB=0xFF;
          PORTB=0x00;
          TCNT0=0x00;
          OCR0=0x80;
          TCCR0=0x16;
          while (1)
          {

          }
          }

          فکر میکنید مشکل از کجاست؟ آخه وقتی فرکانس یک مگ هست و prescaler هم 1024 میذارم، فرکانس کاری تایمر میشه تقریبا 1kh و این یعنی هر شمارش 1ms طول میکشه، که سرریز تایمر 256 میلی ثانیه طول میکشه که درصورتی که OC0=128 بذارم باید LED نصف این زمان یعنی 128ms روشن بمونه و 128ms خاموش بشه ولی نمیشه، لطفا اساتید کمک کنن

          دیدگاه


            #6
            پاسخ : راه اندازی تایمر کانتر صفر

            چرا کسی نیست بهم کمک کنه؟ :sad: خواهش میکنم دوستانی که تخصص دارند کمک کنند

            دیدگاه


              #7
              پاسخ : راه اندازی تایمر کانتر صفر

              مشکل شما احتمالا عدم مراجعه به متن Datasheet و اتکا به منابع متفرقه است. اگر به فصل مربوط به TIMER0 برای mega32 مراجعه کنید، مشاهده خواهید کرد که اولا مقدار تقسیم 128 در این شماره وجود ندارد. دیگر اینکه به ازای 0x16 برای TCCR0، منبع کلاک روی کلاک خارجی اعمال شده به پین T0 قرار خواهد گرفت و بنابراین کاملا طبیعی است که LED چشمک نزند. برای قرار دادن ضریب تقسیم 1024 باید TCCR0 را برابر 0x15 قرار دهید (با توجه به وضعیت toggle OC0 on compare match ).
              اوژن: به معنای افکننده و شکست دهنده است
              دانایی، توانایی است-Knowledge is POWER
              برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
              وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
              قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
              اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
              ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

              دیدگاه


                #8
                پاسخ : راه اندازی تایمر کانتر صفر

                خیلی ممنون دوست عزیز، درسته به دیتاشیت میکرو مراجعه کردم حق با شما بود. فقط یه سوال دیگه، مگه با استفاده از رجیستر TIFR نمی توان به تطابق مقایسه و همچنین سر ریز شدن تایمر رو فهمید؟ منظورم بیتهای اول و دوم TIFR هست. من میخواستم نحوه دسترسی به این بیت ها رو چک کنم، یه برنامه نوشتم که وقتی TIFR&0x01 یک شد(سرریز تایمر) یک LED رو 10ms روشن کنه و وقتی TIFR&0x02 یک شد(تطابق مقایسه) یه LED دیگه رد 10ms روشن کنه. حالا وقتی تو پروتئوس اجرا میکنم، LED مربوط به سرریز تایمر چشمک میزنه که نشون دهنده سرریز تایمر هست ولی LED مربوط به تطابق مقایسه خاموشه، قاعدتا باید اونم چشمک بزنه ولی هر چقدر فکر کردم به نتیجه نرسیدم.(مقدار OCR0 مساوی 128 گرفتم) به نظر شما مشکل از چیه؟

                ببخشید من تلاش خودمو میکنم ولی الات نزدیک چند ساعته که نتونستم دلیل این موضوعی که مطرح کردم رو بفهمم واسه همین مجبور میشم از تجریه دوستان استفاده کنم.

                دیدگاه


                  #9
                  پاسخ : راه اندازی تایمر کانتر صفر

                  متن برنامه خود را قرار دهید تا بر اساس آن بتوان دقیق تر به شما پاسخ داد.
                  اوژن: به معنای افکننده و شکست دهنده است
                  دانایی، توانایی است-Knowledge is POWER
                  برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                  وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                  قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                  اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                  ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                  دیدگاه


                    #10
                    پاسخ : راه اندازی تایمر کانتر صفر

                    ممنون دوست عزیز این برنامه ای هست که نوشتم:

                    #include <mega32.h>
                    #include <delay.h>

                    void main(void)
                    {

                    DDRB=0xFF;
                    PORTB=0x00;
                    DDRC=0xFF;
                    TCNT0=0x00;
                    OCR0=0x80;
                    TCCR0=0x015;
                    while (1)
                    {
                    if(TIFR&0x01==1)
                    {
                    PORTC.0=1;
                    delay_ms(10);
                    PORTC.0=0;
                    TIFR|=0x01;
                    }
                    if(TIFR&0x02==1)
                    {
                    PORTC.1=1;
                    delay_ms(10);
                    TIFR|=0x02;
                    }
                    }
                    }

                    دیدگاه


                      #11
                      پاسخ : راه اندازی تایمر کانتر صفر

                      با سلام
                      دوست عزیز چرا برنامتون رو توی روتین وقفه نمی نویسید ؟
                      از طرفی من فکر میکنم این احتمال وجود داره که برنامه تون نتونه یک شدن پرچم رو تشخیص بده !

                      دیدگاه


                        #12
                        پاسخ : راه اندازی تایمر کانتر صفر

                        آخه هنوز به بحث وقفه ها نرسیدم، من تازه کارم! ولی خوب حداقل باید یه بار یک شدن پرچم رو ببینه یا نه؟ چطور یک شدن پرچم TOV0 رو میبینه؟

                        دیدگاه


                          #13
                          پاسخ : راه اندازی تایمر کانتر صفر

                          خط زیر

                          if(TIFR&0x02==1)


                          باید بصورت زیر باشد

                          if(TIFR&0x02==2)


                          یک نکته بسیار فنی هم در این برنامه وجود دارد که البته با اعداد و ارقام موجود مشکلی ایجاد نمی کند، اما ذکر آن خالی از فایده نیست. برای پاک کردن Flag یک وقفه نباید از اپراتور =| استفاده کنید. زیرا این روش سبب می شود سایر Flag های موجود در آن بایت هم اگر یک باشند، در محل خود نوشته و بصورت ناخواسته پاک شوند. برای این کار باید فقط بیت مورد نظر در رجیستر مذکور را یک کنید و این کار از طریق اپراتور = انجام شود.مثلا:

                          TIFR=0x01;
                          اوژن: به معنای افکننده و شکست دهنده است
                          دانایی، توانایی است-Knowledge is POWER
                          برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                          وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                          قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                          اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                          ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                          دیدگاه


                            #14
                            پاسخ : راه اندازی تایمر کانتر صفر

                            نوشته اصلی توسط طراح
                            خط زیر

                            if(TIFR&0x02==1)


                            باید بصورت زیر باشد

                            if(TIFR&0x02==2)


                            یک نکته بسیار فنی هم در این برنامه وجود دارد که البته با اعداد و ارقام موجود مشکلی ایجاد نمی کند، اما ذکر آن خالی از فایده نیست. برای پاک کردن Flag یک وقفه نباید از اپراتور =| استفاده کنید. زیرا این روش سبب می شود سایر Flag های موجود در آن بایت هم اگر یک باشند، در محل خود نوشته و بصورت ناخواسته پاک شوند. برای این کار باید فقط بیت مورد نظر در رجیستر مذکور را یک کنید و این کار از طریق اپراتور = انجام شود.مثلا:

                            TIFR=0x01;
                            درسته دقت نکرده بودم که باید مساوی 2 قرار بدم، خیلی ممنون. فقط وقتی اجرا میکنم بصورت نامنظم LED ها چشمک میزنن یعنی مثلا بعضی وقتها led سرریز دوبار چشمک میزنه اون یکی یه بار و ... که فکر کنم به خاطر از دست دادن پرچم باشه.
                            در مورد اون نکته فنی، مگه با روشی که گفتید یعنی TIFR=0x01، اگه بقیه بیت ها یک باشند، صفر نمیشند؟ خوب این کار خودش مشکل ایجاد نمیکنه؟

                            دیدگاه


                              #15
                              پاسخ : راه اندازی تایمر کانتر صفر

                              نوشته اصلی توسط mhm_004
                              در مورد اون نکته فنی، مگه با روشی که گفتید یعنی TIFR=0x01، اگه بقیه بیت ها یک باشند، صفر نمیشند؟
                              خیر، نوشتن صفر روی یک flag سبب پاک شدن آن نمی شود.
                              اوژن: به معنای افکننده و شکست دهنده است
                              دانایی، توانایی است-Knowledge is POWER
                              برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
                              وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
                              قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
                              اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
                              ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

                              دیدگاه

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