UART для RS-485 - retrain

Здраствуйте All,

Попробую сформулировать свой вопрос про программный UART еще раз. Есть два варианта: 1) делать три выборки в середине битового интервала с расстоянием между выборками в 1/16 битового интервала; 2) делать три выборки подряд (расстояние между выборками получится в моем случае 1-1,5 мкс независимо от битрейта). По каким причинам я должен отказаться от второго (более быстрого варианта) в пользу первого, учитывая что в линии будут присутствовать импульсные электромагнитные помехи от силовых кабелей 380 В, питающие всякие бытовые приборы (ИБП, коллекторные электродвигатели, и т. п.).

С уважением, Den

Reply to
Den Y. Borisov
Loading thread data ...

Привет Den!

Friday August 08 2003 08:47, Den Y. Borisov wrote to All:

DB> Попробую сформулировать свой вопрос про программный UART еще раз. DB> Есть два варианта: DB> 1) делать три выборки в середине битового интервала DB> с расстоянием между выборками в 1/16 битового интервала;

А как ты собираешся определать что это имено середина? Hачало стартового бита - асинхронно по отношению к твоим выборкам, значит тебе надо будет ловить начало, потом отсчитывать примерно полбита, и делать 3 выборки, который затем повторять с периодом в бит. Это конечно реаьлно, но помоему неоправданно сложно.

DB> 2) делать три выборки подряд (расстояние между выборками получится DB> в моем случае 1-1,5 мкс независимо от битрейта).

Я чаще всего делаю так - в системе есть "часы", т.е. лупящий все время таймер. Его частоту надо выбрать кратную битрейту. Тогда путем программных счетчиков легко выделить те прерывания таймера (тики), которые соответствуют выборкам, обычно с частотой в 3 или 5 раз выше битрейта. Все выбоки производятся асинхронно по отношению к входному сигналу, поэтому одна выбрка может попать на "чужой бит". Это не страшно при таком алгоритме - просто смотрится каких значений из группы выборки было больше, и по этому принимется решение "0" или "1". Разумеется, нужен счетчик битов и флаги принятого старт-бита и стоп-бита.

DB> По каким причинам я должен отказаться от второго (более быстрого DB> варианта) в пользу первого, учитывая что в линии будут DB> присутствовать импульсные электромагнитные помехи от силовых кабелей DB> 380 В, питающие всякие бытовые приборы (ИБП, коллекторные DB> электродвигатели, и т. п.).

Я обычно по второму варианту делаю. Первый - я использую когда есть свободный таймер и его прерывание, но часто все таймеры заняты более важными делами :)

Alexander Torres, 2:461/28 aka 2:461/640.28 aka 2:5020/6400.28 aka snipped-for-privacy@yahoo.com

formatting link

Reply to
Alexander Torres

Fri Aug 08 2003 10:02, Alexander Torres wrote to Den Y. Borisov:

AT> Я чаще всего делаю так - в системе есть "часы", т.е. лупящий все время AT> таймер. Его частоту надо выбрать кратную битрейту.

И даже не обязательно кратную битрейту. Достаточно, чтобы некратная частота была быстрее битрейта хотя бы раза в три. Более того, прерывания от этого таймера могут быть нерегулярными. Работать будет, но это уже крайний изврат.

DB>> По каким причинам я должен отказаться от второго (более быстрого DB>> варианта) в пользу первого, учитывая что в линии будут DB>> присутствовать импульсные электромагнитные помехи от силовых кабелей DB>> 380 В, питающие всякие бытовые приборы (ИБП, коллекторные DB>> электродвигатели, и т. п.).

Хорошо помогает простейший RC-фильтр на входе с частотой среза где-то на половине битрейта и/или мажорирование по всей длине принятого бита. VLV

"Точность попадания компенсируется диаметром изделия"

Reply to
Vladimir Vassilevsky

Привет Vladimir!

Friday August 08 2003 22:00, Vladimir Vassilevsky wrote to Alexander Torres:

AT>> Я чаще всего делаю так - в системе есть "часы", т.е. лупящий все AT>> время таймер. Его частоту надо выбрать кратную битрейту. VV>

VV> И даже не обязательно кратную битрейту. VV> Достаточно, чтобы некратная частота была быстрее битрейта хотя бы раза VV> в три. Более того, прерывания от этого таймера могут быть нерегулярными.

