リモコンよろしく自作のMPGをワイヤレス化するという、
無謀な取り組みをしています。
赤外線通信等、信号を変調して伝送するのは、ちょっと
できませんが、RS232Cの延長で、キャラクターの送信
は、有線でできました。
この部分をワイヤレス化すれば、実現できそうです。
そのために、受け手のPICで、A相B相のパルスを生成します。
なかなか実現できませんでしたが、やっと、エンコーダーの
パルスと近い波形を生成することができました。
送り手のPICから、1バイトのキャラクターコードを送り、
受け手のPIC側で、それに応じた処理を行います。
一番の難物がパルスの生成でした。
キーボードから操作してますが、一回キーボードのキーを押
すと一回だけパルスが生成できます。連続で押すと、連続
で生成できました。
有線のRS232Cで送ってますので、ワイヤレス化した時の
応答速度が気になるところですが、まあ、DIYの範囲での
使用ですので、それほど気にしなくてもいいと、思うことに
します。
プログラムは、当初、割り込みで処理する予定でしたが、
ポーリングの処理でも、それほど変わりないようなので、
通常のものに変更しました。
プログラムは、後日掲載します。
---新しい開発環境(8)---
また、また、はまりました。二日ほど、あれこれ悩みました
が結局、プログラムのミスでした。
<はまったことその1>===============
タイマー0とタイマー1の割り込みで、割り込みの関数
部分で、初期値の設定を入れる部分が違ってました。
switch文で、本来なら、switchを抜けてから再設定
しなければならないのに、switchのなかに書いてました。
void interrupt InterReceiver( void ){
if(TMR1IF==1){
if(ccw==0){
if(p_count<6){
p_count++;
}
switch(p_count){
case 1:cwOut=0;
ccwOut=0;
break;
case 2:cwOut=1;
ccwOut=0;
break;
case 3:cwOut=1;
ccwOut=1;
break;
case 4:cwOut=0;
ccwOut=1;
break;
case 5:cwOut=0;
ccwOut=0;
break;
case 6:cwOut=0;
ccwOut=0;
TMR1L = tMr1_Low;//TMR1初期値
TMR1H = tMr1_Hight;//
break;
}
}
(本来の位置)
TMR1IF=0;//割り込みフラグクリアー
}
下記の部分の位置が問題でした。
TMR1L = tMr1_Low;//TMR1初期値
TMR1H = tMr1_Hight;//
6回割り込みさせて、一連の動作がが終わるように組みましたが、
初期値の設定を変えても割り込みの時間がほとんど変わりませんでした。
なんのことはない、割り込みで、6回目に戻ってくる時に
だけ初期値が設定されますので、1回だけは、期待した
時間での割り込みがかかりますが、後の5回は、なんと
設定の最大値、65536まで、カウントアップしてました。
これでは、期待した動作になりません。
期待した動作をさせるには、フラグのクリアーの前に入れ
ないとだめでした。
<はまったことその2>==============
「main」のプログラムでは、必ず無限ループを作りますが、
このなかの処理で、大きな勘違い。
if文で判定をして、動作をさせましたが、if文に一回だけ
入って処理をさせたかったのですが、一回動作をさせた
後に、ifの条件を書き換えなかったので、動作を永遠に
繰り返すことになって、終わりませんでした。
終わりにさせたかったのがタイマー1の割り込みだった
ので、タイマー1の割り込みのストップの方法をあれこ
れさがしてしまいました。分かれば、なんのことはない、
単純なミスでした。最新の開発環境にして、単なるシンタッ
クスミスは、環境の方で指摘してくれるので、文法的な間違
いは、ほとんど時間を賭けずに修正できるようになりました
が、アルゴリズム等のミスは、ダメです。修正に時間がかか
ります。
頭が硬くなってます。