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

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

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

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

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

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

割り込みのプログラム例

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

<回路図>

<プログラム>

/*********************************************************************
 *  File name: interrupt
 *  Description: Timer interrupt example
 *  Timer1で内部クロック(4MHz)をカウントし、
 *    カウントオーバー(262mS)で割込みが発生する
 *    割込み処理ルーチンで、LEDを反転し点滅させる。
 *  Notes: 4MHz内部クロック
 *
 *      1 VDD         8 VSS
 *      2 RA5         7 RA0
 *      3 RA4         6 RA1
 *      4 MCLR        5 RA2 LED
 *
 * PIC12F1822  MPLAB X IDE with XC8 Ver1.32
 * Copyright (c) 2014 iwamoto All Rights Reserved
 * *******************************************************************/

#define LED LATA2
#include <xc.h>

//******************* コンフィグレーション ****************************
#pragma config FOSC = INTOSC, WDTE = OFF, PWRTE = OFF, MCLRE = OFF, CP = OFF
#pragma config CPD = OFF, BOREN = ON, CLKOUTEN = OFF, IESO = OFF, FCMEN = OFF
#pragma config WRT = OFF, PLLEN = OFF, STVREN = ON, BORV = LO, LVP = OFF

// ******************* main ******************************************
void main() {
    OSCCON = 0b01101010;            //  内部クロック4Mhz
    PORTA  = 0x00;
    TRISA  = 0b11111011;            // RA1:LED出力 他は入力
    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を反転
   }
}