PIC12F1822を使って、MCCでIOC(Interrupt on Change 状態変化割込み)の設定とテストをします。
テストする回路です。RA5をプルアップしておき、SWが押すとピンの入力の状態が1から0に変化します。この時発生するIOC割込みで、RA0に接続したLEDを点滅させます。(SWを押すたびにLEDは点灯と消灯を繰り返します。)
![](https://blogimg.goo.ne.jp/user_image/32/5a/00b3bf38637d8060796844062580441d.png)
projectを作成して、MCCを開きます。
System Moduleの設定です。
INTOSC,FOSC,Clock 8MHzとしました。Low-voltage Programingのチェックを外します。
RA0はoutput、RA5はinputとし、WPU(ウィークプルアップ)します。
![](https://blogimg.goo.ne.jp/user_image/3a/87/91158c2d56664174e7237ff225e39857.png)
Pin Moduleです。
![](https://blogimg.goo.ne.jp/user_image/67/9f/2f37ec29e95a6f1ccc4b38e71e7d231d.png)
Pin ModuleのRegisterを開きます。IOC割込みのため、IOCAN5をenableにします。これによって、RA5の入力が1から0に変化する(立下り)時に割込みが発生します。
![](https://blogimg.goo.ne.jp/user_image/6a/9c/9986874686d5b77c6b18cd6034c6553d.png)
Interrupt Moduleの設定です。
Pin ModuleのIOCOをEnableにします。
![](https://blogimg.goo.ne.jp/user_image/36/15/a0c5f7d8347a158573b46d2b0488d268.png)
設定を終了して、Generateして、MCCを終了し、プログラミングに入ります。
main.cです。
--------------------------------------------------------
/*
* PIC12F1822 MCC IOC test
* 2021.05.25
* JH7UBC Keiji Hata
*/
#include "mcc_generated_files/mcc.h"
void main(void)
{
SYSTEM_Initialize();// initialize the device
INTERRUPT_GlobalInterruptEnable();// Enable the Global Interrupts
INTERRUPT_PeripheralInterruptEnable();// Enable the Peripheral Interrupts
LATA0 = 0;
while (1)
{
}
}
--------------------------------------------------------
* PIC12F1822 MCC IOC test
* 2021.05.25
* JH7UBC Keiji Hata
*/
#include "mcc_generated_files/mcc.h"
void main(void)
{
SYSTEM_Initialize();// initialize the device
INTERRUPT_GlobalInterruptEnable();// Enable the Global Interrupts
INTERRUPT_PeripheralInterruptEnable();// Enable the Peripheral Interrupts
LATA0 = 0;
while (1)
{
}
}
--------------------------------------------------------
普通は、このmain()の中に__interrupt() ISR();という記載をして、割込み時に実行する関数(この場合は、ISR())指定するのですが、ありません。
では、どこにあるのでしょうか。interrupt_manager.cの中にあります。
そして、割込みがあった時に、PIN_MANAGER_IOC();が実行されます。
![](https://blogimg.goo.ne.jp/user_image/2a/63/2c87df55c8af92d2ca03fa50c2a83f24.png)
では、PIN_MANAGER_IOC()は、どこにあるのでしょうか。pin_manager.cの中にあります。
更に、IOCAF5のフラッグが立った時に、IOCAF5_ISR();が実行されます。
従って、IOCAF5_ISR()の中に、割込み時に実行する処理を記入します。
今回は、LEDを点滅させる処理を書きました。(赤い四角の部分)
ここで使う変数(この場合は、val)は、pin_manager.cの最初の方で定義します。今回は、volatile unsigned char val = 0;としています。
![](https://blogimg.goo.ne.jp/user_image/1a/dd/b3887e85650a304267de8c19962d55e1.png)
これで、build,書き込みをしました。
ブレッドボードです。
![](https://blogimg.goo.ne.jp/user_image/34/3b/7472f3348870c80b3d459806bfb93d8c.jpg)
タクトスイッチを押すたびに点灯と消灯を繰り返します。
ただ、タクトスイッチのチャタリングのため、押し方によっては誤動作します。
今回のプログラムでは、チャタリング対策はしていません。
MPLAB X MCCを使っての感想です。
設定を画面上でできるので、簡単なのですが、一旦設定してから後で変更しても変更内容が反映されないことがあります。
それから、前の設定やhファイルの記憶が残っていて、エラーがでたりします。
これらを回避するには、結局プロジェクトを作り直すしかありません。ですから、迷路に入ってしまった時は、問題のプロジェクトを削除して、作り直した方が良いようです。それから、MCC設定に入る前にしっかりと設計を行うことが肝心だと思いました。