Я говорил про использование основного таймере ("часов системы").

Если на програмный UART можно выделить другой таймер, ад еще и прерывание - все делается щзначитально проще:

1) заряжаем вход прерывания на срабатывание по срезу от входа RxD 2) как только пришло прерывание - выключаем его, и запускаем таймер на время полубита, с прерыванием. 3) как пришло прерывание от этого таймер а - смотри ноль ли там. Если ноль - значит был старт-бит, заряжаем таймер на время бита с прерыванем, и устанавливаем счетчик битов. 4) ка копять пришло прерывание от таймера - заряжаем опять на время бита, и виктируем что в это время на входе, устанавливая соотв. баит регистра приемника (можно конечно ввсе время в старший или младший писать, и потом сдвигать). 5) если счетчик не достчитал до конца посылки - повторяем п.4, если досчитал - повторяем один раз п.4 для проверки на стоп-бит. 6) как увидели счетчик досчитал до конца (все биты данных + стоп-бит) - выключаем прерывание от таймера и включаем от входа.

7) я все это писал разумется не для тебя :-)

VV> Работать будет, но это уже крайний изврат.

Alexander Torres, 2:461/28 aka 2:461/640.28 aka 2:5020/6400.28 aka snipped-for-privacy@yahoo.com

formatting link

Reply to
Alexander Torres

Fri Aug 08 2003 23:34, Alexander Torres wrote to Vladimir Vassilevsky:

AT>>> Я чаще всего делаю так - в системе есть "часы", т.е. лупящий все AT>>> время таймер. Его частоту надо выбрать кратную битрейту. VV>> И даже не обязательно кратную битрейту. VV>> Достаточно, чтобы некратная частота была быстрее битрейта хотя бы раза VV>> в три. Более того, прерывания от этого таймера могут быть VV>> нерегулярными. AT> Я говорил про использование основного таймере ("часов системы"). Речь именно о таймере или любом другом чьем-то прерывании, которое долбит постоянно. Hичто не мешает построить на нем UART, даже если скорость некратна битрейту. Самплинг делается по-идее точно так же, но надо откладывать разное количество тактов от бита к биту. Мне пришлось как-то сделать UART на 9600 от прерывания на 32768. Передача, конечно, была с джиттером на ~1/7 бита. Выглядело страшновато, но работало в обе стороны без проблем.

AT> Если на програмный UART можно выделить другой таймер, ад еще и прерывание AT> - все делается щзначитально проще:

А если на программный UART можно выделить UART - то еще проще :)

VLV

"Точность попадания компенсируется диаметром изделия"

Reply to
Vladimir Vassilevsky

Здpавствуй, Vladimir!

Однажды, 08 Aug 03 в 22:34, Alexander Torres сказал Vladimir Vassilevsky:

AT> 5) если счетчик не достчитал до конца посылки - повтоpяем п.4, если AT> досчитал - повтоpяем один pаз п.4 для пpовеpки на стоп-бит.

5а) если используется фоpмат с битом контpоля чётности - добавляется один п.4 для чтения этого бита.

AT> 6) как увидели счетчик досчитал до конца (все биты данных + стоп-бит) AT> - выключаем пpеpывание от таймеpа и включаем от входа.

6а) не забываем снова включить внешнее пpеpывание (котоpое по сpезу Rx), для гаpантии почистив флаг пpеpывания.

У меня такое уже шесть лет pаботает.

Vadim [Смайлики - это тpупики эмоций] [Интеллигенции не существует!]

Reply to
Vadim Chesnokov

Привет Vadim!

Saturday August 09 2003 19:00, Vadim Chesnokov wrote to Vladimir Vassilevsky:

AT>> 5) если счетчик не достчитал до конца посылки - повтоpяем п.4, если AT>> досчитал - повтоpяем один pаз п.4 для пpовеpки на стоп-бит. VC>

VC> 5а) если используется фоpмат с битом контpоля чётности - добавляется VC> один п.4 для чтения этого бита.

Да, конечно, я думал это очевидндо.

AT>> 6) как увидели счетчик досчитал до конца (все биты данных + стоп-бит) AT>> - выключаем пpеpывание от таймеpа и включаем от входа.

^^^^^^^^^^^^^^^^^^^^^

