Код, который я не мог найти, но сделал сам

Тема в разделе "Arduino & Shields", создана пользователем CryNET, 12 ноя 2014.

  1. CryNET

    CryNET Гик

    Всем привет!

    Собственно что за код?
    Впервые я столкнулся с необходимостью пообщаться Ардуинкой с неким устройством, которое передает только по битам (импульсы HIGH (1) и LOW (0)), т.е нету готового протокола общения, все пришлось делать ручками:
    копание даташитов, впервые увидел термины как тайм-слот, зона ввода/зона вывода и др.

    Так вот, к примеру, устройство посылает 8 бит которые я должен поймать и понять что за команду оно мне прислало (на пример оно прислало мне 10000011, что в 16ой системе (HEX) - 0x83).
    Но сам прикол в том, что мне это нужно получить в одну byte переменную для следующих действий, а не в массив...

    Код:
    Код (Text):
    byte x=B0; //В которую будем сохранять команду
    byte mas[8] = {
      B1,B0,B0,B0,B0,B0,B1,B1}; // это эмуляция 8 бит, которое нам передает на цифровой пин "некое устройство"

    void setup(){
      Serial.begin(9600); //Чтобы видели данные через СОМ порт :)
    }
    void loop(){
      for(int i=0; i<8; i++){
        x = x << 1; //Сдвигаем влево на 1 разряд всю переменную, последний разряд равен 0
        x += mas[i]; //Прибавляем полученный бит с освободившимся разрядом по "правилу сложения битов"
      }
      Serial.println();
      Serial.print(x, BIN); Serial.print(" = "); // выводим на экран что получили в 2ом виде
      Serial.println(x, HEX); //Выводим на экран что получили в 16ом виде (для удобства)
      x=B0; //Обнуляем переменную
      delay(1000); //Ждем 1 сек и начинаем всё сначала.
    }
     
    Если есть вариант ещё проще и правильнее - поправьте меня, буду рад.
    Спасибо за внимание!)
     
  2. Unixon

    Unixon Оракул Модератор

    Код (Text):

    byte receiveByte()
    {
     byte data = 0;
     while(!digitalRead(PIN_STROBE)); // начало цикла приема: ждем "0" на тактовой линии
     for(byte i=8; i>0; i--)
     {
      while(digitalRead(PIN_STROBE)); // ждем "1" на тактовой линии
      byte x = digitalRead(PIN_DATA); // данные пришли, считываем
      data = (data << 1) | x;
      while(!digitalRead(PIN_STROBE)); // ждем "0", чтобы не считать тот же бит повторно
     }
     return data; // собрали байт - вернули
    }
     
     
  3. Unixon

    Unixon Оракул Модератор

    Вообще такое нужно на прерываниях делать...
     
  4. CryNET

    CryNET Гик

    Код (Text):
    data = (data << 1) | x;
    Не могли бы вы разжевать мне эту строчку? Был бы очень признателен.
    P.S Про битовые операции и как их юзать знаю только второй день

    Естественно, я просто сам "механизм" выложил, который написал.
     
  5. Megakoteyka

    Megakoteyka Оракул Модератор

    X | Y - поразрядное логические сложение.
    11111110 | 00000001 == 11111111
    Сперва сдвинули переменную на разряд влево, затем прибавили новый разряд и результат записали в ту же переменную.
     
  6. Unixon

    Unixon Оракул Модератор

    Сложение и "побитовое ИЛИ" - это разные операции.
     
  7. Megakoteyka

    Megakoteyka Оракул Модератор

    Логическое поразрядное же. Дизъюнкция. Одно и то же.
     
  8. Unixon

    Unixon Оракул Модератор

    Сложение
    Логическое ИЛИ
     
  9. Unixon

    Unixon Оракул Модератор

    Верно, что
    но
     
  10. geher

    geher Гуру

    Самое смешное, что термин "логическое сложение" применяется именно к дизъюнкции, и в логике иногда для ее обозначения используется символ +.
    | - логическое сложение (или, дизъюнкция)
    & - логическое умножение (и, коньюнкция)
    ^ - сложение по модулю 2 (исключающее «или»)
     
  11. Unixon

    Unixon Оракул Модератор

    Да, все верно. Не воспринял это словосочетание у Megakoteyka, как термин. Очень книжный стиль. :)
     
  12. Megakoteyka

    Megakoteyka Оракул Модератор

    Привык говорить "логическое сложение" и "сложение по модулю 2". Обычно так все понимают, а вот дизъюнкцию почти никто не знает или не помнит. Или путают с конъюнкцией.
     
  13. Unixon

    Unixon Оракул Модератор

    Точно.

    Мой словарь в этом отношении ближе к C-шной терминологии, т.е. "логическое/побитовое И/ИЛИ/исключающее ИЛИ" если речь про слова, и "логическое ~" если про отдельные биты или логические переменные. К тому же при обсуждении кода нет терминологического разлада. А по страницам книжек еще всякая бяка ползает типа стрелок Пирса и штрихов Шеффера, про которые еще меньше людей помнят.
     
  14. Megakoteyka

    Megakoteyka Оракул Модератор

    Раз уж пошла такая пьянка...
    Может, кто знает способ посчитать количество единичек в байте без использования цикла?
    Давным давно на одном далеком форуме вроде видел что-то подобное, но найти уже не получается.
    Там вроде был метод с наложением хитрых масок и сдвигами, что-то нетривиальное, но вроде как работало быстрее цикла.
     
  15. Unixon

    Unixon Оракул Модератор

    только одного байта? lookup table?
     
  16. Unixon

    Unixon Оракул Модератор

  17. Megakoteyka

    Megakoteyka Оракул Модератор

    8 или 9 разрядов. Таблица хороша, но памяти часто впритык бывает. Как, впрочем, и производительности.
    И другой камень взять нельзя :)
     
  18. Megakoteyka

    Megakoteyka Оракул Модератор

    Нашел. Hamming widht называется. Вечером добавлю код, авось кому пригодится.
    Спасибо за наводку.
    Нашел
     
  19. CryNET

    CryNET Гик

    Всем спасибо, как появится время, так сразу продолжу ! :)