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

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

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



سم الله الرحمن الرحيم.
السلام عليكم ورحمة الله وبركاته.
لمن لا يعرف عن أي شيء نتكلم انظر هذه المسابقة الأولى:
http://www.qariya.info/vb/showthread...wpost&t=181234
تركتكم تستريحون بضعة أيام... أرى أنه حان الوقت لعودة المشقة والمتعة.
والآن مع كود الأخ مجدي الذي وعدتكم به.
لقد تقدم في البداية بكود به عدة ملاحظات.
سأخبركم بالملاحظات جميعا إلا ملاحظة واحدة التي سيكون عليها التحدي.
لقد أرسلت إليه جميع الملاحظات في أربع رسائل خاصة... سأستعرضها لكم جميعا ما عدا الرسالة الخاصة الرابعة التي تحتوي على الملاحظة الأهم.
الرسالة الخاصة الأولى:
السلام عليكم ورحمة الله وبركاته.
أول تعليق هو يجب عليك كتابة الكود بشكل منسق بحيث يتمكن أي أحد من فهم حلقات الكود دون عناء.
ولقد نسقت كودك دون تغيير التعليمات بهذا الشكل:
http://dc773.4shared.com/download/Eq...4966&lgfp=2000
نزل الملف وانظر إلى شكله كيف يظهر على برنامج ميكروسي برو.
وهذا أيضا كودك:
كود:
#define sw1 porta.f0 #define sw2 porta.f1 #define is == #define click 0 //////////////////////////////////////////////////////////////// void main() { portb=0; porta=4; trisb=0; trisa=3; while((porta-3)>=1) { delay_ms(1000); portb=(portb<<1)+(!portb); while(portb) {delay_ms(1000);portb=(portb<<1)+(!portb);} porta=porta+4; } porta=0; do { delay_ms(1000);portb=(portb>>1)+(!portb*128); while(portb){delay_ms(1000);portb=(portb>>1)+(!portb*128);} porta=porta+4; }while((porta-3)>=1); while(1) { if(sw1 is click) { delay_ms(100); portb=(portb<<1)+(!portb); while(!sw1){} } if(sw2 is click) { delay_ms(100); portb=(portb>>1)+(!portb*128); while(!sw2){} } } }
هناك ملاحظات أخرى... لكن أكبر عدد حروف مسموح به في الرسائل الخاصة 1800 حرف.
نكمل إن شاء الله في الرسالة القادمة.
والسلام عليكم ورحمة الله وبركاته.

لا تنزل الرابط... لا تحتاج لهذا.. انظر للكود مباشرة وتأمل الأخطاء ثم أكمل قراءة الرسالة الخاصة الثانية والثالثة.
الرسالة الخاصة الثانية:
السلام عليكم ورحمة الله وبركاته.
الملاحظة الثانية أنك كتبت عدة تعليمات لا فائدة منها... وهي:
portb=(portb<<1)+(!portb);a
حرف a من عندي حتى يظهر الكود بشكل مفهوم.
لاحظ أن البك لن يمر أبدا على هذه التعليمة إلا لو كان بورت B يساوي صفر... وعلى هذا ستكون النتيجة دائما 1
حيث port<<1 سيساوي صفر.
و !portb ستساوي واحد
وعلى هذا كان ينبغي أن تكتب:
portb=1;
ثانيا السطر الذي بعده كتبت نفس التعليمة السابقة.
!portb دائما في هذا السطر ستساوي صفر... لأن شرط الدخول في هذا السطر أن يكون بورت B لا يساوي الصفر.
وعلى هذا عليك حذف +(!portp) من هذا السطر.
نفس الكلام في حلقة الإزاحة يمين.
ملاحظة أخرى أنك وضعت شرط while بهذا الشكل:
while((porta-3)>=1)a
حرف a من عندي حتى يظهر الكود بشكل مفهوم.
الشرط بهذه الطريقة صحيح لكنه يلبس على القارئ.
كان ينبغي أن يكون بسيطا بهذا الشكل:
while(porta>3)a
ونفس الكلام في حلقة do_while بالنسبة للإزاحة يمين.
وهذا الرابط للكود بعد حذف التعليمات التي لا فائدة منها:
http://www.4shared.com/get/TJcg82Vuce/___online.html
وهذا هو الكود:
كود:
#define sw1 porta.f0 #define sw2 porta.f1 #define is == #define click 0 //////////////////////////////////////////////////////////////// void main() { portb=0; porta=4; trisb=0; trisa=3; while(porta>3) { delay_ms(1000); portb=1; while(portb){delay_ms(1000); portb=(portb<<1);} porta=porta+4; } porta=0; do { delay_ms(1000); portb=128; while(portb) {delay_ms(1000);portb=(portb>>1);} porta=porta+4; }while(porta>3); while(1) { if(sw1 is click) { delay_ms(100); portb=(portb<<1)+(!portb); while(!sw1){} } if(sw2 is click) { delay_ms(100); portb=(portb>>1)+(!portb*128); while(!sw2){} } } }
نكمل الرسالة القادمة.

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

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

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

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


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


