Привет "РА."-Кот . Необходима ваша помощь. Хочу использовать для одного из проектов внутренний таймер с прерыванием, без использования выходов МК к которым он может быть подключен. Выход 5 и 6: timer0 Выход 9 и 10:timer1 Выход 11 и 3:timer2 Данные выводи МК будут использоваться в качестве бинарных входов, а некоторые в качестве выходов. Как настроить таймер без привязки к выводам МК (ШИМ на выходе МК, тд. мне не нужен)?
В документации микроконтроллера см. внутреннюю пр. схему выбранного таймера. Введите вход с клока, выберите прескалера. Что произойдет через время таймера (например, поднятие флага), следите за прерываниями и не переходя к выводам (для Вашей другой функции).
Из пдф-а: The Timer/Counter can be clocked by an internal or an external clock source. --- Я бы начал тесты с blink по таймера, сначала с готовой программы. Поменяйте на другое время, поменяйте тип исполняемой функции...
По умолчанию, если не используются функции analogWrite() все выводы могут использоваться как цифровые. Использование таймера "в своих нуждах" требует внимания только в отношении функций системного времени millis() micros() delay() да еще если tone() в программе использовать намечается. Дополнительно имеется возможность использовать Т0 в части прерывания по совпадению для OCR0A (только для МК, имеющих таковой - к примеру 186 и 328 мегах) без дополнительных ограничений.
Да это уже немного ближе к тому, что я хочу. То есть после срабатывания таймера по звортному отсчету функция изменяет некоторую переменную относящуюся к основной части программы без изменения состояний выходов мк.
только что протестил библиотеку от alexgyver. подключил к проекту, над которым работаю, все ОК.
Код:
#include "GyverTimers.h"
Timer1.setFrequency(30); // Высокоточный таймер 1 для первого прерывания, частота - 3 Герца //Timer1.setPeriod(333333); // то же самое! Частота 3 Гц это период 333 333 микросекунд //Timer1.setFrequencyFloat(4.22); // Если нужна дробная частота в Гц Timer1.enableISR(CHANNEL_B);
// Прерывание А таймера 1 ISR(TIMER1_B) { // пишем в сериал Serial.println(millis()); }
Этот код работает. Посмотрел логическим анализатором на 10-м пине - никаких действий. Проверил работу пина в других функциях - никаких нареканий
khomych, было бы хорошо делать только быстрые собития (напр. поднимать флаг, считать count и т. д.) во время переполнения прерывания таймера, а медленные события (как Serial.print()): выполнения напр. по флагу в теле программы (loop). Иначе можете пропустить собитие.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения