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

 
 
 
Reply to this topicStart new topic
> Останов UART в Atmega, как остановить передачу в любом месте ?
impatt
сообщение Jul 17 2006, 07:42
Сообщение #1


Частый гость
**

Группа: Validating
Сообщений: 169
Регистрация: 10-11-04
Из: Челябинск
Пользователь №: 1 088



Байт начал передаваться, но ещё не передался. Как сбросить процесс передачи так, чтобы можно было быть уверенным, что записанный в UDR байт немедленно после такого сброса начал передаваться ?
Возможные варианты на предполагаемое действие типа "запретить и немедленно разрешить UART":
1. Продолжит передаваться недопереданный байт. Хотя это и было бы странно.
2. Передача прервётся и UART забудет о том, что только что передавал байт (это было бы то, что надо).
Если кто может прокомментировать - плиз.
Заранее благодарю.

Сообщение отредактировал impatt - Jul 17 2006, 07:44
Go to the top of the page
 
+Quote Post
impatt
сообщение Jul 17 2006, 07:58
Сообщение #2


Частый гость
**

Группа: Validating
Сообщений: 169
Регистрация: 10-11-04
Из: Челябинск
Пользователь №: 1 088



Цитата(impatt @ Jul 17 2006, 10:42) *
Заранее благодарю.


Видимо, просто остановом и возобновлением работы ничего не получить, ибо в доке нашёл (всё таки английский не родной, потому читается трудно :), что останов происходит по завершению передачи, если таковая есть в процессе.

Есть ли другие способы ?
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Jul 17 2006, 08:00
Сообщение #3


Профессионал
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Если байт попал в шифтер ничего уже сделать нельзя, автомат запущен, и сдвиг отработает.
Единственное, что можно попробовать, это обнулить UBRR, но это достаточно лихой номер и не факт, что сработает.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение Jul 17 2006, 08:14
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



Цитата(beer_warrior @ Jul 17 2006, 14:00) *
Если байт попал в шифтер ничего уже сделать нельзя, автомат запущен, и сдвиг отработает.
Единственное, что можно попробовать, это обнулить UBRR, но это достаточно лихой номер и не факт, что сработает.


Не помню как в AVR, но в некоторых типах uC можно было бы сменить функцию порта с Tx на GPIO, например.


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 17 2006, 08:19
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Andy Mozzhevilov @ Jul 17 2006, 11:14) *
в некоторых типах uC можно было бы сменить функцию порта с Tx на GPIO, например.

Идея! Причем максимально универсальная. Запомнил :-).


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение Jul 17 2006, 08:21
Сообщение #6


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



Цитата(impatt @ Jul 17 2006, 13:42) *
Байт начал передаваться, но ещё не передался. Как сбросить процесс передачи так, чтобы можно было быть уверенным, что записанный в UDR байт немедленно после такого сброса начал передаваться ?
Возможные варианты на предполагаемое действие типа "запретить и немедленно разрешить UART":
1. Продолжит передаваться недопереданный байт. Хотя это и было бы странно.
2. Передача прервётся и UART забудет о том, что только что передавал байт (это было бы то, что надо).
Если кто может прокомментировать - плиз.
Заранее благодарю.


Еще вариант:
- на лету перестроить скорость uart на максимально возможную
- сделать программно задержку на нужное число тактов
- вернуть настройки uart по скорости
- записать новый байт на передачу.

Только, имхо, такие манипуляции с uart выглядят более, чем странно. Как приемник со своей стороны разберет такую кашу? Может огласите вопрос в более общей постановке, что вы хотите сделать?


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post
impatt
сообщение Jul 17 2006, 08:24
Сообщение #7


Частый гость
**

Группа: Validating
Сообщений: 169
Регистрация: 10-11-04
Из: Челябинск
Пользователь №: 1 088



Цитата(beer_warrior @ Jul 17 2006, 11:00) *
Если байт попал в шифтер ничего уже сделать нельзя, автомат запущен, и сдвиг отработает.
Единственное, что можно попробовать, это обнулить UBRR, но это достаточно лихой номер и не факт, что сработает.


Ясно. Жаль. Задумка была нацелена на экономное решение приёма пакетов по протоколу MODBUS-RTU. Оно работает в симплексном режиме, и признаком ошибки является расстояние между байтами в пакете более 1.5 символа (ну, скажем 2, для круглости) и признаком конца пакета (и уже не ошибки) время простоя приёмника более 3.5 символов (для круглости 4). Думал, было бы, раз режим симплексный, отсчитывать интервалы самим UART-ом, пусть бы передатчик молотил и временные интервалы отмерял, но вот если кто-то будет отправлять байты на приём с паузами, то такой символьный таймер хрен остановишь, как выяснилось, и непонятно, что он там сможет намерять.
То есть, немного подробнее: когда приходит символ на приёмник, нужно запустить таймер. Некий абстрактный таймер с разрешением примерно 1 символ. Сгодился бы передатчик того-же UART, который бы пулял в космос, и генерил бы прерывания, которые я бы асинхронно считал.
Приём байт тоже асинхронный, так что корячится просто использование таймера, которых что-то мало осталось на чипе.
А касательно перенастройки ножки - сам включеный UART её переопределяет и он на ней самй главный.
В общем, опять AVR-ка показала свою негибкость.

Сообщение отредактировал impatt - Jul 17 2006, 08:29
Go to the top of the page
 
+Quote Post
Andy Mozzhevilov
сообщение Jul 17 2006, 08:29
Сообщение #8


Знающий
****

