Обсуждаем контроллеры компании Atmel.
Ответить

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

Пн май 31, 2021 18:23:19

charchyard, вам было сказано
Прерывание таймера 0,5mc много, 1ms желательно, в том коде прерывание таймера что-то около 16мс при частоте 16МГц
потрудитесь сами пересчитать таймер
Код:
TCCR2B=(0<<WGM22) | (1<<CS22) | (1<<CS21) | (1<<CS20);
OCR2A=0xF9;

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

Пн май 31, 2021 18:30:15

Конденсаторы на контактах не панацея. Потому что идёт обгорание контактов из за замыкания заряженного конденсатора.

Ток через контакты так или иначе должен проходить, чтобы удалять оксидную плёнку. Минимальное значение коммутируемого тока указывается в даташите.

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

Вт июн 01, 2021 03:58:20

Это не значит, что конденсаторы обязательно нужно ставить.

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

Вт июн 01, 2021 18:10:55

проблема в дятлах

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

Ср июн 02, 2021 08:49:52

slav0n писал(а):проблема в дятлах
ваше решение

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

Ср июн 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;

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

Ср июн 02, 2021 13:34:15

что-то у вас все в кучу
Код:
PINC & (1<< PC2)
PINC & (B_OK)
PINC & (1<< 5)
PINC & (1<< 4)
?

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

Ср июн 02, 2021 14:19:20

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

Добавлено 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 раз(а).

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

Ср июн 02, 2021 16:09:49

Ну а как на счет encod_or_button_LeftRight_param_update(Enc.pt_var, Enc.lim, dir ? Enc.stp : -Enc.stp, &Enc.accelerator)?
Давайте целиком код, что бы потестить что было, а то мне лень думать, а ТСу и подавно.

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

Ср июн 02, 2021 16:24:23

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

Добавлено after 5 minutes 56 seconds:
ну, а если вам так хочется, пожалуйста - http://primuss3.com/forum/index.php?top ... 7#msg20637

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

Ср июн 02, 2021 18:24:58

Так кондерчики то нужны или как?

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

Ср июн 02, 2021 18:30:06

яб вставил беспроблем

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

Ср июн 02, 2021 19:27:49

Как же тогда без кондерчиков обходятся в DVD-плеерах, MP3-магнитолах, к примеру DVD DKS-6000, страница 24, стоят два энкодера ECHO_VOL и MIC_VOL, только подтяжка, кондерчиков то нема.

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

Ср июн 02, 2021 19:31:22

шо? ДВД? гуляйте лесом

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

Ср июн 02, 2021 19:58:25

А что не так?
Процессор 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.
Так что не так?

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

Чт июн 03, 2021 06:08:22

две глины конечно дороже силикона

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

Чт июн 03, 2021 10:09:54

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

Я то же ищу "середину", и ни как найти ее не могу.
Да же с аппаратной поддержкой STM32 не так как надо работает, если кондерчики добавить - будет, наверное, идеально. А может все дело в дешевых энкодерах?

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

Чт июн 03, 2021 10:56:26

код вылизан
дальше только конденсаторы (глина)

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

Чт июн 03, 2021 10:58:42

В STM32 аппаратный энкодер хорошо работает без конденсаторов - там есть аппаратный антидребезг. Для авр использовал код от ЛИ - тоже хорошо без конденсаторов работал на самых дешевых китайских энкодерах:
http://530.ru/wwwboards/mcontrol/2142/m ... 0381.shtml
з.ы. там программный антидребезг

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

Чт июн 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);
   }
*/   
Ответить