Карма: 67
Рейтинг сообщений: 1066
Зарегистрирован: Чт сен 18, 2008 12:27:21 Сообщений: 20013 Откуда: Столица Мира Санкт-Петербург
Рейтинг сообщения:0 Медали: 1
shads писал(а):
Подключение через INT0 или INT1
О, у меня так: 2 кнопки повесил на внешние прерывания. Но вопрос не об этом.
А что если для различения одиночного/длинного нажатия использовать постоянно крутящийся таймер со временем переполнения ≈256 мс? И считать сколько раз он перпеполнился пока нажата кнопка. Плюс в том, что он будет настроен всего 1 раз в начале проги. Минус — погрешность 256 мс если его не обнулять.
_________________ [ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ] Измерить нннада?
Карма: 67
Рейтинг сообщений: 1066
Зарегистрирован: Чт сен 18, 2008 12:27:21 Сообщений: 20013 Откуда: Столица Мира Санкт-Петербург
Рейтинг сообщения:0 Медали: 1
Вот только как понять что кнопку не отпустили на долю секунды? А что её именно постоянно держали?
_________________ [ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ] Измерить нннада?
Карма: 67
Рейтинг сообщений: 1066
Зарегистрирован: Чт сен 18, 2008 12:27:21 Сообщений: 20013 Откуда: Столица Мира Санкт-Петербург
Рейтинг сообщения:0 Медали: 1
В том-то и дело, не хотел я выходить из обработчика прерывания пока таймер крутится (не переполнился). Нехорошо, конечно, висеть в прерывании. Но мне и спешить-то некуда
_________________ [ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ] Измерить нннада?
Если не выходишь из прерывания, то можно и обычные задержки использовать, по милисекундам накручивать в цикле и как насчитаешь 2000мс - выполнять функцию. Один фиг работа программы будет остановлена.
В том-то и дело, не хотел я выходить из обработчика прерывания пока таймер крутится (не переполнился). Нехорошо, конечно, висеть в прерывании. Но мне и спешить-то некуда
В теле обработчика сбрасываем флаг переполнения нужного таймера, далее организовать бесконечный цикл проверки флага переполнения таймера и при установке флага увеличивать счетчик переполнений, проверяем количество переполнений и если мало, то сбросываем флаг и возвращаемся в цикл проверки флага переполнения, если переполнений хватает, то выходим из прерывания, глушим этот канал INT до тех пор пока кнопка еще в нажатом состоянии, ну или что-то типа того, выполняем нужный код этого события.
Как-то это совсем неправильно и расточительно. Зачем в прерывании задерживаться? По нажатию сбрасываем счетчик, а по отпусканию проверяем сколько насчитал переполнений таймер и выполняем нужную функцию. Но... все это хорошо, а в реальности получим облом из-за дребезга контактов. Если уж гоняем таймер впустую, то пусть там же и опрашивается кнопка. Кнопка нажата? +1 в счетчик, кнопка только что отпущена? проверяем счетчик выполняем нужную функцию и сбрасываем счетчик. Прерывания на копку нужно использовать только тогда когда нужна мгновенная реакция, например защита в станке.
... а по отпусканию проверяем сколько насчитал переполнений таймер и выполняем нужную функцию
Кстати, вот это тоже не правильно, считать нужно во время удержания кнопки, а иначе не понятно, сколько уже продержали, передержали или недодержали, узнаем когда отпустим получается.
Прерывания на копку нужно использовать только тогда когда нужна мгновенная реакция, например защита в станке.
когда-то я уже писал... видимо, пора повторять
прерывания для кнопок - это вообще в подавляющем большинстве случаев глупость. и даже для защиты станка мгновенная реакция (напомню: для скромненького AVR с тактовой частотой 1 МГц время реакции на внешний запрос прерывания составит порядка 16 микросекунд) совершнеео не требуется!
мышечная реакция специально тренированного человека редко превышает 50 миллисекунд, у большинства обычных людей она около 100 миллисекунд и более. время срабатывания реле в станке примерно того же порядка. остановка шпинделя или там еще какой-то движущейся части займет уже секунды...
поэтому по всему добиваться микросекундной реакции на нажатие кнопки совершенно бессмысленно...
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Ну, тогда смотреть на счетчик он будет расти только если кнопка удерживается, иначе он находится в нуле.
А насчет защиты, когда-то показывали по телевизору изобретение некой защиты - не то что шпиндель, а пила останавливается после подачи сигнала настолько быстро что зубья проходят не больше милиметра. Это именно счет идет на микросекунды. Хотя тут конечно микроконтроллеру уже не место, если он вдруг будет находится в обработке другого прерывания за это время пила может оттяпать палец...
Зарегистрирован: Пт май 10, 2013 19:31:50 Сообщений: 12
Рейтинг сообщения:-4
Создал вначале крупную (по-моему) программку с 16 светодиодами не запахало. В итоге дошёл до 2 светиков и 2 кнопок. Не понимаю почему при нажатии и последующем отжатии светодиоды продолжают мигать. Действие ПИНД.1 также не помогло.
Не понимаю почему при нажатии и последующем отжатии светодиоды продолжают мигать. Действие ПИНД.1 также не помогло.
А мне вот непонятно назначение резисторов в вашей схеме (фрагмент). Догадываюсь, что наступил "летний сезон", отопление отрубили, а на улице хоть и май, но не подарок. Видимо Вы решили этими резисторами квартиру погреть. Ну, так они же нарисованные!!! В натуре греть будут, а на экране - нет. Да, для сугрева надо бы и уменьшить номинал на несколько порядков... Для незнакомых с Протеусом поясню, что те стрелки вверх без обозначений - шина питания VCC=+5V. Приятного просмотра...
Зарегистрирован: Пт май 10, 2013 19:31:50 Сообщений: 12
Рейтинг сообщения:-2
Ошибся в схеме, действительно. Сначала дорогой друг хотел послать вас нах_*Й... За ваш прекраснейший ответ. Ибо по существу, ответа как такового не было. В итоге сам нашёл ошибку. Ошибка элементарная, и очень обидная. Неправильно расставил подтягивающие резисторы, ибо в моей схеме выводы ATMEG висят в воздухе при не нажатой кнопке.
Карма: 90
Рейтинг сообщений: 1432
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4599 Откуда: Планета Земля
Рейтинг сообщения:0 Медали: 1
.Lexx. писал(а):
Ибо по существу, ответа как такового не было.
Ответ, как раз и был по существу, если Вы до сих пор не поняли этого. Отсюда Halex и говорил про нагрев, ибо они тупо на питании висят, а не делают подтяжку портов.
ЗЫ: Вовремя Вы свой пост снесли, ещё бы пару минут и ушли бы в БАНьку за оскорбления ...
Только не повторите ее "натюрлих", в смысле - в железе. Если намерены разместить кнопки со стороны + питания - поставьте последовательно токоограничивающие резисторы, а то попалите порты, а я опять виноватым буду, что на это Вам не указал.
Аlex писал(а):
Ответ, как раз и был по существу...
Спасибо за понимание. Ибо, ибо ... (ну как там у Бендера в "12-ти стульях" ... не смог закончить мысль). А если серьёзно, то смысл своих подсказок как раз и вижу не в тупом "тыканье носом", а чтобы спрашивающий сам увидел косяк - это лучше и на дольше запоминается. Вроде получилось... Ну, и, в конце то концов, с праздником нас, РадиоКотов!!! Выше антенны (ИМХО - хвосты) - дальше радиосвязь (ИМХО - "пометим" территорию)!!!
Какое обычно время надо выждать, чтобы гарантировать, что дребезг кнопки закончился?
У меня идея опрашивать миниклавиатуру по прерыванию от таймера. При этом не хочется сильно заморачиваться. Если я поставлю достаточно редкое время опроса (допустим 0,016 с), то не вылезут ли какие-нибудь бяки у этого алгоритма?
То есть может ли длительность дребезга оказаться длиннее 0,016 с?
Спасибо. У меня пока герконовые кнопки от какой-то старой советской вычислительной машины (или станка). Время дребезга вообще как-то нормируется? А то я пробовал измерять количество импульсов, возникающих во время включения и выключения этих герконов, их там попадалось чуть ли не до десяти.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения