K-05499
秋月電子で見つけたPIC18F14K50搭載の小型マイコンボードを小さなメカに組み込もうと思いまして、赤外リモコン受信用に状態変化割り込み(interrupt on change)を使おうとしたのですが、なかなかうまくいかず手こずってしまいました。

とりあえず動いたコードを載せておきます。MPLABX/XC8環境です。

#include <xc.h>
#include <plib/timers.h>

// PIC18F14K50
#pragma config FOSC   = HS,  PLLEN  = ON,  FCMEN  = OFF
#pragma config IESO   = OFF, USBDIV = OFF, CPUDIV = NOCLKDIV
#pragma config PWRTEN = OFF, BOREN  = OFF, WDTEN  = OFF
#pragma config HFOFST = OFF, MCLRE  = OFF
#pragma config STVREN = ON,  BBSIZ  = OFF, LVP    = OFF
#pragma config XINST  = OFF
#pragma config CP0    = OFF, CP1    = OFF, CPB    = OFF
#pragma config WRT0   = OFF, WRT1   = OFF, WRTB   = OFF, WRTC   = OFF
#pragma config EBTR0  = OFF, EBTR1  = OFF, EBTRB  = OFF

#define _XTAL_FREQ 12000000

//remote receive state
#define IDLE	0
#define RCVCODE	1
#define CHECKCODE   2

void main(void)
{
    ADCON1 |= 0b1111;
    
    TRISB = 0x80; //RB7:in
     
    //timer1 setting 時間計測に使用
    OpenTimer1(TIMER_INT_OFF & T1_SOURCE_INT & T1_PS_1_8);

    IOCBbits.IOCB7 = 1;
    INTCONbits.RABIE = 1;
    INTCONbits.GIE = 1;
   
    while(1) {
    }
}

void interrupt isr(void) {

    if (INTCONbits.RBIF) {
        if (PORTB) {
            asm("nop");
        }
        if(PORTBbits.RB7){  //rise
            
        }else{  //fall
            
        }
        INTCONbits.RBIF = 0;
    }
}