৭. 8051 এর বেসিক কিছু জিনিস
আজকের এই পোস্টটি একটু অগোছালো টাইপের। আজকে আমরা 8051 এর আরো কিছু বেসিক জিনিস যেমন স্পেশাল কিছু রেজিস্টারের নাম, এদের কাজ, ইন্সট্রাকশন এক্সিকিউশন টাইমিং, মাইক্রোকনট্রোলারে প্রোগ্রামিং করার কৌশল, ইন্টারাপ্ট এসব বিষয়ে শিখবো। যদিও বিষয় গুলো একটা আরেকটার সাথে তেমন ভাবে রিলেটেড নয়, তবুও এই প্রত্যেকটা টার্মের সাথেই আমরা এর আগের পোস্টগুলোয় পরিচিত হয়েছি। সেসব পোস্টে তেমন ভাবে কিছু বলা হয়নি জন্যেই আজকের পোস্টে এসব খুচরা জিনিসপাতি গুলো নিয়ে আমরা আলাদাভাবে আলোচনা করব। তবে এই পোস্টটি পড়ার আগে অবশ্যই প্রোগ্রাম-মেমোরি এবং ডেটা-মেমোরি রিলেটেড পোস্টটি পড়ে আসার অনুরোধ রইল। নাহলে বোঝাটা একটু টাফ হয়ে যাবে।
---------------------------------------------------------------------------------------------------------------
প্রথমেই আমরা রেজিস্টার নিয়ে একটু কথা বলি। রেজিস্টারও যে একধরনের মেমোরি এটা আমরা অনেক আগেই জানতে পেরেছি। কিন্তু এটা আসলে টেম্পোরারি টাইপের মেমোরি। রেজিস্টার ৮ বিটের অথবা ১৬ বিটের অথবা ৩২ বিটের হতে পারে। কিন্তু 8051 এর ক্ষেত্রে ৮ বিট এবং ১৬ বিটের রেজিস্টারই আছে। ৮ বিটের একটা রেজিস্টার দেখতে নিচের চিত্রের মত।
এই ৮বিটের রেজিস্টারে আমরা ছোট ছোট ৮টা বক্স দেখতে পাচ্ছি যেটার সবার ডানদিকের বক্সকে 0 এবং সবার বামদিকের বক্সকে 7 দ্বারা চিহ্নিত করা হয়েছে। এই একেকটা বক্সকে বলা হয় বিট। প্রত্যেকটা বক্স 1 অথবা 0 ই ধারন করতে পারে। বিটের ইনডেক্সিং সর্বদা 0 থেকেই করা হয়। আর এই 0 বিটকে বলা হয় Less-Significant-Bit (LSB) এবং 7 বিটকে বলা হয় Most-Significant-Bit (MSB). চারটি LSB কে বলা হয় Lower Nibble এবং চারটি MSB কে বলা হয় Higher-Nibble.
সবগুলো বক্স 0 ধারন করলে রেজিস্টারের মান হয় সর্বনিম্ন 0 (হেক্সাডেসিমেলে 00H). এবং সবগুলো বক্স 1 ধারন করলে রেজিস্টারের মান হয় সর্বোচ্চ 255 (হেক্সাডেসিমেলে FFH).
একইরকম ভাবে ১৬ বিটের রেজিস্টারের ক্ষেত্রেও সর্বনিম্ন এবং সর্বোচ্চ মান বের করলে যথাক্রমে 0 (0000H) এবং 65535(FFFFH) পাওয়া যায়।
********১৬ বিটে ১ ওয়ার্ড গঠিত হয়********
---------------------------------------------------------------------------------------------------------------আমরা এর আগের পোস্টে মোটামোটি ভাবে সবগুলো রেজিস্টারের নাম জেনেছি কিন্তু এদের কাজ নিয়ে তেমনভাবে আলোচনা করা হয়নি। 8051 এর রেজিস্টার গুলোর মধ্যে সবচেয়ে গুরুত্বপূর্ণ রেজিস্টার হল PSW অর্থাৎ প্রোগ্রাম-স্ট্যাটাস-ওয়ার্ড রেজিস্টার। প্রত্যেক ইন্সট্রাকশন এক্সিকিউট হওয়ার পর এই রেজিস্টার আপডেট হয় জন্যে এটাকে অনেক সময় ফ্ল্যাগ রেজিস্টারও বলা হয়ে থাকে (পতাকা উত্তলনের মাধ্যমে অবস্থা জানিয়ে দেয়ার সাথে তুলনা করে)। এটা একটা ৮ বিটের রেজিস্টার। কিন্তু ৮টা বিটের মধ্যে ৬টা বিটই শুধু 8051 মাইক্রোকন্ট্রোলার ইউজ করে থাকে। আর অবশিষ্ট ২টা বিট ইউজার-ডিফাইনাবেল-ফ্ল্যাগ অর্থাৎ প্রোগ্রামার তার নিজের কাজের জন্যে এই ২টা বিট ইউজ করতে পারে। ৬টা বিটের মধ্যে ৪টা বিটকে বলা হয় কন্ডিশনাল-ফ্ল্যাগ।
উপরের চিত্রটি PSW রেজিস্টারের। এই রেজিস্টারের দ্বিতীয় (B1) এবং ষষ্ঠ (B5) বিট ইউজার-ডিফাইনেবাল।
অষ্টম (B7), সপ্তম (B6), তৃতীয় (B2), এবং প্রথম (B0) এই চারটি বিট হল কন্ডিশনাল-ফ্ল্যাগ বিট। আর RS1 RS0 বিটের পরিচয় তো আমরা এর আগেই জানতে পেরেছি যে, এই দুটো বিটের মাধ্যমে ডেটা-মেমোরির রেজিস্টার ব্যাঙ্ক সিলেক্ট করা যায়। এবারে তাহলে সংক্ষেপে কন্ডিশনাল-ফ্ল্যাগ বিট চারটির কাজ জেনে নেয়া যাক।
P, Parity Flag - এই বিটটি Accumulator রেজিস্টারে 1 এর সংখ্যা কত সেটা জানান দেয়। Accumulator একটি ৮ বিটের রেজিস্টার এবং এই রেজিস্টারে প্রত্যেক ইন্সট্রাকশন এক্সিকিউট হওয়ার পরে রেজাল্ট জমা হয়ে থাকে। এই রেজাল্টকে যদি বাইনারি ৮ বিটের সংখ্যা আকারে চিন্তা করা হয় তাহলে দেখা যাবে যে এতে 1 এর সংখ্যা হয় জোড় সংখ্যক পরিমান আছে নাহলে বিজোড় সংখ্যক পরিমান আছে। Accumulator রেজিস্টারে জোড় সংখ্যক পরিমান 1 থাকলে এই বিটের মান 0 হয় এবং বিজোড় সংখ্যক পরিমান 1 থাকলে এই বিটের মান 1 হয়।
OV, Overflow Flag - এই বিটটি মূলত হাই হয়, যদি কোন সাইন্ড নাম্বারের অপারেশন অনেক বড় হয়। অর্থাৎ সাইন্ড নাম্বারের ক্ষেত্রে যদি শেষ বিটটি অভারফ্লো হয়ে যায় তাহলে এই বিটটি সেট হয়ে যায়, মানে এই বিটের মান 1 হয়ে যায়। এই বিটটি দিয়ে মূলত সাইন্ড নাম্বারের গানিতিক অপারেশনে কোন এরর আছে কিনা তা চেক করা হয়।
CY, Carry Flag - দুটি ৮ বিটের নাম্বার নিয়ে গানিতিক অপারেশন করা হলে যদি রেজাল্টের অষ্টম বিট থেকে ক্যারি বিটের সৃষ্টি হয় তাহলে এই বিটটি সেট হয়ে যায়। সাধারণত আনসাইন্ড নাম্বারের গানিতিক অপারেশনে এরর আছে কিনা তা চেক করার জন্যে এই বিটের স্ট্যাটাস জানা দরকার হয়।
AC, Auxiliary Flag - এই বিটটির কাজও অনেকটা আগের বিটের মতই। তবে এই বিটটি সেট হয় যদি লোয়ার নিবিলের শেষ বিটে ক্যারি সৃষ্টি হয়, অর্থাৎ কোন গানিতিক অপারেশনের সময় ৪র্থ বিট থেকে যদি ক্যারি বিট সৃষ্টি হয়। তাছাড়া এই বিটটি ক্লিয়ারই থাকে। সাধারণত BCD (Binary Coded Decimal) অপারেশন করার সময় এই বিটটি চেক করার প্রয়োজন পড়ে।
Program Counter (PC) Register :
এটা ২ বাইট তথা ১৬ বিটের একটি রেজিস্টার। এর কাজ হল ২ বাইটের এড্রেস ধরে রাখা যেটা বলে দেয় যে মেমোরি লোকেশনের কোন জায়গা থেকে ইন্সট্রাকশন ফেচ করে আনতে হবে। এটা ইন্টার্নাল র্যাম, এক্সার্টানাল র্যাম, অথবা এক্সাটার্নাল রোমের এড্রেস ধরে রাখে। PC সর্বদাই 0000H থেকে শুরু হয় এবং প্রত্যেক ইন্সট্রাকশন এক্সিকিউট হওয়ার পরে এক করে বৃদ্ধি পায়। এটা অবশ্য ১ করে বৃদ্ধি না পেয়ে ২ বা ৩ করেও বৃদ্ধি পেতে পারে। তবে এটা ডিপেন্ড করে যে কোন ইন্সট্রাকশনের সাইজ কত বড় সেটার উপর। কোন ইন্সট্রাকশনের সাইজ ১ বাইটও হতে পারে আবার কোন কোনটার সাইজ ২ বা ৩ বাইট ও হতে পারে। এটা 8051 এর ডেটা-শিটে ইন্সট্রাকশন সেট দেখলেই বোঝা যাবে।Data Pointer (DP) Register :
এটা ১৬ বিটের একটি রেজিস্টার যেটা কিনা ইন্টার্নাল র্যাম বা এক্সটার্নাল র্যামের ডেটা এর এড্রেস ধরে রাখে। যেহেতু 8051 একটি ৮বিটের মাইক্রোকন্ট্রোলার তাই ১৬ বিটের রেজিস্টার বলতে আসলে একটি রেজিস্টারকেই বোঝানো হয় না। বরং দুটি ৮ বিটের রেজিস্টার মিলে একটি ১৬ বিটের রেজিস্টার গঠিত হয়।Stack Pointer (SP) Register :
Stack Pointer রেজিস্টার নিয়ে আলোচনার আগে স্ট্যাক (Stack) জিনিসটা কি সেটা নিয়ে একটু ধারনা থাকা দরকার।এটা হল র্যামের একটা অংশ যেখানে প্রোগ্রাম এক্সিকিউট হওয়ার সময় ডেটা টেম্পোরারিভাবে জমা থাকে। এর আগের পোস্টেই তো আমরা জেনেছি যে ডেটা টেম্পোরারিভাবে রেজিস্টার ব্যাঙ্কের রেজিস্টারে জমা থাকে কারন সিপিউ ঐসব রেজিস্টারে অনেক দ্রুত প্রবেশ করতে পারে। তো স্ট্যাক হিসেবে মোটামোটি ভাবে র্যামের এই অংশ টুকু পরিচিত। প্রোগ্রামে মেইন ফাংশনের ভিতরে কোন একটা ফাংশন কল করা হলে সেই ফাংশনের প্যারামিটার, লোকাল ভ্যারিয়েবেল সবকিছুই এই স্ট্যাকে জমা হয় ফাংশনটি এক্সিকিউট হওয়ার সময়। আবার কোন ইন্টারাপ্ট রুটিন কল করা হলেও প্রোগ্রামের লাস্ট এড্রেসটা স্ট্যাকে জমা হয়ে থাকে এবং ইন্টারাপ্ট সারভিস রুটিন শেষে মেইন প্রোগ্রামের যে এড্রেসের ইন্সট্রাকশন হল্ট করা ছিলো , সেই এড্রেসটা স্ট্যাক থেকে সিপিউ কালেক্ট করে নেয়। তো স্ট্যাকে কোথায় কি জমা থাকছে সেটার হিসাব অর্থাৎ স্ট্যাকের এড্রেস ধরে রাখে যেই রেজিস্টার সেটাই হল স্ট্যাক পয়েন্টার রেজিস্টার। এটা একটা ৮ বিটের রেজিস্টার যেটা কিনা 00H থেকে FFH পর্যন্ত কাউন্ট করতে পারে। যখন 8051 মাইক্রোকন্ট্রোলার পাওয়ার-আপ করা হয় তখন স্ট্যাক পয়েন্টার রেজিস্টারের ডিফল্ট ভ্যালু থাকে 07H অর্থাৎ ডেটা-মেমোরির রেজিস্টার ব্যাঙ্ক-১ এর R7 রেজিস্টারের এড্রেস। তারমানে র্যামের 08H হল 8051 এর স্ট্যাকের জন্যে প্রথম লোকেশন।
PUSH ইন্সট্রাকশন দ্বারা SP এর মান এক বৃদ্ধি পায় এবং উক্ত মেমোরি লোকেশনে ডেটা টেম্পোরারিভাবে জমা হয়। POP ইন্সট্রাকশন দ্বারা লাস্টে জমা হওয়া ডেটা ফাস্টে রিট্রাইভ হয় এবং SP এর মান এক হ্রাস পায়। এইজন্যেই স্ট্যাক এর অপারেশনকে লাস্ট-ইন-ফাস্ট-অাউট বলা হয়। মানে যে ডেটা লাস্টে জমা হয় সেই ডেটাই ফাস্টে বের হয়।
স্ট্যাকের ডিফল্ট এড্রেস 07H থেকে শুরু হয় এটা তো আমরা জানলাম কিন্তু এর শেষ কোথায় হয়? এর শেষ হয় 1FH এড্রেসে। কারন এর পরের এড্রেসটাই হল বিট-এড্রেসেবাল-এরিয়ার এড্রেস (20H)। তারমানে 08H থেকে 1FH মোট 24 বাইট হল 8051এর স্ট্যাকের জন্যে বরাদ্দ বাই-ডিফল্ট। কিন্তু যদি কখনো এই সীমিত জায়গায় না হয় তাহলে আমরা কি করবো? এটার জন্যে আমাদেরকে SP রেজিস্টারের ডিফল্ট মানটা চেঞ্জ করে নিতে হবে। SP এর ডিফল্ট মান 07H এর পরিবর্তে 30H করে দিতে হবে। MOV SP, #30H ইন্সট্রাকশন দিয়ে এটা করা যায়। তাহলে 30H থেকে একদম ডেটা-মেমোরির শেষ এড্রেস 1FH এর মধ্যে যেকোন এড্রেসকে আমরা স্ট্যাকের জন্যে ব্যবহার করতে পারবো। এবং এটা করা মাঝে মাঝে খুবই জরুরী হয়ে পড়ে কেননা স্ট্যাকের জন্যে কম জায়গা থাকলে স্ট্যাক অনেক সময় অভার ফ্লো হতে পারে (যদি আমরা একটু খাম খেয়ালি হয়ে প্রোগ্রাম লিখি)। আর স্ট্যাক অভার ফ্লো হলে পুরো সিস্টেমই হয় হ্যাং হয়ে যায় নাহলে রিবুট নেয়। তো স্ট্যাক বিষয়ে আমাদের বরাবরই একটু সাবধানতা অবলম্বন করা উচিৎ বিশেষ করে 8051 এর মত এত সীমিত র্যামে কোড করার সময়।
স্ট্যাক বিষয়টা হয়ত এখন অনেকের কাছেই ক্লিয়ার না। বিষয়টা অনেকটা এমন যে নিজে বোঝা যায় কিন্তু অন্যকে বুঝানো কঠিন হয়ে যায়। তবে ইন্টারাপ্ট পার্টে যেয়ে আমরা আরও ভালোভাবে বুঝতে পারবো বলে আশা করি।
ইন্সট্রাকশন এক্সিকিউশন টাইমিং :
আচ্ছা এবারে আমরা আলোচনা করবো 8051 এর ইন্সট্রাকশন এক্সিকিউশন টাইম নিয়ে। আমরা মাইক্রোকন্ট্রোলারের সাথে ক্রিস্টাল অসসিলেটর লাগানোর কারন জেনেছি। ক্রিস্টাল অসসিলেটর থেকে মূলত যে ক্লক পাল্স আসে সেটাই আমাদের মাইক্রোকন্ট্রোলারের ক্লক হিসেবে কাজ করে। তো স্ট্যান্ডার্ড প্র্যাকটিস হিসেবে আমরা 8051 এর সাথে ১২ মেগাহার্টজের ক্রিস্টাল লাগাই। এবং এক্ষেত্রে আমরা শিখেছিলাম যে আমাদের মাইক্রোকন্ট্রোলারটি সেকেন্ডে প্রায় ১০০০০০০ ইন্সট্রাকশন এক্সিকিউট করতে পারে। তো এটার নিশ্চয় কোন একটা হিসাব আছে যেটার জন্যে ফিচার হিসেবে এটা আমরা শিখেছি। আজকে আমরা এই হিসাব টাও শিখে নিব। 8051 মাইক্রোকন্ট্রোলারে ক্রিস্টাল অসসিলেটর থেকে যে ক্লক পাল্স আসে সেটাকে ইন্টার্নালি ১২ ভাগে ভাগ করা হয়। তারমানে ক্রিস্টাল অসসিলেটর ১২ টা স্পন্দন দিলে 8051 মাইক্রোকন্ট্রোলার সেটাকে ১টা স্পন্দন হিসেবে চিন্তা করে। আর এই ১টা স্পন্দনকে বলা হয় ১ ইন্সট্রাকশন সাইকেল বা ১ মেশিন সাইকেল। অর্থাৎ এই একটা স্পন্দনের যে সময় সেই সময়ে 8051 মাইক্রোকন্ট্রোলার একটা ইন্সট্রাকশন এক্সিকিউট করে। এখন তাহলে এই একটা স্পন্দনের সময়টা হিসাব করে নেয়া যাক।ক্রিস্টাল অসসিলেটর = ১২ মেগাহার্টজ
= ১২ * ১০০০০০০ হার্টজ
= ১২০০০০০০ হার্টজ
= ১/১২০০০০০০ সেকেন্ড
= ০.০৮৩৩ মাইক্রোসেকেন্ড
অর্থাৎ ক্রিস্টাল অসসিলেটেরের ১টা স্পন্দনের মান = ০.০৮৩৩ মাইক্রোসেকেন্ড।
১ ইন্সট্রাকশন সাইকেল = ১২ / ১২ মেগাহার্টজ
= ১ মেগাহার্টজ
= ১০০০০০০ হার্টজ
= ১ / ১০০০০০০ সেকেন্ড
= ১ মাইক্রোসেকেন্ড
অর্থাৎ ১ ইন্সট্রাকশন সাইকেল বা মেশিন সাইকেল = ১ মাইক্রোসেকেন্ড।
এখন একটা কথা চিন্তা করি আমরা যে 8051 এর যে ইন্সট্রাকশন সেট গুলো আছে সেগুলোর এক্সিকিউট হওয়ার জন্যে সর্বনিম্ন সময় লাগে হল ১ মেশিন সাইকেল বা ১ ইন্সট্রাকশন সাইকেল অর্থাৎ ১ মাইক্রোসেকেন্ড।
তারমানে ১ মাইক্রোসেকেন্ডে ১টা ইন্সট্রাকশন এক্সিকিউট হয়। আর ১ সেকেন্ডে ১,০০০,০০০ মাইক্রোসেকেন্ড।
তাহলে ১ সেকেন্ডে 8051 ইন্সট্রাকশন এক্সিকিউট করতে পারে ১ * ১,০০০,০০০ = ১,০০০,০০০ টি।
এইজন্যেই বলা হয় ১২ মেগাহার্টজ ক্রিস্টালে 8051 মাইক্রোকন্ট্রোলার 1MIPS(Mega Instruction Per Second) এ কাজ করতে পারে।
শুধু তো ১২ মেগাহার্টজ ক্রিস্টালই লাগানো যায় এমনটা না। 8051 এর কিছু কিছু মডেল ৩৩ মেগাহার্টজ পর্যন্ত সাপোর্ট করে, তাহলে তাদের ক্ষেত্রে ইন্সট্রাকশন এক্সিকিউটের টাইম কত অল্প হবে সেটাও আমরা হিসাব করে বের করতে পারবো।
তাহলে এটুকু বোঝা গেলো যে ১২ টা ক্লক পাল্স নিয়ে ১টা মেশিন সাইকেল বা ইন্সট্রাকশন সাইকেল গঠিত। আবার ১টা মেশিন সাইকেলে ৬টা স্টেট থাকে। এবং প্রতিটা স্টেটে ২ টা করে পাল্স থাকে। তো এত কিছু জেনে আমাদের আসলে কি লাভ? লাভ আছে। কারন কোন ইন্সট্রাকশন, একটা মেশিন সাইকেলের কোন স্টেটের কোন পালসে্ সম্পূর্ণ হয় বা একটা মেশিন সাইকেলের কোন স্টেটের কোন পালসে কোন একটা হার্ডওয়্যার চেঞ্জ হয় এটাও জানার দরকার হয় মাঝে মাঝে। আসলে বিষয়গুলো জানার গভীরতা অনেকটা অসীম । তো সমগ্র বিষয় টা অনেকটা নিচের চিত্রের মত করে দেখানো যায়।
আজকের পোস্টে আর ইন্টারাপ্ট নিয়ে আলোচনা করবো না, কারন ইন্টারাপ্ট নিয়ে আলাদা একটি পোস্টই হবে যেখানে ইন্টারাপ্টের সাথে পরিচয় সহ এর রিলেটেড সকল রেজিস্টার নিয়েও আলোচনা করা হবে।
মন্তব্যসমূহ
একটি মন্তব্য পোস্ট করুন