تامیر avr زمان اندازه گیری شده را با چه واحدی می ده میلی ثانیه ثانیه یا ...
اطلاعیه
Collapse
No announcement yet.
تایمرavr
Collapse
X
-
پاسخ : تایمر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 خودش برسه و سرریز بشه و بیت سرریز تولید کنه ، یک ثانیه هستش . پس جوابتون اینه که هم میتونه میکرو ثانیه باشه ، هم میلی ثانیه و هم ثانیه . موفق باشبید .
دوستان! مدتی کمتر به سایت میام ..
دیدگاه
-
پاسخ : تایمرavr
سلام.....شما برای اینکار چند تا راه داری....یکیش اینه که پالس ورودیت رو به یکی از اینتراپت های میکرو بدی و اینتراپت رو به لبه بالا رونده فعال کنی...بعد هر وقت پالست شروع شده تو زیر برنامه وقفه تایمرت رو روشن میکنی و همونجا وقفه رو به لبه پایین رونده فعال کنی و با اومدن وقفه بعدی تایمرت رو خاموش میکنی و مقدار TCNT تایمر رو میخونی...این میشه پهنای پالست(T).....فرکانس هم که میشه F=1/T .....فقط برای داشتن دقت بالا از تایمر 16 بیتی استفاده کن و فرکانس میکرو رو هم رو 16 بزار......
دیدگاه
-
پاسخ : تایمرavr
سلام دوست عزیز....اینتراپت ربطی به دیوتی سایکل نداره.....اون فقط لبه پایین رونده و بالا رونده رو میشناسه......حالا تو باید ببینی که دقیقا میخوای چیکار کنی...اگه فقط بخوای زمان رو شن بودن پالست رو اندازه بگیری که بالا توضیح دادم چیکار کنی(هر دیوتی سایکلی که داشته باشه) ...حالا اگه میخوای دیوتی سایکل رو حساب کنی اون وقت باید کل زمان رو حساب کنی و مقدار روشن بودن رو تقسیم بر کل زمان بدست اومده بکنی...نوشته اصلی توسط golgolakبا تشکر از همه اما در باره فعال کردن وقفه ها که دست عزیزم گفت این در حالتی درست است که duty cycle پالس برابر 50% باشد اما پالس من این طور نیست

دیدگاه
-
پاسخ : تایمر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();
}
}کمتر به سایت میام .....
دیدگاه
-
پاسخ : تایمرavr
سلام ............
ممکنه دقیقا بفرمایید کجای این کدها رو مشکل ذاری .
این کدها اکثرا کدهای رجیستریه که وضعیت رجیسترهای PORT وtimer رو مشخص میکنه . یکیشم که یه قالب تابع مانند که به عنوان تاخیر بیان شده . بازم اگه دقیق تر بفرمایید ادامه میدیم . موفق باشید .دوستان! مدتی کمتر به سایت میام ..
دیدگاه
-
پاسخ : تایمر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
کمتر به سایت میام .....
دیدگاه










دیدگاه