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

标签 c timer real-time pic microchip

我正在使用带有 BoostC 编译器的 C。我担心我的代码有多准确。下面的配置以大约 1Hz 的频率滴答作响(用 LED 肉眼测试)。 (它为 16f74 上的 Timer1 使用了一个 32kHz 的外部 watch 晶体)。

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

我的以下代码是否需要任何调整?测量最近 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 寄存器中的数据。因为如果这是用多条指令完成的,硬件可以在执行以下操作之间递增计数器值:读-修改-写。

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

相关文章:

尽管具有相同的值,但在 Arduino 中使用 C 控制电机的速度会导致不同的速度

java - 如何制作一个圆圈的动画

f# - 设计实时采集和 'control'的系统架构

python - 如何使用django实现实时?

java - synchronized 是否保证线程将看到另一个线程修改的非 volatile 变量的最新值?

c - C 中带算术运算符的逻辑运算符

C - struct* 在运行时强制转换?

c - HexRays - 输出读取了从未写入的值?

android - 如何每 X 秒运行一次方法

java - Swing 计时器和耗时任务