我在BoostC编译器中使用C我担心我的代码有多精确下面的配置在或多或少1Hz下滴答作响(用LED肉眼测试)(它使用外部手表晶体32kHz作为16f74上的定时器1)。
我希望有人能告诉我。。。
我下面的代码需要调整吗测量精确到最近的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

}

最佳答案

我可以看到一些改进。。。
你的计时器在中断内启动不准确。
当你在中断中设置定时器计数器时。。。

    tmr1h = T1H;
    tmr1l = T1L;

... 然后覆盖当前值,这不利于准确性。
... 只需使用:
tmr1h = T1H;  //tmr1h  must be still 0!

或者更好,只需设置tmr1h寄存器的第7位。
编译器必须将此顺序编译为单个asm指令,如。。。
bsf    tmr1h, 7

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

关于c - 具有16F * PIC中断的Timer1作为实时时钟的精度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6476812/

10-11 23:32
查看更多