Манчестерский код. Синхронизация, приём и декодирование.

Итак, для начала поговорим о том, что представляет собой "манчестерское" кодирование.

кодирование нуля и единицы манчестерским кодом

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

Что такое состояния "ON" и "OFF"?
Состояния сигнала "ON" и "OFF" - это логические состояния. В общем случае "OFF" - это неактивное состояние, такое же, как при отсутствии какого-либо обмена вообще, а "ON" - это активное состояние, то есть такое, которое как-либо отличается от неактивного. Поэтому, несмотря на то, что на картинке справа состояние сигнала "ON" показано высоким уровнем сигнала, а состояние "OFF" показано низким уровнем, это не нужно понимать буквально (просто с высоким и низким уровнем картинка привычнее и нагляднее). На самом деле состояния "ON" и "OFF" могут быть закодированы совершенно по-разному. Например, ИК-пульты кодируют эти состояния наличием или отсутствием импульсов на определённой частоте, интегральные фотоприёмники (у которых чаще всего неактивным является высокий уровень сигнала на выходе) выдают код, в котором "ON" закодировано низким уровнем, а "OFF" - высоким и т.д.

Длительность нуля и единицы в манчестерском кодировании одинаковая, то есть длина сообщения не зависит от того, сколько в сообщении нулей или единиц, а зависит только от общего количества бит.

возможные интервалы между состояниями ON и OFF в манчестерском коде

Ключевым свойством "манчестерского" кодирования является то, что при передаче каждого бита обязательно присутствуют оба состояния сигнала: "ON" и "OFF" (ещё раз смотрим на рисунок вверху). То есть, во время передачи каждого бита сигнал должен хотя бы раз изменить своё состояние. То есть "манчестерский" код может состоять только из интервалов одинарной, если соседние биты одинаковые, и двойной, если соседние биты отличаются, длительности (это продемонстрировано на рисунке слева).

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

Скажем, если предположить, что частота передатчика не может скачком измениться более чем в 1,5 раза, то отсутствие изменения состояния сигнала в течении 3-х полубит можно смело трактовать как конец сообщения или "потерю" сигнала передатчика (если мы заранее знаем длину сообщения). Или, например, при исследовании какого-то неизвестного кода, если мы видим, что в коде присутствует более двух вариантов интервалов между состояниями "ON" и "OFF", то можно однозначно сделать заключение о том, что исследуемый код не "манчестерский".

Надеюсь, с тем, что такое "манчестерский" код, всё более или менее понятно, поэтому переходим к следующему вопросу - как этот код принимать и декодировать.

Ну, очевидно, что определить начало передачи данных можно по изменению состояния сигнала, воспринимаемого приёмником, с "OFF" на "ON". Однако тут есть один нюанс. Поскольку передача единицы тоже начинается с состояния "OFF", то при первом изменении сигнала из "OFF" в "ON" мы совершенно никак не сможем диагностировать что это - середина передачи единицы или начало передачи нуля. Единственное, что тут можно сделать - это заранее условиться, какой бит должен передаваться первым (то есть ввести специальный старт-бит, значение которого будет всегда строго определено).

Всё, теперь, если мы знаем с какого бита посылка начинается, знаем длительности интервалов состояний "ON" и "OFF", наш приёмник обладает точным, стабильным генератором и мы точно знаем сколько хотим принять бит, то можно составить первый простейший алгоритм восстановления исходной, закодированной "манчестерским" кодом посылки:

- по изменению состояния сигнала с "OFF" на "ON" определяем начало передачи

- отсчитываем четверть длительности бита (чтобы попасть в середину полубита)

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

Вариант второй. Мы знаем с какого бита посылка начинается, знаем длительности интервалов "ON" и "OFF", наш приёмник обладает стабильным генератором, но мы ничего не знаем о длине сообщения. В этом случае можно воспользоваться тем свойством манчестерского кода, что сигнал не может оставаться постоянным в течении 3-х и более полубит. То есть, момент, когда сигнал в течении 3-х полубит остаётся в состоянии "OFF" можно считать концом сообщения. Алгоритм восстановления исходного кода в этом случае может выглядеть так:

- по изменению состояния сигнала с "OFF" на "ON" определяем начало передачи

- отсчитываем четверть длительности бита (чтобы попасть в середину полубита)

- с этого момента (пусть это будет момент номер 1) и далее, через интервалы, равные длительности полубита, анализируем значение сигнала. Как только случится такое, что сигнал в трёх последних замерах будет в состоянии "OFF" - это будет сигнализировать об окончании сообщения. Кроме того, записывая значение сигнала во все моменты с нечетными номерами, кроме последнего, - мы восстановим исходное сообщение.

Вариант третий. Мы знаем с какого бита посылка начинается, но не знаем длительности интервалов, в течении которых сигнал находится в состоянии "ON" и "OFF". Что нам делать в этом случае? Если вы по счастливой случайности знаете значение не только первого бита, но и второго, - значит вам точно известно, через какие интервалы (через целый бит или через половину) произойдут первые 2 переключения и вы с лёгкостью можете необходимые интервалы засечь или, научно выражаясь, - синхронизировать приёмник с передатчиком.
(Ага, вот мы и раскусили зачем у RC-5 целых 2 стартовых бита. Кстати, в сетях ethernet, где тоже используется "манчестерское" кодирование, для начальной синхронизации используется целая 56-битная преамбула).
Далее можно легко воспользоваться первым или вторым из приведённых выше алгоритмов.

Ну и, предположим, ещё один вариант. Мы знаем первые два бита посылки, но наш генератор - полное говно, хотя и работает (или, говоря научными терминами, мы можем гарантировать, что за время, равное длительности полубита, частота генератора не может измениться в 1,5 раза и более). Тут-то как быть?

Да просто надо по каждому новому фронту заново вычислять значения длительности полубита и целого бита. То есть, другими словами, нужно синхронизировать приёмник с передатчиком не один раз в самом начале, а по каждому новому фронту (под фронтом будем понимать переключения между состояниями "ON"/"OFF"), благо при манчестерском кодировании у нас новый фронт присутствует в каждом передаваемом бите.

Короче говоря, рассматривать разные комбинации можно долго, запомните главное преимущество, за которое "манчестерский" код всем так полюбился: при передаче каждого бита существует изменение состояния "ON"/"OFF", которое даёт возможность синхронизировать передатчик и приёмник.

разностное (дифференциальное) манчестерское кодирование

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

Самодельные ИК-пульты и приёмники сигналов дистанционного управления

Программы для приёма и передачи сигналов по протоколу RC-5

radiohlam.ruтеорияинтерфейсы, протоколы

Понравилась статья? Поделись с друзьями!

Обсудить эту статью на форуме

 
Rambler's Top100 © 2009 - Материалы сайта охраняются законом об авторском праве