Задержки в прерываниях
- Войдите на сайт для отправки комментариев
Пнд, 26/09/2016 - 20:59
Надо в прерывании поочередно переводить в 1/0 три пина, с определённой задержкой.
Таймеры тоже использовать не получается, конструкция готова.
И как выкрутиться?
delay(100500)
Не работает delay в прерываниях, к сожалению.
Добавить ещё три ардуины и всё получится.
Не работает delay в прерываниях, к сожалению.
С какого это он перепугу не работает? Откройте маску прерываний и всё заработает.
sei();
delay(100500);
И всё.
Ну разрешим прерывания и что? В мануале сказано, что delay в обработке прерываний не работает.
В железе, кстати, тоже не работает.
Ну а вопрос то в чем ? После входа в прерывание, запускаете таймер, который гененрит прерывания для обработки вашей задачи, в таймерном прерывании делаете все что хотите.
Какой таймер?
Ну разрешим прерывания и что? В мануале сказано, что delay в обработке прерываний не работает.
В железе, кстати, тоже не работает.
У всех Всё отлично работает, Видимо Вы один такой :))))
Жругое дело, что устраивать задержки в прерываниях .... ну, если Вам надо ...
Ожидал совет, а не ехидство.
Ожидал совет, а не ехидство.
Какой совет Вы ожидали? По задержкам в обработчике прерывания? Их там нельзя делать! Делэй там отлично работает, но задержки в обработчике делать нельзя - это крайне безграмотно.
Поэтому, единственный реальный совет - придумать другое решение, которое не требует задержек в обработчике.
Любые же советы по организации таких задержек (с делэй или ещё как) изначально безграмотны.
Ожидал совет, а не ехидство.
"Ты первый начал!"(с)... ибо толком ничего не сказал.
Надо в прерывании поочередно переводить в 1/0 три пина, с определённой задержкой.
С какой? Микросекунды, миллисекунды, минуты, часы? С какой точностью это всё должно выдерживаться?
Таймеры тоже использовать не получается, конструкция готова.
А нужно было думать ДО, а не ПОСЛЕ! Что, и программного нет?
И как выкрутиться?
Посыпать голову пеплом! Или неправвильный алгоритм, или неправильный выбор камня.
Так. Сначала.
При изменении уровня на INT0 должны последовательно появиться 1 на трёх пинах, интервал 10 мС.
При следующем изменении уровня - сняться 1 в обратном порядке, интервал 5 мС.
Недавно мне тож нужна была задержка, для драйва сенсора пыли от Шарпа, ну так я её в прерыжание и вставил. Не такая большая как Вам надо, но можете растянуть:
Так. Сначала.
При изменении уровня на INT0 должны последовательно появиться 1 на трёх пинах, интервал 10 мС.
При следующем изменении уровня - сняться 1 в обратном порядке, интервал 5 мС.
Так и в чем проблема? Из обработчика INT0 стартуете любой свободный таймер на генерацию прерывания через 10 мсек и в глобальную переменную запишете 0. В обработчике прерывания таймера в зависимости от переменной подымаете пины и инкрементите переменную. Как досчитаете до трех - запрет прерывания таймера. Если нет свободных таймеров - цепляетесь на таймер системного времени (ищите по форуму, была спецтема про этот грязный хак) и с дополнительным делителем на 10 (впрочем, на той же глобальной переменной) делаете тоже самое, только таймер в конце не выключаете. Гасить - аналогично. А если код писали грамотно, и требования к точности временных интервалов адекватные, то вобще в лупе все решается.
Какая может быть задержка между прерыванием и первым изменением пина? Может быть в прерывании просто выставить флаг и в основном цикле уже щелкать пинами? 10 мс уж очень большое время, что бы заморативаться на задержку в прерывании. Если это не приемлимо можно взять свободный таймер, в прерывании зарядить его на 10 или 5 мс и уже в прерывании таймера щелкать пинами. Про софт задержку вам уже сказали. Вариантов решения много. Это как как с измерением высоты барометром - можно давление мерить, а можно как кирпич босать.
Спасибо. Вечером попробую.
Это как как с измерением высоты барометром - можно давление мерить, а можно как кирпич босать.
Ага. Но то все не наш подход. Но наш метод - прикладывать барометр к измеряемому предмету снизу вверх подсчитывая сколько их влезет и получить высоту сразу в барометрах ))))
В результате сделал проще. У меня два прерывания 0 и 1, 0 работает по изменению уровня, а 1 по низкому и только в случае если на 0 низкий уровень. Всего три варианта. В обработке прерываний присвоил вариантам номера 1, 2, 3. В лупе проверяется какой вариант. Вставил в корпус и посмотрел время срабатывания реле, сделал секундомер для этого, все уложилось в разброс времени срабатывания реле, а это микросекунды.