PIC 12F615


初めての PIC 割り込みに挑戦 (4)

もう一つの割り込み

前回はIOC系の状態変化割り込みを試しました。今回はINT系の外部割込みにチャレンジします。
基本的には、IOC系の状態変化割り込みと大きくは変わりません。使われるピンと許可する割り込みの種類を変更することで実現できます。
もう一つの違いとして外部割込みは、立ち上がりと立下りのどちらかでしかトリガーされません。
そして実際のソースは次のようになりました。

/*
 * CNC Power unit
 * 
 * File:   main.c
 * Author: masato
 *
 * Created on 2017/02/05, 8:02
 */

// PIC12F615 Configuration Bit Settings
// 'C' source line config statements
// CONFIG
#pragma config FOSC = INTOSCIO  // Oscillator Selection bits (INTOSCIO oscillator: I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled and can be enabled by SWDTEN bit of the WDTCON register)
#pragma config PWRTE = ON       // Power-up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = OFF      // MCLR Pin Function Select bit (MCLR pin function is digital input, MCLR internally tied to VDD)
#pragma config CP = OFF         // Code Protection bit (Program memory code protection is disabled)
#pragma config IOSCFS = 8MHZ    // Internal Oscillator Frequency Select (4 MHz)
#pragma config BOREN = ON       // Brown-out Reset Selection bits (BOR enabled)

// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.

#include <xc.h>

void interrupt ISR(void) {
    if (INTCONbits.INTF) {
        GP1 = !GP1;
        INTCONbits.INTF = 0;    // 割り込みフラグクリア
    }
}

void main(void) {

    // レジスタセット
    TRISIO = 0b00001000;
    ANSEL =  0b00000000;
    CMCON0 = 0b00000000;

    OPTION_REGbits.INTEDG = 1;  // Interrupt on rising edge of GP2/INT pin
    INTCONbits.INTE = 1;        // External Interrupt許可
    INTCONbits.GIE =  1;        // グローバル割り込み許可

    GP0 = 0;
    GP1 = 0;
    GP2 = 0;
    GP4 = 0;
    GP5 = 0;

    while(1);

    return;
}