تامیر 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
کمتر به سایت میام .....
دیدگاه
دیدگاه