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