2016/04/29(FRI) 【Nチビ】シフトインジケータ(空想編)
さてGWである。
4時くらいから目が覚めたので
プログラムでも空想する。
そもそも、PICのアセンブラなんて久しぶりなんで忘れた・・・
まずはヘッダ
フォト

まだチップを16F627Aか16F628Aかメモリサイズを測ってないけど・・・
とりあえず16F627Aで
CONFIGもスッカリ忘れてるけど、こんな感じかな?
次は、定数と変数の定義
 #あり?プログラムバージョンの部分が2回出てる・・・
 #キャプチャをミスった・・・orz
フォト

ここで、7セグのアウトプットを定義しています。
7セグはこんな感じなんで
フォト

光るのを1と光らないを0とすると
表にまとめるとこんな感じ
フォト

レジスタ的に下位からRB0、RB1・・・となるので
2進数、16進数で表現する時にひっくり返してます。
わかりずらい表でスンマセン・・・
で、これらを定数で定義しています。
表示する時にPORTBへ出力すれば数字が表示されるはず。

プログラムに戻って
メインルーチンと割り込みルーチンと初期化の部分。
フォト

あれ?こんな回りくどい書き方が必要なんだっけ???
プログラム先頭から初期化ルーチンに飛んでます。
で、そのすぐ下が割り込みルーチンなんですが
今回は割り込みを使わないので即時復帰。
本当は、PORTBの入力割り込みを使おうと思ったんですが
4つくらいのピンしか対応してなかったのでやめました。
あと、レジスタの初期化がこれで足りてるかな?
今回は、タイマーや割り込みを使わないので大丈夫かな???

続いてメインループです。
フォト

PORTAの入力を拾って
チャタリング対策として10ms後の値と比較して
同じなら入力解析とPORTBへの出力をしています。

サブルーチンです。
まずはWAIT用のルーチン。
フォト

内部クロック 4MHzで動かすので
4MHz=4000000Hzです。
また1命令に4周期掛かるらしいので
4MHz/4周期=1000000サイクル
ということは、0.000001秒で1サイクルということ
つまり0.001msで1サイクル=1μsで1サイクルを処理
つまり5サイクルでは5×1=5μs消費
それを200回ループすると5μs×200回=1000μs=1ms
とやっているつもりが「WAIT1M」のルーチンです。
で、それを10回呼べば10msじゃないかと?
というの「WAIT10M」でしているつもり。

次は入力の解析のサブルーチン。
フォト

入力を表に表すとこんな感じ
フォト

単に見える化しただけでなんの解決もされてません。
どう解析させるか?
単純に全比較でもいいんですが・・・
右シフトしていって、最下位ビットが立っているか?をみるループをつくり
そのループ回数でPC(プログラムカウンタ)を動かして
出力する結果を決めています。
多分、3日後にこのロジックみて
なんの処理やっているか、きっと理解できないだろう・・・orz

はい最後は、お約束。チップごとの調整値
フォト


ちなみに、まだコンパイルしてません。
動作もさせてないので間違いやバグもあるかと・・・
あと、あちこち無限ループに入ったり
オーバー/アンダーフローの可能性もあるんですが
面倒なんでセーフ処理を入れてません。
ウォッチドックくらい活かした方がいいかな?www
あとノイズもあまり考慮してなかったり・・・
まぁ趣味で書くプログラムなんて手抜きなもんです。
動けばいいんだから・・・
ってか、まだ動かしてませんが・・・
動くようになったら再度プログラムアップします。