Easyelectronics.ru

Электроника для всех
Текущее время: 07 июл 2020, 21:44

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



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: Алгоритм анализа входа байта в диапазон значений
СообщениеДобавлено: 08 дек 2018, 08:48 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2014, 13:25
Сообщения: 953
Откуда: Earth
Доброго времени суток. Приболел, голова плохо варит. Подскажите пожалуйста, как алгоритмически (пример можно псевдокодом) реализовать следующее:
Есть входящий (по UART) байт. Байт может содержать:
1. Все установленные биты (0xFF)
2. Все сброшенные биты (0x00)
3. 1 любой выставленный бит (например 0b00100000)
4. 1 любой сброшенный бит (например 0b11111011)
5. Теоретически может произойти сбой передачи, и получу еще какое-то значение.
Требуется первых 2 состояния вывести на светодиоды в порт (просто все погасить, либо зажечь), а для 3,4 соответственно зажечь 1 светик, либо погасить 1 светик (остальные при этом не трогать !), 5 - инорить.
Как реализовать 3,4,5 варианты ?
Если без 5, то я вижу так: за контрольное значение принять 0b10000000. Если равно, либо меньше - зажигаем бит, не трогая остальные, если больше - гасим, не трогая остальные.
Но как отловить еще 5 вариант ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритм анализа входа байта в диапазон значений
СообщениеДобавлено: 08 дек 2018, 10:22 
Супермодератор
Аватара пользователя

Зарегистрирован: 26 янв 2010, 22:19
Сообщения: 6733
Откуда: Из тех... Из бывших...
Зачем анализировать пункты 1-4? При выводе в порт принятого байта единицы или нули в соответствующих разрядах определят состояние светодиодов. По поводу п.5: надо смотреть флаги ошибок и принимать решение о валидности пришедшего байта, по сути эта проверка делается в процедуре обработки прерывания.
Или я не так понял задачу?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритм анализа входа байта в диапазон значений
СообщениеДобавлено: 08 дек 2018, 10:34 
Старожил

Зарегистрирован: 25 сен 2017, 10:57
Сообщения: 210
Откуда: Украина
Пятый вариант можно отловить сравнивая байт со всеми вариантами с одной единицей или нулем, таких вариантов может быть 16, но это наверное не самый лаконичный алгоритм.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритм анализа входа байта в диапазон значений
СообщениеДобавлено: 08 дек 2018, 11:02 
Старожил
Аватара пользователя

Зарегистрирован: 14 апр 2014, 11:06
Сообщения: 1630
Откуда: Курск
Может case?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритм анализа входа байта в диапазон значений
СообщениеДобавлено: 08 дек 2018, 11:17 
Старожил

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 4198
Откуда: Чобля - долбаный кетайец
Считаем сумму битов в байте. Сумма битов = 0? значение байта = 0. Сумма битов = 8? значение байта = 255. Сумма битов = 7? один произвольный бит сброшен. Сумма = 1? Один произвольный бит установлен. Сумма = 2? Два произвольных бита установлено. Ну и т.д.

Вообще, для определения ошибок есть контроль четности. Это один из стандартных режимов UART. Передается девятый бит, являющийся контрольным (так же есть вариант 7+1). Значение этого бита перед передачей вычисляется на стороне передатчика по функции XOR. На стороне приемника тоже вычисляется и затем сравнивается с принятым контрольным битом четности. Так определяется одна ошибка приема любого бита.
Другой вариант определения ошибок - контрольная сумма байтов (CRC). Почти то же самое, только считается по сумме байтов в пакете и передается дополнительно один или два байта CRC. Подходит для пакетов известной длинны.
Если длина пакета неизвестна или передача идет потоком без разделения на пакеты, тогда - контроль четности внутри байта. А еще есть код Хемминга - он позволяет корректировать одну ошибку и обнаруживать две ошибки.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритм анализа входа байта в диапазон значений
СообщениеДобавлено: 08 дек 2018, 12:40 
Старожил

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2732
Откуда: Санкт-Петербург
Дешёвая проверка на единственный установленный бит: x&(x-1) - для степеней двойки и 0 даёт 0, иначе не 0 (для точности - это метод сбросить самый младший единичный бит)
Единственный сброшенный - то же для ~x. Ну или можно использовать x|(x+1) - установка младшего нулевого бита, но тогда придётся проверять на 255.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритм анализа входа байта в диапазон значений
СообщениеДобавлено: 08 дек 2018, 12:55 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 6865
Самый простой и быстрый вариант проверки - таблица. В байте не так уж и много значений, знаете ли ... ))
Создаете таблицу на 256 значений и расписываете в ней желаемый результат анализа.
Например, возвращаете номер (см. пост 1) пункта.
tbl: 2, 3, 3, 0 .... 1 (для чисел 0,1,2,3...FF)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритм анализа входа байта в диапазон значений
СообщениеДобавлено: 08 дек 2018, 13:10 
Старожил
Аватара пользователя

Зарегистрирован: 11 апр 2014, 13:25
Сообщения: 953
Откуда: Earth
STT писал(а):
Зачем анализировать пункты 1-4? ...

Потому что простой вывод в порт подходит только для первых 2 вариантов. Для 3 и 4 нужно 1 бит устанавливать/сбрасывать а остальные НЕ трогать. То есть, мне надо различать, когда делать AND, а когда ОR (когда варинат 1/2, когда 3, и когда 4).
STT писал(а):
... По поводу п.5: ...

Тут я не совсем правильно выразился. Дело не в ошибке прима как таковой, а в том, что теоретически, отправитель может передать нам не такой байт, как в вариантах 1-4. Это просто перестраховка, на случай "сбоя" на стороне отправителя.

AlexTA, Cthulhu: по сути предлагете одно и то же ? Впринцыпе подходит...

BusMaster: про подсчет битов интересно, кажется въехал, надо будет попробовать (по "ошибке" отписал выше).

aamonster: чесно, не понял)) но как полегчает, попробую понять, что вы имели ввиду.

u37: очень хотелось решить эту задачу "красивым алгоритмом" (люблю такие вещи). Ну и не понятно, зачем мне отличать например 01010101 от 00001111, для меня они оба одинаково "ошибочны".

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Алгоритм анализа входа байта в диапазон значений
СообщениеДобавлено: 08 дек 2018, 13:19 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 6865
"Красивое" решение - делайте цикл на 8, сдвигайте число и считайте количество выдвинутых едениц. всё.
Абсолютно не красивое решение.


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

Зарегистрирован: 19 мар 2013, 19:37
Сообщения: 2732
Откуда: Санкт-Петербург
Gnusmas, всё просто: когда вычитаете из числа 1:
- если оно кончалось на единицу - эта единица сбрасывается, и всё
- есло оно кончалось на ноль - вместо него ставим единицу, и перенос в следующий разряд - вычитать 1 уже из него. Ну и далее повторяется, пока не наткнёмся на единицу.

На итог для A = xxxx1000
A+1 = xxxx0111 (хвост нулей превратился в единицы, а самая правая единица - в ноль)

Ну а с & всё уже просто: xxxx1000&xxxx0111 = xxxx0000, т.е. просто сбросили самую правую единицу.

Это быстрый метод для частного случая, в вашем случае применил бы его, а для универсального решения - таблицу, наверное (во всяком случае, максимум таблиц, минимум кода - это быстрее)


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


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


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей


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

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

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