2015-12-02 Wed
自作手パ(MPG)をワイヤレス化するのにアダプターを作製し、後は、ケースに組む状態になってます。
ただ、念のデータの取りこぼしを調べたら、パルスジェネレータ
を早く回すと、約半分の取りこぼしがあったので、受信側の
プログラムにリングバッファーをいれました。
リングバッファーをいれることで、ほぼデーターの取りこぼし
がなくなりました。
多少、疑問が残ったので、送受信のデーターの取りこぼし
を調べるのに、ローコストLCDシリアル通信モニターを
作製しました。
これだけでは、ただデーターの表示をするだけなので、
カウントしたデータを計測してターミナルに表示できるように
基板とプログラムを作成しました。
基板といっても、PICにバスコンとICSPの端子をつけ
ただけのものです。
比較的短時間で、ほぼ動くようになりましたが、二つほど
ドツボにはまって、二日ほどもがくことになりました。
一つは、リングバッファーの操作でした。「s」のキャラクター
が入力された一つ前のデーターをカウントのキーにするのに、
リングバッファーの読み取りのポインターを「s」の一つ前に
もどせばいい、と思いこんでいました。これが、ドツボの始まり
でした。
いくら、やっても、思ったキーになりません。
読み込んだデータを、デバッグ用に表示してみて、やっと
分かりました。
データを取り込んだ後、ポインターを次の読み込みにそ
そなえて、一つ進めていたのです。
本来なら、ポインターを二つもどさないとだめなわけでした。
「-1」としていたところを「-2」にしてやっと解決です。
もう一つは、久しぶりに使ったprintf( )のフォーマットの間
違いでした。
「int」の「%4d」としなければならないところを、「char」の
「%c」としていました。当たり前に、表示されないので、
あれこれいじって、やっとprintf( )のフォーマットにたどり
つきました。
昔、PC用に、Cであれこれやっていたころは、printf( )が
大嫌いで、直接ビデオラムを操作して表示する関数等を作って
使ってました。
今回は、ターミナルへの表示位置を決めるのに、printf( )を
つかって、エスケープシーケンスの使いまくりでした。
とりあえずのプログラムです。
main.c
例によって、ゴミが沢山のこっています。表示をもうちょっと洗練
させたいなと思ってますが、計測中の表示をやめて、計測終了
後に表示させた方が、いいのかなと、思案中です。
2015-11-26 Thu
一応完成した手パ(手動パルスジェネレイター=MPG)ですが、コントロールするのに、割り当てた信号線を、
オルタネートでコントロールしてました。ふとしたことで、
モーメンタリーでもコントロールできるのではと思い、タクト
スイッチで、簡単な基板を作って、実験してみました。
結論から言うと、モーメンタリーでも、コントロールが可能
でした。
JogモードからMPGモードへの切り替え、各軸の選択は、
モメンタリースイッチでも大丈夫でした。
市販のMPGの各軸選択には、ロータリースイッチが使われて
います。ロータリースイッチにするのは、多分、誤動作防止
の意味合いが強いのかなと思いました。
2015-11-18 Wed
諸兄のHPに載っていたローコストLCDシリアル通信モニター(PIC16F1823)を作成しました。
USARTのボーレート設定がタクトスイッチでできるのが便利
です。
プログラム等は、全部、諸兄の作られた物を使わせていただき
ました。
もう一つPICをのせて、データー処理にとおもいましたが、
今回は、やめました。
諸兄のプログラムを見てみると、ボーレートの設定をEPROM
に書き込んで、プログラムからリセットすることで、設定をかえ
ているようでした。
いままで、EPROMは使ったことないので、こんな使い方もで
きるんだなと思いました。
また、リセットするのに、
asm("RESET")
というインラインアセンブラーのコードを使ってるようです。
それにしても、やはりすごいです。このような知識、どうやって
獲得されたんでしょうね。
2015-11-17 Tue
NETサーフィンをしていると「初めてのPIC」というHPが、目にとまりました。
そこで紹介されている「16F1455(16F1459)」というPIC
が目にとまりました。
スペックを見ると、クロックが48Mhzに設定でき、
2.3v~5.5vの幅広い電圧で動作できるとのありました。
早速衝動買いをしてしまいました。
○月や○ルツ等では、取り扱いがなく、「○S」という初めて
の会社での購入になりました。
届いたパッケージは、会社独自のおしゃれなものです。
中身は、HDD等の包装に使われている素材の袋にパッケージ
されてました。
開けてみると、PICは、静電気防止のスポンジ?ではなく、
一つ一つプラスティックのケースに入っていました。
感想としては、ICの取り扱いになれた?会社なのかなと
おもいました。
この「○S」という会社は、PICの検索をすると、必ずといって
いいほど引っかかる会社でした。なんどか、HPは見て存在は
知っていたのですが、どんな会社か分からず、利用していません
でした。
在庫のしなものばかりではなく、海外からも取り寄せ?で
しなものを購入できるようです。
2015-11-11 Wed
昨日コーディングしたリングバッファーを使ったプログラムの検証が終わりました。
ほぼ満足のいく結果で、データーの取りこぼしもほとんどなく
なりました。
今回、リングバッファーに使ったメモリーは、256バイトで、
これだけで、メモリーの74%を使ってしまいます。
でも、効果、絶大ですね。パルスの生成に時間がかかる
ので、その時間差を吸収してくれます。MPG1回転で、
100パルスですから、2回半程度の回転に対応できると
思います。
今回は、大きなはまりどころもなく、すんなりでした。
main.c
ざっと、ゴミを取り除いたプログラムです。
例によって、「uart.c」と「uart.h」は諸兄のものをそのまま
使わせていただいてます。
LCDのデバックモニターを作成予定ですが、ついでに、
I2C接続のLCDもあれこれいじってみようと思います。
本日、LCDの部品が到着しました。
2015-11-10 Tue
どこでデータが欠落するのか、いろいろ調べようと思ってます。そのために、LCDデバックモニターを作って、みようと思
います。部品を注文しましたので、届くのをまちます。
デバッグモニターの制作と平行して、データー受信を
リングバッファーを使ったプログラムに変更しみようと
思います。
当初は、リングバッファーを使ったプログラムにする予定で
したが、リングバッファーの理解がいまいちで、コーデング
できませんでした。その一番の原因は、構造体とポインタの
理解ができてないことでした。
ネットには、リングバッファーを使ったプログラムが沢山ある
のですが、そのほとんどが、構造体とポインタという、私が
一番苦手な手法を使ってありました。
いろいろあさっていると、構造体とポンタを使わないプログラム
を使って解説しているHPを見つけました。
Elementary data structures - Queue
このHPでやっと、リングバッファーの仕組みが理解で
きました。
また、このプログラムを組むにあたって、割り算のあまりを
求める、計算をしなければなりません。この計算に、結構
な時間がかかります。一般的には、計算の時間を短縮す
るために2のN乗の数を使うそうです。2のN乗の数を使う
ことで、割り算のあまりを出す計算を、X & (N-1)とする
ことで可能にできるそうです。これで、飛躍的に計算を早く
できると書いてあるHPにも出会ました。この2のN乗の大き
さをバッファーの大きさにするそうで、計算時間の短縮がで
きます。
この & を使った計算方法が、
%(剰余)の最適化について
というHPに分かり易く書いてありました。
ということで、リングバッファーを使ったプログラムを
コーデングしていきます。
2015-11-08 Sun
16F1827への移植がほぼ終わったので、有線でのMPGと
ワイヤレスのMPGの動作について、テストしました。
Multi Step-Cycle Jog Step1.00の設定で
100パルス(MPG1回転)をSS経由でMachを動かして
ました。
ワイヤレスMPG ゆっくり回転 97.00
早めに回転 64.00
有線 MPG ゆっくり回転 100.00
早めに回転 100.00
というような結果で、ワイヤレスの方は、早く回転すると、
4割ほど、パルスが欠落するようです。
今回生成したA相とB相のパルスは、振幅を少し広めに
とりました。この振幅をもうちょっと狭くすると、応答もよく
なるような気がします。
送信と受信側で、送受信のデータの個数を計測してみ
ようと思います。
2015-11-07 Sat
外部セラロックを使わないで、内部PLLを使って、32Mhzで動作させるために、16F1827に16F88のプログラムを移
植しました。
今回、移植するのに、丸々3日ほどかかりました。はまっ
てしまったのは、二つでした。
一つ目は、大いなる勘違いで、
for( ; ; )
の使い方を誤ってました。そのため、A相、B相のパルスが
正しく発生できませんでした。16F88で作った時は、パルス
の発生を前後の余裕をもってしていたので、その余裕が、
ロジックの誤りを吸収してくれたようです。初期値1~5まで、
5回のループを作りたいのに、
for(i=0;i<5;i++)
のような記述をしてました。これでは、0~4までの5回の
ループになってしまいます。正しくは、
for(i=1;i<=5;i++)
でした。
もう一つは、原因がよく分からないのですが、クロックを早く
すると、PORTが思った動作をしてくれなくなるようで、
PORTレジスタとLATレジスタ
と
PICとMikroC
に記事がありました。
早速、LATレジスタを使って組み直すと、見事動きました。
動いたプログラムです。ゴミが沢山残ってます。
main.c
特に、メインの処理では、switch分とif分が混在してます。
原因をあれこれ探るためにやった名残です。
もしかして、このように、PICは癖があるのかもしれませんね。
AVR等は、どうなんでしょうか。
**************************
* 追記 *
**************************
もしやと思い、諸兄の記事を参考に、ポートのビット操作
の間に’nop’を一ついれて動かして見ました。
あれほどなやんだのが嘘のように、通常の書き込みで、
LATレジスタを使わないで、動きました。
’nop’をいれたプログラムです。
main.c
やはり、諸兄はすごい。
2015-11-03 Tue
やっと動作確認できた、送受信の基板を使って、SS経由で、MACHを動かしてみました。
不具合が出るかなと思いましたが、あっけなく動いてしまい
ました。
MACHの数字の変化は、有線でつないだMPGに比べてみて、
若干もたつくような印象でしたが、とりあえず動くことがわ
かりました。
今回の回路です。手直した方がいいところがあるかと思いま
すが、一応動作したもの覚え書きです。
今回は、エンコーダーが作り出した信号でなくて、PICで作っ
た信号をSSに入れてますので、両者をオシロで比較してみ
ました。
PICで作った信号の振幅がやや狭いようです。
広くするのは、簡単ですが、その分、応答速度が遅くなるような
気がするので、このままにしようと思います。
また、今回は、UART(USART)の通信速度は、9600bpsに
しました。PIC周期を32Mhzにすれば、倍の19200bpsに設定
しても大丈夫だと思いますので、後日変更してみようと思います。
ただ、受信側に使ってる16F88は、20Mhzまでなので、
ついでに購入しておいた16F1827に置き換えてみようと思い
ます。幸い、RXとTXのピンは、プログラムから変更できるようで
すが、16F88と同じ設定にできるようです。
2015-11-02 Mon
受信側の基板が完成し、動作確認をしました。今日、丸一日かかってやっと動作の確認ができました。
今回、MCLREの設定ではまりました。
デバック用につけたLEDがプログラムの開始で、点灯してくれ
ません。いつも使ってる基板では、きちんと動作してくれるの
であれこれやりました。幸い、RA5ピンの近くにLEDをつけ
てましたので、LEDを触ると、つきました。あれ、と思いあれ
これやっていると、RA5ピンをさわると点灯することが分かり
ました。RA5ピンは、MCLRE(リセットピン)わりあてられてい
ます。CONFIGでは、MCLRE=ONの設定で、外部ピンによ
るリセットが有効になっていました。
いつも使ってるテスト用の基板は、RA5ピンがリセット用に、
プルアップされていました。今まで気づきませんでした。
MCLRE=OFFにして、コンパイルし直すと、デバッグ用の
LEDがやっとつきました。
自作MPG→PIC→Xbee・・・・・(キャラクタ送信)・・・
Xbee→PIC→SS
の経路の作成が8割完成です。
明日は、受信側で、生成するパルスの確認をします。
切り替えは、フォットカプラーを介して、該当のピンをグランド
に落とすことでします。このテストもやります。
TOP PAGE △