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

أدوات الموضوع

محمد ع يسى
:: عضو فضي ::
تاريخ التسجيل: May 2015
الدولة: مصر
المشاركات: 1,044
نشاط [ محمد ع يسى ]
قوة السمعة:81
قديم 05-02-2016, 02:48 PM المشاركة 1   
افتراضي مسابقة... من العبقري الذي يستطيع تصميم هذا الكود؟!! Twitter FaceBook Google+




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

سنستخدم PIC16F84A.
سنرى من الشروط عدم تغيير شيء في الهاردوير.. فلا يجوز مثلا وضع مقاومة رفع بين الموجب وبين A4... ولا يجوز جعل المفاتيح بين البورت وبين الموجب وتجعل مقاومة الرفع بين البورت والأرضي... هذا لا يجوز كما سيأتي في الشروط.
ثانيا الوظيفة المطلوبة:
في البداية تكون جميع الليدات مطفأة لمدة ثانية واحدة.
ثم يضيء الليد الأول "يعني الموصل بB0 ويبقى لثانية واحدة.
ثم يطفئ الليد الأول ويضيء الليد الثاني لمدة ثانية واحدة.
ثم يضيء الذي بعده لمدة ثانية وهكذا إلى الليد الثامن.
لاحظ أن ليد واحد فقط هو الذي يضيء كل مرة.
بعد الوصول الليد الثامن وانتهاء ثانية واحدة تطفئ جميع الليدات لمدة ثانية واحدة.
ثم تكرر نفس العمل.
أريد أن تضيء الليدات من اليمين إلى الشمال بهذا الوصف ثلاث مرات.. بعد كل مرة تطفئ جميع الليدات لمدة ثانية واحدة.
بعد انتهاء الثلاث دورات هناك أربع دورات تضيء فيها الليدات من الشمال إلى اليمين.. وأيضا بعد كل دورة تطفئ جميع الليدات لمدة ثانية واحدة.
بمجرد إطفاء آخر ليد في الدورة الأخيرة يصبح المفتاح الموصل بA0 يقوم بالآتي:
عند الضغط عليه لو كانت الليدات مطفأة يضيء الليد B0.
عند كل ضغطة يضيء الليد الذي بعده وكأنها إزاحة يمين.
لو وصل إلى الليد الثامن ثم ضغطنا تنطفئ الليدات.
المفتاح الموصل بA1 سيقوم بالعكس.. يعني كأنه يعمل إزاحة شمال.
يظل البك يختبر المفتاحين وينفذ رغبة الضاغط إلى الأبد.
الشروط:
لا يجوز استخدام متغيرات ولا ثوابت.
لا يجوز استخدام حلقة for.
لا يجوز تغيير الهاردوير.
لا يجوز أن يفشل الكود بسبب الضغط على المفتاح أثناء قيامه بالدورات المذكورة... حيث هناك أكواد تؤدي الوظيفة المطلوبة بشرط عدم الضغط على المفاتيح أول التشغيل... لا أريد هذا... أريد المفتاحين الموصلين بA0 و A1 لا يضر فتحهما أو غلقهما في بداية التوصيل... وفي أثناء دورات الإزاحة كذلك.
لا يجوز أن تطلع على كود أحد المشتركين في المسابقة قبل أن تنتهي من وضع كودك... لا يجوز أن تستفيد فكرة من أحد إلا بعمل تحالف معه.
عند عد التعليمات سنعد تعليمة delay على أنها ثلاث تعليمات.
وسنعد العنوان مثل aa: على أنه ثلاث تعليمات.
سنعد if على أنها تعليمتان.
سنعد while على أنها تعليمتان.
سنعد goto على أنها تعليمتان.
سنعد else على أنها تعليمة واحدة.
وأي أمر ينتهي بالفصلة المنقوطة "في لغة الميكرو سي" سنعده تعليمة واحدة.
سنعد جميع التعليمات وصاحب أقل عدد تعليمات سيكون هو الفائز.
أول من يضع الكود الذي يؤدي الوظيفة المطلوبة على الوجه الصحيح سيخصم 10 أعداد من تعليماته.
يعني لو عمل كود من 30 تعليمة سنعتبرهم 20 تعليمة عند اختيار الفائز.
ثاني شخص يضع الكود على الوجه الصحيح سنخصم 9 أعداد من تعليماته.
وهكذا حتى الشخص العاشر نخصم من عدد تعليماته رقم واحد.
انتهت الشروط.
قد يقول قائل:
يمكننا أن نفعل ذلك بكل سهولة باستخدام المتغيرات وحلقة for فلماذا منعت ذلك؟
الإجابة:
لأنه يمكننا أن نفعل ذلك بكل سهولة باستخدام المتغيرات وحلقة for.
فلا توجد متعة من ذلك.
أما إن منعنا ذلك... هنا الصعوبة والتركيز والتفكير والمتعة.
ملحوظة:
يمكنك أن تضع كود تقليدي طويييييييل جدا... لكن إن فعلت فتأكد أنك لن تكون الفائز.
فكر... كيف يمكن عمل تكرار بالعدد الذي نريد دون متغيرات ولا ثوابت ولا حلقة for؟
كيف؟!!
كيف؟!!
من العبقري الذي سيكون أول من يضع الكود المطلوب؟؟!


