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

Re: Эффективность функции?Работа с 16 бит числом.Atmega16.

Пн авг 20, 2018 13:27:28

я делал вообще не совсем так. при поразрядном редактировании было бы странно, если бы при числе 1023 при попытке изменить третий разряд мы получали 1024.

Конечно странно, а у кого так работает? У меня будет 1023 какой разряд не меняй, при одной проверке.

Re: Эффективность функции?Работа с 16 бит числом.Atmega16.

Пн авг 20, 2018 14:35:45

Не менее странно, когда при макс. значении в 5000 и текущем 4800, при редактировании старшего разряда, устройство будет игнорировать кнопку "Up". Или вообще перескакивать на "0". Юзер может встать в ступор :))
Палка о двух концах...

Re: Эффективность функции?Работа с 16 бит числом.Atmega16.

Пн авг 20, 2018 14:49:45

Не менее странно, когда при макс. значении в 5000 и текущем 4800, при редактировании старшего разряда, устройство будет игнорировать кнопку "Up". Или вообще перескакивать на "0". Юзер может встать в ступор :))

А чем старший разряд отличается от всех остальных? Юзер дойдет до 9 на младшем и впадет в ступор :)

Re: Эффективность функции?Работа с 16 бит числом.Atmega16.

Пн авг 20, 2018 15:06:57

Фраза "Юзер может встать в ступор" предназначалась для первой половины поста, просто так нелогично всё склеилось :(
Представляю, если пользователь не будет знать максимального значения, какой нужно будет ему путь пройти :)

Re: Эффективность функции?Работа с 16 бит числом.Atmega16.

Пн авг 20, 2018 16:40:02

А зачем обязательно делать 1023? Не проще ли сделать 999 или 1999 ?

Вариант 2: если юзер пытается вылезти за предельное значение, подать звуковой сигнал ошибки, допустим, два коротких "пика" с коротким же интервалом между ними. Или взморгнуть дважды, опять же, быстро, всем числом, или соответствующим знакоместом.

А вообще, подобные ограничения иногда конкретно мешают - попробуйте, например, порулить шириной консольного окна винды. Ладно, перешел на закладку "Расположение" свойств консольного окна, текущая ширина выделена, набирай новую. Набираю, промазал в первую цифру. Естественная реакция - нажать забой и набрать правильную цифру. Ага, щаззз, как говорит молодёжь! Винда не дает забить эту цифру, ширина не может быть нулевой. С матюгами берешь мышь в правую руку...
Последний раз редактировалось afz Вт авг 21, 2018 02:36:40, всего редактировалось 1 раз.

Re: Эффективность функции?Работа с 16 бит числом.Atmega16.

Пн авг 20, 2018 16:57:28

Да, кстати. Бывают приложения под ББ, в которых нужно вводить числовое значение в текстбоксы. При этом, прога ограничивает его определённым диапазоном, пытаясь "помочь" юзеру, меняя значения при неправильном вводе. Очень хочется в глаза разрабу посмотреть в этот момент, выразив ему "благодарность". Думаешь, ну неужели нельзя было пропарсить строку после жмака на баттон "ОК" ? Что мешало ?
И тут также. Пользователя явно будет раздражать эта медвежья услуга . К гадалке не ходи.
Вот для ввода какого-нибудь секретного кода, или цифровой комбинации - самое то. Но не для параметров с ограничениями.

Re: Эффективность функции?Работа с 16 бит числом.Atmega16.

Вт авг 21, 2018 05:16:35

Ост последняя фича. При удержании клавиши прибавлять\убавлять переменную пока не отпустят кнопку.
Раньше делал это путем проверки отпускания кнопки в цикле while(). Но тут так делать нельзя , т.к этим повешам динамичесскую индикацию. какие есть еще способы ?


Как делал обычно :
помещал в
case BTN_LONG_UP:
следующий код.
Код:
while((!(PINA&BTN_LINE_UP))&(TimeToStartPW < 59999))
{
    TimeToStartPW++;
    _delay_ms(100);
}


ласт код на данный момент.

Re: Эффективность функции?Работа с 16 бит числом.Atmega16.

Вт авг 21, 2018 05:31:16

а кто тебе мешает проверять кнопку регулярно после обновления экрана.
набралось некоторое число в служебном подсчетчике - добавил переменную, можно опрашивать и пореже, например, после зажигания только первого разряда

Re: Эффективность функции?Работа с 16 бит числом.Atmega16.

Вт авг 21, 2018 05:58:05

Все кнопки и проверяются регулярно. в функции BtnExe (void)

Re: Эффективность функции?Работа с 16 бит числом.Atmega16.

Вт авг 21, 2018 06:58:24

про кнопки: с компа увидел... (а вопрос тогда в чем?)
_________________
по 0 и 1 таймерам: TCNT0 =120; и TCNT1=65505; это както... почитай про режим СТС (если это мега 8 - то вместо 0 таймера посмотри в сторону 2 таймера).

Re: Эффективность функции?Работа с 16 бит числом.Atmega16.

Вт авг 21, 2018 07:45:07

