سم الله الرحمن الرحيم.
السلام عليكم ورحمة الله وبركاته.
لمن لا يعرف عن أي شيء نتكلم انظر هذه المسابقة الأولى:
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 تعليمة فقط.
الملاحظة الأخيرة والأجمل:
نكمل الرسالة القادمة.
والسلام عليكم ورحمة الله وبركاته.
|
الكلام الذي ترونه عن الارتداد في هذه الرسالة تعلمته من الأخ حسن هادي محمود في الرسائل الخاصة.
وهناك مسابقة ساخنة جدا بعد هذه المسابقة...
سأطلب منكم إن شاء الله في المسابقة القادمة وظيفة سنستخدم فيها الكيباد بشرط عدم استخدام مكتبة الكيباد.
لكن بعد الانتهاء من هذه المسابقة أولا.
في انتظار تفاعلكم.
والسلام عليكم ورحمة الله وبركاته.