Тема конечно много раз мусолилась, но все таки хочется Ваши замечания...
Строю себе печь радиолюбителя на ATmega48PA. Из органов управления там только поворотный енкодер, который в общем-то все и управляет (установки, вкл/выкл и тп)
Долго гулял по форумам и смотрел разные решения программного подавления дребезга контактов. Пробовал всякие разные и все таки осенило сделал вот такое:
Вариант на прерывании по таймеру.
Код: Выделить всё
unsigned char _encoderTurned; // PORTD Encoder connected pins
unsigned char _encoderMask = 0b00000011; //Маска
unsigned char _encoderCurrentValue;
unsigned char _encoderTurned; //Флаг поворота енкодера
void TimerCounter0Init()
{
TCCR0A = 0;
TCCR0B = 0;
TCCR0A |= (1<<WGM01);
TCCR0B |= (1<<CS00);
TCCR0B = (1<<CS02); //Div 256
OCR0A = 30;
TIMSK0 |= (1<<OCIE0A);
}
ISR(TIMER0_COMPA_vect)
{
if((PIND&_encoderMask)==3) //Проверяем положение енкодера и очищаем флаг если он дощелкнулся
{
_encoderTurned=0;
return;
}
if(_encoderTurned==0)ReadEncoder();
}
void ReadEncoder()
{
_encoderCurrentValue = (PIND&_encoderMask); //Читаем два пина
if(_encoderCurrentValue==1)Increment(); //Проверяем фазу А
if(_encoderCurrentValue==2)Decrement();//Проверяем фазу В
//Кто быстрей сработал тот и прав
_encoderTurned = 1; // Устанавливаем флаг поворота.
}Хочется услышать Ваше мнения и замечания..
PS: Да простит меня модератор, если не там неписал..



