التدريب الثالث : المفتاح عديم الارتداد :

استعرض الموضوع السابق استعرض الموضوع التالي اذهب الى الأسفل

التدريب الثالث : المفتاح عديم الارتداد :

مُساهمة من طرف Admin في السبت مارس 05, 2016 5:57 pm

التدريب الثالث : المفتاح عديم الارتداد :
الغرض : استعراض كيفية قراءة المفاتيح المتصلة بمنفذ الميكروكونترولر و طريقة علاج ارتداد المفتاح للكشف على المفتاح بطريقة يمكن الاعتماد عليها .
المفتاح عديم الارتداد : ما هو ؟ :
عند الضغط على المفتاح فإن الغلق لا يكون تاما من أول ضغطة لأن مادة تلامساته يحدث بها ارتداد بين بعضها البعض . فى هذه الحالة عند تغذية الإشارة لبوابة منطقية أو ميكروكونترولر فإنه يتم إرسال إشارات لضغطات عديدة والتى لا ترغب فى وجودها لذلك فأنت مجبر على تجاهل إشارة الارتداد وهو ما يعرف بعلاج ارتداد المفتاح أو بالمفتاح عديم الارتداد .
حل مشكلة ارتداد المفتاح يتم وفقا لمترجم الميكروسى كما يلى :
• كشف أول ضغطة على المفتاح ( أو الأولى من عدة ارتدادات) باستخدام الدالة )  Buttonعلى سبيل المثال ، الانتقال من الحالة المنخفضة إلى الحالة المرتفعة) .
• مع الانتظار لفترة محددة بالدالة   .
• اختبار المفتاح مرة أخرى لرؤية ما إذا كان مازال منضغطا أو تم تحريره ( الانتقال من الحالة المرتفعة إلى الحالة المنخفضة ).  
أى أن الحل هو الانتظار حتى يتوقف الارتداد . إما أن تستخدم دائرة لمنع الارتداد أو تستخدم برنامج للانتظار لفترة بعد توقف الارتداد . الدائرة الشائعة لمنع الارتداد مكونة من مجموعة مقاومة ومكثف والتى تبطىء إشارة الدخل التى يتم تغذيتها للبوابة المنطقية ( يتم شحن المكثف عند غلق المفتاح ) .
عند استخدام الميكروكزنترولر ، الطريقة الأفضل هى استخدام البرنامج لمنع ظهور تاثير ارتداد المفتاح لأن الميكروكونترولر يمكنه بسهولة الانتظار لفترة محددة قبل الحكم على أن قيمة المفتاح متاحة . يمكنك أيضا تغيير الفترة الزمنية ولا تحتاج لمكونات إضافية .
عن طريق هذا المثال الصغير يتم تغيير حالة الليدات عند كل ضغطة على المفتاح المتصل بالطرف GPIO3 . لا تنسى تحديد عدم تمكين  MCLR و استخدام المذبذب الداخلى بحيث يمكنك الحصول على ثلاثة أطراف إضافية . الطرف GPIO3 هو طرف "دخل فقط" لذلك يتم استخدامه لتوصيل المفتاح .    
الدائرة الكهربية :



البرنامج :
بعد كتابة التعليقات لتوثيق التدريب نتبع الخطوات التالية :
1- نبدأ بإنشاء دالة الإعدادات اللازمة للتدريب :



الكود:


void init_port(void)
{
ANSEL = 0x00; //set port as digital I/O , not analog input
CMCON = 0x07; //shut off the comparator
TRISIO = 0x08; // 0b001000  = GP3 bit only as input
GPIO = 0x00; //make all pins low "0"
}


2- ثم إعلان متغير من نوع البت لحفظ حالة المفتاح السابقة لمقارنتها بحالته الراهنة  :



الكود:


bit oldstate;              // Old state flag
3- وتبدا الدالة الرئيسية باستدعاء دالة الإعدادات وتصفير بت متغير الحالة السابقة للمفتاح لتكون بصفر وندخل إلى حلقة التكرار :
void main() {
init_port();
oldstate = 0;
  do {



4- نبدا الحلقة باختبار حالة المفتاح ( التحول إلى الحالة المرتفعة)  عن طريق وضع "عائد" دالة المفتاح كشرط لعبارة if . إذا تحقق الشرط (عند الضغط على المفتاح يكون عائد دالة المفتاح بواحد ويكون عائدها بواحد أو true ) يتم تنفيذ عبارة الشرط وهى تحديث بت متغير الحالة السابقة للمفتاح ليكون بواحد كإشارة أو علامة على حالة المفتاح المضغوط (التحول من الحالة المنخفضة إلى الحالة المرتفعة تبعا لصيغة دالة المفتاح ) . لاحظ أن دالة المفتاح تحتوى على زمن تاخير 20 ملى ثانية لعلاج ارتدادات المفتاح .



الكود:


if (Button(&GPIO, 3, 20, 1)) {  // Detect logical one ie pressed button
      oldstate = 1;                // Update flag



5- مرة أخرى يتم عمل اختبار المفتاح ( التحول للحالة المنخفض) وتشكيل عبارة شرط if  . الشرط هذه المرة هو نتيجة عملية  AND ( ورمزها && ) بين حالة المفتاح السابقة والمخزنة ببت الحالة السابقة للمفتاح وبين نتيجة دالة المفتاح (عند التحول للوضع المنخفض) . فإذا كانت الحالة السابقة للمفتاح هى الحالة المضغوطة ( المرتفعة) وتلتها حالة راهنة غير مضغوطة ( منخفضة) كانت نتيجة الشرط صواب true ويتم تنفيذ عبارة الشرط , حيث يتم تحويل حالة أطراف المنفذ وتصفير بت متغير الحالة السابقة للمفتاح . بعبارة أخرى عند الضغط على المفتاح يتم تذكر هذه الحالة , ثم بعد تحرير المفتاح يتم تغيير حالة أطراف المنفذ من حالة الفصل off إلى حالة التوصيل on , وفى الضغطة التالية ثم التحرير يتم التحويل من حالة التوصيل on إلى حالة الفصل off وهلم جرا .



الكود:


if (oldstate && Button(&GPIO, 3,20, 0)) {
      // Detect one-to-zero transition ie press then release
      GPIO = ~GPIO;               // Invert GPIO
      oldstate = 0;               // Update flag
    }                     // beginning of a repeat loop



البرنامج :



الكود:


//EX3:Button : ON-OFF All output using PIC12F675
//4MHz internal clock
//Master Clear Enable : Disable
//Eng:F.Abdelaziz
//Date :05-03-2016

void init_port(void)
{
ANSEL = 0x00; //set port as digital I/O , not analog input
CMCON = 0x07; //shut off the comparator
TRISIO = 0x08; // 0b001000  = GP3 bit only as input
GPIO = 0x00; //make all pins low "0"
}

bit oldstate;              // Old state flag
void main() {
init_port();
oldstate = 0;
  while(1) {          // endless loop
    if (Button(&GPIO, 3, 20, 1)) {  // Detect logical one ie pressed button
      oldstate = 1;                // Update flag
    }
    if (oldstate && Button(&GPIO, 3,20, 0)) {
      // Detect one-to-zero transition ie press then release
      GPIO = ~GPIO;               // Invert GPIO
      oldstate = 0;               // Update flag
    }                     // beginning of a repeat loop
  }  
}

Admin
Admin

عدد المساهمات : 1003
تاريخ التسجيل : 28/01/2014

معاينة صفحة البيانات الشخصي للعضو http://fathallaabdelaziz.forumarabia.com

الرجوع الى أعلى الصفحة اذهب الى الأسفل

استعرض الموضوع السابق استعرض الموضوع التالي الرجوع الى أعلى الصفحة


 
صلاحيات هذا المنتدى:
لاتستطيع الرد على المواضيع في هذا المنتدى