Микроконтроллеры

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Микроконтроллеры » Всё остальное » Пятничное » Многоканальный энкодер-декодер кода Морзе


Пятничное » Многоканальный энкодер-декодер кода Морзе

Сообщений 1 страница 30 из 74

1

Простая по постановке задачка, но [наверно] не простая по реализации

Многоканальный энкодер-декодер кода Морзе
N каналов-пинов [пусть будет, например, 4], каждый может быть и передатчиком, и приёмником
По uart-у принимаются текстовые сообщения в формате "<номер канала><пробел><текст><перевод строки>"
Текст передаётся морзянкой по соответствующему каналу
И наоборот - при приёме морзянки по любому каналу, по uart-у передаётся соответствующее сообщение
Длительность точки в общем случае произвольная, но пусть будет, например, 100 мс плюс-минус 20%
Длительности остальных элементов - производные от длительности точки [по стандарту]
Для проверки работы к uart-у подключается терминал, а каналы коммутируются друг с другом

На каком мк и как это проще всего сделать, какие идеи?

2

100ms +-20% - это дофига времени, делать можно на чем угодно и практически как угодно. Даже если все делать ногодрыгом в обработчике таймера вызываемого каждую ms, то погрешность будет меньше 1%...

3

Reflector написал(а):

делать можно на чем угодно

Это радует )
Ну может ещё с периферией stm32 какие-то идеи будут
[У меня их нет]

4

vt написал(а):

Ну может ещё с периферией stm32 какие-то идеи будут

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

5

Я азбуку Морзе для придания конкретики приплёл, вообще произвольные последовательности на самом деле, но это слишком общая [и скучная] постановка , хотя дела не меняет

6

Морзянку на одном канале я делал, лежит у меня на гитхабе. Правда, я русские буквы туда не включал: только базовый ASCII.
Генерирует таймером через DMA (пищала обычной активной пищалкой, я и на тытрубу ролик выкладывал).
Вот обратную задачу сложней будет сделать, т.к. нужен анализ. Хотя, не все так сложно: тоже при помощи DMA заполняем помаленьку один из буферов (думаю, двойной буферизации хватит), потом, пока другой буфер заполняется, первый анализируем. Но на несколько каналов сложновато будет: таймеров может не хватить.

7

Eddy_Em написал(а):

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

Если точка 100 +-20 мс [и соотв всё остальное тоже +-20%], то какую бы ты выбрал частоту и размер буфера dma и какой алгоритм анализа?

8

Код Морзе в виде двоичного дерева
http://sh.uploads.ru/k03aV.jpg

9

vt написал(а):

Код Морзе в виде двоичного дерева

Обычную таблицу можно составить, 5 бит на данные и 3 для размера, итого 160 байт. Например, С(-.-.) будет 100'01010.

10

Reflector написал(а):

Обычную таблицу можно составить, 5 бит на данные и 3 для размера

Eddy_Em уже составил подобную в своём примере энкодера на гитхабе, но по два байта на код
А в одном байте, да, будет ещё лучше, можно тогда две таблицы - одна индексированная по ascii [для энкодера], другая по коду Морзе [для декодера]

Отредактировано vt (2018-11-03 19:12:39)

11

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

12

MasterElectric написал(а):

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

Размер массива станет 252, вместо 160. А сдвиг на ARM практически бесплатный, разве что мк будет 8-ми битный, тогда может иметь значение.

13

Да пофиг на размеры данных, давайте лучше оценим размер программы, в строках

14

vt написал(а):

Да пофиг на размеры данных, давайте лучше оценим размер программы, в строках

Лишних 92 байта тоже нужно куда-то записать, считай это дополнительно строк 5 :)

15

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

Тогда повышаю ставки
Не 4, а 10 каналов, не 100 мс, а 1 мс [но по прежнему плюс-минус 20%]
С одной стороны вся мощь любого на выбор нафаршированного мк, с другой - смешная морзянка, кто кого? )

Кстати интересная книжка как раз в тему недавно попалась
A Practical Introduction to Hardware/Software Codesign - http://b-ok.cc/book/939691/a54512 [ссылку уберу потом]

16

Принципиально ничего не поменялось. Сколько нужно тактов чтобы в прерывании EXTI задвинуть очередной бит в переменную? Тактов 50 должно хватить, для 10-ти каналов получится 500, что на неразогранном F0 дает нам 10us. А 20% от 1ms - это 200us... Параллельно с этим другой обработчик вызываемый каждую ms выводит данные сразу всех 10-ти каналов в порт, причем данные для этого можно подготовить до этого прерывания. Или запустить один канал DMA который будет выводить данные каждую ms из кругового буфера и при получении по усарту новых символов добавлять новые данные в этот буфер поверх существующих, со сдвигом на 1ms вперед, чтобы ничего не попортить. Каких-то особых оптимизаций тут не требуется, для сравнения, у меня на спектруме dma запускался почти каждую us, при этом предварительно подготавливались данные из двух таблиц.

17

Reflector написал(а):

