Обсуждаем контроллеры компании Atmel.
Пн авг 20, 2018 13:27:28
я делал вообще не совсем так. при поразрядном редактировании было бы странно, если бы при числе 1023 при попытке изменить третий разряд мы получали 1024.
Конечно странно, а у кого так работает? У меня будет 1023 какой разряд не меняй, при одной проверке.
Пн авг 20, 2018 14:35:45
Не менее странно, когда при макс. значении в 5000 и текущем 4800, при редактировании старшего разряда, устройство будет игнорировать кнопку "Up". Или вообще перескакивать на "0". Юзер может встать в ступор
Палка о двух концах...
Пн авг 20, 2018 14:49:45
Не менее странно, когда при макс. значении в 5000 и текущем 4800, при редактировании старшего разряда, устройство будет игнорировать кнопку "Up". Или вообще перескакивать на "0". Юзер может встать в ступор
А чем старший разряд отличается от всех остальных? Юзер дойдет до 9 на младшем и впадет в ступор
Пн авг 20, 2018 15:06:57
Фраза "Юзер может встать в ступор" предназначалась для первой половины поста, просто так нелогично всё склеилось
Представляю, если пользователь не будет знать максимального значения, какой нужно будет ему путь пройти
Пн авг 20, 2018 16:40:02
А зачем обязательно делать 1023? Не проще ли сделать 999 или 1999 ?
Вариант 2: если юзер пытается вылезти за предельное значение, подать звуковой сигнал ошибки, допустим, два коротких "пика" с коротким же интервалом между ними. Или взморгнуть дважды, опять же, быстро, всем числом, или соответствующим знакоместом.
А вообще, подобные ограничения иногда конкретно мешают - попробуйте, например, порулить шириной консольного окна винды. Ладно, перешел на закладку "Расположение" свойств консольного окна, текущая ширина выделена, набирай новую. Набираю, промазал в первую цифру. Естественная реакция - нажать забой и набрать правильную цифру. Ага, щаззз, как говорит молодёжь! Винда
не дает забить эту цифру, ширина не может быть нулевой. С матюгами берешь мышь в правую руку...
Последний раз редактировалось
afz Вт авг 21, 2018 02:36:40, всего редактировалось 1 раз.
Пн авг 20, 2018 16:57:28
Да, кстати. Бывают приложения под ББ, в которых нужно вводить числовое значение в текстбоксы. При этом, прога ограничивает его определённым диапазоном, пытаясь "помочь" юзеру, меняя значения при неправильном вводе. Очень хочется в глаза разрабу посмотреть в этот момент, выразив ему "благодарность". Думаешь, ну неужели нельзя было пропарсить строку после жмака на баттон "ОК" ? Что мешало ?
И тут также. Пользователя явно будет раздражать эта медвежья услуга . К гадалке не ходи.
Вот для ввода какого-нибудь секретного кода, или цифровой комбинации - самое то. Но не для параметров с ограничениями.
Вт авг 21, 2018 05:16:35
Ост последняя фича. При удержании клавиши прибавлять\убавлять переменную пока не отпустят кнопку.
Раньше делал это путем проверки отпускания кнопки в цикле while(). Но тут так делать нельзя , т.к этим повешам динамичесскую индикацию. какие есть еще способы ?
Как делал обычно :
помещал в
case BTN_LONG_UP: следующий код.
- Код:
while((!(PINA&BTN_LINE_UP))&(TimeToStartPW < 59999))
{
TimeToStartPW++;
_delay_ms(100);
}
ласт код на данный момент.
Вт авг 21, 2018 05:31:16
а кто тебе мешает проверять кнопку регулярно после обновления экрана.
набралось некоторое число в служебном подсчетчике - добавил переменную, можно опрашивать и пореже, например, после зажигания только первого разряда
Вт авг 21, 2018 05:58:05
Все кнопки и проверяются регулярно. в функции BtnExe (void)
Вт авг 21, 2018 06:58:24
про кнопки: с компа увидел... (а вопрос тогда в чем?)
_________________
по 0 и 1 таймерам: TCNT0 =120; и TCNT1=65505; это както... почитай про режим СТС (если это мега 8 - то вместо 0 таймера посмотри в сторону 2 таймера).
Вт авг 21, 2018 07:45:07
с кнопками пока что не получается адекватно реализовать след.действие:
При длительном нажатии кнопки(удержании) должен производиться инкремент переменной с задержкойв 100-200 ms и это действие должно продолжаться до тех пор пока не отпустят кнопку.
Вот и получается не задача если я это действие делаю через цикл пока() то вешается вся программа. ((
то есть как щас происходит:
Обрабатываем кнопку
Получаем флаг длинного нажатия
Пока(Кнопка нажата и переменная не достигла макс значения)
{
Производим инкремент.
ждем(100ms)
}
и вот это пока() можно сказать вешает всю программу. т.к индикация выводится по spi через регистры.
Вот и не дам мысли какой тут еще можно алгоритм применить, в данный момент пытаюсь сделать через флаги(разрешения\запрета) в основном теле программы. Результаты пока не ок (.
Вт авг 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, если этот счетчик не истек, а если истек - см. ранее.
Вт авг 21, 2018 08:27:06
Чёт какие то сложности у вас, ребята.
Дин. индикация есть ? А значит есть периодические вызовы в прерывании. Что мешает засунуть туда обработку кнопок ? А там, хоть короткие нажатия, хоть длинные считай ...
PS: И ещё не понятно, как цикл while() в основном цикле может повесить индикацию, находящуюся в прерывании ? Какие то сказки ...
Вт авг 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 переменные с которыми может происходить данное действие.
Вт авг 21, 2018 09:30:29
странно... (не вижу никаких сложностей)
просто в своей функции, если кнопка нажата и счетчик досчитал - делай дело и сбрасывай счетчик (он потом опять досчитает - так и будет цикличность)
Вт авг 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;
}
}
Теперь настало время причесать фул код ))
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.