رابعا : البرمجة :
يتم كتابة البرنامج باستخدام المحرر 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