第19週 A/D変換値でモータ変速
人命救助の任務を負って日夜西へ東へ走る救急車。頼もしいですね。
いざ、出動! ピーポーピーポーと警報鳴らして、そこのけそこのけ、走り抜けていく姿はなかなかカッコいい。
でも、今しがた道を空けてやり過ごした救急車、私が高速道路に入ったら前をピーポーピーポー。もちろん一刻を争う大事な任務を負っている救急車ですから、当然、懸命に走ってはいるのですが、でも、みんなに軽く追い越されてる。
一般道での勇姿はどこへ。高速道の救急車、なんだか、ちょっとマヌケ。(^^;
もちろん私も軽く抜き去りました。(^^)
A/D変換値でモータ変速(ほとんどごった煮モード(^^; )
16F877の機能のうちA/D変換、タイマ0割り込みを使って、出力としてステッピングモータを駆動しさらにLCD表示もするというにぎやかなプログラムで遊びます。
16F877実験回路のうちシリアル通信以外すべて使うことになります。
回路の機能
1.トリマで設定した電圧をA/D変換のアナログ入力につなぐ。
2.A/D変換値をTM0に書き込んで、それにより設定電圧に従った周期で割り込みをかける。
3.この可変周期の割り込み毎にステッピングモータの波形を移行して可変速度でモータ駆動する。
4.一方、A/D変換値をBCD変換してLCD表示する。
今まで16F877でやったプログラムをごちゃ混ぜにしただけですが、なんの、けっこうたいへんなことに。(^^;
プログラムメモリの問題、大問題!
だらだら長くなって、思わぬ障害に。アドレスが0FFHを越えてしまい RETLW 命令で PCL をいじるとプログラムカウンタがあらぬ所に飛び火。つまりプログラムカウンタ13ビット長を下位8ビットを PCL レジスタ、上位5ビットを PCH レジスタで管理しさらに PCH レジスタは PCLATH レジスタ経由でしかアクセスできないという面倒なことになっています。
運悪く境目近辺に割り込み内で使った RETLW 命令が来てしまい、我が無能な頭脳は管理放棄を言い出しました。(^^;
結局、割り込みのプログラムをすっかり前の方に移すことで障害回避しました。ホントは正面突破したかったんですが。m(_ _)m
もう一つ原因不明のトラブル
割り込みが悪さしているのか、LCD表示の行の切り替えが(2行目への移行)時々乱れてしまいました。どうしても原因がつかめず、毎回上書きを繰り返すことで回避。
どうも姑息な対策が続きます。(^^)
プログラムはこちら。 前回の中途半端なのを整理しました。
トリマを回すとステッピングモータが変速します。
LCDには電圧を表示します。
とりあえず見た目は成功。
LCDに回転数表示とか行きたかったんですが、アセンブラには荷が重いみたいです。(山とんぼには重い、ですかね。)
【今週のなるほど】
プログラムメモリの複雑さ
プログラムカウンタ幅が13ビット、ジャンプ命令でのオペランドが11ビット、直接PCLレジスタをいじるのは8ビット、上位を管理するPCHレジスタは直接アクセス不可でPCLATHレジスタ経由しなければならない、と、複雑きわまりなく、これもPICマイコンの制限と思って泣き寝入り。