• ベストアンサー

STATUSのZフラグについて

STATUSのZフラグについてお聞きしたい事があります。 参考書を読んでみると、「Zフラグは、計算結果や代入結果が'0'となったことを表す指標のことをいう。数値の一致を知るには引き算をしてZフラグを見るプログラムを書く」とあります。 サンプルプログラムを見ても'0'か'1'しかZフラグには存在しない様に思われますが、現在私が組んでいるプログラムでは、プログラムが1行進むにつれてZフラグの数字が1ずつ増えていってしまい、計算結果を確認する事が出来ません。これは単に私のプログラムの設定が間違っているのでしょうか。もしソースがあれば判断出来るのであれば後ほどアップしますのでどなたか教えてもらえませんか。PICアセンブラで組んでいます。宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.11

0Vと5Vがショートしない限り発火の心配はないと思います。 10Kオームの抵抗でパルスとの間は安全に接続されていますので、この回路で問題はでないと思いますが、ゲート側にコンデンサが入っているのでノイズには良いかもしれませんが、多少信号が遅延しているかも(時定数をすぐ言えるほど精通していないので勘ですが)。カウントできているなら問題ないと思います。 コンデンサは信号の変化をゆるやかにする効果がありますので。

jza70-kai
質問者

お礼

zwi様 こんばんは。ご無沙汰しております。 本日、最終調整も行い、ほぼ思った感じでLEDの点灯が出来る様になったので、これで完成にしたいと思います。 この後は実際にこの回路や前回のオドメーター回路と共にオリジナルメーターの製作に入りたいと思います。 この度はとても長い間助けて頂いて本当に有難う御座いました。m(__)m また別のものを作る時に助けて頂く事もあるかも知れませんが、その時も変わらずアドバイスを頂けます様宜しくお願い致します。 簡単ですが、御礼の挨拶に代えさせて頂きます。 それでは。

その他の回答 (10)

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.10

>あと、GとS間に抵抗ですか??入ってなかったですよ。この回路も別の方に教えて頂いたものなんですが・・・。ちなみに入れる抵抗値は10KΩくらいでいいのでしょうか? うーん。私もFETは不勉強で(^^ゞ トランジスタなら必要そうだと勘で分かるんですが、とりあえず動いているなら放置してかまいません。 こんな感じ(簡略図)でLEDにそのまま出力してみてください。 スイッチ→FET→PIC→LED PICは入力をそのまま出力にスルーします。 ちゃんとスイッチと連動してON/OFFしていたらOKって事で。 >PORTAの点灯なんですけれど、プログラムを訂正してみましたがやはり点灯しません。さらに気付いたんですが、PORTCの6と7番のLEDも点灯していませんでした。PIC壊しちゃったかな?(T_T) そう簡単には壊れませんので、動作を確認してみましょう! 全てのポートにオール1を出力してみます。これで配線が間違っていなければ点灯するはずです。今まで一度でも全点灯のテストはした事がありますか?マイコンは、こういう地道な部分を最初に確認しておくと後で悩まなくても済みますので必ず最初に確認しましょう。 >割り込みのレジスタ退避はしてたつもりなんですが、これは退避になっていないのでしょうか。 退避と回復として正しいですが、タイミングが間違っています。 なぜなら、割り込んだ瞬間の値を退避しないと駄目なんですが、割り込みの最初のほうで、  bsf  STATUS,RP0 とか  movlw  00H で値を変更してますよね。つまり、ここで変更した値を保存してしまっています。じゃあ割り込んだ瞬間の値はと言うと失われているので二度と元に戻せません。 このまま割り込み元に戻ると割り込む前に使っていたWレジの値やSTATUSの一部が失われているのでマズイのです。 しかし、よく考えてみると前に書いてもらったカウントしているだけのプログラムなら問題が出ないはずだなぁ。Wレジ使っていないし。問題は別件かもしれませんね。 >メーターに出力する所はまだまだ手直し出来るんですね。私の頭ではこれが現状では限界だったもので。(^^; 整理してみると意外とシンプルに書けますよ。  movlw  D'130' ;これが最大値  subwf  PULSE_COUNT2,W ;PULSE_COUNT2-130。130より大きければC=1  btfsc  STATUS, C ; 130以下(c=0)ならスキップ  goto speed_180 ; c=1なら180km/hオーバーとして処理。 これを大きい値から小さい順に処理します。  movlw  D'108' ;次の値。  subwf  PULSE_COUNT2,W ;PULSE_COUNT2-108。108より大きければC=1  btfsc  STATUS, C ; 108以下(c=0)ならスキップ  goto speed_150 ; c=1なら150km/hオーバーとして処理。 って感じです。

jza70-kai
質問者

お礼

zwi様、こんばんは。ご無沙汰しております。 その後の報告を書き込もうと思ったら、先に回答がないとそこには書き込みが出来ないんですね。 とゆー事でまだお礼内容にはなりませんがこちらに書かせて頂きました。 パルス入力部分はやはりおかしく、色々調べてみて、部品番号とかは違ったのですが、使えそうなものがあったのでちょっとアレンジして回路を作ってみました。                            5V                            ↓                            1kΩ                            ↓                           LED                    2SK2493   ↓ パルス入力→10KΩ→→→→G→→→D→→→PIC              ↓  ↓    ↓             0.1uF  ↓    S              ↓  10KΩ  ↓              ↓  ↓    ↓               0V     0V これで動かしてみたら、入力が入った時(スイッチを押した時)にPICはHi、スイッチを離したらPICはLowとなり、期待していた動きになりました。 先日、実際に車に取り付けて車速パルスを認識して動くか試してみました。結果はちゃんとパルスをカウントして、LEDも点灯しました。ただ点灯するタイミングがずれていたのでその辺りは微調整が必要な様です。 上記の回路が悪魔で自己流なものなので、これで完成品を作っても大丈夫なのかが一番の心配点です。間違って発火なんぞされたら大変ですもんね。(^^; zwi様はどう思われるでしょうか。 またお時間がある時で結構ですのでご回答をお願い致します。

jza70-kai
質問者

補足

zwi 様 こんばんは。昨日と今日はちょっと出掛けていましたので返事が遅くなりました。 >スイッチ→FET→PIC→LED >PICは入力をそのまま出力にスルーします。 >ちゃんとスイッチと連動してON/OFFしていたらOKって事で。 やってみました。 あっ、何か変。 そう言えば前に入力部分はこうやっていますって書いた時に、入力がなくてもHi入力になっているって書きましたよね。 前の配線図で接続したら、電源を入れたらやはりLEDが最初から点灯しています。そしてスイッチを入れたらLEDが消えるんですが、スイッチを離してもすぐには点灯せず、1秒ほどしてから点灯しています。 これがzwi様の言っていた「GとS間に抵抗が入っていなかったか?」に繋がるんでしょうかね。ちょっと調べてみます。 >全てのポートにオール1を出力してみます。これで配線が間違っていなければ点灯するはずです。 すみません。ちゃんと全部点灯します。 基本を飛ばしていきなりあれやこれやとやってしまっているのが問題を引き起こしている原因なんでしょうね。 メーター出力部分のプログラムは本当に見やすくてスッキリとしていますよね。恐れ入ります。m(__)m 再度教えて頂いた内容でプログラムを修正して動かしてみます。 また結果はご報告いたします。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.9

>よくよく考えたら、これってパルス入力がなければPICには5V(Hi)がかかってるんですよね。 前はパルス入力のところにスイッチ入れてたんでしょうか? それと、この回路のGとS間に抵抗が入ってなくて大丈夫かって気がするんですが、入ってませんでしたか? >LEDのPORTAの点灯の件ですが、教えて頂いていた「C0H」を「03H」に変更したら点灯しましたが、これで正解なのかな? あっ、わかりました。 ビットシフトを忘れてましたね。 MOVF PULSE_COUNT1,W ANDLW C0H ;上位2bitをマスク MOVWF PORTA ;上位2bitをポートAへ。 BCF STATUC,C ;carryをクリア RLF PORTA,F ;carry←bit7,bit7←bit6 RLF PORTA,F ;bit0←carry,carry←bit7 RLF PORTA,F ;bit1←bit0,bit0←carry。これで下位2ビットに値が出ます。 プログラムのほうは、割り込みでレジスタ退避せずにSTATUSやWレジ使っているのはまずいですね。まともに動作するはずがありません。これが原因かも?一番先にWレジやSTATUSを退避してください。 メーターに出すほうの処理は、まだ効率よく書けると思うんですが、時間がないのでまた後で。

jza70-kai
質問者

補足

zwi様、こんばんは。 >前はパルス入力のところにスイッチ入れてたんでしょうか? >それと、この回路のGとS間に抵抗が入ってなくて大丈夫かって気がするんですが、入ってませんでしたか? そうです。以前の時はパルス入力部分にスイッチを入れて、ボタンを押したら5Vが流れていくって感じにしていました。 あと、GとS間に抵抗ですか??入ってなかったですよ。この回路も別の方に教えて頂いたものなんですが・・・。ちなみに入れる抵抗値は10KΩくらいでいいのでしょうか? PORTAの点灯なんですけれど、プログラムを訂正してみましたがやはり点灯しません。さらに気付いたんですが、PORTCの6と7番のLEDも点灯していませんでした。PIC壊しちゃったかな?(T_T) 割り込みのレジスタ退避はしてたつもりなんですが、これは退避になっていないのでしょうか。 [退避]  movwf  w_temp  movf  STATUS, W  movwf  s_temp [退避解除]  swapf  s_temp,W  movwf  STATUS  swapf  w_temp,F  swapf  w_temp,W 書籍に掲載されていたものをそのまま利用していたんですが・・・。 メーターに出力する所はまだまだ手直し出来るんですね。私の頭ではこれが現状では限界だったもので。(^^; 処理は時速0km以上9km以下はLEDは点灯せず、10km以上19km以下は10kmのLEDを点灯させようとしていてこんなプログラムにしていました。またお時間がある時で結構ですので教えて下さい。 色々とお世話になり申し訳御座いません。非常に助かります。zwi様にここまでフォローしてもらわないといけないくらいPICって簡単なものではないんですよね。PICを触り出してからあまり時間は経っていませんが痛感しています。この後も引き続きご指導の程宜しくお願い致します。m(__)m

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.8

>チャタリング処理はしておりませんので確かにきっちりとしたカウントは現在は出来ない状態にあります。 チャタリング込みじゃないと1秒間に10回以上は入力するのは難しいですからね。 >入力部分はFETの部品が入ったりしていてよく解らなかったので、10Kオームの抵抗を-に接続して配線をやりかえました。 SWがオープンの状態のときにプルダウンされている事が必要なので、少し違う心配がありますね。 5V→SW→PIC      ↑     10KΩ      ↑      0V ならOKです。 >LEDの2進表示プログラムを割り込み部分に入れて実際にテストしてみましたが、PORTAの2つのLEDが点灯しません。PORTCは点灯しております。手直し方法が分からないのですいませんが助けて下さい。。。 値が64以上にならないと表示されませんので、試しに4倍して表示してみてください。 >あと、バンク間違いの件ですが、全く気付いてませんでした!(>_<) >けど、オドメーターのプログラムも調べてみたら同じ事をしていたのにどうして作動しているんだろ??それもちょっと気になる所です・・・。 WDTとINT割り込みを使っていないので大丈夫なんだと思います。そういう意味なら不要ですね。

jza70-kai
質問者

補足

zwi様、こんばんは。 PORTAのSW入力部分なんですが、現状は教えて頂いた通りの図で合っています。 しかし、それまでのFETを接続している状態は、                       5V                        ↓                       R(10KΩ)                  (2SK2493)↓ パルス→R(100KΩ)→G-S-D→PIC                    ↓                   0V  という接続でした。よくよく考えたら、これってパルス入力がなければPICには5V(Hi)がかかってるんですよね。 LEDのPORTAの点灯の件ですが、教えて頂いていた「C0H」を「03H」に変更したら点灯しましたが、これで正解なのかな? この状態で、チャタリングを起こさせながら入力をしたらLEDが1秒毎に点灯位置も変わり表示していました。という事は、カウントは出来ていて、その後のカウント数を比較してLED表示させるソースがおかしいという事になりそうですね。 今度はその辺りのソースをUPしてみます。 WARIKOMI  bcf  PIR1,TMR1IF  bsf  STATUS,RP0  bsf  PIE1,TMR1IE  bcf  STATUS,RP0  movlw  00H  movwf  TMR1L  movlw  80H  movwf  TMR1H  movwf  w_temp  movf  STATUS, W  movwf  s_temp  movf  PULSE_COUNT1,W  movwf  PULSE_COUNT2  clrf  PULSE_COUNT1 ;-------------------------------------------------- ; 0km  movlw  D'0'  subwf  PULSE_COUNT2  btfsc  STATUS, Z  goto  speed_0  btfss  STATUS, C  goto  speed_0 ;10km  movlw  D'7'  subwf  PULSE_COUNT2  btfsc  STATUS, Z  goto  speed_10  btfss  STATUS, C  goto  speed_0 ;20km  movlw D'7'  addwf  PULSE_COUNT2,1  movlw  D'14'  subwf  PULSE_COUNT2  btfsc  STATUS, Z  goto  speed_20  btfss  STATUS, C  goto  speed_10 ・・・以下、180kmまで ;----------------------------------------------- ; SPEED-BAR LED OUTPUT ;カウントしたパルスの値に合うスピードバーLEDを点灯させる ;PORTA 0~3,5 → 時速 10km/h ~ 50km/h ;PORTC 2~7 → 時速 60km/h ~ 110km/h ;PORTB 1~7 → 時速120km/h ~ 180km/h に対応 ;----------------------------------------------- speed_0  movlw  B'010000'  movwf  PORTA  clrf  PORTB  clrf  PORTC  goto  OWARI speed_10  movlw  B'010001'  movwf  PORTA  clrf  PORTB  clrf  PORTC  goto  OWARI speed_20  movlw  B'010011'  movwf  PORTA  clrf  PORTB  clrf  PORTC  goto  OWARI ・・・以下180kmまで ;-------------------------------------------------- OWARI  swapf  s_temp,W  movwf  STATUS  swapf  w_temp,F  swapf  w_temp,W  RETFIE こんな感じです。 めちゃくちゃなソースになっているのならゴメンナサイ。 またアドバイスをお願い致します。m(__)m

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.7

>まず割り込み確認ですが、これも別の方に教えて頂いたチェック方法なんですが、割り込みルーチンの所に下のソースを入力して確認を行いました。 >その割り込み処理は時計やオシロでは計ってはいませんが、見ている限り1秒くらいの周期で動作していました。実際、別に1秒ではなくて0.5秒くらいでも構わないのですが、スピードが上がっていくのに1秒くらいで処理すれば十分だと思って設定しているだけなんです。 1秒周期で点滅していると見えたとすると、割り込み周期は0.5秒かな? 2回の割り込みで1周期ですからね。 >次ですが、擬似パルスというのは車速パルスが約5~6V出ているので、パルス入力端子に電源の5Vを接続して、スイッチを押すと5VがPICへ流れていく様にしているだけで何も作っておりません。 チャタリング処理はしてませんよね?するとONでカウントされる値は不定ですね。それより不安なのは、スイッチOFF時はLOW判定されるようにプルダウン(10Kオーム程度の抵抗を通してーに接続)してますか? >使用しているPIC(16F873A)はオドメーターのプログラムを入れていた試作品を使っておりますので、オドメーターが正常に動いている良品のPICです。 これは問題無しですね。 >LEDの接続回路ですが、現在の試作回路図をフリーソフトを使って描いてみました。・・・けどもしかしてここには画像がUP出来ない!? 文章でうまく説明出来るかな。。。 >RA0~3、5、RB1~7、RC2~7に3.3kΩの抵抗を各々に接続してその後にLEDの+を接続しております。 分かりました、8ビットしか出力しませんので、RA0~1とRC2~7に出力しましょう。 MOVF PULSE_COUNT1,W ANDLW 3FH ;下位6bitをマスク MOVWF PORTC ;下位6bitをポートCへ。 MOVF PULSE_COUNT1,W ANDLW C0H ;上位2bitをマスク MOVWF PORTA ;上位2bitをポートAへ。 で行けると思いますが、アセンブラ書くの久しぶりなので間違っているかも。 それとINAHO_SH4さん向けのに書いてある  bcf  STATUS, RP0  movlw  B'11000000'  movwf  OPTION_REG は、なんかバンク違ってますが大丈夫ですか?

jza70-kai
質問者

補足

zwi様、こんばんは。 チャタリング処理はしておりませんので確かにきっちりとしたカウントは現在は出来ない状態にあります。入力部分はFETの部品が入ったりしていてよく解らなかったので、10Kオームの抵抗を-に接続して配線をやりかえました。LEDの2進表示プログラムを割り込み部分に入れて実際にテストしてみましたが、PORTAの2つのLEDが点灯しません。PORTCは点灯しております。手直し方法が分からないのですいませんが助けて下さい。。。 あと、バンク間違いの件ですが、全く気付いてませんでした!(>_<) けど、オドメーターのプログラムも調べてみたら同じ事をしていたのにどうして作動しているんだろ??それもちょっと気になる所です・・・。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.6

>先の方にご相談をしておりまして、少し回答が重複するかも知れませんが、1秒で割り込みがかかるかテストは行って、結果は正常に作動しております。 これはLEDの点滅等で実際に確認されましたか?周期が正しいことは、時計やオシロ等で確認されていますか? >しかし、パルス(まだ現状では擬似パルス)を入力するプログラムで走らせると割り込みがうまくかかりません。 擬似パルスは、別のPIC等で生成してポートから入力された物ですか?それとも1つのPIC内でプログラムで生成しましたか? >車速パルスは1秒で最大約130パルスのカウント入力(時速180km/h)になるので、255は越えないと思われます。 それなら問題ないですね。 >あと、同じ型番のPICでオドメーターを製作し、そこに車速パルスを入力させてPICがパルスカウントをしているので、入力部分のハードをこの回路にも使用しております。でもこれは実際に車両と接続してからの話なので、現在の試作回路上では問題ないとは言えないですよね。 オドメーターが正常に動作しているPICで走らせていると理解して良いですか? >zwi様からのアドバイスの(2)をテストしたいのですが、LEDで2進表示させるプログラムの流れを簡単で結構ですので教えて頂けませんでしょうか。(すいません、まだ独自でちゃんと組めないので・・・)宜しくお願い致します。 カウント値をそのまま、LEDのポートに送るだけです。 LEDがPICに接続している回路が不明なので、もう少し情報をください。

jza70-kai
質問者

補足

zwi様 こんばんは。 ご質問の回答です。 まず割り込み確認ですが、これも別の方に教えて頂いたチェック方法なんですが、割り込みルーチンの所に下のソースを入力して確認を行いました。  BTFSS  PORTA,0  GOTO  $+3  BCF  PORTA,0  GOTO  OWARI (割り込み終了処理)   BSF  PORTA,0  GOTO  OWARI (割り込み終了処理) 恐らくzwi様なら何をしているのかすぐ解ると思いますが、TMR1で割り込みが発生した時、PORTAの0番ピンに接続しているLEDが1(点灯)しているならば0(消灯)にして割り込みルーチンからメインルーチンへ戻り、次の割り込み発生時にPORTAの0番ピンが0(消灯)しているならば1(点灯)にしてまたメインルーチンに戻る、といったテスト方法です。 その割り込み処理は時計やオシロでは計ってはいませんが、見ている限り1秒くらいの周期で動作していました。実際、別に1秒ではなくて0.5秒くらいでも構わないのですが、スピードが上がっていくのに1秒くらいで処理すれば十分だと思って設定しているだけなんです。 次ですが、擬似パルスというのは車速パルスが約5~6V出ているので、パルス入力端子に電源の5Vを接続して、スイッチを押すと5VがPICへ流れていく様にしているだけで何も作っておりません。 使用しているPIC(16F873A)はオドメーターのプログラムを入れていた試作品を使っておりますので、オドメーターが正常に動いている良品のPICです。 LEDの接続回路ですが、現在の試作回路図をフリーソフトを使って描いてみました。・・・けどもしかしてここには画像がUP出来ない!? 文章でうまく説明出来るかな。。。 RA0~3、5、RB1~7、RC2~7に3.3kΩの抵抗を各々に接続してその後にLEDの+を接続しております。RA4はパルス入力、RB0は時速100km/hが出ているフラグ出力用にしています。RC0とRC1には32.768KHzのTMR1クリスタルを30pFのコンデンサーX2で接続しています。 これで確認出来ますでしょうか。 まだ不足等ありましたらご連絡をお願い致します。 以上、お手数をお掛けいたしますが宜しくお願い致します。

  • INAHO_SH4
  • ベストアンサー率52% (10/19)
回答No.5

メインに書いている分には問題ないです。 但しこの処理は割り込みルーチン内には書かないでくださいね。 さてさて,1秒経っても割り込みが掛からないという点ですが・・・ 1.この処理の前にちゃんと割り込みを許可していますか? 2.割り込みの設定は正しく設定していますか?マスクの設定等は大丈夫ですか? 3.割り込み処理でワークレジスタ,ステータスレジスタはちゃんと退避・復旧をしていますか?(←今回は薄いかな) 4.割り込み復旧時にちゃんと割り込み要因フラグをリセットしてますか? この辺も確認して見てください。 この処理であれば,PORTAの状態で分岐している(ワークやステータスの状態で処理してない)ので可能性は薄いかもしれませんが,ワークの退避も一応試してみてください。 多分,話の流れ的にまだシミュレーター上かと思いますのでハードの使い方による物ではないと思います。 あと,シミュレーターをアニメーション(1ステップずつ実行していくさまを見ている状態)で実行すると1秒はとてつもなく長い時間になります。 その辺の注意してください。 A No4 の zwi さんがおっしゃるとおり,部分的に動作を確認するのが近道&基本です。 まずは正常に動作する部分と,うまく動かない部分を切り分けましょう。

jza70-kai
質問者

お礼

INAHO_SH4様 1ヶ月くらい前にお世話になったjza70_kaiです。 本日、どうにかこうにか今回の製作回路が完成に至りましたのでご報告をさせて頂きました。 基本を飛ばしていきなり本題に入ってしまっていたのが今回の反省点であり、今後は先に細かな事を調べて本題に入っていきたいと思います。 色々とアドバイスを頂き、本当に有難う御座いました。 また別の件でお世話になるかも知れませんが、その時も変わらず助けて頂けます様宜しくお願い致します。m(__)m それでは失礼致します。

jza70-kai
質問者

補足

INAHO_SH4 様 こんばんは。お忙しい中回答有難う御座います。 初期設定なんですが、色んな方のプログラムを参考にしながら手探り状態で組んでいるのでもしかしたらここかもしれないですね。現状のソースをUPしてみますのでこちらも一度見て頂いてご意見を頂けないでしょうか。 start  movlw  B'00000000'  movwf  INTCON  clrf  ADCON0  bsf  STATUS, RP0  movlw  07H  movwf  ADCON1  bsf  PIE1,TMR1IE  movlw  B'010000'  movwf  TRISA  clrf  TRISB  movlw  B'00000011'  movwf  TRISC  bcf  STATUS, RP0  movlw  B'11000000'  movwf  OPTION_REG  movlw  B'11000000'  movwf  INTCON  movlw  B'00001010'  movwf  T1CON  movlw  00H  movwf  TMR1L  movlw  80H  movwf  TMR1H  movlw  B'010000'  movwf  PORTA  clrf  PORTB  clrf  PORTC  clrf  PULSE_COUNT1  clrf  PULSE_COUNT2  bsf  INTCON,PEIE  bsf  INTCON,GIE  bsf  T1CON,TMR1ON ちなみにお伝えしてなかったかも知れませんが現在使用しているPICは16F873A、クロックは20MHz、TMR1には32.768KHzを使用しております。宜しくお願い致します。

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.4

なにかだいぶ前に回答した気がするzwiです。 見てみましたが、プログラム的には割り込みは邪魔してませんので問題ありません。 問題があるとしたら次のようなことが考えられます。 (1)割り込み側の処理でレジスタ退避がちゃんと行われていない。 そのため動作が不安定になっている。 (2)カウントが8ビットで足りていない。車速パルスが1秒間に255以上になっている。 (3)割り込み処理時に、車速パルスのカウンタがクリアされていないために、カウントが累積されていっているため表示がおかしい。 (4)パルスのレベルが高すぎるか低すぎて、常にPORTAの4ビット目1か0となってしまっている。そのためカウントされない。 まだ思いつかない原因が他にもあるかも知れません。 なのでテストの方法です。 (1)PORTAのビットを見ずにカウントアップだけをさせた場合でも、割り込みはちゃんと動きませんか? (2)割り込みでLEDを処理せず、パルスをカウントアップしていることをカウント値をLEDに2進表示させて確認する。 (3)パルスの信頼性が低いならパルス発信機かもう一個のPICを使ってパルスを発生させて、パルスカウントの試験をする。

jza70-kai
質問者

補足

zwi 様 こんばんは。ご回答有難う御座います。 確か以前に別の件でお世話になった記憶が御座います。この度も目を止めて頂いてコメントを頂き、感謝いたします。 先の方にご相談をしておりまして、少し回答が重複するかも知れませんが、1秒で割り込みがかかるかテストは行って、結果は正常に作動しております。しかし、パルス(まだ現状では擬似パルス)を入力するプログラムで走らせると割り込みがうまくかかりません。 車速パルスは1秒で最大約130パルスのカウント入力(時速180km/h)になるので、255は越えないと思われます。 あと、同じ型番のPICでオドメーターを製作し、そこに車速パルスを入力させてPICがパルスカウントをしているので、入力部分のハードをこの回路にも使用しております。でもこれは実際に車両と接続してからの話なので、現在の試作回路上では問題ないとは言えないですよね。 zwi様からのアドバイスの(2)をテストしたいのですが、LEDで2進表示させるプログラムの流れを簡単で結構ですので教えて頂けませんでしょうか。(すいません、まだ独自でちゃんと組めないので・・・) 宜しくお願い致します。

  • INAHO_SH4
  • ベストアンサー率52% (10/19)
回答No.3

あぁ・・・ やっと理解できた。 今見ているのはPCLと言うアドレスカウンターの下位8ビットです。 そのレジスターを覗くウインドウは指定したラベルの数値をアドレスとして扱うため,Zには2が設定されている(Bit2だからね)ので「アドレスが」2の場所と思ってそのレジスターの値を見ています。 アドレスが02HのレジスターはPCLなのでプログラムが1ステップ進むたびに 1カウント上がっていきます。 まずは,STATUSを指定してみてください。 演算のたびに乱数のように数値が変わるはずです。 後は表示のタイプを2進数表示にして右から3つ目を見れば演算結果に沿って変化するはずです。

jza70-kai
質問者

補足

INAHO_SH4 様 こんにちは。ご回答有難う御座います。 私が現在使用しているのは「MPLAB IDE v7.00」というものです。 ZフラグではなくSTATUSフラグの8bitで見たら確かに0と1だけで表示されていました。私の勘違いでしたね。すいません・・・。 あともしお願い出来るのであればご相談があるのですが、現在車で使用するものを製作していて、時速10km単位でLEDを点灯させ、計18個のLEDをバーグラフ状に表示させるものを作ろうとしております。 TMR1で1秒をカウントして、その間に入力される車速パルスをカウントし、割り込みが入ったらその値を比較してLEDを点灯するという流れなんですが、入力されているパルスが1秒を超えても割り込みがかからなくて、パルス入力を止めたらそこから約1秒して割り込みがかかっている感じなんです。 P_IN               ;パルス入力  BTFSS  PORTA,4     ;PORTA,4が1のとき次の命令スキップ  GOTO   P_IN       ;P-INへ戻る  INCF   PULSE_COUNT1 ;PORTA,4が1なのでカウントを1加算  BTFSC  PORTA,4     ;PORTA,4が0なら次の命令スキップ  GOTO   $-1        ;1個前に戻る  GOTO   P-IN ここはメインルーチンのパルス入力部分なのですが、何か割り込み処理にいたずらをする様なものがあるでしょうか。もしよろしければご回答をお願い致します。

  • INAHO_SH4
  • ベストアンサー率52% (10/19)
回答No.2

う~ん,少し見えてきたかな・・・ その前に訂正。 ZフラグはBit3ではなくBit2です。ごめんなさい。 では本題。 デバックツールというのはMPLABのことでしょうか? もしそうであれば,まだどこのレジスターを覗いているのか良くわからないのですが,Zフラグを見たいのであれば,覗くレジスターは「STATUS」です。 2進数で覗き,右から3つ目がZフラグです。 演算結果がゼロであれば演算の直後に1に,そうでなければ0になるはずです。 あと,わざわざ見なくても確か同じウィンドウの中にあるタブにステータスレジスターを見れるタブがあったか,MPLABのウィンドウの下のステータスバーに今のフラグの状態が表示された思います。 あくまでZフラグはSTATUSレジスターの中のビットの一つです。 当然1Bitしかないので2や3は表現できません。 ・・・なんだろう?回数のカウントかなんかが見えてるのかな?

  • INAHO_SH4
  • ベストアンサー率52% (10/19)
回答No.1

数値が1ずつ増えるの意味がわかりませんが・・・ とりあえず説明すると,STARUSレジスタはZ80(Z80使ったこと無かったらごめんなさい)で言うところのFレジスターにあたります。 STATUSレジスターは8Bitあるレジスターの各ビットに意味をもたせてあります。 Bit0はC(キャリー),Bit1はDC(デジットキャリー),Bit3はZ(ゼロ)・・・ といった具合です。 ですので,結果がゼロかどうかを確認する場合はSTATUSのBit3の状態を見ればいいわけです。 比較をしたい場合は・・・ movlw [比較の基準] subwf [比較したい値の入ったファイルレジスタ] btfsc STATUS, Z goto [一致していた場合の処理] ~以下一致していない場合の処理~ と言うふうに書きます。 btfscをbtfssにすると「一致していた場合」と「一致していない場合」が逆になります。 STATUSやZは最初に書くおまじないの「~.inc」の中でビットやアドレスを定義してくれているので,書くだけで「STATUSレジスター(address:03h)のZフラグ(bit:3)」と言うふうにアセンブラが読み替えてくれます。 こんなもんでどんなもんでしょう?

jza70-kai
質問者

補足

INAHO_SH4 様 早速のご回答有難う御座います。 数値が1ずつ増えるというのは、PICプログラムツールのデバッグモードでZフラグの数値の変化を見ていたんですが、デバッグ開始時(プログラムがスタートする時)は「0x00」となっているのですが、次の行に命令が移動すると「0x01」に、また次の行に命令が移動すると「0x02」という感じで数値がアップしていくんです。(これでうまく伝わるかな?) 例えば、下の様なプログラムがあるとします。 プログラム開始行 clrf PORTA   Zフラグの値:0x00             clrf PORTB      ”     :0x01             clrf PORTC      ”     :0x02             clrf PO_A       ”     :0x03             clrf PO_B       ”     :0x04             clrf PO_C       ”     :0x05 こんな感じで、プログラムが進むと同時にZフラグの数字も増えていくんです。 もう少し補足説明が必要でしたら言ってもらえますか。うまく説明が出来ていないかもしれなくてすいません。宜しくお願い致します。

専門家に質問してみよう