Re: PORTB中斷
|
||||
---|---|---|---|---|
中級會員
|
請敎諸位大大, 是否在使用PORTB中斷時, 一定要致能INTCON2.RBPU?
有看到別人的程式中有致能這pin.
發表於: 2008/3/3 10:32
|
|||
|
Re: PORTB中斷
|
||||
---|---|---|---|---|
版主
|
Interrupt-On Pin Change 的重點是:
RBIF的中斷要離開前前衣錠要現做一次 PORTB 的讀取動作,讓內部的 D-Type 正反器泥垢記住目前的輸入位準後再做 RBIF=0 的動作離開中斷函數。
發表於: 2008/2/29 15:55
|
|||
|
Re: PORTB中斷
|
||||
---|---|---|---|---|
版主
|
看來看去總認為你的程式架構不適用。
1. 沒有人會在中斷程式裡花那嚜多的執行時間。 OpenLCD(); LCD_Set_Cursor(0,0); putrsLCD("PORTB INTERRUPT"); for (i=0;i<6;i++) Delay10KTCYx(200); 你知道以上的程式要花多少時間嗎? 怎麼它麼會出現在中斷程式裡。考慮一下系統的流程,中斷的程式要像迷你裙一樣越短越好。 2. 詳細看一下 Data Sheet 有關 PORTB 的描述與方塊說明,由方塊圖去了解一下 Interrupt-On Pin Change 的原理。Data Sheet 裡有強調要先做一次 PORTB 的讀取動作後再清除 RBIF 旗號。 3. 既然已經使用 Interrupt-On Pin Change 的偵測功能了,這時就不需用軟體迴圈測試 SW2。所以原先程式也要修改。 參照: while (1) 4. 組合語言是核心,不熟的話還是要去了解的,盡量試試看。
發表於: 2008/2/29 15:17
|
|||
|
Re: PORTB中斷
|
||||
---|---|---|---|---|
中級會員
|
Kbat524大大, 您是說在清除INTCONbits.RBIF之前去讀取PORTB(4:7)的值嗎? 可是在PORTB準位改變時, INTCONbits.RBIF不就會被寫成1; 所以我原先的想法是當PORTB(4:7)改變狀態, INTCONbits.RBIF=1時, 觸發中斷行為, 使其達成預設動作, 所以才沒有對PORTB(4:7)進行讀取的動作.
另外我也有去參考您所說的資料, 不過它是ASM的版本, 小弟對組語不熟悉, 不知道是否有C語言的範例可以參考.
發表於: 2008/2/29 14:43
|
|||
|
Re: PORTB中斷
|
||||
---|---|---|---|---|
高級會員
|
在isr的清除中斷旗標前先做讀取portB.4的動作,因為PORT的狀態會被LATCH住。AN566 Using the PORTB Interrupt on Change as an External Interrupt有範例說明!!
發表於: 2008/2/29 9:01
|
|||
|
PORTB中斷
|
||||
---|---|---|---|---|
中級會員
|
小弟現在想要在APP013上作出一個程式. 當我按下SW2, PORTB(4:7)的值會改變, 借此觸動中斷使得LCD上印出文字, 可是在執行時, 在我按下SW2後, 程式卻沒有進入中斷.
不知道是程式哪裡有錯, 請各位大大給予指教, 謝謝 #include <p18f4550.h> #include "P18F_LCD.h" #include <delays.h> #include <portb.h> #define SW2 PORTBbits.RB4 // SW2 void OpenLCD(void); void isr_high(void); void main(void) { TRISD=0; TRISB=1; RCONbits.IPEN=1; // Enable Interrupt High Priority bit INTCONbits.GIEH=1; // Enable Global Interrupt bit INTCONbits.RBIE=1; // Enable High Priority Interrupt OpenPORTB (0xFF); while (1) { if (!SW2) PORTB=0xFF; } } #pragma code isrhighcode = 0x0008 void isr_high_direct(void) { _asm //begin in-line assembly goto isr_high //go to isr_high function _endasm //end in-line assembly } #pragma code #pragma interrupt isr_high void isr_high(void) { INTCONbits.RBIF=0; OpenLCD(); LCD_Set_Cursor(0,0); putrsLCD("PORTB INTERRUPT"); for (i=0;i<6;i++) Delay10KTCYx(200); }
發表於: 2008/2/27 19:02
|
|||
|