7. ইন্টারাপ্ট প্রোগ্রাম (Interrupt program 8051)


7.1 ইনটারাপ্ট প্রোগ্রাম (Interrupt program 8051)::

ইনটারাপ্ট(Interrupt) হল এক প্রকার বিঘ্ন যা মাইক্রোকন্ট্রোলারের স্বাভাবিক ক্রমিক নির্দেশ সম্পাদনের প্রক্রিয়ায় ক্ষণিক বাধা দান করে। ইনটারাপ্ট কার্যকরী হলে মাইক্রোকন্ট্রোলার তার স্বাভাবিক  নির্দেশ পালন সাময়িক বন্ধ করে। স্বাভাবিক নির্দেশ সম্পাদন বন্ধ করার পূর্বে মাইক্রোকন্ট্রোলার তার বর্তমান স্থিতি নির্দিষ্ট রেজিস্টারে সঞ্চয় করে এবং তারপর আপৎকালিন ভাবে মেমরির(ROM) নির্দিষ্ট স্থানে( Vector Interrupt Table) রক্ষিত কোড বা নির্দেশাবলী সম্পাদন করে। ROM এর নির্দিষ্ট স্থানে রক্ষিত এই কোড বা নির্দেশাবলীকে ইনটারাপ্ট সার্ভিস রুটিন( interrupt service routine) বা ISRবলা হয়। ISR এর কোড গুলি সম্পাদন হয়ে গেলে মাইক্রোকন্ট্রোলার পুনরায় পূর্বে যেখানে তার স্বাভাবিক কাজ শেষ করেছিল সেখান থেকে তার কাজ আবার শুরু করে।

8051 ইনটারাপ্টের প্রকারভেদঃ (RST, Internal Interrupt & External Interrupt):
1.RST
সর্বাধিক অগ্রাধিকার যুক্ত interrupt। যখন RST পিনকে সক্রিয় করা হয় মাইক্রোকন্ট্রোলারের প্রোগ্রাম কনট্রোল মেমরির 0000H লোকেশনে জাম্প করে। সাধারণভাবে এটি ব্যবহার করা হয় না।
2. Timer ইনটারাপ্ট( অন্তর্বর্তী বিঘ্ন বা Internal interrupt 8051 )ঃঃ
8051 এ দুটি টাইমার আছে। Timer0 এবং Timer1। Timer ইনটারাপ্ট সক্রিয় অবস্থায় টাইমার ওভারফ্লো করলে অর্থাৎ টাইমার তার সর্বোচ্চ কাউন্টিং শেষ করলে মাইক্রোকন্ট্রোলারের প্রোগ্রাম কনট্রোল ইনটারাপ্ট ভেক্টর টেবল অনুযায়ী ROM এর 000BH(Timer0 র ক্ষেত্রে) এবং 001BH(Timer1 র ক্ষেত্রে) লোকেশনে ঝাঁপ দেয়। PC বা প্রোগ্রাম কাউন্টার ISR বা Interrupt Service Routine এর নির্দিষ্ট কর্ম সম্পাদন করার পর আবার স্বাভাবিক নির্দেশ পালনের জন্য পূর্বের অবস্থানে ফিরে আসে।

3. বহিরাগত উদ্দীপক দ্বারা গঠিত বিঘ্ন বা External Hardware Interrupt::
8051 মাইক্রোকন্ট্রোলারে বহিরাগত বিঘ্নের জন্য দুই প্রকার External Hardware Interrupt নির্দিষ্ট আছে। INT0 ইনটারাপ্টটি 8051 এর 12 নং পিন(PORT P3.2  ) কর্তৃক গৃহীত হয়। দ্বিতীয় বহিরাগত বিঘ্নটি তথা INT1 ইনটারাপ্টটি 8051এর 13 নং পিন(PORT P3.3) কর্তৃক শ্রুত হয়। INT0 ইনটারাপ্টটির জন্য ISR এর লোকেশন 0003H এবং INT1 ইনটারাপ্টটির জন্য ISR এর লোকেশন 0013H। 8051 মাইক্রোকন্ট্রোলার তার 12 এবং 13 নং পিনের সাহায্যে বাইরের হার্ডওয়ার কর্তৃক সৃষ্ট সংবেদ বিঘ্ন ( Interrupt ) রূপে শ্রবণ করে। 
4. ধারাবাহিক বার্তাবাহী বিঘ্ন ( Serial interrupt 8051)::
8051 তার ধারাবাহিক বার্তাবাহী সংযোগের মাধ্যমে বাইরের হার্ডওয়ার ডিভাইসের সাথে বার্তা আদান প্রদান করে। এর জন্য 8051 যে দুইটি ইনটারাপ্ট ফ্ল্যাগ ব্যবহার করে সেগুলি হল TI এবং RI। TI হল ট্রান্সফার ইনটারাপ্ট এবং RI হল রিসিভ ইনটারাপ্ট।