التعديل الأخير تم بواسطة : محمد ع يسى بتاريخ 05-02-2016 الساعة 09:00 PM
احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 1 اعجاب
شكراً حسن هادي محمود ( شكر العضو على هذه المشاركة )
اعجاب حسن هادي محمود ( أعجبته المشاركة )
اعلانات

محمد ع يسى
:: عضو فضي ::
تاريخ التسجيل: May 2015
الدولة: مصر
المشاركات: 1,044
نشاط [ محمد ع يسى ]
قوة السمعة:81
قديم 05-02-2016, 05:29 PM المشاركة 2   
افتراضي


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


التعديل الأخير تم بواسطة : محمد ع يسى بتاريخ 05-02-2016 الساعة 08:57 PM
اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )
  

الصورة الرمزية عريبى محمود
عريبى محمود
:: ( رحمه الله عليه ) ::
تاريخ التسجيل: Jan 2009
الدولة: لا تسأل الطغاه لماذا طغو بل اسأل العبيد لماذا انحنو
المشاركات: 3,139
نشاط [ عريبى محمود ]
قوة السمعة:188
قديم 05-02-2016, 08:34 PM المشاركة 3   
x4


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






التعديل الأخير تم بواسطة : عريبى محمود بتاريخ 05-02-2016 الساعة 08:47 PM
احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 0 اعجاب
شكراً محمد ع يسى ( شكر العضو على هذه المشاركة )

محمد ع يسى
:: عضو فضي ::
تاريخ التسجيل: May 2015
الدولة: مصر
المشاركات: 1,044
نشاط [ محمد ع يسى ]
قوة السمعة:81
قديم 05-02-2016, 08:49 PM المشاركة 4   
افتراضي


السلام عليكم ورحمة الله وبركاته.
أعلم أنني لا أستخدم A4 ولكن... سأخبرك بعد انتهاء المسابقة لماذا اشترطت هذا الشرط.


الصورة الرمزية عبدالله حجازى
عبدالله حجازى
:: عضو ذهبي ::
تاريخ التسجيل: Apr 2011
الدولة: مصر .. محافظة دمياط
المشاركات: 1,688
نشاط [ عبدالله حجازى ]
قوة السمعة:111
قديم 06-02-2016, 02:06 AM المشاركة 5   
افتراضي السلام عليكم ورحمه الله


هذا الكود يعمل تقريباا 80% من المطلوب .. وسيتم تكملته ...


كود:
   
    #define  Time      delay_ms(1000);
    #define  LED       portb

             void main() {

      trisb = 0;   portb = 0;
      trisa = 3;   porta = 0;

  //************************//
    Time

    LED = 1; Time   LED = 2; Time   LED = 4; Time   LED = 8; Time

    LED = 16; Time  LED = 32; Time  LED = 64; Time  LED = 128; Time
    LED = 0;  Time
  //***************************************************************//

    LED = 128; Time   LED = 64; Time   LED = 32; Time   LED = 16; Time

    LED = 8; Time  LED = 4; Time  LED = 2; Time  LED = 1; Time
    LED = 0;  Time  LED = 1;

      while (1) {
      

     if(porta.F0==0) { Time LED ++; }

     if(porta.F1==0) { Time LED --; }


 }
 }

احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 0 اعجاب
شكراً محمد ع يسى ( شكر العضو على هذه المشاركة )

محمد ع يسى
:: عضو فضي ::
تاريخ التسجيل: May 2015
الدولة: مصر
المشاركات: 1,044
نشاط [ محمد ع يسى ]
قوة السمعة:81
قديم 06-02-2016, 03:15 AM المشاركة 6   
افتراضي تعليق على كود الأخ عبد الله حجازي


