الميكرو كونترولر انواعه و برمجته و استخداماته

ماجد عباس محمد

عضو جديد
إنضم
3 سبتمبر 2006
المشاركات
5,325
مجموع الإعجابات
197
النقاط
0
الميكروكونترولر

هذاالشرح يتناول أنواع الميكروكونتروللر،وشرح لأهم عائلتين هما أتمل Atmel وعائلة ميكرو تشيب PIC ويتناول الحاجة إليهم و استخداماتهم و ماتصلح له وما لا تصلح و كيفية برمجتهم بلغات عدة.
ليس الهدف أن أجعلك محترفا ولا أن أكشف لك خبايا اللغات ولكن يكفينى أن أبين لك فروق هذه الأمور وأن أضعك على الطريق و عليك أن تختار الأنسب لك وهذا الاختيار هو مايجعلك تصل للاحترافية لكن لو فرضت عليك طريقا ، قد يكون الأفضل لغيرك لكن الأفض للك شيء آخر.
قد تبدو المقدمة التالية طويلة بعض الشيء لكنها ضرورة لوضع أساس حوار تركيبه الداخلى و لغات البرمجة.
كيف بدأ

منذبدء الحضارة و سعى الإنسان لصنع آله حاسبة لتسرع الإنجاز و تتجنب الأخطاء ولاحقا تتجنب النسيان و توصل العديد من العلماء لآلات و لكنها عجزت عن الطلب الأخير فمفهوم الذاكرة و التذكر كان صعب التحقيق حتى توصل العالم LeeDe Forest لى دى فورست لوضع شبكة للتحكم فى مسارالإلكترونات فصنع أول صمام مكبر و من ثم أمكن عمل أول حاسب آلى إلكترونى تماثلى حقق كافة العلاقات الرياضية المعقدة مثل اللوغاريتمات و الحسابات المثلثية وحتى استخدمت كثير من الوسائل لتحقيق الذاكرة مثل الشرائط المثقبة أو الأجزاء المتحركةالخ لكن ظلت العقبة الرئيسية هى سهولةالبرمجة.كانت الوظائف تصنع فى صناديق قياسية بعرض 19بوصة و البرمجة بتثبيتها فى دولاب خاص يسمى راك 19بوصة ثم توصل الصناديق ببعضها بكابلات و أيضاعمل حاسب يؤدى عدة وظائف تختار بينها بمفتاح صعبة لكون الأسلاك تحد من سرعةالاستجابة فتبطئ الأداء.
سعى العلماء لتصغير ألصمامات الإلكترونية بهدف تصغير الحجم و تقليل الفاقد فى حرارةالتسخين و تقليل الفولت المطلوب لتشغيلها من مئات لأقل من مائه فولت.صممت كافة الدوائر المنطقية بألصمامات و صمم المذبذب متعدد التوافقيات (سلسلةتصميم الدوائر المنطقية)وألذى اعتبر أول خلية ذاكرة سهلة التطبيقثم تطورت لعمل مسجلات و بوابات أمكن الوصوللأول حاسب آلى إلكترونى فى الأربعينات سمى ENIACاختصارجمله ElectronicNumerical Integrator and Computerوكان يشغل مبنى كاملا و له مبنى ملحق لأجهزةالتكييف و التبريد و كانت سرعته بلغت 2ميجاهرتز و كان وقتها سحرا – تخيل أن تقوم بمليونى عملية حساب فى الثانية الواحدةو ذكر أحدهم أننا لو بنينا جهاز آخر سيكفي انحاجة العالم من الحسابات و الآن كل من الديه حاسبان على الأقل فى يده، الهاتف المحمول و الساعة ...
حتى هذا الوقت اقتصرت الدوائر المتكاملة على المقاومات و المكثفات بهدف تصغير الحجم و تقليل الوصلات.
فى ديسمبر 1947توصل العلماء لأول ترانزستور من الجرمانيوم و الثنائيات من المواد الصلبة وأضافت الدوائر المتكاملة الثنائيات فقط لعدم ملاءمة الجرمانيوم لهذا الأسلوب فى التصنيع. ظهرت عائلات رقمية مثل عائلة RDL وهى المقاومة و الثنائى و DTLأوالثنائى مع الترانزستور فى صورة كروت إلكترونية قابلة للوضع فى قاعدة Plugin أوالرفع و الاستبدال.
عندم اتمكن العلماء من استخدام السيليكون أمكن صنع أول دوائر متكاملة تحتوى ترانزستورات و صنعت عائلة TTLالشهيرة و صنعت حاسبات تسمى مينى كمبيوتر و هيكل أساسى MainFrame وهى"العملاقة وقتها"ولم تصل لجزء من مائه من هاتفك المحمول.
أغلب الحاسبات وقتها صنعت طبقا لنسق سمى هارفاردحيث يكون مكان حفظ البيانات و مسار حفظها مستقلين تماما عن مكان حفظ البرنامج (الكود)ومسار التعامل معه وهذا وفر المرونة والسرعة حيث لا يجب تساوى عرض كل منهما وطلب ومعالجة أحدهما لا يتعارض مع التعامل مع الآخر و كان عادة البرنامج فى كروت مثقبة أو شريط مثقوب و البيانات فى وسائل كهر وميكانيكية .
الهيكل الأساسى لحاسب آلى تبلور فى وحدة معالجة مركزية للحساب و المنطق و حولها الذاكرة و وسائل إدخال و إخراج .
بعد تطور TTLأمكن صنع وحدة معالجة مركزية فى صورة دائرة متكاملة وهى 74181ولاحقا المعدلة 74881 وهى قادرة على تنفيذ 16عملية حسابية أو منطقية جمع أو طرح أو إزاحة أومقارنة أو دوال المنطق المعروفة AND-OR-XORوالمتمم أو Complementعلى4 بت معا وهى 24طرف و بسرعة تصل إلى أكثر من 10ميجا و قابلة للامتداد أى توصل بعضها ببعض للتعامل مع 8بت أو اكثر.
ظهور دوائر منطقية من عائلات أخرى مثل NMOS, PMOS عازل أكسيد السيليكون الموجب و السالب القناة،ولاحقا CMOS عازل أكسيد السيليكون مع المكمل، مكن من تصغيرحجم الترانزستور بصورة كبيرة و أمكن من دمج وحدة المعالجة السابقة مع مثيلتها لمعالجة 8بت معا و إضافة مراكمات و عداد للبرنامج وحافظ للبيانات تحت المعالجة و ظهرت طريقة"فون نيومن" فى الحاسبات حيث تكون خطوات البرنامج والبيانات فى ذات الذاكرة و بتتابع، أى كود أمر يليه البيان ألذى يتعامل معه وسميت ميكروبروسيسور لأنها تعالج البيانات..
أشهرهذه الميكروبروسيسور هو 8080 وألذى أنتجته إنتيل و ألذى تفوقت عليه شركة زيلوج بالميكرو Z80 وألذى أصبح عصب كل الحاسبات الشخصية و تبنتIBM هذاالنوع من إنتيل وهذا سبب شهرته لكن باقى الشركات استخدمت Z80 لأفضليته و سهولة استخدامه و منافستها الأساسية شركة موتورولا انتجت MC6800 وألذى كان أسهل بكثير فى الاستخدام و أنسب للماكينات و الصناعة عموما وهنا مقارنة بينهما
attachment.php

كل منهما 40 طرف بنسق DIP اختصار DualInline Package وتشمل على حافلة للعنوان AddressBus من16 طرف يتيح أقصى تناول للذاكرة 16كيلوبايت أو 65536 خانه، و أخرى للبيانات DataBuss من8 بت تتيح التعامل مع بايت كاملة فى المرةالواحدة وثالثة للتحكم ControlBuss أوأحيانا SystemBuss وأطراف التغذية و كانت تعمل بكريستال 2ميجا و أقصاها وصل 4 ميجا.
على اليمين نجد Z80 ونجد حافلة ألعنوان AddressBus تشمل الجزء العلوى على الجانبين (أطراف من 1:5 على الجانب الأيسر ثم من 30:40 على الجانب الأيمن) بينما فى 6800 نجدها مرتبة بالتتالي على الجانب الأيسر من الطرف 9 وحتى 20 ثم الجانب الأيمن حتى 25.
حافلة البيانات DataBuss فى Z80 فى الأطراف 14 ثم 15 ثم 12 ثم 8 ثم7 ثم9 ثم10 ثم13 مقابل اليسرى مرتبة .
لاننسى هنا ذكر شركة روكويل و منتجها 6500 وهىما اختارته شركة أبل لحاسباتها.
لاننسى أن كل هذه الميكرو لم يحتوى ذاكرة ودوما كنا نشترى ذاكرة لحاسباتنا ولم يحتوى اتصال تسلسلي ولا عدادات تايمر ولا محول تماثلى رقمى – الحساب و المقارنة و المنطق فقط و الحساب كان جمع وطرح فقط أما الضرب و القسمة فكان لها معالج مساعد Co-processor لمعالجة الضرب و القسمة و الأرقام العشرية و كل هذه الخواص كانت إضافات محيطية ولها ماسمى بروسيسور خاص بها.
معذرة للإطالة لكن هذا تسبب فى الحاجة لأشياء هامة جدا تربط مفاهيم لغات البرمجة وأكوادها Software مع المكونات الملموسة Hardware ومدى حاجتنا لأى منهما فى عالم الميكرو،هذا موضوعنا القادم بإذن الله
 

المرفقات

  • Microprocessors.png
    Microprocessors.png
    16.3 KB · المشاهدات: 47
التعديل الأخير:

مواضيع مماثلة

ماجد عباس محمد

عضو جديد
إنضم
3 سبتمبر 2006
المشاركات
5,325
مجموع الإعجابات
197
النقاط
0
بدء التشغيل و البايوس bios

بدء التشغيل و البايوس BIOS
كل ميكرو يجب أن يبدأ بالريسيت Reset ألذى يحدد له مكان فى الذاكرة يبدأ به فيضع على حافلة العنوان رقم الخانة المقصودة ثم يضع إشارة قراءة من الذاكرة على حافلة التحكم فتجيبه الذاكرة بمحتواها وهنا تحدد وحدة المعالجة ما إن كانت الخطوة التالية هى بيان مطلوب أو أمر جديد فمثلا أمر المتمم Complement يكون للمراكم فقط ولا يتطلب بيانات أخرى على العكس من أمر الجمع مثلا سيحتاج ما نجمعه.
الحاسبات الصغيرة تعمل على ملف واحد فقط له بداية واحدة فقط يبدأ منها ليشعر المستخدم أنه يعمل ثم يختار المستخدم لعبة ما أو برنامج وحيد لكى يشغله لكن، هل هذا البرنامج لا يحفظ بيانات؟
هنا تظهر مشكلة كبيرة وهى كيف؟
سنحتاج مكان ثم نقسم المكان لوحدات و نعطى البيانات اسما – أصبحت ملف ، و هنا نشأت الحاجة لنظام تشغيل يتولى هذه الأمور. يفرق بين أنواع الملفات و يحتفظ بفهرس للملفات و أماكنها و إن تم تعديل أحدها إين تضاف الزيادة؟ و إن حذف كيف نحررها من الفهرس الخ. باختصار نظام تشغيل Operating system لمعالجة هذه الأمور.
هنا ظهرت الحاجة لوسائط تخزين غير الذاكرة تكون دائمة عند غلق الجهاز مثل القرص الصلب أو المرن الخ.


مما سبق بات واضحا أن تركيب الحاسب أصبح مفتوحا للخيارات الشخصية فقد أشترى قرص صلب أو لا و قد أركب قارئ أقراص مرنة أو لا وقد احتاج لأن ابدأ من خارج الجهاز كليا، لذا كان لابد من استخدام نظام أساسيات الإدخال و الإخراج Basic Input Output System و اختصارا BIOS لكى ندل الميكرو ما لديه من وسائل الإدخال و الإخراج و أيها يبدأ منها التشغيل حيث يجد نظام التشغيل و ألذى بدأ بالدوس DOS وهى اختصار Disk Operating System أى نظام تشغيل الأقراص و ألذى مازال يستخدم حتى وقت كتابة هذه الكلمات ثم الويندوز وغيرهما من الأنظمة مثل يونكس و لينكس الخ.
تطور الجيل التالى و استخدم 16 بت للبيانات و طبيعى أن ينشدوا حجم أكبر من البيانات و البرامج و سرعات اكبر أى 24 بت للعنوان مع 16 بت للبيانات و لذا استخدموا 48 طرف فى صورة متكاملة مربعة و تصل حتى 64 طرف.
لكن ما تلى ذلك من أجيال سعت لحجم أكبر من الذاكرة ولم تعد هذه الأشكال من المتكاملات مناسبة لذا لجأوا لعدة صفوف داخل بعضها مثل إنتيل 486 حيث لونت الصف الخارجى باللون الأحمر و الأوسط بالأخضر و الداخلى بالأصفر و تسمى PGA اختصارا Pin Grid Array مصفوفة الأطراف الشبكية.
attachment.php

الآن هذه لا تصلح لك ولى فهى تتطلب بوردة متعددة الطبقات كما أيضا لها احتياطات خاصة لسرعتها العالية و التى زادت عن 100 ميجا فلا يجب أن تتغير ألسعات فى أطراف البيانات حتى لا تصل بعض أطرافها متأخرة عن الأخرى من الذاكرة.
من أهم الأمور أن أوضح لك أن حافلة العنوان وحافلة البيانات كانت تصل الميكروبروسيسور بالذواكر وكافة المحيطات، أجل كل الأطراف السبعة و عشرون.
حقا هم 16 للعنوان مع 8 للبيانات أى 24 ثم خط تحكم يحدد ما إن كان التعامل مع الذاكرة أم محيطات IO request و نظرا لإضطراب القيم على الحافلات هناك خط تحكم آخر يسمى العنوان صحيح Valid Memory Address اختصارا VMA أى أن الميكروبروسيسور قد وضع العنوان النهائى وهو هكذا ببساطة فلا أريد أن أعقد لك الأمور بخاصية DMA أو Direct Memory Access حيث تتولى الأجهزة التعامل مع الذاكرة دون تدخل الميكرو والتى تضيف خطين تحكم أخريين
Buss request , Buss Available
- و فى النهاية خط يسمى ألفاز2 أو أک2 وهى الجزء من الدورة التى تشمل من2 :4 نبضة و التى سيقرأ فيها الميكروبروسيسور البيان.


هنا نشأت الحاجة لعمل الميكروكونتروللر أى العودة للجذور من جديد حتى تتمكن انت و أنا من صنع بوردة بإمكانياتنا المحدودة و أن نضع هذا الميكرو على بوردة تجميع Bread Board و نجرى تجاربنا وهو موضوعنا القادم إن شاء الله
 

المرفقات

  • 486dx.png
    486dx.png
    14.5 KB · المشاهدات: 45

ماجد عباس محمد

عضو جديد
إنضم
3 سبتمبر 2006
المشاركات
5,325
مجموع الإعجابات
197
النقاط
0
العودة للجذور

العودة للجذور:
مما سبق وجدنا أن الحاجة نشأت لعدة أمور مثل:
1- ألعودة للشكل الأساسى DIP أو المربعة على أقصى تقدير لتمكين الشخص ألعادى من التعامل معه.
2- السرعات المتوسطة و التى لا تشكل عائقا فى التنفيذ.
3- الإسغناء عن نظام التشغيل و من ثم البايوس و ترك الميكرو متاح للمبرمج لكى يتعامل معه مباشرة على مستوى المكونات الداخلية.
4- التخلص من صعوبة توصيل 16 خط للعنوان مع 8 خط للبيانات و باقى التحكم أى 29 طرف و من ثم العودة لنظام هارفارد أى ذاكرة مستقلة للبرنامج و أخرى مستقلة للبيانات.
5- من النقطة السابقة يمكن التخلص كليا من 24 طرف و بعض خطوط التحكم بجعل الذواكر كلها داخلية و احتواء المداخل و المخارج Input Output ما أمكن داخل الميكرو وبعض الوظائف الطرفية مثل التواصل التسلسلى و التحويل تماثلى لرقمى و من ثم أصبحت كافة الأطراف متاحة للمبرمج للتحكم فى العالم الخارجى و تحسس وسائل التحكم مثل الحساسات و المفاتيح
6- لم تعد هناك حاجة لكل التعليمات فى الميكروبروسيسور لذا سنستغنى عن التعليمات التى ستتم فى الذاكرة و نكتفى بالتعليمات التى تتم بين الذاكرة ووحدة المعالجة فقط و نسمى هذا مجموعة الأوامر المخفضة Reduced Instruction Set Computer اختصاراRISC رغم أن هذا يتطلب زيادة عدد خطوات تنفيذ ذات المهمة للحاجة لنقل البيان الأول لوحدة المعالجة ثم نقل النتيجة للذاكرة.

