|
Для правильной работы 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