PIC單片機的定時器精準(zhǔn)計時的計算
關(guān)于PIC單片機的定時器精準(zhǔn)計時的計算
在此用了16C711單片機的TMR0做定時中斷,希望實現(xiàn)精準(zhǔn)計時,在程序中,TMR0用了晶振的32分頻,初值#0FCH,因此POPBEAR兄弟計算出每個定時中斷的計時時間為(256-X)*32*4/32768=0.015625秒。注意,問題就在這里!實際上這個時間是TMR0的初值被置入后兩個指令周期后(見PIC單片機定時器/計數(shù)器資料)到下一次中斷發(fā)生時的時間。如果要用到定時器的精準(zhǔn)定時,必須理解這一概念!
如采用32768Hz的晶振,每個指令周期為122us,在中斷處理程序中,到TMR0的初值被置入,共有7條指令,加上TMR0的初值被置入后兩個指令周期,如果中斷處理程序不直接放在0004H地址而采用GOTO指令的兩個周期,一共為11個指令周期。也就是說,每個定時中斷發(fā)生的間隔為0.015625秒+11*122us。程序中64次中斷為1秒,那么1秒誤差為64*11*122us=85.9375ms,1分鐘的誤差為5.156s。
那么怎樣得到精準(zhǔn)計時呢?這就要在對定時器的初值賦值上和中斷處理程序中做文章。
關(guān)于如何產(chǎn)生一個大致比較精準(zhǔn)的時間中斷
使用TMR0的時候,如果僅TMR0一個中斷,顯然,使用 TMR0=TMR0+OFFSET的方式就能夠產(chǎn)生一個比較精準(zhǔn)的時間中斷。特別是不用考慮從中斷到TMR0的賦值中間間隔了多少時間的延時。
但是使用TMR1時,就產(chǎn)生了問題,因為TMR1是16位的,所以TMR1L=TMR1L+OFFSET_L時,就得考慮TMR1H得進位問題。
使用C內(nèi)欠套匯編如下(如用賦值而不是增量方式,C中就得中斷到賦值得時間了),且TMR1_Revalue_H得值不會為0xFF。
[cpp] view plaincopyprint? #asm
movf _TMR1_Revalue_L & 0x7F,W
addwf _TMR1L,F
btfss _STATUS,0
movf _TMR1_Revalue_H & 0x7F,W
btfsc _STATUS,0
incf _TMR1_Revalue_H & 0x7F,W
addwf _TMR1H
#endasm
方法兩種
1)利用CCP模塊在Compare模式下特殊事件觸發(fā)功能實現(xiàn)精確的TMR1定時中斷。
2)普通模式下在重裝定時初值前TMR1暫停計數(shù),設(shè)定完畢后再開啟。注意補償中間置初值的延時時間。
擴展閱讀:PIC的配置位
編輯:admin 最后修改時間:2018-05-18