 |
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
|
|
نشاط [ F.Abdelaziz ]
قوة السمعة:
|
|
19-02-2012, 01:43 PM
المشاركة 20
|
|
التعامل مع المداخل والمخارج الأساسية :
مقدمة :
سوف نتناول "قراءة" المداخل الرقمية من المفاتيح الضاغطة push button switch ( كعينة للحساسات الرقمية).
المدخل الرقمى له قيمتان فقط : القيمة واحد 1 أوالقيمة صفر 0 .
سوف يتم قراءة حالة المفتاح المتصل بالطرف RC0 (كمثال لحساس رقمى ) وعند كل مرة يتم الضغط عليه يتم تحويل الليد المتصل بالطرف RD0 (كمثال لجهاز خرج ) بين حالتى التوصيل والفصل . أى عند الضغطة الأولى يضىء الليد ON وعند تحرير الضغط يظل الليد على حالته (الإضاءة) ON , ثم عند الضغطة الثانية ينطفىء الليد OFF وعند تحرير الضغط يظل الليد على حالته (عدم الإضاءة) OFF ويتكرر هذا العمل بتكرار الضغط .
هذا البرنامج يمثل تشغيل (توصيل) ON وتبطيل (فصل) OFF أى جهاز بمفتاح ضاغط واحد حيث يمكن توصيل ترانزستور و ريلاى مكان الليد وتوصيل الجهاز بتلامسات الريلاى .
الدائرة الكهربية :
نظرية العمل :
فى الوضع العادى (الابتدائى) يكون المفتاح مفتوح (منفصل) ومن ثم يكون الطرف RC0 فى الحالة المرتفعة لاتصاله بالجهد الموجب خلال المقاومة 10K .
عندالضغط على المفتاح يتصل الطرف RC0 بالأرضى ويقوم الميكروكونترولر بقراءته كحالة منخفضة Low أى أن المفتاح الضاغط ما هو إلا طريقة تعطى الميكروكونترولر مدخلات رقمية (منطقية) بالقيمة 1 (تمثل أن المفتاح غير مضغوط) أو بالقيمة 0 (تمثل أن المفتاح غير مضغوط) .
ملاحظة :
يمكن عكس الحالة المنطقية بوضع المفتاح مكان المقاومة والمقاومة مكان المفتاح كما فى الشكل التالى (لكننا سوف نستخدم الحالة الأولى) :
البرنامج :
حيث أن المفتاح متصل بالطرف RC0 فيجب إعداده كمدخل فى الخانة المناظرة بسجل التحكم فى اتجاه البيانات TRISC .
المترجم MikroC يمتلك مكتبة دالة لروتين قراءة المداخل الرقمية (كالمفتاح أو أى حساس رقمى ON/OFF ) تسمى Button.
لنتذكر معا هذه الدالة :
مكتبة المفاتيح الضاغطةBUTTON LIBRARY :
توفر مكتبة BUTTON روتينات لكشف الضغط على المفاتيح الضاغطة ومعالجة مشكلة الارتدادات بها نتيجة اهتزازات التلامسات عند الضغط عليها .
صيغة دالة المفتاح الضاغط
- نبدأ بكتابة اسم الدالة وهو كلمة Button: عائد (نتيجة) هذه الدالة متغيرنوع unsigned short (سعته بايت أى مداه( 0-255 وهو إما يكون 255 ( أى آحاد) أو يكون 0 (أى أصفار) .
- ثمداخل قوسين (…,…,…,…) نكتب أربع بارامترات أو أدلة بينهما فاصلة .
- البارامتر الأول :وهو مؤشرا للمنفذ المتصل به المفتاح *port وهو متغيرنوعunsigned short ثم فاصلة .
ثم البارامتر الثانى : وهو الطرف المتصل به المفتاح pin ومتغير نوع unsigned short وفاصلة . المنفذ port ويمكن أنيكون 0….7 . ويجب إعداد الطرف المتصل بالمفتاحكمدخل . - ثم البارامتر الثالث : وهو زمن time منع ظهور تأثير الارتدادات فى المفتاح بالملى ثانيةوهو متغير نوع unsigned short وفاصلة .
· ثم البارامتر الرابع : وهو حالة المفتاح وهو فعال active_state وهو متغير نوع unsigned short . ويمكن أن يكون 0 أو 1 ويحدد أن كانالمفتاح فعال فى الحالة المنطقية 0 أو الحالةالمنطقية 1 .
ملحوظة :
المؤشرات Pointers
المؤشرات هي كائنات خاصةلحفظ (أو "الإشارة إلى ") عناوين بالذاكرة.
فيالمترجم mikroC PROيمكن الحصول على عنوان كائن بالذاكرةعن طريقالعامل( & ) ,
ونستخدم العامل (*) كمؤشر للوصول إلىالكائن المشار إليه.
التعليق على االبرنامج :
كود:
/* Toggle an LED with a Push Button Switch
PIC16F877A* 4MHz, MCLR Enabled, PWRT Enabled, WDT OFF */ // Define the LED * RD0 and push button switch * RC0
sbit LED at RD0_bit; //RD0_bit == PORTD.B0
sbit Switch at RC0_bit; //RC0_bit == PORTC.B0 // Macros for Button() function
#define Switch_Pin 0 // BUTTON at pin 0 of PORTC
#define Switch_Port PORTC//BUTTON at PORTC
#define Debounce_Time 20 // Switch Debounce time 20ms void main()
{
TRISD = 0; // PORTD All Outputs
TRISC = 0b11111111; // PORTC All Inputs
LED = 0; // Initial condition
do {
if (Button(&Switch_Port, Switch_Pin, Debounce_Time, 0))
{
if (!Switch) // Check the button press again after the debounce time
{
LED = ~LED;
} while (!Switch); // Wait until the button is released
}
} while(1); // Infinite Loop
}
1- رأس (مقدمة) البرنامج على شكل تعليقات تبدأ بالرمز "/* "وتنتهى بالرمز " " */
2- تعريف الطرف RD0 (المتصل به الليد) باسم يسهل تتبع وفهم البرنامج وهو LED . هذا الطرف هو البت صفر من سجل وظائف خاصة وهو المنفذ PORTD لذلك نستخدم كلمة وتعريف المفتاح المتصل بالطرف RC0 باسم Switch .
ملحوظة : فى الميكروسى برو يمكن التعامل مع البتات المفردة بعدة طرق منها , على سبيل المثال , RD0_bit وهى نفسها PORTD.B0 .
3- تعريفات بارامترات دالة المفتاح باستخدام الموجه #define: فطرف المفتاح يستبدل بالصفر (RC0 هى البت صفر بالمنفذ PORTC ) , ومنفذ المفتاح هو PORTC لأن المفتاح متصل بالطرف RC0 . واستبدال زمن ملاشاة الارتدادات بالقيمة 20 وتعنى 20 ملى ثانية . أما بارامتر الحالة الفعالة فلا يحتاج لتعريف فالحالة الفعالة للمفتاح : عندما يضغط يكون الطرف عليه صفر .
4- بداية الدالة الرئيسية وفيها : # جميع أطراف المنفذ PORTD كمخارج .
# جميع أطراف المنفذ PORTC كمخارج .
# تصفير خانة الخرج لتهيئتها لبدء العمل والليد فى حالة فصل OFF .
- الدخول فى حلقة غير منتهية do{….} while(1) وفيها :
# اختبار حالة (وضع) المفتاح بتعبير الشرط if(……) فأن تحقق الشرط الموجود بين القوسين كانت نتيجته الواحد يتم تنفيذ التعليمات التى تليه .هذا الشرط يعنى "قراءة حالة المفتاح المتصل بالمنفذ والطرف المحددة وبعد عمل التأخير الزمنى " هل هو فى الحالة الفعالة 0 أى هل هو مضغوط ؟ فإن كان فى الحالة 0 أى كان مضغوطا تصبح نتيجة (عائد) دالة المفتاح حقيقية أى 1 ومن ثم يتحقق شرط if ويتم تنفيذ التعليمات التابعة له.
# شرط if آخر : "هل حالة المفتاح أى الطرف RC0 بعد عكسها (بمؤثر المعكوس أو النفى ! ) تكون النتيجة حقيقية أى 1 " وحالة الطرف RC0 عندما يكون المفتاح مضغوط (وهو ما تسبب فى تنفيذ هذه التعليمة) هى الحالة المنخفضة وعكسها هى الحالة المرتفعة أى يتحقق أيضا شرط if وذلك للتأكد من حالة المفتاح بعد مضى زمن التأخير اللازم للتغلب على الارتدادات ما زالت فى وضع التوصيل ON ( حتى يستقر وضع المفتاح) , نتيجة لذلك يتم تنفيذ العبارة التابعة .
# عكس حالة الليد (المخرج) . الليد (المخرج) كان فى الحالة المنخفضة (تصفير البداية) لذلك يتحول إلى الحالة المرتفعة أى يتم إضاءته (تشغيل الجهاز) .
# يلى ذلك حلقة while (!Switch). أثناء الضغط على المفتاح يتحقق الشرط!Switch لذلك يظل البرنامج عند الجزء الخاص بهذا البرنامج بدءا من do طالما أن المفتاح مضغوط . فأذا تم تحرير المفتاح أصبح كل من شروط if ونتيجة!Switch غير متحققة ويخرج البرنامج ليجد while(1) فتتكرر العملية من البداية من do ليختبر المفتاح مرة أخرى ولكن نتيجة المرة التالية تكون عكس الخرج أى تحويله من حالة التوصيل إلى حالة الفصل . ويتكرر العمل .
البرنامج بطريقة أخرى :
|