7.2 এবার আমরা 8051 মাইক্রোকন্ট্রোলারে ISR রূপায়নের পদ্ধতি নিয়ে আলোচনা করবঃ
7.2.1
IE রেজিস্টার। এটি একটি ৮ বিট রেজিস্টার। এটি নির্দিষ্ট করে interrupt বা বিঘ্নের উৎস কোথায়। বিঘ্নটি কি টাইমার (Timer0 ও Timer1) জাত নাকি  কোন বহিরাগত বিঘ্ন( External Hardware Interrupt 8051) নাকি বিঘ্নটি ধারাবাহিক বার্তাবাহী বিঘ্ন

Bit 7 – EA: Enable All Bit
            1 = Enable all interrupts
            0 = Disable all interrupts
Bit 6,5 – Reserved bits
Bit 4 – ES: Enable Serial Interrupt Bit
            1 = Enable serial interrupt
            0 = Disable serial interrupt
Bit 3 – ET1: Enable Timer1 Interrupt Bit
            1 = Enable Timer1 interrupt
            0 = Disable Timer1 interrupt
Bit 2 – EX1: Enable External1 Interrupt Bit
            1 = Enable External1 interrupt
            0 = Disable External1 interrupt
Bit 1 – ET0: Enable Timer0 Interrupt Bit
            1 = Enable Timer0 interrupt
            0 = Disable Timer0 interrupt
Bit 0 – EX0: Enable External0 Interrupt Bit
            1 = Enable External0 interrupt
            0 = Disable External0 interrupt

7.2.2 TCON রেজিস্টার। এটিও একটি ৮ বিট রেজিস্টার। TCON রেজিস্টারের নীচের চারিটি বিট (Least Significant Bit) নির্দেশ করে বিঘ্নটির প্রকৃতি কিরকম হবে।

TCON রেজিষ্টারের বামদিকের চারিটি বিট(MSB) অতি গুরুত্বপূর্ণ। TF1=1 Timer1 ওভারফ্লো সূচিত করে। বিটটি সিস্টেম দ্বারা নির্ধারিত হয়। TR1=1 হলে Timer1 কাউন্ট করা শুরু করে। এই বিটটি কোডিং এর মাধ্যমে নির্ধারিত করা যেতে পারে। অনুরূপে ভাবে TF0 এবং TR0, Timer0 এর ক্ষেত্রে যথাক্রমে টাইমার ওভারফ্লো এবং টাইমার চালু (start) হওয়াকে সূচিত করে। এবং একই ভাবে যথাক্রমে সিস্টেম কর্তৃক এবং সফট্‌ওয়ার কোডিং কর্তৃক নির্ধারিত হয়।

ইন্টারাপ্ট প্রোগ্রামিং এর ক্ষেত্রে রেজিষ্টারের ডানদিকের চারিটি বিটও (LSB) অতিব গুরুত্বপূর্ণ। IE1=1 ফলিং এজ ট্রিগারের ক্ষেত্রে এক্সটার্নাল ইন্টারাপ্ট1 (পিন P3.3 তে) কে সূচিত করে। সিস্টেম কর্তৃক নির্ধারিত হয়। IE1=0 হয় যখন প্রসেসর 0013h অ্যাড্রেসে ISR এর নির্দেশ প্রতিপালন করে। IT1 এক্সটার্নাল ইন্টারাপ্ট1 কে নিয়ন্ত্রন করে। কোডিং কর্তৃক নির্ধারিত হয়। IT1=1 করলে হাই টু লো এজ ট্রিগার্ড এক্সটার্নাল ইন্টারাপ্ট1 কার্যকরী হবে। আবার IT1=0 করলে লো লেভেল এক্সটার্নাল ইন্টারাপ্ট1 কার্যকরী হবে।

একই রকম ভাবে IE0 এবং IT0 এক্সটার্নাল ইন্টারাপ্ট0 (পিন P3.2 তে) কে নির্ধারিত ও নিয়ন্ত্রিত করে।

