- ベストアンサー
PICのテストプログラムでLEDの点灯が同時になってしまう理由は?
- PICのテストプログラムでLEDの点灯が同時になってしまう理由を教えてください。
- PICのプログラムで予期せずLEDが同時に点灯してしまう問題についてお知恵を拝借したいです。
- 困っているのですが、PICのテストプログラムを作成したところ、LEDが一斉に点灯してしまいます。どうすれば解決するでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>そうなのですか。Bankの切り替えをはっきりさせた方がいいんですね。 そういうことではありません。 前回答を詳しく書き直すと・・・ STATUSレジスタには、バンク切り替え以外の機能もありますよね? RP0とRP1以外のビットも、機能を担当しているわけです。 なのに、 clrf STATUS とすると、全て0になりますよね。 データシートをざっと見てみたところ、STATUSのbit 3がWDT、bit 4がSLEEPの切り替えを担当しています。 WDTは最初にOFFしていますから、bit 3を操作しても影響無いと思いますが、bit 4はおそらく影響します。 ということで、STATUSレジスタ全体をクリアするとSLEEP MODEに入ってしまうわけです。 デバッグというのは人間がやるものです。補助ツールはありますが、判断するのは人間。 あなたの意図までは解釈してくれません。 バンク切り替えを忘れていても、「そのバンクのそのレジスタをいじりたいのね」と思って、そのように処理してくれます。 シミュレータで動かしながら、レジスタ値の変化を追っていくのが一番分かりやすいと思います。 シミュレータが使えないのなら、プログラムを1ステップずつ確認していく必要があります。 思い通りの動作をしていれば、RD0のLEDが点灯。そうでなければ何もしないという風に。 ソースコードだけ見ていても、自分の勘違いとかデータシートの読み込み不十分さには気付きません。 私も、12C509にはハードウェアスタックが3段しかないのに気付かず、数日悩んだことがあります。 877は大丈夫だと思いますが、あまりにもcallしすぎてネストが深くなると、引っかかるかもしれません。
その他の回答 (2)
- poyo3
- ベストアンサー率30% (260/857)
call matuloop3の内容は確認してみましたか? 良くありがち(?)かもしれませんがバンクの切替はしっかりしておいたほうが良いかと思います16F877Aは4バンクありますので初期値で設定されている場合でもバンク1を指定する場合はbcf STATUS,RP1 bsf STATUS,RP0 と確実にバンクを設定するほうがよいと思います。 バンクが切り替わっていなくてもアセンブルでエラーは出なかったと思います。
補足
解答ありがとうございます。 call matuloop3は、デバッグしてあっていたと思います。バンクの切り替えは、デバッグでは、わからないのですか?
- take0_0
- ベストアンサー率46% (370/804)
bank 1への切り替えは bsfSTATUS,RP0 としているのに、bank 0への切り替えは clrfSTATUS としていますね。これは少々乱暴です。 他のステータスビットをクリアしても問題無いことを確認しましたか? 特にbit 3,4がまずいでしょうね。WDTはoffになっているようですから、SLEEPになってしまっているのではないでしょうか。 よくわからないのなら余計に、わかっているbitだけ操作しましょう。 2箇所ある clrf STATUS を、 bcf STATUS,RP0 とすれば所望の動作をすると思います。
お礼
解答ありがとうございます。 そうなのですか。Bankの切り替えをはっきりさせた方がいいんですね。 いろいろと難しいですね。
お礼
ありがとうございます。よくわかりました。 やってみたいと思います。