Chapter 7: Your first project with ATmega16 Microcontroller-LED Blinking | পর্ব ৭ঃ মাইক্রোকন্ট্রোলার দিয়ে প্রথম প্রজেক্টঃ এল ই ডি জ্বালানো, নেভানো
সবকিছুরই একটা শুরু থাকে। মাইক্রোকন্ট্রোলার প্রোগ্রামিংয়ের শুরু হল এলইডি ব্লিংকিং অর্থ্যাৎ একটি এলইডিকে পরপর জ্বালানো এবং নেভানো।
কাজটি খুবই সহজ। শুধুমাত্র মাইক্রোকন্ট্রোলারের যেকোনো একটি পোর্টকে বারবার হাই( প্রতি পিনে ৫ ভোল্ট) এবং লো(প্রতি পিনে ০ ভোল্ট) করে কাজটি করা যায়। যখন মাইক্রোকন্ট্রোলারের কোনো পোর্টের প্রতিটি পিনে ৫ ভোল্ট আউটপুট আসবে তখন সেই পিনগুলোর সাথে সংযুক্ত এলইডি জ্বলবে। যখন সেই পিনে ০ ভোল্ট আউটপুট আসবে তখন এলইডি নিভে যাবে। এভাবে একটি এলইডিকে বারবার ব্লিঙ্ক করানো যায়। এক্সপেরিমেন্টটি শুরু করার আগে আমাদের জানতে হবে ATmega16 মাইক্রোকন্ট্রোলারের পোর্ট কয়টি ও কী কী?
আই/ও পোর্টঃ আই/ও অর্থ হল ইনপুট/আউটপুট। মাইক্রোকন্ট্রোলারের পোর্টগুলোকে ইনপুট এবং আউটপুট দুই-ই হিসেবে ব্যবহার করা যায়। তাই পোর্ট গুলোকে আই/ও পোর্ট বলে। ATmega16 মাইক্রোকন্ট্রোলারের পোর্ট মোট চারটি। যথাঃ PortA, PortB, PortC & PortD। প্রতিটি পোর্টে আটটি পিন রয়েছে। পিন নম্বর ০ থেকে পিন নম্বর ৭। প্রতি পোর্টের তিনটি করে রেজিস্টার রয়েছে। যথাঃ ১)ডাটা রেজিস্টর ২)ডাটা ডিরেকশন রেজিস্টর ৩)ইনপুট পিন অ্যাড্রেস। এগুলো সবই ৮-বিটের রেজিস্টার।
PORTA ডাটা রেজিস্টর (PORTA): PORTA রেজিস্টার একটি রিড/রাইট রেজিস্টার। PORTA কে যখন আউটপুট হিসেবে প্রোগ্রাম করা হয় তখন PORTA রেজিস্টরে লজিক 0 অথবা লজিক 1 দিলে PORTA এর পিনগুলোর লজিক স্টেট চেঞ্জ হবে।
PORTA ডাটা ডিরেকশন রেজিস্টর (DDRA): এই রেজিস্টারটির কাজ হল PORTA এর প্রতিটি পিনের ডিরেকশন মানে সোজা বাংলায় পিনগুলো ইনপুট পিন নাকি আউটপুট পিন হিসেবে কাজ করবে তা নির্ধারণ করা। এই রেজিস্টরের কোনো বিটে 0 দিলে PORTA এর সেই বিটটি ইনপুট হিসেবে কাজ করবে এবং 1 দিলে PORTA এর সেই বিটটি আউটপুট হিসেবে কাজ করবে।
PORTA ইনপুট পিনস অ্যাড্রেস(PINA): এটি একটি রিড অনলি রেজিস্টার। কোনো পিনের লজিক রিড করতে চাইলে এই রেজিস্টরটি রিড করতে হবে।
PortB, PortC & PortD এর রেজিস্টরগুলোও হুবহু PORTA এর মতই। ওগুলো নিয়ে এখানে আলোচনা করা হল না। ATmega16 এর ডাটাশিট থেকে আপনি নিজেই পড়ে নিতে পারবেন।
আসুন, এবার আমাদের প্রথম প্রোগ্রামটি লিখি। প্রোগ্রাম লিখতে এখানে ব্যবহার করা হয়েছে AVRstudio.
ডিলে ফাংশন কনফিগার করাঃ
প্রোগ্রামে <util/delay.h>
ইনক্লুড করুন।
প্রোজেক্ট কনফিগারেশনে যান।
৩) আপনার মাইক্রোকন্ট্রোলারের ফ্রিকোয়েন্সি নির্ধারণ করুন এবং O1, O2, O3 কিংবা Os এর মধ্য থেকে অপ্টিমাইজেশন সিলেক্ট করুন।
৪) Os প্রোগ্রামের সাইজ অপ্টিমাইজ করে এবং O0 অপ্টিমাইজেশন বন্ধ করে। O1-O3 স্পিড অপ্টিমাইজ করে। বিভিন্ন অপ্টিমাইজেশন লেভেলের কারনে সিমুলেশন বা ডিবাগিং এর সময়ে আপনার মাইক্রোকন্ট্রোলার অদ্ভুত আচরন করতে পারে। কিন্তু বাস্তবে মাইক্রোকন্ট্রোলারে আপনার প্রোগ্রাম সঠিকভাবেই কাজ করবে।
৫) আরেকটি গুরুত্বপূর্ণ বিষয় মনে রাখতে হবে। সেটি হল-delay_us() 768uS/CPU_MHZ পর্যন্ত এবং delay_ms() 262ms/CPU_MHZ পর্যন্ত কাজ করে। আপনার যদি এমন একটি ডিলে প্রয়োজন হয় যা আরও বেশি সময় নিবে তাহলে নিচের ফাংশনটির মতো একটি ফাংশন লিখতে পারেন।
এটি একটি কাস্টম ফাংশন। কাস্টম ফাংশনের ব্যপারে পরে আলাপ করা হবে। প্রোগ্রামটি দেখতে এরকম হবে।
প্রোগ্রামটি AVR Studio এর একটি নতুন উইন্ডোতে লিখুন। সিমুলেশনের জন্য আপনাকে প্রথমে প্রোগ্রামটি বিল্ড করতে হবে। প্রথমে বিল্ড করার জন্য F7 এবং কম্পাইল করার জন্য ALT+F7 প্রেস করুন।
কখনও কখনও কিছু ওয়ার্নিং দেখায়। যদি একটু উপরে স্ক্রল করেন তাহলে একটু হলুদ রঙয়ের বৃত্ত চিহ্নিত অংশে ভুলগুলো দেখাবে। যদি মেসেজটি main() ফাংশনের রিটার্ন টাইপ নিয়ে হয় তাহলে ইগনোর করুন।
এবার প্রোগ্রাম সিমুলেশনের পালা। Debug (CTRL+F7) প্রেস করুন। বামদিকে একটি নতুন উইন্ডো খুলবে। ২ নং চিত্রে যেভাবে দেখানো হয়েছে সেভাবে I/O ATmega16 এক্সপ্যান্ড করুন।
এবার আমরা কোডটি পুরোপুরি পরীক্ষা করব। আমরা কোডটির প্রতিটি লাইন এক এক করে এক্সিকিউট করব। এই কাজটি করতে F11 প্রেস করতে হবে। এরপর একটি হলুদ রঙয়ের তীরকে নড়াচড়া করতে দেখা যাবে। DDRC = 0xFF লাইনটি এক্সিকিউট করার সাথে সাথে আউটপুট উইন্ডোটি পরিবর্তিত হয়ে নিচের ছবির মতো দেখাবে।
‘delay’ এক্সিকিউট করতে একটু বেশি সময় দরকার হবে। MicroC কম্পাইলারের ক্ষেত্রেও কোড একই। মাইক্রোসি তে কোনো হেডার ফাইন ইনক্লুড করতে হবে না। ওটা বাই ডিফল্ট ইনক্লুড করা থাকে। মাইক্রোসিতে কোডটি হবে এরকমঃ
void main()
{
DDRA = 0xFF;
unsigned int i;
while(1)
{
PORTA = 0xFF;
Delay_ms(1000); // Delay function in MikroC. Parameter= mili second
PORTA = 0x00;
Delay_ms(1000);
}
}
যেহেতু প্রোগ্রামটি খুবই সিম্পল সেহেতু আমরা কোনো রিয়েল লাইফ সার্কিট তৈরী করব না। আমরা প্রোটিয়াসে সার্কিটটি সিমুলেট করব।
উপরের ডায়াগ্রামটিতে দেখানো মাইক্রোকন্ট্রোলারের উপর রাইট ক্লিক করতে হবে। এবং ‘Edit properties’ সিলেক্ট করতে হবে। ‘Edit component’ নামক উইন্ডোটি খুললে সেখান থেকে সঠিক ওসিলেটর ফ্রিকোয়েন্সি সিলেক্ট করতে হবে। (নীল রঙ দ্বারা চিহ্নিত বাক্সটিতে দেখা যাচ্ছে। বাই ডিফল্ট ফ্রিকোয়েন্সি হল Int RC 1MHZ)। প্রোগ্রাম কম্পাইল করার সাথে সাথেই একটি ‘হেক্স’(Hex) ফাইল তৈরী হয়। হেক্স ফাইলটি মাইক্রোকন্ট্রোলারে আপলোড করার জন্য লাল চিহ্নিত বাক্সে ক্লিক করে ব্রাউজ করুন।
AVR studio এর জন্যঃ যে ফোল্ডারে প্রোগ্রামটি সেভ করেছেন সেই ফোল্ডারে যান।ফোল্ডারের ভেতরে ;Default নামক আরেকটি ফোল্ডার পাবেন। সেই ফোল্ডারে আপনি .hex এক্সটেনশনের একটি ফাইল পাবেন।
MicroC এর জন্যঃ প্যারেন্ট ফোল্ডারেই হেক্স ফাইলটি পেয়ে যাবেন।হ্রেক্স ফাইল আপলোড করার পর প্লে বাটনে ক্লিক করুন এবং সিমুলেশন দেখুন।
নোটঃ LED ব্যবহারের আগে LED সম্পর্কে কিছু ব্যপার জানতে হবে। এলইডি’র ইন্টারনাল রেজিস্টেন্স খুবই কম। এলইডি’র অ্যানোডে সরাসরি ৫ ভোল্ট দিলে এর ভেতর দিয়ে অনেক বেশি কারেন্ট প্রবাহিত হবে এবং এলইডিটা পুড়ে যাবে। কারেন্ট লিমিট করার জন্য তাই এলইডির সাথে সিরিজে একটি রেজিস্টর সংযুক্ত করতে হবে। সাধারনত, যত বেশি কারেন্ট প্রবাহিত হয় এলইডির আলো তত উজ্জ্বল হয়। বেশিরভাগ এলইডি অন্তঃত ১৫ মিলি অ্যাম্পিয়ার পর্যন্ত কারেন্ট সহ্য করতে পারে। যদি ৫ ভোল্ট পাওয়ার সাপ্লাই ব্যবহার করেন তাহলে ওহমের সূত্র থেকে পাই R=V/I, সুতরাং, R=5/0.015mA =333 ohm.