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

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


Пример ниже демонстрирует эту ситуацию. Для воспроизведения потребуется использовать источник счета с частотой значительно ниже частоты тактирования системы, например, один из низкоскоростных таймеров.<syntaxhighlight lang="c">
Пример ниже демонстрирует эту ситуацию. Для воспроизведения потребуется использовать источник счета с частотой значительно ниже частоты тактирования системы, например, один из низкоскоростных таймеров.
 
{{#spoiler:show=Развернуть код|hide=Свернуть код|
<syntaxhighlight lang="c">
#include "mik32_hal.h"
#include "mik32_hal.h"
#include "mik32_hal_timer16.h"
#include "mik32_hal_timer16.h"
Строка 122: Строка 125:
}
}
</syntaxhighlight>
</syntaxhighlight>
}}
[[Файл:Timer16 Многократные срабатывания прерываний.png|мини|492x492пкс]]
[[Файл:Timer16 Многократные срабатывания прерываний.png|мини|492x492пкс]]
На временной диаграмме видны многократные срабатывания прерывания по сравнению:
На временной диаграмме видны многократные срабатывания прерывания по сравнению:


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

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

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

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

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

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

На временной диаграмме видны многократные срабатывания прерывания по сравнению:

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

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

На временной диаграмме видны однократные срабатывания каждого из прерываний: