Ассемблер (ASM) для AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Обычное короткое нажатие кнопки пальцем - это несколько десятков миллисекунд, реально больше сотни.
Контактная информация:
Реклама
Вымогатель припоя
Сообщения: 615
Зарегистрирован: Вс дек 28, 2014 21:54:05

Сообщение dgrett »

Ну ёмаё, так и фиксируем нажатие по истечении сего времени
Я всё-всё узнAю и стану профессором.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Если нужны только короткие нажатия - так и делаем. Если нужны ещё и длинные или сочетания кнопок - тогда уже отпускание кнопки играет роль.
Просто тут считают, что
akl писал(а):Извините, но вы написали чушь.
, умея каким-то волшебным образом только по факту нажатия кнопки понимать, что это не помеха, а именно короткое нажатие.
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

[uquote="WiseLord",url="/forum/viewtopic.php?p=3289516#p3289516"]Почему же? Как можно по первому моменту, когда на кнопке лог. 1 сменяется нулём, понять, что это короткое нажатие кнопки, а не помеха/дребезг/или пользователь планирует удерживать кнопку более, например, секунды?[/uquote]короткое от длинного начинает отличаться после того, как отработает. выходит, что при любом нажатии отрабатывает "короткое" нажатие, а вот потом, после обнаружения не отпускания кнопки в момент следующего запроса состояния, начинается отсчет интервала удержания и, соответственно, разделение на "долгое", "очень долгое" и т.п. состояние. точно так же, как реализован автоповтор на клавиатуре ПК.

вопрос о дребезге в данном случае не актуален, т.к. он уже должен быть подавлен. в частности, даже при вашем подходе как отличить дребезг при отпускании от отпускания и повторного нажатия? если вы можете это как-то отличать, вы сможете это сделать и при нажатии.
Последний раз редактировалось ARV Пн янв 22, 2018 11:26:52, всего редактировалось 1 раз.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
akl
Друг Кота
Сообщения: 4473
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

WiseLord Спокойнее. Никакого волшебства и шаманства нет. Киньте взгляд на клаву - она обрабатывает всякие нажатия и короткие и длинные и комбинации.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Это да, но компьютерная клавиатура при длинном нажатии кнопки генерирует и короткое, и длинное нажатия.

Если у меня на короткое нажатие повешен, например, Channel_Up, а на длинное - Volume_+, я не хочу, чтобы каналы переключались при попытке регулировки громкости.

Изображение
Контактная информация:
Реклама
akl
Друг Кота
Сообщения: 4473
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Судя по надписям на вашей картинке - решаемо.
Открыл глаза
Сообщения: 55
Зарегистрирован: Вс май 03, 2015 15:05:58

Сообщение Feruz »

На всякий случай напомню, что насовсем избавиться от дребезга помогает RS триггер и SPDT кнопка. Делал у себя в конструкции для надёжного разделения длинных и коротких нажатий.
Встал на лапы
Сообщения: 106
Зарегистрирован: Чт сен 10, 2015 06:59:03
Откуда: Гродно, BY

Сообщение trofim2 »

А можно вообще все сделать на ЛА3
Это не хвост, это антенна
Сообщения: 1495
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Ага, лишние корпуса, лишнее место на плате. Не спорю, паять для кого-то хобби и бешеной собаке семь верст не крюк...
Контактная информация:
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич

Сообщение Alexeyslav »

При условии что триггер работает быстрее чем кнопка. Благо это условие выполняется всегда с механическими кнопками, а с оптическими датчиками не всегда, и могут возникать ситуации запрещенного состояния RS-триггера. А на ещё больших скоростях вообще используют двойные D-триггеры, и то это не всегда спасает... снижает вероятность проникновения "дребезга" со входа на выход до 1 на миллиард. Но это так, уже не про кнопки.

Добавлено after 5 hours 33 minutes 9 seconds:
на короткое нажатие повешен, например, Channel_Up, а на длинное - Volume_+
За такое надо линейкой по рукам...

Совершенно не проблема отслеживать события как нажатия кнопки так и её отпускания, сравнивая с предыдущим состоянием. Но а короткое-длинное-ещёдлинее нажатие ИМХО это пример совершенно ужасного дизайна. Мало того что устройство вынуждено реагировать с задержкой, так ещё поди запомни что и какая кнопка означает. Я вот без инструкции к велокомпьютеру на три кнопки ничего не могу сделать. Там и комбинации одновременного нажатия, и короткое-длинное... просто УЖАС. А подбирать стремно - одна из комбинаций это полный сброс с обнулением.
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Когда кнопок мало, приходится изгаляться.
Alexeyslav писал(а):За такое надо линейкой по рукам...
Кстати, почти все гарнитуры так работают. Да и много где (разного рода плееры) я видел именно такой подход к переключению треков/перемотке файла или переключению/громкости.
Контактная информация:
Встал на лапы
Сообщения: 106
Зарегистрирован: Чт сен 10, 2015 06:59:03
Откуда: Гродно, BY

Сообщение trofim2 »

Нормальное применение кнопок (что бы не загромождать устройство) для функций, не требующих оперативного управления. Правда при этом требует звуковой или оптический сигнал подтверждения короткого (до 1 сек), длинного (2..4 сек) или сверхдлинного (более 5 сек) нажатия.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

в моей практике был случай, когдая "изголнулся" и сделал управление всеми функциями реобаса одной кнопкой: задание порога и гистерезиса регулятора, включение-выключение... причем ввод числовых значений был сделан в обе стороны (уменьшение и увеличение) с ускоренным автоизменением при долгом удержании... мне казалось - я придумал гениальный алгоритм: кратковременное нажатие изменяло значение на 1 и меняло знак изменения на противоположный, а долгое нажатие после небольшой задержки начинало быстро изменять в заданном знаком направлении. логика была у меня такая: увидев, что изменение пошло не в ту сторону, пользователь нажимает кнопку повторно и держит её, пока не "проскочит" на 1 нужное значение (если повезет, то и не проскочит). в случае проскока надо было лишь 1 раз нажать кнопку... То есть можно было изменить температуру от -55 до +125 всего за 3 нажатия кнопки (при небольшой сноровке)...
но этот алгоритм никому не понравился...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

У меня немного другая ситуация. Изначально проект был по сути просто темброблоком с анализом спектра. Хватало кнопок: 1 - включение, 2 - перебор входов звука; 3 - показать/настроить часы; 4 - mute; 5 - перебор параметров для регулировки (громкость, тембры, и т.п.); ну и энкодер для собственно регулировки. Потом проект разросся - появилась поддержка радио (а, значит, появилась нужда в кнопка для переключения треков), таймера, будильника и прочее. И хотелось иметь возможность всем этим управлять не только с пульта ДУ, но и хоть как-то с передней панели. Вот и появились разного рода длительные нажатия.
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2022
Зарегистрирован: Вт фев 09, 2010 02:04:53
Откуда: Санкт-Петербург

Сообщение Гефестион »

Сейчас пытаюсь сделать бегущую строку на матрице 32х8. Ввёл все символы строки в массив, получилось 78 байт (каждый символ 6х8, т.е. занимает 6 байт). Естественно, все символы строки разом не помещаются на индикаторе. Соответственно, надо сначала прочитать элементы массива 0...31, потом 1...32 и т.д. Это всё я сделал на трёх счётчиках: один считает от 0 до 31 синхронно с развёрткой, второй отсчитывает N циклов первого счётчика (задержка) и после этого инкремент третьего счётчика, который считает от 0 до 77. В регистровую пару Z записывается адрес метки массива + состояние первого счётчика + состояние третьего счётчика.

Вопрос вот в чём: как зациклить массив? Очевидно, что когда третий счётчик досчитает до 46 и больше, сумма первого и третьего счётчиков может быть больше 77. В результате в Z оказываются адреса пустых ячеек памяти, в которых 0xFF. А мне надо как-то сделать так, чтобы если сумма счётчиков превысит 77, то началось чтение массива с нуля. В этом случае бегущая строка будет бежать циклически. Не подскажете, как это сделать?
Фак, кот грызёт провод! Сейчас его ударит либо током, либо тапком! ))
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18787
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Гефестион писал(а):мне надо как-то сделать так, чтобы если сумма счётчиков превысит 77, то началось чтение массива с нуля. В этом случае бегущая строка будет бежать циклически. Не подскажете, как это сделать?
так и делайте, как написали: вычисляйте сумму счетчиков на каждой итерации и сравнивайте её с 77
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 15789
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Сообщение BOB51 »

Для побайтовой продвижки массива в ОЗУ предпочтение использованию указателей в X, Y и счетчика итераций с буферным регистром временного хранения.
8)
И предпочтительно разделить операции вывода на индикацию из буфера отображения от модуля обработки продвижки информации в буфере сообщения.
:roll:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2022
Зарегистрирован: Вт фев 09, 2010 02:04:53
Откуда: Санкт-Петербург

Сообщение Гефестион »

[uquote="ARV",url="/forum/viewtopic.php?p=3291380#p3291380"]так и делайте, как написали: вычисляйте сумму счетчиков на каждой итерации и сравнивайте её с 77[/uquote] Я, конечно, сравниваю. Попробовал сделать так: Если сумма этих двух счётчиков больше либо равна 78 (переход по brcc), то устанавливаю флаг в регистре общего назначения, а в той части программы, где прибавляю счётчики к Z, при наличии этого флага вычитаю 78. Таким образом адрес Array + 78 = Array, Array + 79 = Array + 1 и т.д. Чтобы вместо пустого элемента по адресу Array + 78 прочитался снова нулевой элемент массива. Но почему-то не работает :( Может, я вычитаю константу из регистровой пары неправильно? Делаю subi ZL,78 sbci ZH,0

Добавлено after 2 minutes 37 seconds:
[uquote="BOB51",url="/forum/viewtopic.php?p=3291407#p3291407"]Для побайтовой продвижки массива в ОЗУ предпочтение использованию указателей в X, Y и счетчика итераций с буферным регистром временного хранения.
8)
И предпочтительно разделить операции вывода на индикацию из буфера отображения от модуля обработки продвижки информации в буфере сообщения.
:roll:[/uquote]
Я пока что не использую ОЗУ. Читаю прям из флэша и сразу в порт (по прерываниям от таймера)
Т.е. желательно сначала загрузить все 78 байт в ОЗУ, а потом их оттуда читать? А что за буфер сообщения?
Фак, кот грызёт провод! Сейчас его ударит либо током, либо тапком! ))
akl
Друг Кота
Сообщения: 4473
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

[uquote="Гефестион",url="/forum/viewtopic.php?p=3291475#p3291475"]...Делаю subi ZL,78 sbci ZH,0
...Читаю прям из флэша и сразу в порт (по прерываниям от таймера)...[/uquote]Думаю, в этом ошибка. Проще, по мне,

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

LDI ZH,HIGH(ARRAY*2)
LDI ZL,LOW(ARRAY*2)
Ответить

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