سلام دوستان
من می خوام بین 2 میکرو با RS485 ارتباط برقرار کنم . روش کار به اینصورت هست که باید هر دو میکرو هر لحظه که data واسشون ارسال شد دریافت کنن به این معنی که وقتی میکرو کار دیگه ای انجام می ده اگه data برایش ارسال شد دریافت کند . هر 2 میکرو این قابلیتو باید داشته باشند. خودم برنامه نوشتم که با interrupt هست و اولی master و دومی slave هست ولی عددها که بزگ میشن نمی فرسته و یا وقتی برنامه MASTER را تو برنامه اصلی اضافه می کنم مشکل پیدا می کنه. می می خوام 400 تا عدد integer رو از master به slave بفرستم و برعکس.ممنون میشم اگه کسی راهنماییم کنه یا یک برنامه ساده واسم بزاره .برنامه خودمم گذاشتم
برنامه master
#include <mega32.h>
#include <stdio.h>
#include <delay.h>
#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
#define RT PORTB.0
#define TRUE 1
#define FALSE 0
#define XTAL 11059200
void USART_Master_Init(unsigned int baud,char u2x);
void USART_Master_Receive(unsigned char *data);
void USART_Master_Send(unsigned char *data,unsigned char address);
char Error,Msg_Rec;
char buffer[20],receive_buf[20];
unsigned int cou;
int send_buf[20];
//-----------------------------------------
// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
USART_Master_Receive(receive_buf);
}
//-----------------------------------------
void main(){
unsigned int i;
DDRB=0x01;
RT=0;
Msg_Rec=FALSE;
Error=FALSE;
USART_Master_Init(115200,1);
for(i=0;i<20;i++)
send_buf[i]=20000+2*i;
#asm("sei"
while (1)
{
USART_Master_Send(send_buf,45);
//USART_Master_Send(send_buf,42);
if (Msg_Rec) {
Msg_Rec=FALSE;
for (i = 2; i <= receive_buf[1]+1;i++){
sprintf(buffer,"data=%c",receive_buf[i]);
delay_ms(300);
}
delay_ms(1);
USART_Master_Send(send_buf,receive_buf[0]);
}
};
}
//------------------------
void USART_Master_Init(unsigned int baud,char u2x)
{
unsigned int BudeRate;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
UCSRA=0x00;
UCSRB=0x9C;
UCSRC=0x86;
if(u2x)
BudeRate = XTAL / 8 / baud - 1;
else
BudeRate = XTAL / 16 / baud - 1;
UBRRH = (unsigned char)(BudeRate >> 8);
UBRRL = (unsigned char)BudeRate;
}
//---------------------------
void USART_Master_Send(unsigned char *data, unsigned char address)
{
unsigned char i;
RT=1;
while(!(UCSRA & (1<<UDRE)));
UCSRB |= (1 << TXB8);
UDR=address;
for(i=0;i <= data[0];i++)
{
while(!(UCSRA & (1<<UDRE)));
UCSRB &= ~(1 << TXB8);
UDR=data[i];
}
RT=0;
}
//------------------------
void USART_Master_Receive(unsigned char *data)
{
unsigned char input,status;
status=UCSRA;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
Error=FALSE;
input=UDR;
data[cou] = input;
if(cou++==data[1]+1)
{
Msg_Rec=TRUE;
cou=0;
}
}
else Error=TRUE;
}
برنامه slave
#include <mega32.h>
#include <stdio.h>
#include <delay.h>
#asm
.equ __lcd_port=0x18 ;PORTB
#endasm
#include <lcd.h>
#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
#define RT PORTD.2
#define Slave_Address 45
#define XTAL 11059200
#define TRUE 1
#define FALSE 0
char chek;
char buffer[20];//,receive_buf[20],send_buf[20]={5,'S','l','a', 9;v','e'};
int receive_buf[20],send_buf[20];
char Error,Msg_Rec;
unsigned int cou;
void USART_slave_Init(unsigned int baud,char u2x);
void USART_Slave_Receive(unsigned char *data);
void USART_Slave_Send(unsigned char *data);
//-------------------------------------
// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
USART_Slave_Receive(receive_buf);
}
//----------------------------------------
void main(){
unsigned int i,len;
DDRD=0x04;
RT=0;
lcd_init(16);
lcd_clear();
USART_slave_Init(115200,1);
Msg_Rec=FALSE;
Error=FALSE;
send_buf[0]=16;
send_buf[1]=255;
#asm("sei"
while (1){
if (Msg_Rec) {
Msg_Rec=FALSE;
len=receive_buf[0];
for (i = 1; i <= len;i++){
lcd_clear();
sprintf(buffer,"data=%d",receive_buf[i]);
lcd_puts(buffer);
delay_ms(300);
}
delay_ms(1);
USART_Slave_Send(send_buf);
}
if(receive_buf[19]==255)
{
USART_Slave_Send(send_buf);
break;
}
};
}
//------------------------
void USART_slave_Init(unsigned int baud,char u2x)
{
unsigned int BudeRate;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
UCSRA=0x01; // Bit MPCM=1
UCSRB=0x9c;
UCSRC=0x86;
if(u2x)
BudeRate = XTAL / 8 / baud - 1;
else
BudeRate = XTAL / 16 / baud - 1;
UBRRH = (unsigned char)(BudeRate >> 8);
UBRRL = (unsigned char)BudeRate;
}
//------------------------
void USART_Slave_Receive(unsigned char *data)
{
unsigned char input,status;
chek=1;
status=UCSRA;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0){
Error=FALSE;
input=UDR;
if(UCSRA & 0x01){
if(input == Slave_Address){
UCSRA &= 0xFE; // Bit MPCM=0
cou=0;
}
}else{
data[cou] = input;
if(cou++==data[0]){
UCSRA |= 0x01; // Bit MPCM=1
Msg_Rec=TRUE;
}
}
}else Error=TRUE;
}
//------------------------
void USART_Slave_Send(unsigned char *data)
{
unsigned char i;
RT=1;
while(!(UCSRA & (1<<UDRE)));
UCSRB &= ~(1 << TXB8);
UDR=Slave_Address;
for(i=0;i <= data[0];i++)
{
while(!(UCSRA & (1<<UDRE)));
UCSRB &= ~(1 << TXB8);
UDR=data[i];
}
RT=0;
}
من می خوام بین 2 میکرو با RS485 ارتباط برقرار کنم . روش کار به اینصورت هست که باید هر دو میکرو هر لحظه که data واسشون ارسال شد دریافت کنن به این معنی که وقتی میکرو کار دیگه ای انجام می ده اگه data برایش ارسال شد دریافت کند . هر 2 میکرو این قابلیتو باید داشته باشند. خودم برنامه نوشتم که با interrupt هست و اولی master و دومی slave هست ولی عددها که بزگ میشن نمی فرسته و یا وقتی برنامه MASTER را تو برنامه اصلی اضافه می کنم مشکل پیدا می کنه. می می خوام 400 تا عدد integer رو از master به slave بفرستم و برعکس.ممنون میشم اگه کسی راهنماییم کنه یا یک برنامه ساده واسم بزاره .برنامه خودمم گذاشتم
برنامه master
#include <mega32.h>
#include <stdio.h>
#include <delay.h>
#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
#define RT PORTB.0
#define TRUE 1
#define FALSE 0
#define XTAL 11059200
void USART_Master_Init(unsigned int baud,char u2x);
void USART_Master_Receive(unsigned char *data);
void USART_Master_Send(unsigned char *data,unsigned char address);
char Error,Msg_Rec;
char buffer[20],receive_buf[20];
unsigned int cou;
int send_buf[20];
//-----------------------------------------
// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
USART_Master_Receive(receive_buf);
}
//-----------------------------------------
void main(){
unsigned int i;
DDRB=0x01;
RT=0;
Msg_Rec=FALSE;
Error=FALSE;
USART_Master_Init(115200,1);
for(i=0;i<20;i++)
send_buf[i]=20000+2*i;
#asm("sei"

while (1)
{
USART_Master_Send(send_buf,45);
//USART_Master_Send(send_buf,42);
if (Msg_Rec) {
Msg_Rec=FALSE;
for (i = 2; i <= receive_buf[1]+1;i++){
sprintf(buffer,"data=%c",receive_buf[i]);
delay_ms(300);
}
delay_ms(1);
USART_Master_Send(send_buf,receive_buf[0]);
}
};
}
//------------------------
void USART_Master_Init(unsigned int baud,char u2x)
{
unsigned int BudeRate;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
UCSRA=0x00;
UCSRB=0x9C;
UCSRC=0x86;
if(u2x)
BudeRate = XTAL / 8 / baud - 1;
else
BudeRate = XTAL / 16 / baud - 1;
UBRRH = (unsigned char)(BudeRate >> 8);
UBRRL = (unsigned char)BudeRate;
}
//---------------------------
void USART_Master_Send(unsigned char *data, unsigned char address)
{
unsigned char i;
RT=1;
while(!(UCSRA & (1<<UDRE)));
UCSRB |= (1 << TXB8);
UDR=address;
for(i=0;i <= data[0];i++)
{
while(!(UCSRA & (1<<UDRE)));
UCSRB &= ~(1 << TXB8);
UDR=data[i];
}
RT=0;
}
//------------------------
void USART_Master_Receive(unsigned char *data)
{
unsigned char input,status;
status=UCSRA;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
Error=FALSE;
input=UDR;
data[cou] = input;
if(cou++==data[1]+1)
{
Msg_Rec=TRUE;
cou=0;
}
}
else Error=TRUE;
}
برنامه slave
#include <mega32.h>
#include <stdio.h>
#include <delay.h>
#asm
.equ __lcd_port=0x18 ;PORTB
#endasm
#include <lcd.h>
#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
#define RT PORTD.2
#define Slave_Address 45
#define XTAL 11059200
#define TRUE 1
#define FALSE 0
char chek;
char buffer[20];//,receive_buf[20],send_buf[20]={5,'S','l','a', 9;v','e'};
int receive_buf[20],send_buf[20];
char Error,Msg_Rec;
unsigned int cou;
void USART_slave_Init(unsigned int baud,char u2x);
void USART_Slave_Receive(unsigned char *data);
void USART_Slave_Send(unsigned char *data);
//-------------------------------------
// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
USART_Slave_Receive(receive_buf);
}
//----------------------------------------
void main(){
unsigned int i,len;
DDRD=0x04;
RT=0;
lcd_init(16);
lcd_clear();
USART_slave_Init(115200,1);
Msg_Rec=FALSE;
Error=FALSE;
send_buf[0]=16;
send_buf[1]=255;
#asm("sei"

while (1){
if (Msg_Rec) {
Msg_Rec=FALSE;
len=receive_buf[0];
for (i = 1; i <= len;i++){
lcd_clear();
sprintf(buffer,"data=%d",receive_buf[i]);
lcd_puts(buffer);
delay_ms(300);
}
delay_ms(1);
USART_Slave_Send(send_buf);
}
if(receive_buf[19]==255)
{
USART_Slave_Send(send_buf);
break;
}
};
}
//------------------------
void USART_slave_Init(unsigned int baud,char u2x)
{
unsigned int BudeRate;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
UCSRA=0x01; // Bit MPCM=1
UCSRB=0x9c;
UCSRC=0x86;
if(u2x)
BudeRate = XTAL / 8 / baud - 1;
else
BudeRate = XTAL / 16 / baud - 1;
UBRRH = (unsigned char)(BudeRate >> 8);
UBRRL = (unsigned char)BudeRate;
}
//------------------------
void USART_Slave_Receive(unsigned char *data)
{
unsigned char input,status;
chek=1;
status=UCSRA;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0){
Error=FALSE;
input=UDR;
if(UCSRA & 0x01){
if(input == Slave_Address){
UCSRA &= 0xFE; // Bit MPCM=0
cou=0;
}
}else{
data[cou] = input;
if(cou++==data[0]){
UCSRA |= 0x01; // Bit MPCM=1
Msg_Rec=TRUE;
}
}
}else Error=TRUE;
}
//------------------------
void USART_Slave_Send(unsigned char *data)
{
unsigned char i;
RT=1;
while(!(UCSRA & (1<<UDRE)));
UCSRB &= ~(1 << TXB8);
UDR=Slave_Address;
for(i=0;i <= data[0];i++)
{
while(!(UCSRA & (1<<UDRE)));
UCSRB &= ~(1 << TXB8);
UDR=data[i];
}
RT=0;
}
دیدگاه