Подскажите пожалуйста. В бесконечном цикле есть if(PINC.4==1){break;}; Как сделать, чтобы эта команда выполнилась, если единица на порту присутствует более 500 ms или на крайняк 1000 ms. Если плюс присутствует меньше данного времени , то if не выполнялась. Задержка нужна для того, что на данный порт подключено будет реле, которое будет срабатывать с опозданием, после подачи несущей с модуляцией с микроконтроллера. Использования задержки delay не подходит, так как на СИ для atmega 8 написана программа несущих частот на таймере Т1 и в бесконечном цикле, программно, частоты модуляции и есть вывод информации на LCD. На таймере Т0 написана секунда, так как в программе нужен отсчёт времени.
Последний раз редактировалось Alex_ka Сб июл 08, 2023 18:58:23, всего редактировалось 1 раз.
unsigned char sekunda_proshla = 0; // флаг, показывающий, что секунда прошла .... if(PINC.4== sekunda_proshla){break;} .... где-то в обработке таймера T0:
sekunda_proshla = 1;
есть лишь один нюанс: надо быть уверенным, что при сбросе значения регистров таймера T0 гарантируют, что пройдет секунда, что они не теневые или что в них что-то не записывается при инициализации.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
порт проверять не бесконечном цикле, а когда прошла секунда. если порт равен 1, поставить флаг. через еще секунду опять проверить порт. если на порту осталась единица И установлен флаг, выполнить действие.
_________________ Мудрость приходит вместе с импотенцией... Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Добавлено after 4 hours 2 minutes 27 seconds: Подумал и решил пойти иным путём. Так как мне нужно только, чтобы задержка контроля порта происходила только после запуска генераторов частот, а не постоянно висела, буду вводить ещё одну переменную секунды, которая будет считать одну секунду и обнулятся и в этом бесконечном цикле уберу контроль состояния порта, а введу команду если выше указанная переменная ровна единице, остановить этот бесконечный цикл и перейти к следующему, где будет if(PINC.4==1){break;}; Попробую так, посмотрю, что протеус покажет.
Замечу, что у наиболее достоверного контроля порта должна быть буферизация для программы. Работа с внешним прерыванием это позволяет сделать без дополнительных аппаратных затрат. В ином случае есть риск, что до момента if(PINC.4){break;} много раз PINC.4 изменит состояние. Впрочем, если его состояние необходимо только на момент проверки, тогда ок.
Я понял о чём речь. Но у меня в бесконечном нет команды delay, которая тормозит цикл и цикл работает на скорости тактовой частоты. Мне кажется, что в таком случае контроль состояния порта выше, чем делать постоянный опрос через таймер. Проверил в протеусе, задержка пашет и отвал моментальный если на порту С4 разорвать ноль. Можно пробовать в железо переносить.
внешнее прерывание - не есть опрос вообще, тем более через таймер. это некий триггер, который сработает именно тогда, когда произойдет внешнее событие. Микроконтроллер при этом вообще может спать (при условии, что у него есть функция проснуться по внешнему прерыванию) или делать какие-то иные задачи. Моментальным будет только если изменение состояния порта по времени дольше, чем пробег всего цикла. К тому же, Вы там говорили, что у Вас таймер работает и есть вывод информации на LCD. Это означает, что главный цикл вовсе не такой быстрый, как выглядит - часть времени отводится на обслуживание таймера и этого вывода. Так что, далеко не равно тактовой частоте.
Встроить в цикл счетчик "условных енотов", который будет менять значение (в "условных енотах") при каждом опросе линии ввода данных. При достижении заданного количества - выход из цикла.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 25
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения