- 締切済み
PIC18F2550の割り込み処理について
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入力があることはテスターで確認したので、ソースコードの方に問題があるかと思います。 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- kenmary1961
- ベストアンサー率25% (3/12)
NO2です >INTCON3bits.INT2IF = 0; ではなくて INTCON3bits.INT2IF = 1; すべきかと 他のフラグも調べておく必要があるかと思います。
- kenmary1961
- ベストアンサー率25% (3/12)
PIC18F2550のハードウェアマニュアルを調べてみました。 http://www.microchip.com/wwwproducts/Devices.aspx?dDocName=en010280 の中で [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; という記述があり、フラグを消しているのでその点については問題は無いと思われますがいかがでしょうか?
- hidebun
- ベストアンサー率50% (92/181)
基本的なことをお尋ねいたしますが、割り込みルーチン内に書かれているコードは、 mainルーチン内などで、正常に動作することを確認されたのでしょうか?
補足
もちろん行いました。一度mainルーチン内で同じ処理をさせたところ、正常に動作することが確認できました。
補足
いえ、そうではなくデータシートに書かれているのは割り込み関数に入っている時点でフラグは1になっているので次の割り込み時のために0にしなければならないという意味だと思います。