Упаковка битов в байт

Тема в разделе "Микроконтроллеры AVR", создана пользователем Yerabdi, 24 окт 2020.

  1. Yerabdi

    Yerabdi Гик

    Здравствуйте всем, не получается упаковать 16-битов в один байт.
     
  2. Un_ka

    Un_ka Гик

    В одном байте 8 бит.
     
  3. Asper Daffy

    Asper Daffy Иксперд

    У меня тоже "сто граммов" в тридцатимиллилитровую стопку не лезет.

    Обратись к барменам - они специалисты, что-нибудь посоветуют.
     
    vvr, parovoZZ и Airbus нравится это.
  4. Airbus

    Airbus Радиохулиган Модератор

    Упакуй в два байта
     
  5. parovoZZ

    parovoZZ Гуру

    зазипуй
     
    vvr, Andrey12, b707 и ещё 1-му нравится это.
  6. asam

    asam Гик

    Можно попытаться найти компьютер где байт из 16 бит. Меня убеждали что такие есть.
     
  7. Yerabdi

    Yerabdi Гик

    Значение дискретных сигналов хочу передать через байт
     
  8. asam

    asam Гик

    Кому?
     
  9. b707

    b707 Гуру

    за 4 года занятий ардуиной для вас новость что в байте только 8 бит?
     
  10. Yerabdi

    Yerabdi Гик

    16 бульевых занчении нужно передать с двумя байтами, так как не хочу передавать 16 буль по одному
     
  11. Asper Daffy

    Asper Daffy Иксперд

    Так двумя байтами? Или одним?

    У военных есть команда: "К выносу мозга стоять смирно!"
     
  12. Yerabdi

    Yerabdi Гик

    С двумя байтами
     
  13. akl

    akl Гуру

    гугли битовые операции https://learnc.info/c/bitwise_operators.html

    я для управления ногами использую такие макросы например
    Код (C++):

    #define setH(port,bit)  do{port |= (1 << bit);}while(0)
    #define setL(port,bit)  do{port &= ~(1 << bit);}while(0)
    #define readP(reg,bit)    (reg & (1 << bit))
     
    но это точно так же работает с любой переменной
    например
    setH(x,4);
    установит в единицу четвертый бит в переменной x
    setL(x,4); поставит туда ноль, а например
    if(readP(x,4)){;} сработает если в этом 4ом бите лежит единица
     
  14. parovoZZ

    parovoZZ Гуру

    так для этого надо вспомнить
    алгебру. Ну или выучить. Калькулятор SpeedCrunch в помощь.
     
  15. Igor68

    Igor68 Гуру

    Код (C++):
    /* определения битов */
    //для младшего байта
    #define _vipit          0x01
    #define _zakusit     0x02
    #define _zakurit      0x04
    #define _a               0x08
    ....
    #define _x               0x80
    //для старшего байта что-то аналогичное

    /* собственно бинарные переменные */
    bool vipit;
    bool zakusit;
    bool zakurit;
    bool a;
    ...
    bool x;

    /* расстанавливаем биты для передачи */
    //маска - заготовка (рассматриваем один байт) - со вторым аналогично
    uint8_t   mask0 = 0x00;

    if(vipit) mask0 |= _vipit;
    if(zakusit) mask0 |= _zakusit;
    //и так далее со всеми битами
    ....
    /* передаём наши байты */
    ...
    /* потом на принимающей стороне */
    if(mask0 & _vipit) vipit = true;
    else vipit = false;
    //и так далее для всех булевых переменных
    ...
    //и если 16 переменных, то значит в обмене 2 байта
     
    Для удобства можно применить и:
    Код (C++):

    mask0 & _vipit ? vipit = true : vipit = false;
     
    ну или еще как-то... кому как удобно и понятно.
     
    Yerabdi нравится это.
  16. Asper Daffy

    Asper Daffy Иксперд

    Можно гораздо проще поступить. Заранее их объединить в union битовыми полями и, когда нужны биты - работать с битами, а когда нужно передавать - передавать слово. И никаких операций, компилятор сам их вставит.

    ТС - эти биты Вам массивом нужны или достаточно чтобы у каждого своё имя было? От этого зависит реализация. Второй случай намного проще, вообще нифига делать не надо.
     
  17. Igor68

    Igor68 Гуру

    Да... точно! Нифига делать не надо, если оперировать битами байта сразу:) без каких-то объявлений типа bool. А потом их и передавать.
     
  18. b707

    b707 Гуру

    ТС и не делает ничего 4 года :) отсюда и вопросы про упаковку 16 бит в байт :)
     
  19. Yerabdi

    Yerabdi Гик

    Спасибо большое
     
  20. Airbus

    Airbus Радиохулиган Модератор

    [​IMG]
     
    b707 и parovoZZ нравится это.