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); // チャタリング防止 } }