Social Icons

twitter facebook rss feed email

الاثنين، 10 ديسمبر 2012

الدرس الأول : الدخل والخرج في المتحكم الصغري


بسم الله الرحمن الرحيم
اللهم صل على محمد وآل محمد
السلام عليكم ورحمة الله وبركاته

درساً آخر من المبدع أ.مصطفى 36a2

أما بعد : درس اليوم هو الأهم بين جميع الدروس ...سنتحدث بإذن الله تعالى عن عمليتي الدخل والخرج .. وسنتعلم كيف ننفذ برنامجنا الأول في بيئة افتراضية .. وسنكتب البرنامج الأول ...
 لنبدأ ..
الجزء الذي يصل المتحكم بالعالم الخارجي هو أرجل الدخل والخرج ...فتسمح له بتلقي معلومات من الخارج (دخل)..والتحكم بأجهزة أخرى (خرج) ..

في المتحكم يمكننا التحكم بجهة الرجل ... إن كانت للخارج فهي تعطي أوامر وإن كانت للداخل فهي تأخذ أوامر

وما أعنيه بالأوامر عمليا ..ليس إلا تشكيلة من الأصفار والواحدات التي تظهر على أرجل المتحكم ... حيث يمثل الصفر ب 0 volt والواحد ب 5 Volt

كلام على الهامش : إن فهم المتحكم الصغري فهماً عميقاً .. يسهل حوالي 80 % من فهم الحاسب الشخصي الذي نعمل عليه .. فوحدة المعالجة المركزية وتعاملها مع المسجلات ونقل البيانات بينهما يتشابه بينهما إلى حد كبير .

يوجد في الذاكرة في مواقع محددة وثابتة خانات لها وظيفة واحدة .. لا يسمح باستخدامها لحفظ بيانات أخرى ..
 نسمي هذه الخانات بالمسجلات Registers .. لتفريقها عن باقي خانات الذاكرة ..
وفي عملية الدخل والخرج ..هناك ثلاث أنواع من المسجلات تهمنا كثيراً وهي :
DDR : data direction register   مسجل جهة البيانات ... هو خانة في الذاكرة يقوم جزء من المتحكم بالتحقق من قيمتها بشكل مستمر ليعرف كيف يتعامل مع أرجل البوابات ..كدخل أم كخرج ...(سنعتبره كذلك مبدئياً)
ولكل بوابة من البوابات الأربعة A,B,C,D هناك مسجل جهة معلومات خاص بها ..  وهي DDRA ,DDRB
,DDRC,DDRD ..

وحسب القيمة المخزنة فيه يتم اعتبار الرجل دخل أو خرج ..

فلو وضعنا القيمة التالية في مسجل جهة البيانات الخاص بالبوابة A مايلي DDRA=0b00110011
0b 
تعني أن الرقم بالنظام الثنائي
Rounded Rectangular Callout: 0b  
تعني أن الرقم بالنظام الثنائي
 
والآن ..ما تأثير السطر السابق على المتحكم ؟



قمنا الآن بإعلام المتحكم أن الأرجل السابقة ..دخل أو خرج .. يمكننا التحكم بجهة رجل واحدة بالطريقة التالية: DDRX.Y=Z حيث تمثل X اسم البوابة وY رقم الرجل وZ 1أو0
مثال: DDRB.2=1
والآن بفرض أننا قمنا بكتابة : DDRD=255 علما أن 255=0b11111111  أي أننا برمجنا جميع أرجل البوابة D كخرج ..
كيف سنتحكم بالقيمة التي تظهرها هذه الأرجل ..
ملاحظة : يجب أن نتذكر دائما أننا سنتعامل مع قيم منطقية واحد وصفر ...فعندما نكتب أمراً بأن يكون الخرج واحد فسيظهر جهد على الرجل المعنية قدره 5 Volt تقريبا ..وإن كان الخرج 0 قسيظهر جهد 0 volt على الرجل ...

كما رأينا أن DDR هو مسجل خاص بتحديد اتجاه أرجل البوابات ...ولكل بوابة مسجل جهة بيانات خاص بها
فهناك
 2-مسجل خاص بالخرج يبداً بكلمة PORT  ثم الحرف الدال على البوابة  ... PORTA ,PORTB,PORTC,PORTD  القيمة التي يحتفظ بها هذا المتحول ستظهر على أرجل البوابة المحددة ...

فمثلا بعد أن حددنا أن جميع أرجل البوابة D خرج ... ثم كتبنا PORTD=0b01010101 ماذا سيظهر على أرجل المتحكم ؟



وكلما غيرنا قيمة المسجل PORTD داخل البرنامج .. ستتغير الجهود الظاهرة على أرجل المتحكم عند وصول البرنامج إلى تلك التعليمة  ...
(أي أن البرنامج أثناء تنفيذه للتعليمات .. سيصل إلى التعليمة التي تغير قيمة المسجل ... وهناك جزء من المتحكم مهمته جعل الجهد المطبق على هذه الرجل مكافئا للقيمة المقابلة له في المسجل)

