Ви не увійшли.

Я Вас понял сразу и правильно ( писал в AVRstudio  ) поэтому и задал вопрос. Зачем в основном теле программы while. Я сторонник тело это скелет, и всякие while и прочее "скелету" не нужны. В теле должно быть только  проверка надо ли выполнять ту или иную процедуру (функцию) исходя из результатов других процедур. Поэтому while у меня нет, за исключением в setup жду готовности Serial. Убеждался не один раз, это источник сплошного тормоза, плюс работа с "собакой", ну вообщем этот цикл почти почти всегда можно обойти, при этом скорость выполнения программы только выигрывает.
 ) поэтому и задал вопрос. Зачем в основном теле программы while. Я сторонник тело это скелет, и всякие while и прочее "скелету" не нужны. В теле должно быть только  проверка надо ли выполнять ту или иную процедуру (функцию) исходя из результатов других процедур. Поэтому while у меня нет, за исключением в setup жду готовности Serial. Убеждался не один раз, это источник сплошного тормоза, плюс работа с "собакой", ну вообщем этот цикл почти почти всегда можно обойти, при этом скорость выполнения программы только выигрывает.
Неактивний

vvr, всем стоять, работает программист ) ya_serega, осваивает Си после асма
ну и начал соответственно с jnc и иных goto ) пусть развлекается, вам жалко? он просто обязан пройти все велосипеды
угу , не пинайте меня слишком  я же говорил что пока просто пробую различные варианты решения в данном случае конкретной задачи ( придуманной мной просто так - для ознакомления с языком ) . пока использую разные функции и операторы для решения одной и той же задачи , плавно переходя к построению алгоритмов программы . пока не сильно понимаю как можно организовывать циклы без условных и безусловных переходов (( наподобие
 я же говорил что пока просто пробую различные варианты решения в данном случае конкретной задачи ( придуманной мной просто так - для ознакомления с языком ) . пока использую разные функции и операторы для решения одной и той же задачи , плавно переходя к построению алгоритмов программы . пока не сильно понимаю как можно организовывать циклы без условных и безусловных переходов (( наподобие 
call метка
..
..
..
метка 
..
..
 цикл с условным переходом ( btfss бит
                                           return  )
..
..
  goto метка 
и чем while отличается от вышеописанной конструкции - ведь внутри можно написать кучу вариантов выхода из этого цикла а после узнать почему именно прошел break и дальше по if ... else организовать реакцию ? .. хотя наверное есть более простое решение ))))
Неактивний

я кнопку всегда делаю так -
в прерывании , по нажатию,  запускаю таймер на время дребезга,
по завершению времени проверяю нажата или нет
т.е. пока идет дребезг контакта у меня сдвигается время принятия решения 
если кнопка нажата - выставлю в переменной статуса указанную кнопку 
а в рабочем цикле проверю свой статус прерываний кнопок, 
когда кнопку обработал удаляю из статуса 
просто как топор
но есть момент, рабочий цикл не более 100 мс
что б не было заметна задержка  на нажатие ), да и нет у меня таких  
алгоритмов что б на долго удерживали  систему в паузе
в принципе возьмите за основу -
всегда работать со статусами, что бы в ПО никогда не было больших задержек  в функциях
пример - настройка модема 
практически все примеры 
отправляют запрос и тут же ожидают ответ 
т.е. если время ожидания 10 сек  то ПО будет висеть до 10 секунд ожидая ответ
и есть есть кнопки и индикатор они уже обрабатываться не будут
Неактивний

Не жирно ли, прерывание?
loop()
{
  delay(1);
  if (KeyExe())
    counter++;
}
bool KeyExe()
{
  static bool key_pressed;
  static uint8_t debounce_timer;
  
  if (key_pressed != !digitalRead(KEY)) {
    key_pressed = !key_pressed;
    debounce_timer = DEBOUNCE_TIME;
  }
  else if (debounce_timer && !--debounce_timer && key_pressed)
    return true;
  return false;
}Неактивний

ах , да   
 
забыл сказать что что я могу на любую ногу настроить прерывание ))
как говорится - обзавидуйтесь
каюсь за 15 лет забыл   что такое бывает ))))
Большинство плат Arduino/Freeduino имеют два внешних прерывания с номерами 0 (на digital pin 2) и 1 (на digital pin 3). Arduino Mega имеет дополнительно ещё четыре:
с номерами 2 (pin 21), 3 (pin 20), 4 (pin 19) и 5 (pin 18).
http://robocraft.ru/blog/arduino/45.html
да, в ардуино использовать прерывания - жирновато ), но для обучения "самэ то" )
add
Green, пример хорош )
Остання редакція NoName (2016-04-20 14:28:12)
Неактивний

ах , да

...да, в ардуино использовать прерывания - жирновато ), но для обучения "самэ то" )
Естественный отбор, однако.((
Кроме того что не всегда можно, но и не всегда удобно. А 2-е, а 4-е, а комбинацИя, а автоповтор, а...?
Неактивний

Не жирно ли, прерывание?
loop() { delay(1); if (KeyExe()) counter++; } bool KeyExe() { static bool key_pressed; static uint8_t debounce_timer; if (key_pressed != !digitalRead(KEY)) { key_pressed = !key_pressed; debounce_timer = DEBOUNCE_TIME; } else if (debounce_timer && !--debounce_timer && key_pressed) return true; return false; }
А чего те прерывания жалеть? Кнопка по любому это пин, если это не аналоговая клава (типа шильда). NoName написал прерывания можно настроить на любую ногу ( правда если точно то не на все, и они имеют ограничения), и под ARDUINO я видел по крайней мере две библиотеки.
Неактивний

Nefreemen, неправильно, я имел в виду что я использую не атмел
а в ардуино их действительно мало, и жестко привязаны к ногам (
Да нет, смотрим даташит ATMEL и понимаем что прерываний значительно больше нежели те о которых идет речь  . И есть библиотеки которые позволяют их юзать.
 . И есть библиотеки которые позволяют их юзать.
Неактивний

Начинающему расскажите. А лучше покажите. На пальцах.))
Я например не знаю какая ардуино у Вас. Поэтому посмотрите даташит ( это самое лучше ) или установите например из под ардуино иде библиотеку по прерываниям , посмотрите примеры, прочтите рид. Одним словом практически в каждом порту есть регистры которые отвечают за прерывание на определенных пинах. Если Вы посмотрите картинки пинов ардуино то увидите например PCINT, это значит что на этот пин в библиотеке можно включить прерывание.
Неактивний

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

Доброго времени суток!
Просьба помочь с программкой. В наличие Ардуино Уно, шилд LCD с кнопками (LEFT, RIGHT, UP, DOWN, RESET, SELECT). 4-х релейный шилд. Это надо для коммутации элементов антенны. Там на А0 кнопки завязаны через резисторы. Управление мне удалось победить. На экране отображается (NORD V) при нажатии UP, (SOUTH /\) при нажатии DOWN и т. д., показывая направление антенны и включая соответствующие реле, подключённые на пин D13, D12, D11 и D3. Загвоздка в том, что я хочу кнопкой SELECT вызывать другой алгоритм работы релюшек. Это получилось. А вот двойное нажатие этой кнопки - другой алгоритм. Тут-то и затык. Не знаю, как красиво и недорого оформить скетч с обработкой одиночного и двойного нажатия на кнопку. Хоть ещё одну вешай, но уже к цифровым пинам.((( Если можно, помогите, детали и гонорар обсудим.

#include "ky.h"
static uint8_t key;
void keyExe()
{
  static bool key_pressed;
  static uint8_t debounce_timer;
  typedef enum {SHORT, LONG } state_t;
  static state_t state;
  static uint8_t click_counter;
  if (key_pressed != get_key()) {       //change
    key_pressed = !key_pressed;
    debounce_timer = ms2sys(DEBOUNCE_TIME);
    state = SHORT;
  }
  else if (debounce_timer)              
    debounce_timer--;
  else if (key_pressed) {
    if (state == SHORT) {               //short pressed
      if (++click_counter >= MAX_SHORT_CLICK)
        click_counter = MAX_SHORT_CLICK;
      debounce_timer = ms2sys(LONG_CLICK_TIME - DEBOUNCE_TIME);
      state = LONG;
    }
    else if (state == LONG) {           //long pressed
      #ifdef REPEAT_BIT
      key = 1<<KEY_BIT | 1<<REPEAT_BIT;
      #else
      key = 1<<KEY_BIT;
      #endif
      debounce_timer = ms2sys(AUTOREPEAT_PERIOD);
      click_counter = 0;
    }
  }
  else if (state == SHORT) {            //release after short click
    debounce_timer = ms2sys(DELIMITER_TIME);
    state = LONG;
  }
  else {                                //release after DELIMITER_TIME
    key = click_counter;                //get key code
    click_counter = 0;
  }
}Неактивний

И я, и я, и я того же мнения ...
/* button reading with debounce filtering */
#define BUTTON_PIN		0
#define RELEASE_TIME	69
#define BUTTON_PRESSED	LOW
bool buttonPressed(void)
{
	static unsigned long timeout	= 0;
	static unsigned long old_time	= 0; 
	bool result;
	
	unsigned long new_time = millis();
	if (digitalRead(BUTTON_PIN) == BUTTON_PRESSED)
	{
		timeout = RELEASE_TIME;
		return true;
	}
	else 
		if (timeout = 0) result = false;
		else
			if (new_time - old_time > timeout)
			{
				timeout -= new_time - old_time;
				result = true;
			}
			else 
				{
					timeout = 0;
					result = false;
				}
	old_time = new_time;
	return result;
}Неактивний

я тоже писал для себя обработчики нажатия кнопок, пользовался чужими обработчиками и разными библиотеками - в результате 
в 80% случаев применяю OneButton, в ней реализованы наверное все варианты нажатий и меня она полностью устраивает.
но это дело вкуса.
с проф. программистами спорить не буду)))))
Неактивний

... в 80% случаев применяю OneButton, в ней реализованы наверное все варианты нажатий и меня она полностью устраивает. но это дело вкуса. с проф. программистами спорить не буду)))))
Это дело не вкуса но науки, хотя приятно когда и гайки красивые. Наверно, все возможные варианты не всегда нужны. Вот еще один любительский Button, из любви к искусству. https://github.com/slavaza/SuperButton Это сейчас любители такие пошли, Линуксы пишут, от нечего делать.
Неактивний

Вячеслав, библиотека это красиво, конечно. Особенно для одной кнопки.) А если их несколько? И ещё нужны их сочетания? И не везде Ардуино нужна... И даже вообще не AVR... Да и компилятор может плюсы не поддерживать... Да и места мало зачастую... ) Да и Линус плюсы терпеть не может (я ни на кого не намекаю).)))
Остання редакція Green (2019-04-11 18:13:07)
Неактивний

Просто нужно знать где эти плюсы вставлять. А хороший встраиваемый драйвер кнопочной клавиатуры нигде просто так не валяется. Если вам нужна клавиатура для быстрого ввода, с возможностью нажатия двух переходных клавиш, а не только клавиш модификаторов, то лучше просто купить стандартную, профессиональную.
Неактивний

Вячеслав, вы прикалываетесь? Какая ещё профессиональная клавиатура! Я ж вроде популярно объяснил.) У меня Си без плюсов, без зависимостей от окружения и железа. И мне не надо думать где эти плюсы брать и куда их вставлять!
Неактивний