قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الالي قسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots

   

ماجد عباس محمد
:: نائب المشرف العام
::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 11,652
نشاط [ ماجد عباس محمد ]
قوة السمعة:
قديم 26-06-2018, 09:30 AM المشاركة 49   
افتراضي المقاطعة فى عائلة C51




المقاطعة فى C51
سبق أن شرحنا عناوين المقاطعة و ما يحدث. عند المقاطعة و هنا لنبرمج المقاطعة يجب أن نعود لجدول الوظائف الخاصة فنجد فى خانة 0A8h حيث نجد مسجل باسم IE اختصار Interrupt Enable أى إتاحة المقاطعة و آخر فى 08Bh باسم IP اختصار Interrupt Priority أى أولوية المقاطعة.
الأول IE يحدد أى من المصادر متاح و الأول على اليسار بت 7 إتاحة الكل

لو EA أو إتاحة الكل = صفر (حالة البدء) لن يتاح أى من المقاطعات الأخرى لذا يجب أن يكون =1 لتتاح أى من الباقيات.
بعد ذلك نجد البت 4 للتسلسلى و البت رقم 3 لتايمر 1 و البت رقم 2 للخارجى رقم 1 و البت رقم 1 لتايمر صفر و البت رقم صفر للخارجى رقم صفر
يجب أن تكون أى منهم = 1 لكى تفعل المقاطعة المناظرة له و إلا فعكس الميكرو تشيب لن تسبب أى مقاطعة.
ما يسبب المقاطعة الفعلية هى بت أخرى فى كل موديول مثلا موديول التايمر به بت للمقاطعة لن تستجيب ما لم EA = 1 و أيضا بت التايمر الخاصة بها = 1 فى هذا المسجل IE و سنعرض لذلك لاحقا.
عندما تحدث مقاطعة فستستجيب الدائرة آليا كما شرحنا سابقا ولكن قبل الانتقال للعنوان تجعل EA =صفر فلا يستجيب لأى مقاطعة أخرى. لذلك يجب أن ينتهى برنامج المقاطعة بأمر خاص هو RETI وتعنى العودة من المقاطعة وهى تخبر الدائرة أن المقاطعة تمت خدمتها و من ثم آليا تعيد EA=1 مرة أخرى.
قد يكون البرنامج طويلا و تحتاج لمراقبة أشياء أخرى و تحتاج المقاطعة أثناء المقاطعة، الحل بسيط
SETB EA
CLR EA
الأمر الأول يجعل البت المشار إليها (وهى هنا نصا EA ) بواحد و التالى يجعلها = صفر لو أحتاج الأمر أن تنفذ شيء ما دون مقاطعة و طبعا يمكنك الإشارة لأى بت حتى فى منفذ ما بأى من الأمرين السابقين مثلا SETB P0.3 أو لو اسمها معروف مثل CLR C أو المراكم A أيضا CLR A كلها متاحة و تسهل العمل .
ماذا يحدث لو حدث 2 مقاطعة أو أكثر فى آن؟ حسنا الدائرة تتولى فحص البيتات بالترتيب وهذا يعطيها أولوية ترتيب كما يلى
IE0 الخارجى صفر ثم TF0 تايمر صفر ثم IE1 الخارجى واحد ثم TF1 تايمر واحد ثم التسلسلى بشقيه إرسال أو استقبال و أخيرا تايمر 2
الآن ماذا يحدث لو أردت تغيير هذه الأولوية كأن تعطى الأولوية للتسلسلى مثلا أو اكثر من مصدر؟
حسنا المسجل الآخر IP اختصار Interrupt Priority أى أولوية المقاطعة. لهذا الغرض حيث تجد الخمسة مصادر من بت صفر إلى بت 4

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

الآن بالعودة لدائرة الطوارئ لإيقاف الغسالة نجد أنها متصلة بالمقاطعة الخارجية صفر IE0 ذات الأولوية الأعلى

لتفعيلها نحتاج لتنفيذ الأمرين
SETB EA
SETB EX0
أو تنفيذ الأمر
MOV IE,#10000001b

الآن نريد أن نفعل المقاطعة الأخرى للمؤقت صفر و المتصل بالنبضات Clock لتحسب الزمن وهذا موضوعنا القادم بإذن الله

اعلانات

