৬. 8051 এর মেমোরি এবং রেজিস্টারের সাথে পরিচিতি


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

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






উপরের চিত্রে আমরা 8051 এর ডেটা-মেমোরির একটি ব্লক ডায়াগ্রাম দেখতে পাচ্ছি। আমরা এর আগে জেনেছি যে 8051 এর ক্ষেত্রে মিনিমাম ডেটা মেমোরি হল ১২৮ বাইটের। এবং এর এড্রেস শুরু হয় 00H থেকে এবং শেষ হয় 7FH দিয়ে (এটা নরমাল কেস, 8051 ফ্যামিলির কিছু মাইক্রোকন্ট্রোলারের ডেটা মেমোরি এর চেয়েও বেশি হতে পারে)।

00H থেকে 1FH পর্যন্ত আছে চারটি রেজিস্টার ব্যাঙ্ক সেট যথাক্রমে রেজিস্টার ব্যাঙ্ক-০, রেজিস্টার ব্যাঙ্ক-১, রেজিস্টার ব্যাঙ্ক-২, রেজিস্টার ব্যাঙ্ক-৩। প্রত্যেক ব্যাঙ্কে আছে আটটি করে রেজিস্টার। যেমন রেজিস্টার ব্যাঙ্ক-০ এর ক্ষেত্রে R0,R1,R2,R3,R4,R5,R6,R7 এই আটটি রেজিস্টার আছে। একেকটা রেজিস্টার ১বাইটের হয়ে থাকে। তাহলে রেজিস্টার ব্যাঙ্ক-০ এর আটটি রেজিস্টারের টোটাল সাইজ হল ৮ বাইট। এদের এড্রেস যথাক্রমে 00H,01H,02H,03H,04H,05H,06H,07H. এই হল ডেটা মেমোরির প্রথম ৮ বাইটের হিসাব। এভাবে প্রত্যেক রেজিস্টার ব্যাঙ্কের আন্ডারেই ৮ টি করে রেজিস্টার আছে। এবং এদের নামও যথাক্রমে R0,R1,R2,R3,R4,R5,R6,R7. কিন্তু এড্রেস ভিন্ন ভিন্ন। যেমন রেজিস্টার ব্যাঙ্ক-১ এর ক্ষেত্রে এড্রেস 00H থেকে 07H, রেজিস্টার ব্যাঙ্ক-২ এর ক্ষেত্রে এড্রেস 08H থেকে 0FH, রেজিস্টার ব্যাঙ্ক-৩ এর ক্ষেত্রে এড্রেস 10H থেকে 17H, রেজিস্টার ব্যাঙ্ক-৪ এর ক্ষেত্রে এড্রেস 18H থেকে 1FH. প্রত্যেক রেজিস্টার ব্যাঙ্কের আন্ডারেই একই নামের ৮ টি রেজিস্টার থাকলেও কিন্তু এদের এড্রেস ভিন্ন ভিন্ন।
আচ্ছা ৮ টি করে ৪ সেট রেজিস্টার মানে হল টোটাল ৩২ টি রেজিস্টার। যেহেতু এড্রেস শুরু হয় 00H থেকে তাই ৩২-১ = ৩১ অর্থাৎ 1FH হল এর শেষ এড্রেস (হেক্সাডেসিমেলে কনভার্ট করে)। এইসব রেজিস্টারকে বলা হয় জেনারেল পারপোজ রেজিস্টার। ডেটা এইসব রেজিস্টারে রেখেই সিপিউ কাজ করে। তবে এখানে খুবই গুরুত্বপূর্ণ একটি কথা আছে। সেটা হল এই ৪ টা রেজিস্টার ব্যাঙ্কের মধ্যে যেকোন একটাকেই কিন্তু অ্যাট-এ-টাইম ইউজ করা যায়। একাধিক ব্যাঙ্ককে কখনই সাইমাল্টেনিয়াসলি ইউজ করা যায় না। কোন রেজিস্টার ব্যাঙ্ক ইউজ করা হবে এটা প্রোগ্রামার নিজে ঠিক করে দিতে পারে প্রোগ্রামে। এর জন্য অবশ্য প্রোগ্রাম স্ট্যাটাস ওয়ার্ড (PSW) নামে আরেকটি রেজিস্টারের সাহায্য নেয়া হয়। এই রেজিস্টারে অবশ্য দুটি বিটের মাধ্যমেই এটা ঠিক করে দেয়া হয়। নিচের চিত্রটি দেখলে বোঝা যাবে বিষয়টি।



