بارك الله فيك أخى robota على هذه الكلمات الطيبة وأتمنى أن أكون دائما عند حسن الظن ...
*******************************************
بخصوص هذا الأمر
كود:
if (Button(&PORTA, 0,1,1))
فالدالة button هى إحدى الدوال الجاهزة فى الميكروسى تستخدم لقراءة حالة طرف معين فى أحد البورتات الموصلة عليها سويتش أو مفتاح
أهم ميزة فى هذه الدالة هى أنها تلغى التأثير الناتج من عملية التشويش على السويتش switch-bounce problem .. وهى مشكلة تحدث فى الواقع ولا تظهر عند المحاكاة . وتتمثل المشكلة فى أنه عند الضغط على السويتش لن تتغير حالة البورت فى نفس اللحظة من حالة واحد منطقى إلى صفر منطقى ( طبعا إذا كان الطبيعى من غير الضغط هو الواحد المنطقى) ... بل يحدث تشويش بحيث تقرأ هذه الضغطة وكأنها عدة ضغطات حتى يستقر البورت الموصل عليه السويتش على حالة واحدة فقط
أى أن المشكلة هى أن المتحكم يقرأ الضغطة الواحدة على السويتش وكأنها عدة ضغطات
*****************************************
ولحل هذه المشكلة توجد أكثر من طريقة عن طريق البرمجة software أو عن طريق hardware إضافات فى الدائرة مثل استخدام rc filter أو schmitt trigger
مايهمنا هنا هو الطريقة المتبعة لحل المشكلة عن طريق البرمجة :
وهو أمر سهل جدا ... فقط نقوم بقراءة طرف البورت الموصل عليه السويتش وعندما يتم الضغط على السويتش أنتظر فترة التشويش حتى تستقر حالة البورت على حالة واحدة ثم أقوم بعمل المهمة المرادة
مثال :
هذا جزء من برنامج يقوم بإضاءة ليد مثلا موصلة على الطرف RC0 عند الضغط على المفتاح الموصل على الطرف RB0
كود:
if (portb.f0 == 0)
{
delay_ms(20) ; // wait for de-bouncing
portc.f0 = 1 ;
}
أما الدالة Button فقد وفرت ذلك كله ... فقط تعطيها البورت الموصل عليه السويتش و رقم الطرف وفترة الانتظار ( بالميللى ثانية ) و الشرط المراد تحقيقه ( صفر أم واحد )
مثال :
الأوامر السابقة يمكن كتابتها باستخدام هذه الدالة الجاهزة وستؤدى نفس المهمة
كود:
if (Button(&PORTb, 0,20,0)) portc.f0 = 1 ;
تذكر أن هذا كله لايظهر عند المحاكاة ... فقط فى الواقع تظهر هذه المشكلة