Здравствуйте, уважаемые коты!
Очень заинтересовала тема про обработку энкодера и устранение дребезга.
Изначально я хотел написать в тему
http://radiokot.ru/forum/viewtopic.php?f=20&t=76027 , но она закрыта, к сожалению. Поэтому пишу сюда. Заранее извиняюсь, если не совсем попал в тему.
По данной ссылке есть код Леонида Ивановича. Идея состоит в применении гистерезиса - сравнивается не только текущее и предыдущее состояние, но пре-предыдущее. Сразу оговорюсь, что я начинаю писать под МК на Си. Я не совсем понял обработку состояния в самом начале. Терзали сомнения. Произвел симуляцию в Протеусе (нашел в одной статье как моделируется энкодер с применением МК и кодом для него). Дребезг бывает проскакивает

Поломав голову, рассмотрев все возможные варианты поведения энкодера при дребезге, написал свой код. В нем учитывается как раз пре-предыдущее состояние. Привожу свой код. Извиняюсь, если он быдлокодерский, но мне пока так проще понимать.
Процедура обработки срабатывания таймера (производится периодический опрос энкодера). Суть в том, что изменение переменной происходит, если пройдено последовательно три состояния.
{
char NewState = PINA & 0b00000011;
if(NewState != OldState) //если состояние изменилось,
{
if(NewState != OldOldState) //если текущее и пред-предыдущее не равны,
{
switch(OldState+OldOldState) {
case 5:
{
if(NewState == 1) upState++;
if(NewState == 0) downState++;
break;
}
case 4:
{
if(NewState == 0) upState++;
if(NewState == 2) downState++;
break;
}
case 1:
{
if(NewState == 2) upState++;
if(NewState == 3) downState++;
break;
}
case 2:
{
if(NewState == 3) upState++;
if(NewState == 1) downState++;
break;
}
}
OldOldState=OldState;
OldState=NewState;
}
}