আশা করি সবাই ভালো আছেন। গত পর্বে আমরা PIC16F84 Micro-controller এর PORTA তে কতগুলো LED জ্বালিয়ে ছিলাম। সবাই কষ্ট করে পড়েছেন এবং আমাকে লেখার জন্য উৎসাহ দিয়েছেন তার জন্য ধন্যবাদ। কেউ কি বলতে পারবেন LED গুলো কতক্ষন ON ছিল বা কতক্ষন OFF ছিল। Micro-controller টির clock frequency যদি 4Mhz এর হয় অর্থাৎ 4Mhz এর Crystal Oscillator ব্যবহার করা হলে প্রতিটি Instruction complete করতে সময় লাগে 1µS. কিন্তু আমরা জানি, Time = 1/Frequency, তাহলে Frequency 4Mhz হলে একটা Instruction complete করতে সময় লাগার কথা ছিল 1/4Mhz= 0.25 µS. তাহলে 1µS লাগল কেন!! কারন PIC Micro-controller এর একটি Instruction cycle অথবা Machine cycle complete করতে 4টি clock cycle এর প্রয়োজন হয়। তাই Instruction complete করতে প্রয়োজনীয় সময় = 4*0.25 µS = 1 µS. এখানে খেয়াল রাখবেন Machine cycle এবং clock cycle এক জিনিস না। কিছু Instruction আছে যেগুলো কমপ্লিট করতে 2 Machine cycle এর প্রয়োজন হয় এবং কিছু কমপ্লিট করতে 1 Machine cycle এর প্রয়োজন হয়। যেমন goto তে লাগবে 2 Machine cycle আর movlw তে লাগবে 1 Machine cycle। Datasheet এর page-36 এ দেখুন কোন instruction এ কত cycle লাগে। চলুন এবার আগের দিনের প্রোগ্রামটির LED জ্বলে থাকা এবং নিভে থাকার সময় বের করে ফেলি।
আগের দিনের code গুলো নিচে খেয়াল করুন।
BSF STATUS,RP0 ; 1 Machine cycle MOVLW b’00000’ ; 1 Machine cycle MOVWF TRISA ; 1 Machine cycle BCF STATUS,RP0 ; 1 Machine cycle START MOVLW b’11111’ ; 1 Machine cycle MOVWF PORTA ; 1 Machine cycle MOVLW b’00000’ ; 1 Machine cycle MOVWF PORTA ; 1 Machine cycle GOTO START ; 2 Machine cycleআবার বলি, যদি 4Mhz এর clock cycle ব্যবহার করি তাহলে 1 Machine cycle = 1µS.
LED গুলো ON হবে শুধুমাত্র যখন উপরের কোড গুলোর ষষ্ঠ লাইনটি execute হবে এরপর। আবার LED গুলো OFF হবে শুধুমাত্র যখন উপরের কোড গুলোর অষ্টম লাইনটি execute হবে এরপর। তাহলে প্রথমবার LED জ্বালতে Micro-controller কে 6টি Instruction complete করে আসতে হবে। সময় লাগবে 6µS. আবার OFF হবে অষ্টম লাইনটি execute হলে অর্থাৎ On হওয়ার দুই Machine cycle পর। তাহলে On থাকবে 2µS এর জন্য। এরপর GOTO START থাকার কারনে Micro-controller পঞ্চম লাইনে ফেরত যাবে এবং পঞ্চম ও ষষ্ঠ লাইন execute করে আবার জ্বলে উঠবে। এইভাবে loop এর ভিতর ঘুরতে থাকবে। তাহলে শেষবার নিভে যাওয়ার পর আবার জ্বলবে 4 Machine cycle = 4µS সময় পর। কিন্ত এই সময়ের মধ্যে সে Instruction complete করেছে তিনটি। 4µS সময় লেগেছে কারন “GOTO” Instruction complete করতে 2 Machine cycle লেগেছে। আমাদের LED গুলো 4µS পরপর জ্বলছিল এবং জ্বলে ছিল 2µS এর জন্য এবং পুরো cycle কমপ্লিট করতে সময় লাগবে 6µS. তাহলে সেকেন্ডে জ্বলবে 1/6µS =166666.67 বার, অর্থাৎ 166.6Khz frequency তে। আমরা জানি যে, আমাদের চোখের refresh rate হল 10Hz কেননা আমরা যাই দেখিনা কেন তার রেষ 0.1 second পর্যন্ত থাকে। তাহলে একটু চিন্তা করে দেখুন তো একটা LED যদি সেকেন্ডে 166666.67 বার জ্বলে এবং নিভে তাহলে আমাদের খালি চোখে কি তা দেখা সম্ভব!! আমাদের কাছে মনে হবে যেন LED গুলো সবসময় জ্বলে আছে কখনই Blink করছেনা। PIC Simulator IDE রিয়েল টাইমে Simulate করে না তাই আমরা Blinking দেখতে পাই। PIC Simulator IDE কোন instruction লাস্ট কমপ্লিট করেছে, কোন instruction পরবর্তীতে করবে, মোট কতগুলো instruction complete করল এবং কতগুলো clock cycle পার করল, তাতে কতটুকু সময়ই বা লাগল তার সবই প্রদর্শন করে। নিচে দেখুন।
এখন রিয়েল টাইমে LED জ্বলা এবং নিভা দেখতে চাইলে আমাদেরকে LED ON এবং LED OFF করার মাঝে Delay দিতে হবে। ছোট বেলায় আমরা লুকোচুরি খেলার সময় একজনকে 1 থেকে 100 পর্যন্ত গুনতে বলতাম এবং এই সময়ের মধ্যে বাকিরা লুকিয়ে পরতাম। আমরা আসলে ঐ একজনের খোঁজাখুঁজি শুরু করার আগে একটু time delay যোগ করতাম। আমরাও time delay যোগ করার জন্য Micro-controller কে গুনতে দিব। যেহেতু Micro-controller খুব দ্রুত গুনে ফেলবে তাই তাকে বড় একটি সংখ্যা অথবা একই সংখ্যা কয়েকবার গুনতে দিতে হবে। এখন বিষয় হল সর্বোচ্চ কত বড় সংখ্যা গোণা যাবে। আমাদের Micro-controller টি 8 bit এর তাই সে সর্বোচ্চ 28 = 256 step count করতে পারবে। 0 থেকে গোণা শুরু করলে ২৫৬ স্টেপ গুনলে সর্বোচ্চ সংখ্যাটি হবে 255. আরও সহজভাবে বললে 8টি 1অর্থাৎ 11111111 কে decimal এ কনভার্ট করলে হয়, 255. এটা খুব একটা বড় সংখ্যা না। তাহলে আমাদেরকে ২৫৫ বা তার চেয়ে ছোট কোন সংখ্যা পর্যন্ত কয়েক বার গুনতে দিতে হবে। ধরেন ২৫৫ পর্যন্ত গুনতে দিলাম ১০০ বার বা ২৫৫ বার। এটা নির্ভর করছে আসলে কতটুকু delay দরকার তার উপরে। শুরুতে একবার 255 পর্যন্ত গোণা যাক। আমরা ২৫৫ থেকে শুরু করবো এবং 1 করে count down করে zero পর্যন্ত যাব।
Delay add করার জন্য আমরা প্রথমবারের মত Micro-controller এর RAM ব্যবহার করবো। Micro-controller এর General Purpose Registerই হচ্ছে এর RAM । এই Register গুলোকেই আমরা RAM হিসেবে ব্যবহার করবো। এর address শুরু হয়েছে 0Ch থেকে। নিচের ছবিতে দেখুন।
প্রথমে RAM এর যেকোন cell এর একটা নাম দিয়ে নিবো। এরপর ঐ cell টির ভিতর একটি সংখ্যা ভরে ফেলব। এই পর্যন্ত কোড গুলো লিখে ফেলি,
Count equ 0Chউপরের equ instruction এর মাধ্যমে আমরা একটা RAM এর cell এর নাম দিয়ে নিলাম। এতে সুবিধা হল আপনাকে RAM এর cell নাম্বার মনে রাখতে হবে না, Count মনে রাখলেই চলবে এবং Count কে Variable হিসেবে ব্যবহার করা যাবে । এইভাবে আমরা যেকোনো কিছুর নাম দিতে পারি। যেমন ধরুন যদি আমি porta এর নাম দেই LED_PORT তাহলে লিখতে হবে,
সাধারণত এই ধরনের declaration গুলো Code এর শুরুতে লিখতে হয় । আশা করি equ instruction এর ব্যবহার বুঝতে পেরেছেন। Count এর ভিতর 255 পাঠানো যাক।
Movlw d’255’ Movwf countএখন 1 করে decrement করার পালা। এর জন্য আমরা DECFSZ instruction টি ব্যবহার করবো।
DECFSZ count,1DECFSZ এর মানে হল, সে তার following register কে 1 করে decrement করবে এবং যখন following register টি zero হবে তখন DECFSZ এর পরবর্তী instruction টি skip করবে অর্থাৎ এর পরের instruction বাদ দিয়ে তার পরের instruction execute করবে। এখানে Count এর পরে “,” দিয়ে যে 1 ব্যবহার করা হয়েছে তা, 1 করে decrement এর জন্য নয়। এই 1 নির্দেশ করে decrement করার পর সংখ্যাটি কোথায় রাখবে তা। এখানে 1 না দিয়ে 0 দিলে, decrement করার পর রেজাল্ট টি W Register এ save করত। 1 দেওয়াতে রেজাল্ট টি পুনরায় count এর ভিতর save করবে। এখন decrement করার অংশটি আমরা একটা loop এর ভিতর দিতে পারি। loop টি ততক্ষনই চলবে যতক্ষণ পর্যন্ত Count zero না হবে।
DECFSZ count,1 Goto $ -1এখানে “$ -1” বলতে “Program counter” এর মান 1 কমাতে বলা হয়েছে। Micro-controller কোন instruction লাইন execute করবে তা Program counter ঠিক করে দেয়। $ -1 লিখলে Micro-controller এক লাইন পিছনের instruction লাইন execute করবে। $ -5 লিখলে Micro-controller পাঁচ লাইন পিছনের instruction লাইন execute করবে।
সবগুলো কোড একসাথে লিখে ফেলি,
Count equ 0Ch Movlw d’255’ Movwf count DECFSZ count,1 Goto $ -1এখন আমরা আগের দিনের LED ON এবং LED OFF এর মাঝে এই delay ব্যবহার করব।
Count equ 0Ch ; 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 Movlw d’255’ ; add a delay Movwf count DECFSZ count,1 Goto $ -1 ; go to previous line MOVLW b’00000’ ; put 00000 into W register MOVWF PORTA ; turn OFF all LEDs Movlw d’255’ ; add a delay Movwf count DECFSZ count,1 Goto $ -1 ; go to previous line GOTO START ; Go back to START linePIC Simulator IDE এর Simulation speed বাড়াতে চাইলে main window থেকে RATE এ গিয়ে ULTRA FAST অথবা ULTIMATE সিলেক্ট করতে পারেন। তবে Real time এ অর্থাৎ বাস্তবে কত সময় পার হল তা REAL RIME DURATION থেকে দেখে নিতে পারেন। কেউ চাইলে Step by Step simulate করে দেখতে পারেন।
চলুন এবার Delay time টা বাড়ানো যাক। আমরা Micro-controller কে দিয়ে 255 পর্যন্ত count করাব 200 বার। এই জন্য আমাদের আরেকটি Variable এর প্রয়োজন হবে। তাহলে আমাদের Variable দুইটা হবে, countA এবং countB.
প্রথমে দুইটা Variable এর নাম দিয়ে নিতে হবে,
CountA equ 0Ch ; Define a Variable CountB equ 0Dh ; Define a Variableএরপর Variable দুইটার মধ্যে দুইটা সংখ্যা ভরে নিতে হবে। একটা সংখ্যা হবে কত পর্যন্ত গুনবে এবং অন্যটি কয়বার গুনবে।
উপরের code গুলো খেয়াল করুন, প্রথমে countA এর মান 1 করে কমবে। CountA এর মান কমতে কমতে 0 হলে “Goto $ - 1” লাইনটি skip করবে এবং countB এর মান 1 কমিয়ে পাঁচ লাইন পিছনে ফেরত যাবে। এরপর Count A এর ভিতর আবার 255 ভরবে এবং কমাতে থাকবে। এভাবে countB এর মান যখন 0 হবে তখন “Goto $ - 5” লাইনটি skip করবে এবং পাঁচ লাইন পিছনে ফেরত যাবে না। এভাবে delay সম্পন্ন হবে। আপনারা চাইলে countA, countB এর বিভিন্ন মান দিয়ে পরিক্ষা করে দেখতে পারেন। এই delay যদি ছোট মনে হয় তাহলে আপনারা আরও এক ধাপ যোগ করতে পারেন যেমন, 255 পর্যন্ত 200 বার গুনবে 100 বার। তাহলে delay 100 গুন বড় হয়ে গেল।
Delay টা আগের প্রোগ্রামে ব্যবহার করা যাক,
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 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 দুইবার ব্যবহার করেছি। একবার LED ON হওয়ার পর আরেকবার LED OFF হওয়ার পর। একই code আমাদেরকে দুইবার লিখতে হয়েছে। যদি এমন হত delay টাকে একটা subroutine এর মাঝে ভরে রাখা যেত তাহলে যখন প্রয়োজন তখন delay নামে call করলেই হত। একই লেখা বার বার লেখা লাগত না। আগামী দিন আমরা দেখব কিভাবে subroutine call করতে হয়।
কারও বুঝতে সমস্যা হলে কমেন্টে লিখুন। সেই পর্যন্ত ভালো থাকবেন আর অবশ্যই ভুল ত্রুটি ক্ষমা করে দেবেন। ধন্যবাদ।
আমি Faisal। বিশ্বের সর্ববৃহৎ বিজ্ঞান ও প্রযুক্তির সৌশল নেটওয়ার্ক - টেকটিউনস এ আমি 15 বছর যাবৎ যুক্ত আছি। টেকটিউনস আমি এ পর্যন্ত 7 টি টিউন ও 110 টি টিউমেন্ট করেছি। টেকটিউনসে আমার 0 ফলোয়ার আছে এবং আমি টেকটিউনসে 0 টিউনারকে ফলো করি।
https://www.techtunes.io/help-ask/tune-id/145943