Доброго времени суток!
Проблема с RS485, третий день туплю.
Собрал простой переходник с RS232 на RS485 по этой схемке:
схема.
Схема ИМХО работает, но с передачей данных появились проблемы
использовал Terminal. Для МК была написана простая тестовая программка:
_______________________________________________________________
//ICC-AVR application builder : 05.02.07 16:50:48
// Target : M16
// Crystal: 6.4Mhz
#include <iom16v.h>
#include <macros.h>
#define RXBUF_SIZE 4
#define TXBUF_SIZE 4
unsigned char RxBuffer[RXBUF_SIZE],TxBuffer[TXBUF_SIZE];
unsigned char TranRequest=0,flag=0,done=0;
unsigned char RxIndex=0,TxIndex=0;
void port_init(void)
{
PORTA = 0xFF;
DDRA = 0x00;
PORTB = 0xFF;
DDRB = 0x00;
PORTC = 0xFF; //m103 output only
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0xFF;
TCCR0 = 0x05;
}
//UART0 initialisation
// desired baud rate: 9600
// actual: baud rate:9524 (0,8%)
// char size: 8 bit
// parity: Disabled
void uart0_init(void)
{
UCSRB = 0x00; //disable while setting baud rate
UCSRA = 0x00;
UCSRC = 0x06;
UBRRL = (unsigned char)41; //set baud rate lo
UBRRH = (unsigned char)41>>8; //set baud rate hi
UCSRB = 0xD8;
}
void init_devices(void)
{
//stop errant interrupts until set up
CLI(); //disable all interrupts
port_init();
uart0_init();
MCUCR = 0x00;
GICR = 0x00;
TIMSK = 0x00; //timer interrupt sources
SEI(); //re-enable interrupts
//all peripherals are now initialised
}
#pragma interrupt_handler uart0_rx_isr:12
void uart0_rx_isr(void)
{
unsigned char RXchar;
RXchar=UDR;
RxBuffer[RxIndex++]=RXchar;
if(RxIndex>=(RXBUF_SIZE)){flag=1;RxIndex=0;PORTD=0xFF;/*на передачу*/}
}
#pragma interrupt_handler uart0_tx_isr:14
void uart0_tx_isr(void)
{
if(done==1){done=0;PORTD=0x00;/*на прием*/}
if(TranRequest==1)
{
unsigned char TXchar;
TXchar=TxBuffer[++TxIndex];
if(TxIndex==(TXBUF_SIZE-1)){TranRequest=0;TxIndex=0;done=1;}
UDR=TXchar;
}
}
void main()
{
init_devices();
while(1)
{
if(flag==1)
{
unsigned char inc;
flag=0;
TranRequest=1;
for(inc=0;inc<=(TXBUF_SIZE-1);inc++){TxBuffer[inc]=RxBuffer[inc];}
UDR=TxBuffer[0];
}
}
}
_______________________________________________________________
Смысл: передаем с ПК 4 любых символа, МК возвращает их обратно
МК их конечно же возвращает, но 1 из 5-7 пакетов-"битый".
На этом форуме я натыкался на тему, где описывалась проблема
с RS 485 с "лишним" 0-вым битом в символе,примерно похоже на мою
проблему: в основном в неверных символах у меня "лишний" как раз или 0-й
или 7-й бит.
Причем проблема именно с передачей с ПК.
МК шлет обратно то, что ему прислали, это
я проверил это следующим способом:
Конструкция типа:
PORTD=0xFF;//всегда передача
.....................
.....................
.....................
while(1)
{
puts("a very long string");
delayms(1500);
}
работает без единой ошибки передачи.
______________________________________
А конструкция типа:
PORTD=0x00;//всегда прием.
..................
.................
.................
................
получаем 4 символа,
проверяем равны ли они
символу(предположим) 'x'
если равны, то зажигаем
св.диод на 1сек.
на 5-7 пакетов дает сбой.
По поводу переходника: линию CTS не получилось
использовать из-за отсутсвия необходимого пина
в разъеме от мыши :-)
Но это так, к слову, я на это даже и не думаю...
Кто-нибудь сталкивался с подобной проблемой?
Можете натолкнуть на свежую мысль?
А то уже 3-й день туплю :-)
Заранее спасибо!