উক্ত রেজিস্টারের RS1 এবং RS0 বিট দুটির চারটি কম্বিনেশনের জন্যে ৪টি রেজিস্টার ব্যাঙ্কের মধ্যে যেকোন একটি সিলেক্ট করা যায়।

ডেটা মেমোরির 00H (০) এড্রেস থেকে 1FH (৩১) এড্রেস পর্যন্ত রেজিস্টারের পরিচয় আমরা ইতমধ্যেই পেয়েছি। এবং এইসব রেজিস্টার কি কাজে ব্যবহৃত হয় সেটাও আমরা জানলাম।
এরপরের এড্রেস 20H (৩২) থেকে 2FH (৪৭) পর্যন্ত টোটাল এই ১৬ বাইট এড্রেসের এরিয়াকে বলা হয় বিট এড্রেসেবাল এরিয়া। অর্থাৎ এই এরিয়ার প্রত্যেকটা বিটের একটি নির্দিষ্ট এড্রেস আছে। আমরা মোটামোটি সবাই জানি যে ৮ বিটে ১ বাইট। তাহলে এই এরিয়ার আন্ডারে আছে মোট ১৬ * ৮ = ১২৮ টা বিট। এই এরিয়ার প্রথম বিটের এড্রেস শুরু হয় 00H (০) দিয়ে এবং শেষ বিটের এড্রেস হয় 7FH (১২৭). নিচের চিত্র টা দেখলে সব পরিস্কার ভাবে বোঝা যাবে বলে আশা করি।




ডেটা-মেমোরিতে এই বিট এড্রেসেবাল এরিয়া থাকার জন্যে আমরা কোডে বিট টাইপের ভ্যারিয়েবালও ডিক্লেয়ার করতে পারি। এতে কোডকে আমরা যথেষ্ট অপ্টিমাইজ্‌ড করতে পারি। এই সম্পর্কে আমরা কোডিং পার্টে আরও আলোচনা করবো।

ডেটা-মেমোরির এর পরের অংশটুকুর এড্রেস হল 30H (৪৮) থেকে 7FH (১২৭). একটু ঠাণ্ডা মাথায় হিসাব করে নিই এর আগে -

৪টা রেজিস্টার ব্যাঙ্কের জন্যে ডেটা-মেমোরির ৩২বাইট, বিট-এড্রেসেবাল এরিয়ার জন্যে ১৬ বাইট। তাহলে মোট হল ৩২ + ১৬ = ৪৮ বাইট। মোট ডেটা মেমোরি ১২৮ বাইট। অবশিষ্ট থাকলো ১২৮ - ৪৮ = ৮০ বাইট। এই ৮০ বাইট হল জেনারেল পারপোজ র‍্যাম এরিয়া। স্ট্যাকের জন্যে মূলত এই এরিয়া এভেইলেবেল। স্ট্যাক কি এই বিষয়ে আমরা ইন্টারাপ্ট আলোচনা করতে যেয়ে জানবো।

তাহলে আমরা এখন এই সারমর্মে আসতে পারলাম যে ডেটা-মেমোরি ৩ টি অংশে বিভক্ত। যথা-
  1. রেজিস্টার-ব্যাঙ্ক অংশ               - ৩২ বাইট।
  2. বিট-এড্রেসেবাল এরিয়া              - ১৬ বাইট।
  3. জেনারেল পারপোজ র‍্যাম এরিয়া  - ৮০ বাইট। 
----------------------------------------------------------
                                               মোট - ১২৮ বাইট

