Помогите разобраться с общением устройств по RS-485: - есть некое устройство (мастер), которое передает 8 байт (формат: №-устройства,команда,данные,контрол.сумма), следом ждет ответа от моего устройства (слэйв) в виде 8 байт.
Написал код, где по циклу устройство(слэйв) ждет 8 байт, получив последний - передает принятые байты мастеру.
Проблема в следующем: при передачи выясняется, что 1-й байт =0 (должен = 0х14) и да все последующие байты перекошены...
Всем спасибо за внимание!
Да, к стати, в Proteus-е логика отрабатывается как надо, а в живую не идет….
#include "iom8.h"
#include "intrinsics.h"
#define RE PORTD_Bit2 // MAX485 - вывод прием\передача
#define RX (RE=(0<<RE), UCSRB = (1<<RXEN)|(0<<TXEN)|(1<<RXCIE)|(0<<UDRIE)|(0<<TXCIE))
#define TX (RE=(1<<RE), UCSRB = (0<<RXEN)|(1<<TXEN)|(0<<RXCIE)|(1<<UDRIE)|(1<<TXCIE))
define F_CPU 8000000//
#define BAUD 38400 // скорость
#define MYUBRR F_CPU/16/BAUD-1 // расчет
static unsigned char rx_buffer[8]={0,0,0,0,0,0,0,0}; // буфер приема
static unsigned char tx_buffer[8]={0,0,0,0,0,0,0,0}; // буфер передачи
unsigned char count =0; // счетчик байтов
//------------------------инициализация UART на скор: 38400 формат: 8N1 -------------------------
void USART_Init( unsigned int ubrr)
{
UBRRH = (unsigned char)(ubrr>>8);
UBRRL = (unsigned char)ubrr;
UCSRB = (1<<RXEN)|(1<<TXEN);//|(1<<UDRIE);
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}
//---------------------Прерывание по приему-----------------------------------------------
#pragma vector = USART_RXC_vect
__interrupt void RX_compl (void)
{
asm("cli");
rx_buffer[count++]=UDR;
asm("sei");
}
int main()
{
USART_Init(MYUBRR);
asm("sei") ;
while(1)
{
count=0;
RX;
while(count<8);
for(int i=0; i<8; i++) { tx_buffer=rx_buffer;}
count=0;
TX;
while(count<8)
{
while(!(UCSRA & (1<<UDRE)));
UDR=tx_buffer[count++];
while ( !( UCSRA & (1<<TXCIE)) );
};
};
}


