2012/09/29(SAT) 【後方排気】自己診断風タコメータ(空想編)
さて引き続き自己診断風タコメータの空想である。
あ、先に書いておくけど
PICマイコンや電子回路については超ビギナーなんで
間違い等あればご指摘下さい。
PICマイコンはこの前デジタルウインカーリレーを作っただけで
調子にのってます・・・m(_ _)m

さて回路の見直し
フォト
ほぼウインカーリレーと同じ回路。。。
LEDは実験が終わったら外しちゃいます。
GP1も実験が終わったら外しちゃいます。

で、プログラムを空想する。
前回の妄想で、11500rpmにするには
その2倍のパルスを入れる必要がありそう
というところまでわかっている。
で、
またまたタイマー割込みでGPIOをON/OFFしてパルスを作ります。
つまりタイマー割込みは作りたい周波数のさらに2倍で割り込ませて
ON/OFFしないといけない
11500rpm=191.6666667Hz
作りたい周波数はこの2倍で383.3333333Hz
さらにタイマー割込みはこの2倍で
1/(383.3333333*2)=0.001304348sec=1304.347826μsec・・・・@
毎に割込みさせて、GPIOをON/OFFさせる。
で、PICは内部発振の4MHzを使う。
プリスケーラーなして
(1/4MHz)*4サイクル*(255-(タイマー初期値-1))μsecで割込みが発生する。
プリスケーラーはこの値を2倍4倍8倍16倍・・・とできる。
これを元に@に近いタイマー初期値とプリスケーラの値を求めると
プリスケーラ 8倍
タイマー初期値 93
だと1304μsecで割込みが発生するようにできる。
また、キーオンの時のみ動作すればいいので
約1秒で処理をやめるとすると
1秒/1304μsec=767回割込みが発生したら処理を停止させる必要がある。
ここで問題なのが767である。
PICは変数のサイズは8ビット、1バイトなんだよ
つまり0〜255までしか数が扱えない・・・
むむむ。どうするかというと
変数を2つ使って上位と下位として16ビット、2バイトとして計算
という方法をとる・・・面倒くさい。

で、プログラム。
今回もアセンブラ。
まだbuild通してないです。空想のレベルで・・・
フォト
最初の宣言部分ですね。
11行目で内部クロックを使うように設定
17行目〜20行目は定数
TMR_INIがタイマー初期値
CNTH0とCNTL0がそれぞれカウンタの上位と下位で767というか766を表してます。
766〜0で767をカウントするんで。まぁ間違ってても誤差ということで・・・

フォト
割込みハンドラである。
1304μsec毎に呼ばれるはずの処理
41行目〜43行目でGPIOへの出力を反転
45行目〜54行目くらいまでが終了判定しています。
下位のカウンタを1引いて、キャリービットが立ったら
上位のカウンタも1引くってことをやってます。
で、0になったら、各レジスタを初期化して処理を終了します。
SLEEPはした方がいいのかな?

フォト
初期化ルーチン
各レジスタの初期化、タイマーの初期化、カウンタの初期化をしています。
メインループはいつもながら処理なしです・・・

ということ空想中
最近はこういうのを考えるだけ
時間も精神的にも余裕があるってことでしょうか?
次あたりは実験いけるかな???
今回は実験は1回じゃ済みそうにないなぁ〜