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

   

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



السلام عليكم
يعطيك العافية مهندس فتح الله

بالنسبة للباراميتر rate إللي بكون بالتوجيه .. بقدر أخليه متغير ولا لازم يكون رقم محدد من البداية
أخى الكريم شكرا جزيلا لك :
1- بالرجوع إلى ما جاء عن هذا التوجية ضمن وثائق المترجم :

#TASK
(The RTOS is only included with the PCW, PCWH, and PCWHD software packages.)



Each RTOS task is specified as a function that has no parameters and no return. The #TASK directive is needed just before each RTOS task to enable the compiler to tell which functions are RTOS tasks. An RTOS task cannot be called directly like a regular function can.



Syntax:
#TASK (options)



Elements:
options are separated by comma and may be:

rate=time

Where time is a number followed by s, ms, us, or ns. This specifies how often the task will execute.



max=time

Where time is a number followed by s, ms, us, or ns. This specifies the budgeted time for this task.



queue=bytes

Specifies how many bytes to allocate for this task's incoming messages. The default value is 0.



enabled=value

Specifies whether a task is enabled or disabled by rtos_run( ).

True for enabled, false for disabled. The default value is enabled.



Purpose:
This directive tells the compiler that the following function is an RTOS task.



The rate option is used to specify how often the task should execute. This must be a multiple of the minor_cycle option if one is specified in the #USE RTOS directive.



The max option is used to specify how much processor time a task will use in one execution of the task. The time specified in max must be equal to or less than the time specified in the minor_cycle option of the #USE RTOS directive before the project will compile successfully. The compiler does not have a way to enforce this limit on processor time, so a programmer must be careful with how much processor time a task uses for execution. This option does not need to be specified.



The queue option is used to specify the number of bytes to be reserved

for the task to receive messages from other tasks or functions. The default queue value is 0.



Examples:
#task(rate=1s, max=20ms, queue=5)



Also See:
#USE RTOS


نستنتج أن البارامتر rate هو عدد number متبوع بتمييز يدل على وحدات الزمن لذلك فلا يمكن أن يكون متغيرا لأن المترجم يحتاج إلى هذا "العدد" ليقوم بجدولة المهام وإنشاء نظام العمل المجدول وفق هذه الأزمنة .
2- عموما يمكنك وضع متغير وترجمة البرنامج ورؤية النتيجة ، سيخبرك المترجم بوجود خطأ وأنه يتوقع عدد .

خاصة وأن :

كل مهمة بنظام RTOS هى دالة لغة سى والتى لا تأخذ أى بارامترات ولا تعود بأى
قيمة


3- سوف نتعرف على المزيد لاحقا إن شاء الله

مع تمنياتى بدوام التوفيق


التعديل الأخير تم بواسطة : F.Abdelaziz بتاريخ 09-06-2015 الساعة 03:08 PM
اعلانات

الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 09-06-2015, 07:59 PM المشاركة 18   
افتراضي المشروع الثالث : فولتميتر بإخراج على المنفذ التسلسلى RS232 :


المشروع الثالث : فولتميتر بإخراج على المنفذ التسلسلى RS232 :

فى هذا المشروع والذى هو أكثر تعقيدا قليلا عن المشروع السابق ، يتم قراءة الجهد باستخدام المحول A/D ثم بعد ذلك يرسل خلال المنفذ التسلسلى إلى الكمبيوتر .
يتكون هذا المشروع من 3 مهام :
• المهمة الأولى Live ويتم تشغيلها مل 200 ملى ثانية وتقوم بعمل وميض لليد المتصل بالطرف RD7 للإشارة إلى أن النظام يعمل (ينبض بالحياة) .
• المهمة الثانية Get_voltage ، تقوم بقراءة القناة channel 0 للمحول A/D حيث طرف توصيل الجهد المراد قياسه . يتم إعادة تشكيل (صياغة) القيمة التى تم قراءتها ثم تخزينها فى متغير . يتم تشغيل هذه المهمة كل ثانية .
• المهمة الثالثة : To_RS232 وتقوم بقراءة الجهد المشكل وإرساله من خلال منفذ الاتصال RS232 إلى الكمبيوتر كل ثانية .
الشكل التالى يبين المخطط الصندوقى للمشروع :



والشكل التالى يبين الدائرة الكهربية :



