PIC16F18325の基本動作から応用プログラムまでを学びます。

ホーム
12F1822
16F1455
16F1459
18F14K50
18F26J50
dsPIC
その他
    
16F18313
16F18325
16F18346
16F1619
Curiosity
---
---
割込
2020-06-22

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で内部クロック(1MHz)をカウントし、
 *    カウントオーバーで割込みが発生する
 *    割込み処理ルーチンで、LEDを反転し点滅させる。
 * PIC16F18325 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.LATC0

void main(void) {

    TRISC = 0b111110;       // RC0を出力に設定

    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を反転
   }
}