সুতরাং, মাইক্রোকন্ট্রোলারে বহিরাগত বিঘ্ন(External Hardware Interrupt) দুই প্রকার হতে পারে। ১. লেভেল ট্রিগার্ড ২. এজ ট্রিগার্ড

১. লেভেল ট্রিগার্ড এক্সটার্নাল হার্ডওয়ার ইনটারাপ্ট (Level Triggered External Hardware Interrupt):
এই প্রকার ইনটারাপ্টে INT0 বা INT1 পিনটি লো বা হাই লেভেল শনাক্ত করলেই ইনটারাপ্ট গৃহীত হয়।

. এজ ট্রিগার্ড(Edge Triggered):
এই প্রকার ইনটারাপ্টে INT0 বা INT1 পিনটি তড়িৎ বিভবের পতন বা উত্তোলন শনাক্ত করে এবং ISR (Interrupt Service Routine) অনুযায়ী বিশেষ কর্ম সম্পাদন করে।

8051 এ দুই প্রকার এক্সটার্নাল হার্ডওয়ার ইনটারাপ্ট বর্তমান। ১. লো লেভেল ট্রিগার্ড(Low Level Triggered) ২. ফলিং এজ ট্রিগার্ড(Falling Edge Triggered)

7.3 ইন্টারাপ্ট নাম্বার (Interrupt Number)
ইনটারাপ্ট সার্ভিস রুটিন (ISR) লেখার সমায়ে প্রত্যেক প্রকার ইনটারাপ্টের জন্য আমরা একটি করে নির্দিষ্ট নম্বর ব্যবহার করব।  যখনই কোন বিঘ্ন বা ইনটারাপ্ট তৈরি হবে তখনই মাইক্রোকন্ট্রোলারের প্রোগ্রাম কাউন্টার(PC) ঐ ঈন্টারাপ্ট নাম্বার দেখে ‘ইনটারাপ্ট ভেক্টর টেবিলের’ নির্দিষ্ট ঠিকানায় (Address) পৌঁছে যাবে। এবং ঐ ঠিকানায় অবস্থিত ইনটারাপ্ট সার্ভিস রুটিনটি (ISR) কার্যকর করবে।

7.3.1 নীচের টেবিলটিতে আমরা বিভিন্ন প্রকার ইনটারাপ্টের নাম্বার সম্বন্ধে জানবঃ

7.4 Timer ইনটারাপ্ট( অন্তর্বর্তী বিঘ্ন বা Internal interrupt 8051 )
7.4.1 প্রয়োজনীয় ধাপঃ

১।  প্রথমে IE রেজিস্টারের EA মান এবং ET1 মান 1 এ সেট করতে হবে। বাকি ফিল্ড গুলির মান 0 রাখতে হবে। সুতরাং IE রেজিস্টারের মান হবে 10001000 অর্থাৎ IE = 0x88। এক্ষেত্রে আমরা Timer1 ইন্টারাপ্টটি ব্যবহার করব। Timer0 ইন্টারাপ্টটি ব্যবহার করতে গেলে IE রেজিস্টারের মান হতে হবে 10000010 অর্থাৎ IE = 0x82.

২। Timer1 ইনটারাপ্টের জন্য যে ইনটারাপ্ট সার্ভিস রুটিন লিখব তাতে ইনটারাপ্ট নাম্বার 3 নির্দিষ্ট করব। অর্থাৎ Timer1 ISR টি হবে এইরূপঃ void timer1_ISR() interrupt 3{…}. [পরবর্তী নমুনা প্রোজেক্টটি দ্রষ্টব্য]।

৩। অনুরূপে Timer0 ISR টির জন্য ইন্টারাপ্ট নাম্বার 1 নির্দিষ্ট করতে হবে। এবং ইন্টারাপ্ট সার্ভিস রুটিনটি হবে এইরূপঃ void timer1_ISR(void) interrupt 1{…}.

৪। main(){….} লুপে আমরা অবশ্যই একটি ইনফাইনাইট while(){} লুপ রাখব।

7.5 8051 Timer ইনটারাপ্টের সাহায্যে 7 সিগমেন্ট ডিসপ্লের মাল্টিপ্লেক্সিংঃ

7.5.1 সংক্ষেপঃ

