Перейти к содержанию
    

Подсчитать четность битов в байте для AVR

2 часа назад, vvppvv сказал:

Тогда уж, для универсальности и кросс-платформенности, придётся какие-нибудь ifdef'ы дописать, сколько бит в байте (7 или 8), и куда совать бит четности, на позицию 7-го бита, или в отдельный байт...

Вы же просили "конфетку" для 7-ми бит, Вам её и дали. 🙂
Но, пожалуй, Вы правы - пред и постобработку данных можно удалить,
для "чистоты" идеи:

char cSetParity (char cin, char cout)
  {
  cout = cin;
  cout += cin;
  cout ^= cin;
  cout &= 0xAA;
  cout += 0x66;
  cout &= 0x88;
  cout += 0x78;
  return cout;
  }

Это "конфетка" для полных 8-ми бит.

Остальное - сами... 🙂

Изменено пользователем quark

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

22 hours ago, quark said:

Это "конфетка" для полных 8-ми бит.

Что-то специфическая конфетка получилась. ))) Не под изначальную задачу. Я, конечно, не большой специалист в теории языка Си, но зачем  выходной результат вычислений функции (байт четности) передавать ей вначале, как аргумент? Туда что писать, ноль?

Изначально задача была взять байт 0...0х7F и установить в нём старший бит таким образом, чтобы количество единиц в байте было чётным. Предыдущая "конфетка" - самое то. А вобще, была когда-то такая микросхема, 74LS280, которая это сама делала. Вот её и пришлось программно эмулировать. :))

P.S. нашёл даже её функциональную диаграму:

 

74ls280.PNG

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 час назад, vvppvv сказал:

Я, конечно, не большой специалист в теории языка Си

Аналогично. Поэтому написал: остальное - сами... )))

1 час назад, vvppvv сказал:

нашёл даже её функциональную диаграму

Если вас интересует функциональная диаграмма "железного" аналога предложенной программы,

то она будет выглядеть примерно так:

fs.png.b120c0cae31f0834706b3077521c81b3.png

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 08.12.2022 в 09:16, vvppvv сказал:

Возникла необходимость подсчитать паритет битов в байте, четность. Как в последовательном порту.

Подниму тему.
Тут случайно обнаружилась очень похожая задачка, связанная с перекодировкой битов в байте. Нужно сменить порядок следования битов в байте на обратный.
Конечно, перекодировка по таблице - вне конкуренции по скорости. Но таблица занимает много места. Прямое, "лобовое" программное решение, без использования таблиц, выглядит примерно так:

    LSR    R16
    ROL    R17
    LSR    R16
    ROL    R17
    LSR    R16
    ROL    R17
    LSR    R16
    ROL    R17
    LSR    R16
    ROL    R17
    LSR    R16
    ROL    R17
    LSR    R16
    ROL    R17
    LSR    R16
    ROL    R17
    MOV    R16,R17

Соответствующий "шайтан-алгоритм" выглядит немного короче:

    MOV    R17,R16
    ASR    R17
    ROR    R16
    ROL    R17
    ROL    R17
    ANDI   R16,0xAA
    ANDI   R17,0x55
    OR     R16,R17
    MOV    R17,R16
    ANDI   R16,0x99
    ANDI   R17,0x66
    SWAP   R17
    OR     R16,R17

Это вам для коллекции. Может когда пригодится...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 6/30/2023 at 10:51 PM, quark said:

Это вам для коллекции. Может когда пригодится...

А по сути, на 8-битнике, наверное получатся те же 17 тактов, не? 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

19 минут назад, girts сказал:

А по сути, на 8-битнике, наверное получатся те же 17 тактов, не? 

Там все команды однотактные.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

18 hours ago, quark said:

Там все команды однотактные.

Ну....
типа ANDI   R16,0xAA - оно же по сути 2 машинных слова, крутись как хочешь. 
Аа, ну да, тут AVR...

А так - очень даже интересно и своеобразно!
 

Изменено пользователем girts

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

On 7/3/2023 at 6:54 PM, girts said:

типа ANDI   R16,0xAA - оно же по сути 2 машинных слова, крутись как хочешь. 

Да, в случае с AVR тут два байта но одно машинное слово. Содержащее и саму операцию, и источник, и получатель - всё в одном, и за 1 такт. ))

On 6/30/2023 at 11:51 PM, quark said:

Это вам для коллекции. Может когда пригодится...

Спасибо! ))

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...