智能車制作

 找回密碼
 注冊

掃一掃,訪問微社區

QQ登錄

只需一步,快速開始

查看: 690|回復: 14
打印 上一主題 下一主題

[其他] 【問題】9S12XS的ECT模塊,兩個中斷同時其中一個被忽略。什么情況

[復制鏈接]

1

主題

6

帖子

0

精華

注冊會員

Rank: 2

積分
34
威望
24
貢獻
10
兌換幣
12
注冊時間
2020-4-2
在線時間
0 小時
跳轉到指定樓層
1#
發表于 2020-4-2 09:35:24 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最后由 冷生 于 2020-4-2 09:38 編輯

9S12XS的ECT做了一個通道輸入捕捉,另一個通道輸出比較。。
分開都是沒問題,同時也問題不大。。但是信號到了某些頻率時,就開始其中一個中斷不執行。
后來測試:做了兩個輸出比較,給同樣的TC寄存器值,應該是同時觸發中斷,結果又總是一個執行一個不執行(中斷號靠前的執行 靠后的直接不執行)。。。
理論上中斷應該是一個執行,另一個等著第一個中斷完了就開始。。我遇到這個情況很詭異啊?
有沒有大神遇到過的?求指教
ECT初始化:(初始化中未開輸出比較的中斷,在輸入捕捉中根據需要,對C賦值和開對應通道中斷)
void ECT0_Init(void)             {           
  PPST_PPST0 = 0;                //set pull-up
  PERT_PERT0 = 1;                //enable pull-up
  DDRT_DDRT0 = 0;                //PT0 as input
  DDRT_DDRT1 = 1;
  DDRT_DDRT2 = 1;
  DDRT_DDRT6 = 1;

  TSCR1=0x88;                   //使能定時器 使用精確分頻               
  PTPSR=31;                     //精確分頻 32 80/32=2.5mhz ,TSCR2分頻無效

  TIOS_IOS0=0;                  //通道0為輸入捕捉 ch0 IC
  
  TIOS_IOS2=1;                  //ch2 fuc:輸出比較
  TIOS_IOS6=1;                  //ch6 fuc:輸出比較
  OCPD=0xFf;

  TCTL4=0x01;                   //IC0捕捉上升沿
  TIE_C0I=1;                    //通道0輸入捕捉中斷允許
  TSCR2=0x86;                   //b7:允許溢出中斷,分頻系數64
}

對應輸出比較的通道中斷:
void interrupt 10 Timer2_Output_C(void)
{    Testcount++;       
      TIE_C2I=0;     //dissable the OC2
      TFLG1_C2F=1;//清中斷標志位
}
//#pragma CODE_SEG DEFAULT
void interrupt 14 Timer6_Output_C(void)
{      Testcount--;      
      TIE_C6I=0;     //dissable the OC6
      TFLG1_C6F=1; //清中斷標志位
}

理論上,同時開啟2/6兩個通道的輸出比較,給TC寄存器一樣的值,兩個中斷會同時觸發,然后先后執行。最后Testcount值應該是定值不變。
實際試驗發現testcount一直在增加,相當于第二個中斷沒有進入過。
但是如果給TC寄存器賦不一樣的值,這個testcount值就能保持不變。。。
這種類似的中斷的沖突,有沒有大神遇到過T_T。。
請求大神指導一下




分享到:  微信微信 QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 轉播轉播 分享分享 頂 踩
回復

使用道具 舉報

1

主題

6

帖子

0

精華

注冊會員

Rank: 2

積分
34
威望
24
貢獻
10
兌換幣
12
注冊時間
2020-4-2
在線時間
0 小時
推薦
 樓主| 發表于 2020-4-3 14:41:05 | 只看該作者
QQQDB 發表于 2020-4-3 11:05
中斷應該得有優先級順序的,如果兩個中斷同時觸發且優先級一樣,會有一個中斷被頂掉。但如果優先級不同,假 ...

是的。初始狀態下,這些可屏蔽中斷優先級同為1級,提高了其中一個或兩個優先級(分別設置不同級別)之后,這個被提升最高中斷看起來沒有被打消失了,不過偶爾另一個比他低的中斷還是會被打消失。

最后采取了折中辦法:
1 優先保證一個重要中斷優先級高一些(假設為A),不至于被打消失;
2 在這個優先的A中斷里加入對其他中斷(假設為B們)動作時間點的確認語句,A發生時,如時機也適合B們觸發(可能被打消失的范圍內),則強制執行B們里的指令;
驗證結果,暫沒有看到中斷的缺失導致的丟失任務了。
但這個方法感覺還是比較LOW,臨時對應一下。如果有大神有好的辦法(比如其他單片機的高級功能),也歡迎給分享一下
。感謝

回復 支持 1 反對 0

使用道具 舉報

13

主題

93

帖子

0

精華

金牌會員

Rank: 6Rank: 6

積分
2873
QQ
威望
1531
貢獻
1056
兌換幣
1011
注冊時間
2014-4-9
在線時間
143 小時
畢業學校
山達電子工作室
2#
發表于 2020-4-2 09:55:55 | 只看該作者
XS128是個不錯的單片機
回復 支持 反對

使用道具 舉報

1

主題

6

帖子

0

精華

注冊會員

Rank: 2

積分
34
威望
24
貢獻
10
兌換幣
12
注冊時間
2020-4-2
在線時間
0 小時
3#
 樓主| 發表于 2020-4-2 11:20:49 | 只看該作者
優樂美 發表于 2020-4-2 09:55
XS128是個不錯的單片機

是挺好的,就是個別時候遇到一些奇葩情況。。。。 其他型號又不了解,沒辦法隨便換
回復 支持 反對

使用道具 舉報

3

主題

341

帖子

0

