2015-12-07 Mon
道のりは、長いです。自作手パの無線化を進めてきましたが、一つ、疑問だったこ
とが解決できそうですので、仕様?を変更してみたいと思い
ます。
今までの無線手パでは、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相の検出を追加す
るだけですから、それほど大きな変更はしなくてすみ
そうです。
2015-12-04 Fri
以前アドバイスいただいたことを試してみようと、下記のような実験回路を組みました。
この回路で、
while(1){
PORTA=~PORTA
WaitTime(20000);
}
初期設定はありますが、このプログラムを走らせました。
すると、最初は、思った動作をしますが、
途中で、止まってしまいます。プログラム的には、間違いは
ありません。
PICの足に触ると、動き出したり、止まったり、動作が安定し
ません。
通常は、○ドウインの基板を使ってテストしてますが、
この基板で動いて、ブレッドボードで実行すると、回路は、
間違ってないのに動かないという事象に遭遇しました。
違いを考えると、○ドウインの回路は、リセットの回路が組まれ
ていますが、ブレッドボードでは、組まれていません。
NETで検索するとありました。MCLRと呼ばれるリセットに使わ
れる端子を有効にしておくと、リセットの回路がない状態で
は、不安定になるとありました。
そこで、前述のプログラムのconfigの設定を、
MCLREN→MCLRDIS
にして、再度コンパイル、それで、動かしてみました。
あっけなく動きました。
アドバイスいただいた通りの動作でした。
LEDの極性を反対にして、ポートにつなぐのが味噌です。
プログラムでは、時間をおいて、HIGHとLOWを繰り返して
るだけです。
こうすることで、PICがHIGHになると吸い出し?でLEDが
点灯し、LOWになると吸い込みでLEDがつきます。
私には、目から鱗でした。
PICのポートが少ない時は、応用ができ
そうです。
2015-12-02 Wed
自作手パ(MPG)をワイヤレス化するのにアダプターを作製し、後は、ケースに組む状態になってます。
ただ、念のデータの取りこぼしを調べたら、パルスジェネレータ
を早く回すと、約半分の取りこぼしがあったので、受信側の
プログラムにリングバッファーをいれました。
リングバッファーをいれることで、ほぼデーターの取りこぼし
がなくなりました。
多少、疑問が残ったので、送受信のデーターの取りこぼし
を調べるのに、ローコストLCDシリアル通信モニターを
作製しました。
これだけでは、ただデーターの表示をするだけなので、
カウントしたデータを計測してターミナルに表示できるように
基板とプログラムを作成しました。
基板といっても、PICにバスコンとICSPの端子をつけ
ただけのものです。
比較的短時間で、ほぼ動くようになりましたが、二つほど
ドツボにはまって、二日ほどもがくことになりました。
一つは、リングバッファーの操作でした。「s」のキャラクター
が入力された一つ前のデーターをカウントのキーにするのに、
リングバッファーの読み取りのポインターを「s」の一つ前に
もどせばいい、と思いこんでいました。これが、ドツボの始まり
でした。
いくら、やっても、思ったキーになりません。
読み込んだデータを、デバッグ用に表示してみて、やっと
分かりました。
データを取り込んだ後、ポインターを次の読み込みにそ
そなえて、一つ進めていたのです。
本来なら、ポインターを二つもどさないとだめなわけでした。
「-1」としていたところを「-2」にしてやっと解決です。
もう一つは、久しぶりに使ったprintf( )のフォーマットの間
違いでした。
「int」の「%4d」としなければならないところを、「char」の
「%c」としていました。当たり前に、表示されないので、
あれこれいじって、やっとprintf( )のフォーマットにたどり
つきました。
昔、PC用に、Cであれこれやっていたころは、printf( )が
大嫌いで、直接ビデオラムを操作して表示する関数等を作って
使ってました。
今回は、ターミナルへの表示位置を決めるのに、printf( )を
つかって、エスケープシーケンスの使いまくりでした。
とりあえずのプログラムです。
main.c
例によって、ゴミが沢山のこっています。表示をもうちょっと洗練
させたいなと思ってますが、計測中の表示をやめて、計測終了
後に表示させた方が、いいのかなと、思案中です。
TOP PAGE △