-ローコストLCDシリアル通信モニター(PIC16F1823)-

 諸兄のHPに載っていたローコストLCDシリアル通信モニター

 (PIC16F1823)を作成しました。

 

 USARTのボーレート設定がタクトスイッチでできるのが便利
 です。
 プログラム等は、全部、諸兄の作られた物を使わせていただき
 ました。
 もう一つPICをのせて、データー処理にとおもいましたが、
 今回は、やめました。
 諸兄のプログラムを見てみると、ボーレートの設定をEPROM
 に書き込んで、プログラムからリセットすることで、設定をかえ
 ているようでした。
 いままで、EPROMは使ったことないので、こんな使い方もで
 きるんだなと思いました。
 また、リセットするのに、
  asm(“RESET”)
 というインラインアセンブラーのコードを使ってるようです。
 それにしても、やはりすごいです。このような知識、どうやって
 獲得されたんでしょうね。

---新しいPIC---

 NETサーフィンをしていると「初めてのPIC」というHPが、
 目にとまりました。
 そこで紹介されている「16F1455(16F1459)」というPIC
 が目にとまりました。
 スペックを見ると、クロックが48Mhzに設定でき、
 2.3v~5.5vの幅広い電圧で動作できるとのありました。
 早速衝動買いをしてしまいました。
 ○月や○ルツ等では、取り扱いがなく、「○S」という初めて
 の会社での購入になりました。
 届いたパッケージは、会社独自のおしゃれなものです。

 

 中身は、HDD等の包装に使われている素材の袋にパッケージ
 されてました。

 

 開けてみると、PICは、静電気防止のスポンジ?ではなく、
 一つ一つプラスティックのケースに入っていました。

 

 感想としては、ICの取り扱いになれた?会社なのかなと
 おもいました。
 この「○S」という会社は、PICの検索をすると、必ずといって
 いいほど引っかかる会社でした。なんどか、HPは見て存在は
 知っていたのですが、どんな会社か分からず、利用していません
 でした。
 在庫のしなものばかりではなく、海外からも取り寄せ?で
 しなものを購入できるようです。

---自作MPGワイヤレス化 (14)---

 昨日コーディングしたリングバッファーを使ったプログラムの
 検証が終わりました。
 ほぼ満足のいく結果で、データーの取りこぼしもほとんどなく
 なりました。
 今回、リングバッファーに使ったメモリーは、256バイトで、
 これだけで、メモリーの74%を使ってしまいます。
 でも、効果、絶大ですね。パルスの生成に時間がかかる
 ので、その時間差を吸収してくれます。MPG1回転で、
 100パルスですから、2回半程度の回転に対応できると
 思います。
 今回は、大きなはまりどころもなく、すんなりでした。
 main.c
 ざっと、ゴミを取り除いたプログラムです。
 例によって、「uart.c」と「uart.h」は諸兄のものをそのまま
 使わせていただいてます。
 
 LCDのデバックモニターを作成予定ですが、ついでに、
 I2C接続のLCDもあれこれいじってみようと思います。
 本日、LCDの部品が到着しました。

---自作MPGワイヤレス化 (13)---

 どこでデータが欠落するのか、いろいろ調べようと思って
 ます。そのために、LCDデバックモニターを作って、みようと思
 います。部品を注文しましたので、届くのをまちます。
 デバッグモニターの制作と平行して、データー受信を
 リングバッファーを使ったプログラムに変更しみようと
 思います。
 当初は、リングバッファーを使ったプログラムにする予定で
 したが、リングバッファーの理解がいまいちで、コーデング
 できませんでした。その一番の原因は、構造体とポインタの
 理解ができてないことでした。
 ネットには、リングバッファーを使ったプログラムが沢山ある
 のですが、そのほとんどが、構造体とポインタという、私が
 一番苦手な手法を使ってありました。
 いろいろあさっていると、構造体とポンタを使わないプログラム
 を使って解説しているHPを見つけました。
 Elementary data structures - Queue
 このHPでやっと、リングバッファーの仕組みが理解で
 きました。
 また、このプログラムを組むにあたって、割り算のあまりを
 求める、計算をしなければなりません。この計算に、結構
 な時間がかかります。一般的には、計算の時間を短縮す
 るために2のN乗の数を使うそうです。2のN乗の数を使う
 ことで、割り算のあまりを出す計算を、X & (N-1)とする
 ことで可能にできるそうです。これで、飛躍的に計算を早く
 できると書いてあるHPにも出会ました。この2のN乗の大き
 さをバッファーの大きさにするそうで、計算時間の短縮がで
 きます。
 この & を使った計算方法が、
 %(剰余)の最適化について
 というHPに分かり易く書いてありました。
 ということで、リングバッファーを使ったプログラムを
 コーデングしていきます。

