2011-06-25 37 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