Cинхронизация таймера-счетчика

Добрых времен всем!
Есть задача включить счетчик по определенному событию, выключить после отсчета нужного количества импульсов. Вижу это приблизительно так:
включение:

{
//....
TCCRXB |= (1<<Z1S02)|(Z2<<CS01)|(Z3<<CS00);
//....
}

выключение:

ISR(TIMERX_COMPY_vect) { 
TCCRXB &=~( (1<<CS02)|(1<<CS01)|(1<<CS00));
// выключение счетчика
}

Вопрос : Насколько такой подход правильный, может быть есть более “кошерные решения”. Заранее благодарю.

Сбросить предделитель еще надо. И заблокировать перед инициализацией.

1 лайк

Поясните, если не трудно.

В даташите всё есть. И я его наизусть не помню, чтобы тебе сюда перепечатывать.

Спасибо, хотел скроить хождение в даташит за счет форума, не подфартило :slight_smile:

Наверное опечатка?

нет, просто хотел обозначить любой из счетчиков

а Z1, Z2, Z3- разряды любого числа, отличного от нуля и подходящего как предделитель счетчика

Насколько часто тикания счётчика нужны?
Не совсем понятна конечная цель. Посчитать тики? Или остановить процесс, связанный как-то с таймером?
Если тики считать, то проще счечик запустить заранее и читать когда нужно TCNT. Тот же Миллис, только аппаратный.

20 мс , 50 Гц

То есть, запускаем, считаем 20мс и выключаем?

Запускаем 1 раз в 20 мс отсчитываем к примеру, 2 мс останавливаем, ждем до след. 20 мс

Можно без сброса предделителя, если точность нужна ниже 1 тика.
В остальном, в принципе, верной дорогой идёшь, товарищь)

Ааааа. Так бы и сказал что сервой управлять.
Я себе писал на 16битном ТС1 на 5 сервомашин. Причём пины любые можно назначить.

Ну, в принципе есть другие варианты. Вопрос больше академический

Нет, не сервой, пока симистором - старт переход U сети через ноль, счет - закртытое время симистора, Т=10 мс (ошибся)

Хорошо. При нуле сбрасывай TCNT и предделитель(осторожно, он и другие таймеры тактирует). Выключать его не надо.
Обрати внимание на режимы. Там 2 режима есть: с мгновенным обновлением регистра и с обнулением в конце цикла счёта. Хотя в данном случае это почти не играет роли. Многое от конкретного счетчика зависит.

Спасибо, почитаю.

Можно так, прерывание INT0 - переход через ноль, (это уже отсчёт по 10мс), запускает таймер на 2мс

Спасибо