Ioann 0 5 апреля, 2007 Опубликовано 5 апреля, 2007 · Жалоба Понял, что надо мне проверить, сбрасываю ли TXC при последнем символе. Спасибо всем откликнувшимся. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
defunct 0 5 апреля, 2007 Опубликовано 5 апреля, 2007 · Жалоба Делал RS485 на ATMega128. Нужно было отлавливать момент окончания передачи символа - есть соответствующий бит TXC. Так вот, оказалось, что этот бит устанавливается почему-то ДО окончания передачи последнего символа (одновременно с TXE), хотя по datasheet должен по окончании. Когда по этому биту делал переключение драйвера на приём, последний символ не передавался. Пришлось делать программную задержку в виде пустого цикла. У вас ошибка в программе. Взведите прерывание по TX. В обработчике прерывания переключайте 485-й на прием. Уже ж писал где-то об этом. Пример одного из самых простых способов: Пусть PD2 - пин выбора направления 485 PD2 = 1 - передача PD2 = 0 - прием. Тогда putchar(char ch) { while (PORTD & (1 << PD2)); // ждем пока 485-й в режиме передачи PORTD |= (1 << PD2); // взвести передачу UDR = ch; // засунуть отправляемый символ в UDR } void UartTxISR(void) { // в обработчике Tx переключить 485-й обратно на прием. PORTD &= ~(1 << PD2); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться