К сожалению, при попытке отделения кода от остальной программы и его выполнении он начинал работать как нужно, в принципе я уже немного его изменил и всё заработало как нужно, спасибо за отклик.
Здравствуйте! Прошу совета. Если такое уже спрашивали ткните носом. Имеется следующий код для atmega48. Его задача выдать импульс заданной длительности в ответ на отпускание кнопки. Кнопка опрашивается по переполнению таймера 0. Если фиксируется нажатие на кнопку режим таймера меняется на CTC с другим предделителем. В данном примере я пытаюсь сделать импульс 10мс, но вместо этого получаю 16мкс. Спойлер
Спойлер[img]url=https://img.radiokot.ru/files/161177/medium/3t8lhcz6h6.png][img]https://img.radiokot.ru/files/161177/[/img] Опытным путем я установил, что такой импульс получится, если подать частоту на таймер вообще без делителя, то есть биты CS00 CS02 устанавливаются с какой-то задержкой. Предделитель я обнуляю, это не помогает. Почему так получается? Можно ли вообще менять настройки таймера на ходу?
Если фиксируется нажатие на кнопку режим таймера меняется на CTC с другим предделителем. В данном примере я пытаюсь сделать импульс 10мс, но вместо этого получаю 16мкс.
Ваш код не смотрел, так как ничего в нём не понимаю, но предполагаю, что вы перед переходе на режим СТС не сбросили флаг прерывания (OCF0A) с регистром сравнения (OCRA). Потому когда разрешаете глобальные прерывания, прерывание по сравнению осуществляется, так как флаг прерывания по сравнению (OCF0A) уже давно был установлен, а сбрасывается он только, или автоматически при возникновении прерывания, или записью в него 1.
Как я вижу алгоритм данной задачи: вам необходимо в прерывании по переполнению регистра TCNT0 (после фиксации нажатой кнопки), сбросить флаг прерывания сравнения (OCF0A), затем перенастроить таймер в режим СТС, установить нужное значение регистра OCRA, разрешить прерывание (Timer 0 / Compare Match A), установить 1 на нужном выводе. Далее в прерывании (по Timer 0 Compare Match A), снять установленную 1 с вывода, далее перевести таймер в режим Normal, перенастроить прерывания по переполнению (Timer 0 / Overflow) и выйти из данного прерывания. Далее в прерываниях по переполнению отслеживать нажатия кнопки и когда нажатие вновь будет зафиксировано повторить алгоритм по перенастройке данного таймера на режим СТС как описано выше. Всё.
Действительно, дело было в флаге. Теперь работает, спасибо большое за помощь! Выходит, я не правильно понимал работу флагов. Они устанавливаются при выполнении условия прерывания, даже если это прерывание не разрешено, правильно?
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения