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

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

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

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

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

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


 
Опции темы
Непрочитано 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
Адрес: Москва СЗАО
Сообщений: 11,260
Сказал спасибо: 11,170
Сказали Спасибо 3,860 раз(а) в 2,930 сообщении(ях)
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
Адрес: Москва СЗАО
Сообщений: 11,260
Сказал спасибо: 11,170
Сказали Спасибо 3,860 раз(а) в 2,930 сообщении(ях)
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
Сказал спасибо: 19
Сказали Спасибо 39 раз(а) в 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.RU
 
Регистрация: 10.06.2010
Сообщений: 598
Сказал спасибо: 222
Сказали Спасибо 234 раз(а) в 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
Адрес: Москва СЗАО
Сообщений: 11,260
Сказал спасибо: 11,170
Сказали Спасибо 3,860 раз(а) в 2,930 сообщении(ях)
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.RU
 
Регистрация: 10.06.2010
Сообщений: 598
Сказал спасибо: 222
Сказали Спасибо 234 раз(а) в 154 сообщении(ях)
DmitriyVDN на пути к лучшему
По умолчанию Re: Проверка данных

фраза "почти правильно" правильно понравилась.
для четырех байт цикл нах не нать
DmitriyVDN вне форума  
Сказали "Спасибо" DmitriyVDN
GrafGrigorio (08.04.2019)
Непрочитано 07.04.2019, 23:59  
mike-y-k
Модератор
 
Регистрация: 04.08.2010
Адрес: Москва СЗАО
Сообщений: 11,260
Сказал спасибо: 11,170
Сказали Спасибо 3,860 раз(а) в 2,930 сообщении(ях)
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, время: 23:12.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot