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

مشاهدة نتائج الإستفتاء: هل ترى أنه من الأفضل عمل قسم جديد في المنتدى للغات الحديثة مثل لغة MikroC ؟؟
نعم 53 92.98%
لا 4 7.02%
المصوتون: 57. أنت لم تصوت في هذا الإستفتاء

   

الصورة الرمزية ahmad72
ahmad72
:: عضو ذهبي ::
تاريخ التسجيل: Aug 2004
المشاركات: 723
نشاط [ ahmad72 ]
قوة السمعة:
قديم 20-02-2009, 08:01 PM المشاركة 65   
sun



السلام عليكم ورحمه الله
استاذى الفاضل
ارجو ان تقول لى قولا لا اسال عنه مره اخرى
وهو الاقواس
كيف احدد ان كان هذا الكود داخل قوس عادى واو قوس مجموعه او بدون اقواس
ممكن يكون السوال تافه لاكن بالنسبه لى مشكله مش قلدر افهمه كوبس وخصوصا انى مبتدا فى هذا المجال
شكرا على سعه صدركم
وارجو ان تضع اى اسئله سريعه حتى نعلم مدى استيعابنا للمحاضره الاخيره لانها مهمه جدا وان اعلم انك ذكرت ان الحصه القادمه ستكون اسئله فلو تكرمت حتى سوالين فقط لحين الحصه القادمه لو سمحتم
شكرا
السلام عليكم


التعديل الأخير تم بواسطة : ahmad72 بتاريخ 20-02-2009 الساعة 08:10 PM
اعلانات

ahmedfarghaly
:: عضو ماسي ::
تاريخ التسجيل: Jul 2006
الدولة: مصر
المشاركات: 1,160
نشاط [ ahmedfarghaly ]
قوة السمعة:
قديم 20-02-2009, 09:46 PM المشاركة 66   
Smile


الدورة في ملف word
360 ك

للتصفح offline

مفيد لمن ليس لديه dsl


حمل من هنا

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

geniusse01
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2008
الدولة: Jordan - Amman
المشاركات: 1,134
نشاط [ geniusse01 ]
قوة السمعة:
قديم 20-02-2009, 09:59 PM المشاركة 67   
افتراضي


السلام عليكم

اريد ان اقول جزاك الله كل خير اخي احمد ووفقك لما يحبه ويرضاه..جزاك الله خيرا اخي ahmedfarghaly على الملف ..وان شاء الله يجعله ربنا في ميزان حسناتكم جميعا...

بالنسبة لسؤالك اخي احمد72 فان الاقواس ذات الشكل التالي { } تستخدم من اجل ان نضع البرنامج الكامل فيها كما اخذنا في شرح الاستاذ احمد هذا اولا..اما ثانيا وهو ما يسبب لنا الارتباك..فهو يستخدم عنما نطلب من البرنامج ان ينفذ مجموعة تعليمات ككتلة واحد مثل الامر for الذي شرحه اخونا احمد في الدرس الاخير فحتى نطلب من الامر ان يكرر مجموعة تعليمات نستخدم هذه الاقواس ليفهم انها باعتبار كتلة واحد ويجب ان تنفذ معا...