Группа: Свой
Сообщений: 877
Регистрация: 26-01-05
Из: Екатеринбург
Пользователь №: 2 206



Цитата(impatt @ Jul 17 2006, 14:24) *
Цитата(beer_warrior @ Jul 17 2006, 11:00) *

Если байт попал в шифтер ничего уже сделать нельзя, автомат запущен, и сдвиг отработает.
Единственное, что можно попробовать, это обнулить UBRR, но это достаточно лихой номер и не факт, что сработает.


Ясно. Жаль. Задумка была нацелена на экономное решение приёма пакетов по протоколу MODBUS-RTU. Оно работает в симплексном режиме, и признаком ошибки является расстояние между байтами в пакете более 1.5 символа (ну, скажем 2, для круглости) и признаком конца пакета (и уже не ошибки) время простоя приёмника более 3.5 символов (для круглости 4). Думал, было бы, раз режим симплексный, отсчитывать интервалы самим UART-ом, пусть бы передатчик молотил и временные интервалы отмерял, но вот если кто-то будет отправлять байты на приём с паузами, то такой символьный таймер хрен остановишь, как выяснилось, и непонятно, что он там сможет намерять.
В общем, опять AVR-ка показала свою негибкость.


Сделайте таймер интервалов на таймере, это будет проще и прямее, меньше ошибок допустите.
Делать, как хотите Вы имеет смысл, только если таймера заняты под другие задачи.


--------------------
Пасу котов...
Go to the top of the page
 
+Quote Post
impatt
сообщение Jul 17 2006, 08:33
Сообщение #9


Частый гость
**

Группа: Validating
Сообщений: 169
Регистрация: 10-11-04
Из: Челябинск
Пользователь №: 1 088



Цитата(Andy Mozzhevilov @ Jul 17 2006, 11:21) *
Еще вариант:
- на лету перестроить скорость uart на максимально возможную
- сделать программно задержку на нужное число тактов
- вернуть настройки uart по скорости
- записать новый байт на передачу.


Записать новый байт на передачу - это надо обдумать, может, и проканает.
менять скорость УАРТ-а нежелательно, потому, что приёмник должен работать на нужной скорости.

Спасибо всем ответившим.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Jul 17 2006, 08:37
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(Andy Mozzhevilov @ Jul 17 2006, 11:21) *
Еще вариант:
- на лету перестроить скорость uart на максимально возможную

Неа! Это уже не то, ибо просто приведет к вероятной передаче мусора. А перепрограммирование выхода это возможность получить надежное отсутствие стоп бита и как следствие "Framing error"
на приемной строне и возможность отсеять байтик.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
impatt
сообщение Jul 17 2006, 08:41
Сообщение #11


Частый гость
**

Группа: Validating
Сообщений: 169
Регистрация: 10-11-04
Из: Челябинск
Пользователь №: 1 088



Цитата(impatt @ Jul 17 2006, 11:33) *
[Записать новый байт на передачу - это надо обдумать, может, и проканает.


Не проканает, прочитал.
Придётся использовать обычный таймер.
Go to the top of the page
 
+Quote Post
beer_warrior
сообщение Jul 17 2006, 09:17
Сообщение #12


Профессионал
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 8-10-05
Из: Kiev, UA
Пользователь №: 9 380



Цитата
Не помню как в AVR, но в некоторых типах uC можно было бы сменить функцию порта с Tx на GPIO, например.

unfortunally sad.gif
The disabling of the Transmitter (setting the TXEN to zero) will not become effective until ongoing and pending transmissions are completed, i.e., when the Transmit Shift Register and Transmit Buffer register do not contain data to be transmitted. When disabled, the Transmitter will no longer override the TxD pin.
По простому выражаясь, отключит после отработки передачи.


--------------------
Вони шукають те, чого нема,
Щоб довести, що його не існує.
Go to the top of the page
 
+Quote Post
defunct
сообщение Jul 17 2006, 09:45
Сообщение #13


кекс
******

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



Ну и к чему все это?
Все равно на приемной стороне старт-бит уже словлен и приемная сторона будет тикать 10 тактов в надежде принять байт, а не какую-то чепуху. Если вдруг прервать процесс передачи и тупо начать передавать что-то другое, то приемник может неправильно распозанть не только эти 2 байта, но и всю дальнейшую последовательность.

В общем не майтесь фигней. Не отправляйте лишнего, чтобы потом не было необходимости это прерывать.
Go to the top of the page
 
+Quote Post
CDT
сообщение Jul 18 2006, 05:49
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 303
Регистрация: 3-03-05
Пользователь №: 3 044



Цитата(defunct @ Jul 17 2006, 12:45) *
Ну и к чему все это?
Все равно на приемной стороне старт-бит уже словлен и приемная сторона будет тикать 10 тактов в надежде принять байт, а не какую-то чепуху. Если вдруг прервать процесс передачи и тупо начать передавать что-то другое, то приемник может неправильно распозанть не только эти 2 байта, но и всю дальнейшую последовательность.

В общем не майтесь фигней. Не отправляйте лишнего, чтобы потом не было необходимости это прерывать.

Совершенно справедливо.
Иными словами, попробуйте угадать:
- какой следующий бит будет воспринят приемником как стартовый для следующего байта;
- возрастет или упадет скорость передачи (или реакции системы).


--------------------
Опыт - чудесная вещь: легко использовать, можно продать, трудно пропить.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Jul 18 2006, 06:00
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(defunct @ Jul 17 2006, 12:45) *
В общем не майтесь фигней.

a14.gif
универсальное решение


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 12:13
Рейтинг@Mail.ru


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