Проблема , что хреново работает , проявляется это в следующем: когда кручу , например, по часовой стрелке , то иногда считывается значения если бы я крутил против часовой стрелке. В общем направление он определяет, но моменты неправильного определения сильно портят картину. Это хорошо заметно если подсоединить светодиод, например при вращении по часовой стрелке яркость увеличиваю, против часовой уменьшаю, и вот когда яркость равна нулю и я продолжаю крутить против часовой , видно как светодиод начинает помаргивать. Также это видно при печати по UART на комп. Как с эти бороться?
Программа у меня простая писал для Atmega16.
Две ноги от енкодера на INT0 и PC3 , средняя на землю
Прерывание по падающему фронту , при возникновении прерывания считываю ногу PC3 , если 1, то вращение по часовой , если 0 - то против. Соответственно увеличиваю или уменьшаю значение яркости светодиода , переменная curlevel
Вот сама программа
Прерывание INT0 устанавливает только флажок говорящий о том что оно произожло
#pragma vector=0x04
__interrupt void INT0handler (void)
{
intoccursint0=1;
}
Конфигурация портов
//===- Configuration interrupt INT0 -------------
clearbit(GICR,INT0);//Disable INT0
clearbit(MCUCR,ISC00);
setbit(MCUCR,ISC01); // falling edge
setbit(GICR,INT0);//Enable INT0
clearbit(DDRD,PD2); //configuration pin INT0 on input
setbit(PORTD,PD2); //setup pull-up resistor
//--------------------------- Config PC3 as input ------------
clearbit(DDRC,PC3);
setbit(PORTC,PC3);
__enable_interrupt();
//----------- PWM config ---------------------
TCCR0 = 2;
setbit(DDRB,PB3);
setbit(TCCR0,WGM01);
setbit(TCCR0,WGM00); //fast PWM
setbit(TCCR0,COM01);
setbit(TCCR0,COM00);
Основная программа , если флажок установлен , проверяет пин PC3 если он больше 0 , увеличиваем яркость если равен 0 , то уменьшаем.
while(1)
{//0
if (intoccursint0==1)
{//1
intoccursint0=0;
if (checkbit(PINC,PC3)>0)
{//2
putchar(53);
if (curlevel>=254) curlevel=255;
else
{
curlevel=curlevel+2;
}
OCR0=curlevel;
}//2
else
{//2
putchar(54);
if (curlevel<2) curlevel=0;
else
{
curlevel=curlevel-2;
}
OCR0=curlevel;
}//2
}//1
}//0 end while
Хотелось бы спросить что я неправильно делаю?