LINUX.ORG.RU

История изменений

Исправление 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;
        }

Или я не осознал что-то? (поздно уже, пока это все печатал, уже лень переосознавать).