يمكننا التحكم بقيمة رجل واحدة بالطريقة التالية PORTX.Y=Z حيث تمثل X اسم البوابة وY رقم الرجل وZ 1أو0 مثال : PORTD.3=1 ,PORTC.0=0,PORTA.7=1 وهكذا ..
سؤال :ماذا لو حددنا أرجل البوابة كدخل ... ثم قمنا بكتابة PORTD=0b01010101 هل ستظهر الجهود الموافقة لذلك على الأرجل أم أن المتحكم سيتجاهل هذه التعليمة ...
الجواب: ستظهر هذه الجهود بالفعل .. ولن يتم تجاهل التعليمة رغم أن الأرجل دخل وليست خرج ... ولكن ماذا سيفيدنا ذلك ..هذا ما سنراه في الفقرة القادمة ..

 3-المسجل الخاص بالدخل يبدأ اسمه بكلمة PIN ثم حرف يدل على البوابة فلدينا  :PINA,PINB,PINC,PIND

ولا يمكننا تغيير قيمة هذا المسجل من داخل البرنامج ... فقيمة هذا المسجل تعبر عن الجهود الخارجية التي تُطبّق عليه من الخارج ...

كيف تتم عملية الدخل ؟
عندما نريد إضاءة مصباح في الغرفة ..فإننا نضغط زر خاص بالمصباح ... فكأن الزر هو رجل دخل ..كانت في حالة صفر وبعد الضغط عليه صار في حالة واحد ...
ولتطبيق ذلك في المتحكم ... ولنفترض أننا حددنا الرجل 6 من البوابة C لتكون دخل .. ووضعنا عليها قاطع كما يلي :




 ومن داخل البرنامج إذا أردنا أن نختبر قيمة هذه الرجل .. فسنكتب ما يلي :
If(PINC&0b0100000)
{
}
Else
{
}

لاحظ أننا قمنا بعمل & بين PINC والذي يحتفظ بقيمة المسجل ككل ..وبالتالي حالة جميع الأرجل .. وبين 0b0100000 بحيث يصبح الناتج هو حالة الرجل 6 فقط ...

وهناك طريقة ثانية بحيث نكتب PINC.6 فنأخذ حالة الرجل 6 فقط ( لاحظ أن الرجل 6 هي الرجل السابعة لأن الأولى رقمها 0 )


والآن لنجب عن السؤال السابق ..بهذا السؤال : ماذا لو كان المولد الذي استخدمناه عليه الكثير من الأحمال ولم نرد أن نسحب منه المزيد ... قد يكون الحل بوضع مولد آخر .. ولكن هناك حل أفضل بكثير ... ماذا لو كانت الدارة كما يلي


ثم قمنا بكتابة الأسطر التالية : DDRC.6=0 لتحديد الرجل كدخل PORTC.6=1 أي أننا نريد أن تكون القيمة الظاهرة على خرج الرجل 5 volt رغم أن الرجل للدخل!! انظروا ماذا سيحدث:


والآن بإمكاننا أن نختبر قيمة الرجل (بعكس الاختبار السابق )كما يلي :
If(!(PINC&0b0100000))
{
}
Else
{
}

لاحظ عملية النفي ! لأننا نريد أن يتم تنفيذ الأمر عندما تصبح قيمة الجهد على الرجل 0  وبالتالي قيمة البت في المسجل 0
نسمي الحالة السابقة PullUp أي مرفوع .. الدخل مرفوع بحيث تكون قيمته العادية 1 .. فهو بالتالي لا يتحسس إلا إذا وصلناه إلى 0
أما الحالة الأولى فنسميها TriState أي ثلاث حالات .. وتعني 0 أو 1 أو على الهوا  يعني غير موصول (وغالبا نعتبرها 0 )..

___________________هذا كل شيء عن الدخل .. والخرج ..ببساطة _____________________-

هل قلت لنفسك أن الرسومات السابقة للدارات ..(مضحكة ..أو طفولية أو شيئا من هذا القبيل ) معك حق ... ولذلك أوجد المهندسون لنا ..برامج المحاكاة ... ومنها البرنامج الذي سنتعامل معه Proteus ويمكنك تحميله من الرابط التالي وهنا تجد شرحاً وافيا لطريقة التنصيب ...
 هل تساءلت أين سنكتب تلك الأسطر التي تحدثنا عنها DDRA =0b0101010; وما إلى ذلك ؟ ثم كيف سنمررها إلى المتحكم ؟
الجواب هو ما يلي : سنكتب الكود (بلغة C طبعاً) في محرر خاص بالمتحكمات الصغرية ... والذي سنتعامل معه هو CodeVision وبعد القيام بكتابة الكود .. وعمل Build للبرنامج .. لن ينتج ملف exe بل ملف لاحقته hex !
 فإذا كنا نختبر المتحكم في الواقع فهناك أداة تدعى بالمبرمجة توصل إلى الحاسب .. وتقوم بكتابة الملف hex في المتحكم ... أما إن كنا نعمل على برنامج محاكاة مثالي مثل Proteus فيمكننا عمل Browse وربط المتحكم بملف hex ليقوم بتنفيذ البرنامج في بيئته الافتراضية كما يُفترض به أن يفعل في الواقع ..

0 comments:

إرسال تعليق

إترك بصمتك ثم بإمكانك الرحيل ، لنعطيك المزيد

 

على فيس بوك