Как реализовать контроль порта с задержкой времени
Подскажите пожалуйста. В бесконечном цикле есть if(PINC.4==1){break;}; Как сделать, чтобы эта команда выполнилась, если единица на порту присутствует более 500 ms или на крайняк 1000 ms. Если плюс присутствует меньше данного времени , то if не выполнялась. Задержка нужна для того, что на данный порт подключено будет реле, которое будет срабатывать с опозданием, после подачи несущей с модуляцией с микроконтроллера. Использования задержки delay не подходит, так как на СИ для atmega 8 написана программа несущих частот на таймере Т1 и в бесконечном цикле, программно, частоты модуляции и есть вывод информации на LCD. На таймере Т0 написана секунда, так как в программе нужен отсчёт времени.
Последний раз редактировалось Alex_ka Сб июл 08, 2023 18:58:23, всего редактировалось 1 раз.
- Реклама
- Сообщения: 12867
- Зарегистрирован: Сб дек 18, 2021 19:25:32
напишите на таймере Т0 полсекунды.
Так меня и задержка в секунду устраивает. Но не могу сообразить, как её реализовать на данном порту.
- Сообщения: 12867
- Зарегистрирован: Сб дек 18, 2021 19:25:32
Код: Выделить всё
unsigned char sekunda_proshla = 0; // флаг, показывающий, что секунда прошла
....
if(PINC.4== sekunda_proshla){break;}
....
где-то в обработке таймера T0:
sekunda_proshla = 1;Так при такой команде как написано, меня отправит в брек, а не станет контролировать наличие нуля на данном порту.
Последний раз редактировалось Alex_ka Сб июл 08, 2023 19:10:54, всего редактировалось 1 раз.
- Реклама
порт проверять не бесконечном цикле, а когда прошла секунда. если порт равен 1, поставить флаг. через еще секунду опять проверить порт. если на порту осталась единица И установлен флаг, выполнить действие.Alex_ka писал(а):На таймере Т0 написана секунда
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Не получается у меня не в бесконечном цикле. Мне надо постоянный контроль за отвалом реле в случае отказа проверяемого блока.
- Сообщения: 12867
- Зарегистрирован: Сб дек 18, 2021 19:25:32
а, про порт проглядел...
Тогда надо настроить обработку внешнего прерывания на порт, если сработало - проверить, что там с sekunda_proshla
Тогда надо настроить обработку внешнего прерывания на порт, если сработало - проверить, что там с sekunda_proshla
В принципе над этим можно подумать.
Добавлено after 4 hours 2 minutes 27 seconds:
Подумал и решил пойти иным путём. Так как мне нужно только, чтобы задержка контроля порта происходила только после запуска генераторов частот, а не постоянно висела, буду вводить ещё одну переменную секунды, которая будет считать одну секунду и обнулятся и в этом бесконечном цикле уберу контроль состояния порта, а введу команду если выше указанная переменная ровна единице, остановить этот бесконечный цикл и перейти к следующему, где будет if(PINC.4==1){break;}; Попробую так, посмотрю, что протеус покажет.
Добавлено after 4 hours 2 minutes 27 seconds:
Подумал и решил пойти иным путём. Так как мне нужно только, чтобы задержка контроля порта происходила только после запуска генераторов частот, а не постоянно висела, буду вводить ещё одну переменную секунды, которая будет считать одну секунду и обнулятся и в этом бесконечном цикле уберу контроль состояния порта, а введу команду если выше указанная переменная ровна единице, остановить этот бесконечный цикл и перейти к следующему, где будет if(PINC.4==1){break;}; Попробую так, посмотрю, что протеус покажет.
- Сообщения: 12867
- Зарегистрирован: Сб дек 18, 2021 19:25:32
Замечу, что у наиболее достоверного контроля порта должна быть буферизация для программы. Работа с внешним прерыванием это позволяет сделать без дополнительных аппаратных затрат. В ином случае есть риск, что до момента if(PINC.4){break;} много раз PINC.4 изменит состояние. Впрочем, если его состояние необходимо только на момент проверки, тогда ок.
Я понял о чём речь. Но у меня в бесконечном нет команды delay, которая тормозит цикл и цикл работает на скорости тактовой частоты. Мне кажется, что в таком случае контроль состояния порта выше, чем делать постоянный опрос через таймер. Проверил в протеусе, задержка пашет и отвал моментальный если на порту С4 разорвать ноль. Можно пробовать в железо переносить.
- Сообщения: 12867
- Зарегистрирован: Сб дек 18, 2021 19:25:32
внешнее прерывание - не есть опрос вообще, тем более через таймер. это некий триггер, который сработает именно тогда, когда произойдет внешнее событие. Микроконтроллер при этом вообще может спать (при условии, что у него есть функция проснуться по внешнему прерыванию) или делать какие-то иные задачи.
Моментальным будет только если изменение состояния порта по времени дольше, чем пробег всего цикла. К тому же, Вы там говорили, что у Вас таймер работает и есть вывод информации на LCD. Это означает, что главный цикл вовсе не такой быстрый, как выглядит - часть времени отводится на обслуживание таймера и этого вывода. Так что, далеко не равно тактовой частоте.
Моментальным будет только если изменение состояния порта по времени дольше, чем пробег всего цикла. К тому же, Вы там говорили, что у Вас таймер работает и есть вывод информации на LCD. Это означает, что главный цикл вовсе не такой быстрый, как выглядит - часть времени отводится на обслуживание таймера и этого вывода. Так что, далеко не равно тактовой частоте.
Если не в используемом IDE, напишите функцию по timer0/timer2 для текущего времени через 1 ms (как напр. millis(), get_ticks() ... ).
Программа в основном цикле при нормальной работе будет замедляться на: время на чтение состояния одного вывода и на присвоение 0 одной переменной.
Код: Выделить всё
if (PINC.4 == 1) {
if (start == 0) {
start = 1;
t = get_ticks();
}
else
if ((t - get_tick()) > 1000) { // 1 s
start = 0;
break;
}
}
else
start = 0;Встроить в цикл счетчик "условных енотов", который будет менять значение (в "условных енотах") при каждом опросе линии ввода данных. При достижении заданного количества - выход из цикла.



