• فى بداية البرنامج يتم تحديد الميكروكونترولر المستخدم ، وتعريف المحول A/D ليعمل بدقة 10 بت ، وتعريف الساعة للعمل على تردد 10MHz ، وتحديد سرعة الاتصال RS232 لتكون 2400 baud . كما يتم إعلان المتغيرات التى سوف تستخدم فى البرنامج ، وأيضا يتم تعريف مؤقت نظام rtos والزمن minor_cycle باستخدام التوجيه #use rtos :
كود:
////////////////////////////////////////////////////////////////////////////////////
#include <18F8520.h>
#device adc=10
#use delay (clock=10000000)
#use rs232(baud=2400,xmit=PIN_C6,rcv=PIN_C7)
///////////////////////////////////////////////////////////////////////////////
unsigned int16 adc_value;
unsigned int32 Volts;
///////////////////////////////////////////////////
// Define which timer to use and minor_cycle for RTOS
////////////////////////////////////////////////////
#use rtos(timer=0, minor_cycle=100ms)
///////////////////////////////////////////////////////////////////
فى الدالة الرئيسية يتم إعداد المنفذ PORTD كمخارج مع مسح جميع أطرافه . بعد ذلك يتم إعداد المنفذ PORTA كمداخل (الطرف A0 هو طرف الدخل التناظرى المستخدم) ، بعد ذلك يتم إعداد المحول A/D عن طريق تحديد ساعة المحول ، وتحديد القناة المستخدمة مع المحول channel(0) أى AN0 . ثم بعد ذلك يتم بدء نظام RTOS عن طريق استدعاء الدالة rtos_run() :
كود:
/////////////////////////////////////////////////////////////
// Start of MAIN program
//////////////////////////////////////////////////
void main()
{
set_tris_d(0); // PORTD all outputs
output_d(0); // Clear PORTD
set_tris_a(0xFF); // PORTA all inputs
setup_adc_ports(ALL_ANALOG); // A/D ports
////////////////////////////////////////////////////
setup_adc(ADC_CLOCK_DIV_32); // A/D clock
set_adc_channel(0); // Select channel 0 (AN0)
delay_us(10);
/////////////////////////////////////
rtos_run(); // Start RTOS
}
/////////////////////////////////////////////////////////////
يتكون البرنامج من 3 مهام :
• المهمة الأولى Live يتم تشغيلها كل 200 ملى ثانية ، وتقوم بعمل وميض لليد متصل بالطرف RD7 للميكروكونترولر لبيان أن المشروع يعمل .
كود:
///////////////////////////////////////////////////////////////////
// Declare TASK "Live" - called every 200ms
// This task flashes the LED on port RD7
#task(rate=200ms, max=1ms)
void Live()
{
output_toggle(PIN_D7); // Toggle RD7 LED
}
////////////////////////////////////////////////////////////////
• المهمة الثانية Get_voltage ، وتقوم بقراءة الجهد التناظرى من القناة channel 0 ( أى الطرف RA0 أو AN0) للميكروكونترولر . بعد ذلك يتم تحول قيمة القراءة الرقمية إلى مللى فولت بالضرب فى 5000 والقسمة على 1024 ، ثم يتم تخزين الجهد فى متغير شامل يسمى Volts .
كود:
////////////////////////////////////////////////////////////////
// Declare TASK “Get_voltage” – called every 10ms
#task(rate=2s, max=100ms)
void Get_voltage()
{
adc_value = read_adc(); // Read A/D value
Volts = (unsigned int32)adc_value*5000;
Volts = Volts / 1024; // Voltage in Mv
}
/////////////////////////////////////////////////////////////////////
• المهمة الثالثة To_RS232 ، تقوم بقراءة الجهد المقاس من المتغير المشترك Volts وترسله من خلال المنفذ RS232 باستخدام عبارة لغة السى printf . يتم إرسال النتيجة فى الشكل التالى :
كود:
Measured voltage = nnnn Mv
كود:
/////////////////////////////////////////////////////////////////////
// Declare TASK "To_RS232" - called every millisecond
#task(rate=2s, max=100ms)
void To_RS232()
{
printf("Measured Voltage = %LumV\n\r",Volts); // send to RS232
}
/////////////////////////////////////////////////////////////
الشكل التالى يبين برنامج HyperTerminal يعمل على الكمبيوتر للحصول على الخرج من البرنامج :

نتيجة المحاكاة ببرنامج Proteus :

|
شكرا استاذي الكريم لأجل تعبك
لي ملاحظة وأظنها سهوا منك
وهي أن المعالج في الكود هو غير المعالج في برتوس وأعتقد أن المعالج المطلوب هو 18F452 وليس 18F8520
لذلك قمت باستعمال هذا المعالج في بروتوس وقمت بتصحيحه في الكود فعمل البرنامج بشكل طبيعي.
لك مني كل الشكر والتقدير