Точность Timer1 как часов реального времени с прерываниями PIC на 16F * - PullRequest
2 голосов
/ 25 июня 2011

Я использую C с компилятором BoostC. Я беспокоюсь о том, насколько точен мой код. Приведенная ниже конфигурация работает на частоте более или менее 1 Гц (проверено светодиодом невооруженным глазом). (Он использует внешний кварцевый генератор 32 кГц для Timer1 на 16f74).

Я надеюсь, что кто-то может сказать мне ...

Требуется ли корректировка моего кода ниже? Какой самый простой способ измерить точность до ближайшего тактового периода процессора? Нужно ли запачкаться при сборке, чтобы надежно обеспечить точность сигнала 1 Гц?

Я надеюсь , что время, затраченное на выполнение обработчика таймера (и других), даже не приходит на снимок, так как таймер всегда считает. До тех пор, пока обработчикам никогда не понадобится больше времени для выполнения операций, чем 1/32 кГц, будет ли сигнал 1 Гц по существу иметь точность кристалла 32 кГц?

Спасибо

#define T1H_DEFAULT 0x80
#define T1L_DEFAULT 0
volatile char T1H = T1H_DEFAULT;
volatile char T1L = T1L_DEFAULT;

void main(void){

    // setup 
    tmr1h = T1H;
    tmr1l = T1L;
    t1con = 0b00001111; // — — T1CKPS1 T1CKPS0 T1OSCEN NOT_T1SYNC TMR1CS TMR1ON
    // ...

    // do nothing repeatedly while no interrupt
    while(1){}
}

interrupt(void) {

    // Handle Timer1
    if (test_bit(pir1, TMR1IF) & test_bit(pie1, TMR1IE)){

            // reset timer's 2x8 bit value
            tmr1h = T1H;
            tmr1l = T1L;

            // do things triggered by this time tick

            //reset T1 interrupt flag 
            clear_bit(pir1, TMR1IF);

    } else 

    ... handle other interrupts

}

1 Ответ

2 голосов
/ 25 июня 2011

Я вижу некоторые улучшения ...

Ваше срабатывание таймера внутри прерывания не точное. Когда вы устанавливаете счетчик таймера в прерывании ...

    tmr1h = T1H;
    tmr1l = T1L;

... тогда вы переопределяете текущее значение, что плохо для точности. ... просто используйте:

tmr1h = T1H;  //tmr1h  must be still 0!

Или, что еще лучше, просто установите 7-й бит регистра tmr1h. Компилятор должен скомпилировать этот порядок в одну инструкцию asm, например ...

bsf    tmr1h, 7

... чтобы избежать потери данных в регистре tmr1. Потому что, если это сделано с более чем одной инструкцией, аппаратное обеспечение может увеличивать значение счетчика между выполнением: read-modify-write.

...