Перейти к содержанию
    

Окончание передачи UART

Понял, что надо мне проверить, сбрасываю ли TXC при последнем символе.

Спасибо всем откликнувшимся.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Делал 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);
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...