「タクトスイッチ」や「トグルスイッチ」等の機械的スイッチは、ON/OFFした時に、接点が物理的に跳ね返るので、ON/OFFを細かく繰り返してしまう現象(チャタリング)が発生し、スイッチに接続されたLEDが不規則に点灯/消灯してしまいます。
チャタリングの吸収は、プログラムによる処理が一般的になっていますが、PIC16F13145には単安定型(モノステーブル)モードのタイマーと、プログラマブルな論理回路を作成できるモジュールを搭載しているので、ハードウェアで処理することができます。
プログラムによる処理が不要なので、別な処理にリソースを割り当てることができます。
記事では、タクトスイッチ」と「トグルスイッチ」のチャタリングを防止する回路を、「タイマー2」と「構成可能ロジックブロック(CLB:Configurable Logic Block)」を使って作成します。
チャタリングを防止したことで、「タクトスイッチ」に接続された赤色LEDと、「トグルスイッチ」に接続された青色LEDは、それぞれのスイッチをON/OFFした時、規則的に点灯/消灯します。
実習環境
こちらの記事を参考に実習環境を準備します。
パーツ
準備したパーツおよび購入先は一例ですので、任意に準備してくだい。
タクトスイッチ(数量:1個)
トグルスイッチ(数量:1個)
その他、赤色LED、青色LED、330Ωの金属皮膜抵抗器を使用します。(未購入の場合はこちらを参照してください。)
配線と回路
ブレッドボード上に、Curiosity Nano、青色LED、赤色LED、330Ωの金属皮膜抵抗器、タクトスイッチ、トグルスイッチを配置し、ジャンパーワイヤーを使って配線します。
回路図

プロジェクトの作成準備
「MPLAB X IDE v6.30」を起動し、パソコンとCuriosity NanoをUSBケーブルで接続します。
MPLAB X IDEにCuriosity Nano用の主要リンクが「Kit Window」が表示されます。

メニューの「File」をクリックし、リストボックスから、「New Project…」をクリックします。

New Project-Choose Projectダイアログが表示されますので、Categories:リストから「Microchip Embedded」を選択し、Projects:から「Application Ploject(S)」を選択後、「Next>」をっクリックします。

New Project-Select Deviceダイアログが表示されますので、次のように選択します。
- Fmily : All Families
- Device : PIC16F13145
- Tool : PIC16F13145 Curiosity Nano-SN:(シリアル番号)
選択後、「Next>」をクリックします。

New Project-Select Compilerダイアログが表示されますので、「XC8(v3.10)[xxxx]」を選択後、「Next>」をクリックします。

New Project-Select Project Name and Folderダイアログが表示されますので、次のように設定、選択し「Finish」をクリックします。
- Project Name : 任意(ここでは、pic13145_102)
- Project Location : 任意
- Open MCC on Finish : ✔
- Encoding : Shift JIS
選択後、「Finish」をクリックします。

MCCが自動的に起動します。
(画面の表示構成は変わる場合がありますので、任意に設定してください)

MCCについては、こちらの記事を参考にしてください。
MCCによる設定
「スイッチのON/OFF制御」プロジェクトは、MCC(MPLAB Code Configurator)のタイマー2モジュールと構成可能ロジックブロックモジュール(以下 CLB:Configurable Logic Block)を利用して、チャタリング防止回路を作成します。
周辺モジュールを追加
タイマー2モジュールと「CLB」モジュールをプロジェクトに周辺モジュールを追加します。
「MCCタブ」 → 「Device Resource」タブをクリックします。
▶️タイマー2モジュールの追加
「Drivers」 → 「Timer」を選択し、「TMR2」の➕マークをクリックし、「Project Resource」に「TMR2」を追加します。
▶️「CLB」モジュールの追加
「Library」を選択し、「CLB Synthesizer Library」の➕マークをクリックし、「Project Resource」に「CLB Synthesizer Library」を追加します。
「Project Resource」に「CLB Synthesizer Library」が追加されると、「CLB Synthesizer」のスタートページが表示されます。


システムクロックの設定
PICマイコンのシステムクロックを4MHzに設定します。
「Project Resource」 → 「System」 → 「Clock Control」をクリックします。
Clock Controlウィンドウが表示されますので、「Clock Settigs」を次のように設定します。
- Clock Source : HFINTOSC
- HF Internal Clock : 4_MHz
- Clock Divider : 1

タイマー2(TMR2)の設定
タクトスイッチのチャタリング時間は、数μs~数msですので、タイマー2を「Monostable」モードに設定し、スイッチのON/OFF後、10msの遅延パルスを生成し、チャタリング防止の規準信号にします。

