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

 道のりは、長いです。
 自作手パの無線化を進めてきましたが、一つ、疑問だったこ
 とが解決できそうですので、仕様?を変更してみたいと思い
 ます。
 今までの無線手パでは、A相B相の信号は、直接送っていま
 せんでした。A相とB相の信号から、CWの信号とCCWの信号
 に変換して、CWの信号とCCWの信号を送りました。
 受信側で、CWとCCWの信号に応じて、パルスを生成してい
 ました。
 このようにしてたのは、A相・B相の立ち上がりの検出はでき
 たのですが、立ち下がりの検出方法が分からなかったから
 です。
 NANDゲート等を使ってNOT・A相を作ればいいというアドバイ
 スをいただきました。下記のような回路で、試作してみようと
 思います。

 

 
 CWやCCWのの判定をするのに、立ち上がりでの外部
 割り込みを使いましたが、NOT・A相、NOT・B相を作ることで
 A相B相の立ち下がりを立ち上がりとして検出できそうですの
 で、状態変化割り込みでNOT・A相、NOT・B相の検出を追加す
 るだけですから、それほど大きな変更はしなくてすみ
 そうです。

---柚子とり---

 今日は、友人の依頼で、友人の細君の実家の柚を取りに
 行ってきました。
 柚取りといっても、柚の木の大幅剪定もあったので、ハシゴ
 を使った高所での作業です。
 かなり高いハシゴだったので、危険をなくすのに、ヘルメット
 装着、安全ベルト装着の完全装備で作業しました。

 

 皮の手袋をしてましたが、いたいのなんの。柚のとげは、
 2~3cm程度あるでしょうか、革の手袋や、長靴を突き破っ
 てきます。
 ちょっと肌寒い陽気でしたが、半日で汗をかきました。
 成果は、ビールのケース5ケースでした。

---PICの罠(MCLR偏)---

 以前アドバイスいただいたことを試してみようと、下記のような
 実験回路を組みました。

 
 この回路で、

      while(1){
         PORTA=~PORTA
         WaitTime(20000);
      }

 初期設定はありますが、このプログラムを走らせました。
 すると、最初は、思った動作をしますが、

 

 途中で、止まってしまいます。プログラム的には、間違いは
 ありません。
 PICの足に触ると、動き出したり、止まったり、動作が安定し
 ません。
 
 通常は、○ドウインの基板を使ってテストしてますが、
 この基板で動いて、ブレッドボードで実行すると、回路は、
 間違ってないのに動かないという事象に遭遇しました。
 違いを考えると、○ドウインの回路は、リセットの回路が組まれ
 ていますが、ブレッドボードでは、組まれていません。
 NETで検索するとありました。MCLRと呼ばれるリセットに使わ
 れる端子を有効にしておくと、リセットの回路がない状態で
 は、不安定になるとありました。
 
 そこで、前述のプログラムのconfigの設定を、
     MCLREN→MCLRDIS
 にして、再度コンパイル、それで、動かしてみました。

 

  あっけなく動きました。
  アドバイスいただいた通りの動作でした。
  LEDの極性を反対にして、ポートにつなぐのが味噌です。
  プログラムでは、時間をおいて、HIGHとLOWを繰り返して
  るだけです。
  こうすることで、PICがHIGHになると吸い出し?でLEDが
  点灯し、LOWになると吸い込みでLEDがつきます。
  私には、目から鱗でした。
  PICのポートが少ない時は、応用ができ
  そうです。

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

 自作手パ(MPG)をワイヤレス化するのにアダプターを作製
 し、後は、ケースに組む状態になってます。
 ただ、念のデータの取りこぼしを調べたら、パルスジェネレータ
 を早く回すと、約半分の取りこぼしがあったので、受信側の
 プログラムにリングバッファーをいれました。
 リングバッファーをいれることで、ほぼデーターの取りこぼし
 がなくなりました。
 
 
 多少、疑問が残ったので、送受信のデーターの取りこぼし
 を調べるのに、ローコストLCDシリアル通信モニター
 作製しました。
 これだけでは、ただデーターの表示をするだけなので、
 カウントしたデータを計測してターミナルに表示できるように
 基板とプログラムを作成しました。
 基板といっても、PICにバスコンとICSPの端子をつけ
 
 ただけのものです。

 

 比較的短時間で、ほぼ動くようになりましたが、二つほど
 ドツボにはまって、二日ほどもがくことになりました。
 
 一つは、リングバッファーの操作でした。「s」のキャラクター
 が入力された一つ前のデーターをカウントのキーにするのに、
 リングバッファーの読み取りのポインターを「s」の一つ前に
 もどせばいい、と思いこんでいました。これが、ドツボの始まり
 でした。
 いくら、やっても、思ったキーになりません。
 読み込んだデータを、デバッグ用に表示してみて、やっと
 分かりました。
 データを取り込んだ後、ポインターを次の読み込みにそ
 そなえて、一つ進めていたのです。
 本来なら、ポインターを二つもどさないとだめなわけでした。
 「-1」としていたところを「-2」にしてやっと解決です。
  もう一つは、久しぶりに使ったprintf( )のフォーマットの間
  違いでした。
 「int」の「%4d」としなければならないところを、「char」の
 「%c」としていました。当たり前に、表示されないので、
 あれこれいじって、やっとprintf( )のフォーマットにたどり
 つきました。
 昔、PC用に、Cであれこれやっていたころは、printf( )が
 大嫌いで、直接ビデオラムを操作して表示する関数等を作って
 使ってました。
 今回は、ターミナルへの表示位置を決めるのに、printf( )を
 つかって、エスケープシーケンスの使いまくりでした。

 

 とりあえずのプログラムです。
 main.c
 例によって、ゴミが沢山のこっています。表示をもうちょっと洗練
 させたいなと思ってますが、計測中の表示をやめて、計測終了
 後に表示させた方が、いいのかなと、思案中です。