Chapter 15:Timers of ATmega16A Microcontroller | পর্ব ১৫ঃ টাইমার
টাইমার কী?
প্রতিদিনই আমরা টাইমার ব্যবহার করছি। টাইমারের সবচেয়ে সহজ উদাহরণ হল আমাদের হাতঘড়ি যা ঘন্টা, মিনিট এবং সেকেন্ড গননা করে। এভিআর মাইক্রোকন্ট্রোলারের টাইমারের কাজও ঠিক এরকম। সময় গননা করা। টাইমার প্রধানত একটি রেজিস্টার। এভিআর মাইক্রোকন্ট্রোলারের চিপগুলোর ভেতরে টাইমারের একটি আলাদা সার্কিট থাকে যেটি মূল প্রোগ্রামের উপর নির্ভরশীল নয়। ধরা যাক আমরা চাইছি একটি এলইডি ঠিক পাঁচ সেকেন্ড পরপর জ্বলবে, কিংবা একটি পানির মোটর ঠিক বিকাল চারটায় অন হবে। এই ধরনের কাজ আমরা টাইমার কনফিগার করে সহজেই করতে পারি।
ATmega16 এর তিনটি টাইমার আছে।
Timer 0-এটি একটি ৮-বিটের টাইমার। ০ থেকে ২৫৫ পর্যন্ত ভ্যালু ধরে রাখতে সক্ষম।
Timer 1-এটি একটি ১৬-বিটের টাইমার। ০ থেকে ৬৫৫৩৫ পর্যন্ত ভ্যালু ধরে রাখতে সক্ষম।
Timer 2- এটি একটি ৮-বিটের টাইমার। ০ থেকে ২৫৫ পর্যন্ত ভ্যালু ধরে রাখতে সক্ষম।
টাইমারের গননা প্রক্রিয়াঃ
রেজিস্টারের ভ্যালু পূর্বনির্ধারিত হারে নিজে নিজেই বাড়ে অথবা কমে। মাইক্রোকন্ট্রোলারের মতই টাইমারেরও কার্যকর হবার জন্য একটি ক্লক পালসের প্রয়োজন হয়। প্রতিটি ক্লক পালসের সাথে সাথে টাইমারের কাউন্টারের ভ্যালু এক করে বাড়তে থাকে।
টাইমার রেজলিউশন=১/ইনপুট ফ্রিকোয়েন্সি
ধরা যাক, ইনপুট ফ্রিকোয়ন্সি=১০০ কিলোহার্জ।
তাহলে, টাইমার রেজলিউশন=১/১০০ কিলোহার্জ =০.০১ সেকেন্ড।
সুতরাং, ০ থেকে ২৫৫ পর্যন্ত গননা করতে টাইমারটির সময় লাগবে =২৫৬*০.০১=২.৫৬ সেকেন্ড।
অর্থ্যাত, টাইমারটির টাইম পিরিয়ড-২.৫৬ সেকেন্ড।
Timer0 এর রেজিস্টারসমূহঃ
a)OCR(Output compare register) এবং TCNT0(Timer counter register): আউটপুট কম্পেয়ার রেজিস্টার একটি ৮-বিটের ভ্যালু ধারন করে যা বারবার তুলনা করা হয় TCNT0 এর সাথে। যখন এই দুটির ভ্যালু এক হয় তখন একটি আউটপুট কম্পেয়ার ইন্টারাপ্ট জেনারেট হয় কিংবা OC0 পিনে একটি ওয়েভফর্ম আউটপুট জেনারেট হয়।
b)Timer counter control register(TCCR0): এটি একটি ৮-বিটের রেজিস্টার। বিটগুলোর নাম এবং কাজ নিচে আলোচনা করা হল।
WGM00 ও WGM01: এই বিট দুটি নির্ধারন করে টাইমার কোন মোডে চলবে। নর্মাল, পিডব্লিউএম ফেজ কারেক্ট, সিটিসি এবং ফাস্ট পিডব্লিউ এম, এই চারটা মোডে টাইমার চলতে পারে।
নরমাল মোডঃ নরমাল মোডে WGM00 ও WGM01 এর ভ্যালু হবে ০। সবগুলোর মধ্যে এটিই সবচেয়ে সহজ।এই মোডে TCNT0 এর ভ্যালু বাড়তে বাড়তে সর্বোচ্চ অর্থ্যাৎ ২৫৫ হবার সাথে সাথে টাইমারের ভ্যালু নিজে নিজেই ০ হয়ে যায় এবং আবার গননা শুরু হয়। এই ঘটনাটি ওভারফ্লো(Overflow) নামে পরিচিত।
সিটিসিঃ সিটিসি মোডে TCNT0 কে সারাক্ষণ তুলনা করা হয় OCR এর সাথে। যখনই এই দুইয়ের ভ্যালু ম্যাচ করে, তখনই একটি ইন্টারাপ্ট জেনারেট হয় এবং TCNT0 এর ভ্যালু রিসেট হয়। এবং আবার ০ থেকে গননা শুরু হয়। এই মোড সিলেক্ট করার জন্য WGM00 এর ভ্যালু 0 ও WGM01 এর ভ্যালু 1 করতে হবে।
বাকি দুইটি মোড সম্পর্কে এই অধ্যায়ে আলোচনা করা হবে না।
COM00 ও COM01: এই বিটদুটি নির্ধারন করে টাইমার ইন্টারাপটের সাথে সাথে OC0 পিনে কোনো আউটপুট জেনারেট হবে কী হবে না।
CS00 থেকে CS02: টাইমারকে সক্রিয় করতে একটি ক্লক সিগন্যালের প্রয়োজন। এই ক্লক সিগন্যাল বাইরে থেকেও দেওয়া যায় আবার প্রি স্কেলার নির্ধারনের মাধ্যমে মাইক্রোকন্ট্রোলারের ক্লক থেকেও নেওয়া যায়। এই তিনটি বিট প্রি স্কেলার নির্ধারন করে।
c)Timer/counter interrupt musk register(TIMSK):এটি একটি ৮-বিটের রেজিস্টার। বিটগুলোর নাম এবং কাজ নিচে আলোচনা করা হল।
OCIE0, OCIE1A,OCIEBঃ OCIE2: OCIE0 Timer 0 এর জন্য, OCIE1A-B Timer 1 এর জন্য এবং OCIE2 Timer2 এর জন্য। এই বিটগুলো Timer/counter compare match interrupt সক্রিয় করে।
TOIE0,TOIE1,TICIE1 ও TOIE2ঃ TOIE0 Timer 0 এর জন্য,TOIE1,TICIE1 Timer 1 এর জন্য , TOIE2 Timer2 এর জন্য।এই বিটগুলো Timer/counter overflow interrupt সক্রিয় করে।
Interrupt flag register(TIFR):এটি একটি ৮-বিটের রেজিস্টার। বিটগুলোর নাম এবং কাজ নিচে আলোচনা করা হল।
OCF0,OCF1A-B,OCF2:এই বিটগুলো যথাক্রমে TImer 0,1 এবং ২ এর জন্য। এই বিটগুলো সংশ্লিষ্ট টাইমারের OCR এবং TCNT এর ভ্যালু এক হয় তখনই এই ফ্ল্যাগ বিটটির ভ্যালু 0 থেকে 1 হয়ে যায়।
TOV0-2:এই বিটগুলো যথাক্রমে TImer 0,1 এবং ২ এর জন্য। এই বিটগুলো সংশ্লিষ্ট টাইমারের নির্দেশ করে। সংশ্লিষ্ট টাইমারে ওভারফ্লো দেখা দিলে এই বিটগুলো 0 থেকে 1 হয়ে যায়।
টাইমারের সূত্রঃ
OCR এর কাঙ্খিত ভ্যালু=সেকেন্ডে সময়*মাইক্রোকন্ট্রোলারের ফ্রিকোয়েন্সি/(প্রি স্কেলার)
ধরা যাক, আমরা ১ মিলি সেকেন্ডের একটি টাইমার তৈরী করব।
সুতরাং ঃ
সময়=১ মিলি সেকেন্ড
মাইক্রোকন্ট্রোলারের ফ্রিকোয়েন্সি= ৮০০০০০০ হার্জ
প্রি স্কেলার=৬৪(ধরা যাক)
অতএব, OCR এর কাঙ্খিত ভ্যালু=(০.০০০১* ৮০০০০০০)/৬৪=১২৫। এবং আট বিটের TCNT এর ভ্যালু=(২৫৫-১২৫)=১৩০।
প্রোগ্রামঃ এবার আমরা একটি এলইডিকে ঠিক এক সেকেন্ড পরপর অন-অফ করব। আমরা কাজটি আমরা আগেও করেছি ডিলে ফাংশন ব্যবহার করে। কিন্তু, এবার আমরা ডিলে ফাংশন ব্যবহার করব না। আমরা এই কাজটি করব টাইমার দিয়ে।
এবার কোডটি বিল্ড করে, মাইক্রোকন্ট্রোলারে লোড করুন এবং নিচের ছবির মতো করে PB0 পিনে LED লাগিয়ে ফলাফল দেখুন।