Easyelectronics.ru

Электроника для всех
Текущее время: 05 июн 2020, 14:35

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 13 ] 
Автор Сообщение
 Заголовок сообщения: Манчестер
СообщениеДобавлено: 09 мар 2020, 18:43 
Старожил
Аватара пользователя

Зарегистрирован: 20 май 2013, 22:29
Сообщения: 366
Надо принимать данные, закодированные манчестерским кодом. Скорости не большие. Вижу два варианта решения:
1) Прерывание на вход GPIO порта. В прерывании подстраиваю таймер, в прерываниях таймера читаю данные. Плюс решения - легко определять конец передачи (по последовательностям 11 и 00)
2) данные захватывать таймером. Ничего подстраивать не надо, достаточно правильно обрабатывать периоды, но невозможно (или очень трудно) определять конец передачи.

Мне не нравятся оба решения. Может у кого есть идеи как это сделать более правильно?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Манчестер
СообщениеДобавлено: 09 мар 2020, 19:26 
Старожил

Зарегистрирован: 20 окт 2015, 18:14
Сообщения: 373
1) Зачем прерывания таймера? В прерывании GPIO (по двум фронтам само собой) смотрим счетчик таймера, определяем широкий или узкий импульс был, обнуляем счетчик для следующего прерывания GPIO. Будет совсем небольшой обработчик с конечным автоматом.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Манчестер
СообщениеДобавлено: 09 мар 2020, 19:35 
Старожил

Зарегистрирован: 13 июл 2016, 11:05
Сообщения: 457
всё зависит от скорости. Я работал с линией, где минимальный импульс 800 мксек, а макс. 1600 мксек.
У меня всё исключительно программно. Каждые 50 мксек прерывание и опрашиваю состояние ножки. Программные счетчики на измерение длительности "0" или "1".
МК - STM32F030, на частоте 48 МГц.
Периодически по UART к нему обращается главный МК. Который получает данные.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Манчестер
СообщениеДобавлено: 09 мар 2020, 19:41 
Старожил
Аватара пользователя

Зарегистрирован: 20 май 2013, 22:29
Сообщения: 366
sva_omsk писал(а):
1) Зачем прерывания таймера?

Чтобы определять конец посылки по принятию двух 11 или 00 подряд

sva_omsk писал(а):
В прерывании GPIO (по двум фронтам само собой) смотрим счетчик таймера, определяем широкий или узкий импульс был, обнуляем счетчик для следующего прерывания GPIO. Будет совсем небольшой обработчик с конечным автоматом.

Так это и есть мой пункт 2, только без прерываний по GPIO. Таймер сам посчитает и период и длину импульсов.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Манчестер
СообщениеДобавлено: 09 мар 2020, 19:50 
Старожил

Зарегистрирован: 20 окт 2015, 18:14
Сообщения: 373
Тогда я не понимаю, что за проблема определить конец посылки, раз таймер сам выдает ширину импульса. Эти же самые последовательности 0 и 1. Просто хранить предыдущее значение.


Последний раз редактировалось sva_omsk 09 мар 2020, 19:59, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Манчестер
СообщениеДобавлено: 09 мар 2020, 19:58 
Старожил
Аватара пользователя

Зарегистрирован: 20 май 2013, 22:29
Сообщения: 366
sva_omsk писал(а):
Тогда я не понимаю, что за проблема определить конец посылки, раз таймер сам выдает ширину импульса. Эти же самые последовательности 0 и 1.

Конец данных в манчестере - это отсутствие смены с 1 на 0 или с 0 на 1 в период приёма следующего бита. Захват таймером не позволяет это обнаружить.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Манчестер
СообщениеДобавлено: 09 мар 2020, 20:03 
Старожил

Зарегистрирован: 20 окт 2015, 18:14
Сообщения: 373
sva_omsk писал(а):
В прерывании GPIO (по двум фронтам само собой) смотрим счетчик таймера, определяем широкий или узкий импульс был, обнуляем счетчик для следующего прерывания GPIO. Будет совсем небольшой обработчик с конечным автоматом.

Прерывание на переполнение таймера даст конец посылки.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Манчестер
СообщениеДобавлено: 10 мар 2020, 10:11 
Старожил

Зарегистрирован: 13 июл 2016, 11:05
Сообщения: 457
sva_omsk писал(а):
Прерывание на переполнение таймера даст конец посылки.


У меня работает именно так с программным счетчиком.
Когда он достигает заведомого порога.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Манчестер
СообщениеДобавлено: 10 мар 2020, 11:54 
Старожил

Зарегистрирован: 27 апр 2013, 13:53
Сообщения: 1316
Как понимаю, эта статья близка реализации манчестера на STM32
Программный контроллер интерфейса на STM32


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Манчестер
СообщениеДобавлено: 14 мар 2020, 23:08 
Старожил
Аватара пользователя

Зарегистрирован: 20 май 2013, 22:29
Сообщения: 366
KPG писал(а):
Как понимаю, эта статья близка реализации манчестера на STM32
Программный контроллер интерфейса на STM32

Посмотрел внимательно статью. Это полнейшая жесть. Чувак гоняет данные gpio -> dma -> ram при чтении данных, при этом таймер там используется только для тактирования передачи dma. Кругом магические константы. Совершенно не используется особенность Манчестера - возможность по фронтам и спадам подстраивать приемник. А для передачи данных теряется целый gpio порт!
В общем, эта статья о том, как не надо делать Манчестер на stm32 )


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Манчестер
СообщениеДобавлено: 15 мар 2020, 23:49 
Старожил

Зарегистрирован: 09 сен 2010, 20:43
Сообщения: 375
Откуда: Донецк
В документе u2270b application note есть описание и алгоритм декодера манчестера


Вложения:
manchester decoding .png
manchester decoding .png [ 17.38 Кб | Просмотров: 372 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Манчестер
СообщениеДобавлено: 16 мар 2020, 00:12 
Старожил
Аватара пользователя

Зарегистрирован: 20 май 2013, 22:29
Сообщения: 366
Спасибо, кэп. Я бы сам не догадался )


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Манчестер
СообщениеДобавлено: 16 мар 2020, 00:36 
Старожил
Аватара пользователя

Зарегистрирован: 20 май 2013, 22:29
Сообщения: 366
В итоге сделал так: Задействован один таймер. Первые два канала таймера настроены в режиме захвата PWM (автоматический сброс счётчика таймера по фронту, значение длины импульса и периода считываю из CCR2 и CCR1). Третий канал настроен на output compare (CCR3 настроен на период приёма нескольких бит) и нужен только для того, чтобы определить что произошёл таймаут и приём закончен.
Плюс написал обработку манчестера без привязки к STM32 - конечный автомат, который принимает события фронтов и спадов на линии, а так же период с предыдущего события. Гибко настраивается, умеет обрабатывать преамбулы, заголовки, стартовые и стоповые биты. Его можно дёргать хоть из прерывания таймера, хоть из прерываний DMA (сейчас работаю без DMA, скорости хватает).

PS: Теперь почему не сделал как советовал sva_omsk:
sva_omsk писал(а):
Прерывание на переполнение таймера даст конец посылки.

Оказалось, что Update-прерывание вызывается на каждый фронт сигнала с линии (похоже из-за того, что таймер настроен в режиме слэйва). Поэтому пришлось задействовать 3-й канал таймера и прерывание на output compare.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 13 ] 


Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB