السلام عليكم
من بعد اذن اخي احمد والذي قد يكون مشغولا في الفترة الاخيرة وفقه الله لكل خير وجعل هذا العمل في ميزان حسناته يوم القيامة...فانا ساحاول التبسيط للمساعدة بما فهمته من الدورة الى الان..
اخي Nighto
بالنسبة للكود الذي كتبته انت فلا مشكلة فيه..فقد قمت بتجربته على برنامج البروتوس وعمل بشكل جيد
حيث استخدمت الطرف A0 كمدخل بينما الاطراف B0,B1,B2 كمخارج...
هناك عدة نقاط اريد ان اوضحها :
1) انت عندما استخدمت تعريف المخارج استخدمت التعليمة
trisb=0b00000000;
ولم تعطي المخارج بداية القيمة صفر portb=0b00000000;
وبالتالي في برنامج المحاكاه الذي سارفقه ستجد ان احد المخارج وهو الاخير
ب7 قد اخذ قيمة عشوائية وهي التشغيل..بما انه ليس موصولا به شي في برنامجك فلا مشكلة..ولكن في حال كنت تتعامل مع كل المخارج فيجب ان تجعل المخرج صفر ثم تعطي القيم التي تريدها انت حتى لا يعمل الجهاز المتصل بهذا المخرج عشوائيا ...
2) القيم التي تستخدمها انت بالبرنامج هي قيم صغيرة جدا..فانت تستخدم قيمة بالملي ثانية..فمثلا تستخدم 40 و60 و200 و750 وهكذا..وهي قيم اقل من ثانية..فكل 1000 ميلي ثانية تساوي في الواقع ثانية واحدة..وان العين يصعب عليها ان تلاحظ الحركات السريعة جدا..فيجب ان تستخدم قيم على الاقل 500 ميلي ثانية واكثر من اجل ان تلاحظ تنفيذ بعض التعليمات مثل اطفاء وتشغيل الاضواء وهكذا ..هذا الملف الذي استخدمته بالبروتوس يمكنك ان ترى كيفية تنفيذ البرنامج من خلاله..هذا ما اعتقد انه قد سبب مشكلة التحميل الزائد للبك في البرنامج (الا وهو الفترات الزمنية القصيرة جدا جدا)..وهذا هو البرنامج كما كتبته انت يعمل بشكل جيد معي..
3) البرنامج الذي استخدمته انت وهي تشغيل متلاحق للاضواء او المخارج مع وجود تاخير زمني بين كل مخرجين مشكلته موضوع الفترة الزمنية القصيرا جدا جدا بين تغيير المخارج وبالتاي موضوع الحمل الزائد ايضا..
4) استخدام مؤقت محدد في ابرنامج بدل امر التاخير الذي استخدمته الان غير وارد حسب علمي لان التكرار وحلقات التكرار تستخدم مع اشياء تتكرر بنفس الطريقة فتة من الزم اما ما تطلبه انت فاستخدام امر تكرار مع شي لا يتكرر بطريقة ثابته وهذا ما اعتقد انه يصعب تنفيذه في هذا المستوى.
5)اختصار البرنامج فاعتقد انه بسبب عدم وجود تكرار تعليمات معينه فهذا غير وارد الان خصوصا انك تعطي فترات زمنية غير متساوية وهذا ايضع يلغي تكرارية بعض الاوامر مثل:
for(r=0;r<2;r++)
{portb=0b11111111;
delay_ms(100);
portb=0b11111011;
delay_ms(50);
portb=0b11111111;
delay_ms(250);
portb=0b11111011;
delay_ms(60);
portb=0b11111111;
delay_ms(70);
portb=0b11111011;
delay_ms(40);
portb=0b11111111;
delay_ms(300);
portb=0b11111011;}
delay_ms(80);
6) ان استخدام الامر
if(porta.f0==0) {portb.f0=1;portb.f1=1;portb.f2=1;}
هو نفس الاستخدام
if(porta.f0==0) {portb=0b00000111;}
وهذا لن يؤثر على المعالج بشيء.فهو يقوم طبيعيا بتنفيذ كثير من التعليمات المتتالية مباشرة.. ولكن الفترات الزمنية التي تستخدم (اجزاء من الثانية)وهي تسبب المشكلة..بالاضافة ان العين من المستحيل ان تلحظ التغيرات التي تستخدمها فمثلا 100 ميلي ثانية هي 1 من 10 اجزاء من الثانية. والثانية بالنسبة لنا سريعة جدا فكيف بجزء من 10 منها فمن المستحيل ملاحظتها للعين حتو لو تغيرت في البرنامج فلن تلحظها العين ابدا..
7) الملاحظة التالية:
(ولكن حدث معى نفس المشكلة عندما استخدمت أمر else
واكتشفت أنه لا يمكن تطبيق أمر else مع أمر if فى حالة أن أمر if الثانى يشترط عدم الضغط على الزر فيحاول المعالج معالجة الأمرين فى وقت واحد تقريبا بفارق ضئيل للغاية فى الوقت وهنا يحدث التحميل الزائد على المعالج)
ان المعالج يعمل مع الشرط بالطريقة التالية:
في حال IF يختبر المعالج الشرط فان كان محققا فانه ينفذ ما بعده من اوامر..اما ان لم يتحقق الشرط فيتحقق من else .. وبالتالي لا ينفذ الامرين معا (ΙF,else) ابدا .لانه الشرط اما ان يكون محقق او لا..ففي حال تحقق الشرط فينفذ جمله If.. وان لم يتحقق ينفذ جملة else..هذه طريقة عمل الشرط..ففي حال انه نفذ الاثنين معا فلن يكون هناك جملة شرط تحدد سير البرنامج عندنا...
ولا داعي للاعتذار عن التعلم..فنحن كلنا نتعلم دائما..ولو لم نكن كذلك لما احتجنا احدا من الناس ليساعدنا في شيء..وكما قال الله تعالى: ((وفوق كل ذي علم عليم))..الله ارزقنا العلم النافع لنا ولجميع المسلمين..
السلام عليكم اخي حيدر..
كيف الحال؟ لقد اعجبني حبك ونشاطك وان شاء الله تكون امورك على خير ما يرام...اما البرنامج لدينا (والذي وضعته انت) فهو يدل على انك متابع جدا للمواضيع المتلاحقه وقد فهمتها جيداونحن نحتاج فعلا لتاخير زمني لنلاحظ ان هناك اضاءة لليد..ولكن هذا البرنامج ليس نفس البرنامج الذي طلبه السائل ولكن البرنامج الذي وضعته انت يجب ان يناقش (فانا لم الحظ الفكرة الا عندما طرحتها انت اليوم)..والبرنامج يعمل كالتالي:
جملة IF الاولى تختبر اذا كان المفتاح مضغوط ام لا..فان كان مضغوطا فهي تنفذ حلقة while والتي تقوم بتنفيذ الامر بين القوسين الفارغين مادمنا ضاغطين على المفتاح وبما اننا ضاغطين فسيكون البرنامج في تنفيذ للحلقة المفرغة ولن يعمل اي شي..وعندما نبعد يدنا عن المفتاح فانه سيخرج اشارة على المنفذ ب0 وسيقفز عن الاوامر بعد else (لانه عند البداية اختبر الشرط وكان محقق لهذا سيقفز عن else في نفس الدورة (لنقل انها الاولى) والان بسبب الحلقة loop سيعود من جديد لتنفيذ البرنامج ولاننا كنا قد ازلنا يدنا عن المفتاح فهو لن ينفذ جملة IF لانها غير محققة ويبدا بتنفيذ else مباشرة وهي تخرج صفر على المخرج ب0 وبالتالي فقد الغت الجهد في الحلقة الاولى (بسبب سرعة تنفيذ البرنامج ولان العين لا تلحظ الفترات الزمنة القصيرة جدا..) وهذا سنجد ان البرنامج لا يضيء الليد على المخرج ب0 مهما ضغطنا على المفتاح(فهو فعليا قد اخرج جهد ولكننا لم نلحظه بسبب السرعة العالية لتنفيذ البرنامج) ..ربنا يبارك فيك ويجزيك الخير ويوفقك لما يحبه ويرضاه...
واخر دعوانا ان الحمدلله رب العالمين..وصلى الله على سيدنا محمد وعلى اله وصحبه وسلم..