Timer16 Использование прерываний: различия между версиями

Материал из MIK32 микроконтроллер
Нет описания правки
Нет описания правки
Строка 126: Строка 126:
</syntaxhighlight>
</syntaxhighlight>
}}
}}
[[Файл:Timer16 Многократные срабатывания прерываний.png|мини|492x492пкс]]
[[Файл:Timer16 Многократные срабатывания прерываний.png|мини|376x376px]]
На временной диаграмме видны многократные срабатывания прерывания по сравнению:
На временной диаграмме видны многократные срабатывания прерывания по сравнению (CMP). Однократные прерывания по перезагрузке (ARR) связаны с реализацией Timer16.


Один из возможных вариантов исправления: временное отключение прерывания по сравнению на время до смены значения счетчика в другой части программы, например, в основном цикле, как в примере ниже:
Один из возможных вариантов обхода: временное отключение прерывания по сравнению на время до смены значения счетчика в другой части программы, например, в основном цикле, как в примере ниже:
{{#spoiler:show=Развернуть код|hide=Свернуть код|
{{#spoiler:show=Развернуть код|hide=Свернуть код|
<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
Строка 264: Строка 264:
</syntaxhighlight>
</syntaxhighlight>
}}
}}
[[Файл:Timer16 Однократные срабатывания прерываний.png|мини|461x461пкс]]
[[Файл:Timer16 Однократные срабатывания прерываний.png|мини|375x375px]]
На временной диаграмме видны однократные срабатывания каждого из прерываний:
На временной диаграмме видны однократные срабатывания прерываний по сравнению (CMP) и перезагрузке (ARR):

Версия от 07:52, 21 января 2025

Особенность установки флагов прерываний

Флаг прерывания по сравнению выставляется, если значение счета таймера совпадает со значением сравнения. Из-за этого возможна ситуация, когда после сброса флага прерывания по сравнению внутри обработчика флаг снова выставляется на следующем такте, если счетчик таймера не успел увеличиться. В таком случае, после выхода из обработчика прерывания происходит повторное срабатывание.

Пример ниже демонстрирует эту ситуацию. Для воспроизведения потребуется использовать источник счета с частотой значительно ниже частоты тактирования системы, например, один из низкоскоростных таймеров.

Развернуть код
Timer16 Многократные срабатывания прерываний.png

На временной диаграмме видны многократные срабатывания прерывания по сравнению (CMP). Однократные прерывания по перезагрузке (ARR) связаны с реализацией Timer16.

Один из возможных вариантов обхода: временное отключение прерывания по сравнению на время до смены значения счетчика в другой части программы, например, в основном цикле, как в примере ниже:

Развернуть код
Timer16 Однократные срабатывания прерываний.png

На временной диаграмме видны однократные срабатывания прерываний по сравнению (CMP) и перезагрузке (ARR):