Реклама на сайте DatasheetsDatasheets

KAZUS.RUN - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Книги и журналы
FAQ по электронике

  Datasheets
Поиск SMD
Онлайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Схемы и проекты
Принципиальные схемы
  Программы
Каталог сайтов
Калькуляторы
  Форумы по электронике
Помощь проекту


 
Опции темы

Проверка данных

Непрочитано 07.04.2019, 03:53  
GrafGrigorio
Частый гость
 
Регистрация: 13.08.2018
Адрес: Краснодар
Сообщений: 25
Сказал спасибо: 14
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
GrafGrigorio на пути к лучшему
По умолчанию Проверка данных

Всем добра.

Нужна помощь в реализации проверки данных на ардуинке.
Есть массив байт byte data[4];
Нажмите, чтобы открыть спойлер

0 1 0 1 0 1 1 0 байт0
0 1 0 1 1 0 1 0 байт1
0 0 1 1 0 1 1 1
1 0 0 0 0 1 1 0
1 1 0 0 0 1 1 1 байт4

Нужно проверить на четность столбцов нибблов тоесть:
Нажмите, чтобы открыть спойлер

байт0
0 1 0 1
0 1 1 0
байт1
0 1 0 1
1 0 1 0

0 0 1 1
0 1 1 1

1 0 0 0
0 1 1 0
байт4
1 1 0 0
0 1 1 1

сумма столбца 1 = 3 - нечетное, результат 1.
В итоге должно получиться
1 1 0 1
Реклама:
GrafGrigorio вне форума  
Непрочитано 07.04.2019, 05:26  
mike-y-k
Модератор
 
Регистрация: 04.08.2010
Адрес: Москва СЗАО/МО
Сообщений: 12,287
Сказал спасибо: 11,861
Сказали Спасибо 4,159 раз(а) в 3,177 сообщении(ях)
mike-y-k на пути к лучшему
По умолчанию Re: Проверка данных

Таки есть команда сдвига.
Имеем в двух байтовых переменных 0b10000000 и 0b00001000
Для каждого байта выполняем логическое И с каждой из переменных.
В переменной результата при совпадении инвертируем соответствующий бит (битовое сложение без переноса).
По завершении входного потока сдвигаем переменные маски вправо и повторяем.

Для экономии на циклах можно все сравнения по маскам прописать статически.
Немного больше кода, но один цикл.
В один if только одну проверку! Иначе при ИЛИ возможен вариант и одной, и двух единиц, а при истине инверсия будет только одна.
0x80, 0x08, 0x40, 0x04, 0x20, 0x02, 0x10, 0x01 - все варианты масок.

Каждая нечетная и ее инверсия (0x70, 0xB0, 0xD0, 0xE0) для добавления 1 без переноса:
Если по маске 1 - выполнить И инверсной маской, иначе выполнить маской ИЛИ.
Формально XOR, но его нет в битовом варианте на C

Для использования XOR можно использовать массив из 4х байт для операций XOR напрямую с последующим ИЛИ всех значений в конце.

Стоит почитать книги по численным методам - там такое разбирается в самом начале, заодно литературу по устройству разнообразных АЛУ неплохо посмотреть в реализации логических и арифметических операций.
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…

Последний раз редактировалось mike-y-k; 07.04.2019 в 05:30.
mike-y-k вне форума  
Сказали "Спасибо" mike-y-k
GrafGrigorio (07.04.2019)
Непрочитано 07.04.2019, 07:32  
GrafGrigorio
Частый гость
 
Регистрация: 13.08.2018
Адрес: Краснодар
Сообщений: 25
Сказал спасибо: 14
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
GrafGrigorio на пути к лучшему
По умолчанию Re: Проверка данных

Сообщение от mike-y-k Посмотреть сообщение
В один if только одну проверку! Иначе при ИЛИ возможен вариант и одной, и двух единиц, а при истине инверсия будет только одна.
0x80, 0x08, 0x40, 0x04, 0x20, 0x02, 0x10, 0x01 - все варианты масок.
Решил сделать так
Нажмите, чтобы открыть спойлер
Код:
void check_summ(byte tram[5])
{
  const byte mask[] = {0x80, 0x20, 0x40, 0x10, 0x08, 0x02, 0x04, 0x01};
  int op[3];
  for (int o = 0; o ‹ 5; ++o)
  {
    for (int g = 0; g ‹= 3; ++g)
    {
      if (mask[g] == (tram[o] & mask[g]))
        ++op[g];
      if (mask[g + 4] == (tram[o] & mask[g + 4]))
        ++op[g];
    }
  }

  for (int pk = 0; pk ‹ 4; ++pk)
  {
    Serial.print(op[pk] % 2);
    Serial.print(" ");
  }
}

но выдает чет совсем не то

Последний раз редактировалось GrafGrigorio; 07.04.2019 в 07:43.
GrafGrigorio вне форума  
Непрочитано 07.04.2019, 16:13  
mike-y-k
Модератор
 
Регистрация: 04.08.2010
Адрес: Москва СЗАО/МО
Сообщений: 12,287
Сказал спасибо: 11,861
Сказали Спасибо 4,159 раз(а) в 3,177 сообщении(ях)
mike-y-k на пути к лучшему
По умолчанию Re: Проверка данных

А какой результат у операции a && b?
Его вполне достаточно для сравнения по маске.
И результат таки битовыми операциями реализовать.
if (tram[o] && 0x80) summ_bit_acc = summ_bit (summ_bit_acc, 0x80, 0x70);
И так ещё 7 строчек с разными масками.
В summ_bit записать алгоритм однобитного сложения и возврат результата.
Из подпрограммы check_summ вернуть значение summ_bit_acc.
Если уж отлаживаться на консоли, то выводить на неё все шаги, а не только результат.
Делать в временное поле нормальный sprintf со всеми нужными данными и идентификатором точки вывода, а с полученным уже в консоль.
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
mike-y-k вне форума  
Сказали "Спасибо" mike-y-k
GrafGrigorio (08.04.2019)
Непрочитано 07.04.2019, 20:52  
sat_art
Вид на жительство
 
Регистрация: 27.11.2007
Сообщений: 434
Сказал спасибо: 20
Сказали Спасибо 40 раз(а) в 30 сообщении(ях)
sat_art на пути к лучшему
По умолчанию Re: Проверка данных

Сообщение от mike-y-k Посмотреть сообщение
Формально XOR, но его нет в битовом варианте на C
uint8_t a,b,c;
a=????
b=a‹‹4;
c=a^b;
В старшем полубайте c - 1 если не чет. И так 5 раз. Потом все результаты между собой.
sat_art вне форума  
Сказали "Спасибо" sat_art
GrafGrigorio (08.04.2019)
Непрочитано 07.04.2019, 22:49  
DmitriyVDN
Гражданин KAZUS.RUN
 
Регистрация: 10.06.2010
Сообщений: 598
Сказал спасибо: 224
Сказали Спасибо 235 раз(а) в 154 сообщении(ях)
DmitriyVDN на пути к лучшему
По умолчанию Re: Проверка данных

Код:
temp = data[0] ^ data[1] ^ data[2] ^ data[3] ;
temp1=(temp&0x0F);
temp=temp››4;
temp=temp^temp1;

Последний раз редактировалось DmitriyVDN; 08.04.2019 в 00:05.
DmitriyVDN вне форума  
Эти 2 пользователя(ей) сказали Спасибо DmitriyVDN за это сообщение:
GrafGrigorio (08.04.2019), mike-y-k (07.04.2019)
Непрочитано 07.04.2019, 23:39  
mike-y-k
Модератор
 
Регистрация: 04.08.2010
Адрес: Москва СЗАО/МО
Сообщений: 12,287
Сказал спасибо: 11,861
Сказали Спасибо 4,159 раз(а) в 3,177 сообщении(ях)
mike-y-k на пути к лучшему
По умолчанию Re: Проверка данных

DmitriyVDN, наконец-то в теме кто-то написал почти правильно.
Хотя в данном случае ТС было бы полезней разобрать работу с такими данными на масках и в цикле. Специально про XOR "загнул" .

Оптимальнее всего вариант с накоплением в цикле ^= и потом по итогу ^= со сдвигом на 4 и & с 15
Так на любом размере буфера будет работать сразу и можно в собственную библиотеку занести вариант.
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
mike-y-k вне форума  
Сказали "Спасибо" mike-y-k
GrafGrigorio (08.04.2019)
Непрочитано 07.04.2019, 23:48  
DmitriyVDN
Гражданин KAZUS.RUN
 
Регистрация: 10.06.2010
Сообщений: 598
Сказал спасибо: 224
Сказали Спасибо 235 раз(а) в 154 сообщении(ях)
DmitriyVDN на пути к лучшему
По умолчанию Re: Проверка данных

фраза "почти правильно" правильно понравилась.
для четырех байт цикл нах не нать
DmitriyVDN вне форума  
Сказали "Спасибо" DmitriyVDN
GrafGrigorio (08.04.2019)
Непрочитано 07.04.2019, 23:59  
mike-y-k
Модератор
 
Регистрация: 04.08.2010
Адрес: Москва СЗАО/МО
Сообщений: 12,287
Сказал спасибо: 11,861
Сказали Спасибо 4,159 раз(а) в 3,177 сообщении(ях)
mike-y-k на пути к лучшему
По умолчанию Re: Проверка данных

DmitriyVDN, в другой теме от ТС длина данных несколько иная.
И готовая подпрограмма (универсальный вариант и конечно на указателях ) для собственной библиотеки сильно выгоднее.
Но это уже к вопросу о фломастерах
__________________
rtfm forever должно быть основой для каждого. Альтернатива грустна, поскольку метод слепого щенка успешно работает при весьма малом числе вариантов…
mike-y-k вне форума  
Сказали "Спасибо" mike-y-k
GrafGrigorio (08.04.2019)
Непрочитано 08.04.2019, 06:04  
GrafGrigorio
Частый гость
 
Регистрация: 13.08.2018
Адрес: Краснодар
Сообщений: 25
Сказал спасибо: 14
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
GrafGrigorio на пути к лучшему
По умолчанию Re: Проверка данных

Ура победил
Всем спасибо!
Нажмите, чтобы открыть спойлер

Код:
void check_summ(byte tram[]) //tram массив с байтами
{
  const byte mask[] = {0x80, 0x40, 0x20, 0x10,
                       0x08, 0x04, 0x02, 0x01};
  int op[4] = {0, 0, 0, 0};
  for (int o = 0; o ‹ 5; ++o)
  {
    for (int gi = 0; gi ‹ 4; ++gi)
    {
      byte buf1 = tram[o] & mask[gi];
      byte buf2 = tram[o] & mask[gi + 4];

      if (buf1 == mask[gi])      
        ++op[gi];
      if (buf2 == mask[gi + 4])      
        ++op[gi];      
    }
  }
  Serial.println();//вывод результата
  for (int pk = 0; pk ‹ 4; ++pk)
  {
    Serial.print(op[pk] % 2);
    Serial.print(" ");
  }
  Serial.println();
}

А по сути у меня кривой начальный массив был поэтому бадался
GrafGrigorio вне форума  
 
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ускорить компьютер 7Fantomas7 Ремонт оргтехники 111 08.08.2018 05:27
Глюк приёма данных по USART supercelt ARM 85 18.04.2017 04:58
Беспроводная передача данных 1кб/с , 3км. Как и чем? Zemlyanov Микроконтроллеры, АЦП, память и т.д 5 29.01.2015 10:02
Поток данных 44Мбит/сек.Нужно снять лог пару секунд. Как? Zemlyanov Микроконтроллеры, АЦП, память и т.д 4 15.11.2010 23:46
Упаковка данных (сжатие данных) satnettv Proteus, KiCAD и другие ECAD 4 06.09.2007 20:15


Часовой пояс GMT +4, время: 07:29.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.