MPLAB® Code Configurator(EXT_INT編)

今回は外部割り込みです。プシュスイッチを外部割り込みにとしLEDをオンオフします。

先ずはハード

ここまでの回路にプッシュスイッチを追加しました。

  • RB14にプッシュスイッチを繋いでいます。プシュスイッチの反対側はGNDに接続しています。
  • この回路ではスイッチが押されていない状態で、RB14が不安定になる可能性が有ります。
  • この様な場合、プルアップ又はプルダウンを行います。今回はRB14の設定時でプルアップを適応します。
  • よって回路上実際に抵抗を配線していません。

ここまでの経過が有るので回路が複雑ですが、今回はLEDとプッシュスイッチの部分が必要です。LCD(AQM1602)と発振器の部分は必要有りません。

EXT_INTの設定

MCCを使って割り込みの設定を行います。今回もPIC24FJ64GA002用の空のプロジェクト、”EXT_INT_test”を作成しMCCを立ち上げて下さい。

  • Device Resources の欄から EXT_interruptの黒い三角を選択。その後、EXT_INTのプラスをクリック
  • Preripherals に EXT_INT が追加されます。真ん中下側の Pin Managerタグをクリックするとこの画面になります。
  • 今回は、INT1をRB14に割り当てて設定して行きます。
  1. Pun Manager画面、INT1 RB14の鍵マークをクリックします。
  2. RB14が選択されるとINT1の行がこの様に変わります。次に
    • RB14は割り込み信号を受けるので入力設定にする必要が有ります。
    • Pin Modules欄で RB14を input に設定します。
  3. RB14を入力設定にすると上のINT1とのマークが鎖の様な形に変わります。リンクしたという意味でしょうか。この画面でRB15を output に設定すると
  4. この画面になります。

RB14はプルアップするのでその設定を行います。

  • Project Resoueces欄でPin Moduleを選択すると選択されているピンの状態が右側の画面に表示されます。
  • RB14に関しては、EXT_INTとPin Moduleの2つの項目があります。
  • RB14をプルアップにするには、どちらかのWPUマークをチェックします。片方をチェックするともう一方もチェックされます

最後に割り込み条件を設定します。

  • Project Resoueces欄で EXT_INT を選択すると右側に詳細が表示されます。詳細のリストにINIT1が追加されています。
  • INT1のEdge Detedt欄で割り込み信号の検出条件を設定します。
    • Positive Edge: 信号の立ち上がり。信号がLowからHighに成った時
    • Negative Edge: 信号の立ち下がり。信号がHighからLowに成った時
  • 今回はプルアップしているのでプッシュスイッチを 押していない時:High / 押した時:Lowとなります。
  • よって、スイッチを押した時なら、Negative。 スイッチを離した時なら、Positive の選択になります。
  • 今回は、離した時に割り込みが発生するよう Positive Edge を選択しました。

これで設定完了です。 Generate ボタンを押してコード作成して下さい。

作成されたファイルで先ず pin_manager.c をみて見ます。PIN_MANAGER_Initialize()で各ピンの初期設定を行っています。

  • 71行:TRISB = 0x7FFF; ここでRB15を出力にその他を入力に設定。
  • 88行:AD1PCFG = 0x060C; ここで、RB15,14をデジタルに設定。
  • 93行:PPS(Peripheral Pin Select)の解除。
  • 95行:RPINR0bits.INT1R = 0x000E; ここでRB14をEXT_INT:INT1に設定しています。
    • このPICは28ピンと44ピンの2種類のピン数が有り、周辺機能は44ピンを前提に設計されています
    • ピン数の少ない28ピンは、で最初から各機能をピンに配置するとピン不足が生じます。
    • それを解決する為に、28ピンは各周辺機能をユーザーがピンに任意に指定出来る機能を持っています。
  • 97行:PPS(Peripheral Pin Select)のロック。

次に、ext_int.c をみて見ます。

  • 106行で割り込みの初期化。
    • 123行: INT1の割り込みフラグをクリアー
    • 124行: INT1の信号のPositiveEdgeの検出をセット
    • 125行: INT1の割り込みの有効化
  • 割り込みが発生すると、87行が実行されます。91行でEX_INT1_CallBack()が呼ばれているのでそこに飛びます。
  • 79行が割り込み処理を実行する関数となります。ここをコーディングします。

RTCCで行ったコーディングと一緒に外部変数 fig を宣言し関数内部で値を反転しているだけです。後は main.c でこの変数に合わせてRB15をHigh,LowにすればOKです。

main.c はこんな感じでコーディングしています。これでPICに書き込んで下さい。ボタンを押す度にLEDがオンオフします。

でもちょっとチャタリングが

何回か押していると誤動作をする事が有りました。多分チャタリングが原因と思われるので対策を取ります。対策はスイッチ操作の後でwaite を置くのが一般的です。そこで、__delay_ms() の登場です。MCC を見ていたらMCCの中にDELAYが有ることを発見しました。今回はこれを使って見ます。 

  1. Device Resourcesの欄、Foundation Services の黒い三角をクリックすると一覧が表示され、その中にDELAYをみつけました。これをクリックすると
  2. Project Resousrcesの欄にFoundation Servicesの項目が追加されその中にDELAYが追加されています。右側に何か表示されていますがこの状態で Genarate ボタンを押して見ました。以下は作成された delay.c です。
  • 作成された関数は、DELAY_milliseconds() と DELAY_microseconds()の2つ。
  • Waiteには DELAY_milliseconds() を使用します。この中身を見ると、引数の回数 __delay_ms(1); を実行する様になっています。
  • その他
    • 33行に #include <libpic30.h> が有ります。これは前回と同じ
    • 29,30行でFCYを指定しています。

前回のコーディングの方が簡単ですが、今回はこれを使用します。このWaiteを挿入する箇所を ext_int.c でLEDの状態を変更させた後に追加しました。引数を 100 としています。

これでコンパイル後PICに焼いて実行して下さい。最初LEDは点灯しています。その後ボタンを押す度に消灯と点灯を繰り返します。今度はチャタリングも起こらないようです。

次回は

MCCのアシストで簡単にプログラムをコーディング出来ました。しかし一方でどの様にMCCがコードを製作しているかしっかり理解しないとコードを変更しようとした時に思わぬ事を起こるかも知れません。MCCのアシストは、行き先を指定してそこまで案内してくれるカーナビに似ている様な気がします。指定した先には行けるけど全くそこまでの道順を覚えない。

次回は、パワーセーブかSPIに付いて説明します。