Страница 1 из 1

Проблема с передачей данных по RS485

Добавлено: Чт фев 17, 2011 15:09:42
zhenya1995
Здраствуйте, У меня проблема с передачей данных по RS485, я знаю что я новенький на этом форуме и сразу тему новую создал но меня это так вывело что уже не знаю что делать! :cry:

Ситуация такая два микроконтралера ATtiny2313 соединены с помощью MAX487 может я что не так сделал или что?

Изображение

Вот прошивки двух микроконтралеров
#include <tiny2313.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)

// 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;

// 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)
{
rx_buffer[rx_wr_index]=data;
if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
};
};
}

#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

// USART Transmitter buffer
#define TX_BUFFER_SIZE 16
char tx_buffer[TX_BUFFER_SIZE];

#if TX_BUFFER_SIZE<256
unsigned char tx_wr_index,tx_rd_index,tx_counter;
#else
unsigned int tx_wr_index,tx_rd_index,tx_counter;
#endif

// USART Transmitter interrupt service routine
interrupt [USART_TXC] void usart_tx_isr(void)
{
if (tx_counter)
{
--tx_counter;
UDR=tx_buffer[tx_rd_index];
if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0;
};
}

#ifndef _DEBUG_TERMINAL_IO_
// Write a character to the USART Transmitter buffer
#define _ALTERNATE_PUTCHAR_
#pragma used+
void putchar(char c)
{
while (tx_counter == TX_BUFFER_SIZE);
#asm("cli")
if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0))
{
tx_buffer[tx_wr_index]=c;
if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
++tx_counter;
}
else
UDR=c;
#asm("sei")
}
#pragma used-
#endif

// Standard Input/Output functions
#include <stdio.h>

// Declare your global variables here

void main(void)
{ unsigned char sym;
char a;

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif


PORTA=0x00;
DDRA=0x00;

PORTB=0x00;
DDRB=0x00;


PORTD=0x0C;
DDRD=0x70;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0xD8;
UCSRC=0x06;
UBRRH=0x00;
UBRRL=0x33;

lcd_init(16);

// Global enable interrupts
#asm("sei")
PORTD.5=0;
a = 0;
while (a==0)
{ sym = (getchar());
if (sym){
lcd_gotoxy(2,0);
lcd_putsf("prishlo"); a = 1;};
};

PORTD.5=1;
delay_ms(2000);
putchar('W');
lcd_gotoxy(2,0);
lcd_putsf("Otpravil OTV");

}

А вот вторая прошивка !!!
#include <tiny2313.h>
#include <delay.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;

// 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)
{
rx_buffer[rx_wr_index]=data;
if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
};
};
}

#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

// USART Transmitter buffer
#define TX_BUFFER_SIZE 16
char tx_buffer[TX_BUFFER_SIZE];

#if TX_BUFFER_SIZE<256
unsigned char tx_wr_index,tx_rd_index,tx_counter;
#else
unsigned int tx_wr_index,tx_rd_index,tx_counter;
#endif

// USART Transmitter interrupt service routine
interrupt [USART_TXC] void usart_tx_isr(void)
{
if (tx_counter)
{
--tx_counter;
UDR=tx_buffer[tx_rd_index];
if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0;
};
}

#ifndef _DEBUG_TERMINAL_IO_
// Write a character to the USART Transmitter buffer
#define _ALTERNATE_PUTCHAR_
#pragma used+
void putchar(char c)
{
while (tx_counter == TX_BUFFER_SIZE);
#asm("cli")
if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0))
{
tx_buffer[tx_wr_index]=c;
if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
++tx_counter;
}
else
UDR=c;
#asm("sei")
}
#pragma used-
#endif

// Standard Input/Output functions
#include <stdio.h>

// Declare your global variables here

void main(void)
{ unsigned char sym;
// Declare your local variables here

// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif


PORTA=0x00;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTD=0x0C;
DDRD=0x70;


// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0xD8;
UCSRC=0x06;
UBRRH=0x00;
UBRRL=0x33;



// LCD module initialization
lcd_init(16);
#asm("sei")

PORTD.5=1;
putchar('W');
lcd_gotoxy(2,0);
lcd_putsf("Otpravilo");
PORTD.5=0;
while (1)
{ sym = (getchar());
if (sym){lcd_gotoxy(1,0);
lcd_putsf("OTVET PRISHOL");};

};
}

Простите если оформил чуть не поправилам!

Когда передает у меня на виртуальном терменале выдает какую-то абракадабру: запятые или ваще другие символы.
В чем может быть ошибка?

Re: Проблема с передачей данных по RS485

Добавлено: Чт фев 17, 2011 16:30:11
md5sum
У max487 выводы A и B соединяются соответственно с А и В, а не крестом :)

Re: Проблема с передачей данных по RS485

Добавлено: Чт фев 17, 2011 17:14:32
zhenya1995
Сделал вот так
Изображение

Но всеравно передает какую-то абракадабру :evil:

Re: Проблема с передачей данных по RS485

Добавлено: Чт фев 17, 2011 17:19:27
ChipKiller
... ИМХО стоит попробовать временно убрать MAX487 и посмотреть, что будет без них (соединять конечно накрест .. RxD-TxD TxD-RxD)

Re: Проблема с передачей данных по RS485

Добавлено: Чт фев 17, 2011 22:04:20
zhenya1995
Напрямую вроде передает правильно я, что заметил в протеусе выдает придупреждение [AVR USART] RX Frame error может в это дело?

Re: Проблема с передачей данных по RS485

Добавлено: Чт фев 17, 2011 22:11:13
zhenya1995
Может кто-то привести пример работы RS485 или у кого есть уже готовые проект в которых используеться RS485 если не жалко, может на каком сайте описываеться подробно как с ним работать, я искал подробного ничего не нашел :cry:

Re: Проблема с передачей данных по RS485

Добавлено: Чт фев 17, 2011 22:42:42
Engineer_Keen
zhenya1995 писал(а):Напрямую вроде передает правильно я, что заметил в протеусе выдает придупреждение [AVR USART] RX Frame error может в это дело?
Протеус коряво симулирует некоторые интерфейсы, у меня с 485-м тоже не получилось, хотя в железе все работает. Соберите в железе и проверьте.

Re: Проблема с передачей данных по RS485

Добавлено: Чт фев 17, 2011 23:47:30
urry
ну и вдогонку по поводу работы в железе
http://www.mayak-bit.narod.ru/rs485.html#vst#vst

Re: Проблема с передачей данных по RS485

Добавлено: Пт фев 18, 2011 01:12:04
zhenya1995
Хорошо, буду пробовать тестить на собраном устройстве