آموزش میکروکنترلر PIC قسمت سوم تایمر ها(تولید تاخیر)
برنامه نویسی تایمر PIC18 به زبان C قسمت اولِ تولید تاخیر
PIC18 بسته به عضو خانواده دارای 2 تا 5تایمر می باشد. از تایمر ها می توان برای تولید تاخیر و نیز شمارش رویدادهایی که خارج از میکرو اتفاق میوفته استفاده کرد.هر تایمر نیاز به یک منبع پالس ساعت داره که میتونه داخلی یا خارجی باشه اگه منبع پالس ساعت داخلی باشه تایمر به برای تولید تاخیر زمانی(زمانسنج) استفاده و اگر منبع پالس ساعت خارجی باشه تایمر در این حالت شمارنده نامیده میشه
در این قسمت میبینیم که چطوری تایمر های0 و 1 برای تولید تاخیر به کار میرن و در قسمت های بعدی هم کاربرد های دیگه مثله شمارنده رو بررسی میکنیم.
رجیستر های تایمر 0:
تایمر صفر تایمری 16 بیتی است که میتواند در 2 مد 8بیتی و 16 بیتی به کار رود. استفاده از تایمر 0 به صورت 16 بیتی به صورت دو بایت بالا و پایین انجام میشه رجیستر پایین TMR0L و رجیستر بالا TMR0H می باشد.
رجیستر کنترل تایمر 0 T0CON نام داره و برای تنظیم مد های مختلف تایمر به کار میره بیت های این تایمر در جدول زیر نشون داده شده:
نکته:اگه بخوایم تایمر برای تولید تاخیر زمانی به کار بره بیت T0CS باید برابر صفر باشد.
نکته : توجه داشته باشید که مقدار فرکانس پالس داخلی که به تایمر میرسه یک چهارم مقدار نوسان ساز اصلی میکرو در صورتی که بیت های تقسیم گر تایمر صفر 0 باشند. مثلا اگه مقدار کریستال میکرو 10مگاهرتز باشه فرکانس پالس ساعت تایمر 2.5مگاهرتز میشه.
بیت پرچمTMR0IF
این بیت جزئی از رجیستر INTCON که وقتی مقدار تایمر به حداکثر خود یعنی FFFFH میرسه یک میشه از این بیت میشه برای اعلام وقفه سرریز تایمر که بعدا میگیم استفاده کرد. این بیت از طریق INTCONbits.TMR0IF قابل دسترسی میباشد.
مراحل برنامه نویسی تایمر 0 در مد 16بیتی:
- بیت T08BIT را برابر 0 میکنیم(مد16بیتی)
- T0CSرا روی منبع پالس داخلی قرار میدیم(T0CS=0)
- مابقی رجیسترا فعلا کاری نداریم(=0)
- چون در مد 16بیتی هستیم میتوانیم هر مقداری را در رنج 0000H تا FFFFH درون رجیستر های تایمر یعنی TMR0H و TMR0L بارگذاری کنیم.
- بعد از بار شدن TMR0H و TMR0L بیت TMR0ONاز رجیستر T0CON را برابر 1 میکنیم.
- تایمر شروع به شمارش به بالا میکنه تا به FFFFH برسه وقتی به این مقدار رسید TMR0IFبرابر 1 میشه
- بیت TMR0IF رو برابر صفر و رجیستر هایTMR0H و TMR0L دوباره مقدار میدیم تا تایمر آماده شروع دور بعدی شمارش بشه
مقدار تاخیر بستگی به مقدار اسیلاتور تایمر و نیز مقدارهای درون TMR0H و TMR0L داره برای محاسبه مقدار تایمر به روش زیر عمل میکنیم:
فرض کنید مقدار نوسان ساز تایمر 2.5مگاهرتزه (T=0.4uS) در این حالت هر یک واحدی که به رجیستر TMR0H و TMR0L تایمر به سمت بالا اضافه میشه 0.4میکرو ثانیه طول میکشه بنابراین با یه حساب ساده میشه گفت :
FFFFH که به دهدهی برابر 65535هست در این مقدار نوسان ساز حدود 26 میلی ثانیه طول میکشه حالا اگه بخوایم 10میلی ثانیه تاخیر رو ایجاد کنیم به شکل زیر عمل میکنیم:
10000uS/0.4uS=25000
65535-25000=40535
40535 TO HEX = 9E57
کافیه این مقدار رو توی TMR0H و TMR0L قرار بدیم تا تایمر تاخیری برابر 10میلی ثانیه رو ایجاد کنه:
TMR0H=0X9E
TMR0L=0X57
برای تولید زمان های بیشتر باید بیت های تقسیم کننده (PRESCLER) تایمر صفر رو تغییر بدیم.
مثال : در برنامه زیر بیت PORTB رو به طور مداوم با مقدار تاخیر 10میلی ثانیه معکوس میکند:
#include <P18F458.h>
void T0Delay()
{
TMR0H=0X9E;
TMR0L=0X57;
T0CONbits.TMR0ON=1;//ON TIMER
while(INTCONbits.TMR0IF==0);//WAIT FOR TIMER0 FLAG
T0CONbits.TMR0ON=0;//OFF TIMER
INTCONbits.TMR0IF=0;
}
void main(void)
{
TRISB=0;
while(1)
{
PORTB=0x55;
T0Delay();
PORTB=0xAA;
T0Delay();
}
}
مطالب مرتبط : |
برچسب ها:
Tags: آموزش برق و الکترونیک میکروکنترلر pic microcontroller pic سری PIC18F وقفه تایمرها در pic آموزش میکروکنترلر PIC تایمر ها آموزش میکروکنترلر PIC قسمت سوم تایمر ها تولید تاخیر
ببخشید این برنامممه ایی که نوشتین راجب فرکانسش چیزی ننوشتین ... فرکانس باید چند باشد؟
ممنون میشم با ایمیل برام جواب بفرستید
من نمیدونم مثلا ا زt0con تو برنامه چه جوری باید استفاده کرد
تنظیمات بیتیشو مشکلی ندارم فقط نحوه ی استفاده تو برنامه رو میخوام
من از mikroc استفاده میکنم
ممنونم
هرچقدر تلاش کردم نتیجه ای نداد.
اگر لطف کنید مثل برنامه های دیگر سورس کد و شبیه سازی را قرار دهید خیلی خوب میشه.
این فایل مربوط به کد و شبیه سازی هست.
http://s7.picofile.com/file/8253757176/Timer0.rar.html
اگر وقت کردید ممنون میشم بررسی کنید.
من این برنامه رو داخل proteus تست کردم جواب نداد.
مشکل از proteus هست؟
احتمالا برنامه رو اشتباه نوشتید
یک بار دیگه چک کنید کامل
چون احتمالش خیلی کمه که مشکل از پروتئوس باشه