التجربة الثانية :
إدخال حلقة تحكم برمجية Software Control Loop لعمل وميض لليدات (حلقة التأخير)
تمهيد :
هذه التجرية إمتداد (توسعة) للتجربة السابقة وذلك بجعل الليدات المتصلة بأطراف المنفذ PORTC توصل وتفصل ON/OFF بفترات زمنية قدرها 1-second (وميض) .
فى هذه التجربة يتم توضيح مفهوم حلقة التحكم البرمجية بغرض الحفاظ على التنظيم والتدفق المنطقى لتنفيذ البرنامج . باقى التجرية سوف تقسم التطبيق المضمن embedded application إلى مربعات وظائف كما فى الشكل التالى :
بالرجوع إلى الشكل السابق : صندوق التهيئة Initialize يحتوى على جميع الأجهزة Hardware والبرمجيات Software (firmware) التى تهىء المحيطات peripherals والمتغيرات variables المستخدمة فى التطبيق .
لاحظ أن هذا الصندوق يستدعى مرة واحدة فقط خلال التنفيذ ( لوجوده خارج حلقة التكراتر الغير منتهية ).
بعد ذلك يتم استدعاء الصندوق Get_Inputs " الحصول على (قراءة) المداخل " . وهنا يتم تجديد (استرداد) حالة جميع المداخل سواء من أطراف الميكروكونترولر أو من مصادر السجلات الداخلية . بمجرد الحصول على المداخل يأتى صندوق القرار Decide والذى يحتوى على الأجهزة والبرمجيات التى سوف تصنع أى قرارات بناء على حالة المداخل . بمجرد أن يتم تحليل معلومات الدخل يأتى صندوق المخارج Do_Outputs فيخرج معلومات الخرج إما إلى أطراف منفذ مخارج الميكروكونترولر أو إلى سجلات داخلية بناء على صندوق القرار السابق . وأخيرا يأتى صندوق التوقيت Timing ليحدد معدل تنفيذ حلقة التحكم البرمجية .
فى هذه التجربة لن نحتاج إلى كل الوظائف لعمل وميض لليدات المتصلة بأطراف المنفذ PORTC . لن نحتاج إلى المداخل ومن ثم نزيل الصندوق Get_Inputs . يتم تنظيم صناديق الوظائف المتبقية كما يلى :
أ- التهيئة للبدء Initialize : سوف تقةم هذه الوظيفة بتهيئة متغير 8-bit باسم LED_Output والذى سوف يحتوى على القيمة المراد إخراجها إلى المنفذ PORTC . استخدام متغير بدلا من ببساطة تخصيص قيمة للمنفذ PORTC يسمح بمعالجة البيانات برمجيا فى متغير بدون إخراج البيانات إلى أطراف المداخل / المخارج حتى يتم تخصيصه فى النهاية للمنفذ PORTC فى الصندوق Do_Outputs .
ب- القرار Decide : هذه الوظيفة سوف تجرى عملية XOR المنطقية على البيانات الموجودة بالمتغير LED_Output فى كل مرة تكرار خلال حلقة التحكم . عندما تتم العملية المنطقية XOR بين القيمة ونفسها تكون النتيجة بصفر‘0’ :
1 XOR’d with 1 = 0,
0 XOR’d with 0 = 0
عندما تجرى العملية المنطقية XOR بين القيمة وقيمة مختافة عنها فإن النتيجة تكون بواحد ‘1’ :
1 XOR’d with 0 = 1
نتيجة لذلك فى كل مرة تتكرر فيها الحلقة تتحول فيها بيانات خانات المتغير LED_Output من الواحد إلى الصفر أو من الصفر إلى الواحد تبعا لقيمتها الحالية . تذكر أنه عندما تكون القيمة على طرف المخرج تساوى صفر تكون الليد فى حالة الفصل off وعندما تكون القيمة بواحد تتحول الليد إلى حالة توصيل on .
ت- وظيفة الإخراج Do_Ouputs : تقوم هذه الوظيفة بتخصيص القيمة الحالية للمتغير LED_Output لسجل المنفذ PORTC والذى بدوره يعمل على إضاءة الليدات المتصلة بالأطراف المرتبطة به .
ث- وظيفة التوقيت Timing : هذه الوظيفة تقوم بتنفيذ التأخير اللازم لوميض الليدات المتصلة بأطراف المنفذ PORTC على شكل توصيل وفصل ON/OFF على فترات زمنية قدرها واحد ثانية . عند تهيئة الميكروكونترولر على العمل بتردد ساعة 4MHz فسوف يتم عندئذ مليون تعليمة لكل ثانية . عند هذا المعدل فإن الحلقة البرمجية تحتاج إلى الإبطاء حتى تستطيع العين مشاهدة الوميض . يتم تحقيق ذلك باستخدام رمز التأخير فى المخطط الرئيسى للفلوكود .
الخطوات :