TMR1 & RTC
Добавлено: Вт сен 05, 2017 07:01:30
Хьюстон, у нас проблема.
Делаю часики на pic18f24j11 с использованием модуля RTCC. Всё тикает. И тут вдруг мне пришла в голову мысль сделать автоматический расчет коррекции. В RTCC есть такой регистр RTCCAL в который можно прописать сколько лишних импульсов надо добавить или отнять, чтобы часы шли по-точнее. Для этой цели я решил использовать счетчик TMR1. Получается так, что от одного T1OSC тикают двое часиков: RTCC и TMR1. Да вот проблема - TMR1 отстаёт! И крупно отстаёт. Вот вчера вечером поставил часы, проверил - всё точно. Сегодня утром TMR1 отстаёт от RTCC 2 секунды. Но они же идут от одного и того же генератора.
Я понимаю, что это моё устройство и кроме меня никто не может найти где что теряется, но мне нужны идеи как поймать, где и что пропадает. Вот обработчик прерывания TMR1:
на дисплей я могу вызвать значение unixtime, который показывает время с последнего сброса секунд. Вот например, сейчас на границе минуты показания были 0xEF85, что при делении на 60 в остатке даёт 57, а не 0 или хотя бы 59. Секунда туда-сюда допустима, так как часы обновляются по ежесекундному прерыванию от RTCC и при сдвиге показания могут запаздывать, но при расчете используется захваченные значения, а вот там точно белиберда. Флаг timeset в коде только устанавливается при сбросе секунд и более никогда не снимается.
Делаю часики на pic18f24j11 с использованием модуля RTCC. Всё тикает. И тут вдруг мне пришла в голову мысль сделать автоматический расчет коррекции. В RTCC есть такой регистр RTCCAL в который можно прописать сколько лишних импульсов надо добавить или отнять, чтобы часы шли по-точнее. Для этой цели я решил использовать счетчик TMR1. Получается так, что от одного T1OSC тикают двое часиков: RTCC и TMR1. Да вот проблема - TMR1 отстаёт! И крупно отстаёт. Вот вчера вечером поставил часы, проверил - всё точно. Сегодня утром TMR1 отстаёт от RTCC 2 секунды. Но они же идут от одного и того же генератора.
Я понимаю, что это моё устройство и кроме меня никто не может найти где что теряется, но мне нужны идеи как поймать, где и что пропадает. Вот обработчик прерывания TMR1:
Код: Выделить всё
// Прерывание от TMR1
if (TMR1IE && TMR1IF) {
TMR1H |= 0x80u;
TMR1IF = 0;
if (flag.timeset) unixtime++;
}