Подскажите пожалуйста. В бесконечном цикле есть 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. Это означает, что главный цикл вовсе не такой быстрый, как выглядит - часть времени отводится на обслуживание таймера и этого вывода. Так что, далеко не равно тактовой частоте.
Встроить в цикл счетчик "условных енотов", который будет менять значение (в "условных енотах") при каждом опросе линии ввода данных. При достижении заданного количества - выход из цикла.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения