Тактовая частота таймера CLK_TMR задается двумя битами регистра состояния таймера TMR_STATE[1..2]. В зависимости от их состояния, частота тактирования таймера может быть выбрана: CLК1_3, CLK1_6, CLK1_12 и CLK1_24. Что соответствует периодам: 0.48мкс, 0.96мкс, 1.92мкс и 3.84мкс. Из частоты тактирования таймера выделяется основная частота CLK_TMR1_4, и несколько вспомогательных фаз этой частоты. Частота CLK_TMR1_4 равна CLK_TMR / 4, поэтому периоды счета таймера будут: 1.92мкс, 3.84мкс, 7.68мкс и 15.36мкс соответственно. Учитывая, что скважность CLK1_3 равна 66.6%, итоговая ширина фазовых импульсов при данной тактовой частоте таймера будет отличаться от CLK1_6, CLK1_12 и CLK1_24, скважность которых равна 50%.
Один период CLK_TMR1_4 можно условно разделить на 8 тактов (0..7).
Такт 0:
Если разрешена загрузка буферного регистра в счетчик (в режиме остановки таймера, либо по событиям TMR_ZERO_EVENT или EXT_EVENT), то в этом такте происходит копирование буферного регистра LATCH_TMR_BUF в счетчик CTR_TMR_CUR.
Так же, если в предыдущем такте был активен сигнал TMR_BUF_WRITE (запись в буферный регистр), то происходит одновременная загрузка буферного регистра новым значением, и загрузка этого же значения в счетчик.
Если же сигнал TMR_BUF_WRITE стал активен в этом такте, то его действие откладывается до следующего такта, равно как и ответ RPLY.
Такт 1..7:
Возможна свободная загрузка в буферный регистр LATCH_TMR_BUF по TMR_BUF_WRITE.
Такт 2..3:
Никаких действий не совершается.
Такт 4:
Если таймер в режиме счета, то по переднему фронту такта происходит вычитание единицы из содержимого счетчика.
Такт 5:
Если регистр текущего значения LATCH_TMR_CUR до этого такта не находился в режиме чтения по TMR_CUR_READ, а так же регистр текущего значения не был заморожен по TMR_CUR_FREEZE, то в этом такте содержимое счетчика CTR_TMR_CUR переписывается в регистр текущего значения LATCH_TMR_CUR.
Если сигнал TMR_CUR_READ стал активен в этом такте, то его действие откладывается до следующего такта, равно, как и ответ RPLY.
Такт 0..4, 6..7:
Возможно свободное чтение регистра текущего значения LATCH_TMR_CUR по TMR_CUR_READ.
Такт 6:
Никаких действий не совершается.
Такт 7:
Если счетчик запущен и в этом такте равен нулю, а так же SYS_CON[13] = 0, то по переднему фронту такта формируется событие TMR_ZERO_EVENT. Если же SYS_CON[13] = 1, то выставляется сигнал IRQ (который в УКНЦ не используется). Снимается IRQ однократной установкой SYS_CON[13] = 0.
Также в этом такте формируется событие EXT_EVENT, если с предыдущего такта было изменение уровня на входе EXT.
По окончанию событий TMR_ZERO_EVENT или TMR_ZERO_EVENT (по заднему фронту такта 7) формируются события TMR_ZERO_READY и EXT_READY, соответственно. При наличии хотя бы одного из них, формируется событие TMR_CUR_FREEZE, замораживающее регистр текущего значения таймера. Сбрасываются события TMR_ZERO_READY и EXT_READY по чтению регистра текущего значения таймера.
Если произошло событие TMR_ZERO_EVENT, и при этом уже установлен TMR_ZERO_READY (т.е. не был прочитан замороженный регистр текущего значения таймера), то выставляется бит TMR_STATE[3] (TMR_OVER), который сбрасывается по чтению регистра состояния таймера TMR_STATE.
Особенности работы таймера и ошибки:
1. При записи значения в буферный регистр LATCH_TMR_BUF в режиме остановленного счета, с вероятностью 1/8 цикл записи может быть продлен до одиного такта таймера. Что соответствует 0.32мкс, 0.48мкс, 0.96мкс и 1.92мкс, или же 2, 3, 6 и 12 такта ПП, соответственно.
2. При чтении регистра текущего значения LATCH_TMR_CUR, с вероятностью 1/8 цикл записи может быть так же продлен, как и в пункте 1, в независимости от того, идет счет или нет.
3. При остановленном таймере, цикл продвижения значения от записи в буферный регистр LATCH_TMR_BUF до регистра текущего значения LATCH_TMR_CUR следующий. После записи значения в буферный регистр LATCH_TMR_BUF, продвижение его в счетчик CTR_TMR_CUR может задержаться на время до 8 тактов таймера. Дальнейшее продвижение числа в регистр текущего значения LATCH_TMR_CUR задержится еще на 5 тактов таймера. Если же в момент продвижения числа в LATCH_TMR_CUR, была попытка читать регистр текущего значения, то продвижение числа задержится еще на 8 тактов. И так может происходить до бесконечности, если перед тактом копирования числа в LATCH_TMR_CUR, было произведено чтение регистра текущего значения.
4. Весьма подозрителен тот факт, что при записи в буферный регистр LATCH_TMR_BUF, сигнал записи REG_BUF_LOAD может быть продлен на 1 такт таймера, относительно окончания сигнала TMR_BUF_WRITE. Таким образом, сигнал TMR_BUF_WRITE может пропасть, ввиду окончания записи процессором данных на шину, т.к. по записи в LATCH_TMR_BUF устанавливается RPLY, а в регистр LATCH_TMR_BUF все еще будет записываться состояние шины. И чем больше период тактирования таймера, тем вероятность данной ошибки выше. Максимальная задержка записи может быть 12 тактов ПП.
Рекомендации по работе с таймером:
1. При остановленном таймере записывать новое значение в буферный регистр при минимальном периоде тактирования таймера (2мс).
2. Не насиловать регистр текущего значения постоянными чтениями, особенно при большом периоде тактирования таймера, чтобы дать содержимому счетчика переписаться в регистр текущего значения.
[свернуть]