プロが教えるわが家の防犯対策術!

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がすべて立つのですが、
ループ中にやっても何も変化がありません。

ループしていないか、判定ができていないかのどちらかなのですが・・・。

デバッグしてみても、きちんとループ・判定できているのですが
いざ焼いてみると動作しません。わかりますでしょうか。

A 回答 (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って使えたっけな?)
    • good
    • 0
この回答へのお礼

ありがとうございます。
入力ピンの設定はできているのですが、どうしてもダメでした。
ループするところでしていんたいので、もしやと思ってクリスタルを抜いてみたら・・・同じ症状でした。

すみません、発振部分がイカれていたようです。
なんとか正常に動作させることができました。お騒がせして申し訳ありません。

お礼日時:2001/06/25 15:43

\(^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ライフを過ごせると良いですね。

参考URL:http://www.phys.waseda.ac.jp/shalab/~riku/resear …
    • good
    • 0
この回答へのお礼

このPICは、ビットのH/Lで単純分岐してくれるので、フラグは考えなくても良いようです。
プログラムには誤りが無いようなんですが(デバッグokでした)、原因は発振部分の不良により、プログラムカウンタが進んでいなかったようです。
お騒がせして申し訳ありません。ありがとうございました。

お礼日時:2001/06/25 15:47

プログラムにおかしいところはないように見えます。



PORTAのI/Oの設定をしていない。
配線が間違っている。
シリアル通信でON=1と思い込んでいる。

などが考えられます。
シリアル通信ではON=1のときと、ON=0のときがありますよね。
たとえば、PCとWonderSwanが逆だということに気付かないと...
って、それは私のことです(^^;)。

PORTAの入出力を設定しているところを数行見せてください。

この回答への補足

デバッガでは問題なかったのでハード的なものかと思ったのですが、正にその通りでした。(T_T)
クリスタルにつけたコンデンサの不良で、発振されていなかったようです。交換したら無事に動作しました。お騒がせしてすみません・・・。

補足日時:2001/06/25 15:47
    • good
    • 0

PORTAの初期化を行っていないようですが大丈夫でしょうか?


よく分かっていないのですが、レジスタのアドレスを初期化で入れるのではないでしょうか?
違っていたら、ごめんなさい。

この回答への補足

初期化として、入出力のモードを設定、出力データを設定というのが必要なのですが、
とりあえずPortAは入力に指定し、出力はしないので初期値は0としてあります。
う~ん、お手上げかもしれません・・・。(笑)
お手を煩わせてしまって申し訳ありません。

補足日時:2001/06/23 01:09
    • good
    • 0

BTFSCを調べた所オペランドのビット指定が0~7と成っています。


プログラムで3を指定していると言う事は、4番目のビットになるのではないでしょうか?


BTFSC
f レジスタ の指定ビットが 0 なら次の命令をスキップ

書式
[label]BTFSCf, b( label は省略可 はスペースを示す )

オペランド
f:ファイル・レジスタのアドレス ( 00(00h) ~ 127(7Fh) )
b:ビット指定 ( 0 ~ 7 )

この回答への補足

ありがとうございます。一通りの入力ピンを試してみたのですが、だめでした。
リセット時初からHiになっている時のみ正しく動くのですが、やはりハードウェア側がおかしいのでしょうか・・・。

補足日時:2001/06/22 23:10
    • good
    • 0

すみません。


回答では無いです。

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に落としたりしているのですが、ダメでした・・・。(汗)

補足日時:2001/06/22 20:41
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!