আজকে একটি Atmega8 নিয়ে কয়েকটি এক্সপেরিমেন্টটি করব। Atmega8 এর তিনটি পোর্ট আছে । যেমনঃ
# Port B (PB0 to PB7)
# Port C (PC0 to PC6)
# Port D (PD0 to PD7)
প্রথম এক্সপেরিমেন্টঃ
একটা ব্রেড বোর্ডে নিচের ছবির মতো করে Atmega8 বসিয়ে ৮ টি এল ই ডি বাতি PortD তে ও তাদের সিরিজে ৮ টি রেজিস্ট্যান্স চিত্রের মতো করে লাগানো হলো।(পাওয়ার সাপ্লাই দেখানো হল। এক্সটার্নাল এডাপ্টার দিয়েও পাওয়ার সাপ্লাই দেয়া যাবে। ISP Programming PIN header আপাতত কোন কাজে লাগবেনা তবে পরবর্তিতে প্রোগ্রামার দিয়ে বার্নিং এর সময় কাজে লাগবে বলে বোর্ডে করে রাখা হল)
এর পর এই কমান্ড দেয়া হলোঃ
DDRD = 0b11111111; // PortD এর সবগুলো পিন আউটপুট হিসাবে সেট হলো।
PORTD = 0b00110001; // PortD এর পিন নং ৩,৪,৮ নং পিনে ১ সেট করা মানে ভোল্টেজ দেয়া হলো
প্রথমে 0b যুক্ত করা মানে আমরা সরাসরি বাইনারিতে কমান্ড দিচ্ছি। ঐ একই কাজ হেক্স কমান্ডেও দেয়া যেত তখন লিখতাম
PORTD = 0xF1; // লক্ষনীয় 0b এর পরিবর্তে 0x
কারন হেক্সাডেসিমেল পদ্ধতিতে চার বিট ব্যাবহার করে F=0011 আর 1 = 0001। ইচ্ছা করলে আমরা দশমিকেও কমান্ড দিতে পারে সেই ক্ষেত্রে 0b বা 0x ইত্যাদি Prefix ব্যাবহার করতে হয়না।
PORTD = 241; কারন বাইনারি 00110001 , দশমিক পদ্ধতিতে ২৪১ একই কথা। কিন্তু বাইনারি পদ্ধতিতে সরাসরি কি আউটপুট আসতে পারে তা সহজেই কল্পনা করা যায় বলে এখন আমরা বাইনারিতেই কমান্ড দিব।
যাই হোক এমতাবস্থায় চিত্র ৪ এর মতো করে শুধু ৩,৪,৮ বাতি জ্বলে উঠবে। ধরা যাক এমতাবস্থায় আমরা সিদ্ধান্ত নিলাম শুধু ১ নং এল ই ডি কে জ্বালাতে হবে। এবার AVR C ল্যাংগুয়েজের বিটওয়াইস ম্যানিপুলেটর ম্যাক্রোটি ব্যাবহার করব।
PORTD |=_BV(1); // ব্র্যাকেটের ভিতরের বিট পজিশন (এক্ষেত্রে ১ম বিট) কে অন করবে
এখানে _BV(?) একটি বিটওয়াইজ ম্যাক্রো যা ইচ্ছামত যে কোন বিটকে পরিবর্তন করতে পারে। ম্যাক্রোটির পর PortD এর অবস্থা হবেঃ 10110001
এবার আমরা ৩ নং বিটকে (বা এল ই ডি কে) অফ করতে চাইলে, ম্যাক্রো প্রয়োগ করব এভাবেঃ
PORTD &= !_BV(3)
২য় এক্সপেরিমেন্টঃ
এল ই ডি প্যাটার্ন ফ্লাশিং
প্রথম প্রোগ্রামটি একটি বৈচিত্রহীন কাজ। কারন ঐ কাজ করার জন্য MCU এর ব্যাবহার একটি মূল্যবান অপচয়। এই কাজ সাধারন সুইচ দিয়েও করা সম্ভব। তাই আমরা এখন একটি বৈচিত্রপূর্ন কাজ করব যাতে আমাদের মাইক্রো কন্ট্রোলার ব্যাবহার স্বার্থক হয়।
নিচের কোডটি লক্ষ্যকরিঃ
void sweep1()
{
PORTD = 0b10000000;
_delay_ms(100);
PORTD = 0b01000000;
_delay_ms(100);
PORTD = 0b00100000;
_delay_ms(100);
PORTD = 0b00010000;
_delay_ms(100);
PORTD = 0b00001000;
_delay_ms(100);
PORTD = 0b00000100;
_delay_ms(100);
PORTD = 0b00000010;
_delay_ms(100);
PORTD = 0b00000001;
_delay_ms(100);
PORTD = 0b00000000;
}
void sweep2()
{
for (int i=7;i>=0;i–)
{
PORTD = _BV(i);
_delay_ms(100);
}
PORTD = 0b00000000;
}
void sweep3()
{
PORTD = 0b10000000;
for (int i=0;i<8;i++)
{
_delay_ms(100);
PORTD >>= 1;
}
}
এখানে তিনটি প্যাটার্নে (,sweep1, sweep2, sweep3) এল ই ডি ফ্লাশিং করা হয়ছে যেখানে এক প্যাটার্ন শেষ হলেই পরের প্যাটার্ন শুরু হয়।
সুইপ১ –এ এক বিট এক বিট করে জ্বালানো হয়েছে। লক্ষ্য করুন প্রতিবার PortD কে নতুন করে সেট করা হয়েছে বাম থেকে ডানে ১ বিট কে সরিয়ে। প্রতিবার সরানোর মাঝা খানে _delay_ms(100); কমান্ডের মাধ্যমে ১০০ মিলি সেকেন্ডের একটা অপেক্ষা করা হয়েছে। এতে মনে হবে একটা আলো বাম থেকে ডানে এগিয়ে যাচ্ছে।
দ্বিতিয় সুইপে শেষ বিট থকে প্রথম দিকে একটা একটা করে (১০০ মিলি সেকেন্ড পরে) বাতি জ্বলে উঠছে। এটি করা হয়েছে ম্যাক্রো ব্যাবহার করে।
তৃতীয় সুইপে প্রথম প্যাটার্নটাই তৈরী করা হয়ছে তবে এক্ষেত্রে বিট শিফটিং করে।
কোড গুলো কোন প্রোগ্রামে করা হয়েছে
(এ ভি আর) সি ল্যাংগুয়েজ।
ok