---自作MPGワイヤレス化 (12)---

 
 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相のパルスは、振幅を少し広めに
 とりました。この振幅をもうちょっと狭くすると、応答もよく
 なるような気がします。
 送信と受信側で、送受信のデータの個数を計測してみ
 
 ようと思います。

---自作MPGワイヤレス化 (11)---

 外部セラロックを使わないで、内部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
 やはり、諸兄はすごい。

---自作MPGワイヤレス化 (10)---

 やっと動作確認できた、送受信の基板を使って、SS経由で、
 MACHを動かしてみました。
 不具合が出るかなと思いましたが、あっけなく動いてしまい
 ました。
 MACHの数字の変化は、有線でつないだMPGに比べてみて、
 若干もたつくような印象でしたが、とりあえず動くことがわ
 かりました。
 今回の回路です。手直した方がいいところがあるかと思いま
 すが、一応動作したもの覚え書きです。

 

 今回は、エンコーダーが作り出した信号でなくて、PICで作っ
 た信号をSSに入れてますので、両者をオシロで比較してみ
 ました。

 

 PICで作った信号の振幅がやや狭いようです。
 広くするのは、簡単ですが、その分、応答速度が遅くなるような
 気がするので、このままにしようと思います。
 また、今回は、UART(USART)の通信速度は、9600bpsに
 しました。PIC周期を32Mhzにすれば、倍の19200bpsに設定
 しても大丈夫だと思いますので、後日変更してみようと思います。
 ただ、受信側に使ってる16F88は、20Mhzまでなので、
 ついでに購入しておいた16F1827に置き換えてみようと思い
 ます。幸い、RXとTXのピンは、プログラムから変更できるようで
 すが、16F88と同じ設定にできるようです。

---自作MPGワイヤレス化 (9)---

 受信側の基板が完成し、動作確認をしました。今日、丸一日
 かかってやっと動作の確認ができました。
 今回、MCLREの設定ではまりました。
 デバック用につけたLEDがプログラムの開始で、点灯してくれ
 ません。いつも使ってる基板では、きちんと動作してくれるの
 であれこれやりました。幸い、RA5ピンの近くにLEDをつけ
 てましたので、LEDを触ると、つきました。あれ、と思いあれ
 これやっていると、RA5ピンをさわると点灯することが分かり
 ました。RA5ピンは、MCLRE(リセットピン)わりあてられてい
 ます。CONFIGでは、MCLRE=ONの設定で、外部ピンによ
 るリセットが有効になっていました。
 いつも使ってるテスト用の基板は、RA5ピンがリセット用に、
 プルアップされていました。今まで気づきませんでした。
 MCLRE=OFFにして、コンパイルし直すと、デバッグ用の
 LEDがやっとつきました。

 

 自作MPG→PIC→Xbee・・・・・(キャラクタ送信)・・・
       Xbee→PIC→SS
 の経路の作成が8割完成です。
 明日は、受信側で、生成するパルスの確認をします。
 切り替えは、フォットカプラーを介して、該当のピンをグランド
 に落とすことでします。このテストもやります。

---自作MPGワイヤレス化 (8)---

 ほぼでき上がったテスト基板で、ワイヤレス送信のテストを
 しました。

 
 有線部分をワイヤレスに置き換えても、目で見えるタイムラグ
 は見えないようです。

 PICの処理速度も気になりましたが、この程度の信号だと、
 ほぼリアルタイムで処理ができるようです。
 データの送受信で、処理しきれずに取りこぼしがあるのか
 もしれませんが、確かめるまでもないかなと思います。
 回路図といえるほどのものではありませんが、覚え書き
 の送信の回路図です。MPGのA相B相の信号から、DIRの
 信号を作るため、あまっていた、74HC74の
 DフリップフロップのICを使ってます。電源と信号のやり取り
 の線を結んだだけの回路です。

 
 本当は、自作のMPGに全部組み込んでしまえば、新たな
 プログラムを作る必要もなかったのですが、行き当たりばっ
 たりの私の性格そのものですね。

---自作MPGワイヤレス化 (7)---

 テスト基板とテストプログラムの検証がおわりました。
 無事、目的のキャラクターをRS232C経由でPCのターミナル
 ソフトに送信できました。
 切り替えの判定をするのに、「状態変化割り込み」を
 使用しましたが、どうも、隣のポートまで影響をうけるよう
 で、「状態判定」のif文をいれて、思った動作になりました。
 送信側の問題か、受信側の問題かは、わかりませんでし
 た。修正とテストのすんだプログラムです。インクルードし
 ている「uart.h」と「uart.c」は、諸兄の作られたものを
 そのまま使用してます。
       修正main.c
 有線での接続では、MPGのダイヤルを結構早く回しても
 送信は、ついていけるようです。

 

 「1~7」の数字と、「f」と「b」のキャラクターの送信をしている
 ようすです。このキャラクターを受信して、それに応じた処理
 をします。受信側のプログラムはできていますので、
 ワイヤレスでの、送受信のテストをします。