অনেক দিন ধরে চিন্তা করছিলাম Micro controller নিয়ে কিছু লেখা দরকার। ইন্টারনেটে Micro controller সম্পর্কে বাংলাতে তেমন কিছু খুজে পেলাম না কেন সেটা লিখতে গিয়ে বুঝলাম। আমি চেষ্টা করব খুব সহজভাষায় লিখতে যেন কারো বুঝতে কষ্ট না হয়। তারপরও কঠিন হয়ে গেলে আলচনায় তা সহজ হয়ে যাবে আশা করি। Micro controller কি জিনিস, কেন আমরা তা ব্যবহার করব, কোন technology ব্যবহার করা হয়েছে, এই সব নিয়ে আমি আলোচনা করবো না। এগুলো সবকিছুকে আরও জটিল করে তুলবে। Wikipedia তে খুঁজলে এই সম্পর্কে অনেক ইনফর্মেশন পাবেন।
Micro controller প্রোগ্রামিং করতে প্রথমেই নাম্বার সিস্টেম সম্পর্কে জানা প্রয়োজন। 1234567890 সংখ্যাটি লক্ষ্য করুন, খুবই নির্ভেজাল একটি সংখ্যা যাতে আমাদের প্রয়োজনীয় সব গুলো (দশটি) Digit আছে। কিন্তু পৃথিবীর সব চাইতে শক্তিশালী কম্পিউটারও এতটাই বেকুব যে এই সংখ্যা বুঝার ক্ষমতা তার নাই। কি করে বুঝবে, তার মাথায় তো আর মানুষের মত ঘিলু নাই। সে বুঝে, পাওয়ার আছে, না নাই। পাওয়ার থাকলে 1, না থাকলে 0. তাই কম্পিউটারকে বুঝাইতে হলে উপরের সংখ্যাটিকে 0আর 1 এ পরিবর্তন করে নিতে হবে। সংখ্যাটিকে 0 আর 1 দিয়ে প্রকাশ করলে দাঁড়াচ্ছে 1001001100101100000001011010010. এখন 1234567890 সংখ্যাটি লেখার জন্য যেহেতু 1,2,3,4,5,6,7,8,9 এবং 0 এই দশটি সংখ্যা(খুব সঠিকভাবে বলতে গেলে সম্ভবত বলতে হবে অঙ্ক) ব্যবহার করেছি তাই এই ধরনের নাম্বার সিস্টেমকে বলা হয় দশমিক সংখ্যা বা Decimal number যার base হচ্ছে 10, কিন্তু পরেরবার আমি শুধুমাত্র 0 আর 1 দুইটি সংখ্যা ব্যবহার করেছি তাই এই ধরনের নাম্বার কে বলা হবে দ্বিমিক সংখ্যা বা binary number যার base 2। এছাড়া Octal এবং Hexadecimal নামে আরো দুই ধরনের নাম্বার সিস্টেম রয়েছে। Hexadecimal এর ক্ষেত্রে 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F এই ১৬টি অঙ্ক আছে। প্রোগ্রামিং এ সাধারনত Decimal, binary এবং hexadecimal এই তিন ধরনের নাম্বার সিস্টেম ব্যবহার করা হয়। Binary system এর বেলায় প্রতিটা ডিজিটকে বলা হয় Bit. যেমন, 10011110 এই বাইনারি সংখ্যাটিতে সর্বমোট আটটি bit রয়েছে যার একদম ডানপাশের bit কে বলা হবে Least significant bit(LSB) এবং একদম বামপাশের bit কে বলা হবে Most significant bit(MSB). নাম শুনেই বুঝতে পারছেন Least significant bit এর স্থানীয় মান কম অর্থাৎ এর পরিবর্তনে সংখ্যাটির খুব সামান্য পরিবর্তন হয়। যেমন 245 কে binary তে রূপান্তর করলে হয় 11110101. এখন একদম ডানপাশের(LSB) বিট 1কে পরিবর্তন করে 0 করলে সংখ্যাটি হয় 11110100, Decimal এ করলে দাড়ায় 244। বামপাশের(MSB) bit 1কে পরিবর্তন করে 0 করলে সংখ্যাটি হয় 01110101, Decimal এ করলে দাড়ায় 117 বুঝতেই পারছেন ব্যাপারটা। Binary System এ একদম ডানপাশের বিটটি 0নাম্বার বিট, এর পরেরটি 1 নাম্বার বিট, তারপরেরটি 2 নাম্বার বিট, এভাবে Binary System এ ডানপাশ থেকে গোণা শুরু করতে হবে এবং গুনতে হবে 0 থেকে শুরু করে। এক নাম্বার সিস্টেম থেকে অন্য নাম্বার সিস্টেম এ পরিবর্তন করতে আপনারা Windows এর নিজস্ব ক্যালকুলেটর ব্যবহার করতে পারেন।
এবার micro controller প্রোগ্রামিং এ আসি। প্রথমে প্রোগ্রামিং ল্যাঙ্গুয়েজ হিসাবে assembly দিয়ে শুরু করে পরবর্তীতে C ব্যবহার করবো। আমরা Microchip কোম্পানির PIC Microcontroller এর 16f সিরিজ এর 8 বিট কন্ট্রোলার নিয়ে কাজ করবো। assembly তে মাত্র ৩৫টা instruction আছে এই সিরিজ এর জন্য। এর জন্য আমরা যে যে সফটওয়্যার ব্যবহার করবো সেগুলো হল, Pic Simulator Ide, Proteus, MikroC.
আপাতত Pic Simulator Ide download করে নিন পরবর্তীতে বাকি সফটওয়্যারগুলোর লিঙ্ক দিব। বাকিগুলো বেশ বড়।
সহজভাবে বোঝার জন্য আমরা PIC16f84A দিয়ে শুরু করবো। PIC16f84 এর datasheet download করে নিন নিচের লিঙ্ক থেকে।
PIC16f84A একটি 8 বিটের microcontroller, 16f সিরিজ এর সব microcontroller ই flash memory দিয়ে তৈরি, তাই pen drive এর মত যতবার খুশি প্রোগ্রাম করা যায়। অনেকেই হয়ত টেনশনে পড়ে গেছেন কিভাবে প্রোগ্রাম করবেন তা নিয়ে। টেনশন করার কোন প্রয়োজন নাই। মাত্র ২৫০টাকার নিচে আপনি একটি serial jdm programmer তৈরি করতে পারেন। আমি কোন এক টিউটোরিয়ালে দেখাব কিভাবে খুব সহজে ঘরে বসে আপনি PCB তে PIC programmer তৈরি করবেন। যারা laptop ব্যবহার করেন তাদের জন্য দুঃসংবাদ হচ্ছে USB programmer তৈরি করতে microcontroller এর প্রয়োজন হয়, যেটি প্রোগ্রাম করতে আরেকটি প্রোগ্রামার লাগবে। আসলে বেপারটা অনেকটা মুরগি আগে, না ডিম আগের মত কাহিনী। আপনার জন্য সুসংবাদও আছে, Microchip তার microcontroller এর popularity বাড়ানোর জন্য নিজেই PICKIT2 নামে একটি অত্যন্ত শক্তিশালী USB Programmer এর schematic diagram এবং code সাধারণ মানুষের জন্য উন্মুক্ত করে দিয়েছে, শুধু একটু কষ্ট করে বানিয়ে নিলেই হবে। একবার PCB বানানো শিখে গেলে এটিও কোন সমস্যা না।
নিচের ছবিটি লক্ষ্য করুন,
RA0 থেকে RA4: RA0, RA1, RA2, RA3, RA4 এই পাঁচটি পিনকে আমরা একত্রে PORTA বলতে পারি। PORTA এর আন্ডারে যেহেতু পাঁচটি পিন রয়েছে এবং প্রতিটি পিনকে যদি একেকটি বিট হিসাবে চিন্তা করি তাহলে RA0 হবে PORTA এর 0 number bit এবং RA1, RA2, RA3, RA4 হবে যথাক্রমে PORTA এর 1,2,3,4 number bit। PORTA=11010 লিখলে বুঝতে হবে RA4=1, RA3=1, RA2=0, RA1=1, RA0=0 লেখা হয়েছে। RA0=1 এর মানে হচ্ছে, RA0 নাম্বার পিনে ground এর সাপেক্ষে voltage মাপলে আপনি 5 Volt পাবেন অর্থাৎ RA0 পিনটি high। একিই ভাবে RA0=0 মানে হচ্ছে, RA0 নাম্বার পিনে ground এর সাপেক্ষে voltage মাপলে আপনি কোন voltage difference পাবেন না অর্থাৎ RA0 পিনটি low। PORTA একটি bi-directional port, অর্থাৎ এর প্রতিটি পিন ইনপুট অথবা আউটপুট দুইভাবেই ব্যবহার করা যায়।
RB0 থেকে RB7: RB0, RB1, RB2, RB3, RB4, RB5, RB6, RB7 এই আটটি পিন PORTB এর অন্তর্গত। PORTB এর বৈশিষ্ট PORTA এর অনুরূপ। শুধু পার্থক্য হচ্ছে PORTA পোর্টটি 5 bit এর এবং PORTB পোর্টটি 8bit এর। এই PORT কে ইনপুট অথবা আউটপুট দুইভাবেই ব্যবহার করা যায়। অর্থাৎ এটিও Bi-directional port.
VSS এবং VDD: এই পিনগুলো micro controller এর power supply পিন। VSS হল ground পিন এবং VDD হল positive supply পিন। micro controller এ পাওয়ার সাপ্লাই হিসেবে ২ থেকে ৬ ভোল্ট পর্যন্ত দেয়া যায়।
OSC1/CLK IN এবং OSC2/CLKOUT: যেকোনো digital IC চালাতে clock pulse প্রয়োজন micro controller তার প্রতিটা instruction complete করে clock pulse এর মাধ্যমে। এই দুই পিন clock pulse দেয়ার জন্য। PIC16F84 সর্বোচ্চ 20MHz clock pulse নিয়ে কাজ করতে পারে তাই সর্বোচ্চ 20MHz এর crystal লাগাতে পারবেন।
MCLR: এই পিনটি micro controller এর Master RESET পিন। উপরের ছবিটি লক্ষ্য করলে দেখবেন এই পিনের নামের উপর একটি bar দেয়া আছে। এর মানে পিনটি inverted অর্থাৎ এটি active হবে zero Volt apply করলে। micro controller প্রোগ্রামিং এর সময়ও এই পিনটি ব্যবহার করা হয়। normally এই পিনটি একটি resistor হয়ে positive supply এর সাথে যুক্ত থাকে এবং micro controller RESET করতে চাইলে পিনটিকে ground এর সাথে যুক্ত করলেই চলে। Resistor টি current limit করার জন্য।
Int: PORTB এর RB0 পিনকে configure করে নিয়ে INTERRUPT পিন হিসাবে ব্যবহার করা যায়। পরবর্তীতে বিশদভাবে এই বিষয় নিয়ে আলোচনা করা হবে।
TOCK1: PORTA এর RA4 পিনকে configure করে নিয়ে Micro controller এর internal timer/counter কে চালানোর জন্য এই পিনে clock pulse ইনপুট দিতে হয়। পরবর্তীতে বিশদভাবে এই বিষয় নিয়ে আলোচনা করা হবে।
এবার REGISTER সম্পর্কে কিছু কথা বলা যাক। REGISTER এক ধরণের MEMORY CELL. এতে Information Read অথবা Write করা যায়। বিভিন্ন REGISTER কে তার নাম অথবা address দিয়ে access করা যায়। নিচের ছবিতে বিভিন্ন REGISTER এর নাম এবং address দেয়া আছে। address গুলো Hexadecimal নাম্বার এ দেয়া আছে। পরবর্তীতে কয়েকটি গুরুত্বপূর্ণ REGISTER সম্পর্কে বর্ণনা করবো।
Status register: Arithmetic status প্রদর্শন করা এবং Bank পরিবর্তন করাই এই register এর কাজ। যেমন, Bank0 থেকে Bank1 এ যেতে হলে Status Register এর 5 number bit (RP0) কে set করতে হবে। একইভাবে Bank1 থেকে Bank0 এ যেতে হলে Status Register এর 5 number bit (RP0) কে clear করতে হবে। এখানে set বলতে logical 1 বুঝানো হয়েছে এবং clear বলতে logical 0 বুঝানো হয়েছে। STATUS REGISTER এর Address হচ্ছে 03h। এখানে h বলতে hexadecimal নাম্বার সিস্টেম বুঝানো হয়েছে।
TRISA = 00101 লিখলে PORTA এর কোনটা INPUT কোনটা OUTPUT হবে তা নিচে দেখুন।
BIT Number | 4 | 3 | 2 | 1 | 0 |
PORTA Pin | RA4 | RA3 | RA2 | RA1 | RA0 |
TRISA value | 0 | 0 | 1 | 0 | 1 |
Pin status | Output | Output | Input | Output | Input |
W register: W register কে বলা হয় working register, আপনি যেকোনো data সরাসরি এই register এ write বা read করতে পারবেন। অন্যকোন register এ write বা read করতে গেলেও W ব্যবহার করতে হবে, কেননা অন্য register এ data সরাসরি write করা যায়না, write করতে হলে প্রথমে w register এ ভরে নিয়ে কাঙ্খিত register এ move করা যায়।
প্রথম প্রোগ্রাম হিসেবে আমরা micro controller এর PORTA তে পাঁচটি LED জ্বালাবো এবং নিভাবো। এর জন্য প্রথমে আমরা bank1 select করবো status register এর RP0 bit কে set করে। আমি আগেই বলেছি set বলতে 1 এবং clear বলতে 0 বুঝতে হবে। bank1 select করতে হবে কারন, TRISA register এর অবস্থান bank1 এ। এরপর TRISA register এর সবগুলো bit কে 0 করতে হবে PORTA এর সবগুলো পিনকে OUTPUT হিসেবে select করার জন্য। এরপর আমরা আবার bank0 তে ফেরত আসব। এতটুকু কাজ করলে PORTA এর পিনগুলো output হিসেবে select হবে।
চলুন আপাতত এতটুকুর জন্য প্রয়োজনীয় code লিখে ফেলা যাক।
BSF STATUS,RP0
এখানে BSF এর মানে হচ্ছে Bit Set F অর্থাৎ assembler কে STATUS register এর RP0 bitকে set করতে বলা হয়েছে। এখন আমরা bank1 এ আছি। এখন TRISA Register এর ভিতর 0 send করবো। কিন্তু যেহেতু W register ছাড়া অন্য register এ data সরাসরি write করা যায়না তাই আমরা W register এর ভিতর ভরে নিয়ে W register কে forward করবো TRISA Register এর ভিতর।
MOVLW b’00000’
MOVWF TRISA
MOVLW মানে হল Move Literal Value into W. পরের লাইনের MOVWF এর মানে হল “Move the content of W into the register that follows”. এবার bank0 তে ফেরত যাবার পালা।
BCF STATUS,RP0
এখানে BCF এর মানে হল Bit Clear F অর্থাৎ এই command এর মাধ্যমে আমরা কোন bitকে clear বা 0 করতে পারবো। এখন সবগুলো লাইন একত্রে লিখলে দাড়ায়,
BSF STATUS,RP0
MOVLW b’00000’
MOVWF TRISA
BCF STATUS,RP0
এবার PORTA তে কিছু data পাঠানো যাক। প্রথমবার সবগুলো 1, পরেরবার সবগুলো 0, এতে led গুলো একবার জ্বলবে একবার নিভবে। এখানেউ আপনাকে W register এর সাহায্য নিতে হবে।
MOVLW b’11111’
MOVWF PORTA
MOVLW b’00000’
MOVWF PORTA
উপরে যে প্রোগ্রাম আমরা লিখেছি তাতে led গুলো একবার জ্বলবে এরপর নিভে যাবে আর জ্বলবে না। বারবার জালাতে হলে উপরের অংশটিকে একটি loop এর ভিতর চালাতে হবে। Microcontroller যখন LED নেভানোর লাইনটি Execute করে ফেলবে তখন তাকে আবার LED জ্বলানোর লাইনে ফেরত পাঠালেই হয়ে গেল। এটা আমরা করবো GOTO কম্যান্ড ব্যবহার করে। তার আগে যেই লাইনে ফেরত পাঠাবো তার একটা নাম দেয়া যাক। আমি এখানে এই লাইনের নাম দিয়েছি START. সবসময় খেয়াল রাখবেন START অর্থাৎ lebel এবং নরমাল command যেমন MOVLW,BSF, BCF ইত্যাদির মাঝে 1 TAB পরিমান গ্যাপ রাখা বাঞ্ছনীয়। তা না হলে error আসতে পারে।
START MOVLW b’11111’
MOVWF PORTA
MOVLW b’00000’
MOVWF PORTA
GOTO START
এখন পুরোটা একবারে লিখে ফেলি।
BSF STATUS,RP0 ; Select Bank1
MOVLW b’00000’ ; put 00000 into W register
MOVWF TRISA ; Move 00000 into TRISA
BCF STATUS,RP0 ; Select Bank0
START MOVLW b’11111’ ; put 11111 into W register
MOVWF PORTA ; move 11111 into PORTA register
MOVLW b’00000’ ; put 00000 into W register
MOVWF PORTA ; move 00000 into PORTA
GOTO START ; Go back to START line
খেয়াল করে দেখুন উপরের প্রোগ্রামটির প্রতিটি লাইনের পাশে সেমিকোলন দিয়ে আমি Comment লিখেছি। কারন Comment না লিখলে দুইদিন পরে আপনি নিজেই ভুলে যাবেন কোন লাইন কীজন্য লিখেছিলেন। সেমিকোলন দিয়ে যত খুশি কমেন্ট লিখুন।
চলুন এবার PIC Simulator IDE এর assembler ব্যবহার করা যাক। PIC Simulator IDE সফটওয়্যারটি download করে ইন্সটল করে নিন। সফটওয়্যারটি Run as Administrator দিয়ে রান করুন, তা না হলে error আসতে পারে। এবার Option থেকে Select Microcontroller এ ক্লিক করুন। এখান থেকে PIC16F84A Micro-controller টি select করুন। এরপর Option থেকে Change clock frequency তে ক্লিক করে 4MHz ক্লক ফ্রিকুয়েন্সি ইনপুট দিন।
এবার Tools থেকে Assembler ওপেন করুন।
Assembler এ উপরের code গুলো নিচের মত করে লিখে ফেলুন।
এরপর Assembler উইন্ডোতে থাকা Tools এর ভিতরে Assemble and Load এ ক্লিক করুন। Save করার অপশন আসলে Save করুন। আপনার লেখায় কোন ভুল না থাকলে কোন error ছাড়া programটি compileহয়ে যাবে।
LED এর পাশে থাকা PORTx,0 এর উপর ক্লিক করুন। নতুন যে “Select pin” Window আসবে সেখানে প্রথম LED এর ক্ষেত্রে PORTA, 0 দ্বিতীয় LED এর ক্ষেত্রে PORTA,1 তৃতীয় LED এর ক্ষেত্রে PORTA,2 চতুর্থ LED এর ক্ষেত্রে PORTA,3 এবং পঞ্চম LED এর ক্ষেত্রে PORTA,4 সিলেক্ট করুন।
BSF STATUS,RP0 ; Select Bank1
MOVLW b’00000’ ; put 00000 into W register
MOVWF TRISA ; Move 00000 into TRISA
BCF STATUS,RP0 ; Select Bank0
START MOVLW b’00001’
MOVWF PORTA
MOVLW b’00010’
MOVWF PORTA
MOVLW b’00100’
MOVWF PORTA
MOVLW b’01000’
MOVWF PORTA
MOVLW b’10000’
MOVWF PORTA
GOTO START ; Go back to START line
আজকের মত এতটুকুই থাকলো। আগামী টিউটোরিয়ালে Delay নিয়ে আলোচনা করবো। আপনাদের Comment এর আশায় থাকলাম। লেখায় ভুল থাকলে দয়া করে ক্ষমা সুন্দর দৃষ্টিতে দেখবেন আশা করি। কোন প্রয়োজনে email করতে পারেন। email করলে অবশ্যই আপনি যে টেকটিউনস এর সদস্য তা উল্লেখ করবেন। ধন্যবাদ ধৈর্য সহকারে পড়ার জন্য।
email address- fkfaisal2k3@yahoo.com