Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Манчестер для Avr
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Семён
Всем добрый день. Вопрос, следующий кто небудь может поделиться исходником приема Манчестерского кода для AVR
#alex_
Посмотри апнот AVR410 на их сайте - это манчестер применённый к стандарту RC5 (на асме)
Семён
Пишу сам. Тема закрыта.
dvm11111111
Цитата(Семён @ Nov 9 2006, 07:11) *
Пишу сам. Тема закрыта.



Если не жалко, сообщи о результатах, тоже интересует данная тема, вот только с самосинхронизацией загвоздка, как ее реализовать.
=GM=
Цитата(dvm11111111 @ Dec 27 2006, 00:29) *
Цитата(Семён @ Nov 9 2006, 07:11) *

Пишу сам. Тема закрыта.

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

Манчестер - самосинхронизированный код.

Вгрубе алгоритм такой

1) Ждёте перепада 0-1 или 1-0 в середине бита (вот вам и синхронизация),

2) Определяете какой бит пришел и запоминаете его (вдвигаете в регистр),

3) Пропускаете 3/4 периода и переходите к пункту 1.

В начале сообщения должно быть кодовое слово, по которому вы синхронизируете первый бит.
Вот и всё.
dvm11111111
а не слишком ли навороченно получается?
да кстати нашел вот такую весчь, только все ника побороть немогу.
andrvisht
Цитата(dvm11111111 @ Dec 27 2006, 09:05) *
а не слишком ли навороченно получается?
да кстати нашел вот такую весчь, только все ника побороть немогу.


Если искать простые пути, то можно посмотреть сдесь
www.atmel.com/dyn/resources/prod_documents/doc3a78163c4000a.pdf
pokos
Цитата(dvm11111111 @ Dec 27 2006, 08:05) *
а не слишком ли навороченно получается?

Наворочено - это когда ФАПЧа для строба и адаптивный порог для импульса.
dvm11111111
Цитата(&-rey @ Dec 27 2006, 10:39) *
Цитата(dvm11111111 @ Dec 27 2006, 09:05) *

а не слишком ли навороченно получается?
да кстати нашел вот такую весчь, только все ника побороть немогу.


Если искать простые пути, то можно посмотреть сдесь
www.atmel.com/dyn/resources/prod_documents/doc3a78163c4000a.pdf


Про использование INT0 и таймера эт я знаю, только это подходит для приема RC5 с его 12 битами, а вот если принимать таким способом 112 бит, то выяснилось, что расчетные значения задержек несовсем подходят.
Сбой считываемых значений начинается гдето на 8-10 байте, что несовсем подходит.
Сейчас и передатчи и приемник работают от кварцев, а планируется использовать передатчик от внутреннего RC (да еще и несколько передатчиков, соответственно уход длительности импульсов будет и в плюс, и в минус), а так ввообще получится плюс-минус пол километра. Вот меня и интересует алгоритм с синхронизацией.


Цитата(pokos @ Dec 27 2006, 16:08) *
Цитата(dvm11111111 @ Dec 27 2006, 08:05) *

а не слишком ли навороченно получается?

Наворочено - это когда ФАПЧа для строба и адаптивный порог для импульса.


а по подробней, с исходником на С?
andrvisht
Цитата(dvm11111111 @ Dec 28 2006, 03:40) *
Про использование INT0 и таймера эт я знаю, только это подходит для приема RC5 с его 12 битами, а вот если принимать таким способом 112 бит, то выяснилось, что расчетные значения задержек несовсем подходят.
Сбой считываемых значений начинается гдето на 8-10 байте, что несовсем подходит.
Сейчас и передатчи и приемник работают от кварцев, а планируется использовать передатчик от внутреннего RC (да еще и несколько передатчиков, соответственно уход длительности импульсов будет и в плюс, и в минус), а так ввообще получится плюс-минус пол километра. Вот меня и интересует алгоритм с синхронизацией.


