• slider image 442
  • slider image 483
  • slider image 484
  • slider image 485
  • slider image 486
  • slider image 487
:::


Browsing this Thread:   1 Anonymous Users






Re: 16F685一直無法校準TMR1
#10
資深會員
資深會員


查看用戶資訊
來點更新,因為問題似乎沒解決到...
不知道是否我整合的方式有什麼不對,不過我是按照你所提議的方式寫進去。

參照:
如果你要中斷特定時間,

那就要

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 你很難估這段時間

我用的TMR1中斷頻率是16Hz,prescaler是1:1,在所有要做這修補的程式也是用這個頻率。

因為編譯器的一些問題所以有一部分要用C來寫,例如將數值加到當前的TMR1H和TMR1L的部分,用Assembly寫進去它在執行時會寫入0而不是需要的數值,程式的watchdog抓到它跑0.5Hz。用C寫這組指令它就會正常跑16Hz。

TMR1使用低功率外振時是每1/32768(0.000030517578125)秒,又或是大約30.5us就計數一次,這沒錯吧?

透過Debugger模擬新的程式碼在TMR1停止後到TMR1啟動時一共跑了13個指令的時間,所以另外按照不同系統執行速度按時補一次TMR1L的計數(incf TMR1L,1)的指令,20MHz的每13次中斷(2.6us x 13 = 33.8us)就補一次,而8MHz的是每5次中斷(6.5us x 5 = 32.5us)就補一次,以補償每次TMR1停止期間所累積的時差。補時的判斷式佔4個指令時間,已經計算進去上述的指令時間內。

我加設了T1LMKC這個變數,當中Bit 7是用來判斷是否要補時。每次發生中斷後T1LMKC就減1,直到向下溢位到255。

PIR1.TMR1IF=0;
T1LMKC--;
T1CON.TMR1ON=0//TMR1停止

TMR1H+=T1HVAL//這兩行4個指令時間
TMR1L+=T1LVAL;

if(
T1LMKC&0x80){ //TMR1L補時,這組4個指令時間
  
asm incf TMR1L,1;
}
else{
  
asm NOP;
}

if(
STATUS.C){ //這組4個指令時間
  
asm incf TMR1H,1;
}
else{
  
asm NOP;
}

T1CON.TMR1ON=1//TMR1重啟

if(T1LMKC&0x80){
  
T1LMKC=4//8MHz的重設值,同時清除Bit 7,5次中斷後就會再觸發一次補時
}

變數T1LVAL在測試的所有情況時數值都是0,所以在TMR1L加T1LVAL後數值基本上不會有不同。但使用incf指令時有一個顧慮,就是它不影響STATUS.C,要是TMR1L在執行incf前已經是255(C的狀態是0),那麼這個溢位就不會被偵測到。

我在幾個不同的程式上跑,一個跑20MHz外置XTAL,三個跑8MHz(一個XTAL、兩個內置),跑一天後收集結果。

結果出來,20MHz的比對照時間快了2秒,8MHz的則全部都比對照的慢了15-20秒。如果以上面計算累積的延遲時差,理應全部都會比對照的慢,但20MHz的為什麼會越跑越快?

問題好像變得複雜了,但無法知道原因...

發表於: 2023/4/17 20:19
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 16F685一直無法校準TMR1
#9
資深會員
資深會員


查看用戶資訊
感謝你的建議,我會研究如何整合進去。

題外話
我使用的編譯器在產生hex檔時也會產生asm,所以有時會查看asm檔來計算某些特定的部分所需要的執行時間,以便改良源始碼。而且在撰寫程式時因為C本身有些限制,寫入某些指令是必須使用asm語法(編譯器支援的)。
最常用的例如CLRWDT和reset,這些在C沒有對應關鍵字,使用時就要這樣寫:
PIR1.TMR2IF=0//C語言指令
asm CLRWDT//單一asm指令

PORTC^=4//C語言指令

如果是需要算準執行時間的部分,我就會以asm撰寫那些地方。

發表於: 2023/4/6 23:08
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 16F685一直無法校準TMR1
#8
資深會員
資深會員


查看用戶資訊
程式沒有寫的很仔細,原理看的懂即可。

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
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 16F685一直無法校準TMR1
#7
資深會員
資深會員


查看用戶資訊
參照:
除非你都有沒其它『中斷源』了

你的意思是當有其他中斷來源時,即例如TMR0,在TMR0的中斷部分還在處理的時候,TMR1發生中斷但未能處理,到要處理TMR1的時候TMR1H和TMR1L已經跑了一段時間,重設它們造成額外延遲從而導致不準確的問題。我這樣的理解對不對?

那麼要如何改寫TMR1的中斷處理式來提升準確度?還望指教。

發表於: 2023/4/5 12:27
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 16F685一直無法校準TMR1
#6
資深會員
資深會員


查看用戶資訊
參照:

if(PIR1.TMR1IF){
TMR1H=T1HVAL;
TMR1L=T1LVAL;
PIR1.TMR1IF=0;
//其他動作...
}


這種寫法就會讓時間錯亂~~
除非你都有沒其它『中斷源』了

不能直接改 tmr1h tmr1l ,程式不是依你想像的方式在運作

發表於: 2023/3/31 22:22
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 16F685一直無法校準TMR1
#5
資深會員
資深會員


查看用戶資訊
參照:
所以,真的很不準?還是你程式有bug而不自知?

同一組程式架構用在系統使用外振的MCU上,就沒有受溫度影響。
不過我還是仍在找問題在哪就是了。

參照:
就我的經驗,程式去修改 TMR1H,TMR1L ,不讓系統自己跳,有很大的機率會讓時間錯亂~~

程式組只修改TMR1H和TMR1L的重設值,是另外使用兩個變數(T1HVAL和T1LVAL)進行,在每次TMR1發生中斷後,才會對TMR1H和TMR1L進行一次修改。
if(PIR1.TMR1IF){
TMR1H=T1HVAL;
TMR1L=T1LVAL;
PIR1.TMR1IF=0;
//其他動作...
}

發表於: 2023/3/31 18:39
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 16F685一直無法校準TMR1
#4
資深會員
資深會員


查看用戶資訊
32768hz 的osc 如果真的這麼爛,那現在的電子錶是如何做到這麼準的?

所以,真的很不準?還是你程式有bug而不自知?

就我的經驗,程式去修改 TMR1H,TMR1L ,不讓系統自己跳,有很大的機率會讓時間錯亂~~

除示你能完全掌握每行指令的時間,且時間一致,一般人不學 asm ,不專精這塊,很難會準的。

程式並不是以『你以為』的方式的跑,而是code 一行一行往下跑。

發表於: 2023/3/30 0:21
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 16F685一直無法校準TMR1
#3
資深會員
資深會員


查看用戶資訊
TMR1已經是用外振,而且設定不會跟系統內振同步,也就是TMR1是完全跟據外振來發生中斷。
但為什麼還是會被系統內振影響到?
是否真的只有系統用外振(TMR1就要強制改內振)才可解決問題?

發表於: 2023/3/27 23:42
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


Re: 16F685一直無法校準TMR1
#2
管理員
管理員


查看用戶資訊
RC本身的誤差率就落在1%-2%間,
加上溫度的影響, 很容易就會出現誤差.
本質上還是要透過校正才能解決,
直接從硬體下手才是最佳解.
純軟體很難解掉這個問題.
以上是個人淺見...

發表於: 2023/3/24 9:50
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部


16F685一直無法校準TMR1
#1
資深會員
資深會員


查看用戶資訊
此問題圍繞去年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就改內置?
如果不變更硬件,我還有什麼方法可以解決這個問題?

Attach file:



gif  clocking_adjust.gif (29.99 KB)
32118_641c34d52165e.gif 800X600 px

發表於: 2023/3/23 19:20
Twitter Facebook Google Plus Linkedin Del.icio.us Digg Reddit Mr. Wong 頂部







You can view topic.
不可以 發起新主題
You cannot reply to posts.
You cannot edit your posts.
You cannot delete your posts.
You cannot add new polls.
You cannot vote in polls.
You cannot attach files to posts.
You cannot post without approval.
You cannot use topic type.
You cannot use HTML syntax.
You cannot use signature.
You cannot create PDF files.
You cannot get print page.

[進階搜尋]


:::

Microchip連結

https://www.facebook.com/microchiptechnologytaiwan/
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=13
https://mu.microchip.com/page/tmu
http://elearning.microchip.com.tw/modules/tad_link/index.php?cate_sn=1
https://page.microchip.com/APAC-PrefCenters-TW.html
http://www.microchip.com/
http://www.microchip.com/treelink
http://www.microchipdirect.com/
http://www.microchip.com.cn/newcommunity/index.php?m=Video&a=index&id=103
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=2
http://www.microchip.com.tw/Data_CD/eLearning/index.html
http://www.microchip.com.tw/RTC/RTC_DVD/
https://www.microchip.com/development-tools/
https://www.youtube.com/user/MicrochipTechnology
[ more... ]

教育訓練中心

!開發工具購買
辦法說明 [業界客戶] [教育單位]
----------------------------------
!校園樣品申請
辦法說明 [教師資格] [學生資格]
----------------------------------