При приеме манчестера чаще всего нужно решить две задачи:
1) засинхронизироваться с передатчиком (и поддерживать синхронизм при приеме посылки)
2) производить прием при наличии статистических помех.
Первая задача в общем виде решается так: ищется или первый фронт/срез и затем делается попытка засинхронизироваться на определенной скорости передачи либо (я предпочитаю второй вариант) в начале каждой посылки передается специальная последовательность (маркер) по которой можно однозначно узнать начало посылки и засинхронизироваться. Код для маркера можно выбирать любой, лучше конечно что-нибудь помехоустойчивое. Неплохим выбором бывает использование последовательноcти из N подряд идущих 0 и 1, что дает меандр с частотой вдвое меньшей частоты передачи. Легко синхронизироваться или даже делать автоопределение скорости передачи.
При приеме длинных пакетов просто необходимо производить подстройку синхронизации в детекторе манчестера. Для этого набирается статистика за некоторое время приема - это может быть измерение отклонения (опережение или запаздывание) фронта сигнала в середине каждого передаваемого бита информации. По знаку и величине отклонения корректируют задающий таймер в приемнике.
Прием сигнала при наличии помех - собственно говоря эта задача решается за счет режекции помех по длительности. Т.е. грубо говоря если длительность состояния декодируемого сигнала (лог.0 или лог.1) меньше 1/4 длительности передачи бита, это считается помехой и отбрасывается (вместо этого уровня сигнала предполагается наличие противоположного). Довольно действенный метод.
И наконец - практическое решение, как выполнять декодирование манчестера с помощью таблицы:
Частота выборок принимаемого сигнала берется по крайней мере в 4 (лучше в 8 или более раз) выше, чем частота передачи. На каждый принимаемый бит будет приходиться 4 (или
выборок. Уровень сигнала считывается со входа и вдвигается в приемный буфер. Когда мы получили все 4(
выборок, то получим во входном буфере некое 4-х (8-ми) битное число, которое будет являться индексом в таблице декодирования. Таблицу декодирования вы должны составить сами, так как вы хотите, чтобы реагировал приемник на помехи и дрожание фронта в середине бита. Из таблицы извлекается значение - какой это был принят бит 0 или 1 (или вы можете заложить значение ошибка - когда из-за помех невозможно однозначно догадаться о значении бита, например когда все выборки равны лог.0 или лог.1). Также удобно использовать этот же индекс для выборки из (другой) таблицы значения рассинхронизации. Собирая статистику на основе определенного числа битов о рассинхронизации, вы четко получите информацию о величине и знаке временной рассинхронизации между передатчиком и приемником и сможете периодически корректировать частоту выборок. Принимаемые декодированные биты вы будет складывать в байты как обычно. Только настоятельно рекомендую использовать CRC для контроля правильности принятого пакета. А то всякое может быть.