秋月電子で見つけた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; } }