- ベストアンサー
PICアセンブラ、これって変?
PIC16F84でのアセンブラなのですが、下記のプログラムで・・・。 MAIN MOVLW B'00000000' MOVWF PORTB BTFSC PORTA,3 GOTO FINISH GOTO MAIN FINISH MOVLW B'11111111' MOVWF PORTB END PortAが入力、Bが出力なのですが、MAINでループしながら待機、 PortAの3bitめがHになったらPortBをすべて立てて終了という感じに なると思いますが、上手くいかないんです。 3bit目にあらかじめ+5Vを印加しておくと、一瞬でPortBがすべて立つのですが、 ループ中にやっても何も変化がありません。 ループしていないか、判定ができていないかのどちらかなのですが・・・。 デバッグしてみても、きちんとループ・判定できているのですが いざ焼いてみると動作しません。わかりますでしょうか。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
回路の方はどうなっていますか? 特に入力ピンの処理は行っていますか? 入力ピンが不安定だときちんと動きません。 もし他のPORTAのピンを使っていなのであればGNDなどにおとすか出力ピンに設定してしまいましょう。 +5Vを印加とのことですが5Vをいれる前のPORTA(3)はGNDになっているのでしょうか? 5Vを直接いれるのであれば10KΩ程度の抵抗でPORTA(3)をGNDに接続しておいてスイッチなどで5Vが直接入るようにしてやればいいです。 また、 CLRF PORTB MAIN BTFSC PORTA,3 GOTO FINISH GOTO MAIN こっちの方が気持ち的にいいかな? (PORTBにCLRFって使えたっけな?)
その他の回答 (5)
- vcmshiro
- ベストアンサー率44% (32/72)
\(^o^)/コンバンワ!! IMUSAI時代から、TK80を経て現在まで現役で仕事をしています。 アセンブラなどは懐かしく思い、ついチョッカイを書いてみました。 PICなど秋月電気通商さんなどで売っているあれ?でしょうか? PICは使った事ありませんので、知りませんが予測してみますのでチャレンジしてみて下さい。 【ご質問の整理】 ご質問のビットを確認しているのだが、分岐で実行されない。と言う事ですね。 【根本原因】 フラグがたたないので分岐しないと思われます。 80系のCPUは、MOV命令などで値を移動しても、移動した数値によりフラグレジスターは変化しません。 68系のMPUは、MOV命令などで数値を移動するだけで、フラグレジスターに変化が表れます。 このPICはどうやら68系CPUみたいですね。 BTFSC PORTA,3 の命令を BTFSS PORTA,3 に変更してみて下さい。 PORTAの3ビット目が、trueであれば、次の命令をスキップする。と言う事になり、目的が果たせるかと思われます。 我々の時代は、ICEと言うものを使ってCPU自体をシュミレートするマシンを使って、メインボードなどのハードウエア欠陥を治したものです。あの頃が懐かしい。 PICのニューモニック一覧表を添付しておきました。 楽しいPICライフを過ごせると良いですね。
お礼
このPICは、ビットのH/Lで単純分岐してくれるので、フラグは考えなくても良いようです。 プログラムには誤りが無いようなんですが(デバッグokでした)、原因は発振部分の不良により、プログラムカウンタが進んでいなかったようです。 お騒がせして申し訳ありません。ありがとうございました。
- KOH_da
- ベストアンサー率31% (161/506)
プログラムにおかしいところはないように見えます。 PORTAのI/Oの設定をしていない。 配線が間違っている。 シリアル通信でON=1と思い込んでいる。 などが考えられます。 シリアル通信ではON=1のときと、ON=0のときがありますよね。 たとえば、PCとWonderSwanが逆だということに気付かないと... って、それは私のことです(^^;)。 PORTAの入出力を設定しているところを数行見せてください。
補足
デバッガでは問題なかったのでハード的なものかと思ったのですが、正にその通りでした。(T_T) クリスタルにつけたコンデンサの不良で、発振されていなかったようです。交換したら無事に動作しました。お騒がせしてすみません・・・。
- gould09
- ベストアンサー率33% (196/589)
PORTAの初期化を行っていないようですが大丈夫でしょうか? よく分かっていないのですが、レジスタのアドレスを初期化で入れるのではないでしょうか? 違っていたら、ごめんなさい。
補足
初期化として、入出力のモードを設定、出力データを設定というのが必要なのですが、 とりあえずPortAは入力に指定し、出力はしないので初期値は0としてあります。 う~ん、お手上げかもしれません・・・。(笑) お手を煩わせてしまって申し訳ありません。
- gould09
- ベストアンサー率33% (196/589)
BTFSCを調べた所オペランドのビット指定が0~7と成っています。 プログラムで3を指定していると言う事は、4番目のビットになるのではないでしょうか? BTFSC f レジスタ の指定ビットが 0 なら次の命令をスキップ 書式 [label]BTFSCf, b( label は省略可 はスペースを示す ) オペランド f:ファイル・レジスタのアドレス ( 00(00h) ~ 127(7Fh) ) b:ビット指定 ( 0 ~ 7 )
補足
ありがとうございます。一通りの入力ピンを試してみたのですが、だめでした。 リセット時初からHiになっている時のみ正しく動くのですが、やはりハードウェア側がおかしいのでしょうか・・・。
- gould09
- ベストアンサー率33% (196/589)
すみません。 回答では無いです。 PICアセンブラがどのくらい有名なのかわからないのですが、 アセンブラを知っていてもPICアセンブラを知らない人も多いと思います。 PICアセンブラの説明も載っていれば、回答出来る人が増えると思いますが。 例えばBTFSCのコマンドの説明です。 それがわかれば、なぜGOTO文が2つ並んでいるのか分かるのでしょうか? GOTO FINISH GOTO MAIN
補足
そうですね。お手数をおかけしてすみません。 MOVLW B'00000000' 0hをWReg(作業領域)にコピーします。 MOVWF PORTB Wregの内容をPORTBに移動します。 これで、マイコンのポートB(出力用/8bit)のビットをすべて0にします。 BTFSC PORTA,3 ポートA(入力用)の3ビット目を見て、0だったら直後の命令をスキップします。 GOTO FINISH GOTO MAIN 1だったらFINISHにジャンプ、それ以外はループ続行です。 FINISH 内では、同じように出力ビットをすべて立てて終了します。 ということなのですが・・・。 5V駆動なので、この3bit目に5Vを入れたりGNDに落としたりしているのですが、ダメでした・・・。(汗)
お礼
ありがとうございます。 入力ピンの設定はできているのですが、どうしてもダメでした。 ループするところでしていんたいので、もしやと思ってクリスタルを抜いてみたら・・・同じ症状でした。 すみません、発振部分がイカれていたようです。 なんとか正常に動作させることができました。お騒がせして申し訳ありません。