Re: usart與timer中斷問題
|
||||
---|---|---|---|---|
資深會員
|
忘了wdszd 有講 "低中斷" (所以是 PIC18 ) , 胡亂抓了 16F887 資料作回覆 , 沒想到誤打誤撞 猜對了
細看樓上文章 , 突發奇想 作了個 搞怪測試 ( 16F1937 IN MPLAB SIM ) :
ISR 第一行 : BSF INTCON , 7 ; 奇怪 ! 無法 置 1 ?
前面再加個 BANKSEL PIR1 ; OK ! ..... 就算 GIE 被設定 也不會重新進入 ISR
Attach file: (0.00 KB)
發表於: 2009/12/23 14:28
|
|||
|
Re: usart與timer中斷問題
|
||||
---|---|---|---|---|
中級會員
|
照本宣科 果然還是仔細讀讀data sheet才對 謝謝各位
結果我把change color 改掉了 改回紅色好像watch就正常了 我笨了嗎?
發表於: 2009/12/23 14:11
|
|||
|
Re: usart與timer中斷問題
|
||||
---|---|---|---|---|
資深會員
|
雖然在中斷的部分,還是沒辦法用的很熟,但是這個文章又讓我學到一點東西,感謝版主解釋
發表於: 2009/12/23 13:29
|
|||
|
Re: usart與timer中斷問題
|
||||
---|---|---|---|---|
版主
|
PIC16 & PIC18 的 UART接收中斷位元 RCIF 是很容易被誤判的位元,就如 Beee 所提示的 "RCIF 無法用軟體直接清除,讀取 RCREG ( UART Reveicer Buffer) 可清除 RCIF 位元。
接下來所延生出的問題是 : 當使用 ICD2 之類的除錯工具在UART 接收中斷下是很難看到 RCIF = 1 的情況,因為 ICD2 有可能在斷點停下來是執行了 watch window 的更新動作也獨到的 RCREG 所以 RCIF 就被清 0 了。
發表於: 2009/12/23 10:08
|
|||
|
Re: usart與timer中斷問題
|
||||
---|---|---|---|---|
版主
|
GIE ( Global Interrupt Enable Bit ) & PEIE (Peripheral Interrupt Enable Bit) 這是在一般的使用上的稱謂;如果 PIC18Fxxxx 有啟用了 Interrupt Priority 功能 ( RCONbits.IPEN=1 ),這時 GIE 變成 GIEH ( Glogal Interrupt Enable High-Priogity Bit),PEIE 成為 GIEL (Low priority) 的控制位元。基本上這兩個位元GIEH & GIEL 是由軟體設定後,一但產生中斷自動清 0 以防止相同等級的中斷進入,等到最後執行 RETFIE 0 或 RETFIE FAST 後再由硬體自動設為 1 後返回並開始接受中斷。這個 GIEH & GIEL 是總管,與周邊各個獨立的 xxIF 位元相輔相成,各有各的功能的。
發表於: 2009/12/23 10:00
|
|||
|
Re: usart與timer中斷問題
|
||||
---|---|---|---|---|
資深會員
|
如附圖 :
如有會發生中斷之事件發生 , 不管其中斷向量有無 致能 , 該中斷之旗標皆會被設立 進入中斷程式的條件 : 一中斷向量已被致能 & 相對應的旗標被設立 ( GIE 要先設定 ) 所以如果沒清除旗標 , 會發生重覆進入中斷程式 PEIE 不用清 0 清除旗標通常是直接清 0 , 但 TX , RX 例外 ( 不知有否其他類似狀況 , 但請前輩告知 .... ) Attach file: (0.00 KB)
發表於: 2009/12/23 3:04
Edited by Beee on 2009年12月23日 04:32:17
|
|||
|
Re: usart與timer中斷問題
|
||||
---|---|---|---|---|
中級會員
|
謝謝,我試試看
另外一個問題 當我清除中斷旗標時 PEIE不是應該清0嗎? PIR1bits.RC1IF = 0; INTCONbits.TMR0IF = 0; 變得不能清0了 但我使用直接 INTCONbits.PEIE = 1; 卻可以使用 有人也有類似這種問題過嗎? 我的watch不能像之前一樣更變原有的值時會變紅色,請問該怎麼去調整
發表於: 2009/12/22 16:51
Edited by wdszd on 2009年12月22日 17:45:51
|
|||
|
Re: usart與timer中斷問題
|
||||
---|---|---|---|---|
資深會員
|
你應該可以利用先判斷是哪個中斷旗標被設定的方式來做,
也就是說 if(TMR0IF) { TMR0IF=0; . . . } if(RCIF) { RCIF=0; . . . } 您試看看!
發表於: 2009/12/22 16:33
|
|||
不怕苦...苦半輩子;怕苦...苦一輩子
|
||||
|
usart與timer中斷問題
|
||||
---|---|---|---|---|
中級會員
|
當我同時使usart與timer放置於低中斷我該在哪做判斷?
我試過在跳入中向量內的函數之後再做判斷 變成我的PEIE無法置1 usart與timer的中斷旗標我也清除過 請問有使用過的人可以分享一下你們的作法嗎 謝謝
發表於: 2009/12/22 16:04
|
|||
|