Доброго времени суток! Столкнулся с проблемой на своей atmega328p, у меня есть сервопривод, его нужно крутить на “втором loop цикле”, а параллельно нужно что-нибудь печатать в порт. Я подключил библиотеки для прерываний, настроил регистр b таймера 1 и в обработчике прерываний кручу серво, а в loop печатаю, но серво не крутится, только печатается в порт. Кто знает где я просчитался?
Ну я попытаюсь перефразировать, должен ли работать функция ISR как второй loop цикл и если да то почему она печатает всего один раз в порт после запуска программы?
Я разве в #2 непонятно написал, в чем у вас проблема?
Я повторю:
Вот смотрите, в тексте сообщения вы пишете
А в коде у вас наоборот, в прерывании печать, а в ЛУП - серво.
Так где правильно?
Ответ на ваш вопрос зависит от того, что именно вы делаете в луп, а что в прерываниях.
Или вы считаете, что прерывания - это просто второй цикл луп и между ним, и основным циклом нет никакой разницы? - это не так.
Например, печатать в Сериал в прерывании нельзя.
Я брал этот образец из этой статьиArduino и прерывания таймера / Хабр
И там сказано
цитирую
“Timer1 установлен на прерывание по переполнению и давайте предположим, что вы используете Atmega328 с тактовой частотой 16 МГц. Поскольку таймер 16-битный, он может считать до максимального значения (2^16 – 1), или 65535. При 16 МГц цикл выполняется 1/(16 ∗ 10^6) секунды или 6.25e-8 с. Это означает что 65535 отсчетов произойдут за (65535 ∗ 6.25e-8 с) и ISR будет вызываться примерно через 0,0041 с. И так раз за разом, каждую четырехтысячную секунды. Это слишком быстро, чтобы увидеть мерцание.” Может я чего-то не понимаю.
Вот давай ты не будешь писать про то чего не знаешь? Никто никого никогда не игнорирует при выполнении. Выполняется всё. Это программа, как написана так и будет выполняться. Прерывание может выполняться вечно. Ни кто ни где не ограничивал время выполнения прерывания. Можешь всю программу написать в прерывании и она будет там например моргать светодиодом без остановки. Другое дело может это одно, а должна это другое. Это как программист пожелает так и должна. В программе бывают и другие прерывания и им тоже хочется поработать.
Поэтому стараются быть в одном прерывании поменьше, что бы всем хватило времени.
Спорить с более опытными не в моей привычке. Значит я не правильно понял то, что мне объясняли на старом форуме несколько лет назад. Там я, как раз, почти всю программу запихал в прерывание и она не работала…
Если ей хотелось другие прерывания использовать, а ты её не давал, то вполне нормальное поведение. Тут ведь как - понимаешь что делаешь можно и в прерывании работать, а не понимаешь можно и … сломать.
Да всё правильно ты понял. Это же такой стандарт/парадигма/логика, как хочешь её назови. И это правильно. Прерывания только прерывают тебя от основного процесса/процессов. Не надолго. И тогда все будут довольны. Но сам ты, можешь поступать как хочешь. Можешь просто забить на остальных и болтать с прервавшым тебя.) Я встречал такие реализации. И они работали.) Только там было всего 2 задачи.))
Понимаете в чем дело. У меня в setup() прописано деление частоты на 1 (Cs10). В главном цикле у меня крутится сервопривод, а вобработчике прерываний печатаетя в порт. Так работает только сервопривод, а печатаеися в порт только один раз, если же я поменяю их местами то работает только отправка в порт. Что я забыл учесть, вроде она должна работать, а вроде на половину. P. S. Я знаю чтот такое синхронное прерывания с помощью millis() в главном цикле и оно работает. Но мне надо разделить программу на цикл и обработчик прерываний.
У вас программа простаивает по 100мс(delay(100)).
Вместо задержки на delay() используйте millis(). Пример
За 100мс можно много чего напечатать.
И прерывание не нужно.