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

   

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 07-06-2012, 04:10 AM المشاركة 25   
افتراضي



رابعا : البرمجة :
يتم كتابة البرنامج باستخدام المحرر JALEdit . بمجرد بدء المحرر سوف تشاهد صفحة فارغة حيث يتم إدخال البرنامج .







يتكون البرنامج من سلسلة أوامر . هذه الأوامر تخبر الميكروكونترولر PIC16F877A كما يجب عليه القيام بفعله . تبدأ الأوامر من إلى الصفحة إلى أسفلها ( بعض الأوامر سوف يسبب القفز إلى أجزاء مختلفة) . البرمجة بلغة JAL ليس لها شكل معين لتوزيع الأوامر على الصفحة . لكنك تحتاج إلى أن تكون قادرا على فهم البرنامج بنفسك لذلك سوف نضع بعض القواعد لأنفسنا :
1- كل سطر سوف يكون به أمر واحد فقط .
2- سوف نستخدم تعليقات مختصرة لشرح ما يفعله البرنامج .
3- نبدأ بإعداد الحلقات و الأوامر الشرطية .
معنى القاعدة الثالثة سوف يكون واضحا فيما بعد . لجعل البرنامج أسهل فى القراءة فإن المحرر JALEdit سوف يقوم بتلوين كل شىء تقوم بإدخالة وهذا ليس له أى تأثير على العمل الوظيفى للبرنامج .
الخطوة الأول فى البرنامج هى تحميل مكتبة . هذه المكتبة تحتوى على أوامر إضافية , والتى عادة لا يمكن أن تكون جزء من لغة JAL نفسها لأنها تختلف حسب نوع الميكروكونترولر . وأنت كمبرمج لا تحتاج لمعرفة ما تحتويه لذلك فهى مخبأة بعيدا فى مكتبة . الشىء الوحيد الذى تحتاج لفعله هو استخدام المكتبة التى تتمشى مع الميكروكونترولر . وحيث أننا نكتب برنامج للميكروكونترولر 16F877A يتم تحميل المكتبة "16f877a"






تحميل المكتبة يتم بالأمر التالى :
-- target PICmicro
include 16f877a






أوامر لغة JAL القياسية يتم التعرف عليها عن طريق المحرر وكود الألوان . المتغيرات والأوامر من المكتبة تكون باللون الأزرق .
· السطر الأول يبدأ بشرطتين "-" لبيان تعليق وهو يخصك أنت بينما يتم تجاهلة بالمترجم , أى أن الميكروكونترولر لن يفعل بالتعليق أى شىء .
· السطر الثانى يبدأ بالأمر include ثم اسم المكتية . كل شىء موجود بهذه المكتبة يتم إدراجه (ضمه) عند هذه النقطة (دون أن تراه ) .
حيث أن الأطراف الرقمية بالميكروكونترولر 16F877A يمكن أن تكون مخارج أو مداخل فإننا نحتاج لتعريف إتجاهات الأطراف التى ننوى استخدامها . فى هذا البرنامج نريد أن يكون كلا الطرفين مخارج لأننا نرغب فى تحويل الليدات المتصلة بهذه الأطراف بين حالة التوصيل on وحالة الفصل off .

صيغة أوامر تحديد ( تعيين) إتجاه البيانات :
pin_c4_direction = output
pin_d3_direction = output







تذكر : يجب بيان "اتجاه الطرف" لكل طرف تستخدمه .
يتم عمل إضاءة الليد عن طريق تطبيق القدرة على الطرف المتصل به الليد . يتم فعل ذلك عن طريق جعل الطرف فى الحالة المنطقية "المرتفعة" high . يتم فصل القدرة عن الطرف عن طريق جعله فى الحالة المنطقية "المنخفضة" low .

صيغة الأوامر :
pin_d3 = high
pin_c4 = low





بعد تنفيذ هذه الأوامر فإن الليد المتصل بالطرف d3 يكون فى حالة توصيل "مضىء" والليد المتصل بالطرف c4 فى حالة فصل "مطفأ" . وحيث أننا نرغب فى عمل وميض بالليدات , فإن الخطوة التالية تكون العكس .
pin_d3 = low
pin_c4 = high






بين الحالة الأولى والحالة الثانية يجب إدراج "توقف" pause . وإلا فإن الوميض سوف يكون سريعا جدا بحيث لا يمكن ملاحظته . التوقف الذى سوف نستخدمه عبارة عن تأخير لثانية واحدة :
صيغة الأمر :
_usec_delay(1_000_000) -- one second delay







العدد الموجود بين الأقواس يحدد مدة الانتظار مقدرة بالميكروثانية .
باستخدام هذه الأوامر فإن الليد سوف يومض لمرة واحدة فقط , لكن الوميض الحقيقى لا يتوقف . لذلك فإن أوامرنا تحتاج لأن تتكرر بصفة مستمرة , أى "إلى الأبد" forever .
صيغة حلقة التكرار الغير منتهى :
forever loop
end loop





يمكن أن يصبح البرنامج بالشكل :







كما ترى تم إعداد هذه الحلقة بغرض التكرار الغير منتهى . وهذا يجعل من الواضح جدا أين تبدأ الحلقة وأين تنتهى . تذكر أن هذه هى القاعدة الثالثة التى وضعناها كمدخل للبرنامج .
الآن حان الوقت المناسب لإدخال البرنامج بالمحرر وحفظه .


كود:
-- JAL 2.0.4 include 16f877 pragma target clock 20_000_000 -- oscillator frequency -- configuration memory settings (fuses) pragma target OSC HS -- HS crystal or resonator pragma target WDT disabled -- no watchdog pragma target LVP disabled -- no Low Voltage Programming -- enable_digital_io() -- disable analog I/O (if any) -- definitions pin_c4_direction = Output pin_d3_direction = Output forever loop -- LEDs in starting state pin_d3 = high pin_c4 = low _usec_delay(1_000_000) -- one second delay -- LEDs switched pin_d3 = low pin_c4 = high _usec_delay(1_000_000) -- one second delay end loop

اعلانات

Tico
:: عضو ذهبي ::
تاريخ التسجيل: May 2012
المشاركات: 1,423
نشاط [ Tico ]
قوة السمعة:
قديم 07-06-2012, 10:00 PM المشاركة 26   
افتراضي


شكرا أخي الكريم جازاك الله خيرا.

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

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 08-06-2012, 02:43 AM المشاركة 27   
افتراضي


شكرا أخي الكريم جازاك الله خيرا.
أخى الكريم

شكرا جزيلا لك


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 08-06-2012, 02:48 AM المشاركة 28   
افتراضي


المفاتيح Switches :
يتناول هذا الجزء موضوع المشاريع التى تتعامل مع المفتاح .
هذا الموضوع غير معقد وخاصة بعد إتمام الجزء السابق لكن هذا الجزء خطوة جيدة قبل الدخول إلى المشاريع المعقدة فيما بعد .
ملخص المشاريع :
1- المؤقت Timer :
ويعرف أيضا بالمذبذب المتعدد أحادى الاستقرار ( أو المذبذب المتعدد للطلقة أو النبضة الواحدة) . عند الضغط اللحظى على المفتاح الضاغط يضىء الليد ويظل مضىء لفترة زمنية محددة ( مؤقت تأخير الفصل) .
2- مفتاح بطريقين Two way switch :
استخدام مفتاح ضاغط لتحويل حالة ليد بين التوصيل on والفصل off . يسمى أيضا مذبذب متعدد ثنائى الاستقرار .
3- النرد (زهر الطاولة) Dice
النرد الإلكتروتى كتطبيق لمفتاح بدون إرتدادات de-bounced .
4- جرس الباب السرى Secret doorbell :
جرس باب يعطى رنين فقط عند إدخال كود سرى عن طريق لوحة مفاتيح keypad .


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 08-06-2012, 02:53 AM المشاركة 29   
افتراضي


المؤقت Timer :
المؤقت الذى سوف نتناوله فى هذا المشروع يعرف أيضا باسم المذبذب المتعدد أحادى الاستقرار . عند الضغط اللحظى على المفتاح الضاغط يظل الليد مضىء لفترة زمنية محددة .

معلومات فنية :
غير مسموح للطرف الذى يستخدم ( يعنى أن الميكروكونترولر يبحث عن هذا الطرف) بأن يكون "سائب" float بل دائما يجب أن يوصل إما إلى الجهد الموجب 5 V أو الأرضى 0V . هذا يعنى أن لدينا طريقتين لتوصيل المفتاح كما فى الشكل التالى :



فى الحالة الأولى (جهة اليسار) :
يكون الطرف فى الحالة العادية عند الجهد المرتفع 5 V . هذا الجهد يسمى "1" أو"true" أو high"" . بمجرد غلق المفتاح يهبط جهد الطرف إلى الصفر . هذا الجهد يسمى "0" أو "false" أو "low" . عند هذه النقطة , يمر تيار قدرة 0.5mA خلال المقاومة , هذا التيار ليس بالكثير , ولكنه يعطينا سببا لاستخدام المفتاح المفتوح فى الوضع العادى حيث يتم غلقه فقط عند الحاجة . بهذه التهيئة تتولد إشارة منخفضة low عند غلق المفتاح . تسمى هذه الحالة "فعال فى الحالة المنخفضة" active low .
فى الحالة الثانية (جهة اليمين) :
بنفس الطريقة السابقة يمكن القول أن هذه الحالة تمثل "فعال فى الحالة المرتفعة" active high والتى تبدو كطريقة تفكير طبيعية حيث أن غلق المفتاح (حالة التفعيل) يؤدى إلى تطبيق الجهد المرتفع 5 V على الطرف .
نظريا يمكن أن يتم توصيل المفتاح بإى طرف للميكروكونترولر PIC16F877A ( فيما عدا أطراف القدرة , بالطبع) . الميكروكونترولر PIC16F877A له أنواع مختلفة من الأطراف . من المهم تذكر أن المنفذ portA والمنفذ portE هى مداخل تناظرية . هذه المنافذ تقيس الجهد على أطرافها . يمكنك توصيل مفتاح بها , لكن فى كل مرة تريد أن تعرف ما إذا كان المفتاح مفتوح أو مغلق يجب عليك قياس الجهد وإلا يجب عليك تغيير الأطراف من مداخل تناظرية إلى رقمية أولا . لذلك من السهل استخدام الأطراف الرقمية الاعتيادية بالمنافذ portB,C,D .
إذا تم استخدام الطرف d1(pin20) فى نظام active low (الشكل الأيمن) , يمكن للبرنامج تحديد موضع المفتاح كما يلى :


كود:
If pin_d1 == 1 then --switch on else -- switch off end if
بينما للدائرة بالجانب الأيسر يمكن كتابة :

كود:
If pin_d1 then --switch on else -- switch off end if


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 08-06-2012, 02:59 AM المشاركة 30   
افتراضي


الدائرة الكهربية :

البرنامج :
الفكرة :
الليد سوف يظل مضىء حتى بعد تحرير الزر الضاغط . أسهل طريقة لعمل ذلك هى استخدام عبارة التأخير .
فى بداية البرنامج نحتاج لتعريف اتجاه البيانات لكل طرف مستخدم كما يلى :
pin_d1_direction = input
pin_d2_direction = output
المفتاح متصل بالطرف d1 لذلك يكون هذا الطرف مدخل . الليد متصل بالطرف d2 لذلك يكون هذا الطرف مخرج .
لتسهيل تذكر ما هو متصل بالطرف يمكنك تسمية الأطراف فى البرنامج كما يلى :

var bit switch is pin_d1
var bit led is pin_d2

هذا يعنى أن "switch" يكافىء "pin_d1" وأن "led" يكافىء "pin_d2" . كما أن المترجم يفهم أن "on" تكافىء "high" و "off" تكافىء "low" .
البرنامج يكون بالشكل :





كود:
-- JAL ver
include 16f877a -- target PICmicro
-- This program assumes a 20 MHz resonator or crystal
-- is connected to pins OSC1 and OSC2.
pragma target clock 20_000_000 -- oscillator frequency
-- configuration memory settings (fuses)
pragma target OSC HS -- HS crystal or resonator
pragma target WDT disabled -- no watchdog
pragma target LVP disabled -- no Low Voltage Programming
--
enable_digital_io() -- disable analog I/O (if any)
-- define pins
pin_d1_direction = input
pin_d2_direction = output
--
var bit switch is pin_d1
var bit led is pin_d2

-- initial condition
led = off
-- loop
forever loop

    if pin_d1 then -- condition
          -- switch is on
          led = on
          _usec_delay(3_000_000)
          led = off
    end if

end loop



الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 08-06-2012, 03:05 AM المشاركة 31   
افتراضي


المفتاح ذو الوضعين Two way switch :
فى هذا المشروع يتم استخدام مفتاح ضاغط لتوصيل وفصل ليد . يسمى هذا المفتاح أيضا "مذبذب ثنائى الاستقرار" .
معلومات فنية :
المطلوب : عند الضغط على الزر الضاغط يتم توصيل (إضاءة) الليد إذا حدث وكان فى حالة الفصل (مطفأ) , أو فصله إذا حدث وكان موصل (مضىء) . الصعوبة تكمن فى عدم معرفة الحالة الراهنة لليد هل هو موصل أم مفصول ؟ يمكننا عمل ذلك ببساطة عن طريق التحقق من حالة طرفه ثم تغيرها .
سوف نستخدم " عامل operator المعكوسNOT أو المكمل "المتمم" Complement " . هذا العامل يقوم بتحويل الواحد "1" إلى معكوسه أو المكمل له وهو الصفر "0" وتحويل الصفر إلى معكوسه أو المكمل له وهو الواحد ويرمز له بالرمز "!" . لتوضيح ما يفعله هذا العامل نستخدم جدول الحقيقة التالى :





نظرا لأن الطرف الرقمة يمكن فقط أن يكون له أحد حالتين ,الصفر أو الواحد , ( 0 or 1 ) يمكننا تغيير حالته كما يلى :

كود:
pin_d2 = ! pin_d2
أو عند استخدام الاسماء المستعارة يكون :

كود:
led = ! led
نتيجة لذلك فإن القطعة الصغيرة للكود التالى سوف تقوم بتوصيل وفصل الليد فى كل مرة يتم الضغط فيها على المفتاح الضاغط :

كود:
if switch then led = ! led end if
هذا البرنامج سوف يعمل , لكنك لن ترى عمله بالطريقة التى ترغب فيها . فحتى قبل أن ترفع أصبعك من على المفتاح فإن الليد سوف يقوم بالتوصيل والفصل ألاف من المرات ولا أحد يستطيع تخمين إلى أى وضع ينتهى . لهذا السبب فإن البرنامج فى حاجة إلى انتظارك حتى ترفع أصبعك من على المفتاح قبل أن يقوم بفعل أى شىء . تستخدم حلقة صغيرة حيث يدور البرنامج حولها حتى لا يكون هناك ضغط على المفتاح بعد :

كود:
while switch loop end loop
المشكلة المتبقية هى "الارتدادات" bouncing . عندما تقوم بالضغط على المفتاح فإن التلامسات المعدنية يحدث بها ذبذبات أو ارتدادات . خلال زمن حدوث الارتدادات يتم فصل وتوصيل التلامسات عدة مرات . أنت لن تلاحظ ذلك , لكن الميكروكونترولر يشعر ويتأثر بها . سوف يراها كسلسلو من عمليات التحويل بين التوصيل والفصل on/off . فترة تأخير قصيرة تكون كافية للتخلص من هذا التأثير . الكود التالى يبين ذلك :


كود:
if switch then led = ! led while switch loop delay_10ms(1) end loop end if
استخدام العبارة led = ! led بها مخاطرة بسيطة . حتى تعمل هذه العبارة يحتاج البرنامج أولا معرفة الحالة الراهنة للطرف . دعنا نفترض أنك جعلت الطرف فى الحالة المرتفعة , وأن هذا الطرف يتصل بمكثف كبير , والذى يجب أن يتم تفريغه قبل أن يتحول فعليا إلى الحالة المرتفعة ( هذاالمكثف كحمل يؤدى إلى هبوط الحهد) . إذا حدث عند ,هذه اللحظة, أن قام الميكروكونترولر بالتحقق من حالة الطرف فسوف يجدها منخفضة حتى يتم شحن المكثف . إذا كان الحمل ضخم بما فيه الكفاية فإن الطرف لن يصل أبدا إلى الحالة المرتفعة .بالقطع تزداد حدة خطورة الحالة كلما تغيرت حالة الطرف بسرعة . نتيجة لذلك من المفضل استخدام متغير "كوسيط" كما يلى :

كود:
flag = ! flag pin_d2 = flag
بالطبع تحتاج أولا تعريف المتغير flsg كما يلى :


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 08-06-2012, 03:09 AM المشاركة 32   
افتراضي


الدائرة الكهربية :




البرنامج :
عند تشغيل البرنامج يجب التأكد من أن الليد فى حالة الفصل off بالعبارة led = off .
شكل البرنامج كما يلى :

كود:
-- JAL 2.0.4 include 16f877a -- target PICmicro -- This program assumes a 20 MHz resonator or crystal -- is connected to pins OSC1 and OSC2. pragma target clock 20_000_000 -- oscillator frequency -- configuration memory settings (fuses) pragma target OSC HS -- HS crystal or resonator pragma target WDT disabled -- no watchdog pragma target LVP disabled -- no Low Voltage Programming -- enable_digital_io() -- disable analog I/O (if any) var bit switch is pin_d1 var bit led is pin_d2 -- define pins pin_d1_direction = input pin_d2_direction = output led = off forever loop if switch then led = ! led while switch loop _usec_delay(10000)-- 10 ms end loop end if end loop


النرد (زهر الطاولة) Dice :



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