PIC Micro Controller টিউটোরিয়াল [পর্ব-০২]

আশা করি সবাই ভালো আছেন। গত পর্বে আমরা 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  তাহলে লিখতে হবে,

                                                LED_PORT           equ        PORTA

সাধারণত এই ধরনের declaration গুলো Code এর শুরুতে লিখতে হয় । আশা করি equ instruction এর ব্যবহার বুঝতে পেরেছেন। Count এর ভিতর 255 পাঠানো যাক।

                                                Movlw                  d’255’
                                                Movwf                 count

এখন 1 করে decrement করার পালা। এর জন্য আমরা DECFSZ   instruction টি ব্যবহার করবো।

                                                DECFSZ                 count,1

DECFSZ এর মানে হল, সে তার 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 line

PIC 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 দুইটার মধ্যে দুইটা সংখ্যা ভরে নিতে হবে। একটা সংখ্যা হবে কত পর্যন্ত গুনবে এবং অন্যটি কয়বার গুনবে।

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 পাঁচ লাইন পিছনে যাবে।

উপরের 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 করতে হয়।

কারও বুঝতে সমস্যা হলে কমেন্টে লিখুন।  সেই পর্যন্ত ভালো থাকবেন আর অবশ্যই ভুল ত্রুটি ক্ষমা করে দেবেন। ধন্যবাদ।

Level 0

আমি Faisal। বিশ্বের সর্ববৃহৎ বিজ্ঞান ও প্রযুক্তির সৌশল নেটওয়ার্ক - টেকটিউনস এ আমি 15 বছর 2 মাস যাবৎ যুক্ত আছি। টেকটিউনস আমি এ পর্যন্ত 7 টি টিউন ও 110 টি টিউমেন্ট করেছি। টেকটিউনসে আমার 0 ফলোয়ার আছে এবং আমি টেকটিউনসে 0 টিউনারকে ফলো করি।


টিউনস


আরও টিউনস


টিউনারের আরও টিউনস


টিউমেন্টস

bro thank you very much for your nice tune……looking forward to see the tune about “serial jdm programmer”

    Level 0

    একটু অপেক্ষা করেন। আর এক টিউন পরে পেয়ে যাবেন আশা করি।

প্রিয় টিউনার,

আপনার টিউনটি টেকটিউনস চেইন টিউন হিসেবে অন্তর্ভুক্ত করা হয়েছে। অভিনন্দন আপনাকে!

টেকটিউনসে চেইন টিউন কীভাবে প্রক্রিয়া হয় তা জানতে টেকটিউনস সজিপ্র এর https://www.techtunes.io/faq “চেইন টিউন” অংশ দেখুন।

নিয়মিত চেইন টিউন করুন। এখন থেকে আপনার নতুন করা চেইন টিউন গুলো টেকটিউনস থেকে চেইন এ যুক্ত করা হবে। চেইন টিউনে যুক্ত হবার ফলে চেইনের প্রতিটি পর্ব একসাথে থাকবে।

চেইনে নতুন পর্ব যুক্ত হলে তা টেকটিউনসের প্রথম পাতায় দেখা যাবে এবং “সকল চেইন টিউনস” https://www.techtunes.io/chain-tunes/ পাতায় চেইন টিউনটি যুক্ত হবে।

নিয়মিত চেইন টিউন করে নতুন নতুন টিউন আপনার চেইনে যুক্ত করুন এবং অসম্পূর্ণ না রেখে আপনার চেইন টিউনে নিয়মিত পূর্ণাঙ্গ রূপ দিন। ধন্যবাদ আপনাকে।

মেতে থাকুন প্রযুক্তির সুরে আর নিয়মিত করুন চেইন টিউন!

    Level 0

    চেইন টিউন হিসেবে অন্তর্ভুক্ত করার জন্য অসংখ্য ধন্যবাদ।

Level 0

অনেক ভাল লাগল যা বলে বোঝাতে পারবোনা। নতুন ৩ নং এর আশাই রইলাম।

Level New

Khob valo hoiyese vai poroborti tuner ashay roilam

পরীক্ষার মাঝেও পুরোটা পড়লাম। প্রোগ্রামটা রান করেছে। পরবর্তী টিউনের অপেক্ষায় রইলাম।
ব্যক্তিগতভাবে আমার কাছে assembly কোডগুলো বিরক্ত লাগে। কি দরকার এত assembly instruction মুখস্ত করার, যেখানে C তেই সব হয় আরও সহজে কম সময়ে। তার ওপর আবার একেক মাইক্রোকন্ট্রোলার এর assembly instruction একেক রকম।

    Level 0

    পরীক্ষার মাঝে না পড়াই মনে হয় ভালো। পরীক্ষা শেষ করে ঠাণ্ডা মাথায় পড়ুন। assembly instruction মুখস্ত করার করার প্রয়োজন নাই। Datasheet এ সব দেয়া আছে। “C তেই সব হয় আরও সহজে কম সময়ে” কথাটা মানছি। কিন্তু শুরুতেই আমি যদি C দিয়ে শুরু করি তাহলে Micro-controller এর অনেক কিছুই অজানা রয়ে যাবে। আর আমি তো বলেছি আমি C তেই প্রোগ্রামিং করবো। আর প্রয়োজনীয় কয়েকটা জিনিস নিয়ে আলোচনা করে নেই। আমার সাথে থাকুন।

Level 0

next one এর আসায় রইলাম ………

Level 0

ভাই আপনার tune আমার অনেক ভাল লাগে।আমার microcontrollar সম্পর্কে জানার অনেক আগ্রহ দয়া করে আপনি যদি আপনার facebook id টা দিতেন তাহলে আমি আপনার সাথে যোগাযোগ করতে পারতাম।