今回は、PICマイコンの割込み処理の仕組みと必要な設定内容について説明します。PICマイコンの割込みの仕組み割込み処理の実装を行う前に、PICマイコンの割込み処理の内部の様子を理解しておきましょう。割込み処理の説明の最初で、割込みにはいろいろな種類があることを説明しました。ピンの入力が変化した時や内部タイマーが設定した値に達した時などです。割込みが発生した場合にどのような処理をするか、という「割込み処理プログラム」が必要です。以下、それぞれについて詳しく説明します。どの種類の割込みを有効にするか「割込み処理の設定」PICマイコンはデフォルトではすべての種類の割込みは無効になっています。割込み処理を行う場合、必要な割込みを有効化する必要がありますが、有効化する設定はちょっと複雑です。厳密ではありませんが、PICマイコン内部の割込みの有効化設定は以下のようになっています。ピンの入力値に変化があった場合に割込み処理を行いたい場合は、まずは「入力値の変化があったら割込みを有効にする」という設定を行います。これだけではピンの入力値変化があった場合でも割込みは発生しません。そもそも割込みを発生させるかどうか、という元栓となるような有効化設定がありますので、この設定を行います。割込み自体の有効化の設定を行うという2つの設定が必要です。ピンの入力値変化があった場合に割込みを行う場合、追加の設定が必要です。ピンの入力値変化といっても、「0→1」の変化と「1→0」の変化があります。どちらの変化が起こったときに割込みを発生させるか、という設定が必要になります。ここまでをまとめると、ピンの入力値変化があった場合に割込み処理を行いたい場合、結局以下の3つの設定が必要になります。割込み自体の有効化の設定を行うそれでは、これら3つの設定をどのレジスタで行うか説明します。今回はRA3ピンの値が「1→0」になったときに割込みを発生する、というケースの設定レジスタになります。他の割込みについてはデータシートを参照いただければと思います。これらのレジスタを1にすると有効、0にすると無効になります。「割込み処理の設定」について、プログラム表記でまとめると以下になります。RA3ピンが1→0に変化したときに割り込み発生を有効化する場合は以下のプログラムになります。1;無効化する場合は以下のように記述します。0;レジスタが3つも出てきてどれがどれだかわからなくなってきましたよね。それぞれのレジスタ名は以下の略になっています。Enableの略で、英語交じりの日本語では「グローバルな割り込み処理許可」です。噛み砕くと「全体の割り込み処理許可」という意味で、割り込み処理自体を有効にするか無効にするかの元栓の設定になります。Enableの略で、「ピンの状態変化による割り込み許可」という意味になります。ピンの状態が変化した時の割り込みを有効にするか無効にするかの元栓の設定になります。edgeの略で、「PortAのピンの状態変化による割り込みのうち、1から0に変化した時の割り込み許可」というような意味になります。Negativeとは、1から0に変化することで、反対は0から1に変化する場合のPositiveです。実際に「IOCAP」というレジスタもあります。スイッチを押した時に0から1に変化する場合はIOCAPのレジスタを使用することになります。割込みが発生した場合に行う処理のプログラムも記述する必要があります。割込み処理プログラムの記述フォーマットは決まっています。以下のようになります。isr(void)」の部分ですが、割込み処理プログラムの書き方はこのように書く、と覚えてしまった方がよいでしょう。ちなみに関数名は「isr」としていますが、他の名称でも構いません。PICマイコンプログラムの割込み処理関数は一般的に「isr」としているようです。routine」で割込み処理プログラムの意味です。割込み処理プログラムの中身は当然ながら割込み処理の内容を記述します。割込み処理が終わったら、最後に割込み処理フラグをクリアします。「割込み処理フラグ」???という感じですよね。この「割込み処理フラグ」について簡単に説明します。「ピンの入力値変化」などの割込みが発生した場合、割込み処理プログラムが実行されますが、その際、どの割込みが発生したか「フラグ」と呼ばれるレジスタ値が1にセットされます。RA3ピンの入力値変化により割込みが発生した場合は、IOCAF3というレジスタが1にセットされます。「フラグ」とは「旗」の意味です。レジスタのビットを旗に見立てて、0が旗が降りている状態、1が旗が上がっている状態で、フラグが1か0か、つまり旗が上がっているのか降りているのかでどの割込み処理が発生したかわかるようになっています。ネットでたまに「何とかフラグが立った」という表現を見かけますが、おそらくここからきているのではないかと思っています。フラグに0あるいは1をセットすることを、一般的にはそれぞれ「フラグをクリアする」「フラグをセットする」と呼んでいます。割込み処理プログラムでは、最後にこの割込み処理が発生したフラグをクリアする必要があります。このフラグをクリアしないと、割込み処理が終わっても、再度割込み処理プログラムが呼ばれてしまいます。前回、LEDを1秒ごとに10回点滅させるプログラムを作成しました。このプログラムの「LEDを1秒ごとに10回点滅する」という処理部分は変更せずに、RA3ピンのスイッチが押されたら、高速にLEDを点滅する、という割込み処理を追加したプログラムを作成してみます。繰り返しになりますが、割込み処理の追加は以下の内容を追加する必要があります。割込みフラグクリアこれらの内容を追加したプログラムを以下に示します。プログラム内に上の番号も記載しましたので参考にしてみてください。XC8コンパイラVersion2.00以降では、割り込み関数の書き方が変わっています。以下のプログラムはXC8コンパイラVersion2.00以降のものです。Version2.00より前のバージョンをお使いの場合は以下の変更をお願いいたします。isr(void)に変更。