Проблема с алгоритмом обратной оси

0

В настоящее время я работаю над электронным проектором, и есть небольшая проблема со значениями джойстика. Значения "правильные", но выглядят странно.

Обычно работает классическая ось с джойстика (например, слева направо).

  • Всего осталось: -128
  • Центр: 0
  • Всего осталось: +128

Но вот что я читал из этого:

  • Всего осталось: -0
  • Слева слева: - 128
  • Центр: "Случайный" (никогда полностью не обнуляется, плавает между -125 и +125)
  • Немного справа: + 128
  • Совершенно верно: +0

На данный момент я использую следующее обходное решение, чтобы получить линейную прогрессию от -128 до +128:

if (value > 0)
    value = -(128 - value);
else
    test = 128 + value;

Проблема заключается в том, что я должен делать это на нескольких входах, по 2 оси на один оборот, по 3 джойстика на устройство, 4 общих устройства, поэтому 24 раза, и мне нужно поддерживать время ответа менее 20 мс для всей операции. И этот долбаный цикл!

Я могу бинарно манипулировать значением. Вот как я на самом деле сосредоточился на этом. Исходный дамп содержит массив из 0 и 1, считываемый с контроллера ввода/вывода

for (i = 0; i<8; i++) {
    value |= raw_dump[pos + i] ? (0x80 >> i):0 ;
}

У вас есть идеи или хороший алгоритм? Я начинаю отступать, и я полностью всасываю двоичную манипуляцию...: '(

  • 0
    Вы имеете в виду, например, 1, представленный как 10000000 вместо 00000001?
Теги:
algorithm
binary

1 ответ

4
Лучший ответ

Похоже, какой бы механизм не выполнял выбор, джойстик фактически возвращает беззнаковый байт в диапазоне 0.. 255, с 0 в крайнем левом и 255 в крайнем правом углу.

Вы можете преобразовать это значение в диапазон -128 до 127 с помощью одного оператора:

value = (value & 0xFF) - 128;

Если value является байтовой переменной, вы можете сократить это значение до:

value ^= 0x80;

Это преобразование должно быть очень быстрым на любом процессоре, даже с частотой 1 МГц 6502.

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

  • 0
    Черт ! Вы сделали мою ночь! На самом деле нужно взглянуть на операторы бина ... в основном на C #. Я, вероятно, никогда не использовал их вне школы несколько лет назад ... Это решает проблему и не требует много циклов! Спасибо !
  • 0
    На самом деле у меня все еще есть вопрос, если я правильно помню свои школьные уроки для меня, знак был определен немного, но здесь, если я правильно понял, на самом деле 0 - это -128, 128 - это 0, а 256 - это +256?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню