Проблема в локальной переменной buttonState. При включении оптимизации, компилятор начинает игнорировать ее и, соответственно swith не отрабатывает. Подскажите, как побороть?
Последний раз редактировалось Land Вс ноя 06, 2022 12:51:28, всего редактировалось 1 раз.
только в одном случае: если перед switch сработало прерывание и за время обработки прерывания изменилось состояние порта. Если это так, то используйте volatile как указание компилятору не трогать переменную. Если нет - то пишите изначально логичный код без лишних переменных
[code] используйте volatile как указание компилятору не трогать переменную.
пробовал. Не проходит фокус. Ну и само-собой, флаг выставляется в обработчике прерывания. АП. А, рекомендуете вообще выбросить эту переменную. Логично, спасибо.
Уже пройденный этап. Ни в том ни в том варианте не работает. просто swith (PINB^0x07) тоже не работает. Проблема не в самом коде, на уровне комплиляции для дебаггинга все работает корректно. Трабл вылезает при включении оптимизации О3
А может проблема в программисте, который использует XOR для проверки состояния бита? ?
Угу. Именно из-за этого переменная игнорируется компилятором. Мне, само-собой, до такого уровня программиста, как до бога.
Воистину, задай вопрос на русском форуме и тебе быстро объяснят, какой ты мудак. Вынес переменную в глобальные, все заработало. Но непонятки и осадочек остался. тема ЗАКРЫТА.
Дак там, вероятно, проблема не в игнорировании переменной, а в том, что после XOR с состоянием входов всего порта ее значение не соответствует ни одному из вариантов case. Достаточно, чтобы хотябы один из входов порта, не относящийся к кнопкам, изменился, и после XOR число уже будет совсем другим. Таблица истинности XOR - впомощь! Обычно делают не через XOR, а через AND: state = PORT & 0x07. Или сразу в switch(PORT & 0x07). Таблица истинности AND гласит, что все биты вне единичной маски обнуляются. А значит, число, поступившее на switch, будет в диапазоне 0 - 7 при любом раскладе. В варианте с XOR при значении 1 напрмер в 5-м бите, на switch уже поступит число в диапазоне 32- 39. И включение оптимизации тут наверно просто чисто случайно приводит к такому эффекту на входе порта. У автора эта тема "закрыта" ровно до следующего случайного (или неслучайного) совпадения обстоятельств.
--- PS --- Автору нужно в swhtch после всех case дописать default: с каким-либо действием, типа зажигания контрольного светодиода, чтобы визуально было видно, когда значение в switch не попадает ни в один вариант case и тогда будет выполнен вариант default, что и будет сигнализировать о работе switch как таковом.
Последний раз редактировалось MLX90640 Вс ноя 06, 2022 13:49:12, всего редактировалось 1 раз.
TIMER_1 слишком жирно использовать для опроса кнопок, клавиатуры. Я использую этот таймер для более важных вещей. О своих подходах я рассказывал (конечные автоматы, программные таймеры), если сложно, можно упростить.
Совет первый. Никаких магических чисел. Сразу прописываем входы и выходы. Это полезно тем, что библиотечки можно таскать из проекта в проект, меняя определения в одном месте, а не по всему проекту. Также, плюс предлагаемого примера - кнопки могут быть разбросаны по разным портам. В scan_keys все кнопки упаковываются в одной переменной, над которой уже совершать разные действия.
Demiurg, Ваш код для отслеживания другими слишком "запутан" (+ г. транслейт) . Личное мнение. Спойлернапр.: #define check_key_1() (!(check_bit (KEY_1_PIN, KEY_1))) // Low level. | #define check_key_2() (!(check_bit (KEY_2_PIN, KEY_2))) // Low level. |- Общий плюс. #define check_key_3() (!(check_bit (KEY_3_PIN, KEY_3))) // Low level. | ... void scan_keys (void) { curr_keys = 0;
if (check_key_1()) set_bit (curr_keys, 0);
if (check_key_2()) set_bit (curr_keys, 1);
if (check_key_3()) set_bit (curr_keys, 2); } С одной общей проверкой и одним общим решением действия код будет короче, по крайней мере, как программа. Если взять "зашифровать" скан (напр. в одно число) и проверить действие напр. по байтам, то может уместиться в несколько строк.
Последний раз редактировалось veso74 Вс ноя 06, 2022 18:25:27, всего редактировалось 3 раз(а).
Добавлено after 8 minutes 23 seconds: veso74 специально для тебя повторяю. Плюс такого подхода в том, что входы могут быть разбросаны по разным портам. Давай, покажи, что у тебя короче. При этом условии.
Последний раз редактировалось Demiurg Вс ноя 06, 2022 18:35:29, всего редактировалось 1 раз.
В варианте с XOR при значении 1 например в 5-м бите...
XOR - это побитная инверсия. Единица разряда маски инвертирует (ноль не инвертирует) этот разряд во втором операнде. Ну или наоборот. Такшта наш ТС тупо инвертирует три младших разряда, не маскируя в ноль ничего.
Не говорю: менять код. Просто высказываю свое мнение: смотрю на код 1..2..30 сек ... и закрываю страницу. Легче написать новое сравнение на случай, если мне нужно будет что-то изменить в Вашем коде. С етими #define -> const -> функции "одина в другой" сложно для внешнего пользователя. Но если это для Вас, как привыкли, то нормально - ничего не меняйте и не слушайте внешние "раздражители" . (+транслейт)
Предметно и конструктивно. Критикуешь, предложи альтернативу. Как сам видишь.
Я вижу, что установка единицы проверкой единицы в большинстве случаев лишнее действие. А ещё вижу, что предлагать свои частные решения для общих случаев, притом, когда их не спрашивают - это не нужно. У меня вот вообще нет какого-то универсального подхода к кнопкам, потому что сегодня они висят на шине дисплея, завтра мк всё время спит и кнопки будят его как внешнее прерывание, послезавтра что-то ещё. Кроме того, мне не составляет труда активно работать и с железом, и если есть возможность, то повесить кучу кнопок на один порт, например. И тогда нафига эти "если кнопка 1 нажата, то поставим в переменной бит 1", когда я могу просто глянуть состояние порта? А ещё может нехватить ног и тогда начнет работать ацп, расширитель портов или ещё какая идея, например, отказаться от кнопок В общем, всё - субъективно.
Если что - то моя специальность: "старший электрик по ремонту и хранению стратегических ракет", плотник и оператор строительно-монтажного пистолета ПЦ-84
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 21
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения