مرحبا
كنت قد طرحت هذا الموضوع في منتدى آخر في هذا الموقع ولكن وجدت الآن
أن مكانه الأنسب هنا
وهو على الشكل التالي:
قد تبدوا الفكرة للوهلة الأولى صعبة التحقيق
ولكن ذلك ممكن فعلياً وذلك من خلال استخدام الأسيمبلي في ارسال القيم (اما عن طريق الأسيمبلي مباشرة أومن خلال توابع جاهزة في لغات البرمجة تؤدي نفس الغرض
طبعاً هذا الكلام بعد إنجاز الجزء المادي الخاص بالذواكر
والتي هي بشكل مبسط ترانستورات وديودات
هنا لن نهتم بالدارات وطريقة توصيلها بشكل أساسي ولكن يكفي أن نتعامل مع هذة الذاكرة الإفتراضية على
أساس الخلايا المكونة من ترانزستور وحيد ومكثفة وحيدة
حيث سنعتبر أنها مؤلفة من أسطر افقية وعمودية وتقاطع كل سطر مع عمود يشكل خلية.
سنقوم بربط الدارة السابقة بالمنفذ التفرعي للحاسب LPT حيث اننا نعلم أن معظم منافذ الكومبيوتر هي منافذ رقمية (ما عدا بوابة الألعاب) أي منافذ غير تشابهيه . حيث كل إشارة هي إما 0 أو 1 ولا تحتمل حلاً آخر .
ويمكن تقسيمها إلى :
منافذ تفرعية : تستطيع التعامل مع عدة بتات في المرة الواحدة .
و منافذ تسلسلية : تستطيع التعامل مع بت واحد في كل مرة .
تستخدم النافذ التسلسلية في الإتصالات , تتميز بسهولة التعامل معها حيث لا تحتاج إلى نوعية خاصة من الكابلات , كمـا ويمكن وصلها إلى مناطق بعيدة جداً ,, كما في شبكة الإنترنت .
ولكنها بطيئة جداً في نقل البيانات وليس لها استخدامات فعلية في مشاريع التحكم الآلي
لذلك اخترنا هنا المنفذ التفرعي وللبدء بالعمل لابد من التعرف ولو بشكل مبسط على هذا المنفذ:
وهو عبارة عن موصل مؤنث مؤلف من 25 خطـاً من النوع D .
وفي الحقيقـة ,, ومن الناحية المنطقية . يتألف هذا المنفذ من ثلاث منافذ موصولة معا .وهو ليس منفذ واحد كمـا يظن البعض .
وهذة المنافذ هــــي :
مخرج معطيـات . بعرض 8 بتات وهو بعنوان 378H
يستخدم لتبادل المعطيات الطبيعي مع الطابعـة, حيث يحمل شفرات الحروف والكلمات
مدخل حالـة . بعرض 5 بتات وهو بعنوان 379H
لة استخدامات خاصة بالطابعة . ( الطابعة خالية من الورق , الطابعة مشغولة .... )
مخرج تحكـم . بعرض 4 بتات وهو بعنوان 37AH
استخداماتة خاصة للتحكم برأس الطباعة ولفائف الورق .
وأي من هـذة المنافذ السابقة يمكن استخدامة بشكل مستقل بغض النظر عن الإستخدامات الأصلية لـة .
وبعد هذة المعلومات الاساسية سنبدأ العمل معاً وهنا لن نضع حلول بل سنضع
أفكار ونناقش احتمالات الحل
نستطيع التعامل مع الذاكرة السابقة في ارسال القيم كما لوكنا نتحكم بإضاءة او إطفاء
ديود ضوئي (لد) عن طريق المنفذ
وهنا أود مناقشة الحلول من خلال توابع الأسمبلي .
علماً أنه يوجد لدينا تابعين في الأسيمبلي مهمان وهما
In & out
حيث يستخدمان على الشكل التالي
مثلا
IN AL,[035h] MOV AH,AL IN AL,[0F8h] MOV DX,0E00h OUT DX,AX
هنا مثال يوضح الأمر أكثر
سنقوم في هذا التطبيق البسيط على الكتابة في ذاكرة مؤلفة من نصف بايت و بالتالي 4 خلايا (بتات)
وستكون عبارة عن سطرين وعمودين وكما ذكرت مسبقاً سنعتبر أن كل تقاطع لسطر مع عمود
خلية هنا لابد من فهم بعض الافكار البسيطة في كيفة تصميم الذاكرة السابقة والتي ستوصل إلى المنفذ التفرعي LPT
وحتى تتم عملية الوصل هذة لابد من بعض الإلمام بطبيعة المنفذ السابق
والان سنصل الدارة السابقة بالشكل
الأعمدة موصولة بحيث تكون خرج لمفكك ترميز decoder وكما هومعلوم يكون خرجه
هو 2أس (عدد المداخل ) التي ستكون هنا هي مدخل وحيد وبالتلي مخرجين
سيوصل المدخل هنا إلى D0
أصبحنا نستطيع تصميم جدول مناسب للحالات الممكنة على دخل وخرج مفكك التشفير
المدخل -- المخرج A -- المخرج B
1 ------ 1 ------- 0
0 ----- 0 -------- 1
على الترتيب
وسنصل الأسطر إلى موزع في حالة الكتابة
او مجمع في حالة القراءة (تجارياً يوجد الMux/demux ) في قطعة واحدة
وعندها سيكون تفعيل الأول يعني إلغاء الثاني والعكس بالعكس
وفي حالتنا هذه سيكون للموزع خط انتخاب وحيد
خط الإنتخاب -- المخرج الأول -- المخرج الثاني
1 ----- القيمة المدخلة ----- 0
0 ------ 0 ----- القيمة المدخلة
على الترتيب
والان للكتابة ضمن الخلية الموجودة في الزاوية العليا اليسرى سنكون بحاجة للأمور التالية:
- تفعيل مفكك التشفير (يمكن اعتباره مفعل افتراضياً)
- تفعيل الموزع
- تفعيل المخرج A لمفكك التشفير
- تفعيل المخرج الاول c للموزع .
وعملياً يتم تفعيل مفكك التشفير بارسال القيمة 1 منطقي إلى بوابة السماحية Enable الموصولة إلى C0 (Control )
وكذلك الامر بالنسبة للموزع المصول إلى C1
لتفعيل المخرج A نرسل 1 منطقي إلى D0
وبذلك نكون قد وصلنا إلى المطلوب ويتم ذلك برمجياً كما يلي:
#include <stdio.h>
#include <iostream.h>
void main()
{
cout<<"send 1 to data "<<endl;
outport(378,ox1);
cout<<"send 1 to control C1,C2 "<<endl;
outport(37A,ox3)مع ملاحظة ان القيم ترسل بالنظام العشري أو الست عشري ويفضل ست عشرياً
ربما نكون بهذا الشكل قد كونا صورة أقرب للموضوع والمطلوب بعد فهم الكود السابق العمل على تحويله
على لغة التجميع ASM
ستصبح الشيفرة بالشكل التالي:
mov Al,1 out 378h,Al mov Bl,3 out 37Ah,Bl
الآن إذا طلب ذاكرة 4*4 أي 16 بت أي 2بايت
وطلب كتابة القيمة 1 منطقي في الخلايا الفردية
ثم قراءة البت المركزي
باستخدام تعليمات الأسيمبلي حصراً
أتمنى أن أجد التفاعل في هذا الموضوع من كافة الأعضاء الكرام