اعتقد أن العيب الخفى فى هذا الكود تتعلق بالبورت ( A ) لأن PORTA يستخدم فى قرأة الإشرات التماثليه ... وفى حاله الدفلت يكون ال PORTA فى المتحكم الدقيق 16F877A .. أنلوج .. وهنا خطأ كبير لو تم التعامل مع البورت A ك ديجيتال ... ويجب قبل التعامل مع ال PORTA ك ديجيتال ... تفعيل البورت ك ديجيتال من خلال هذة التعليمه ...
كود:
  adcon1=0x06;
... وهذا العيب الخفى لا يفهمه برنامج بروتس ... ولكن لو تم تنفيذ المشروع على أرض الواقع .. سنلاحظ أن المفاتيح المربوطه مع ال PORTA لا تستجيب ولا تفعل شئ ... هذا لأن ال PORTA يكون فى الحالة الطبعيه أنلوج ..... وهنا يجب أخبار البك أننا نريد استخدام ال PORTA ك ديجيتال .. ... طبعااا من خلال هذة التعليمه ...
كود:
  adcon1=0x06;

والله اعلم ..

اللهم انفعنا بما علمتنا وعلمنا ما ينفعنا وزدنا علما




تحياتى لك استاذ .. محمد



""""""

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

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


وعليك السلام ورحمة الله وبركاته أخ عبد الله حجازي.
نحن لا نتعامل مع PIC16F677A وإنما نتعامل مع PIC16F84A
راجع أول مشاركة في موضوع المسابقة الأولى.
أعِد التفكير وعندما تكتشف الخطأ أرسله إليَّ في رسالة خاصة.
وعلى فكرة.. برنامج بروتس قادر على اكتشاف الخطأ الذي ذكرتَه أنت... لكنه ليس قادرا على اكتشاف الخطأ الذي أقصده.
ولدي سؤال.. ما معنى الدفلت؟
وأقول تذكرو ماذا قلت في وصف هذا الخطأ عندما قلت:
كما أن هذا الكود يؤدي الوظيفة المطلوبة على أكمل وجه... كما يبدو من الوهلة الأولى... ولكن........
ولكن به عدة ملاحظات.
سأرسل له هذه الملاحظات في رسالة خاصة.. لكن هناك ملاحظة واحدة سأخبركم بتلميحة عنها ثم أفصلها له في الرسائل الخاصة... كما أنها ستكون من أجمل الدروس المستفادة بعد انتهاء هذه المسابقة.
لقد كان وقتي ضيقا فأجريت محاكاه على البروتس فكانت النتيجة رائعة ويؤدي الوظيفة على أكمل وجه فأعلنت في المشاركة السابقة أنه كود كامل.
لكن بعد أن تدبرت الكود وجدته يحتوي على عيب خفي جدا.
هذا العيب لا يمكن لبرنامج بروتس اكتشافه.
كما أنك لو جربت البك بعيدا عن المجال المغناطيسي والمجال الكهربي سيؤدي الوظيفة بشكل جيد... لكنه عندما يقترب من شوشرة ستجد أنه أحياناً لا تمشي الأمور كما كنا نخطط لها.
سأرسل للأخ مجدي تفاصيل ذلك في رسالة خاصة ثم أخبركم بهذا الدرس الجميل في نهاية المسابقة.
سيكون كود الأخ مجدي من أهم الأكواد التي سنستعرضها في نهاية المسابقة لما فيها من أخطاء خفية.
وجزاك الله خيرا على التفاعل.
والسلام عليكم ورحمة الله وبركاته.


التعديل الأخير تم بواسطة : محمد ع يسى بتاريخ 27-02-2016 الساعة 09:09 AM

الصورة الرمزية assed
assed
:: عضو فضي ::
تاريخ التسجيل: Jul 2014
الدولة: العراق - بغداد
المشاركات: 1,036
نشاط [ assed ]
قوة السمعة:97
قديم 27-02-2016, 10:33 AM المشاركة 4   
افتراضي


السلام عليكم
انا لا أجيد هذه اللغة ولاكن اعتقد ان الخطاء الخفي هوة في port A حيث تعليمة trisa=3 اعتقد تعني ثلاث بنات دخل وفي الكود مستخدم فقط 2 دخل هما porta0 & porta1
والله أعلم


هذا ما اجده متشابهاً مع اللغة التي انا افهمها


محمد ع يسى
:: عضو فضي ::
تاريخ التسجيل: May 2015
الدولة: مصر
المشاركات: 1,044
نشاط [ محمد ع يسى ]
قوة السمعة:81
قديم 27-02-2016, 11:35 AM المشاركة 5   
افتراضي


