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

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

16F145xは、割込み(インタラプト)を設定することができます。割り込みが発生すると、プログラムは、現在実行している処理を中断し登録された割込み処理プログラムを実行します。割込み処理プログラムが終了すると、先ほど中断した元のプログラムに戻ります。なお、割り込み許可は2種類に分類されており、Timer0とI/Oピンからの割込み以外は、周辺(ペリフェラル)割込みとして一括で許可/禁止を指定することができます。各割り込みを発生させるモジュールには、割込み動作に関連する以下の2つの信号があります。

・イネーブルビット(XXXIE) : フラグビットがセットされた時に、割り込み処理の開始を許可します。
・フラグビット(XXXIF) : 割り込みイベントが発生した事を示します。

割り込み機能の信号の流れを下図に示します。

割り込みに関連するレジスター一覧を下表に示します。

レジスタ bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
INTCON GIE PEIE TMR0IE INTE IOCIE TMR0IF INTF IOCIF
PIE1 TMR1GIE ADIE RCIE TXIE SSP1IE - TMR2IE TMR1IE
PIR1 TMR1GIF ADIF RCIF TXIF SSP1IF - TMR2IF TMR1IF
PIE2 OSFIE C2IE C1IE - BCL1IE USBIE ACTIE -
PIR2 OSFIF C2IF C1IF - BCL1IF USBIF ACTIF -

割り込みのプログラム例

サンプルで作成したプログラムは、Timer1の割り込みにより、LEDを点滅させています。

<プログラム>

//  File name: interrupt
//  Description: Timer interrupt example
//  Timer1で内部クロック(4MHz)をカウントし、
//    カウントオーバー(262mS)で割込みが発生する
//    割込み処理ルーチンで、LEDを反転し点滅させる。
//  Notes: 4MHz内部クロック
//        LED    RC2
//        PushSW RA5
//    Language: MPLABX XC8 ver 2.10
//    Target:   PIC16F1459
// -------------------------------------------------------------------------

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