Re: 請問C中斷的問題
|
||||
---|---|---|---|---|
版主
|
因為 C18 處理中斷時會有很多的資料儲存動作,這是一種自保的動作,因為沒有人知道程式在哪裡發生中斷,誰該存誰該不用存。要讓中斷有最快的反應時間建議使用中斷程式用組合語言來寫,並善用 Shadow Register 的快速存取功能。
發表於: 2007/2/7 15:16
|
|||
|
Re: 請問C中斷的問題
|
||||
---|---|---|---|---|
高級會員
|
恩 我有用到capture的功能了
我現在是要做差分曼徹斯特的解碼 所以我的想法是捕捉電位準的改變 然後去判斷他位準改變的時間是不是在合理的改變範圍內 例如有一個差分曼徹斯特碼為10 01 01 10 01--->0 1 0 1 1 我的解法是看作 1 00 10 11 00 1.... 遇到出現00 或 11時 解出為1 事實上是判斷發生中斷的時間 假設曼徹斯特碼01每次電位改變的時間為120uS 而001為240uS 當時間抓到為連續兩次的每次中斷時間間隔為120(+-10%)就判斷為0 當時間抓到為每次中斷時間間隔為240(+-10%)就判斷為1 超過這些時間就判斷為錯誤 這樣如果我是使用4MHz加中斷進入副程式的時間花掉101uS,因為進入中斷副程式花掉62uS, 離開中斷回到主程式花了52uS,這樣加起來就花掉了215uS 這樣就超過了我在解曼徹斯特0所需的時間了。 接下來還要處理移位(來接收完112bit)所需要處理的時間。 所以要解出0就無法解出了,雖然硬體可以判斷到中斷的發生,也抓的到每次中斷間隔的時間,但是來不及用這些數據去判斷1或0,我的想法是這樣,不知道有沒有錯。
發表於: 2007/2/5 14:34
|
|||
|
Re: 請問C中斷的問題
|
||||
---|---|---|---|---|
高級會員
|
我會把這個中斷副程式放在isr_high..且優先權設為最高..
試試看...另外..看晶片有沒有倍頻.. 為什麼進入中斷後..處理的時間不夠??..不是很懂.. capture功能能運用上去嗎??...
發表於: 2007/2/5 12:22
|
|||
|
Re: 請問C中斷的問題
|
||||
---|---|---|---|---|
高級會員
|
果然是遇到大災難了
之前試好的程式只能單獨跑 不能加到我的主程式中 現在又回到原來的問題了 進入中斷後的處理時間不夠 造成我在取樣的時間沒辦法正確的解出我要的信號 除了換震盪器以外 請問還有什麼辦法呢
發表於: 2007/2/5 11:09
|
|||
|
Re: 請問C中斷的問題
|
||||
---|---|---|---|---|
高級會員
|
這些大部份是進入到中斷前..必需要做的PUSH POP動作...
除非很清楚知道哪些暫存器在中斷中不會被使用到... 不然不做這些動作..會造成大災難.. 詳細情況可能版大會更清楚... 另外有沒有試過使用 isr_high 來執行中斷副程式... 不知道會不會有差??
發表於: 2007/2/5 9:31
|
|||
|
Re: 請問C中斷的問題
|
||||
---|---|---|---|---|
高級會員
|
剛剛試了用c中插組語來寫
可以達成我要的結果 把原本的改成這樣 #pragma code low_vector=0x0018 void isr_low_direct(void) {_asm rcall diff_manchester nop retfie 0 _endasm } #pragma code 直接在0x0018中用使用call而不再先跳至void isr_low(void)中 看起來應該是如果使用c的中斷時,如果事先宣告了下面的語法 就會在進入堆疊前,先執行了一堆搬移的動作 例如要先搬移FSR、TBLTPR、TABLAT、PRODL、PRODH、PCLATH等暫存器到FSR1指標的位址中;請問這些搬移的動作在C語法中的功用是什麼?如果不做這些動作會有什麼影響? #pragma interrupt isr_low #pragma code
發表於: 2007/2/2 17:07
|
|||
|
Re: 請問C中斷的問題
|
||||
---|---|---|---|---|
高級會員
|
我中斷的時間不是從程式一開始run到中斷的時間
而是從中斷發生後進入到低中斷向量副程式所花的時間,就是在發生中斷與執行副程式之前基本上就需要花費63us的時間。 #pragma interrupt isr_low void isr_low(void)*1 {diff_manchester();*2<-------執行到這裡大概就花63us } #pragma code 我看了一下反組譯後的組語寫法,主要時間是花費在*1到*2 因為我在in_line assembly上也遇到了一些問題,所以對於c中使用assembly的使用沒有什麼把握。
發表於: 2007/2/2 16:12
|
|||
|
Re: 請問C中斷的問題
|
||||
---|---|---|---|---|
高級會員
|
進入到中斷副程式..應該是看中斷的條件何時成立...
用組語寫跟用C寫..主要是差在程式效率還有程式碼大小吧? 如果你的意思是從程式開始run到第1次中斷發生的時間.. 有可能是C18有含入startup code..程式寫法還有Complier的 結果都會影響到... 如果一定要很精確的時間..可以在C18中加上組語來改善.. W401教材都有講到...可以參考看看...
發表於: 2007/2/2 15:46
|
|||
|
Re: 請問C中斷的問題
|
||||
---|---|---|---|---|
高級會員
|
進入到中斷副程式..應該是看中斷的條件何時成立...
用組語寫跟用C寫..主要是差在程式效率還有程式碼大小吧? 如果你的意思是從程式開始run到第1次中斷發生的時間.. 有可能是C18有含入startup code..程式寫法還有Complier的 結果都會影響到... 如果一定要很精確的時間..可以在C18中加上組語來改善.. W401教材都有講到...可以參考看看...
發表於: 2007/2/2 15:45
|
|||
|