реклама на сайте
подробности

 
 
> Гарантия того, что по USART все данные ушли
admiral
сообщение Jan 14 2010, 10:27
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 14-12-07
Из: Беларусь, Гомель
Пользователь №: 33 305



Здравствуйте, не могли бы вы разъяснить такую ситуацию?
Перед входом в спящий режим мне нужно убедиться, что все данные ушли в линию. Для этого есть флаг ТХС. В даташите сказано:
Флаг устанавливается в 1 после передачи всех битов посылки из сдвигового регистра передатчика при условии, что в регистр данных UDR не было загружено новое значение. Флаг сбрасывается аппаратно при выполнении подпрограммы обработки прерывания или программно, записью в него лог. 1

Прерываний я не активировал, т.е. получается что после первой передачи, когда данные ушли, и в буфер я данных для отсылки не заносил, этот флаг установится в 1 и больше никогда не сбросится?
Если да, то получается, что после каждой передачи мне нужно программно сбрасывать этот бит?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Rst7
сообщение Jan 14 2010, 11:49
Сообщение #2


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата
Выкручивался из этой ситуации сбросом TХC после загрузки последнего байта в UDR при закрытых прерываниях (между загрузкой и сбросом), при условии малой скорости передачи.


Безусловно, смысл в таком действии есть. Но уж лучше подходить с позиций изначально правильного проектирования софта, дабы на такие грабли не наступать smile.gif


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jan 14 2010, 12:07
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(Rst7 @ Jan 14 2010, 14:49) *
Но уж лучше подходить с позиций изначально правильного проектирования софта, дабы на такие грабли не наступать
Имхо, такие извращения - не результат неправильного проектирования софта, а результат неправильного проектирования аппаратуры USART: бит ТХС следовало бы, наверное, аппаратно сбрасывать при зазрузке байта в UDR.
Кстати, всегда интересовало: как другие разработчики определяют окончание передачи (это актуально при использовании RS-485: включение/отключение приёмника) при использовании прерываний и записи байта по освобождению UDR.
Go to the top of the page
 
+Quote Post
defunct
сообщение Jan 14 2010, 12:33
Сообщение #4


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Палыч @ Jan 14 2010, 14:07) *
Кстати, всегда интересовало: как другие разработчики определяют окончание передачи (это актуально при использовании RS-485: включение/отключение приёмника) при использовании прерываний и записи байта по освобождению UDR.

Не знаю как другие, но я - исключительно по прерыванию TXC от USART. Потому что:
Цитата
Флаг сбрасывается аппаратно при выполнении подпрограммы обработки прерывания

На кой ляд анализировать какой-то флаг, когда есть TXC event, который аппаратно управляет флагом.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jan 14 2010, 13:04
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(defunct @ Jan 14 2010, 15:33) *
Не знаю как другие, но я - исключительно по прерыванию TXC от USART.
Это-то - понятно. Интересует: как у Вас устроена программа, что по этому прерыванию Вы гарантировано знаете, что все байты переданы? Поясню свой вопрос на примере "неправильного" софта (который такой гарантии не даёт, ну, или не во всех случаях):
1. Данные загружаются в UDR по прерыванию USART Data Register Empty
2. Перед загругкой последнего байта сбрасывается флаг TXC; последний байт загружается в UDR; разрешаются прерывания от USART Tx Complete
3. Наступает прерывание по TXC - считаем, что все байты переданы, что не всегда верно (см. выше - сообщение #5).

Цитата(admiral @ Jan 14 2010, 15:57) *
И вот вопрос: контроллеру нужно заснуть, как убедится, что все данные отосланы? Будет ли нормально, если я перед каждой посылкой байта (неважно последний он или нет) буду сбрасывать этот флаг?
Это - не повредит...
Цитата(admiral @ Jan 14 2010, 15:57) *
Не пойму почему они не сделали, что бы, к примеру, при записи данных в UDR флаг TXC сбрасывался аппаратно?
И я тоже этому в своё время был очень удивлён
Go to the top of the page
 
+Quote Post
defunct
сообщение Jan 14 2010, 18:08
Сообщение #6


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Палыч @ Jan 14 2010, 15:04) *
Это-то - понятно. Интересует: как у Вас устроена программа, что по этому прерыванию Вы гарантировано знаете, что все байты переданы?

Ваш изначальный вопрос касался 485-го. Так вот в контексте 485-го все держится на модели "запрос-ответ". Драйверу UARTа попросту не дается следующий __пакет__ до тех пор пока нас об этот не попросят, либо до тех пор пока нам не ответят, либо до тех пор пока не завершится таймаут.

Из этого построение программы такое:
Есть кольцевой буфер и есть put() который пишет в этот буфер. TXC прерывание разрешено постоянно и управляет направлением трансивера 485-го. (По TXC драйвер переключается на прием.) Флаг TXC руками не трогается никогда.

В буфер помещается отправляемый пакет. Перед записью в UDR делается переключение трансивера 485 на передачу.. По UDRE - вычитка и отправка следующего байта из буфера.

В системе нет настолько тяжелых обработчиков прерываний чтобы UDRE прерывание откладывалось настолько долго, что за это время могло возникнуть TXC прерывание, (суммарная латентность всех прерываний не превышает интервала одного символа UART'а). Поэтому все прекрасно работает.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Jan 15 2010, 08:12
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(defunct @ Jan 14 2010, 21:08) *
В системе нет настолько тяжелых обработчиков прерываний чтобы UDRE прерывание откладывалось настолько долго, что за это время могло возникнуть TXC прерывание, (суммарная латентность всех прерываний не превышает интервала одного символа UART'а). Поэтому все прекрасно работает.
Это - хорошо, когда нет тяжелых прерываний... "Тяжесть" - штука относительная. Число "лёгких" прерываний с приоритетом выше чем у USART может быть достаточно для того, чтобы в сумме они составили "одно тяжелое". Да и "тяжелость" отпределяет ещё и скоростью передачи, особенно на очень высоких скоростях (тут уж - как не облегчай прерывания, а при некотором числе высокоприоритетных прерываний они всё равно превращаются в "тяжелое").
Go to the top of the page
 
+Quote Post
defunct
сообщение Jan 15 2010, 11:54
Сообщение #8


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Палыч @ Jan 15 2010, 10:12) *
Да и "тяжелость" определяется ещё и скоростью передачи, особенно на очень высоких скоростях (тут уж - как не облегчай прерывания, а при некотором числе высокоприоритетных прерываний они всё равно превращаются в "тяжелое").

Да все так, только давайте посмотрим что может бегать по 485-му:

В Modbus RTU например, который бегает по 485-му, недопустимы какие-то непрогнозируемые паузы между символами. Пауза больше чем 1.5 символа по стандарту является поводом для отбраковки всего пакета!
Чтобы получить несвоевременный TXC, обработка UDRE должна опоздать аж на 2 символа! Т.е. межсимвольная пауза в системе где может случайно вылезти TXC посреди пакета - может достигать 2х символов. Как следствие этого - работа в Modbus RTU протоколе становится невозможной впринципе в такой системе.

Что делать? Отказаться от RTU? - нельзя, причины сами знаете.

Поэтому обработчики более выскоприоритетных прерываний строятся так, чтобы была гарантия отработки более низкоприоритетных во-время. Если не получается это сделать на одном AVR, тогда ставится еще один чип в помощь, либо берется другой МК, т.к. заранее известно, что система без этого захлебнется.

PS: С очень высокими скоростями по UART'у на AVRках не работаю - 115200 макс.
AVRки у меня всегда не ниже 11.059 тактируются, в основном 14.7456.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jan 21 2010, 11:10
Сообщение #9


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(defunct @ Jan 15 2010, 14:54) *
В Modbus RTU например, который бегает по 485-му, недопустимы какие-то непрогнозируемые паузы между символами. Пауза больше чем 1.5 символа по стандарту является поводом для отбраковки всего пакета!
Вы забыли упомянуть ещё о такой особенности таймаутов Modbus RTU:
Код
#define MB_MIN_15T_TIMEOUT              MB_SEC_TO_TCNT_TIC( 0.000750f ) // 750 us    if bps>19200
#define MB_MIN_35T_TIMEOUT              MB_SEC_TO_TCNT_TIC( 0.001750f ) // 1.750 ms  if bps>19200
Я её использую.
Раз уж пошёл разговор про Modbus RTU, то хочу спросить кто как обеспечивает гарантию паузы 3,5T меду пакетами?
Я всегда отправляю преамбулу из 4 dummy байтов с отключенным передатчиком драйвера RS485.
Какие у Вас соображения на сей счёт? Может это лишняя паранойя, ведь я и так отлавливаю конец посылки по паузе?


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Jan 21 2010, 11:32
Сообщение #10


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(demiurg_spb @ Jan 21 2010, 15:10) *
кто как обеспечивает гарантию паузы 3,5T между пакетами?

Никакая не паранойя - можно позволить УАРТУ за счет собственных средств не только разделять пакеты при передаче, но и обнаруживать паузу при приеме, отсылая также пустые фреймы.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Jan 22 2010, 18:26
Сообщение #11


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(_Pasha @ Jan 21 2010, 14:32) *
Никакая не паранойя - можно позволить УАРТУ за счет собственных средств не только разделять пакеты при передаче, но и обнаруживать паузу при приеме, отсылая также пустые фреймы.
Поясните если не трудно про: "обнаруживать паузу при приеме, отсылая также пустые фреймы". Интересно...


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- admiral   Гарантия того, что по USART все данные ушли   Jan 14 2010, 10:27
- - Rst7   ЦитатаЕсли да, то получается, что после каждой пер...   Jan 14 2010, 10:45
|- - admiral   Цитата(Rst7 @ Jan 14 2010, 14:45) По наук...   Jan 14 2010, 11:29
- - Rst7   ЦитатаСпасибо, а если неизвестно последний это бай...   Jan 14 2010, 11:32
- - Палыч   Цитата(Rst7 @ Jan 14 2010, 13:45) По наук...   Jan 14 2010, 11:38
|- - Qwertty   Цитата(Палыч @ Jan 14 2010, 16:04) Поясню...   Jan 14 2010, 13:42
|- - _Pasha   Цитата(Палыч @ Jan 14 2010, 17:04) 1. Дан...   Jan 14 2010, 13:59
|- - _Pasha   Цитата(defunct @ Jan 14 2010, 22:08) Флаг...   Jan 14 2010, 18:53
||- - defunct   Цитата(_Pasha @ Jan 14 2010, 20:53) 1) от...   Jan 14 2010, 19:37
||- - Qwertty   Цитата(defunct @ Jan 14 2010, 22:37) А за...   Jan 14 2010, 20:58
||- - demiurg_spb   А я вот всё больше и больше склоняюсь к тому что э...   Jan 21 2010, 12:03
|- - defunct   Цитата(demiurg_spb @ Jan 21 2010, 13:10) ...   Jan 21 2010, 17:28
- - V_G   На мой взгляд, как раз широкое использование преры...   Jan 14 2010, 12:43
- - Rst7   ЦитатаНа мой взгляд, как раз широкое использование...   Jan 14 2010, 12:48
- - admiral   Объясню ситуацию: делаю устройство, т.к. питаться ...   Jan 14 2010, 12:57
|- - ILYAUL   Цитата(admiral @ Jan 14 2010, 15:57) И во...   Jan 14 2010, 15:16
|- - defunct   Цитата(admiral @ Jan 14 2010, 14:57) Прер...   Jan 14 2010, 17:30
- - V_G   Посмотрел на симуляторе - у меня флаг TXC сброшен ...   Jan 14 2010, 13:31
|- - Палыч   Цитата(Rst7 @ Jan 14 2010, 15:48) Тут нем...   Jan 14 2010, 13:48
|- - Qwertty   Цитата(Палыч @ Jan 14 2010, 16:48) Значит...   Jan 14 2010, 13:57
- - SysRq   Цитата(admiral @ Jan 14 2010, 15:57) Объя...   Jan 14 2010, 17:44
- - Maik-vs   RS485, скорости до 115200. Делаю так же: формирую ...   Jan 14 2010, 19:03
- - HALFer   admiral, если "правильность" софта не пу...   Jan 14 2010, 20:35
|- - admiral   Цитата(HALFer @ Jan 15 2010, 00:35) admir...   Jan 18 2010, 07:31
|- - Maik-vs   Цитата(admiral @ Jan 18 2010, 10:31) Я та...   Jan 20 2010, 12:35
- - SysRq   Цитата(_Pasha @ Jan 14 2010, 21:53) 1) от...   Jan 15 2010, 06:45
|- - _Pasha   Цитата(SysRq @ Jan 15 2010, 10:45) Если в...   Jan 15 2010, 07:48
- - SysRq   Цитата(_Pasha @ Jan 15 2010, 10:48) Объяс...   Jan 15 2010, 08:02
- - _Pasha   А кто как борется с коллизиями? RXE всегда включен...   Jan 15 2010, 09:23
|- - Палыч   Цитата(_Pasha @ Jan 15 2010, 12:23) А кто...   Jan 15 2010, 09:43
|- - V_G   Цитата(_Pasha @ Jan 15 2010, 19:23) А кто...   Jan 15 2010, 10:59
- - Александр Куличок   ЦитатаЕсли же флаг сбрасывать при загрузке UDR, то...   Jan 20 2010, 22:47
|- - Maik-vs   Цитата(Александр Куличок @ Jan 21 2010, 01...   Jan 31 2010, 14:54
- - Александр Куличок   Что ж тут непонятного. Время на передачу байта фик...   Jan 22 2010, 20:18
|- - _Pasha   Цитата(Александр Куличок @ Jan 23 2010, 00...   Jan 23 2010, 05:02
|- - demiurg_spb   Цитата(_Pasha @ Jan 23 2010, 08:02) Проще...   Jan 29 2010, 18:26
|- - _Pasha   Цитата(demiurg_spb @ Jan 29 2010, 21:26) ...   Jan 30 2010, 03:05
|- - demiurg_spb   Цитата(_Pasha @ Jan 30 2010, 06:05) 1. На...   Jan 30 2010, 10:46
|- - _Pasha   Цитата(demiurg_spb @ Jan 30 2010, 13:46) ...   Jan 31 2010, 05:24
|- - demiurg_spb   Цитата(_Pasha @ Jan 31 2010, 08:24) Поток...   Jan 31 2010, 11:13
- - Александр Куличок   Речь шла о флаге TXC. И о возможности отслеживания...   Jan 31 2010, 21:31
- - sitafern   Пользуюсь простым алгоритмом при реализации Modbus...   Jan 31 2010, 22:26


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd June 2025 - 14:57
Рейтинг@Mail.ru


Страница сгенерированна за 0.01549 секунд с 7
ELECTRONIX ©2004-2016