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

কোন কিছু লেখার পর সবার কাছ থেকে অনেক অনেক কমেন্ট পেতে কার না ভালো লাগে। আর কমেন্টইতো একমাত্র উপায় বাকিদের সাথে যোগাযোগ করার। তাই অনেক অনেক কমেন্ট আশা করছি সবার কাছে। কমেন্টে অবশ্যই জানাবেন আমার লেখা বুঝতে কোথায় কোথায় সমস্যা হচ্ছে এবং প্রোগ্রামগুলো রান করাতে পেরেছেন কি না।  গাধারেনিয়াম ভাইকে ধন্যবাদ কমেন্ট করে সাহায্য করার জন্য।

আজকে আমরা 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  সফটওয়্যারটি ডাউনলোড করে নিন। আগামী পর্বে আমরা এটি ব্যবহার করবো। সেই পর্যন্ত ভালো থাকবেন। ধন্যবাদ সবাইকে।

DOWNLOAD  Proteus 

Level 0

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


টিউনস


আরও টিউনস


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


টিউমেন্টস

প্রথম কমেন্ট…………… কমেন্ট দিয়ে পড়তে বসলাম……… 🙂

    Level 0

    ধন্যবাদ।

Level 0

vai ami sob file emon dekhi pls mediafire link dan …………

Sorry, the file link that you requested is not valid.
Reasons for this may include:
Invalid link
The file has been deleted because it was violating our Terms of user

    Level 0

    লিঙ্ক ঠিক আছে। আবার চেষ্টা করুন। এত বড় সফটওয়্যার আপলোড দিতে আমার খবর হয়ে যায় ভাই। তারপরও দেখি পারা যায় কি না।

রান করতে সমস্যা হয়নি।
call জিনিসটা মনে হচ্ছে সি এর function এর মত। ভালো জিনিস।
পরবর্তী টিউনের অপেক্ষায় থাকলাম

    Level 0

    আসলেই function এর মত।

Level 0

অনেক অনেক ধন্যবাদ । AVR micro controller নিয়ে কিছুদিন কাজ করেছি ভাবছি আবার শুরু করব। থামবেন না চালিয়ে যান।

Level New

khob darun vai chaliye jan

Level 0

c শুরু করবেন শুনে ভাললাগ্ল, চালিয়ে যান।

চালিয়ে যান ভাই। আমি আপনার টিউন গুলো প্রিন্ট করে নিয়ে তারপর কাজ করছি।