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の割り込みのストップの方法をあれこ
れさがしてしまいました。
分かれば、なんのことはない、単純なミスでした。最新の
開発環境にして、単なるシンタックスミスは、環境の方で
指摘してくれるので、文法的な間違いは、ほとんど時間を
賭けずに修正できるようになりましたが、アルゴリズム等
のミスは、ダメです。修正に時間がかかります。
頭が硬くなってます。
コメント
コメントする
この記事のトラックバックURL
http://mabo52.sakura.ne.jp/tb.php/956
トラックバック
TOP PAGE △