کارگاه عملی - شماره 5 : کار با تایمر/کانتر دو [23](نویسنده: احسان نوری)
پنجمین قسمت کارگاه عملی با تشریح "برنامه نویسی تایمر/کانتر دو" آماده شده است.
پس با ما در ادامه مطلب همراه باشید ...
به نام خدا
بی مقدمه میریم سراغ کدنویسی !
کد نویسی به زبان سی در محیط کامپایلر کدویژن :
فرکانس کاری میکروکنترلر 16 مگاهرتز خارجی تعریف شده.
#include <mega32.h>
در ابتدای کار،طبق معمول فایل سرآیند مربوط به میکروکنترلر مورد نظرمون که اینجا ATmega32 هست رو اضافه میکنیم.
#include <mega32.h>
void timer2_configuration (){}
تابعی تعریف کردیم با نام : timer2_configuration ، که تنظیمات اولیه و پیکربندی تایمر/کانتر دو رو در اون انجام میدیم.
#include <mega32.h>
unsigned int overflow;
void timer1_configuration (){
TCCR2 |=(1<<CS21)|(1<<CS22); // Prescaler=256
TIMSK |=(1<<TOIE2); // Enable Timer2 Overflow
TCNT2=0; // Initialize Timer/Counter2
#asm ("sei"); // Enable Global Interrupts
overflow = 0; // Initialize variable
}
حرف جدیدی نزدم !
کامنت های روبروی هر کد رو که بخونید متوجه میشید.
بریم سراغ تابع main :
void main(){
DDRB.0 = 1; // Config B.0 As Output Pin
timer2_configuration (); // Load Timer2 Configuration
}
پین B.0 همون پایه ای هست که میخوایم بهش LED رو وصل کنیم.پس خروجی تعریف میشه !
در خط بعدی،تابع timer2_configuration رو فراخوانی میکنیم،تا تایمر/کانتر شماره دو پیکربندی بشه.
در قسمت بعد داریم :
while(1){
if(overflow>=12){
if(TCNT2>=53){
PORTB.0 ^=(1<<0); // Toggle LED
TCNT2=0; // Reset Timer/Counter2 Variable
overflow=0; // Reset Overflow Counter
}
}
}
این قسمت هم که مانند قبل بوود !
توضیحاتشو قبلا دادم (اینکه باید 12 بار تایمر/کانتر2 سرریز بشه و در دور 13 ام تا 53 بشماره !)
اما هنوز یه قسمت دیگه مونده که نباید فراموشش کنیم.
اگه گفتید چی ؟؟؟ ....
.
.
.
.
.
.
.
.
تنبل نباش برو یه نگاه کن ببین کجا رو ننوشتیم هنوز ؟!
.
.
.
.
.
.
.
.
.
.
امان از درد تنبلی !!!!!!
خودم میگم اصن.
شما نمیرید ببینیدکه چکار باید بکنیم !
اینجا ما از وقفه استنفاده کردیم.
پس زیر روالش کو ؟؟؟؟؟؟؟؟؟؟؟
بفرمایید :
interrupt [TIMER2 OVF] void timer2_isr (void) {
overflow++; // Add A Unit To overflow Variable
}
این هم از کل کدها،بصورت یکجا :
#include <mega32.h>
void timer2_configuration (){}
TCCR2 |=(1<<CS21)|(1<<CS22); // Prescaler=256
TIMSK |=(1<<TOIE2); // Enable Timer2 Overflow
TCNT2=0; // Initialize Timer/Counter2
#asm ("sei"); // Enable Global Interrupts
overflow = 0; // Initialize variable
}
interrupt [TIMER2 OVF] void timer2_isr (void) {
overflow++; // Add A Unit To overflow Variable
}
while(1){
if(overflow>=12){
if(TCNT2>=53){
PORTB.0 ^=(1<<0); // Toggle LED
TCNT2=0; // Reset Timer/Counter2 Variable
overflow=0; // Reset Overflow Counter
}
}
}
این هم از این یکی پست ...
توضیح کم دادم،چون قبلا اینها رو توضیح دادم.
خواهشا اگه خودتون پیگیر ماجرا نیستید،منو متهم نکنید.(متهم به ... (سه نقطه) !!! )
منتظر بخش های بعدی آموزش باشید که خیلی خیلی جالب و مفید خواهد بود.
در بخش های بعدی میخوام مُدهای مختلف تایمر/کانتر ها (CTC,PWM) رو توضیح بدم که مطمئنم خیلی با یادگرفتنشون حال میکنید.
فعلا ...