PIC16F18346は、割込み(インタラプト)を設定することができます。割り込みが発生すると、プログラムは、現在実行している処理を中断し登録された割込み処理プログラムを実行します。割込み処理プログラムが終了すると、先ほど中断した元のプログラムに戻ります。なお、割り込み許可は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で内部クロック(1MHz)をカウントし、
* カウントオーバーで割込みが発生する
* 割込み処理ルーチンで、LEDを反転し点滅させる。
* PIC16F18346 xc-8 ver2.10
* Created on June 22, 2020
**************************************/
#include <xc.h>
#pragma config FEXTOSC = OFF,RSTOSC = HFINT1 // HFINTOSC (1MHz)
#pragma config CLKOUTEN = OFF,CSWEN = OFF,FCMEN = OFF
#pragma config MCLRE = OFF,PWRTE = OFF,WDTE = OFF,LPBOREN = OFF
#pragma config BOREN = OFF,BORV = LOW,PPS1WAY = OFF,STVREN = ON
#pragma config DEBUG = OFF
#pragma config WRT = OFF,LVP = OFF,CP = OFF,CPD = OFF
#define LED LATCbits.LATC5
void main(void) {
TRISC5 = 0; // RC5を出力に設定
T1CON = 0b00000001; // Fosc/4 Sync PreS 1/1
T1GCON = 0; // ゲート機能は使用せず
TMR1IF = 0; // タイマー1 割込みフラッグをクリア
TMR1IE = 1; // タイマー1 割込みを使用許可
PEIE = 1; // 周辺機能割込みの使用許可
GIE = 1; // 全割込みの使用許可
while(1); // 割込みを待つ
}
//----------------------割込み処理------------------------
// xc-8 ver2.0 で変更になった
// void interrupt T1_isr(void){ // xc-8 ver2.0 前
//----------------------割込み処理------------------------
void __interrupt() T1_isr(void) {
if(TMR1IF){ // Timer1からの割込みを確認
TMR1IF = 0; // 割込みフラッグをクリア
LED = !LED; // LEDを反転
}
}
pic-as アセンブラプログラムは、[こちら]