سلام.
من یک برنامه برای ارتباط دو میکرو به صورت سریال نوشتم اما نمی دونم چرا تو محیط پروتئوس جواب نمی ده.فعلا به طور نمونه فقط یک اسم را فرستادم.متن برنامه رو یه نگاه بندازید اگه کم و کاستی داشت بگید.البته مشکل در گیرنده می باشد.
چیزی که معلومه اینه که مشکل برنامه این است که وارد حلقه if نمی شود.یعنی متغیر receive_complete یک نمی شه.
ضمنا با توجه به اینکه از کاراکتر ‘\r’ در انتهای ارسال استفاده کردم.ایا دستور if(data==’\r&rsquo
که تو وقفه دریافت ازش استفاده کردم درسته؟
این برنامه فرستنده:
char esm[10]="ali";
while (1)
{
// Place your code here
delay_ms(100);
sprintf(str,"#%s\r",esm);
puts(str);
delay_ms(100);
};
} //end of main
اینم برنامه گیرنده:
#include <mega16.h>
// Alphanumeric LCD Module functions
#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)
// USART Receiver buffer
#define RX_BUFFER_SIZE 16
char rx_buffer[RX_BUFFER_SIZE];
#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif
// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;
bit receive_complete =0;
// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
if(data=='#'
{
rx_buffer[0]=data;
rx_wr_index=1;
}
else if(rx_wr_index>=1 && data!='\r'
{
rx_buffer[rx_wr_index]=data;
rx_wr_index++;
}
else if(data=='\r'
{
receive_complete=1;
}
else
{
rx_wr_index=0;
}
if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
};
}; /* END OF INTERRUPT */
}
#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli"
--rx_counter;
#asm("sei"
return data;
}
#pragma used-
#endif
// Standard Input/Output functions
#include <stdio.h>
// Declare your global variables here
void main(void)
{
// Declare your local variables here
char str[30];
.
.
.
.
.
.
while (1)
{
// Place your code here
if(receive_complete(
{
lcd_clear();
lcd_gotoxy(0,0);
sprintf(str,"%s",rx_buffer);
lcd_puts(str);
receive_complete=0;
}
};
} // end of main.
کد ها را تو notepad ببینید.
من یک برنامه برای ارتباط دو میکرو به صورت سریال نوشتم اما نمی دونم چرا تو محیط پروتئوس جواب نمی ده.فعلا به طور نمونه فقط یک اسم را فرستادم.متن برنامه رو یه نگاه بندازید اگه کم و کاستی داشت بگید.البته مشکل در گیرنده می باشد.
چیزی که معلومه اینه که مشکل برنامه این است که وارد حلقه if نمی شود.یعنی متغیر receive_complete یک نمی شه.
ضمنا با توجه به اینکه از کاراکتر ‘\r’ در انتهای ارسال استفاده کردم.ایا دستور if(data==’\r&rsquo

این برنامه فرستنده:
char esm[10]="ali";
while (1)
{
// Place your code here
delay_ms(100);
sprintf(str,"#%s\r",esm);
puts(str);
delay_ms(100);
};
} //end of main
اینم برنامه گیرنده:
#include <mega16.h>
// Alphanumeric LCD Module functions
#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)
// USART Receiver buffer
#define RX_BUFFER_SIZE 16
char rx_buffer[RX_BUFFER_SIZE];
#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif
// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;
bit receive_complete =0;
// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
if(data=='#'

{
rx_buffer[0]=data;
rx_wr_index=1;
}
else if(rx_wr_index>=1 && data!='\r'

{
rx_buffer[rx_wr_index]=data;
rx_wr_index++;
}
else if(data=='\r'

{
receive_complete=1;
}
else
{
rx_wr_index=0;
}
if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
};
}; /* END OF INTERRUPT */
}
#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli"

--rx_counter;
#asm("sei"

return data;
}
#pragma used-
#endif
// Standard Input/Output functions
#include <stdio.h>
// Declare your global variables here
void main(void)
{
// Declare your local variables here
char str[30];
.
.
.
.
.
.
while (1)
{
// Place your code here
if(receive_complete(
{
lcd_clear();
lcd_gotoxy(0,0);
sprintf(str,"%s",rx_buffer);
lcd_puts(str);
receive_complete=0;
}
};
} // end of main.
کد ها را تو notepad ببینید.
دیدگاه