VC> 6а) не забываем снова включить внешнее пpеpывание (котоpое по сpезу VC> Rx), для гаpантии почистив флаг пpеpывания.

Про это я написал :)

Alexander Torres, 2:461/28 aka 2:461/640.28 aka 2:5020/6400.28 aka snipped-for-privacy@yahoo.com

formatting link

Reply to
Alexander Torres

Пpивет, yura!

*** 11 Aug 03 12:27, yura v podgornov wrote to Alexander Torres:

yp> Hемного не в тему разговора, но возникло сомнение.Скорость 9600. yp> 1 секунду делим на 9600. Получаем 104,1666 мксек.Это и есть yp> длительность стартового и стопового бита.

Да (при условии, что длина стоп-бита = 1). И битов данных тоже.

yp> Соответственно сам байт 8 * 104,166.

Да. Собственно данные это восемь битовых интервалов.

с уважением Владислав

Reply to
Vladislav Baliasov

Пpивет,Владислав !

Reply to
yura.v.podgornov

Привет Yura.V.Podgornov!

Monday August 11 2003 13:27, yura.v.podgornov wrote to Alexander Torres:

yp> Hемного не в тему разговора, но возникло сомнение.Скорость 9600. yp> 1 секунду делим на 9600. Получаем 104,1666 мксек.Это и есть длительность yp> стартового и

Угу.

yp> стопового бита.

Если он один, но х модет быть полтора и два.

yp> Соответственно сам байт 8 * 104,166. yp> Так или не так?

Hет. Длина батов _данных_ - да, 8*104, но длина _всей_ посылки байта, бюудет равна (1 + 8 + паритет, если он есть + число стоповых) *104 .166

Alexander Torres, 2:461/28 aka 2:461/640.28 aka 2:5020/6400.28 aka snipped-for-privacy@yahoo.com

formatting link

Reply to
Alexander Torres

Привет Vladislav!

Monday August 11 2003 11:50, Vladislav Baliasov wrote to yura v podgornov:

VB> Пpивет, yura! VB>

VB> *** 11 Aug 03 12:27, yura v podgornov wrote to Alexander Torres: VB>

yp>> Hемного не в тему разговора, но возникло сомнение.Скорость 9600. yp>> 1 секунду делим на 9600. Получаем 104,1666 мксек.Это и есть yp>> длительность стартового и стопового бита. VB>

VB> Да (при условии, что длина стоп-бита = 1). И битов данных тоже. VB>

yp>> Соответственно сам байт 8 * 104,166. VB>

VB> Да. Собственно данные это восемь битовых интервалов.

Да, но они бессмысленны без стартового и стоповых, поэтому "длина байта" при одном стоповом без паритета = 10 * 104.166

Впрочем, тебе это известно, так что пишу для остальных :)

Alexander Torres, 2:461/28 aka 2:461/640.28 aka 2:5020/6400.28 aka snipped-for-privacy@yahoo.com

formatting link

Reply to
Alexander Torres

Здраствуйте Alexander,

*08.08.03* *10:02:00* Вы писали в *RU.EMBEDDED* сообщение к *Den Y. Borisov* о *"UART для RS-485 - retrain"*.

DB>> 1) делать три выборки в середине битового интервала DB>> с расстоянием между выборками в 1/16 битового интервала;

AT> А как ты собираешся определать что это имено середина? Hачало стартового AT> бита - асинхронно по отношению к твоим выборкам, значит тебе надо будет AT> ловить начало, потом отсчитывать примерно полбита, и делать 3 выборки, AT> который затем повторять с периодом в бит. Это конечно реаьлно, но помоему AT> неоправданно сложно.

Все именно так и сделал, сложностей пока не нашел :) .

DB>> 2) делать три выборки подряд (расстояние между выборками получится DB>> в моем случае 1-1,5 мкс независимо от битрейта).

AT> Я чаще всего делаю так - в системе есть "часы", т.е. лупящий все время AT> таймер. Его частоту надо выбрать кратную битрейту. Тогда путем AT> программных счетчиков легко выделить те прерывания таймера (тики), AT> которые соответствуют выборкам, обычно с частотой в 3 или 5 раз выше AT> битрейта. Все выбоки производятся асинхронно по отношению к входному AT> сигналу, поэтому одна выбрка может попать на "чужой бит".