насколько я помню там нет упоминания об INT и TMR, просто описан алгоритм приема манчестера, с синхронизацией по длинному импульсу (это когда импульсы идут потоком и нужно выловить пакет определенной длительности)
что же касается сбоев то во первых для таких вещей обычно пользуют Capture (ICR1), а во вторых точка привязки (или точка отсчета) должна быть не в начале приема, а перемещаться после каждого фронта (или периода синхросигнала), тогда точность будет определять погрешность в пределах 1-го периода синхронизации.
Kovrov
А что если сделать вот так...
имеем внешнее прерывание по любому изменению
в прерывании смотрим чего насчитал таймер...
и обнуляем счетчик таймера для след изменеия по входу ExtINT
(получается типа ICP только захват счетчика таймера по любому изменению уровня)
Определяем минимальную длит импульса =Tmin.
;----
далее, с каждым прерыванием по Ext INT, смотрим что натикало (пусть будет T)и сверяемся с таблицой истинности:
1) T=2Tmin & __--- => bit=1
2) T=2Tmin & --__ => bit=0
3) T=Tmin & --__ & lastbit=1 => skip
4) T=Tmin & --__ & lastbit=0 => bit=0
5) T=Tmin & __-- & lastbit=0 => skip
6) T=Tmin & __-- & lastbit=1 => bit=1
;----
переменную T min ОЦЕНИВАТЬ с каждым прерыванием EXTINT.
и пусть она будет +- 10%
сори если гдето накасячил - но смысл такой...
ReM37
А если через UART, но с манчестером? Т.е. из одного байта получаем два.
=GM=
Цитата(ReM37 @ Dec 29 2006, 14:34) *
А если через UART, но с манчестером? Т.е. из одного байта получаем два.

Скорее, из двух - один. А вообще, смысла использовать уарт с манчестером не было и нет.
Nanobyte
В журнале "Радио" за 1983 год было описание первого самодельного компютера "МИКРО-80". В одном из номеров был описан блок чтения/записи на магнитную ленту и очень подробно расписан процесс приёма и передачи байтов манчестерским кодом. Процессор 8080 прекрасно справлялся, ну а уж AVR-ка запросто должна его одной левой...
Kovrov
да! как давно это было..... синхробайт E6 итд.
ReM37
Цитата(Kovrov @ Dec 29 2006, 18:14) *
да! как давно это было..... синхробайт E6 итд.


E6 - 11100110. Почему именно E6?
Радио86РК - помню. МИКРО-80 нет... smile.gif
Nanobyte
Можно просто переписать программу на AVR, правда тогда процессор будет занят только приёмом кода. Но, ИМХО, вполне можно переписать программу с использованием прерываний, таймера и т.д.
Ну, а нужный номер журнала, наверное можно найти на CD или в Сети. smile.gif
muravei
Цитата(ReM37 @ Dec 29 2006, 17:34) *
А если через UART, но с манчестером? Т.е. из одного байта получаем два.

И теряем одно из важных своиств- отсутствие пост. состовляющей
Цитата(Nanobyte @ Dec 29 2006, 19:11) *
очень подробно расписан процесс приёма и передачи байтов манчестерским кодом.

помоему , то называлось "Без возвращения к нулю"
sensor_ua
Отсутствие постоянной составляющей можно получить как в AN43 от RFM - табличка оттуда
Nibble = 0 010101
Nibble = 1 110001
Nibble = 2 110010
Nibble = 3 100011
Nibble = 4 110100
Nibble = 5 100110
Nibble = 6 100110
Nibble = 7 010110
Nibble = 8 011010
Nibble = 9 101001
Nibble = 10 101010
Nibble = 11 001011
Nibble = 12 101100
Nibble = 13 001101
Nibble = 14 001110
Nibble = 15 011100
ReM37
Цитата(sensor_ua @ Dec 30 2006, 11:04) *
Отсутствие постоянной составляющей можно получить как в AN43 от RFM - табличка оттуда


Значит один байт превращаеться в 12 бит. Но будет 3 одинаковых бита подряд. В манчестере не больше 2. Когда можно считать, что постоянной составляющей нет?
Nanobyte
Цитата(muravei @ Dec 30 2006, 10:31) *
... помоему , то называлось "Без возвращения к нулю"

Совершенно верно, но в ТЕ времена называть код манчестерским "не рекомендовалось" cool.gif . Но, тем не менее, вполне работоспособная схема и программа. И сейчас кассеты прекрасно считываются на той-же МИКРО-80.
=GM=
Цитата(Nanobyte @ Dec 30 2006, 13:02) *
Совершенно верно, но в ТЕ времена называть код манчестерским "не рекомендовалось" cool.gif

Ну почему, был такой код, назывался манчестер-2, работал на скорости 1 мбод. Сообщения передавались 20-битными словами. Выпускались даже приемник и передатчик в виде микросхем. Я сам проектировал систему управления на их основе.
Nanobyte
Цитата(=GM= @ Dec 31 2006, 02:50) *
... Ну почему, был такой код, назывался манчестер-2, работал на скорости 1 мбод.

