قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الالي قسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots

أدوات الموضوع

armma
:: مهندس ::
تاريخ التسجيل: Aug 2010
الدولة: jordan
المشاركات: 33
نشاط [ armma ]
قوة السمعة:0
قديم 28-08-2017, 10:12 PM المشاركة 1   
افتراضي كيفية حل مشكلة ال Bouncing للمفاتيح باستخدام البرنامج ؟ Twitter FaceBook Google+



السلام عليكم

كيف يمكن حل مشكلة ال Bouncing للمفاتيح برمجيا ؟

بارك الله فيكم

اعلانات

supersarmed
:: مهندس ::
تاريخ التسجيل: Jan 2011
الدولة: العراق
المشاركات: 35
نشاط [ supersarmed ]
قوة السمعة:0
قديم 29-08-2017, 08:58 AM المشاركة 2   
sun


قد تجد ضالتك في هذا الشرح الوافي

http://www.qariya.info/vb/showthread...to_threadtools

اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )
  

مشتاق الله
:: مهندس متميز ::
تاريخ التسجيل: Oct 2015
المشاركات: 620
نشاط [ مشتاق الله ]
قوة السمعة:0
قديم 30-08-2017, 06:55 AM المشاركة 3   
sun


بسم الله الرحمن الرحيم

احب اضافة الى اقتراح اخ سوبر ,

فكرة التغلب على الارتداد هى ان يقوم البرنامج بالاحساس بأول نبضة من المفتاح فقط و لا يشعر بما بعدها من ارتداد او نبضات تحدث فى فترة زمنية صغيرة حوالى 20 - 50 مللى ثانية , لذلك فانك برمجيا لديك حلان :

1- عند وصول اول نبضة تجعل البرنامج يدخل فى loop زمنها حوالى 50 مللى , بحيث ينشغل المعالج ب loop فلا يقرا ارتداد المفتاح حتى يستقر ثم بعدها يقوم بتنفيذ و استكمال البرنامج , و بذلك نكون قد قرانا اول نبضة فقط و اغفلنا المعالج عن الباقى .
و تتم هذه الطريقة ببساطة باستخدام امر delsy_ms(50) بعد امر قراءة المفتاح .

مثال :
كود:

#define PINB.B1 BUTTON

while(1){
    if (BUTTON == 1) {
        delay_ms(50);
        // do something 
    }
    
}
و هذه الطريقة تنفع فى البرامج البسيطة التى لا يمثل وجود تاخير و اشغال المعالج فى loop اى مشكلة على سير البرنامج .


2- عند وصول اول نبضة فان البرنامج يقوم بتشغيل تايمر فقط او قراءة القيمة الحالية للتايمر ان كان فى حالة عمل , و يترك المعالج يكمل البرنامج و كان المفتاح لم يضغط اصلا , و عند وصول التايمر للزمن 50 مللى حيث يكون المفتاح استقر , فان البرنامج يقوم بتنفيذ امر المفتاح .

و هذه الطريقة افضل بكثير من السابقة , الا انها تحتاج بعض التركيز .
و لها اكثر من خوارزم , منها مثلا :

كود:
#define PINB.B1 BUTTON

while(1){
    if (BUTTON == 1) {
         /* start timer */     
         }
         
    if ( timer_value > 50)
    {
        // stop timer
        // do something
    }
}
و اليك هذا المقال من احد خبراء الميكرو فى مشكلة الارتداد .
http://www.ganssle.com/debouncing.htm

و ما توفيقى الا بالله


و افوض امرى الى الله



ماجد عباس محمد
:: نائب المشرف العام
::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 12,214
نشاط [ ماجد عباس محمد ]
قوة السمعة:408
قديم 30-08-2017, 08:04 AM المشاركة 4   
افتراضي


الإخوة الكرام
مجموعة ميكروالكترونيكا "ميكرو سى - ميكرو بيزك - ميكرو باسكال" بها وظيفة Button لهذا الغرض
لماذا إعادة اختراع العجلة؟؟


armma
:: مهندس ::
تاريخ التسجيل: Aug 2010
الدولة: jordan
المشاركات: 33
نشاط [ armma ]
قوة السمعة:0
قديم 01-09-2017, 05:24 PM المشاركة 5   
افتراضي


السلام عليكم

بارك الله فيكم جميعا

اخ ماجد المشكل اني لا استخدم اي من الكومبايلرات المذكورة


هل الحل البرمجي افضل عمليا من استخدام دائرة خارجية ؟


ماجد عباس محمد
:: نائب المشرف العام
::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 12,214
نشاط [ ماجد عباس محمد ]
قوة السمعة:408
قديم 02-09-2017, 06:48 AM المشاركة 6   
افتراضي


السلام عليكم

بارك الله فيكم جميعا

اخ ماجد المشكل اني لا استخدم اي من الكومبايلرات المذكورة
أى كومبايلر تستخدم؟
هل الحل البرمجي افضل عمليا من استخدام دائرة خارجية ؟
المسألة حسب الدائرة و البرنامج
لو البرنامج محدود و لديك الوقت الكافى لإستخدام دوائر تأخير و الكلفة المادية ذات أهمية إذن دوائر التأخير أنسب
أما لو العكس فيمكن إضافة مكثفات مثلا و فى حال كون عدد المفاتيح كبير و السرعة ذات أهمية قصوى فقد تستخدم أسلوب المقاطعة لقراءة المفاتيح فقط عند الضرورة أو يوضع أحيانا ميكرو للقراءة و آخر لتنفيذ المهام


armma
:: مهندس ::
تاريخ التسجيل: Aug 2010
الدولة: jordan
المشاركات: 33
نشاط [ armma ]
قوة السمعة:0
قديم 02-09-2017, 12:50 PM المشاركة 7   
افتراضي


أى كومبايلر تستخدم؟

المسألة حسب الدائرة و البرنامج
لو البرنامج محدود و لديك الوقت الكافى لإستخدام دوائر تأخير و الكلفة المادية ذات أهمية إذن دوائر التأخير أنسب
أما لو العكس فيمكن إضافة مكثفات مثلا و فى حال كون عدد المفاتيح كبير و السرعة ذات أهمية قصوى فقد تستخدم أسلوب المقاطعة لقراءة المفاتيح فقط عند الضرورة أو يوضع أحيانا ميكرو للقراءة و آخر لتنفيذ المهام

استخدم CCS C compiler

بالنسبة للبرنامج الذي اعمل عليه حاليا يقوم بقراءة اربعة مفاتيح وبناء على حالة كل مفتاح يقوم الميكرو بتنفيذ امر معين يناسب كل مفتاح ..

الذي قمت بعمله كالتالي

كود:
int1 read_start(void) {

  
   if (READ_STARTBT==1) return 1;

   delay_ms(50); // wait for key to settle


   if (READ_STARTBT==1) return 1; // was a false key 

   return 0; // key ok so return valid
}
هذا فنكشن لقراءة احد المفاتيح ..


كود:

for(del=0;del<1000;del++){ 
START=read_start();
CHANGE=read_plus();
CHANGEM=read_minus();
SET=read_set();
if(START==0|CHANGE==0|CHANGEM==0|SET==0)BREAK;//IF ANY SWITCH PRESSED BREAK THE DELAY LOOP ^_^
DELAY_MS(1);
}
هذا جزء قراءة المفاتيح داخل الحلقة اللانهائية في البرنامج
حيث انني بحاجة لزمن تاخير بمقدار ثانية فقمت بعمل حلقة للتاخير باستخدام for
وداخلها اقوم بفحص المفاتيح


التعديل الأخير تم بواسطة : armma بتاريخ 02-09-2017 الساعة 12:55 PM

ماجد عباس محمد
:: نائب المشرف العام
::
تاريخ التسجيل: Jun 2009
الدولة: القاهرة - مصر
المشاركات: 12,214
نشاط [ ماجد عباس محمد ]
قوة السمعة:408
قديم 03-09-2017, 06:32 AM المشاركة 8   
افتراضي


انت لا تحتاج لكل هذا الكود فعادة ما يوصل الطرف كدخول Input و يوصل بمقاومة 10 ك للتغذية وهى تجعله غير حساس للجهود المحيطة و يكون عادة كدخل = 1 أو إن شئت توصل المقاومة للأرضى فتكون = صفر
الاختبار مثلا فى حال = صفر عادة هو
كود:
if (READ_STARTBT==1) ;

      delay_ms(50); // wait for key to settle then do your thing , It is changed and no more checks needed
الهدف من التأخير هو عدم قراءة الزر مرتين أو أكثر أثناء نفس الضغطة
البعض يضيف اختبار آخر ينتظر حتى يعود الزر لأصله لتجنب القراءة عند الضغط لزمن طويل و البعض يقبلها كبديل لتكرار الضغط

إضافة رد

العلامات المرجعية

«     الموضوع السابق       الموضوع التالي    »
أدوات الموضوع

الانتقال السريع إلى


الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 06:55 PM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)

Powered by vBulletin® Version 3.8.6, Copyright ©2000 - 2025