এই গেলো মোটামোটি ভাবে ইন্টারনাল ডেটা-মেমোরির 00H (০) থেকে 1FH (১২৭) পর্যন্ত এড্রেসের হিসাব। ইন্টারনাল ডেটা-মেমোরির শেষ এড্রেসের ঠিক পরের এড্রেসই হল স্পেশাল ফাংশন রেজিস্টার (SFR) এর। অর্থাৎ 80H (১২৮) থেকে FFH (২৫৫) পর্যন্ত এড্রেস এসাইন করা আছে এই স্পেশাল ফাংশন রেজিস্টার গুলোর জন্যে। নিচের চিত্রটি দেখলে বিষয়টি ক্লিয়ার হয়ে যাবে আশা করি। 



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

B + 'b' where 0 <= 'b' <= 7
B হল রেজিস্টার এড্রেস এবং 'b' হল বিট নম্বর। একটা উধাহরন দিয়ে বিষয়টা ক্লিয়ার করে নেয়া যাক এখনি। উধাহরন হিসেবে আমরা A0H এড্রেসের P2 রেজিস্টারটাকে নিই। এটা হল পোর্ট-২ রেজিস্টার যেটার মাধ্যমে পোর্ট-২ এর ৮ টি পিনের যেকোনটিকে ইনপুট অথবা আউটপুট হিসেবে ইউজ করা যায়। এই রেজিস্টারটি দেখতে নিচের মত।




তাহলে উপরের সূত্রানুযায়ী পোর্ট-২ রেজিস্টারের এড্রেস এবং বিট নম্বর বসালেই আমরা পোর্ট-২ এর উক্ত বিটের এড্রেস পেয়ে যাবো। হেক্সাডেসিমেলে হিসাবটি দেখানো হল-         
A0H + 4H = A4H

বিট নম্বর 4 দ্বারা পাঁচ নম্বর বিটকে বোঝানো হয়েছে। তাহলে বিষয়টি দাড়াচ্ছে যে পোর্ট-২ রেজিস্টারে ৫ নম্বর বিটের এড্রেস হল A4H. উপরের চিত্রে আমরা ঠিক সেইটাই দেখতে পাচ্ছি। এভাবে প্রথম কলামের সবগুলো রেজিস্টারেরই বিট এড্রেস বের করা যায়। এজন্যেই SFR কে অনেক সময় ডিরেক্ট এড্রেসেবাল বলা হয়।

রেজিস্টারের পূর্ণ নামঃ

রেজিস্টারের পূর্ণ নামগুলো জেনে নেয়া যাক এবার। তবে কোনটা কোন কাজে ব্যবহৃত হয় তা আমরা পরে শিখবো।
B - B Register
ACC - Accumulator Register
PSW - Program Status Word Register
IP - Interrupt Priority Register
P3 - Port3 Register
IE - Interrupt Enable Register
P2 - Port2 Register
SCON - Serial Control Register
P1 - Port1 Register
TCON - Timer/Counter Control Register
P0 - Port0 Register
SBUF - Serial Buffer Register
TMOD - Timer/Counter Mode Select Register
SP - Stack Pointer Register
*TL0 - Timer/Counter0 Low Register
*TH0 - Timer/Counter0 High Register
*TL1 - Timer/Counter1 Low Register
*TH1 - Timer/Counter1 High Register
*DPL - Data Pointer Low Register
*DPH - Data Pointer High Register
PCON - Power Control Register 

উপরের তীর চিহ্নিত রেজিস্টার গুলো ১৬ বিটের রেজিস্টার। 8051 ৮ বিটের মাইক্রোকন্ট্রোলার জন্যে এই রেজিস্টারগুলো ৮ বিটের হাই এবং লো আকারে আলাদা করা হয়েছে। এই হল 8051 এর মোটামোটি ভাবে সাধারন কিছু রেজিস্টার। তবে মাইক্রোকন্ট্রোলারের মডেল অনুযায়ী রেজিস্টার কম বেশি হতে পারে। এটা মূলত মাইক্রোকন্ট্রোলারের ফিচারের উপর ডিপেন্ড করে।
  

মন্তব্যসমূহ

এই ব্লগটি থেকে জনপ্রিয় পোস্টগুলি