Timer1作为实时时钟的精度,具有16F *的PIC中断*

时间:2011-06-25 08:50:29

标签: c timer real-time pic microchip

我正在使用C和BoostC编译器。我担心我的代码有多准确。下面的配置大约1Hz,(肉眼用LED测试)。 (它在16f74上为Timer1使用32kHz的外部手表晶振。)

我希望有人能告诉我......

我的代码是否需要进行任何调整?测量精度到最近CPU时钟周期的最简单方法是什么?我是否需要弄脏装配才能可靠地确保1Hz信号的准确性?

希望执行定时器处理程序所花费的时间(和其他人)甚至没有进入图片,因为定时器总是在计数。只要处理器的执行时间从不超过1 / 32kHz秒,1Hz信号是否具有32kHz晶体的精度?

由于

#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 个答案:

答案 0 :(得分:2)

我可以看到一些改进......

中断内部的定时器启动不准确。 在中断时设置定时器计数器...

    tmr1h = T1H;
    tmr1l = T1L;

...然后你覆盖当前值,这对准确性不利。 ......只是使用:

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

甚至更好,只需设置tmr1h寄存器的第7位。 编译器必须将此命令编译为单个asm指令,如...

bsf    tmr1h, 7

...以避免丢失tmr1寄存器中的数据。因为如果使用多个指令,硬件可以在执行:read-modify-write之间递增计数器值。