собственно вопрос. можно ли как-то запретить изменение регистра-счётчика на время обработки прерывания или же необходимо сохранять значение этого регистра при входе в обработчик и восстанавливать перед выходом из него? можно, также, при заходе в обработчик запрещать работу таймера, но флага, отвечающего за это я не нашёл. единственное - установить делитель частоты равный нулю (CS = 0: No clock source. (Timer/Counter stopped)). контроллер - восьмая мега.
Quark Если нужно остановить\приостановить то конечно (CS = 0: No clock source. (Timer/Counter stopped)) только непонятно зачем это делать на время обработки прерывания - чтобы время работы кода прибавлялось к периоду тамера? )
Это, конечно, минус. дело в другом. представь: у тебя OCR1B и OCR1A отличаются на единицы, а прерывания нужно ловить от обоих. сработало прерывание compare_b, а через несколько тактов должно сработать compare_a, но оно не срабатывает, т.к. в это время идёт обработка compare_b.
Есть такая штука как отложенное прерывание. Как только выйдешь из compare_b сразу попадешь compare_a. Задержка есть.
Да. Спасибо за совет. Прошу прощения, нужно было пояснить более подробно. Вобщем задача сгенерировать 8 шимов. Я делаю примерно так: создаю массив времён для каждого канала. в OCR1A период срабатывания. OCR1B постоянно меняю в обработчике cmpB (устанавливаю новое минимальное значение). получается так. срабатывает handler_cmpA - все каналы устанавливаются в 1. устанавливаю в OCR1B минимальное время из массива. при срабатывании handler_cmpB - устанавливаю следующее минимальное время из массива и сбрасываю в 0 все каналы, времена которых меньше TCNT1. и т.д. 7 раз. проблема. если значения в массиве идут слишком часто. например, сработало t1, я записываю в OCR1B t2. разница между ними несколько единиц - значит для t2 таймер уже не сработает, т.к. на момент записи TCNT1 может быть уже больше, чем OCR1B. Другого выхода, кроме как остановить счётчик на время выполнения handler_cmpB я не вижу. что опять-же вносит большую погрешность.
А если увеличить период ШИМ (до критического значения)? Ну если можно. Поставить значение предделителя побольше. И тогда на один такт счетчика будет приходится достаточное количество тактов для обслуживания прерывания. IHMO Vov4ick Из PDF-ника. Там пишут, что есть отложеные прерывания. Нужно будет заняться этим вопросом. Или я не так понял?