فى هذا المشروع يستخدم الميكروكونترولر PIC18F8520 مع ساعة بتردد 10MHz ، ويمكن استخدام أى ميكروكونترولر من السلسلة PIC18F . يتم توصيل الجهد المراد قياسه إلى طرف الدخل التناظرى AN0 للميكروكونترولر . يتم توصيل الخرج RS232 TX من الميكروكونترولر (الطرف RC6) إلى دخل شريحة محول مستوى RS232 من نوع MAX232 ومن خرجها إلى المنفذ التسلسلى للكمبيوتر ، المنفذ COM1 على سبيل المثال ، باستخدام وصلة نوع D 9 طرف . يتم توصيل الطرف RD7 إلى ليد لبيان ما إذا كان المشروع فى حالة تشغيل .

البرنامج :

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

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


البرنامج :

كود:
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// SIMPLE RTOS EXAMPLE - VOLTMETER WITH RS232 OUTPUT
// This is a simple RTOS example. Analog voltage to be measured (between 0V
// and +5V) is connected to analog input AN0 of a PIC18F8520 type
// microcontroller. The microcontroller is operated from a 10MHz crystal. In
// addition, an LED is connected to port in RD7 of the microcontroller.
// RS232 serial output of the mirocontroller (RC6) is connected to a MAX232
// type RS232 voltage level converter chip. The output of this chip can be
// connected to the serial input of a PC (e.g., COM1) so that the measured
// voltage can be seen on the PC screen.
// The program consists of 3 tasks called "live", "Get_voltage", and “To_RS232”.
// Task "Live" runs every 200ms and it flashes the LED conencted to port pin
// RD7 of the microcontroller to indicate that the program is running and is
// ready to measure voltages.
// task "Get_voltage" reads analog voltage from port AN0 and then converts
// the voltage into millivolts and stores in a variable called Volts.
// Task "To_RS232" gets the measured voltage, converts it into a character
// array and then sends to the PC over the RS232 serial line. The serial line
// is configured to operate at 2400 Baud (higher Baud rates can also be used if
// desired).
////////////////////////////////////////////////////////////////////////////////////
#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)
///////////////////////////////////////////////////////////////////
// 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
}
////////////////////////////////////////////////////////////////
// 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
}
/////////////////////////////////////////////////////////////////////
// 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
}
/////////////////////////////////////////////////////////////
// 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
}
/////////////////////////////////////////////////////////////


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


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





الصورة الرمزية Sallam
Sallam
:: مهندس متميز ::
تاريخ التسجيل: Mar 2006
الدولة: Syria
المشاركات: 515
نشاط [ Sallam ]
قوة السمعة:
قديم 11-06-2015, 04:22 PM المشاركة 21   
افتراضي


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

لذلك قمت باستعمال هذا المعالج في بروتوس وقمت بتصحيحه في الكود فعمل البرنامج بشكل طبيعي.



لك مني كل الشكر والتقدير


الصورة الرمزية F.Abdelaziz
F.Abdelaziz
:: استاذ و مشرف قسم الالكترونيات ::
تاريخ التسجيل: May 2007
المشاركات: 6,832
نشاط [ F.Abdelaziz ]
قوة السمعة:
قديم 11-06-2015, 04:57 PM المشاركة 22   
افتراضي


شكرا استاذي الكريم لأجل تعبك

لي ملاحظة وأظنها سهوا منك

وهي أن المعالج في الكود هو غير المعالج في برتوس وأعتقد أن المعالج المطلوب هو 18F452 وليس 18F8520

لذلك قمت باستعمال هذا المعالج في بروتوس وقمت بتصحيحه في الكود فعمل البرنامج بشكل طبيعي.



لك مني كل الشكر والتقدير


شكرا جزيلا لك

بداية شكرا على المتابعة مع تمنياتى بدوام التوفيق

أخى الكريم لقد كانت التجربة مقصوده حينها للتأكد من أن نظام تشغيل الزمن الحقيقى يعتمد أى ميكروكونترولر من العائلة PIC18F ، كما ذكرت فى مقدمة المشروع ، ولا يعتمد العائلة PIC16F وكان هذا هو الغرض . ولقد كان فى كل مرة يتم فيها فقط التوجيه #include للميكروكونترولر المستخدم


شكرا مجددا



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