Софтверный uart на 8 каналов.

Oct 31, 2005 45 Replies

Hello, All!



Кто-то помнится говорил, что подобное на микроконтроллерах делал? Жду советов, критику, комментарии. Значит 8 линий uart. Инициализатором связи выступаю я, так что могу засинхронизировать передачу. Связь на частоте 9600. Пакет 23 байта. С приемом сложно. Hо думаю может поступить так: Задействовать таймер с помощью которого вызывать прерывания с восьмикратной частотой - 76.8Кгц (или надо 16-кратную?). В прерываниях записывать только состояния входов в массив. Под массив выделить



256 байт. После записи половины, т.е. 128 байт, обрабатывать полученную половину. Если использовать кварц на 14,7456, то на обработку останется 20 000 тактов, надеюсь что с обработкой успею. Как сделать более эффективно?


With best regards, Igor. Time: 19:02 Date: 31 Окт 05


Mon Oct 31 2005 18:21, Igor Ulanov wrote to All:

IU> Значит 8 линий uart. Инициализатором связи выступаю я, так что могу IU> засинхронизировать передачу. Связь на частоте 9600. Пакет 23 байта. С IU> приемом сложно. Hо думаю может поступить так: Задействовать таймер с IU> помощью которого вызывать прерывания с восьмикратной частотой - 76.8Кгц IU> (или надо 16-кратную?)

Достаточно 3-кратной и вообще какая разница, один софтовый UART или восемь. IU> Как сделать более эффективно?

Взять и сделать.

VLV

"Зачем стадам дары свободы? Их надо резать или стричь" (Пушкин)

Hello, Vladimir!

(31 Окт 05 19:31), Vladimir Vassilevsky писАл Igor Ulanov: VV> Достаточно 3-кратной и вообще какая разница, один софтовый UART или VV> восемь. Прием сигнала асинхронный. Мне же надо привязываться к старт-биту каждого канала. Или нет?

With best regards, Igor. Time: 20:28 Date: 31 Окт 05

Mon Oct 31 2005 19:28, Igor Ulanov wrote to Vladimir Vassilevsky:

VV>> Достаточно 3-кратной и вообще какая разница, один софтовый UART или VV>> восемь.

IU> Прием сигнала асинхронный. Мне же надо привязываться к старт-биту IU> каждого канала. Или нет?

Какая разница: UART uart или UART *uart = new UART[8].

VLV

"Зачем стадам дары свободы? Их надо резать или стричь" (Пушкин)

Hello, Vladimir!

(31 Окт 05 20:52), Vladimir Vassilevsky писАл Igor Ulanov:

Я про время которое понадобится для обработки каждого канала. Hо вообще-то ладно. Завтра на работе попробую и хоть что-то станет понятно.

With best regards, Igor. Time: 21:46 Date: 31 Окт 05

Mon Oct 31 2005 20:46, Igor Ulanov wrote to Vladimir Vassilevsky:

IU> Я про время которое понадобится для обработки каждого канала. Hо IU> вообще-то ладно. Завтра на работе попробую и хоть что-то станет понятно.

Прерывания на 9600 x 3 = 28800 легко отработает любой МК. Дальше просто N одинаковых машин состояний для каждого канала.

VLV

"Зачем стадам дары свободы? Их надо резать или стричь" (Пушкин)

IU>> Я про время которое понадобится для обработки каждого канала. Hо IU>> вообще-то ладно. Завтра на работе попробую и хоть что-то станет понятно. VV> Прерывания на 9600 x 3 = 28800 легко отработает любой МК. Дальше просто N VV> одинаковых машин состояний для каждого канала.

Интересно, можно ли всю работу УАПП описать логическими операциями над байтами и в таком виде закодировать в МК. Можно конечо. Интересно, насколько это получится еффективно, может очень даже?

Vladimir, ты ещё здесь сидишь?

Понедельник Октябрь 31 2005 22:47, Vladimir Vassilevsky wrote to Igor Ulanov:

IU>> Я про время которое понадобится для обработки каждого канала. Hо IU>> вообще-то ладно. Завтра на работе попробую и хоть что-то станет IU>> понятно. VV> Прерывания на 9600 x 3 = 28800 легко отработает любой МК.

Лучше не 3 раза на бит проверять, а на 6. Чтобы ближе к середине информационного бита состояние считывать.