Ну да, код-то был (как в том анекдоте про Вовочку - предмет есть, а слова нет smile.gif ) а вот в документации всё должно быть отечественным !!!
muravei
Цитата(=GM= @ Dec 31 2006, 02:50) *
Выпускались даже приемник и передатчик в виде микросхем.

И сейчас выпускаются:К1889ВА1Ф
=GM=
Цитата(muravei @ Jan 3 2007, 17:23) *
Цитата(=GM= @ Dec 31 2006, 02:50) *

Выпускались даже приемник и передатчик в виде микросхем.

И сейчас выпускаются:К1889ВА1Ф

А раньше была такая серия 588. 588ВГ6 - передатчик, 588ВА3 - усилитель-ограничитель, вроде та же светлана выпускала.
SasaVitebsk
Отсутствие постоянной составляющей выполняется простой операцией, аналогичной формированию CRC. Называется скрэмблирование. Это скремблирование + 11 протоколов типа манчестер находятся в главе два той книги по модемам которую я выкладывал на FTP. В частности есть даже ISDN.
ReM37
Это запись одной команды с пульта управления ТВ. Кто может сказать где какой бит? Вроде должен быть RC5, но по моему что-то здесь не так...

http://rem-blog.net/tmp/rc5.gif
dvm11111111
Цитата(ReM37 @ Jan 11 2007, 23:51) *
Это запись одной команды с пульта управления ТВ. Кто может сказать где какой бит? Вроде должен быть RC5, но по моему что-то здесь не так...

http://rem-blog.net/tmp/rc5.gif


Эт ШИМ в чистом виде.
singlskv
Цитата(ReM37 @ Jan 11 2007, 23:51) *
Это запись одной команды с пульта управления ТВ. Кто может сказать где какой бит? Вроде должен быть RC5, но по моему что-то здесь не так...

http://rem-blog.net/tmp/rc5.gif


да это не похоже на RC5
вот такого П__П__П куска в RC5 ИМХО быть не должно
посмотрите в сторону кодов когда 1= П__ а 0= П_
ну или как-то наоборот
похожие коды у Panasonic, но там вроде П___ и П_

Цитата(dvm11111111 @ Jan 12 2007, 02:14) *
Цитата(ReM37 @ Jan 11 2007, 23:51) *

Это запись одной команды с пульта управления ТВ. Кто может сказать где какой бит? Вроде должен быть RC5, но по моему что-то здесь не так...

http://rem-blog.net/tmp/rc5.gif


Эт ШИМ в чистом виде.

Конечно это ШИМ.
Более того если посмотреть на временную диаграму движения Вашей вилки к Вашему рту
в процессе еды, от состояния сильного голода к состоянию полного обжорства
то Вы с удивлением обнаружите что это ТОЖЕ ШИМ, причем с полными признаками
плавного регулирования smile.gif
ReM37
Цитата(singlskv @ Jan 12 2007, 02:14) *
Цитата
да это не похоже на RC5
вот такого П__П__П куска в RC5 ИМХО быть не должно


По моему такого точно не должно быть. Потому и просил разобрать по битам. Мне не получилось. Это не Манчестер.
Попробовал все пульты, которые у меня есть. RC5 не нашел. smile.gif


Цитата
Эт ШИМ в чистом виде.



smile.gif TV управляеться ШИМ? Это SONY.
Семён
приветствую всех. извиняюсь за долгое отсутствие не было инета. Свой вариант приема постораюсь опубликовать на следующей недели.
singlskv
Цитата(ReM37 @ Jan 11 2007, 23:51) *
Это запись одной команды с пульта управления ТВ. Кто может сказать где какой бит? Вроде должен быть RC5, но по моему что-то здесь не так...

http://rem-blog.net/tmp/rc5.gif


Если все еще интересно то это код 011000010000
ReM37
Цитата(singlskv @ Jan 12 2007, 15:58) *
Если все еще интересно то это код 011000010000


Возможно. Т.е. короткий импульс = 0, длинный = 1. Просто и не хуже Манчестера.
singlskv
Цитата(ReM37 @ Jan 12 2007, 20:22) *
Цитата(singlskv @ Jan 12 2007, 15:58) *


Если все еще интересно то это код 011000010000


Возможно. Т.е. короткий импульс = 0, длинный = 1. Просто и не хуже Манчестера.

