قصد داریم یه چشمک زن تک لامپی بسازیم که هر 8 میلی ثانیه،چشمک بزنه
برای تنوع بیشتر،از کریستال خارجی 16 مگاهرتز استفاده میکنیم.
با فرکانس 16 مگاهرتز،حداکثر زمانی که میتونیم بسازیم 16 میکرو ثانیه است.
اما حالا میخوایم یه زمان 8 میلی ثانیه ای بسازیم،پس میریم سراغ انتخاب ضریب تقسیم مناسب !
در مورد انتخاب ضریب تقسیم در بخش 12 آموزشی وبلاگ توضیحاتی داده شده
یعنی با توجه به اینکه تایمر/کانتر شماره صفر 8 بیتیه و حداکثر میتونه تا 255 رو بشماره،باید حاصل TimerCount فرمولمون در رنج 0-255 قرار بگیره !
فرمولها هم که اینجوری بود :
به جدول زیر هم نگاه کنید :
مشاهده میکنید که رنج مورد نظر ما،تنها در ضریب تقسیم 1024 قابل دستیابیه !
در ضریب تقسیم های دیگر مقدار گام شمارش بیشتر از 255 است و از محدوده شمارش تایمر/کانتر صفر خارج است.
بریم سراغ برنامه نویسی و مقدار دهی رجیسترها :
#include<mega32.h>
void timer0_configuration(){}void main(){}
تابعی تعریف شده با نام timer0_configuration که پیکربندی تایمر/کانتر صفر در اون انجام میشه !
رجیستری داریم تحت عنوان TCCR0 :
با سه بیت اولش ضریب تقسیم تعیین میشه،طبق جدول زیر :
void timer0_configuration(){
TCCR0 |=(1<<CS00)|(1<<CS02);}
یه رجیستر دیگه هم داشتیم به نام TCNT0:
یه رجیستر دیتاست که حاوی مقدار تایمر/کانتر صفره !
برای اطمینان بیشتر،مقدارش رو در ابتدای کار صفر میکنیم !
void timer0_configuration(){
TCCR0 |=(1<<CS00)|(1<<CS02);
TCNT0 |=0;}
LED مون رو هم به پایه B0 میکروکنترلر وصل میکنیم،پس باید B0 به صورت خروجی تعریف بشه !
void main(){
DDRB =0x01;}
خب !
من اول کل کدهای تابع main رو مینویسم،بعد دربارش توضیح میدم :
void main(){
DDRB =0x01;
timer0_configuration();
while(1){
if(TCNT0>=124){
PORTB ^=(1<<PORTB0);TCNT0 =0;
}}}
یه دونه حلقه بینهایت تعریف کردیم و داخلش یه شرط گذاشتیم که اگه مقدار شمارش شده به 124 یا احیانا بیشتر از اون رسید پین B0 رو Toggle (خاموش/روشن) کنه !
در پایان هم مقدار تایمر/کانتر صفر رو صفر کردیم تا شمارش مجددا از صفر شروع بشه و به 124 برسه !
پس کل کدها به این صورت میشه :
#include<mega32.h>
void timer0_configuration(){
// Prescale : 1024
TCCR0 |=(1<<CS00)|(1<<CS02);
// Clear Timer/Counter0 Data
TCNT0 |=0;}
void main(){
// Configure B0 As Output
DDRB =0x01;
// Load Timer/Counter0 Configuration
timer0_configuration();
// Start Loopwhile(1){
// Check Timer/Counter Valueif(TCNT0>=124){
// Toggle PORTB0
PORTB ^=(1<<PORTB0);
// Reset Timer/Counter0 ValueTCNT0 =0;
}}}