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