পূর্বে আমরা ৮০৫১ এর মাল্টিপ্লেক্সিং করেছি। সেখানে ৮০৫১ তার মেইন লুপের সাহায্যে প্রতিটি ৭ সিগমেন্টকে নির্দিষ্ট সময়ের জন্য সক্রিয় করে অর্থাৎ প্রতিটি ৭ সিগমেন্টকে নির্দিষ্ট সময়ের ব্যবধানে নির্দিষ্ট সময়ের জন্য জ্বালিয়ে আপাত ভাবে সবকটি ডিজিটকে একই সাথে প্রজ্জ্বলনশীল করেছিল ( কারণ আমাদের চোখ ১/১০ সেকেণ্ডের কম সময়ের ব্যবধানকে প্রত্যক্ষ করতে পারে না)। মাইক্রোকন্ট্রোলারকে এই ভাবে ব্যবহার করলে মাইক্রোকন্ট্রোলারটি একই সাথে অপর কোন কর্ম সম্পাদনে সক্ষম হবে না। একই সাথে একাধিক কর্ম সম্পাদনে সমর্থ করতে আমাদের টাইমারের সাহায্য নিতেই হবে।

7.5.2 সার্কিট ডায়াগ্রামঃ

Figure 55

7.5.3 প্রয়োজনীয় ব্যাক্ষাঃ

বর্তমান প্রকল্পটিতে টাইমার ইন্টারাপ্টের মাধ্যমে ৮০৫১ কে মাল্টিপ্লেক্সিং টাস্ক সম্পূর্ণ করতে হচ্ছে। যেহেতু মাল্টিপ্লেক্সিং এর জন্য আমরা টাইমারের সাহায্য নিচ্ছি সেহেতু মাইক্রোকন্ট্রোলার তার অন্যান্য কর্ম সম্পাদনের জন্য যথেষ্ট সময় পাবে। এখানে আমরা টাইমার ১ কে Mode ১ মোডে ব্যবহার করেছি। টাইমার ইনটারাপ্টকে সক্ষম করার জন্য আমরা EA ও ET বিটকে ১ এ সেট করছি (IE = 0x88 )।এরপর আমরা টাইমার ১ কে চালু করেছি ( TR1 = 1)। নির্দিষ্ট সময়ের ব্যবধানে টাইমার ওভারফ্লো করার পর ইন্টারাপ্ট সার্ভিস রুটিন ( ISR ) কল হয় এবং ঐ রুটিনের মধ্যে 7 সিগমেন্ট ডিসপ্লের প্রতিটি ডিজিটকে সমান ভাবে পোলিং করা হয়। অর্থাৎ প্রতিটি ডিজিটকে নির্দিষ্ট সময়ের ব্যবধানে নির্দিষ্ট সময়ের জন্য জ্বলার সুযোগ দেওয়া হয়।  এর জন্য ঐ মুহূর্তে প্রজ্বলিত ডিজিটে নির্দিষ্ট মান ডিসপ্লে করার জন্য P2 পোর্টে নির্দিষ্ট মান সেট করা হয়।

7.5.4 প্রয়োজনীয় কোডঃ

8051 mcu তে কোড আপলোড

Figure 55a

7.5.5 নোটঃ

  • উপরের অনুরূপ কর্ম সম্পাদন আমরা যদি টাইমার 1 মোড 2 এর সাহায্যে করি তাহলে timer1Enable() এবং timer1_ISR (void) interrupt 3 কোড ব্লক গুলি আমাদের নীচের ন্যায় লিখতে হবেঃ
Figure 55b
  • এখানে void timer1Enable() ফাংশানটি দ্রষ্টব্যঃ TF1, TH1  এবং TL1 কে আমরা এখানে পুনরারম্ভ বা re-initialize করি নি। কারণ কোন টাইমারের মোড ২ হল ৮ বিট অটো রিলোড।  অর্থাৎ ৮ বিট টাইমার ওভারফ্লো করলে TH1 এর মান পুনরায় TL1 এ কপি হবে এবং টাইমার ওভারফ্লো ফ্ল্যাগটি নিজেই রিসেট হবে।
  • আবার পূর্ববর্তী কোডে ISR এর নামের সাথে ইনটারাপ্ট নাম্বার interrupt 3 দ্রষ্টব্য। আমরা এখানে টাইমার ১ ব্যবহার করেছি, তাই ISR এ interrupt 3 হয়েছে।

7.5.6 অনুরূপ ভাবে আমরা টাইমার 0 কে অনুরূপ কাজে লাগাতে পারি। এক্ষেত্রে আমাদের timer1Enable() এবং void timer1_ISR (void) interrupt 1 কোড ব্লক দুটি নীচের ন্যায় হবেঃ

