به نام خدا!
سلام!
امیدوارم حال همتون خوب باشه! - انشالله!
خوب امروز میخوام تایمر کانتر رو توی LPC1768 توضیح بدم!
اگه نمیدونید تایمر کانتر چیه! توی جمله میتونیم بگیم!
کانتر یعنی شمارنده و کار اصلی آن شمارشه! با اون میشه تایمر درست کرد!
این بخش از CPU جداست چونکه دیگه CPU درگیر اینکارا نشه!
خیلی کاربردی توی پروژه های بزرگ!
یه چیز جالب : اگه یادتون باشه توی میکرو های AVR که رجیستر های 8بیتی داشت! فقط میتونست تا 255 بشمره و حالا بعضی از رجیستر هاش 65 هزار تا میشمرد اما توی ARM 4 تا رجیستر 32 بیتی داره یعنی میتونه تا 4 ملیارد بشمره و این خیلی خیلی عدد بزرگیه! حالا به ARM افتخار کنید و سعی کنید به بهترین صورت از این میکرو استفاده کنید!
خوب بریم سراغ برنامه نویسی و رجیستر!
همونطور که در بالا اشاره شد! LPC1768 دارای 4 رجیستر 32 بیتی کانتر می باشد!
مراحل تنظیم رجیستر تایمر کانتر
مرحله به مرحله گفته شده تا خوب یاد بگیرید!
- روشن کردن تایمر کانتر با رجیستر PCONP (تایمر 1و0 روشنه ولی 3و2 رو خودتون باید روشن کنید)
- ریست کردن و خاموش کردن تایمر کانتر
- انتخاب مقدار مقسم برای تقسیم فرکانس CPU میکرو برای تایمر!
- تعیین مقدار MR0 جهت مقایسه با عدد شمارنده و فعال کردن وقفه پس از تساوی دو رجیستر
- صفر کردن مقدار تایمر کانتر
- فعال کردن وقفه تایمر 2 از طریق NVIC
- روشن کردن تایمر کانتر و شروع کردن به شمارش
- نوشتن برنامه تابع وقفه تایمر کانتر (انجام وظیفه مورد نظر پس از شمارش)
ما در اینجا فقط به رجیستر های مورد نظر اشاره کردیم و برای دستیابی به همه رجیستر های تایمر میتونید دیتاشیت میکرو رو مطالعه کنید!
رجیستر TCR (Timer Counter Rgister)
با این رجیستر تنظیمات نخستین رو انجام میدم این تنظیمات اعم از ریست کردن تایمر و خاموش کردن اون هست
بیت 0 : فعال/ غیرفعال کردن تایمر کانتر! (اگه صفر بزارید غیر فعال میشه و اگه 1 بزارید فعال میشه)
بیت 1 : ریست کردن مقدار تایمر / کانتر
رجیستر MR0
هر مقداری که توی این رجیستر بنویسید هر وقت TC (تایمر / کانتر ) 1 واحد بهش اضافه بشه این رجیستر باهاش مقایسه میشه تا زمانی که با هم برابر باشند! (اون موقع میره تو فرایند وقفه و کاری که گفتیم رو انجام میده)
رجیستر MCR (Match Control Rgister)
این رجیستر برای تعیین وقفه و اینکه بعد از اینکه مقدار MR0 با تایمر کانتر برابر شد چه کاری انجام یشه!
بیت 0: اگه 1 بشه بعد از اینکه MR0 با تایمر کانتر برابر شد وقفه تولید میشه! و اگه صفر باشه وقفه تولید نمیشه!
بیت 1: اگه 1 بشه یعنی وقتی MR0 با تایمر کانتر برابر شد دوباره از اول شروع کن به شمارش و به شمارش قبلیت ادامه نده! ولی وقت 0 باشه یعنی ادامه شمارش رو انجام بده!
رجیستر IR (Interrupt Rgister)
خوب اگه توی این رجیستر 1 بنویسین وقفه ی تولید شده پاک میشه!( این کار اجباریه و اگه این کار رو نکنید برنامه توی زیر برنامه وقفه یا همون تابع گیر میکنه)
خوب کافیه برای پاک کردنش توی این رجیستر 1 بنویسین!
مثلا برای پاک کردن وقفه MR0 مینویسیم!
LPC_TIM2->IR=1;
خوب رجیستر ها تموم شد! (کامل تشریح نشده وگرنه رجیستر های دیگه هم وجود داره شما خودتون برید توی USER MANUAL بخونید)
برنامه نمونه!
میکرو روی 100 مگاهرتز تنظیم شده و میخوایم زمان 1 ثانیه تولید کنیم که بعد از 1 ثانیه یه ال ای دی روشن میشه!
#include <LPC17xx.h>
int a=1;
void TIMER2_IRQHandler (void) // تابه زیر روال وقفه تایمر کانتر
{
LPC_TIM2->IR=1; // پاک کردن پرچم وقفه
LPC_GPIO2->FIOSET=a; // روشن کردن ال ای دی
a*=2;
}
int main(){
SystemInit(); // راه اندازی اولیه میکرو (فرکانس میکرو 100 مگاهرتزه)
LPC_GPIO2->FIODIR=0Xff; // خروجی کردن ال ای دی
LPC_GPIO2->FIOCLR=0Xff;
LPC_SC->PCONP|= (1<<22); // روشن کردن تایمر 2
LPC_TIM2->TCR=0X2; // ریست کردن و خاموش کردن تایمر کانتر
LPC_TIM2->PR=0X00; // شریب تقسیم 0 است
LPC_TIM2->MR0=24999999; // عدد 25 ملیون رو با مقدار تایمر/کانتر مقایشه کن
LPC_TIM2->MCR=0X3; // فعال کردن وقفه و ریست کردن مقدار تایمر/کانتر بعد از تساوی رجیستر بالا با مقدار تایمر کانتر
LPC_TIM2->TC=0X0; // مقدار اولیه تایمر/کانتر رو 0 قرار بده
NVIC_EnableIRQ(TIMER2_IRQn); // فعال کردن وقفه ی تایمر کانتر 2
LPC_TIM2->TCR=0X01; // روشن کردن تایمر کانتر و شروع کردن به شمارش
while(1)
{
}
}
دیگه چیز خاصی برای توضیح نداره!
امیدوارم به دردتون خورده باشه!
فعلا!
یا علی مدد...!