История изменений
Исправление Zubok, (текущая версия) :
В принципе, хорошая идея, да — после первого срабатывания по фронту (любому) канала A начинается зона нечувствительности, из которой выходим по фронту уже второго канала B (т. е. где-то посередине полупериода A). То есть дребезг просто будет проигнорирован. Тогда можно обойтись без таймера нечувствительности. По сути получаем тоже самое, что и таймер, но уже нет зависимости от того, как быстро крутишь.
Я правильно изобразил?
m_position +1 +1 +1 +1
state -1- -2- -3- -0- -1- -2-
-------+ +-------+
pinA | | |
+-------+ +---------
+-------+ +-------+
pinB | | | |
----+ +-------+ +-----
2 - зона нечувствительности после заднего фронта A; ождание заднего фронта B
3 - зона ожидания переднего фронта A; зона нечувствительности B
0 - зона нечувствительности после переднего фронта A; ождание переднего фронта B
1 - зона ожидания заднего фронта A; зона нечувствительности B
Если правильно, то вот хочу понять, что будет, если начнется дребезг, например, по заднему фронту A. Ты вошел в состояние 2, у тебя B = 1. Из-за дребезга начинает щелкать по A, пойдут прерывания afall, arise попеременно, а это приведет к тому, что несколько раз декремент m_position у тебя будет из-за этого и переход в другой state.
else if (*m_pinB == 1 && state == 2)
{
m_position--;
state = 1;
}
Или я не осознал что-то? (поздно уже, пока это все печатал, уже лень переосознавать).
Исходная версия Zubok, :
В принципе, хорошая идея, да — после первого срабатывания по фронту (любому) канала A начинается зона нечувствительности, из которой выходим по фронту уже второго канала B (т. е. где-то посередине полупериода A). То есть дребезг просто будет проигнорирован. Тогда можно обойтись без таймера нечувствительности. Gо сути получаем тоже самое, что и таймер, но уже нет зависимости от того, как быстро крутишь.
Я правильно изобразил?
m_position +1 +1 +1 +1
state -1- -2- -3- -0- -1- -2-
-------+ +-------+
pinA | | |
+-------+ +---------
+-------+ +-------+
pinB | | | |
----+ +-------+ +-----
2 - зона нечувствительности после заднего фронта A; ождание заднего фронта B
3 - зона ожидания переднего фронта A; зона нечувствительности B
0 - зона нечувствительности после переднего фронта A; ождание переднего фронта B
1 - зона ожидания заднего фронта A; зона нечувствительности B
Если правильно, то вот хочу понять, что будет, если начнется дребезг, например, по заднему фронту A. Ты вошел в состояние 2, у тебя B = 1. Из-за дребезга начинает щелкать по A, пойдут прерывания afall, arise попеременно, а это приведет к тому, что несколько раз декремент m_position у тебя будет из-за этого и переход в другой state.
else if (*m_pinB == 1 && state == 2)
{
m_position--;
state = 1;
}
Или я не осознал что-то? (поздно уже, пока это все печатал, уже лень переосознавать).