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回じゃ済みそうにないなぁ〜 |