諸兄のプログラムをもとに、多少変更を加えて、PCの
キーボードから、LEDのコントロールをするプログラムをつく
りました。
キーボードから、1~7の数字を押すことで、それに応じた
場所のLEDを点灯するプログラムです。
プログラムです。
ヘッダーファイルの「uart.h」と「uart.c」諸兄の作られたものを
そのまま使わせていただいています。
今回はポーリングのプログラムなので、次は、割込を使った
プログラムを作ってみようと思います。
mabo個人のサイトです。いろんなことを日記風に書いてます。場合によっては,間違った記載もあるということをご承知おきください。表題をクリックして,個別のページの最下部からコメントをお願いします。
諸兄のプログラムをもとに、多少変更を加えて、PCの
キーボードから、LEDのコントロールをするプログラムをつく
りました。
キーボードから、1~7の数字を押すことで、それに応じた
場所のLEDを点灯するプログラムです。
プログラムです。
ヘッダーファイルの「uart.h」と「uart.c」諸兄の作られたものを
そのまま使わせていただいています。
今回はポーリングのプログラムなので、次は、割込を使った
プログラムを作ってみようと思います。
新しい環境で、諸兄の書いてくれたシリアル通信のプログ
ラムを自分の環境で実現するべくもがいていました。
コンパイルはすんなり通るのに思った動作をしてくれません。
全部疑って、一つ一つつぶして、やっと思うような動作ができ
るようになりました。
まず、はまったのが、デバックのために、プログラムの間に
書き込んだ書式です。
int count=1000;
RA0=1;
RA1=0;
while(count>0){count--;}
count=1000;
RA0=0;
RA1=1;
while(count>0){count--;}
LEDが交互に点滅するはずですが、RA1に当てはまるLED
の変化がありません。
もしやと思い
PORTA=0b00000001;
PORTB=0b00000000;
・・・・・・・・・・・・・・・・・・・
・・・・・・・・・・・・・・・・・・・
PORTA=0b00000000;
PORTB=0b00000001;
のように変更したら動きました。「RA」の表記では、ポート
全体の値を書き換えてしまってるようでした。
よく見てみるとポートのビットの操作の記述が変更に変更に
なってました。
RA1→→PORTAbits.RA1
のように書かないとだめでした。
次にはまったのが、外部オシレーターの使用でした。
これは、デバックの方法の手落ちでした。外部オシレーター
でプログラムがうまく動いているのか確かめるのに、LEDの
点滅プログラムを挿入しましたが、ウエイトタイムが短くて
点灯しっぱなしで、うまく動いてないように見えてしまいま
した。何回、書き直したことか。
丸一日かかって、諸兄のプログラムの再現ができました。
PICのUART機能を使って、PCからのキー入力を
エコーバックするプログラムです。
それから、とんでもないミスをしてました。RXとTXのピンアサ
インを私の教科書(キットで遊ぼう電子回路シリーズNo9)で
確認しながらしてましたが、これが間違いでした。
教科書のPICは、16F627AというPICで、今回使ったのは、
16F88というPICでした。同じ18ピンのICなので、同じだろう
たたかをくっくってたのが間違いでした。なんと、
16F627
TX--8ピン(RB2)
RX--7ピン(RB1)
16F88
TX--11ピン(RB5)
RX-- 8ピン(RB2)
なんと、TXとRXが入れ替わってました。これでは、動きません
ね。やはり、データシートみないとだめなんですねえ。
X IDEの開発環境で、いくつかプログラムを書いて見ました。
驚いたのは、「あまりにも親切過ぎる」でした。
最近の一太郎やWORDのように、やろうとしていることを
先読みして、自動でやってくれます。
一太郎等では、冒頭に句読点がくると、行間をつめて、
句読点を行の終わりの位置にもってくるということを自動
でやってくれます。これと同じように、いろいろ、自動でや
ってくれます。ただ、この「親切」がくせ者で、時に、意図し
たことと違う結果になってしまいます。行頭の禁則処理を
自動でやると、行ごとの文字間隔がちがって、見栄えが
悪くなるので、この辺が、一番いやなところです。
この意味で、最近のワープロソフトは、嫌いでした。さすが
使わなくなりましたが、PCになってからも、OASYSという
ワープロソフトを使い続けたのも、この親切さがなかった
からです。
さて、X IDEですが、使ってみて、ことのほか便利なようです。
何よりも、作成途中で、シンタックスエラーがあると、その都度
知らせてくれます。
黄矢印の行に「;」がないシンタックスエラーがありますが、
次の行の緑矢印の所にきちんと、「びっくりマーク」が表示
され、エラーのあることを示してくれます。
「;」をつけてやると、ちょっとタイムラグがありますが、
びっくりマークは、すぐに消えます。
未定義の変数等についても同じように知らせてくれますの
ので、開発時間が短縮されるかもしれません。
PICのプログラムを作るにあたって、初めて使った、
MPLAB IDE V8.8という古典的な環境を使い続けてきまし
た。
ただ、世の中がどんどん進んでいて、このv8.8は古い
アーカイブに残っているだけで、メジャーなDLのリストには、
ありませんでした。
また、新しいことを覚えるのはしんどいのですが、諸兄の
プログラム古い環境に移植しようと思いましたが、あっさり
断念しました。
新しい環境のMPLAB® X IDEをインストール。この環境で
コンパイルしたら、一発でOKでした。
新しい環境では、一番の難物のCONFIGの設定も半自動で
おこなえるようで、なれれば、こちらの方がいいかもしれま
せん。
MPG(手パ)を直接モーターのドライバーに接続して、
ステッピングモーターもテストするためのアダプター、
おもちゃが完成しました。
このアダプターには、DIR信号を作るためのD-FFのICと、
おもちゃのルーレットよろしくLEDを制御するための
PIC(16F88)を組み込みました。あと一つは、MPGに電源を
供給するためのアダプターの役割もします。
エンコーダーを早く回すと、LEDの回転が分からなくなります。
まあ、ちょっと、お遊びをしてしまいましたが、うまくできて
自己満足です。
テスト基盤から、組み込み用の基盤に作り直し、組み込み
前のテストです。
プログラムも多少変更しました。
○電源投入後、LEDを一つ約1.5秒点灯させ、スイッチ
の代わりにする。
○MPGを回すのを止めて、約1.5秒動かさないと、LED
を消灯させる。
の変更をしました。TIMER0の割込で、おおざっぱな時間を
計測しています。
ケースにLEDを埋め込む予定ですが、まだ、部品が届かな
いので、手持ちのLEDを基板につけてテストです。
回転方向に従って、LEDを点灯しようと、あれこれ考え、
アドバイスもいただきました。ただ、LEDをつけるだけでは
おもしろくないので、ルーレット風に、表示するように、PIC
で簡単なプログラムを組んでみました。
テストボードで、8個ならんだLEDをMPGによって、点滅
させて見ました。
ゆっくり回すと、回転方向がわかりますが、普通の早さで
回すと、全部が点灯してみえるようです。
回転方向が分かるようにするには、LEDの点灯と点灯の
間に、ウエイトタイムをいれるようでしょうかね。
まあ、お遊びの要素ですので、それほど気にしなくても
いいのですが。
74HC74等の信号と「and」とる必要があったので、
74HC08( or 74HC00)と74HC123を使う予定でしたが
PICを使ったので、必要なくなりました。でも、よく使われる
タイマーICの555よりも、多機能?の74HC123の使用方が
わかり、大きな収穫でした。
アドバイスをいただきました。74HC00を使うと、IC等で、
2個で済み、部品数を大幅に減らすことができるとのこと
です。
今まで、Dフリップフロップからの信号1本で、処理しようと
頭が固まっていました。反対の信号が出ていること忘れ
ていました。2本使うととても簡単にできます。
Dフリップフロップからは、Qという信号とのQインバートと
言う、反対の出力がありますので、これを使えば、もっと
単純にできたようです。
こうすれば、未入力端子の処理も必要なく、すっきりです。
ただ、こうなると、ちょっと、おもしろくなくなりますので、
多少手を加えて、おもちゃの要素も入れてみようかななんて
思ってます。
LEDを大幅に増やして、回転方向を示す、ルーレット風に
したら、おもしろいかなと思いました。
いろいろ回路を考え、ブレッドボードで、あれこれ実験等を
しました。識者からみれば、なんだこれは、と言われそうで
すが、能力それなりです。
まず、次のような回路を考えました。
Dフリップフロップで、DIR信号を作りました。この信号は、CW
方向にMPGを回転するとHightなり、MPGをCCW側に回転す
るまで、Hightに固定されます。
この信号を、前掲の回路にいれてやると、CWのLEDを点灯さ
せ、CCWのLEDを消灯することができます。
しかし、この回路では、電源を入れた時はCCWのLED点灯し、
また、CW方向への回転をやめてもCWのLEDが点灯したまま
になります。
MPGをCCW方向へ回すことによって初めて、
Dフリップフロップからの信号をLowにすることができ、
CWの信号を消灯させることができます。
この二つの不具合があるので、74HC123を使って、
MPGの回転を検知させ、回っている時に、Hightの信号
を取り出します。この信号とDフリップフロップからの信号の
ANDをとる回路を入れて、MPGが回転しているときだけ、
目的のLEDを点灯させるようにします。
写真の回路のようにすることで、電源投入時と、MPGの回転
が止まっている時は、LEDが消灯することになります。
74HC123からの信号がHightになったときだけ、つまり、
MPGが回転しているときだけ、CW、CCWのLEDがつくこと
になります。
構想は、いいように思いますが、部品がそろってから、
トライアンドエラーで組みたてます。
接続に必要なのは、MPGからは、4本なのですが、
過日作成した16ピンのコネクターを直接接続できるように、
16ピンのコネクターを使います。自作手パよりは、一回り
小さい、同じような、台形のケースを使いました。
ちょっと、かっこよくできたかな、なんて、自画自賛してます。
これから、必要な、LED等の配置をします。