ماجد عباس محمد
:: نائب المشرف العام
::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 11,652
نشاط [ ماجد عباس محمد ]
قوة السمعة:
قديم 27-06-2018, 10:42 AM المشاركة 50   
افتراضي حساب الزمن بالمقاطعة



حساب الزمن بالمقاطعة
الدائرة السابق شرحها لتوليد موجة مربعة من 50 هرتز توفر لنا نبضة أو مقاطعة 50 مرة فى الثانية أى 60*50=3000 مرة فى الدقيقة، إذن بتوفير عداد يعد 3000 سيعطى خرج كل دقيقة و من ثم نعد 20 دقيقة لزمن الغسيل، لكن لو أردت إضافة شاشة رقمية تبين الوقت لن يكون لديك وسيلة لعد الثوانى ، لذا سنعد الثوانى و منها الدقائق.
فى الوحدة AT89C51 يوجد مؤقت صفر و مؤقت 1 و بدء من AT89C52 و باقى المتحكمات أضيف لها مؤقت ثالث اسمه T2 وهو 16 بت ذاتى التحميل و صمم خصيصا لتسهيل التعامل مع المنفذ التسلسلى لذا لا حاجة لاستخدامه هنا.
المؤقت 1. أيضا 16 بت ولذا لا حاجة أيضا لاستخدامه هنا . جدير بالذكر أن كل المسجلات و المؤقتات ذات 16 بت تكون من خانتين و تجد هذا صراحة فى جدول الوظائف الخاصة Special Function Register SFR و هذا يمكنك من استخدام أمرين لتحميل النصف العلوى و الثانى لتحميل النصف السفلى أو تستخدم أمر واحد بتحميل المسجل أو المؤقت دفعة واحدة لكنها مهمة المترجم أن يحول هذا الأمر المقبول بأغلب المترجمات للأمرين السابقين.
أما مؤقت صفر فيتكون من نصفين TH0 و TL0 حيث H=High, L=Low و يمكننا أن نشغله بهما معا كمؤقت 16 بت أو مؤقت 8 بت ذاتى التحميل حيث نضع ذات القيمة فى كلا النصفين و عند تشغيله يرتفع من القيمة الموضوعة و حتى 255 أى 0FFh و عندها يعطى مقاطعة و يعود للقيمة المحفوظة فى النصف الآخر ليكرر الدورة ما لم يتدخل المبرمج لتغيير القيمة المحفوظة فى TH0 .
ملحوظة : فى هذه العائلة المؤقتات/عدادات تعد صاعدا فقط...، أيضا عند تهيئتها كعداد تأخذ من طرف خارجى بذات الاسم و عند تهيئتها كمؤقت ستأخذ من النظام الداخلى أى تردد الكريستال مقسوما على 12 أى عدد الدورات.
هكذا بوضع 255-50 = 205 فى كلا النصفين فإن TL0 سيتصاعد حتى 255 (بعد 50 نبضة) ثم يحدث مقاطعة و ينسخ 205 من TH0 ليكمل دورة جديدة .
خرج دائرة توليد 50 هرتز السابق شرحها المرة الماضية تدخل على طرف المؤقت "تايمر صفر" و لذا يجب أن نهيئه لهذا العمل. فى SPR نجد خانتين أحداهما يسمى TMOD وهى تايمر مود أى نسق التشغيل وهذا محتواها

نلاحظ أن نصفه الأيمن 4 بت (باللون الأصفر) تخص تايمر صفر و الأخريات للتايمر 1
البت اليسرى تسمى Gate وهى لتمكن التحكم فى التايمر من خارج المتحكم
البت التالية تسمي C/T وهى تجعل المسجل يعمل تايمر أو مؤقت. لو 1 يكون عداد و يعد النبضات على الطرف المناظر T0 أو T1
بعد ذلك 2 بت يحددان وظيفة العداد/مؤقت
لو صفر صفر كما بالجدول سيعمل 13 بت منها 5 مقسم سابق Prescaler
لو واحد صفر يكون 16 بت
لو صفر واحد يكون 8 بت ذاتى التحميل كما شرحنا وهو النسق ألذى سنتبناه
لو 11 سيتوقف تايمر 1 ولو فى النصف الأيمن ، تايمر صفر كل قسم منفصل حيث TL0 يعمل 8 بت بينما TL1 هو8 بت أيضا لكن يخضع لنبضات تحكم T1
لذلك سنضع فيه 00000010 لكى يعمل تحميل ذاتى

بعد ذلك نجد خانة أخرى اسمها TCON أى تحكم فى التايمر

و نجد أن كل 2 بت متجاورة توفر وظائف مختلفة الذات الموقت فمثلا باللون الأصفر نجد
TF1 اختصار Timer1 over Flow وهذه البت هى فعلا مسببة المقاطعة
و دوائر المتحكم تقيمها عندما ينتقل محتوى المسجل Timer1 من الحد الأقصى للصفر فتسبب مقاطعة و عندما ينتقل البرنامج لتنفيذ برنامج المقاطعة (أى خدمة المقاطعة) يعيدها صفرا (عكس ما يحدث فى ميكرو تشيب إذ يجب أن تفعلها بنفسك وهو أحد أسباب مشقة برمجته بالأسيمبلى هنا وفى باقى البيتات فى هذا المسجل) .
الثانية TR1 وهى اختصار Timer Run أى تايمر واحد تشغيل/إيقاف عندما يقيمها (=1) البرنامج يعمل المؤقت و عندما يلغيها = صفر يتوقف
باللون البرتقالى TF0 بت المقاطعة للتايمر صفر وكما سبق =1 عند ألمقاطعة و عند خدمة المقاطعة ستعود آليا لصفر و TR0 تشغيل و إيقافه و بتهيئته كعداد سيأخذ من الطرف T0 (وهو فى دائرتنا نوصلها بمولد 50 هرتز) .
باللون الأخضر مقاطعة خارجية رقم 1 أى IE1 وهى Interrupt External التى تسبب المقاطعة نتيجة نزول الطرف الخارجى INT1 منفذ 3 طرف 3 و البت التالية IT1 هى Interrupt Trigger تغير استجابة المتحكم للتغيير على الطرف INT1 منفذ 3 طرف 3 ،من قدح بالمستوى Level Trigger أى تستجيب للمستوى = صفر إلى قدح بالحافة Edge Trigger أى حافة هابطة من+ 5 فولت للصفر.
لو هذه البت = صفر ستستجيب المقاطعة للمستوى = صفر و من ثم لو تمت الاستجابة له و لم يعود للمستوى 1 قبل العودة من المقاطعة ، فإن الميكرو سيجدها ما زالت صفر و من ثم بالخطأ يظنها مقاطعة جديدة، أما لو كانت 1 فهذا يعنى أن الاستجابة تحدث نتيجة الانتقال من واحد للصفر و لن تتكرر مرة أخرى حتى تعود الحالة للواحد مرة أخرى ثم تنتقل للصفر و كثيرا ما يكون هذا أسلم .
و أخيرا باللون الأزرق ذات الخاصيتين لكن للطرف INT0 و بهذا نحتاج لوضع IT0=1 بالأمر
SETB IT0

وهكذا اكتملت الدائرة و أصبحت كما يلى

برجاء ملاحظة أن هذا للتعليم ولكن واقعيا يجب إضافة مكثف من 0.01uF إلى 0.1uF على طرفى كل مفتاح لتجنب الارتداد و الاهتزاز Bouncing و ضمان عدم تكرار النبضة كما أن كل طراز له حساسات مختلفة عن ما اقترحته هنا و أيضا الدورات ستختلف لذا يمكنك تعديل أى برنامج حسب الواقع.
الآن نبدأ بالبرمجة بالأسيمبلى و حتى ذلك الحين نفكر كيف نهيكله ، مثلا يقرأ المفاتيح حتى يقرأ Start ثم يبدأ ملئ المياه حتى يقفل المفتاح ثم يبدأ التسخين حتى الحساس المعنى ثم تدور 5 أو 12 أو 20 دقيقة غسيل ثم صرف حتى الحساس ثم ملئ مرة أخرى للشطف ثم دوران دقيقتين ثم صرف ثم ملئ و شطف دقيقتين أخرتين ثم دورة العصر خمسة دقائق ثم التوقف

حسنا هذا المرة القادمة إن شاء الله

اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )

ماجد عباس محمد
:: نائب المشرف العام
::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 11,652
نشاط [ ماجد عباس محمد ]
قوة السمعة:
قديم 28-06-2018, 09:26 AM المشاركة 51   
افتراضي برنامج الغسالة بالأسيمبلى



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