VV> Дальше просто N одинаковых машин состояний для каждого канала.

Причём в прерываниях может только вырабатываться флажок изменения состояния каждого из каналов, а "окончательная" обработка производиться вне обработчика, так уменьшатся требования к рабочей частоте контроллера...

Георгий

Wed Nov 02 2005 02:21, George Shepelev wrote to Vladimir Vassilevsky:

VV>> Прерывания на 9600 x 3 = 28800 легко отработает любой МК. GS> Лучше не 3 раза на бит проверять, а на 6. Чтобы ближе к середине GS> информационного бита состояние считывать. Да-да. А еще лучше не 6, а сразу уж на 256. Больше не надо, так как в u8 число не поместится и упадет эффективность. GS> Причём в прерываниях может только вырабатываться флажок изменения GS> состояния каждого из каналов,

Академик, а слабо вам написать UART на 9600 при частоте прерываний 32kHz? Мне как-то пришлось. Работало замечательно...

VLV

"За лучшего из хоббитов - Гарри Поттера!"

Hello Igor.

Mon Oct 31 2005 19:21, Igor Ulanov wrote to All:

IU> Кто-то помнится говорил, что подобное на микроконтроллерах делал? ... IU> использовать кварц на 14,7456, то на обработку останется 20 000 IU> тактов,

МК-то какой у тебя?

IU> надеюсь что с обработкой успею. Как сделать более эффективно?

Более эффективно - с помощью compare/capture.

Dimmy.

Wed Nov 02 2005 03:58, Vladimir Vassilevsky wrote to George Shepelev:

VV> написать UART на 9600 при частоте прерываний 32kHz? VV> Мне как-то пришлось. Работало замечательно...

А можно поподробнее про его характеристики:

- возможность настройки на разные битрейты;

- количество выборок на бит;

- используемые аппаратные ресурсы (таймеры, устройства захвата/сравнения, DMA, etc.);

- требования к точности тактовых генераторов;

- проверка стартового и стопового бита на корректность;

- контроль паритета;

- работало ли во время приема что-либо "в фоне".

С уважением, Денис

Vladimir, ты ещё здесь сидишь?

Среда Hоябрь 02 2005 04:58, Vladimir Vassilevsky wrote to George Shepelev:

VV>>> Прерывания на 9600 x 3 = 28800 легко отработает любой МК. GS>> Лучше не 3 раза на бит проверять, а на 6. Чтобы ближе к середине GS>> информационного бита состояние считывать. VV> Да-да. А еще лучше не 6, а сразу уж на 256.

Hе, это уже перебор ;)

GS>> Причём в прерываниях может только вырабатываться флажок изменения GS>> состояния каждого из каналов, VV> Академик, а слабо вам написать UART на 9600 при частоте прерываний VV> 32kHz? Мне как-то пришлось. Работало замечательно...

Вижу, ты знаешь толк в извращениях! ;)))

Работать-то может, но резко повысятся требования к точности тактовой частоты, ибо анализ сигнала станет неоптимальным - появится "дрожание" момента выборки...

Георгий

Wed Nov 02 2005 09:46, Denis Y. Borisov wrote to Vladimir Vassilevsky:

VV>> написать UART на 9600 при частоте прерываний 32kHz? VV>> Мне как-то пришлось. Работало замечательно...

DYB> А можно поподробнее про его характеристики: DYB> - возможность настройки на разные битрейты;

Требовалось только 4800 и 9600 В принципе можно сделать абсолютно любую скорость, меньшую чем ~10kbit/s.

DYB> - количество выборок на бит;

Частота прерываний/битрейт.

DYB> - используемые аппаратные ресурсы (таймеры, устройства DYB> захвата/сравнения, DMA, etc.);

Все софтверно по прерываниям.

DYB> - требования к точности тактовых генераторов;

Обычные требования. Чтобы за 8 бит не гуляли более чем на ~10% от длительности бита.

DYB> - проверка стартового и стопового бита на корректность;

Разумеется.

DYB> - контроль паритета;

Hе делал за ненадобностью. Cделать - никаких проблем.

DYB> - работало ли во время приема что-либо "в фоне".

Вся машина состояний UART вертелась внутри прерывания.

VLV

"За лучшего из хоббитов - Гарри Поттера!"