с кнопками пока что не получается адекватно реализовать след.действие:
При длительном нажатии кнопки(удержании) должен производиться инкремент переменной с задержкойв 100-200 ms и это действие должно продолжаться до тех пор пока не отпустят кнопку.
Вот и получается не задача если я это действие делаю через цикл пока() то вешается вся программа. ((

то есть как щас происходит:
Обрабатываем кнопку
Получаем флаг длинного нажатия

Пока(Кнопка нажата и переменная не достигла макс значения)
{
Производим инкремент.
ждем(100ms)
}

и вот это пока() можно сказать вешает всю программу. т.к индикация выводится по spi через регистры.

Вот и не дам мысли какой тут еще можно алгоритм применить, в данный момент пытаюсь сделать через флаги(разрешения\запрета) в основном теле программы. Результаты пока не ок (.

Re: Эффективность функции?Работа с 16 бит числом.Atmega16.

Вт авг 21, 2018 07:58:47

алгоритм всегда должен быть один и тот же: если надо ждать, то не циклом, а флагом.
то есть в момент, когда вы обнаружили, что надо начать отсчет интервала времени, превышающего допустимую величину (незаметную), вам нужно запустить программный таймер, который установит флажок. при помощи простого if вы контролируете этот флажок и просто делаете в нужный момент то, что необходимо.

Добавлено after 7 minutes 27 seconds:
я всегда стараюсь автоповтор кнопок делать внутри функции, возвращающей код кнопки.
например, делаю функцию get_command(), которая возвращает код команды, т.е. что надо сделать. для редактирования чисел это может быть CMD_UP_1, CMD_UP_10, CMD_UP_100, CMD_DN_1 и т.д. разумеется, есть и CMD_NONE для ситуации "не делать ничего" (т.е. кнопка не нажата).
функция, естественно, в главном цикле вызывается периодически, так что для отсчета интервалов времени можно просто вести подсчет её вызовов. то есть внутри этой функции заводится static-счетчик входов, и мы получаем отличный способ возвращать код команды CMD_UP_1 при первом нажатии, CMD_UP_10 при удержании более 1 секунды и CMD_UP_100, если кнопку держат более 5 секунд.
естественно, возвращать эти команды надо не чаще 1 раза в 100-300 мс, поэтому заводим еще один счетчик и возвращаем CMD_NONE, если этот счетчик не истек, а если истек - см. ранее.

Re: Эффективность функции?Работа с 16 бит числом.Atmega16.

Вт авг 21, 2018 08:27:06

Чёт какие то сложности у вас, ребята.
Дин. индикация есть ? А значит есть периодические вызовы в прерывании. Что мешает засунуть туда обработку кнопок ? А там, хоть короткие нажатия, хоть длинные считай ...

PS: И ещё не понятно, как цикл while() в основном цикле может повесить индикацию, находящуюся в прерывании ? Какие то сказки ...

Re: Эффективность функции?Работа с 16 бит числом.Atmega16.

Вт авг 21, 2018 09:22:51

XD, чет я и вправду гдето загнался )))
Поместил

while((!(PINA&BTN_LINE_UP))&(TimeToStartPW < 59999))
{
if (BtLongTime == 0)
{
TimeToStartPW++;
BtLongTime=10;
}
BtLongTime=CountToNULL(BtLongTime);
}


в обработчик кнопок(InputMaskUpdate(uint16_t InputOne,uint16_t InputTwo,uint16_t InputThree))
и в case BTN_LONG_UP:

И все вроде заработало ))). Щас проведу некоторые тесты.

фулл код на данный момент:


Добавлено after 2 minutes 47 seconds:
Тут не большой косяк с временной задержкой ща ченить исправлю ))

Добавлено after 29 minutes 52 seconds:
Подход выше не работает все таки )

Сделал на флагах вродевсе робит. Правдо не знаю на сколько это коректно.

В основном теле программы:
Код:
if((!(PINA&BTN_LINE_UP))&&(TimeToStartPW < 59999)&&FlagLongBT)
{

   if(FlagEnableIncrement)
   {
      TimeToStartPW++;
      FlagEnableIncrement=0;
   }
         
} else FlagLongBT=0;


FlagLongBT - активируется в обработчике. в case BTN_LONG_UP:
FlagEnableIncrement - активируется в прерывании

щас попробую превизять вторую кнопку минус и наверно сделать это функцией т.к есть 4 переменные с которыми может происходить данное действие.

Re: Эффективность функции?Работа с 16 бит числом.Atmega16.

Вт авг 21, 2018 09:30:29

странно... (не вижу никаких сложностей)
просто в своей функции, если кнопка нажата и счетчик досчитал - делай дело и сбрасывай счетчик (он потом опять досчитает - так и будет цикличность)

Re: Эффективность функции?Работа с 16 бит числом.Atmega16.

Вт авг 21, 2018 10:34:56

Всем спасибо за советы ) к чему то прислушался чего то не понял , но главное сделал.
Код:
void UpdlngBt()
{
   if (FlagLongBT)
   {
      if((!(PINA&BTN_LINE_UP))||(!(PINA&BTN_LINE_DN)))
      {
         if(!(PINA&BTN_LINE_UP))
         {
            if (FlagEnableIncrement)
            {
               switch(TimerActive)
               {
                  case 1:TimeToStartPW++;break;
                  case 2:TimeToStopPW++;break;
                  case 3:TimeOW++;break;
                  case 4:TimeReturn++;break;
               }
               FlagEnableIncrement=0;
            }
         }
         if(!(PINA&BTN_LINE_DN))
         {
            if (FlagEnableIncrement)
            {
               switch(TimerActive)
               {
                  case 1:TimeToStartPW--;break;
                  case 2:TimeToStopPW--;break;
                  case 3:TimeOW--;break;
                  case 4:TimeReturn--;break;
               }
               FlagEnableIncrement=0;
            }
         }
      }else FlagLongBT=0;
   }
}


Теперь настало время причесать фул код ))
Ответить