$NOMOD51
$INCLUDE (80C52.MCU)
;=====================================
; DEFINITIONS
;=====================================
LEDs		Equ	P0
Relays		equ	P1
Switches	equ	P2
Controls	Equ	P3
FullLED	Equ	LEDs.0
HalfLED	Equ	LEDS.1
SmallLED	Equ	LEDs.2
HOTLED	Equ	LEDs.3
MildLED	Equ	LEDs.4
ColdLED	Equ	LEDs.5
WaterOn	Equ	Relays.0
DrainOn	Equ	Relays.1
HeaterOn	Equ	Relays.2
MotorOn	Equ	Relays.3
Run_Nspin	Equ	Relays.4
WaterFull	Equ	Relays.5
WaterEmpty	Equ	Relays.6
DoorOpen	Equ	Relays.7
MidTemp	Equ	Switches.0
HiTemp	Equ	Switches.1
Cold		Equ	Switches.2
Mild		Equ	Switches.3
Hot		Equ	Switches.4
Small		Equ	Switches.5
Half		Equ	Switches.6
Full		Equ	Switches.7
RUN		Equ	Controls.1
;=====================================
; VARIABLES
;=====================================
Seconds	Equ	R7
Minutes	Equ	R6
JobPending	Equ	F0
;=====================================
; RESET and INTERRUPT VECTORS
;=====================================   
   org   0000h		 ; Reset Vector
     sjmp   Start
   org	0003h 		; Adress of INT0 (IE0)Emergency  	
	 sjmp Start		; Reset All Parameters and Ports
   org	000Bh		; Adress of Interrupt Timer 0 (TF0)
	 DJNZ	Seconds,Tfinish
		MOV	seconds,#59
		Djnz	Minutes,Tfinish
			CLR	Jobpending
			CLR	TR0		; Stop counter
Tfinish: RETI
بعد التعريفات يأتى دور المتغيرات و نعرف أنها إما تكون اسم لخانة فى الذاكرة أو لو أمكن يكون مسجل لكونه أسرع. نذكر أن فى أتميل مجموعة مسجلات منها ثمانية يسهل التعامل معهم ولبعضهم ميزات إضافية وهى تعرف باسم R0:R7 لذلك سنعرف أحدهما باسم الدقائق و آخر باسم الثوانى هما R7,R6 و نحتاج لعلم Flag يشير أن الزمن لم ينتهى بعد.
أعلم أنك ستقول سينتهى عندما كل من R7,R6 أو بمسمياتهم Minuted,Seconds يساويان صفر
أجل لكن لتعلم ذلك يجب أن تختبرهما على التوالى كل مرة تريد فيها التحقق من انتهاء الزمن وهذا ما يسمى برمجة غير احترافية لإضاعتهما كود و زمن و أنت أصلا لا تحتاج لذلك
لا تنسى أن كل مقاطعة وظيفتها أن تنقص الثوانى و تنقص الدقائق حتى تتساوى بالصفر أى أنك بالفعل حسبت هذا الأمر وما عليك سوى حفظ النتيجة ، هنا نستخدم البت F0 السابق شرحها فى PSW و المسماة User Flag فتجعلها =1 ثم تبدأ العد و عند تمامه اجعلها = صفر و بالتالى كل ما عليك أن تختبرها فقط بتعليمه صغيرة و بسيطة لتعلم إن كان الزمن قد تم أم لا.

بعد ذلك يأتى البدء و المقاطعة، سنجد فى خانة صفر حيث الريسيت قفزة لعنوان Start حيث بدء البرنامج الفعلى
يليها فى العنوان 3 حيث عنوان مقاطعة الطرف الخارجى INT0 وهى الطوارئ و هنا يجب الإيقاف و العودة حيث بدأنا لذلك نستخدم القفز إلى Start أيضا كما لو أننى أطفأت الوحدة ثم أعدت تشغيلها مرة أخرى
و أخيرا فى عنوان B وهو =12 حيث مقاطعة العداد ألذى يستقبل 50 هرتز من الخارج و بعد 50 عد أى كل ثانية سيحدث مقاطعة. هنا سننقص الثوانى 1 فإن بقى ثوانى نعود من المقاطعة و إلا لو أصبحت صفرا ننقص الدقائق 1 فإن لم تكن صفرا نعيد الثوانى إلى 59 و نبدأ الدورة من جديد أى نعود من المقاطعة وهكذا حتى تنتهى الدقائق وتصبح صفرا نوقف العداد و نعلن انتهاء الزمن بتصفير العلم Jobpending و نخرج من المقاطعة.
لاحظ هنا أن آخر دقيقة لم تحول لثوانى و بالتالى لم تحسب لذا عند البدء مثلا بخمس دقائق نضع 5 دقائق و 59 ثانية.
المرة القادمة إن شاء الله نكمل باقى البرنامج .