VV>> Достаточно 3-кратной и вообще какая разница, один софтовый UART или VV>> восемь. IU> Прием сигнала асинхронный. Мне же надо привязываться к старт-биту каждого IU> канала. Или нет?

Hадо. Примерно baudrate*8 опросов линии данных в секунду достаточно имhо. У аппараттного УАПП baudrate*16.

Wed Nov 02 2005 20:10, Kirill Frolov wrote to Igor Ulanov:

IU>> Прием сигнала асинхронный. Мне же надо привязываться к старт-биту IU>> каждого канала. Или нет?

KF> Hадо. Примерно baudrate*8 опросов линии данных в секунду достаточно KF> имhо.

Чушь.

Сигнал циклостатический. Его состояние полностью описывается двумя выборками на бит.

KF> У аппараттного УАПП baudrate*16.

От бедности и неумения. VLV

"За лучшего из хоббитов - Гарри Поттера!"

Hello George.

Wed Nov 02 2005 14:12, George Shepelev wrote to Vladimir Vassilevsky:

GS> Работать-то может, но резко повысятся требования к точности тактовой GS> частоты, ибо анализ сигнала станет неоптимальным - появится "дрожание" GS> момента выборки...

Особенно если каналы дуплексные...

Dimmy.

Thu Nov 03 2005 00:42, Vladimir Vassilevsky wrote to Kirill Frolov:

VV> Его состояние полностью описывается двумя выборками на бит.

В худшем случае можно прозевать половину старт-бита. Тогда середину стоп-бита нужно ждать точно через то же время, через какое ее послал передатчик, потому что дольше ждать нельзя - это уже другой фрейм, т. е. у приемника и передатчика должны быть идеально равные тактовые частоты. Повысить допустимый разброс до 0.5 бита можно, если запускать приемник по спаду на его входе. Тогда получим допустимый разброс 0.5 / 10 = 5%. Но и в этом случае нет никакой помехозащищенности - если одна из двух выборок будет во время прохождения помехи, то с вероятностью 50% будет считано не то значение, которое было послано.

С уважением, Денис

Thu Nov 03 2005 10:31, Denis Y. Borisov wrote to Vladimir Vassilevsky:

VV>> Его состояние полностью описывается двумя выборками на бит. DYB> В худшем случае можно прозевать половину старт-бита. Две выборки - предельный случай. Если эти выборки аналоговые, а не бинарные - этого достаточно для приема сигнала без потерь. Если сигнал бинарный, то практически достаточно 3-4 выборок, чтобы потери в SNR не превышали ~3dB.

DYB> Hо и в этом случае нет никакой помехозащищенности - если одна из двух DYB> выборок будет во время прохождения помехи, то с вероятностью 50% будет DYB> считано не то значение, которое было послано.

Применять UART там, где есть помехи - бессмысленно и бесполезно.

VLV

"За лучшего из хоббитов - Гарри Поттера!"

Vladimir, ты ещё здесь сидишь?

Среда Hоябрь 02 2005 14:12, George Shepelev wrote to Vladimir Vassilevsky:

VV>>>> Прерывания на 9600 x 3 = 28800 легко отработает любой МК. GS>>> Лучше не 3 раза на бит проверять, а на 6. Чтобы ближе к GS>>> середине информационного бита состояние считывать. VV>> Да-да. А еще лучше не 6, а сразу уж на 256. GS> Hе, это уже перебор ;)

Кстати, поразмыслив соглашаюсь, что оптимальное положение выборки во времени получается при нечётной константе. Так что брать 5 или 7.

Георгий

Vladimir, ты ещё здесь сидишь?

Четверг Hоябрь 03 2005 01:42, Vladimir Vassilevsky wrote to Kirill Frolov:

IU>>> Прием сигнала асинхронный. Мне же надо привязываться к IU>>> старт-биту каждого канала. Или нет? KF>> Hадо. Примерно baudrate*8 опросов линии данных в секунду KF>> достаточно имhо. VV> Чушь. VV> Сигнал циклостатический. Его состояние полностью описывается двумя VV> выборками на бит.

Да, но только в идеальных условиях, когда частота выдерживается абсолютно точно и фронты сигнала от наводок не "плавают".

KF>> У аппараттного УАПП baudrate*16. VV> От бедности и неумения.

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

Георгий

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required