১৩. 8051 এ প্রথম প্রোগ্রাম এবং সিমুলেশন
এর আগের সব পোস্টে আমরা যা যা পড়েছি সবই ছিল 8051 মাইক্রোকন্ট্রোলার রিলেটেড থিওরিটিক্যাল জ্ঞান। আসলে একটি সিস্টেম সম্পর্কে থিওরিটিক্যাল জ্ঞান ভালো না হলে কখনই প্র্যাক্টিকাল ফিল্ডে ভালো করা যায়না। আমাদের অনেকরই ভুল ধারনা যে, যে প্র্যাক্টিকাল কাজে ভালো হয়, সে হয়ত থিওরিটিক্যালি দুর্বল হয় বা থিওরিটিক্যাল বিষয় বস্তু নেগ্লেক্ট করে। কিন্তু এমনটা কখনই নয়। একটা সিস্টেমে হাত দেয়ার আগে অবশ্যই সেটার থিওরিটিক্যাল বিষয় সম্পর্কে ভালোভাবে অবগত হতে হবে এবং সুস্পষ্ট ধারনা থাকতে হবে। আবার থিওরিটিক্যালি অনেক স্ট্রং হয়েও হাতে কলমে কাজ না করলে কিন্তু লাভ নেই। কারন একটি কাজ থিওরিটিক্যালি যতটা না সহজ বলে মনে হয় প্র্যাক্টিকালি করতে গেলে আসলে বোঝা যায় যে কত খুঁটিনাটি সমস্যা এসে হাজির হয় কাজটিতে।
মাইক্রোকন্ট্রোলারের ক্ষেত্রেই চিন্তা করা যাক, 8051 মাইক্রোকন্ট্রোলারের সব রেজিস্টার এবং বিট সম্পর্কে যদি আমাদের ধারনা না থাকে, অর্থাৎ কোন বিট কোন কাজ করে সেই বিষয়ে যদি আমাদের ধারনা না থাকে তাহলে কখনই আমরা মাইক্রোকন্ট্রোলারের প্রোগ্রাম করতে পারবোনা। আবার আমরা কোনভাবে হয়ত রেজিস্টার বিট সম্পর্কে জেনে প্রোগ্রাম করা শিখলাম এবং আমাদের প্রোগ্রাম যে সঠিক হয়েছে সেটা পিসি তে ভার্চুয়ালি সিমুলেট করে দেখলাম ও। এখন এই একই কাজটি যদি প্র্যাক্টিকালি ইমপ্লিমেন্ট করতে বলা হয় তাহলে দেখা যাবে যে হাজারটা সমস্যা এসে হাজির হয়েছে। একে তো মাইক্রোকন্ট্রোলারকে বার্ন করার ঝামেলা, তারপর আবার দেখা যাচ্ছে আমরা যা করতে চেয়েছিলাম হয়ত মাইক্রোকন্ট্রোলার তেমনটা করছে না মানে তেমন রেজাল্ট শো করছে না। এরকম আরও অনেক সমস্যা এসে হাজির হবে কোন একটি কাজকে প্র্যাক্টিকালি ইমপ্লিমেন্ট করতে গেলে। সেগুলো সম্পর্কে আমরা পরে বিস্তারিত ভাবে জানতে পারবো এবং সল্ভও করতে পারবো আশা করি।
আজকে আমরা মূলত 8051 মাইক্রোকন্ট্রোলারে একটি LED বাল্ব ব্লিঙ্ক করার প্রোগ্রাম করা শিখব। এই প্রোগ্রামকে আসলে মাইক্রোকন্ট্রোলারের 'Hello World' প্রোগ্রাম বলা হয়ে থাকে। আমরা আপাতত সবকিছুই সিমুলেশন করে শিখব। এবং মোটামোটিভাবে সব শিখে ফেললে হার্ডওয়্যারের মাধ্যমে ইমপ্লিমেন্ট করব।
8051 মাইক্রোকন্ট্রোলারে সি-কোড করার জন্যে আমাদের একটি IDE (Keil4_for_8051) লাগবে এবং কোড করার পর সেটা ঠিক আছে কিনা সেটা দেখার জন্যে একটি সিমুলেশন সফটওয়্যার (Proteus 7.6) লাগবে। এই লিঙ্ক দুটি থেকে আমরা সফটওয়্যার দুটি ডাউনলোড করে নিতে পারি। keil IDE টিতে 8051 মাইক্রোকন্ট্রোলারের জন্যে কীভাবে প্রোগ্রাম লিখে কম্পাইল করতে হয় এর জন্যে নিচের চিত্র গুলো দেখলেই হবে আশা করি।
প্রোটিয়াসে সাধারণত আমরা সবাই কমবেশি সার্কিট সিমুলেশন করতে পারি। আমাদের যে যে কম্পোনেন্ট লাগবে তার সবই প্রোটিয়াসে দেয়াই থাকে। আমাদেরকে জাস্ট P বাটনটি টিপে সার্চ উইন্ডোতে যেয়ে আমাদের প্রয়োজনীয় কম্পোনেন্টের নাম টাইপ করতে হবে এবং সেগুলোর ভ্যালু চেঞ্জ করার দরকার হলে ওগুলোর উপর ডাবল ক্লিক করলেই এডিট করার অপশন আসবে। একই ভাবে মাইক্রোকন্ট্রোলারের উপর ডাবল ক্লিক করে আমরা আমাদের হেক্স কোডের ডিরেকশন ব্রাউজ করতে পারি।
আচ্ছা আমাদের আজকের টার্গেট হল আমরা 8051 মাইক্রোকন্ট্রোলারের পোর্ট-২ এর ০ নম্বর পিনের অর্থাৎ P2.0 (মাইক্রোকন্ট্রোলারের ২১ নম্বর) এর মাধ্যমে একটি LED বাল্ব কিছুক্ষন পর পর অন এবং অফ করব (ব্লিঙ্কিং)। যেহেতু ইনপুট/আউটপুট 8051 মাইক্রোকন্ট্রোলারের একটি পেরিফেরাল্স সেহেতু এই পেরিফেরাল্সকে এক্টিভেট করার জন্যে আমাদের কোন রেজিস্টারের কোন একটি বিট নিয়ে কাজ করতে হবে। পোর্ট-২ এর জন্যে 8051 মাইক্রোকন্ট্রোলারের যে রেজিস্টার রয়েছে তার নাম হল P2 রেজিস্টার। নিচে এর চিত্র দেয়া হল।
এই রেজিস্টারের যে আটটি বিট দেখতে পাচ্ছি আমরা এই আটটি বিটের একেকটি বিট একেকটি ইনপুট/আওউটপুট পিনের সাথে সংশ্লিষ্ট। যেমন P2.0 বিট টি 8051 মাইক্রোকন্ট্রোলারের ২১নম্বর পিন (P2.0) এর সাথে সংশ্লিষ্ট। আবার P2.6 বিটটি মাইক্রোকন্ট্রোলারের ২৭ নম্বর পিন (P2.6) এর সাথে সংশ্লিষ্ট। এভাবে প্রত্যেকটা ইনপুট/আউটপুট পিনের জন্যেই একটি করে বিট রয়েছে। সেই বিটটি রিড/রাইটের মাধ্যমে আমরা সংশ্লিষ্ট পিনকে কন্ট্রোল করতে পারি।
কোন নির্দিষ্ট পিনকে আউটপুট হিসেবে ব্যবহার করতে হলে ঐ পিনের সাথে সংশ্লিষ্ট বিটকে ক্লিয়ার (0) করে দিতে হবে। আর ইনপুট হিসেবে ব্যবহার করতে চাইলে ঐ পিনের সাথে সংশ্লিষ্ট বিটকে হাই (1) করে দিতে হবে। বাই-ডিফল্ট অবশ্য ইনপুট/আউটপুট পোর্টের সব বিট- ই হাই (1) থাকে। অর্থাৎ বাই-ডিফল্ট সব পিনই ইনপুট হিসেবে কাজ করে।
কোন পিনকে আউটপুট হিসেবে ডিক্লেয়ার করা হলে সেই পিনটি কারেন্ট সিঙ্ক করে। অর্থাৎ বাইরের উৎস থেকে কারেন্ট লোডের মধ্য দিয়ে প্রবাহিত হয়ে পিনের মধ্যে দিয়ে গ্রাউন্ডে পৌছায়। এক্ষেত্রে কিন্তু কোন একটি পোর্টের সব গুলো পিনের মধ্যে দিয়ে সর্বমোট ১৫ মিলি অ্যাাম্পিয়ার কারেন্টই প্রবাহিত হতে পারে। পোর্ট-০ এর ক্ষেত্রে যেহেতু পুল-আপ রেজিস্টার দেয়া নেই সেহেতু সর্বমোট ২৬ মিলি অ্যাম্পিয়ার কারেন্ট প্রবাহিত হতে পারে। আর যদি কোন একটি পোর্টের যেকোন একটি পিনকে ব্যবহার করা হয় তাহলে ম্যাক্সিমাম ১০ মিলি অ্যাম্পিয়ার কারেন্ট প্রবাহিত হতে পারে। সবগুলো পোর্ট ব্যবহার করা হলে ম্যাক্সিমাম কারেন্টের পরিমান দাড়ায় ৭১ মিলি অ্যাম্পিয়ার। এখন যদি মাইক্রোকন্ট্রোলারের পিনের সাথে এমন লোড ডিরেক্ট লাগানো হয় যে এই ম্যাক্সিমাম রেটিং এর চেয়ে বেশি কারেন্ট টানে তাহলে মাইক্রোকন্ট্রোলারের পোর্টগুলো নষ্ট হয়ে যাবে। তো মাইক্রোকন্ট্রোলারের পিনের সাথে লোড সংযোগ করার সময় অবশ্যই আমাদেরকে কারেন্ট রেটিং এর এই বিষয়টি মাথায় রাখতে হবে এবং সেই অনুযায়ী সিরিজে রেজিস্ট্যান্স লাগিয়ে নিতে হবে।
আমরা P2.0 পিনের মাধ্যমে LED অন অফ করতে চাই। অর্থাৎ এক্ষেত্রে আমাদের কাছে লোড হল LED বাল্ব। এবং ধরে নিলাম আমাদের LED বাল্বটি হল Red LED. তাহলে রেড LED এর ফরওয়ার্ড ভোল্টেজ ড্রপ হল ১.৭ ভোল্ট। আর আমাদের মাইক্রোকন্ট্রোলারের প্রত্যেক পিনের ভোল্টেজ ডিফারেন্স গ্রাউন্ডের সাপেক্ষে ৫ ভোল্ট। তাহলে এখন যদি LED কে সরাসরি P2.0 পিনের সাথে কানেক্ট করা হয় তাহলে উক্ত পিনটি ম্যাক্সিমাম কারেন্টই সিঙ্ক করবে। এবিষয়ে সন্দেহ নেই। কিন্তু আমরা যদি এমনটা চাই যে P2.0 পিনটি ৫ মিলি অ্যাম্পিয়ার কারেন্ট সিঙ্ক করুক তাহলে উপায় কি? তাহলে উপায় হল ওহম'র সুত্র। V = IR.
V = Pin Voltage - forward Voltage drop of led
= ৫ - ১.৭
= ৩.৩
R = V/I
= ৩.৩ volt / ৫ m.amp
= ৬৬০ ohm
অর্থাৎ ৫মিলিঅ্যাম্পিয়ার কারেন্ট ফ্লো করার জন্যে আমাদেরকে সিরিজে একটি ৬৬০ ওহমের রেজিস্ট্যান্স যুক্ত করতে হবে। যেহেতু বাজারে কিছু স্ট্যান্ডার্ড মানের রেজিস্ট্যান্সই পাওয়া যায় সেহেতু আমরা ৬৮০ ওহমের রেজিস্ট্যান্স যুক্ত করতে পারি। অবশ্য ভার্চুয়াল সিমুলেশনের জন্যে এই রেজিস্ট্যান্স যুক্ত না করলেও কোন সমস্যা নেই। সার্কিট দেখতে অনেকটা নিচের মত হবে।
মাইক্রোকন্ট্রোলারের বামদিকের কানেকশনগুলো কেন দেয়া এটা জানার জন্যে এই পোস্টটি পড়তে হবে।
এবারে তাহলে প্রোগ্রামিং পার্টটি দেখে নেয়া যাক।
1: #include <reg52.H> // special function register declarations
2: // for the intended 8051 derivative
4: sbit LED = P2^0; // Defining LED pin
5:
6: void Delay(void); // Function prototype declaration
7:
8: void main (void)
9: {
10: LED = 0x00;
11:
12: while(1) // infinite loop
13: {
14: LED = 0; // LED ON
15: Delay();
16: LED = 1; // LED OFF
17: Delay();
18: }
19: }
20:
21: void Delay(void) //make cpu busy in two loops counting numbers
22: {
23: int j;
24: int i;
25: for(i=0;i<10;i++)
26: {
27: for(j=0;j<10000;j++)
28: {
29: }
30: }
31: }
উপরের অংশে আমরা একদম সিমপল একটি প্রোগ্রাম দেখতে পাচ্ছি। প্রোগ্রামের প্রথমেই আমরা #include<reg52.h> যে অংশটি দেখতে পাচ্ছি সেটাকে বলা হয় হেডার ফাইল। কোন নির্দিষ্ট মডেলের মাইক্রোকন্ট্রোলারের রেজিস্টার, বিট এদের এড্রেস যাবতীয় কিছু বহন করে এই হেডার ফাইলটি। প্রোগ্রামের ৪ নম্বর লাইনে আমরা দেখতে পাচ্ছি sbit LED = P2^0 এই sbit হল একটি ভ্যারিয়েবেলের ডেটা টাইপ যা মেমোরিতে ১ বিট জায়গা দখল করে। অর্থাৎ int,char,float এর মতই একটি ডেটা টাইপ হল sbit. যেহেতু পোর্ট-২ এর ০নম্বর পিনের সংশ্লিষ্ট বিট কন্ট্রোলের জন্যে আমাদের হয় 0 নাহয় 1 সংখ্যা দুটিই লাগে তাই অন্য ডেটা টাইপের ভ্যরিয়েবেল ডিক্লেয়ার না করে sbit টাইপের LED নামের ভ্যারিয়েবেল ডিক্লেয়ার করা হয়েছে। এরপর ৬ নম্বর লাইনে আমরা Delay() নামে একটি ফাংশনের প্রোটোটাইপ দেখতে পাচ্ছি। এই ফাংশনের বডি ২১ নম্বর লাইন থেকে ৩১ নম্বর লাইন পর্যন্ত দেখা যাচ্ছে। এই ফাংশনটিতে দুটি লুপের মাধ্যমে জাস্ট সিপিউ কে দিয়ে সংখ্যা গণনা করা হয়েছে। এতে করে সিপিউ কিছুক্ষনের জন্যে অন্য কাজে ব্যস্ত থাকছে। এবং LED অন এবং অফ হওয়ার মাঝের পার্থক্য আমরা বুঝতে পারছি। এই Delay() ফাংশনটি ব্যবহার না করলে LED অন এবং অফ এত দ্রুত হত যে আমাদের চোখ তা ধরতে পারতো না। এভাবে আসলে Delay() ফাংশন ব্যবহার করা উচিৎ না কারন এই ফাংশন ব্যবহার করে আসলে কি পরিমান ডিলে হচ্ছে তা সঠিক ভাবে বলা যায়না। এরপরের পোস্টে আমরা 8051 মাইক্রোকন্ট্রোলারের টাইমার পেরিফেরাল্ ব্যবহার করে Delay() ফাংশন তৈরি করব।
code_and_circuit
মন্তব্যসমূহ
একটি মন্তব্য পোস্ট করুন