৮. ইন্টারাপ্ট কি এবং 8051 এর ক্ষেত্রে ইন্টারাপ্ট
এর আগের অনেক পোস্টেই আমরা " ইন্টারাপ্ট " কথাটা শুনে এসেছি। কিন্তু এই ইন্টারাপ্ট টা কি জিনিস তা হয়ত এখনও আমাদের কাছে অপরিচিতই থেকে গিয়েছে। আজকে আমরা মাইক্রোকন্ট্রোলারের ক্ষেত্রে ইন্টারাপ্ট কি এবং 8051 এর ইন্টারাপ্ট রিলেটেড সব রেজিস্টার ও বিটের সাথে পরিচিত হব। এটা শুধু 8051 মাইক্রোকন্ট্রোলারের ক্ষেত্রেই না যেকোন মাইক্রোকন্ট্রোলারের ক্ষেত্রেই খুবই গুরুত্বপূর্ণ একটি ফিচার।
ইন্টারাপ্ট বিষয়টা আমরা একটি উদাহরনের মাধ্যমে চিন্তা করি। ধরা যাক মিঃ 'ক' একজন খুবই ভালো ছেলে। স্কুলে স্যার তাকে দশটি ম্যাথ হোমওয়ার্ক দিয়েছে। সে তার হোমওয়ার্ক করতে বসেছে এবং ৬ নম্বর অঙ্ক করার পর তার মা তাকে বলল যে তার শরীর খারাপ করছে এবং এজন্যে মিঃ 'ক' এর সাথে সে ডাক্তারের কাছে যেতে চাচ্ছে । এখন মিঃ 'ক' এর কাছে কোন কাজটি বেশি গুরুত্বপূর্ণ ? সে তার মাকে ডাক্তারের কাছ থেকে দেখিয়ে নিয়ে এসেও বাকি অঙ্ক গুলো করতে পারে অথবা বাকি চারটি অঙ্ক করে তার মাকে ডাক্তারের কাছে নিয়ে যেতে পারে। কিন্তু মাকে ডাক্তারের কাছে নিয়ে যাওয়া তার কাছে সেই মুহূর্তে বেশি গুরুত্বপূর্ণ। এজন্যে সে তার হোমওয়ার্ক যেই পর্যন্ত করেছে সেই পর্যন্ত রেখে তার মাকে নিয়ে ডাক্তারের কাছে যাবে। এবং সে যে ৬ নম্বর অঙ্ক লাস্ট করেছে এটা পয়েন্ট করে রেখে যাবে। এরপর সে তার মাকে ডাক্তার দেখিয়ে এনে আবার তার আগের কাজে ফিরে যাবে। এবং সে যেহেতু ৬ নম্বর অঙ্কটি পয়েন্ট করে রেখে গিয়েছিলো। এবার সে ৭ নম্বর অঙ্ক থেকে শুরু করবে এবং অবশিষ্ট ৪ টি অঙ্ক করে তার হোমওয়ার্ক সম্পূর্ণ করবে। এই যে মিঃ 'ক' এর একটি কাজ করতে করতে অন্য একটি কাজ করতে হল এটাকেই বলা হয় ইন্টারাপ্ট।
বাস্তব জীবনেও কোন কাজ করতে গেলে আমাদের প্রায়ই ইন্টারাপ্ট এর সম্মুখীন হতে হয় এবং কাজের গুরুত্ব অনুযায়ী আমরা কাজগুলো করে থাকি। যেই কাজের গুরুত্ব বেশি সেই কাজটি আগে করে এসে তারপর আবার মেইন কাজে ফিরে যাই। ঠিক মিঃ 'ক' এর মত। এই যে কাজের গুরুত্ব, এটাকেই বলা হয় প্রাইয়োরিটি লেভেল।
মাইক্রোকন্ট্রোলার বা মাইক্রোপ্রসেসরের ক্ষেত্রেও ঠিক এমন কিছু সিচুয়েশন আসে (যেমনঃ কীবোর্ড বা মাউসের বাটন প্রেস) । যখন মেইন প্রোগ্রামের ইন্সট্রাকশন ছেড়ে যেয়ে কিছু প্রি-ডিফাইন্ড কাজ করতে হয় এবং সেই কাজ শেষে আবার মেইন প্রোগ্রামের ইন্সট্রাকশন এক্সিকিউট করতে হয়। এই হল ইন্টারাপ্টের পরিচয়। এখন প্রশ্ন হল মাইক্রোকন্ট্রোলার কি করে বুঝবে যে কখন ইন্টারাপ্ট ঘটলো? এটা জানান দেয়, বিভিন্ন ধরনের স্ট্যাটাস-ফ্ল্যাগ-বিট। যেমন কোন একটি ইন্টারাপ্ট ঘটলে দেখা যাচ্ছে যে স্পেসিফিক কোন একটি স্ট্যাটাস-ফ্ল্যাগ বিট সেট হয়ে যায় এবং সিপিউ তখন বুঝে যায় যে তাকে মেইন ইন্সট্রাকশন রেখে এখন ইন্টারাপ্ট সার্ভিস রুটিনের কাজ করতে হবে। এই ইন্টারাপ্ট রুটিনের কাজ শেষ হলে সেই স্পেসিফিক ফ্ল্যাগ বিটটি আবার ক্লিয়ার হয়ে যায়। এভাবেই মাইক্রোকন্ট্রোলার আসলে ইন্টারাপ্ট কখন ঘটল সেটা বুঝতে পারে। যদি মাইক্রোকন্ট্রোলারের এই ইন্টারাপ্ট ফিচারটি না থাকতো তাহলে বিষয়টি কেমন হত? তাহলে বিষয়টি এমন হত যে সিপিউকে মেইন প্রোগ্রামের লুপ ঘোরার সময় প্রত্যেকবারই ঐসব স্ট্যাটাস-ফ্ল্যাগ-বিট এর স্ট্যাটাস চেক করতে হত যে কে সেট আছে আর কে ক্লিয়ার আছে?এবং তাদের স্ট্যাটাস অনুজায়ী ডিসিশন নিয়ে ইন্সট্রাকশন এক্সিকিউট করতে হত। এই বিষয়টাকে বলা হয় পোলিং (Polling). প্রত্যেক লুপে সব স্ট্যাটাস-ফ্ল্যাগ-বিট এর স্ট্যাটাস চেক করতেও কিন্তু সিপিউ এর প্রসেসিং টাইম এবং পাওয়ার বেশি লাগত। এতে করে আমাদের কোডের এক্সিকিউশন টাইম অনেক স্লো হয়ে যেত।
ইন্টারাপ্ট এবং পোলিং কে প্রায়ই দোকানদার এবং সেলস্ম্যানের (ফেরিওয়ালা) সাথে তুলনা করা হয়। সেলস্ম্যানরা কোন একটি মহল্লায় প্রত্যেক বাড়ির সামনে দিয়ে ঘুরে বেরায় এবং কারো যদি কোন জিনিসের দরকার হয় সেটা তার কাছে বিক্রয় করে। এতে করে কিন্তু অনেক সময় ব্যয় হয়। অপরদিকে কারো একটি জিনিসের অভাব হলে দোকানে গিয়ে সেটা সরাসরি দোকানদারের কাছ থেকে কিনে আনে। তো দোকানদার এবং সেলস্ম্যান উভয়ই পন্য বিক্রয় করলেও কিন্তু দোকানদারের বিক্রয় প্রক্রিয়া সেলস্ম্যানের বিক্রয় প্রক্রিয়া হতে দ্রুত সম্পূর্ণ হয়। ইন্টারাপ্ট এবং পোলিং এর মাঝেও ঠিক এমনই পার্থক্য। কারন ইন্টারাপ্টের ক্ষেত্রে কোন একটি স্ট্যাটাস-ফ্ল্যাগ-বিটের স্ট্যাটাস দেখে সিপিউ ইন্টারাপ্টে সাড়া দেয় আর পোলিং এর ক্ষেত্রে সব স্ট্যাটাস-ফ্ল্যাগ-বিটের স্ট্যাটাস চেক করার পর লজিক অনুযায়ী সেই নির্দিষ্ট কাজটি করে সিপিউ। ইন্টারাপ্ট সম্পর্কে আমাদের যথেষ্ট ক্লিয়ার ধারনা হয়েছে এতক্ষনে নিশ্চয়। এবার ইন্টারাপ্টের ধরন এবং 8051 মাইক্রোকন্ট্রোলারের ক্ষেত্রে ইন্টারাপ্ট নিয়ে কিছু জানা যাক।
ইন্টারাপ্ট দুই ধরনের হয়ে থাকে। সফটওয়্যার ইন্টারাপ্ট এবং হার্ডওয়্যার ইন্টারাপ্ট। সফটওয়্যার ইন্টারাপ্ট গুলো সাধারণত ইন্টার্নাল ইন্টারাপ্ট নামে এবং হার্ডওয়্যার ইন্টারাপ্ট গুলো সাধারণত এক্সার্টানাল ইন্টারাপ্ট নামেও পরিচিত। এক্সার্টানাল ইন্টারাপ্ট বলতে আসলে বাইরের কোন ডিভাইস বা পেরিফেরাল্স থেকে কোন ইলেক্ট্রিক্যাল সিগন্যাল সিপিউ এ পৌছানো কে বোঝায়। যেমন কীবোর্ড এর কোন বাটন প্রেস বা মাউসের কোন বাটন প্রেস এক্সার্টানাল ইন্টারাপ্ট। আর ইন্টার্নাল ইন্টারাপ্ট মাইক্রোকন্ট্রোলারের ভিতরের কোন পেরিফেরাল্সের দ্বারা সৃষ্ট। যেমন টাইমারের অপারেশনে বা সিরিয়াল কমিউনিকেশনে অনেক সময় ইন্টারাপ্ট কাজে লাগে।
EX1 : এই বিটটি সেট (1) করে দিলে External Interrupt 1 (INT1) এনাবেল হয়ে যাবে। আর ক্লিয়ার (0) করে দিলে ডিজাবেল হয়ে যাবে।
ET1 : এই বিটটি সেট (1) করে দিলে Timer1 Interrupt এনাবেল হয়ে যাবে। আর ক্লিয়ার (0) করে দিলে ডিজাবেল হয়ে যাবে।
ES : এই বিটটি সেট (1) করে দিলে Serial Communication রিলেটেড ইন্টারাপ্ট এনাবেল হয়ে যাবে। আর ক্লিয়ার (0) করে দিলে ডিজাবেল হয়ে যাবে।
EA : এই বিটটি হল গ্লোবাল ইন্টারাপ্ট বিট। একে সেট (1) করে দিলে মাইক্রোকন্ট্রোলারের ইন্টারাপ্ট ফিচারটা অন হবে। আর ক্লিয়ার (0) করে দিলে অফ হয়ে যাবে। অর্থাৎ এই বিট সেট না করে আমরা যতই ইন্টারাপ্ট রিলেটেড বাকি বিট গুলোকে সেট করিনা কেন কোনই কাজ হবেনা তাতে।
ইন্টারাপ্ট এবং পোলিং কে প্রায়ই দোকানদার এবং সেলস্ম্যানের (ফেরিওয়ালা) সাথে তুলনা করা হয়। সেলস্ম্যানরা কোন একটি মহল্লায় প্রত্যেক বাড়ির সামনে দিয়ে ঘুরে বেরায় এবং কারো যদি কোন জিনিসের দরকার হয় সেটা তার কাছে বিক্রয় করে। এতে করে কিন্তু অনেক সময় ব্যয় হয়। অপরদিকে কারো একটি জিনিসের অভাব হলে দোকানে গিয়ে সেটা সরাসরি দোকানদারের কাছ থেকে কিনে আনে। তো দোকানদার এবং সেলস্ম্যান উভয়ই পন্য বিক্রয় করলেও কিন্তু দোকানদারের বিক্রয় প্রক্রিয়া সেলস্ম্যানের বিক্রয় প্রক্রিয়া হতে দ্রুত সম্পূর্ণ হয়। ইন্টারাপ্ট এবং পোলিং এর মাঝেও ঠিক এমনই পার্থক্য। কারন ইন্টারাপ্টের ক্ষেত্রে কোন একটি স্ট্যাটাস-ফ্ল্যাগ-বিটের স্ট্যাটাস দেখে সিপিউ ইন্টারাপ্টে সাড়া দেয় আর পোলিং এর ক্ষেত্রে সব স্ট্যাটাস-ফ্ল্যাগ-বিটের স্ট্যাটাস চেক করার পর লজিক অনুযায়ী সেই নির্দিষ্ট কাজটি করে সিপিউ। ইন্টারাপ্ট সম্পর্কে আমাদের যথেষ্ট ক্লিয়ার ধারনা হয়েছে এতক্ষনে নিশ্চয়। এবার ইন্টারাপ্টের ধরন এবং 8051 মাইক্রোকন্ট্রোলারের ক্ষেত্রে ইন্টারাপ্ট নিয়ে কিছু জানা যাক।
ইন্টারাপ্ট দুই ধরনের হয়ে থাকে। সফটওয়্যার ইন্টারাপ্ট এবং হার্ডওয়্যার ইন্টারাপ্ট। সফটওয়্যার ইন্টারাপ্ট গুলো সাধারণত ইন্টার্নাল ইন্টারাপ্ট নামে এবং হার্ডওয়্যার ইন্টারাপ্ট গুলো সাধারণত এক্সার্টানাল ইন্টারাপ্ট নামেও পরিচিত। এক্সার্টানাল ইন্টারাপ্ট বলতে আসলে বাইরের কোন ডিভাইস বা পেরিফেরাল্স থেকে কোন ইলেক্ট্রিক্যাল সিগন্যাল সিপিউ এ পৌছানো কে বোঝায়। যেমন কীবোর্ড এর কোন বাটন প্রেস বা মাউসের কোন বাটন প্রেস এক্সার্টানাল ইন্টারাপ্ট। আর ইন্টার্নাল ইন্টারাপ্ট মাইক্রোকন্ট্রোলারের ভিতরের কোন পেরিফেরাল্সের দ্বারা সৃষ্ট। যেমন টাইমারের অপারেশনে বা সিরিয়াল কমিউনিকেশনে অনেক সময় ইন্টারাপ্ট কাজে লাগে।
8051 এর ইন্টারাপ্ট ফিচারঃ
8051 মাইক্রোকন্ট্রোলারের পাঁচটি ইন্টারাপ্ট আছে। এরমধ্যে ২টি হল এক্সার্টানাল ইন্টারাপ্ট এবং ৩টি হল ইন্টার্নাল ইন্টারাপ্ট। এই পাঁচটি ইন্টারাপ্টের ইন্টারাপ্ট সার্ভিস রুটিনের এড্রেস সহ এদের পর্যায়ক্রম নিচে দেয়া হল।
আচ্ছা আমরা জেনেছিলাম যে আমাদের 8051 এ ইন্টারাপ্ট আছে পাঁচটি। কিন্তু উপরের ছকে প্রথমেই আমরা Reset দেখতে পাচ্ছি এবং এটার রোম লোকেশন 0000H এবং করেস্পোন্ডিং পিন 9. আসলে রিসেট ও হল একধরনের ইন্টারাপ্ট। ঐ যে প্রথমেই জানতে পেরেছিলাম আমরা যে রিসেট পিনএ হাই পাল্স দিলে প্রোগ্রাম আবার নতুন করে শুরু হয়। ঠিক এটাই তো দেখতে পাচ্ছি এই টেবিলেও যে রিসেটের এড্রেস হল 0000H অর্থাৎ রোমের একদম প্রথম লোকেশন এবং এটা সবার উপরে দেখতে পাচ্ছি আমরা। এর কারন হল এর প্রায়োরিটি সবচেয়ে বেশি। একবার রিসেট পিন প্রেস করা হলে সিপিউ আর কারো কথা শুনবে না । সব রেজিস্টারের মান ডিফল্ট ভ্যালুতে নিয়ে যাবে। এজন্যেই একে সবার উপরে দেখানো হয়েছে।
এরপরে পর্যায়ক্রমে External Interrupt0 (INT0), Timer0 Interrupt (TF0) , External Interrupt1 (INT1), Timer1 Interrupt (TF1), Serial Communication Interrupt (RI & TI) এর অবস্থান। এদের করেস্পোন্ডিং সার্ভিস-রুটিনের এড্রেসও দেয়া আছে পাশেই। এই এড্রেস দ্বারা এটাই বোঝানো হয় যে, একবার যদি ইন্টারাপ্ট কল হয় তাহলে প্রোগ্রাম যেখানে ছিল সেখান থেকে ডিরেক্ট রোমের ঐ ইন্টারাপ্ট রিলেটেড এড্রেসে চলে যাবে এবং ঐ এড্রেসে যে ইন্সট্রাকশন গুলো দেয়া আছে সেগুলো এক্সিকিউট করা হলে আবার মেইন প্রোগ্রামের যেখান থেকে এসেছিলো সেখানে ফিরে যাবে।
এখানে আমরা স্ট্যাক সম্পর্কে আরেকটু ক্লিয়ার ধারনা নিয়ে নিই। এই যে ইন্টারাপ্ট কল হলে সিপিউ রোমের এক এড্রেস থেকে আরেক এড্রেসে জাম্প করছে এবং কাজকাম শেষ করে আবার আগের এড্রেসে ফিরে যাচ্ছে। কীভাবে মনে রাখছে যে কোথা থেকে এসেছিলো? যেই এড্রেস থেকে সে জাম্প দিয়েছিলো সেই এড্রেসটি স্ট্যাকে জমা করেছিল। ইন্টারাপ্ট সার্ভিস রুটিনের কাজ শেষ করা মাত্র স্ট্যাক থেকে ঐ এড্রেস কালেক্ট করে সে আবার রোমের ঐ এড্রেসে ফিরে যেতে পারছে। এটাই মূলত স্ট্যাকের মূল কাজ।
এবারে আমরা 8051 মাইক্রোকন্ট্রোলারের ইন্টারাপ্ট রিলেটেড রেজিস্টার গুলো সম্পর্কে জেনে নিই। 8051 এ ইন্টারাপ্ট রিলেটেড রেজিস্টার আছে যথা
- Interrupt Enable Register (IE).
- Interrupt Priority Register (IP).
Interrupt Enable Register (IE):
উপরের রেজিস্টারের চিত্রে আমরা ৫ এবং ৬ নম্বর বিটটি ক্রস চিহ্নিত দেখতে পাচ্ছি। তারমানে ঐ বিট দুটির কোন ভ্যালু নেই। অবশিষ্ট বিটগুলোর পরিচয় নিচে দেয়া হল
EX0 : এই বিটটি সেট (1) করে দিলে External Interrupt 0 (INT0) এনাবেল হয়ে যাবে। আর ক্লিয়ার (0) করে দিলে ডিজাবেল হয়ে যাবে।
ET0 : এই বিটটি সেট (1) করে দিলে Timer0 Interrupt এনাবেল হয়ে যাবে। আর ক্লিয়ার (0) করে দিলে ডিজাবেল হয়ে যাবে।EX1 : এই বিটটি সেট (1) করে দিলে External Interrupt 1 (INT1) এনাবেল হয়ে যাবে। আর ক্লিয়ার (0) করে দিলে ডিজাবেল হয়ে যাবে।
ET1 : এই বিটটি সেট (1) করে দিলে Timer1 Interrupt এনাবেল হয়ে যাবে। আর ক্লিয়ার (0) করে দিলে ডিজাবেল হয়ে যাবে।
ES : এই বিটটি সেট (1) করে দিলে Serial Communication রিলেটেড ইন্টারাপ্ট এনাবেল হয়ে যাবে। আর ক্লিয়ার (0) করে দিলে ডিজাবেল হয়ে যাবে।
EA : এই বিটটি হল গ্লোবাল ইন্টারাপ্ট বিট। একে সেট (1) করে দিলে মাইক্রোকন্ট্রোলারের ইন্টারাপ্ট ফিচারটা অন হবে। আর ক্লিয়ার (0) করে দিলে অফ হয়ে যাবে। অর্থাৎ এই বিট সেট না করে আমরা যতই ইন্টারাপ্ট রিলেটেড বাকি বিট গুলোকে সেট করিনা কেন কোনই কাজ হবেনা তাতে।
Interrupt Priority Register (IP):
এর আগে আমরা জেনেছি যে 8051 এর ইন্টারাপ্ট ২-প্রায়োরিটি লেভেল বিশিষ্ট। এর অর্থ আমরা এখন বুঝতে পারবো। এই পোস্টের প্রথম চিত্রে ইন্টারাপ্টের প্রায়োরিটি লেভেলের পর্যায়ক্রম দেয়া আছে। ওটা হল ডিফল্ট পর্যায়ক্রম। কথার কথা এখন যদি External Interrupt (INT0) এর চেয়ে Timer0 Interrupt এর প্রায়োরিটি বেশি দেয়ার দরকার হয় অর্থাৎ আগে টাইমার রিলেটেড কাজ এবং পরে ১২ নং পিনের সাথে কানেক্টেড ডিভাইস রিলেটেড কাজ, তখন কি করা যাবে? তখনকার সমস্যা সমাধানের জন্যেই এই রেজিস্টারটি। বাই-ডিফল্ট এই রেজিস্টারের সব বিট ক্লিয়ার থাকে। এবং তখন ডিফল্ট প্রায়োরিটিই কার্যকর থাকে। কিন্তু যদি প্রথম পাঁচটি বিটের মধ্যে দুই নম্বর বিটটি (PT0) সেট করে দেয়া হয় এবং বাকি সব ক্লিয়ার করে দেয়া হয় তাহলে Timer0 Interrupt এর প্রায়োরিটি বেশি হয়ে যাবে। এবং টাইমার-০ রিলেটেড ইন্টারাপ্ট কল হলেই আগে সেটার সাব-রুটিনের ইন্সট্রাকশন এক্সিকিউট হবে। এরপর বাদবাকি ইন্টারাপ্ট এর কাজ হবে। এজন্যেই 8051 এর ইন্টারাপ্ট প্রায়োরিটি লেভেল-২ বলা হয়। এখন যদি প্রথম বিট (PX0) এবং দ্বিতীয় বিট (PT0) একসাথে সেট করে দেয়া হয় তাহলে কি ঘটবে? তাহলে প্রথম চিত্রের প্রায়োরিটির পর্যায়ক্রম অনুসরণ করা হবে। আশা করি বিষয়টি বোঝা গেছে।
আচ্ছা আমরা সবইতো জানলাম, কিন্তু এটাতো বুঝলাম না যে সিপিউ কি করে বুঝতে পারে যে, কখন ইন্টারাপ্ট-সার্ভিস-রুটিনে যেতে হবে এবং কখন আবার মেইন প্রোগ্রাম অংশে ফিরে আসতে হবে? সিপিউ এটা বুঝতে পারে পতাকার উঠা-নামা দেখে। কোন একটি বিশেষ ইন্টারাপ্ট ফিচার প্রোগ্রামে অন করে দেয়া হলে ঐ ইন্টারাপ্ট রিলেটেড একটি ফ্ল্যাগ-বিট হাই এবং লো হওয়ার মাধ্যমে সিপিউ কে জানিয়ে দেয় যে কখন মেমোরির কোন লোকেশনে যেতে হবে। সাধারণত 8051 এর সব ইন্টারাপ্ট রিলেটেড বিটই হাই (1) হয়ে ইন্টারাপ্ট-সার্ভিস-রুটিনে যেতে জানান দেয় এবং ইন্টারাপ্ট-সার্ভিস-রুটিনের কাজ শেষ হয়ে গেলে লো (0) হয়ে যায় এবং মেইন প্রোগ্রাম অংশে ফিরে যাওয়ার জানান দেয়। আর এই ফ্ল্যাগ-বিটের স্যাম্পল নেয়া হয় ইন্সট্রাকশন সাইকেলের পঞ্চম স্টেটের দ্বিতীয় পালসে্।
ইন্টারাপ্ট সম্পর্কে আজকের মত এই পর্যন্তই। এর বাস্তব প্রয়োগ আমরা টাইমার এবং সিরিয়াল কমিউনিকেশন পেরিফেরাল্স শিখতে যেয়ে দেখতে পাবো।
অনেক ভালো করে বুজানো পয়েছে।
উত্তরমুছুন