السلام عليكم
انا لا أجيد هذه اللغة ولاكن اعتقد ان الخطاء الخفي هوة في port A حيث تعليمة trisa=3 اعتقد تعني ثلاث بنات دخل وفي الكود مستخدم فقط 2 دخل هما porta0 & porta1
والله أعلم


هذا ما اجده متشابهاً مع اللغة التي انا افهمها
وعليك السلام ورحمة الله وبركاته.
مرحبا بك في هذه المسابقة.
كلا... ليست هذه الغلطة.
في لغة المكيرو سي إذا كتبت الرقم مباشر فهذا يعني أنه بالصيغة العشرية.
بينما إذا كتبت قبله 0b فهذا يعني أنه بالصيغة الثنائية.
بينما إذا كتبت قبله 0x فهذا يعني أنه بالصيغة الستة عشرية (16).
إذا أردت أن تعرف أي البنات ستكون دخل وأيها ستكون خرج فعليك تحويل الرقم للصيغة الثنائية.
مثلا الأمر:
porta=3
ينبغي أن تفهمه بهذا الشكل:
porta=0b11
أو:
porta=0b00000011
أو:
porta=0b0000000000000000000011
لاحظ أنها جميعا نفس القيمة لأن الصفر على الشمال لا يعني شيئا.
حتى نفهم أيها ستكون دخل وأيها ستكون خرج سننظر لهذه الصيغة:
porta=0b00011
سنجد أن A0 وA1 دخل.
بينما A2 و A3 و A4 خرج.
مع العلم أن الـAVR عكس البك.. حيث الـAVR تعتبر 1 تعني خرج بينما 0 تعني دخل.
لا تنسو أنني قلت عن هذه الغلطة لا يستطيع برنامج بروتس اكتشافها.
وشكرا لك على تفاعلك.
في انتظار المزيد من التفاعل.


التعديل الأخير تم بواسطة : محمد ع يسى بتاريخ 27-02-2016 الساعة 11:40 AM
احصائية الشكر والاعجاب - 1 شكراً, 0 عدم اعجاب, 0 اعجاب
شكراً assed ( شكر العضو على هذه المشاركة )

ABOUYAGINE
:: مهندس متواجد ::
تاريخ التسجيل: Jan 2012
المشاركات: 61
نشاط [ ABOUYAGINE ]
قوة السمعة:0
قديم 28-02-2016, 12:43 AM المشاركة 6   
افتراضي


السلام عليكم
ارجو كم الاخوة توضيح الــ ;( portb=(portb<<1)+(!portb
مشكوريين


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


السلام عليكم
ارجو كم الاخوة توضيح الــ ;( portb=(portb<<1)+(!portb
مشكوريين
أما عن:
portb<<1
فانظر التجربة 18 من هذا الكتاب من دورة أستاذ أحمد سمير فايد:
http://www.4shared.com/file/11919184...__lesson6.html
وأما عن:
j!portb
(الحرف j من عندي ليظهر الكود بشكل مفهوم).
فهي تعني عكس حالة بورت B بمعنى:
إن كان بورت B يساوي 0 فسيضع مكان هذه العبارة 1
بينما إن كان بورت B أكبر من 0 فسيضع مكان هذه العبارة صفر.
لا تتردد في طلب المزيد من الشرح إن كان الأمر صعبا.


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


أما عن:
portb<<1
فانظر التجربة 18 من هذا الكتاب من دورة أستاذ أحمد سمير فايد:
http://www.4shared.com/file/11919184...__lesson6.html
وأما عن:
j!portb
(الحرف j من عندي ليظهر الكود بشكل مفهوم).
فهي تعني عكس حالة بورت B بمعنى:
إن كان بورت B يساوي 0 فسيضع مكان هذه العبارة 1
بينما إن كان بورت B أكبر من 0 فسيضع مكان هذه العبارة صفر.
لا تتردد في طلب المزيد من الشرح إن كان الأمر صعبا.
والله مشكور على هذه المعلومات ...

فى الحقيقه أجد بعض الرموز والتعليمات غريبه على لا افهمها ...

مثل هذة التعليمات ..

كود:
while((porta-3)>=1)

كود:
 portb=(portb<<1)+(!portb);
كود:
 while(portb) {delay_ms(1000);portb=(portb<<1)+(!portb);}

كود:
 portb=(portb<<1)+(!portb);
كود:
  while(!sw1){}

وهذة التعليمه نفسى افهما وطريقة استخدمها فى الكود ..
كود:
  %
كود:
 (tlong / 100) % 10;

يارت يكون فى شرح لمثل هذة التعليمات ... وتكون موضحه ببعص الأمثله ..


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


تحياتى لك اخى الكريم .. و بارك الله فيك ...

إضافة رد

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

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

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


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

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