سلام عليكم
يطيب لي بمناسبة حلول عيد الاضحى المبارك
ان ازف لكم اطيب التهاني واجمل التبريكات داعيا الله العزيز الرحيم ان يحفظكم وعوائلكم من كل مكروه ، وان يعيد هذا العيد علينا وعليكم ، بالخير واليمن والبركات
وكل عام وانتم بالف خير
اليكم هذا مشروع البسيط يوضح فيها كيف تعمل مكتبه RS485
اذا تم ضغط على سويج تزداد سرعه ماطور
سويج موجود عند master وماطور موجود عند slave
ملاحظه لم اربط مع ماطور ترانزستور انما فقط لغرض محاكاه
علما ان الاتصال من نوع RS485 أتعبني كثير وأخير وجدت مشكله ولكن لحد الان انا لاأعرف سر كود (( موجود بلون أحمر)) يكون هذا مع ماستر فقط وبدونه لايرسل ولايستقبل أطلاقا
كود ماستر
كود:
#define sw porta.f0
#define sw_dir trisa.f0
#define error portb.f4
#define error_dir trisb.f4
#define led portb.f3
#define led_dir trisb.f3
#define led_recive portb.f5
#define led_recive_dir trisb.f5
#define pressed 0
#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 kk=0;
unsigned int cnt=0;
////***********************************************************************////
void send_data();
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;
led_dir=0;
led=0;
}
void main()
{
init_pic();
delay_ms(100);
trisb=2;
while(1)
{
if( sw is pressed)
{
delay_ms(250);
dat[0]=dat[0]+5;
if (dat[0]>250)dat[0]=0;
kk=0;
send_data();
}
}
}
void send_data()
{
while (1)
{
cnt++;
led=on;
delay_us(100);
led=off;
if (dat[5]==255) // if an error detected, signal it
{
error=on;
return;
}
if (dat[4]==255)
{ // if message received successfully
dat[4] = 0; // clear message received flag
cnt=0;
error=~error;
kk=1;
delay_ms(1);
RS485Master_Send(dat,1,10); // send back to master
return;
}
if(cnt>1000&&kk==0)
{
cnt=0;
RS485Master_Send(dat,1,10);
return;
}
}
}
**********************************************
كود خادم slave
كود:
#define error portb.f4
#define error_dir trisb.f4
#define led_recive portb.f5
#define led_recive_dir trisb.f5
#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
PWM1_Init(1000);
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
error_dir=0;
error=off;
}
//***************************************************************************//
void interrupt()
{
RS485Slave_Receive(dat);
}
void main()
{
init_pic();
delay_ms(100);
while(1)
{
PWM1_Start();
PWM1_Set_Duty(dat[0]);
}
}
http://arabsh.com/files/0c374d4e65fa...rs485-rar.html