Перейти к содержанию
    

Софтовая пакетная передача данных. Синхронизация.

Как? за счет чего? Вот приемник слушает эфир, попался ему ноль - он записал в уме - "ноль", попалась единица - он записал "единица". Каким образом преамбула помогает синхронизироваться с битами?

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Интересная это штука. Удвольствие получаю то процесса отладки.

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

В итоге контроллер выводит удивительно стабильное число - 7. Как оказалось, это межбайтные паузы ))))

 

Ситуаций, когда в преамбуле (стартовом бите) оказывается мусор не выловлено. Даже когда приходил ошибочный пакет.

 

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

Значит дело в преамбуле (стартовом бите). Или в переходе стартового бита в первый. БУду копать...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Каким образом преамбула помогает синхронизироваться с битами?

почитайте про корреляцию и сразу все поймете. кстати, выбор меандра (0xAA, 0x55) в качестве преамбулы не допустим, т.к. эта последовательность обладает плохими корреляционными свойствами, есть множество других последовательностей.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

т.к. эта последовательность обладает плохими корреляционными свойствами, есть множество других последовательностей.

 

Какая последовательность обладает наилучшими корелляционными свойствами? И кстати у меня это не преамбула - это начало кадра. Преамбула (стартовый бит) у меня из нулей состоит. Как и советовали TI.

 

Мельком глянул про корелляцию - не слишком ли громоздко?

Изменено пользователем zheka

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Какая последовательность обладает наилучшими корелляционными свойствами?

навскидку Уолша и его производные, Голда и др.

http://ru.wikipedia.org/wiki/%D0%A4%D1%83%...%BB%D1%88%D0%B0

 

еще вспомнил про М-последовательности (наверное с них и надо начинать :))

http://ru.wikipedia.org/wiki/%D0%9C-%D0%BF...%81%D1%82%D1%8C

 

И кстати у меня это не преамбула - это начало кадра. Преамбула (стартовый бит) у меня из нулей состоит. Как и советовали TI.

тогда это можно назвать каким-нибудь маркером начала пакета. просто в моем понимании преамбула это несколько другое - синхрослово, уникальная последовательность. в модемной технике служит по части устранения фазовой неоднозначности и решения проблем определения фазовой (частотной) ошибки в системах ФАПЧ по тактам и несущей, также может быть использован для настройки корректора МСИ, да и наверное еще где-нибудь. :) хотя по терминологии спорить не хочется :)

 

Мельком глянул про корелляцию - не слишком ли громоздко?

куда уж проще - регистр сдвига и сумматоры :)

Изменено пользователем Serg76

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чудны дела твои, господи!

 

Нашел я у себя косяк один. Выбранный мной метод модуляции и демодуляции, как выяснилось, обеспечивает довольно сносную устойчивость к помехам, а я искусственно снизил эту устойчивость раз в 7 !

И это потому что я тупо последовал рекомендации от TI. Я понимаю, что устойчивость связи в протоколе V.21 обчеспечивается чемто другим, но со мной этот совет сыграл злую шутку.

 

А рекомендация от TI состояла в том, чтобы ввести стартовый бит, состоящий из 7 нулевых импульсов (не бит, а именно импульсов). А я возложил на стартовый бит функции преамбулы.

 

В результате получилось следующее - на фоне молчания приемник ловит нулевой импульс и начинает подозревать, что это стартовый бит. ДЛя подтверждения своих подозрений он ждет 7-ми таких же импульсов. А с каждым таким импульсом вероятность того что во всей преамбуле будет ненулевой импульс, возрастает...

 

В итоге сделал так:

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

Приемник: сонно слушает эфир. Как только ловит нулевой импульс, делает вывод, что кто-то пытается его растормошить, и резонно предполагает, что этот импульс мог быть не первым. Зная при этом, что эта серия импульсов всегда заканчивается единицей, просто ждет ее. А приняв начинает читать байт. Синхрослово уже читается на следующем уровне анализа эфира. То есть длинная преамбуле перед пакетом у меня заменена на короткие преамбулы перед каждым байтом.

 

МОжно совершенствовать этот механизм дальше. Сделать после преамбулы не 1 импульс кодирующий единицу, а 8. Но по какому алгоритму их анализировать? МОжно конечно как с битом - наловить 8 штук и прикинуть - если единиц больше, то значит преамбула окончена, а эти единицы означали ее окончание. Но этот прием не сработает, если самая первая единица будет распознана как ноль..

