Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Модератор форума: demanik, ivan_fd  
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Распознавание времени удержания кнопки
Распознавание времени удержания кнопки
RN3AQW Дата: Вт, 23.04.2013, 12:44  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Новенький
Сообщений: 6
Репутация: 0   ±
Замечания:   ±
На сайте с 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
Все работает, но сейчас необходимо примерно то же, но с прерыванием от кнопки. Данная прога сбоит, видимо из-за пауз в теле. Пробовал на прерывании ставить только адрессацию на эту программу, но все равно результата не принесло...

Как-то так с возможными вариациями в протоне.

Подскажите пожалуйста, где не прав, или может быть как-то по другому можно сделать более оптимизированно?
Прикрепления: UDBUT.rar (43.2 Kb)

Сообщение отредактировал RN3AQW - Вт, 23.04.2013, 12:45
ЯНДЕКС Дата: 23.04.2013
ivan_fd Дата: Вт, 23.04.2013, 15:05  |                                                                                                                Сообщение # 2
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Нажимаете кнопку, в таймере увеличиваете переменную. В цикле ждете пока кнопка не отпуститься, и по том, что насчитали, делаем дальнейшие выводы.
RN3AQW Дата: Вт, 23.04.2013, 17:22  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Новенький
Сообщений: 6
Репутация: 0   ±
Замечания:   ±
На сайте с 18.03.2013

Статус: Offline

Прошу прощения за может быть очевидные вопросы, но надеюсь потом не только мне пригодится...
Так вот как это совместить с внешним прерыванием по INT или например по другому порту, на каком шаге выходить из прерывания, когда лучше сбрасывать флаг. И какой целесообразней использовать таймер, что бы считать например до 10 секунд? 
Буду очень признателен если будет возможность вставить пример...
ivan_fd Дата: Вт, 23.04.2013, 17:35  |                                                                                                                Сообщение # 4
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Объясните, зачем Вам внешнее прерывание, что оно будет делать?
dimitriy-bc Дата: Вт, 23.04.2013, 18:36  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 150
Репутация: 1   ±
Замечания:   ±
На сайте с 19.03.2012

Статус: Offline

Скорее всего ivan_fd, предлагал Вам следующий алгоритм.
Допустим, таймер1 с предделителем настраиваете на одну секунду.
В основной  программе опрашиваете понравившийся Вам порт. При нажатии кнопки, разрешается работа таймер1. При каждом переполнении, добавляем единицу в переменную Х. При отпускании кнопки опрашиваем переменную Х. Число Х, соответствует количеству полных секунд нажатия кнопки.

Сообщение отредактировал dimitriy-bc - Вт, 23.04.2013, 18:42
RN3AQW Дата: Вт, 23.04.2013, 19:25  |                                                                                                                Сообщение # 6
Группа: Проверенные
Ранг:  Новенький
Сообщений: 6
Репутация: 0   ±
Замечания:   ±
На сайте с 18.03.2013

Статус: Offline

Цитата (ivan_fd)
Объясните, зачем Вам внешнее прерывание, что оно будет делать?
В первом посте я приложил полностью проект. Идея такая, плавное включение и выключение подсветки для аквариума. Управление по 2 каналам: 1 - это от таймера (если на входе 1 - включение, 0 - выключение); 2 - кнопка (при обычном нажатии происходит смена состояния включение или выключение с ШИМ, при длитльном удержании моментальное включение или выключение без ШИМ). Вход от таймера у меня проверяется каждый цикл в ШИМе и в основной программе, а кнопку решил повесить на прерывание, что бы не загромождать ШИМ, да и мне кажется так будет проще и понятней, если правильно построить работу с прерыванием...
ivan_fd Дата: Вт, 23.04.2013, 22:38  |                                                                                                                Сообщение # 7
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Вот, когда Вы описали, теперь более менее понятно, что Вам нужно.

Сделайте ШИМ в прерывании, а кнопки в основном цикле. Тогда ничего ничему не будет мешать.
Так будет правильнее.
RN3AQW Дата: Вт, 23.04.2013, 23:02  |                                                                                                                Сообщение # 8
Группа: Проверенные
Ранг:  Новенький
Сообщений: 6
Репутация: 0   ±
Замечания:   ±
На сайте с 18.03.2013

Статус: Offline

Так у меня ШИМ на 5-7 минут растянут, и предусмотрен режим смены состояния при плавном включении или выключении...
ivan_fd Дата: Вт, 23.04.2013, 23:11  |                                                                                                                Сообщение # 9
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Какая разница на сколько растянут ШИМ (как я понял смена ШИМ). В прерывании вы генерируете сам ШИМ сигнал, а не его длительность.
А уже плавная смена его может быть, хоть 20 мин.
Форум Picbasic.ru » Программирование МК » Proton PicBasic » Распознавание времени удержания кнопки
  • Страница 1 из 1
  • 1
Поиск: