مرحباً بتعليقاتكم و مشاراكاتكم و لا داعى للشكر و اتمنى للجميع متابعة ناجحة لما اقدمه من جهد متواضع عبر صفحات هذا المنتدى و هيا بنا نكمل اليوم ما بدأناه
سبق و أن ذكرنا أن الذاكرة الداخلية للميكروكونتروللر 8051 لا تتسع الا 64 كيلوبايت اما 8052 فتتسع لكود حجمه 128 كيلوبايت لذلك سنراعى دائماً حجم او سعة الكود التى سيتم كتابتها لاننا فى البداية سنتعامل فقط مع الذاكرة الداخلية للميكروكونتروللر .
On-Chip Memory
كما اوضحنا سالفاً أن الميكروكونتروللر له ذاكرة داخلية RAM 128 بايت تم تقسيمهم الى توعين ذاكرة داخلية Internal RAM و ذاكرة السجلات ذات الوظائف الخاصة Special Function Register (SFR) memory
هذه الــ 128 بايت مقسمة كالتالى :- من 00 الى 7F فى 8051
من العنوان h00 الى العنوان 07h يتواجد سجل المصفوفة رقم 0 == "register bank 0"
من العنوان 8h0 الى العنوان 0Fh يتواجد سجل المصفوفة رقم 1 == "register bank 1"
من العنوان 10h الى العنوان 17h يتواجد سجل المصفوفة رقم 2 == "register bank 2"
من العنوان 18h الى العنوان 1Fh يتواجد سجل المصفوفة رقم 3 == "register bank 3"
من العنوان 20h الى العنوان 2Fh يتواجد Bit Memory و هى المنطقة التى نتمكن فيها من التعامل مع كل بت على حدا
من العنوان 30h الى العنوان 7Fh يتواجد منطقة التداول العام General purpose و هى بسعة 80 بايت 80 bytes has to be shared between the stack and user variables و يتم تقسيمها بين المبرمج و الميكرو فيما يسمى بـ stack
Register Banks

سجل المصفوفات
لكل مصفوفة عدد 8 سجلات تأخذ الرمز R و ترقم من 0 الى 7 كالتالى
(R0, R1, R2, R3, R4, R5, R6, and R7) و عادة ما تستخدم هذه السجلات فى نقل البيانات من مكان الى اخر و المثال التالى يبين استخدام السجل R4 فى عملية اضافة او جمع تتم مع الــ Accumulator
ADD A,R4
لاجراء هذا التطبيق تعالوا نفترض افتراضات و نطبقها
سنقوم بادخال القيمة 6 الى الــ Accumulator و القيمة 3 الى R4
MOV A,#6
MOV R4,#3
ADD A,R4
الامر ADD سيقوم باضافة الرقم الموجود فى R4 الى القيمة المخزنة فى الــ Accumulator و يخزن الناتج فى الــ Accumulator
بالتالى القيمة فى الــ Accumulator ستكون 9
لدينا طريقة اخرى للتعامل مع السجل رقم 4 و هو التعامل مع العنوان الخاص به ألا و هو 04h .......... حيث اننا نتعامل مع المصفوفة رقم 0
ADD A,04h
اذا ستخدمنا هذا الامر بهذه الصيغة سنحصل على نفس النتائج
يجب الانتباه الى الميكرو بمجرد ان يعمل فهو يعتبر ان bank 0 المحجوز على العنوان 00h الى 07h هو الذى سيستخدم فهو الــ default لكن على كل حال ممكن جداً ان البرنامج يغير مسار bank 0 و يوصفه فى مكان اخر و من ثم فان العناوسن السابق الاشارة اليها سيتغير موضعها
معنى ذلك انه يجب ان نكون حذرين عند التعامل مع البت فاذا استخدمنا المصفوة 0 == bank 0 فمن الممكن تداول بيانات على المنطقة من العنوان 08h الى العنوان 1Fh و لن يحدث مشاكل .
لكن اذا قرننا ان نتعامل مع المصفوافات 1 او 2 او 3 و سبق ان استخدمنا اماكن فى تداول البيانات تحت العنوان 20h فبكل تأكيد ستقوم هذه المصفوفات بمحو البيانات التى تداولناها تحت ذلك العنوان و الكتابة عليها
Bit Memory
كما ذكرنا آنفاً اننا من الممكن التعامل مع البت bit variables و نكتب عليها احدى القيمتين 0 او 1 و عددها 128 بت و تحتل العناوين من 00h الى 7Fh و نستخدم معهم الاوامر التالية
يستخدم لكتابة 1 داخل البت SETB
يستخدم لكتابة 0 داخل البت CLR
المثال التالى يوضح كيفية كتابة 1 على البت رقم 24h
SETB 24h
يجب الانتباه الى ان الــ 128 بت bit variables هى جزء من الذاكرة RAM و يتحلوا مواقع الذاكرة من 20h الى 2Fh بسعة 16 بايت
و من ثم إذا قمنا بادخال القيمة FFh الى الذاكرة عند العنوان 20h يا ترى ما معنى ذلك ؟؟؟؟؟؟
القيمة FFh تكافى 11111111b و بالتالى فلكى نكتبها على الذاكرة سنحتاج الى 8 خانات و حيث اننا اخترنا العنوان 20h للتخزين فهى ستأخد اول قيمة و السبع الباقين سيخزنوا فى السبع عناوين التالية .
معنى ذلك ان الأمر :-
MOV 20h,#0FFh
مكافئ لهذه الاوامر مجتمعة
SETB 00h
SETB 01h
SETB 02h
SETB 03h
SETB 04h
SETB 05h
SETB 06h
SETB 07h
يجب ملاحظة التالى ....... إذا لم تكن تضع فى اعتبارك اثناء البرمجة استخدام bit variables بالتالى يمكنك بسهولة جداً استخدام المنطقة من 20h الى 2Fh كجزء تقليدى من الذاكرة RAM و لكن اذا نويت استخدامها للتعامل على مستوى البت فكن حذر جداً فى الحفاظ على تلك المنطقة و ان تحترس ان يتم الكتابة عليها بغير قصد فتمحو البيانات التى سبق و خزنتها فيها .
خلاصة ما سبق انا المنطقة بين العناوين 00h و 7Fh هى منطقة خاصة جداً و فيها الوظائف التى يحددها المبرمج و من ثم فان باقى البرنامج سبدأ من العنوان 80 h و الذى يشير الى الميناء رقم 0 ..... فى الطبيعى تكون قيمة الخرج على كل الموانى مساوية للصفر بمعنى ان P0.0 --------- P0.7 تحمل القيمة 00000000
و اذا اردنا ان نكتب الرقم 00000001 على الميناء رقم 0 و هذه القيمة تكافئ 01h فإننا نكتب الامر التالى
MOV P0,#01h
و الذى يكافئه الامر التالى
SETB 80h
الامر الاول سيدخل 8 قيم الى الميناء رقم 0 احدهما هو الواحد و الذى سيدخل على P0.0
بينما الامر الثانى سيرسل قيمه واحدة فقط الى P0.0 دون التأثير على باقى قيم الميناء .
نلاحظ اننا قد نحتاج فعلاً للتعامل مع طرف واحد فقط فى ميناء التوصيل رقم 0 و من ثم لن يصلح معنا الامر MOV .
لاحظ ان الميكرو عادة ما يحدد مؤشر Stack Pointer (SP) يشير الى العنوان 08h مباشرة و من ثم اذا كنا ننوى التعامل مع المصفوفات 1 او 2 او 3 فيجب ان نحدد عنوان الــ Stack Pointer (SP) الى عنوان اعلى من أعلى اى عنوان سيستخدم مع احد تلك المصفوفات و الا سنفاجأ بان الــ Stack Pointer (SP) قام بمسح بياناتنا و الكتابة عليه لذلك من المفضل استخدام bit variables لتحديد عنوان مبدئى للــ Stack Pointer (SP) عند عنوان اكبر من 2Fh لضمان حماية متغيراتنا من اعادة الكتابة عليها بواسطة Stack Pointer (SP)