وهنا أصبح كل برنامج يكتب هو وثيق الصلة ولصيق بالمكونات و لم تعد هناك ميزة للغة عن أخرى فى الوصول لها فلا نظام تشغيل يدخل بينك و بين الميكرو ولا أى وسيط من أى نوع. عندما تحمل البرنامج سيتعامل مباشرة مع كل مكونات الميكرو.

تنافست شركات عديدة فى إنتاج هذا الشكل و أصبح لكل منها منتج له خواصه و ميزاته و مجالاته الأنسب لكن أشهرها كان من إنتاج إنتيل و سمى C51 و ميكرو تشيب. إلا أن إنتيل باعت منتجها لشركة أتميل و التى سمته بدورها AT89x5x حيث AT تعنى Atmel و 89 رقم المجموعة ثم x قد تكون C,S, L,LV حيث كل حرف يعنى خاصية ما ثم 5X قد تكون 51 أو52 أو53 أو54 أو 58 أو 2051 الخ حسب نوع و طراز الميكرو ثم سلسلة AVR و المعروفة بالإسم AtMega بينما ميكرو تشيب أنتجت PIC10cxxx ثم PIC12cxx ثم PIC16xxx ثم PIC18xxx الخ
المجموعتان من إنتاج ميكروتشيب PIC10cxxx و PIC12cxx غالبا من ثمانية أطراف وهى محدودة الإمكانيات لكن لها العديد من التطبيقات مثلا موتور توجيه طبق الأقمار الصناعية، لا يحتاج سوى طرف لتلقى الأوامر من الريموت و آخر لعد نبضات إنكودر الموتور و طرفين لتحريك الموتور يمين أو يسار و طرفين لخزن المعلومات فى ذاكرة فلاش ملحقة بالبوردة. هذا لأبين مدى أهمية أن نعلم عن كل الأنواع ، فمهما كان الميكرو صغيرا و محدود الإمكانات فله عديد من التطبيقات التى يمكن استخدامها فيها و تحقق إنجازا كبيرا. فقط حاول أن تفكر كيف تستبدله بإلكترونيات رقمية لتدرك الفارق.
هذه المجموعة لم أعلم لها موازى من أتميل سوى لاحقا من فصيلة AVR و سميت ATtiny وهى اختصار AT وهو اسم الشركة ثم tiny بمعنى صغير.
كيف نستخدمه و نبرمجه؟ حسنا لو شرحت لك بيك 16 سيعترض هواة بيك 18 ولو شرحت C51 سيحتج هواة AVR ولكنى سقت لكم مثالا موتور الدش لغرض فى نفسى وهو هذا الأمر. سأشرح الكل لكى تعلم انت كيف تبحث عما تريد و كيف تدرس أى ميكرو ولا تقف عاجزا ثم تختار الأنسب . كنت أبرمج C51 بالأسيمبلى حين طلب منى جهاز بالميكرو تشيب لعدم توافر النوع الآخر ، كمصمم يجب ألا تتوقف، ادرس الداتاشيت ، أتعرف على الفروق و أبرمج بأى لغة تناسب التطبيق.
لهذا يجب أن نعلم التركيب الداخلى و كيفية البرمجة. وهذا موضوعنا القادم بإذن الله
 

ماجد عباس محمد

عضو جديد
إنضم
3 سبتمبر 2006
المشاركات
5,325
مجموع الإعجابات
197
النقاط
0
أشهر أنواع المتحكمات

أشهر الأنواع:
كما ذكرنا فشركتى ميكروتشيب و أتميل هما أشهر الشركات فى هذا المجال و سنقارن أشهر الأنواع من كل منهما ثم نشرح التركيب الداخلى و كيفية البرمجة بالأسيمبلى و البيزك و لغة C و سنعرض أخيرا للجيل المتطور من كل منهما و عليك أن تكمل المشوار.
أولا لنقارن بين الأطراف سنجد أننا فى حاجة لأن نعرف كيف يتصرف الميكروكونتروللر وما هى احتياجاته من العتاد لكى ينفذ أى برنامج.
ألتركيب العام:
الشرح التالى لا يخص رقم بعينه ولكنه صحيح لكل الأرقام ومن الشركتين أيضا.
أولا سنفتح مصدر التغذية و بالتالى يجب أن يبدأ الميكروكونتروللر فى العمل وهذا يتطلب مذبذب داخله لكى يعطى له نبضات تجعله يكرر دورة واحدة محددة وحتى قطع التغذية عنه. هذه الدورة هى أخذ كود الخطوة المعنية ثم يشير للخطوة التالية ثم تحليل الكود ليعرف ما هو ثم تنفيذه (نقل رقم للمراكم – نقل من المراكم للذاكرة-جمع رقم للمراكم..الخ) و يكرر.
لهذا يجب أن يحتوى على عداد للبرنامج Program Counter و وحدة تحليل التعليمات Instruction decoder و مراكم أو أكثر Accumulator حيث سيضع البيان ألذى تأمره به ألتعليمه و مجموعة من المسجلات لزوم الحاجة.
هنا نفرق بوضوح بين المسجل و المراكم. كلاهما تخزن فيه بيان و تقرأ منه و تستخدمه فى الحسابات و بعضها يمكنك أن تستخدم محتواه كعنوان لكن نتيجة العمليات الحسابية تذهب للمراكم فقط ، ولو به أكثر من مراكم قد يمكن الاختيار بينهما.
هكذا يمكنك التعامل مع معظم الأوامر لكننا ذكرنا أن هناك كثير من الأجهزة المحيطة مثلا التواصل التسلسلى، حسنا مشكلة هذا التسلسلى انك لا تخبر الطرف الآخر عن ترددك ولا أوقات وضعك للبيانات لذا يجب أن تعتمد الدقة العالية فى إرسالك و توقيت استقبالك لذا يتطلب الأمر أن يكون المذبذب يعمل بكريستال لتوفير الدقة كما انك لن تتمكن من تغيير الكريستال لو أردت تغيير معدل الإرسال،ولا أن تستخدم 2 كريستال واحدة بطيئة للتسلسلى و أخرى سريعة لباقي البرنامج ، لذا يجب وضع مؤقتات داخلية "تايمر" Timer و من ثم أغلب الوحدات تحتوى واحد 8 بت و آخر أو اثنان 16 بت. تضع فى أى منهما القيمة المناسبة (تحميل العداد) ليعطيك معدل الإرسال المطلوب أو أيضا أى توقيت تريد أو وظيفة أخرى كما سيلى الشرح إن شاء الله.
إذن تتولى وحدة الاتصال التسلسلى عند تمام العد أن تعيد تحميل العداد حتى نهاية إرسال البايت. كيف تخبر الميكرو بأنها أتمت المهمة أو أنها تلقت من الخارج بايت كاملة تحتاج التعامل معها قبل أن تصل بايت جديدة؟
إذن تنشأ الحاجة لاستبقاء نظام المقاطعة من الميكروبروسيسور السابق وهو أن يكون بداخل وحدة المعالجة مسجل به 8 بت كأى مسجل ، واحدة لإتاحة المقاطعة ككل أو إيقافها ككل و بعض من ألباقى يخصص بت لكل حدث.
عندما تصبح واحدة منهم =1 فسيتحسس الميكرو ذلك فى نهاية الدورة ثم يحفظ العنوان الحالى (أى خطوة هو على وشك تنفيذها) فى "ذاكرة ما" ثم يذهب لعنوان آخر تحدده أى بت سببت هذه المقاطعة و فى نهاية كود المقاطعة يجب وضع تعليمه خاصه اسمها عودة من المقاطعة لكى يفهم الميكرو أن عليه استعادة العنوان ألذى سيق أن خزنه فى تلك "الذاكرة ما" ليعود للبرنامج الأصلى.
هذا الموضوع سنتناوله تفصيلا لاحقا لكن ما يهم الآن انه أثناء خدمة المقاطعة قد يحتاج الأمر لمقاطعة ثانية و سيضع الميكرو العنوان الجديد فوق السابق (ترص فوق بعضها) وهكذا ، لذا سميت هذه "الذاكرة ما" بالمرصوصة Stack ولها عداد مستقل أيضا لمتابعة أين نحن الآن يسمى مؤشر الرصة Stack Pointer وهو يزداد بواحد أولا ثم يحفظ المطلوب حفظه و بالعكس يقرأ المحتوى أولا ثم ينقص بواحد.
التعامل مع العالم الخارجى:
مما سبق أصبح الميكروكونتروللر مهيأ للتعامل أساسا مع العالم الخارجى لذا صنعت أغلب أطرافه مداخل ومخارج فى مجموعات تسمى بوابه PORT و نظرا لأن معظم البيانات تعالج بالبايت وهى 8 بت قسمت هذه الأطراف لمجموعات أقرب ما تكون لهذا العدد و من ثم كل تعاملك مع بايت و تتحكم أيضا فى مخرج عرضه بايت و أيضا تعطى بيانات لأى جهاز خارجى أو تأخذ منه بعرض بايت أيضا.
لذا احتوى الميكرو على هذه البوابات PORTs و فيما عدا عائلة C51 فلكل منها داخل الميكرو مسجل مناظر لتحول أى طرف "بت" منها أو كلها معا من دخول لخروج. طبعا هناك فرق كبير بين أن يكون الطرف دخول أو يكون خروج.
الطرف الخروج سيكون إما صفر أو 1 حسب الأمر ألجارى تنفيذه وهو قادر على إعطاء تيار محدود عندما يكون =1 أو يقبل "يبتلع" تيار عندما يكون = صفر، أما الطرف المهيأ كدخول سيكون ذو إعاقة عالية حتى لا يسبب سحب تيار من أى مصدر يتصل به و يتبع المصدر من حيث الفولت.
حسنا هذا المنفذ PORT سواء كان دخول أم خروج، فلابد من مسجل ما فى مكان ما يحتوى البيانات الخاصة به ، أين يكون؟ و الأسوأ أنه سيحتاج لديكودر لتحليل عنوانه عندما تريد التعامل معه.
ابتكر أحدهم فكرة بسيطة و ظريفة و سهلة التعامل من حيث العتاد و البرمجة. قال لماذا لا نضعهم جميعا فى ذاكرة كالأصلية و نطلبها عند اللزوم. نظام الذاكرة ممتاز بالنسبة للدوائر المتكاملة لأنه يتناول قطعة مربعة صغيرة جدا و يقسمها لخانات متناهية الصغر و يطالها بالصف و العمود إذن لا نكرر العتاد لكل مسجل هى مجموعة من 128 خانة ذاكرة أو غيره طبقا للتصميم و كل خانة منها 8 بت كالذاكرة الأصلية ولكن إحداها للمنفذ " أ" و الآخر للمنفذ " ب" وهكذا و يمكن أيضا وضع كل المؤقتات "تايمر" Timers فيها ، و التايمر 16 بت يشغل خانتين متجاورتين .
أيضا أحدها يمكن أن يكون للمراكم الأساسى و آخر لكل مسجل أو مراكم و أيضا مؤشر الرصة SP السابق الخ.
هذه الذاكرة أسمتها كل من إنتيل و ميكروتشيب SPECIAL FUNCTION REGISTERS
الآن يمكننا المقارنة بين أشهر رقمين و هما PIC16F877A و عائلة AT89c5x هذه الصورة تضعهما بجوار بعض لتوضيح الفروق، وقد وضعت لون مختلف لكل بوابة PORT
attachment.php

يمكننا أن نلخص الفروق فى الجدول التالى


attachment.php



سنناقش هذا الجدول بالتفصيل المرة القادمة إن شاء الله
 

المرفقات

  • C51vrs16F.png
    C51vrs16F.png
    10.9 KB · المشاهدات: 45
  • Comparison.png
    Comparison.png
    11 KB · المشاهدات: 44
  • ATMegaALL.png
    ATMegaALL.png
    22.7 KB · المشاهدات: 44
التعديل الأخير:

ماجد عباس محمد

عضو جديد
إنضم
3 سبتمبر 2006
المشاركات
5,325
مجموع الإعجابات
197
النقاط
0
الفروق بالتفصيل

ألفروق بالتفصيل:
البند الأول: أن تكون كل المنافذ Ports ثابتة العرض 8 بت يجعلها قياسية و يسهل تعاملها مع المحيطات لكن كون لديك عدد مختلف يجعلك حائرا فى باقى المنافذ خاصة بعضها 4 بت فقط
attachment.php
فمثلا عندما تود التحكم فى 8 مخارج معا مثل شاشة سباعية 7Segment أو بعض الحساسات التى تعطى 8 بت معا أو التحكم فى 8 مخارج معا ستجد من الأسهل استخدام منفذ ثمانى للتوصيل لمكبرات أو عواكس مثل ULNxxxx كما أن الأمر لمنفذ كامل يعطيك التحكم فى 8 مخارج بأمر واحد على العكس من عدد من المنافذ كل منها يتطلب أمرا مستقلا.
هذا ينعكس على السرعة وحجم البرنامج معا.

البند الثانى : كل منفذ Port تجده مجمع و مرتب فى أطراف متجاورة فى أتميل مما يجعل توصيله لأى جهاز يكون سهلا – طرف بطرف و البوردة الناتجة منسقة ولا تحتوى كبارى jumpers ولا تعارضات أما فى بيك فالمنفذ C ممزق و بينه أطراف منفذD .
مثلا عند استخدامك منفذ B كاملا فإن استخدام منفذ C مع منفذ D سيجعل هذه الخطوط متقاطعة و البوردة تحتوى عديد من الكبارى، حتى لو أردت استخدام شاشة LCD و فضلت للسهولة استخدام 4 بت لن تجد 6 أطراف متجاورة منهم.
فى الجيل التالى مثلا PIC18 و أتميل ATMega سنجد أن ميكروتشيب استخدمت نفس الإسلوب فى الجيل المطور وهى ميزة تحتسب لهم أنك إن شئت التطوير فقد لا تعوقك الأطراف
attachment.php
بينما اتميل فقد صنعت رقم من عائلة AVR رقم مطابق فى الأطراف لعائلة 51 يمكنك من الترقية
attachment.php


و صنعت الجيل المطور بذات التنسيق فى الأطراف مع تعديلات طفيفة فى ترتيب أطراف القدرة و البدء RESET و الكريستال
attachment.php
ولم نجد سوى المنفذ D الطرف 7 فقط قد رحل إلى الجانب الآخر أى كوبرى واحد فقط.

البند الثالث: فى كل ميكرو يوجد مسجل للحالة Status register وهو بالغ الأهمية لأنه يتابع حالة المراكم خطوة بخطوة و يحفظ نتائج الخطوات للخطوات اللاحقة فمثلا لو كان المراكم خاليا نجد فى مسجل الحالة خانة فيها 1 و عدا ذلك تكون بصفر ولذا يسمى Zero Flag أى علم أو إشارة وجود صفر فى المراكم وهى هامة جدا فمثلا لا يجوز القسمة على صفر ولذا فباختبار هذه الخانة تتصرف طبقا للصواب.
و آخر للنتيجة السالبة و ثالث لمعالجة الأرقام BCD ورابع لفائض الجمع و اقتراض الطرح Carry/Borrow الخ و هو بإجمالى سته أعلام Flags و بقى 2 دون توظيف، شركة أتميل أعطتها أسماء F1,F0 و يمكن للمستخدم أن يستغلهم كما يشاء عند توافر شرط ما يجعل أحدهما = 1 للتذكر لاحقا.
هذا يوفر كثيرا فى الكود وكذا أسرع فى التنفيذ لأن هناك أمر JB أى القفز لو هذه البت =1 و عكسه JNB لو كانت = صفر دون التعرض للمراكم و ما به من حساب أما اختبار خانة فى الذاكرة فتحتاج لتحميلها أولا فى المراكم قبل الاختبار ولو كان ما فى المراكم مطلوبا عليك حفظه فى مكان ما مثل الرصة أو غيرها من الذاكرة.
أما فى بيك فعدد هذه الخانات قليلا مما يجعل القدرة الحسابية له أقل .


البند الرابع: كثرة الأوامر تعنى أنه يمكنك اختصار خطوتين أو أكثر فى خطوة
أفضل مثال لذلك وجود الاختبار السابق وفر خطوات التعامل مع المراكم و حفظه، و أيضا هناك أوامر أخرى منها وجود مسجل 16 بت يسمى مؤشر البيانات أو Data Pointer و اختصارا DP وهو يمكنك من أخذ أى بيان من ذاكرة البرنامج للمراكم وهذا يسهل عليك وضع رسائل المستخدم كجزء من ذاكرة البرنامج (وهى كبيرة) و بهذا المسجل تأخذها حرف بحرف للعرض على الشاشة بأمر واحد و غيره من التطبيقات.

البند الخامس: تدعم حساب BCD
مثال لو تريد عداد فوجود حساب BCD يمكنك من استخدام BCD to 7 segment و توفر كثير من المعالجات بالكود للتحويل من ثنائى لعشرى، أيضا متكاملات الوقت كلها تعمل BCD و أيضا بعض الحساسات و بعض الموازين.

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

المرفقات

  • C51vrs16F.png
    C51vrs16F.png
    10.9 KB · المشاهدات: 41
  • PIC18Fam.png
    PIC18Fam.png
    16.6 KB · المشاهدات: 41
  • C51toAVR.png
    C51toAVR.png
    9.1 KB · المشاهدات: 41

ماجد عباس محمد

عضو جديد
إنضم
3 سبتمبر 2006
المشاركات
5,325
مجموع الإعجابات
197
النقاط
0
المنافذ Ports

المنافذ Ports:
المنافذ هى وسيلة الميكروكونتروللر للتعامل مع العالم الخارجى لذا فهى من أهم خصائصه. كافة منافذ الميكرو تصلح إدخال أو إخراج ماعدا قله من ألبيك دخول فقط. أيضا كافة المنافذ متشابهة فى ذات العائلة إلا أن مع التطور أضيفت لها وظائف متعددة، لذا سنتكلم عنها عامة و نذكر الصفات المتشابهة ثم نتكلم عن كل نوع تفصيلا.
الحالة الفرضية هى ما يكون عليه عند البدء أو إعادة التشغيل وهى كل المخارج فى وضع إدخال وهذا لسبب هام هو لو على أى منها جهد ما، فكون الطرف دخول لا يؤثر عليه عكس لو كان خروج و حاول وضع جهد مغاير قد يسبب تلف هذا الطرف.

هناك نقطة هامة يجب تذكرها فى كافة الأنواع وهى كم مللى أمبير يتحملها المنفذ، حسنا طبقا للداتاشيت ستجد بعض الطرز 25 مللى و البعض الآخر 40 مللى لكن الميكرو 40 طرف يحتوى على 32 طرف دخول / خروج أى 25*32 = 800 مللى على الأقل، لكن من الداتاشيت أيضا ستجد أن طرف التغذية VDD يقبل 400 مللى كحد أقصى فقط .
لو بحثت أيضا ستجد بيان آخر يقول أقصى تيار لمجموع المنافذ هو 300 مللى، إذن هذا هو ما نلتزم به أى لا نحمل مجموع المنافذ أكثر من هذا القدر رغم أنك تستطيع تحميل أى منها القيمة القصوى سواء كانت 25 أم 40 مللى و ذلك حتى لا يختل أداء الميكرو أو تعرضه للتلف.

أيضا يوجد مسجل لكل منفذ يحتوى البيانات التى تضعها على المنفذ PORT لكن لا تخرج مباشرة و إنما عبر عازل Buffer وذلك لزوم التحكم فى خواص الطرف و شرح ذلك لاحقا إن شاء الله. لذا يجب الحيطة عندما تقرأ المنفذ حتى لا تعيد قراءة ما وضعته عليه عوضا عن قراءة حالة الطرف الخارجية.

تنقسم المنافذ لنوعين C51 من إنتاج أتميل و باقى الأنواع AVR من إنتاج أتميل و كافة منافذ ميكروتشيب تقريبا.
الأول سيلى شرحة فى منافذ أتميل لكونه مخلف قليلا أما ألباقى من إنتاج الشركتين تشترك فى الخواص التالية
1- يحتوى كل منفذ على مسجل للبيانات و مسجل آخر تحدد كل خانه فيه كون الطرف المقابل من المنفذ إدخال أو إخراج.
2- يحتوى كل منفذ على مسجل ثالث يحتوى حالة الطرف الفعلية الآن و بصرف النظر عن المسجل الأول ألذى تكتب أنت فيه ما تريد فقد تكتب على الطرف 1 ولكن عليه مفتاح يفرض صفر، هنا سيقرأ مسجل البيانات 1 و مسجل الطرف صفر.

منافذ أتميل:
فى عائلة C51 نجد أن المنافذ تسمى بالأرقام المنفذ صفر ثم 1 و 2 و 3. أما فى عائلة AVR فتسمى بالأحرف منفذ A,B,C,D
فى عائلة C51 المنفذ صفر هو الأقوى حيث يستطيع أن "يبتلع" تيار معادل 8 حمل TTL وهذا الحمل يبلغ 1.6 مللى أمبير وهو الحمل القياسى لأحمال الدوائر المنطقية ولمعرفة المزيد عنه راجع سلسلة الدوائر المنطقية ، أى ان كل طرف يتحمل 12.8 مللى أمبير.
هذا المنفذ ذو مخرج يسمى المصب المفتوح Open drain (سلسلة الدوائر المنطقية) لذ عندما يكون = 1 ، لا يخرج منه تيار و لا يظهر عليه فولت و يحتاج لمقاومة أو حمل ما متصل بالطرف الموجب +5 فولت ليظهر هذا الواحد (+5فولت) .
أما عندما يكون = صفر يقبل تيار حتى القيمة المذكورة. لذا هو مناسب لتشغيل ليد بيان LED أو شاشات 7 شرائح 7Segment من النوع المهبط المشترك Common Anode أو أوبتو كبلر الخ. أيضا أغلب المفاتيح Switch تحتاج لمقاومة Pull Up لذا يمكن استخدام هذا المنفذ.
المنافذ الأخرى 1،2،3 متماثلة حيث تصدر و تقبل تيار بنصف القيمة السابقة أى 4 حمل أو 6.4 مللى أمبير عندما تضع على أى طرف منها صفر تيار كما سبق ولو وضعت عليه 1 يمكنك أن تضع مفتاح أو توصله بخرج أى دائرة إلكترونية أخرى تعطيه بيانات.
الحالة الفرضية هى ما يكون عليه عند البدء أو إعادة التشغيل وهى كل المخارج فى وضع الخرج أى كلها 11111111

فى عائلة AVR فقد اختلف الأمر و أصبحت المنافذ الأربع متماثلة و من الممكن أن تتحكم فى أى منفذ تحكما أكثر .

فى المرة القادمة إن شاء الله نتحدث عن منافذ AVR و منافذ ألبيك
 

ماجد عباس محمد

عضو جديد
إنضم
3 سبتمبر 2006
المشاركات
5,325
مجموع الإعجابات
197
النقاط
0
منافذ عائلة avr من أتميل

منافذ عائلة AVR من أتميل :
كما سبق أن ذكرنا لكل منفذ مسجل بيانات و آخر يسمى DDR اختصار Data Direction Register أى مسجل اتجاه البيانات (دخول أم خروج) مضاف إليه اسم المنفذ مثلا DDRA للمنفذ A و هكذا حتى DDRD للمنفذ D .
الوضع الافتراضى للبدء هو دخول أى محتواه = صفر ووضع 1 فى أى خانه تجعل الطرف خروج فمثلا لو وضعنا فى المسجل DDRA=10101010 سنجعل المنفذ A طرف دخول و المجاور خروج و هكذا، كما أنك يمكن فى أى لحظة فى البرنامج أن تغير خصائص أى طرف فلو فى أى مكان فى البرنامج استخدمت الأمر DDRA=10101011 ستغير الطرف صفر من المنفذ A (أقصى اليمين) من إدخال لإخراج.
كما ذكرنا سابقا أنه لدينا مسجل آخر لقراءة حالة الأطراف وهو باسم PINA و حتى PIND واحد لكل منفذ. فمثلا لو قرأت القيمة PORTA ستعطيك آخر قيمة سجلتها أنت فى هذا المنفذ ولو عليه أزرار لن تعرف حالتها، لكن لو قرأت القيمة PINA ستعلم أى الأزرار يضع 1 و أيها يضع صفر.
المسجلين المذكورين يمكن التعامل معهما كمنفذ ذو 8 طرف أو تحدد الطرف المختار من الثمانية.
منافذ ألبيك :
الأمر مختلف قليلا مع ألبيك فمسجل الاتجاه TRIS اختصار Tri-State و يسمى TRISA وحتى TRISF حسب اسم المنفذ و عند وضع 1 فى أى خانه يجعلها دخول و صفر يجعلها خروج وهى أسهل حفظاً من أتميل لأن 1 مشابهة شكلا للحرف I أو INPUT و الرقم 0 أشبه بالحرف O أو Output.
فى عائلة PIC16 سنجد لها مسجلين فقط أولهما السابق ذكره للاتجاه و الثانى اسمه PORT باسم المنفذ، هنا لا يوجد مسجل لحالة الطرف و قراءة المنفذ PORTA مثلا تعطى حالة الأطراف ولا وسيلة لقراءة ما سبق لك كتابته.
أما فى عائلة PIC18 فمازال قراءة المنفذ PORTA مثلا تعطى حالة الأطراف وأضيف مسجل أخر باسم LAT وهى اختصار Latch ويضاف اسم المنفذ أصبح قراءتها هى التى تعطى ما سبق لك كتابته على المنفذ فمثلا قراءة LATA تعطى ما كتبته انت بينما PORTA تعطى حال الطرف حاليا فقد يكون هناك مفتاح ما فرض حالة عكس ما كتبت.
فى عائلة PIC16 الحالة الافتراضية لمنفذ A هو تماثلى لذا يجب تهيئته لو يستخدم كأطراف رقمية فيما عدا ذلك ففى العائلة 16 و العائلة 18 كل المنافذ ستكون دخول ما عدا بعض الأطراف لذا يجب الرجوع للداتاشيت لمعرفة أى الأطراف مرتبطة بأى الوظائف حتى تعيد تهيئتها كمداخل / مخارج أو تستخدمها كما هى فقط اعرف ماذا تفعل

الآن لدينا 32 طرف للتحكم فى العالم الخارجى و بهذه الأطراف نستطيع التحكم فى كثير من الأدوات المنزلية كخلاط مثلا أو غسالة أو كثير من الآلات الصناعية أيضا.
لنرى كيف ذلك نبدأ فى كتابة بعض البرامج لتشغيله.
لتكتب بالأسيمبلى لعائلة أتميل فهناك برنامجان أسهل من غيرهم فى هذا المجال
برنامج MIDE
http://mide-51.software.informer.com/0.2/
وهو مجانى لكن ينقصه تتبع الأعطال Debug
الثانى
يمكنك إنزال BASCOM نسخة 8051 لإستخدامها مع c51 و نسخة AVR لإستخدامها مع AVR و كلاهما يصلح للأسيمبلى أو بيزك أو كلاهما معا
أو يمكنك استخدام ميكرو الكترونيكا كما يمكنك أن تستخدم بروتس أيضا.
سنبدأ المرة القادمة إن شاء الله بكتابة برنامج بسيط يقرأ 3 أزرار فى مداخل و يضئ 3 ليد تمثل العدد 1 أو 2 أو 3 حسب أيها تم الضغط عليه
 
التعديل الأخير:

ماجد عباس محمد

عضو جديد
إنضم
3 سبتمبر 2006
المشاركات
5,325
مجموع الإعجابات
197
النقاط
0
أول برامجنا

أول برامجنا:
عائلةC51 - أتميل
لتسهيل الأمور فى أول برنامج، أعلم أن الغالبية تفضل برنامج بروتس حيث ترسم الدائرة و تحاكيها قبل التنفيذ العملى. حسنا
لننشئ مشروع جديد كما بالصورة التالية
attachment.php