Figure 55c

আমরা এখানে টাইমার 0 ব্যবহার করেছি তাই ইনটারাপ্ট নাম্বার 1 হয়েছে।  void timer1_ISR (void) interrupt 1 {…}

7.6 এক্সটার্নাল হার্ডওয়ার ইনটারাপ্ট ( External Hardware Interrupt)
7.6.1. বহিরাগত বিঘ্ন INT0 বা INT1 কে সক্ষম (enable) করতে হবে। এর জন্য IE রেজিস্টারের বিভিন্ন মানগুলি নির্দিষ্ট করতে হবে।
INT0 র জন্য IEর মান হবে:: IE=0x81;
অর্থাৎ EA = 1,  EX0 = 1, রেজিস্টারের অপর ফিল্ড গুলির মান শূন্য হবে।
INT1 র জন্য IEর মান হবে:: IE=0x84;
একই ভাবে EA = 1,  EX1 = 1, এবং রেজিস্টারের অপর ফিল্ড গুলির মান শূন্য হবে।

7.6.2. এখন আমাদের নির্দিষ্ট ইনটারাপ্টের জন্য ইনটারাপ্ট সার্ভিস রুটিন ( ISR ) লিখতে হবে। EX0 (INT0) র জন্য ইনটারাপ্ট নাম্বার 0 এবং EX1 (INT1) র জন্য ইনটারাপ্ট নাম্বার 2.

7.6.3. এক্সটার্নাল ইনটারাপ্ট কোন পিনে গৃহীত হয়?

এক্সটার্নাল ইনটারাপ্ট EX0 গৃহিত হয় INT0 পিনে, অর্থাৎ P3.2 পিনে। আবার এক্সটার্নাল ইনটারাপ্ট EX1 গৃহিত হয় INT1 পিনে, অর্থাৎ P3.3 পিনে।

7.6.4. বহিরাগত বিঘ্ন INT0 এর ক্ষেত্রে আমাদের ISR শুরু করতে হবে এইভাবেঃ
void ISR_ex0(void) interrupt 0
বহিরাগত বিঘ্ন INT1 এর ক্ষেত্রে আমাদের ISR শুরু করতে হবে এইভাবে::
void ISR_ex1(void) interrupt 2
7.6.5. এজ ট্রিগার্ড ইনটারাপ্টকে সক্ষম (enable) করার জন্য আমাদের TCON রেজিস্টারের IT0 বা IT1 ফিল্ডে 1 অ্যাসাইন করতে হবেঃ
INT0 র জন্য:        IT0=1;
INT1 র জন্য:        IT1=1;

7.7 দৃষ্টান্তঃ

নীচের উদাহরণে আমরা ব্রেড বোর্ডে ৮০৫১ মাইক্রোকন্ট্রোলারকে ইনটারাপ্ট 0 (INT0) র জন্য প্রস্তুত করব।বহিরাগত বিঘ্নটি আমরা একটি পুশ বাটন সুইচের সাহায্যে পিন P3.2 তে প্রয়োগ করব। বহিরাগত বিঘ্ন-রূপে আমরা ফলিং এজ ট্রিগার্ড ( Falling Edge Triggered ) বিঘ্নের প্রয়োগ করেছি। সুতরাং এক্ষেত্রে পুশ বাটন সুইচটি পুশ করার পর আমরা যখন ছেড়ে দিচ্ছি তখন অর্থাৎ যখন পিন P3.2 তে পাওয়ার ফল(Fall) করছে তখন ইন্টারাপ্টটি ট্রিগার হবে।

7.7.1 প্রয়োজনীয় সার্কিট ডায়াগ্রামঃ

Figure 56

7.7.2 প্রয়োজনীয় উপকরণঃ

১। AT89S51

২। 11.0592 MHz Crystal Oscillator

৩। 33pf Capacitor(2)

৪। 10uF Capacitor

৫। LED(4)

৬। 330 Ohm Resistance(4)

৭। 10K Ohm Resistance

৮। 1K Ohm Resistance

৯। Connecting Wires

১০। 5 V Power supply

7.7.3 প্রয়োজনীয় কোডঃ

8051 mcu তে কোড আপলোড

Figure 56a

পিন P3.2 তে ইনটারাপ্ট ট্রিগার হলে লেড D1, D3 এবং লেড D2, D4 পরিবর্তী রূপে প্রজ্জ্বলিত হবে।