Принципиально ничего не поменялось. Сколько нужно тактов чтобы в прерывании EXTI задвинуть очередной бит в переменную? Тактов 50 должно хватить, для 10-ти каналов получится 500, что на неразогранном F0 дает нам 10us. А 20% от 1ms - это 200us... Параллельно с этим другой обработчик вызываемый каждую ms выводит данные сразу всех 10-ти каналов в порт, причем данные для этого можно подготовить до этого прерывания. Или запустить один канал DMA который будет выводить данные каждую ms из кругового буфера и при получении по усарту новых символов добавлять новые данные в этот буфер поверх существующих, со сдвигом на 1ms вперед, чтобы ничего не попортить.

Или просто автоматы по таймеру 10 килогерц, да и другие варианты ещё наверно есть
Reflector, ну то что ты об этом думаешь и скажешь я примерно представлял
Ждём HHIMERA с его STМессианством )
Которое порождает, имхо, только карго-культ, от которого потом сами миссионеры и огребаются )

18

Задача вроде как не сильно и сложная, распишите диаграмму передачи морзе во времени. Я так понимаю принятые сиволы в реальном времени отправляються по ЮАРТУ.

19

Ну так давай вместе и распишем, если хочешь, и не только это, а вообще всё и по всякому
Я не знаю решения и вовсе не устраиваю тут какие-то тесты
Всё что я знаю про код Морзе - из статьи в википедии
И будет хоть какое-то рисование хоть каких-то картинок, а не бесконечое изучение смешивания красок на палитре и пробные мазки, что я и называю карго-культом, и что составляет 99% инфы о программировании мк в инете )

20

vt написал(а):

Ждём HHIMERA с его STМессианством )
Которое порождает, имхо, только карго-культ, от которого потом сами миссионеры и огребаются )

Арамахунцачериявлядибронимаморемиконтурпичензнойтляканикуля...
Пятница++... прям...

21

HHIMERA написал(а):

Арамахунцачериявлядибронимаморемиконтурпичензнойтляканикуля...

Тебе тоже привет )

22

Из МК я бы брал не ниже М3, из-за битбендинга и расширенного набора команд. Нам очень пригодяться для декодера инструкции табличного перехода. Почитал вики расписывать там действительно нечего. На прием сырых данный достаточно 1 байта, т.к. уже после второй паузы можно декодировать символ. Но терминалку на ПК нужно писать свою чтобы разбрасывать данные по каналам ну или RS485 и 10 отдельных терминалок.

23

ОК, пусть будет m3, то есть stm32f103 ?
Определимся с методом ввода
1) Eddy_Em предлагал по dma [а dma по таймеру как я понимаю]
2) Reflector предлагал по прерываниям exti
3) я предлагал в прерываниях по таймеру
Ещё варианты?
С чего начнём?

Отредактировано vt (2018-11-04 17:32:51)

24

Для ввода я предлагаю таймер и опрос порта ну и соответствующая обработка для фиксации фронтов. Без ДМА.
Декодировать ветвлением. Кодировать таблицей. Под рукой только F429 дискаверина с экраном. ЮАРТ можно на прерываниях 115200 должно хватить.

25

vt написал(а):

Ещё варианты?

Хороним со слезой разные там полунедоМК... берём копеечный 030-й или 070-й... с нужным количеством таймеров... пилим хардварный приём на 4 канала и хардвардную/полухардварную передачу на 4 канала с 4-я ЮАРТами...
Адынвечер... Наатыбысь... Пьем пиво... гуляем с девками...

26

Поздно, ставки уже повышены несколько постов назад - 10 каналов и 1 мс
Хотя можно и обратно понизить )

Хардварный приём - это по dma?
4 uart-a не надо, uart только один и вообще дело двадцать пятое

Отредактировано vt (2018-11-04 18:14:02)

27

Тут хардварный прием не настолько и выгоден, лучше обработку размазать во времени. Ну а если кол-во каналов не велико то конечно на прием захват таймером + ДМА, а на выход ШИМ можно также с ДМА. И декодирование наверное все-таки выгоднее написать 6 таблиц.

28

Ну "хардварный" это просто магическое слово такое, типа заклинания, произносишь его и опа - всё готово, "пьём пиво, гуляем с девками" )

Но вообще, может и правда начать с dma варианта, раз и Eddy_Em и [как я понимаю] HHIMERA о нём говорят, да и Reflector упоминал [а я в нейтралитете, по обязанности как ТС]
Заодно и магию на практике проверить

Отредактировано vt (2018-11-04 18:58:39)

29

Какая там магия... Две платки... на одной отрабатываем передачу... получаем источник... на второй отрабатываем приём... Потом прошиваем обе и кроссим... наблюдаем магию морзе-колхоза...

30

vt, чисто развлечь контингент или реальное?
У меня в реале счас такой тихий ужас крутится , что смех сквозь слезы...


Вы здесь » Микроконтроллеры » Всё остальное » Пятничное » Многоканальный энкодер-декодер кода Морзе