اما الاقواس ( ) فهي تستخدم في بداية البرنامج ايضا بعد void main..وايضا تستخدم لاحتواء الشرط مثلا (ΙF(x<10 او كما في (++ for (x=0;x<10;x

..اما عدم استخدام الاقواس فتستخدم عندما يكون عندنا شرط معين IF,,WHILE,for وعند تحقق الشرط لا يوجد بعده الا تعليمة واحدة فقط (اي ليس هناك مجموعة تعليمات لتنفيذها بل هي تعليمة واحدة فقط...

اخي حيدر

ان ما عملته في الملف المرفق صحيح ولا غبار عليه.ولكن ينقص هناك شي.في ملفات البروتوس هناك ملف patch كما في الشكل:



قم بوضعه في الملف الاساسي للبرنامج وقم بتشغيله..فتظهر نافذة صغيرة فيها كلمة Patch اضغط عليها..يعطيك الصورة التالية:



والتي تقول بانه لم يجد الملف..هل يبحث عنه؟طبعا توافق على ذلك..فيفتح صفحة جديدة ويطلب تحديد مكان ملف معين ..فقم بتحديد الملف المطلوب (حيث ستجده في احدى الملفات التالية داخل الملف الرئيسي للبرنامج اما الملف ΒIN or MODELS)...طبعا سيطل منك تحديد اكثر من ملف وانت ستقوم بتحديدها كاملة كما في الشكلين التاليين:





وبعد ذلك ان شاء الله سيعمل معك البرنامج ..ربنا يوفقكم جميعا لما يحبه ويرضاه...


لمن يريد تحميل الباتش فهو موجود على الرابط التالي :

http://arabsh.com/753olx9doi2o.html

وقد قمت باخذه من المشاركة رقم 112 للاخ الحبيب ahmedfarghaly وهي بعد هذه المشاركة بمشاركتين..ولان الكثير لا ينتبهون لها فقررت ان اضعها هنا وجزى الله اخانا احمد خيرا لتحميل الباتش على النت ووضعه لكل من يحتاجه..


واخر دعوانا ان الحمدلله رب العالمين..وصلى الله على سيدنا محمد وعلى اله وصحبه وسلم..


التعديل الأخير تم بواسطة : geniusse01 بتاريخ 19-03-2009 الساعة 09:40 PM

الصورة الرمزية ahmad_s_f
ahmad_s_f
:: المهندس/ أحمد سمير فايد ::
تاريخ التسجيل: Jun 2006
الدولة: سائح في ارض الله
المشاركات: 632
نشاط [ ahmad_s_f ]
قوة السمعة:
قديم 22-02-2009, 04:28 PM المشاركة 68   
افتراضي


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

===============================================

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

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

وسأقوم الآن بمراجعة سريعة على بعض الأشياء المهمة في الدرس السابق والتي يجب أن تعرفها جيدا لتكمل مسيرتك في احتراف برمجة البك إن شاء الله ..

أولا :: عندما نريد من البك تكرار تنفيذ مجموعة من الأوامر فإنه يجب علينا استخدام أمر يسمى for (أو جملة for ) .. فعلى سبيل المثال
كما تعلم لو أردنا أن نجعل البك يضيء الليد الموصل بالرجل b0 ثم يطفئه فإننا سنكتب الكود التالي .
كود:
void main() { TRISB=0; PORTB=0XFF; delay_ms(1000); PORTB=0; delay_ms(1000); }
في الكود السابق .. سيضيء الليد الموصل بالرجل b0 ثم ينتظر البك لمدة ثانية ثم يطفئ الليد ثم ينتطر لمدة ثانية .
ولكن ماذا نفعل إذا أردنا أن نجعل البرنامج السابق يتكرر تنفيذه خمسة عشر مرة أي أن عدد المرات التي سيضيء فيها الليد ثم ينطفئ هي خمسة عشر مرة .. في هذه الحالة لابد من استخدام أمر يقوم بعملية التكرار هذه .. وهذا الأمر كما ذكرت هو for أو ما يسمى بجملة for .. ولكن كيف نستخدم جملة for لتكرار تنفيذ مجموعة من الأوامر عدد معين من المرات (وليكن 60 مرة ) .. ببساطة سنكتب الكود التالي
كود:
for(m=0;m<60;m++) { هنا نكتب الأوامر التي نريد تكرار تنفيذها 60 مرة }
كلام جميل ... ولكن ماذا لو أردت أن أغير هذا العدد .. أي أجعل البك يكرر تنفيذ مجموعة من الأوامر وليكن 19 مرة .. (ببساطة غير الرقم 60 واجعله 19 كما يلي )
كود:
for(m=0;m<19;m++) { هنا نكتب الأوامر التي نريد تكرار تنفيذها 19 مرة }
ولكن قبل هذا لا بد أن أكتب في بداية البرنامج الأمر التالي
كود:
char m;
ولكن ماذا نعني بهذا الأمر char m ؟؟؟ هذا الأمر نسميه تعريف المتغير ... متغير؟؟ نعم ,, المتغير هذا هو مكان نحجزه في الذاكرة (ذاكرة البك) فائدته أننا نستخدمه في الكثير من العمليات و أيضا نستخدمه في تخزين قيمة معينة ...
بمعنى أننا الآن حجزنا مكان في الذاكرة (واخترنا له اسم هو m ) هذا المكان يمكننا أن نضع فيه قيمة معينة ( 5 مثلا .. أو 18 أو 3 أو ... أي قيمة) كما يمكننا أن نغير هذه القيمة فمثلا لو كانت صفر يمكننا أن نجعلها بعد مدة بواحد أو بأي قيمة أخرى ... بما أننا نستطيع تغيير قيمته لذلك نطلق عليه اسم متغير ..

ولكن ما فائدة هذا المتغير في جملة for ؟؟
فائدته سنعرفها عندما نعرف كيف تعمل جملة for وهذا ما سأشرحه بعد قليل ..

والآن لنكتب الكود الذي سيجعل الليد يضيء وينطفئ 15 مرة .
كود:
void main() { char x; TRISB=0; for(x=0;x<15;x++) { PORTB=0XFF; delay_ms(1000); PORTB=0; delay_ms(1000); } }
كيف تعمل جملة for ؟؟؟
لنعرف كيف تعمل جملة for سنطرح هذا المثال ونرى كيف تعمل جملة for
كود:
for(ze=0;ze<60;ze++) { delay_ms(1000); }
قبل أن أشرح كيف ستعمل لابد أنك استنتجت من خلال الكود السابق أن الأمر
كود:
delay_ms(1000);
ستم تكرار تنفيذه 60 مرة أي أن البك سينتظر لمدة 60 ثانية . ولكن كيف سيحدث ذلك .. الآن أنت تعرف أننا سنستخدم في جملة for هذه متغير اسمه ze هذا المتغير كما قلنا أنه مكان يحجز في الذاكرة نضع فيه قيمة معينة ويمكننا تغيير هذه القيمة ... كلام جميل ... الآن كيف ستعمل جملة for ؟؟ ستلاحظ وجود قوسي مجموعة { } بعد جملة for ما بين هذين القوسين سيتم تكرارهم 60 مرة بالطريقة التالية
أولا سيضع البك في المتغير ze قيمة هي صفر ثم ينفذ الأوامر التي بين القوسين الخاصين بجملة for وبعد ذلك سيغير القيمة صفر ويجعلها بواحد أي أن
ze=1
ثم ينفذ الأوامر التي بين القوسين ثم يغير البك القيمة واحد ويجعلها 2 أي أن
ze=2
ثم ينفذ الأوامر التي بين القوسين ثم يغير البك القيمة اثنين ويجعلها 3 أي أن
ze=3
.................
...............
وهكذا .. إلى أن تصبح قيمة ze=59 فينفذ البك الأوامر التي بين القوسين وحينها لن يجعل البك قيمة ze=60 لان شرط التكرار يخبرنا أن ze<60 ...

==============================================
علمنا أننا نستطيع تعريف متغير معين وليكن اسمه nn بكتابة الكود التالي في بداية البرنامج
كود:
char nn;
علمنا أن nn هذه هو اسم المتغير (حيث يمكننا أن نختار أي اسم )
ولكن ماذا تعني char هذه ؟؟ إنها تعني أن المتغير الذي حجزناه في الذاكرة يتكون من 8 بت ..
وهذا يعني أن هذا المتغير يمكن أن تكون قيمته صفر أو واحد أو 2 أو 3 .... أو 255 ولا يمكن أن تزيد قيمته عن 255 ... لماذا ؟؟ لأنه يتكون من 8 بت والبت bit هذا إما أن يكون واحد أو صفر ( بالنظام الثنائي ) ومن المعلوم أن أكبر رقم يمكن الحصول عليه من 8 بت بالنظام الثنائي هو 11111111 وهو يساوي 255 بالنظام العشري ... (راجع الأنظمة الرقمية الثنائي والعشري والسادس عشري .. وابحث عنها إذا لم تكن تعرفها جيدا..؟؟)

مما سبق يتضح أننا لو أردنا أن نعرف متغير هذا المتغير قيمته من 0 - 255 فإننا نستخدم النوع char ..
وهذا يعني أننا لو استخدمنا جملة for وكان عدد مرات التكرار هو 255 أو أقل فإننا في بداية البرنامج سنعرف متغير هذا المتغير من النوع char ..
ولكن ماذا لو أردنا أن نكرر تنفيذ مجموعة من الأوامر ألف مرة مثلا ... في هذه الحالة لا نستطيع استخدام char وسنستخدم بدلا منه نوع آخر اسمه int . هذا النوع يتكون من 16 بت (وبهذا يمكن أن تكون قيمة هذا المتغير من 0 إلى 65535 )
كلام جميل ... هيا بنا الآن نكتب كود يقوم بتكرار تنفيذ مجموعة من الأوامر ألف مرة
كود:
void main() { int x; for(x=0;x<1000;x++) { هنا نكتب الأوامر التي ستتكرر ألف مرة } }
وسنشرح المتغيرات بإستزادة أكثر في دروس قادمة إن شاء الله ..

ملحوظة :: لقد قمت بإعادة شرح جملة for استجابة لطلب أحد الأعضاء

===============================================
( تطبيقات )

التطبيق الأول - اكتب برنامج يقوم بإضاءة الليد الموصل بـ b5 ثم يطفئه ثلاثة وعشرون مرة .
كود:
void main() {char R; trisb=0; for(R=0;R<23;R++) { portb.f5=0; delay_ms(1000); portb.f5=1; delay_ms(1000); } }
ملحوظة :: كان يمكن أن نكتب البرنامج السابق بالشكل التالي ::

كود:
void main() {char R; trisb=0; for(R=0;R<23;R++) { portb=0b00100000; delay_ms(1000); portb=0b00000000; delay_ms(1000); } }
==============================================
التطبيق الثاني :: اكتب برنامج يضيء الليد الموصل بـ b7ثم يطفيه ( عشر مرات) ثم بعد ذلك يضي الليد الموصل بـ b3 ( خمس مرات ) .

في هذا البرنامج نحتاج أن نكرر الأوامر التالية عشر مرات
كود:
portb.f7=1; delay_ms(1000); portb.f7=0; delay_ms(1000);
وبعد تنفيذ الأوامر السابقة نحتاج أن نكرر الأوامر التالية خمس مرات
كود:
portb.f3=1; delay_ms(1000); portb.f3=0; delay_ms(1000);
ولهذا سنحتاج (سنستخدم) جملتي for وبالتالي سيكون الشكل النهائي للبرنامج كما يلي ..
كود:
void main() { char trisb=0; for(x=0;x<10;x++) { portb.f7=1; delay_ms(1000); portb.f7=0; delay_ms(1000); } for(x=0;x<5;x++) { portb.f3=1; delay_ms(1000); portb.f3=0; delay_ms(1000); } }
================================================
التطبيق الثالث : اكتب برنامج يضيء جميع الليدات الموصلة من b0 إلى b6 ثم يطفئهم (ويكرر هذه العملية 13 مرة ) وبعد ذلك يضيء الليد b7 ..

طبعا سنستخدم جملة for من أجل عملية التكرار وبعد جملة for سنكتب الأمر الذي يجعل البك يضيء الليد الموصل بـ b7 طبعا هذا الأمر خارج جملة for لأنه لن يتم تكراره وسنكتبه بعد جملة for لأنه من المفترض أن يضيء هذا الليد بعد تنفيذ عملية التكرار ..
كود:
void main() { char x; TRISB=0; for(x=0;x<13;x++) { portb=0b011111111; delay_ms(1000); portb=0; delay_ms(1000); } portb.f7=1; }
================================================
التطبيق الرابع :: صمم دائرة باستخدام المايكروكنترولر تحتوي على سويتشين وعلى ليد led وعند الضغط على السويتش الأول يضيء الليد ثم ينتظر البك لمدة ثانية ثم ينطفئ الليد ... وعند الضغط على السويتش الثاني يضيء الليد ثم ينتظر البك لمدة ثلاث ثواني ثم ينطفئ الليد .

الحل : سنوصل السويتشين (المفتاحين) بالرجل رقم a0 والرجل رقم a1 . وسنوصل الليد بالرجل رقم b0 . وهنا نحتاج لجملة if تقوم باختبار السوتش الأول وجملة if أخرى تقوم باختبار السويتش الثاني .
إذن سنكتب الأوامر بالشكل التالي ::
كود:
if(porta.f0==0) { هنا نكتب الأوامر التي سينفذها البك في حالة الضغط على السويتش الأول } if(pora.f1==0) { هنا نكتب الأوامر التي سينفذها البك في حالة الضغط على السويتش الثاني }
إذن في حالة الضغط على السويتش الأول من المفترض أن ينفذ البك الأوامر التالية
كود:
portb.f0=1; delay_ms(1000); portb.f0=0; delay_ms(1000);
وعند الضغط على السويتش الثاني من المفترض أن ينفذ البك الأوامر التالية
كود:
portb.f0=1; delay_ms(3000); portb.f0=0; delay_ms(5000);
طبعا كما أخبرتك سابقا لابد أن تكون عملية الاختبار هذه باستمرار وليست مرة واحدة أي يجب أن أجعل البك يختبر السويتشات باستمرار .

وبهذا يكون الشكل النهائي للبرنامج كما يلي ::
كود:
void main() { trisb=0; trisa=0xff; loop: if(porta.f0==0) { portb.f0=1; delay_ms(1000); portb.f0=0; delay_ms(1000); } if(porta.f1==1) { portb.f0=1; delay_ms(3000); portb.f0=0; delay_ms(5000); } goto loop; }

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


التعديل الأخير تم بواسطة : ahmad_s_f بتاريخ 22-02-2009 الساعة 05:07 PM

الصورة الرمزية ahmad_s_f
ahmad_s_f
:: المهندس/ أحمد سمير فايد ::
تاريخ التسجيل: Jun 2006
الدولة: سائح في ارض الله
المشاركات: 632
نشاط [ ahmad_s_f ]
قوة السمعة:
قديم 22-02-2009, 04:31 PM المشاركة 69   
افتراضي


معلومة بسيطة ومهمة


عند استخدامك لجملة for أو جملة if نكتب بعدهم قوسين بهذا الشكل { } وداخل هذين القوسين نكتب الأوامر ... فمثلا في حال استخدامنا لجملة for سنكتب بين هذين القوسين { } الأوامر التي نريد تكرارها عدد معين من المرات .

ولكن إذا كانت هذه الأوامر التي نريد تكرارها أمر واحد فقط (وليس أكثر من أمر ) ففي هذه الحالة يمكننا أن نكتب القوسين { } ونكتب داخلهم الأمر ... أو يمكننا أن نكتب الأمر مباشرة دون اللجوء إلى إستخدام هذه الأقواس .

وكذلك الحال عند استخدام جملة If فمثلا عندما يتحقق الشرط الذي بين القوسين العاديين ( ) سيتم بعد ذلك تنفيذ الأوامر التي بين قوسي المجموعة { } ففي حال أنه سينفذ عدد معين من الأوامر في حال تحقق الشرط سنكتب هذه الأوامر بين القوسين { } وفي حال أنه سينفذ أمر واحد فقط عند تحقق الشرط فإننا نستطيع أن نكتب هذا الأمر داخل القوسين { } أو نكتبه مباشرة دون هذين القوسين { } .

==============================================
متى نستخدم القوسين ( ) ومتى نستخدم القوسين { } ??
أولا نستخدم القوسين العاديين ( ) في الحالات التالية :-
1- في بداية البرنامج في الأمر التالي
كود:
void main()
2- عند استخدامنا لجملة for حيث نكتب القيمة الابتدائية للمتغير وشرط التكرار كمافي الأمر التالي .
كود:
for(x=0;x<19;x++)
3- عند استخدامنا لجملة if حيث نكتب الشرط بين هذين القوسين ( ) كما في المثال التالي :
كود:
if(porta.f0==0) portb.f0=1;
4- عند استخدامنا للأمر الذي يجعل البك ينتظر كما في المثال التالي
كود:
delay_ms(1000);
5- عندما نريد أن ينفذ البك مجموعة من الأوامر باستمرار باستخدام الأمر while إلى الأبد كما في المثال التالي .
كود:
while(1)
كما يوجد حالات أخرى ولكن سنتعرف عليها فيما بعد إن شاء الله

---------------------------------------------------------------------

ثانيا : نستخدم قوسي المجموعة { } في الحالات التالية :
1- في بداية البرنامج أي بداية الكود بعد كتابة( ) void main كما في المثال التالي
كود:
void main() { هنا نكتب البرنامج }
2- بعد جملة for حيث نكتب بين القوسين { } الأوامر التي نريد تكرارها . كما يلي
كود:
for (ah=0;ah<30;ah++) { هنا نكتب الأوامر التي نريد تكرارها 30 مرة }
3- بعد جملة if حيث نكتب بين القوسين { } الأوامر التي نريد تنفيذها في حال تحقق الشرط . كما في المثال التالي
كود:
if(pora.f2==0) { هنا نكتب الأوامر التي نريد تنفيذها في حال تحقق الشرط . }
4- عندما نريد أن نكرر تنفيذ مجموعة من الأوامر باستمرار باستخدام while كما يلي
كود:
while(1) { هنا نكتب الأوامر التي نريد تكرار تنفيذها باستمرار }
=============================================
والآن هيا بنا لنتعرف على أمر جديد من أوامر اللغة وهو while حيث سنتعرف عليه أكثر ونفهمه بشكل أفضل .

هل تذكر وظيفة جملة if .. ؟؟؟ إنها تختبر الشرط الذي بين القوسين ( ) ثم بعد ذلك إذا تحقق هذا الشرط تنفذ الأوامر التي تلي القوسين ( ) والتي إما أن تكون أمر واحد أو عدة أوامر موجودة داخل القوسين { } ... نعم تختبر الشرط فإذا تحقق الشرط تنفذ مجموعة من الأوامر .. وبعد ذلك يتم الإنتقال إلى الأمر الذي يليها .

إن وظيفة جملة while قريبة جدا من جملة if حيث أن وظيفتها هي اختبار الشرط الذي بين القوسين ( ) فإذا تحقق الشرط يتم تنفيذ مجموعة من الأوامر ولكن بعد ذلك يتم اختبار الشرط مرة أخرى فإذا تحقق الشرط يتم تنفيذ هذه المجموعة من الأوامر مرة أخرى ثم بعد ذلك يتم اختبار الشرط فإذا تحقق يتم تنفيذ مجموعة الأوامر هذه مرة أخرى .. وهكذا أي أن الأوامر يتم تكرار تنفيذها طالما كان الشرط متحققاً .. ولكن ماذا يحدث إذا لم يتحقق الشرط بعد ذلك ؟؟ هنا يكون قد انتهى تنفيذ جملة while وينتقل البك بعد ذلك للأمر الذي يليها .

ولنوضح الأمر أكثر سأضرب لك هذين المثالين :
المثال الأول
كود:
void main() { trisb=0; portb.f0=1; if(portb.f0==1) { portb.f1=1; delay_ms(1000); portb.f1=0; delay_ms(1000); } }
المثال الثاني
كود:
void main() { trisb=0; portb.f0=1; while(portb.f0==1) { portb.f1=1; delay_ms(1000); portb.f1=0; delay_ms(1000); } }
في المثال الأول جعلت قيمة portb.f0 تساوي واحد . ثم جعلت البك يختبر هل portb.f0 يساوي واحد ( بالتأكيد نعم ) وبالتالي سينفذ البك الأوامر التي بين القوسين { } حيث سيضيء الليد الموصل بـ b1 ثم ينتظر لمدة ثانية ثم يطفئ الليد ثم ينتظر لمدة ثانية . وبهذا يكون انتهى البرنامج .

أما في المثال الثاني : فقد جعلت قيمة portb.f0 تساوي واحد أيضا . ثم جعلت البك يختبر هل portb.f0 يساوي واحد (بالتأكيد نعم ) وبالتالي سينفذ البك الأوامر التي بين القوسين { } حيث سيضيء الليد الموصل بـ b1 ثم ينتظر البك لمدة ثانية ثم يطفئ الليد ثم ينتظر لمدة ثانية ثم يختبر الشرط مرة أخرى وبما أنه لازال متحقق لأن portb.f0 يساوي واحد إذن سيكرر البك تنفيذ الأوامر مرة أخرى بأن يجعل الليد يضيء ثم ينتظر لمدة ثانية ثم ينطفئ الليد ثم ينتظر لمدة ثانية ثم يختبر الشرط مرة أخرى فيجده لازال متحققا فيعيد تنفيذ الأوامر مرة أخرى بإضاءة الليد ثم ينتظر ثانية ثم يطفئ الليد ثم ينتظر ثانية ثم يختبر الشرط مرة أخرى ... وهكذا إلى الأبد لأن الشرط مازال متحققا .

نفهم من الكلام السابق أن جملة if تختبر الشرط مرة واحدة فقط وفي حال تحقق الشرط تنفذ الأوامر مرة واحدة .وبهذا يكون البك انتهى من تنفيذ جملة If
أما جملة while تختبر الشرط وفي حال تحقق الشرط تنفذ الأوامر ثم بعد ذلك تختبر الشرط مرة أخرى فإذا تحقق الشرط تنفذ الأوامر مرة أخرى وهكذا باستمرار تكرر تنفيذ الأوامر طالما تحقق الشرط وفي حال عدم تحقق الشرط لن تنفذ الأوامر وبهذا يكون انتهى البك من تنفيذ جملة while .


(معلومة بسيطة)

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

كما أخبرتك بمجرد أن البك اختبر الشرط ولم يتحقق الشرط لن ينفذ الأوامر التي بين القوسين { } ويكون بذلك قد انتهى من تنفيذ جملة while فبعد ذلك لو تم تحقق الشرط لن ينفذ البك الأوامر لأنه انتهى من تنفيذ جملة while وانتقل لأمر آخر ..
(إذا لم تفهم المعلومة هذه جيدا فحاول فهمها مرة أخرى وإذا لم تفهمها أيضا فلا تقلق سنشرح الأمر بتفصيل أكثر فيما بعد إن شاء الله )

================================================

فكرة جميلة ورائعة

هناك فكرة جميلة يتم فيها استخدام جملة while . وسأوضح هذه الفكرة بالسؤال التالي ..
لدي ليد موصل بالرجل رقم b0 وسويتش موصل بالرجل رقم a0 أريد أن أجعل الليد يضيء بعد الضغط على السويتش ( أي أنه في حالة ضغطي على السويتش لا يضيء الليد حتى أرفع يدي من على السويتش حيث أن السويتش push button )
 معنى هذا السؤال أنني أريد البك أن ينتظر ( أي لا ينفذ أي أمر ) طالما لازلت ضاغطا على السويتش ( المفتاح ) وبعد رفع يدي من على السويتش يتم تنفيذ الأمر الذي يضيء الليد ... ولكن ماهو الأمر الذي سيجعل البك ينتظر حتى أرفع يدي من على السويتش أي ما هو الأمر الذي يأمر البك بعدم تنفيذ أي أمر طالما كنت ضاغطاً على السويتش ؟؟ هذا الأمر هو .
كود:
while(porta.f0==0) { }
كيف سيتم تنفيذ الأمر السابق ؟؟ سيختبر البك الشرط الذي بين القوسين العاديين ( ) فإذا تحقق هذا الشرط ( أي في حالة الضغط على السويتش ) سيتم تنفيذ الأوامر التي بين قوسي المجموعة { } ولكن ما هذا ؟؟؟ لا يوجد أوامر بين القوسين { } نعم لا يوجد أوامر وبالتالي لن ينفذ البك أي شيء وبعد ذلك يختبر البك الشرط مرة أخرى فإذا تحقق الشرط فهذا يعني أنني لازلت ضاغطاً على السويتش وبالتالي ينفذ البك الأوامر التي بين القوسين { } أي لن ينفذ شيء وبعد ذلك يختبر الشرط مرة أخرى فإذا تحقق الشرط (أي أنني لازلت ضاغطاً على السويتش ) فسينفذ البك الأوامر التي بين القوسين { } والتي هي لا شيء ... وهكذا إلى أن أرفع يدي من على السويتش فعندها لن يتحقق الشرط وبالتالي يكون البك انتهى من تنفيذ جملة while ..

في مثالنا هذا المطلوب هو أن ينتظر البك إلى أن أرفع يدي من على السويتش بعد ذلك يضيء الليد . أي أنه بعد الانتهاء من تنفيذ جملة while سينفذ البك الأمر الذي يلي while والذي لابد أن يكون هو الأمر الذي يضيء الليد ... كما يلي :
كود:
while(porta.f0==0) { } portb.f0=1;
.. وبالتالي يكون الشكل النهائي للبرنامج المطلوب كما يلي
كود:
void main() { trisb=0; trisa=0xff; loop: if(porta.f0==0){while(porta.f0==0){} portb.f0=1;} else portb.f0=0; goto loop; }
هنا استخدمنا جملة if لاختبار شرط معين في حال تحقق هذا الشرط أي في حال تم الضغط على السويتش سينفذ البك الأوامر التي بين القوسين الخاصين بجملة if وأول أمر في هذه الأوامر هو while والذي سيجعل البك لا يفعل أي شيء طالما لازلت ضاغطا على السويتش وعند رفعي من على السويتش يكون البك انتهى من تنفيذ الأمر while و سينفذ البك الأمر الذي يلي while وهو الأمر الذي سيضيء الليد

بعد ذلك استخدمنا else والتي تعني في حال عدم تحقق الشرط نفذ الأمر التالي وهو الأمر الذي سيطفئ الليد .


التعديل الأخير تم بواسطة : ahmad_s_f بتاريخ 24-02-2009 الساعة 03:09 AM

الصورة الرمزية ahmad_s_f
ahmad_s_f
:: المهندس/ أحمد سمير فايد ::
تاريخ التسجيل: Jun 2006
الدولة: سائح في ارض الله
المشاركات: 632
نشاط [ ahmad_s_f ]
قوة السمعة:
قديم 22-02-2009, 04:35 PM المشاركة 70   
افتراضي


كما أخبرتكم سابقا أن وظيفة جملة while هي أن تختبر شرط معين فإذا تحقق هذا الشرط يتم تنفيذ الأوامر التي بين القوسين { } الخاصين بجملة while .
ثم يتم اختبار الشرط مرة أخرى فإذا تحق يتم تكرار تنفيذ الأوامر مرة أخرى وهكذا .. إلى أن لا يتحقق الشرط .

وقد ذكرت فيما سبق أنه يمكن تكرار مجموعة من الأوامر باستمرار إلى الأبد .. باستخدام LOOP و goto LOOP .. وذكرت طريقة أخرى وهي استخدام الأمر التالي
كود:
while(1) { هنا نكتب الأوامر التي نريد تكرارها باستمرار }
ولكن ماذا تعني واحد هذه التي بين القوسين (1) while .. ؟؟؟
أخبرتكم من قبل أننا نضع بين القوسين العاديين ( ) الشرط الذي نريد اختباره أليس كذلك ؟؟ وإليك هذه المعلومة الجديدة . إن البك من الداخل عندما ينفذ الأمر while فإنه يختبر الشرط فإذا تحقق الشرط فإن البك يرمز لهذا الشرط بالرمز 1 وإذا لم يتحقق الشرط فإن البك يرمز له بالرمز 0 .. فعندما نكتب الأمر (1) while فكأننا نخبر البك بأنه لا داعي لاختبار الشرط الذي بين القوسين( ) لأنه شرط متحقق دائما حيث وضعنا له الرمز واحد . وبالتالي سينفذ البك الأوامر التي بين قوسي المجموعة { } ثم يختبر الشرط مرة أخرى فيجد أنه شرط متحقق دائما (لأن واحد تعني أنه شرط متحقق دائما ) فيعيد البك تنفيذ الأوامر التي بين قوسي المجموعة { } ثم يختبر الشرط مرة أخرى فيجد أنه شرط متحقق دائما ... وهكذا ...

وبمعنى آخر : إذا كان الشرط صحيح true فإن البك يرمز له برقم 1 وإذا كان الشرط غير صحيح false (أي أن الشرط لم يتحقق) فإن البك يرمز له بالرمز 0
وهذا يعني أنه في حالة كتابة (1) while فإننا نخبر البك بأن الشرط صحيح دائما وبالتالي سينفذ الأوامر التي بين القوسين { } باستمرار .

ولكن ماذا لو كتبنا الأمر التالي (0) while هذا يعني أن الشرط غير صحيح دائما وبالتالي لن ينفذ البك الأوامر التي بين القوسين { } مهما حصل وبالتالي من النادر أن تجد من يستخدم الأمر (0) while .

أخي الفاضل عبد الله (waseemahmmad) كان سؤالك
سؤال أخير من فضلك :

أشرت إلى طريقة أخرى بديلة عن طريقة Loop و هي while (1) ما المقصود بالرقم 1 و هل يمكنني كتابة شرط ما بين القوسين بدل الرقم واحد ؟
أعتقد الآن أنه تم الإجابة على سؤالك ..

===============================================
إخواني الكرام .. يتبادر للبعض سؤال حول جملة if وهو هل يمكننا اختبار عدة شروط وفي حال تحقق الشروط جميعا نجعل البك ينفذ أوامر معينة ؟؟
بالطبع نعم ,, وبعدة طرق الطريقة الأولى ذكرتها في مشاركة سابقة وهي
الآن ومن فهنا لجملة IF نعلم أنه إذا تحقق الشرط سيفذ البك ما بداخل القوسين .
أليس كذلك . . ولكن ماذا يحدث لو كتبت داخل القوسين جملة IF أخرى لها قوسين خاصين بها هي أيضا .. كما بالشكل التالي .
كود:
if( الشرط الأول ) {
if ( الشرط الثاني )
{ هذه الأوامر ستنفذ في حال تحقق الشرطين السابقين }
}
سيختبر البك الشرط الأول وفي حالة تحققه ينفذ الأوامر التي بين القوسين والتي أول أمر فيها هو اختبار لشرط ثاني فإذا تحقق هذا الشرط أيضا سينفذ الأوامر التي بين القوسين الخاصة بجملة if الثانية ..

وبنفس الطريقة لو أردت إختبار ثلاثة شروط .
كود:

if( الشرط الأول ) {
if( الشرط الثاني) {
if ( الشرط الثالث)
{ هذه الأوامر ستنفذ في حال تحقق الثلاث شروط}
}
}
هناك طريقة أخرى أفضل من هذه سنذكرها بالتفصيل إن شاء الله في التمارين والتي تعتبر درس جديد مستقل ..
يمكنك الرجوع لهذه المشاركة لتراها بشكل جيد ..

والآن إليكم طريقة أخرى : وفي غاية السهولة واليسر .
هذه الطريقة نستخدمها في حالة أننا نريد من البك اختبار عدة شروط وليس شرط واحد في حال تحقق هذه الشروط جمعيا فإن البك ينفذ الأوامر التي نريدها
والطريقة هي أن نكتب داخل القوسين العاديين ( ) الخاصين بجملة If الشرط الأول ثم نضع العلامة && ثم نكتب الشرط الثاني ثم نضع العلامة && ثم نكتب الشرط الثالث وهكذا .. ) كما يوضح ذلك الشكل التالي :
كود:
if (الشرط الأول && الشرط الثاني ) { هنا نكتب الأوامر التي نريد تنفيذها في حال تحقق الشرطين الأول والثاني }
وإذا كانوا أكثر من شرطين :
كود:
if(الشرط الثالث&& الشرط الثاني && الشرط الأول&& ... ) { هنا نكتب الأوامر التي نريد تنفيذها في حال تحقق الشروط السابقة جميعا }
وبهذا يكون قد تم الإجابة على السؤال
هل يمكنني إستخدام العطف في الجمل الشرطية باستخدام كلمة And أو إشارة And كما في لغات أخرى كأن أكتب مثلاً :

كود:
if ( ..... ) & if ( ..... ) { } أو if ( ..... ) And if ( ..... ) { }
أخي عبد الله سأجيب على بقية أسئلتك إن شاء الله في الوقت المناسب
==============================================

التطبيق الخامس : إذا علمت أننا لدينا قطعة الكترونية معينة هذه القطعة تخرج جهد موجب 5 فولت أو 0 فولت ولدينا من هذه القطعة اثنين ( يوجد قطعتين بنفس الطريقة ) .. وتم توصيل هذين القطعتين بالبك واحدة تم توصيلها بالرجل A0 والأخرى بالرجل A1 والمطلوب هو عمل برنامج يقوم بالوظيفة التالية :
1- في حال أن القطعة الموصلة بـ A0 أخرجت إشارة 5 فولت للبك فإن الليد الموصل بالرجل رقم b0 يضيء (وفي حالة ان هذه القطعة أخرجت جهد 0 فولت فإن هذا الليد الموصل بـ b0 لا يضيء )
2- في حال أن القطعة الثانية الموصلة بـ A1 أخرجت إشارة 5 فولت للبك فإن الليد الموصل بالرجل رقم B1 يضيء ( وفي حالة أن هذه القطعة أخرجت جهد 0 فولت فإن هذا الليد الموصل بـ B1 لا يضيء )
3- في حال أن القطعتين أخرجوا في نفس الوقت جهد 5 فولت فإن الليد رقم B4 يضيء ( وفي حال أن القطعتين لم يخرجوا في نفس الوقت جهد 5 فولت فإن الليد الموصل بـ B4 لا يضيء )

الحل : بما أننا لدينا ثلاث حالات فإننا سنستخدم ثلاث جمل if وبما أن كل حالة تنقسم لقسمين فإننا سنستخدم else أيضا والتي تخبرنا أنه في حال عدم تحقق الشرط .. وللتذكير
كود:
If(الشرط) { نفذ هذه الأوامر في حال تحقق الشرط السابق } else { نفذ هذه الأوامر في حال أن الشرط السابق لم يتحقق }
والآن إليك الكود النهائي لهذا البرنامج المطلوب :
كود:
void main() { trisa=0xff; trisb=0; while(1) { if(PORTA.F0==1&&PORTA.F1==1) PORTB.F4=1; else PORTB.F4=0; if(PORTA.F0==1) PORTB.F0=1; else PORTB.F0=0; if(PORTA.F1==1) PORTB.F1=1; else PORTB.F1=0; } }


التعديل الأخير تم بواسطة : ahmad_s_f بتاريخ 24-02-2009 الساعة 11:07 PM

الصورة الرمزية M_OSOS
M_OSOS
:: مهندس متواجد ::
تاريخ التسجيل: Feb 2009
الدولة: Egy
المشاركات: 62
نشاط [ M_OSOS ]
قوة السمعة:
قديم 04-03-2009, 07:44 PM المشاركة 71   
not funny


السلام عليكم ورحمه الله وبركاته

اخي احمد عندي استفسار صغير علي التجربه الاخيره في الدرس الثالث (هدفها اخراج جهد هاي لاضائه ليد عليB0 عند الضغط علي P.B علي البورت A0)

لاحظت عند استخدام الامر
PortB.F0=X
فان الخرج علي البورت المطلوب تحقق ولاكن هناك بورتات اخري خرج عليها جهد هاي

الثلات صور توضح الذي اقوله


قد تستغرب اني وضعت البوشبوتومز دي كلها والليدات ايضا (انا عشان اريح نفسي من رسم دائره كل مره لتجربه شي مختلف علي اوامر الاخراج والادخال رسمت دائره تخدم اهداف التجارب من هذا النوع كلها )

الصوره الاولي : توضح البرنامج في وجع الران والبوشبوتم غير مضغوط عليه ومع ذلك وجود خرج هاي علي بعض البورتات

الصوره الثانيه : بعض الضغط علي البوشبوتوم تحقق المطلوب مع وجود نفس الخطئ

الصوره الثالثه : لقطه من الفيديو الخاص بالشرح وبه نفس النقطه الموجوده في الصوره (وجود خرج علي بورتات غير مرغوب بها )

======================================

لوحظ : بعد تجربه الامر PORTB=X ان البرنامج يحقق المطلوب منه علي اتم وجه

=========(((في النهايه اريد شرح جمله PORTB.F4=X)))
وشكرا


الصور----------------->>>>










التعديل الأخير تم بواسطة : M_OSOS بتاريخ 04-03-2009 الساعة 10:57 PM السبب: مشكله في رفع الصور

الصورة الرمزية ahmad_s_f
ahmad_s_f
:: المهندس/ أحمد سمير فايد ::
تاريخ التسجيل: Jun 2006
الدولة: سائح في ارض الله
المشاركات: 632
نشاط [ ahmad_s_f ]
قوة السمعة:
قديم 04-03-2009, 11:26 PM المشاركة 72   
افتراضي


أخي الكريم //M_OSOS ::

نجد في بعض البرامج التي نطبقها أو عندما نحاكيها نفس المشكلة التي تتحدث عنها أنت وهي أن بعض الرجول (الأطراف) يخرج عليها جهد دون أن نطلب ذلك من البك (أي أن الكود لم يأمر البك بذلك) لذلك يفضل في بداية أي برنامج نكتبه أن نكتب الأمر التالي

;portb=0

نكتب هذا الأمر في بداية البرنامج لكي نتأكد أن هذه المشلكة لن تحدث ..



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