Генерация серии импульсов за заданное время
- Войдите на сайт для отправки комментариев
Ср, 11/05/2016 - 16:01
Добрый день! У меня есть простой код с таймером, который постоянно проверяет значение на "входном" пине и в соответствие с этим решает, что сделать на "выходном".
unsigned long currentMillis = millis(); if(currentMillis - previousMillis >= 10) { value = digitalRead(in_pin); previousMillis = currentMillis; } if(value == 0) { digitalWrite(out_pin, LOW); } else if(value == 1) { // ???? }
Проблема в том, что когда на "входной" пин подается сигнал, на "выходном" должна генерироваться серия импульсов какое-то заданное время, например 3 секунды. Я понимаю, что здесь наверное нужно какое-то прерывание, которое остановит выполнение программы и запустит эту серию импульсов, но реализовать не получается.
Буду благодарен за помощь.
После шквала комментариев положу свои 5 копеек. Ну например при подаче на "входной" пин сигнала, "выходной" пин должен в течение 3-х секунд выдавать серию непонятно каких импульсов. Предположим, например, что это импульсы с периодом 8 мс, почему нет, другого же не сказано.
3 сек / 0,008 сек = 375 импульсов в течение 3 сек после появления сигнала на "входном" пине, с этим уже можно работать. "Выходной" пин удерживать в HIGH 4 мс, потом в LOW 4 мс - всего 8 мс. И так 375 раз, чтобы было ровно 3 сек. При повторной "подаче" сигнала на "входной" пин - повторить. А если сигнал прийдет раньше, чем истекут 3 сек? Ну, например, не потерять эти события, и отработать каждое такое событие новой серией сразу же после завершения "текущих импульсных" секунд. Так интересней.
Вот с примерно такой постановкой задачи можно поговорить о коде. Вариант с комментариями приводится. И прерывание (целых 2) там тоже имеется.
Зачем так сложно? Как понимаю, у автора задачка на изучение свойств макроса everyMillis(wait, code); в его развернутом виде. Создавать "пачки импульсов" удобно через ШИМ, функцией tone(), но и отключать тогда надо не digitalWrite(), а выключением ШИМ turnOffPWM() или как она там у Wiring.
По сути задачка перефразируется так:
Постоянно (everyMillis) проверять состояние "кнопки", и как только она включилась надо включить флаг "кнопка включена" и запомнить значение millis() для интервала генерации, во второй части loop(), в которой:
Если "кнопка включена", то:
а) выдаем через функцию tone() прямоугольные импульсы;
б) проверяем временной интервал генерации (everyMillis) и если он кончился, то сбрасываем флаг "кнопка включена" и выключаем tone()
Фсё.
P.S.
Дело в том, что управлять этой волшебной (ибо работает только так и никак иначе!) проверкой можно с обоих концов: как устанавливая длительность интервала паузой, так и устанавливая извне значение контрольного времени..