「Project Resource」 → 「Timer」 → 「TMR2」をクリックします。
TMR2ウィンドウが表示されますので、「Hardware Settings」、「Timer Clock」、「Timer Period」を次のように設定します。
▶️Hardware Settings
タイマー2のモードや起動タイミングを設定します。
- Control Mode : Monostable(タイマー2の動作モード)
- External Reset Source : T2INPPS pin(タイマー2を起動させる入力信号ピン)
- Start/Reset Option : Start on falling edge on TRR2_ers(起動する入力信号の立下りで起動)

▶️Timer Clock
タイマー2の基準クロックや、遅延パルスの算出のための分周比を設定します。
- Clock Source : FOSC/4 (1MHz=システムクロック 4MHz/4)
- Polarity : Rising Edge(入力クロックの立ち上がりでタイマーが動作を開始)
- Prescaler : 1:128(クロックを128分周=128μsに設定)
- Postscaler : 1:1

▶️Timer Period
Timer Clockでクロックを128μsにしましたので、タイマー2のカウントは、128μs~32.768ms(128μs X 256)の範囲で設定することができます。
- Requested Period : 10ms(チャタリングを無視するためタイマー2のカウントを10msに設定)

タクトスイッチのチャタリング防止回路
「Monostable」として設定したTMR2_postscaledを基準に、タクトスイッチのチャタリング防止回路をCLBで作成します。
CLBの概要と回路の作成方法については、こちらの記事を参考にしてください。
「CLB Synthesizer」のスタートページで、「Blank design(新しい論理設計の開始)」をクリックします。

新規に論理設計するデザイン画面が表示されます。

デザイン画面にフリップフロップ、ゲートを配置して、タクトスイッチのチャタリング防止回路を作成します。
- TMR2_postscaled : 「Monostable」モードに設定したタイマー2で生成された10msの遅延パルス信号
- CLBIN0PPS : タクトスイッチ(SW1)からの入力信号
- PPS_OUT0 : 赤色LEDへの出力信号

主要箇所のタイミングチャートのイメージは次のとおりです。

トグルスイッチのチャタリング防止回路
CLBで作成したタクトスイッチのチャタリング防止回路と同じデザイン画面で、トグルスイッチのチャタリング防止回路を作成します。
デザイン画面にNANDゲートを配置して、トグルイッチのチャタリング防止回路を作成します。
- CLBIN1PPS : トグルスイッチ(SW2)-1からの入力信号
- CLBIN2PPS : トグルスイッチ(SW2)-2からの入力信号
- PPS_OUT1 : 青色LEDへの出力信号

主要箇所のタイミングチャートのイメージは次のとおりです。

作成後、「CLB Synthesizer」の【Synthesize】ボタンをクリックし、エラーのないことを確認します。

ピンの選択
回路図及びCLBで作成した回路に従い、Pin Grid及びPinsでピンを選択し、コードを生成します。
▶️Pin Gridの設定
PORTBの4番ピン(タクトスイッチの出力信号)は、タクトスイッチのチャタリング防止回路の「CLBIN0PPS」及び、「TMR2_postscaled」信号を生成するためのタイマー2の起動信号として入力されます。

▶️Pinsの設定
inputピンは内部でプルアップしています。
Cutom Nameは任意です。

コードの生成
MCCで設定した内容をコードとして生成します。
「Project Resource」の【Generate】ボタンをクリックします。

プログラムの作成とビルド・書き込み
生成された「main.c」ファイルのエディタに、C言語プログラムを入力します。
プログラムの作成
「Projects」→「Source Files」→「main.c」ファイルをエディタで表示ます。
今回のプロジェクトは、すべてCLBによって行われますので、ソフトウェアによる処理はありません。
「main.c」ファイルは生成されていますが、プログラムによる処理はありませんので、初期設定のままとします。
ビルド
ツールバーのビルドアイコンをクリックします。

正常にビルドが完了すると、「Output – xxxx (Buil. Load)」ウィンドウに「BUILD SUCCESSFUL (total time: xxxms)」が表示されます。

書き込み
「Make and Program Device 」をクリックすると、プログラムのコンパイルが開始され、コンパイルに成功するとPIC16F13145への書き込みが開始されます。

書込みが成功すると、Outputウィンドウに「Programming complete」と表示されます。

確認
「タクトスイッチ」を押すと赤色LEDが規則的に点灯/消灯し、「トグルスイッチ」をON/OFFすると青色LEDが規則的に点灯/消灯します。

