Re: 時鐘問題
|
||||
---|---|---|---|---|
中級會員
|
謝謝大家的指導!
因我程式的時鐘是必須長年累月的計時而定時去驅動系統定時使用故精度要求較高因我crystal 是電子街買的故精度不知!如各位所言我將再行測試!
發表於: 2004/8/18 17:28
|
|||
|
Re: 時鐘問題
|
||||
---|---|---|---|---|
資深會員
|
;4MHZ TMR1預除1
;使用預除2/4/8 有可能產生 1/62500~2/62500的誤差 16~32PPM INT_TMR1: BCF PIR1,TMR1IF MOVLW 0XDC ADDWF TMR1L,F MOVLW 0X0B SKPNC MOVLW 0X0C ADDWF TMR1H,F ;62500CYCLE 中斷一次 ;中斷16次即一秒
發表於: 2004/8/19 11:10
|
|||
|
Re: 時鐘問題
|
||||
---|---|---|---|---|
版主
|
/* 程式功能:使用HI-TECH C,4MHz crystal,連接中階PIC, 達到每0.05秒中斷一次。
因為Interrupt latency,在使用內部(同步)中斷源時,固定為3 Tcy, 所不管主程式正在做什麼事,time-out之後,都會在相同的時機跳到 中斷處理程式。 由於不論寫值到 TMR1L或TMR1H都會使prescaler清為零, 所以,不要寫值到TMR1L或TMR1H,或者不要用prescaler會比較簡單。 如果,所接的crystal頻率,可以造成不必使用prescaler,又可以只 寫值到TMR1H,就可以不用考慮到中斷產生後,到寫值進TMR1L時,TMR1L 已經又遞增,不為零的情況。如32768Hz便滿足這個條件:不要使用prescaler, 只要讓它free-run,就會很準地每2秒進位到0000產生中斷一次;或者,只要 每次中斷填0x80到TMR1H,不要去動TMR1L,就可以每一秒中斷一次 */ #include <pic.h> #define TMR1H_VALUE 256-(unsigned char)((4000000/4 * 0.05)/256)-1 //0.05改為0.01就可變成0.01秒中斷一次 #define TMR1L_VALUE 256-(unsigned char)(4000000/4 * 0.05) % 256 //0.05改為0.01就可變成0.01秒中斷一次 void init(void) { TMR1L=TMR1L_VALUE; TMR1H=TMR1H_VALUE; T1CON=0B00000001; TMR1IF = 0; TMR1IE = 1; GIE = 1; PEIE = 1; } main() { init(); while (1) //迴圈中的內容只是用來切換BANK,以證明計時仍然準確。 { TRISB = 0; PORTB ++; TRISB = 0XFF; PORTB ++; } } interrupt void interrupt_isr( void) { if (TMR1IF == 1) { TMR1H=TMR1H_VALUE; TMR1L=TMR1L + TMR1L_VALUE; //以此補償中斷發生,到寫值到TMR1L的時間差要 //要注意可能因此加法,造成必須進位到TMR1H的情況 TMR1IF = 0; NOP(); //NOP只是用來測試已 NOP(); //NOP只是用來測試已 } else { NOP(); //NOP只是用來測試已 } } 以上程式,用軟體模擬測過,很準哦!
發表於: 2004/8/20 12:59
|
|||
|
Re: 時鐘問題
|
||||
---|---|---|---|---|
初級會員
|
版主的這個方法粉好,我用 PIC16F877A 的試了一次,用 SIM
TEST , 哇 ! 真準 GREAT!
發表於: 2005/12/8 23:57
|
|||
|