Re: 16F685一直無法校準TMR1
|
||||
---|---|---|---|---|
資深會員
|
感謝你的建議,我會研究如何整合進去。
題外話 我使用的編譯器在產生hex檔時也會產生asm,所以有時會查看asm檔來計算某些特定的部分所需要的執行時間,以便改良源始碼。而且在撰寫程式時因為C本身有些限制,寫入某些指令是必須使用asm語法(編譯器支援的)。 最常用的例如CLRWDT和reset,這些在C沒有對應關鍵字,使用時就要這樣寫:
PIR1.TMR2IF=0; //C語言指令
如果是需要算準執行時間的部分,我就會以asm撰寫那些地方。
發表於: 2023/4/6 23:08
|
|||
|
Re: 16F685一直無法校準TMR1
|
||||
---|---|---|---|---|
資深會員
|
程式沒有寫的很仔細,原理看的懂即可。
32768 數65536 = 2sec 中斷一次 如果要 1sec 中斷一次 tmr1_isr: bcf PIR1,TMR1IF bsf tmr1h,7 如果要 0.5sec 中斷一次 bcf PIR1,TMR1IF bsf tmr1h,7 bsf tmr1h,6 這樣候做法最簡單。 如果你要中斷特定時間, 那就要 tmr1_isr: bcf pri1,tmr1if bcf t1con,tmr1on :停止計數 movlw 數值_LOW addwf TMR1L,F BTFSC STATUS,C ;要對稱,無論有無C,這段的執行時間都是四個cycle MOVLW 數值_HIGH+1 BTFSS STATUS,C MOVLW 數值_HIGH 這個部份用c 是很困難的,不確定執行的指令是否有刻意浪費時間。 addwf tmr1h,f bcf t1con,tmr1on :重新計數 從off 譬 on 這 8個cycle 也要納入時間考量 ,你設定的數值才會是『準』的 ,用c 你很難估這段時間 直接填tmr1l tmr1h 時間幾乎肯定會錯。
發表於: 2023/4/5 17:17
|
|||
|
Re: 16F685一直無法校準TMR1
|
||||
---|---|---|---|---|
資深會員
|
參照:
除非你都有沒其它『中斷源』了 你的意思是當有其他中斷來源時,即例如TMR0,在TMR0的中斷部分還在處理的時候,TMR1發生中斷但未能處理,到要處理TMR1的時候TMR1H和TMR1L已經跑了一段時間,重設它們造成額外延遲從而導致不準確的問題。我這樣的理解對不對? 那麼要如何改寫TMR1的中斷處理式來提升準確度?還望指教。
發表於: 2023/4/5 12:27
|
|||
|
Re: 16F685一直無法校準TMR1
|
||||
---|---|---|---|---|
資深會員
|
參照:
這種寫法就會讓時間錯亂~~ 除非你都有沒其它『中斷源』了 不能直接改 tmr1h tmr1l ,程式不是依你想像的方式在運作
發表於: 2023/3/31 22:22
|
|||
|
Re: 16F685一直無法校準TMR1
|
||||
---|---|---|---|---|
資深會員
|
參照:
所以,真的很不準?還是你程式有bug而不自知? 同一組程式架構用在系統使用外振的MCU上,就沒有受溫度影響。 不過我還是仍在找問題在哪就是了。 參照: 就我的經驗,程式去修改 TMR1H,TMR1L ,不讓系統自己跳,有很大的機率會讓時間錯亂~~ 程式組只修改TMR1H和TMR1L的重設值,是另外使用兩個變數(T1HVAL和T1LVAL)進行,在每次TMR1發生中斷後,才會對TMR1H和TMR1L進行一次修改。
if(PIR1.TMR1IF){
發表於: 2023/3/31 18:39
|
|||
|
Re: 16F685一直無法校準TMR1
|
||||
---|---|---|---|---|
資深會員
|
32768hz 的osc 如果真的這麼爛,那現在的電子錶是如何做到這麼準的?
所以,真的很不準?還是你程式有bug而不自知? 就我的經驗,程式去修改 TMR1H,TMR1L ,不讓系統自己跳,有很大的機率會讓時間錯亂~~ 除示你能完全掌握每行指令的時間,且時間一致,一般人不學 asm ,不專精這塊,很難會準的。 程式並不是以『你以為』的方式的跑,而是code 一行一行往下跑。
發表於: 2023/3/30 0:21
|
|||
|
Re: 16F685一直無法校準TMR1
|
||||
---|---|---|---|---|
資深會員
|
TMR1已經是用外振,而且設定不會跟系統內振同步,也就是TMR1是完全跟據外振來發生中斷。
但為什麼還是會被系統內振影響到? 是否真的只有系統用外振(TMR1就要強制改內振)才可解決問題?
發表於: 2023/3/27 23:42
|
|||
|
Re: 16F685一直無法校準TMR1
|
||||
---|---|---|---|---|
管理員
|
RC本身的誤差率就落在1%-2%間,
加上溫度的影響, 很容易就會出現誤差. 本質上還是要透過校正才能解決, 直接從硬體下手才是最佳解. 純軟體很難解掉這個問題. 以上是個人淺見...
發表於: 2023/3/24 9:50
|
|||
|
16F685一直無法校準TMR1
|
||||
---|---|---|---|---|
資深會員
|
此問題圍繞去年8月我在另一篇貼文提到的16F685程式,其中TMR1的部分。
TMR1使用32768Hz外振來計時,因此系統只能用8MHz內振,然後就是問題所在了,就是程式翻新完成後的半年間,其計時一直無法校準。 我使用一個自己撰寫針對TMR1計時校準的程式組,以256秒為一個完整週期,校準方式為使用兩組8位元變數,各為計數器和校準值。 假設TMR1頻率是16Hz,那麼 TMR1H重設值=248 TMR1L重設值=0 1. CKBCLK以秒為單位由0跑到255再回到0,即每256秒等於一個週期 2. CKPCLK以TMR1發生中斷為單位,以16Hz就是由0跑到15再回到0,1秒等於一個週期 3. CKBCPR和CKPCPR用以設定校準的時間框架,可以在執行時手動調整 4. 布林變數TNBE用以設定調整方向,設為1的時候就是跑慢點,設為0的時候就是跑快點,在一般情況下,TNBE都是設為0 5. 當CKPCLK由最大值回到0,CKBCLK就加1。 執行方式請參看附件圖片。 TMR1已設定為不會跟系統同步(T1CON = 0x0F)。 問題就是,實作跑的時候仍然受到溫度所導致的系統內振執行速度變化所影響。在系統和TMR1都用外置振盪的話則不會有這個問題。 具體一點說,在同一個CKBCPR的設定值下,用網絡計時做對照,在12月和1月的時候,系統跑一天就比對照的明顯的慢;但到3月天氣回暖後,只消半天就的跑得快過對照。所以過了半年都無法校準。 程式中斷式內還有以500Hz跑的TMR0和2.2kHz跑的TMR2,它們不會在中途暫停的。 其實我是否應該將RA4和RA5改接系統外置振盪,TMR1就改內置? 如果不變更硬件,我還有什麼方法可以解決這個問題?
發表於: 2023/3/23 19:20
|
|||
|