реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> AVR + RS485
*Smarty*
сообщение Jan 26 2006, 07:09
Сообщение #1





Группа: Новичок
Сообщений: 3
Регистрация: 6-12-05
Пользователь №: 11 891



Кто-нибудь подключал RS485 к USART AVR-а? Я использую MAX1480, линии RX иTX к USART, а переключение прием/передача просто свободной ногой... но что-то не катит...
Go to the top of the page
 
+Quote Post
andrvisht
сообщение Jan 26 2006, 07:39
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



Цитата(*Smarty* @ Jan 26 2006, 11:09) *
Кто-нибудь подключал RS485 к USART AVR-а? Я использую MAX1480, линии RX иTX к USART, а переключение прием/передача просто свободной ногой... но что-то не катит...

Подключал, проблем не было.
Давайте подробнее:
1 схема подключения
(вот например RxD, TxD куда подключены?)
2 чем переключаете, какой ногой ?
3. Чем смотрите, как определяете что не работает ?
Go to the top of the page
 
+Quote Post
*Smarty*
сообщение Jan 26 2006, 07:56
Сообщение #3





Группа: Новичок
Сообщений: 3
Регистрация: 6-12-05
Пользователь №: 11 891



1. RXD - RO
TXD - DI
2. переключаю ногой PE2, подключена к DE MAXа
3. подключаю к компьютеру, там программа читает порт


МК передает последовательность чисел 0 - 255, но комп принимает не то
вот кусок программы МК:
/* Main - a simple test program*/
void main( void )
{
//unsigned char ch;
port_init();
InitUART( ); /* Set the baudrate to 9,600 bps using a 10 MHz crystal */
SEI();
for(;;) /* Forever */
{
//ClrBit(PORTE,2); //
//ch = ReceiveByte();
SetBit(PORTE,2); // ïåðåäà÷à
for(ch=0;ch<255;ch++){
//ch=0xFF-ch;
TransmitByte(ch); /* Echo the received character */
}
}
}

/* Initialize UART */
void InitUART(void)// unsigned char baudrate )
{
UBRR0L = 64; //set baud rate lo
UBRR0H = 0x00; //set baud rate hi
UCSR0A = 0x00;
UCSR0B = 0b00001000;
}

/* Read and write functions */
unsigned char ReceiveByte( void )
{
while ( !(UCSR0A & (1<<RXC0)) ) /* Wait for incomming data */
; /* Return the data */
return UDR0;
}

void TransmitByte( unsigned char data )
{
while ( !(UCSR0A & (1<<UDRE0)) )
; /* Wait for empty transmit buffer */
UDR0 = data; /* Start transmittion */
}

void port_init(void)
{
PORTA = 0x00;
DDRA = 0x00;
PORTB = 0x00;
DDRB = 0x10;
PORTC = 0x00; //m103 output only
DDRC = 0x00;
PORTD = 0x00;
DDRD = 0x00;
PORTE = 0x00;
DDRE = 0x04;
PORTF = 0x00;
DDRF = 0x00;
PORTG = 0x00;
DDRG = 0x00;
}
Go to the top of the page
 
+Quote Post
_Sam_
сообщение Jan 26 2006, 08:26
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 278
Регистрация: 18-01-05
Из: Санкт-Петербург
Пользователь №: 2 031



В компьютере интерфейс RS232, а не RS485.
Со стороны компьютера надо ставить ещё одну RS485 которая будет включена на приём.
Go to the top of the page
 
+Quote Post
*Smarty*
сообщение Jan 26 2006, 08:38
Сообщение #5





Группа: Новичок
Сообщений: 3
Регистрация: 6-12-05
Пользователь №: 11 891



в компе стоит карта, с ней работаешь как с COM, а на выходе RS485
Go to the top of the page
 
+Quote Post
defunct
сообщение Jan 26 2006, 09:49
Сообщение #6


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(*Smarty* @ Jan 26 2006, 10:38) *
в компе стоит карта, с ней работаешь как с COM, а на выходе RS485


при запихивании очередного байта в UDR - взводим управляющий пин, по TX int - сбрасываем.
на max'е соединить пины notRE и DE.
Go to the top of the page
 
+Quote Post
andrvisht
сообщение Jan 26 2006, 09:51
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 298
Регистрация: 29-08-05
Пользователь №: 8 064



Цитата(*Smarty* @ Jan 26 2006, 11:56) *
/* Initialize UART */
void InitUART(void)// unsigned char baudrate )
{
UBRR0L = 64; //set baud rate lo
UBRR0H = 0x00; //set baud rate hi
UCSR0A = 0x00;
UCSR0B = 0b00001000;
}

Судя по порту E речь идет об m128
тогда проинициализируй UCSR0C там по умолчанию 5 битная вроде стоит.
Еще желательно переде передачей делать паузу, для устаканивания, иначе могут быть ошибки, ведь вашему компу надо засинхриться.
Вы в CV вроде пишите, или ICC.
Вот для IAR
Код
void USART_Init(void)
{
  UCSR0A = (_U2X<<U2X0); // Doble Speed, Multi-Processor Communication Mode Disable
  UCSR0B = 0x00;  // Rx, Tx, Data Register Empty Interrupts Disable, Rx, Tx Disabled, 8 bit
  UCSR0C = (1<<UCSZ01)|(1<<UCSZ00); // Asynchronous Operation, Parity Mode Disabled, 1 Stop, 8 bit
  __out_word(UBRR0,_UBRR);
  LED_Conn_Dir = 1;
  Tx_Rx_485_Dir = 1;
  RxData(MAX_BYTE_RX,RxFirst); // Инициализация на прием
}
Go to the top of the page
 
+Quote Post
_Sam_
сообщение Jan 26 2006, 09:54
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 278
Регистрация: 18-01-05
Из: Санкт-Петербург
Пользователь №: 2 031



Тогда попробуй A подтянуть к +5, B подтянуть к GND, резисторами номиналом где-то около 1К. Если такие подтяжки стоят в плате на компе, тогда надо смотреть программную часть.

Что касается программной части, то в функции TransmitByte я бы поставил задержу где то 1-2ms(для скорости 9600) это должно помочь. Дело в том что когда по rs передаётся непрерывная последовательность компьютер может посчитать стартовым не тот бит и в результате будет приниматься не та последовательность. Иначе говоря при каждом включении вашего устройства компьютер может принимать разные последовательности.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 19th July 2025 - 01:04
Рейтинг@Mail.ru


Страница сгенерированна за 0.01394 секунд с 7
ELECTRONIX ©2004-2016