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

ホーム
12F1822
16F1455
16F1459
18F14K50
18F26J50
dsPIC
その他
    
16F18313
16F18325
16F18346
16F1619
Curiosity
---
---
割込
2017-09-02

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