ну во первых не возможно, а так оно и есть если у Вас таки SONY
1T отрицательный импульс = 0
2T отрицательный импульс = 1
3T отрицательный импульс = стартовый бит (насчет точно 3T не могу сейчас сказать точно)
T=550мкс кажись
повтор при нажатой кнопке кажеться через 20-30 мс

Ну или опишите поподробнее в чем конкретно Ваша задача и тогда можно
будет рассчитывать на более точный ответ
dvm11111111
Цитата(ReM37 @ Jan 12 2007, 20:22) *
Цитата(singlskv @ Jan 12 2007, 15:58) *


Если все еще интересно то это код 011000010000


Возможно. Т.е. короткий импульс = 0, длинный = 1. Просто и не хуже Манчестера.


Для передачи 2-х байт на прямой видимости по IR, возможно и проще. А для передачи 120 байт по RF не покатит однозначно.

Да кстати в современных пультах для помехозащизенности введен инверсный избыточный код, тоесть посылка в 2 раза больше.
ReM37
Цитата(dvm11111111 @ Jan 13 2007, 02:24) *
Для передачи 2-х байт на прямой видимости по IR, возможно и проще. А для передачи 120 байт по RF не покатит однозначно.


Можно узнать почему?
Я нашел один пульт, который передает точно RC5. Для экпериментов сойдет. Все же цель у меня перадать не меньше 32 байт по радио каналу (433 Mhz).
singlskv
Цитата(ReM37 @ Jan 13 2007, 13:52) *
Цитата(dvm11111111 @ Jan 13 2007, 02:24) *

Для передачи 2-х байт на прямой видимости по IR, возможно и проще. А для передачи 120 байт по RF не покатит однозначно.

Можно узнать почему?
Я нашел один пульт, который передает точно RC5. Для экпериментов сойдет. Все же цель у меня перадать не меньше 32 байт по радио каналу (433 Mhz).
Потому что уровень помех в RF (особенно 433 Mhz) очень высокий.
Передать то 32 байта вы сможете без проблем, а вот с получением этих 32-х байт придется
повозиться. По крайней мере вам понадобится точный контроль длительности стартового бита
c точностью примерно 0,2%. Ну или (что вероятно проще в данном случае, учитывая
длинну передачи ) некий адаптивный контроль длительности каждого бита с
например 10% точностью.

ЗЫ. Подключите модуль приемника и посмотрите на осциле что у него творится на выходе.
Многое сразу же станет понятно.

ЗЫЫ. RC5 вполне подходит для передачи по RF.
=GM=
Цитата(singlskv @ Jan 14 2007, 22:24) *
Цитата(ReM37 @ Jan 13 2007, 13:52) *

Цитата(dvm11111111 @ Jan 13 2007, 02:24) *

Для передачи 2-х байт на прямой видимости по IR, возможно и проще. А для передачи 120 байт по RF не покатит однозначно.

Можно узнать почему?
Я нашел один пульт, который передает точно RC5. Для экпериментов сойдет. Все же цель у меня перадать не меньше 32 байт по радио каналу (433 Mhz).
Потому что уровень помех в RF (особенно 433 Mhz) очень высокий.
Передать то 32 байта вы сможете без проблем, а вот с получением этих 32-х байт придется
повозиться. По крайней мере вам понадобится точный контроль длительности стартового бита
c точностью примерно 0,2%. Ну или (что вероятно проще в данном случае, учитывая
длинну передачи ) некий адаптивный контроль длительности каждого бита с
например 10% точностью.

ЗЫ. Подключите модуль приемника и посмотрите на осциле что у него творится на выходе.
Многое сразу же станет понятно.

ЗЫЫ. RC5 вполне подходит для передачи по RF.

При передаче по радиоканалу возникают такие специфические импульсные помехи, как врезки(иголки) и вырезки, которые возникают вследствие работы ару/ограничителей. Борьба с ними достаточно проста, до определенного предела, разумеется. Ставите на выходе радиоканала счетчик на 16-32-64...с залипанием на макс/мин, сигнал подаете на D-вход, на счетный вход подаете меандр с периодом в 16-32-64 больше периода сигнала, выход используете, как обычно. Схема хорошо подавляет именно импульсные помехи меньшие половины периода сигнала. При желании счетчик можно легко реализовать программно.
muravei
Цитата(singlskv @ Jan 15 2007, 01:24) *
уровень помех в RF (особенно 433 Mhz) очень высокий.

