Фон:
Я пишу драйвер для поворотного энкодера с кодом Грея с использованием конечного автомата после чтения этот пример Arduino. Мое устройство написано на C # с использованием микросхемы .net. Поскольку это не совсем встроенная операционная система реального времени, я могу зафиксировать только состояние ОДНОГО из двух выводов кодировщика во время прерывания. После прерывания событие ставится в очередь для запуска в потоке с высоким приоритетом. Состояние вывода, сгенерировавшего прерывание, передается в качестве аргумента в "ISR", также известную как _ 1_ делегат. Чтение состояния второго пина во время работы обработчика неточно, потому что прошло несколько миллисекунд после того, как фактическое событие было поставлено в очередь (я пробовал это).
В моем случае базовое состояние - оба контакта A и B вытянуты высоко (значение = 1)
Итак, у меня есть только 4 измеримых состояния, но фактические состояния основаны на предыдущем состоянии.
- Pin A High 1
- Контакт B высокий 1
- Pin A Low 0
- Контакт B низкий 0
У меня проблемы с созданием таблицы переходов между состояниями, в которой таблица не перепутается. Я пытаюсь придумать какую-то быструю логику или, возможно, некоторые побитовые операции для завершения этого.
Вот таблица состояний (не таблица переходов), которую я придумал:
Pin State Assigned Value State Name
PinB-High 4 CW Rot
PinA-High 3 CW3
PinB-Low 2 CW2
PinA-Low 1 CW1
Start 0 Start
PinB-Low 5 CCW1
PinA-Low 6 CCW2
PinB-High 7 CCW3
PinA-High 8 CCW Rot
Как мне получить правильные переходы только в 4 состояния?