Написал в С++ функцию обработки энкодера, но иногда срабатывает в нету сторону. Энкодер имеет оду особенность, он фиксируется только когда контакт1 и контакт2 разомкнуты, а если повернуть ручку, он будет выдавать такой код:
00 - изначально разомкнуты,
01 - если влево
10 - если влево
или наоборот
00 - изначально разомкнуты,
10 - если вправо
01 - если вправо
фрагмент кода:
{ // функция обрабатывает энкодер, подключенный к линиям порда Д 0 и 1
int val1=0;
int val2=0; //флаги срабатывания контакта энкодера
int d;
if (PIND.0 ==1 && PIND.1 == 0) val1=1;
if (PIND.0 ==0 && PIND.1 == 1) val2=1;
d=0; //флаг выхода из цикла
if(val1==1 ) //если пришел сигнал с первого контакта
{while (d==0) //пока не пришел сигнал с друого контакта, ждать его
{if (PIND.0 ==0 && PIND.1 == 1 && val1 == 1 ) {val2=0; d++;}
if (PIND.0 ==1 && PIND.1 == 0 && val2 == 1 ) {val1=0; d++;}
}
}
if(val2==1 )//если пришел сигнал с второго контакта
{while (d==0)//пока не пришел сигнал с друого контакта, ждать его
{
if (PIND.0 ==0 && PIND.1 == 1 && val1 == 1 ) {val2=0; d++;}
if (PIND.0 ==1 && PIND.1 == 0 && val2 == 1 ) {val1=0; d++;}
}
}
if (val1==1) {return 1;} //если сработало по первому контакту, вернуть 1
if (val2==1) {return 2;}//если сработало по второму контакту, вернуть 2
if (val1==0 && val2==0) return 0; //если небыло сигнала, вернуть 0
val1=0; val2=0; обнуление флагов
}
Вроде, работоспособность такого решения большая, но ошибается... Правда, только один раз. Может быть, функция вызывается тогда, когда валкодер вращается? Помогите...