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 あとノイズもあまり考慮してなかったり・・・ まぁ趣味で書くプログラムなんて手抜きなもんです。 動けばいいんだから・・・ ってか、まだ動かしてませんが・・・ 動くようになったら再度プログラムアップします。 |