اطلاعیه

Collapse
No announcement yet.

تایمرavr

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

    تایمرavr

    تامیر avr زمان اندازه گیری شده را با چه واحدی می ده میلی ثانیه ثانیه یا ...
    یکی میگفت خدا چرا به حرفای ما گوش نمیده گفتم
    هان ای صنما،دل یک دله کن
    گر سر ندهم ،وانگه گله کن

    #2
    پاسخ : تایمرavr

    بستگی به فرکانس کاری و Prescale انتخاب شده داره. زمان انتخابی می تونه میکرو ثانیه , میلی ثانیه و با کمی تغییر بالاتر باشه

    دیدگاه


      #3
      پاسخ : تایمرavr

      منظورت این است که هر مقداری که رجیستر نشان می دهد برابر یک پالس کلاک است
      یکی میگفت خدا چرا به حرفای ما گوش نمیده گفتم
      هان ای صنما،دل یک دله کن
      گر سر ندهم ،وانگه گله کن

      دیدگاه


        #4
        پاسخ : تایمرavr

        ببین تو میکرو avr بر خلاف 8051 اکثر دستورات 1 کلاک پالس طول میکشه برا تایمر هم همین طوری هست
        حالا بسته به میزان فرکانس و عواملی که حامد گفت زمان میتونه تغییر کنه دیگه

        دیدگاه


          #5
          پاسخ : تایمرavr

          اگه اشتباه نکنم اگه فرکانس میکرو رو 16meg بزاری و با تایمر 16 بیتی کار کنی میتونی با دقت 62.5 نانو ثانیه زمان رو اندازه بگیری....

          دیدگاه


            #6
            پاسخ : تایمرavr

            سلام .....
            ببینید اساسا برای پیدا کردن جوابتون باید به ساختار واحد تایمر/کانتر برگردید و ببینید چه اتفاقی میفته که واحدهای زمانی مورد نظر ثبت و محاسبه میشن .
            خب در ابتدا یه نگاه کلی به این واحد : این واحد برای ثبت و محاسبه ی واحد های زمانی به کار میره، این کار از طریق یه کانتر انجام میشه ، به این ترتیب که با اعمال پالس به این شمارنده ، کانتر شروع به شمارش میکنه و تا مقدر TOP خودش هم بالا میره . این مقادیر شمارش شده در یه رجیستر به نام TCNT ثبت میشه . حالا اگه این رجیستر به مقدار 11111111 برسه با اعمال پالس بعدی مقدار این رجیستر سرریز میشه و یک بیت به عنوان بیت over flow تولید میکنه و ریست میشه . این تولید بیت گاهی هم میتونه با فعال شدن یه flag همراه باشه . خب پس تا اینجا متوجه شدیم که واحد تایمر بدون مولد فرکانس نمی تونه کار کنه ، چون برای شمارش شمارنده ، الزاما نیاز به پالس داریم .
            یه مطلب دیگه ای که در واحد تایمر وجود داره، مقدار prescaler هست . این مقدار در واقع ضریبیه که در مخرج محاسبات پایه ی زمانی در واحد تایمر/کانتر قرار میگیره . اما منظور از این محاسبات پایه ی زمانی چیه؟
            خب همون طور که میدونید روابط زمانی از طریق یک سری محاسبات ، اندازه گیری و سنجیده میشن . روال محاسبات هم به صورت زیره .....
            فرض کنید فرکانس مورد استفادمون 4 مگاهرتز باشه و مقدار prescaler هم 16 باشه . در ابتدا باید فرکانسی پالس تایمر رو حساب کنیم .
            یعنی .....0.25MHz=4/16
            بعدش باید ببنیم هر پالس در چه مدت زمانی شمارش میشه یا تولید میشه ، یعنی ..... 1/0.25MHz=4us پس در اینجا تغییر هر پالسمون معادل 4 میکرو ثانیه میشه . حالا بسته به اینکه تایمر 8 بیتی استفاده کردیم یا 16 بیتی ، تولید بیت سرریزمون دستخوش تغییرات میشه . مثلا فرض کنید از تایمر 8 بیتی استفاده کرده باشیم . پس زمانی که طول میکشه تا بیت over flow تولید بشه برابره با : 4*256=1024us . اما میتونیم این مقدار رو بالا یا پایین هم ببریم . تنها کافیه به عوامل وابسته به این محاسبات نگاهی داشته باشیم . با تغییر مقدار prescaler یا فرکانس کاری یا حتی نوع تایمر که 8 بیتی باشه یا 16 بیتی میتونیم تغییرات زمانی خروجی تایمرمون رو تعیین کنیم . فقط یه نکته اونم این که وقتی میگیم خروجی تایمر یک ثانیه باشه منظورمون اینه که زمانی که طول میکشه تا شمارنده به مقدار TOP خودش برسه و سرریز بشه و بیت سرریز تولید کنه ، یک ثانیه هستش . پس جوابتون اینه که هم میتونه میکرو ثانیه باشه ، هم میلی ثانیه و هم ثانیه . موفق باشبید .
            دوستان! مدتی کمتر به سایت میام ..

            دیدگاه


              #7
              پاسخ : تایمرavr

              با تشکر از حسام الدین عزیز
              من می خواهم توسط یک تایمر در avr مقدار فرکانس یک پالس را اندازه بگیرم البته این تنها یک قسمت از پروژه من است لطفا در این مورد هم راهنماییم کنید
              یکی میگفت خدا چرا به حرفای ما گوش نمیده گفتم
              هان ای صنما،دل یک دله کن
              گر سر ندهم ،وانگه گله کن

              دیدگاه


                #8
                پاسخ : تایمرavr

                سلام.....شما برای اینکار چند تا راه داری....یکیش اینه که پالس ورودیت رو به یکی از اینتراپت های میکرو بدی و اینتراپت رو به لبه بالا رونده فعال کنی...بعد هر وقت پالست شروع شده تو زیر برنامه وقفه تایمرت رو روشن میکنی و همونجا وقفه رو به لبه پایین رونده فعال کنی و با اومدن وقفه بعدی تایمرت رو خاموش میکنی و مقدار TCNT تایمر رو میخونی...این میشه پهنای پالست(T).....فرکانس هم که میشه F=1/T .....فقط برای داشتن دقت بالا از تایمر 16 بیتی استفاده کن و فرکانس میکرو رو هم رو 16 بزار......

                دیدگاه


                  #9
                  پاسخ : تایمرavr

                  با تشکر از همه اما در باره فعال کردن وقفه ها که دست عزیزم گفت این در حالتی درست است که duty cycle پالس برابر 50% باشد اما پالس من این طور نیست
                  یکی میگفت خدا چرا به حرفای ما گوش نمیده گفتم
                  هان ای صنما،دل یک دله کن
                  گر سر ندهم ،وانگه گله کن

                  دیدگاه


                    #10
                    پاسخ : تایمرavr

                    سلام .......... ممکنه منظورتون رو واضح تر بگید . این dc پنجاه درصد رو روی چه حسابی می فرمایید؟!
                    دوستان! مدتی کمتر به سایت میام ..

                    دیدگاه


                      #11
                      پاسخ : تایمرavr

                      نوشته اصلی توسط golgolak
                      با تشکر از همه اما در باره فعال کردن وقفه ها که دست عزیزم گفت این در حالتی درست است که duty cycle پالس برابر 50% باشد اما پالس من این طور نیست
                      سلام دوست عزیز....اینتراپت ربطی به دیوتی سایکل نداره.....اون فقط لبه پایین رونده و بالا رونده رو میشناسه......حالا تو باید ببینی که دقیقا میخوای چیکار کنی...اگه فقط بخوای زمان رو شن بودن پالست رو اندازه بگیری که بالا توضیح دادم چیکار کنی(هر دیوتی سایکلی که داشته باشه) ...حالا اگه میخوای دیوتی سایکل رو حساب کنی اون وقت باید کل زمان رو حساب کنی و مقدار روشن بودن رو تقسیم بر کل زمان بدست اومده بکنی...

                      دیدگاه


                        #12
                        پاسخ : تایمرavr


                        سلام من برنامه نویسی زبان سی رو تازه شروع کردم ممکنه در مورد برنامه زیر یه توضیحاتی بدین که نحوه پیکر بندی تایمر چطوریه ؟؟

                        #include<mega16.h>

                        #define xtal 8000000
                        void delay()
                        {
                        TCCR0=0B00000010; // Timer Clock = CLK/8
                        while(!TIFR&0x01); // Wait Until Overflow
                        TIFR=TIFR|0B00000001; // Clear TOV0
                        TCCR0=0x00; // Stop Timer0
                        }
                        void main()
                        {
                        DDRA=0xFF;
                        PORTA=0x00;
                        TCCR0=0x00;
                        TCNT0=0x00;
                        while(1){
                        PORTA.0=1;
                        delay();
                        PORTA.0=0;
                        delay();
                        }
                        }
                        کمتر به سایت میام .....

                        دیدگاه


                          #13
                          پاسخ : تایمرavr

                          سلام ............
                          ممکنه دقیقا بفرمایید کجای این کدها رو مشکل ذاری .
                          این کدها اکثرا کدهای رجیستریه که وضعیت رجیسترهای PORT وtimer رو مشخص میکنه . یکیشم که یه قالب تابع مانند که به عنوان تاخیر بیان شده . بازم اگه دقیق تر بفرمایید ادامه میدیم . موفق باشید .
                          دوستان! مدتی کمتر به سایت میام ..

                          دیدگاه


                            #14
                            پاسخ : تایمرavr

                            ممنون حسام جان که جواب دادی من زبان سی چیز زیادی بلد نیستم و تازه شروع کردم :sad:
                            اگه ممکنه که نحوه پیکر بندی تایمر در زبان سی چطوری و این کدها ثابت هستند مثلا در بیسیک واسه راه اندازی تایمر 0 کدهای زیر رو مینویسیم و ثابت هستند به غیر از مقسم فرکانس
                            config timer0 prescale xxx
                            enable timer 0
                            enable interrupts
                            on timer0 zirbarname timer

                            حالا تو زبان سی چطوریه ؟

                            TCCR0=0B00000010;
                            while(!TIFR&0x01);
                            TIFR=TIFR|0B00000001; //
                            TCCR0=0x00

                            کمتر به سایت میام .....

                            دیدگاه


                              #15
                              پاسخ : تایمرavr

                              کجاست یاری دهنده ای :mrgreen: یکی نبود یه راهنمایی کنه :cry:
                              کمتر به سایت میام .....

                              دیدگاه

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