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

ホーム
12F1822
16F1455
16F1459
18F14K50
18F26J50
dsPIC
その他
    
16F18313
16F18325
16F18346
16F1619
Curiosity
---
---
ピン入力変化時の割り込み
2020-10-05

PORTA、PORTB、およびPORTCピンは、Interrupt-On-Change(IOC)ピンとして動作するように構成し、入力信号の立ち上がりエッジまたは立ち下がりエッジを検出することで割り込みを生成できます。個々のポートピンや、それらピンを組み合わせで割り込みを生成することが可能です。I-O-C モジュールには、次の機能があります。

図14-1にIOCモジュールのブロック図を示します。

モジュールの有効化

個々のポートピンが割り込みを生成できるようにするには、INTCONレジスタのIOCIEビットを「1」に設定する必要があります。IOCIEビットが無効になっている場合でも、ピンのエッジ検出は動作しますが、割り込みは生成されません。

個別ピンの設定

各ポートピンには、立ち上がりエッジ検出器と立ち下がりエッジ検出器があります。ピンの立ち上がりエッジを検出するには、IOCxPレジスタの関連ビットを「1」に設定します。立ち下がりエッジを検出するには、IOCxNレジスタの関連ビットを「1」に設定します。

IOCxPレジスタとIOCxNレジスタの両方の関連ビットを「1」に設定することで、立ち上がりエッジと立ち下がりエッジの両方を検出するように構成できます。

割り込みフラグ

IOCAF、IOCBF、およびIOCCFレジスタにそれぞれあるIOCAFx、IOCBFx、およびIOCCFxビットは、関連するポートに対応するステータスフラグです。適切に有効化されたピンで予期されるエッジが検出されると、そのピンのステータスフラグが「1」にセットされ、IOCIEビットが「1」に設定されていると割り込みが生成されます。INTCONレジスタのIOCIFビットは、すべてのIOCAFx、IOCBFx、およびIOCCFxビットのステータスを反映します。

割り込みフラグのクリア

個々のステータスフラグ(IOCAFx、IOCBFx、およびIOCCFxビット)は、ゼロにリセットすることでクリアできます。このクリア操作中に別のエッジが検出された場合、実際に書き込まれている値に関係なく、関連するステータスフラグがシーケンスの最後に「1」にセットされます。

フラグのクリア中に検出されたエッジが失われないようにするには、既知の変更されたビットをマスクするAND演算のみを実行する必要があります。次のシーケンスは、実行する必要があるものの例です。

例 割り込みフラグのクリア(PORTAの例)

	MOVLW   0xff
	XORWF   IOCAF、W
	ANDWF   IOCAF、F

スリープ時の操作

IOCIEビットが「1」に設定されている場合、I-O-C 割り込みシーケンスは、デバイスをスリープモードからウェイクアップします。

スリープモード中にエッジが検出された場合、IOCxFレジスタは、スリープ後に実行される最初の命令の前に更新されます。

レジスタ定義:

レジスタ bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
INTCON GIE PEIE TMR0IE INTE IOCIE TMR0IF INTF IOCIF
IOCAF IOCAF5 IOCAF4 IOCAF3 IOCAF2 IOCAF1 IOCAF0
IOCAN IOCAN5 IOCAN4 IOCAN3 IOCAN2 IOCAN1 IOCAN0
IOCAP IOCAP5 IOCAP4 IOCAP3 IOCAP2 IOCAP1 IOCAP0
IOCBF IOCBF7 IOCBF6 IOCBF5 IOCBF4
IOCBN IOCBN7 IOCBN6 IOCBN5 IOCBN4
IOCBP IOCBP7 IOCBP6 IOCBP5 IOCBP4
IOCCF IOCCF7 IOCCF6 IOCCF5 IOCCF4 IOCCF3 IOCCF2 IOCCF1 IOCCF0
IOCCN IOCCN7 IOCCN6 IOCCN5 IOCCN4 IOCCN3 IOCCN2 IOCCN1 IOCCN0
IOCCP IOCCP7 IOCCP6 IOCCP5 IOCCP4 IOCCP3 IOCCP2 IOCCP1 IOCCP0

ピン入力変化割り込みのプログラム例

RC4 に接続されたPushSWを押すと RC4 に接続されたLEDが点灯/消灯するプログラムを作成しました。

<プログラム>

/*********************************************************************
*  File name: IOC割り込み
*  Notes: 1MHz内部クロック PLLはOFF
*        LED  RC5   pushSW RC4
* PIC16F1619  MPLAB X IDE with XC8 v2.20
* Copyright (c) 2017 iwamoto All Rights Reserved
* *******************************************************************/
#include 

#define _XTAL_FREQ 1000000
#define LED    LATC5
#define pushSW RC4

// CONFIG
#pragma config FOSC = INTOSC, PWRTE = OFF, MCLRE = ON, CP = OFF
#pragma config BOREN = ON, CLKOUTEN = OFF, IESO = ON, FCMEN = ON
#pragma config WRT = OFF, PPS1WAY = ON, ZCD = OFF, PLLEN = OFF
#pragma config STVREN = ON, BORV = LO, LPBOR = OFF, LVP = ON
#pragma config WDTCPS = WDTCPS1F, WDTE = OFF, WDTCWS = WDTCWSSW, WDTCCS = SWC


/*********************************************************
                         Main application
 *********************************************************/
void main(void)
{
    OSCCON = 0b01011000;	// PLL disabled; 1MHz_HF; FOSC;
    TRISC5 = 0;             // Outputs RC5

    IOCCN4 = 1;             // SW押すと割り込みがかかる
    IOCCF4 = 0;             // 念のためIOCフラグクリア
    IOCIE  = 1;             // IOC割り込みを許可
    PEIE = 1;               // 周辺機能割込みの使用許可
    GIE  = 1;               // 全割込みの使用許可
    while(1);               // 割込みを待つ
}

//----------------------割込み処理------------------------
void __interrupt() IOC_isr(void) {
   if(IOCIF){              // IOCからの割込みを確認
       IOCCF4 = 0;         // 割込みフラッグをクリア
       LED = !LED;         // LEDを反転
       __delay_ms(10);     // チャタリング防止
   }
}