2015-10-16 Fri
リモコンよろしく自作のMPGをワイヤレス化するという、無謀な取り組みをしています。
赤外線通信等、信号を変調して伝送するのは、ちょっと
できませんが、RS232Cの延長で、キャラクターの送信
は、有線でできました。
この部分をワイヤレス化すれば、実現できそうです。
そのために、受け手のPICで、A相B相のパルスを生成します。
なかなか実現できませんでしたが、やっと、エンコーダーの
パルスと近い波形を生成することができました。
送り手のPICから、1バイトのキャラクターコードを送り、
受け手のPIC側で、それに応じた処理を行います。
一番の難物がパルスの生成でした。
キーボードから操作してますが、一回キーボードのキーを押
すと一回だけパルスが生成できます。連続で押すと、連続
で生成できました。
有線のRS232Cで送ってますので、ワイヤレス化した時の
応答速度が気になるところですが、まあ、DIYの範囲での
使用ですので、それほど気にしなくてもいいと、思うことに
します。
プログラムは、当初、割り込みで処理する予定でしたが、
ポーリングの処理でも、それほど変わりないようなので、
通常のものに変更しました。
プログラムは、後日掲載します。
2015-10-16 Fri
また、また、はまりました。二日ほど、あれこれ悩みましたが結局、プログラムのミスでした。
<はまったことその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の割り込みのストップの方法をあれこ
れさがしてしまいました。
分かれば、なんのことはない、単純なミスでした。最新の
開発環境にして、単なるシンタックスミスは、環境の方で
指摘してくれるので、文法的な間違いは、ほとんど時間を
賭けずに修正できるようになりましたが、アルゴリズム等
のミスは、ダメです。修正に時間がかかります。
頭が硬くなってます。
TOP PAGE △