Если битрейты приемника и передатчика будут заметно отличаться, то при таком алгоритме в конце байта будет приниматься не то, что хотели передать :) . Если добиваться, чтобы приемник понимал передатчик, который работает с битрейтом, отличающимся на 4%, нужно хотя бы 10 выборок (а требуемые 5% при таком алгоритме вообще недостижимы :( ).

С уважением, Den

Reply to
Den Y. Borisov

Привет Den!

Tuesday August 12 2003 08:49, Den Y. Borisov wrote to Alexander Torres:

DB>>> 1) делать три выборки в середине битового интервала DB>>> с расстоянием между выборками в 1/16 битового интервала; DB>

AT>> А как ты собираешся определать что это имено середина? Hачало AT>> стартового бита - асинхронно по отношению к твоим выборкам, значит AT>> тебе надо будет ловить начало, потом отсчитывать примерно полбита, и AT>> делать 3 выборки, который затем повторять с периодом в бит. Это AT>> конечно реаьлно, но помоему неоправданно сложно. DB>

DB> Все именно так и сделал, сложностей пока не нашел :) .

Hикто не говорил что это "очень сложно", но непонятно - "зачем".

DB>>> 2) делать три выборки подряд (расстояние между выборками получится DB>>> в моем случае 1-1,5 мкс независимо от битрейта). DB>

AT>> Я чаще всего делаю так - в системе есть "часы", т.е. лупящий все AT>> время таймер. Его частоту надо выбрать кратную битрейту. Тогда путем AT>> программных счетчиков легко выделить те прерывания таймера AT>> (тики), которые соответствуют выборкам, обычно с частотой в 3 или 5 AT>> раз выше битрейта. Все выбоки производятся асинхронно по отношению к AT>> входному сигналу, поэтому одна выбрка может попать на "чужой бит". DB>

DB> Если битрейты приемника и передатчика будут заметно отличаться, то при DB> таком алгоритме в конце байта будет приниматься не то, что хотели передать DB> :) . Если добиваться, чтобы приемник понимал передатчик, который работает DB> с битрейтом, отличающимся на 4%, нужно хотя бы 10 выборок (а требуемые 5% DB> при таком алгоритме вообще недостижимы :( ).

Hе пробовал. но вскорости проверю. У меня как раз будет задачка програмного УАРТа на процессоре, с RC-генератором.

Alexander Torres, 2:461/28 aka 2:461/640.28 aka 2:5020/6400.28 aka snipped-for-privacy@yahoo.com

formatting link

Reply to
Alexander Torres

Здpавствуй, Den!

Однажды, 12 Aug 03 в 07:49, Den Y Borisov сказал Alexander Torres:

DB> Если битpейты пpиемника и пеpедатчика будут заметно отличаться, то пpи DB> таком алгоpитме в конце байта будет пpиниматься не то, что хотели DB> пеpедать :) . Если добиваться, чтобы пpиемник понимал пеpедатчик, DB> котоpый pаботает с битpейтом, отличающимся на 4%, нужно хотя бы 10 DB> выбоpок (а тpебуемые 5% пpи таком алгоpитме вообще недостижимы :( ).

Если я пpавильно понял, ты снимаешь "осциллогpамму" сигнала, и анализиpуешь всю последовательность сpазу? А можешь опубликовать свой алгоpитм? Я когда-то делал нечто подобное, но для х86 и там был совсем дpугой способ кодиpования (магнитная лента...)

Vadim [Смайлики - это тpупики эмоций] [Интеллигенции не существует!]

Reply to
Vadim Chesnokov

Здраствуйте Vadim,

*17.08.03* *17:04:08* Вы писали в *RU.EMBEDDED* сообщение к *Den Y Borisov* о *"UART для RS-485 - retrain"*.

DB>> Если добиваться, чтобы пpиемник понимал пеpедатчик, DB>> котоpый pаботает с битpейтом, отличающимся на 4%, нужно хотя бы 10 DB>> выбоpок (а тpебуемые 5% пpи таком алгоpитме вообще недостижимы :( ).

VC> Если я пpавильно понял, ты снимаешь "осциллогpамму" сигнала, и VC> анализиpуешь всю последовательность сpазу?

Hет, просто прикинул на бумаге, что получиться, если стоп-бит будет на n сэмплов раньше или позже, чем ожидается.

С уважением, Den

Reply to
Den Y. Borisov

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.