ماجد عباس محمد
:: نائب المشرف العام
::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 11,652
نشاط [ ماجد عباس محمد ]
قوة السمعة:
قديم 29-06-2018, 10:59 AM المشاركة 52   
افتراضي تجهيز الغسالة و اعداد الخيارات



تجهيز الغسالة :
بعد أن مهدنا للمقاطعة و البدء الخ نبدأ البرنامج طبقا للهيكلة السابقة فمثلا نقول بعد أن نختار الكمية و الحرارة ، لو الباب مغلق نبدأ ملئ الخزان و عند تمامه نشغل السخان طبقا للحرارة
ما بين عنوان البدء و عنوان الدورة "التكرارى" نجد ما يسمى التمهيد أوHouse Keeping أو حرفيا ترتيب المنزل
السطر الأول إتاحة كل المقاطعات و مقاطعة T0 ومقاطعة الخارجى INT0
الثانى و الثالث تحميل كل من نصفى المسجل T0 بالقيمة المطلوبة و الرابع تهيئه T0 كعداد ذاتى التحميل بعدها جعل المقاطعة الخارجية قدح بالحافة Edge Trigger ثم تغيير مؤشر الرصة بعيدا ثم وضع المنافذ الأربع فى حال البداية رغم أنها كذلك إلا أن هنا ضرورة لحالة الطوارئ فهى لن تعيد المنافذ لحال البدء لذا تفرض بالبرنامج تحسبا.
لو حدث طارئ و ضغطت على زر الطوارئ ستجبر المتحكم على البدء من جديد و سينهى التهيئة و الوصول هنا و ينتقل عبره لدورة تشغيل الموتور قبل أن تتمكن من رفع إصبعك من على زر البدء لذا وجب الانتظار هنا حتى ترفع يدك عنه لذا نختبر لو البت Run = 0 سنظل فى دوره وذلك بالأمر JNB اختصار Jump if Not Bit set ثم اسم البت Run و العنوان المقصود الذهاب إليه و علامة الدولار هى رمز مختصر لكلمة "هنا" بدلا من و ضع عنوان أول السطر و كتابته مرة أخرى فى الأمر هكذا
Here: JNB Run,Here
هكذا سنظل ندور هنا طالما زرار RUN=0 ثم بعده نختبر الخيارات

كود:
 
;=====================================
; CODE SEGMENT
;=====================================
Start:	
	MOV	IE,#10000011b		; Enable T0 & INT0 external
	MOV	TH0,#205		; Auto reload
	MOV	TL0,#205
	MOV	TMOD,#00000110b		; T0 8bit counter auto reload
	MOV	TCON,#1		; Clear All interrupts,
 	SETB	IT0 			;Edge triggered
	MOV	SP,#70			; Move stack away
	MOV	LEDs,#11011011b		; Reset All PORTS! select Small cold cycle
	MOV	Relays,#255
	MOV	Switches,#255
	MOV	Controls,#255		
 	JNB	RUN,$				; Run button release
	JB		Full,TstHalf
Loop:	
		ORL	LEDs,#00000111b
		CLR	FullLED
TstHalf: 	JB	Half,TSTSmall
		ORL	LEDs,#00000111b
		CLR	HalfLED
TSTSmall:	JB	Small,TstHot
		ORL	LEDs,#00000111b
		CLR	SmallLED
TstHot:	JB	Hot,TstMild
		ORL	LEDs,#00111000b
		CLR	HotLED
TstMild:	JB	Mild,TstCold
		ORL	LEDs,#00111000b
		CLR	MildLED
TstCold:	JB	Cold,TstStart
		ORL	LEDs,#00111000b
		CLR	ColdLED
TstStart:


بعد ذلك نجد العنوان Loop التكرارى
الخيار الافتراضى هنا Small Cold بعد ذلك نفحص أى الأزرار تضغط فإن لم يكن Full ننتقل للتالى و إلا نضيء ألليد الخاص بالكمية Full بجعل طرفه = صفر ولو أردنا السرعة نضع أمر انتقال sjmp TstHot حتى لا نضيع وقت فى اختبار الحالتين التاليتين و للكود الأقل نكتفى بما لدينا
أود هنا أن أوضح أساسا من أساسيات البرمجة وهى السرعة مقابل الكود، من المنطقى أن يكون الكود الأكثر أبطا فى التنفيذ لكن غالبا ما يكون الكود الأطول أسرع فى التنفيذ وهذا مثال على ذلك فإضافة أوامر انتقال يضيف كود ليختصر تنفيذ ما لا يجدى تنفيذه.
بعد ذلك نختبر Half و ننتقل لو لم يضغط لاختبار Small و إلا نضيء HalfLED ، ولكى نضئ واحد يجب أن نطفئ أى ليد آخر قد يكون مضاء و لكنا لا نعلم ما هو ، لذا نطفئ الكل بأمر
ORL LEDs,#00000111b
حيث ORL اختصار OR Logic وهى تنفيذ وظيفة OR أى وظيفة "أو" على مستوى البت. تسمى Logic لأن هناك فى بعض المترجمات للغات العالية تستخدم دوال على مستوى المتغير تسمى Boolean OR حيث يعتبر أى رقم هو موجود أو = منطق واحد أو حقيقى أو TRUE و الصفر فقط هو منطق صفر أو False أو غير موجود وهو يعطى نتائج مختلفة فمثلا متمم complement أى رقم هو صفر بينما متمم الصفر هو FF أو 255 و مترجمات C51 لا تدعمه .
تنفيذ الأمر السابق يفرض 111 فى البيتات الثلاث الأقل فيطفئ الليدات الثلاث معا ثم أمر CLR لإضاءة ما نريد
بعد ذلك نكرر العمل مع البتات الثلاث الأخريات لاختيار الحرارة ساخن أو دافئ أو بارد مع ملاحظة أن أمر ORL الآن مع البيتات الثلاث .
المرة القادمة إن شاء الله نختبر هل نبدأ أم نكرر ما سبق


التعديل الأخير تم بواسطة : ماجد عباس محمد بتاريخ 29-06-2018 الساعة 08:25 PM

ماجد عباس محمد
:: نائب المشرف العام
::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 11,652
نشاط [ ماجد عباس محمد ]
قوة السمعة:
قديم 30-06-2018, 09:33 AM المشاركة 53   
افتراضي التشغيل و الإيقاف



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

كود:
TstStart:
	JB	run,Loop		; Wait Run Press
	JB	DoorOpen,$		; Wait Door to close
	CLR	WaterOn		; Fill with water
	JB	WaterFull,$		; Wait full Tank
	SETB	WaterON		; Close water Valve
	JNB	ColdLED,SetCycle	; Cold cycle No Heat needed
	CLR	HeaterON		; Turn Heater ON
	JNB	MildLED,HOTTemp
		JB	HiTemp,$	; wait Hot sensor
		SJMP	SetCycle	
HOTTemp:	
	JB	MidTemp,$		; wait Warm sensor
SetCycle:				; Now Start Washing
	SETB	HeaterON		; Turn off heater
	JNB	FullLED,HalfCycle
	MOV	Minutes,#20
	SJMP	RunMotor
HalfCycle:	JNB	HalfLED,SmallCycle
		MOV	Minutes,#8
    	SJMP	RunMotor
SmallCycle:
	MOV	Minutes,#5
RunMotor:
الآن انتقلنا لتحديد الزمن، فنغلق السخان و من الجيد أن نغلقه هنا فالبعض يكرر أمر الإغلاق فى الحالات الثلاث السابقة وهو تكرار مستهلك للذاكرة لا داعى له.
نختبر Full فإن كانت مختارة نضع فى الدقائق 20 دقيقة و ننتقل لتشغيل الموتور و إلا نختبر Half
هيه، ذكرت أنك تحتاج تضع 59 فى الثوانى!! أجل ذاكرة جيدة ، لكنك لم تقرأ السطر قبل السابق! و لم تتعلم الدرس!
نختبر Half و فإن كانت مختارة نضع فى الدقائق 8 دقائق و ننتقل لتشغيل الموتور و كما سبق و قلنا هو الاحتمال الأخير الباقى أن نضع 5 دقائق و الانتقال هنا أيضا حتمى بتتابع الأحداث.
المرة القادمة إن شاء الله سنتحدث عن تشغيل الموتور فى دورة الغسيل ثم دورتين للشطف و ثالثة للعصير و التوقف بانتظار تحديد دورة أخرى أو تكرار هذه الدورة.


