ATmega8/16: шим, управляемый энкодером

Обсуждаем контроллеры компании Atmel.
Ответить
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

charchyard, вам было сказано
Прерывание таймера 0,5mc много, 1ms желательно, в том коде прерывание таймера что-то около 16мс при частоте 16МГц
потрудитесь сами пересчитать таймер

Код: Выделить всё

TCCR2B=(0<<WGM22) | (1<<CS22) | (1<<CS21) | (1<<CS20);
OCR2A=0xF9;
Реклама
Мудрый кот
Сообщения: 1759
Зарегистрирован: Пт июн 01, 2018 07:28:45

Сообщение parovoZZ »

Конденсаторы на контактах не панацея. Потому что идёт обгорание контактов из за замыкания заряженного конденсатора.
Ток через контакты так или иначе должен проходить, чтобы удалять оксидную плёнку. Минимальное значение коммутируемого тока указывается в даташите.
Реклама
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Это не значит, что конденсаторы обязательно нужно ставить.
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков

Сообщение slav0n »

проблема в дятлах
ohmycode!
primuss3.com
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

slav0n писал(а):проблема в дятлах
ваше решение
Реклама
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков

Сообщение slav0n »

пожалуйста

Код: Выделить всё

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;
ohmycode!
primuss3.com
Контактная информация:
Реклама
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

что-то у вас все в кучу

Код: Выделить всё

PINC & (1<< PC2)
PINC & (B_OK)
PINC & (1<< 5)
PINC & (1<< 4)
?
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков

Сообщение slav0n »

лень - движитель прогресса

Добавлено after 8 minutes 9 seconds:
репит

Код: Выделить всё

//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аю
Последний раз редактировалось slav0n Ср июн 02, 2021 19:08:47, всего редактировалось 4 раза.
ohmycode!
primuss3.com
Контактная информация:
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Ну а как на счет encod_or_button_LeftRight_param_update(Enc.pt_var, Enc.lim, dir ? Enc.stp : -Enc.stp, &Enc.accelerator)?
Давайте целиком код, что бы потестить что было, а то мне лень думать, а ТСу и подавно.
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков

Сообщение slav0n »

целиком... а зачем? весь смысл ясен в нескольких выложенных мною строках
для программиста этого должно быть достаточно

Добавлено after 5 minutes 56 seconds:
ну, а если вам так хочется, пожалуйста - http://primuss3.com/forum/index.php?top ... 7#msg20637
ohmycode!
primuss3.com
Контактная информация:
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Так кондерчики то нужны или как?
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков

Сообщение slav0n »

яб вставил беспроблем
ohmycode!
primuss3.com
Контактная информация:
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Как же тогда без кондерчиков обходятся в DVD-плеерах, MP3-магнитолах, к примеру DVD DKS-6000, страница 24, стоят два энкодера ECHO_VOL и MIC_VOL, только подтяжка, кондерчиков то нема.
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков

Сообщение slav0n »

шо? ДВД? гуляйте лесом
ohmycode!
primuss3.com
Контактная информация:
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

А что не так?
Процессор 81С2332 система команд процессора 81С31.
Ладно бы специализированные чипы использовались, а то такой же ногодрыг.
Энкодеры подключены к портам Р50-Р53
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).
Ладно бы была аппаратная поддержка энкодера, как в STM.
Так что не так?
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков

Сообщение slav0n »

две глины конечно дороже силикона
ohmycode!
primuss3.com
Контактная информация:
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Ваш ответ мне не понятен..?
Вот следующая схема VELAS VC-M874, сразу на 1 странице, энкодер VR901 подключен к чипу IC501, кондерчиков то нет.

Я то же ищу "середину", и ни как найти ее не могу.
Да же с аппаратной поддержкой STM32 не так как надо работает, если кондерчики добавить - будет, наверное, идеально. А может все дело в дешевых энкодерах?
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков

Сообщение slav0n »

код вылизан
дальше только конденсаторы (глина)
ohmycode!
primuss3.com
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3832
Зарегистрирован: Сб сен 10, 2011 17:46:25

Сообщение oleg110592 »

В STM32 аппаратный энкодер хорошо работает без конденсаторов - там есть аппаратный антидребезг. Для авр использовал код от ЛИ - тоже хорошо без конденсаторов работал на самых дешевых китайских энкодерах:
http://530.ru/wwwboards/mcontrol/2142/m ... 0381.shtml
з.ы. там программный антидребезг
Опытный кот
Аватара пользователя
Сообщения: 882
Зарегистрирован: Ср дек 01, 2010 00:38:15
Откуда: Харьков

Сообщение slav0n »

ок, все проверено, но оставлено свое

Код: Выделить всё

	
	//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);
	}
*/	
ohmycode!
primuss3.com
Контактная информация:
Ответить

Вернуться в «AVR»