マイコン基板を作る際に、デバッグ用を兼ねて動作状態を示すLEDを設けることが多いのですが、このLEDの点滅パターンを変えてプログラムの動作モードを示したいと言った時に16bitパターンに従って点滅させたりします。
マイコンのコードよりも分かり易いかと思い、Micro:bit で例を作りました。
動作概要
100msec毎に以下のビットパターンのLSBが1なら点灯0なら消灯を出力し、ビットパターンを右シフトします。シフト回数をカウントし、16回目の時にビットパターンに初期値を書き込み、シフトカウンターをリセットします。
(0bで始まる以下のビットパターンは2進数表現です。)
ビットパターン1 0b1000000000000000 (1.6秒周期で短く点灯)
ビットパターン2 0b0111111111111111 (1.6秒周期で短く消灯)
ビットパターン3 0b0101010101010101 (0.2秒周期で点滅)
点滅パターン切り替えは、ビットパターンの初期値を書き換えるだけです。
この例では、以下のボタン操作で点滅パターンを切り替えます。
ボタンA=ビットパターン1
ボタンB=ビットパターン2
コードのブロック
実際のブロックは以下のようなものです。
変数は以下の4個です。
ledpd LED点滅パターンの初期値
ledwk ↑ のワーク(シフトレジスタ)
ledcnti シフトカウンターの初期値
ledcnt シフトカウンター
ledpd を書き換えると点滅パターンが変わります。
PICマイコンで実現するには
Micro:bitの場合は上図のようにブロックを並べるのですが、PICマイコンで実現するには少し手間がかかります。
2枚目の絵の every 100ms はイベントタイマーを設定して割込み処理させれば良いのですが、一枚目の絵右側のボタンが押された時の部分は、(幾つか方法がありますが)例えばイベントタイマー割込みを使ってI/Oポートをサンプリングしてボタン押下のエッジを検出する必要があります。
また、初期設定ではSFRと呼ばれるレジスターを設定するなどの準備が必要で、慣れないと意外に苦労したりします。
以下のような私のサービスではMicro:bit で動作させたものをPICマイコンで実現したい方々のお手伝いが可能です。
必要に応じて回路提案も可能です。
お気軽にお問い合わせ下さい。
宜しくお願いします。