<V.3版>
スイッチによるLED ON/OFF
コールバック関数による
入力変化割り込み
(→プロジェクトファイル(Harmony Ver.3版 MHC v3.6.0) ダウンロード)
<仕様>
ボタンスイッチSWをクリックすると
① LEDが点灯していた場合は消灯する。
② LEDが消灯していた場合は点灯する。
③ スイッチはモーメンタリースイッチとする。
④ スイッチのチャタリング対策を実施のこと。
⑤ Harmonyのコールバック関数に割込み処理を記述のこと。
<回路図>(→回路図のPDFファイル)
PIC32MZ2048EFH100をつかった場合の回路図を以下に示します
<外観> <動作結果> (画像をクリックすると プログラム動作中の動画がYouTubeで再生します) |
ディスクリートキバン (PIC32MZ QFPモジュール組立キット → 購入方法) (QFPモジュール用ユニバーサルキバン → 購入方法) |
PIC32MZ評価ボード(MZ100-A001) ( → 購入方法 ) |
|
動作結果の 動画再生 |
<解説>
■ ステップ1 MHC作成
■ ステップ2: MHCから生成したソースコードの変更
■ main.c に青字部を追加します。
①所要の変数、定数を定義します。
#define SWITCH_PRESSED_STATE 0 // Active LOW switch
int LED;
② RB0の変化割込みに係るコールバック関数を定義します。
Bポート全体の割込みに係るコールバックなので、RB0がONである場合のみLEDを点灯/消灯するようにします。
LEDが消灯していた場合は点灯させます。 またLEDが点灯していた場合は消灯させます。
void controlLED(GPIO_PIN pin, uintptr_t context)
{
// if(SW1_Get() == SWITCH_PRESSED_STATE) //SW1(RB0)が押されていた場合
if(PORTBbits.RB0 == 0) //SW1(RB0)が押されていた場合
{
if(LED == 0)
{
LED = 1;
LED1_Set(); //LED1 点灯
// LATGbits.LATG15 = 1; //LED1 点灯
}
else
{
LED = 0;
LED1_Clear(); //LED1 消灯
// LATGbits.LATG15 = 0; //LED1 消灯
}
}
}
③ Harmonyのライブラリ関数GPIO_PinInterruptCallbackRegister( )で、Bポート変化割り込みの
コールバック関数controlLED()を設定します
GPIO_PinInterruptCallbackRegister(SW1_PIN, controlLED, (uintptr_t)NULL);
//Bポート変化割り込みのコールバック関数controlLED()を設定します
④Harmonyのライブラリ関数GPIO_PinInterruptEnable( )でRB0ピンへの変化割込みを有効にします。
GPIO_PinInterruptEnable(SW1_PIN); //RB0ピンへの変化割込みを有効にします。
// // レジスタ直接制御
// CNENBbits.CNIEB0 = 1; //RB0ポート変化割込み: イネーブル //I/O Ports Control Registers
// // 以下、GPIO_Initialize ()の中でも設定されている
// INTCONbits.MVEC = 1; //マルチベクタ制御モード //Harmonyではデフォルト設定?
// CNCONBbits.ON = 1; //Bポート変化割込み制御レジスタ: ON //CHANGE NOTICE CONTROL FOR
PORTB REGISTER
// IEC3bits.CNBIE = 1; //Bポート変化割込み: イネーブル
以下、main.c 全文
■ 参考: interrupts.c への変更は必要ありません。
以下、interrupts.c 全文