نستخدم فيه AT89c51 متصلة كما بالصورة.
سنلاحظ هنا أن الليدات متصله على منفذ صفر PORT0 من خلال مقاومات متصلة بالموجب. السبب أن منافذ هذه العائلة لا تمد بتيار رغم أن الداتاشيت تقول أنها تستطيع ذلك لكن أيضا عندما تسحب منها تيار تحد فورا من تيار الخرج. باختصار لا تصدر تيار يضئ ليد أو يفعل ترانزستور . لكنه يقبل تيار حتى 20 مللى أمبير.
توصل المفاتيح كما بالرسم. أعلم أن البعض سيعترض لكن كل أوجه الإعراض ليست لها ضرورة الآن.
فى صفحة البرنامج ستجد العديد من الأسطر كتبها لك البرنامج و كلها تبدأ بالفاصلة المنقوطة ";” و السطر بكاملة باللون الأخضر. هذا لأن هذه الفاصلة جعلت السطر بكاملة "تعليق" أى غير وارد فى البرنامج ولكنه للشرح أو التنسيق.
ثم يلى ذلك تعريف أن هذا هو الملف ألرئيسى و يمكنك حذفه.
كود:
[LEFT][COLOR=#008000]; ============================================= 
; Main.asm file generated by New Project wizard
;
; Created:   Thu May 24 2018
; Processor: 80C51
; Compiler:  ASEM-51 (Proteus)
;==============================================
[/COLOR][/LEFT]
ثم يلى ذلك تعليمه للمترجم بالنسق المستخدم وهو NOMOD51 و نلاحظ أنه مسبوق بعلامة الدولار $، هذه ألتعليمه تخص المترجم أى ستختلف باختلاف المترجم المستخدم و سيضعها آليا عند بدء مشروع جديد وهى فى بروتس تعنى لا تستخدم النسق الإفتراضى لهذه العائلة و لذا يجب أن تتبعها بالخطوة التالية و تختار رقم الميكرو و تردد الكريستال الخ.
و يليه تعليمه للمترجم بالميكرو المستخدم وهو 8051 و هو ملف يلحق بالبرنامج به تعريفات لكل المسجلات و المنافذ و محتويات الميكرو الداخلية. بدونه لن تستطيع أن تكتب أمرا واحدا . أيضا مسبوق بعلامة $ و فى مترجم غيره قد تكون علامة # و اسم الملف 8051.MCU و كل مترجم سيضع اسم الملف الصحيح له.
كود:
$NOMOD51
$INCLUDE (8051.MCU)
ما يلى قسمين واحد للتعريفات ثم المتغيرات و متجهات إعادة التشغيل و خلافة و سيأتى شرحها لاحقا إن شاء الله
يمكنك حذف التالى أيضا ، سنبقى فقط على السطرين السابقين فقط.
كود:
[LEFT][COLOR=#008000];==================================
; DEFINITIONS
;==================================


;==================================
; VARIABLES
;==================================


;==================================
; RESET and INTERRUPT VECTORS
;==================================[/COLOR][/LEFT]
و الآن سنصل لتعليق ; Reset Vector و لتعليمه هى

org 0000h
هذه اختصار Origin بمعنى نقطة أصل أو نقطة بدء لتقول للمترجم "أريد الكود التالى فى هذا العنوان"
وهى احتياطا لو تريد برنامج متقدم سيكون لها جدوى أما فى هذا البرنامج البسيط سيكون الكود فعلا فى خانة صفر ولا حاجة لتكرارها و يمكن حذفها.
حتى الآن كل ما سبق هو تعليمات للمترجم ولا ينتج عنها أى كود ولو حاولت أن تعكس المسار لتحصل منها على التعليمات من الكود ، فلن تحصل مما سبق على أى كود ليكتب لك بدلا عنه هذه الأسطر.
أول أمر هو JMP start أى اقفز حيث العنوان Start
لكى تضع عنوان تذهب إليه وقتما شئت يجب أن يكون من كلمة واحدة قد تحتوى _ لزيادة الإيضاح و أن تبدأ بحرف وليس رقم و ألا تكون من كلمات الكود المستخدمة و أن تكون أول ما فى السطر أو قبلها مسافات بيضاء و أن تنتهى بالنقطتين ":” مثلا
LCD_TEST: عنوان جيد أو Delay25u:
ألتعليمه JMP بمعنى اقفز بدون قيد أو شرط للعنوان المذكور وهو هنا start
كما ذكرنا البرنامج سيبدأ دوما من خانة صفر و بدون استخدام باقى مكونات المتحكم فلا حاجة لها ويمكن حذفها
jmp Start
ثم الشرح ألذى يقول قطاع الكود و أيضا تعليمه مشابهة لتحديد مكان كتابة باقى البرنامج org 0100h و تعنى العنوان 100 بالنظام الستة عشرى لوجود الحرف h أما لو b سيكون ثنائى ولو بدون سيكون العشرى المعتاد
كود:
[COLOR=#008000];==========================
; CODE SEGMENT
;==========================


   ;   org   0100h
Start:
      ; Write your code here[/COLOR]
يمكن حذف كل ما سبق ما عدا سطرى التعريف المذكورين و سطر العنوان Start
أى لدينا ثلاثة أسطر فقط وهنا نبدأ أول البرنامج الفاعل
وهذا موضوعنا القادم بإذن الله.
 

المرفقات

  • Prog01c51.png
    Prog01c51.png
    3.1 KB · المشاهدات: 42

ماجد عباس محمد

عضو جديد
إنضم
3 سبتمبر 2006
المشاركات
5,325
مجموع الإعجابات
197
النقاط
0
أول برامجنا ج2

ابتكر أحدهم فى شركة إنتيل استخدام كلمة Move وهى تعنى حرك أو انقل لكى تعنى انسخ ولا أدرى لماذا بينما استخدم نظيره فى موتورولا كلمة Load وهى بمعنى "حمًّل" أو "ضع شيء فى" ، وهى أقرب للمنطق لكن هكذا سارت الأمور و تبنت Mov كل من إنتيل و لاحقا أتميل و أيضا ميكرو تشيب
الاسم Mov هو مختصر ودوما بدون حرف e و يليها المنقول إليه أو الهدف ثم فاصلة "," ثم المنقول منه أو المصدر و لا قيود على من سيكون المصدر و من سيكون الهدف ، محتوى خانة ذاكرة أو عنوان الخانة أو مسجل و بهذا. لو كان المصدر حرفيا بمعنى رقم ما تريد نسخه أو وضعه فى مسجل ما نضع قبله علامة شباك "#” و بدون هذه العلامة سواء فى المصدر أو الهدف فهو عنوان لخانة ذاكرة و ما سيتأثر هو محتواها


السطر الأول سيكون
Mov P0 , #255
Mov p3 , #255
وهذا يعنى ضع فى المنفذ P0 القيمة 255 لوجود علامة "#” ثم السطر الثانى سيعنى ضع فى المنفذ P3 القيمة 255 لوجود "#” أيضا. هذا يعنى جعل كل أطراف هذين المنفذين عليهما +5 فولت و يمكن استخدامهم كمداخل أيضا.
ماذا لو لم نضع الشباك؟ أى هكذا MOV P3 , 255 سيترجمها المترجم انك تريد محتوى خانة الذاكرة رقم 255 حسبما يتصادف محتواه.
كود:
[LEFT][B]Loop: [/B]
[B][COLOR=#0000ff]jb[/COLOR] p3.0 , SW2test[/B]
[B][COLOR=#0000ff]mov [/COLOR]P0 , #11111110b[/B]
[B]SW2Test: [/B]
[B][COLOR=#0000ff]jb [/COLOR]P3.1 , SW3Test[/B]
[B][COLOR=#0000ff]mov [/COLOR]P0 , #11111100b[/B]
[B]SW3Test:[/B]
[B][COLOR=#0000ff]jb [/COLOR]p3.2 , start[/B]
[B][COLOR=#0000ff]mov [/COLOR]P0 , #11111000b[/B]
[B][COLOR=#0000ff]jmp [/COLOR]start[/B]
[COLOR=#008000][B];===========================[/B]
[/COLOR][B]END[/B][/LEFT]

الآن انسخ السطور السابقة فى مترجم بروتس وهذا شرح كل منها.
Loop:
عنوان و لدينا أيضا عنوانين آخرين هما SW2Test و SW3Test وهى ذات فائدة فى تحديد مسار البرنامج
يليه الأمر JB وهو اختصار Jump if Bit set و يعنى اقفز لو البت =1 وهو يليه اسم هذه البت ثم فاصلة ثم إزاحة عدد الخطوات التى يجب الانتقال إليها. هذه الخطوات هى فى بايت واحدة لذا ستكون بإجمالي 255 خانة بين للأمام 128 خطوة و للخلف 127 خطوة.
سيكون من الصعب عليك حساب عدد الخطوات فستحتاج لمعرفه كم خطوة لكل تعليمه الخ لذا نستخدم عنوان و نترك المهمة الصعبة للمترجم.
إذن السطر التالى يعنى
لو البت "المنفذ3 الطرف صفر" =1 اقفز حيث العنوان SW2test وهذا يعنى أنني اختبرت المفتاح SW1 فإن لم يفعل سينتقل للعنوان "اختبار المفتاح2” وهذا من فوائد العنوان أن يكون معبرا عن هدف هذه الخطوة لتذكيرك ماذا أنت ذاهب لتفعل
أما لو كان مضغوطا على المفتاح1 سيجعل الطرف = صفر و من ثم لن ينتقل و سينفذ ألتعليمه
mov P0 , #11111110b
أى سيضع صفرا على الطرف المتصل بالليد الأول ليضئ وهنا كان ممكن أن نكتب MOV P0 , 254 لكن قد تتساءل لاحقا ماذا تعنى 254 ووضعها بالصورة الثنائية أوضح لك أن كل الأطراف آحاد ماعدا الأول بصفر ، ثم نكرر عند العنوان SW2Test حيث نجد نفس ألتعليمه إلا أن البت أصبحت P3.1 أى المنفذ 3 الطرف رقم 1 و القفز للعنوان SW3Test
إن لم ينتقل أو يقفز سينفذ الأمر
mov P0 , #11111100b
و به تضيء ألليد الأول و الثانى.
و بعد العنوان الأخير سنجد الاختبار الأخير للبت الثالثة إلا أن القفز للبداية فإن لم يقفز سيضيء الليدات الثلاث ثم يقفز للبداية لتكرار الاختبارات مرة أخرى لتحديد متى يتم الضغط على أى الأزرار.
قبل أن نترك الموضوع تعلمنا الأمر JB و هناك الأمر عكسه وهو JNB أظن توقعت Jump if Not Bit set يعنى سيختبر البت و الانتقال سيكون لو = صفرا بدلا من لو =1
آخر سطر وهو END لا معنى له و كثير من المترجمات استغنت عنه ولكنه مستبقى لأسباب تاريخية فقط.
قديما عندما كانت البرامج تدخل للحاسب بالبطاقات المثقبة لم يكن هناك وسيلة لتعلم الحاسب أن هذا آخر كارت برنامج وهذا تمام الكود عكس الآن حيث يقوم نظام التشغيل بهذه المهمة و يحدد لك أول و آخر الملف . لذا كان لابد أن يكون آخر كارت عليه هذا الكود END و إلا سيحصل على رسالة أن الملف غير كامل. أما الآن فسيقول لك لم أجد كلمة END، حسنا وماذا لو وجدتها؟؟ أليست آخر كلمة فى الملف؟ ولو انتهى الملف أليس هذا كاف من نظام التشغيل أن يخبرك بتمام الملف؟؟
الآن جرب محاكاة البرنامج و ستجده يعمل و الليدات تضئ و تطفئ طالما الزر مضغوطا عليه.
لكن هناك ملاحظات تتطلب التعديل، حاول أن تكتشفها و تعدلها قبل موضوعنا القادم بإذن الله.
 

ماجد عباس محمد

عضو جديد
إنضم
3 سبتمبر 2006
المشاركات
5,325
مجموع الإعجابات
197
النقاط
0
المشكلة و اصلاحها

لعلك لاحظت أن المحاكاة كشفت أن الليدات الثلاث تطفئ ثم تضيء مرة أخرى وهذا فى برنامجنا لا شيئ لكن فى الواقع لو هذا فى آله و تقوم بذبذبة جزء منها بهذا المعدل قد تتلفها، إذن ما العيب و كيف نصلحه؟؟
العيب أنك فى كل مرة تقفز إلى Start لتعيد الدورة و فيها تطفئ الكل بدلا من أن تعدل فقط حسب المطلوب لذا نضع عنوان آخر هو Loop وهو فيه الدورة التكرارية
كود:
[LEFT][B][SIZE=3]Start: 
      Mov    P0 , #255
      Mov    p3 , #255
Loop:    
      jb        p3.0 ,  SW2test
      mov    P0 , #11111110b
      sjmp    Loop
SW2Test:     
     jb        P3.1 , SW3Test
     mov        P0 , #11111100b
     sjmp    LOOP
SW3Test:
      jb        p3.2 , start
      mov    P0 , #11111000b
      jmp     Loop
[COLOR=#008000];===========================
[/COLOR]      END[/SIZE][/B][/LEFT]
هنا سنقدم تعليمه جديدة وهى sjmp اختصار Short Jump وهى للانتقال فى مدى +128 و -127 خطوة و بهذا توفر بايت فى كل تعليمه من حجم البرنامج بالمقارنة بتلك JMP و التى تنتقل لأى مكان ولكنها تحتاج لخانة أخرى لتكملة العنوان 2 بايت.
الآن بعد الاختبار الأول إن لم يتم الانتقال و أضأنا ألليد سنعود لأول الاختبار مباشرة فلا جدوى من تكملة الاختبارات، بل على العكس عندما نختبر الأخير لا دلالة لدينا عن حالة الأول مثلا و من ثم الأفضل إضافة ألتعليمه sjmp loop لنعيد الاختبارات من الأول لنحدد أى الأزرار مضغوط.
نفس الأمر فى نهاية الاختبار الثانى حيث لو لم ينتقل نتيجة لأول اختبار سيختبر الثانى فينفذ أو ينتقل
إن نفذ فسيعود لبدء الاختبارات مرة أخرى
إن لم ينتقل سيذهب للثالث و الآن وصولة للثالث هو حكم بأن الأول و الثانى لم يضغط على أى منهما لكن عدد الخطوات للانتفال قد تغير. من فوائد العنوان انه عندما يتحرك صعودا أو هبوطا ستحسب الخطوات آليا ولو زادت عن المسموح سيعطى المترجم رسالة خطا لمعالجة الموقف.
الآن وباختبار الثالث إن كان غير مضغوط فيجب إطفاء الكل بالانتقال للعنوان start و إن كان مضغوط سنضيء الكل بتنفيذ الأمرMov P0 , #11111000b ثم نقفز لتكرار الاختبارات دون إطفاء.


جرب المحاكاة الآن
لو حاولت تنفيذ هذا عمليا على بوردة تجميع فلن يعمل لعدم توصيل كثير من الأطراف الهامة و التى لا يعيرها ألمحاكي اهتماما، ولكى تنفذها يجب أن تكون الدائرة هكذا.




attachment.php





ألمرة القادمة بإذن الله سنكرر نفس البرنامج مع بيك.
ألمرة القادمة بإذن الله سنكرر نفس البرنامج مع بيك.
 

المرفقات

  • Prog01c51a.png
    Prog01c51a.png
    5.5 KB · المشاهدات: 44

ماجد عباس محمد

عضو جديد
إنضم
3 سبتمبر 2006
المشاركات
5,325
مجموع الإعجابات
197
النقاط
0
الدائرة باستخدام ميكروتشيب pic16f877a

ميكروتشيب PIC16F877A

الآن سننفذ ذات الدائرة على بروتس باستخدام PIC16c877A متحكم و معه ذات المكونات و الدائرة كما بالرسم.
سنلاحظ اختلاف فى توصيل الليدات و السبب أن منافذ ألبيك قادرة على الإمداد بالتيار عكس أتميل التى تقبل فقط.
attachment.php

نلاحظ أيضا أننا لن نتعامل حاليا مع منفذي A,E لارتباطهما بالمحول تماثلى رقمى و يجب تهيئتهما للتعامل كمنفذ رقمى فقط.
يمكننا استخدام ألباقى وسنختار المنفذ D .


المنفذ B يحتوي مقاومات جذب للأعلى Pull-up وهى خاصية ضرورية لأن المنفذ عندما يهيأ كدخول ستكون له معاوقة دخول عالية و من ثم الجهد عليه غير محدد و عند قراءته كطرف رقمى قد يقرأ 1 ثم يقرأ صفر بلا انتظام ولكنها توضع للأطراف الثمانية معا أو تحذف معا ولا ينصح باستخدامها لو البعض دخول و الباقى خروج و هذا يعالج بوضع المقاومات هذه خارجيا وهى R4,R5,R6 و عادة ما تكون 10 ك أوم , ولذا لم يعد مهما استخدام المنفذ B كدخول أو خروج و سنختار كما هو بالرسم.
بمراجعة صفحة الكود سنجد كما سبق كثير من الأسطر لا حاجة لها الآن سوى سطر
#include p16f877a.inc ; Include register definition file
وهو لتعريف المترجم أسماء مكونات المتحكم ثم يلى ذلك تعريف بدء البرنامج بتحديد البدء RESET ثم الانتقال لأول البرنامج بالأمر GOTO START وأخيرا إلغاء طرف البرمجة فى البوردة PGM
RST code 0x0
goto Start
PGM code
بعد ذلك نبدأ بتهيئة المنفذ B كخروج و المنفذ D كدخول و هذا بتنفيذ الأمر TRISB=0 و يكتب هكذا
كود:
[LEFT][B]CLRF STATUS                  [COLOR=#008000]; Bank0[/COLOR][/B]
[B]CLRF PORTB[/B][COLOR=#008000][B]; Initialize PORTB by clearing output data latches[/B][/COLOR]
[B]CLRF PORTD [/B][COLOR=#008000][B]; Initialize PORTD by clearing output data latches[/B][/COLOR]
[B]BSF STATUS, RP0 [/B][B]          [COLOR=#008000] [/COLOR][/B][COLOR=#008000][B]; Select Bank1[/B][/COLOR]
[B]CLRF TRISB ; All OUTs[/B][/LEFT]

حيث
CLRF تعنى Clear أو إلغاء محتوى المسجل المشار إليه بالحرف f وهو هنا STATUS وهذا لاختيار المجموعة صفر حيث لا يمكن للبيك أن يتعامل مع الذاكرة ككل و يقسمها لمجموعات كل منها تسمى بانك أو مجموعة أو BANK و نختار Bank0 لجعل المخارج أصفار بالأمرين CLRF PORTB ثم CLRF PORTD بعد ذلك نختار بانك رقم 1 بالأمر BSF STATUS, RP0 لتهيئة المنافذ بعد ذلك بالأمر CLRF TRISB لجعل المنفذ B مخارج.

لتهيئه المنفذ D كدخول نحتاج لأمر مشابه للسابق أى TRISD=255 و المشكلة أنك لا تملك أمر مماثل لأتميل حيث تكتب ما تشاء حيث تشاء كيف تشاء لكن يمكنك فقط كتابه ما تشاء فى المسجل W ثم تنسخه حيث تشاء بعد ذلك، ولهذا تحتاج لأمرين هما
MOVLW 255
MOVWF TRISD
حيث الأول Move Literal W أو اكتب حرفيا فى المسجل W و القيمة المطلوب كتابتها هى 255 أى 11111111 ثنائى ثم نسخها للمسجل TRISD بالأمر التالى MOVWF أو انقل محتوى W للمسجل F و المسمى هنا TRISD و أخيرا الأمر
CLRF STATUS ; Bank0
لنعود للبانك صفر مرة أخرى لنكتب فى المنافذ. نبدأ البرنامج بالعنوان
كود:
[LEFT][B]Loop: [/B]
[B]BTFSC PORTD , 0[/B]
[B]GOTO Sw1[/B]
[B]MOVLW 1[/B]
[B]MOVWF PORTB[/B]
[B]GOTO Loop[/B][/LEFT]
هذا حيث سيتكرر البرنامج دوما و سنختبر المفاتيح بالأمر


BTFSS f, b Bit Test f, Skip if Set
و هى تعنى اختبر البت f و لو =1 لا تنفذ الأمر التالى مباشرة و عكسها
BTFSC f, b Bit Test f, Skip if Clear
و هى تعنى اختبر البت f و لو =0 لا تنفذ الأمر التالى مباشرة وهذا الأمر التالى طبعا يجب أن يكون أمر انتقال لمكان ما
GOTO xxx
وهكذا يصبح اختبر المنفذ PORTD الطرف صفر فإن كان =1 انتقل لعنوان Sw1 و إلا فالزر مضغوط ولذا نكتب 1 فى المسجل W ثم ننسخه للمنفذ B و نعود للعنوان Loop لنكرر الاختبار. أما لو انتقلنا إلى Sw1 سنجد
كود:
[LEFT][B]Sw1:[/B]
[B]BTFSC PORTD , 1[/B]
[B]GOTO Sw2[/B]
[B]MOVLW 3[/B]
[B]MOVWF PORTB[/B]
[B]GOTO Loop[/B][/LEFT]
اختبار مماثل لكن للمنفذ PORTD الطرف 1 بدلا من صفر و الانتقال إلى Sw2 أو إنارة 2 ليد بدلا من الأول فقط ثم العودة لأول الدورة Loop
كود:
[LEFT][B]Sw2:[/B]
[B]BTFSC PORTD, 2[/B]
[B]GOTO SW3[/B]
[B]MOVLW 7[/B]
[B]MOVWF PORTB[/B]
[B]GOTO Loop[/B][/LEFT]
فى عنوان Sw2 سنجد اختبار مماثل لكن للمنفذ PORTD الطرف 2 بدلا من صفر أو 1 و الانتقال إلى Sw3 أو إنارة 3 ليد بدلا من الأول فقط ثم العودة لأول الدورة Loop
كود:
[B]SW3: [/B]
[B]CLRF PORTB [/B]
[B]GOTO Loop[/B]
[COLOR=#008000][B];===========[/B]
[/COLOR][B]END
[/B]
و أخيرا فى عنوان SW3 سنطفئ الكل لنعود للأول Loop مرة أخرى و كما ذكرنا أن واقعيا هذه الدائرة لا تعمل و يجب أن تصبح هكذا
attachment.php


من الواضح أن كم التعليمات أكثر بكثير مما استخدم مع السابق C51 وهذا راجع لقله الأوامر المتاحة فضلا عن كثير من التعليمات لا تستنتجها وحدك لبدء التهيئة و التشغيل.
لذا فألبيك يفضل دوما برمجته باستخدام اللغات العالية مثل البيزك أو C. فهذا البرنامج البسيط تطلب العديد من التعليمات ولو كان البرنامج أكثر تطورا ربما أصبح من الصعب تنفيذه بالأسيمبلى بألبيك .
يجب أن نتذكر هنا أننا باستخدام لغة ما غير الأسيمبلى قد تضيف كثير من التعليمات التى كان من الممكن اختصارها بالأسيمبلى.، لكن هناك أمر لا يسهل التغاضي عنه وهو استخدام مكتبات الأرقام العشرية و أنا شخصيا لو احتاج لعدد ثابت من الأرقام العشرية استخدم الحساب بدلا من المكتبات الجاهزة لاستهلاكها لذاكرة البرنامج فمثلا لو احتاج لرقمين صحيحين و كسرين عشريين أعتبر الحسابات ستكون على رقم أعلاه 9999 صحيح و استخدم له 2 بايت (حتى 65000) أو بالإشارة +/-32000 ثم فى عرض الرقم أضيق علامة عشرية بين الثانى و الثالث.
من المثال السابق نستخلص منهجا لما سيلى وهو أننا يمكننا مناقشة الأسيمبلى لمنتجات أتميل C51 فقط بينما AVR , ميكروتشيب سنكتفي باللغات العالية وذلك لكون الأسماء قد تغيرت و أيضا ذاكرة البرنامج زادت حتى سهل استخدام الحساب بالأرقام العشرية و من ثم اقتصرت البرمجة بالأسيمبلى على السرعة أولا و تقليل الحجم إن اضطر الأمر .

المرة القادمة إن شاء الله سنحاول كتابة هذا البرنامج باللغات العالية
 

المرفقات

  • Proj01PIC16.png
    Proj01PIC16.png
    4.1 KB · المشاهدات: 5
  • Proj01aPIC16.png
    Proj01aPIC16.png
    6.3 KB · المشاهدات: 4

ماجد عباس محمد

عضو جديد
إنضم
3 سبتمبر 2006
المشاركات
5,325
مجموع الإعجابات
197
النقاط
0
تمهيد للغات العالية

تمهيدللغات العالية:

التعريفات:

قبل أن نتناول اللغات العالية يجب أن نتعرض لما تركناه فى الشرح السابق و هو يخص البرمجة بشكل عام سواء بالأسيمبلى أو أى من اللغات العالية وهى الأجزاء الثلاث التالية
كود:
[COLOR=#009900][B];==================================[/B][/COLOR]
[COLOR=#009900][B];DEFINITIONS[/B][/COLOR]
[COLOR=#009900][B];==================================[/B][/COLOR][/LEFT]
هذا الجزء يسمى التعريفات و كما سبق الذكر فهذه الأسطر هى تعليقات لتذكرك فقط أين يفضل أن تملأ هذه البيانات، لذا يمكنك بعد حذفه أن تكتب ما تريد أو تتركه للتنسيق فقط.
أغلب المترجمات تفترض أنك تضع هذا فى أول البرنامج دوما لأنه سيحتاج هذه المعلومات لاحقا و القلة فقط تدعم الإعلان لاحقا فهى ستحتاج لمسح الملف كاملا مرة لتحديد كل التعريفات ثم تبدأ فى التحليل .
لنعدللبرنامج السهل الأول سنجد
كود:
[LEFT][COLOR=#000000][B]Start:[/B][/COLOR]
[COLOR=#000000]      [B]Mov    P0, #255[/B][/COLOR]
[COLOR=#000000]      [B]Mov    p3, #255[/B][/COLOR]
[COLOR=#000000][B]Loop:    [/B][/COLOR]
[COLOR=#000000]      [B]jb        p3.0,  SW2test[/B][/COLOR]
[COLOR=#000000]      [B]mov    P0, #11111110b[/B][/COLOR]
[COLOR=#000000]      [B]sjmp    Loop[/B][/COLOR]
[COLOR=#000000][B]SW2Test:    [/B][/COLOR]
[COLOR=#000000]     [B]jb        P3.1, SW3Test[/B][/COLOR]
[COLOR=#000000]     [B]mov        P0, #11111100b[/B][/COLOR]
[COLOR=#000000]     [B]sjmp    LOOP[/B][/COLOR]
[COLOR=#000000][B]SW3Test:[/B][/COLOR]
[COLOR=#000000]      [B]jb        p3.2, start[/B][/COLOR]
[COLOR=#000000]      [B]mov    P0, #11111000b[/B][/COLOR]
[COLOR=#000000]      [B]jmp    Loop[/B][/COLOR]
[/LEFT]
بالتأكيد أنك نسيت ما قلنا و الآن تتساءل ما هو أو فيم يستخدم P0 وما هو P3 و ستضطر للعودة للدوائر لتكتشف أن P0 الخاص بالليدات و P3 الخاص بالأزرار لذا لو هناك وسيلة تسهل هذاالأمر؟!!
أجل هذا القسم هو لهذا الغرض فيمكنك مثلا كتابة
كود:
[LEFT][COLOR=#000000][B]Switches    EQUP0[/B][/COLOR]
[COLOR=#000000][B]LEDs        EQUP3[/B][/COLOR]
[COLOR=#000000][B]SW1        EQUP0.0[/B][/COLOR]
[COLOR=#000000][B]SW2        EQUP0.1[/B][/COLOR]
[COLOR=#000000][B]SW3        EQUP0.2[/B][/COLOR][/LEFT]
كلمة EQU اختصار Equal وهى شائعة فى مترجمات الأسيمبلى و فى البيزك باسكوم تستخدم كلمة Alias وهى تعنى اسم مرادف ، وفى ميكروإلكترونيكا تستخدم Symbol وهى ليست قياسية فى لغة البيزك أما C فتستخدم كلمة at أو #define
Switches Alias P0
هكذاتعطى اسم للمنفذ ككل و اسم لكل طرف إن شئت، بل لو عرفت المنفذ أولا يمكنك استخدام اسمه لاحقا للتسهيل أكثر هكذا
SW1 EQU Switches.0
فى ميكروإلكترونيكا
Symbol Sw1 = Switches
فىلغة C نجد تعليمه للمترجم هى
كود:
[LEFT][COLOR=#000000] [B]#defineMy_Name System_Name[/B][/COLOR][/LEFT]
فكلمة define تعنى "أعرف" و هذه الجملة تقول استخدم My_Nameبدلا من System_Name هكذا
كود:
[LEFT][COLOR=#000000] [B]#defineSwitches PORT0[/B][/COLOR][/LEFT]
هذه الطريقة سهلت التذكر كثيرا ففى أى وقت تراجع البرنامج ستعلم ماذا – أين
هناك نقطة أخرى بالغة الأهمية أيضا، فماذا لو بعد الانتهاء من البرنامج و بدأت فى رسم البوردة وجدت تعارض فى المسارات ووجدت أنه من الأفضل استخدام منفذ آخر أو طرف آخر.من الأفضل أن تتحمل الخطأ فلو حاولت مراجعة البرنامج كاملا لتغير هذا الطرف بالتأكيد ستنسى و تعانى الأمرين حتى تجعله يعمل مرة أخرى.
باستخدام هذه المسميات سيكفى أن تغير التعريف فى أول البرنامج و هو سطر واحد فقط ليعمل البرنامج كما يجب على الوضع الجديد بالأطراف الجديدة. أليست هذه نعمة؟!
الآن الخبر الجيد أن هذه المسميات تكون للمترجم فقط ولا ينتج عنها أى كود لذا لا تبخل فىجعل الاسم مناسبا لا هو قصير جدا ويصعب تذكره مثل X,C فلن تذكر لاحقا X يعنى ماذا ولا C أيضا ، ولا تجعل الاسم طويلا فيصعب عليك كتابته كل مرة داخل البرنامج مثل Liquid_Crystal_Data_Port ويكفى مثلا LCD_Data
أيضا هذه الطريقة لا تشترط على ماذا تطبق فيمكنك تطبيقها على ثوابت مثل NoOfLoops=25 أو حتى على معادلة أو كود مثلا
كود:
[LEFT][COLOR=#000000] [B]PressTimeAlias delay (25)[/B][/COLOR][/LEFT]
فماسيفعله المترجم هو ببساطة كما لو أنه استخدم خاصية "استبدل" Replace من القائمة "تحرير"EDIT و بدل النصوص كلها قبل أن يبدأ الترجمة .
بلغة ميكرو سى نستخدم الصورة التالية ولاحظ أن ميكروإلكترونيكا هى الشركة الوحيدة التى تستخدم تعريفين bit , sbit , فى كل منتجاتها وتنصح باستخدام sbit دوما.
كود:
[LEFT][COLOR=#008000][B]sbit SW1 at RC5_bit;[/B][/COLOR][/LEFT]

كود:
[LEFT][COLOR=#008000][B]char Switches at PORT0 ;      [/B][/COLOR][/LEFT]
لاتسألنى لماذا يجب أن ينتهى السطر بالفاصلةالمنقوطة ";” فلم أجد إجابة شافية حتى الآن
البعض يقول تحديد نهاية السطر، حسنا هذا كانضروريا وقت ما كنا نقرأ من الكروت المثقوبة لنحدد بها أى ";” نهاية السطر أما الآن فهناك فى الويندوز 2 بايت فى نهاية كل سطر هما CR,LF وهما كود 10وكود 13 أما فى أبل أو يونكس /لينيكس و ملفات الأردوينو فهى إما الأولى أو الثانية فقط حيث CR اختصار Carriage Return أى رجوع العربة (الحاملة للورقة) أى الرجوع لأول السطر و LF اختصار Line Feed أى تحرك لسطر جديد ...أى أن هناك نهاية سطر مزدوجة فى كل سطر ولا حجة لهذا العذر و لكن لها ميزة عظيمة فى إرباك المبرمج خاصة أنها أحيانا لو وضعت تسبب إرباك المترجم ولا يعطى رسالة خطأ حتى ، فقط يعطيك برنامج كما تخيله هو ،ولو نسيتها فكثيرا ما يكتشفها لكن ليست دوما.
السطر الأول يعنى المفتاح SW1 عند الطرف رقم 5 من المنفذ C من المسجل PORT
السطر الثانى يعنى تخصيص اسم Switches للمنفذ 0
الثوابت:

نفس مفهوم الأسماء يمكن امتداده للقيم الثابتة رغم عدم ظهورها فى المثال السابق إلا أنك قد تحتاج للتعامل مع 25 مدخلا و تحتاج دورة فيها 25 للقراءة ثم أخرى ربما للحساب و ثالثة للمقارنة ورابعة للعرض على الشاشة الخ فستجد نفسك فى عديد من الدورات كلها 25 مرة
ومثال آخر أنك تحتاج تكرار أمر ما عدة مرات لتحصل على نتيجة ثابته أو تتأكد من ثبات القيمة فعادة ما نضع رقم
لكن بنفس القياس لو احتجت لتغيير الدورات فى المثال الأول بالنقصان أو الزيادة سيكون ذلك كابوسا لكن لو استخدمت التعريف السابق فى إعطاء اسم للرقم فكل ما عليك هو تعديله فى أول البرنامج مرة واحدة
كل مترجم له طريقته فى هذا فالبعض يستخدم طريقة EQU السابقة أو Alias أو يجعلها واضحة باستخدام اللفظ "ثابت" أو Constant واختصارا Const هكذا
Const Loops= 25
Const repeat= 50
نفس الخبر الجيد السابق ينطبق هنا فهذه الثوابت لا تأخذ من ذاكرة المتحكم لأنها لا تحفظ فى البرنامج و يقوم المترجم باستبدال كل كلمة Loops بالعدد 25 وهكذا و فى النهاية يقوم بالترجمة باستخدام الأعداد و ليس الأسماء و سنوضح الفروقبالأمثلة على لغتى البيزك و السي..
لكن هل من الممكن أن نعدل هذه القيمة بحسب الحاجة؟ هذا يسمى "المتغيرات" لكن لتنوعها سنجعلها المرة القادمة بإذن الله
 

ماجد عباس محمد

عضو جديد
إنضم
3 سبتمبر 2006
المشاركات
5,325
مجموع الإعجابات
197
النقاط
0
المتغيرات

[h=3]المتغيرات [/h]نأتى الآن للجزء التالى من التعليقات التى سبق حذفها وهى باسم المتغيرات
كود:
[COLOR=#008000][B];==================================[/B]
[B]; VARIABLES[/B]
[B];==================================[/B][/COLOR][/LEFT]
لكونها تتغير بحسب الحاجة إذن يجب أن نعلم مسبقا أو نحدد لها حجم ما مناسب لأننا سنضطر لوضعها فى الذاكرة و من ثم ستأخذ قدر من المتاح، وقد تقول لا بأس فالمتحكم به عدة الآف من الخانات، للأسف يجب أن أذكر هنا أنها من حجم الذاكرة العشوائية وليست ذاكرة البرنامج وهى فى أتميل AT89x51 قدرها 128 خانة فقط و ألباقى AT89x52 فما فوق قدرها 256 خانة وفى AVR تصل 1 ك و أكثر و تصل 368 خانة فى PIC16 أو اقل فى بعض الأرقام. يمكنك أن تخصص لكل متغير من بايت واحدة إلى 4 بايت ولا تزيد عن ذلك إلا فى حالة النصوص.
كن حذرا هنا فما لم تكن تتعامل مع الأسيمبلى فكل تخصيص لمتغير أنه بت واحدة ، سيحجز المترجم مقابلها بايت كاملة !!.
يجب أن تعلن صراحة عن المتغيرات التى ستستخدمها و إلا ستلقى رسالة خطأ و يتوقف عن الترجمة.
فى الأسيمبلى تستخدم كلمه EQU السابقة أيضا، ستقول كيف؟ سأقول كما سبق أن ذكرنا هى تعنى هذا يساوى أو يستبدل بذلك فلو تصف خانة ذاكرة إذن هى متغير لأن محتواها يأخذ أى قيمة من صفر إلى 255 و أذكر أننا قلنا فى ألتعليمه Mov P0 , #255 ` ذكرنا أن "#” تضع 255 على المنفذ لكن لو حذفناها سيأخذ محتوى الذاكرة 255 حسبما كان هذا و يضعه على المنفذ ، بهذا لو كتبت ألتعليمه
Days EQU 50
فهذا يعرف المترجم أن عليه استبدال كلمة Days بالقيمة 50 فى الأمرين التاليين
Mov P0 , #Days
Mov P0 , Days
ومن ثم فى السطر الأول سيضع حرفيا على المنفذ صفر قيمة 50 أما فى السطر الثانى سيأخذ محتوى خانة الذاكرة رقم 50 و يضعها على المنفذ. لو تريد تخصيص Word وهى من 2 بايت سيخصص المترجم المكان الأول الذى أشرت إليه فى الأمر و التالى له آليا. لا يوجد فى الأسيمبلى أكبر من 2 بايت إلا بتخليقك أنت لما تحتاج أو تستخدم مكتبة خارجية.

فى لغة البيزك تستخدم كلمة Dim و هى اختصار Dimension بمعنى "يصنع وفقا لأبعاد محددة" و أكثر المترجمات تسمح بتسمية عدد من المتغيرات المتساوية الحجم مثلا
Dim Loop , Cycle , X , T as byte
وهى هنا تقول أصنع متغيرات واحد باسم Loop وآخر باسم Cycle وآخر باسم X وآخر باسم T كل منها بايت واحدة و لتسمى آخر بحجم 2 بايت يجب أن تعلن من جديد باستخدام Dim
فى لغة C تضع النوع أولا هكذا
كود:
[B]Byte Loop , Cycle , X , T ;[/B][/LEFT]
[h=4]
أنواع المتغيرات و أحجامها :[/h]أصغر متغير هو البت الواحدة وفى عائلة C51 يوجد منها 2 بت للمستخدم و للأسف لا يوجد مثلها فى أى من المتحكمات الأخرى.
داخل كل متحكم يوجد ما يسمى مسجل حالة البرنامج أو Program Status Word و اختصارا PSW وهذا اسمه أى لو تريد الكتابة فيه أو القراءة منه تستخدم الاسم PSW.1 مثلا لقراءة البت رقم 1
attachment.php
الصورة لعائلة C51 حيث نجد فيها 2 بت للمستخدم الأولى باللون الأصفر و اسمها F0 أى يمكنك أن تستخدم هذا الاسم مباشرة هكذا
JB F0, Next_Action
أو تعيد تسميتها بالتعريفات السابق شرحها و الثانية باللون البرتقالى وهى بلا اسم لذا يمكنك استخدام PSW.1 أو تعريفها بأي اسم مناسب . باقى الخانات سيلى شرحها لاحتوائه على كثير من الأمور الهامة.
لو اخترت أى بت أخرى سيخصص المترجم بايت كاملة لها.
لو ستستخدم مترجمات ميكرو الكترونيكا تذكر أنها تسمى sbit

الوحدة الثانية من المتغيرات هى البايت وهى 8 بت وهى تعبر عن حرف من كلمة أى حرف هجائى أو عدد من صفر وحتى 255.
بعض المترجمات خاصة فى اللغات العالية مثل ميكرو الكترونيكا تسمى الحرف Chr اختصار Character و تسمى أيضا Short اختصار Short-Integer و من كل تضع بلا إشارة UN-signed Character أو بالإشارة signed Character و تصبح أعلى بت فيها رقم 7 تمثل إشارة الرقم. لو صفر يكون العدد موجبا و لو 1 يصير سالبا و بهذا تعبر عن +127 إلى -128 فقط بدلا من صفر إلى 255 أيضا
Signed short int أو Un-signed short int لنفس المدى
أما مترجم BASCOM فيستخدم Byte من صفر إلى 255​
 

المرفقات

  • psw-51.png
    psw-51.png
    1.5 KB · المشاهدات: 4

ماجد عباس محمد

عضو جديد
إنضم
3 سبتمبر 2006
المشاركات
5,325
مجموع الإعجابات
197
النقاط
0
اللغات العالية

اللغات العالية :

ربما نسينا برنامجنا السابق لذا ها هو مجددا و بعد إضافة المسميات
كود:
[LEFT][B]Switches EQU P0[/B]
[B]LEDs EQU P3[/B]
[B]SW1 EQU P3.0[/B]
[B]SW2 EQU P0.1[/B]
[B]SW3 EQU P0.2[/B]

[B]Start:[/B]
[B]Mov Switches , #255[/B]
[B]Mov LEDs , #255[/B]
[B]Loop: [/B]
[B]jb SW1 , SW2test[/B]
[B]mov LEDs , #11111110b ; = 254[/B]
[B]sjmp Loop[/B]
[B]SW2Test: [/B]
[B]jb SW2 , SW3Test[/B]
[B]mov LEDs , #11111100b ; = 252[/B]
[B]sjmp LOOP[/B]
[B]SW3Test:[/B]
[B]jb SW3 , start[/B]
[B]mov LEDs , #11111000b ; = 248[/B]
[B]jmp Loop[/B]
[/LEFT]
و أظن أنه أصبح مفهوما بصورة أوضح. هل يمكننا وضعه فى كلمات لشرح خطواته؟
نعطى منفذ الليدات اسم LEDs ونعطى السويتشات اسم Switches و السويتش الأول اسم SW1 وهكذا
ضع على منفذ السويتشات 255 و على منفذ الليدات 255
العنوان دورة:
لو المفتاح Sw1 =1 عندها انتقل للعنوان SW2test
و إلا ضع على الليدات 254 ثم عد للدورة
العنوان SW2test:
لو المفتاح Sw2 =1 عندها انتقل للعنوان SW3test
و إلا ضع على الليدات 252 ثم عد للدورة
العنوان SW3test:
لو المفتاح Sw3 =1 عندها انتقل للعنوان start
و إلا ضع على الليدات 248 ثم عد للدورة


هل نترجمه للإنجليزية؟؟
لو = IF ، و إلا = Else و عندها = Then و إعطاء اسم هى Dimension لآنها تعنى اسم و حجم معا أو حيز أو صنع شيء طبقا لمواصفة محددة أما استخدام اسم بديل فهو Alias . كثير من المترجمات تفضل البدء بكلمة Main بمعنى أساسى ، لا بأس فهى تعرفك أنت أين يبدأ البرنامج و دوما ما تحتاج عنوان فى بداية البرنامج لتكراره.
كود:
[LEFT][B]Main:[/B]
[B]Switches = 255[/B]
[B]LEDs = 255[/B]
[B]Loop:[/B]
[B]If Sw1 = 1 then[/B]
[B]Goto SW2test[/B]
[B]Else[/B]
[B]LEDs = 254[/B]
[B]Goto loop[/B]
[B]End If[/B][/LEFT]
حيثما تريد كتابة أكثر من تعليمه فى أى من الجزأين فإما تكتب كل منهما فى سطر مستقل كما سبق أو تفصل بينهما بالحرف ": “ كما فى المثال التالى أو ربما المترجم يتبنى حرف آخر، فلنستخدمه إذن.
طبعا هنا ستقول أن كلمة "عندها أو Then “ زائدة لكن ستجد ضرورتها لو كتبتها فى سطر واحد هكذا
If Sw1 = 1 then Goto SW2test Else LEDs = 254 : Goto loop
فهى تفصل بين كود الشرط و ألذى قد يكون معادلة طويلة و بين الأوامر الواجب تنفيذها عند تحقق الشرط كما Else تفصل بين كود التحقق و كود عدم التحقق – كل كلمة لها مكانها و ضرورتها و مفهومة إن نسيت بمقدورك أن تستنتجها و تركز فى البرنامج بدلا من التركيز على ما لا جدوى منه من أقواس و فواصل منقوطة وهل الفاصلة قبل القوس أم بعده..
وفى نمط السطر الواحد سنستغنى عن حد الختام وهو End If لأنها تفصل بين كود Else و باقى البرنامج.
هكذا يمكننا أن نكتب باقى البرنامج بالسطر الواحد هكذا
كود:
[LEFT][B]SW2test:[/B]
[B]If Sw2 = 1 then Goto SW3test Else LEDs = 252 : Goto loop [/B]
[B]SW3test:[/B]
[B]If Sw3 = 1 then Goto Start Else LEDs = 248 : Goto loop [/B][/LEFT]

طبعا لو عكسنا المنطق سنوفر قفزة من الاثنتين (الأولى) بحكم أنها للمكان التالى مباشرة فيمكننا القول
If Sw1 = 0 then LEDs = 254 : Goto loop
If Sw2 = 0 then LEDs = 252 : Goto loop
If Sw3 = 0 then LEDs = 248 : Goto loop
Goto Main

لاحظ أن البرنامج الأفضل هو ألذى يقوم بمهام أكثر بكود أقل فى زمن أسرع
.

و لنكتبه بلغة C أولا يجب أن تلتزم بالأحرف المكتوبة بمعنى لو كتبت Loop ثم لاحقا goto loop سيعترض أن العنوان غير موجود. هذا من بقايا نشأة اللغة فالفرق بين الحرف الكبير و الصغير هو البت رقم 5 فمثلا
حرف A = 0100 0001 بينما حرف a=0110 0001 وهكذا فى باقى الأحرف و لتوحيد المقاس يلزم تنفيذ أمر على كل الحروف مثل OR x,#0010 0000 لجعل الحروف صغيرة أو AND x,1101 1111 لجعلها كبيرة وهذا كان رفاهية و إسراف عندما كانت ذاكرة الحاسبات تحسب بالبايت و تشترى بالبت و حتى لاحقا عندما حسبت بالكيلو بايت. أيضا كل الأوامر تكتب بالأحرف الصغيرة ولو كتبت أى حرف كبير لن يتعرف عليها المترجم. هذا قد يوقعك فى مشكلة لو أخطأت فى حجم حرف فى اسم متغير فى برنامج من عدة صفحات حسب المترجم المستخدم.
سنجد أن البداية بالتعريفات كما سبق الشرح ثم بكلمة Void وهى تعنى "خلاء" أو فراغ أو مساحة و كلمة main ضرورية للبدء ثم قوسين لتحديد أنك لا تضع بينهما أى بيانات مطلوب معالجتها ثم القوس المعوج ألذى يحدد البداية و مثله للنهاية
كود:
[LEFT][B]void main() [/B]
[B]{[/B]
[B]TRISA = 0xFF;      [COLOR=#008000][I]// PORTA is input[/I][/COLOR][/B]
[I][B]TRISC = 0;            [COLOR=#008000]// PORTC is output[/COLOR][/B][/I]
[B]Loop:[/B]
[B]if (Sw1=1) {[/B]
[B]Goto SW2test ;[/B]
[B]}[/B]
[B]else {[/B]
[B]LEDs = 254 ; [/B]
[B]Goto loop ;[/B]
[B]}[/B][/LEFT]

الشرط يجب أن تضعه بين قوسين
(لماذا ؟ لا تسألنى فلم يجيبنى أحد ولا أرى سببا غير ما شرحت سابقا) لو أردت أن تضع بعد ذلك أكثر من سطر فيجب أن تبدأ بالقوس المعوج } و تنتهى بآخر { و كل سطر منتهى بالمقدسة ";" من غير ليه و الصورة المختصرة تصبح
كود:
[LEFT][B]SW2test:[/B]
[B]if (Sw1 = 0 ) [/B]
[B]{ LEDs = 254 ;[/B]
[B]Goto loop ;[/B]
[B]}[/B]
[B]if (Sw2 = 0) {[/B]
[B]LEDs = 252 ;[/B]
[B]Goto loop ; }[/B]
[B]if (Sw3 = 0) {[/B]
[B]LEDs = 248 ;[/B]
[B]Goto loop ;[/B]
[B]Goto Start ;[/B]
[B]}[/B][/LEFT]

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

ماجد عباس محمد

عضو جديد
إنضم
3 سبتمبر 2006
المشاركات
5,325
مجموع الإعجابات
197
النقاط
0
صورة أخرى من ألتعليمه if

[h=4]صورة أخرى من ألتعليمه IF[/h]بعض الشركات تحبط استخدام الأمر GOTO و تفضل عدم استخدامه و مثال لذلك تقترح الصورة المتداخلة من الأمر IF وتسمى Nested IF وهى أنك بعد الجزء ELSE تضع الشرط التالى مباشرة وهى قد تبدو منطقية و أسهل فهما و لنجرب ذلك فى المثال السابق حيث كان البرنامج بعد التعريفات
كود:
[LEFT][B]Start:[/B]
[B]Switches = 255[/B]
[B]LEDs = 255[/B]
[B]Loop:[/B]
[B]If Sw1 = 0 then LEDs = 254 : Goto loop [/B]

[B]If Sw2 = 0 then LEDs = 252 : Goto loop [/B]

[B]If Sw3 = 0 then LEDs = 248 : Goto loop [/B]
[B]Goto Start [/B][/LEFT]

باستخدام الطريقة المتداخلة تصبح

كود:
[LEFT][B]Start:[/B]
[B]Switches = 255[/B]
[B]LEDs = 255[/B]
[B]Loop:[/B]
[B]If Sw1 = 0 then [/B]
[B]LEDs = 254 [/B]
[B]Else If Sw2 = 0 then[/B]
[B]LEDs = 252 [/B]
[B]Else If[/B] Sw3 = 0 then
[B]LEDs[/B] = 248
[B]Else[/B]
LEDs = 255 [B] ; [/B][B]الس[/B][B]طر الأخير[/B]
[B]End IF[/B]
[B]Goto Start [/B][/LEFT]
حسنا تخلصنا من معظم GOTO ماعدا الأخيرة فقط وهذه لها أمر آخر يمكن استخدامه لكن لو الذاكرة محدودة فمن الأفضل استخدام الأسلوب الأول ، لماذا؟
سينشئ المترجم آليا أمر انتقال لنهاية الدورة حيث تكتب END IF أو تضع القوس المعوج فى لغة C وهذا سيضيف المقابل للسطر الأخير أمر وضع 255 على المنفذ و انتقال لأخر الدورة بدلا من Start

و قبل أن نطور برنامجنا السابق و نتعمق أكثر نرى كيف نطبق هذا باستخدام النوعين الآخرين وهذا موضوعنا القادم بإذن الله
 

ماجد عباس محمد

عضو جديد
إنضم
3 سبتمبر 2006
المشاركات
5,325
مجموع الإعجابات
197
النقاط
0
البرنامج بالمتحكمات الآخرى

[h=4]البرنامج باستخدام AVR[/h]باستخدام الأسيمبلى سنحاج لتعديل البرنامج كله فقد تغير الأمر MOV ليصبح LDI اختصار LOAD Immediate أى تضع قيمة ما مباشرة فى مسجل و LDS لنسخ ذاكرة إلى مسجل و عكسها STS Store Data to space فضلا عن باقى التعليمات أيضا كما أن المنافذ هنا قد تغيرت و أصبح لكل منفذ 3 مسجلات واحد للخرج و يسمى PORTx و الثانى للاتجاه دخول/خروج و يسمى DDRx و الثالث لحالة الطرف و يسمى PINx كما سبق الشرح ، لذا سيكون أصعب بقليل كتابة هذا البرنامج لكنه ممكن ، و نظرا لكبر الذاكرة المتاحة و الرغبة فى التعامل مع الأرقام العشرية سيكون من الأفضل الاكتفاء باللغات العالية
كما علمنا سابقا أن منافذ AVR أصبحت تعطى تيار أو تقبل تيار مشابه لمنافذ ألبيك و عكس C51 لذا يمكن أن نتبنى الأسلوبين أى المطابق للسابق
attachment.php
أو مشابه للبيك هكذا مع مراعاة تغيير أوامر إضاءة ألليد من صفر إلى 1 وأذكر هذا تمهيدا للتعامل مع الريلايات لاحقا

attachment.php
أيضا لم أوصل طرف RESET لأنه يمكن الاستغناء عنه باختيار خاصية Brown out detect مع فولت 2.7 فعندما يهبط جهد التغذية لهذه القيمة يحدث ريست داخلى آليا ولا حاجة للتوصيل الخارجى لكن إن شئت فليكن، أيضا لم أوصل الكريستال لأنه يمكن استخدام المولد الداخلى 1 ميجا أو 2 أو 4 أو 8 ميجا و إن كان دقيق فى حدود 1% وهو فى نظرى كاف لكثير من التطبيقات ما عدا الوقت الدقيق ألذي يحتاج أكثر من هذه الدقة أو لو تستخدم التواصل التسلسلى.

باستخدام البيزك و مراعاة المسجلات الثلاث السابقة سيصبح البرنامج
كود:
[LEFT][B]$regfile = "m16def.dat" [COLOR=#006400]' [/COLOR][/B][COLOR=#006400][B]تحديد الميكرو[/B][/COLOR]
[B]$Crystal=4000000  [COLOR=#006400]' [/COLOR][/B][COLOR=#006400][B]تردد الكريستال[/B][/COLOR]
[B]$hwstack=40  [COLOR=#006400]' [/COLOR][/B][COLOR=#006400][B]تحديد المرصوصة[/B][/COLOR]
[B]$swstack=16  [COLOR=#006400]' [/COLOR][/B][COLOR=#006400][B]تحديد المرصوصة[/B][/COLOR]
[B]$framesize=32  [COLOR=#006400]' [/COLOR][/B][COLOR=#006400][B]ذاكرة كمسودة لبعض ألدوال [/B][/COLOR][/LEFT]

السطور الخمس السابقة تخص المترجم أساسا و تجدها مسبوقة بعلامة الدولار
$ وهى فى باسكوم كما يلى
الأول تحديد ملف التعريف بالميكرو Atmega16A
الثانى تردد الكريستال وهو لا يهم إلا فى حساب الكود اللازم للمنفذ التسلسلى و حساب التأخير المطلوب فى بعض الوظائف
الثالث تخصيص مرصوصة الانتقال و المقاطعة الخ وتسمى Hardware أو مرصوصة المكونات
الرابع تخصيص مرصوصة تسمى Software أو مرصوصة البرامج وهى مطلوبة للمترجم لبعض العناوين
الخامس كمسودة لحسابات يحتاجها المترجم لبعض ألدوال كتنسيق النصوص الخ
كود:
[LEFT][B]Leds Alias PORTA : Leds_dcn Alias DDRA  [COLOR=#006400]' [/COLOR][/B][COLOR=#006400][B]تسميه المنافذ و المفاتيح و مسجل الاتجاه[/B][/COLOR]
[B]Switches Alias PORTD : Switch_dcn Alias DDRD[/B]
[B]Sw1 Alias PIND.0 : Sw2 Alias PIND.1 : Sw3 Alias PIND.2[/B]
[COLOR=#006400][B]' [/B][B]تسميه المفاتيح لاحظ استخدام [/B][B]PIND [/B][B]بدلا من [/B][B]PORTD [/B][/COLOR]
[B]Main:[/B]
[B]Leds_dcn = 0 : Switch_dcn = 255[/B]
[B]Start:[/B]
[B]Switches = 255[/B]
[B]Leds = 255  ' enable Pullup[/B]
[B]Loop:[/B]
[B]If Sw1 = 0 then LEDs = 254 : Goto loop [/B]
[B]If Sw2 = 0 then LEDs = 252 : Goto loop [/B]
[B]If Sw3 = 0 then LEDs = 248 : Goto loop [/B]
[B]Goto Start [/B][/LEFT]

نلاحظ أن البرنامج لم يختلف كثيرا لدرجة أننا لم نحتاج لإعادة رسم الدائرة فيمكننا أن نستخدم ذات الأطراف فقط نراعى أن أطراف التغذية و الكريستال و الريسيت قد تغيرت أرقامها
.
المرة القادمة إن شاء الله نعيده بالبيك 16 و 18
 

المرفقات

  • Prog01AVR01.png
    Prog01AVR01.png
    8.4 KB · المشاهدات: 5
  • Prog01AVR02.png
    Prog01AVR02.png
    7.9 KB · المشاهدات: 5

ماجد عباس محمد

عضو جديد
إنضم
3 سبتمبر 2006
المشاركات
5,325
مجموع الإعجابات
197
النقاط
0
البرنامج باستخدام pic16877a

البرنامج باستخدام PIC16

attachment.php

الدائرة سبق رفعها لذا سنستدعيها للمرجعية و سنعيد كتابة البرنامج بالبيزك

نلاحظ هنا تطبيق تعديل إضاءة ألليد من صفر إلى 1 وهو سيستخدم فى الريلايات لاحقا سواء مع ألبيك أو مع AVR
سنلاحظ أيضا مع ميكروإلكترونيكا ستحتاج لتعريف اتجاه المنفذ نصا بالاسم و لن تستطيع استخدام اسم سبق تعريفه وهذا قصور فى هذا المترجم ثم تعين الاتجاه لاحقا عكس باسكوم سيقدم أمر Config للتهيئة أيضا هو لا يدعم Elseif لذا يجب تفصيلها

كود:
[LEFT][B]program Proj01PIC16[/B]
[COLOR=#008000][B]' Declarations section [/B]
[/COLOR][B]Dim Leds as byte at PORTB[/B]
[B]DIM Leds_DCN as byte at TRISB[/B]
[B]DIM Switches_DCN as byte at TRISD[/B]
[B]Dim SW1 as sbit at PORTD.0[/B]
[B]Dim SW2 as sbit at PORTD.1[/B]
[B]DIM SW3 as sbit at PORTd.2[/B]
[B]main:[/B]


[B]If Sw1 = 0 then [/B]
[B]  LEDs = 1      [/B]
[B]else [/B]
[B]If Sw2 = 0 then      [/B]
[B]LEDs = 2          [/B]
[B]else      [/B]
[B]If Sw3 = 0   [/B][B]then          
LEDs = 3                 
[/B][B]else          [/B]
[B]Leds = 0                  [/B]
[B]end if          [/B]
[B]end if      [/B]
[B]end if[/B]
[B]Goto Main[/B]
[B]end.[/B][/LEFT]

البرنامج باستخدام PIC18

رغم أن تركيب الأطراف كما هو ولم يتغير (عكس الانتقال من C51 للأحدث) إلا أن بعض الأطراف أضيفت لها وظائف جديدة و كعادة ميكروتشيب أحيانا تفترض الوظيفة الجديدة هى الأساس ، لذا لو أردت استخدام الطرف كمنفذ رقمى يجب أن تلغى الوظيفة الجديدة .
استخدمنا سابقا المنفذين B,D و على وجه الخصوص B0,B1,B2 لليدات و الأطراف D0,D1,D2 للأزرار.
فى الطراز الجديد نجد أن B0:B4 تعمل كأطراف تماثلية لذا يجب إعادة تهيئه المنفذ كرقمى و كدخول لذا سيكون من الأسهل استبدال الأطراف للأطراف B5,B6,B7 و ستصبح الدائرة هكذا
attachment.php

الآن نجد التسمية ذات فائدة كبرى إذ بدلا من إعادة كتابة البرنامج كله نحتاج فقط لتصحيح التسمية فى أول البرنامج سواء استخدمنا البيزك أو C وهذه أيضا إحدى حسنات اللغات العالية وهى أن الكود أغلبه لا يحتاج تعديل .
مزيد من خواص المتحكم فى المرة القادمة إن شاء الله
 

المرفقات

  • Proj01PIC18.png
    Proj01PIC18.png
    10.6 KB · المشاهدات: 4

ماجد عباس محمد

عضو جديد
إنضم
3 سبتمبر 2006
المشاركات
5,325
مجموع الإعجابات
197
النقاط
0
مسجل الوظائف الخاصة Special Function Register

[h=3]مسجل الوظائف الخاصة Special Function Register :[/h]حسنا عرفنا أن هناك بعض المسجلات لتغيير خواص المنافذ Ports و أخرى لوظائف أخرى، أين هى و كيف تعمل؟
ببساطة هى ذاكرة داخل المعالج و من خواص أى ذاكرة أن يكون لها حجم محدد و غالبا مرتبط بنظام العد الثنائى ذلك تصنع بحجم ما أكبر من الحاجة الفعلية المستخدمة ، بعض هذه الخانات يوظف و البعض الآخر يرجئ استخدامه لطرز أحدث أو أكثر إمكانيات. وهذا يكون أوفر و أسرع فى التصنيع .
تفاصيل كل مسجل ستجدها فى الداتاشيت ولذا سنعرض لواحد منها فقط من قبيل العلم بالشيء لكن ما يهمنا فعلا هو أسماء الخانات ووظيفة كل منها و هل تعدل على مستوى البت أم البايت كاملة ومحتواه عند البدء RESET
attachment.php
هناك مثيل له فى البيك و آخر للأتميل AVR و لكل منها طريقتة للكتابه فيه. ستجد أن كل ما يحتويه المتحكم فى هذه الذاكرة مثل المنافذ P0,P1,P2,P3 و المراكم الأساسى A و الثانوى B و خانة حالة البرنامج PSW السابق ذكرها و عدد من المؤقتات وخانات تعديل خواصها و التحكم فيها و عداد البرنامج و عداد ألرصه و عداد آخر يسمى مؤشر البيانات Data Pointer اختصارا DP و مسجل المقاطعات و ستجد فى كل خانة اسم و رقم. الاسم هو ما يمكنك استخدامه لتكتب أو تقرأ من هذه الخانة مثلا P0 للمنفذ صفر و القيمة 11111111 هى عند البدء سيكون هكذا أى به هذه القيمة وعنوانه 80 هيكسا و بجواره مباشرة فى الخانة 81 هيكسا نجد مؤشر ألرصه SP أو Stack Pointer و الرقم 00000111 أى أنه يبدأ بالرقم 7 و طبعا يمكنك تغيير الرقم كما تشاء أما الأرقام المدونة XXX فهى تعنى غير متوقعة و يجب تخصيصها قبل قراءتها و خانه التواصل التسلسلى.
نلاحظ هنا أن العمود الأول و الملون يمكنك معالجة كل بت على حدة أو الخانة كاملة بينما الباقى فيجب أن تتعامل بالبايت.

[h=2]مسجل حالة البرنامج Program Status Word -PSW[/h]سبق أن ذكرنا بعض المعلومات عنه لكن هنا سنتناوله بالتفصيل.
هل الميكرو به فقط A,B لا غير؟ ماذا لو احتجت لأكثر من ذلك؟
تقدم لك هذه العائلة عدد كبير من المسجلات Registers و يمكنك أن تفعل بها أى شيء سوى أن تجعلها مراكم أى تأخذ مباشرة نتيجة العملية الجارية
أولا لديك ثمانية مسجلات تسمى r0-r7 و طبعا تمتاز بأن أمر الحفظ فيها أو القراءة منها يستخدم بايت واحدة لأنها معروفة و تحتاج 3 بت فقط من البايت للإشارة إليه فمثلا
MOV R2, #data
ستضع قيمة data فى المسجل R2 مباشرة
علىالمقابل من الأمر مثلا
MOV50, #data
حيثتحتاج لبايت للأمر MOVمشيراللذاكرة ثم بايت أخرى لتحدد العنوان 50فىالذاكرة و البايت الثالثة قيمة dataالتىتريد حفظها.


حسنا ! أين إذن هذه المسجلات الثمانية؟
لا تفاجأ – فهى يمكن أن تحتل أربع أماكن من الذاكرة العشوائية ، إما من صفر إلى 7 ، أو من 8 إلى F ، أو من 10 إلى 17 ، أو من 18 إلى 1F
ما هذه الحيرة
كلا يا صديقى هذه مصدر القوة كيف؟
لو أنك تحسب لبيانات قادمة من جزء فى ماكينة مثلا ، عادة أسرع وسائل الحفظ هى المسجلات
الآن تود حساب شيء آخر ثم تعود لما أنت عليه الآن
لابد من حفظ المسجلات فى مكان آمن ثم تحسب الأمر المستجد و تحفظ نتائجه أيضا فى مكان آمن آخر ثم تقرا ما كنت تحسب للجزء الأول – قصة طويلة مملة ، أليس كذلك؟
ما رأيك فى أن تستبدل هذا السيناريو بكلمة استخدم طقم 2 وعند العودة قل استخدم طقم 1؟ أليس أسهل و أبسط؟؟
و كيف يتم هذا؟
ببساطة نعود لمسجل PSW وهى اختصار Program Status Word أو خانة حالة البرنامج وهى تحتوى ثمانية خانات Flip Flop تعمل كل منها عمل الراية Flag إما 1 أو صفر حسب الحالة
attachment.php
لاحظ Bit3,Bit4 باسم Register Bank Select أو اختيار بنك المسجلات (البنك = المجموعة)
لو = صفر تعنى المدى من صفر إلى 7 من الذاكرة العشوائية أى أول سبعة أماكن
لو = Ol يكون المدى الثانى أو من 8 إلى F
لو = lO يكون المدى الثالث أو من 1O إلى 17
لو = l l يكون المدى الرابع أى من 18 إلى 1F
كل ما عليك عمله هو تغيير بت واحدة أو 2 بت فقط لتحصل على طقم جديد مع الحفاظ على القديم بلا تغيير للعودة إليه
وماذا عن الباقى فى PSW
حسنا
رقم صفر أقصى اليمين هى Parity "تكافؤ" وتحدد إن كان المراكم A يحتوى عدد فردى أو زوجى من "1"
رقم 1 هى للمستخدم كيف يشاء لتذكر هل حدث أمر ما أم لم يحدث.
رقم 2 لو زاد العدد عن الحد و تتحكم بها وحدة الحساب والمنطق لتصحيح الناتج فى حال كان الرقم موجب و سالب(127 إلى -128 ) أم موجب فقط من 0 إلى 255
رقم 3،4 سبق الحديث عنهما
رقم 5 للاستخدام العام مثل رقم 1
رقم 6 AC وهو لتصحيح جمع الأرقام بالنظام العشرى بدلا من النظام الثنائى فمثلا عند جمع 17 + 26 لا يوجد سوى الجمع الثنائى أى الناتج سيكون 3D و لكننا نريد جمع عشرى أى 17+26 =43 فماذا نفعل؟
عند جمع 7+6= 13 أى D سيوضع آليا واحد فى الراية AC دلالة أن المجموع تعدى 9 و باستخدام بعد الجمع مباشرة ألتعليمه
DA A وهى اختصار Decimal Adjust ACCUMULATOR
فتتولى بفحص هذه الراية و باقى الرايات مثل C تصحيح الرقم آليا من 3D إلى 43.
وهذا مفيد فى التعامل مع كثير من الأرقام BCD و التى توجد فى بعض الحساسات أو تسهل التعامل مع الأرقام. يجب ألا ننسى أن الأرقام التى تجمع يجب أن تكون أصلا BCD و إلا سينتج خطأ

الأخير رقم 7 Carry هو مثل السابق لكن لأى عملية جمع عندما يكون المجموع زائد عن 255 أو بعد تعليمه DA A لو الناتج أعلى من 99

طبعا غنى عن الذكر أن هذه الخانة يمكنك التعامل فيها على مستوى البت فتختبر هذه أو تفرض تلك أو تلغيها (تجعلها=1 أو صفر)

فى هذا الرابط
http://datasheets.chipdb.org/Intel/MCS51/MANUALS/27238302.PDF
نجد مرجع شامل كتبته شركة إنتل INTEL وهى مبتكرة هذا الميكرو و إن اشتهر أكثر بأنه من إنتاج ATMEL
ومن مراجع ATMEL حقيقة وجدت صعوبات كثيرة فى لم شمل أجزاء الميكرو و فهم مكوناته من أكثر من مرجع معا
ولكن فى هذا الملف نجد معظم البنود مرتبة و مشروحة.
فى كل متحكم ستجد PSW أو مسجل حالة البرنامج مع اختلافات طفيفة فى المحتوى و استخدام اللغة العالية عادة يغنى عن تفاصيله و استخدامه .
فى سلسلة AVR أصبح عدد المسجلات 32 مسجل منها 6 تعمل كثلاثة مسجلات كل منها 16 بت باسم X,Y,Z ولها خواص برمجية مميزة.
فى عائلة ميكروتشيب فعددها محدود جدا مما يعقد استخدامها

فيم يستخدم المتحكم و متى لا يكون مجديا؟ وهل ما زالت الطريقة التقليدية باستخدام الدوائر التماثلية تناسب تطبيقات أكثر من المتحكم؟ هذا موضوعنا القادم بإذن الله
 

المرفقات

  • atmilsfr.png
    atmilsfr.png
    3.9 KB · المشاهدات: 4
  • psw.png
    psw.png
    8.9 KB · المشاهدات: 4

ماجد عباس محمد

عضو جديد
إنضم
3 سبتمبر 2006
المشاركات
5,325
مجموع الإعجابات
197
النقاط
0
استخدامات الميكروكونتروللر أو المتحكم

[h=2]استخدامات الميكروكونتروللر أو المتحكم[/h]البعض يتخيل أن الميكرو أو المتحكم هو رائعة العلم و أنه أتى ليقول لعالم ألتماثلى وداعا لكن مهلا نحتاج لفهم بعض الحقائق عن هذه الأشياء ثم نحكم.
أولا ما هى أقصى سرعة نتحدث عنها هنا؟ حسنا نلجأ للدائرة و سنجد كريستال هى الحاكم ألرئيسى و من الداتاشيت لهذه الأنواع نجد أن أعلى تردد استخدم هو 30 ميجا – طبعا الكثير منها 25 فقط أو 20 ميجا فقط.
إذن لا تحلم بأسرع من 30 ميجا
ماذا تعنى؟ أجل تعنى حدك الأقصى فلا تستطيع توليد تردد أو قياسه أو التحكم فى شيء بمعدل أسرع من ذلك.
أيضا هناك نقطة هامة وهى كيف يعمل الميكرو من الداخل؟
لدينا ما يسمى Sequencer أو مرتب الأحداث أو موالى الأحداث أو سمه ما شئت وهو المسؤول عن تنفيذ الأحداث بتتالى محدد وهو
1- قراءة الكود من ذاكرة البرنامج
2- زد واحد على مسجل عنوان البرنامج
3-تحليل الكود و معرفة الخطوة التالية هل تنفيذ السابق كأمر مفرد (مثلا NOP لا تفعل شيئا أو INC A زد واحد لمحتوى المراكم أو CLR A ألغى محتويات المراكم الخ) أو هو حساب يتطلب أخذ قيمة تالية من الذاكرة
4- قراءة الكود التالى من الذاكرة كبيان
5- تنفيذ الأمر ثم البدء من جديد
هذه الخطوات يأخذ وقتا وهذا الوقت يحسب بعدد نبضات الكريستال لهذا فعائلة C51 تحتاج 12 نبضة لتنفيذ دورة كاملة و التى قد تكفى تنفيذ أمر وحيد الخانات أو أمر مفرد كما سبق (مثلا NOP لا تفعل شيئا أو INC A زد واحد لمحتوى المراكم أو CLR A ألغى محتويات المراكم الخ) أو قد تحتاج 12 أخرى لغالبية الأوامر و التى تأخذ دورتين.
إذن30 ميجا / 24 ستصبح1.25 مليون أمر فقط فى الثانية.
لاحقا أنتجت الشركة وحدات تنفذ فى 6 دورات و حتى دورتين فقط لكن بكريستال لا تزيد عن 20 ميجا و من ثم أعلى سرعة هى 10 مليون أمر فى الثانية.
بالنسبة لميكروتشيب فهى تحتاج 4 نبضات فى الدورة إذن 30 /4 تصبح 7.5 مليون أمر فى الثانية
رائع ماذا نحتاج أكثر من ذلك؟
أجل أنت لست وحدك فى هذا العالم و تتحكم فيما حولك بالبرنامج أى المسألة ليست بسيطة كما نظن ولو عدنا للمثال السابق سنجد أننا لنتحكم فى بضع أمور بسيطة تطلب الأمر عدة خطوات و رغم أن البرنامج لا ينفذ كله فى كل مرة إلا أننا يجب أن نستوعب هنا خاصية من أهم خصائص البرمجة عن سرعة التنفيذ
لاحظ أن دورة أو Cycle هى 12 نبضة من الكريستال، وهكذا نستهلك 2 دورة فى كل تعليمه أى 4 دورات تمهيد من Start إلى Loop و من ثم 6 دورة لو كان المفتاح الأول مضغوطا ثم نكرر و إلا سنضيف 6 للمفتاح الثانى و إلا 6 للمفتاح الثالث.
أى كل دورة كاملة للبرنامج إما 6 أو 12 أو 18 دورة أى 72 نبضة من الكريستال أو 144 أو 216 دورة. وهذا زمن لا بأس به، و بالطرز الحديثة حيث تستخدم 2 نبضة من الكريستال لكل تعليمه ستستهلك 12 أو 24 أو 36 دورة من الكريستال
كود:
[LEFT][B]Start:[/B]
[B]Mov Switches , #255           [/B] [COLOR=#008000][B] ; [/B][B]2Byte, 2Cycle[/B][/COLOR]
[B]Mov LEDs , #255                   [COLOR=#008000]; 2Byte, 2Cycle[/COLOR][/B][COLOR=#008000]
[/COLOR][B]Loop: [/B]
[B]jb SW1 , SW2test ; 3Byte, 2Cycle[/B]
[B]mov LEDs , #11111110b      [COLOR=#008000]; = 254 2Byte, 2Cycle[/COLOR][/B]
[B]sjmp Loop                              [COLOR=#008000]; 2Byte, 2Cycle[/COLOR][/B]
[B]SW2Test: [/B]
[B]jb SW2 , SW3Test ; 3Byte, 2Cycle[/B]
[B]mov LEDs , #11111100b       [COLOR=#008000]; = 252 2Byte, 2Cycle[/COLOR][/B]
[B]sjmp LOOP                             [COLOR=#008000]; 2Byte, 2Cycle[/COLOR][/B]
[B]SW3Test:[/B]
[B]jb SW3 , start                        [COLOR=#008000] ; 3Byte, 2Cycle[/COLOR][/B]
[B]mov LEDs , #11111000b          [COLOR=#008000]; = 248 2Byte, 2Cycle[/COLOR][/B]
[B]jmp Loop                                  [COLOR=#008000]; 2Byte, 2Cycle[/COLOR][/B]
[/LEFT]
مع ميكروتشيب الأمر أسهل حيث الكل يأخذ 3 دورة و بايت واحدة فيكون البرنامج يحتاج 8 تعليمات حتى يصل إلى Loop أى 32 دورة للتمهيد ثم

كود:
[LEFT][B]CLRF STATUS         [COLOR=#008000] ; Bank0[/COLOR][/B]
[B]CLRF PORTB            [COLOR=#008000]; Initialize PORTB by clearing output data latches[/COLOR][/B]
[B][COLOR=#008000][/COLOR]CLRF PORTD           [COLOR=#008000] ; Initialize PORTD by clearing output data latches[/COLOR][/B]
[B]BSF STATUS, RP0    [COLOR=#008000]; Select Bank1[/COLOR][/B]
[B]CLRF TRISB            [COLOR=#008000] ; All OUTs[/COLOR][/B]

[B]MOVLW 255[/B]
[B]MOVWF TRISD[/B]
[B]CLRF STATUS ; Bank0[/B][/LEFT]

هنا أمرين لو لم يكن المفتاح الأول مضغوطا أو
4 لو مضغوطا ليكرر الدورة أى4 أو 6 للثانى أو 8 للثالث أو تكرار الدورة كاملة وهذا يعنى 4*4=16 أو 24 أو 32 دورة إضافة للتمهيد 32 دورة كريستال
كود:
[LEFT][B]Loop: [/B]
[B]BTFSC PORTD , 0[/B]
[B]GOTO Sw1[/B]
[B]MOVLW 1[/B]
[B]MOVWF PORTB[/B]
[B]GOTO Loop[/B]
[B]Sw1:[/B]
[B]BTFSC PORTD , 1[/B]
[B]GOTO Sw2[/B]
[B]MOVLW 3[/B]
[B]MOVWF PORTB[/B]
[B]GOTO Loop[/B]
[B]Sw2:[/B]
[B]BTFSC PORTD, 2[/B]
[B]GOTO SW3[/B]
[B]MOVLW 7[/B]
[B]MOVWF PORTB[/B]
[B]GOTO Loop[/B]
[B]SW3: [/B]
[B]CLRF PORTB [/B]
[B]GOTO Loop[/B][/LEFT]

هناك كثير من الأشياء الأخرى يجب مراعاتها مثلا محول ألتماثلى رقمى وفى
PIC16 يحتاج على الأقل 200 ميكرو ثانية لكل تحويله أى 5000 مرة فى الثانية وأسرع من ذلك فى كل من PIC18 و عائلة AVR
وهذا يقودنا لمثال بسيط، تود أن تصنع دائرة مثبت فولت ، لديك طريقين إما تماثلى بالمتكاملات أو بمتحكم و الأخير يعطى إيهاما بأننا ننظمها بالحاسب الآلى
حسنا سرعة المتكاملة الخطية تستجيب فى أقل من ميكرو ثانية طبقا للداتاشيت فكم تعليمه تنفذها فى هذا الوقت؟؟ يمكنك وضع ميكرو للوجاهة و تعرض التيار و الفولت الخ لكن دع التحكم للمتكاملة الخطية سواء أكانت تماثلية أو تقطيعية.


الآن يمكننا أن نفكر فى تطوير برنامجنا السابق لنبدأ مثلا بغساله آلية ذات 6 برامج وهو موضوعنا القادم بإذن الله.
 

ماجد عباس محمد

عضو جديد
إنضم
3 سبتمبر 2006
المشاركات
5,325
مجموع الإعجابات
197
النقاط
0
برنامج غسالة صغيرة

[h=1]برنامج غسالة صغيرة :[/h]الغسالة عادة ما يكون لها شاشة تكتب المراحل و مجموعة أزرار لتحديد برنامج من عشرات البرامج، لكن لكوننا لسنا خبراء فى الغسيل سنكتفى بما يلى:
ثلاث أزرار لاختيار البرنامج خفيف – وسط – كامل يحدد الوقت من 4 أو 10 أو 20 دقيقة وثلاث للدورة بارد/بارد أو غسيل دافئ و شطف بارد أو غسيل ساخن و شطف بارد ، وآخر للبدء و سابع إيقاف للطوارئ و ثامن للباب مفتوح/مغلق و مدخل تاسع لحساس الحرارة العالية و عاشر لحساس الحرارة المتوسطة و حادى عشر لمستوى الماء
سته مخارج لسته ليدات للبرامج الثلاث و الدورات الثلاث و مخرج سابع لتشغيل / إيقاف الموتور مخرج ثامن للسخان و مخرج تاسع لفتح دخول المياه و عاشر لصرف المياه و حادى عشر لسرعة الموتور .
قبل أن نعرض للدائرة هناك بعض الأساسيات التى تجعلنا نلجأ لتصميم ما أفضل من الآخر وهذا يرجع أساسا لسلوك الميكرو ألذى سنستخدمه لذلك سنكرر هذا البرنامج مع الأربع متحكمات المتفق عليها و اللغات الثلاث .

[h=2]غسالة باستخدام C51 و لغة الأسيمبلى:[/h]من الخبرة السابقة وجدنا أن عند تطبيق التيار يحدث إعادة بدء تشغيل RESET ومن ثم كل المنافذ تصبح آحاد أى +5 فولت وكثير من المصممون يفضلون أسلوب أن واحد يعنى تشغيل و صفر يعنى إيقاف لأنه منطقى و يبدأ البرنامج بأمر جعل المنفذ =صفر و يفاجأ أنه عند التشغيل تفعل كل الريلايات معا ثم تفصل مما يسبب لحظة بدء تشغيل خاطئه فى البدء.
هذه قد تكون مكروهة ولكنها أحيانا تكون خطيرة و تسبب مشاكل.
قد تسأل نفسك أليس أول أمر هو التصفير؟ وهل فى ميكرو ثانية تستجيب الريلايات؟ هذا غير منطقى!!
الواقع أنك لم تحسب كم من الوقت يمر قبل أن ينفذ هذا الأمر، ارجع للداتاشيت ستجد أن المذبذب أولا يحتاج بضع مللى ثانية ليقوم و يستقر و الميكرو يحتاج لبضع نبضات حتى يستجيب للريسيت أو إعادة التشغيل و أخيرا يبدأ فى تنفيذ الأمر.
لذا الأفضل أن تعتمد حالة البدء كأساس و عندما تريد تغييرها افعل ذلك فى الوقت المناسب.
من هنا سنجعل كافة المخارج كما هى = 1 و تعنى فصل الريلايات و عندما نريد تفعيل أى منها نستخدم صفر.
أسهل طريقة و أقلها كلفة أن نستخدم ريلاى 5 فولت وهو متوافرو معه ترانزستور س م س أو PNP ومقاومة و دايود كالآتى
PNP relay drv.png
attachment.php

ببساطة عندما تكون مقاومة القاعدة R8 متصله ب +5 فولت سيكون جهد القاعدة Base مساو للباعثEmitter ولا يمر تيار و عندما يكون طرف المقاومة = صفر سيمر تيار القاعدة Base و من ثم يفتح الترانزستور و يفعل الريلاى. الدايود D8 طبعا لإلغاء تأثير الملف عند الغلق.
هذه الدائرة سنكررها 5 مرات لتشغيل الموتور و تسريع الموتور عند العصر و فتح المياه و فتح مصرف المياه و تشغيل السخان
دوائر الليدات لبيان الدورة و الحرارة سبق نقاشها فى البرنامج الأول وهى هنا امتداد له و أيضا توصيل المفاتيح Switches هو امتداد لما سبق فيما عدا طرفى Start/Stop أو بدء التشغيل و طرف Emergency. طرف بدء التشغيل لبدء التشغيل بالخيارات المطروحة ولكن لن يوقف الغسالة فى المنتصف. هذا لا ينفى حدوث مشاكل تستوجب توقف الدورة لذا بالضغط على زر Start أو البدء مع زر الطوارئ Emergency تفرض إيقاف الغسالة و ذلك لتجنب إيقاف الغسالة بالخطأ عند الضغط العفوى على الزر.
هذا تم بحيلة بسيطة وهى إدخال إشارة الطوارئ على طرف المقاطعة الخارجية INT0
attachment.php

نحتاج لمنطق يقول لو صفر مع صفر يكون الخرج صفر ولو أى تركيبة أخرى يكون الخرج =1

هذا يتطلب بوابة "أو" OR-Gate كما بالرسم المتكاملة 4071 فعند الضغط على أى من المفتاحين سيكون على الطرف الآخر واحد و يبقى الخرج واحد حتى يتم الضغط على كلاهما فيصبح الخرج صفر وهذا يسبب مقاطعة المتحكم ومن ثم إيقافه لكونه على طرف INT0 .
أعلم أن من سيفحص البرنامج لاحقا سيقول أن الطرف المتصل بالمنفذ3.0 و المسمى Emergency لم يستخدم، نعم و لكن إما تستبدل البوابة و تستخدم 7432 أو توصل طرف 4071 بمقاومة للموجب ولو نحتاج لهذا الطرف للتحكم فى أى شيء آخر يمكننا فعل ذلك - بهذه الطريقة نوفر مقاومة تعليق Pullup .
الآن دورة الغسالة تحتاج حتى 24 دقيقة فكيف نحصل عليها؟
البعض يلجأ فى اللغات العالية لأوامر تسبب عدم استجابة المتحكم لأى شيء آخر وهذا يلغى فائدته لذا استخدام عداد و نقوم بتغييره له مضاره ومثال على ذلك
MOV R0,#250
DJNZ R0,$
وهذه تعنى ضع فى المسجل R0 القيمة 250 (لاحظ وجود شباك هنا)
ثم الأمر DJNZ هو اختصار Decrement and Jump if Not Zero ثم المسجل R0 و علامة الدولار ، علامة الدولار هذه اختصار لكلمة "هنا" فكأنك استبدلت العنوانين التاليين بها
Here: DJNZ R0,Here
فيما عدا أنك فى كل مرة تستخدم هذه الدورة ستحتاج لأسم جديد لها أما "$” فلا
و الحادث أنك تضع 250 فى المسجل ثم تنقص 1 فإن لم يكن صفرا تعود لذات الأمر أى تنقص منه 1 أى باختصار تظل تنقص 1 حتى يصبح محتواه صفرا لن تنفذ الانتقال مرة أخرى و تخرج منها أى لف حول نفسه 250 مرة كل مرة تستهلك 24 نبضة من الكريستال – زمن قليل جدا
وكان من الممكن استخدام الأمر
MOV 10,#250
DJNZ 10,$
وهو يعنى ضع فى خانة الذاكرة 10 (لاحظ عدم وجود شباك هنا) القيمة 250 (لاحظ وجود شباك هنا) … فقط ستستهلك خانة ذاكرة اكثر لأن العنوان يحتاج بايت بينما المسجل جزء من الأمر.
لذا سنحتاج عديد من هذه الدوائر و يا حبذا لو متداخلة لكن بصعوبة نصل لثانية لذا نلجأ لحيلة المقاطعة أيضا
attachment.php


نأخذ عينة من أحد طرفى المحول 9 فولت متردد (النقطة 1) و من خلال الدايود D7 نأخذ أنصاف الموجة الموجبة فقط ثم نمررها على ترانزستور كمكبر يحولها لموجة مربعة و نضعها على طرف المقاطعة INT1 باسم Clock إذن كل مقاطعة بعد 20 مللى ثانية و كل 50 مقاطعة بثانية كاملة.
إذن مزيد من شرح المقاطعة المرة القادمة إن شاء الله
 

المرفقات

  • PNP relay drv.png
    PNP relay drv.png
    1.6 KB · المشاهدات: 4
  • WashC51 Emergency.png
    WashC51 Emergency.png
    2 KB · المشاهدات: 5
  • WashC51 50 Hz.png
    WashC51 50 Hz.png
    2.9 KB · المشاهدات: 5
أعلى