- 5821. 質問です。 [ボン] 2005/08/12 17:56
- PIC16F84Aでモーターの制御を行っています。
UFOキャッチャーのような動きで、XYZ軸をモーターとネジによって移動させています。
モーターは3つ、各軸上にリミットスイッチを設けて制御します。リミットスイッチが作動するとモーターは停止します。
そこでリミットスイッチが作動する順番に関係なく、例えば順番がA→B→CでもB→C→AでもC→A→Bでも作動した順にモーターを停止させ、最後のモーターが停止したら次の命令を実行するようなプログラムが作りたいんです。
で、次のようなプログラムを組んでみました。
INITIALIZATION
MOVLW B'10100100'
MOVWF PORTB
KEYSCAN1
BTFSS PORTA,1
CALL MOTOR1_STOP
BTFSS PORTA,0
CALL MOTOR2_STOP
BTFSS PORTA,3
CALL MOTOR3_STOP
BTFSS STATUS,Z
GOTO KEYSCAN1
GOTO WAIT
MOTOR1_STOP
BCF PORTB,5
MOVF PORTB,1
RETURN
MOTOR2_STOP
BCF PORTB,7
MOVF PORTB,1
RETURN
MOTOR3_STOP
BCF PORTB,2
MOVF PORTB,1
RETURN
順番に関係ないだろうって事でZフラグで制御しようとしたんですが、全くうまくいきません。なぜかPORTA,1以外の入力には反応せず、PORTA,1が入った途端下の方のプログラムに飛んでしまいます。
何が問題なのか分かりません。解決方法や「このプログラム全然違うじゃねーか」って方いらっしゃいましたらどうかご教授下さいませ。
長々と申し訳ございませんm(__)m
- 5822. Re: 質問です。 [カモ] 2005/08/12 21:32
http://kamo-birds.ameblo.jp/
- >PIC16F84Aでモーターの制御を行っています。
>UFOキャッチャーのような動きで、XYZ軸をモーターとネジによって移動させています。
>
>モーターは3つ、各軸上にリミットスイッチを設けて制御します。リミットスイッチが作動するとモーターは停止します。
>
>そこでリミットスイッチが作動する順番に関係なく、例えば順番がA→B→CでもB→C→AでもC→A→Bでも作動した順にモーターを停止させ、最後のモーターが停止したら次の命令を実行するようなプログラムが作りたいんです。
>
>で、次のようなプログラムを組んでみました。
>
>INITIALIZATION
> MOVLW B'10100100'
> MOVWF PORTB
>KEYSCAN1
> BTFSS PORTA,1
> CALL MOTOR1_STOP
> BTFSS PORTA,0
> CALL MOTOR2_STOP
> BTFSS PORTA,3
> CALL MOTOR3_STOP
> BTFSS STATUS,Z
> GOTO KEYSCAN1
> GOTO WAIT
>
>MOTOR1_STOP
> BCF PORTB,5
> MOVF PORTB,1
> RETURN
>
>MOTOR2_STOP
> BCF PORTB,7
> MOVF PORTB,1
> RETURN
>
>MOTOR3_STOP
> BCF PORTB,2
> MOVF PORTB,1
> RETURN
>
>順番に関係ないだろうって事でZフラグで制御しようとしたんですが、全くうまくいきません。なぜかPORTA,1以外の入力には反応せず、PORTA,1が入った途端下の方のプログラムに飛んでしまいます。
>
>何が問題なのか分かりません。解決方法や「このプログラム全然違うじゃねーか」って方いらっしゃいましたらどうかご教授下さいませ。
>
>長々と申し訳ございませんm(__)m
初めまして。カモと申します。
早速なのですが、ハード的な部分の説明が無いように思います。
私も以前言われたので、書いた方がいいと思いますよ。
- 5825. Re: 質問です。 [JO_O] 2005/08/13 11:37
- 毎度JOです。
> BTFSS STATUS,Z
Zフラグの判断基準が不明確です、
希望の状態(すべてのモーターが停止した時)にZフラグが反応しません。
そこで、ポートBの2,5,7の3つのビットがすべて「0」になったら、
「すべてのモーターが停止した」と判断されては??
BTFSS STATUS,Z
GOTO KEYSCAN1
GOTO WAIT
これを・・・
MOVLW '10100100'
ANDWF PORTB,0
BTFSS STATUS,Z
GOTO KEYSCAN1
GOTO WAIT
追伸 どうもこの掲示板はTABと半角スペースが、うまく表示されない・・・
- 5827. Re: 質問です。 [PICFAN] 2005/08/13 22:05
- 私なりに考えてみました。
1.イニシャルの終わった段階でZフラグが1だったらループに入らずに終わってしまう。
2.Aポートが入力設定になっていない?
3.Bポートの出力に電流制限抵抗が入っていなくてHIレベルを出しているはずがLOWレベルと認識される。
後はうーんです。
- 5828. Re: 質問です。 [aico] 2005/08/13 22:46
- この質問に対する疑問点を挙げます。
1、PORTBの設定はBANK0、BANk1のどちらで設定しているのか?
2、PORTAはデフォルトの設定で問題はないと思いますが、HighでアクテイブなのかLowでアクテイブなのか不明です。
3.Zフラグの変化はJO様の言う通りで、このリストを見る限り、何も変化する要素は有りません。
4.リストではSTOP動作しか記述していませんが、
モーターをONする部分が不明なので、この関連が気になります。
- 5831. Re: 質問です。 [JO_O] 2005/08/13 23:44
- ここでモーターがONされてますね
MOVLW B'10100100'
MOVWF PORTB
ポートBは出力設定で、出力「1」でモーターONなら
これでいいと思われます、
また入力ですが、ADCONでポートAをポート指定し、
入力設定されていて、入力「0」でアクティブであればOKと思われます。
- 5833. Re: 質問です。 [aico] 2005/08/14 00:57
- aicoです。
JO_Oさんは質問内容の足りない部分も考慮されて回答されています。(プロの常識で)
経験豊かなので助かります。
ただ我々が注意すべき点は、回答の前提条件を実際に確認しなければなりません。
カモさんの言うとおり、ハードの確認も必要だと思います。
余談ですがJO_O様の言う通り、この画面は使いづらいですね。
失礼しました。
もし逆の設定になっていると、モーターは動かずリミットスイッチも動作しないと考えられます。
次に最初のチェックはPORTA.1ですから、
>ここでモーターがONされてますね
>MOVLW B'10100100'
>MOVWF PORTB
>ポートBは出力設定で、出力「1」でモーターONなら
>これでいいと思われます、
>
>また入力ですが、ADCONでポートAをポート指定し、
>入力設定されていて、入力「0」でアクティブであればOKと思われます。
>
- 5836. Re: 質問です。 [PIC_FAN] 2005/08/14 08:54
- 一寸本筋から離れますが
Zフラグについては 各サブルーチンの最後でBポートを読み込んでいますからBポートがクリヤされた時点で変化すると思います。
記述の分かりやすさの問題はあるかもしれませんが 一つの方法と思います。
- 5837. Re: 質問です。 [aico] 2005/08/14 14:06
- aicoです。
前の回答でZフラグが変化する要素が無いと書きましたが
勘違いしました。訂正させて頂きます。
PIC_FUNさんの言うとおりです。
さて、PORTA,1が入ったとたん下へ飛ぶということは、その時点でZフラグが1になるということが考えられます。もしこの時点で他の入力ポートがOFFであれば質問のような状態になると思います。
従ってJO_Oさんの指摘されたZフラグの判断基準が問題となります。
簡単にテストするのであれば、
BTFSS STATUS,ZをBTFSCに変更してみてはどうでしょうか?
>一寸本筋から離れますが
>Zフラグについては 各サブルーチンの最後でBポートを読み込んでいますからBポートがクリヤされた時点で変化すると思います。
>記述の分かりやすさの問題はあるかもしれませんが 一つの方法と思います。
>
- 5844. Re: 質問です。 [ボン] 2005/08/15 14:16
- 数々の貴重なご意見、ありがとうございます。
ハードは3つのモータードライバ(TA7291P)がポートBの1・2、4・5、6・7につながっています。またポートAの0・1・3にはディップスイッチが繋がっています。
設定はBANK1にてポートAの0〜3を入力、他を出力。ポートBは全て出力となっています。
「Fレジスタの内容をコピーして、レジスタ内容が0ならZフラグに1を設定する」というMOVF命令の仕様を見て、「これだぁぁああ!」ってことで使ったのですが、どうやら甘かったようです。
Zフラグの判断基準が不明確というのは一体どういう事なんでしょうか?
- 5845. Re: 質問です。 [JO_O] 2005/08/15 15:52
- 毎度JOです。
>>Zフラグの判断基準が不明確というのは
希望の状態(すべてのモーターが停止した時のみ)にZフラグが反応しません。
今回のレスを熟読しましょう、いくつかの重要なポイントが記されています
>>ポートAの0・1・3にはディップスイッチが繋がっています
リミットスイッチの事ですね。
今回はモーターが停止した時、さらに細かく言うとポートBの対応するビットに、
「0」を出力して、このポートを読み込む事で判断していますが、この方法は安定しません。
そもそも、ポートの読み込みとは「ポートの出力バッファー」を読み込む事ではなく、
ポート「そのものの状態」を読み込む事です、したがってポートに大きなコンデンサー「C」
が「ぶら下がって」いると、この「C」をチャージするまで、「ポートの出力バッファー」と
「ポートの状態」は一致しません。
そこで今回はポートAの内容で条件ジャンプしましょう。
BTFSS STATUS,Z
GOTO KEYSCAN1
GOTO WAIT
この部分を書き換えます、他の部分はそのままでいいでしょう
ポートAの0・1・3がすべて「0」になったとき、Zフラグが反応すればいいので
MOVF PORTA,0
ANDLW B'00001011'
BTFSS STATUS,Z
GOTO KEYSCAN1
GOTO WAIT
この一連の流れで、わからない時は、また質問してください。
- 5853. Re: 質問です。 [ボン] 2005/08/16 15:59
- ご返信ありがとうございます。
先ほどJO様の仰るとおりにプログラムを組んで動作させてみた所、見事に動作しました!下の方にすっ飛ぶといった問題もなく安定した動作になっています。
それにしてもANDLW命令ってこういう使い方をするんですね。今までどうやって使うんだろう?と思っていたのでいい勉強になりました。しかもポートAの変化を使うというのは全くの盲点でした。まだまだ修行が足りないようです。
カモ様、JO_O様、aico様、PICFAN様、貴重なご意見ありがとうございましたm(__)m