СИ или Ардуино, кнопка без фиксации

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 15
Зарегистрирован: Вт июн 14, 2016 22:31:59

Сообщение Andrejkarklinjsh »

Приветствую.
Есть программа (действующая) для Ардуино (на крайняк можно просто на Си, но для меня наличие digitalRead иже с ними - спасение: нет ни времени ни мозгов учиться обрабатывать биты операциями над байтами), обрабатывает нажатые кнопки. Блок схему пробую прикрепить. Все кнопки, кроме одной, с фиксацией, поэтому логика работы элементарная - пока кнопка нажата выполняется соответсвующий блок. Но одна кнопка без фиксации. Хочется (требуется), чтобы при кратковременном нажатии этой кнопки бесконечно выполнялся соответсвующий ей блок кода, при повторном нажатии - выход в void loop(). "Перекопипэйстил" (ну с "разбором полетов" - попыток адапции под мои нужды) кучу вариантов из серии "Работа с кнопками на Ардуино", но беда в том, что все они ориентированы на включние-выключние светодиода и логика, работающая для этого, не работает в моей программе потому что включение-выключения светодиода обеспечивается просто входом или не входом в соответсвующую часть кода, а мне надо, чтобы.... Блин, пишу и очередной раз понимаю, что, как раз таки, должно работать и в моем случае, но никак не получается у меня.
В общем, вот код (фрагменты, относящиеся к вопросу), работающий на кнопке с фиксацией, помогите, плиз, сделать из него для "БЕЗ фиксации".

.....
const int SHOW = 8; // SHOW это та самая кнопка, "сидит" на 8-ом пине
......
pinMode(SHOW, INPUT_PULLUP);

void loop ()

{

if (digitalRead (SHOW) == 0)
{
здесь - код, выполняемый при нажатой кнопке SHOW
............
............
}
}
Вложения
Sahulik blok shema.JPG
(118.01 КБ) 224 скачивания
Реклама
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Вы и сами понимаете, что у вас сейчас каша в голове. Потому, абстрагируемся от кода, пишем ТЗ. Что за устройство, что оно должно делать. Расписать все действия, которое выполняет устройство. Составляем алгоритм. От высокого к низкому. Устройство-модули-подмодули-низовой уровень.
В вашем случае нужна псевдопараллельность процессов. А это требует умственных усилий.
Контактная информация:
Реклама
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Сообщение Dimon456 »

Код
Спойлер

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

int ledPin = 13;
int ledPin_2 = 12;

volatile char flag = 0;                // флаг состояния
#define flag_0 0
#define flag_1 1

const int SHOW = 8; // SHOW это та самая кнопка, "сидит" на 8-ом пине

 
void setup()
 { // put your setup code here, to run once:

pinMode(SHOW, INPUT_PULLUP); 

pinMode(ledPin, OUTPUT);
pinMode(ledPin_2, OUTPUT);

 }

void loop()
 { // put your main code here, to run repeatedly:


 if(digitalRead(SHOW) == HIGH && ((flag & (1<<(flag_0))) == 0))      
    {                                              
      flag |= (1<<(flag_0));
      flag ^= (1<<(flag_1));
    }
  
  if(digitalRead(SHOW) == LOW && ((flag & (1<<(flag_0))) != 0))
    {
      flag &= (~(1<<(flag_0)));
    }  
       
   if((flag & (1<<(flag_1))) == 0)
      {
      digitalWrite(ledPin, !digitalRead(ledPin)); // эту строку можно удалить и связанный сней светодиод
      
      // здесь выполняется один код 
      // опрос остальных кнопок поместить сюда
      // либо тут так называемый "выход в void loop()" 
      
      }
      
      
   if((flag & (1<<(flag_1))) != 0)
      {
      digitalWrite(ledPin_2, !digitalRead(ledPin_2)); // эту строку можно удалить и связанный сней светодиод
      
      // здесь выполняется другой код     
      // или сюда "опрос остальных кнопок поместить сюда"
      // либо тут так называемый "выход в void loop()"
      
      }  
  
 }
Аппаратный способ подавления дребезга кнопки
Родился
Сообщения: 15
Зарегистрирован: Вт июн 14, 2016 22:31:59

Сообщение Andrejkarklinjsh »

Большое Вам спасибо за код (сам дико занят, поэтому понимаю, что значит взять и вот так написать для кого-то вдруг), пока еще не разбирал, но постараюсь извлечь урок.
Реклама
Эиком - электронные компоненты и радиодетали
Ответить

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