Пн май 31, 2021 18:23:19
потрудитесь сами пересчитать таймерПрерывание таймера 0,5mc много, 1ms желательно, в том коде прерывание таймера что-то около 16мс при частоте 16МГц
TCCR2B=(0<<WGM22) | (1<<CS22) | (1<<CS21) | (1<<CS20);
OCR2A=0xF9;
Пн май 31, 2021 18:30:15
Конденсаторы на контактах не панацея. Потому что идёт обгорание контактов из за замыкания заряженного конденсатора.
Вт июн 01, 2021 03:58:20
Вт июн 01, 2021 18:10:55
Ср июн 02, 2021 08:49:52
ваше решениеslav0n писал(а):проблема в дятлах
Ср июн 02, 2021 09:05:26
if(PINC & (1<< PC2)) return;//if buttons and not encoder
if(FLAGS.btn_enc_active) return;
if((PINC & (B_OK)) == 0) return;
//my code
static u8 oldclk, flg;
u8 clk = PINC & (1<< 5);
if(flg == 0 and clk == 0){// ловим задний фронт
flg = 1;
FLAGS.btn_enc_active = 1;
u8 dir = PINC & (1<< 4);// смотрим - туда или сюда
encod_or_button_LeftRight_param_update (Enc.pt_var, Enc.lim, dir ? Enc.stp : -Enc.stp, &Enc.accelerator);
}
else
if(oldclk and clk) flg = 0;
oldclk = clk;
Ср июн 02, 2021 13:34:15
PINC & (1<< PC2)
PINC & (B_OK)
PINC & (1<< 5)
PINC & (1<< 4)
Ср июн 02, 2021 14:19:20
//my code
static u8 oldclk, flg;//збиваем двэ стрелка на вчира
u8 clk = PINC & (1<< 5);//биром ногу шоб знат насичас
if(flg == 0 and clk == 0){// ловим задний фронт
flg = 1;
u8 dir = PINC & (1<< 4);// смотрым тудэ-судэ... какя разница
encod_or_button_LeftRight_param_update (Enc.pt_var, Enc.lim, dir ? Enc.stp : -Enc.stp, &Enc.accelerator);
}
else
if(oldclk and clk) flg = 0;//зидес нэ важнэ (шюткэ таков)
oldclk = clk;//зидес тожэ нэважнэ (шюткэ №2)
//checkаю
Ср июн 02, 2021 16:09:49
Ср июн 02, 2021 16:24:23
Ср июн 02, 2021 18:24:58
Ср июн 02, 2021 18:30:06
Ср июн 02, 2021 19:27:49
Ср июн 02, 2021 19:31:22
Ср июн 02, 2021 19:58:25
Ладно бы была аппаратная поддержка энкодера, как в STM.Port5P-ch open-drain 8-bit high-voltage output port.Can be set in input or output mode in 1-bit units.When it is used as input port, set the output latch to “0”, and read port level read(P50 through P57).
Чт июн 03, 2021 06:08:22
Чт июн 03, 2021 10:09:54
Чт июн 03, 2021 10:56:26
Чт июн 03, 2021 10:58:42
Чт июн 03, 2021 11:34:53
//my code
static u8 oldclk, flg;
u8 clk = PINC & (1<< 5);
if(flg == 0 and clk == 0){// ловим задний фронт
flg = 1;
FLAGS.btn_enc_active = 1;
u8 dir = PINC & (1<< 4);// смотрим - туда или сюда
encod_or_button_LeftRight_param_update (Enc.pt_var, Enc.lim, dir ? Enc.stp : -Enc.stp, &Enc.accelerator);
}
else
if(oldclk and clk) flg = 0;
oldclk = clk;
/*
static u8 i;
i = (i << 2) + (PINC & ((1<< 4)+(1<< 5)));
s8 stp = 0;
if(i == 0x70)
stp = -Enc.stp;
else
if(i == 0xD0)
stp = Enc.stp;
if(stp){
encod_or_button_LeftRight_param_update (Enc.pt_var, Enc.lim, stp, &Enc.accelerator);
FLAGS.btn_enc_active = 1;
}
*/
/*
//very stable, Ярослав Курус
static u8 prevstate, flg;
u8 curstate = PINC & 0b110000;//clk = PINC & (1 << 5), dir = PINC & (1 << 4)
if(flg and curstate == 0){
flg = 0;
if(prevstate != 0 and prevstate != 0b110000){
s8 step = Enc.stp; //туда
if(prevstate == 0b100000) step = -Enc.stp; //сюда
FLAGS.btn_enc_active = 1;
encoder_parameter_update(Enc.pt_var, Enc.lim, step, &enc_accelerator);
}
}
prevstate = curstate;
if(curstate == 0b110000) flg = 1;
*/
/*
static u8 oldclk, flg, oldd;
u8 clk = PINC & (1 << 5);
u8 dir = PINC & (1 << 4);
if(flg and not clk){// ловим задний фронт
flg = 0;
if(oldd == dir){
FLAGS.btn_enc_active = 1;
encoder_parameter_update(Enc.pt_var, Enc.lim, dir ? Enc.stp : -Enc.stp, &enc_accelerator);
}
}
if(oldclk and clk) flg = 1;
oldclk = clk;
oldd = dir;
static u8 oldclk, flg;
u8 clk = PINC & (1 << 5);
if(flg and clk != flg){// ловим фронт
flg = 0;
FLAGS.btn_enc_active = 1;
u8 dt = PINC & (1 << 4);
u8 dir = (dt and clk) or (!dt and !clk) ? 1 : 0;// смотрим - туда или сюда
encoder_parameter_update(Enc.pt_var, Enc.lim, dir ? Enc.stp : -Enc.stp, &enc_accelerator);
}
if(oldclk and clk) flg = 1;
oldclk = clk;
*/
/*
static u8 old;
u8 cur = 0;
if(PINC & (1<<4)) cur |= 2;
if(PINC & (1<<5)) cur |= 1;
if(cur == (old & 0b00000011)) return;
old <<= 2;
old |= cur;
s8 stp;
if(old == 0b11100001) stp = Enc.stp;
else
if(old == 0b11010010) stp =-Enc.stp;
else return;
FLAGS.btn_enc_active = 1;
encoder_parameter_update(Enc.pt_var, Enc.lim, stp, &enc_accelerator);
*/
/*
//full speed ~~~~~~~~~~~~~~~~~~~~~~~~~
static u8 oldclk;
const u8 clk = PINC & (1<<4);
if(oldclk != clk){// catch the front pulse clk ловим фронт
oldclk = clk;
u8 p = PINC & 0b110000;
u8 dir = (p == 0b110000 or p == 0) ? 1 : 0;
FLAGS.btn_enc_active = 1;
encoder_parameter_update(Enc.pt_var, Enc.lim, dir ? Enc.stp : -Enc.stp, &enc_accelerator);
}
//full speed accurate ~~~~~~~~~~~~~~~~~~
// s8 pos = 0;
static u8 prevState = 0;
const int8_t increment[16] = {0, -1, 1, 0, 1, 0, 0, -1, -1, 0, 0, 1, 0, 1, -1, 0};
u8 curState = 0;
if(PINC & (1<<4)) curState |= 2;
if(PINC & (1<<5)) curState |= 1;
if(curState != prevState){
s8 pos = increment[curState | (prevState << 2)];
prevState = curState;
s8 stp = 0;
if(pos == -1) stp = Enc.stp;
else
if(pos == 1) stp =-Enc.stp;
else return;
FLAGS.btn_enc_active = 1;
encoder_parameter_update(Enc.pt_var, Enc.lim, stp, &enc_accelerator);
}
*/