Ви не увійшли.
Я Вас понял сразу и правильно ( писал в AVRstudio ) поэтому и задал вопрос. Зачем в основном теле программы 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)
Неактивний
Просто нужно знать где эти плюсы вставлять. А хороший встраиваемый драйвер кнопочной клавиатуры нигде просто так не валяется. Если вам нужна клавиатура для быстрого ввода, с возможностью нажатия двух переходных клавиш, а не только клавиш модификаторов, то лучше просто купить стандартную, профессиональную.
Неактивний
Вячеслав, вы прикалываетесь? Какая ещё профессиональная клавиатура! Я ж вроде популярно объяснил.) У меня Си без плюсов, без зависимостей от окружения и железа. И мне не надо думать где эти плюсы брать и куда их вставлять!
Неактивний