Re: 16F685無法校準TMR1問題(續)
|
||||
---|---|---|---|---|
資深會員
|
發表於: 2023/5/13 11:06
|
|||
程式是
依照寫出來(的code),跑出結果 不是依照你想出來的,得到結果 先有需求規格 後有解決方案 |
||||
|
Re: 16F685無法校準TMR1問題(續)
|
||||
---|---|---|---|---|
資深會員
|
一、用32768,一般就是來數 2秒、1秒、0.5秒、0.25秒
別用 32768 來數 0.1 0.2 0.3秒之類 ,自找麻煩。 二、要數0.1秒、0.2秒 用 osc 來數,別自找麻煩外掛 32768 三、振盪器一定有誤差,但是 ppm 等級,一年誤差是以秒計。 誤差太多,不是振盪器壞了,就是程式有bug。 bug 是依你程式產生的,而不是依你的想像力。
發表於: 2023/5/12 16:38
|
|||
|
16F685無法校準TMR1問題(續)
|
||||
---|---|---|---|---|
資深會員
|
這是接續之前一篇關於無法校準的問題,只是似乎被視為討論已完,所以還是再開另一篇來問。
前情提要,如要修正TMR1計時偏差問題,除了不能直接覆寫TMR1H和TMR1L,還要先將TMR1關掉才可以進行TMR1計數器修改的程序,並加上TMR1關掉期間所帶來的額外延遲的補正部分,即每隔一定數量的中斷後,當額外的延遲累積到大約30.5us後(32768Hz振盪一次計數的時間),會在TMR1L額外加1以補回時差,然後新的問題來了。 我分別在一個20MHz和三個8MHz的程式上跑,連續跑24小時後收集結果。結果出來是20MHz的比對照時間快了2秒,而8MHz的三個分別慢了15、19和20秒。 本來一直想不到原因為何,直到看到datasheet上這個(請看附圖)。 因為有其他Timer的中斷的關係,所以ISR抓到TMR1中斷的時機並不是每次都一樣。按照圖片,如果TMR1重新啟動後,T1CKI是在HIGH的時候,那麼最快可以在15.25us後TMR1會增加一次;但如果T1CKI是在LOW的時候,那麼最差情況是要在45.75us後TMR1才會加一次。我相信就是這部分的誤差造成這個難以修正的延遲。而且從8MHz的程式的結果看,應該是大部分情況下TMR1重啟時T1CKI都是在LOW,只是踩在LOW的時機都不一樣。 然後,T1CKI腳位的狀態是無法讀取的(總是讀為0),即是不能夠透過讀取腳位來判斷。 PIC16F631/677/685/687/689/690第84頁、第6.4節: 參照: TRISA5 and TRISA4 bits are set when the Timer1 oscillator is enabled. RA5 and RA4 bits are read as '0' and TRISA5 and TRISA4 bits read as '1'. 我想了一個方法就是在啟動TMR1前先取得TMR1L的值在暫存,在啟動TMR1後等候30.5us,以TMR1L在這段時間後的值是否不同了來判斷是否需要額外計時補正,這不一定準但至少不會比現在的情況差。可是這樣特意等候30.5us好像很蠢也沒必要,要是有其他高頻率中斷這無疑是一個大妨礙,但已經想不到其他可以用來判斷的方法。
發表於: 2023/4/19 19:53
|
|||
|