Распознавание времени удержания кнопки
|
|
RN3AQW |
Дата: Вт, 23.04.2013, 12:44 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
6
Замечания:
±
На сайте с 18.03.2013
Статус:
Offline
|
Приветствую всех форумчан! Возник вопрос, как лучше, проще и более оптимизированно (короче золотая середина) организовать измерение времени удержания кнопки. Например: -просто нажатие - переход на 1 подпрограмму; -удержание 2с - один пик и если отпущена кнопка переход на 2 подпрограмму; -если удержание продолжаеся на 4с - 2 пика и если отпущена кнопка переход на 3 подпрограмму; и так далее.
В picBasicPro я накрисовал такую прогу для 5с: Код'---------------- Подпрограмма нажатия кнопки "Выход" ------------------------ loop: for mk = 0 to 10 'Организуем цикл до 5с mk = mk + 1 'считаем сколько была удержана кнопка pause 500 'приращениями по 0,5с if knopka = 1 then compare_MK 'если кнопку удерживали менее 5с, переходим на next 'программу счета и выбора дальнейших действий goto compare_MK 'если удерживали более 5с то переключаемся туда же
compare_MK: 'Программа счета маркера удержания кнопки if mk < 10 && oxr = 0 then open 'Если кнопка была нажата менее 5с и не поставлено на охрану, переход на OPEN if mk < 10 && oxr = 1 then error goto oxrana 'Если более 5с, то на постановку на охрану mk = 0 Все работает, но сейчас необходимо примерно то же, но с прерыванием от кнопки. Данная прога сбоит, видимо из-за пауз в теле. Пробовал на прерывании ставить только адрессацию на эту программу, но все равно результата не принесло...
Как-то так с возможными вариациями в протоне.
Подскажите пожалуйста, где не прав, или может быть как-то по другому можно сделать более оптимизированно?
Сообщение отредактировал
RN3AQW - Вт, 23.04.2013, 12:45
|
|
|
|
ivan_fd |
Дата: Вт, 23.04.2013, 15:05 | Сообщение # 2 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Нажимаете кнопку, в таймере увеличиваете переменную. В цикле ждете пока кнопка не отпуститься, и по том, что насчитали, делаем дальнейшие выводы.
|
|
|
|
RN3AQW |
Дата: Вт, 23.04.2013, 17:22 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
6
Замечания:
±
На сайте с 18.03.2013
Статус:
Offline
|
Прошу прощения за может быть очевидные вопросы, но надеюсь потом не только мне пригодится... Так вот как это совместить с внешним прерыванием по INT или например по другому порту, на каком шаге выходить из прерывания, когда лучше сбрасывать флаг. И какой целесообразней использовать таймер, что бы считать например до 10 секунд? Буду очень признателен если будет возможность вставить пример...
|
|
|
|
ivan_fd |
Дата: Вт, 23.04.2013, 17:35 | Сообщение # 4 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Объясните, зачем Вам внешнее прерывание, что оно будет делать?
|
|
|
|
dimitriy-bc |
Дата: Вт, 23.04.2013, 18:36 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Могу и подсказать
Сообщений:
150
Замечания:
±
На сайте с 19.03.2012
Статус:
Offline
|
Скорее всего ivan_fd, предлагал Вам следующий алгоритм. Допустим, таймер1 с предделителем настраиваете на одну секунду. В основной программе опрашиваете понравившийся Вам порт. При нажатии кнопки, разрешается работа таймер1. При каждом переполнении, добавляем единицу в переменную Х. При отпускании кнопки опрашиваем переменную Х. Число Х, соответствует количеству полных секунд нажатия кнопки.
Сообщение отредактировал
dimitriy-bc - Вт, 23.04.2013, 18:42
|
|
|
|
RN3AQW |
Дата: Вт, 23.04.2013, 19:25 | Сообщение # 6 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
6
Замечания:
±
На сайте с 18.03.2013
Статус:
Offline
|
Цитата (ivan_fd) Объясните, зачем Вам внешнее прерывание, что оно будет делать? В первом посте я приложил полностью проект. Идея такая, плавное включение и выключение подсветки для аквариума. Управление по 2 каналам: 1 - это от таймера (если на входе 1 - включение, 0 - выключение); 2 - кнопка (при обычном нажатии происходит смена состояния включение или выключение с ШИМ, при длитльном удержании моментальное включение или выключение без ШИМ). Вход от таймера у меня проверяется каждый цикл в ШИМе и в основной программе, а кнопку решил повесить на прерывание, что бы не загромождать ШИМ, да и мне кажется так будет проще и понятней, если правильно построить работу с прерыванием...
|
|
|
|
ivan_fd |
Дата: Вт, 23.04.2013, 22:38 | Сообщение # 7 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Вот, когда Вы описали, теперь более менее понятно, что Вам нужно.
Сделайте ШИМ в прерывании, а кнопки в основном цикле. Тогда ничего ничему не будет мешать. Так будет правильнее.
|
|
|
|
RN3AQW |
Дата: Вт, 23.04.2013, 23:02 | Сообщение # 8 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
6
Замечания:
±
На сайте с 18.03.2013
Статус:
Offline
|
Так у меня ШИМ на 5-7 минут растянут, и предусмотрен режим смены состояния при плавном включении или выключении...
|
|
|
|
ivan_fd |
Дата: Вт, 23.04.2013, 23:11 | Сообщение # 9 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Какая разница на сколько растянут ШИМ (как я понял смена ШИМ). В прерывании вы генерируете сам ШИМ сигнал, а не его длительность. А уже плавная смена его может быть, хоть 20 мин.
|
|
|
|