P16F18325は、割込み(インタラプト)を設定することができます。割り込みが発生すると、プログラムは、現在実行している処理を中断し登録された割込み処理プログラムを実行します。割込み処理プログラムが終了すると、先ほど中断した元のプログラムに戻ります。なお、割り込み許可は2種類に分類されており、Timer0とI/Oピンからの割込み以外は、周辺(ペリフェラル)割込みとして一括で許可/禁止を指定することができます。各割り込みを発生させるモジュールには、割込み動作に関連する以下の2つの信号があります。
イネーブルビット(XXXIE) | : フラグビットがセットされた時に、割り込み処理の開始を許可します。 |
フラグビット(XXXIF) | : 割り込みイベントが発生した事を示します。 |
割り込み機能の信号の流れを下図に示します。
割り込みに関連するレジスター一覧を下表に示します。
レジスタ | bit7 | bit6 | bit5 | bit4 | bit3 | bit2 | bit1 | bit0 |
---|---|---|---|---|---|---|---|---|
INTCON | GIE | PEIE | - | - | - | - | - | INTEDG |
PIE0 | - | - | TMR0IE | IOCIE | - | - | - | INTE |
PIF0 | - | - | TMR0IF | IOCIF | - | - | - | INTF |
PIE1 | TMR1GIE | ADIE | RCIE | TXIE | SSP1IE | BCL1IE | TMR2IE | TMR1IE |
PIR1 | TMR1GIF | ADIF | RCIF | TXIF | SSP1IF | BCL1IF | TMR2IF | TMR1IF |
PIE2 | TMR6IE | C2IE | C1IE | NVMIE | SSP2IE | BLC2IE | TMR4IE | NCO1IE |
PIR2 | TMR6IF | C2IF | C1IF | NVMIF | SSP2IF | BLC2IF | TMR4IF | NCO1IF |
PIE3 | OSFIE | CSWIE | TMR3GIE | TMR3IE | CLC4IE | CLC3IE | CLC2IE | CLC1IE |
PIF3 | OSFIF | CSWIF | TMR3GIF | TMR3IF | CLC4IF | CLC3IF | CLC2IF | CLC1IF |
PIE4 | CWG2IE | CWG1IE | TMR5GIE | TMR5IE | CCP4IE | CCP3IE | CCP2IE | CCP1IE |
PIF4 | CWG2IF | CWG1IF | TMR5GIF | TMR5IF | CCP4IF | CCP3IF | CCP2IF | CCP1IF |
サンプルで作成したプログラムは、Timer1の割り込みにより、LEDを点滅させています。
<回路図>
<プログラム>
// File name: interrupt // Description: Timer interrupt example // Timer1で内部クロック(4MHz)をカウントし、 // カウントオーバー(262mS)で割込みが発生する // 割込み処理ルーチンで、LEDを反転し点滅させる。 // Notes: 4MHz内部クロック // LED RC2 // PushSW RA5 // Language: MPLABX XC8 // Target: PIC16F18313 // ------------------------------------------------------------------------- #include <xc.h> #define LED LATC2 #pragma config FOSC = INTOSC, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF #pragma config BOREN = ON, CLKOUTEN = OFF, IESO = OFF, FCMEN = OFF #pragma config WRT = OFF, CPUDIV = NOCLKDIV, USBLSCLK = 48MHz, PLLMULT = 3x #pragma config PLLEN = DISABLED, STVREN = ON, BORV = LO, LPBOR = OFF, LVP = OFF void main(void){ OSCCON = 0b00110110; // 内部クロック4Mhz TRISC = 0b11111011; // 入出力設定 T1CON = 0b00100001; // Timer 1 設定(262mSecごと) // 内部クロック(FOSC/4)をカウント // PS_1/4 TMR1IF = 0; // タイマー1 割込みフラッグをクリア TMR1IE = 1; // タイマー1 割込みを使用許可 PEIE = 1; // 周辺機能割込みの使用許可 GIE = 1; // 全割込みの使用許可 while(1); // 割込みを待つ } //----------------------割込み処理------------------------ void interrupt T1_isr(void){ if(TMR1IF){ //Timer1からの割込みを確認 TMR1IF = 0; // 割込みフラッグをクリア LED = !LED; // LEDを反転 } }