Запись в счетчик таймера во время работы таймера

Я использую PIC16F1947 для проекта. Проект требует отслеживания в реальном времени, поэтому стабильный кварц 32768 Гц подключен к генератору Timer1. Схема генератора Timer1 и кристалл обеспечат стабильные часы для нашего проекта.

Timer1 может обеспечивать прерывание только при переполнении счетчика таймера. Это 16-битный счетчик, поэтому прерывание будет даваться каждый раз, когда счетчик переходит на 0x0000 из 0xFFFF.

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

В нашем проекте нам также нужны прерывания каждые 0,5 секунды. Итак, мы планируем инициализировать счетчик Timer1 значением 0xC000, а затем запустить его. Каждый раз, когда будет дано прерывание, мы планируем побитовое ИЛИ 0xC0 к старшему байту регистра.

Согласно техпаспорту:

Чтение TMR1H или TMR1L во время работы таймера от внешних асинхронных часов обеспечит правильное чтение (об этом заботятся аппаратно). Однако пользователь должен иметь в виду, что чтение 16-битного таймера в двух 8-битных значениях само по себе создает определенные проблемы, так как таймер может переполниться между чтениями.

Для записи рекомендуется, чтобы пользователь просто останавливал таймер и записывал нужные значения. Конкуренция за запись может возникнуть при записи в регистры таймера, в то время как регистр увеличивается. Это может привести к непредсказуемому значению в паре регистров TMR1H:TMR1L.

Можно ли использовать побитовое ИЛИ 0xC0 со старшим байтом во время работы таймера? Или мы должны использовать другой таймер для 0,5-секундного прерывания?

Спасибо.

Ответы (1)

На PIC с двумя таймерами 32 кГц (TMR1 и TMR3) я бы рекомендовал использовать один из таймеров «автономно» (никогда не записывайте в него), а другой использовать для генерации событий пробуждения. Если у вас есть только один таймер, добиться надежной работы без кумулятивных ошибок будет очень сложно. Различные ревизии деталей ведут себя по-разному, когда дело доходит до записи таймера 1, и поэтому подход, который будет работать с одной ревизией, может быть нарушен будущей ревизией. Было бы неплохо, если бы Microchip позволила таймеру переключаться между синхронным и асинхронным режимами без потери счета (это просто сделать: вместо использования мультиплексора для переключения между синхронным и асинхронным режимами добавьте асинхронный set/clear в синхронизирующую защелку, а в асинхронном режиме используйте их, чтобы заставить вывод следовать за вводом). Насколько я знаю, ни одна из их частей не задокументирована как делающая что-либо подобное. Следовательно, я ожидаю, что переключение между синхронным и асинхронным режимами может случайным образом увеличивать или уменьшать счет.