Таймер STM8 не работает в нужное время
Я работаю с таймером STM8 (не мой код, но поддерживаю его), и в нем он использует таймер. Видимо, часы настроены на 16 МГц erfo 0.0625uS. Настройки таймера ARRH=0x03 ARRL=0x20, поэтому (0x0320=800) он сбрасывается на 800 (ergo 50us). PSCR установлен на 0, поэтому таймер имеет ту же частоту, что и микро.
Во всяком случае, при проверке с помощью осциллографа, он не дает хорошие показания. Прерывание таймера вызывается в: 56us, 54uS, 54uS, 52uS, 52uS, 52us, 38us(!!!), 42us(?), 50us, 50us....
с любопытством подытожил, что это дает 500uS, поэтому он считается в 10 раз 50uS
Первые 8 раз по таймеру прерывания происходит некоторое преобразование AD, поэтому существует вероятность, что прерывание AD также вызывается между ними.
1) Как вы думаете, это влияет на частоту таймера?
2) почему он "исправляет" себя, вызывая прерывание на 38uS??
Буду признателен за любые комментарии, основанные на вашем встроенном опыте или опыте STM8, так как я знаю, что точные ответы потребуются для изучения кода...
2 ответа
Я не уверен, что вам все еще нужен ответ. У меня когда-то было то же самое и долго искал... простое решение в моем случае:
У меня был АЦП ISR с высоким джиттером. Это пришло из моего основного цикла. В некоторых подпрограммах подподчинения прерывание АЦП было временно деактивировано для критической секции (передача данных между прерыванием и контекстом основного цикла). Эффект именно то, что вы описываете:
Иногда время между двумя прерываниями больше, потому что прерывание ожидает и ожидает выполнения, пока прерывание не будет снова включено. Таймер все еще продолжает работать. Пример времени:
- прерывание отключено в основном цикле (или подпрограмме)
- флаг прерывания устанавливается таймером -> ожидание прерывания
- прерывание снова включается -> ISR выполняется слишком поздно
- прерывание отключено в главном цикле
- флаг прерывания устанавливается таймером -> в ожидании
- прерывание снова включается -> ISR выполняется слишком поздно
- Основной цикл НЕ отключает прерывание в некоторых случаях (возможно, из-за потока управления, возможно из-за проблемы синхронизации)
- Следующее прерывание выполняется в нужное время, которое составляет 50 мкс после возникновения последнего прерывания, а НЕ 50 мкс после вызова последнего ISR. -> время между вызовами ISR сокращено.
Я надеюсь, что смогу помочь.
Делюсь для всех.
Таймер STM8 не прекращает отсчет после переполнения или опустошения.
Для 38 мкс счетчик таймера уже работал, в то время как таймер ISR (тот, что был до 38 мкс) ожидался для 12 мкс, поэтому время для следующего ISR сузилось.