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

أدوات الموضوع

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:135
قديم 07-09-2013, 04:49 PM المشاركة 1   
ha master and two slave using RS485 Twitter FaceBook Google+



سلام عليكم
ارجو المساعده في تحديد الخطأ في الكود
مشروع
http://arabsh.com/files/0d3e424860fa...rs485-rar.html
مشروع عبار ه عن master and two slave
اذا ضغطت على سويج يشتغل ليد في slave1 ومن ثم يرسل رساله الى ماستر فيشتغل ليد لمده ثانيه وينطفئ
واذا ضغطت سويج مره اخرى يشتغل ليد في slave2 ومن ثم يرسل رساله الى ماستر فيشتغل ليد لمده ثانيه وينطفئ
master
كود:
#define sw          porta.f0
#define sw_dir      trisa.f0
#define led1        porta.f1
#define led1_dir    trisa.f1
#define led2        porta.f2
#define led2_dir    trisa.f2
#define off         0
#define on          1
#define is          ==

sbit  rs485_rxtx_pin  at Rb0_bit;               // set transcieve pin
sbit  rs485_rxtx_pin_direction at TRISb0_bit;   // set transcieve pin direction
//************************************************************************////
char dat[7];// buffer for receving/sending messages
char select=0;
////***********************************************************************////
void RS485(char slave);
void init_pic()
{
  cmcon=7;
  UART1_Init(9600);                  // initialize UART1 module
  Delay_ms(100);
  RS485Master_Init();// initialize MCU as Maste
  dat[4] = 0;                        // ensure that message received flag is 0
  dat[5] = 0;                        // ensure that message received flag is 0
  dat[6] = 0;                        // ensure that error flag is 0

  RCIE_bit = 1;                      // enable interrupt on UART1 receive
  TXIE_bit = 0;                      // disable interrupt on UART1 transmit
  PEIE_bit = 1;                      // enable peripheral interrupts
  GIE_bit = 1;                       // enable all interrupts
  sw_dir=1;
  led1=led1=off;
  led1_dir=led2_dir=0;
}
//***************************************************************************//

void interrupt()
{
 RS485Master_Receive(dat);
}
void main()
{
 init_pic();
 while(1)
    {
     if(sw is 0)
        {
         select++;
         delay_ms(250);
        }
     if(select is 1)
         {
           RS485(1);
           select=2;
         }
     if(select is 3)
         {
           RS485(2);
           select=0;
         }
     if (dat[4] ) // if message received successfully

         {
           dat[4]=0;
           if(dat[1]is 1)RS485(3);
           else if(dat[1]is 2)RS485(4);
         }
      if (dat[5] )// if an error detected, signal it

         {
           portb.f4=1;
         }
         
    }
}
//***************************************************************************//

 void RS485(char slave)
 {
   if(slave is 1)
     {
      dat[0]=1;
      RS485Master_Send(dat,1,10);
     }
   if(slave is 2)
     {
      dat[0]=2;
      RS485Master_Send(dat,1,20);
     }
    if(slave is 3)
     {
      led1=on;
      delay_ms(1000);
      led1=off;
     }
   if(slave is 4)
     {
      led2=on;
      delay_ms(1000);
      led2=off;
     }
 }
************************************************** ***
slave1
كود:
#define sw          porta.f0
#define sw_dir      trisa.f0
#define led1        porta.f1
#define led1_dir    trisa.f1
#define led2        porta.f2
#define led2_dir    trisa.f2
#define off         0
#define on          1
#define is          ==

sbit  rs485_rxtx_pin  at Rb0_bit;               // set transcieve pin
sbit  rs485_rxtx_pin_direction at TRISb0_bit;   // set transcieve pin direction
//************************************************************************////
char dat[6];// buffer for receving/sending messages
char select=0;
////***********************************************************************////
void RS485(char slave);
void init_pic()
{
  cmcon=7;
  UART1_Init(9600);                  // initialize UART1 module
  Delay_ms(100);
  RS485Slave_Init(10);              // Intialize MCU as slave, address 10

  dat[4] = 0;                        // ensure that message received flag is 0
  dat[5] = 0;                        // ensure that message received flag is 0
  dat[6] = 0;                        // ensure that error flag is 0

  RCIE_bit = 1;                      // enable interrupt on UART1 receive
  TXIE_bit = 0;                      // disable interrupt on UART1 transmit
  PEIE_bit = 1;                      // enable peripheral interrupts
  GIE_bit = 1;                       // enable all interrupts

 sw_dir=1;
 led1_dir=led2_dir=0;
 led1=led1=off;

}
//***************************************************************************//

void interrupt()
{
 RS485Master_Receive(dat);
}
void main()
{
 init_pic();
 while(1)
    {
     if (dat[4] ) // if message received successfully

         {
           dat[4]=0;
           if(dat[0]is 1)RS485(1);
         }
      if (dat[5] )// if an error detected, signal it

         {
           portb.f4=1;
         }
    }
}
//***************************************************************************//

 void RS485(char slave)
 {

  if(slave is 1)
  {
   led1=on;
   dat[1]=1;
   RS485Slave_Send(dat,1);// send back to master
  }
 }
************************************************** ***
slave2
كود:
#define sw          porta.f0
#define sw_dir      trisa.f0
#define led1        porta.f1
#define led1_dir    trisa.f1
#define led2        porta.f2
#define led2_dir    trisa.f2
#define off         0
#define on          1
#define is          ==

sbit  rs485_rxtx_pin  at Rb0_bit;               // set transcieve pin
sbit  rs485_rxtx_pin_direction at TRISb0_bit;   // set transcieve pin direction
//************************************************************************////
char dat[6];// buffer for receving/sending messages
char select=0;
////***********************************************************************////
void RS485(char slave);
void init_pic()
{
  cmcon=7;
  UART1_Init(9600);                  // initialize UART1 module
  Delay_ms(100);
  RS485Slave_Init(20);              // Intialize MCU as slave, address 20

  dat[4] = 0;                        // ensure that message received flag is 0
  dat[5] = 0;                        // ensure that message received flag is 0
  dat[6] = 0;                        // ensure that error flag is 0

  RCIE_bit = 1;                      // enable interrupt on UART1 receive
  TXIE_bit = 0;                      // disable interrupt on UART1 transmit
  PEIE_bit = 1;                      // enable peripheral interrupts
  GIE_bit = 1;                       // enable all interrupts
  sw_dir=1;
  led1_dir=led2_dir=0;
  led1=led1=off;
}
//***************************************************************************//

void interrupt()
{
 RS485Master_Receive(dat);
}
void main()
{
 init_pic();
 while(1)
    {
     if (dat[4] ) // if message received successfully
         {
           dat[4]=0;
           if(dat[0]is 2)RS485(1);
         }
      if (dat[5] ) //if an error detected, signal it
         {
           portb.f4=1;
         }
    }
}
//***************************************************************************//

 void RS485(char slave)
 {

  if(slave is 1)
  {
   led1=on;
   dat[1]=2;
   RS485Slave_Send(dat,1);// send back to master

  }
 }
=================================================
ومامعنى هذا كلام ماخوذ من شرح مكتبه RS485
وهل لها تأثير على برنامج

Library constants:
START byte value = 150
STOP byte value = 169
Address 50 is the broadcast address for all Slaves (packets containing address 50 will be received by all Slaves except the Slaves with addresses 150 and 169).


التعديل الأخير تم بواسطة : حسن هادي محمود بتاريخ 07-09-2013 الساعة 04:52 PM
اعلانات

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:135
قديم 08-09-2013, 01:33 AM المشاركة 2   
افتراضي


ارجوا المساعده في هذا مشروع
او اذا يوجد مشروع مماثل له
ولكم جزيل الشكر والتقدير

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

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:135
قديم 08-09-2013, 05:09 PM المشاركة 3   
افتراضي


سلام عليكم اخواني راح شرح موضوع وارجو تصحيح اي خطا وهذه محاوله لغرض فهم هذه داله وهي مفيده جدا لاتصال RS485 حيث تم ربط ماستر مع عده SLAVES قد يصل الى 32 خادم


للعلم هذا شرح اجتهاد شخصي قد يحتوي على اخطاء
1- يتم تعريف بت السيطره وخاص بتحكم بارسال والاستقبال
ويحتاج ايضا الى تعريف مودم الاتصال التسلسلي ومن ثم يتم تعريف RS485Master
كما موضح بمثال
Example // RS485 module pinout
كود:
sbit RS485_rxtx_pin at RC2_bit;  // transmit/receive control set to PORTC.B2

// Pin direction
sbit RS485_rxtx_pin_direction at TRISC2_bit;   // RxTx pin direction set as output
...
UART1_Init(9600);                           // initialize UART1 module
RS485Master_Init();                         // intialize MCU as a Master for RS-485 communication
2- الامر الاستقبال البيانات RS485Master_Receive
void RS485Master_Receive(char *data_buffer);
وهذا مثال
كود:
Example	char msg[8];
...
RS485Master_Receive(msg);
هذه داله فيها عده ثوابت مهمه وهي تتكون من 7 بايتات
• data_buffer: 7 byte buffer for storing received data, in the following manner:
data[0..2]: message content
• وهي تعني بايتات من 0 الى 2 اي ثلاث بايتات تمثل بيانات او محتويات الرساله
data_buffer[3]: number of message bytes received, 1–3
يمثل عدد بايتات التي تم ارسالها فأذا تم ارسال 2 بايت فان هذا بايت =2 واقصى قيمه له 3
data_buffer[4]: is set to 255 when message is received
هذا بايت مهم جدا وهو يعبر عن الاستقبال البيانات وفي برامج يتم اختبار هذا بايت فأذا =255 فبيانات تم استقبالها وعندها يمكن خزنها في متغير وهذا بايت يحتاج الى تصفير لانه يمثل علم لاستقبال
كود:
  if (dat[4]) {                      // if message received successfully
      cnt = 0;
      dat[4] = 0;                      // clear message received flag
      j = dat[3];
      for (i = 1; i <= dat[3]; i++) {  // show data on PORTB
        PORTB = dat[i-1];
      }
data_buffer[5]: is set to 255 if error has occurred
هذا بايت =255 اذا يوجد خطأ في الاستقبال ويجب تصفير هذا علم في برنامج انظر كود
كود:
if (dat[5])  {                     // if an error detected, signal it
      PORTD = 0xAA;                    //   by setting portd to 0xAA
    }
data_buffer[6]: address of the Slave which sent the message
daهذا بايت يمثل علم وهو يمثل بيانات تم ارسالها اي ان بيانات ارسلت الى خادم ام لا
The function automatically adjusts data[4] and data[5] upon every received message. These flags need to be cleared by software.
لاحظو كود تصفير هذه الاعلام في بدايه البرنامج
كود:
dat[4] = 0;                          // ensure that message received   flag is 0
  dat[5] = 0;                          // ensure that error flag is 0
  dat[6] = 0;
طبعا لكي يتم استقبال البيانات فانك تحتاج الى انتربت
انظر كود
كود:
// Interrupt routine
void interrupt() {
  RS485Master_Receive(dat);
}
وفي برنامج يتم تفعيل المقاطعه الاتصال التسلسلي حيث
كود:
RCIE_bit = 1;                        // enable interrupt on UART1 receive
  TXIE_bit = 0;                        // disable interrupt on UART1 transmit
  PEIE_bit = 1;                        // enable peripheral interrupts
  GIE_bit = 1;                         // enable all interrupts

الامر الارسال RS485Master_Send
كود:

void RS485Master_Send(char *data_buffer, char datalen, char Slave_address);
وهذه تمثل البيانات التي تم ارسالها وطبعا هي تمثل من 0 الى 2 كما تم ذكرها في الامر الاستقبال
data_buffer: data to be sent
وهذه تمثل بيانات مرسله وهي dat[0],dat[1],dat[2]
datalen: number of bytes for transmition. Valid values: 0...3.
وتمثل عدد بايتات التي تريد ارسالها في مثال ادناه تم خزن بيانات في بايت 0 فقط لذا عدد بايتات=1
كود:
dat[0] = dat[0]+1;               // send back to master
      Delay_ms(1);
      RS485Master_Send(dat,1,160);
************************************************** *********
Slave_address: Slave(s) address
وهذا يمثل عنوان الخادم المراد ارسال بيانات له
*************************************************
كود:
Example	char msg[8];
...
// send 3 bytes of data to Slave with address 0x12
RS485Master_Send(msg, 3, 0x12);
في مثال اعلاه تم تعريف مصفوفه msg تتكون 8 بايتات
وفي كود الارسال تم ثلات بايتات من هذه مصفوفه الى خادم عنوانه 0x12

ملاحظه جدا مهمه
1- ذكرت في شرح كلمه dat وهذه ليس لها علاقه بداله وانما مصفوفه تتكون من 8 بايتات يتم تعريفها في بدايه برنامج واسم قابل للتغير
اول ثلاث منها للبيانات
رابع يمثل عدد بايتات التي تم ارسالها وهي لها علاقه بايتات ثلاث اعلاه فاذا ارسلت 2 فأن هذا بايت =2 وهكذا
بايت خامس او dat[4] يمثل علم لاستقبال البيانات
بايت السادس علم يشير هل يوجد خطا في الاستقبال البيانات
بايت السابع يمثل علم بارسال البيانات
بايت 5و6و7 يجب تصفيرهما في بدايه البرنامج وحالهما حال كل علم (flag )في الانتربت


التعديل الأخير تم بواسطة : حسن هادي محمود بتاريخ 08-09-2013 الساعة 05:20 PM

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:135
قديم 08-09-2013, 05:47 PM المشاركة 4   
افتراضي


اما شرح عن slave
كود:
void RS485Slave_Init(char Slave_address);

وهذا تعريف خادم حيث يحتاج الى عنوان خادم
وشرح تعريف هو نفسه في تعريف ماستر اي نفس كلام بالضبط
**************************************************
كود:
void RS485Slave_Receive(char *data_buffer);
نفس شرح لداله الاستقبال في ماستر ولكن شي وحيد يختلف يحتاج 6 بايت بدلا من 7
**********************************************
كود:
void RS485Slave_Send(char *data_buffer, char datalen);
اذا نفس شرح لامر الاسال في ماستر شي وحيد مختلف هو انه لايحتاج الى عنوان
*********************************************

شي الذي لم أفهمه وهو ماذا يقصد بهذا كلام
Library constants:
START byte value = 150
STOP byte value = 169
Address 50 is the broadcast address for all Slaves (packets containing address 50 will be received by all Slaves except the Slaves with addresses 150 and 169).



اخواني لاتنسون مساعدتي في حل مشكله كود في بدايه موضوع ومشروع تم ارفاقه ارجو تحديد مشكله وهي ان برنامج لايعمل رغم كتابه كود بشكل صحيح


الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:135
قديم 09-09-2013, 03:15 AM المشاركة 5   
افتراضي


اخواني الكرام
ارجح عدم الاهتمام بالموضوع الى ( رغم وجود اكثر من 36 مشاهد للموضوع)
1- ربما هناك اشخاص يفهمون موضوع جيدا ولكن ليس لديهم وقت كافي( نخبرهم العلم زكاه وصدقه تفيد بصاحبه بيوم لاينفع مال ولابنون)
2- ربما موضوع لم يعجب احد اطلاقا
3- ربما موضوع لم يفهمه احد .... ولكن يمكن تعلم سويه فانه افتهمت 90% من شرح نظري
اخواني فكره على فكره على فكره يكتمل الموضوع وتزيل صعاب
فهناك مواضيع اجدها صعبه فلااستطيع مساعده احد بها ولكن عند غيري سهله فيمكنه مساعده
وهناك مواضيع سهله عندي فيمكنني مساعده حتى بكل ما اعلم فزداد علما وفهما وأفيد غيري ويكون هذا موضوع عند غيري صعبا
عموما هذا منتدى مدرسه كبيره الله يديم هذه مدرسه ويعمرها بأهلها


الصورة الرمزية ناصراحمد2
ناصراحمد2
:: عضو ذهبي ::
تاريخ التسجيل: Jul 2009
الدولة: EGYPT
المشاركات: 1,334
نشاط [ ناصراحمد2 ]
قوة السمعة:97
قديم 10-09-2013, 07:17 PM المشاركة 6   
yel


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

اتمنى ان يساعدك هذا الموضوع
عليك بمقارنة الاوامر بينة وبين مشروعك لتعرف اين الخطا

http://www.qariya.com/vb/showthread.php?t=48991
وسوف تجد الملفات تم ازالتها من موقع الرفع ولكن كنت رفعتها من قبل على حسابى فى الفورشير وهى موجودة والحمد لله

http://www.4shared.com/file/17148698...05e/3_pic.html

وان لم يتم حل المشكلة انصحك بمراسلة مهندس وليد عنتر وهذا رابط صفحتة
http://www.qariya.com/vb/member.php?u=19547
وهذا رابط صفحتة على الفيسبوك
https://www.facebook.com/wleed.antar.9


ملاحظة بسيطة :
انا فعلا معلوماتى بسيطة جدا فى هذا الموضوع ولكن اعتقد ان البروتوكولات لا يتم وضعها داخل الدوال الفرعية ولكن يتم وضعها فقط داخل الدالة الرئيسية main



مع تمنياتى لك بالتوفيق والنجاح باذن الله


الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:135
قديم 11-09-2013, 01:53 AM المشاركة 7   
افتراضي


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

اتمنى ان يساعدك هذا الموضوع
عليك بمقارنة الاوامر بينة وبين مشروعك لتعرف اين الخطا

http://www.qariya.com/vb/showthread.php?t=48991
وسوف تجد الملفات تم ازالتها من موقع الرفع ولكن كنت رفعتها من قبل على حسابى فى الفورشير وهى موجودة والحمد لله

http://www.4shared.com/file/17148698...05e/3_pic.html

وان لم يتم حل المشكلة انصحك بمراسلة مهندس وليد عنتر وهذا رابط صفحتة
http://www.qariya.com/vb/member.php?u=19547
وهذا رابط صفحتة على الفيسبوك
https://www.facebook.com/wleed.antar.9


ملاحظة بسيطة :
انا فعلا معلوماتى بسيطة جدا فى هذا الموضوع ولكن اعتقد ان البروتوكولات لا يتم وضعها داخل الدوال الفرعية ولكن يتم وضعها فقط داخل الدالة الرئيسية main



مع تمنياتى لك بالتوفيق والنجاح باذن الله
شكرا جزيلا اخي كريم على مساعده
اخي كريم رابط على فوردشير لايعمل ارجوا من حضرتك اعاده رفعه وشكرا جزيلا مره اخرى


الصورة الرمزية ناصراحمد2
ناصراحمد2
:: عضو ذهبي ::
تاريخ التسجيل: Jul 2009
الدولة: EGYPT
المشاركات: 1,334
نشاط [ ناصراحمد2 ]
قوة السمعة:97
قديم 11-09-2013, 03:56 AM المشاركة 8   
افتراضي


شكرا جزيلا اخي كريم على مساعده
اخي كريم رابط على فوردشير لايعمل ارجوا من حضرتك اعاده رفعه وشكرا جزيلا مره اخرى
http://www.4shared.com/rar/K9TL64fm/3_pic.html
الملف موجود كما هو بالموقع ولكن تم تعير الرابط من قبل الموقع
ولا اعرف السبب
مع العلم انة كان موجود بنغس الرابط السابق وقت كتابتى للرد السابق
واتمنى منكم رفع الملفات على مواقعكم للحفاظ عليها
تمنياتى للجميع بالتوفيق ان شاء الله

إضافة رد

العلامات المرجعية

«     الموضوع السابق       الموضوع التالي    »
أدوات الموضوع

الانتقال السريع إلى


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

Powered by vBulletin® Version 3.8.6, Copyright ©2000 - 2025