কোন কিছু লেখার পর সবার কাছ থেকে অনেক অনেক কমেন্ট পেতে কার না ভালো লাগে। আর কমেন্টইতো একমাত্র উপায় বাকিদের সাথে যোগাযোগ করার। তাই অনেক অনেক কমেন্ট আশা করছি সবার কাছে। কমেন্টে অবশ্যই জানাবেন আমার লেখা বুঝতে কোথায় কোথায় সমস্যা হচ্ছে এবং প্রোগ্রামগুলো রান করাতে পেরেছেন কি না। গাধারেনিয়াম ভাইকে ধন্যবাদ কমেন্ট করে সাহায্য করার জন্য।
আজকে আমরা assembly তে subroutine কিভাবে call করতে হয় তা শিখবো।
অনেকের কমেন্টস এবং আমার সহকর্মীর কথা অনুসারে আমার কাছে মনে হচ্ছে অনেকেই assembly তে প্রোগ্রামিং করতে বিরক্ত হচ্ছেন অথবা কঠিন মনে হচ্ছে। হয়ত অনেকেই প্রোগ্রামিং শেখার আশা ছেড়ে দিয়েছেন। আমি তাদের কথা চিন্তা করে সিদ্ধান্ত নিয়েছি আমি আর দুইটা টিউটোরিয়াল লিখব assembly তে, এরপরের টিউটোরিয়ালগুলোতে আমি C তে প্রোগ্রামিং করবো কেননা C তে প্রোগ্রামিং করা অনেক সহজ। আমি assembly দিয়ে শুরু করেছিলাম কারন তাতে micro-controller কে আরও ভালোভাবে বোঝা সম্ভব। প্রতিটি machine cycle এ micro-controller কি কাজ করছে তা জানা যায়। আমি চেষ্টা করবো আগামী দুই টিউটোরিয়ালে যতদূর সম্ভব আলোচনা করতে যেন বেশিরভাগ instruction এর ব্যবহার শেখা যায়।
আগের দিনের শেষ প্রোগ্রামিংটি একবার মনে করা যাক।
CountA equ 0Ch ; Define a Variable CountB equ 0Dh ; Define a Variable BSF STATUS,RP0 ; Select Bank1 MOVLW b’00000’ ; put 00000 into W register MOVWF TRISA ; Move 00000 into TRISA BCF STATUS,RP0 ; Select Bank START MOVLW b’11111’ ; put 11111 into W register MOVWF PORTA ; turn ON all LEDs Movlw d’200’ ; 255 পর্যন্ত 200 বার গুনবে Movwf countB Movlw d’255’ ; 255 পর্যন্ত গুনবে Movwf countA DECFSZ countA, 1 Goto $ - 1 ; এক লাইন পিছনে ফেরত যাবে। DECFSZ countB, 1 Goto $ - 5 ; Program counter পাঁচ লাইন পিছনে যাবে। MOVLW b’00000’ ; put 00000 into W register MOVWF PORTA ; turn OFF all LEDs Movlw d’200’ ; 255 পর্যন্ত 200 বার গুনবে Movwf countB Movlw d’255’ ; 255 পর্যন্ত গুনবে Movwf countA DECFSZ countA, 1 Goto $ - 1 ; এক লাইন পিছনে ফেরত যাবে। DECFSZ countB, 1 Goto $ - 5 ; Program counter পাঁচ লাইন পিছনে যাবে। GOTO START ; Go back to START lineউপরের প্রোগ্রামে নীল রঙের যে অংশের কোড দেখতে পাচ্ছেন সেটিই আমাদের প্রোগ্রামে দুইটা delay যোগ করেছে। উপরের প্রোগ্রাম থেকে একটি পূর্ণাঙ্গ Delay অংশকে আলাদা করে লিখলে দাঁড়াচ্ছে,
CountA equ 0Ch ; Define a Variable CountB equ 0Dh ; Define a Variable Movlw d’200’ ; 255 পর্যন্ত 200 বার গুনবে Movwf countB Movlw d’255’ ; 255 পর্যন্ত গুনবে Movwf countA DECFSZ countA, 1 Goto $ - 1 ; এক লাইন পিছনে ফেরত যাবে। DECFSZ countB, 1 Goto $ - 5 ; Program counter পাঁচ লাইন পিছনে যাবে।এই delay কে একটা routine এর ভিতর ভরে আমরা তাকে যতবার খুশি call করতে পারব। অর্থাৎ আজকে আমরা Subroutine call করতে শিখবো। এতে সুবিধা হল একই code বারবার লেখার প্রয়োজন নাই, তাতে সময় এবং যায়গা দুটোই কম লাগে।
Code গুলোর যে অংশকে Subroutine হিসেবে আমরা ব্যবহার করবো প্রথমে তার একটা নাম দিয়ে নিবো এবং Subroutine এর সবগুলো লাইন execute করা হয়ে গেলে, যেন সে যেখান থেকে call করা হয়েছিল সেখানে ফেরত যায়, তার জন্য Return instruction লিখে Subroutine শেষ করবো। আমি Subroutine টির নাম দিয়েছি Delay.
CountA equ 0Ch ; Define a Variable CountB equ 0Dh ; Define a Variable Delay Movlw d’200’ ; 255 পর্যন্ত 200 বার গুনবে Movwf countB Movlw d’255’ ; 255 পর্যন্ত গুনবে Movwf countA DECFSZ countA, 1 Goto $ - 1 ; এক লাইন পিছনে ফেরত যাবে। DECFSZ countB, 1 Goto $ - 5 ; Program counter পাঁচ লাইন পিছনে যাবে। Returnউপরের কোডগুলোর প্রথম দুই লাইন Delay নামক Subroutine এর বাইরে রাখা হয়েছে কেননা এই দুই লাইন Main Program এর শুরুতে লিখতে হবে। এবার main program এ Delay Subroutine টি ব্যবহার করা যাক।
COUNTA EQU 0CH ; Define a Variable COUNTB EQU 0DH ; Define a Variable 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 ; turn ON all LEDs CALL DELAY MOVLW b’00000’ ; put 00000 into W register MOVWF PORTA ; turn OFF all LEDs CALL DELAY GOTO START ; Go back to START line ; Delay Subroutine এখান থেকে শুরু হচ্ছে। DELAY MOVLW d’200’ ; 255 পর্যন্ত 200 বার গুনবে MOVWF COUNTB MOVLW d’255’ ; 255 পর্যন্ত গুনবে MOVWF COUNTA DECFSZ COUNTA, 1 GOTO $ - 1 ; এক লাইন পিছনে ফেরত যাবে। DECFSZ COUNTB, 1 GOTO $ - 5 ; Program counter পাঁচ লাইন পিছনে যাবে। RETURNউপরের প্রোগ্রামে Micro controller প্রথম লাইন থেকে শুরু করে একটির পর একটি instruction কমপ্লিট করতে করতে নিচে নামবে এবং GOTO START লাইনে আসার পর আবার START লাইনে ফেরত যাবে। এভাবে Loop এর ভিতর ঘুরতে থাকবে। Delay Subroutine টিকে আমি প্রোগ্রামের নিচের অংশে লিখেছি, এতে করে DELAY call না করা পর্যন্ত Micro controller কখনই DELAY ঘটাবেনা।
যখনই কোনো একটা Subroutine কে call করা হয় তখন Micro controller, যেখান থেকে Call করা হয়েছে অর্থাৎ Subroutine কমপ্লিট করার পর যেখানে ফেরত যেতে হবে তার address সেইভ করে রাখে। এই বেপারটাকে বলা হয় STACK. কোন একটা Subroutine এর ভিতরে থাকা অবস্থায় আরেকটি Subroutine ,তার ভিতরে আরেকটা Subroutine এভাবে সর্বোচ্চ 8টি Subroutine call করা যায়। বেপারটাকে সহজ ভাবে বললে বলতে হবে, একটি প্যাকেট এর ভিতর আরেকটি প্যাকেট, তার ভিতর আরেকটি, এভাবে সর্বোচ্চ 8টি প্যাকেট রাখতে পারবেন। যদি 9টি nested Subroutine call করা হয় তাহলে Micro controller এর STACK Overflow হয়ে যাবে। আবার আপনি যদি কোন Subroutine call না করেও ভুল করে RETURN instruction টি execute করেন তাহলে STACK Underflow হবে।
আশা করি সবাই প্রোগ্রামটি রান করাবেন এবং আমাকে জানাবেন কোন সমস্যা হল কি না। আজকের মত এতটুকুই থাকলো। আগামী পর্বে আমরা Micro controller এর INPUT নিয়ে আলোচনা করবো। সেই সাথে আমরা আমাদের Micro controller প্রোগ্রাম করার জন্য প্রোগ্রামার বানিয়ে ফেলব। নিচের Proteus সফটওয়্যারটি ডাউনলোড করে নিন। আগামী পর্বে আমরা এটি ব্যবহার করবো। সেই পর্যন্ত ভালো থাকবেন। ধন্যবাদ সবাইকে।
আমি Faisal। বিশ্বের সর্ববৃহৎ বিজ্ঞান ও প্রযুক্তির সৌশল নেটওয়ার্ক - টেকটিউনস এ আমি 15 বছর 1 মাস যাবৎ যুক্ত আছি। টেকটিউনস আমি এ পর্যন্ত 7 টি টিউন ও 110 টি টিউমেন্ট করেছি। টেকটিউনসে আমার 0 ফলোয়ার আছে এবং আমি টেকটিউনসে 0 টিউনারকে ফলো করি।
অনেক অনেক ধন্যবাদ । AVR micro controller নিয়ে কিছুদিন কাজ করেছি ভাবছি আবার শুরু করব। থামবেন না চালিয়ে যান।
প্রথম কমেন্ট…………… কমেন্ট দিয়ে পড়তে বসলাম……… 🙂