ماجد عباس محمد
:: نائب المشرف العام
::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 11,652
نشاط [ ماجد عباس محمد ]
قوة السمعة:
قديم 01-07-2018, 09:06 AM المشاركة 54   
افتراضي دورات الغسيل و الشطف و العصر ثم الإيقاف



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


كود:
RunMotor:
	MOV	Seconds,#59
	SETB	JobPending
	CLR	MotorOn
	SETB	TR0				; Start Timer/Counter
		JB	JobPending,$		; Wait to Finish
	SETB	MotorON			; stop motor
	CLR	DrainON			; Open Drain
	JB	WaterEmpty,$			; Wait Drain
	Setb	DrainON			; Close Drain
	CLR	WaterON			; Fill again
	JB	WaterFull,$
	SETB	WaterON			; Close Water
	MOV	Minutes,#5			; 1St Rinse
	MOV	Seconds,#59
	SETB	JobPending
	CLR	MotorOn			; Start Rinse
	SETB	TR0				; Start Timer
		JB	JobPending,$		; Wait to Finish
	Setb	MotorOn			; Stop Rinse

	CLR	DrainON			; Open Drain second cycle
	JB	WaterEmpty,$	;Wait Drain
	Setb	DrainON			; Close Drain
	CLR	WaterON			; Fill again
	JB	WaterFull,$
	SETB	WaterON			; Close Water
	MOV	Minutes,#5			; 2nd Rinse
	MOV	Seconds,#59
	SETB	JobPending
	SETB	TR0				; Start Timer/Counter
	CLR	MotorOn			; Start Rinse
	SETB	TR0				; Start Timer
		JB	JobPending,$		; Wait to Finish
	Setb	MotorOn			; Stop Rinse	
	CLR	DrainON			; Open Drain second cycle
	JB	WaterEmpty,$	;Wait Drain
	MOV	Minutes,#3		; SPIN
	MOV	Seconds,#59
	SETB	JobPending
	CLR	MotorOn			; Start Rinse
	CLR	Run_Nspin		; SPIN
	SETB	TR0				; Start Timer/Counter
		JB	JobPending,$	; Wait to Finish
;	SETB	Run_NSpin
;	SETB	MotorON			; Stop Motor
;	Setb	DrainON			; Close DRAIN
	MOV	Relays,#255			; ALL OFF, INITIAL State
	MOV	Controls,#255	
	jmp Loop
;====================================
      END
ثم نصرف المياه و نكرر الشطف مرة ثانية ثم نتوقف وبعد الصرف نضع 3 دقائق لدورة العصر و نبدأ كما سبق مع تفعيل طرف RUN_NSPIN للسرعة العالية ثم نتوقف.
الآن قبل أن نعود للدورة نحتاج للتأكد من أن الموتور مغلق و العودة للسرعة العادية و الصرف مغلق بالثلاث أوامر المذكورة ولكنها موضوعة بصورة تعليق لأن استخدام أمرين فقط كما هو مبين كافى لإعادة الوضع كاملا للتوقف.

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

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


الصورة الرمزية عبدالله حجازى
عبدالله حجازى
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2011
الدولة: مصر .. محافظة دمياط
المشاركات: 1,682
نشاط [ عبدالله حجازى ]
قوة السمعة:
قديم 02-07-2018, 05:10 AM المشاركة 55   
افتراضي السلام عليكم ورحمه الله


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


ماجد عباس محمد
:: نائب المشرف العام
::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 11,652
نشاط [ ماجد عباس محمد ]
قوة السمعة:
قديم 02-07-2018, 08:58 AM المشاركة 56   
افتراضي


شكرا أخى الكريم
أسعدنى تعليقكم الطيب
اللهم آمين



الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 04:29 PM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)