プロが教える店舗&オフィスのセキュリティ対策術

PIC18F2550を使って、外部入力割り込みがちゃんと入るかどうかをチェックするため非常に簡単なサンプルコードを書いてみたのですが割り込みが発生しないのでどなたかご助力お願いします。(コンパイラ : MPLAB C18)
とりあえずスイッチを押せばINT2ピンに5Vが入力され、割り込みでLEDを点滅させるという主旨で以下のコードを書きこんで動作させました。

#include <p18f2550.h>
#include <delays.h>
#include <portb.h>

#pragma config FOSC = INTOSCIO_EC, FCMEN = ON, IESO = OFF
#pragma config PWRT = OFF, BOR = OFF, VREGEN = OFF
#pragma config WDT = OFF, CCP2MX = OFF
#pragma config PBADEN = ON, LPT1OSC = ON, MCLRE = OFF
#pragma config STVREN = ON, LVP = OFF, XINST = OFF
#pragma config CP0 = OFF, CP1 = OFF, CP2 = OFF, CP3 = OFF
#pragma config CPB = OFF, CPD = OFF, WRT0 = OFF, WRT1 = OFF
#pragma config WRT2 = OFF, WRT3 = OFF, WRTC = OFF
#pragma config WRTD = OFF, EBTR0 = OFF, EBTR1 = OFF, EBTR2 = OFF
#pragma config EBTR3 = OFF, EBTRB = OFF

int i;
void isr(void);

#pragma code isrcode = 0x0000008
void isr_direct(void)
{_asm GOTO isr _endasm}

#pragma code

#pragma interrupt isr
void isr(void) {
//外部入力割り込みの処理はここに記述
INTCON3bits.INT2IF = 0;
for(i=0; i<10; i++)
{
LATCbits.LATC1 = 1;
Delay10KTCYx(255);
LATCbits.LATC1 = 0;
Delay10KTCYx(255);
}
}


void main()
{
OSCCON = 0b01110000; //システムクロックを8MHZに設定
TRISA = 0b1111111; //ポートAをすべて入力に設定
TRISB = 0b11111111; //ポートBをすべて
TRISC = 0; //ポートCをすべて出力に設定

//ポートRB2の外部割込みON, 立上がりエッジでON, Bポートの抵抗プルアップOFF
OpenRB2INT(PORTB_CHANGE_INT_ON & RISING_EDGE_INT & PORTB_PULLUPS_OFF);
RCONbits.IPEN = 0; //割り込み優先制御OFF
INTCON3bits.INT2IE = 1;
INTCONbits.GIE = 1; //全割り込み許可

while(1);
}


しかし、スイッチを押しても割り込み処理に移行せず無反応のままです。
スイッチを押した時にINT2ピンに5V入力があることはテスターで確認したので、ソースコードの方に問題があるかと思います。

よろしくお願いします。

A 回答 (3件)

NO2です



>INTCON3bits.INT2IF = 0;
ではなくて

INTCON3bits.INT2IF = 1;
すべきかと

他のフラグも調べておく必要があるかと思います。

この回答への補足

いえ、そうではなくデータシートに書かれているのは割り込み関数に入っている時点でフラグは1になっているので次の割り込み時のために0にしなければならないという意味だと思います。

補足日時:2012/11/14 14:02
    • good
    • 0

PIC18F2550のハードウェアマニュアルを調べてみました。


http://www.microchip.com/wwwproducts/Devices.asp …
の中で
[Documentation & Software]をクリックすると、
[PIC18F2455/2550/4455/4550 Data sheet]
が出てきますので、それをクリックして、データシートを
読み出してください。

9.2 INTCON Registers
項の先頭の右端にある、四角で囲まれた Note: に

User software should
ensure the appropriate interrupt flag bits

とありますので、割り込み処理の最後に、割り込みフラグを
ユーザープログラムで変更する必要があるようです。

この回答への補足

それはおそらく割り込み関数の中で割り込みフラグを0にしなければならないという意味だと思います。
この場合は割り込み関数の中で

INTCON3bits.INT2IF = 0;

という記述があり、フラグを消しているのでその点については問題は無いと思われますがいかがでしょうか?

補足日時:2012/11/13 14:37
    • good
    • 0

基本的なことをお尋ねいたしますが、割り込みルーチン内に書かれているコードは、


mainルーチン内などで、正常に動作することを確認されたのでしょうか?

この回答への補足

もちろん行いました。一度mainルーチン内で同じ処理をさせたところ、正常に動作することが確認できました。

補足日時:2012/11/13 14:39
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!