Ваш пример - не совсем то, что нужно (+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Палыч 04 февраля 2005 г. 16:23
В ответ на: Ответ: да это вообще не важно - важно знать: все уже передано или нет: отправлено -Tумблер- 04 февраля 2005 г. 15:32

Для правильной работы RS-485 необходимо переключать приемо-передатчик с вывода на ввод ПОСЛЕ того, как USART mega128 выдаст последний бит из сдвигового регистра. Это происходит ПОСЛЕ того, как USART переложит данные из UDR в сдвиговый регистр, а прерывание по вектору USART0_UDRE_vect произойдет именно в момент перекладки (ну, ладно, сразу после этого).
Как определить, что данные из сдвигового регистра USART`ом выданы в линию?
Вроде-бы для этого в USART`е есть флаг TXC... Но, проблема в том, что этот флаг устанавливается UART`ом после передачи последнего бита из сдвигового регистра, если в UDR НЕ УСПЕЛИ (по каким-либо причинам, например, обрабатывали прерывание от др. устройства) положить очередной байт. При этом, если в UDR положить очередной байт, то он будет переложен в сдвиговый регист и начнется его выдача, но TXC - останется установленым, поскольку сбрасывается TXC при прерывании на USART0_TXC_vect (или занесением в него 1). Возможное решение - сбросить TXC перед занесение байта в UDR... Но, существует вероятность (пусть и небольшая) того, что USART закончит передачу байта из сдвигового регистра в момент между программым сбросом TXC и занесением байта в UDR. Тогда флаг TXC окажется в 1 ДО окончания передачи байта...
С этой проблемой в mega128 я сам столкнулся и корректно её не смог решить...
Есть ли у кого идеи?

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru