 |
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
|
|
نشاط [ F.Abdelaziz ]
قوة السمعة:
|
|
23-11-2015, 09:45 PM
المشاركة 10
|
|
علاج الارتداد (الوثبات) فى المفاتيح Switch De- Bouncing
جميع المفاتيح الميكانيكية ليست مثالية فهى تظهر نوعا من مشاكل ارتداد التلامس . فكلما تم ضغط اثنين من التلامسات المعدنية لمفتاح معا ، سوف يكون هناك بعض الوقت القصير ( حوالى 10 ملى ثانية) قبل أن يستقر عمل التلامس الكهربائى . خلال هذه الفترة فإن تلامسات المفتاح تولد العديد من توصيل وفصل التلامسات ، كما هو مبين بالشكل التالى :
هذا النوع من السلوك غير مرغوب فيه فى الدوائر المعتمدة على الميكروكونترولر ، لأن حالة دخل المفتاح قد لا تكون معروفة بالضبط بعد الضغط على المفتاح .
يمكن القضاء على مشاكل ارتداد المفتاح إما بالأجهزة (الهاردوير) أو بالبرمجيات (السوفت وير) .
• فى الأجهزة ، عادة ما تستخدم دائرة مقاومة ومكثف RC كمرشح ، أو يستخدم قلاب (فليب فلوب) للقضاء على ارتداد تلامس المفتاح .
• فى البرمجيات ، عادة ما يتم إدراج تأخير صغير ( 10 ملى ثانية مثلا) بعد تغييرات حالة المفتاح ، من أجل القضاء على ارتداد تلامس المفتاح .
المترجم الميكروسى برو يوفر دالة مدمجة تسمى ‘button’ ، والتى تستخدم للقضاء على مشاكل ارتداد التلامسات . فمن المستحسن استخدام هذه الدالة عندما يكون مطلوبا قراءة حالة مفتاح ميكانيكى . هذه الدالة تكون بالصيغة التالية :
كود:
Button(&port, pin, time, active_state)
• حيث port و pin تحدد المنفذ والطرف المتصل بالمفتاح . هذا الطرف يجب تحديده كطرف دخل input
• و time هو الفترة الزمنية للقضاء على الارتداد بالملى ثانية .
• و active_state تكون (1) أو (0) وتحدد إذا كان طرف المنفذ فعال على المنطق (0) أو فعال على المنطق (1) .
الاستخدام النموذجى لهذه الدالة مبين بالمثال التالى :
كود:
Button(&PORTB, 0, 1, 1);
فى هذا المثال ، يتم توصيل المفتاح إلى الطرف RB0 للمنفذ PORTB يتم تحديد زمن القضاء على الارتداد بواحد ملى ثانية ، وطرف المنفذ يصبح عند المنطق (1) عند الضغط على المفتاح (فعال فى الحالة المرتفعة) .
تعديل برنامج المشروع الرابع باستخدام الدالة Button للقضاء على ارتداد تلامسات المفتاح :
كود:
/********************************************************************
Project4-b
WHEEL OF LUCKY DAY
----------------------------------
In this project 7 LEDs are connected to PORT B of a PIC16F877A type microcontroller (any other PIC microcontroller can also be used in this project). In addition, a push-button switch is connected to bit 7 of PORT B (RB7). The microcontroller is operated from an 8MHz crystal.
In this project the LEDs are constructed in the form of a circle and the days of the week are written next to each LED. When the push-button switch is pressed the LEDs start rotating fast. Pressing the button stops while only one LED is lit. The day name corresponding to this LED is your lucky day!.
In this modified program the switch contacts are de-bounced using the mikroC
"Button" function
******************************************************************/
void main()
{
unsigned int Cnt = 1; // Initialise Cnt
CMCON = 0x07; // To turn off comparators
ADCON1 = 0x06; // To turn off analog to digital converters TRISB = 0x80; // RB0-RB6 output, RB7 input
PORTB = 0;
for(;;)
{
while(Button(&PORTB, 7, 5, 1)); // Wait until button is pressed
while(Button(&PORTB, 7, 5, 0)); // Wait until button is released
for(;;) // FOREVER loop
{
PORTB =Cnt; // Send Cnt to PORT B
Delay_Ms(50); // Delay 100ms
Cnt = Cnt << 1; // Left shift Cnt
if(Cnt == 0)Cnt = 1;
if(Button(&PORTB, 7, 5, 0))break; // If button is pressed
}
while(Button(&PORTB, 7, 5, 0)); // Wait until button is released
}
}
• لاحظ أنه قد تم إزالة التأخير واحد ثانية من البرنامج ، حيث لا توجد مشاكل ارتداد التلامسات .
• لاحظ أنه إذا لم يتم تضمين مكتبة Button فى مشروعك ، قد تحصل على خطأ أثناء وقت الترجمة . لتضمين هذه المكتبة ، انقر على View -> Library Manager وقم بتمكين المكتبة Button بالنقر عليها . الوضع الافتراضى عن لإنشاء مشروع جديد هو ضم جميع المكتبات .
|