YS電子工作ラボ

<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作成

1. [Clock Diagram]タブで、クロックの構成を外付け24MHz水晶発振器用、システムクロック200MHzに設定します。
 POSCMOD: → EC
 FPLLICLK: → POSC
 FPLLIDIV: → DIV_3
2. [Pin Settings]タブで、ピン1のRG15ポートを設定します。
Name: → LED1
Function: → GPIO
Direction(TRIS): → Out
 ピン25のRB0ポートを設定します。
Name: → SW1
Function: →GPIO
Change Notifecation(CNEN)とPull Up(PNPU)の
チェックを入れます。
 
3. [Project Graph]の画面を表示させます。
defaultから変更の必要はありません。
default状態を確認します。



 ステップ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 全文