Используйте ЧМ(FM)
GDI
Давно, года 4 назад, покупал для клиентов пульт ДУ ИК+RF433 и приемник к нему. в приемнике 433 превращалось в ИК и подавалось на светодиод. Пульт был многосистемный программируемый. Покупалось все это в www.conrad.spb.ru, на сайте я сейчас этого пульта не нашел, но он был в бумажном каталоге на немецком языке.
ReM37
Цитата(singlskv @ Jan 15 2007, 00:24) *
Передать то 32 байта вы сможете без проблем, а вот с получением этих 32-х байт придется
повозиться. По крайней мере вам понадобится точный контроль длительности стартового бита
c точностью примерно 0,2%. Ну или (что вероятно проще в данном случае, учитывая
длинну передачи ) некий адаптивный контроль длительности каждого бита с
например 10% точностью.

ЗЫ. Подключите модуль приемника и посмотрите на осциле что у него творится на выходе.
Многое сразу же станет понятно.

ЗЫЫ. RC5 вполне подходит для передачи по RF.


Я попробовал так:

Цитата
имеем внешнее прерывание по любому изменению
в прерывании смотрим чего насчитал таймер...
и обнуляем счетчик таймера для след изменеия по входу ExtINT
(получается типа ICP только захват счетчика таймера по любому изменению уровня)
Определяем минимальную длит импульса =Tmin.
;----
далее, с каждым прерыванием по Ext INT, смотрим что натикало (пусть будет T)и сверяемся с таблицой истинности:
1) T=2Tmin & __--- => bit=1
2) T=2Tmin & --__ => bit=0
3) T=Tmin & --__ & lastbit=1 => skip
4) T=Tmin & --__ & lastbit=0 => bit=0
5) T=Tmin & __-- & lastbit=0 => skip
6) T=Tmin & __-- & lastbit=1 => bit=1
;----


В Proteus все работает без проблем. Но реально неработает. Кстати, впервые неработает то, что работает в Proteus. smile.gif
Сделал чтобы можно было видеть длительность импульсов в LCD. Оказалось, что насчитывает бред какой то. В чем причина пока не понял. sad.gif
Что творится на выходе модуля приемника я смотрел. Когда передатчик ничего не передает - ужас. biggrin.gif Но когда передает - все очень четко.
singlskv
Цитата
Я попробовал так:

имеем внешнее прерывание по любому изменению
в прерывании смотрим чего насчитал таймер...

Пока ловим стартовый бит настраиваем внешнее прерывание только на переход 0->1

запускаем таймер с прерыванием на время 3/8 длинны стартового бита
если раньше произошло новое внешнее прерывание то сбрасываем таймер и
продолжаем считать

если оказались в прерывании таймера,
перестраиваем внешнее прерывание на ловлю любого перехода,
перестраиваем прерывание таймера на 1/4 длительности бита (не выключая таймер)

при первом переходе 1->0 после срабатывания прерывания таймера запоминаем значение
длительности стартовой единички T=3/8(базовой длинны бита)+TCNT
сбрасываем TCNT
перестраиваем таймер на 5/8T

далее просто ловим переходы, при каждом переходе считываем значение TCNT
сравниваем с 3/8 необходимой длительности бита
если TCNT < 3/8 , ошибка, начинаем все с начала
если оказались в прерывании таймера то проверяем на соответствие RC5 (четный нечетный бит)
если ошибка начинаем все с начала
если все в порядке перестраиваем таймер на 1/2 бита
если все в порядке, сбрасываем TCNT и продолжаем ловить новые битики

ну и конечно по ходу не забываем записывать что же мы там напринимали

P.S. Может чего и накосячил но вроде примерно так
ЗЫЫ 3/8 и 5/8 желательно брать не точные значения а что-то типа 3/8+20тактов ЦП и
5/8- 20 тактов
ReM37
Все же не могу разобраться почему в Proteus работает а реально нет.

Упрощенный код:

interrupt [TIM1_CAPT] void timer1_capt_isr(void)
{
tmp=ICR1;

if (CAPTURE_FRONT) {
TCCR1B = 0b10000101; //switch to falling edge
CAPTURE_FRONT = 0;
} //if

else {
TCCR1B = 0b11000101; //switch to rising edge
CAPTURE_FRONT = 1;
} // else

При каждом прерываний смотрю чему равно tmp. Proteus показывает, что увеличиваеться на ~1800 (самый короткий импульс в RC5). Посмотрел что насчитывает реально. Оказываеться, что увеличиваеться только на 7. Тактовая частота 8 MHz.
В чем может быть дело?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.