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