|
طيب . ما توصلنا له انا والاخ فادي هو تجزئة الوقت الى اجزاء صغيرة كان تكون ثانية واحد و كتابة عبارة التاخير delay داخل عداد و عند الضغط على المفتاح يتم زيادة القيمة للقصوى للعداد و اذا تم الضغط على المفتاح الثاني يتم انقاص القيمة القصوى للعداد . هل هذه الفكرة صحيحة ؟
|
لقد اقتربتم جدا من الحل الصحيح الذي اقصده ..
المشكلة في الكود انه يحتوي على الأمر
فماذا يحدث لو ضغط المستخدم على اي سويتش اثناء تنفيذ الميكروكنترولر للأمر السابق .. بالطبع لن يستجيب
إذن علينا التخلص من هذا الأمر واستبداله بدالة تقوم بعملية الانتظار وفي نفس الوقت تقوم بعملية اختبار السويتشات sacanning switches
مثال :
لو كان لدينا سويت a0 و a1 وكنا نريد عمل انتظار لمدة خمس ثواني
ولكن اثناء وقت الانتظار لو تم الضغط على a0 يتم تنفيذ حدث معين
ولو تم الضغط على a1 اثناء وقت الانتظار يتم تنفيذ حدث آخر معين
إذن سنستبدل الأمر
بمجموعة أوامر أو بدالة أخرى عبارة عن مجموعة أوامر
وتكون الدالة معرفة كما يلي
كود:
void delay_5_and_scan()
{
int kk;
for(kk=0;kk<500;kk++)
{
delay_ms(10);
if(pora.f0==0) نفذ حدث معين
if(pora.f0==0) نفذ حدث آخر
}
}
هل لاحظت الفكرة وهي تجزيء الوقت فبدلا من انتظار خمس ثواني سننتظر 10 ملي ثانية وبتكرار هذه العملية خمسمائة مرة نحصل على خمس ثواني
طبعا الوقت 10 ملي ثانية هذا صغير جدا وضغطة السويتش أقل ضغطة لها زمن ربما يقترب من المئة ملي ثانية .
إذن في اي لحظة نضغط فيها على السويتش سيستجيب الميكروكنترولر .
ربما تقول ولكن ماذا اذا كان الميكروكنترولر ينفذ امر آخر غير امر التاخير . اقول ان اي أمر آخر لن يستغرق تنفيذه الملي ثانية فهو اقل من ذلك بكثير( غالبا) وبالتالي سينفذه الميكروكنترولر بسرعة وينتقل للأمر التالي وهكذا إلى ان يصل للأمر الذي يختبر السويتشات .
ارجو ان تكون هذه الفكرة البرمجية المهمة فهي لا تقدر بثمن ولم أجدها في أي كتاب او مرجع علمي .
فأرجو أن تكون قد وصلت وتم فهمها من الجميع
تمنياتي لكم بمزيد من الاحترافية في هذا المجال وبكل التميز .
وغفر الله لنا ولكم ,
(اللهم لا تبعد عنا اناسا بعدما أحببناهم , , وعجل بنصرك وتاييدك وأبهج قلوبنا برؤيتهم والحديث معهم)