|
UART ATmega128 портится последний байт посылки, всегда (0xFF) |
|
|
|
Nov 4 2014, 11:48
|
Частый гость
 
Группа: Участник
Сообщений: 121
Регистрация: 15-04-05
Из: Краснодар
Пользователь №: 4 185

|
Здравствуйте! При использовании хорошо отлаженного кода MODBUS, но несколько адаптированного для особых условий, контроллер входит в устойчивое состояние, кода на любой запрос он даёт вменяемый ответ, но последний байт всегда 0xFF. В моём случае с MODBUS - это CRC. Предпоследний байт соответствует правильному CRC. Не зависит от длины ответа - хоть длинный, хоть короткий. Проблема залечивается путём передёргивания питания. Передача производится массивом. Каждый новый байт передаётся из обработчика прерывания. После отправки последнего байта запрещается прерывание UDRIE и разрешается прерывание TXCIE. CODE #pragma vector=USART1_UDRE_vect __interrupt void UDRE1_handler (void) { char data;
if (size_SIO1)// not complete { size_SIO1--; data = *ptr_SIO1++; UDR1 = data; #ifdef SIO1_poly UDRIE_1 = 0; GI_enable CRC(data, &CRC1, SIO1_poly); UDRIE_1 = 1; #endif } else /* Array sent */ { #ifdef SIO1_poly if (!CRC1Lo_sent) { UDR1 = (char)(CRC1); CRC1Lo_sent = 1; return; }
if (!CRC1Hi_sent) { UDR1 = (char)(CRC1>>8); CRC1Hi_sent = 1; LED = 0; return; } #endif UDRIE_1 = 0; TXCIE_1 = 1; } }
#pragma vector=USART1_TXC_vect __interrupt void TXC1_handler (void) { TXCIE_1 = 0; if (handler_SIO1) { GI_enable (*handler_SIO1)(); // Activate handler execution } }
Одно важнейшее отличие от такого же кода, который никогда не выдавал таких проблем - добавлена функция широковещания. То есть слэйв выступает мастером, когда есть на то условия. Дважды передаёт одну и ту же посылку. При этом, приём у него отключен. Не выявил закономерностей, которые приводят контроллер в такое устойчивое состояние. Даже не занаю за что зацепиться. Как мне кажется. Что-то меняется в формате передачи данных. То есть не было передачи 0xFF, а был только один старт бит и всё, далее пассивная линия, которая и воспринемается приёмником, как 0xFF и стоп-бит. Но что могло бы привести к этому - даже нет зацепок. Благодарен за любые мысли, даже самые невероятные. Спасибо!
Сообщение отредактировал IgorKossak - Nov 5 2014, 09:23
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
|
|
|
|
|
 |
Ответов
|
Nov 4 2014, 12:15
|
Гуру
     
Группа: Свой
Сообщений: 5 273
Регистрация: 30-03-10
Пользователь №: 56 295

|
Цитата(Д_М @ Nov 4 2014, 14:48)  То есть не было передачи 0xFF, а был только один старт бит и всё, далее пассивная линия, которая и воспринемается приёмником, как 0xFF и стоп-бит. Но что могло бы привести к этому - даже нет зацепок.Спасибо! 1. А почему вы решили, что передачи 0xFF не было ? На экране осциллографа этого не увидишь. Был старт-бит ? Был. А потом надолго - лог.1. Это может быть как 0xFF, так и банальное зависание или перезагрузка (сброс) МК. 2. Кстати, о зависаниях и перезагрузках. Вы уверены, что у вас, например, ничего не зависает, стек не переполняется, одни данные не наезжают на другие, и проч. Я - не уверен. Возможно, дело вообще не в UART. Попробуйте "отрезать" от вашего кода все второстепенное, оставить только необходимую, тестовую часть и проверить, что будет.
|
|
|
|
|
Nov 4 2014, 16:52
|
Частый гость
 
Группа: Участник
Сообщений: 121
Регистрация: 15-04-05
Из: Краснодар
Пользователь №: 4 185

|
Цитата(kovigor @ Nov 4 2014, 16:15)  1. А почему вы решили, что передачи 0xFF не было ? На экране осциллографа этого не увидишь. Был старт-бит ? Был. А потом надолго - лог.1. Это может быть как 0xFF, так и банальное зависание или перезагрузка (сброс) МК. 2. Кстати, о зависаниях и перезагрузках. Вы уверены, что у вас, например, ничего не зависает, стек не переполняется, одни данные не наезжают на другие, и проч. Я - не уверен. Возможно, дело вообще не в UART. Попробуйте "отрезать" от вашего кода все второстепенное, оставить только необходимую, тестовую часть и проверить, что будет. Спасибо большое за отклик! Передачи 0xFF не было точно. Этот глюк выявляется тогда, когда на ведущем устройстве не обновляется информация от ведомых. Ведущее устройтво отбраковывает ответы с некорректным CRC. Специально проверил CRC. Действительно не 0xFF. Скорее всего, имеет место наезжание данных. Но ума не могу предположить - что можно такое затереть, чтобы портился именно последний байт. Это происходит очень редко. Прибор работает в составе очень хитро мудрой системы. Затыки происходят тогда, когда происходят технологические события. Что-то выкинуть не представляется возможным, так как тогда не будет работать, и как следствие, затыкаться. Передёргивание питания восстанавливает функциональность. Один плюс - дурное состояние устойчивое, значит нет частого перезагруза контроллера, что ещё хуже.
|
|
|
|
Сообщений в этой теме
Д_М UART ATmega128 портится последний байт посылки Nov 4 2014, 11:48  kovigor Цитата(Д_М @ Nov 4 2014, 19:52) Затыки пр... Nov 4 2014, 17:39 Сергей Борщ Такая версия: вы разрешаете TCIE, а флаг TXC у вас... Nov 4 2014, 12:27 Д_М Цитата(Сергей Борщ @ Nov 4 2014, 16:27) Т... Nov 4 2014, 17:45  Сергей Борщ Цитата(Д_М @ Nov 4 2014, 19:45) Тогда воз... Nov 4 2014, 18:33 kolobok0 Цитата(Д_М @ Nov 4 2014, 14:48) ..но посл... Nov 10 2014, 02:11 Lagman Цитата(kolobok0 @ Nov 10 2014, 05:11) Обр... Nov 10 2014, 09:24  kolobok0 Цитата(Lagman @ Nov 10 2014, 12:24) ...а ... Nov 10 2014, 11:57 Д_М Здравствуйте!
Кажется, я нашёл причину. Выше я... Nov 30 2014, 08:06 kovigor Цитата(Д_М @ Nov 30 2014, 12:06) Надеюсь,... Nov 30 2014, 17:23 kolobok0 Цитата(Д_М @ Nov 30 2014, 11:06) ...дейст... Dec 1 2014, 11:10
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|