Форум РадиоКот https://radiokot.ru/forum/ |
|
Как реализовать контроль порта с задержкой времени https://radiokot.ru/forum/viewtopic.php?f=57&t=189070 |
Страница 1 из 1 |
Автор: | Alex_ka [ Сб июл 08, 2023 18:51:18 ] |
Заголовок сообщения: | Как реализовать контроль порта с задержкой времени |
Подскажите пожалуйста. В бесконечном цикле есть if(PINC.4==1){break;}; Как сделать, чтобы эта команда выполнилась, если единица на порту присутствует более 500 ms или на крайняк 1000 ms. Если плюс присутствует меньше данного времени , то if не выполнялась. Задержка нужна для того, что на данный порт подключено будет реле, которое будет срабатывать с опозданием, после подачи несущей с модуляцией с микроконтроллера. Использования задержки delay не подходит, так как на СИ для atmega 8 написана программа несущих частот на таймере Т1 и в бесконечном цикле, программно, частоты модуляции и есть вывод информации на LCD. На таймере Т0 написана секунда, так как в программе нужен отсчёт времени. |
Автор: | Martian [ Сб июл 08, 2023 18:55:35 ] |
Заголовок сообщения: | Re: Как реализовать контроль порта с задержкой времени |
напишите на таймере Т0 полсекунды. |
Автор: | Alex_ka [ Сб июл 08, 2023 18:56:39 ] |
Заголовок сообщения: | Re: Как реализовать контроль порта с задержкой времени |
Так меня и задержка в секунду устраивает. Но не могу сообразить, как её реализовать на данном порту. |
Автор: | Martian [ Сб июл 08, 2023 19:03:57 ] |
Заголовок сообщения: | Re: Как реализовать контроль порта с задержкой времени |
Код: unsigned char sekunda_proshla = 0; // флаг, показывающий, что секунда прошла .... if(PINC.4== sekunda_proshla){break;} .... где-то в обработке таймера T0: sekunda_proshla = 1; есть лишь один нюанс: надо быть уверенным, что при сбросе значения регистров таймера T0 гарантируют, что пройдет секунда, что они не теневые или что в них что-то не записывается при инициализации. |
Автор: | Alex_ka [ Сб июл 08, 2023 19:10:29 ] |
Заголовок сообщения: | Re: Как реализовать контроль порта с задержкой времени |
Так при такой команде как написано, меня отправит в брек, а не станет контролировать наличие нуля на данном порту. |
Автор: | Starichok51 [ Сб июл 08, 2023 19:10:46 ] |
Заголовок сообщения: | Re: Как реализовать контроль порта с задержкой времени |
Alex_ka писал(а): На таймере Т0 написана секунда порт проверять не бесконечном цикле, а когда прошла секунда. если порт равен 1, поставить флаг. через еще секунду опять проверить порт. если на порту осталась единица И установлен флаг, выполнить действие.
|
Автор: | Alex_ka [ Сб июл 08, 2023 19:13:49 ] |
Заголовок сообщения: | Re: Как реализовать контроль порта с задержкой времени |
Не получается у меня не в бесконечном цикле. Мне надо постоянный контроль за отвалом реле в случае отказа проверяемого блока. |
Автор: | Martian [ Сб июл 08, 2023 19:16:16 ] |
Заголовок сообщения: | Re: Как реализовать контроль порта с задержкой времени |
а, про порт проглядел... Тогда надо настроить обработку внешнего прерывания на порт, если сработало - проверить, что там с sekunda_proshla |
Автор: | Alex_ka [ Сб июл 08, 2023 23:22:40 ] |
Заголовок сообщения: | Re: Как реализовать контроль порта с задержкой времени |
В принципе над этим можно подумать. Добавлено after 4 hours 2 minutes 27 seconds: Подумал и решил пойти иным путём. Так как мне нужно только, чтобы задержка контроля порта происходила только после запуска генераторов частот, а не постоянно висела, буду вводить ещё одну переменную секунды, которая будет считать одну секунду и обнулятся и в этом бесконечном цикле уберу контроль состояния порта, а введу команду если выше указанная переменная ровна единице, остановить этот бесконечный цикл и перейти к следующему, где будет if(PINC.4==1){break;}; Попробую так, посмотрю, что протеус покажет. |
Автор: | Martian [ Сб июл 08, 2023 23:41:34 ] |
Заголовок сообщения: | Re: Как реализовать контроль порта с задержкой времени |
Замечу, что у наиболее достоверного контроля порта должна быть буферизация для программы. Работа с внешним прерыванием это позволяет сделать без дополнительных аппаратных затрат. В ином случае есть риск, что до момента if(PINC.4){break;} много раз PINC.4 изменит состояние. Впрочем, если его состояние необходимо только на момент проверки, тогда ок. |
Автор: | Alex_ka [ Вс июл 09, 2023 00:23:12 ] |
Заголовок сообщения: | Re: Как реализовать контроль порта с задержкой времени |
Я понял о чём речь. Но у меня в бесконечном нет команды delay, которая тормозит цикл и цикл работает на скорости тактовой частоты. Мне кажется, что в таком случае контроль состояния порта выше, чем делать постоянный опрос через таймер. Проверил в протеусе, задержка пашет и отвал моментальный если на порту С4 разорвать ноль. Можно пробовать в железо переносить. |
Автор: | Martian [ Вс июл 09, 2023 00:31:37 ] |
Заголовок сообщения: | Re: Как реализовать контроль порта с задержкой времени |
внешнее прерывание - не есть опрос вообще, тем более через таймер. это некий триггер, который сработает именно тогда, когда произойдет внешнее событие. Микроконтроллер при этом вообще может спать (при условии, что у него есть функция проснуться по внешнему прерыванию) или делать какие-то иные задачи. Моментальным будет только если изменение состояния порта по времени дольше, чем пробег всего цикла. К тому же, Вы там говорили, что у Вас таймер работает и есть вывод информации на LCD. Это означает, что главный цикл вовсе не такой быстрый, как выглядит - часть времени отводится на обслуживание таймера и этого вывода. Так что, далеко не равно тактовой частоте. |
Автор: | veso74 [ Вс июл 09, 2023 02:40:00 ] |
Заголовок сообщения: | Re: Как реализовать контроль порта с задержкой времени |
Если не в используемом IDE, напишите функцию по timer0/timer2 для текущего времени через 1 ms (как напр. millis(), get_ticks() ... ). Код: 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; Программа в основном цикле при нормальной работе будет замедляться на: время на чтение состояния одного вывода и на присвоение 0 одной переменной. |
Автор: | Alex_ka [ Вс июл 09, 2023 07:55:35 ] |
Заголовок сообщения: | Re: Как реализовать контроль порта с задержкой времени |
Спасибо. Попробую. |
Автор: | BOB51 [ Вс июл 09, 2023 18:38:57 ] |
Заголовок сообщения: | Re: Как реализовать контроль порта с задержкой времени |
Встроить в цикл счетчик "условных енотов", который будет менять значение (в "условных енотах") при каждом опросе линии ввода данных. При достижении заданного количества - выход из цикла. ![]() |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |