التجربه الثانية :- توصيل مفتاح بالميكروكنتروللر

الوصف (Description):-
سوف نتناول "قراءة" المداخل الرقمية من المفاتيح الضاغطة push button switch   المدخل الرقمى يمتلك قيمتان فقط : القيمة واحد  1 والقيمة صفر  0 .   سوف يتم قراءة حالة المفتاح المتصل بالطرف Rb1 وعند كل مرة يتم الضغط عليه يتم تحويل الليد المتصل بالطرف Rb0 بين حالتى التوصيل والفصل . أى عند الضغطة الأولى يضىء الليد وعند الضغطة الثانية ينطفىء الليد ويتكرر هذا العمل بتكرار الضغط .
هذا البرنامج يمثل تشغيل(توصيل) ON  وتبطيل(قص) OFF  أى جهاز بمفتاح ضاغط واحد حيث يمكن توصيل ترانزستور و ريلاى مكان الليد وتوصيل الجهاز بتلامسات الريلاى


النظرية المطلوبة   ( Required Theory)
يجب الأطلاع علي
·       البورت B والبورت A   للميكرو 16F88
·       كيفيه التحكم(توجيه) في المسجلات  TRISA   و  TRISB 
(يمكن الاطلاع علي هذا في الجزء الخاص بشرح المتحكم 16F88 )
نبذه عن داله المفتاح  Button
تقوم الدالة بمعالجة الارتدادات الناتجة عند الضغط على المفتاح de-bouncing ومكتبة المفاتيح الضاغطة BUTTON LIBRARY : تحتوى هذه المكتبة على العديد من الروتينات المفيدة لتطوير المشروع .
صيغة دالة المفتاح الضاغط :-
البارامتر port يحدد موقع المفتاح الضاغط (المنفذ).
والبارامتر pin هو رقم الطرف فى المنفذ port ويمكن أن يكون 0….7
والبارامتر time هو الزمن اللازم لمعالجة الارتدادات بالملى ثانية
والبارامتر active_state يمكن أن يكون 0 أو 1 ويحدد أن كان المفتاح فعال فى الحالة المنطقية 0 أو الحالة المنطقية 1
مخطط الدائرة    (Circuit Diagram)
فى الوضع العادى (الابتدائى) يكون المفتاح مفتوح (منفصل) ومن ثم يكون الطرف RB1 فى الحالة المرتفعة لاتصاله بالجهد الموجب من خلال المقاومة 10K وعندالضغط على المفتاح يتصل الطرف   RB1 بالأرضى ويقوم الميكروكونترولر بقراءته كحالة منخفضة Low أى أن المفتاح 
الضاغط بتغير يطريقة  تعطى الميكروكونترولرمدخلات رقمية بالقيمة 1 أو بالقيمة 0

البرنامج (Software)


sbit LED at Rb0_bit;
sbit Switch at Rb1_bit;                                
 #define Switch_Pin 1
 #define Switch_Port PORTb
 #define Debounce_Time 20
  
void main() {
 ANSEL = 0b00000000//All I/O pins are configured as digital
 OSCCON = 0b01110100;
 TRISb = 0b00000010// PORTC All Outputs
 TRISA = 0b00001000// PORTA All Outputs, Except RA3
 LED = 0;
 do {
  if (Button(&Switch_Port, Switch_Pin, Debounce_Time, 0)) {
    if (!Switch) { LED = ~LED; }
    while (!Switch); // Wait for release of the button
                                                          }
    } while(1);  // Infinite Loop

                              {                               

 شرح البرنامج

تعريف الطرف Rb0 المتصل به الليد باسم يسهل تتبع وفهم البرنامج وهو LEDهذا الطرف هو الخانة صفر من سجل وظائف خاصة وهو المنفذ PORTb لذلك نستخدم التعبير  sbit LED at Rb0_bit;  وتعريف المفتاح المتصل بالطرف Rb0 باسم Switch 
تعريفات بارامترات دالة المفتاح :  فطرف المفتاح يستبدل بالصفر ومنفذ المفتاح هو PORTb لأن المفتاح متصل بالطرف Rb0 . واستبدال زمن ملاشاة الارتدادات بالقيمة 20 وتعنى 20 ملى ثانية . أما بارامتر الحالة الفعالة فلا يحتاج لتعريف
إعدادات البداية :
#  فصل المقارنات لكى نستخدم جميع الأطراف كمداخل / مخارج رقمية CMCON = 0×07 ;
# جميع أطراف المنفذ PORTB كمخارج TRISB = 0b000000100; فيما عدا الطرف RB1 لاتصاله بالمفتاح
# جميع أطراف المنفذ PORTA كمخارج به والطرف RA3 لأنه طرف MCLR TRISA = 0b00100000;
# تصفير خانة الخرج لتهيئتها لبدء العمل LED = 0;


الدخول فى حلقة غير منتهية  الغير منتهية


اختبار حالة (وضع) المفتاح بتعبير الشرطif(……)  فأن تحقق الشرط الموجود بين القوسين والسؤال متي يتحقق الشرط؟؟ والاجابه عندما تكون نتيجه اداله المفتاح بواحدوالسؤال... متي تكون نتيجه داله المفتاح بواحد ؟؟؟؟  عندما يتغير وضع المفتاح من الحاله (1) الي الحاله (0)  حينئذ تعطي الداله واحد وبذلك  يتم تنفيذ التعليمات التى تليه .اي ان هذا الشرط يعنى "قراءة حالة المفتاح المتصل بالمنفذ والطرف المحددة وبعد عمل التأخير الزمنى " هل هو فى الحالة الفعالة 0 أى هل هو مضغوط ؟ فإن كان فى الحالة 0 أى كان مضغوطا تصبح نتيجة (عائد) دالة المفتاح حقيقية أى 1 ومن ثم يتحقق شرط if ويتم تنفيذ التعليمات التي تلي الشرط 

# شرط if آخر : " يقوم بأختبا ر طرف الميكرو المتصل بالمفتاح  فأذا ساوي هذا الطرف صفر يتحقق الشرط وينفذ الاوامر التي تلي هذا الشرط وكاننا كتبنا هذا الشرط بأسلوب اخر وهو  if (Switch==0)

عكس حالة الليد (المخرج) . فأذا كان منطفئ فيضئ وأذا كان مضئ ينطفئ


 أثناء الضغط على المفتاح يتحقق هذا الشرط  لذلك يظل البرنامج عند الجزء الخاص بهذا البرنامج بدءا من do . فأذا تم تحرير المفتاح أصبح كل من شروط if ونتيجةwhile (!Switch); غير متحققة ويخرج ليجد while(1);   فتتكرر العملية من البداية من do ليختبر المفتاح مرة أخرى ولكن نتيجة المرة التالية تكون عكس المخرج أي تحويله من حالة التوصيل إلى حالة الفصل . ويتكرر العمل .
تجريب التجربه علي Proteus


فيديو التجربة





هناك تعليق واحد :