2011-06-25 38 views
2

我在BoostC编译器中使用C语言。我很担心我的代码有多准确。下面的配置或多或少以1Hz为单位,(用LED肉眼测试)。 (它使用16f74上的Timer1的外部钟表晶振32kHz)。Timer1作为PIC中断实时时钟的精度为16F *

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

请问我下面的代码需要的任何调整?测量精度到最近的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 

} 
+0

这里为我们http://electronics.stackexchange.com/ – DipSwitch

回答

2

我可以看到一些改进......内部中断

你的计时器开始是不准确的。 当您设置定时器计数器中断...

tmr1h = T1H; 
    tmr1l = T1L; 

...然后你重写当前值有什么不好的准确性。 ...只需使用:

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

甚至更​​好,只是设置的TMR1H寄存器的第7位。 编译器必须编译这个以单汇编指令就像...

bsf tmr1h, 7 

...避免TMR1寄存器的数据丢失。因为如果这是通过多条指令完成的,硬件可以在执行:read-modify-write之间递增计数器值。

+0

谢谢,我明白你在说什么,但由于定时器只是在32kHz增加,与4Mhz时钟不会给我在写入定时器值之前,ISR中的125个周期会变脏? – Jodes

+1

你没有告诉我们主要的CPU频率。如果CPU时钟频率为4MHz,则指令周期为1MHz,因此这只有30个指令时钟,并且中断延迟可能远远超过30个指令时钟,特别是在处理更多不同的中断时。 –

+0

谢谢,对不起,我知道现在正朝着电子领域迈进,但是请您介绍什么构成中断延迟?它只是ISR代码执行吗?还是有一些额外的硬件延迟? – Jodes