Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AVR + RS485
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
*Smarty*
Кто-нибудь подключал RS485 к USART AVR-а? Я использую MAX1480, линии RX иTX к USART, а переключение прием/передача просто свободной ногой... но что-то не катит...
andrvisht
Цитата(*Smarty* @ Jan 26 2006, 11:09) *
Кто-нибудь подключал RS485 к USART AVR-а? Я использую MAX1480, линии RX иTX к USART, а переключение прием/передача просто свободной ногой... но что-то не катит...

Подключал, проблем не было.
Давайте подробнее:
1 схема подключения
(вот например RxD, TxD куда подключены?)
2 чем переключаете, какой ногой ?
3. Чем смотрите, как определяете что не работает ?
*Smarty*
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;
}
_Sam_
В компьютере интерфейс RS232, а не RS485.
Со стороны компьютера надо ставить ещё одну RS485 которая будет включена на приём.
*Smarty*
в компе стоит карта, с ней работаешь как с COM, а на выходе RS485
defunct
Цитата(*Smarty* @ Jan 26 2006, 10:38) *
в компе стоит карта, с ней работаешь как с COM, а на выходе RS485


при запихивании очередного байта в UDR - взводим управляющий пин, по TX int - сбрасываем.
на max'е соединить пины notRE и DE.
andrvisht
Цитата(*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); // Инициализация на прием
}
_Sam_
Тогда попробуй A подтянуть к +5, B подтянуть к GND, резисторами номиналом где-то около 1К. Если такие подтяжки стоят в плате на компе, тогда надо смотреть программную часть.

Что касается программной части, то в функции TransmitByte я бы поставил задержу где то 1-2ms(для скорости 9600) это должно помочь. Дело в том что когда по rs передаётся непрерывная последовательность компьютер может посчитать стартовым не тот бит и в результате будет приниматься не та последовательность. Иначе говоря при каждом включении вашего устройства компьютер может принимать разные последовательности.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.