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

|| 我正在使用带有BoostC编译器的C语言。我担心我的代码有多准确。下面的配置以大约1Hz的频率滴答(用LED裸眼测试)。 (它在16f74的Timer1上使用一个32kHz的外部时钟晶体)。 我希望有人能告诉我... 我下面的代码是否需要任何调整?在最接近的CPU时钟周期内测量精度的最简单方法是什么?为了可靠地确保1Hz信号的准确性,我是否需要弄脏装配体? 我希望执行计时器处理程序(和其他处理程序)所花费的时间甚至不会出现在画面中,因为计时器一直在计数。只要处理程序执行的时间永远不会超过1 / 32kHz秒,那么1Hz信号是否具有32kHz Crystal的精度? 谢谢
#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

}
    
已邀请:
        我可以看到一些改进... 您在中断内启动计时器不正确。 当您将计时器设置为中断时...
    tmr1h = T1H;
    tmr1l = T1L;
...那么您会覆盖当前值,这对准确性不利。 ...只需使用:
tmr1h = T1H;  //tmr1h  must be still 0!
甚至更好,只需设置tmr1h寄存器的第7位。 编译器必须将此命令编译为单个asm指令,例如...
bsf    tmr1h, 7
...以避免丢失tmr1寄存器中的数据。因为如果这是由多个指令完成的,则硬件可以在执行以下操作之间增加计数器值:r​​ead-modify-write。     

要回复问题请先登录注册