• 締切済み

PICの誤動作についての質問です

現在PIC18F24K20というPICを使用していて、2つの入力信号に対して、1ビットずつ判定を行いその2つの信号が間違っていればPORTBを+1してカウントしていくというプログラムを作っています。 RC0、RC2から信号を入力しています。Receive0でまずタイミングを合わせて、Receiveで間違っているかの判定を行うというプログラムです。 Receive0 BTFSS PORTC,0 ;RC0がHighなら次の命令をスキップ GOTO Receive0 NOP NOP NOP NOP NOP ;*** 入力信号の解析 Receive BTFSS PORTC,0 ;RC0がHighなら次の命令をスキップ GOTO ZERO BTFSS PORTC,2 ;RC2がHighなら次の命令をスキップ INCF PORTB,F ;PORTBを+1 NOP GOTO Receive ZERO BTFSC PORTC,2 ;RC2がLowなら次の命令をスキップ INCF PORTB,F ;PORTBを+1 NOP GOTO Receive (PORTの設定は省かせてもらっています) プログラムにおかしい点があれば指摘していただければうれしいです。 回路は入力をFPGAから直接RC0、RC2に入力して、PORTBも開放してロジアナで波形を観測しています。 ロジアナで見ると思っているような動作ではなく、PORTBが勝手にHighやLowになってしまっています。どのようなことが問題になっているのでしょうか?

みんなの回答

  • pyonmae
  • ベストアンサー率64% (40/62)
回答No.3

こんにちは。 ちょっとそちらの用語が分からないのですが、「受信」とは、入力がパタパタしている状態の事でしょうか。 「信号を受信していない状態」とは、入力がどうなっている状態なのでしょうか。 「RC0から受信」とか「RC2から受信」とか書いておられますが、RC0とRC2は別々に信号が入力されるという事でしょうか。 #2にも書きましたが、信号が動いていなくても、RC0とRC2のレベルが違えば、その間PORTBはインクリメントされ続けますが、その辺りは大丈夫でしょうか。 「RC2から受信した場合には全くインクリメントされません」というのは、単にReceive0のループから抜けていないだけではないのでしょうか。 目的の機能を追いかけるだけでなく、時には回り道をして外堀から埋められてはどうでしょう。 テストプログラムを色々作って、一つ一つの機能をチェックされてみては? ・PORTCの状態をPORTBに単純にコピーしたら、RC0/RC2の動きに追従するか。 ・RC0、RC2とは関係なく単純にPORTBをインクリメントさせると、正しくインクリメントするか? ・(本番プログラムで)RC0とRC2をショートしても、PORTBは変化するのか? とかとか。

ka198765
質問者

お礼

何度も質問に答えていただきありがとうございます。 pyonmaeさんの言われるとおりテストプログラムを作って動きを確ると、思ったように動きました。本当にありがとうございました。

  • pyonmae
  • ベストアンサー率64% (40/62)
回答No.2

こんにちは。 先ほど書き忘れたのですが、RC0とRC2のレベルが違うと、違う間ずっとPORTBがインクリメントされ続ける、というのも気になる点です。 勝手に0になる、というのは、PORTBに0を書き込む処理がない以上、想定外の動作、という事になります。 お示しの部分以外でPORTBに0を書いているか、ウォッチドッグが有効になってたりしませんか? さて、アキュムレータの判定方法はたくさんありますが、邪道なのを一つ。 1.PORTCをアキュムレータに読み込む。 2.アキュムレータと0x05のANDをとる。 3.2の結果が0x00か0x05ならOK。それ以外はNG。 蛇足ですが、上をやるなら"0x05"とか直値でなく、 RC0 EQU 0x01 RC2 EQU 0x04 と定義した上で、 ANDLW (RC2|RC0) などとやるとそれっぽく見えてくるかも知れません。

ka198765
質問者

お礼

何度もありがとうございます。 PORTBに0はプログラム上では一度も書いていません。ウォッチドッグは有効になっています。 現在測定しているやり方は、PICの4サイクル分が1ビットで、”11001010”という信号を一定時間おきにRC0からのみ受信しています。しかしこの信号を受信していない時にもPORTBの値が変化しているときがあります。また、RC0から受信した時は、インクリメントされていることがあるんですが、RC2から受信した場合には全くインクリメントされません。ハンダなど回路の問題なのでしょうか?

ka198765
質問者

補足

ウォッチドッグは有効になっています。 と書いていましたが、ウォッチドッグはOFFでした。

  • pyonmae
  • ベストアンサー率64% (40/62)
回答No.1

こんにちは。 入力される波形の仕様などがわかりませんので、どうもお答えしにくいのですが・・・。 あと、「PORTBが勝手にHighやLow」とは、どういう事でしょう。 勝手にインクリメントされる、という事ですか?全くメチャクチャな動作になる、という事ですか? 後者なら、プログラムの問題だけでない気がします。 前者だとして考えてみます。 ソースから仕様を想像するに、以下のような感じでしょうか。 1.PORTCのbit0(以下RC0)がHiになるまで待つ 2.RC0がHiになると、動作開始。以降、RC0とPORTCのbit2(以下RC2)は寸分違わず同じ波形が入力されることが期待される。 3.RC0とRC2の入力レベルが違った場合は、PORTB(8bit?)がインクリメントされる。 もし違う場合は、仕様を補足してください。 上記のような仕様だとして、また、ポートの設定も正しいとして、プログラムだけをみると、次の点が気になります。 ・RC0が最初からHiだった場合、タイミング合わせに使えるのか。 ・そもそも、検査対象の信号とタイミング信号を兼用するのはどうなのか。 ・RC0とRC2を別々に読み込んでいるので、RC0を読んでからRC2を読むまでの間に信号に変化があった場合、誤動作の元となる。 アキュムレータにPORTCを丸ごと読みこんで、値をチェックしてみてはどうでしょうか。

ka198765
質問者

お礼

回答していただきありがとうございます。 PORTBは勝手にインクリメントされたり、勝手に0になったりしてしまいめちゃくちゃな動作になってしまっています。 仕様はpyonmaeさんが考えているものであっています。 PORTCに丸ごと読み込むことも考えたのですが読み込んだものをどう判定してよいのかわからず、別々の判定にしてしまいました。 PIC初心者なのですいません。

関連するQ&A