2020/09/12(SAT) 【MC21】シフトポジションインジケーター解説編
フォト

↑怒られるかな?スミマセン。m(_ _)m
まるテックシフトポジションインジケーター
MC21用
かのんさんところで動いたらしい
↓スミマセン。写真パクりました m(_ _)m
フォト

いやRCバルブインジケーターの方じゃなくてw
シフトの方ね。

まず回路図
フォト

基本的にマイコンPIC16F627を中心に
7セグLEDとバイクからの入力と電源回路
ということで、シンプルといえばシンプルです。

マイコンのPINはこんな感じ
フォト

7セグのLEDのPINはこんな感じ
フォト

これらを元にPINアサインを決めます。
まぁ今回は回路を小さくしたかったので
回路パターンを考えながら
PINアサインも考えながらとかなり悩みました。
フォト

ほぼフルフルでPINを使ってます。
入力7出力8です。
全部、デジタルで単純ですが。

ということで
プログラム解説。
今回はアセンブラで書いてますが
単純な処理しかしていません。
では解説スタート!


フォト
フォト
フォト
フォト
フォト
ここまでがお決まりの設定とか宣言部分です。

ここから実際の処理です。
いきなりGOTOしてますけど・・・
フォト

ここからは割り込み処理ですが
今回は割り込み処理は使いません
フォト
フォト
44行目から初期化処理です。
フォト

OPTIONレジスタを設定します。
今回はPORTBのWPUを使うので設定しています。
あとはクロックの設定をしています
フォト

ここ各PORTの設定をしています。
今回はデジタル入出力しか使わないので
そう設定しています。
CMCONとか
フォト

VRCONの設定をして
フォト

PORTAと
フォト

PORTBの入出力の設定をしています。
67行目から実際のループ処理です。
フォト

72行目は、100msのWAITする関数をコールしています。
つまり100ms待ってから処理しています。
75行目でニュートラルか?を判断しています
フォト

そうでなかったら
79行目で1速か?を判断しています
フォト

そうでなかったら
83行目で2速か?を判断しています。
フォト

そうでなかったら
87行目で3速か?を判断しています。
フォト

そうでなかったら
91行目で4速か?を判断しています。
そうでなかったら
95行目で5速か?を判断しています。
フォト

そうでなかったら
99行目で6速か?を判断しています。
フォト

C言語で書いたら、
switch()〜case みたいな感じです。
もっとカッコイイロジックにしたかったけど
バグのもとなので、
単純に1つ1つ判断するロジックにしました。
PORTBレジスタがLOW(0)になっているのが
今入っているギアとなります。
回路図やPINアサインの表と比較するとわかりやすいかと。

どのギアに入っているか判断したら
7セグに出力します。
103行目から出力処理です。
105行目で出力パターンを取得する関数をコールしています。
フォト

出力パターンを106行目でPORTAに出力しています。
フォト

この辺はDPを点滅させている処理です。
7セグの右下のドットね。
約500ms毎に点滅するようにしています。
PORTBのRB7がDPなので
XORを使ってみたかったので使ってみました。
112行目ですね。
点灯(0)していれば消灯(1)
消灯(1)していれば点灯(0)とビット反転しています。
ちなみにPINがHIGHだと消灯でLOWだと点灯です。
フォト

ここからサーブルーチンの固まりです
117行目のFUNC_WAITは100msのWAITとします。
フォト
フォト
フォト
132行目のFUNC_GET_DATAは出力パターンを返します。
フォト
フォト
フォト
出力パターンは↓こんな感じ設計しています
フォト

プログラムも単純ですね。
ギアの判断がNから1〜6の順番なので
どっかが断線してたら低いギアが表示されちゃうかと
あとPGM側へ連流が流れ込まないように
整流用のダイオードを入れた方が良さそうですが
おそらくそっちの方が電圧が高いので多分大丈夫かなぁ〜

なお、Nチビ用ならばニュートラルと4〜6速なので
入力が少なくてコネクタのPINの位置を変更すればOKです。

今回は、プログラムより
回路パターンを悩みまくりましたね
いかに小さくするか?何度も設計をやり直しましたね。
結果、思ったように小さく出来てよかった。