Помогите с расшифровкой стенографии С - PullRequest
3 голосов
/ 11 августа 2009

Я пытаюсь выяснить некоторые вещи с какой-то прошивкой, которая была написана для нас. Я не так хорошо знаком с Си, и я думаю, что здесь есть некоторая стенография, которую я просто не понимаю. Я не понимаю, как код относится к комментариям, в частности, как вы получаете 70 мс от всего этого. Можете ли вы помочь перевести на английский?

// so the button has to be held for 70 ms to be considered being pressed
// and then has to be released for 70ms to be considered un-pressed
State=(State<<1) | !input(USER_BUTTON) | 0xe000;
if(State==0xe000)
{
    Debounced_Button_Pressed =  TRUE;
    time_button_held++;
}
else if (State==0xffff)
{
    Debounced_Button_Pressed =  FALSE;
}

Это внутри функции прерывания по таймеру и, очевидно, срабатывает каждые 4,4 мс

Спасибо.

Ответы [ 3 ]

13 голосов
/ 11 августа 2009

Давайте сделаем один шаг за раз ...

State=(State<<1) | !input(USER_BUTTON) | 0xe000;

Что это делает:

  • Сдвиньте состояние влево (выбросьте верхний бит, переместите все заново, установите младший бит на 0)
  • Установить младший бит, если вход 0 (выкл.)
  • Принудительно включить 3 старших бита.

Итак, здесь есть 13 битов, которые не включены, и они образуют своего рода историю последних 13 выборок входа USER_BUTTON.

Тогда оператор if просто проверяет, все ли 13 из этих битов выключены (дает 0xe000) или включена (дает 0xffff). Если выключено, кнопка была нажата для 13 сэмплов; если включено, то было не нажато для 13 образцов.

Это тогда дает время отката 4,4 мс * 13 = 57,2 мс - немного от комментария или интервал таймера ближе к 5,385 мс.

2 голосов
/ 11 августа 2009

Он отменяет переключение, сдвигая выборки состояния переключателя в целое число каждые 4,4 мс. Затем он может отличить правильное нажатие от шума, посмотрев, соответствует ли содержимое этого целого числа некоторому шестнадцатеричному значению. Похоже, он также может сказать, был ли он выпущен в соответствии с его определением, сравнивая его с другим значением.

2 голосов
/ 11 августа 2009

Думайте о переменной "State" как о 16 битах. Оператор << сдвигает его влево на единицу каждый раз, а | Оператор используется для установки младшего значащего бита всякий раз, когда input (USER_BUTTON) имеет значение false (! это оператор not). Затем проверки просто проверяют, были ли последние 13 случаев ввода верными или ложными. </p>

...