Пользуюсь CVAVR, учусь писать программы на языке Си. Надо осуществить задержку после включения устройства и прохождения теста микропроцессора (Attini23132) для нажатия одной или нескольких кнопок поочередно. После нажатия каждой кнопки время задержки должно оставаться прежним. Если ни одна кнопка не нажата за время задержки, должно включиться выполнение программы. Подскажите, пожалуйста, как это можно осуществить или где посмотреть пример применения
После нажатия каждой кнопки время задержки должно оставаться прежним.
Это как ? Первоначальная задержка 5 сек. Нажатие кнопки дает еще 5 сек для нажатия следующей или наоборот нужно уложиться всеми нажатиями в 5 сек ? В любом случае непонятно что тут непонятного. Тикайте таймером, проверяйте нажатия, если таймер оттикал задержку - выполняйте программу.
_________________ "Вся военная пропаганда, все крики, ложь и ненависть исходят от людей, которые на эту войну не пойдут !" / Джордж Оруэлл / "Война - это,когда за интересы других,гибнут совершенно безвинные люди." / Уинстон Черчилль /
Valer5, нарисуй обычный конечный автомат. Системный таймер пусть миллисекунды отсчитывает, а ты, находясь в состоянии, скажем, INITIALIZING, мониторишь, сколько миллисекунд прошло с момента входа в это состояние. Ну и соответствующие решения принимаешь. Если, как тут предположили, это - кодовый замок, все очень просто: в суперлупе ты проверяешь, не нажата ли какая кнопка, если надо - выставляешь флаги (какая нажата, заодно меняя состояние КА на JUSTPRESSED), а потом запускаешь свою машину состояний. В состоянии JUSTPRESSED выставляешь таймер нажатия в текущее значение, проверяешь, верно ли нажата очередная кнопка, и, в зависимости от результата, переходишь в следующее состояние. Условно говоря:
Код:
// ext. #define T_WAIT 5000 // ext. #define T_CLOSE 1000 // ext. uint32_t Tms; ext uint8_t keypressed; ext uint8_t the_code[N]; static uint32_t t_pressed; static uint8_t key_ctr; switch(state){ case JUSTPRESSED: if(t_pressed - Tms > T_WAIT){ // start from zero key_ctr = 0; } t_pressed = Tms; if(keypressed == the_code[key_ctr++]){ if(key_ctr == N){ open(); state = SLEEPING; } // open the lock else state = SLEEPING; }else state = SLEEPING; break; default: if(Tms - t_pressed > T_CLOSE) close(); // close the lock break; }
_________________ Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
После нажатия каждой кнопки время задержки должно оставаться прежним.
Это как ? Первоначальная задержка 5 сек. Нажатие кнопки дает еще 5 сек для нажатия следующей или наоборот нужно уложиться всеми нажатиями в 5 сек ? В любом случае непонятно что тут непонятного. Тикайте таймером, проверяйте нажатия, если таймер оттикал задержку - выполняйте программу.
Я имел в виду, что после каждого нажатия кнопки общее время задержки увеличится на то время, через которое произошло нажатие. Это не кодовый замок, а что такое конечный автомат, извините, не знаю! потом посмотрю.
Все равно подробнее. Пусть у нас задержка 30 секунд. В течении этих 30 секунд скажем, 5 секунд прошло, нажали кнопку, добавилось 5 секунд? Что за устройство. Зачем то, что вы просите?
Пользуюсь CVAVR, учусь писать программы на языке Си. Надо осуществить задержку после включения устройства
Если я правильно понял, то задержку можно организовать например с помощью таймер-счётчика… при старте МК поднимаете флаг, назовём его произвольно "ПАУЗА" и контролируете его сброс. При каждом нажатии любой кнопки таймер-счётчик (или его счётная переменная) обнуляется и счёт начинается сначала… если кнопки не нажимать, то таймер-счётчик (или его счётная переменная) переполняются что приводит к сбросу флага ПАУЗА… вот как только данный флаг сбросился значит можно выполнять требуемую программу… в Си ничего не понимаю, потому пример на Си показать не могу…
Алгоритм похож или на кодовый замок или на начальный конфигуратор устройства. Для кодового замка еще нормально, а вот для ввода начальных параметров при первом запуске - к примеру запуск RTC или первичное внесение параметров в "пустую" ЕЕПРОМ такой подход не есть удачный. Там достаточно одной "волшебной кнопы" (перемычки) для активации программы ввода параметров, аналогичной обычным обработчикам кнопок/индикации устройства.
...Подскажите, пожалуйста, как это можно осуществить или где посмотреть пример применения
учитесь мыслить в 3d - т.е. никогда не используйте подход прямых задержек в циклах, если только это не простая программа типо хэллоу ворд. старайтесь использовать прерывания (которые собственно либо реализованы аппаратно либо прерывают ход основной программы на некий маленький временной квант), либо представляйте ваш код как НЕ вытесняющая многозадачность (если нет осей поддерживающих параллелизм) - т.е. в большом лупе некой подпрограмме отдаётся квант времени, который она должна (опираясь на внутренне сохранённом состоянии) делать очередное действие и сразу (не используя всякие глупые лупы-циклы) отдавать управление вызывающей программе - return.
Всем спасибо. Написал простой кусок программы и не понимаю, почему она не работает. 1.назначил переменную K1, в прерывании таймера T0 -k1++, таймер работает с частотой 32 Гц, в инициации таймера запретил прерывания, назначил выход PORTD.5 входом с подтяжкой, на него повесил кнопку "sec". Далее в main, wail, запускаю прерывание и проверяю замыкание кнопки.
Считаю, что за 20 периодов дребезг закончится, с запасом считаю короткое нажатие 50мс и увеличиваю переменную sec. Давлее проверяю не отпустится ли кнопка за 150 тактов (длинное нажатие) и в этом случае увеличиваю K1 на 10. Выключаю прерывание и жду отпускания кнопки. При проверке в Протеусе получается ерунда. В чём дело?
Пять раз прочитал пост, но какой требуется алгоритм так и не понял…
Версия для поиграть в протеусе… на выводе РD5 кнопка (коммутирует GND)… на выводе РD3 и PD4 светодиоды… светодиод PD3 сигнализирует о нажатии кнопки, а светодиод на выводе PD4 загорается если в течении 5 секунд кнопка не нажималась… если периодически нажимать на кнопку с интервалом менее 5 сек, то светодиод на выводе PD4 не загорается… МК тактируется на заводских установках (1 МГц)…
Доброе время всем. Всё ещё мучаюсь сам и не даю покоя сообществу. Написал часть программы, обрабатывающей нажатие кнопки, длительность которого определяет интервал времени для дальнейшей программы. Пытаюсь писать на Си, компилирую в CVAVR. проверяю в Протеус. Контроллер Attiny2313, при нажатии кнопки на PA0 запускаю таймер1, по отпусканию считываю содержание счётчика в bufer и далее определяю длительность нажатия. Параллельно кнопке (для определённости) включил транзистор, управляемй генератором импульсов и их периодом.
пока (кнопка_нажата) если (кнопка_не_нажата) если (кнопка_нажата)
Ну как бы что-то тут не то в логике. Вам же вроде как показывали же ранее. Логика должна работать так:
Код:
если (кнопка_нажата) если (перед_этим_она_была_отпущена) выполнить_действие и установить состояние Кнопка_нажата выйти из проверки иначе установить состояние Кнопка_отпущена
То есть, ключевое слово "перед этим", предыдущее состояние кнопки. Предудущее состояние должно сохраняться в отдельной переменной статического типа. В исходном состоянии в момент запуска эта переменная должна содержать состояние "не нажата". И тогда при срабатывании условия проверки текущего состояния кнопки, в случае, если она сейчас нажата, проверяется уже предыдущее состояние "а до этого она была нажата?". То есть, нужно получить именно изменение состояния.
Последний раз редактировалось MLX90640 Чт дек 01, 2022 16:25:16, всего редактировалось 2 раз(а).
Наверняка в Протеусе в пошаговом исполнении, потому как в реальном времени в железе это навряд ли будет работать. Возможно, из-за дребезга контактов что-то будет срабатывать в условиях железа..
Наверняка в Протеусе в пошаговом исполнении, потому как в реальном времени в железе это навряд ли будет работать. Возможно, из-за дребезга контактов что-то будет срабатывать в условиях железа..
MLX90640, а почему в реальном железе не должно работать, исключая дребезг контактов?
А, пардон, у вас "нетрадиционное" выравнивание текста, оное сбивает с толку. Но всё равно, это довольно скользкий путь, из-за дребезга контактов почти стопудово будут ложные срабатывания в железе. Вот типичное поведение pull-up кнопки при нажатии (слева) и отпускании (справа):
Ну что.. У вас, Valer5, появился отличный шанс понять, как именно надо работать с аппаратурой. То бишь, с железом. Поменьше читать (обзоры и чужие мнения) и побольше думать (своей головой). То, что вы написали, не работает и никогда работать не будет. "Железо" никогда не работает так, как пишут в учебниках. Истина простая, только программеры этого 'просто' не понимают. При работе реальной аппаратуры всегда происходит нечто, что портит все графики. Это - лишние импульсы, уплывание порогов по времени и/или уровню, банальый шум и помехи. Всё это надо учитывать. К чему я? Симуляция в Протеус - это симуляция. А "жизнь" - это не симуляция. К слову, никогда даже мысли небыло что-то симулировать в Протеус и прочем. И это при обширном опыте использования PSPICE. Как-нибудь погуглите, что это за фигня. В нём я симулирую только аналоговые и "полу-аналоговые" схемы, т.к. практически проверено, что этот симулятор практически никогда не ошибается. И это экономит время и деньги. Впрочем, это off. Учитывайте реальные свойства аппаратуры, отталкивайтесь от них. Если у вас входным является "кнопка", значит берите ее свойства - время переключения, время дребезга замыкания, время дребезга размыкания. Ваш алгоритм работы обязан. Так, вы не поймете, еще раз. Ваш алгоритм работы обязан учитывать все особенности работы вашей аппаратуры. Конечно, вы можете спросить "помощь зала" и ничему не учиться, воля ваша. Вот только ... я здесь вижу свалку мыслей, приведшею к паталогически неправильному решению. Смысл таких рекомендаций от меня ускользает. Ну, автор темы оказался настолько глухой, что-бы что-то слышать. Ну, как-бы, решения не наблюдается, как и даже попытки по нему пойти.
Перепишите алгоритм. Нет, этот можно только выкинуть, жуть на жути. Напишите новый алгорим, который учитывал тот _факт_, что реальная кнопка имеет дребезг. Уточнение - я правильно понял, что MCU 'стоит и ждет', сколько времени будет удерживаться кнопка, и после отпускания начинает работать остальная программа? Я правильно понял?
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения