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

У MSP нет прерывания по опустошению сдвигового регистра, как у AVR. Каким образом мне поймать момент опустошения сдвигового регистра, чтобы переключить направление передачи? Сделал по таймеру, но в этом случае отправляется лишний байт и как-то не нравится такое решение. Кто может что-то предложить?

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


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

Сделал по таймеру, но в этом случае отправляется лишний байт и как-то не нравится такое решение. Кто может что-то предложить?

Не понял: откуда берётся лишний байт?

Прерывание есть по опустошению передающего буфера, от него можно отсчитать таймером длину байта и переключать. Вполне нормальное решение.

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


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

Решение, похоже, единственное за неимением других способов, а лишний байт появляется из-за того. что трудно синхронизовать интервал таймера с длиной байта. Почему-то проскакивает стартовый бит. Или теряется предыдущий байт. Парился долго, но без этих накладок не удалось сделать. Правда, это несущественно для моей задачи. Наверное, так и оставлю.

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


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

трудно синхронизовать интервал таймера с длиной байта.

Непонятно. Даже на скорости 115200 длительность битового интервала около 10мкс, (несколько десятков тактов). Задержку можно взять с запасом.

Почему-то проскакивает стартовый бит. Или теряется предыдущий байт.

Значит, слишком рано переключаетесь. Или лишнего в буфер кидаете. Если буфер пустой, никакой передачи (и соответственно стартовых битов) быть не должно.

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


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

Не понял: откуда берётся лишний байт?

Прерывание есть по опустошению передающего буфера, от него можно отсчитать таймером длину байта и переключать. Вполне нормальное решение.

TXBUF пустой, срабатывает прерывание, что готов к передаче следующего, а сдвигающий регистр еще молотит и UART еще продолжает передавать (TXEMP еще не выставлен). Поэтому если отсчитать интервал в длину байта с момента опустошения TXBUF, то можно потерять "кусочек" байта. Может в этом затык?

Если не угадал, то приведите свой код, а то не все умеють гадать по звездам.

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


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

Не нужно стремиться включать драйвер как можно быстрее. Если у вас разрабатывается поддержка сетевого устройства, а не "настольный" вариант конвертора, то предвосхищая трудности стыковки в одной сети вашего устройства с устройствами других производителей, следует заложить в реализацию настраиваемые задержки.

1) задержка между переключением драйвера RS485 на передачу и началом передачи

2) задержка после окончания передачи, перед переключением драйвера в режим приема.

Еще раз подчеркиваю, что это должны быть настраиваемые пользователем задержки.

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


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

В UxTCTL вродеж есть TXEPT. По крайней мере я его пользовал. Посмотрите мои дровишки - там есть функция USART0_Shift_Reg_Control() я ее когда нужно полю для переключения. Недостаток моей реализации - отсутсвие задержки >=1млс после опустошения сдвигового регистра - забил тогда.

usart0_2008_08_07_140125.rar

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


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

В UxTCTL вродеж есть TXEPT.
TXEPT тоже не подходит. Он устанавливается одновременно с выдвижением из сдвигового регистра на вывод TXD последнего бита. Нужно после установки TXEPT делать паузу как минимум на один битовый интервал.

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


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

TXEPT тоже не подходит.

Ну, отчего же?..

Я просто предположил, что аффтор путает момент возникновения прерывания передатчика с реальным моментом окончания передачи, отсюда и нестыковки во времени. А TXEPT может помочь в расчете момента, когда можно переключать направление. Прерывание передатчика тоже может помочь, главное не путать их местами.

Другое дело в ту ли сторону мы копаем. Пусть аффтор, уточнит.

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


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

Ну, отчего же?..

Я просто предположил, что аффтор путает момент возникновения прерывания передатчика с реальным моментом окончания передачи, отсюда и нестыковки во времени.

Ясно что не понимает. Причем не столько в таймингах, сколько в организации буферов. Как может "отправляться лишний байт", если буфер выделенный для передачи пуст? Откуда он вообще попал в буфер передатчика это "лишний" байт? UART ведь сам по себе ничего не передает. Может в очередной раз нужен пример организации линейных или циклических буферов? :laughing:

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


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

2) задержка после окончания передачи, перед переключением драйвера в режим приема.

Еще раз подчеркиваю, что это должны быть настраиваемые пользователем задержки.

 

А это зачем? ИМХО, что чем быстрее устройство отпустит шину после передачи, тем лучше. Какие могут быть причины задерживать момент отключения?

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


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

А это зачем? ИМХО, что чем быстрее устройство отпустит шину после передачи, тем лучше. Какие могут быть причины задерживать момент отключения?

Переходные процессы в линии

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


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

Переходные процессы в линии

 

Для их подавления служит задержка перед началом передачи. А смысла в задержке по окончании передачи я не вижу никакого.

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


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

Для их подавления служит задержка перед началом передачи. А смысла в задержке по окончании передачи я не вижу никакого.

Для RTU-ных протоколов связи, в которых конец пакета отслеживается по паузе тишины, смысл в формировании этой паузы удержанием драйвера в режиме передачи имеется. К тому же я написал - настраиваемая задержка. Параметр, имеющий величину - 0, означает отсутствие этой задержки ;)

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


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

Для RTU-ных протоколов связи, в которых конец пакета отслеживается по паузе тишины, смысл в формировании этой паузы удержанием драйвера в режиме передачи имеется.

 

Во-первых, эта задержка нужна для протокола, а не для собственно передачи по RS-485. А во-вторых, если эта задержка задаётся протоколом, то зачем её дополнительно настраивать? :)

 

К тому же я написал - настраиваемая задержка. Параметр, имеющий величину - 0, означает отсутствие этой задержки ;)

 

По закону тов. Мерфи, если есть настройка, то обязательно найдётся пользователь, который настроит неправильно:)

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


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

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

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

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

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

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

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

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

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