roboforum.ru

Технический форум по робототехнике.
Текущее время: 02 июн 2025, 23:09

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: Смена действий по удержанию кнопки
СообщениеДобавлено: 25 апр 2014, 21:21 
Не в сети
Аватара пользователя

Зарегистрирован: 17 июн 2007, 23:44
Сообщения: 565
Откуда: Тула
прог. языки: Bascom AVR Basic, CodeVisionAVR
ФИО: Замотаев Кирилл Игоревич
Ребят, нужна небольшая подмога.
Пишу программу в CVAVR. И ни как не могу допереть до момента одного. Есть три режима и кнопка без фиксации. Изначально при включение девайса, работает 1 режим. при нажатие на кнопку и отпускание ее включается второй режим, при нажатие еще раз, возвращается предыдущий режим. А вот при удержание этой клавиши должен включаться 3 трежим, после его включения клавишу нужно отпустить, но при это режим не должен смениться. Помоги те добить эту часть

кусок того что я написал.

Код:

interrupt [TIM0_OVF] void timer0_ovf_isr(void) {   
                                                if (Strobe==0&&buttonPushed==0) { //если нажата первый раз
                                                                                 buttonPushed=1; //фиксируем, что уже нажали   
                                                }                                           
                                                if (Strobe==1&&buttonPushed==1) { //если было нажато и отпустили
                                                                                 if (task==0) { //если тыкнули первый раз
                                                                                               button=1;
                                                                                               ++task; //готовы выполнять следующее действие
                                                                                 }
                                                                                  else if (task==1){ //делаем следующее
                                                                                                    button=0;
                                                                                                    task=0;
                                                                                  }
                                                                                                    buttonPushed=0; //фиксируем, что уже не нажато
                                                } 
}

_________________
https://vk.com/ledscale - платы, vk.com/ledscale3dprintig - 3Д печать\моделирование, vk.com/ledrenovation- ремонт светодиодных источников света


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Смена действий по удержанию кнопки
СообщениеДобавлено: 25 апр 2014, 23:49 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
я бы в прерывании только считал время нажатия кнопки в условных единицах и писал в переменную. и ставить признак-флаг "отпущена".

а анализ и выбор действий в основном цикле неспеша делать.

_________________
Читайте !


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Смена действий по удержанию кнопки
СообщениеДобавлено: 25 апр 2014, 23:56 
Не в сети
Аватара пользователя

Зарегистрирован: 17 июн 2007, 23:44
Сообщения: 565
Откуда: Тула
прог. языки: Bascom AVR Basic, CodeVisionAVR
ФИО: Замотаев Кирилл Игоревич
дык мне надо чтобы основной цикл выполнял определенное действие с определенными переменными. А все остальное происходило именно в прерывание, чтобы эти переменные можно было менять в процессе работы основного цикла.
Банально пример. В основном цикле моргает светодиод один раз в секунду. А из прерывания меняю переменную задержки допустим вместо секунды на пол секунды. И пока меняю эту переменную светодиод все чаще и чаще начинает моргать пока уменьшаю задержку до 0.5с

Добавлено спустя 49 секунд:
avr123.nm.ru писал(а):
я бы в прерывании только считал время нажатия


а как это время нажатия зафиксировать в прерывание, можешь написать??

_________________
https://vk.com/ledscale - платы, vk.com/ledscale3dprintig - 3Д печать\моделирование, vk.com/ledrenovation- ремонт светодиодных источников света


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Смена действий по удержанию кнопки
СообщениеДобавлено: 26 апр 2014, 00:19 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
Если это прерывание только для кнопки и происходит каждые 15-30 мс то

Код:
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{   
if(кнопка нажата)
{ длительность нажатия ++;
   кнопка отпущена = 0;
}
else { кнопка отпущена = 1; }
}


а в основном цикле

Код:
if(кнопка нажата){
   if (длительность нажатия > то что считается "долго"){
           длительность нажатия = 0;

          флаг_нажата_долго = 1  или делать то что надо при долгом }

      else if (кнопка отпущена) { кнопка отпущена = 0; // обнулить флаг отпускания кн.
        тут посчитать проанализ который раз нажата кнопка. и делать действия
                                }
                   }


возможно будет работать.

_________________
Читайте !


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Смена действий по удержанию кнопки
СообщениеДобавлено: 26 апр 2014, 12:03 
Не в сети
Аватара пользователя

Зарегистрирован: 17 июн 2007, 23:44
Сообщения: 565
Откуда: Тула
прог. языки: Bascom AVR Basic, CodeVisionAVR
ФИО: Замотаев Кирилл Игоревич
avr123.nm.ru писал(а):
Если это прерывание только для кнопки и происходит каждые 15-30 мс то

Код:
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{   
if(кнопка нажата)
{ длительность нажатия ++;
   кнопка отпущена = 0;
}
else { кнопка отпущена = 1; }
}


а в основном цикле

Код:
if(кнопка нажата){
   if (длительность нажатия > то что считается "долго"){
           длительность нажатия = 0;

          флаг_нажата_долго = 1  или делать то что надо при долгом }

      else if (кнопка отпущена) { кнопка отпущена = 0; // обнулить флаг отпускания кн.
        тут посчитать проанализ который раз нажата кнопка. и делать действия
                                }
                   }


возможно будет работать.


ну на половину получилосб. теперь при удержание срабатывает третье действие, но как только отпускаю кнопку срабатывает первое действие. И как этот момент блокировать не сообразил пока

Код:
interrupt [TIM0_OVF] void timer0_ovf_isr(void) {   
if (Strobe==0&&buttonPushed==0) { //если нажата первый раз
buttonPushed=1; //фиксируем, что уже нажали
}                                           
if (Strobe==1&&buttonPushed==1) { //если было нажато и отпустили
if (task==0) { //если тыкнули первый раз
button=1; ++task; //готовы выполнять следующее действие
}
else if (task==1){ //делаем следующее
button=0;task=0;         
}  buttonPushed=0; //фиксируем, что уже не нажато   
}
if (Strobe==0) { //если нажали кнопку
if (button==1) {
ButtonTimer++; if (ButtonTimer>5000)  { ЕСЛИ УДЕРЖИВАЕМ КНОПКУ ПОКА НЕ ВЫПОЛНИТСЯ УСЛОВИЕ
ButtonTimer=0;button=2;  //делаем дела

_________________
https://vk.com/ledscale - платы, vk.com/ledscale3dprintig - 3Д печать\моделирование, vk.com/ledrenovation- ремонт светодиодных источников света


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Смена действий по удержанию кнопки
СообщениеДобавлено: 02 май 2014, 22:27 
Не в сети
Аватара пользователя

Зарегистрирован: 10 дек 2010, 13:16
Сообщения: 4995
Откуда: Красногорск МО
прог. языки: C, Python, wiring/processing
ФИО: Андрей
Тебе надо почитать, что такое конечный автомат: http://ru.wikipedia.org/wiki/%D0%9A%D0% ... 0%B0%D1%82
Дальше рисуешь простенькую схему состояний, у тебя будет два входных сигнала - состояние кнопки и состояние счетчика. типа:
1. Ожидание. Ничего не делаем.
сигнал1: нажата кнопка, переходим в состояние 2, включаем таймер
2. Работает таймер, ждем, пока отпустят кнопку
сигнал1: отпустили кнопку, при этом таймер ниже порога "короткого нажатия", выполняем действие по "короткому" нажатию, переходим в состояние 1
сигнал2: таймер перевалил порог "короткого нажатия", переходим в состояние 3
3. Выполняем (в цикле) действие при длительном удержании кнопки
сигнал 1: отпустили кнопку. Выполняем (опционально) финальное действие по длинному нажатию и переходим в состояние 1.

Как видишь, если кнопка не отпущена до того, как таймер перетикал за порог, "короткое" действие никогда не выполнится. Тут надо быть осторожным с переполнением таймера, например тормозить его при выходе за порог короткого нажатия. Потому что он нам уже не нужен.

Реализуется это обычно оператором switch по состоянию state. Дальше в каждом case описываешь состояние из своей таблички и все работает!

Добавлено спустя 8 минут 39 секунд:
Код:
static uint8_t state = 0;
switch (state) {
case 1: //idle state
if (buttonPushed = PRESSED) {
state = 2;
ButtonTimer = 0;
startButtonTimer();
}
break;

case 2: //short press area
if (buttonPushed = RELEASED && ButtonTimer < SHORT_THRESHOLD) {
state = 1;
stopButtonTimer();
doShortPress();
} else {
if (buttonPushed = RELEASED && ButtonTimer > SHORT_THRESHOLD) {
state = 3;
stopButtonTimer();
}
break;

case 3: //button is pressed
if (buttonPushed = RELEASED) {
state = 1;
doFinalLongPress();
} else {
if (buttonPushed = PRESSED) {
repeatLongPressTask();
}
break;
}

_________________
Мой волшебник это я сам. Всю архитектуру программы придумал лично, а ребята помогли воплотить её. Я бы и сам мог написать, но лень учить язык и его конструкции.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO