• ベストアンサー

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フラグの数字も増えていくんです。 もう少し補足説明が必要でしたら言ってもらえますか。うまく説明が出来ていないかもしれなくてすいません。宜しくお願い致します。

関連するQ&A

  • PIC(MOVFで何故、STATUS Zフラグが変わるのか)

    こんにちは。 PICマイコンで割り込みをやる場合、 MOVFはSTATUSのZフラグに影響を与えるので、 使わない、とありますが、 何故、MOVFでZフラグに影響を与えるのか、 どういう影響を与えるのか分かりません。 割り込みを使わなくても、STATUS<Z>を 条件判断に使っている限り、 MOVFは使えないのでしょうか。 また、 本によっては、 (割り込みのはじめ) MOVWF W_TEMP MOVF STATUS,W(*) MOVWF ST_TEMP    ~割り込みの内容 MOVF ST_TEMP,W MOVWF STATUS SWAPF W_TEMP,F SWAPF W_TEMP,W (割り込み終わり) のように書いてあり、 この場合、*で、 STATUSのコピー前(同時)に、 MOVFを使っていますが、 これは、OKなのでしょうか。 何か分かる人がいましたら、 よろしくお願いします。

  • PIC18FのSTATUS

    PIC18FのSTATUSレジスタ(N,OV,Z,DC,C)の内Z,DC,Cは16Fと同じだと思いますがN,OVが部分的にわかりません OV:7ビット越えのオーバーフローフラグということですが8ビットオーバーすればC=1と思いますがなぜ7ビットなのでしょう? どういった時に使えるものなのでしょうか?(符号付とは?) N:演算の負フラグ 16Fの時はCで兼用だったのが分離したものだと思いますが、実際にマイナスになると=1になります。が足して7ビット越えした状態でも=1になっていますがそういうものなのでしょうか?

  • PICのプログラミングについて

    PICのSTATUSレジスタのz〔ゼロ〕フラグとC〔キャリー〕が同時に1になることはあるのでしょうか?以下のようなときのことなのですが・・・ movlw b'00000001' sublw b'00000001' このような時のZフラグとCフラグはどうなるのでしょう? PIC活用書等を読んでみたのですが、あまりわかりませんでした。 初心者な質問ですが宜しくお願いします。

  • 組み込みプログラマ

    制御系(マイコン)のプログラマに就職が決まった大学生です。 現在、アセンブラの勉強をしています。 今まで、Z80、PICの経験があります。 しかし、C言語で組み込み系のプログラムを書いたことはありません。 そこで、実際に組み込み系で働いておられる方に質問があります。 1.現在のマイコンではC言語が主流ですか? 2.アセンブラだけでは食っていけませんか? 3.組み込み系は寿命が長いと聞いたことがあるのですが、   本当でしょうか?

  • PICで小数点の演算

    PIC16F877Aを使ってプログラムを作っています。その内容がセンサー(例えば温度センサー等)から取り入れた電圧をPICのA/D変換(10bit)を行って、その値を使ってpicで計算し、その結果を液晶に表示するといった内容なのですが、その計算過程で小数を扱わなければならないのですが、その計算がうまくいきません。A/D変換後の値をxとし具体的に式で書くと、 v = x * 5 / 1023  ・・・(1) ここでvはセンサーから取り込んだ電圧値(値の範囲は0.935~1.748)です。 y = 218.5 - v / 0.008  ・・・(2) 又は y = 218.5 - 125 * v  ・・・(3) 上記の式はA/D変換後の値xを一度アナログ電圧値vに変換し(1)、そこから(2)又は(3)へ代入して得たい情報yを算出するといった少々面倒なものなのですが、これをアセンブラで書きたいのですが、このPICには乗除命令がないことや小数点の演算方法、16bitの乗除等の部分が引っかかってどうもうまくかけません。小数部分は固定小数点形式で考えて最終的にyは少数第二位を四捨五入したいと思っています。 どのようにプログラムを作ればよいのでしょうか。実際にソースを書いていただけると大変理解しやすいです。

  • PICマイコン MPLABアセンブラで小数点の累…

    PICマイコン MPLABアセンブラで小数点の累乗(べき乗) n^-0.9067の計算をMPLABのアセンブラでやりたいのですが 記述、計算方法がわかりません。 わからない点 ・四則計算だけでできるのか ・小数点を整数の変換して計算可能か ・負の値を気にせず(正の数)計算できるか 一番知りたいのは四則計算だけで計算できるかです。 これができるとある程度正確な結果が得られるので ご教授よろしくお願い致します。

  • 【PICマイコン】一般製品にPICシリーズが使われてるって本当ですか?

    最近PICをはじめて大分アセンブラもなれてきて楽しめるようになってきました。 それで教えてGOOで色々見てるときにPICシリーズのマイコンは一般製品の中にも組み込まれているって書いてあったんですが本当ですか? 僕の中でPICやAVR等はそれなりにコアな趣味を持つ人たちのおもちゃ的な物だと思ってました。 もし本当に入ってるんだったら具体的にどんな製品にどのマイコン(例PIC16F877A等)が使われてるのか教えてください。凄く興味があります。 また、何処のサイトだったか忘れましたが「これからマイコンをはじめるならAVR!PICをやるメリットなし!」ぐらいの勢いで書いてあったんですがその通りなんでしょうか? もひとつ、、PICの勉強をはじめるときにアセンブラかCかで迷ったんですがアセンブラではじめた方がCPUの構造をより理解しやすいとの事でアセンブラで進めてきたんですが、いまいちその実感がわきません。具体的にどういう所でCPUの構造を理解しやすいのでしょうか? それっぽいなぁと思うのはクロックでタイミングを与え、そのタイミング毎に命令を実行しレジスタのBITで条件判断をしたり計算をしたりしてポートに出力する的な部分でしょうか?そもそもCPUの構造ってどういう事なんでしょうか?何て言うか例えて言うならエクセルは仕事で使うから詳しいけどWindowsの設定は全然解りませんみたいな感じです。 よろしくお願いしますm(_)m

  • エクセル(Excel)の計算結果を行番号に反映させるには?

    エクセルのセル表記についてのご質問です。 計算結果をセルの表記に反映させたいと思っています。 例1: A1の計算結果が『2』 B1の計算結果が『3』 この場合は、C5(2+3=5)に、Z5からの値を代入する 例2: A1の計算結果が『10』 B1の計算結果が『15』 この場合は、C25(10+15=25)に、Z25からの値を代入する =$Z$(A1+B1) =$Z$[A1+B1] =$Z$'A1+B1' 上記のようなイメージです。 どなたか、お教えいただけると幸いです。 よろしくお願い致します。

  • PIC/「Label」に対応するアドレス重複

    PICのプログラムを学んでおります。 Include fileの中の「pic16f84a.inc」を見ると、下記のように「Label」に対応するアドレスが重複しているものがあります。 ある特定の「Label」には特定のアドレスが一つ与えられるのだとばかり理解していたので、このように重複していて、さっぱり混乱しています。 これはどのように理解したらよいのでしょうか? よろしくお願いいたします。 -------------------- // Register: TMR0 TMR0 equ 0001h // Register: PCL PCL equ 0002h // Register: STATUS STATUS equ 0003h // bitfield definitions STATUS_C_POSN equ 0000h STATUS_C_POSITION equ 0000h STATUS_C_SIZE equ 0001h STATUS_C_LENGTH equ 0001h STATUS_C_MASK equ 0001h STATUS_DC_POSN equ 0001h STATUS_DC_POSITION equ 0001h STATUS_DC_SIZE equ 0001h STATUS_DC_LENGTH equ 0001h STATUS_DC_MASK equ 0002h STATUS_Z_POSN equ 0002h STATUS_Z_POSITION equ 0002h STATUS_Z_SIZE equ 0001h STATUS_Z_LENGTH equ 0001h ---------------------------

  • PICマイコンをアセンブラでAD変換をした時に、、

    現在PICマイコンの16f88を用いてアセンブラでAD変換の勉強をしています。とりあえずいろいろなサイトやデータシートを見てAD変換した結果をPORTBに出力させるテスト用のプログラムを完成させたのですが、AD変換の結果を格納するADRESLのデータをうまく読み込むことができませんでした。その時のプログラムは(結果は左詰め,X_Lは自分で定義した変数) BSF STATUS,RP0 MOVF ADRESL,W MOVWF X_L ;ADRESLの結果をX_Lに保存 BCF STATUS,RP0 MOVF X_L,W MOVWF PORTB こんな感じです。わざわざADRESLの結果をX_Lに保存しなくても直接出力することもできるんですが気にしないで下さい。で、このプログラムだとPORTBにつないだ全てのLEDが点灯します。 ところがプログラムを以下の様に書き変えたら見事にADRESLレジスタの中身が出力できました。何が起きたのでしょうか?バンクの切り替えの前にWレジスタをX_Lレジスタに書き込むのと、バンクを切り替えてからWレジスタをX_Lレジスタに書き込むのとでは結果が同じになると思うのですが、、、。 BSF STATUS,RP0 MOVF ADRESL,W BCF STATUS,RP0 MOVWF X_L MOVF X_L,W MOVWF PORTB

専門家に質問してみよう