精華

跨屆大俠

Rank: 10Rank: 10Rank: 10

積分
6626

活躍會員獎章優秀會員獎章論壇元老獎章在線王獎章

威望
3349
貢獻
2381
兌換幣
2202
注冊時間
2016-5-3
在線時間
448 小時
4#
發表于 2020-4-2 13:03:03 | 只看該作者
XS128是個不錯的單片機,就是太老了
回復 支持 反對

使用道具 舉報

1

主題

6

帖子

0

精華

注冊會員

Rank: 2

積分
34
威望
24
貢獻
10
兌換幣
12
注冊時間
2020-4-2
在線時間
0 小時
5#
 樓主| 發表于 2020-4-2 13:47:50 | 只看該作者
本帖最后由 冷生 于 2020-4-2 13:53 編輯
cs538138 發表于 2020-4-2 13:03
XS128是個不錯的單片機,就是太老了

啊  尷尬 是的是的。。十幾年前用的,沒有與時俱進 慚愧慚愧。。
看看有沒有大神 依稀記得小時候遇到過類似情況
回復 支持 反對

使用道具 舉報

56

主題

4887

帖子

3

精華

頂級版主

北京科技大學智能汽車隊公共主頁管理員

Rank: 11Rank: 11Rank: 11Rank: 11

積分
55153

特殊貢獻獎章資源大師獎章論壇骨干獎章推廣達人獎章優秀版主獎章熱心會員獎章論壇元老獎章在線王獎章活躍會員獎章優秀會員獎章

威望
18974
貢獻
13549
兌換幣
2961
注冊時間
2010-7-22
在線時間
11315 小時
6#
發表于 2020-4-2 18:02:05 | 只看該作者
這倆中斷是同一個中斷入口吧。進去之后再做判斷到底是哪個中斷發生了。所以兩個中斷同時發生的時候,處理完中斷號靠前的中斷函數后,會同時清理中斷號靠后的中斷函數標志位。
所以你要么換個中斷方式,要么進入中斷后同時讀取兩個中斷標志位,再依次執行中斷函數試試
回復 支持 反對

使用道具 舉報

1

主題

6

帖子

0

精華

注冊會員

Rank: 2

積分
34
威望
24
貢獻
10
兌換幣
12
注冊時間
2020-4-2
在線時間
0 小時
7#
 樓主| 發表于 2020-4-2 22:25:39 | 只看該作者
本帖最后由 冷生 于 2020-4-2 22:33 編輯
aytc100 發表于 2020-4-2 18:02
這倆中斷是同一個中斷入口吧。進去之后再做判斷到底是哪個中斷發生了。所以兩個中斷同時發生的時候,處理完 ...


多謝!版主 看了你的說法,就去看了數據表。確實像是類似你說的這樣的情況。(另外也測試了換了IRQ中斷代替其中一個中斷,讓他們遇上一起時候,也還是會偶然沖突)
161頁 中斷的章節有2段。
A CPU interrupt vector is not supplied until the CPU requests it. Therefore, it is possible that a higher
priority interrupt request could override the original exception which caused the CPU to request the vector.
In this case, the CPU will receive the highest priority vector and the system will process this exception
instead of the original request.
If the interrupt source is unknown (for example, in the case where an interrupt request becomes inactive
after the interrupt has been recognized, but prior to the vector request), the vector address supplied to the
CPU will default to that of the spurious interrupt vector.

NOTE
Care must be taken to ensure that all exception requests remain active until
the system begins execution of the applicable service routine; otherwise, the
exception request may not get processed at all or the result may be a
spurious interrupt request (vector at address (vector base + 0x0010)).

意思好像就是兩個中斷來的很近,有可能一個中斷被inactive了,但是還沒來得及執行,另一個中斷過來然后把它頂替了。
他也建議一定要注意執行中斷完之前要保持active  。。
如果理解是這個意思的話,我再想想其他辦法看看
不知道這個Inactive 的動作是哪里操作的,應該不是在中斷程序里的清零flag(因為清FLAG已經是執行用戶中斷程序)
回復 支持 反對

使用道具 舉報

0

主題

10

帖子

0

精華

中級會員

Rank: 3Rank: 3

積分
262
威望
162
貢獻
100
兌換幣
106
注冊時間
2020-3-11
在線時間
0 小時
8#
發表于 2020-4-3 11:05:34 | 只看該作者
中斷應該得有優先級順序的,如果兩個中斷同時觸發且優先級一樣,會有一個中斷被頂掉。但如果優先級不同,假設現在正在執行中斷1,當中斷2觸發后會先停止中斷1,運行中斷2,等到中斷2運行結束再回到中斷1停止位置,繼續執行中斷1
回復 支持 反對

使用道具 舉報

0

主題

10

帖子

0

精華

中級會員

Rank: 3Rank: 3

積分
262
威望
162
貢獻
100
兌換幣
106
注冊時間
2020-3-11
在線時間
0 小時
10#
發表于 2020-4-3 15:00:44 | 只看該作者
冷生 發表于 2020-4-3 14:41
是的。初始狀態下,這些可屏蔽中斷優先級同為1級,提高了其中一個或兩個優先級(分別設置不同級別)之后 ...

正常情況下,如果兩個中斷均為定時器中斷,只要這兩個定時器中斷的時間間隔能夠使中斷內的語句被執行完,是不會被頂掉的。如果設置了優先級仍然偶爾會被頂掉,建議延長其中某一個中斷的中斷觸發時間。
回復 支持 反對

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 注冊

本版積分規則

關于我們|聯系我們|小黑屋|智能車制作 ( 京ICP備14023231號-8

GMT+8, 2020-6-4 06:58 , Processed in 0.337744 second(s), 29 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表
澳洲幸运8官方网