У кого какие идеи?

Изменено пользователем zheka

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Тихо сам с собою ....

 

Сделал я стартовый бит, состоящий из 7 импульсов.

Таким образом, у меня преамбула из 36 нулевых импульсов, демодулятор детектируя ноль активизируется, и ждет окончания преамбулы, которая представляет собой последовательно 7 единиц.

 

Господа, заработало!

Вылезла только одна ошибка на 220 пакетов. Передаются они у меня пока что медленно, так как я играю в "пинг-понг" по одному пакету, а переключение рации из приема в передачу и наоборот медленное из-за того, что она вставляет коды CTSS. Так что у меня один пакет передается за 300 мсек, но раз в 3.5 секунды.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Эврика! Что и требовалось доказать!

Доработал анализ стартового бита - два часа работы, битых пакетов - 0.2-0.4%

Скажу точнее - не битых пакетов, а пакетов со сбоем преамбулы, стартового бита или синхрослова. Если в них ошибка, они просто не принимаются.

А вот в приниятых пакетах ни одной ошибки.

И судя по всему еще есть место для совершенствования протокола.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Проблема конечно решилась. Каждый раз включая и отлаживая устройство я проверяю связь - все хорошо. Правда когда испытания перешли из "пробирки" в реальность процент битых пакетов стал 3-5%.

Но после того, как я все это дело зациклил и стал при плохом байте отправлять повторные пакеты это перестало нервировать - больше 2-х битых пакетов подряд не приходило.

 

Однако все равно меня гложет что-то.

При 3-5% битых пакетов (ВНИМАНИЕ - битый пакет для программы это тот, который не поймал синхрослово) среди принятых нет ни одного с кривыми информационными байтами.

 

Причина проста: каждый бит байта кодируется 5-6 импульсами. Чтобы испортить бит нужно чтобы кривых импульсов пришло больше, чем правильных.

 

А вот преамбула и синхрослово у меня детектируются следующим образом: если в покое ловится импусльс по ширине равный "единице", то программа входит в режим детектирования преамбулы. Преамбула состоит только из единиц, по ее окончанию передается стартовый бит, равный нулю. То есть программа, поймав единицу, ожидает нуля (фиг ведь его знает, на каком этапе она поймала единицу). Как только ловится ноль, програма переходит в режим приема стартового бита. Условие - среди последующих 10 импульсов не менее половины должны по длине соответствовать нулю. Уже после этого идет синхрослово.

 

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

 

 

НУ подскажите как мне доработать этот алгоритм? Как привязаться к стартовому биту?

Я так и не понял для чего нужна преамбула, но у меня она выполняет роль сообщения типа "будь готов, с минуты на минуту появится стартовый бит"

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

 

НУ подскажите как мне доработать этот алгоритм? Как привязаться к стартовому биту?

Я так и не понял для чего нужна преамбула, но у меня она выполняет роль сообщения типа "будь готов, с минуты на минуту появится стартовый бит"

 

 

Причина битых пакетов может быть в любом бите :)

У вас что- преамбула какая-то особенная и вероятность появления ложного нуля для нее меньше чем для всего пакета?

 

Расскажу как я делал 11 лет назад аудиомодем для передачи GPS сообщений. По началу передавал просто текстом NMEA.

 

Сначала измерил АЧХ тракта. Получилась полоса около 6 Кгц. Взял 2 некратных частоты, чтобы помещались в эту полосу, (скорость была 1200, потом сделал 2400.) сделал модулятор с непрерывной фазой , формирующий СИНУС, переключение скорости- в момент перехода через 0.. ( простой регистр сдвига и 8 неодинаковых резисторов, сейчас можно программно на проце ШИМом сделать) Нелинейность синуса оказалась хорошей - менее 5%.

 

Детектор- как у вас, пересечение нуля, измерял таймером длительность и делал на выходе 0 или 1, и этот поток я завел на аппаратный USART проца. далее после приема он этот поток выплевывал на комп.

 

Исследовал шумовые характеристики- все по книжке- сообщение переставало разбираться, когда уровень шумов превышал почти половину уровня сигнала. На слух- было очень плохо слышно голос, а данные шли нормально.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...