Пт сен 28, 2018 14:05:07
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; // Устанавливаем флаг поворота.
}
Пт сен 28, 2018 16:20:40
Значит энкодер новый. Потому, как с поношенным энкодером бывают всякие чудеса. Это недавно обсуждалось, отсюда и дальше. Сначала в конференции, потом мы с коллегой sunjob ушли в личку, то, что у меня получилось в итоге, sunjob выложил в последней мессаге. По-хорошему, там надо еще подобрать коэффициенты, и будет все ОК. Правда, sunjob так и не сознался, какой масштаб по оси времени на его осциллограммах, поэтому я не довел дело до конца. Да, проект там под Мегу 328PA, так, что на 48-ю он скомпилируется без вопросов.Dream555 писал(а):Коллеги, я проверил это уже на собранной плате и работает вроде как очень даже хорошо.
Пт сен 28, 2018 20:45:05
Значит энкодер новый. Потому, как с поношенным энкодером бывают всякие чудеса.
Пт ноя 22, 2019 20:20:02
так и не сознался, какой масштаб по оси времени на его осциллограммах
Вс фев 23, 2020 02:19:13
Вс фев 23, 2020 10:03:17