モダーンなPIC16F1xxx マイコンは外部割り込みも2系統の方法をサポートしてます。IOCと呼ばれる方はカッコよく複雑な条件で割り込み処理が開始できます。一方、単にINT Pinとか、EXT_INTと呼ばれる方は「昔ながらの」割り込みピンのようです。まず今回は「昔ながらの」方法で外部割込みをかけてみたいと思います。
※『PIC三昧』PIC関係の記事総目次はこちら
MPLAB X IDEのMCCでコンフィギュレーション
今回もターゲット・マイコンは、PIC16F18855 です。例によってMPLAB X IDEを起動後、マイコン機種を選択した後は、MCCを使ってプロジェクトをコンフィギュレーションします。使用したのは MCC Classicです。
まずは今回使用するDevice Resourcesから。以下のEXT_INTの+ボタンを押して、「昔ながらの」外部割込み信号をサポートするリソースをプロジェクトに追加します。
上のアイコンを見ると、何かいろいろ選択する項目があるやに見えますが、なんのことはありません。選択可能なのは立ち上がりエッジ(rising edge)か立下りエッジ(falling edge)かの選択だけです。こんな感じ。
今回はデフォルトのrising edgeなので何もしていません。
このEXT_INT入力をどのPinから得るのかは、Pin Managerで設定可能です。接続可能なピンの中でPort BのPin0がデフォルトで選択されてました。今回は端子設定もデフォルトのまま。
なお、割り込みが掛かったことを外部で知るためにPort AのPin0をGPIO出力に設定してます。使用しているEvaボードではここに赤色のLEDが接続されてます。
ここまでの設定を行って “Generate”ボタンを押せば、MCCがソースコードを自動生成してくれます。
外部端子割り込みを受けるためのソース変更
さて、生成されたソースコードにちと手をいれます。まずは、割り込みハンドラ側から。通常はINT_InterruptHanler()というハンドラ関数にいろいろと書き込むのだと思いますが、簡単のためINT_CallBack()関数内にちょろっと書き込みました。また、対応するextern宣言も近くに。黄色いマーカ部分が追加した部分です。
上記により、割り込みが発生するたびに flag という変数が論理0と1の間をトグルするようになる筈。
つづいてmain関数側の変更部分。volatileな変数 flagの実体の宣言、割り込みの許可、そして flag の値に応じてPort Aピン0に接続されたLEDの点滅の有無が制御されるように書いてます。Lチカの応用?
volatile int flag = 0; void main(void) { SYSTEM_Initialize(); INTERRUPT_GlobalInterruptEnable(); INTERRUPT_PeripheralInterruptEnable(); while (1) { if (flag) { RA0 = 1; __delay_ms(500); } RA0 = 0; __delay_ms(500); } }
BUILD SUCCESSFULとな。
ボード上で実行
今回のテスト用回路は簡単っす。回路が以下に。ぶっちゃけ、引き出しの奥に眠っていたプッシュスイッチモジュールをエバボードにとりつけたピンソケットに差し込んだだけ。
現物が動作しているところが以下に。左側のプッシュスイッチを1度押して右側のボードの中央付近のD2とあるLEDを見ているとほぼ1秒周期で点滅します。もう一度プッシュスイッチを押すと点滅はとまります。
外部割り込みハンドラ、動いているようだな。あたりまえか。