هذا الكود يعمل تقريباا 80% من المطلوب .. وسيتم تكملته ...


كود:
   
    #define  Time      delay_ms(1000);
    #define  LED       portb

             void main() {

      trisb = 0;   portb = 0;
      trisa = 3;   porta = 0;

  //************************//
    Time

    LED = 1; Time   LED = 2; Time   LED = 4; Time   LED = 8; Time

    LED = 16; Time  LED = 32; Time  LED = 64; Time  LED = 128; Time
    LED = 0;  Time
  //***************************************************************//

    LED = 128; Time   LED = 64; Time   LED = 32; Time   LED = 16; Time

    LED = 8; Time  LED = 4; Time  LED = 2; Time  LED = 1; Time
    LED = 0;  Time  LED = 1;

      while (1) {
      

     if(porta.F0==0) { Time LED ++; }

     if(porta.F1==0) { Time LED --; }


 }
 }
وعليك السلام ورحمة الله وبركاته أخي عبد الله حجازي.
أولا كل مرة استخدمت فيها الأمر time سنعدها ثلاث تعليمات... بينما كل مرة استخدمت فيها الأمر led سنعدها تعليمة واحدة.
ثانيا هذا الكود سيجعل الليدات تضيء من اليمين إلى الشمال مرة واحدة ثم من الشمال إلى اليمين مرة واحدة... أنا لا أريد هذا... أريد من اليمين إلى الشمال ثلاث مرات ومن الشمال إلى اليمين أربع مرات ولا تنس أن تطفئ جميع الليدات بين كل دورة.
أضف إلى ذلك أنه عندما يصل إلى اختبار السويتش لن يؤدي الوظيفة المطلوبة على الوجه الذي ينبغي... كما لا أريد استخدام تأخير في حلقة اختبار السويتشات... يعني أريد إذا ضغطت مرة ثم رفعت حتى لو كل واحد ملي ثاني أريده ينفذ التعليمة التالية "طبعا مستحيل أن أضغط وأرفع بهذه السرعة" ... المهم لا تستخدم أمر delay في حلقة اختبار السويتشات.
وأشجعك أخي وأحييك على هذا الكود وأنتظر أن تعدله وتصل للوظيفة المطلوبة بأقل عدد تعليمات لكن أسرع حتى تكون أول من وصل لنخصم 10 تعليمات من تعليماتك كما في الشروط.
والسلام عليكم ورحمة الله وبركاته.


محمد ع يسى
:: عضو فضي ::
تاريخ التسجيل: May 2015
الدولة: مصر
المشاركات: 1,044
نشاط [ محمد ع يسى ]
قوة السمعة:81
قديم 06-02-2016, 06:53 PM المشاركة 7   
افتراضي


السلام عليكم ورحمة الله وبركاته.
إن لم يفهم أحدكم الوظيفة المطلوبة من الكود فهذا ملف الهكس:
http://www.4shared.com/get/LwOx14nZba/ahmad_1.html
يمكنكم تنزيله ومحاكاته على البروتوس لمعرفة الوظيفة المطلوبة.
مع العلم أني وضعت هذا الكود بما يعادل 53 تعليمة على أساس طريقة عد التعليمات التي ذكرتها في الشروط.
كان هناك 17 أمر ينتهون بالفصلة المنقوطة منهم تعليمتان delay.
وباقي ال53 حلقات.
أين عباقرة البرمجة ليشتركوا في هذه المسابقة!!


مشتاق الله
:: مهندس متميز ::
تاريخ التسجيل: Oct 2015
المشاركات: 620
نشاط [ مشتاق الله ]
قوة السمعة:0
قديم 06-02-2016, 08:16 PM المشاركة 8   
sun


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

اخى العزيز محمد نفسي اشترك لكن انا شغال atmel
و كنت تركت pic من زمان .

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

تقبل الله منك

الله يوفقك
اللهم استخدمنا مخلصين مقبولين بفضلك




احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 0 اعجاب
شكراً محمد ع يسى ( شكر العضو على هذه المشاركة )
إضافة رد

العلامات المرجعية

«     الموضوع السابق       الموضوع التالي    »
أدوات الموضوع

الانتقال السريع إلى


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

Powered by vBulletin® Version 3.8.6, Copyright ©2000 - 2025