第17回 割込み処理(2)〜割込み処理プログラムの基本構造〜

割込み処理プログラムの基本構造について説明します。

目次

今後の説明の流れ

割り込み処理のプログラムは少し理解しづらいところがあります。

そこで、なるべくシンプルなプログラムをベースにして、割り込み処理を追加するとどのような構造になるのか、説明していきます。

これからの説明では、タイマープログラムはいったん置いておいて、簡単なプログラムを作成して割込み処理プログラムの基本構造を確認することにします。


これから、次のようなプログラム作成を通して、割込み処理を行うための基本的なプログラムの書き方を確認していきます。

  1. 最初に、LEDを1秒間隔で点滅するプログラムを作成します。
    点滅は「点灯1秒・消灯1秒」を10回繰り返すプログラムにします。
  2. 次に、LEDを点滅処理している最中にスイッチが押されたとき、割り込み処理としてLEDを0.1秒ごとに2回点滅処理をして、元の❶の処理に戻るようにします。

割込み処理のポイントは、❶のLED点滅処理のプログラム内容を変更することなく、❷のスイッチが押されたときの処理を独立して書くことができる、というところにあります。

今回の記事では❶の具体的なプログラムを作成し、❷の割り込み処理を追加するとプログラム構造はどのように変わるのか、確認します。

❷の実際のプログラムは次回の記事で解説します。

❶ LED点滅プログラム

新規プロジェクトを作成して、LEDを1秒ごとに10回点滅させるプログラムを作成します。

なお、10回点滅後にアラームを鳴らすようにします。

次のように、今までのプログラムを流用して作成してみました。

/*
 * PICマイコン電子工作入門 応用編 第17回
 *   割り込み処理構造理解のためのベースプログラム
 *   LEDを1秒間隔で10回点滅後、アラームを鳴らす
 */

#include <xc.h>

// PIC12F1822 Configuration Bit Settings
// CONFIG1
#pragma config FOSC = INTOSC    // Oscillator Selection (INTOSC oscillator: I/O function on CLKIN pin)
#pragma config WDTE = OFF       // Watchdog Timer Enable (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable (PWRT disabled)
#pragma config MCLRE = OFF      // MCLR Pin Function Select (MCLR/VPP pin function is digital input)
#pragma config CP = OFF         // Flash Program Memory Code Protection (Program memory code protection is disabled)
#pragma config CPD = OFF        // Data Memory Code Protection (Data memory code protection is disabled)
#pragma config BOREN = ON       // Brown-out Reset Enable (Brown-out Reset enabled)
#pragma config CLKOUTEN = OFF   // Clock Out Enable (CLKOUT function is disabled. I/O or oscillator function on the CLKOUT pin)
#pragma config IESO = OFF       // Internal/External Switchover (Internal/External Switchover mode is disabled)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable (Fail-Safe Clock Monitor is disabled)
// CONFIG2
#pragma config WRT = OFF        // Flash Memory Self-Write Protection (Write protection off)
#pragma config PLLEN = OFF      // PLL Enable (4x PLL disabled)
#pragma config STVREN = OFF     // Stack Overflow/Underflow Reset Enable (Stack Overflow or Underflow will not cause a Reset)
#pragma config BORV = LO        // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (Vbor), low trip point selected.)
#pragma config LVP = OFF        // Low-Voltage Programming Enable (High-voltage on MCLR/VPP must be used for programming)


// クロック周波数指定
// __delay_ms()関数が使用する
#define _XTAL_FREQ 1000000

void main(void) {

    // PICマイコン設定
    OSCCON = 0b01011010;  // 内部クロック周波数を1MHzに設定
    ANSELA = 0b00000000;  // 全てのピンをデジタルに設定
    TRISA  = 0b00001000;  // RA3を入力、それ以外は出力に設定

    // ブザーをOFFにする
    LATA4 = 0;

    // LEDを1秒間隔で10回点滅する
    for(uint8_t i=0; i<10; i++) {
        LATA5 = 0;
        __delay_ms(1000);
        LATA5 = 1;
        __delay_ms(1000);            
    }

    // アラーム音を3回鳴らす
    for(uint8_t i=0; i<3; i++) {
        // ピッ
        LATA4 = 1;
        __delay_ms(70);
        LATA4 = 0;
        __delay_ms(70);
        // ピッ
        LATA4 = 1;
        __delay_ms(70);
        LATA4 = 0;
        __delay_ms(70);
        // ピーッ
        LATA4 = 1;
        __delay_ms(70);
        LATA4 = 0;
        // 1回分の音パターンの間を少し空ける
        __delay_ms(800);
    }

    // 動作停止
    while(1){
    }
}

これから、このプログラムに対して、「RA3のスイッチが押されたら、1秒ごとの点滅処理は一旦中止して、LEDを0.1秒ごとに2回点滅、終わったら元に戻る」という割込み処理を追加していくことになります。

実際のプログラムの前に、上のプログラムに対して割り込み処理を追加すると、どのようなプログラム構造になるか確認します。

割込み処理のプログラム構造

割込み処理の基本的なプログラム構造の概念図を説明します。

まずは、先ほどのLED点滅プログラムです。

プログラム構造としては次のようになっています。

ベースプログラム

このプログラムに対して、割込み処理を追加するとどのような構造になるか説明します。

割込み処理の内容は「スイッチが押されたら、通常の点滅処理は一旦中止して、LEDを0.1秒ごとに5回点滅、終わったら元に戻る」です。

プログラムの追加は大きく分けて2種類あります。

一つは「割込み処理プログラムの追加」、もう一つは「割込みの有効化/無効化」です。

先ほどのプログラム構造に、この2種類を追加すると以下のようになります。

割込み処理に関して追加したところは緑色の部分です。

割り込み処理追加プログラム

まず、main関数とは別に「LEDを0.1秒ごとの点滅を2回繰り返す」という処理内容の割り込み処理関数を追加します。(上の図の一番下の緑色のブロック)

次に、本体のmain関数の中で、割り込み処理を行いたい部分の前で「割込み有効化」をします。

この「割込み有効化」は、具体的には「RA3レジスタの値が1から0に変化したら、現在の処理を一旦中断して『割り込み処理関数』を実行する」という設定になります。

次に、LEDを1秒ごとの10回の点滅処理が終わり、割り込み処理が必要なくなったら「割込み無効化」をします。(例えばブザーを鳴らしている間も割り込み処理をさせたい場合は、この割込み無効化はする必要はありません)


このように「割込み処理」とは、マイコンの何かの状態が変化したら、今実行している処理は一旦中断して、別に用意した処理を行う、というものです。

今回は、main関数の中のLED点滅処理中に、スイッチが押された場合にLEDを0.1秒ごとに点滅する、という割り込み処理のプログラム構造を説明しましたが、他のケースでも割込み処理プログラムの基本構造は同じです。

「割り込み処理とは?」の記事の最初の方で出てきた、割り込み処理の難しい説明文がありましたよね。

「通常のプログラムを動作中、周辺機器などからの要求により強制的に別のプログラムを実行する処理」

割り込み処理は一般的にはこのように説明されていますが、ここまでの内容が理解できると、なんとなくこの説明の意味が明確になってきた気がしませんか?


次回は、割込み処理プログラムを実際に作成して、ブレッドボードの回路で動作確認します。

更新履歴

日付内容
2017.8.15新規投稿
2018.12.2割り込み処理内容変更
2025.5.22説明内容補足
プログラム変更(アラームをピピピッに変更)
通知の設定
通知タイミング
guest
0 コメント
新しい準
古い順 一番投票が多い
本文中にフィードバック
全てのコメントを見る
目次