سلام عليكم اخواني راح شرح موضوع وارجو تصحيح اي خطا وهذه محاوله لغرض فهم هذه داله وهي مفيده جدا لاتصال 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 )في الانتربت