- ベストアンサー
STATUSのZフラグについて
STATUSのZフラグについてお聞きしたい事があります。 参考書を読んでみると、「Zフラグは、計算結果や代入結果が'0'となったことを表す指標のことをいう。数値の一致を知るには引き算をしてZフラグを見るプログラムを書く」とあります。 サンプルプログラムを見ても'0'か'1'しかZフラグには存在しない様に思われますが、現在私が組んでいるプログラムでは、プログラムが1行進むにつれてZフラグの数字が1ずつ増えていってしまい、計算結果を確認する事が出来ません。これは単に私のプログラムの設定が間違っているのでしょうか。もしソースがあれば判断出来るのであれば後ほどアップしますのでどなたか教えてもらえませんか。PICアセンブラで組んでいます。宜しくお願い致します。
- みんなの回答 (11)
- 専門家の回答
質問者が選んだベストアンサー
0Vと5Vがショートしない限り発火の心配はないと思います。 10Kオームの抵抗でパルスとの間は安全に接続されていますので、この回路で問題はでないと思いますが、ゲート側にコンデンサが入っているのでノイズには良いかもしれませんが、多少信号が遅延しているかも(時定数をすぐ言えるほど精通していないので勘ですが)。カウントできているなら問題ないと思います。 コンデンサは信号の変化をゆるやかにする効果がありますので。
その他の回答 (10)
- zwi
- ベストアンサー率56% (730/1282)
>あと、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オーバーとして処理。 って感じです。
お礼
zwi様、こんばんは。ご無沙汰しております。 その後の報告を書き込もうと思ったら、先に回答がないとそこには書き込みが出来ないんですね。 とゆー事でまだお礼内容にはなりませんがこちらに書かせて頂きました。 パルス入力部分はやはりおかしく、色々調べてみて、部品番号とかは違ったのですが、使えそうなものがあったのでちょっとアレンジして回路を作ってみました。 5V ↓ 1kΩ ↓ LED 2SK2493 ↓ パルス入力→10KΩ→→→→G→→→D→→→PIC ↓ ↓ ↓ 0.1uF ↓ S ↓ 10KΩ ↓ ↓ ↓ ↓ 0V 0V これで動かしてみたら、入力が入った時(スイッチを押した時)にPICはHi、スイッチを離したらPICはLowとなり、期待していた動きになりました。 先日、実際に車に取り付けて車速パルスを認識して動くか試してみました。結果はちゃんとパルスをカウントして、LEDも点灯しました。ただ点灯するタイミングがずれていたのでその辺りは微調整が必要な様です。 上記の回路が悪魔で自己流なものなので、これで完成品を作っても大丈夫なのかが一番の心配点です。間違って発火なんぞされたら大変ですもんね。(^^; zwi様はどう思われるでしょうか。 またお時間がある時で結構ですのでご回答をお願い致します。
補足
zwi 様 こんばんは。昨日と今日はちょっと出掛けていましたので返事が遅くなりました。 >スイッチ→FET→PIC→LED >PICは入力をそのまま出力にスルーします。 >ちゃんとスイッチと連動してON/OFFしていたらOKって事で。 やってみました。 あっ、何か変。 そう言えば前に入力部分はこうやっていますって書いた時に、入力がなくてもHi入力になっているって書きましたよね。 前の配線図で接続したら、電源を入れたらやはりLEDが最初から点灯しています。そしてスイッチを入れたらLEDが消えるんですが、スイッチを離してもすぐには点灯せず、1秒ほどしてから点灯しています。 これがzwi様の言っていた「GとS間に抵抗が入っていなかったか?」に繋がるんでしょうかね。ちょっと調べてみます。 >全てのポートにオール1を出力してみます。これで配線が間違っていなければ点灯するはずです。 すみません。ちゃんと全部点灯します。 基本を飛ばしていきなりあれやこれやとやってしまっているのが問題を引き起こしている原因なんでしょうね。 メーター出力部分のプログラムは本当に見やすくてスッキリとしていますよね。恐れ入ります。m(__)m 再度教えて頂いた内容でプログラムを修正して動かしてみます。 また結果はご報告いたします。
- zwi
- ベストアンサー率56% (730/1282)
>よくよく考えたら、これってパルス入力がなければ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を退避してください。 メーターに出すほうの処理は、まだ効率よく書けると思うんですが、時間がないのでまた後で。
補足
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)
>チャタリング処理はしておりませんので確かにきっちりとしたカウントは現在は出来ない状態にあります。 チャタリング込みじゃないと1秒間に10回以上は入力するのは難しいですからね。 >入力部分はFETの部品が入ったりしていてよく解らなかったので、10Kオームの抵抗を-に接続して配線をやりかえました。 SWがオープンの状態のときにプルダウンされている事が必要なので、少し違う心配がありますね。 5V→SW→PIC ↑ 10KΩ ↑ 0V ならOKです。 >LEDの2進表示プログラムを割り込み部分に入れて実際にテストしてみましたが、PORTAの2つのLEDが点灯しません。PORTCは点灯しております。手直し方法が分からないのですいませんが助けて下さい。。。 値が64以上にならないと表示されませんので、試しに4倍して表示してみてください。 >あと、バンク間違いの件ですが、全く気付いてませんでした!(>_<) >けど、オドメーターのプログラムも調べてみたら同じ事をしていたのにどうして作動しているんだろ??それもちょっと気になる所です・・・。 WDTとINT割り込みを使っていないので大丈夫なんだと思います。そういう意味なら不要ですね。
補足
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)
>まず割り込み確認ですが、これも別の方に教えて頂いたチェック方法なんですが、割り込みルーチンの所に下のソースを入力して確認を行いました。 >その割り込み処理は時計やオシロでは計ってはいませんが、見ている限り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 は、なんかバンク違ってますが大丈夫ですか?
補足
zwi様、こんばんは。 チャタリング処理はしておりませんので確かにきっちりとしたカウントは現在は出来ない状態にあります。入力部分はFETの部品が入ったりしていてよく解らなかったので、10Kオームの抵抗を-に接続して配線をやりかえました。LEDの2進表示プログラムを割り込み部分に入れて実際にテストしてみましたが、PORTAの2つのLEDが点灯しません。PORTCは点灯しております。手直し方法が分からないのですいませんが助けて下さい。。。 あと、バンク間違いの件ですが、全く気付いてませんでした!(>_<) けど、オドメーターのプログラムも調べてみたら同じ事をしていたのにどうして作動しているんだろ??それもちょっと気になる所です・・・。
- zwi
- ベストアンサー率56% (730/1282)
>先の方にご相談をしておりまして、少し回答が重複するかも知れませんが、1秒で割り込みがかかるかテストは行って、結果は正常に作動しております。 これはLEDの点滅等で実際に確認されましたか?周期が正しいことは、時計やオシロ等で確認されていますか? >しかし、パルス(まだ現状では擬似パルス)を入力するプログラムで走らせると割り込みがうまくかかりません。 擬似パルスは、別のPIC等で生成してポートから入力された物ですか?それとも1つのPIC内でプログラムで生成しましたか? >車速パルスは1秒で最大約130パルスのカウント入力(時速180km/h)になるので、255は越えないと思われます。 それなら問題ないですね。 >あと、同じ型番のPICでオドメーターを製作し、そこに車速パルスを入力させてPICがパルスカウントをしているので、入力部分のハードをこの回路にも使用しております。でもこれは実際に車両と接続してからの話なので、現在の試作回路上では問題ないとは言えないですよね。 オドメーターが正常に動作しているPICで走らせていると理解して良いですか? >zwi様からのアドバイスの(2)をテストしたいのですが、LEDで2進表示させるプログラムの流れを簡単で結構ですので教えて頂けませんでしょうか。(すいません、まだ独自でちゃんと組めないので・・・)宜しくお願い致します。 カウント値をそのまま、LEDのポートに送るだけです。 LEDがPICに接続している回路が不明なので、もう少し情報をください。
補足
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)
メインに書いている分には問題ないです。 但しこの処理は割り込みルーチン内には書かないでくださいね。 さてさて,1秒経っても割り込みが掛からないという点ですが・・・ 1.この処理の前にちゃんと割り込みを許可していますか? 2.割り込みの設定は正しく設定していますか?マスクの設定等は大丈夫ですか? 3.割り込み処理でワークレジスタ,ステータスレジスタはちゃんと退避・復旧をしていますか?(←今回は薄いかな) 4.割り込み復旧時にちゃんと割り込み要因フラグをリセットしてますか? この辺も確認して見てください。 この処理であれば,PORTAの状態で分岐している(ワークやステータスの状態で処理してない)ので可能性は薄いかもしれませんが,ワークの退避も一応試してみてください。 多分,話の流れ的にまだシミュレーター上かと思いますのでハードの使い方による物ではないと思います。 あと,シミュレーターをアニメーション(1ステップずつ実行していくさまを見ている状態)で実行すると1秒はとてつもなく長い時間になります。 その辺の注意してください。 A No4 の zwi さんがおっしゃるとおり,部分的に動作を確認するのが近道&基本です。 まずは正常に動作する部分と,うまく動かない部分を切り分けましょう。
お礼
INAHO_SH4様 1ヶ月くらい前にお世話になったjza70_kaiです。 本日、どうにかこうにか今回の製作回路が完成に至りましたのでご報告をさせて頂きました。 基本を飛ばしていきなり本題に入ってしまっていたのが今回の反省点であり、今後は先に細かな事を調べて本題に入っていきたいと思います。 色々とアドバイスを頂き、本当に有難う御座いました。 また別の件でお世話になるかも知れませんが、その時も変わらず助けて頂けます様宜しくお願い致します。m(__)m それでは失礼致します。
補足
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)
なにかだいぶ前に回答した気がするzwiです。 見てみましたが、プログラム的には割り込みは邪魔してませんので問題ありません。 問題があるとしたら次のようなことが考えられます。 (1)割り込み側の処理でレジスタ退避がちゃんと行われていない。 そのため動作が不安定になっている。 (2)カウントが8ビットで足りていない。車速パルスが1秒間に255以上になっている。 (3)割り込み処理時に、車速パルスのカウンタがクリアされていないために、カウントが累積されていっているため表示がおかしい。 (4)パルスのレベルが高すぎるか低すぎて、常にPORTAの4ビット目1か0となってしまっている。そのためカウントされない。 まだ思いつかない原因が他にもあるかも知れません。 なのでテストの方法です。 (1)PORTAのビットを見ずにカウントアップだけをさせた場合でも、割り込みはちゃんと動きませんか? (2)割り込みでLEDを処理せず、パルスをカウントアップしていることをカウント値をLEDに2進表示させて確認する。 (3)パルスの信頼性が低いならパルス発信機かもう一個のPICを使ってパルスを発生させて、パルスカウントの試験をする。
補足
zwi 様 こんばんは。ご回答有難う御座います。 確か以前に別の件でお世話になった記憶が御座います。この度も目を止めて頂いてコメントを頂き、感謝いたします。 先の方にご相談をしておりまして、少し回答が重複するかも知れませんが、1秒で割り込みがかかるかテストは行って、結果は正常に作動しております。しかし、パルス(まだ現状では擬似パルス)を入力するプログラムで走らせると割り込みがうまくかかりません。 車速パルスは1秒で最大約130パルスのカウント入力(時速180km/h)になるので、255は越えないと思われます。 あと、同じ型番のPICでオドメーターを製作し、そこに車速パルスを入力させてPICがパルスカウントをしているので、入力部分のハードをこの回路にも使用しております。でもこれは実際に車両と接続してからの話なので、現在の試作回路上では問題ないとは言えないですよね。 zwi様からのアドバイスの(2)をテストしたいのですが、LEDで2進表示させるプログラムの流れを簡単で結構ですので教えて頂けませんでしょうか。(すいません、まだ独自でちゃんと組めないので・・・) 宜しくお願い致します。
- INAHO_SH4
- ベストアンサー率52% (10/19)
あぁ・・・ やっと理解できた。 今見ているのはPCLと言うアドレスカウンターの下位8ビットです。 そのレジスターを覗くウインドウは指定したラベルの数値をアドレスとして扱うため,Zには2が設定されている(Bit2だからね)ので「アドレスが」2の場所と思ってそのレジスターの値を見ています。 アドレスが02HのレジスターはPCLなのでプログラムが1ステップ進むたびに 1カウント上がっていきます。 まずは,STATUSを指定してみてください。 演算のたびに乱数のように数値が変わるはずです。 後は表示のタイプを2進数表示にして右から3つ目を見れば演算結果に沿って変化するはずです。
補足
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)
う~ん,少し見えてきたかな・・・ その前に訂正。 ZフラグはBit3ではなくBit2です。ごめんなさい。 では本題。 デバックツールというのはMPLABのことでしょうか? もしそうであれば,まだどこのレジスターを覗いているのか良くわからないのですが,Zフラグを見たいのであれば,覗くレジスターは「STATUS」です。 2進数で覗き,右から3つ目がZフラグです。 演算結果がゼロであれば演算の直後に1に,そうでなければ0になるはずです。 あと,わざわざ見なくても確か同じウィンドウの中にあるタブにステータスレジスターを見れるタブがあったか,MPLABのウィンドウの下のステータスバーに今のフラグの状態が表示された思います。 あくまでZフラグはSTATUSレジスターの中のビットの一つです。 当然1Bitしかないので2や3は表現できません。 ・・・なんだろう?回数のカウントかなんかが見えてるのかな?
- INAHO_SH4
- ベストアンサー率52% (10/19)
数値が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)」と言うふうにアセンブラが読み替えてくれます。 こんなもんでどんなもんでしょう?
補足
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フラグの数字も増えていくんです。 もう少し補足説明が必要でしたら言ってもらえますか。うまく説明が出来ていないかもしれなくてすいません。宜しくお願い致します。
お礼
zwi様 こんばんは。ご無沙汰しております。 本日、最終調整も行い、ほぼ思った感じでLEDの点灯が出来る様になったので、これで完成にしたいと思います。 この後は実際にこの回路や前回のオドメーター回路と共にオリジナルメーターの製作に入りたいと思います。 この度はとても長い間助けて頂いて本当に有難う御座いました。m(__)m また別のものを作る時に助けて頂く事もあるかも知れませんが、その時も変わらずアドバイスを頂けます様宜しくお願い致します。 簡単ですが、御礼の挨拶に代えさせて頂きます。 それでは。