Исходники, алгоритмы.

Кружок юных, и не только, радиолюбителей

Сообщение lizard66 » 18 апр 2016, 08:24

AlekseiKO писал(а):В меню выбираю значение "частоту" и начинаю ее повышать или уменьшать. Но при нажатии на кнопку значение прыгает через 1 и даже больше. (Пример: 20, 23, 25, 27, 30)
И если быстро быстро, резко резко , нажать на кнопку то только тогда как положено на 1 деление переключается.

Так вот вопрос. Время нажатия на кнопку чем определятся ? В коде программы? Или же номиналами деталей какими то?

Спасибо

С дребезгом можно бороться как программно, так и аппаратно, чаще программно. В данном случае его побороли плохо, либо кнопки убитые.
Схему покажите.
Аватара пользователя
lizard66
 
Сообщения: 165
Зарегистрирован: 11 фев 2011, 17:59
Благодарил (а): 4 раз.
Поблагодарили: 6 раз.

Сообщение AlekseiKO » 18 апр 2016, 12:23

Кнопки вроде нормальные. пробывал ставить другую. так же было.
схемку накидал почти от руки,на скоряк. За исключение некоторых мелочей стандартных.
Вложения
Вот.jpg
AlekseiKO
 
Сообщения: 34
Зарегистрирован: 11 янв 2011, 09:50
Благодарил (а): 5 раз.
Поблагодарили: 1 раз.

Сообщение slav0n » 18 апр 2016, 13:12

Самое простое, если писатель прошивки не забыл включить встроенные в мегу подтягивающие резисторы, то внешние на 1к можно вообще убрать, а параллельно кнопкам поставить конденсаторы. Если же внутренние подтяжки не задействованы, то внешние надо поставить на 20-50к, чтобы не завышать емкость сглаживающих кондеров. Эту емкость подобрать экспериментально, начиная примерно от 0.01мкФ.
while(1||!1);
slav0n
Site Admin
 
Сообщения: 4503
Зарегистрирован: 15 ноя 2009, 18:43
Благодарил (а): 24 раз.
Поблагодарили: 389 раз.

Re: Исходники, алгоритмы.

Сообщение lizard66 » 18 апр 2016, 14:56

Ну, аппаратным антидребезгом тут не пахнет, а на PORTC автор мог и АЦП с медлинным тактом задействовать в качестве борьбы с дребезгом. Тут либо с софтом копаться, либо на каждую кнопку по Шмидту или RS-триггеру и кнопки с трехконтактные (с перемыканием), либо как Славка рекомендует емкости подобрать
Аватара пользователя
lizard66
 
Сообщения: 165
Зарегистрирован: 11 фев 2011, 17:59
Благодарил (а): 4 раз.
Поблагодарили: 6 раз.

Сообщение slav0n » 18 апр 2016, 16:34

lizard66 писал(а):а на PORTC автор мог и АЦП с медлинным тактом задействовать в качестве борьбы с дребезгом.

обычно делаем счетчик итераций главного цикла.
При нажатии на кнопку счетчик запускается, при отпускании - сбрасывается.
В зависимости от содержимого счетчика решаем что делать.
Например код на сях
Код: Выделить всё
while(1)
   {
      if(btn_prs)//проверяем кнопку
      {
         if(cnt ==10 ||//первое нажатие, антидребезг 10 циклов
            ( cnt >= 70 && (cnt % 20)==10 ))//длительность паузы перед автоповтором (70)
//и  период автоповтора (20)
         {
            //здесь исполняем нажатие
            
         }
         
         cnt++;//инкремент счетчика
      }
      else cnt=0;//сброс счетчика
   
      //бла-бла
   }
while(1||!1);
slav0n
Site Admin
 
Сообщения: 4503
Зарегистрирован: 15 ноя 2009, 18:43
Благодарил (а): 24 раз.
Поблагодарили: 389 раз.

Re: Исходники, алгоритмы.

Сообщение AlekseiKO » 19 апр 2016, 01:11

Попробывал еще одну кнопку от мышки. Такая же хня...
Попробывал поставить сначало :
кондер 0.01- без изменений
Выпаял 1к - без изм.
Впаял 27к -без изм.
Поменял кондер 0.1-без изм.

Я так понимаю автар прошивки решил поглумиться...
AlekseiKO
 
Сообщения: 34
Зарегистрирован: 11 янв 2011, 09:50
Благодарил (а): 5 раз.
Поблагодарили: 1 раз.

Сообщение slav0n » 19 апр 2016, 03:56

AlekseiKO писал(а):Я так понимаю автар прошивки решил поглумиться...

возможно просто сбацал по-быстрому в протеусе и всё
while(1||!1);
slav0n
Site Admin
 
Сообщения: 4503
Зарегистрирован: 15 ноя 2009, 18:43
Благодарил (а): 24 раз.
Поблагодарили: 389 раз.

Re: Исходники, алгоритмы.

Сообщение AlekseiKO » 19 апр 2016, 05:25

Кстати в архиве есть фаил протеуса. Только я в нем ни разу не работал!
Он своего рода исходник?
AlekseiKO
 
Сообщения: 34
Зарегистрирован: 11 янв 2011, 09:50
Благодарил (а): 5 раз.
Поблагодарили: 1 раз.

Re: Исходники, алгоритмы.

Сообщение slav0n » 19 апр 2016, 07:00

AlekseiKO писал(а):Он своего рода исходник?

нет
while(1||!1);
slav0n
Site Admin
 
Сообщения: 4503
Зарегистрирован: 15 ноя 2009, 18:43
Благодарил (а): 24 раз.
Поблагодарили: 389 раз.

энкодер, код обработки

Сообщение slav0n » 31 июл 2017, 16:56

весьма простой код обработки энкодера,
вставляется в тело прерывания (ну, или куда вам вздумается).
Привязка ног к схеме PrimussThermo

Код: Выделить всё
   static u8 old;
   u8 clk=PINC&(1<<5),dir=PINC&(1<<4);//смотрим ноги
   if(old&&clk==0){//ловим задний фронт
      if(dir)DATA++;//тудом
      else   DATA--;//сюдом
   }
   old=clk;
while(1||!1);
slav0n
Site Admin
 
Сообщения: 4503
Зарегистрирован: 15 ноя 2009, 18:43
Благодарил (а): 24 раз.
Поблагодарили: 389 раз.

Сообщение lizard66 » 31 июл 2017, 22:24

slav0n писал(а):вставляется в тело прерывания

Может лучше old сделать volatile?
Аватара пользователя
lizard66
 
Сообщения: 165
Зарегистрирован: 11 фев 2011, 17:59
Благодарил (а): 4 раз.
Поблагодарили: 6 раз.

Сообщение slav0n » 01 авг 2017, 02:48

зачем? мой компилятор тут совершенно не реагирует на этот модификатор
while(1||!1);
slav0n
Site Admin
 
Сообщения: 4503
Зарегистрирован: 15 ноя 2009, 18:43
Благодарил (а): 24 раз.
Поблагодарили: 389 раз.

Сообщение slav0n » 01 авг 2017, 11:39

кстати, очевидно, что сигнальные ноги энкодера совершенно равнозначны
вот код-эквивалент:
Код: Выделить всё
   static u8 old;
   u8 clk=PINC&(1<<4),dir=PINC&(1<<5);//смотрим ноги
   if(old&&!clk){//ловим задний фронт, здесь монопенисуально old&&clk==0
      if(!dir)DATA++;//тудом
      else   DATA--;//сюдом
   }
   old=clk;
while(1||!1);
slav0n
Site Admin
 
Сообщения: 4503
Зарегистрирован: 15 ноя 2009, 18:43
Благодарил (а): 24 раз.
Поблагодарили: 389 раз.

Сообщение lizard66 » 01 авг 2017, 20:26

slav0n писал(а):зачем? мой компилятор тут совершенно не реагирует на этот модификатор

В случае иcпользования приведенного кода в прерьівании, каждьій раз когда old будет задействована в конструкции, ее значение будет обновляться в регистре из рамьі.
Аватара пользователя
lizard66
 
Сообщения: 165
Зарегистрирован: 11 фев 2011, 17:59
Благодарил (а): 4 раз.
Поблагодарили: 6 раз.

Сообщение slav0n » 01 авг 2017, 21:37

хм... кто-нибудь разницу видит? я нет

Код: Выделить всё
   static u8 old;   
   u8 clk=PINC&(1<<4),dir=PINC&(1<<5);
    2228:   a3 b3          in   r26, 0x13   ; 19
    222a:   a0 71          andi   r26, 0x10   ; 16
    222c:   33 b3          in   r19, 0x13   ; 19
   if(old&&!clk){//ловим задний фронт
    222e:   80 91 0b 01    lds   r24, 0x010B
    2232:   88 23          and   r24, r24
    2234:   09 f4          brne   .+2         ; 0x2238 <__vector_11+0x10e>
    2236:   46 c0          rjmp   .+140       ; 0x22c4 <__vector_11+0x19a>
    2238:   aa 23          and   r26, r26
    223a:   09 f0          breq   .+2         ; 0x223e <__vector_11+0x114>
    223c:   43 c0          rjmp   .+134       ; 0x22c4 <__vector_11+0x19a>
...........
   old=clk;
    22c4:   a0 93 0b 01    sts   0x010B, r26

Код: Выделить всё
   volatile static u8 old;   
   u8 clk=PINC&(1<<4),dir=PINC&(1<<5);
    2228:   a3 b3          in   r26, 0x13   ; 19
    222a:   a0 71          andi   r26, 0x10   ; 16
    222c:   33 b3          in   r19, 0x13   ; 19
   if(old&&!clk){//ловим задний фронт
    222e:   80 91 0b 01    lds   r24, 0x010B
    2232:   88 23          and   r24, r24
    2234:   09 f4          brne   .+2         ; 0x2238 <__vector_11+0x10e>
    2236:   46 c0          rjmp   .+140       ; 0x22c4 <__vector_11+0x19a>
    2238:   aa 23          and   r26, r26
    223a:   09 f0          breq   .+2         ; 0x223e <__vector_11+0x114>
    223c:   43 c0          rjmp   .+134       ; 0x22c4 <__vector_11+0x19a>
...........
   old=clk;
    22c4:   a0 93 0b 01    sts   0x010B, r26
while(1||!1);
slav0n
Site Admin
 
Сообщения: 4503
Зарегистрирован: 15 ноя 2009, 18:43
Благодарил (а): 24 раз.
Поблагодарили: 389 раз.

Сообщение lizard66 » 01 авг 2017, 22:41

slav0n писал(а):хм... кто-нибудь разницу видит? я нет

Код: Выделить всё
   static u8 old;   
   u8 clk=PINC&(1<<4),dir=PINC&(1<<5);
    2228:   a3 b3          in   r26, 0x13   ; 19
    222a:   a0 71          andi   r26, 0x10   ; 16
    222c:   33 b3          in   r19, 0x13   ; 19
   if(old&&!clk){//ловим задний фронт
    222e:   80 91 0b 01    lds   r24, 0x010B
    2232:   88 23          and   r24, r24
    2234:   09 f4          brne   .+2         ; 0x2238 <__vector_11+0x10e>
    2236:   46 c0          rjmp   .+140       ; 0x22c4 <__vector_11+0x19a>
    2238:   aa 23          and   r26, r26
    223a:   09 f0          breq   .+2         ; 0x223e <__vector_11+0x114>
    223c:   43 c0          rjmp   .+134       ; 0x22c4 <__vector_11+0x19a>
...........
   old=clk;
    22c4:   a0 93 0b 01    sts   0x010B, r26

Код: Выделить всё
   volatile static u8 old;   
   u8 clk=PINC&(1<<4),dir=PINC&(1<<5);
    2228:   a3 b3          in   r26, 0x13   ; 19
    222a:   a0 71          andi   r26, 0x10   ; 16
    222c:   33 b3          in   r19, 0x13   ; 19
   if(old&&!clk){//ловим задний фронт
    222e:   80 91 0b 01    lds   r24, 0x010B
    2232:   88 23          and   r24, r24
    2234:   09 f4          brne   .+2         ; 0x2238 <__vector_11+0x10e>
    2236:   46 c0          rjmp   .+140       ; 0x22c4 <__vector_11+0x19a>
    2238:   aa 23          and   r26, r26
    223a:   09 f0          breq   .+2         ; 0x223e <__vector_11+0x114>
    223c:   43 c0          rjmp   .+134       ; 0x22c4 <__vector_11+0x19a>
...........
   old=clk;
    22c4:   a0 93 0b 01    sts   0x010B, r26

Не в обработчике, а в основном приложении, где анализируется состояние old.

Мля, я гоню, DATA должен бьіть volatile :)
Аватара пользователя
lizard66
 
Сообщения: 165
Зарегистрирован: 11 фев 2011, 17:59
Благодарил (а): 4 раз.
Поблагодарили: 6 раз.

Сообщение slav0n » 02 авг 2017, 04:13

lizard66 писал(а): я гоню, DATA должен бьіть volatile :)

про DATA отдельный разговор. Здесь я ее написал чисто условно, чтобы изобразить какое-то действие.
while(1||!1);
slav0n
Site Admin
 
Сообщения: 4503
Зарегистрирован: 15 ноя 2009, 18:43
Благодарил (а): 24 раз.
Поблагодарили: 389 раз.

Пред.

Вернуться в Я не волшебник, я только учусь...

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

cron